/* ============================================================
   pp-footer.css -- Prime Peptides global footer: the dedicated,
   precisely scoped FOOTER-ONLY stylesheet.
   R4 step 12 (2026-08-13). Deployed to
   uploads/pp-redesign/css/pp-footer.css and enqueued on part-76
   contexts by sandbox pp-redesign-footer.php (deps pp-tokens).

   WHY A DEDICATED SHEET (architecture, recorded rather than assumed):
   template part 76 renders OUTSIDE every <main class="pp-site">
   wrapper, on nine templates whose surface stylesheets are ALL
   .pp-site-scoped and ALL load in different lanes (pp-site-scoped /
   pp-catalogue / pp-product / pp-cart / pp-checkout / pp-education /
   pp-pages). No existing sheet can reach the footer markup, and
   appending footer rules to any one lane would style the footer on
   one surface only. This is the exact structural situation the header
   solved at step 4 with pp-header.css + pp-redesign-header.php (owner
   decision 2026-08-09, Direction 04 strategy (a): a dedicated,
   precisely scoped part-only stylesheet), so step 12 follows that
   precedent rather than inventing a second pattern. pp-site-scoped.css's
   own contract already routes the "footer/legal" family away from
   itself ("Excluded families ... footer/legal ... arrive with their
   own surface's step").

   SCOPE CONTRACT (machine-auditable):
   - EVERY selector list begins with `.pp-footer`, with exactly ONE
     documented exception: section A's wrapper reset, anchored
     `footer.wp-block-template-part:has(> .pp-footer)`, which by
     construction cannot match a document that does not render this
     footer.
   - Zero :root, zero bare `*` / body / html, zero bare element
     selectors, zero @keyframes, zero @import.
   - Zero commerce selectors: no add-to-cart, buy-block, gateway,
     price, quantity, notice-banner or Store API class is selected
     anywhere in this file. A4 is not touched and not discharged.
   - Zero JavaScript ships with this surface.
   - This file NEVER modifies pp-tokens.css, pp-site-scoped.css,
     pp-compat.css, pp-header.css, pp-catalogue.css, pp-product.css,
     pp-cart.css, pp-checkout.css, pp-education.css, pp-pages.css or
     custom_css post 27.

   !important CENSUS -- 11 declarations in shipped code (comment text
   excluded), every one a MATCHED answer to a custom_css post-27 rule
   that already carries !important, or the scoped reduced-motion
   override. Breakdown, each cited again at its use site:
     A wrapper reset       2  (background, color)
     E contact affordances 5  (display x1; color x4 -- rest + hover,
                               WhatsApp + social)
     I focus               1  (outline)
     J reduced motion      3  (animation-duration, transition-duration,
                               scroll-behavior)
   No other !important ships. Audited legacy generic ceiling for footer markup
   (post 27, comment-stripped selector census, 2026-08-13): exactly
   three generic rules exist site-wide -- `img{max-width:100%}` (0,0,1),
   `a{color:var(--pp-blue);...}` (0,0,1) and
   `a:focus-visible{outline:2px solid var(--pp-blue)!important;
   outline-offset:3px}` (0,1,1). There is NO generic h2/p/div/nav/b/
   strong/span rule. Component declarations below therefore sit at
   (0,2,1) or heavier, which clears every one of them.

   VALUES: concept-verbatim where the concept has the component
   (SRC = design-reference/claude-concept/css/pp-site.css line refs);
   PP-EXT = derived extension, cited inline. Tokens come from
   pp-tokens.css, which loads on every non-shell surface.

   Brief: redesign/build/step-12/STEP-12-PACKET.md.
   ============================================================ */

/* ---- A. Template-part wrapper reset ----
   THE ONE non-.pp-footer-rooted rule in this file, and the reason it
   exists: custom_css post 27 paints the footer wrapper twice, both
   with !important --
     footer.wp-block-template-part{margin:0!important;padding:0!important;
       color:var(--pp-white)!important;background:#04142c!important}
     footer.wp-block-template-part{background:
       url("data:image/svg+xml,...hexagonal line-art...") repeat,
       linear-gradient(160deg,#04142c 0%,#081d3e 100%)!important}
   The second is the legacy molecular/hexagonal line-art motif, which
   CLAUDE.md and .claude/agents/site-builder.md name explicitly as a
   banned aesthetic ("molecular geometry", "hexagonal biotech
   patterns"). Post 27 is R5 territory and is not edited here, so the
   ground is reset from this lane instead.
   MATCHED !important x2 (background, color) at (0,2,1) > (0,1,1);
   among !important author declarations the winner is specificity, so
   post 27 printing later cannot recover. margin/padding are NOT
   contested -- post 27's 0/0 is what this composition wants.
   The :has() anchor makes the rule self-limiting: it cannot fire on a
   footer that is not this footer. Section B additionally paints the
   white ground on .pp-footer itself, so the visible result is correct
   even where :has() is unsupported. */
footer.wp-block-template-part:has(> .pp-footer){background:var(--pp-surface-page) !important;color:var(--pp-text-body) !important}

/* ---- B. Scoped normalization + the footer ground ----
   SRC 22 (box-sizing), 24 (img max-width), 27 (a base), 23 (the body
   font layer, re-hosted on .pp-footer because this markup renders
   outside .pp-site and inherits nothing from it).
   `.pp-footer a` deliberately sets NO color: a (0,1,1) color would
   defeat the (0,2,1) component colors below -- the same decision
   pp-header.css section A records for `.pp-pill a`.
   display/padding-block are declared explicitly to close the ONE
   cascade seam this class name has: the frozen reference sheet
   pp-site.css (SRC 84) declares `.pp-footer{display:flex;
   justify-content:space-between;align-items:flex-end;gap:var(--pp-space-8);
   padding-block:70px 56px;flex-wrap:wrap}` and still loads in the
   private typography-specimen lane. Under display:block the four flex
   properties are inert, so restating display + padding-block is
   sufficient and nothing is left to source order. */
.pp-footer,.pp-footer *,.pp-footer *::before,.pp-footer *::after{box-sizing:border-box}
.pp-footer{display:block;margin:0;background:var(--pp-surface-page);border-top:1px solid var(--pp-border-subtle);font-family:var(--pp-font-sans);font-size:15px;line-height:1.45;color:var(--pp-text-body);-webkit-font-smoothing:antialiased;text-wrap:pretty}
.pp-footer img{max-width:100%}
.pp-footer nav{margin:0;padding:0}
.pp-footer a{text-decoration:none;transition:color var(--pp-dur-fast) var(--pp-ease)}

/* ---- C. Layout ----
   C1. padding-block SRC 84 verbatim (70px 56px); the <=700 value
   (48px 40px) is SRC 327 verbatim, section H.
   C2. .pp-footer__shell restates .pp-shell (SRC 34) verbatim --
   max-width:var(--pp-max);margin:0 auto;padding-inline:var(--pp-gutter).
   It is restated rather than reused because the deployed .pp-shell
   ships as `.pp-site .pp-shell` and cannot match outside .pp-site.
   Same class values, different root: a step-13 consolidation is a
   pure move.
   C3. PP-EXT F-1. The concept footer is two elements (logo + legal)
   in one flex row, authored against a mock with no information
   architecture. Production carries a real 16-link footer IA which
   redesign/03-site-audit.md classifies RESTYLE ("content/links
   materially unchanged"), and CLAUDE.md forbids removing substantive
   content for a cleaner layout. The concept's space-between reading
   is therefore realized as a two-track grid whose proportion is the
   live footer's own (minmax(280px,.95fr) / minmax(520px,1.05fr)),
   with the column gap snapped to the token scale
   (--pp-space-16 = 64px; the legacy one-off was 72px). */
.pp-footer{padding-block:70px 56px}
.pp-footer .pp-footer__shell{max-width:var(--pp-max);margin:0 auto;padding-inline:var(--pp-gutter)}
/* PP-FIX B1 (2026-08-29): the link area takes a fourth column ("Research
   guides"), so its share of the top grid widens a step. */
.pp-footer .pp-footer__top{display:grid;grid-template-columns:minmax(260px,.8fr) minmax(560px,1.2fr);align-items:start;gap:var(--pp-space-16)}

/* ---- D. Brand column ----
   D1. Logo. Official approved asset, attachment 163, unchanged src --
   the same Media Library file the live footer already carries, at its
   natural colour. The legacy `filter:brightness(0) invert(1)` existed
   only to force the artwork white for the navy ground and dies with
   the old class name; the artwork is brand blue on transparent
   (sampled mean luminance 70, e.g. #146ced), which is the intended
   rendering on the white ground. The logo is NOT re-typeset, recoloured
   or replaced. Box pinned on both axes so nothing shifts (SRC: the
   concept footer's own logo width, 116px).
   D2. Brand line register: 14px/1.7 and the 430px measure are the live
   footer's own composition values, carried forward; colour moves to
   the system token --pp-text-muted (#6b7789 on white = 5.42:1). */
.pp-footer .pp-footer__logo{display:inline-flex}
.pp-footer .pp-footer__logo img{display:block;width:116px;height:auto}
.pp-footer .pp-footer__line{max-width:430px;margin:var(--pp-space-5) 0 0;color:var(--pp-text-muted);font-size:14px;line-height:1.7}
.pp-footer .pp-footer__contact{display:flex;flex-wrap:wrap;gap:var(--pp-space-3) var(--pp-space-4);margin-top:var(--pp-space-6)}

/* ---- E. Contact affordances ----
   REUSED, NOT FORKED. a.pp-whatsapp-link and its two children are
   restated BY NAME AND VALUE from the applied pp-product.css (which
   pp-education.css and pp-pages.css also restate verbatim), so the
   footer's WhatsApp route is the same component the product,
   education and document surfaces ship. Lane sheets cannot import one
   another, so the values are restated here; the class names are NOT
   renamed, so a step-13 consolidation into one shared component sheet
   is a pure file move with zero markup change. The legacy
   `--inverse` modifiers are dropped from the markup: they existed
   solely for the retired navy ground.
   MATCHED !important x2 -- answers post 27
   `.pp-whatsapp-link{display:inline-flex!important;color:var(--pp-navy)!important}`
   and `.pp-social-link{display:inline-flex!important;color:var(--pp-navy)!important}`
   (both (0,1,0); these rules are (0,2,1)). post 27's
   `text-decoration:none!important` is NOT contested -- the same value
   is wanted, so it is declared at normal weight and the computed
   result is identical either way.
   E2 is PP-EXT: the system has no social-link component. It is built
   as the outline twin of the WhatsApp pill on the same geometry, from
   the concept's own button grammar (SRC 58-73), rather than as a
   third button size. The handle keeps its literal case
   (text-transform:none) -- "@primepeptidesae" is a name, not a label.
   E3: the icon plates lose the legacy 28px circles and become plain
   17px currentColor glyphs, matching pp-product.css's
   .pp-whatsapp-link__icon exactly. The Instagram SVG's shapes carry no
   fill/stroke attributes of their own, so the stroke values are
   preserved from the live rule. */
.pp-footer a.pp-whatsapp-link,.pp-footer a.pp-social-link{display:inline-flex !important;align-items:center;justify-content:center;gap:10px;min-height:52px;padding:0 26px;border:1px solid transparent;border-radius:var(--pp-radius-pill);box-shadow:none;transform:none;font-family:var(--pp-font-sans);font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:600;text-decoration:none}
.pp-footer a.pp-whatsapp-link{background:var(--pp-blue-600);color:var(--pp-text-on-dark) !important}
.pp-footer a.pp-whatsapp-link:hover{border-color:transparent;background:var(--pp-blue-500);box-shadow:none;transform:none;color:var(--pp-text-on-dark) !important}
.pp-footer a.pp-social-link{border-color:var(--pp-border-default);background:transparent;color:var(--pp-text-heading) !important}
.pp-footer a.pp-social-link:hover{border-color:var(--pp-border-strong);background:var(--pp-neutral-50);box-shadow:none;transform:none;color:var(--pp-text-heading) !important}
.pp-footer a.pp-whatsapp-link:active,.pp-footer a.pp-social-link:active{box-shadow:none;transform:none}
.pp-footer .pp-whatsapp-link__icon,.pp-footer .pp-social-link__icon{display:inline-flex;width:17px;height:17px;flex:0 0 17px;border:0;border-radius:0;background:none;color:inherit}
.pp-footer .pp-whatsapp-link__icon svg{width:17px;height:17px;fill:currentColor}
.pp-footer .pp-social-link__icon svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.7}
.pp-footer .pp-whatsapp-link__label{display:inline}
.pp-footer .pp-social-link__label{display:inline;text-transform:none;letter-spacing:.02em}

/* ---- F. Link columns (PP-EXT F-2) ----
   Three labelled groups inside ONE <nav aria-label="Footer">. Labels
   are <h2 class="pp-footer__label"> rather than the legacy <b>: a
   group of links needs a real accessible name, and <b> supplies none.
   The label register is the system's small-caps label register
   (--pp-ls-label = .15em, the token the legacy one-off .13em snaps
   to), set in the display face at heading colour.
   Link register: 14px (the live footer's own size) at
   --pp-text-body (#4c5666 on white = 7.42:1), hover --pp-blue-600
   (SRC 28, the system's link-hover colour). */
.pp-footer .pp-footer__links{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--pp-space-10)} /* PP-FIX B1: 3 -> 4 columns */
.pp-footer .pp-footer__label{margin:0 0 var(--pp-space-4);font-family:var(--pp-font-display);font-size:11px;letter-spacing:var(--pp-ls-label);text-transform:uppercase;font-weight:600;line-height:1.2;color:var(--pp-text-heading)}
.pp-footer .pp-footer__col a{display:block;margin:var(--pp-space-3) 0;color:var(--pp-text-body);font-size:14px;line-height:1.45}
.pp-footer .pp-footer__col a:hover{color:var(--pp-blue-600)}

/* ---- G. Bottom band ----
   The live composition is preserved exactly: copyright left, research
   notice right, hairline above. The entity string
   "Prime Peptides UAE" and the copyright sentence are carried forward
   byte-identically from template part 76.
   The research-use notice keeps its <strong> and is deliberately NOT
   greyed: the concept's own component note requires the RUO notice at
   >=12px and never greyed, and pp-site-scoped.css already resolves the
   same question on the hero by moving it to --pp-text-body (7.42:1 on
   white). Same token here. --pp-text-muted carries the copyright
   (5.42:1). Spacing snapped to the token scale (--pp-space-12 /
   --pp-space-6; the legacy one-offs were 46px / 23px). */
.pp-footer .pp-footer__bottom{display:grid;grid-template-columns:auto minmax(280px,620px);justify-content:space-between;gap:var(--pp-space-8);margin-top:var(--pp-space-12);padding-top:var(--pp-space-6);border-top:1px solid var(--pp-border-subtle);font-size:12px;line-height:1.65}
.pp-footer .pp-footer__copy{color:var(--pp-text-muted)}
.pp-footer .pp-footer__ruo{text-align:right;color:var(--pp-text-body)}
.pp-footer .pp-footer__ruo strong{font-weight:600}

/* ---- H. Responsive ----
   The system's own axes only: 1100 / 860 / 700 / 380.
   SRC 241-242 (<=860: the footer stacks and the legal block
   left-aligns) and SRC 327 (<=700: padding-block 48px 40px) are
   honoured verbatim; the column counts below them are the PP-EXT
   grid's own collapse.
   44px minimum targets ship across the WHOLE <=860 band, not just
   <=700 -- the owner rule recorded verbatim in pp-header.css section E
   ("Accessibility takes precedence over the concept's undersized
   701-860px targets"). The contact pills are already 52px at every
   width, so only the column links need the floor. */
@media (max-width:1100px){
  .pp-footer .pp-footer__top{gap:var(--pp-space-10)}
  .pp-footer .pp-footer__links{gap:var(--pp-space-8)}
}
@media (max-width:860px){
  .pp-footer .pp-footer__top{grid-template-columns:1fr;align-items:start;gap:var(--pp-space-12)}
  .pp-footer .pp-footer__bottom{grid-template-columns:1fr;gap:var(--pp-space-3)}
  .pp-footer .pp-footer__ruo{text-align:left}
  .pp-footer .pp-footer__col a{display:flex;min-height:44px;align-items:center;margin:0}
}
@media (max-width:700px){
  .pp-footer{padding-block:48px 40px}
  .pp-footer .pp-footer__links{grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--pp-space-6) var(--pp-space-8)}
}
@media (max-width:380px){
  .pp-footer .pp-footer__links{grid-template-columns:1fr}
  .pp-footer .pp-footer__contact{display:grid;gap:var(--pp-space-2)}
  .pp-footer a.pp-whatsapp-link,.pp-footer a.pp-social-link{padding:0 18px}
}

/* ---- I. Focus ----
   The footer renders outside .pp-site, so pp-compat.css's
   `.pp-site :focus-visible` neutralization never reaches it and this
   lane must both answer the legacy rule and supply the indicator.
   MATCHED !important x1 -- answers post 27
   `a:focus-visible,...,[tabindex]:focus-visible{outline:2px solid
   var(--pp-blue)!important;outline-offset:3px}`. Its six element forms
   compute (0,1,1); `.pp-footer :focus-visible` is (0,2,0) and clears
   them. The [tabindex] form is (0,2,0) and would win a tie on source
   order, but the footer markup is closed -- links and headings only,
   no [tabindex] element -- so no (0,3,0) tier ships; add one only if
   that ever changes. This is the same necessity proof pp-compat.css
   records for .pp-pill.
   INDICATOR, recorded as a departure (S12-D8): the shared token
   --pp-shadow-focus is kept in the cascade so the open step-13b global
   token decision still reaches this footer in one edit, but it is
   NOT shipped alone -- 13b records it rendering rgb(183,216,255) =
   1.47:1 against adjacent white, below the 3:1 required by WCAG 2.2
   SC 1.4.11/2.4.11. A 2px --pp-blue-700 outline (#0c5ed8 = 5.82:1 on
   white) is therefore shipped alongside it so this new sitewide chrome
   does not enlarge a known launch-blocking defect. The global token
   decision remains the owner's / Design Director's.
   The border-radius restatement answers post 27's
   `.pp-whatsapp-link:focus-visible,.pp-social-link:focus-visible{...;
   border-radius:10px}` (0,2,0), which would otherwise square off the
   pills on focus only. */
.pp-footer :focus-visible{outline:2px solid var(--pp-blue-700) !important;outline-offset:3px;box-shadow:var(--pp-shadow-focus)}
.pp-footer a.pp-whatsapp-link:focus-visible,.pp-footer a.pp-social-link:focus-visible{border-radius:var(--pp-radius-pill)}

/* ---- J. Reduced motion ----
   SRC 339-341, scoped to the footer. The only motion in this surface
   is the colour transition on links and pills; nothing translates,
   nothing animates. MATCHED !important x1 (the scoped a11y override,
   the same form pp-site-scoped.css ships). */
@media (prefers-reduced-motion:reduce){
  .pp-footer,.pp-footer *,.pp-footer *::before,.pp-footer *::after{animation-duration:.01ms !important;transition-duration:.01ms !important;scroll-behavior:auto !important}
}

/* ---- K. Readability pass (owner request 2026-08-25) ----
   READABILITY ONLY. No element is added, removed, reordered or recoloured
   beyond type register, and the grid, the columns, the contact pills, the logo,
   the focus ring and every responsive collapse in sections A-J are untouched.
   Selectors match section F/D/G exactly, so each rule below simply supersedes
   its own predecessor on source order at identical specificity.

   HEIGHT BUDGET, the constraint the owner set ("do not make it overly tall").
   Every gain here is paid for out of the link column, so the footer gets
   SHORTER, not taller:
     label   11 -> 12.5px                                        +1.5px x3 cols
     link    14px/1.45 + 12px margins (44.3px box)
          -> 14px/1.5  +  9px margins (39.0px box)                -5.3px x13 links
     brand   14px/1.7 -> 15px/1.65 (23.8 -> 24.75 per line)       +~3px total
     bottom  12px/1.65 -> 12.5px/1.6                              +~0px
   Net at the tallest column (Support, 5 links): about -25px.

   Contrast is unchanged and already verified in sections D/F/G: labels
   --pp-text-heading (navy-700), links --pp-text-body (#4c5666 = 7.42:1 on
   white), brand line --pp-text-muted (#6b7789 = 5.42:1), and the RUO notice
   stays at --pp-text-body and is still never greyed.

   The <=860px 44px minimum target (section H) is deliberately NOT reopened:
   it uses display:flex + min-height and is unaffected by the margin change,
   which the block below restates so the two cannot drift apart. */
.pp-footer .pp-footer__label{font-family:'Manrope',var(--pp-font-sans);font-size:12.5px;font-weight:600;letter-spacing:.11em;line-height:1.25;margin:0 0 var(--pp-space-3);color:var(--pp-text-heading)}
.pp-footer .pp-footer__col a{margin:9px 0;font-size:14px;line-height:1.5}
.pp-footer .pp-footer__line{font-size:15px;line-height:1.65}
.pp-footer .pp-footer__bottom{font-size:12.5px;line-height:1.6}
@media (max-width:860px){
  /* Restated so the readability margins above cannot re-shrink the 44px
     targets section H ships across the whole <=860 band. */
  .pp-footer .pp-footer__col a{display:flex;min-height:44px;align-items:center;margin:0}
}
