/* Local-only adaptations layered over the archived site. */
/* The archived site sets overflow-x:hidden on <body> but never on <html>,
 * so elements that intentionally bleed past the viewport (the hero's
 * oversized background <video>, the Instagram marquee's off-screen tiles,
 * horizontally-scrolling card rows, etc.) still let <html> itself scroll
 * horizontally, adding a blank gutter on the right on narrow/mobile
 * viewports. Locking overflow-x on <html> keeps those intentionally
 * oversized elements clipped without touching their own layout. */
html {
  overflow-x: hidden;
}
/*
 * react-reveal recalculates visibility from viewport state after hydration.
 * In the static archive it can reset already-rendered content to opacity: 0
 * on the first scroll. Keep page content visible; interactive UI outside main
 * (menus, overlays, and carousels) retains its original behavior.
 */
main .react-reveal {
  opacity: 1 !important;
  visibility: visible !important;
  animation: none !important;
  transform: none !important;
}
/* Keep each practical-service label and its action stacked as in the archive.
 *
 * The archived component nests the action (a <div class="Services__ButtonWrapper...">
 * or, on the IT snapshot, a <span class="Services__Label...">) INSIDE the
 * label <p class="IButton__Wrapper...">. On the live site this DOM shape is
 * built by React via direct DOM calls, which the HTML parser's "no <div>
 * inside <p>" restriction never applies to, so the label's own default
 * display: block is enough on its own to stack the text above the action:
 * no flex/grid needed here at all. The mirror has no hydration restoring
 * that nesting from its static HTML, so reattachServiceButtons in app.js
 * re-nests the action back inside the label at runtime instead, undoing the
 * parser's auto-close. These two rules match the archived component's own
 * generated CSS once that nesting is back in place. */
[class*="IButton__Wrapper"] {
  display: block;
}
[class*="Services__ButtonWrapper"],
[class*="Services__Label"] {
  margin-top: 10px;
}
/* Styling for the Instagram carousel cards installInstagramFeeds builds in
 * app.js. This fully replaces the rendering the original InstagramFeed
 * React component used to do; that component is gone along with the rest of
 * the Next.js bundle, so nothing competes for these nodes any more.
 *
 * The two InstagramFeed__ImagesWrapper divs the cards are inserted into keep
 * their original generated classes (app.js only ever adds cards inside
 * them, never touches the wrapper's own class), and those classes still carry
 * the archived component's own container styling: row-reverse on the second
 * wrapper, a 20s animation-duration, and their own transform/animation-name.
 * All three fight the replacement below if left in place: row-reverse makes
 * DOM order run right-to-left, which flips the sign of every card-width
 * measurement app.js takes off this element (getBoundingClientRect ends
 * up decreasing left-to-right instead of increasing); the animation
 * shorthand's duration/name apply cascade-first and only .mirror-instagram-
 * left/right's own animation-duration below (a later, more specific rule)
 * wins that particular conflict, but relying on cascade order here rather
 * than removing the source of the conflict is fragile. Reset explicitly. */
[class*="InstagramFeed__ImagesWrapper"] {
  flex-direction: row !important;
  animation: none !important;
  transform: none !important;
}
.mirror-instagram-image {
  display: block;
  width: 198px;
  height: 198px;
  object-fit: cover;
}
/*
 * --mirror-instagram-loop-distance and --mirror-instagram-start-offset are set
 * per ROW from app.js (setInstagramRowLoopDistance / centerInstagramRowOnSeam:
 * row.style.setProperty(...)), once that row's actual card width and post
 * count are known from the DOM. Custom properties inherit down through
 * descendants, so declaring them on [class*="InstagramFeed__ImagesWrapper"]
 * (the row) rather than on .mirror-instagram-left/right (the cards) is
 * deliberate: a property declared directly on an element always wins over an
 * inherited value regardless of selector specificity, so defaults declared on
 * the cards themselves would permanently shadow whatever app.js sets on
 * their row ancestor. That exact mistake shipped once already: every card
 * measured --mirror-instagram-start-offset as 0px no matter what the row's
 * inline style said, so the seam centering silently did nothing, and the loop
 * distance was similarly stuck at the 1700px placeholder instead of the
 * measured value.
 *
 *   - loop distance used to be a fixed 1700px regardless of how many cards
 *     were in the row. With more than a handful of posts that is less than
 *     one lap, so the scroll visibly snapped back to the start before most
 *     cards had been seen. It is now exactly one full set of cards wide, so
 *     the loop's second (duplicated) copy picks up with no seam.
 *   - start offset centers the viewport on the seam between the two most
 *     recent posts (see splitCarouselRows in app.js) as the initial
 *     position, rather than always starting scrolled all the way to one end.
 * The fallback values below (0px offset, 1700px distance) only apply before
 * app.js has measured the row, e.g. with JavaScript disabled; the feed
 * never renders without JavaScript at all, so in practice these are never
 * used for actual layout, only as a safe default for the custom property
 * itself so var() always resolves to something.
 */
.mirror-instagram-left {
  animation: mirrorInstagramLeft 30s linear infinite;
}
.mirror-instagram-right {
  animation: mirrorInstagramRight 30s linear infinite;
}
@keyframes mirrorInstagramLeft {
  from {
    transform: translate(var(--mirror-instagram-start-offset), 0);
  }
  to {
    transform: translate(
      calc(
        var(--mirror-instagram-start-offset) -
          var(--mirror-instagram-loop-distance)
      ),
      0
    );
  }
}
@keyframes mirrorInstagramRight {
  from {
    transform: translate(var(--mirror-instagram-start-offset), 0);
  }
  to {
    transform: translate(
      calc(
        var(--mirror-instagram-start-offset) +
          var(--mirror-instagram-loop-distance)
      ),
      0
    );
  }
}
@media (min-width: 48em) {
  .mirror-instagram-card {
    min-width: 258px;
    width: 258px;
    max-width: 258px;
    height: 258px;
    margin-right: 50px;
  }
  .mirror-instagram-image {
    width: 258px;
    height: 258px;
  }
}
/* Used both before a cookie-consent decision is made (or after an explicit
 * reject) and as a kill switch if contactApi is ever cleared back to '' in
 * app.js. Either way the form stays visible but inert beneath the
 * overlay message, rather than silently doing nothing. */
.mirror-disabled-form {
  position: relative !important;
  min-height: 260px;
}
.mirror-disabled-form > :not(.mirror-form-overlay) {
  pointer-events: none !important;
}
.mirror-disabled-form .captcha {
  display: none !important;
}
.mirror-form-overlay {
  position: absolute;
  inset: 0;
  z-index: 50;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 30px;
  background: rgba(255, 255, 255, 0.58);
  text-align: center;
  pointer-events: auto;
}
.mirror-form-overlay p {
  max-width: 430px;
  margin: 0;
  padding: 20px 24px;
  border: 1px solid #05425e;
  background: #fff;
  color: #05425e;
  font:
    500 18px/1.45 BrandonGrotesqueWeb-Regular,
    Arial,
    sans-serif;
}
/* Native <select> replacing the archived react-select subject dropdown (see
 * installContactForms in app.js). It reuses the shared style-input input
 * class for width/height/background, but that class's 15px padding pushes a
 * <select>'s text and native arrow off from how the other inputs look. */
#c-subject {
  padding: 0 11px;
}
/* Inline status message for the live contact/office-enquiry form submit
 * handler in app.js. Empty and unstyled until a submit attempt sets its
 * text and is-error/is-success class. */
.mirror-form-status {
  margin: 0 0 16px;
  font:
    600 14px/1.4 Helvetica,
    system-ui,
    sans-serif;
}
.mirror-form-status:empty {
  display: none;
}
.mirror-form-status.is-error {
  color: #c0392b;
}
.mirror-form-status.is-success {
  color: #1e8e3e;
}
.mirror-language-switcher {
  position: relative;
}
.mirror-language-switcher .Dropdown-control {
  cursor: pointer;
}
.mirror-language-options {
  position: absolute;
  top: calc(100% + 4px);
  right: 0;
  z-index: 1001;
  display: none;
  min-width: 70px;
  padding: 6px 0;
  border: 1px solid rgba(5, 66, 94, 0.14);
  background: #fff;
  box-shadow: 0 5px 18px rgba(0, 0, 0, 0.14);
  text-align: center;
}
.mirror-language-open .mirror-language-options {
  display: block;
}
.mirror-language-option {
  display: block;
  padding: 3px 14px;
  color: #05425e !important;
  font-size: 13px;
  line-height: 18px;
  text-decoration: none !important;
}
.mirror-language-option:hover,
.mirror-language-option:focus,
.mirror-language-option.is-current {
  color: #fb5237 !important;
}
.mirror-language-option-disabled,
.mirror-language-option-disabled:hover,
.mirror-language-option-disabled:focus {
  color: #9aa4a9 !important;
  cursor: not-allowed;
  opacity: 0.65;
  pointer-events: none;
}
/* "À vivre en ce moment" category teaser. The archived Next.js component
 * that renders these three cards does not hydrate from the frozen Apollo
 * state, so app.js rebuilds it client-side from the same category
 * images and copy used elsewhere on the mirrored site. Reset any earlier
 * hand-patched styling so the section keeps its original sky background and
 * curved title treatment. */
.CategorySlides__Wrapper-jf0isp-0 {
  overflow: hidden;
}
/* The archived CurvedText__Wrapper (.curved-text-wrapper) carries a large negative
 * margin-bottom (-80px/-100px) that assumed React's absolute-positioned
 * letters, which visually float above the text container's own box, so the
 * *next* element could sit close beneath the glyphs despite the wrapper box
 * itself being comparatively short. installCurvedText's plain-JS
 * replacement (see app.js) instead grows the wrapper to the arc's own
 * measured height so the letters are never clipped, which makes that old
 * negative margin pull the next element up into the letters instead of
 * beneath them. Cancelling it here and spacing the row with its own
 * padding-top keeps the fix self-contained to this section rather than
 * overriding .curved-text-wrapper (shared by every other CurvedText instance on the
 * site) globally.
 */
.CategorySlides__Wrapper-jf0isp-0 .CurvedText__Wrapper-ao9lsf-0 {
  margin-bottom: 0;
  font-size: 32px;
}
@media (min-width: 48em) {
  .CategorySlides__Wrapper-jf0isp-0 .CurvedText__Wrapper-ao9lsf-0 {
    font-size: 48px;
  }
}
/* The site-wide .Container-s1f73g56-0 caps at 1195px, which is narrower than
 * three cards at their current size (see .mirror-category-card below) plus
 * the requested 200px gaps between them (923px of cards + 400px of gaps =
 * 1323px). Without more room flexbox wraps the third card onto its own row.
 * Widening the container only inside this section keeps the site's shared
 * 1195px max-width intact everywhere else it's used. */
@media (min-width: 48em) {
  .CategorySlides__Wrapper-jf0isp-0 .Container-s1f73g56-0 {
    max-width: 1400px;
  }
}
.mirror-category-row {
  display: flex;
  align-items: flex-end;
  justify-content: center;
  flex-wrap: wrap;
  gap: 32px;
  width: 100%;
  max-width: 780px;
  margin: 0 auto;
  padding: 6px 15px 0;
}
.mirror-category-card {
  display: block;
  flex: 0 1 252px;
  max-width: 252px;
  text-align: center;
  text-decoration: none;
}
.mirror-category-card--feature {
  flex-basis: 280px;
  max-width: 293px;
}
.mirror-category-image {
  display: block;
  width: 100%;
  height: auto;
  margin: 0 auto;
}
/* White plate beneath the tinted arch image, matching the reference: the
 * image itself already carries its own color block, so only the text
 * portion needs a background. Inset 24px from each side of the image above
 * it (rather than spanning the card's full width) per the requested sizing.
 * A negative top margin pulls it up so it overlaps the bottom of the image
 * rather than sitting flush beneath it. */
.mirror-category-content {
  width: calc(100% - 48px);
  margin: -44px auto 0;
  background: #fff;
  padding: 24px 20px 28px;
  box-sizing: border-box;
  text-align: left;
  position: relative;
}
.mirror-category-title {
  margin: 0 0 12px;
  font-family: Gustavo, system-ui, sans-serif;
  color: #05425e;
  font-size: 13px;
  font-weight: 700;
  line-height: 1.3;
}
.mirror-category-card--feature .mirror-category-title {
  font-size: 16px;
}
.mirror-category-description {
  margin: 0 0 8px;
  font-family: Helvetica, system-ui, sans-serif;
  color: #888888;
  font-size: 9px;
  line-height: 1.35;
}
.mirror-category-link {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-family: Gustavo, system-ui, sans-serif;
  color: #05425e;
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
.mirror-category-link::after {
  content: "";
  width: 6px;
  height: 6px;
  border-right: 1px solid #fd6f48;
  border-bottom: 1px solid #fd6f48;
  transform: rotate(-45deg);
}
@media (min-width: 48em) {
  .mirror-category-row {
    max-width: 1400px;
    gap: 170px;
    padding-top: 0;
    margin-top: -90px;
  }
  .mirror-category-card {
    flex-basis: 282px;
    max-width: 282px;
  }
  .mirror-category-card--feature {
    flex-basis: 313px;
    max-width: 313px;
  }
  .mirror-category-content {
    padding: 20px 20px 16px;
  }
  .mirror-category-card--feature .mirror-category-content {
    padding: 21px 31px 17px;
  }
  .mirror-category-title {
    font-size: 16px;
  }
  .mirror-category-card--feature .mirror-category-title {
    font-size: 19px;
  }
  .mirror-category-description {
    font-size: 11px;
  }
  .mirror-category-link {
    font-size: 10px;
  }
}

@media (max-width: 1500px) {
  .mirror-category-row {
    gap: 70px;
  }
}

@media (max-width: 1076px) {
  .mirror-category-row {
    flex-direction: column;
    align-items: center;
    gap: 160px;
  }
  .mirror-category-card:nth-child(1) {
    order: 1;
  }
  .mirror-category-card:nth-child(2) {
    order: -1;
  }
  .mirror-category-card:nth-child(3) {
    order: 2;
  }
}
/* Mobile burger icon / desktop "Menu" text panel toggle (see installMenuNav
 * in app.js), needed only on pages where React no longer hydrates. The
 * archived Menu__Root component drives its white background and open/closed
 * height entirely through inline styles computed from React props (isOpen,
 * showBackground), not a toggleable class, so app.js's plain hide/fadeIn
 * class swap on the nav list is not enough on its own: this rule supplies
 * the equivalent effect for the menu-open class it adds instead. */
/* Top-bar hide-on-scroll (see installHeaderScrollHide in app.js).
 * .menu-root already transitions transform in every page's own generated
 * <style> (the archived Menu__Root's own isOpen/visible-driven slide), so
 * this only needs to supply the hidden position; the existing transition
 * turns it into the same slide the archived component used. !important
 * because the transform-origin here matches the same "at rest" declaration
 * this page's own <style> puts inline: (0,0,0), and this is the one state
 * that must win regardless of surrounding rule order. */
.menu-root.mirror-menu-open {
  pointer-events: auto !important;
}
.menu-root.mirror-menu-open:after {
  transform: translate3d(0px, 0px, 0px) !important;
}
/* Height is intentionally NOT forced to 100%/100vh here above mobile: the
 * archived Menu__Root itself becomes height: auto at >=48em (its own
 * @media (min-width:48em){.menu-root{height:auto;}} rule, already present in
 * this page's own <style>, confirmed from the bundle's g.a.tablet(Ht())
 * override), i.e. even when open it only ever grows to fit its content on
 * tablet/desktop, never the full viewport. Only :after (the white backdrop)
 * still needs an isOpen-driven height, and only below 48em does that mean
 * 100vh: at >=48em the bundle's own g.a.desktop(Ut(), ...) override instead
 * switches it from a fixed 133px to isOpen ? "100%" : "133px" -- a
 * *content-relative* 100%, since :after's positioning parent (Menu__Root)
 * is itself height: auto there, not the viewport. Forcing 100vh at every
 * width (this rule's previous version) is what made the panel always cover
 * the full screen even when its content was much shorter. */
@media (max-width: 47.99em) {
  .menu-root.mirror-menu-open:after {
    min-height: 100vh !important;
    max-height: 100vh !important;
  }
}
@media (min-width: 48em) {
  .menu-root.mirror-menu-open:after {
    min-height: 100% !important;
    max-height: 100% !important;
  }
}
/* Top-bar recoloring + burger-to-X animation while the menu is open, matching
 * the archived Header/Burger/LanguageSwitcher/Select components' own
 * isOpen-driven inline styles (see setMenuBarOpenState in app.js, which
 * is the only place any of these classes gets toggled). Colors are
 * theme.color.brand's own values (the since-deleted mirror/_next/static/chunks
 * theme module:
 * brand.primary #05425E, brand.grey #808B91, brand.white #FFFFFF), NOT the
 * similarly-named top-level theme.color.primary (#FB5237): the header/burger/
 * language-switcher/dropdown-arrow components all read color.brand.*
 * specifically, confirmed from the same styled-components definitions this
 * file's other menu rules are drawn from. */
[class*="Header__MenuButton"].mirror-menu-open {
  color: #808b91 !important;
}
[class*="LanguageSwitcher__Root"].mirror-menu-open {
  color: #05425e !important;
}
/* Select's Dropdown-arrow (the small caret next to "FR"/"EN") takes the same
 * dark prop as its parent LanguageSwitcher__Root; its two pseudo-elements set
 * background-color rather than color, so they need their own rule even
 * though they inherit no color property from the parent. */
[class*="LanguageSwitcher__Root"].mirror-menu-open .Dropdown-arrow:before,
[class*="LanguageSwitcher__Root"].mirror-menu-open .Dropdown-arrow:after {
  background-color: #05425e !important;
}
.Burger__Root-d8ugeg-0.mirror-menu-open .Burger__Line-d8ugeg-1 {
  background: #05425e !important;
}
.Burger__Root-d8ugeg-0.mirror-menu-open .Burger__Line-d8ugeg-1:nth-of-type(1) {
  transform: rotate(45deg) !important;
  top: -4px !important;
  left: 3px !important;
}
.Burger__Root-d8ugeg-0.mirror-menu-open .Burger__Line-d8ugeg-1:nth-of-type(2) {
  width: 0% !important;
  opacity: 0 !important;
}
.Burger__Root-d8ugeg-0.mirror-menu-open .Burger__Line-d8ugeg-1:nth-of-type(3) {
  transform: rotate(-45deg) !important;
  top: 12px !important;
  left: 3px !important;
}
/* Search submit button's magnifying-glass icon: the archived <Search> passes
 * iconColor: light ? brand.white : brand.accent straight into an inline SVG
 * fill attribute (fill="#FFFFFF" baked into this page's own static markup).
 * setMenuBarOpenState toggles mirror-menu-open directly on the button
 * (.ButtonSubmit) rather than a page-level ancestor, since that is the only
 * element app.js can reliably scope this to without also matching search
 * forms elsewhere on the page. A plain fill declaration is enough to win
 * over the inline fill attribute (SVG presentation attributes sit at
 * UA-stylesheet priority, below any author CSS), but !important is kept for
 * consistency with every other rule in this block. */
.ButtonSubmit-cvsu30-0.mirror-menu-open svg path {
  fill: #fd6f48 !important;
}
/* Search input's floating label, placeholder, and typed text all read
 * `color: currentColor` from their own generated CSS rather than setting a
 * color themselves; FormInline__InputWrapper is their one ancestor with its
 * own prop-driven color (light ? theme.color.white : theme.color.black), so
 * recoloring it here is enough to fix all three at once. theme.color.black
 * (not brand.*: this component reads the plain top-level theme.color) is
 * #413E39, confirmed from the same theme module as every other color in
 * this block. */
.FormInline__InputWrapper-zdc00u-1.mirror-menu-open {
  color: #413e39 !important;
}
/* Animated underline beneath the search field. The archived Input__Svg only
 * ever reads a translucent white stroke for this specific usage (no dark
 * variant is wired into the Search component that renders it), so unlike
 * every other rule in this block this isn't reproducing a value the bundle
 * itself would have used open -- it's picking the same brand.grey (#808B91)
 * the component's own unused `secondary` prop would switch to, since that
 * is already the color this component uses for a "this needs to read on a
 * light background" state elsewhere. */
.Input__Svg-s1etzpe8-2.mirror-menu-open {
  stroke: #808b91 !important;
}
/* GDPR cookie-consent banner. Injected by installCookieBanner in app.js
 * and shown until the visitor accepts or rejects; both buttons share
 * .mirror-cookie-button with only a color modifier each, and neither is
 * larger or comes with pre-selected focus, so rejecting is exactly as easy
 * as accepting. */
.mirror-cookie-banner {
  position: fixed;
  inset: auto 0 0 0;
  z-index: 2000;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 18px 24px;
  background: #05425e;
  color: #fff;
  box-shadow: 0 -4px 18px rgba(0, 0, 0, 0.18);
}
.mirror-cookie-banner p {
  flex: 1 1 320px;
  margin: 0;
  font:
    400 14px/1.5 Helvetica,
    system-ui,
    sans-serif;
}
.mirror-cookie-actions {
  display: flex;
  flex: 0 0 auto;
  gap: 10px;
}
.mirror-cookie-button {
  padding: 10px 22px;
  border: 1px solid #fff;
  border-radius: 2px;
  background: transparent;
  color: #fff;
  font:
    600 13px/1 Gustavo,
    system-ui,
    sans-serif;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  cursor: pointer;
}
.mirror-cookie-button.mirror-cookie-accept {
  background: #fd6f48;
  border-color: #fd6f48;
}
.mirror-cookie-button:hover,
.mirror-cookie-button:focus-visible {
  opacity: 0.85;
}
@media (max-width: 480px) {
  .mirror-cookie-banner {
    flex-direction: column;
    align-items: stretch;
  }
  /* flex-basis applies to height once the banner switches to a column
   * direction above, so the row layout's 320px width basis must be reset
   * here or the paragraph is forced to render 320px tall instead of wide. */
  .mirror-cookie-banner p {
    flex-basis: auto;
  }
  .mirror-cookie-actions {
    justify-content: stretch;
  }
  .mirror-cookie-button {
    flex: 1 1 0;
  }
}

/* FAQ accordion (mirror/fr/faq, mirror/en/faq). Base closed-state CSS
 * (max-height:0, chevron at rotate(0deg)) is already in each page's own
 * generated <style>; these rules only add the open state, toggled by
 * installFaqAccordion in app.js. */
.Styles__Content-jj43qc-3.mirror-faq-open {
  max-height: none !important;
  margin-top: 10px !important;
}
.Styles__TitleIcon-jj43qc-2.mirror-faq-open {
  transform: rotate(-180deg) !important;
}

/* Chapter intro "Voir plus / Voir moins" (mirror/fr/page/audioguide and
 * sibling audioguide-family pages). Base clamped state (max-height:78px,
 * overflow:hidden) is already in each page's own generated <style>; this
 * only adds the open state, toggled by installReadMoreToggles in
 * app.js. The button's own SVG is a plus-shaped glyph (not a chevron);
 * rotating it 45deg turns it into an X, a plain visual cue that the second
 * click now closes rather than opens. */
.Styles__Content-s1w7q36x-3.mirror-readmore-open {
  max-height: none !important;
}
.Styles__Button-s1w7q36x-1.mirror-readmore-open .IconSVG__Root-s11warqa-0 {
  transform: rotate(45deg);
}

/* Shop category filtering (enseignes/brands pages). Vanilla JavaScript
 * filtering with expand/collapse behavior. */
.styles__Root-s1yg27p1-0 {
  overflow: hidden;
  /* Override the original component's width/max-height transition (it has a
   * 100ms start delay baked in, which caused a visible flash when combined
   * with our instant show/hide). We define our own, undelayed transition
   * and drive max-height explicitly from app.js so it animates cleanly
   * on open/close (see expandFilter/collapseFilter). The expanded width
   * itself is set below via the .shop-filter-open class + media query, NOT
   * inline from JS, so it stays responsive if the viewport is resized. */
  transition:
    width 300ms ease-in-out,
    max-height 300ms ease-in-out;
}

/* Expanded state, toggled by app.js (expandFilter/collapseFilter).
 * 90% below the ~1328px breakpoint, then a fixed 1195px above it, so the
 * width never exceeds 1195px on wide screens. */
.styles__Root-s1yg27p1-0.shop-filter-open {
  width: 90%;
}
@media (min-width: 1328px) {
  .styles__Root-s1yg27p1-0.shop-filter-open {
    width: 1195px;
  }
}

.styles__Header-s1yg27p1-4 {
  cursor: pointer;
  user-select: none;
}
.styles__Header-s1yg27p1-4:hover {
  opacity: 0.8;
}

.styles__Content-s1yg27p1-1 {
  background-color: #ffffff;
  padding: 20px 70px 35px;
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
  list-style: none;
  margin: 0;
  box-sizing: border-box;
}

/* Mobile: single column (default) */
.styles__Content-s1yg27p1-1 > li {
  flex: 1 1 100%;
  min-width: 0;
}

/* Desktop: 3 column layout */
@media (min-width: 64em) {
  .styles__Content-s1yg27p1-1 {
    justify-content: space-evenly;
  }

  .styles__Content-s1yg27p1-1 > li {
    flex: 1 1 calc(33.333% - 14px);
    min-width: 0;
  }
}

/* Audioguide player progress bar, added by app.js's
 * installAudioGuidePlayers to occupy the styles__Wave-s1fg9t0f-2 slot the
 * archived component filled with a wavesurfer.js waveform (see app.js's
 * own comment on why a plain bar is used instead offline). */
.mirror-audio-wave {
  display: flex;
  align-items: center;
}
.mirror-audio-progress-track {
  width: 100%;
  height: 4px;
  background-color: #d9dcde;
  border-radius: 2px;
  cursor: pointer;
  position: relative;
}
.mirror-audio-progress-fill {
  height: 100%;
  width: 0%;
  background-color: #05425e;
  border-radius: 2px;
}

/* Full-screen mobile main menu.
 *
 * Below 64em (the same DesktopOnly__Root/MobileOnly__Root split the header
 * already uses for its burger-vs-"Menu"-text and FR-switcher placement),
 * the open menu panel becomes a single-column, scrollable, accordion-style
 * list instead of the always-all-expanded desktop panel: only one category
 * open at a time (toggled by installCategoryAccordion in app.js), search
 * and the social icons pulled into view, matching the archived design's own
 * mobile treatment (which the static crawl froze in a permanently-collapsed,
 * search/social-hidden state -- see the "hide" classes and DesktopOnly
 * wrapper this overrides below).
 */
@media (max-width: 63.99em) {
  /* Menu__Root itself has no defined height (position:fixed, no top/bottom),
   * and its content wrapper (.menu-menu-content-wrapper, Menu__MenuContentWrapper) clips
   * overflow-y, with body scroll also disabled for the duration (see
   * openMenu's no-scroll class). With 8 categories, search, and social
   * icons all in view at once that easily exceeds a phone viewport, so this
   * turns Menu__Root into the scroll container directly and gives it a
   * solid background instead of relying on its :after backdrop (which is
   * sized off the panel's own content height at this breakpoint and would
   * run out mid-scroll otherwise).
   */
  .Menu__Root-s1sb89f4-0.mirror-menu-open {
    overflow-y: auto !important;
    min-height: 100vh !important;
    max-height: 100vh !important;
    background-color: #ffffff !important;
    transition:
      transform 0.4s cubic-bezier(0.3, 0.1, 0.3, 1),
      background-color 0.4s ease-in-out !important;
    -webkit-overflow-scrolling: touch;
  }
  .Menu__Root-s1sb89f4-0.mirror-menu-open .Menu__MenuContentWrapper-s1sb89f4-2 {
    min-height: 100vh;
    padding-bottom: 40px;
  }
  /* The archived staggered fade-in (opacity/translateY, delayed per item via
   * each category's own generated animation-delay) is a see-through-then-
   * slide-up entrance meant for every category appearing at once on desktop.
   * Transform-based animation doesn't affect flex layout, only paint
   * position, so while it's running each category's title visually overlaps
   * the row above it instead of the empty space flexbox already reserved
   * for it (mid-animation it still renders translated up toward that
   * reserved slot from -50px, on top of whatever sits above). Disabling it
   * for the mobile accordion avoids that overlap; the mobile panel doesn't
   * need the entrance flourish itself, and the accordion's own :after
   * chevron transition already off app.css's own rules above is
   * feedback enough that a click did something.
   */
  .Nav__Root-c5ww9n-0 .Category__Root-pdc71f-0 {
    opacity: 1 !important;
    transform: none !important;
    animation: none !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
    max-width: none !important;
    width: 100%;
  }
  .Nav__CategoryContainer-c5ww9n-1 {
    flex-direction: column !important;
    align-items: stretch !important;
  }
  /* Nav__CategoryContainer's own generated ::before (an animated underline
   * that grows from 0 to full width on fadeIn, meant as a decorative rule
   * under the desktop panel's top edge) renders as a stray horizontal line
   * sitting between the search field and the first category on the mobile
   * accordion, which the target design doesn't have.
   */
  .Nav__CategoryContainer-c5ww9n-1::before {
    display: none !important;
  }

  /* Reveal the search field (Header__RightWrapper's own DesktopOnly__Root
   * wrapper -- the ">" scopes this to that one specifically, since the
   * *other* DesktopOnly__Root instance on this row wraps the "Menu" text
   * inside Header__MenuWrapper instead, one level deeper) and push it onto
   * its own full-width row below the burger/FR row via flex-wrap, rather
   * than leaving it as a third item squeezed into that row's
   * justify-content:space-between.
   */
  .Menu__Root-s1sb89f4-0.mirror-menu-open .Header__Wrapper-s182jdes-1 {
    flex-wrap: wrap;
  }
  .Menu__Root-s1sb89f4-0.mirror-menu-open
    .Header__Wrapper-s182jdes-1
    > .DesktopOnly__Root-s1qkka3u-0 {
    display: block !important;
    flex: 1 0 100%;
    order: 10;
    /* Menu__LogoWrapper is centered via position:absolute (menu-logo-wrapper: top:25px,
     * a fixed height around 61px for the logo mark + wordmark), so it takes
     * no flex space of its own here and this row, if placed right after the
     * burger/FR row above, would sit underneath it rather than below it.
     * This margin clears the logo instead of just the shorter burger row.
     */
    margin-top: 75px;
  }
  .Menu__Root-s1sb89f4-0.mirror-menu-open .Header__RightWrapper-s182jdes-4 {
    flex-direction: column;
    align-items: stretch;
    width: 100%;
  }
  /* The language switcher and social icons in that same revealed block are
   * the desktop-positioned duplicates: mobile already shows its own FR
   * switcher next to the burger (MobileOnly__Root), and its own social row
   * at the very bottom of the panel (revealed separately below), matching
   * where the target design puts them.
   */
  .Menu__Root-s1sb89f4-0.mirror-menu-open
    .Header__RightWrapper-s182jdes-4
    > .LanguageSwitcher__Root-s1lum4b2-0,
  .Menu__Root-s1sb89f4-0.mirror-menu-open
    .Header__RightWrapper-s182jdes-4
    > .SocialNetworks__Root-eh0x9i-0 {
    display: none !important;
  }

  /* Category titles and their links have no color of their own (beyond the
   * title's permanent #FD6F48, always-on regardless of open state) and
   * otherwise inherit Hero__Wrapper's white text color, which the white
   * open-menu background this file already adds leaves illegible. Nav__Root
   * gets one explicit dark color here so every descendant that doesn't set
   * its own resolves against it instead of white.
   */
  .Nav__Root-c5ww9n-0 {
    color: #05425e;
    margin-top: 30px;
    margin-bottom: 20px;
  }
  .Nav__Root-c5ww9n-0 .Category__CategoryTitleContainer-pdc71f-1 {
    color: #05425e !important;
    cursor: pointer;
    padding: 12px 0;
  }
  /* Category__Root's own generated margin-top (40px, meant for the vertical
   * gap between categories in the desktop all-expanded layout) is much
   * larger than the accordion needs between two collapsed rows; the title's
   * own padding above already provides comfortable tap-target spacing.
   */
  .Nav__Root-c5ww9n-0 .Category__Root-pdc71f-0 + .Category__Root-pdc71f-0 {
    margin-top: 0 !important;
  }
  .Nav__Root-c5ww9n-0
    .Category__Root-pdc71f-0.mirror-category-open
    > .Category__CategoryTitleContainer-pdc71f-1 {
    color: #fd6f48 !important;
  }
  /* Chevron, rotating from pointing down (closed) to pointing up (open),
   * matching the target design's collapsed/expanded indicator. Drawn the
   * same way .mirror-category-link::after already draws its arrow further
   * up this file, so it reads currentColor and needs no color rule of its
   * own beyond what the title container above sets.
   */
  .Nav__Root-c5ww9n-0 .Category__CategoryTitleContainer-pdc71f-1::after {
    content: "";
    flex: 0 0 auto;
    width: 8px;
    height: 8px;
    margin-left: 12px;
    border-right: 1.5px solid currentColor;
    border-bottom: 1.5px solid currentColor;
    transform: rotate(45deg);
    transition: transform 0.25s ease;
  }
  .Nav__Root-c5ww9n-0
    .Category__Root-pdc71f-0.mirror-category-open
    > .Category__CategoryTitleContainer-pdc71f-1::after {
    transform: rotate(-135deg);
  }
  /* Category__Root's own top-level layout (the per-category hashed classes
   * sharing margin-top/left/right and the fade-in/out entrance animation)
   * is left as-is; only its sub-list needs a collapsed/expanded state, kept
   * to a plain display toggle rather than an animated height (Category__
   * CategoryItems has no generated max-height transition to hook, unlike
   * the FAQ accordion's own Styles__Content).
   */
  .Nav__Root-c5ww9n-0 .Category__CategoryItems-pdc71f-4 {
    display: none;
  }
  .Nav__Root-c5ww9n-0
    .Category__Root-pdc71f-0.mirror-category-open
    > .Category__CategoryItems-pdc71f-4 {
    display: block;
    /* Category__CategoryItems' own generated margin-top (25px, .category-category-items) is
     * sized for the desktop panel, where it's the only spacing between an
     * always-visible title and its links. The accordion's title row already
     * carries its own vertical padding (12px top/bottom), so stacking this
     * on top of that left a much bigger gap under an open category's title
     * than between any two closed category rows.
     */
    margin-top: 4px;
  }
  /* Category__CategoryItem's own generated CSS (.category-category-item a, baked into every
   * page's own <style>) sets every sub-link to brand.grey (#808B91) by
   * default -- a lighter-secondary treatment meant for the desktop panel,
   * where the category title above is the only strong-emphasis element and
   * every link below it reads as equally secondary. The mobile accordion's
   * design instead treats the *category name itself* as secondary once
   * collapsed (it's the whole clickable row) and wants every link inside an
   * open category, including the trailing "view all" one (Toutes les
   * boutiques, Tous les restaurants, Tout le bien-être, ...), at full
   * brand.primary (#05425E) emphasis to match. !important is needed to win
   * over that generated rule's own equal specificity (one class + one type
   * selector on both sides) since it comes later in the page's own <style>.
   */
  .Nav__Root-c5ww9n-0
    .Category__CategoryItem-pdc71f-5
    .Link__StyledLink-igt5n2-0 {
    color: #05425e !important;
  }

  /* Bottom-of-panel social icons (already correctly positioned in the
   * markup, right after </nav>, for exactly this mobile-open state) are
   * frozen with a permanent "hide" class in the static crawl -- the
   * archived component must have driven it the same isOpen-controlled way
   * openMenu/closeMenu already drive the category list's own hide/fadeIn/
   * fadeOut classes, so installMenuFooterSocial in app.js hooks it into
   * that same toggle instead of duplicating it here.
   */
}

/* Interactive floor plan (see installMaps in app.js). The archived
 * component (styles__Root-iv1os1-0 / styles__MapContainer-iv1os1-1) sizes
 * #map at 100%/100% of its own parent (styles__MapContainer-s1vmxmxz-2,
 * height:630px in every page's own generated <style>), which this reuses
 * unchanged -- only #map's own contents (previously empty) need styling.
 */
#map.mirror-map-root {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  background: #fcfcfc;
  touch-action: none;
}
.mirror-map-svg {
  display: block;
  width: 100%;
  height: 100%;
  cursor: grab;
  /* Without this, dragging to pan the map (see the pointerdown/pointermove
   * handlers in installMaps' renderMap) also drags a text selection across
   * every label the pointer passes over, which is distracting and leaves a
   * stray highlighted selection behind once the drag ends. */
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
}
.mirror-map-svg:active {
  cursor: grabbing;
}
.mirror-map-feature path,
.mirror-map-feature circle {
  transition: fill 0.15s ease-out;
}
.mirror-map-feature--interactive {
  cursor: pointer;
}
/* Fill color itself is set inline by mapHoverColor()/selectFeature() in
 * app.js (it depends on the linked shop's own type: shopping blue vs.
 * restaurant orange vs. other grey), not by this stylesheet. */
.mirror-map-label {
  font-family: "Brandon Grotesque", Helvetica, sans-serif;
  font-weight: bold;
  font-size: 9px;
  fill: #5e5e5e;
  pointer-events: none;
  paint-order: stroke;
  stroke: #ffffff;
  stroke-width: 2px;
  stroke-linejoin: round;
}
/* Marker (elevator/escalator/ATM) icons: painted into the labels group so
 * they sit on top of any shop rectangle they overlap, same as text labels
 * (see buildMarkerIconLabel's own comment in app.js). pointer-events:
 * none for the same reason .mirror-map-label has it: hover/click on the
 * marker's own Place (if it's ever made interactive) or drag-to-pan on the
 * map underneath it should not be intercepted by the icon image sitting
 * visually above.
 */
.mirror-map-marker-icon {
  pointer-events: none;
}
/* Applied directly by selectFeature/deselectFeature and the current-page
 * highlight block in app.js, not a descendant selector: labels now
 * live in their own sibling "labels" group, drawn after every shape in the
 * same floor layer so a label never renders underneath a later, overlapping
 * shop rectangle (see buildLayerGroup's own comment in app.js) -- which
 * also means a label is no longer a DESCENDANT of its feature's shape
 * group, so ":hover .mirror-map-label" can no longer reach it.
 */
.mirror-map-label--highlighted {
  fill: #ffffff;
  /* The base .mirror-map-label rule outlines dark text with a white
   * stroke so it stays legible over a light shop rectangle; white text
   * over this feature's dark blue/orange highlight fill needs the same
   * outline in the opposite color, not no outline at all -- dropping it
   * entirely left the highlighted label without the contrast every other
   * label has. */
  stroke: #000000;
}
/* The shop/place the CURRENT page is itself about (see the "Highlights
 * whichever shop/place..." block in app.js): picked out on load, no
 * hover needed, and stays highlighted through mouseleave from any OTHER
 * feature (selectFeature refuses to touch it -- see its own early return).
 */
.mirror-map-feature--current {
  cursor: default;
}

/* Fallback floor + zoom controls, built by renderMap() only on pages with
 * no existing styles__Root-ddbpvr-0/vywkqp-0 siblings to reuse (currently
 * just /fr/plan and /en/map, which use the separate static BasicMap
 * component instead of this one). Every shop page's own archived buttons
 * are reused as-is instead of duplicating this, so most pages never apply
 * these rules at all -- see findExistingControls in app.js.
 * Positioned to match the archived styles__Root-ddbpvr-0 (top:15px;
 * left:30px) / styles__Root-vywkqp-0 (top:15px;right:30px) pair anyway, so
 * both code paths still look the same.
 */
.mirror-map-controls {
  position: absolute;
  top: 15px;
  left: 30px;
  right: 30px;
  z-index: 5;
  display: flex;
  justify-content: space-between;
  pointer-events: none;
}
.mirror-map-floor-buttons,
.mirror-map-zoom-buttons {
  display: flex;
  pointer-events: auto;
}
.mirror-map-floor-button,
.mirror-map-zoom-button {
  color: #ffffff;
  display: flex;
  justify-content: center;
  align-items: center;
  margin-right: 10px;
  min-width: 60px;
  height: 40px;
  font-family: Helvetica, system-ui, sans-serif;
  font-size: 14px;
  line-height: 19.6px;
  font-weight: 700;
  background: #d9dcde;
  border: none;
  cursor: pointer;
  outline: none;
}
.mirror-map-zoom-button {
  min-width: 40px;
  width: 40px;
  border-radius: 50%;
  background: #fd6f48;
  font-size: 1.8rem;
}
.mirror-map-floor-button.is-active {
  color: #ffffff;
  background-color: #fd6f48;
}

/* Static events grid (mirror/fr/evenements). The archived Events listing
 * page fetched its cards live via GraphQL and never rendered them into the
 * static export (confirmed: every capture of this page is either a
 * permanent loading spinner or empty), so there is no original
 * styled-components card to reuse here, unlike offers/brands. This is a
 * new, plain component built to match the reference design directly: a
 * square image, the date in accent orange underneath, then the title in
 * primary blue, with the whole card as one link (no separate "Découvrir"
 * button) and 5 columns per row on desktop. */
.mirror-events-grid {
  display: flex;
  flex-wrap: wrap;
  margin-left: -10px;
  margin-right: -10px;
}
.mirror-event-card {
  display: block;
  flex: 0 0 50%;
  max-width: 50%;
  padding: 0 10px;
  margin-bottom: 30px;
  text-decoration: none;
}
@media (min-width: 40em) {
  .mirror-event-card {
    flex: 0 0 33.3333%;
    max-width: 33.3333%;
  }
}
@media (min-width: 64em) {
  .mirror-event-card {
    flex: 0 0 20%;
    max-width: 20%;
  }
}
.mirror-event-card-image {
  display: block;
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  border-radius: 2px;
}
.mirror-event-card-date {
  display: block;
  margin-top: 12px;
  font-family: Helvetica, system-ui, sans-serif;
  font-size: 12px;
  line-height: 16px;
  color: #fd6f48;
  text-transform: uppercase;
}
.mirror-event-card-title {
  display: block;
  margin-top: 4px;
  font-family: Helvetica, system-ui, sans-serif;
  font-size: 15px;
  line-height: 20px;
  font-weight: 400;
  color: #05425e;
}

/* Event detail pages (mirror/fr/evenements/<slug>) reuse the generic content
 * page's two-column ImageFit layout (see styles__ImageWrapper-s1reic89-4 /
 * ImageFit__Wrapper-get83n-1's own padding-top percentage trick, copied from
 * fr/page/cite-internationale-de-la-gastronomie), but that page's own
 * padding-top values (87%/107%) were tuned for its own portrait-ish header
 * photo, not the square event thumbnails used here. Overriding to a plain
 * 1:1 box keeps the same responsive wrapper mechanics without stretching or
 * over-cropping a square image via the inherited object-fit:cover. */
.mirror-event-detail-image {
  padding-top: 100% !important;
}

/* Long-form event pages (e.g. the Musée de l’Illusion Halloween event): the
 * article below the two-column intro, kept to a readable line length. */
.mirror-event-article-body { margin:0 auto;max-width:840px; }
.mirror-event-article-body .info-text-block-2 h3 { margin-top:40px; }
.mirror-event-article-body .info-text-block-2 h3:first-child { margin-top:0; }
.mirror-event-article-body blockquote { border-left:2px solid #fd6f48;margin:0 0 20px;padding-left:20px; }
/* A list directly under its label paragraph ("Horaires", ...) sits right below it,
 * like the label<br/>text blocks next to it (a <ul> cannot live inside the <p>). */
.mirror-event-article-body .info-text-block-2 p + ul { margin-top:-20px; }

/* Production keeps the top bar visible while scrolling, then switches it
 * to the readable solid-background state. */
.menu-root.mirror-header-scrolled,
.menu-root.mirror-header-scrolled.mirror-header-hidden {
  transform: translate3d(0, 0, 0) !important;
}
.menu-root.mirror-header-scrolled:after {
  transform: translate3d(0, 0, 0) !important;
}
.menu-root.mirror-header-scrolled .Header__MenuButton-s182jdes-3,
.menu-root.mirror-header-scrolled [class*="LanguageSwitcher__Root"] {
  color: #05425e !important;
}
.menu-root.mirror-header-scrolled .Burger__Line-d8ugeg-1 {
  background: #05425e !important;
}
.menu-root.mirror-header-scrolled
  [class*="LanguageSwitcher__Root"]
  .Dropdown-arrow:before,
.menu-root.mirror-header-scrolled
  [class*="LanguageSwitcher__Root"]
  .Dropdown-arrow:after {
  background-color: #05425e !important;
}

.mirror-youtube-placeholder {
  box-sizing: border-box;
  display: flex;
  min-height: 260px;
  width: 100%;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 18px;
  padding: 32px;
  background: #f1f2f5;
  color: #05425e;
  text-align: center;
}
.mirror-youtube-placeholder p { max-width: 540px; margin: 0; font: 400 16px/1.5 Helvetica, system-ui, sans-serif; }
.mirror-youtube-placeholder button { border: 1px solid #05425e; background: #05425e; color: #fff; padding: 10px 18px; cursor: pointer; }

.mirror-contact-privacy { margin: 24px 0 0; color: #413e39; font: 400 13px/1.55 Helvetica, system-ui, sans-serif; }
.mirror-contact-privacy a { color: #05425e; text-decoration: underline; }

/* Production expands the burger's transparent hit target without moving its lines. */
.Burger__Root-d8ugeg-0 { position: relative; touch-action: manipulation; -webkit-tap-highlight-color: transparent; }
.Burger__Root-d8ugeg-0::before { content: ""; position: absolute; inset: -18px -11px; }

/* BEGIN deployed offline.css delta (generated by scripts/port_deployed_css.py) */
body.no-scroll { height:auto !important; }
.mirror-privatisation-page [class*="Row"]>[class*="Column"] { display:flex; }
.mirror-privatisation-page [class*="Row"]>[class*="Column"]>a[class*="IButton__Root"] { align-items:flex-start !important;flex:1 1 auto;height:auto !important;min-height:80px; }
.mirror-privatisation-page a[class*="IButton__Root"]>[class*="IButton__IconWrapper"] { height:60px !important; }
.mirror-privatisation-page a[class*="IButton__Root"]>[class*="IButton__Wrapper"] { box-sizing:border-box;margin:0;min-width:0; }
@media(min-width:1280px) {
  .mirror-privatisation-page [class*="Row"]>[class*="Column"]>a[class*="IButton__Root"] { min-height:100px; }
  .mirror-privatisation-page a[class*="IButton__Root"]>[class*="IButton__IconWrapper"] { height:100px !important; }
}
@media(max-width:1280px) {
  footer [class*="Nav__Root"] { width:100%; }
  footer [class*="Nav__LinksContainer"] { width:100%; }
  footer [class*="Nav__LinksContainer"] { flex-wrap:wrap;gap:10px 18px;justify-content:center;margin:0;padding:0; }
  footer [class*="Nav__LinkContainer"] { margin-left:0 !important; }
}
@media (max-width:1280px) { .mirror-instagram-card { flex:0 0 auto;height:198px;margin-right:40px;max-width:198px;min-width:198px;width:198px; } }
[class*="InstagramFeed__ImagesWrapper"] { --mirror-instagram-loop-distance:0px;--mirror-instagram-start-offset:0px; }
.mirror-language-option[aria-disabled="true"] { color:#6c777c !important;cursor:not-allowed;opacity:.6; }
.Menu__Root-s1sb89f4-0 { transform:translate3d(0,0,0)!important; }
.Menu__Root-s1sb89f4-0.mirror-header-hidden { transform:translate3d(0,0,0)!important; }
.menu-root.mirror-header-scrolled [class*="Header__MenuButton"] { color:#808b91 !important; }
.menu-root.mirror-header-scrolled .ButtonSubmit-cvsu30-0 svg path { fill:#fd6f48 !important; }
.menu-root.mirror-header-scrolled .FormInline__InputWrapper-zdc00u-1 { color:#413e39 !important; }
.menu-root.mirror-header-scrolled .Input__Svg-s1etzpe8-2 { stroke:#808b91 !important; }
.mirror-cookie-banner a { color:inherit;font-weight:600;text-decoration:underline; }
.mirror-cookie-button.mirror-cookie-settings { background:#05425e;border-color:#05425e;color:#fff; }
.mirror-legal-content { color:#413e39;font:400 16px/1.65 Helvetica,system-ui,sans-serif; }
.mirror-legal-content h2 { color:#05425e;font:400 30px/1.2 Gustavo,system-ui,sans-serif;margin:42px 0 14px; }
.mirror-legal-content h2:first-child { margin-top:0; }
.mirror-legal-content h3 { color:#05425e;font:600 20px/1.3 Gustavo,system-ui,sans-serif;margin:26px 0 10px; }
.mirror-legal-content p { margin-top:0; }
.mirror-legal-content li { margin-top:0; }
.mirror-legal-content ul { margin:0 0 20px;padding-left:22px; }
.mirror-legal-content a { color:#05425e;text-decoration:underline; }
.mirror-legal-content .mirror-cookie-button { margin:8px 0 20px; }
@media(max-width:1024px) {
  .Burger__Root-d8ugeg-0 { -webkit-tap-highlight-color:transparent;touch-action:manipulation; }
  .Burger__Root-d8ugeg-0::before { content:"";inset:-18px -11px;position:absolute; }
}
.mirror-audioguide-gallery { display:grid;gap:24px;grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr)); }
.mirror-audioguide-gallery figure { margin:0;min-width:0; }
.mirror-audioguide-gallery img { background:#f3f4f5;display:block;height:360px;object-fit:contain;width:100%; }
.mirror-audioguide-image-credit { color:#626262;font-family:Helvetica,system-ui,sans-serif;font-size:12px;line-height:1.5;margin:10px 0 0;overflow-wrap:anywhere; }
.mirror-audioguide-image-credit a { color:#05425e;text-underline-offset:2px; }
.mirror-audioguide-header-credit { margin-bottom:24px;margin-top:24px; }
.styles__LogoWrapper-s1reic89-5 img.mirror-recovered-logo-dark,
.styles-logo-wrapper img.mirror-recovered-logo-dark { filter:brightness(0); }
.styles__LogoWrapper-s1reic89-5 img.mirror-recovered-logo-victorinox,
.styles-logo-wrapper img.mirror-recovered-logo-victorinox { background:#05425e;border-radius:3px;padding:6px !important; }
.mirror-interactive-map { color:#05425e; }
.styles__MapWrapper-sasgsp-7:has(.mirror-interactive-map) { height:auto; }
.styles__Content-sasgsp-3:has(.mirror-interactive-map) { overflow:visible; }
.ghd-map-shell { background:#fff;border-radius:8px;border:1px solid #dce3e6;font-family:Helvetica,system-ui,sans-serif;overflow:hidden;width:100%; }
.ghd-map-toolbar { background:#f2f5f6;display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;padding:12px; }
.ghd-map-floors { display:flex;flex-wrap:wrap;gap:6px; }
.ghd-map-tools { display:flex;flex-wrap:wrap;gap:6px; }
.ghd-map-button { background:#fff;border-radius:5px;border:1px solid #d4dfe4;color:#05425e;cursor:pointer;font-size:14px;line-height:1.3;min-height:44px;padding:10px 12px; }
.ghd-map-button[aria-pressed="true"] { background:#05425e;border-color:#05425e;color:#fff; }
.ghd-map-button:hover { border-color:#fd6f48; }
.ghd-map-shell:focus-visible { outline-offset:-3px;outline:3px solid #fd6f48; }
.ghd-map-grid { display:grid;grid-template-columns:230px minmax(0,1fr); }
.ghd-map-panel { border-right:1px solid #dce3e6;min-width:0;padding:12px; }
.ghd-map-search { display:grid;gap:10px;margin-bottom:12px; }
.ghd-map-query { background:#fff;border-radius:4px;border:1px solid #cad7de;box-sizing:border-box;color:#05425e;font-family:inherit;font-size:16px;min-height:44px;padding:10px;width:100%; }
.ghd-map-category { background:#fff;border-radius:4px;border:1px solid #cad7de;box-sizing:border-box;color:#05425e;font-family:inherit;font-size:16px;min-height:44px;padding:10px;width:100%; }
.ghd-map-results { display:grid;gap:6px;max-height:380px;overflow-y:auto;overscroll-behavior:contain; }
.ghd-map-result { display:grid;gap:4px;text-align:left;width:100%; }
.ghd-map-result span { font-size:12px;opacity:.8; }
.ghd-map-column { min-width:0; }
.ghd-map-viewport { background:#fff;height:420px;overflow:hidden;position:relative;width:100%; }
.ghd-map-viewport svg { cursor:grab;display:block;height:100%;touch-action:pan-y;width:100%; }
.ghd-map-viewport svg:active { cursor:grabbing; }
.ghd-map-zone { cursor:pointer;fill:transparent;stroke-width:1;stroke:#05425e55; }
.ghd-map-zone:hover { fill:#fd6f4866;stroke-width:2;stroke:#fd6f48; }
.ghd-map-zone:focus { fill:#fd6f4866;stroke-width:2;stroke:#fd6f48; }
.ghd-map-zone.is-selected { fill:#ffd54f88;stroke-width:3;stroke:#05425e; }
.ghd-map-hint { color:#626262;font-size:12px;line-height:1.5;margin:10px 14px; }
.ghd-map-details { background:#f9fafb;border-top:1px solid #dce3e6;min-height:100px;padding:14px; }
.ghd-map-details h3 { color:#05425e;font-family:Gustavo,system-ui,sans-serif;font-size:22px;font-weight:400;line-height:1.3;margin:0 0 8px; }
.ghd-map-details p { color:#05425e;font-size:14px;line-height:1.5;margin:0 0 10px; }
.ghd-map-footer { border-top:1px solid #dce3e6;display:flex;flex-wrap:wrap;gap:12px 24px;padding:12px 14px; }
.ghd-map-shell a { color:#05425e;font-size:14px;line-height:1.5;text-underline-offset:3px; }
.ghd-map-shell.is-embedded .ghd-map-grid { grid-template-columns:minmax(0,1fr); }
.ghd-map-shell.is-embedded .ghd-map-hint { display:none; }
.ghd-map-shell.is-embedded .ghd-map-details { display:none; }
.ghd-map-shell.is-embedded.is-location-unknown .ghd-map-details { display:block;min-height:0; }
.ghd-map-shell.is-embedded .ghd-map-viewport svg { touch-action:none; }
.ghd-map-inline-controls { position:absolute;right:10px;top:10px; }
.ghd-map-inline-controls .ghd-map-tools { flex-direction:column;gap:6px; }
.ghd-map-inline-controls .ghd-map-button { box-shadow:0 1px 4px #0002;font-size:22px;height:44px;padding:0;width:44px; }
.ghd-map-location { align-items:center;display:flex;flex-basis:100%;flex-wrap:wrap;gap:8px 12px; }
.ghd-map-location-copy { flex:1 1 190px; }
.ghd-map-location-copy p { color:#626262;font-size:12px;line-height:1.4;margin:0; }
.ghd-map-location-copy .ghd-map-location-status { color:#05425e; }
.ghd-map-shell .ghd-map-button:disabled { cursor:default;opacity:.6; }
.ghd-map-locate.is-located { background:#05425e;border-color:#05425e;color:#fff; }
.ghd-map-location[hidden] { display:none; }
.ghd-map-location [hidden] { display:none; }
.ghd-map-position { pointer-events:none; }
.ghd-map-position-accuracy { fill:#e5353522;stroke-width:1;stroke:#d92a2a88; }
.ghd-map-position-symbol { filter:drop-shadow(0 2px 2px #05425e44); }
.ghd-map-position-halo { fill:#df303633; }
.ghd-map-position-target { fill:#df3036;stroke-linejoin:round;stroke-width:2;stroke:#fff; }
.ghd-map-position-centre { fill:#fff; }
.ghd-map-dialog { background:#fff;border-radius:8px;border:0;color:#05425e;height:calc(100dvh - 24px);height:calc(100vh - 24px);inset:12px;margin:0;max-height:none;max-width:none;overflow:hidden;padding:0;position:fixed;width:calc(100% - 24px); }
.ghd-map-dialog::backdrop { background:#0009; }
.ghd-map-dialog[open] { display:flex; }
.ghd-map-shell.is-expanded { display:flex;flex-direction:column;height:100%;min-height:0;width:100%; }
.ghd-map-shell.is-expanded .ghd-map-toolbar { flex-shrink:0; }
.ghd-map-shell.is-expanded .ghd-map-footer { flex-shrink:0; }
.ghd-map-shell.is-expanded .ghd-map-footer { max-height:30%;overflow-y:auto; }
.ghd-map-shell.is-expanded .ghd-map-grid { flex:1;min-height:0; }
.ghd-map-shell.is-expanded .ghd-map-column { display:flex;flex-direction:column;min-height:0; }
.ghd-map-shell.is-expanded .ghd-map-viewport { flex:1;min-height:260px; }
.ghd-map-shell.is-expanded .ghd-map-viewport svg { touch-action:none; }
.ghd-map-shell.is-expanded .ghd-map-hint { display:none; }
.ghd-map-shell.is-expanded .ghd-map-details { flex-shrink:0;max-height:28%;min-height:0;overflow-y:auto; }
.ghd-map-shell.is-expanded .ghd-map-panel { overflow-y:auto; }
.ghd-map-shell.is-expanded .ghd-map-results { max-height:none; }
.ghd-map-search-toggle { display:none; }
@media(max-width:768px) {
  .ghd-map-grid { grid-template-columns:minmax(0,1fr); }
  .ghd-map-panel { border-bottom:1px solid #dce3e6;border-right:0; }
  .ghd-map-results { max-height:150px; }
  .ghd-map-viewport { height:clamp(270px,56vw,320px); }
  .ghd-map-toolbar { gap:8px;padding:8px; }
  .ghd-map-toolbar .ghd-map-button { font-size:13px;padding:8px; }
  .ghd-map-button { padding:10px; }
  .ghd-map-dialog { border-radius:0;box-sizing:border-box;height:100dvh;height:100vh;inset:0;padding:env(safe-area-inset-top,0px)env(safe-area-inset-right,0px)env(safe-area-inset-bottom,0px)env(safe-area-inset-left,0px);width:100%; }
  .ghd-map-shell.is-expanded { border-radius:0;border:0; }
  .ghd-map-shell.is-expanded .ghd-map-grid { display:flex;flex-direction:column;overflow-y:auto;overscroll-behavior:contain; }
  .ghd-map-shell.is-expanded .ghd-map-column { flex:1; }
  .ghd-map-shell.is-expanded .ghd-map-panel { display:none;flex:0 0 auto;overflow:visible; }
  .ghd-map-shell.is-expanded.is-search-open .ghd-map-panel { display:block; }
  .ghd-map-shell.is-expanded .ghd-map-search-toggle { display:block; }
  .ghd-map-shell.is-expanded .ghd-map-results { max-height:80px; }
  .ghd-map-shell.is-expanded .ghd-map-details { min-height:0;padding:8px 12px; }
  .ghd-map-shell.is-expanded .ghd-map-details h3 { font-size:18px; }
  .ghd-map-shell.is-expanded .ghd-map-details p { margin-bottom:6px; }
  .ghd-map-shell.is-expanded .ghd-map-footer { padding:8px 12px; }
}
@media(max-height:500px) {
  .ghd-map-shell.is-expanded .ghd-map-grid { overflow-y:auto; }
  .ghd-map-shell.is-expanded .ghd-map-details { display:none; }
  .ghd-map-shell.is-expanded .ghd-map-toolbar { gap:6px;padding:6px; }
  .ghd-map-shell.is-expanded .ghd-map-footer { gap:6px 20px;max-height:48px;overflow-y:auto;padding:6px 12px; }
}
@media(max-height:350px) {
  .ghd-map-shell.is-expanded { position:relative; }
  .ghd-map-shell.is-expanded .ghd-map-toolbar { background:transparent;left:6px;max-width:calc(100% - 70px);padding:0;position:absolute;top:6px;z-index:1; }
  .ghd-map-shell.is-expanded .ghd-map-panel { padding-top:64px; }
  .ghd-map-shell.is-expanded .ghd-map-viewport { min-height:244px; }
  .ghd-map-shell.is-expanded .ghd-map-inline-controls { right:6px;top:6px; }
  .ghd-map-shell.is-expanded .ghd-map-tools { gap:4px; }
}
@media(max-width:768px) {
  .mirror-audioguide-gallery img { height:300px; }
}
.mirror-category-title { font-size:22px; }
.mirror-category-card--feature .mirror-category-title { font-size:22px; }
.mirror-category-description { color:#626262;font-size:16px;line-height:1.5; }
.mirror-category-link { font-size:14px; }
.mirror-category-content { padding:22px 18px; }
.Menu__LogoWrapper-s1sb89f4-1 { top:2px; }
.Menu__LogoWrapper-s1sb89f4-1 img[src$="/logo-2026.png"] { height:108px;object-fit:contain;width:auto; }
.Menu__Root-s1sb89f4-0.mirror-menu-open .Menu__LogoWrapper-s1sb89f4-1 img { filter:brightness(0); }
.Menu__Root-s1sb89f4-0.mirror-header-scrolled .Menu__LogoWrapper-s1sb89f4-1 img { filter:brightness(0); }
.Footer__Wrapper-s1ya1qa0-1 img[src$="/logo-2026.png"] { height:auto;max-width:100%;width:220px; }
.mirror-update-section { color:#05425e;margin:0;padding-bottom:64px;padding-top:24px; }
.mirror-update-section-title { font-family:Gustavo,system-ui,sans-serif;font-size:84px;font-weight:400;line-height:1.2;margin:0 0 36px;text-align:center; }
.mirror-editorial-cards { display:grid;gap:48px;grid-template-columns:repeat(3,minmax(0,1fr)); }
.mirror-editorial-card { min-width:0; }
.mirror-editorial-image-link { border-radius:50% 50% 0 0;display:block;overflow:hidden; }
.mirror-editorial-image { aspect-ratio:1;display:block;height:auto;object-fit:cover;transition:transform .3s ease-in-out;width:100%; }
.mirror-editorial-image-link:hover .mirror-editorial-image { transform:scale(1.1); }
.mirror-editorial-image-link:focus-visible .mirror-editorial-image { transform:scale(1.1); }
.mirror-editorial-image--poster { background:#edf1f4;object-fit:contain; }
.mirror-editorial-card h3 { color:#ed6544;font-family:Gustavo,system-ui,sans-serif;font-size:24px;font-weight:400;line-height:1.25;margin:24px 0 14px; }
.mirror-editorial-card p { color:#626262;font-family:Helvetica,system-ui,sans-serif;font-size:16px;line-height:1.55;margin:0 0 20px; }
.mirror-editorial-cta { align-items:center;color:#05425e;display:inline-flex;font-family:Gustavo,system-ui,sans-serif;font-size:17px;gap:12px;padding:8px 0;text-decoration:none; }
.mirror-editorial-cta::after { color:#ed6544;content:"↗";font-size:24px; }
.mirror-editorial-cta:hover { text-decoration:underline; }
.mirror-updated-brand-card:focus-visible { outline-offset:5px;outline:3px solid #fd6f48; }
.mirror-updated-brand-card:focus-visible .card-image { transform:scale(1.1); }
.mirror-updated-brand-card img[src$="/kurry-logo.png"] { filter:brightness(0)invert(1); }
.mirror-updated-brand-card img[src$="/gloria-logo.png"] { filter:brightness(0)invert(1); }
.mirror-updated-brand-card svg.CardWithImageInArc__Logo-s9u2rmu-6 { filter:drop-shadow(0 1px 2px #0008); }
.Row-mpxg24-0.mirror-updated-brand-row { display:grid;gap:28px;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));margin-left:0;margin-right:0; }
.Row-mpxg24-0.mirror-updated-brand-row>.Column-ru2r2b-0 { justify-self:center;margin:0 0 24px;max-width:260px;padding:0;width:100%; }
.Column-ru2r2b-0 { max-width:340px;justify-self:center; }
.Column-ru2r2b-0 > a { display:flex;justify-content:center; }
.Column-ru2r2b-0 .CardWithImageInArc__ImageWrapper-s9u2rmu-4 { aspect-ratio:1;height:auto;position:relative;width:100%; }
.Column-ru2r2b-0 .CardWithImageInArc__Image-s9u2rmu-5 { display:block; }
.Column-ru2r2b-0 .CardWithImageInArc__NewTag-s9u2rmu-8 { background:#fd6f48;bottom:25px;color:#fff;font-family:Francoeur,system-ui,sans-serif;font-size:22px;left:50%;padding:5px 10px;position:absolute;text-align:center;text-transform:uppercase;transform:translateX(-50%);z-index:1; }
.Column-ru2r2b-0 .CardWithImageInArc__Wrapper-s9u2rmu-0 { max-width:none;min-width:0;width:100%; }
@media(max-width:1280px) {
  .Column-ru2r2b-0 .CardWithImageInArc__Logo-s9u2rmu-6 { height:50%;width:50%; }
  .Column-ru2r2b-0 .CardWithImageInArc__BadgeImg-s9u2rmu-1 { height:auto;max-width:100px;right:0;top:-10px;width:40%; }
}
@media(max-width:768px) {
  .Hero__AbsoluteContent-s1ewyn6i-1 { bottom:clamp(56px,12svh,104px); }
  .Column-ru2r2b-0 .CardWithImageInArc__Wrapper-s9u2rmu-0>h3 { font-size:clamp(17px,4.6vw,22px);line-height:1.35;overflow-wrap:anywhere; }
  .Column-ru2r2b-0 .CardWithImageInArc__Wrapper-s9u2rmu-0 { max-width:260px; }
}
@media(max-width:660px) {
  .row-10 { grid-template-columns:1fr 1fr;gap:24px 16px }
  .Column-ru2r2b-0 .CardWithImageInArc__Wrapper-s9u2rmu-0 { max-width:100%; }
}

@media(max-width:660px) {
  .offer-card-grid.row-10 { grid-template-columns:1fr; }
  .place-page-discover-cards-grid.row-10 { grid-template-columns:1fr; }
}
.mirror-content-page { color:#05425e;padding-bottom:70px; }
.mirror-brand-page .styles__ImageWrapper-s1reic89-4 { width:100%; }
.mirror-native-logo { display:block;height:100px;object-fit:contain;width:100px; }
.mirror-brand-page .mirror-native-logo[src$="/bigsmash-logo.png"] { filter:brightness(0); }
.mirror-brand-poster .image-fit--wrapper { padding-top:141%; }
.mirror-brand-poster img { background:#ed3b47;object-fit:contain; }
.mirror-native-links { display:flex;flex-wrap:wrap;gap:12px 24px;margin-top:24px; }
.mirror-native-button { padding:8px 0;text-decoration:none; }
.opening-hours-wrapper { margin:0 0 20px; }
.opening-hours-line { color:#fff;font-family:Helvetica,system-ui,sans-serif;font-size:14px;line-height:1.3;margin:0 0 5px; }
.mirror-native-hours .mirror-hours-source { font-size:13px; }
.mirror-native-hours .mirror-hours-source a { color:#fff;text-decoration:underline;text-underline-offset:3px; }
.mirror-brand-page .styles__Header-sasgsp-2 h3 { margin-bottom:24px; }
.styles__LogoWrapper-s1reic89-5 img[src$="/shops/22/logo2_desktop.png"] { filter:brightness(0); }
.mirror-plan-page h2 { font-family:Gustavo,system-ui,sans-serif;font-size:32px;font-weight:400;line-height:1.25;margin:0 0 24px; }
.mirror-static-map { height:auto;margin:24px 0;width:100%; }
.mirror-static-map figure { margin:0; }
.mirror-static-map figure>a { background:#fff;border:1px solid #e6e9eb;display:block; }
.mirror-static-map img { display:block;height:auto;object-fit:contain;width:100%; }
.mirror-static-map figcaption { color:#626262;font-size:13px;line-height:1.5;margin:12px 0; }
.mirror-plan-actions { display:flex;flex-wrap:wrap;gap:12px 24px; }
.mirror-plan-actions a { color:#05425e;font-size:16px;line-height:1.4;padding:12px 0;text-underline-offset:4px; }
.mirror-plan-page { margin:64px 0; }
.mirror-programme { margin:48px 0; }
.mirror-programme>p { color:#555;font-size:18px;line-height:1.6; }
.mirror-programme-cover { aspect-ratio:1.8;display:block;height:auto;margin:32px auto 56px;max-width:840px;object-fit:cover;width:100%; }
.mirror-programme-day { border-top:1px solid #dce3e7;display:grid;gap:36px;grid-template-columns:minmax(0,1fr)minmax(0,3fr);padding:32px 0; }
.mirror-programme-day>h2 { color:#ed6544;font-family:Gustavo,system-ui,sans-serif;font-size:26px;font-weight:400;line-height:1.3; }
.mirror-programme-items { min-width:0; }
.mirror-programme-item { border-bottom:1px solid #e8edef;margin:0 0 26px;padding:0 0 26px; }
.mirror-programme-item:last-child { border:0;margin:0;padding:0; }
.mirror-programme-item h3 { font-family:Gustavo,system-ui,sans-serif;font-size:24px;font-weight:400;line-height:1.3;margin:8px 0 14px; }
.mirror-programme-item p { color:#555;font-family:Helvetica,system-ui,sans-serif;font-size:16px;line-height:1.6;margin:0 0 12px; }
.mirror-programme-item .mirror-programme-location { color:#05425e;display:flex;flex-wrap:wrap;font-size:14px;font-weight:700;gap:8px 16px; }
.mirror-programme-item .mirror-programme-price { font-weight:700; }
.mirror-programme-item a { color:#05425e;overflow-wrap:anywhere; }
.mirror-content-page a:focus-visible { outline-offset:5px;outline:3px solid #fd6f48; }
.mirror-update-section a:focus-visible { outline-offset:5px;outline:3px solid #fd6f48; }
@media(min-width:64em) {
  .Menu__LogoWrapper-s1sb89f4-1 { top:8px; }
  .Menu__LogoWrapper-s1sb89f4-1 img[src$="/logo-2026.png"] { height:120px; }
}
@media(max-width:64em) {
  .mirror-editorial-cards { gap:26px; }
  .mirror-editorial-card h3 { font-size:22px; }
}
@media(max-width:768px) {
  .Menu__LogoWrapper-s1sb89f4-1 { top:2px; }
  .Menu__LogoWrapper-s1sb89f4-1 img[src$="/logo-2026.png"] { height:108px; }
  .Footer__Wrapper-s1ya1qa0-1 img[src$="/logo-2026.png"] { width:180px; }
  .mirror-update-section { margin:0;padding-bottom:48px;padding-top:16px; }
  .mirror-update-section-title { font-size:clamp(40px,11vw,52px);margin-bottom:28px; }
  .mirror-editorial-cards { gap:44px;grid-template-columns:minmax(0,1fr); }
  .mirror-editorial-card { margin:0 auto;max-width:420px;width:100%; }
  .mirror-plan-page h2 { font-size:27px; }
  .mirror-programme-day { gap:12px;grid-template-columns:minmax(0,1fr); }
  .mirror-programme-day>h2 { margin:0 0 16px; }
  .mirror-programme-item h3 { font-size:22px; }
  .mirror-programme-cover { margin-bottom:32px; }
}
@media(max-width:1076px) {
  .mirror-category-row { gap:40px;margin-top:0;padding:24px 0 0; }
  .mirror-category-card { flex:none;max-width:340px;width:100%; }
  .mirror-category-card--feature { flex:none;max-width:340px;width:100%; }
  .mirror-category-content { margin-top:-32px;padding:24px;width:calc(100% - 24px); }
  .mirror-category-card--feature .mirror-category-content { margin-top:-32px;padding:24px;width:calc(100% - 24px); }
}
@media(max-width:768px)and(max-height:500px) {
  .Hero__VerticalLine-s1ewyn6i-7 { height:32px;margin-top:12px; }
}
/* END deployed offline.css delta */
/* October production homepage typography refinements, scoped to HomeLayout. */
body[data-mirror-home="true"] .Hero__MainTitle-s1ewyn6i-4 { font-size: 41px; line-height: 1.2; }
body[data-mirror-home="true"] .Hero__SubTitle-s1ewyn6i-5 { font-size: 22px; line-height: 1.2; }
body[data-mirror-home="true"] .Hero__P-s1ewyn6i-6,
body[data-mirror-home="true"] main .mirror-category-description,
body[data-mirror-home="true"] main .mirror-editorial-card p,
body[data-mirror-home="true"] main .Card__Description-ib89nd-2 { font-size: 15px; }
body[data-mirror-home="true"] main .mirror-category-title,
body[data-mirror-home="true"] main .Card__Title-ib89nd-1 { font-size: 21px; }
body[data-mirror-home="true"] main .mirror-editorial-card h3 { font-size: 22px; }
body[data-mirror-home="true"] main .mirror-editorial-cta { font-size: 16px; }
body[data-mirror-home="true"] main .mirror-update-section-title { font-size: 78px; }
body[data-mirror-home="true"] main .HistorySlides__Title-s1q6yigk-1 { font-size: 44px; line-height: 1.2; }
body[data-mirror-home="true"] main .styles__Title-s12vzmvf-0 { font-size: 28px; line-height: 1.2; }
body[data-mirror-home="true"] main .CategorySlides__Wrapper-jf0isp-0 .CurvedText__Wrapper-ao9lsf-0 { font-size: 30px; }
body[data-mirror-home="true"] main .HistorySlides__Wrapper-s1q6yigk-0 h3 { font-size: 21px !important; }
body[data-mirror-home="true"] main .HistorySlides__Wrapper-s1q6yigk-0 p { font-size: 15px !important; }
@media (min-width: 48em) {
  body[data-mirror-home="true"] .Hero__MainTitle-s1ewyn6i-4 { font-size: 60px; }
  body[data-mirror-home="true"] .Hero__SubTitle-s1ewyn6i-5 { font-size: 24px; }
  body[data-mirror-home="true"] main .HistorySlides__Title-s1q6yigk-1 { font-size: 96px; }
  body[data-mirror-home="true"] main .styles__Title-s12vzmvf-0 { font-size: 49px; }
  body[data-mirror-home="true"] main .CategorySlides__Wrapper-jf0isp-0 .CurvedText__Wrapper-ao9lsf-0 { font-size: 45px; }
}
@media (max-width: 64em) {
  body[data-mirror-home="true"] main .mirror-editorial-card h3 { font-size: 21px; }
}
@media (max-width: 47.99em) {
  body[data-mirror-home="true"] main .mirror-update-section-title { font-size: clamp(38px, 10.3vw, 49px); }
}

/* October production Instagram fix: animate one measured track rather than
 * individual cards, so responsive resize and duplicated-card buffers share a
 * single animation phase. */
.InstagramFeed__Wrapper-s59yonz-0 { padding-top: 64px; padding-bottom: 88px; }
@media (max-width: 47.99em) {
  .InstagramFeed__Wrapper-s59yonz-0 { padding-top: 48px; padding-bottom: 72px; }
}
[class*="InstagramFeed__ImagesWrapper"] { --mirror-instagram-loop-distance: 0px; }
.mirror-instagram-track { position: relative; display: flex; flex: 0 0 auto; width: max-content; }
.mirror-instagram-left, .mirror-instagram-right { animation: none !important; transform: none; }
.mirror-instagram-track.mirror-instagram-left { animation: mirrorInstagramLeft 30s linear infinite !important; }
.mirror-instagram-track.mirror-instagram-right { animation: mirrorInstagramRight 30s linear infinite !important; }

.list-root:first-of-type > h3.list-title.first-list-title { margin-top:30px; }
.service-tile-grid { display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:20px; }
@media (max-width: 64em) {
  .service-tile-grid { gap:16px; }
}
@media (max-width: 48em) {
  .service-tile-grid { grid-template-columns:repeat(auto-fill,minmax(320px,1fr)); gap:8px; }
}
@media (max-width: 32em) {
  .i-button-root { height: 60px; }
  .i-button-icon-wrapper { width: 60px; height: 60px; }
  .i-button-wrapper { font-size: 15px; line-height: 18px; padding: 4px 12px; }
  .service-tile-button-alt { margin-top: 5px; }
  .service-tile-button-alt .button-text-14-blue { font-size: 12px; }
  .service-tile-grid { grid-template-columns: 1fr; gap: 4px; margin-left: -11px; margin-right: -11px; }
}
/* .service-tile-wrapper {} */

@media (max-width:48em) {
  .styles-styled-row { grid-template-columns: 1fr }
  .place-first-section .styles-styled-row :nth-child(1) { order: 2; }
  .place-first-section .styles-styled-row :nth-child(2) { order: 1; }
}

/* Audioguide intro media fit is page data; chapter/player images keep their existing behavior. */
.image-fit-container img.audioguide-intro-image-cover { object-fit:cover; }
.image-fit-container img.audioguide-intro-image-contain { object-fit:contain; }

/* Contain-mode audioguide media uses the shared 360px presentation height. */
.image-fit-wrapper-tall.audioguide-intro-image-wrapper-contain { height:360px;padding-top:0; }
.block-image-image-wrapper-1.audioguide-image-wrapper-contain { height:360px; }

.partners-list { display:flex;flex-wrap:wrap;gap:16px; }
.wojo-content-section .info-text-block-2 h2 { margin-top:0; }
.wojo-inline-image-wrapper { align-items:center;display:flex;height:360px;margin-bottom:60px;justify-content:center;width:100%; }
.wojo-inline-image-wrapper .wojo-inline-image { display:block;height:100%;max-width:100%;object-fit:contain;width:auto; }
/* In-page anchors (e.g. /fr/page/services/#lockers) land below the fixed menu bar (110px, 133px from 64em). */
.info-text-block-2 h3[id] { scroll-margin-top:130px; }
@media (min-width:64em) { .info-text-block-2 h3[id] { scroll-margin-top:153px; } }
