/* ⚠⚠ NEVER USE `rem` IN THIS FILE. Found 2026-09-23, and it had quietly scaled the whole
 * Powerhub brand layout to 62.5%.
 *
 * `vw-components.css` (the agency's compiled CSS) sets `html { font-size: 62.5% }`, so **the root
 * font size on this site is 10px, not 16px**. The only override is `body,html{font-size:100%
 * !important}` and that one is inside `@media print`, so it does nothing on screen. The site
 * itself is px-based — there is exactly ONE `rem` font-size in the whole of `main.css` — so
 * nothing else noticed.
 *
 * Every `rem` written here therefore resolved against 10px and came out at 62.5% of its intent:
 * the hero's `min-height: 46rem` was 460px instead of 736px (live's hero is 1185px tall and this
 * one was 751px), `padding-block: 11rem 3rem` was 110px/30px, and `.ph-hero__text` at
 * `0.9375rem` rendered the hero's body copy at **9.375px**. All 47 values were converted to px
 * at the size they were meant to be.
 *
 * Scoping cannot fix this — `rem` always resolves against the ROOT element, never an ancestor, so
 * no `[data-brand='powerhub'] { font-size: … }` rule can rescue it. px is also what the rest of
 * this site uses, so it is the consistent choice as well as the working one.
 *
 * ⚠ THE SAME APPLIES TO BOOTSTRAP 5's UTILITY CLASSES, which are rem-based and are also running
 * at 62.5% here: `.h3` is 17.5px rather than 28px, `gap-2`/`p-4` are likewise small. That is
 * pre-existing and site-wide, so it is NOT changed here — but it means a brand rule must set a
 * size in px explicitly wherever the size actually matters, rather than leaning on a Bootstrap
 * class. See `.ph-guided__question` below.
 */

/* Powerhub — the brand layer.
 *
 * Loaded by _Layout AFTER custom.css, and only for a page whose nearest ancestor declares
 * brand=powerhub (Infrastructure/SiteBrand.cs). Everything here is scoped to
 * [data-brand="powerhub"], so this file is inert on every other page of the site even though it
 * is one stylesheet in one application.
 *
 * WHERE THE VALUES COME FROM. Lifted from live's own /css/powerhub_bundle.css, read 2026-09-18 —
 * live already expresses its brand as custom properties, which is the thing powerhub/plan.md §4
 * assumed and is why "a brand is variables, not a fork" holds here. The names are this project's,
 * not live's: live has 40 properties named after the component that uses them
 * (--ph-faq-h1-text-color), which is a palette that cannot be reused. These are five.
 *
 * ⚠ DEVIATION FROM plan.md §4, and the reason this file has two halves. The plan says a brand
 * stylesheet may define "custom properties only". That assumed this site has a token layer to
 * override; it does not — vw-components.css is the agency's compiled CSS with Bootstrap
 * subtracted, and its colours are literals. So: the tokens, then a short list of scoped rules that
 * apply them to the class names this site really uses. The second half is the debt, and it is
 * measurable — every literal that gets tokenised in vw-components.css deletes a rule from here.
 * The property that actually mattered survives: this file touches no markup, so no block gets a
 * second copy of itself.
 *
 * ⚠ TWO THINGS THE PLAN GOT WRONG, MEASURED 2026-09-21 WHILE BUILDING THIS.
 *
 *  1. "Titillium Web is the one asset Powerhub adds. Self-host it rather than hitting Google
 *     Fonts" — it is ALREADY self-hosted and already the whole site's typeface.
 *     wwwroot/fonts/titilliumweb-{light,regular,semibold,bold}.* have been there since the
 *     agency's CSS was extracted, registered as font-family "titillium" in vw-components.css and
 *     applied site-wide. Powerhub and vanwerven.nl share a typeface; there is nothing to add, and
 *     the three woff2 files this pass downloaded from Google were deleted again.
 *
 *  2. Several obvious-looking overrides are no-ops, because the two brands already share more
 *     than the plan assumed: the base link colour is #82bf5a — Powerhub's green exactly — and
 *     .section--grey is already #eee against Powerhub's #ededed. Rules for those are left OUT
 *     rather than written and left dead, so what remains here is the real difference and nothing
 *     else.
 *
 * WHAT IS NOT DONE YET. Live's footer is three bands (green, a photo, warm grey); this renders
 * the site's own footer with Powerhub's colours on it. Live's hero puts its h1 in a white box;
 * this puts white text straight on the photo. Both are §6 step 5, with the pages.
 */

/* ⚠ THE ROOT FONT SIZE, and it is the second half of the 62.5% story.
 *
 * `_Layout` loads the COMPLETE Bootstrap 5.3.3 from jsDelivr, and `vw-components.css` loads after
 * it and sets `html { font-size: 62.5% }`. Bootstrap is almost entirely rem-based, so **every
 * Bootstrap component and utility on this site renders at 62.5%**. Measured on the FAQ:
 * `.accordion-button` came out `padding: 10px 12.5px; font-size: 10px` — Bootstrap's own
 * `1rem 1.25rem` and `1rem` — against live's 16px/20px/16px, which is why the rebuild's accordion
 * rows were 33px tall where live's are 53px, and why its question text was 10px.
 *
 * The same 0.625 factor was behind the option pills' padding, the `gap-*` between them, the
 * container gutter (`--bs-gutter-x: 1.5rem` → 15px instead of 24px) and `.h3` (17.5px, not 28px).
 *
 * WHY RESETTING IT HERE IS THE RIGHT FIX RATHER THAN A RISK:
 *  - **It is what live does.** powerhub.vanwerven.nl loads only Bootstrap 5 and its root is 16px,
 *    measured. Matching live's layout means matching the CSS environment live's markup was
 *    written for; re-implementing Bootstrap components in px here would be fighting it.
 *  - **It is scoped to Powerhub and cannot leak.** `data-brand` is on the `<html>` element itself
 *    (`<html lang="nl" data-brand="powerhub">`, from SiteBrand), so this selector matches only
 *    pages under the Powerhub subtree. vanwerven.nl and Herms keep their 10px root exactly.
 *  - **The loaded project CSS barely uses rem.** `vw-components.css` has 8 rem units,
 *    `vw-bs5.css` 6, `custom.css` 1 — and everything else is px. Of those, the only font-size is
 *    `.waste-acceptance-form hr:before { font-size: 1.8rem }`, a vanwerven.nl form that does not
 *    exist on Powerhub. The rest are small spacings, and where they matter (the container gutter)
 *    the new value is live's value.
 *  - **This file is px throughout**, so nothing written here moves. See the banner at the top.
 *
 * `main.css` and `site.css` are NOT loaded on this site — checked against the rendered <link>
 * list — so their rem usage (8 and 164) is irrelevant. Do not be alarmed by grepping them.
 */
html[data-brand='powerhub'] {
  font-size: 100%;
}

/* ── The tokens ─────────────────────────────────────────────────────────────── */
[data-brand='powerhub'] {
  /* Live's palette, by role rather than by component.
   * green   #82bf5a  the brand. Section headings, the footer rule, selected states.
   *                  Also vanwerven.nl's accent already — the two really are the same green.
   * dark    #303030  the h1 colour, and the text colour on yellow.
   * yellow  #f6df00  the one call to action. Deliberately scarce: on live it is the form's
   *                  forward buttons and nothing else, which is what makes it read as "go".
   * warm    #786e65  the legal bar and the customer names under the case quotes. Already the
   *                  base site's secondary colour, kept as a token so the footer reads as a
   *                  decision rather than a coincidence.
   * surface #ededed  card and accordion backgrounds. */
  --vw-brand: #82bf5a;
  --vw-brand-ink: #303030;
  --vw-brand-cta: #f6df00;
  --vw-brand-warm: #786e65;
  --vw-brand-surface: #ededed;
}

/* ── Applying them ──────────────────────────────────────────────────────────── */

/* Live colours every section heading green and leaves the h1 dark — the inversion of what most
   sites do, and the single most recognisable thing about the brand. */
[data-brand='powerhub'] h2,
[data-brand='powerhub'] .section__heading {
  color: var(--vw-brand);
}

/* The base hero h1 is green (.imageheader__heading, #82bf5a) straight on the photo. Over
   Powerhub's building-site background that loses against the sand, so it goes white — the same
   answer live reaches by putting the heading in a white box instead. Provisional: when the hero
   is built properly in §6 step 5 this may become live's box. */
[data-brand='powerhub'] .imageheader__heading,
[data-brand='powerhub'] .imageheader__text {
  color: #fff;
}

/* The base primary button is green on white text. Live's Powerhub CTA is yellow on dark — the
   only place the yellow appears, which is what gives it its weight. */
[data-brand='powerhub'] .btn--primary,
[data-brand='powerhub'] .btn.primary {
  background-color: var(--vw-brand-cta);
  color: var(--vw-brand-ink);
  font-weight: 700;
}
[data-brand='powerhub'] .btn--primary:hover,
[data-brand='powerhub'] .btn.primary:hover {
  background-color: #ded000;
}

/* The base secondary button is a transparent pill with a warm border, and its hover is a warm
   panel sliding in from the left (.btn--default:after). Both halves have to move together or
   the hover slides warm grey over green. */
[data-brand='powerhub'] .btn--default {
  border-color: var(--vw-brand);
  color: var(--vw-brand);
}
[data-brand='powerhub'] .btn--default:after {
  background: var(--vw-brand);
}
[data-brand='powerhub'] .btn--default:hover {
  color: #fff;
}

/* The guided form's options are Bootstrap btn-check radios, so the selected state is
   :checked + label and needs no class from us. Live inverts the colours on select. */
[data-brand='powerhub'] .btn-check:checked + .vw-guided__option {
  background-color: var(--vw-brand);
  border-color: var(--vw-brand);
  color: #fff;
}

[data-brand='powerhub'] .accordion-button {
  background-color: var(--vw-brand-surface);
  color: var(--vw-brand-ink);
}
[data-brand='powerhub'] .accordion-button:not(.collapsed) {
  background-color: var(--vw-brand);
  color: #fff;
}

/* The numbered circle in front of each process step. */
[data-brand='powerhub'] .step-number {
  color: #fff;
  background-color: var(--vw-brand);
}

/* ⚠ The footer is NOT given a background here, and that is the fix for a real bug rather than a
   preference. `.footer` is `height: 43px` with floated children that overflow it — harmless while
   it is transparent on white, but painting it produces a 43px band with the phone number and the
   mail address hanging out below the colour. Measured 2026-09-21. What is safe to brand is the
   rule above it and the two contact pills; the legal bar (.footer__main) is already #786e65,
   which is live's own footer row 3, so it needs nothing at all. */
[data-brand='powerhub'] .footer .container {
  border-top-color: var(--vw-brand);
}
[data-brand='powerhub'] .footer__col .footer__tel,
[data-brand='powerhub'] .footer__col .footer__mail {
  border-color: var(--vw-brand);
  color: var(--vw-brand);
}
[data-brand='powerhub'] .footer__col .footer__tel:hover,
[data-brand='powerhub'] .footer__col .footer__mail:hover {
  background: var(--vw-brand);
  color: #fff;
}

/* ═══════════════════════════════════════════════════════════════════════════
 * THE LAYOUT HALF — added 2026-09-21.
 *
 * Everything above this line is the brand-as-variables file plan.md §4 asked for. Everything
 * below it exists because the user reversed that decision for the visual layer on 2026-09-21:
 * Powerhub keeps the microsite's own layout, so it gets its own header and its own hero markup
 * (Views/brand/powerhub/**) and those need rules that no vanwerven.nl class name covers.
 *
 * The two halves are kept apart on purpose. The half above is deletable the day
 * vw-components.css is tokenised; the half below is Powerhub's own and is deletable only if the
 * brand goes back to being a re-skin. Nothing below is scoped any more loosely than anything
 * above: every selector still starts at [data-brand='powerhub'], so this file remains inert on
 * the other two sites even though all three share one application and one stylesheet pipeline.
 *
 * MEASUREMENTS ARE LIVE'S. Taken from /css/powerhub_bundle.css (saved as
 * .planning/powerhub/source/powerhub_bundle.css) plus the Bootstrap utilities in live's markup:
 * the logo is 70px, the panel is 75vh, the card carries `box-shadow: 0 3px 20px #00000065`, and
 * the product cut-out is shifted right by `calc(-2 * 48px)`.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* ── The header ─────────────────────────────────────────────────────────────
 * _Layout renders the header before <main>, so it is lifted out of the flow and placed over
 * whatever follows — on the homepage the hero carousel, on a detail page the photo header.
 * That is live's arrangement, where the nav sits inside the header image. */
[data-brand='powerhub'] .ph-nav {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  z-index: 1000;
}

[data-brand='powerhub'] .ph-nav__logo {
  height: 70px;
  width: auto;
  border: 2px solid #fff;
  box-shadow: 0 8px 16px rgb(0 0 0 / 15%);
}

/* Both the burger and the close button. Live makes these `.btn.btn-primary` and then overrides
   the background, which leaves Bootstrap's blue focus ring on a green button. */
[data-brand='powerhub'] .ph-nav__toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 16px;
  border: 2px solid #fff;
  border-radius: 6px;
  color: #fff;
  line-height: 0;
}
[data-brand='powerhub'] .ph-nav__toggle--open {
  background-color: var(--vw-brand);
}
[data-brand='powerhub'] .ph-nav__toggle--close {
  background-color: var(--vw-brand-ink);
}
[data-brand='powerhub'] .ph-nav__toggle:focus-visible {
  outline: 3px solid #fff;
  outline-offset: 2px;
  box-shadow: none;
}

/* The overlay. Live: absolute, right 0, top 0, 75vh tall, the full viewport wide, green. */
[data-brand='powerhub'] .ph-nav__panel {
  position: absolute;
  z-index: 1001;
  top: 0;
  right: 0;
  width: 100vw;
  height: 75vh;
  background-color: var(--vw-brand);
}
[data-brand='powerhub'] .ph-nav__panel-inner {
  height: 75%;
  width: 75%;
  margin-inline: auto;
}
[data-brand='powerhub'] .ph-nav__link {
  text-decoration: none;
  color: #fff;
}
[data-brand='powerhub'] .ph-nav__link:hover,
[data-brand='powerhub'] .ph-nav__link:focus-visible {
  color: var(--vw-brand-ink);
}

/* ── The hero ───────────────────────────────────────────────────────────────
 * The carousel fills the section rather than being given a height in pixels by a script, which
 * is what live does (`--ph-hp-header-v2-nav-container-height`, written on every resize). */
[data-brand='powerhub'] .ph-hero {
  position: relative;
  overflow: hidden;
  /* Clears the header, which is lifted out of the flow above. Live reaches the same figure by
     stacking the nav row and the content row inside one container. */
  padding-block: 112px 32px;
}
@media (min-width: 992px) {
  [data-brand='powerhub'] .ph-hero {
    padding-block: 176px 48px;
    min-height: 736px;
  }
}

[data-brand='powerhub'] .ph-hero__bg {
  position: absolute;
  inset: 0;
  z-index: 0;
}
[data-brand='powerhub'] .ph-hero__bg-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
[data-brand='powerhub'] .ph-hero__inner {
  position: relative;
  z-index: 1;
}
[data-brand='powerhub'] .ph-hero__indicators {
  z-index: 2;
}

/* The white card. Live's shadow, live's colours: dark h1, green product line.
   ⚠ position + z-index are load-bearing, not decoration: the product cut-out beside it is
   `position: relative` (it is shifted left to tuck behind this card), and a positioned element
   paints above an unpositioned one no matter what the source order says. Without these two
   lines the cut-out was drawn OVER the card and straight through the heading. */
[data-brand='powerhub'] .ph-hero__card {
  background-color: #fff;
  box-shadow: 0 3px 20px rgb(0 0 0 / 40%);
  position: relative;
  z-index: 2;
}
[data-brand='powerhub'] .ph-hero__title {
  color: var(--vw-brand-ink);
}
[data-brand='powerhub'] .ph-hero__subtitle {
  color: var(--vw-brand);
}
[data-brand='powerhub'] .ph-hero__text {
  color: #000;
  font-size: 15px;
}
[data-brand='powerhub'] .ph-hero__text p:last-child {
  margin-bottom: 0;
}

/* Live shifts the cut-out right so it tucks under the card's left edge — about 20px of overlap,
   measured on live at 1440.
   ⚠ THE OFFSET IS IN px AND MUST STAY THERE. It was `calc(-2 * 3rem)`, which against this site's
   10px root was -60px — and -60px is what it was eyeballed at. The blanket rem→px conversion
   turned it into -96px, which buried a third of the cut-out under the card. So this one is not
   "0.75 of what a 16px root would give": it is the number that was actually being looked at.
   z-index keeps it behind the card; see .ph-hero__card above. */
@media (min-width: 992px) {
  [data-brand='powerhub'] .ph-hero__photo {
    position: relative;
    right: -60px;
    z-index: 1;
  }
}

/* ── The yellow pill ────────────────────────────────────────────────────────
 * Powerhub's own button, used in the hero and by the guided form's step controls. Named
 * .ph-btn rather than reusing .btn--primary because it is a different shape, not a different
 * colour: live's is a Bootstrap pill (rounded-5, p-3), the site's is its own component. */
[data-brand='powerhub'] .ph-btn--yellow {
  background-color: var(--vw-brand-cta);
  color: var(--vw-brand-ink);
  font-weight: 700;
  border: 0;
}
[data-brand='powerhub'] .ph-btn--yellow:hover,
[data-brand='powerhub'] .ph-btn--yellow:focus-visible {
  background-color: #ded000;
  color: var(--vw-brand-ink);
}

/* ── The process ladder ─────────────────────────────────────────────────────
 * Views/brand/powerhub/…/processStepsBlock.cshtml. Live's own values:
 * --ph-pi-step-number-* is green on white, --ph-pi-step-text-* is #ededed on #303030, and the
 * heading beside the ladder is ink rather than the green every other section heading gets. */
[data-brand='powerhub'] .ph-process__ladder {
  margin-bottom: 0;
}
[data-brand='powerhub'] .ph-process__number {
  color: #fff;
  background-color: var(--vw-brand);
  /* A circle only stays a circle if it cannot be squeezed by its flex row. */
  flex: 0 0 auto;
  /* ⚠ EXPLICIT 75px SQUARE, and `aspect-ratio` is not enough on its own. With `min-width: 80px`
     and the digit's own line box inside `p-4`'s 24px padding, the box measured **80×106** — an
     oval, not a circle, because aspect-ratio yields to content that is taller than the ratio
     allows. 75px is live's own figure, measured on .ph-pi-step-number; the padding goes and the
     font is sized to sit inside the circle instead of defining it.
     This also took 31px per row off the ladder: it was 145px of pitch against live's 83px. */
  width: 75px;
  height: 75px;
  padding: 0;
  font-size: 40px;
  line-height: 1;
  /* ON TOP of the pill. The pill follows it in the DOM and is pulled back over it by a
     negative margin, so without this it paints across the circle and the number shows as a
     crescent — which is exactly how the first screenshot came out. */
  position: relative;
  z-index: 1;
}
[data-brand='powerhub'] .ph-process__text {
  background-color: var(--vw-brand-surface);
  color: var(--vw-brand-ink);
  font-weight: 600;
  /* The pill tucks under the circle so the two read as one shape, exactly as live's do — its
     ps-5 / pe-4 padding is what keeps the text clear of the overlap. */
  margin-left: -40px;
  padding-left: 56px;
}
[data-brand='powerhub'] .ph-process__text--left {
  margin-left: 0;
  margin-right: -40px;
  padding-left: 16px;
  padding-right: 56px;
}
[data-brand='powerhub'] .ph-process__text p:last-child {
  margin-bottom: 0;
}
/* The column beside the ladder. Live TOP-ALIGNS it with step 1 and gives it no padding of its own.
   ⚠ The fix is in the VIEW, not here: `justify-content-center h-100 p-5` came off the markup,
   because every Bootstrap spacing and flex utility carries `!important` and a brand rule cannot
   outrank that however specific it is — measured, after this rule alone left the padding at 48px.
   These two lines stay as a floor for the case where the classes come back. */
[data-brand='powerhub'] .ph-process__aside {
  justify-content: flex-start;
  padding: 0;
}

/* Live leaves this one heading dark while every other section heading is green — it sits on the
   grey band beside the ladder rather than above a block, and green there competes with seven
   green circles. */
[data-brand='powerhub'] .ph-process__heading {
  color: var(--vw-brand-ink);
}

/* ── The footer band ────────────────────────────────────────────────────────
 * Views/brand/powerhub/Partials/_Footer.cshtml. Live's row 2 is a photograph with white text
 * over it; row 3 is #786e65, which is the warm grey this site's own legal bar already uses. */
[data-brand='powerhub'] .ph-footer__band {
  position: relative;
  overflow: hidden;
}
[data-brand='powerhub'] .ph-footer__bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
[data-brand='powerhub'] .ph-footer__inner {
  position: relative;
  z-index: 1;
  padding-block: 48px;
}
/* White on a photograph needs a shadow, not a guess: live paints one on all four sides
   (`text-shadow-all-sides`) because the background is a building site and parts of it are
   pale. Same approach, one declaration. */
[data-brand='powerhub'] .ph-footer__title,
[data-brand='powerhub'] .ph-footer__contact {
  color: #fff;
  text-shadow: 0 0 6px rgb(0 0 0 / 70%), 0 1px 2px rgb(0 0 0 / 90%);
}
[data-brand='powerhub'] .ph-footer__contact {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
[data-brand='powerhub'] .ph-footer__contact a {
  color: #fff;
  text-decoration: underline;
}
[data-brand='powerhub'] .ph-footer__contact address {
  font-style: normal;
}
[data-brand='powerhub'] .ph-footer__legal {
  background-color: var(--vw-brand-warm);
  color: #fff;
  padding-block: 8px;
}

/* ── Bootstrap 5's xl columns have to be re-asserted for Powerhub ───────────
 * ⚠ THIS IS A COLLISION, NOT A PREFERENCE, AND IT COST AN AFTERNOON. `vw-components.css` — the
 * agency's compiled CSS — still contains Bootstrap 3's grid, media-wrapped with BOOTSTRAP 3's
 * breakpoints (sm 768, md 992, lg 1200), and it loads AFTER Bootstrap 5. The class NAMES are
 * the same and the specificity is the same, so above 992px `.col-md-10` (legacy, still active
 * because BS3's md starts at 992) beats `.col-xl-6` (BS5, from 1200) purely on source order.
 *
 * It is invisible until an element carries BOTH — which live's Powerhub markup does constantly,
 * because live loads only Bootstrap 5. The process ladder came out full width with its heading
 * stacked underneath instead of beside it, and no rule anywhere looked wrong.
 *
 * Measured 2026-09-21. The percentages below are Bootstrap 5's own, re-declared with the brand
 * attribute so they outrank the legacy rules — scoped, so vanwerven.nl's layout cannot move.
 * The real fix is to delete the grid from vw-components.css, which is generated; that is a
 * vanwerven.nl-wide change and that site is closed, so it is a backlog item, not this pass.
 * Offsets need no entry: the legacy file uses BS3's `.col-lg-offset-1` naming, which does not
 * collide with BS5's `.offset-xl-1`. */
@media (min-width: 1200px) {
  [data-brand='powerhub'] .col-xl-1 { flex: 0 0 auto; width: 8.3333333333%; }
  [data-brand='powerhub'] .col-xl-2 { flex: 0 0 auto; width: 16.6666666667%; }
  [data-brand='powerhub'] .col-xl-3 { flex: 0 0 auto; width: 25%; }
  [data-brand='powerhub'] .col-xl-4 { flex: 0 0 auto; width: 33.3333333333%; }
  [data-brand='powerhub'] .col-xl-5 { flex: 0 0 auto; width: 41.6666666667%; }
  [data-brand='powerhub'] .col-xl-6 { flex: 0 0 auto; width: 50%; }
  [data-brand='powerhub'] .col-xl-7 { flex: 0 0 auto; width: 58.3333333333%; }
  [data-brand='powerhub'] .col-xl-8 { flex: 0 0 auto; width: 66.6666666667%; }
  [data-brand='powerhub'] .col-xl-9 { flex: 0 0 auto; width: 75%; }
  [data-brand='powerhub'] .col-xl-10 { flex: 0 0 auto; width: 83.3333333333%; }
  [data-brand='powerhub'] .col-xl-11 { flex: 0 0 auto; width: 91.6666666667%; }
  [data-brand='powerhub'] .col-xl-12 { flex: 0 0 auto; width: 100%; }
}

/* ── The guided form panel and the green band ───────────────────────────────
 * Added 2026-09-23 with the last two homepage sections. Both pair with a view under
 * Views/brand/powerhub/…; neither rule fires anywhere else, because everything here still
 * starts at [data-brand='powerhub'].
 *
 * Live's colours, by name: the panel and the band are both --ph-h2-color /
 * --ph-footer-row-1-background-color, and those are the same #82bf5a the tokens above already
 * call --vw-brand. The forward buttons are --ph-form-*-button-color, which is --vw-brand-cta.
 * So nothing new is defined; this is arrangement on top of the palette. */

/* The green card. Live gives it a drop shadow and min-height:50vh; the height is left out
   deliberately — it is there to stop live's Bootstrap carousel jumping between steps of
   different lengths, and there is no carousel here. A tall empty card on a phone is worse
   than a card that fits its question. */
[data-brand='powerhub'] .ph-guided {
  background-color: var(--vw-brand);
  box-shadow: 0 3px 20px rgba(0, 0, 0, 0.4);
  border-radius: 16px;
  color: #fff;
  padding: 32px 16px;
}
@media (min-width: 992px) {
  [data-brand='powerhub'] .ph-guided {
    padding: 48px;
  }
}
[data-brand='powerhub'] .ph-guided__heading,
[data-brand='powerhub'] .ph-guided__question,
[data-brand='powerhub'] .ph-guided__intro {
  color: #fff;
}
/* Sized in px, not left to the Bootstrap `.h3` the view also carries: that class is `1.75rem`,
   which against this site's 10px root is 17.5px. Live's question is a plain <h2> at 32px and its
   panel heading is an <h1>, so the rebuild's questions were rendering at just over half live's
   size. See the banner at the top of this file. */
[data-brand='powerhub'] .ph-guided__heading {
  font-size: 32px;
  line-height: 1.2;
  margin-bottom: 24px;
}
[data-brand='powerhub'] .ph-guided__question {
  font-size: 24px;
  line-height: 1.3;
}

/* The question is a <legend>, and this site gives a legend a section heading's underline. On the
   green panel that reads as a stray white rule across the card; live has none. Width and float
   too: a legend is not a block by default in every engine, and without them the options wrap
   under half a line. */
[data-brand='powerhub'] legend.ph-guided__question {
  border: 0;
  float: none;
  padding: 0;
  width: auto;
}

/* An option is white-on-green until chosen and green-on-white after, which is live's inversion.
   The white border is what keeps two adjacent options apart on a green ground. */
[data-brand='powerhub'] .ph-guided__option {
  background-color: var(--vw-brand);
  border: 2px solid #fff;
  border-radius: 32px;
  color: #fff;
  font-weight: 700;
  padding: 12px 24px;
}
[data-brand='powerhub'] .btn-check:checked + .ph-guided__option,
[data-brand='powerhub'] .ph-guided__option:hover {
  background-color: #fff;
  border-color: #fff;
  color: var(--vw-brand);
}
/* The focus ring has to survive on both states, and neither white nor green does. */
[data-brand='powerhub'] .btn-check:focus-visible + .ph-guided__option {
  outline: 3px solid var(--vw-brand-ink);
  outline-offset: 2px;
}

/* Yellow is the one "go" colour on this site, and here it is both directions — live uses it for
   Vorige as well as Volgende. */
[data-brand='powerhub'] .ph-guided__nav-btn {
  background-color: var(--vw-brand-cta);
  border: 0;
  border-radius: 32px;
  color: var(--vw-brand-ink);
  font-weight: 700;
  padding: 12px 24px;
}
[data-brand='powerhub'] .ph-guided__nav-btn:hover {
  background-color: var(--vw-brand-cta);
  color: #000;
}

/* ⚠ NOT .text-danger, which is why the shared view's class is dropped here. Bootstrap's #dc3545
   on this green is a 1.5:1 contrast failure and reads as a muddy brown. White with a heavier
   weight carries the same message against the green, and the panel already tells the visitor
   where they are, so colour is not the only signal either way. */
[data-brand='powerhub'] .ph-guided__error {
  color: #fff;
  font-weight: 700;
}

/* The form on the last step. Umbraco Forms' default theme paints nothing, so what is needed is
   readable labels on green and inputs that are not transparent. */
[data-brand='powerhub'] .ph-guided__form .umbraco-forms-label,
[data-brand='powerhub'] .ph-guided__form legend {
  color: #fff;
}
[data-brand='powerhub'] .ph-guided__form input[type='text'],
[data-brand='powerhub'] .ph-guided__form input[type='email'],
[data-brand='powerhub'] .ph-guided__form input[type='tel'],
[data-brand='powerhub'] .ph-guided__form select,
[data-brand='powerhub'] .ph-guided__form textarea {
  background-color: #fff;
  border: 0;
  border-radius: 8px;
  padding: 9.6px 14.4px;
  width: 100%;
}
/* ⚠ The long selector is not decoration. `custom.css` §8 has
   `.form .umbraco-forms-form input[type=submit].btn.primary` — (0,5,1) — and specificity beats
   source order, so the short version of this rule lost and the button came out brand GREEN on a
   green panel: invisible, and measured that way (rgb(130,191,90) on rgb(130,191,90)) rather than
   guessed. Matching the class list is what wins it back. */
[data-brand='powerhub'] .ph-guided__form .umbraco-forms-form input[type='submit'].btn.primary,
[data-brand='powerhub'] .ph-guided__form input[type='submit'] {
  background-color: var(--vw-brand-cta);
  border: 0;
  border-radius: 32px;
  color: var(--vw-brand-ink);
  font-weight: 700;
  padding: 12px 24px;
}
[data-brand='powerhub'] .ph-guided__form .umbraco-forms-form input[type='submit'].btn.primary:hover,
[data-brand='powerhub'] .ph-guided__form .umbraco-forms-form input[type='submit'].btn.primary:focus-visible {
  background-color: #ded000;
  color: #000;
}
/* Validation messages, same reasoning as .ph-guided__error above. */
[data-brand='powerhub'] .ph-guided__form .field-validation-error,
[data-brand='powerhub'] .ph-guided__form .umbraco-forms-validation-summary {
  color: #fff;
  font-weight: 700;
}

/* ── The green "Meer weten?" band ───────────────────────────────────────────
 * Live's section 9. Full-bleed colour, heading left, one field and its button right, and the
 * field and button meet as a single pill at desktop width. */
[data-brand='powerhub'] .ph-band {
  background-color: var(--vw-brand);
  color: #fff;
  padding-block: 24px;
}
[data-brand='powerhub'] .ph-band__inner {
  align-items: center;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
@media (min-width: 992px) {
  [data-brand='powerhub'] .ph-band__inner {
    flex-direction: row;
    gap: 32px;
  }
  [data-brand='powerhub'] .ph-band__text { flex: 0 0 auto; }
  [data-brand='powerhub'] .ph-band__form { flex: 1 1 auto; }
}
[data-brand='powerhub'] .ph-band__heading {
  color: #fff;
  margin: 0;
}
[data-brand='powerhub'] .ph-band__intro {
  color: #fff;
  margin: 4px 0 0;
}

/* The caption is live's placeholder text. A placeholder is not an accessible name, so the real
   <label> stays in the DOM and is taken out of sight here — the clip-rect idiom rather than
   display:none, which would take it out of the accessibility tree as well and leave the input
   unnamed. */
[data-brand='powerhub'] .ph-band__form .umbraco-forms-label {
  clip-path: inset(50%);
  height: 1px;
  overflow: hidden;
  position: absolute;
  white-space: nowrap;
  width: 1px;
}
[data-brand='powerhub'] .ph-band__form .umbraco-forms-page,
[data-brand='powerhub'] .ph-band__form .umbraco-forms-fieldset,
[data-brand='powerhub'] .ph-band__form .row-fluid,
[data-brand='powerhub'] .ph-band__form .umbraco-forms-container,
[data-brand='powerhub'] .ph-band__form .umbraco-forms-field {
  margin: 0;
  padding: 0;
}
/* custom.css §8 puts 10px above the navigation block. In a stacked form that is the gap before
   the button; in a one-line band it drops the button below the field it is meant to join. */
[data-brand='powerhub'] .ph-band__form .umbraco-forms-navigation {
  margin-top: 0;
}
@media (min-width: 992px) {
  /* One row: the field, then the submit that sits in Forms' own navigation block. The two are
     siblings in the theme's markup, so flex on their shared parent is all it takes. */
  [data-brand='powerhub'] .ph-band__form .umbraco-forms-page {
    align-items: stretch;
    display: flex;
    gap: 0;
  }
  [data-brand='powerhub'] .ph-band__form .umbraco-forms-fieldset { flex: 1 1 auto; }
  [data-brand='powerhub'] .ph-band__form .umbraco-forms-navigation { flex: 0 0 auto; }
}
[data-brand='powerhub'] .ph-band__form input[type='email'],
[data-brand='powerhub'] .ph-band__form input[type='text'] {
  background-color: #fff;
  border: 0;
  border-radius: 32px;
  /* line-height matches the submit's, so the two halves of the pill are the same height. They
     were 37px and 41px before it. */
  line-height: 1.5;
  padding: 11.2px 20px;
  width: 100%;
}
/* Same collision as the panel's submit above, same reason for the long selector. */
[data-brand='powerhub'] .ph-band__form .umbraco-forms-form input[type='submit'].btn.primary,
[data-brand='powerhub'] .ph-band__form input[type='submit'] {
  background-color: var(--vw-brand-cta);
  border: 0;
  border-radius: 32px;
  color: var(--vw-brand-ink);
  font-weight: 700;
  line-height: 1.5;
  padding: 11.2px 24px;
  white-space: normal;
  width: 100%;
}
[data-brand='powerhub'] .ph-band__form .umbraco-forms-form input[type='submit'].btn.primary:hover,
[data-brand='powerhub'] .ph-band__form .umbraco-forms-form input[type='submit'].btn.primary:focus-visible {
  background-color: #ded000;
  color: #000;
}
@media (min-width: 992px) {
  /* The pill is one shape split in two: the field loses its right corners and the button its
     left, so they meet. Below 992 they stack and each keeps its own full pill. */
  [data-brand='powerhub'] .ph-band__form input[type='email'],
  [data-brand='powerhub'] .ph-band__form input[type='text'] {
    border-bottom-right-radius: 0;
    border-top-right-radius: 0;
  }
  [data-brand='powerhub'] .ph-band__form input[type='submit'] {
    border-bottom-left-radius: 0;
    border-top-left-radius: 0;
    height: 100%;
    width: auto;
  }
}
[data-brand='powerhub'] .ph-band__form .field-validation-error {
  color: #fff;
  font-weight: 700;
}

/* The honeypot Umbraco Forms adds to every form, and the recaptcha wrapper the default theme now
   emits (Form.cshtml's Custom case, wrapped 2026-09-23). Both must stay in the accessibility
   tree as they were, so this only stops them taking layout space in a one-line band. */
[data-brand='powerhub'] .ph-band__form .umbraco-forms-hidden {
  display: none;
}

/* ── The green pill ─────────────────────────────────────────────────────────
 * Live's second button, and the only other one it has: `.ph-button-green`, white bold on the
 * brand green with no border. It carries the download on each product card and the "Lees meer"
 * on each case slide. Yellow stays reserved for "go" — the hero and the guided form's forward
 * controls — which is what keeps it reading as a call to action. */
[data-brand='powerhub'] .ph-btn--green {
  background-color: var(--vw-brand);
  border: 0;
  color: #fff;
  font-weight: 700;
}
[data-brand='powerhub'] .ph-btn--green:hover,
[data-brand='powerhub'] .ph-btn--green:focus-visible {
  background-color: #6da84a;
  color: #fff;
}

/* ── The product info rows ──────────────────────────────────────────────────
 * Views/brand/powerhub/…/cardGridBlock.cshtml. Live's own values:
 * --ph-item-info-item-container-background-color is #ededed with a 0 3px 20px #00000065 shadow,
 * and --ph-item-info-h1-text-color is the brand green. The band behind the cards stays white —
 * grey panels on a grey band is the invisible-section trap from the eighth pass. */
[data-brand='powerhub'] .ph-item-info__card {
  background-color: var(--vw-brand-surface);
  box-shadow: 0 3px 20px #00000065;
}
[data-brand='powerhub'] .ph-item-info__heading {
  color: var(--vw-brand);
  /* Live's h1 here is 40px/48px. This is an h3 — the page has one h1 and it is in the hero — so
     the size is set explicitly rather than inherited from whatever .h3 happens to be. ⚠ Bootstrap's
     own heading classes are rem-based and this site's root is 10px outside the Powerhub subtree;
     inside it the root is 100%, but an explicit px still says what was meant.

     ⚠⚠ 400, NOT LIVE'S DECLARED 500 — and copying live's number here would be WRONG. Live loads
     Titillium Web from Google with the weights 200/300/400/600/700/900 and no 500, so its
     `font-weight: 500` falls back to 400 and renders regular. This site ships its own
     `titillium` faces and DOES have a 500 — titilliumweb-semibold — so 500 here would render
     semibold against live's regular. Match what live PAINTS, not what it declares. The same
     applies to .ph-case__name below. */
  font-size: 40px;
  font-weight: 400;
  line-height: 48px;
  margin-bottom: 8px;
}
/* Live's card copy is 16px/24px; this site's base line-height is 1.43, which makes every spec
   row two pixels shorter and the table visibly tighter than live's. */
[data-brand='powerhub'] .ph-item-info__card {
  line-height: 1.5;
}
[data-brand='powerhub'] .ph-item-info__heading a {
  color: inherit;
}

/* The spec table, authored as the card's body. Live renders every cell `p-1 border` with the
   outer left and right borders removed, so the table reads as ruled rows rather than a boxed
   grid. The label column is a <th scope="row"> here — live uses a plain <td>, which leaves a
   screen reader to guess which value belongs to which label. */
[data-brand='powerhub'] .ph-item-info__card table {
  border-collapse: collapse;
  margin-bottom: 0;
  width: 100%;
}
[data-brand='powerhub'] .ph-item-info__card th,
[data-brand='powerhub'] .ph-item-info__card td {
  border: 1px solid #dee2e6;
  font-weight: 400;
  padding: 4px;
  text-align: left;
  vertical-align: top;
}
[data-brand='powerhub'] .ph-item-info__card tr th:first-child {
  border-left: 0;
}
[data-brand='powerhub'] .ph-item-info__card tr td:last-child {
  border-right: 0;
}

/* Live's button is `w-75` inside a centred flex row. Kept as a width rather than a Bootstrap
   class so it can go full width once the card is narrow enough that 75% wraps the label onto
   three lines. */
[data-brand='powerhub'] .ph-item-info__button {
  font-size: 16px;
  text-align: center;
  width: 75%;
}
@media (max-width: 575.98px) {
  [data-brand='powerhub'] .ph-item-info__button {
    width: 100%;
  }
}

/* ── The case slide ─────────────────────────────────────────────────────────
 * Views/brand/powerhub/…/caseCarouselBlock.cshtml + js/blocks/caseCarouselBlock.js.
 * Live's own values: the quote is `fs-5 fst-italic fw-light` in #000, the customer name is
 * --ph-css-customer-name-text-color (#786e65, this site's warm) and the section heading is the
 * brand green every other Powerhub heading gets. */
[data-brand='powerhub'] .ph-case__quote p {
  color: #000;
  font-size: 20px;
  font-style: italic;
  font-weight: 300;
  line-height: 30px;
  margin-bottom: 16px;
}
[data-brand='powerhub'] .ph-case__name {
  color: var(--vw-brand-warm);
  /* Live's is an h2 at 32px/38.4px. This is an h3 — the name sits under the block's own h2 — so
     the size is stated rather than inherited from whatever Bootstrap's .h3 happens to be. The 400
     is live's painted weight rather than its declared 500; see .ph-item-info__heading above. */
  font-size: 32px;
  font-weight: 400;
  line-height: 38.4px;
  margin-bottom: 8px;
}

/* The gallery. `position: relative` is load-bearing: the "1 / 2" overlay is absolute against
   the stage, and without it the count would anchor to the nearest positioned ancestor, which
   is the carousel itself — putting every slide's counter in the same corner of the section. */
[data-brand='powerhub'] .ph-case__stage {
  position: relative;
}
[data-brand='powerhub'] .ph-case__count {
  color: #f2f2f2;
  font-size: 12px;
  left: 0;
  padding: 8px 12px;
  position: absolute;
  top: 0;
  /* Live puts light grey straight on the photograph, which disappears on a pale one. The
     shadow is the same fix _Footer.cshtml's white-on-photo text already uses. */
  text-shadow: 0 0 4px #000;
}

/* The thumbnail row. Rendered `hidden` and revealed by the module — a row of buttons that does
   nothing is worse than no row, which is what a no-JS visitor would otherwise get. */
[data-brand='powerhub'] .ph-case__thumbs {
  margin-top: 8px;
}
[data-brand='powerhub'] .ph-case__thumb {
  background: none;
  border: 0;
  cursor: pointer;
  display: block;
  opacity: 0.6;
  padding: 0;
  width: 100%;
}
[data-brand='powerhub'] .ph-case__thumb:hover,
[data-brand='powerhub'] .ph-case__thumb--active {
  opacity: 1;
}
/* ⚠ Opacity alone is not a state a visitor who cannot see it can read, and it is not a focus
   ring either. The outline is what makes the row keyboard-usable; live's version has neither,
   because live's thumbnails are <img onclick> and cannot be focused at all. */
[data-brand='powerhub'] .ph-case__thumb:focus-visible {
  opacity: 1;
  outline: 3px solid var(--vw-brand-ink);
  outline-offset: 2px;
}

/* ⚠ THE SHARED CAROUSEL PADS THE BAND TWICE. `.slider--section` is `padding: 40px 0 75px` in
   vw-components.css and `.carousel__slide` is `padding: 40px 0 75px` in custom.css, and the
   slide sits inside the slider — so 230px of vertical space before a single picture is drawn.
   Measured 2026-09-23: the band came to 979px against live's 510px and 230 of the difference
   was this. Live pads its own band `py-5` and its slide not at all, which is what this restores.

   Scoped to `.ph-case` rather than fixed at source: the double padding is on the shared
   carousel, vanwerven.nl's case slider has been shipping with it, and that site is closed. */
[data-brand='powerhub'] .ph-case .slider--section {
  padding: 0 0 24px;
}
[data-brand='powerhub'] .ph-case .carousel__slide {
  padding: 0;
}
[data-brand='powerhub'] .ph-case__heading {
  margin-bottom: 24px;
}

/* ⚠ UMBRACO FORMS WRAPS ITS CONTAINERS IN `.row-fluid`, WHICH IS BOOTSTRAP 2's NAME, so the two
   columns of the guided form's contact step have NO GUTTER and the left field's rounded right
   edge runs under the right one. Bootstrap 5 puts that padding on `.row > *`, not on `.col-*`
   itself — measured 2026-09-23: `padding: 0px/0px` on every `.umbraco-forms-container`, while
   `--bs-gutter-x` inherits down as 24px with nothing to spend it. So declaring the variable here
   does nothing; the padding has to be written out, and the negative margin put back so the outer
   edges stay flush with the rest of the panel. (What holds the columns side by side at all is
   vw-components.css's Bootstrap 3 `.col-md-6` float — `.row-fluid` computes `display: block`.)

   Live has the identical markup and the identical gap of zero, so this is one of the few places
   the rebuild deliberately does not reproduce it. Scoped to this one form: every other Umbraco
   Forms render on the site is a single full-width container, where the gap cannot show. */
[data-brand='powerhub'] .ph-guided__form .row-fluid {
  margin-left: -12px;
  margin-right: -12px;
}
[data-brand='powerhub'] .ph-guided__form .row-fluid > .umbraco-forms-container {
  padding-left: 12px;
  padding-right: 12px;
}
