/* ==========================================================================
   Fruscio — Global stylesheet
   Loaded on every request. Home-only sections live in home.css.
   Source of truth for the visual language: design canvas `fruscio-home.html`.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. DESIGN TOKENS
   Prefixed `--fr-` so third-party plugin CSS (WooCommerce, accessibility
   widget, legacy Elementor output) can never shadow them.
   -------------------------------------------------------------------------- */
:root {
  /* HUMAN WARM.
     The palette of the "Human (warm)" direction in the Fruscio Sport design
     project. The brand triad carries over untouched; everything underneath it
     goes warm, and the dark stops being blue.

     Source colours, verbatim:
       navy #003366 · green #669933 · lime #CCCC00
       cream #FFF8E7 · peach #FFD9B3 · sky #CFE3F0
       ink #1A2B1A · coral #E86A4F · soft #F5EBD6

     The source names three neutrals where the theme uses four, and ships no
     greys at all. Rather than collapse two surface roles onto one colour —
     which would flatten every section that alternates ground and card — the
     missing steps are derived from the ramp and marked as such below. Each
     one says where it came from, so the next person can tell what the client
     chose from what we worked out.

     Token names are left alone on purpose. `--fr-white` now holds a warm
     ivory and no longer deserves the name, but renaming it would mean
     rewriting four stylesheets for no change in behaviour. */

  /* PALETTE 1 · LOGO, NAVY & MEADOW (trial).
     Only the two logo colours, on clean white grounds; the section tints
     are a wash of meadow and sky, the colours of the photography. The
     beige, peach and mustard of "Human (warm)" are gone.

     `--fr-lime` keeps its name but is now the light accent green: the
     highlight, eyebrow and button fill on dark grounds (7.2:1 with navy,
     9.3:1 with ink). On light grounds the call to action is the deep
     green, see `.fr-btn--accent`. */
  --fr-navy:   #003366;
  --fr-green:  #669933;
  --fr-lime:   #A8D16A;

  /* The brand green is 3.4:1 on white: fine for fills, icons and display
     type, short of AA for text. The deep green clears 5.4:1 on every light
     ground and carries white at 6.4:1, so it is the text green, the fill of
     any green surface with copy on it and the call to action. */
  --fr-green-deep: #3F6A1C;

  /* The dark is green-black, not blue-black. */
  --fr-ink:    #13241A;

  /* Surfaces, lightest to deepest: white, then neutrals with a breath of
     green. The names are kept from the earlier palette so no rule changes. */
  --fr-white:  #FFFFFF;
  --fr-paper:  #F9FAF7;
  --fr-card:   #F4F6F1;
  --fr-cream:  #E9EEE4;

  /* Section tints: meadow (`sand`) and sky (`sage`). */
  --fr-sand:   #EBF2E1;
  --fr-sage:   #E6EFF6;

  /* Text & lines: a blue-slate text, so body copy belongs to the navy. */
  --fr-gray-700: #2A3744;
  --fr-gray-500: #56616B;
  --fr-line:     rgba(0, 51, 102, .12);

  /* On-dark text: a barely green white. */
  --fr-on-dark:      #F3F7F0;
  --fr-on-dark-soft: rgba(243, 247, 240, .82);
  --fr-on-dark-mute: rgba(243, 247, 240, .64);
  --fr-on-dark-dim:  rgba(243, 247, 240, .50);

  /* The source spends this on the secondary call to action. Nothing in the
     theme claims it yet; it is declared so the chip tones and the CTAs have
     somewhere to go when they need a colour that is neither lime nor navy. */
  --fr-coral:  #E86A4F;

  /* Typography */
  --fr-font:  'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --fr-label: var(--fr-font); /* the design sets label type in Inter, not a mono */

  /* Layout */
  --fr-maxw: 1320px;
  --fr-gutter: 20px;
  --fr-gap: 16px;

  /* The bar sits in the flow and pushes the hero down, so the hero has
     nothing to clear and the offset is zero. The measured height is still
     worth keeping: main.js writes it back onto <html>, and `scroll-padding`
     needs it so an anchor never lands underneath the sticky bar. */
  --fr-header-h: 115px;
  --fr-phero-offset: 0px;

  /* Radii */
  --fr-r:      24px;
  --fr-r-sm:   16px;
  --fr-r-pill: 999px;

  /* Motion */
  --fr-t: 280ms cubic-bezier(.2, .7, .3, 1);

  /* Stacking */
  --fr-z-header: 200;
  /* Clears the GTranslate float (20px off the corner, 50px tall) and the
     accessibility button beside it. Back to 20px when GTranslate goes. */
  --fr-totop-bottom: 84px;
  --fr-z-drawer: 500;
}

@media (min-width: 768px) {
  :root { --fr-gutter: 32px; }
}

/* --------------------------------------------------------------------------
   2. RESET & BASE
   -------------------------------------------------------------------------- */
*,
*::before,
*::after { box-sizing: border-box; }

html {
  scroll-behavior: smooth;
  /* The fixed header must not hide anchor targets. Measured, not guessed, so
     it follows the bar when the topbar is switched off. */
  scroll-padding-top: calc(var(--fr-header-h) + 16px);
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
}

body {
  margin: 0;
  font-family: var(--fr-font);
  font-size: 16px;
  line-height: 1.55;
  color: var(--fr-ink);
  background: var(--fr-white);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/* The line above has never painted anything, and it took a palette change to
   notice. Two other rules claim the page ground and both outrank it: WordPress
   compiles `theme.json` into `body { background-color: … }` at the same weight
   but later in the document, and Elementor's kit sets `.elementor-kit-750 {
   background-color: var(--e-global-color-primary) }` — a class, so heavier
   than any bare `body`, and last in the cascade. The site has been painted by
   Elementor's site settings the whole time.

   `:root body` is the lightest selector that outranks a single class, so the
   theme takes the ground back without an `!important` and without naming the
   kit by id, which would break the day somebody rebuilds it. When Elementor
   goes, this rule can collapse back into the block above. */
:root body {
  background-color: var(--fr-white);
}

body.fr-is-locked { overflow: hidden; }

/* The footer sits at the bottom of the window on a short page (an empty
   account tab, a login form) instead of rising into its middle. Every
   template wraps its content in <main id="main">, which takes the slack;
   the drawers and widgets are fixed and stay out of the flow. */
body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  min-height: 100dvh;
}

body > #main { flex: 1 0 auto; }

h1, h2, h3, h4, h5, h6 {
  margin: 0;
  font-weight: 800;
  line-height: 1;
  letter-spacing: -.03em;
}

p, ul, ol, figure, blockquote, pre { margin: 0; }

a {
  color: var(--fr-navy);
  text-decoration: none;
  transition: color var(--fr-t);
}

a:hover { color: var(--fr-green-deep); }

img, svg, video, iframe {
  display: block;
  max-width: 100%;
}

img { height: auto; }

button, input, select, textarea {
  font: inherit;
  color: inherit;
}

:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 3px solid var(--fr-navy);
  outline-offset: 2px;
  border-radius: 4px;
}

/* Navy is the ring on the light grounds; on the dark and green ones it
   would vanish, so there the ring turns lime or cream. */
:where(.fr-topbar, .fr-footer, .fr-drawer, .fr-search-panel, .fr-phero, .fr-panel--navy, .fr-panel--ink,
  .fr-storie--ink, .fr-ctaband, .fr-statement, .fr-proto, .fr-numeri-band, .fr-partner--dark,
  .fr-gov__g--a, .fr-hubcard--dark, .fr-ecard--navy, .fr-gallery-band--ink)
  :where(a, button, input, select, textarea, summary, [tabindex]):focus-visible { outline-color: var(--fr-lime); }

:where(.fr-news, .fr-panel--green, .fr-gov__g--b)
  :where(a, button, input, select, textarea, summary, [tabindex]):focus-visible { outline-color: var(--fr-white); }

/* --------------------------------------------------------------------------
   3. LAYOUT PRIMITIVES
   -------------------------------------------------------------------------- */
.fr-wrap {
  max-width: var(--fr-maxw);
  margin-inline: auto;
  padding-inline: var(--fr-gutter);
}

.fr-section { padding-block: 34px; }
.fr-section--flush { padding-block: 0; }

.fr-tile {
  position: relative;
  border-radius: var(--fr-r);
  overflow: hidden;
}

/* Section header: title on the left, secondary action on the right. */
.fr-sec-head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 24px;
  flex-wrap: wrap;
  margin-bottom: 22px;
  padding-inline: 4px;
}

.fr-sec-head h2 {
  font-size: clamp(30px, 4vw, 52px);
  color: var(--fr-navy);
}

.fr-sec-head h2 .fr-hl { color: var(--fr-green); }

.fr-sec-head__sub {
  max-width: 640px;
  margin-top: 12px;
  font-size: clamp(17px, 1.6vw, 20px);
  line-height: 1.45;
  color: var(--fr-gray-700);
}

.fr-eyebrow {
  font-family: var(--fr-label);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--fr-green-deep);
}

.fr-sec-head .fr-eyebrow { margin-bottom: 12px; }

/* --------------------------------------------------------------------------
   4. BUTTONS
   -------------------------------------------------------------------------- */
/* Elementor writes its Site Settings > Buttons style as
   `.elementor-kit-750 button, … input[type="submit"], … .elementor-button`,
   and that stylesheet is enqueued after the theme's. A bare `.fr-btn` is one
   class — specificity (0,1,0) — while `.elementor-kit-750 button` is a class
   plus an element, (0,1,1), so Elementor was repainting every <button> the
   theme owns: orange fill, black 1px border, 8px radius, 12px/24px padding,
   its own font. Every selector below therefore names its class twice, which
   reads oddly but is deliberate: it lifts the rule to (0,2,0) and wins on
   specificity instead of on load order, so it survives a change of enqueue
   order or of the kit id. The same is true of `font-family`: the global reset
   `button { font: inherit }` is only (0,0,1) and lost the same argument. */
.fr-btn.fr-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 15px 26px;
  border: 1.5px solid transparent;
  border-radius: var(--fr-r-pill);
  font-family: var(--fr-font);
  font-size: 14px;
  font-weight: 700;
  letter-spacing: .02em;
  line-height: 1.2;
  cursor: pointer;
  transition: var(--fr-t);
}

.fr-btn--accent.fr-btn--accent { background: var(--fr-green-deep); color: var(--fr-white); }

/* On the dark grounds the deep green would sink: the light green takes over. */
:where(.fr-topbar, .fr-footer, .fr-drawer, .fr-search-panel, .fr-phero, .fr-hero, .fr-panel--navy, .fr-panel--ink,
  .fr-storie--ink, .fr-ctaband, .fr-statement, .fr-proto, .fr-numeri-band, .fr-partner--dark,
  .fr-gov__g--a, .fr-hubcard--dark, .fr-ecard--navy, .fr-gallery-band--ink, .fr-news, .fr-panel--green)
  .fr-btn--accent.fr-btn--accent { background: var(--fr-lime); color: var(--fr-ink); }
.fr-btn--accent.fr-btn--accent:hover { background: var(--fr-navy); color: var(--fr-white); transform: translateY(-2px); }

.fr-btn--dark.fr-btn--dark { background: var(--fr-ink); color: var(--fr-paper); }
.fr-btn--dark.fr-btn--dark:hover { background: var(--fr-green-deep); color: var(--fr-white); transform: translateY(-2px); }

.fr-btn--ghost.fr-btn--ghost { background: transparent; border-color: var(--fr-navy); color: var(--fr-navy); }
.fr-btn--ghost.fr-btn--ghost:hover { background: var(--fr-navy); color: var(--fr-white); }

.fr-btn--ghost-light.fr-btn--ghost-light {
  background: rgba(250, 248, 241, .14);
  border-color: rgba(250, 248, 241, .45);
  color: var(--fr-white);
}
.fr-btn--ghost-light.fr-btn--ghost-light:hover { background: var(--fr-white); color: var(--fr-navy); }

.fr-btn--green.fr-btn--green { background: var(--fr-green-deep); color: var(--fr-white); }
.fr-btn--green.fr-btn--green:hover { background: var(--fr-navy); color: var(--fr-white); transform: translateY(-2px); }

/* Editors can pair any button with any panel tone: the outline styles
   follow the ground so that none of the pairs goes invisible. */
.fr-panel--navy .fr-btn--ghost.fr-btn--ghost,
.fr-panel--ink .fr-btn--ghost.fr-btn--ghost { border-color: currentColor; color: var(--fr-on-dark); }
.fr-panel--navy .fr-btn--ghost.fr-btn--ghost:hover,
.fr-panel--ink .fr-btn--ghost.fr-btn--ghost:hover { background: var(--fr-white); color: var(--fr-navy); }
.fr-panel--cream .fr-btn--ghost-light.fr-btn--ghost-light { background: transparent; border-color: var(--fr-navy); color: var(--fr-navy); }
.fr-panel--cream .fr-btn--ghost-light.fr-btn--ghost-light:hover { background: var(--fr-navy); color: var(--fr-white); }
.fr-panel--green .fr-btn--green.fr-btn--green,
.fr-news .fr-btn--green.fr-btn--green { background: var(--fr-navy); }
.fr-panel--green .fr-btn--dark.fr-btn--dark:hover,
.fr-news .fr-btn--dark.fr-btn--dark:hover { background: var(--fr-navy); }

@media (prefers-reduced-motion: reduce) {
  .fr-btn.fr-btn:hover { transform: none; }
}

/* --------------------------------------------------------------------------
   5. SCROLL REVEAL
   Elements start hidden only once JS confirms it can reveal them, so the page
   stays readable with JS disabled (see `.fr-reveal` opt-in class in main.js).
   -------------------------------------------------------------------------- */
.fr-js .fr-reveal {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity .6s ease-out, transform .6s ease-out;
}

.fr-js .fr-reveal.is-in {
  opacity: 1;
  transform: none;
}

@media (prefers-reduced-motion: reduce) {
  .fr-js .fr-reveal { opacity: 1; transform: none; transition: none; }
}

/* --------------------------------------------------------------------------
   6. HEADER
   -------------------------------------------------------------------------- */
/* One bar, one behaviour, on every page: a solid navy chrome that sits in
   the flow and stays there.

   It used to float transparent over the hero and swap to a white ground on
   scroll. Both halves were wrong. Over a photograph the topbar and the logo
   were unreadable on anything but a dark frame, and the white bar that came
   back on scroll belonged to no other surface in the design. One opaque bar
   costs the top 115px of the hero photograph and buys legibility that does
   not depend on what the art director chose that week. */
.fr-header {
  position: sticky;
  inset-inline: 0;
  top: 0;
  z-index: var(--fr-z-header);
}

/* main.js still marks the bar once the hero has scrolled past. Nothing about
   the colours depends on it any more; it only lifts the bar off the page. */
.fr-header.is-stuck { box-shadow: 0 10px 30px rgba(0, 20, 40, .22); }

/* Only the thin top bar keeps the navy, as an accent; the main bar is
   cream so the chrome does not weigh on the page. The solid fallback is
   there for a browser without `color-mix()`. */
.fr-topbar {
  background: #002B56;
  background: color-mix(in srgb, var(--fr-navy) 84%, #000);
  color: var(--fr-on-dark-soft);
}

.fr-topbar__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding-block: 9px;
  font-size: 12.5px;
  font-weight: 500;
}

.fr-topbar__left { display: flex; gap: 22px; color: var(--fr-on-dark-mute); }

/* The address is a mailto, so it was taking the document's link colour —
   ink, on navy. It belongs to the line it sits in. */
.fr-topbar__left a { color: inherit; }
.fr-topbar__left a:hover { color: var(--fr-on-dark); }
.fr-topbar__right { display: flex; align-items: center; gap: 18px; }

.fr-topbar__right a { color: var(--fr-on-dark-soft); font-weight: 600; }
.fr-topbar__right a:hover { color: var(--fr-lime); }
.fr-topbar__right a.is-accent { color: var(--fr-lime); font-weight: 700; }

@media (max-width: 760px) {
  .fr-topbar__left span:last-child { display: none; }
}

.fr-mainbar {
  background: var(--fr-white);
  border-bottom: 1px solid var(--fr-line);
}

.fr-nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding-block: 14px;
}

.fr-logo {
  display: block;
  color: var(--fr-navy);
  flex: 0 0 auto;
}

.fr-logo svg,
.fr-logo img {
  height: 30px;
  width: auto;
}

.fr-nav__links { display: none; gap: 4px; }

@media (min-width: 1024px) {
  .fr-nav__links { display: flex; }
}

.fr-nav__links ul {
  display: flex;
  gap: 4px;
  list-style: none;
  margin: 0;
  padding: 0;
}

.fr-nav__links a {
  display: block;
  padding: 9px 14px;
  border-radius: 8px;
  font-size: 14px;
  font-weight: 600;
  color: var(--fr-navy);
  transition: var(--fr-t);
}

.fr-nav__links a:hover,
.fr-nav__links .current-menu-item > a,
.fr-nav__links .current-menu-ancestor > a {
  background: var(--fr-cream);
  color: var(--fr-navy);
}

.fr-nav__right {
  display: flex;
  align-items: center;
  gap: 14px;
}

@media (max-width: 599px) {
  .fr-nav__right .fr-btn { display: none; }
}

/* Cart pill — only rendered when WooCommerce is active. */
.fr-cart {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 9px 14px;
  border-radius: var(--fr-r-pill);
  font-size: 13px;
  font-weight: 700;
  color: var(--fr-navy);
  background: var(--fr-card);
}

.fr-cart:hover { background: var(--fr-cream); color: var(--fr-navy); }
.fr-cart svg { width: 18px; height: 18px; }
.fr-cart__count { font-variant-numeric: tabular-nums; }

/* Hamburger */
/* Named twice on purpose — see the note above `.fr-btn`. The Elementor kit
   paints every bare `<button>` at (0,1,1) from a stylesheet enqueued after
   this one, and these three are buttons. */
.fr-burger.fr-burger {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  padding: 0;
  font-family: var(--fr-font);
  border: 1.5px solid rgba(0, 51, 102, .3);
  border-radius: 12px;
  background: transparent;
  cursor: pointer;
  color: var(--fr-navy);
}

.fr-burger.fr-burger:hover { background: var(--fr-cream); color: var(--fr-navy); }

@media (min-width: 1024px) {
  /* Doubled like the rule above it: the base is now (0,2,0) and a single
     class here would no longer win, media query or not. */
  .fr-burger.fr-burger { display: none; }
}

.fr-burger__bars,
.fr-burger__bars::before,
.fr-burger__bars::after {
  display: block;
  width: 18px;
  height: 2px;
  background: currentColor;
  border-radius: 2px;
  transition: transform var(--fr-t), opacity var(--fr-t);
}

.fr-burger__bars::before,
.fr-burger__bars::after {
  content: "";
  position: absolute;
}

.fr-burger__bars { position: relative; }
.fr-burger__bars::before { transform: translateY(-6px); }
.fr-burger__bars::after  { transform: translateY(6px); }

.fr-burger[aria-expanded="true"] .fr-burger__bars { background: transparent; }
.fr-burger[aria-expanded="true"] .fr-burger__bars::before { transform: rotate(45deg); }
.fr-burger[aria-expanded="true"] .fr-burger__bars::after  { transform: rotate(-45deg); }

/* --------------------------------------------------------------------------
   7. MOBILE DRAWER
   Not present in the design canvas (below 1024px it simply hides the nav);
   added here because a site cannot ship without mobile navigation.
   -------------------------------------------------------------------------- */
.fr-drawer {
  position: fixed;
  inset: 0;
  z-index: var(--fr-z-drawer);
  display: grid;
  grid-template-columns: 1fr min(380px, 88vw);
  visibility: hidden;
}

.fr-drawer[aria-hidden="false"] { visibility: visible; }

.fr-drawer__scrim.fr-drawer__scrim {
  background: rgba(10, 18, 32, .55);
  opacity: 0;
  transition: opacity var(--fr-t);
  border: 0;
  padding: 0;
  cursor: pointer;
}

.fr-drawer[aria-hidden="false"] .fr-drawer__scrim { opacity: 1; }

.fr-drawer__panel {
  background: var(--fr-ink);
  color: var(--fr-on-dark-soft);
  padding: 24px 28px 40px;
  overflow-y: auto;
  overscroll-behavior: contain;
  transform: translateX(100%);
  transition: transform var(--fr-t);
}

.fr-drawer[aria-hidden="false"] .fr-drawer__panel { transform: none; }

@media (prefers-reduced-motion: reduce) {
  .fr-drawer__panel,
  .fr-drawer__scrim.fr-drawer__scrim { transition: none; }
}

.fr-drawer__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-bottom: 28px;
}

.fr-drawer__head .fr-logo { color: var(--fr-paper); }

.fr-drawer__close.fr-drawer__close {
  width: 44px;
  height: 44px;
  border: 1.5px solid rgba(250, 248, 241, .3);
  border-radius: 12px;
  background: transparent;
  color: var(--fr-paper);
  font-family: var(--fr-font);
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
}

.fr-drawer__close.fr-drawer__close:hover { background: var(--fr-green); border-color: transparent; }

.fr-drawer ul {
  list-style: none;
  margin: 0 0 28px;
  padding: 0;
}

.fr-drawer li + li { border-top: 1px solid rgba(250, 248, 241, .1); }

.fr-drawer li a {
  display: block;
  padding: 15px 0;
  font-size: 20px;
  font-weight: 700;
  letter-spacing: -.02em;
  color: var(--fr-paper);
}

.fr-drawer li a:hover { color: var(--fr-lime); }

.fr-drawer__actions {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.fr-drawer__meta {
  margin-top: 28px;
  font-size: 13px;
  color: var(--fr-on-dark-dim);
}

/* --------------------------------------------------------------------------
   7b. MINI-CART DRAWER
   Same mechanics as the menu drawer (scrim + sliding panel, aria-hidden as
   the switch) but on a light ground: it holds prices and forms, not links.
   Its own component, because `.fr-drawer ul / li a` above would restyle the
   cart lines.
   -------------------------------------------------------------------------- */
.fr-minicart {
  position: fixed;
  inset: 0;
  z-index: var(--fr-z-drawer);
  display: grid;
  grid-template-columns: 1fr min(420px, 92vw);
  visibility: hidden;
}

.fr-minicart[aria-hidden="false"] { visibility: visible; }

.fr-minicart__scrim.fr-minicart__scrim {
  background: rgba(10, 18, 32, .55);
  opacity: 0;
  transition: opacity var(--fr-t);
  border: 0;
  padding: 0;
  cursor: pointer;
}

.fr-minicart[aria-hidden="false"] .fr-minicart__scrim { opacity: 1; }

.fr-minicart__panel {
  display: flex;
  flex-direction: column;
  min-height: 0;
  background: var(--fr-paper);
  color: var(--fr-ink);
  transform: translateX(100%);
  transition: transform var(--fr-t);
}

.fr-minicart[aria-hidden="false"] .fr-minicart__panel { transform: none; }

@media (prefers-reduced-motion: reduce) {
  .fr-minicart__panel,
  .fr-minicart__scrim.fr-minicart__scrim { transition: none; }
}

.fr-minicart__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 20px 24px;
  border-bottom: 1px solid var(--fr-line);
}

.fr-minicart__title.fr-minicart__title {
  margin: 0;
  font-size: 22px;
  font-weight: 800;
  letter-spacing: -.02em;
  color: var(--fr-navy);
}

.fr-minicart__close.fr-minicart__close {
  width: 44px;
  height: 44px;
  border: 1.5px solid var(--fr-line);
  border-radius: 12px;
  background: transparent;
  color: var(--fr-navy);
  font-family: var(--fr-font);
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
}

.fr-minicart__close.fr-minicart__close:hover { background: var(--fr-navy); border-color: transparent; color: var(--fr-white); }

.fr-minicart__notice { padding: 12px 24px 0; }
.fr-minicart__notice[hidden] { display: none; }

.fr-minicart__notice .woocommerce-error,
.fr-cart-errors .woocommerce-error {
  margin: 0;
  padding: 12px 16px;
  list-style: none;
  border-radius: var(--fr-r-sm);
  background: #FBE3DC;
  color: #7A1F0E;
  font-size: 14px;
  line-height: 1.45;
}

.fr-minicart__notice .woocommerce-error::before,
.fr-cart-errors .woocommerce-error::before { content: none; }

.fr-cart-errors { margin-bottom: 16px; }
.fr-cart-errors[hidden] { display: none; }

.fr-minicart__body {
  display: flex;
  flex: 1;
  flex-direction: column;
  min-height: 0;
}

.fr-minicart__list.fr-minicart__list {
  flex: 1;
  margin: 0;
  padding: 8px 24px;
  list-style: none;
  overflow-y: auto;
  overscroll-behavior: contain;
}

.fr-minicart__item {
  position: relative;
  display: grid;
  grid-template-columns: 72px 1fr;
  gap: 14px;
  padding: 16px 32px 16px 0;
  transition: opacity var(--fr-t);
}

.fr-minicart__item + .fr-minicart__item { border-top: 1px solid var(--fr-line); }
.fr-minicart__item[aria-busy="true"] { opacity: .5; pointer-events: none; }

.fr-minicart__thumb img {
  display: block;
  width: 72px;
  height: 72px;
  object-fit: cover;
  border-radius: var(--fr-r-sm);
  background: var(--fr-card);
}

.fr-minicart__name.fr-minicart__name {
  margin: 0 0 4px;
  font-size: 15px;
  font-weight: 700;
  line-height: 1.3;
}

.fr-minicart__name a { color: var(--fr-navy); }
.fr-minicart__name a:hover { color: var(--fr-green-deep); }

.fr-minicart__info dl.variation {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 2px 6px;
  margin: 0 0 8px;
  font-size: 13px;
  color: var(--fr-gray-700);
}

.fr-minicart__info dl.variation dt,
.fr-minicart__info dl.variation dd,
.fr-minicart__info dl.variation p { margin: 0; }

.fr-minicart__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-top: 8px;
}

.fr-minicart__qty {
  display: inline-flex;
  align-items: center;
  border: 1.5px solid var(--fr-line);
  border-radius: var(--fr-r-pill);
}

.fr-minicart__step.fr-minicart__step {
  width: 34px;
  height: 34px;
  padding: 0;
  border: 0;
  border-radius: var(--fr-r-pill);
  background: transparent;
  color: var(--fr-navy);
  font-family: var(--fr-font);
  font-size: 18px;
  line-height: 1;
  cursor: pointer;
}

.fr-minicart__step.fr-minicart__step:hover:not(:disabled) { background: var(--fr-cream); }
.fr-minicart__step.fr-minicart__step:disabled { opacity: .35; cursor: not-allowed; }

.fr-minicart__value {
  min-width: 24px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  text-align: center;
}

.fr-minicart__count { font-size: 13px; color: var(--fr-gray-700); }

.fr-minicart__price {
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--fr-navy);
}

.fr-minicart__remove.fr-minicart__remove {
  position: absolute;
  top: 12px;
  right: 0;
  width: 28px;
  height: 28px;
  padding: 0;
  border: 0;
  border-radius: var(--fr-r-pill);
  background: transparent;
  color: var(--fr-gray-500);
  font-family: var(--fr-font);
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
}

.fr-minicart__remove.fr-minicart__remove:hover { background: var(--fr-cream); color: var(--fr-ink); }

.fr-minicart__foot {
  padding: 18px 24px 24px;
  border-top: 1px solid var(--fr-line);
  background: var(--fr-white);
}

.fr-minicart__subtotal {
  display: flex;
  justify-content: space-between;
  margin: 0;
  font-size: 17px;
  font-weight: 800;
  color: var(--fr-navy);
}

.fr-minicart__note {
  margin: 4px 0 16px;
  font-size: 13px;
  color: var(--fr-gray-700);
}

.fr-minicart__actions {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.fr-minicart__actions .fr-btn,
.fr-minicart__empty .fr-btn { justify-content: center; }

.fr-minicart__empty {
  display: flex;
  flex: 1;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 16px;
  padding: 40px 24px;
  text-align: center;
  color: var(--fr-gray-700);
}

.fr-minicart__empty p { margin: 0; }

/* Floating widgets sit above any drawer (GTranslate ships z-index 999999) and
   cover its buttons: step them aside while a drawer holds the page. */
.fr-is-locked #gt_float_wrapper,
.fr-is-locked .fr-totop { visibility: hidden; }

/* The cart page updates itself (assets/js/cart.js): the button is redundant. */
.fr-cart-live .woocommerce-cart-form [name="update_cart"] { display: none; }

/* --------------------------------------------------------------------------
   8. FOOTER
   -------------------------------------------------------------------------- */
/* Full bleed: the dark ground runs edge to edge while the content inside stays
   on the site's container, so the footer lines up with every section above it
   instead of floating as a card with air around it. */
.fr-footer {
  background: var(--fr-ink);
  color: var(--fr-on-dark-soft);
}

.fr-footer__card {
  /* The ground moved up to .fr-footer; the card is only the inner spacing now. */
  background: none;
  border-radius: 0;
  padding: 56px 0 36px;
}

@media (max-width: 599px) {
  .fr-footer__card { padding: 40px 0 28px; }
}

.fr-footer__grid {
  display: grid;
  /* Two link columns on a phone, but a 36px gap between them left 133px tracks
     inside a 302px card, so the row gap and the column gap are set apart. */
  grid-template-columns: repeat(2, 1fr);
  gap: 36px 24px;
}

@media (min-width: 700px) { .fr-footer__grid { grid-template-columns: repeat(3, 1fr); gap: 36px; } }
@media (min-width: 1024px) { .fr-footer__grid { grid-template-columns: 1.5fr repeat(4, 1fr); } }

.fr-footer__brand {
  color: var(--fr-paper);
  /* The tagline is a sentence, not a link list: in a 133px track it wrapped
     every two or three words. It takes the whole row until the layout is wide
     enough to give it a track of its own. */
  grid-column: 1 / -1;
}

@media (min-width: 1024px) { .fr-footer__brand { grid-column: auto; } }

.fr-footer__brand p {
  margin-top: 16px;
  max-width: 260px;
  font-size: 13px;
  line-height: 1.6;
  color: var(--fr-on-dark-dim);
}

.fr-footer__col h2 {
  margin-bottom: 16px;
  font-family: var(--fr-label);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--fr-lime);
}

.fr-footer__col ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

.fr-footer__col a {
  display: block;
  margin-bottom: 10px;
  font-size: 14px;
  color: var(--fr-on-dark-soft);
}

.fr-footer__col a:hover { color: var(--fr-white); }

.fr-subfoot {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 12px;
  margin-top: 48px;
  padding-top: 22px;
  border-top: 1px solid rgba(250, 248, 241, .12);
  font-family: var(--fr-label);
  font-size: 11px;
  letter-spacing: .04em;
  color: var(--fr-on-dark-dim);
}

.fr-subfoot a { color: inherit; }
.fr-subfoot a:hover { color: var(--fr-white); }

/* --------------------------------------------------------------------------
   9. WORDPRESS CORE CLASSES
   -------------------------------------------------------------------------- */
.screen-reader-text {
  position: absolute !important;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.fr-skip-link {
  position: absolute;
  left: -9999px;
  z-index: 999;
  padding: 12px 20px;
  background: var(--fr-lime);
  color: var(--fr-navy);
  font-weight: 700;
  border-radius: 0 0 var(--fr-r-sm) 0;
}

.fr-skip-link:focus {
  left: 0;
  top: 0;
}

.alignleft  { float: left; margin: 0 24px 24px 0; }
.alignright { float: right; margin: 0 0 24px 24px; }
.aligncenter { margin-inline: auto; }

.wp-caption-text,
.wp-element-caption {
  margin-top: 8px;
  font-size: 13px;
  color: var(--fr-gray-700);
}

/* Editorial content: the only place where a comfortable measure applies. */
.fr-entry {
  max-width: 720px;
  margin-inline: auto;
}

.fr-entry > * + * { margin-top: 24px; }

.fr-entry h2 { font-size: clamp(26px, 3vw, 38px); color: var(--fr-navy); margin-top: 48px; }
.fr-entry h3 { font-size: clamp(21px, 2.4vw, 27px); color: var(--fr-navy); margin-top: 36px; }
.fr-entry h4 { font-size: 19px; color: var(--fr-navy); margin-top: 28px; }

.fr-entry p,
.fr-entry li { font-size: 17px; line-height: 1.7; color: var(--fr-gray-700); }

.fr-entry ul,
.fr-entry ol { padding-left: 22px; }
.fr-entry li + li { margin-top: 8px; }

.fr-entry a { text-decoration: underline; text-underline-offset: 3px; }

.fr-entry blockquote {
  padding: 24px 28px;
  border-left: 3px solid var(--fr-lime);
  background: var(--fr-card);
  border-radius: 0 var(--fr-r-sm) var(--fr-r-sm) 0;
}

.fr-entry blockquote p { font-size: 19px; color: var(--fr-ink); }

.fr-entry img,
.fr-entry .wp-block-image { border-radius: var(--fr-r-sm); overflow: hidden; }

.fr-entry .alignwide {
  max-width: min(1080px, 100vw - (var(--fr-gutter) * 2));
  margin-inline: calc(50% - min(540px, 50vw - var(--fr-gutter)));
}

/* Post/archive cards reuse the event-card language from the home. */
.fr-card-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--fr-gap);
}

@media (min-width: 640px) { .fr-card-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .fr-card-grid { grid-template-columns: repeat(3, 1fr); } }

.fr-card {
  display: flex;
  flex-direction: column;
  background: var(--fr-card);
  border: 1px solid var(--fr-line);
  border-radius: var(--fr-r);
  overflow: hidden;
  transition: var(--fr-t);
}

.fr-card:hover { transform: translateY(-4px); }

.fr-card__ph {
  position: relative;
  aspect-ratio: 16 / 10;
  background: var(--fr-cream);
}

.fr-card__ph img { width: 100%; height: 100%; object-fit: cover; }

.fr-card__body {
  display: flex;
  flex-direction: column;
  flex: 1;
  padding: 24px;
}

.fr-card__meta {
  font-family: var(--fr-label);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--fr-green-deep);
}

.fr-card h2,
.fr-card h3 {
  margin-top: 10px;
  font-size: 21px;
  line-height: 1.25;
  letter-spacing: -.01em;
  color: var(--fr-navy);
}

.fr-card p {
  margin-top: 12px;
  font-size: 14px;
  line-height: 1.55;
  color: var(--fr-gray-700);
}

.fr-card__go {
  margin-top: auto;
  padding-top: 18px;
  font-size: 14px;
  font-weight: 700;
  color: var(--fr-navy);
}

/* Pagination */
.fr-pagination {
  display: flex;
  justify-content: center;
  gap: 8px;
  margin-top: 40px;
}

.fr-pagination .page-numbers {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  height: 44px;
  padding-inline: 12px;
  border: 1px solid var(--fr-line);
  border-radius: var(--fr-r-pill);
  font-size: 14px;
  font-weight: 700;
  color: var(--fr-navy);
}

.fr-pagination .page-numbers:hover,
.fr-pagination .page-numbers.current {
  background: var(--fr-navy);
  border-color: var(--fr-navy);
  color: var(--fr-white);
}

/* Search form */
.fr-searchform {
  display: flex;
  gap: 10px;
  max-width: 520px;
}

.fr-searchform input[type="search"] {
  flex: 1;
  min-width: 0;
  height: 52px;
  padding-inline: 20px;
  border: 1px solid var(--fr-line);
  border-radius: var(--fr-r-pill);
  background: var(--fr-white);
  font-size: 15px;
}

/* --------------------------------------------------------------------------
   10. WOOCOMMERCE BASELINE
   Only the design-system bridge: type, colours, buttons and notices. Shop,
   product and cart layouts follow when their design canvases are implemented.
   -------------------------------------------------------------------------- */
.woocommerce .fr-phero { margin-bottom: 34px; }

.woocommerce-products-header__title,
.woocommerce div.product .product_title {
  font-size: clamp(30px, 4vw, 52px);
  color: var(--fr-navy);
}

.woocommerce ul.products li.product .woocommerce-loop-product__title {
  font-size: 20px;
  font-weight: 800;
  letter-spacing: -.02em;
  color: var(--fr-navy);
}

.woocommerce span.onsale,
.woocommerce ul.products li.product .onsale {
  background: var(--fr-lime);
  color: var(--fr-navy);
  font-family: var(--fr-label);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  border-radius: var(--fr-r-pill);
  padding: 5px 12px;
  min-height: 0;
  min-width: 0;
  line-height: 1.4;
}

.woocommerce #respond input#submit,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.woocommerce a.button.alt,
.woocommerce button.button.alt,
.woocommerce input.button.alt,
.woocommerce #respond input#submit.alt {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 15px 26px;
  border: 1.5px solid transparent;
  border-radius: var(--fr-r-pill);
  background: var(--fr-lime);
  color: var(--fr-navy);
  font-size: 14px;
  font-weight: 700;
  letter-spacing: .02em;
  line-height: 1.2;
  transition: var(--fr-t);
}

.woocommerce #respond input#submit:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.woocommerce a.button.alt:hover,
.woocommerce button.button.alt:hover,
.woocommerce input.button.alt:hover {
  background: var(--fr-navy);
  color: var(--fr-white);
}

.woocommerce .woocommerce-message,
.woocommerce .woocommerce-info,
.woocommerce .woocommerce-error {
  border-top-color: var(--fr-green);
  background: var(--fr-card);
  border-radius: var(--fr-r-sm);
  font-size: 15px;
}

.woocommerce .woocommerce-error { border-top-color: #C0392B; }

/* WooCommerce renders its notices as a <ul>, and on the pages where they appear
   inside .fr-entry the prose rule `.fr-entry ul { padding-left: 22px }` outranks
   WooCommerce's own padding. That left no room for the icon, which is absolutely
   positioned at 1.5em and so landed on the first letter of the message. */
.fr-entry .woocommerce-error,
.fr-entry .woocommerce-info,
.fr-entry .woocommerce-message {
  padding-left: 3.5em;
}

/* The theme took over the notice border colour but left WooCommerce's own blue
   and green on the icon, which is the one part of a notice that carries colour. */
.woocommerce .woocommerce-info::before,
.woocommerce .woocommerce-message::before { color: var(--fr-green-deep); }

.woocommerce .woocommerce-error::before { color: #C0392B; }

.woocommerce .woocommerce-message .button,
.woocommerce .woocommerce-info .button { background: var(--fr-navy); color: var(--fr-white); }

.woocommerce div.product p.price,
.woocommerce div.product span.price,
.woocommerce ul.products li.product .price {
  color: var(--fr-navy);
  font-weight: 800;
}

.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce form .form-row select,
.woocommerce-page form .form-row input.input-text {
  min-height: 48px;
  padding: 12px 16px;
  border: 1px solid var(--fr-line);
  border-radius: var(--fr-r-sm);
  background: var(--fr-white);
  font-size: 15px;
}

/* Breadcrumb — markup emitted by inc/woocommerce.php. */
.fr-breadcrumb {
  margin-bottom: 22px;
  font-family: var(--fr-label);
  font-size: 12px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--fr-gray-500);
}

.fr-breadcrumb a { color: var(--fr-navy); font-weight: 600; }
.fr-breadcrumb a:hover { color: var(--fr-green-deep); }
.fr-crumb-sep { color: var(--fr-gray-500); }

/* Comments */
.fr-comments {
  max-width: 720px;
  margin-inline: auto;
}

.fr-comments h2 {
  font-size: clamp(21px, 2.4vw, 27px);
  color: var(--fr-navy);
  margin-bottom: 24px;
}

.fr-comments__list {
  list-style: none;
  margin: 0 0 40px;
  padding: 0;
}

.fr-comments__list .comment-body {
  padding: 24px;
  border: 1px solid var(--fr-line);
  border-radius: var(--fr-r-sm);
  background: var(--fr-card);
  margin-bottom: 16px;
}

.fr-comments input[type="text"],
.fr-comments input[type="email"],
.fr-comments input[type="url"],
.fr-comments textarea {
  width: 100%;
  padding: 12px 16px;
  border: 1px solid var(--fr-line);
  border-radius: var(--fr-r-sm);
  background: var(--fr-white);
  font-size: 15px;
}

.fr-comments textarea { border-radius: var(--fr-r-sm); }


/* --------------------------------------------------------------------------
   LOGO WALL
   Shared by the homepage partner section and the event partner panel.
   -------------------------------------------------------------------------- */
.fr-logowall {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--fr-gap);
}

@media (min-width: 700px) { .fr-logowall { grid-template-columns: repeat(4, 1fr); } }
@media (min-width: 1024px) { .fr-logowall { grid-template-columns: repeat(6, 1fr); } }

.fr-logowall__cell {
  display: flex;
  align-items: center;
  justify-content: center;
  aspect-ratio: 3 / 2;
  padding: 18px;
  border-radius: var(--fr-r-sm);
  background: var(--fr-paper);
  transition: var(--fr-t);
}

.fr-logowall__cell:hover { background: var(--fr-cream); }

.fr-logowall__cell img {
  max-height: 42px;
  max-width: 100%;
  width: auto;
  object-fit: contain;
  filter: grayscale(1);
  opacity: .6;
  transition: var(--fr-t);
}

.fr-logowall__cell:hover img { filter: none; opacity: 1; }

.fr-logowall__cell span {
  font-size: 16px;
  font-weight: 800;
  color: var(--fr-gray-500);
  transition: var(--fr-t);
}

.fr-logowall__cell:hover span { color: var(--fr-navy); }

/* --------------------------------------------------------------------------
   6b. HEADER — language switch and search disclosure
   -------------------------------------------------------------------------- */
/* The language switch moves out of the topbar and next to the search, where
   the wireframes put it. */
.fr-nav__lang {
  display: none;
  padding: 7px 12px;
  border: 1.5px solid rgba(0, 51, 102, .3);
  border-radius: var(--fr-r-pill);
  font-family: var(--fr-label);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--fr-navy);
  transition: var(--fr-t);
}

@media (min-width: 1024px) {
  .fr-nav__lang { display: inline-block; }
}

.fr-nav__lang:hover { border-color: currentColor; }

/* The switch itself, in the header pill and in the drawer. */
.fr-lang { gap: 6px; align-items: center; }
@media (min-width: 1024px) {
  .fr-nav__lang.fr-lang { display: inline-flex; }
}
.fr-lang__sep { opacity: .5; }
.fr-lang__link { color: inherit; opacity: .7; text-decoration: none; }
.fr-lang__link:hover,
.fr-lang__link[aria-current] { opacity: 1; }

.fr-drawer__lang {
  display: flex;
  margin-top: 22px;
  font-family: var(--fr-label);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .08em;
  color: var(--fr-on-dark);
}

/* Hidden until JS can drive it: without scripts the panel below is simply
   open, so a button here would be a control with nothing to control. */
.fr-nav__search { display: none; }

.fr-js .fr-nav__search {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  padding: 0;
  border: 1.5px solid rgba(0, 51, 102, .3);
  border-radius: var(--fr-r-pill);
  background: transparent;
  color: var(--fr-navy);
  cursor: pointer;
  transition: var(--fr-t);
}

.fr-js .fr-nav__search:hover { border-color: currentColor; }

.fr-search-panel {
  border-bottom: 1px solid rgba(255, 248, 231, .14);
  background: var(--fr-navy);
}

.fr-search-panel input[type="search"] { background: var(--fr-white); }

.fr-search-panel > .fr-wrap { padding-block: 16px; }

.fr-js .fr-search-panel { display: none; }
.fr-js .fr-search-panel.is-open { display: block; }

/* --------------------------------------------------------------------------
   BACK TO TOP

   Navy with a cream arrow, like the bar it takes you back to; the brand
   yellow only on hover, where an accent belongs. Under `.fr-js` it waits
   until main.js says the visitor is two screens down. Without scripts it is
   always there, because a hidden control nobody can reveal is no control.
   -------------------------------------------------------------------------- */
.fr-totop {
  position: fixed;
  right: 20px;
  bottom: var(--fr-totop-bottom);
  z-index: calc(var(--fr-z-header) - 1);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  border: 1.5px solid rgba(255, 248, 231, .22);
  border-radius: 50%;
  background: var(--fr-navy);
  color: var(--fr-on-dark);
  box-shadow: 0 8px 24px rgba(0, 20, 40, .24);
  transition: opacity var(--fr-t), transform var(--fr-t), visibility var(--fr-t), background-color var(--fr-t), color var(--fr-t);
}

/* The theme has one arrow and it points right. */
.fr-totop svg {
  width: 18px;
  height: 18px;
  transform: rotate(-90deg);
}

.fr-totop:hover,
.fr-totop:focus-visible {
  background: var(--fr-lime);
  border-color: transparent;
  color: var(--fr-navy);
}

/* `visibility` as well as opacity, so the hidden button also leaves the
   tab order instead of taking a keyboard user somewhere invisible. */
.fr-js .fr-totop:not(.is-shown) {
  opacity: 0;
  visibility: hidden;
  transform: translateY(12px);
  pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
  .fr-totop { transition: none; }
}

@media print {
  .fr-totop { display: none; }
}
