/* ================ MASCOT MOBILE PREMIUM PASS (v2) ================= */
.sb-dots-m{display:none}

@media (max-width:840px){

/* ---- 1. SUB-HERO carousel: tidy single-line tabs, arrows -> dots ---- */
.sbsec .sb-bar{flex-wrap:nowrap;gap:10px;align-items:center}
.sbsec .sb-tabs{flex:1 1 auto;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none;gap:8px;padding:2px 0;justify-content:flex-start;-webkit-overflow-scrolling:touch}
.sbsec .sb-tabs::-webkit-scrollbar{display:none}
.sbsec .sb-tab{flex:0 0 auto;font-size:13px;padding:9px 15px}
.sbsec .sb-nav{display:none!important}
.sb-dots-m{display:flex;justify-content:center;gap:6px;margin-top:16px}
.sb-dots-m button{position:relative;width:24px;height:14px;padding:0;border:0;background:none;cursor:pointer}
.sb-dots-m button::after{content:"";position:absolute;left:50%;top:50%;width:22px;height:7px;border-radius:100px;background:rgba(10,12,16,.2);transform:translate(-50%,-50%) scaleX(.32);transform-origin:center;transition:transform .35s cubic-bezier(.22,.61,.36,1),background .35s}
.sb-dots-m button.on::after{transform:translate(-50%,-50%) scaleX(1);background:linear-gradient(90deg,var(--amber),var(--orange))}

/* ---- shared swipe rails: products / repair / films / engagements ---- */
.nrow,.dark-sec .rgrid,.film-strip,.why-grid{display:flex!important;flex-wrap:nowrap!important;grid-template-columns:none!important;overflow-x:auto;overflow-y:hidden;gap:14px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none;padding-bottom:10px}
.nrow::-webkit-scrollbar,.dark-sec .rgrid::-webkit-scrollbar,.film-strip::-webkit-scrollbar,.why-grid::-webkit-scrollbar{display:none;height:0;width:0}
.nrow>*,.dark-sec .rgrid>*,.film-strip>*,.why-grid>*{scroll-snap-align:start}
.nrow>.up,.dark-sec .rgrid>.up,.film-strip>.up,.why-grid>.up{opacity:1!important;transform:none!important}
.nrow>.ncard{flex:0 0 76%!important;width:76%!important;max-width:290px}
.dark-sec .rgrid>.rcard{flex:0 0 80%!important;width:80%!important;max-width:310px;padding:24px 22px!important}

/* ---- SERVICE BANNER: slimmer on mobile to reclaim space ---- */
.svc-banner{min-height:auto!important;margin-bottom:clamp(22px,4vw,32px)!important}
.svc-banner .sb-inner{padding:24px 20px!important;gap:16px!important}
.svc-banner .sb-media{aspect-ratio:16/7!important}
.svc-banner .sb-in h3{font-size:clamp(23px,6.6vw,29px)!important;line-height:1.06!important}
.svc-banner .sb-in p{font-size:13.5px!important;line-height:1.5!important}
/* chips -> 2-col grid (3rd spans full width), CTA gets real breathing room below */
.svc-banner .sb-chips{display:grid!important;grid-template-columns:1fr 1fr!important;gap:8px!important;margin:16px 0 0!important}
.svc-banner .sb-chips span{display:flex!important;align-items:center;justify-content:center;text-align:center;white-space:normal!important;font-size:12px!important;padding:10px 10px!important;line-height:1.2}
.svc-banner .sb-chips span:last-child:nth-child(odd){grid-column:1 / -1}
.svc-banner .sb-in>.btn{margin-top:24px!important;width:100%!important;justify-content:center!important}

/* ---- SERVICES cards: horizontal swipe rail (neatest) ---- */
.grid3{display:flex!important;flex-wrap:nowrap!important;grid-template-columns:none!important;overflow-x:auto;overflow-y:hidden;gap:14px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none;padding-bottom:10px}
.grid3::-webkit-scrollbar{display:none;height:0;width:0}
.grid3>.scard{flex:0 0 82%!important;width:82%!important;max-width:320px;scroll-snap-align:start;opacity:1!important;transform:none!important}
.grid3>.scard .simg{aspect-ratio:16/10!important}
.film-strip{margin-top:20px!important}
.film-strip>.fcard{flex:0 0 76%!important;width:76%!important;max-width:300px}
.why-grid>.why{flex:0 0 80%!important;width:80%!important;max-width:310px;padding:28px 24px!important}

/* ---- 2. GALLERY: 3-col grid of gold-framed prints (frame scaled to the smaller tile) ---- */
.ggrid{display:grid!important;grid-template-columns:repeat(3,1fr)!important;flex-wrap:initial!important;gap:18px 9px!important;overflow:visible!important;padding-bottom:0!important}
.ggrid>.art{flex:none!important;width:auto!important;max-width:none!important;min-width:0;opacity:1!important;transform:none!important}
/* thin the wood frame + mat so the artwork still reads at ~1/3 width */
.ggrid .art .frame{padding:5px!important;border-radius:2px!important;box-shadow:0 12px 20px -12px rgba(0,0,0,.55),inset 0 0 0 1px rgba(0,0,0,.18)!important}
.ggrid .art .mat{padding:4px!important}
.ggrid .art .sale{top:-16px!important;font-size:9.5px!important}
.ggrid .ameta{display:block!important;padding-top:9px!important}
.ggrid .aname{font-size:11.5px!important;line-height:1.25;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:2.5em}
.ggrid .aartist{font-size:10px!important;display:block;margin-top:1px;opacity:.72}
.ggrid .aprice{font-size:11px!important;display:block;margin-top:3px}

/* category tiles */
.grid{gap:12px!important}
.pcard{gap:10px!important}
.pcard .thumb{border-radius:18px}
.plink b{font-size:15px}
.plink .go{width:26px;height:26px;font-size:13px}

/* promos */
.promos{gap:14px!important}
.promo{min-height:200px!important;padding:20px!important;border-radius:20px}

/* repair card text */
.dark-sec .rcard h4{font-size:19px!important}
.dark-sec .rcard p{font-size:14px!important}

/* ---- 3. REPAIR trust chips: neat 2-col grid ---- */
.dark-sec .rchips{display:grid!important;grid-template-columns:1fr 1fr!important;gap:10px!important;align-items:stretch!important}
.dark-sec .rchip{justify-content:flex-start!important;width:100%!important;font-size:12px!important;padding:11px 12px!important;line-height:1.25}

/* ---- 4. WORKSPACE: steps 2x2, CTAs stacked ---- */
.ws-steps{display:grid!important;grid-template-columns:1fr 1fr!important;gap:8px!important;margin:22px 0 24px!important}
.ws-step{width:100%!important;justify-content:flex-start!important;font-size:12.5px!important;padding:11px 12px!important}
.ws .cta-row{flex-direction:column!important;gap:10px!important;align-items:stretch!important}
.ws .cta-row .btn{width:100%!important;justify-content:center!important}
.ws-prio{font-size:12.5px!important;text-align:center!important;margin-top:2px!important}

/* ---- 5. CAFE teaser: unstick the crest, calm the busy stack, center it premium ---- */
.cafeT{padding-top:38px!important}
/* the grid track was sizing to max-content (~622px) and overflowing/clipping the copy — collapse to a plain full-width block */
.cafeT .grid2{display:block!important;grid-template-columns:none!important}
.cafeT .grid2>.up,.cafeT .grid2>.vis{width:auto!important;max-width:100%!important;min-width:0!important}
.cafeT .grid2>.vis{margin-top:26px!important}
.cafeT .seal{position:static!important;display:block!important;inset:auto!important;margin:0 auto 16px!important;width:66px!important;height:auto!important;transform:none!important;animation:none!important;opacity:.97}
.cafeT .grid2>.up{text-align:center}
.cafeT .kick{display:block;font-size:11px!important;letter-spacing:1.2px!important;line-height:1.45!important;margin-bottom:12px!important;opacity:.9}
.cafeT h3{font-size:clamp(27px,7.6vw,34px)!important;line-height:1.06!important;margin-bottom:12px!important}
.cafeT p{font-size:14px!important;line-height:1.55!important;margin-bottom:0!important}
.cafeT .chips{flex-wrap:nowrap!important;overflow-x:auto;gap:8px!important;margin:18px -20px 22px!important;padding:0 20px 2px!important;justify-content:flex-start;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.cafeT .chips::-webkit-scrollbar{display:none}
.cafeT .chips span{flex:0 0 auto;white-space:nowrap;font-size:12.5px!important}
.cafeT .btn-cafe,.cafeT .btn-cafe-alt,.cafeT .cafe-fp{width:100%!important;justify-content:center!important;display:flex!important;align-items:center;text-align:center}
.cafeT .cafe-fp{background:transparent!important;opacity:.85}

/* ---- 6. LOCATOR: tidy contact rows + CTA layout ---- */
.l2row{padding:14px!important}
.l2row .v{font-size:13.5px!important}
.loc2-cta{display:grid!important;grid-template-columns:1fr 1fr!important;gap:10px!important;margin-top:12px!important}
.loc2-cta .btn{grid-column:1 / -1;width:100%!important;justify-content:center!important}
.loc2-cta .l2wa,.loc2-cta .l2call{width:100%!important;justify-content:center!important;padding:13px 16px!important;font-size:14.5px!important}

/* ---- 7. PARTNERS: compact 3-col logo grid ---- */
.plogos{display:grid!important;grid-template-columns:repeat(3,1fr)!important;gap:10px!important;justify-content:stretch!important}
.plogo{width:auto!important;height:auto!important;aspect-ratio:16/11!important;padding:12px!important;border-radius:14px!important}
.plogo img{max-height:40px!important;max-width:100%!important}

/* ---- global premium polish ---- */
h2,h3{letter-spacing:-.02em}
.shead h2,.ws-copy h2,.tech h2,.cafeT h3,.loc2-head h3,.film-head h3{line-height:1.06}
.btn{font-size:14.5px}
.chead h3,.shead h2{margin-bottom:2px}
}

/* ================ SITE-WIDE SUB-PAGE MOBILE PASS (v7) =================
   Sub-pages had no phone breakpoint (their CSS stopped at 920px), so card
   grids stayed 3-4 columns on a phone. This applies the same premium
   language as the homepage: swipe rails for cards that carry copy,
   2-col grids for short chips/tiles, single column for layout splits.   */
@media (max-width:840px){

/* ---- layout splits: always stack ---- */
.mk-page .hgrid,.mk-page .store,.mk-page .story,.mk-page .g2,.mk-page .split,
.mk-page .mcat,.mk-page .rev,.mk-page .app,.mk-page .why2,.mk-page .gap-grid,
.mk-page .layout,.mk-page .find{grid-template-columns:1fr!important}

/* ---- swipe rails: card groups that carry a description ---- */
.pg-impression .g4,.pg-reparation .g4,.pg-reparation .g3,
.pg-facture .g3,.pg-imp .feat,.pg-transfert .g3,
.pg-about .div5,.pg-about .commit,.pg-about .probs,
.pg-cafe .sanct,.pg-cafe .bridge,
.pg-workspace .g4,.pg-workspace .g3,.pg-workspace .stations{
  display:flex!important;flex-wrap:nowrap!important;grid-template-columns:none!important;
  overflow-x:auto;overflow-y:hidden;gap:14px!important;scroll-snap-type:x mandatory;
  -webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none;
  padding-bottom:10px!important}
.pg-impression .g4::-webkit-scrollbar,.pg-reparation .g4::-webkit-scrollbar,
.pg-reparation .g3::-webkit-scrollbar,
.pg-facture .g3::-webkit-scrollbar,.pg-imp .feat::-webkit-scrollbar,
.pg-transfert .g3::-webkit-scrollbar,.pg-about .div5::-webkit-scrollbar,
.pg-about .commit::-webkit-scrollbar,.pg-about .probs::-webkit-scrollbar,
.pg-cafe .sanct::-webkit-scrollbar,.pg-cafe .bridge::-webkit-scrollbar,
.pg-workspace .g4::-webkit-scrollbar,.pg-workspace .g3::-webkit-scrollbar,
.pg-workspace .stations::-webkit-scrollbar{display:none;height:0;width:0}

.pg-impression .g4>*,.pg-reparation .g4>*,.pg-reparation .g3>*,
.pg-facture .g3>*,.pg-imp .feat>*,.pg-transfert .g3>*,
.pg-about .div5>*,.pg-about .commit>*,.pg-about .probs>*,
.pg-cafe .sanct>*,.pg-cafe .bridge>*,
.pg-workspace .g4>*,.pg-workspace .g3>*,.pg-workspace .stations>*{
  flex:0 0 78%!important;width:78%!important;max-width:300px;min-width:0;
  scroll-snap-align:start}

/* CRITICAL: scroll-reveal children parked off-screen to the right never trigger
   their observer, so they'd stay invisible inside a rail. Force them visible. */
.pg-impression .g4>.reveal,.pg-reparation .g4>.reveal,.pg-reparation .g3>.reveal,
.pg-facture .g3>.reveal,.pg-imp .feat>.reveal,
.pg-transfert .g3>.reveal,.pg-about .div5>.reveal,.pg-about .commit>.reveal,
.pg-about .probs>.reveal,.pg-cafe .sanct>.reveal,.pg-cafe .bridge>.reveal,
.pg-workspace .g4>.reveal,.pg-workspace .g3>.reveal,.pg-workspace .stations>.reveal{
  opacity:1!important;transform:none!important}

/* ---- 2-col grids: short tiles, chips and photo pairs ---- */
.pg-reparation .rpromise,.pg-reparation .opts,.pg-reparation .rchips,
.pg-imp .uses,.pg-imp .rel,.pg-about .mgrid,.pg-about .mgal,
.pg-workspace .slots,.pg-workspace .stat-row,.pg-about .stat-row,
.pg-cafe .shakes,.pg-cafe .imgs,.pg-cafe .phones{
  display:grid!important;grid-template-columns:1fr 1fr!important;gap:10px!important;
  overflow:visible!important}
.pg-reparation .rpromise>*,.pg-reparation .opts>*,.pg-reparation .rchips>*,
.pg-imp .uses>*,.pg-imp .rel>*,.pg-about .mgrid>*,.pg-workspace .slots>*,
.pg-cafe .shakes>*{width:auto!important;min-width:0;justify-content:flex-start}
.pg-reparation .rchips>*,.pg-imp .uses>*,.pg-imp .rel>*{
  font-size:12px!important;padding:11px 12px!important;line-height:1.25;white-space:normal!important}
/* an odd last tile fills the row instead of leaving a gap */
.pg-about .mgrid>*:last-child:nth-child(odd),
.pg-imp .uses>*:last-child:nth-child(odd),
.pg-workspace .slots>*:last-child:nth-child(odd){grid-column:1 / -1}

/* ---- the 3-step process must stay readable in order: stack it ---- */
.pg-imp .g3,.pg-facture .steps,.pg-transfert .steps{
  display:grid!important;grid-template-columns:1fr!important;gap:12px!important}

/* ---- framed print gallery: same 3-col treatment as the homepage ---- */
.pg-impression .hgal{display:grid!important;grid-template-columns:repeat(3,1fr)!important;
  gap:18px 9px!important;overflow:visible!important}
.pg-impression .hgal>.art{width:auto!important;max-width:none!important;min-width:0;
  opacity:1!important;transform:none!important}
.pg-impression .hgal .frame{padding:5px!important;border-radius:2px!important;
  box-shadow:0 12px 20px -12px rgba(0,0,0,.55),inset 0 0 0 1px rgba(0,0,0,.18)!important}
.pg-impression .hgal .mat{padding:4px!important}
.pg-impression .hgal .ameta{display:block!important;padding-top:9px!important}
.pg-impression .hgal .aname{font-size:11.5px!important;line-height:1.25;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:2.5em}
.pg-impression .hgal .aartist{font-size:10px!important;display:block;opacity:.72}
.pg-impression .hgal .aprice{font-size:11px!important;display:block;margin-top:3px}

/* ---- footer info rows stack ---- */
.mk-page .info{display:grid!important;grid-template-columns:1fr!important;gap:10px!important}

/* ---- shared premium polish across every sub-page ---- */
.mk-page .hero h1{font-size:clamp(30px,8.4vw,40px)!important;line-height:1.05!important}
.mk-page .sec h2,.mk-page .shead h2{font-size:clamp(24px,6.8vw,31px)!important;line-height:1.07!important}
.mk-page .cta .btn,.mk-page .hero .btn{width:100%!important;justify-content:center!important}
.mk-page .hero .btn+.btn{margin-top:10px!important}
.mk-page .crumb{flex-wrap:wrap!important;font-size:12px!important}

/* before/after cards own a horizontal drag slider - a swipe rail would fight the gesture */
.pg-reparation .bagrid{display:grid!important;grid-template-columns:1fr!important;gap:16px!important;overflow:visible!important}
.pg-reparation .bagrid>*{width:auto!important;max-width:none!important;min-width:0}

/* ---- FINAL SUB-PAGE TWEAKS ---- */
/* 4 partner logos read better as a 2x2 than 3 + a lone orphan */
.pg-transfert .plogos{grid-template-columns:1fr 1fr!important}
/* an odd trailing stat fills its row rather than leaving a hole */
.pg-about .stat-row>*:last-child:nth-child(odd),.pg-workspace .stat-row>*:last-child:nth-child(odd){grid-column:1 / -1}
}

/* ================= PREMIUM DARK SERVICE + GALERIE (v11, mobile only) =================
   From the user's design reference: near-black sections, full-bleed photo cards with
   a dark gradient, a tinted icon chip, gold kicker, white pill CTA and carousel dots.
   Desktop is untouched - everything here is inside the 640px breakpoint.          */
.mk-dots{display:none}

@media (max-width:840px){

/* ---- the two service sections + the galerie go dark, so the already-dark
        .svc-banner above them flows into the cards as one premium block ---- */
.mk-sv,.mk-gal{background:#08090b!important}
.mk-sv .svc-banner,.mk-gal .svc-banner{margin-bottom:22px!important}

/* ================= SERVICE CARDS ================= */
.mk-sv .grid3{gap:12px!important;padding-bottom:4px!important}
.mk-sv .grid3>.scard{
  flex:0 0 84%!important;width:84%!important;max-width:320px;
  position:relative;aspect-ratio:3/4;border-radius:26px;overflow:hidden;
  background:#101216;border:1px solid rgba(255,255,255,.09);
  box-shadow:0 26px 44px -26px rgba(0,0,0,.9);
  display:block!important;padding:0!important}

/* photo fills the whole card instead of sitting in a band on top */
.mk-sv .grid3>.scard .simg{
  position:absolute!important;inset:0!important;aspect-ratio:auto!important;
  height:100%!important;width:100%!important;margin:0!important;border-radius:0!important;
  overflow:hidden}
.mk-sv .grid3>.scard .simg img{width:100%!important;height:100%!important;object-fit:cover!important;display:block}
.mk-sv .grid3>.scard .simg::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(6,7,9,.10) 0%,rgba(6,7,9,.34) 38%,rgba(6,7,9,.86) 72%,rgba(6,7,9,.97) 100%)}

/* tinted icon chip, top-left */
.mk-sv .grid3>.scard::before{
  content:"";position:absolute;z-index:3;top:16px;left:16px;width:50px;height:50px;
  border-radius:15px;background:var(--mkAccBg,rgba(247,161,43,.22));
  border:1px solid var(--mkAccBd,rgba(247,161,43,.42));
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  background-repeat:no-repeat;background-position:center;background-size:23px 23px;
  box-shadow:0 8px 20px -8px rgba(0,0,0,.7)}

.mk-sv .grid3>.scard .sbody{
  position:absolute!important;left:0;right:0;bottom:0;z-index:3;
  padding:0 20px 20px!important;background:none!important;text-align:left}
.mk-sv .grid3>.scard .sbody h4{
  color:#fff!important;font-size:24px!important;line-height:1.08!important;
  letter-spacing:-.02em;margin:0 0 9px!important}
.mk-sv .grid3>.scard .sbody p{
  color:rgba(255,255,255,.74)!important;font-size:13.5px!important;line-height:1.5!important;
  margin:0 0 16px!important;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}

/* white pill CTA, exactly like the reference */
.mk-sv .grid3>.scard .sbody .btn{
  display:inline-flex!important;align-items:center;gap:9px;
  background:#fff!important;color:#0a0c10!important;border:0!important;
  padding:12px 22px!important;border-radius:100px!important;
  font-size:14.5px!important;font-weight:600;box-shadow:0 10px 24px -12px rgba(0,0,0,.8);
  width:auto!important;justify-content:flex-start!important}
.mk-sv .grid3>.scard .sbody .btn .arw{color:#0a0c10!important}

/* per-card accent + icon (services: transfert / impression / facture) */
.mk-sv .grid3>.scard:nth-child(3n+1){--mkAccBg:rgba(247,161,43,.24);--mkAccBd:rgba(247,161,43,.45)}
.mk-sv .grid3>.scard:nth-child(3n+2){--mkAccBg:rgba(74,125,255,.24);--mkAccBd:rgba(74,125,255,.45)}
.mk-sv .grid3>.scard:nth-child(3n+3){--mkAccBg:rgba(19,190,109,.24);--mkAccBd:rgba(19,190,109,.45)}

#services .grid3>.scard:nth-child(3n+1)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 8h13M14 5l3 3-3 3M20 16H7M10 13l-3 3 3 3'/%3E%3C/svg%3E")}
#services .grid3>.scard:nth-child(3n+2)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 9V4h10v5M7 18H5.5A1.5 1.5 0 0 1 4 16.5v-4A1.5 1.5 0 0 1 5.5 11h13a1.5 1.5 0 0 1 1.5 1.5v4a1.5 1.5 0 0 1-1.5 1.5H17M7 15h10v5H7z'/%3E%3C/svg%3E")}
#services .grid3>.scard:nth-child(3n+3)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 3h12v18l-3-2-3 2-3-2-3 2V3z'/%3E%3Cpath d='M9.5 8h5M9.5 12h5'/%3E%3C/svg%3E")}

/* impression section: copy / photo / galerie */
.mk-sv:not(#services) .grid3>.scard:nth-child(3n+1)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 3h9a2 2 0 0 1 2 2v9'/%3E%3Crect x='4' y='7' width='12' height='14' rx='2'/%3E%3C/svg%3E")}
.mk-sv:not(#services) .grid3>.scard:nth-child(3n+2)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='14' rx='2'/%3E%3Ccircle cx='8.5' cy='10' r='1.6'/%3E%3Cpath d='M21 15.5L16 10.5 5.5 19'/%3E%3C/svg%3E")}
.mk-sv:not(#services) .grid3>.scard:nth-child(3n+3)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='18' height='18' rx='1.5'/%3E%3Crect x='7' y='7' width='10' height='10' rx='.6'/%3E%3C/svg%3E")}
.mk-sv:not(#services) .grid3>.scard:nth-child(3n+2){--mkAccBg:rgba(155,109,255,.24);--mkAccBd:rgba(155,109,255,.45)}
.mk-sv:not(#services) .grid3>.scard:nth-child(3n+3){--mkAccBg:rgba(232,184,75,.24);--mkAccBd:rgba(232,184,75,.45)}

/* ---- carousel dots (shared by service rails + the art carousel) ---- */
.mk-dots{display:flex;justify-content:center;gap:7px;margin:16px 0 0}
.mk-dots button{position:relative;width:22px;height:14px;padding:0;border:0;background:none;cursor:pointer}
.mk-dots button::after{
  content:"";position:absolute;left:50%;top:50%;width:20px;height:6px;border-radius:100px;
  background:rgba(255,255,255,.24);
  transform:translate(-50%,-50%) scaleX(.34);transform-origin:center;
  transition:transform .35s cubic-bezier(.22,.61,.36,1),background .35s}
.mk-dots button.on::after{
  transform:translate(-50%,-50%) scaleX(1);
  background:linear-gradient(90deg,var(--amber,#F7A12B),var(--orange,#F2890E))}

/* ================= GALERIE: featured carousel above the grid ================= */
.mk-artfeat{
  display:flex;flex-wrap:nowrap;gap:14px;overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;
  scrollbar-width:none;-ms-overflow-style:none;padding-bottom:2px}
.mk-artfeat::-webkit-scrollbar{display:none;height:0;width:0}
.mk-af{
  flex:0 0 87%;max-width:330px;scroll-snap-align:center;
  display:block;text-decoration:none;color:inherit;
  background:linear-gradient(180deg,#131418,#0d0e11);
  border:1px solid rgba(255,255,255,.09);border-radius:26px;padding:16px 16px 18px;
  box-shadow:0 30px 50px -28px rgba(0,0,0,.95)}
.mk-af-stage{
  background:radial-gradient(120% 90% at 50% 0%,rgba(232,184,75,.10),transparent 62%),#0a0b0e;
  border-radius:16px;padding:20px 22px;display:flex;justify-content:center}
/* ornate gold frame: layered gradients read as moulding at this size */
.mk-af-frame{
  position:relative;padding:9px;border-radius:3px;
  background:linear-gradient(135deg,#f2d894 0%,#c8a253 26%,#8f6f34 46%,#e6c87e 62%,#a5813d 82%,#d8b76a 100%);
  box-shadow:0 20px 34px -18px rgba(0,0,0,.9),inset 0 0 0 1px rgba(0,0,0,.32),inset 0 0 0 4px rgba(255,255,255,.10)}
.mk-af-mat{background:#fbfaf7;padding:9px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.08)}
.mk-af-mat img{display:block;width:100%;aspect-ratio:4/5;object-fit:cover}
.mk-af-meta{padding:16px 4px 0}
.mk-af-kick{
  display:block;color:#E8B84B;font-size:10.5px;font-weight:600;
  letter-spacing:1.9px;text-transform:uppercase;margin-bottom:7px}
.mk-af-name{
  color:#fff;font-family:'Clash Display',sans-serif;font-weight:600;
  font-size:23px;line-height:1.12;letter-spacing:-.02em;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.mk-af-row{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-top:8px}
.mk-af-artist{color:rgba(255,255,255,.55);font-size:13px}
.mk-af-price{color:#E8B84B;font-size:14px;font-weight:600;white-space:nowrap}
.mk-af-cta{
  display:flex;align-items:center;justify-content:center;gap:9px;
  margin-top:16px;background:#fff;color:#0a0c10;
  padding:13px 22px;border-radius:100px;font-size:14.5px;font-weight:600}
.mk-af-cta .arw{color:#0a0c10}

/* divider that introduces the full grid underneath */
.mk-allprints{
  display:flex;align-items:center;gap:14px;margin:30px 0 18px;
  color:rgba(255,255,255,.42);font-size:11px;font-weight:600;
  letter-spacing:2px;text-transform:uppercase}
.mk-allprints::before,.mk-allprints::after{
  content:"";flex:1;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.16),transparent)}

/* the 3-col grid below now sits on a dark background */
.mk-gal .ggrid .aname{color:#fff!important}
.mk-gal .ggrid .aartist{color:rgba(255,255,255,.5)!important}
.mk-gal .ggrid .aprice{color:#E8B84B!important}
.mk-gal .ggrid .abm{color:rgba(255,255,255,.35)!important}
.mk-gal .ggrid .art .frame{
  box-shadow:0 14px 24px -12px rgba(0,0,0,.95),inset 0 0 0 1px rgba(0,0,0,.3)!important}

/* ---- EDITORIAL PHOTO SWAP (mobile only) ----
   3 of the 6 service cards shipped flat icon-illustrations drawn for small light
   thumbnails; full-bleed on a dark card they read as clip-art and the scrim has
   nothing to sit on. Swapped to the client's OWN existing photography via a
   background image so the <img> (and therefore desktop) is left untouched.  */
#services .grid3>.scard:nth-child(3n+1) .simg{background:url('/wp-content/uploads/mascot-hero/money-jump.jpg') center/cover no-repeat}
#services .grid3>.scard:nth-child(3n+2) .simg{background:url('/wp-content/uploads/mascot-hero/svc-cartes-visite.jpg') center/cover no-repeat}
.mk-sv:not(#services) .grid3>.scard:nth-child(3n+1) .simg{background:url('/wp-content/uploads/mascot-hero/svc-id-photos.jpg') center 42%/cover no-repeat}
#services .grid3>.scard:nth-child(3n+1) .simg img,
#services .grid3>.scard:nth-child(3n+2) .simg img,
.mk-sv:not(#services) .grid3>.scard:nth-child(3n+1) .simg img{opacity:0}
/* deepen the scrim so the title/description always clear the photo */
.mk-sv .grid3>.scard .simg::after{
  background:linear-gradient(180deg,rgba(6,7,9,.30) 0%,rgba(6,7,9,.12) 22%,rgba(6,7,9,.52) 48%,rgba(6,7,9,.90) 74%,rgba(6,7,9,.98) 100%)!important}
}

/* ============ v15: tighter banner chips + premium photo cards for
                 Réparation and Pourquoi Mascot (mobile only) ============ */
@media (max-width:840px){

/* ---- sub-banner chips: smaller, and every chip the same width so the
        third one sits directly under the first instead of spanning ---- */
.svc-banner .sb-chips{gap:8px!important;margin:14px 0 0!important}
.svc-banner .sb-chips span{
  font-size:11.5px!important;padding:8px 10px!important;line-height:1.25;
  letter-spacing:.1px;background:rgba(255,255,255,.10)!important;
  border-color:rgba(255,255,255,.18)!important}
.svc-banner .sb-chips span:last-child:nth-child(odd){grid-column:auto!important}
.svc-banner .sb-in>.btn{margin-top:20px!important}

/* ================= shared premium photo-card recipe =================
   .rcard and .why have no <img>, so the photo rides on ::before and the
   scrim on ::after; the card becomes a bottom-aligned flex column so the
   existing children stack at the base with no extra wrapper.          */
.dark-sec .rgrid>.rcard,
.why-grid>.why{
  position:relative!important;display:flex!important;flex-direction:column;
  justify-content:flex-end;flex:0 0 84%!important;width:84%!important;max-width:320px;
  aspect-ratio:3/4;border-radius:26px!important;overflow:hidden;
  padding:20px!important;background:#101216!important;
  border:1px solid rgba(255,255,255,.09)!important;
  box-shadow:0 26px 44px -26px rgba(0,0,0,.9)!important}
.dark-sec .rgrid>.rcard::before,
.why-grid>.why::before{
  content:"";position:absolute;inset:0;z-index:0;
  background-size:cover;background-position:center;background-repeat:no-repeat}
.dark-sec .rgrid>.rcard::after,
.why-grid>.why::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(6,7,9,.30) 0%,rgba(6,7,9,.12) 22%,rgba(6,7,9,.55) 48%,rgba(6,7,9,.91) 74%,rgba(6,7,9,.98) 100%)}
.dark-sec .rgrid>.rcard>*,
.why-grid>.why>*{position:relative;z-index:2}

/* icon -> tinted chip pinned top-left, matching the service cards */
.dark-sec .rgrid>.rcard .ric,
.why-grid>.why .wic{
  position:absolute!important;z-index:3;top:16px;left:16px;
  width:50px!important;height:50px!important;margin:0!important;
  border-radius:15px!important;display:flex!important;align-items:center;justify-content:center;
  background:var(--mkAccBg,rgba(247,161,43,.24))!important;
  border:1px solid var(--mkAccBd,rgba(247,161,43,.45))!important;
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  color:#fff!important;box-shadow:0 8px 20px -8px rgba(0,0,0,.7)}
.dark-sec .rgrid>.rcard .ric svg,
.why-grid>.why .wic svg{width:23px;height:23px;stroke:#fff}

/* typography on the photo */
.dark-sec .rgrid>.rcard h4,
.why-grid>.why h4{
  color:#fff!important;font-size:24px!important;line-height:1.08!important;
  letter-spacing:-.02em;margin:0 0 9px!important}
.dark-sec .rgrid>.rcard p,
.why-grid>.why p{
  color:rgba(255,255,255,.74)!important;font-size:13.5px!important;line-height:1.5!important;
  margin:0!important;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
/* "01 · Confiance" becomes the gold kicker above the title */
.why-grid>.why .wn{
  color:#E8B84B!important;font-size:10.5px!important;font-weight:600!important;
  letter-spacing:1.9px!important;text-transform:uppercase;margin:0 0 7px!important}

/* CTA -> white pill */
.dark-sec .rgrid>.rcard .rbtn{
  display:inline-flex!important;align-items:center;gap:9px;align-self:flex-start;
  margin-top:16px!important;background:#fff!important;color:#0a0c10!important;
  border:0!important;padding:12px 22px!important;border-radius:100px!important;
  font-size:14.5px!important;font-weight:600;width:auto!important;
  box-shadow:0 10px 24px -12px rgba(0,0,0,.8)}
.dark-sec .rgrid>.rcard .rbtn .arw{color:#0a0c10!important}

/* per-card accent, reusing the existing .green/.blue and .g/.b modifiers */
.dark-sec .rgrid>.rcard.green,.why-grid>.why.g{--mkAccBg:rgba(19,190,109,.26);--mkAccBd:rgba(19,190,109,.48)}
.dark-sec .rgrid>.rcard.blue,.why-grid>.why.b{--mkAccBg:rgba(74,125,255,.26);--mkAccBd:rgba(74,125,255,.48)}

/* photography (Mascot's own shots) */
.dark-sec .rgrid>.rcard:nth-child(3n+1)::before{background-image:url('/wp-content/uploads/mascot-hero/repair-car-1.jpg')}
.dark-sec .rgrid>.rcard:nth-child(3n+2)::before{background-image:url('/wp-content/uploads/mascot-hero/repair-ecran-casse.jpg')}
.dark-sec .rgrid>.rcard:nth-child(3n+3)::before{background-image:url('/wp-content/uploads/mascot-hero/repair-sub-4.jpg')}
.why-grid>.why:nth-child(3n+1)::before{background-image:url('/wp-content/uploads/mascot-hero/contact.jpg')}
.why-grid>.why:nth-child(3n+2)::before{background-image:url('/wp-content/uploads/mascot-hero/learn-laptop.jpg')}
.why-grid>.why:nth-child(3n+3)::before{background-image:url('/wp-content/uploads/mascot-hero/kids-community.jpg')}

/* the base .rcard gives its <p> flex-grow:1 to equalise heights in the desktop grid;
   inside the bottom-aligned photo card that stretches the copy and pins the title
   to the top, colliding with the icon chip. Pin every child to its natural size. */
.dark-sec .rgrid>.rcard>*,.why-grid>.why>*{flex:0 0 auto!important;/*mkstack*/}
}

/* ============ v17: signup offer card + locator cleanup (mobile only) ============ */
@media (max-width:840px){

/* ---------------- 1. SIGN-UP -> premium offer card ----------------
   BUG: the base overlay is a 90deg (left-to-right) scrim built for the
   desktop two-column layout. On mobile the copy is centred over the whole
   photo, so at 32-66% opacity the faces punch through the headline.
   Replaced with the same vertical scrim the service cards use.        */
.mk-su{background:#08090b!important}
.mk-su .signup{
  border:1px solid rgba(255,255,255,.09)!important;
  box-shadow:0 26px 44px -26px rgba(0,0,0,.9)!important;
  padding:32px 22px 30px!important}
.mk-su .signup img{object-position:center 30%!important}
.mk-su .signup::after{
  /* the service cards put copy only at the base, so a bottom-weighted scrim works
     there. Here the copy fills the whole card, so the overlay has to be heavy and
     even — the photo becomes texture rather than a competing subject. */
  background:linear-gradient(180deg,rgba(6,7,9,.82) 0%,rgba(6,7,9,.72) 38%,rgba(6,7,9,.86) 72%,rgba(6,7,9,.95) 100%)!important}
.mk-su .su-in{position:relative;z-index:2}

/* the offer itself, dramatised as a gold badge above the headline */
.mk-su .su-in::before{
  content:"−10%";display:flex;align-items:center;justify-content:center;
  width:max-content;margin:0 auto 14px;padding:7px 16px;border-radius:100px;
  background:linear-gradient(135deg,var(--amber,#F7A12B),var(--orange,#F2890E));
  color:#12100a;font-family:'Clash Display',sans-serif;font-weight:700;
  font-size:19px;line-height:1;letter-spacing:-.02em;
  box-shadow:0 10px 26px -10px rgba(242,137,14,.85)}

.mk-su .signup h3{font-size:clamp(24px,6.6vw,30px)!important;line-height:1.08!important;margin-bottom:10px!important}
.mk-su .signup p{font-size:13.5px!important;line-height:1.5!important;margin-bottom:18px!important;color:rgba(255,255,255,.76)!important}
.mk-su .su-form{gap:9px!important}
.mk-su .su-form input{
  height:50px!important;font-size:14.5px!important;padding:0 20px!important;
  background:rgba(255,255,255,.96)!important;border:0!important}
/* white pill CTA, matching every other card on the page */
.mk-su .su-form button{
  background:#fff!important;background-image:none!important;color:#0a0c10!important;
  border:0!important;height:50px!important;font-size:15px!important;font-weight:600!important;
  box-shadow:0 10px 24px -12px rgba(0,0,0,.8)!important}
.mk-su .su-note{font-size:11.5px!important;opacity:.62;margin-top:12px!important}

/* ---------------- 2. MAP block ----------------
   BUG: .loc2-hint overflowed its box (400px of text in 358px) so it read
   "…couleurs…", and the hidden ending was "au survol" — hover, which does
   not exist on a phone. It also sat on top of Google's attribution strip.
   Google's own attribution is left untouched (required by their terms).  */
.loc2-hint{display:none!important}
/* the invert/desaturate treatment is a hover affordance; on touch it just
   leaves the map looking muddy grey, so show it in full colour */
.loc2-map iframe{filter:none!important}
/* the iframe is absolutely positioned inside .loc2-map, which carries a hard
   min-height:430px — so the CONTAINER must be resized, not the iframe, or the
   shrunken iframe just leaves a black gap below it. */
.loc2-map{height:340px!important;min-height:0!important}
.loc2-map iframe{height:100%!important;min-height:0!important}

/* ---------------- 3. CONTACT rows -> compact grid ----------------
   Four identical 72px rows (288px total) become a tighter 2-col block:
   Adresse full width, Téléphone + Horaires paired, Email full width.
   `order` re-sequences them without touching the DOM.                  */
.loc2-info{
  display:grid!important;grid-template-columns:1fr 1fr!important;
  gap:9px!important;align-items:stretch}
/* full-width rows keep the icon BESIDE the text (compact); only the narrow
   half-width tiles stack it above, where a row would not fit. */
.loc2-info .l2row{
  display:flex!important;flex-direction:row;align-items:center;
  gap:11px!important;padding:11px 13px!important;min-width:0;margin:0!important}
.loc2-info .l2row[data-mk-row="2"],.loc2-info .l2row[data-mk-row="4"]{
  flex-direction:column;align-items:flex-start;gap:8px!important}
.loc2-info .l2row[data-mk-row="1"]{grid-column:1 / -1;order:1}  /* Adresse   */
.loc2-info .l2row[data-mk-row="2"]{order:2}                      /* Téléphone */
.loc2-info .l2row[data-mk-row="4"]{order:3}                      /* Horaires  */
.loc2-info .l2row[data-mk-row="3"]{grid-column:1 / -1;order:4}   /* Email     */
/* the CTA block also lives inside .loc2-info — keep it full width, last */
.loc2-info .loc2-cta{grid-column:1 / -1!important;order:9;margin-top:4px!important}
.loc2-info .l2row .lic2{
  width:36px!important;height:36px!important;border-radius:11px!important;flex:none}
.loc2-info .l2row .lic2 svg{width:17px;height:17px}
.loc2-info .l2row>div{min-width:0;width:100%}
.loc2-info .l2row b{font-size:9.5px!important;letter-spacing:1.4px!important}
.loc2-info .l2row .v{
  font-size:12.5px!important;line-height:1.35!important;display:block;
  overflow-wrap:anywhere;word-break:break-word}

/* the open/closed badge is promoted out of the map overlay (moved by
   mk-mobile.js) and becomes the headline fact of the contact block */
.loc2-info #locBadge{
  grid-column:1 / -1!important;order:0;
  display:flex!important;align-items:center;justify-content:center;gap:10px;
  margin:0 0 3px!important;padding:13px 16px!important;border-radius:100px!important;
  background:rgba(19,190,109,.13)!important;border:1px solid rgba(19,190,109,.34)!important;
  color:#fff!important;font-size:13.5px!important;font-weight:600!important;
  position:static!important;inset:auto!important;transform:none!important}
.loc2-info #locBadge .dot{width:9px;height:9px;border-radius:50%;background:#13BE6D;flex:none;
  box-shadow:0 0 0 4px rgba(19,190,109,.18)}
.loc2-info #locBadge.closed{
  background:rgba(255,92,80,.13)!important;border-color:rgba(255,92,80,.34)!important}
.loc2-info #locBadge.closed .dot{background:#FF5C50;box-shadow:0 0 0 4px rgba(255,92,80,.18)}
}

/* ============ v22: Apple-style CENTRED LOOP CAROUSELS + hero CTA pills ============
   Reference: the apple.com mobile shelf - one card centred, its neighbours
   peeking at both screen edges, and a scroll that never runs out (mk-mobile.js
   clones whole sets so the rail wraps around seamlessly). Mobile only.

   NOTE: the per-card icon / accent / photograph rules above key off
   :nth-child(3n+k), NOT :nth-child(k) - the JS clones the set, so the index
   has to repeat every 3 cards or every clone would take card 1's artwork. */
@media (max-width:840px){

/* ---- shared centred rail: full-bleed so the peeks reach the screen edge ---- */
.mk-sv .grid3,
.dark-sec .rgrid,
.why-grid,
.mk-artfeat{
  box-sizing:border-box!important;
  margin-left:calc(50% - 50vw)!important;margin-right:calc(50% - 50vw)!important;
  width:100vw!important;max-width:100vw!important;
  padding-left:11vw!important;padding-right:11vw!important;
  gap:10px!important;
  scroll-snap-type:x mandatory!important;
  overscroll-behavior-x:contain;
  scroll-behavior:auto}

/* the centred card is 78vw, leaving 11vw of the neighbour showing each side */
.mk-sv .grid3>.scard,
.dark-sec .rgrid>.rcard,
.why-grid>.why,
.mk-artfeat>.mk-af{
  scroll-snap-align:center!important;
  flex:0 0 78vw!important;width:78vw!important;max-width:78vw!important;
  opacity:1!important;transform:none!important}

/* services only: the user asked for bigger cards - taller, not wider */
.mk-sv .grid3>.scard{aspect-ratio:2/3!important}

/* ---- dots need a dark-on-light variant for the (light) Pourquoi Mascot band ---- */
.mk-dots.lt button::after{background:rgba(10,12,16,.18)}
.mk-dots.lt button.on::after{background:linear-gradient(90deg,var(--amber,#F7A12B),var(--orange,#F2890E))}
.why-grid+.mk-dots{margin-top:18px}

/* ---- HERO: two glass pills side by side, in the contact block's language ----
   They were full-width and stacked (.mk-page .hero .btn rule above). The grid
   plus margin:0 overrides that; higher specificity beats the !important there. */
.pg-home .hero .cta-row{
  display:grid!important;grid-template-columns:1fr 1fr!important;
  gap:10px!important;width:100%!important;align-items:stretch}
.pg-home .hero .cta-row .btn{
  width:100%!important;margin:0!important;
  display:inline-flex!important;align-items:center;justify-content:center;gap:8px;
  padding:14px 12px!important;border-radius:100px!important;
  font-size:14.5px!important;font-weight:600!important;
  letter-spacing:-.01em;white-space:nowrap;
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  transition:transform .3s ease,background .3s}
.pg-home .hero .cta-row .btn-primary{
  background:rgba(242,137,14,.18)!important;background-image:none!important;
  color:#FFC46B!important;border:1px solid rgba(247,161,43,.45)!important;
  box-shadow:none!important;text-shadow:none}
.pg-home .hero .cta-row .btn-ghost{
  background:rgba(255,255,255,.08)!important;color:#fff!important;
  border:1px solid rgba(255,255,255,.22)!important;box-shadow:none!important}
.pg-home .hero .cta-row .btn .arw{margin:0!important}
}
/* ============ v23: HERO IMAGE SHARPNESS on mobile ============
   The hero looked pixelated on a phone. Two compounding causes, neither of
   them the images on disk (those are 2600x1733):

   1. The Hostinger CDN caps served images at 1600px WIDE. For a landscape
      3:2 photo that drags the HEIGHT down to 1066px - and a portrait phone
      hero crops to height, so height is the dimension that matters.
   2. .kb is inset:-7% (114% of the hero) and kbA zooms it to scale(1.19),
      so at peak the photo is magnified 1.14 x 1.19 = 1.36x on top of that.

   844px of hero x 1.36 x dpr2 = ~2290 device px demanded from a 1066px
   source: a 2.15x upscale. Fix is both halves:

   a) '-m' crops: full original HEIGHT, cropped to 1560px wide so they slip
      UNDER the CDN's 1600px cap untouched (1560x1733 instead of 1600x1066).
      Nothing visible is lost - at 390px the hero only ever showed the middle
      ~31% of the frame anyway; the crop just discards what was off-screen.
   b) a gentler Ken Burns on phones (inset -3%, scale 1.02 -> 1.07), so the
      zoom stops multiplying whatever softness is left.

   Now ~1914 device px demanded from 1733 = 1.10x. Desktop keeps the full
   landscape files and the original 1.19 zoom - both halves are inside the
   640px breakpoint, and @keyframes may be redefined inside @media.        */
@media (max-width:840px){

.hero .slide .kb{inset:-3%!important;transform:scale(1.02)}
@keyframes kbA{from{transform:scale(1.02) translate(0,0)}  to{transform:scale(1.07) translate(-1.2%,-.8%)}}
@keyframes kbB{from{transform:scale(1.07) translate(1.2%,.6%)}to{transform:scale(1.02) translate(0,0)}}
@keyframes kbC{from{transform:scale(1.03) translate(.8%,-.3%)}to{transform:scale(1.07) translate(-.8%,-.6%)}}

/* the slide backgrounds are INLINE styles, so these need !important */
.hero .slides>.slide:nth-child(1) .kb{background-image:url('/wp-content/uploads/mascot-hero/celebrations-m.jpg')!important}
.hero .slides>.slide:nth-child(2) .kb{background-image:url('/wp-content/uploads/mascot-hero/learn-laptop-m.jpg')!important}
.hero .slides>.slide:nth-child(3) .kb{background-image:url('/wp-content/uploads/mascot-hero/hero-kids-m.jpg')!important}
.hero .slides>.slide:nth-child(4) .kb{background-image:url('/wp-content/uploads/mascot-hero/contact-m.jpg')!important}
.hero .slides>.slide:nth-child(5) .kb{background-image:url('/wp-content/uploads/mascot-hero/kids-community-m.jpg')!important}
.hero .slides>.slide:nth-child(6) .kb{background-image:url('/wp-content/uploads/mascot-hero/basilica-m.jpg')!important}
}
/* ============ v24: SUB-BANNER PHOTO AS BACKGROUND (mobile only) ============
   The .sb-media block sat BELOW the copy as a separate 153px card (+16px gap),
   which cluttered the banner and pushed the service cards down. Per the user's
   annotations it becomes the banner's own background instead - the same
   treatment as the sign-up card - keeping the dark theme and each banner's
   accent identity. 4 banners x 169px = ~676px removed.

   The markup already supports this: .svc-banner is position:relative +
   overflow:hidden + isolation:isolate, so .sb-media only has to go absolute
   behind the copy. No HTML edit, no JS (except moving the repair caption).

   SCRIM: the copy fills the WHOLE banner, so this needs a heavy EVEN scrim,
   not the bottom-weighted one the photo CARDS use - same lesson as the v17
   sign-up card, where a bottom-weighted overlay let faces punch through the
   headline.                                                                */
@media (max-width:840px){

/* ---- photo -> full-bleed background ---- */
.svc-banner .sb-media{
  position:absolute!important;inset:0!important;z-index:0!important;
  width:auto!important;height:auto!important;aspect-ratio:auto!important;
  border:0!important;border-radius:0!important;box-shadow:none!important;
  margin:0!important;overflow:hidden!important}
.svc-banner .sb-media>img,
.svc-banner .sb-media .rpc-slide img{
  width:100%!important;height:100%!important;object-fit:cover!important;filter:none!important}
.svc-banner .sb-media .rpc-dots{display:none!important}

/* ---- THE SCRIM HAS TO LIVE INSIDE .sb-inner ----
   .sb-media is a child of .sb-inner, NOT of .svc-banner, and .sb-inner carries
   z-index:3 - its own stacking context. So .svc-banner::before (z1) paints
   BELOW the whole .sb-inner subtree, photo included, and can never scrim it:
   the first attempt left faces punching through the headline. The scrim must
   sit between the photo and the copy INSIDE that context, so it rides on
   .sb-media::after (above the img, below .sb-in's z-index:2).
   Even, not bottom-weighted - the copy fills the whole banner.          */
.svc-banner .sb-media::after,
.svc-banner .sb-media.rpc::after{
  content:""!important;display:block!important;position:absolute!important;
  inset:0!important;z-index:2!important;pointer-events:none;
  background:
    radial-gradient(620px 380px at 84% 6%,var(--accW),transparent 62%),
    linear-gradient(180deg,rgba(6,7,9,.88) 0%,rgba(6,7,9,.80) 32%,rgba(6,7,9,.90) 70%,rgba(6,7,9,.97) 100%)!important}
.svc-banner .sb-inner{z-index:3!important;padding:30px 20px 30px!important}
.svc-banner{min-height:0!important}

/* the Galerie painting is the highest-contrast of the four - heavier scrim */
.mk-gal .svc-banner .sb-media::after{
  background:
    radial-gradient(620px 380px at 84% 6%,var(--accW),transparent 62%),
    linear-gradient(180deg,rgba(6,7,9,.93) 0%,rgba(6,7,9,.88) 32%,rgba(6,7,9,.93) 70%,rgba(6,7,9,.98) 100%)!important}

/* ---- Impression: shipped art is flat clip-art on WHITE and cannot work as a
        full-bleed background. Swap to a real photo mobile-only, via background,
        so the <img> src (and therefore desktop) is untouched.
        NOT svc-cartes-visite.jpg: that is a STOCK TEMPLATE MOCKUP carrying a
        fictitious French estate agent (DUPONT Marc / agenceimmo.fr / Nice).
        Illegible on the small service card, but readable full-bleed.   ---- */
.mk-sv:not(#services) .svc-banner .sb-media{
  background:url('/wp-content/uploads/mascot-hero/print-photo.jpg') center 45%/cover no-repeat!important}
.mk-sv:not(#services) .svc-banner .sb-media>img{opacity:0!important}

/* ---- Reparation: the rotating caption is real content, so mk-mobile.js moves
        .rpc-caps out of the photo and into the copy, under the chips. It was
        absolutely positioned inside .sb-media; reset it for its new home. ---- */
.svc-banner .sb-in .rpc-caps{
  position:relative!important;left:auto!important;right:auto!important;bottom:auto!important;
  height:18px!important;margin:14px 0 0!important;z-index:auto!important}
.svc-banner .sb-in .rpc-cap{
  left:0!important;bottom:auto!important;top:0!important;
  font-size:12.5px!important;font-weight:500!important;
  color:rgba(255,255,255,.80)!important;text-shadow:none!important}
}
/* ============ v27: DOM left behind when the viewport crosses 640px ============
   mk-mobile.js builds the carousels ONCE, at load, and only if the viewport is
   <=640px: it clones whole card sets, injects the galerie carousel and moves
   the reparation caption. If the viewport then GROWS past 640 WITHOUT a reload
   - phone rotated to landscape (844x390), a foldable opening, a desktop window
   dragged wider - the mobile CSS switches off but that injected DOM stays.
   The clones fall out of their rail into the desktop grid: 15 service cards
   instead of 3, 15 repair cards, 12 galerie cards, and the homepage goes from
   15,046px to 37,935px.

   Fix is CSS rather than JS teardown: neutralise the injected DOM above the
   breakpoint. It is instant, needs no reload, and rotating BACK to portrait
   simply re-shows everything - mkCarousel's own resize handler re-measures and
   re-centres the rail.

   RULE: any JS that injects DOM behind a media query must also define what that
   DOM does on the OTHER side of the query. A one-shot builder is not enough. */
@media (min-width:841px){
  [data-mk-clone]{display:none!important}
  /* v76: the homepage now shows this carousel on desktop too, so the hide is
     scoped to every OTHER page. Enabling another surface is a one-line edit. */
  /* v95: /service-dimpression joins the homepage in showing this on desktop.
     Everything else still hides it - one class per surface, as designed in v76. */
  /* v96: /mascot-galerie joins the homepage and the print page. The guard now
     lists every surface that OPTS OUT rather than in - if a new page ever builds
     this carousel it stays hidden on desktop until deliberately enabled. */
  body:not(.pg-home):not(.pg-impression):not(.pg-gal) .mk-artfeat,
  body:not(.pg-home):not(.pg-impression):not(.pg-gal) .mk-allprints{display:none!important}
  .svc-banner .sb-in .rpc-caps{display:none!important}
}
/* ============ v28: BREAKPOINT 640px -> 840px, so tablets get the premium
                    mobile design too (user request) ============
   Every mk-mobile query moved to max-width:840px and mk-mobile.js's matchMedia
   with it. But the carousel sizing was written in vw for a 390px phone, and vw
   does not survive the trip to a tablet: at 840px a card would be 78vw = 655px
   wide and, at aspect-ratio 2/3, 983px TALL. So the widths are now clamped and
   the centring padding is derived from the clamped width instead of a fixed
   11vw - that keeps the card exactly centred at every width.
     390px -> 304px card, 43px peek each side (identical to before)
     768px -> 470px card, 149px peek
     840px -> 470px card, 185px peek                                        */
@media (max-width:840px){

.mk-sv .grid3>.scard,
.dark-sec .rgrid>.rcard,
.why-grid>.why,
.mk-artfeat>.mk-af{
  flex:0 0 clamp(280px,78vw,470px)!important;
  width:clamp(280px,78vw,470px)!important;
  max-width:clamp(280px,78vw,470px)!important}
.mk-sv .grid3,
.dark-sec .rgrid,
.why-grid,
.mk-artfeat{
  padding-left:calc((100vw - clamp(280px,78vw,470px))/2)!important;
  padding-right:calc((100vw - clamp(280px,78vw,470px))/2)!important}

/* the base sheet only collapses the banner to one column at <=760px, so between
   761 and 840 the copy would sit in a half-width grid track with the photo now
   absolutely positioned out of the flow. Force one column across the range. */
.svc-banner .sb-inner{grid-template-columns:1fr!important}
}

/* ---- tablet-only refinements (641-840px) ---- */
@media (min-width:641px) and (max-width:840px){
  /* there are exactly 3 chips per banner - one clean row at this width */
  .svc-banner .sb-chips{grid-template-columns:repeat(3,1fr)!important}
  .svc-banner .sb-inner{padding:38px 34px!important}
  /* the hero copy is left-aligned; a full 840px button row looks unanchored */
  .pg-home .hero .cta-row{max-width:540px!important}
  .mk-su .signup{padding:40px 34px 38px!important}
}
/* ============ v29: A PROPOS card groups get the homepage carousel ============
   User marked four groups on /a-propos to match the Apple-style shelf: the
   "Cinq poles" tiles (.div5, 6 cards), "L'acces reste inegal" (.probs, 3),
   "Bati sur trois convictions" (.commit, 3) and the team cards (.team-grid, 2).
   v7 had already made the first three START-aligned rails capped at 300px;
   this converts them to the CENTRED loop treatment and adds .team-grid, which
   was still a full-width vertical stack.
   No nth-child conversion needed here - unlike the homepage cards, nothing on
   this page styles these children by index (the only nth-child rules are the
   .flag stripes), so cloning is safe as-is.                                */
@media (max-width:840px){

.pg-about .div5,
.pg-about .probs,
.pg-about .commit,
.pg-about .team-grid{
  display:flex!important;flex-wrap:nowrap!important;grid-template-columns:none!important;
  box-sizing:border-box!important;
  overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x mandatory!important;overscroll-behavior-x:contain;scroll-behavior:auto;
  -webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none;
  margin-left:calc(50% - 50vw)!important;margin-right:calc(50% - 50vw)!important;
  width:100vw!important;max-width:100vw!important;
  padding-left:calc((100vw - clamp(280px,78vw,470px))/2)!important;
  padding-right:calc((100vw - clamp(280px,78vw,470px))/2)!important;
  gap:10px!important;padding-bottom:10px!important;align-items:stretch!important}

.pg-about .div5::-webkit-scrollbar,
.pg-about .probs::-webkit-scrollbar,
.pg-about .commit::-webkit-scrollbar,
.pg-about .team-grid::-webkit-scrollbar{display:none;height:0;width:0}

.pg-about .div5>*,
.pg-about .probs>*,
.pg-about .commit>*,
.pg-about .team-grid>*{
  scroll-snap-align:center!important;
  flex:0 0 clamp(280px,78vw,470px)!important;
  width:clamp(280px,78vw,470px)!important;
  max-width:clamp(280px,78vw,470px)!important;
  min-width:0;margin:0!important;
  opacity:1!important;transform:none!important}
}
/* ============ v30: TECHNOLOGY CATEGORY PAGES - premium dark redesign ============
   /iphone /samsung-galaxy /google-pixel /android-phones /new-phones /macbooks
   /new-laptops /mascot-tablets /montres /consoles - all 16 render through
   mascot-category.php, so this styles them all at once. Mobile only (<=840px).

   The hero was already dark and cinematic; everything BELOW it was a white page
   with white cards, which is what broke the premium feel. This flips the body
   and the three content sections to the reference palette and rebuilds the
   product card as dark glass.

   The .mch-mq marquee is deliberately LEFT ALONE - the user singled it out as
   the one element unique to the brand. Only its spacing is touched.        */
@media (max-width:840px){

:root{--mkBg:#050505;--mkCard:#111111;--mkLine:rgba(255,255,255,.08);--mkGold:#D8A03D;--mkDim:#A8A8A8;--mkGreen:#32D17B}

/* ---- page goes dark ---- */
.pg-cat{background:var(--mkBg)!important;color:#fff!important}
.pg-cat .sec{background:transparent!important;padding:44px 0 8px!important}
.pg-cat .sec:last-of-type{padding-bottom:56px!important}
.pg-cat .wrap{padding-left:20px!important;padding-right:20px!important}
.pg-cat h2.sh{
  color:#fff!important;font-size:27px!important;line-height:1.08!important;
  letter-spacing:-.02em!important;margin:0 0 18px!important}

/* ---- hero: tighter, single primary CTA, marquee sits closer ---- */
.pg-cat .mch{background:var(--mkBg)!important}
.pg-cat .mch-in{padding-top:18px!important;padding-bottom:0!important}
/* CLASS COLLISION: .mch-p is used for BOTH the hero paragraph (<p>) and the
   primary CTA (<a>). Styling it flat turned the orange button's label grey on
   orange. Scope the copy rule to the element type, and pin the CTA's own ink. */
.pg-cat p.mch-p{font-size:15.5px!important;line-height:1.55!important;color:var(--mkDim)!important;
  max-width:34ch;margin-left:auto;margin-right:auto}
.pg-cat a.mch-p{color:#12100a!important;font-weight:700!important}
.pg-cat .mch-cta{gap:10px!important;margin-top:22px!important}
.pg-cat .mch-cta .btn,.pg-cat .mch-cta a{width:100%!important;justify-content:center!important}
/* the stat row was a 2+1 orphan block - one tidy row of three */
.pg-cat .mch-stats{
  display:grid!important;grid-template-columns:repeat(3,1fr)!important;
  gap:0!important;margin-top:26px!important;
  border-top:1px solid var(--mkLine);border-bottom:1px solid var(--mkLine);padding:16px 0!important}
.pg-cat .mch-stats div{align-items:center;text-align:center}
.pg-cat .mch-stats b{font-size:21px!important}
.pg-cat .mch-stats span{font-size:9.5px!important;letter-spacing:.14em!important;line-height:1.3}
.pg-cat .mch-mq{padding:22px 0 26px!important}

/* ---- category hubs: lime blocks -> dark glass cards with the real photo ---- */
.pg-cat .hubs{
  display:grid!important;grid-template-columns:1fr 1fr!important;gap:12px!important}
.pg-cat .hub{
  background:var(--mkCard)!important;border:1px solid var(--mkLine)!important;
  border-radius:22px!important;overflow:hidden!important;padding:0!important;
  box-shadow:0 18px 34px -22px rgba(0,0,0,.9)!important;
  opacity:1!important;transform:none!important}
.pg-cat .hub *{color:#fff!important}
.pg-cat .hub img{width:100%!important;aspect-ratio:4/3!important;object-fit:cover!important;display:block}
.pg-cat .hub b,.pg-cat .hub span,.pg-cat .hub div{padding:0 14px}
.pg-cat .hub b{display:block;font-size:15px!important;padding-top:13px!important;padding-bottom:13px!important}

/* ---- accessory pills -> glass ---- */
.pg-cat .pills{display:flex!important;flex-wrap:wrap!important;gap:9px!important}
.pg-cat .pills a,.pg-cat .pills span{
  background:rgba(255,255,255,.06)!important;color:#fff!important;
  border:1px solid var(--mkLine)!important;border-radius:100px!important;
  padding:11px 17px!important;font-size:13.5px!important;font-weight:600!important;
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}

/* ---- PRODUCT CARD -> dark glass, per the reference ---- */
.pg-cat .grid{display:grid!important;grid-template-columns:1fr 1fr!important;gap:12px!important}
.pg-cat .bc{
  background:var(--mkCard)!important;border:1px solid var(--mkLine)!important;
  border-radius:26px!important;overflow:hidden!important;box-shadow:0 20px 38px -24px rgba(0,0,0,.95)!important;
  display:flex!important;flex-direction:column!important;position:relative}
.pg-cat .bc-img{
  background:#fff!important;border:0!important;border-radius:0!important;
  aspect-ratio:1/1!important;padding:14px!important;display:grid;place-items:center}
.pg-cat .bc-img img{max-width:100%!important;max-height:100%!important;object-fit:contain!important}
.pg-cat .bc-badge{
  position:absolute!important;top:12px;left:12px;z-index:3;
  background:linear-gradient(135deg,var(--mkGold),#B8842B)!important;color:#12100a!important;
  border:0!important;border-radius:100px!important;
  font-size:10px!important;font-weight:700!important;letter-spacing:.09em;
  text-transform:uppercase;padding:6px 11px!important;
  box-shadow:0 8px 18px -8px rgba(216,160,61,.9)}
.pg-cat .bc-body{padding:14px 14px 16px!important;display:flex;flex-direction:column;gap:0}
.pg-cat .bc-name{
  color:#fff!important;font-size:15px!important;line-height:1.25!important;font-weight:600!important;
  letter-spacing:-.01em;margin:0 0 7px!important;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:2.5em}
/* the green "Reconditionne" line becomes a quiet condition chip */
.pg-cat .bc-rate{
  color:var(--mkDim)!important;font-size:11.5px!important;font-weight:500!important;
  margin:0 0 9px!important;display:flex;align-items:center;gap:5px}
.pg-cat .bc-price{
  color:#fff!important;font-family:'Clash Display',sans-serif;font-weight:600!important;
  font-size:19px!important;letter-spacing:-.02em;margin:0!important;
  display:flex;flex-wrap:wrap;align-items:baseline;gap:7px}
.pg-cat .bc-price del,.pg-cat .bc-price s{
  color:rgba(255,255,255,.36)!important;font-size:12.5px!important;font-weight:400!important;
  text-decoration:line-through}
.pg-cat .bc-price ins{text-decoration:none!important;color:#fff!important}
/* savings box -> green pill */
.pg-cat .bc-save,.pg-cat .bc-body .save,.pg-cat .bc-econ{
  background:rgba(50,209,123,.12)!important;color:var(--mkGreen)!important;
  border:1px solid rgba(50,209,123,.28)!important;border-radius:100px!important;
  font-size:11px!important;font-weight:600!important;padding:6px 11px!important;
  margin-top:10px!important;display:inline-flex!important;width:max-content;line-height:1.2}

/* scroll-reveal children inside the grid must not stay hidden */
.pg-cat .grid>.reveal,.pg-cat .hubs>.reveal{opacity:1!important;transform:none!important}

/* footer / breadcrumb legibility on the new dark page */
.pg-cat .crumb,.pg-cat .crumb a{color:rgba(255,255,255,.55)!important}
}
/* ============ v32: category hero render + badge card, category tiles,
                    single-file accessory pills (mobile only) ============ */
@media (max-width:840px){

/* ---- 1. HERO: floating product render + glass badge card ----
   The catalogue is photographed on WHITE, so a raw <img> on the dark hero would
   be a white rectangle. It sits on a soft plate with a gold ambient glow behind
   it instead - reads as an Apple-style product spotlight using real stock. */
.pg-cat .mch-shot{
  position:relative;margin:22px auto 0;width:min(74vw,300px);aspect-ratio:1/1;
  display:grid;place-items:center}
.pg-cat .mch-glow{
  position:absolute;inset:-14%;border-radius:50%;z-index:0;pointer-events:none;
  background:radial-gradient(circle at 50% 45%,rgba(216,160,61,.30),rgba(216,160,61,.10) 42%,transparent 70%);
  filter:blur(6px)}
.pg-cat .mch-shot img{
  position:relative;z-index:1;width:86%;height:86%;object-fit:contain;
  border-radius:26px;background:#fff;padding:12px;
  box-shadow:0 40px 70px -30px rgba(0,0,0,.95),0 0 0 1px rgba(255,255,255,.10)}

.pg-cat .mch-badges{
  display:grid!important;grid-template-columns:repeat(3,1fr);gap:0;
  margin:24px auto 0;max-width:360px;
  background:rgba(255,255,255,.05);border:1px solid var(--mkLine);
  border-radius:24px;padding:16px 6px;
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  box-shadow:0 22px 44px -28px rgba(0,0,0,.95)}
.pg-cat .mch-badge{display:flex;flex-direction:column;align-items:center;gap:5px;text-align:center;padding:0 4px}
.pg-cat .mch-badge svg{width:21px;height:21px;color:var(--mkGold)}
.pg-cat .mch-badge b{color:#fff;font-size:12.5px;font-weight:600;letter-spacing:-.01em}
.pg-cat .mch-badge span{color:var(--mkDim);font-size:11px}

/* the badge card now carries warranty + trust, so the old stat band is a
   duplicate; the reference layout drops it and the count already sits in the
   eyebrow pill above. */
.pg-cat .mch-stats{display:none!important}
/* eyebrow -> dark glass pill like the reference (was a gold outline) */
.pg-cat .mch-kick{
  background:rgba(255,255,255,.06)!important;border-color:var(--mkLine)!important;
  color:rgba(255,255,255,.82)!important;font-size:10.5px!important;letter-spacing:.16em!important;
  padding:9px 15px!important}
.pg-cat .mch-crumb{font-size:11.5px!important;opacity:.5}
/* one dominant CTA; the advice link becomes a quiet text link under it */
.pg-cat .mch-cta{flex-direction:column!important;align-items:stretch!important}
.pg-cat a.mch-g{
  background:transparent!important;border:0!important;color:var(--mkDim)!important;
  text-decoration:underline;text-underline-offset:4px;font-size:13.5px!important;padding:4px 0!important}

/* ---- 2. CATEGORY TILES: lime blocks -> dark glass, single scroll row ----
   The lime is an INLINE style on .tile, so it needs !important to unset. */
.pg-cat .hubs{
  display:flex!important;flex-wrap:nowrap!important;grid-template-columns:none!important;
  gap:10px!important;overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;
  scrollbar-width:none;-ms-overflow-style:none;
  margin-left:calc(50% - 50vw)!important;margin-right:calc(50% - 50vw)!important;
  width:100vw!important;max-width:100vw!important;
  padding:2px 20px 10px!important;box-sizing:border-box!important}
.pg-cat .hubs::-webkit-scrollbar{display:none;height:0}
.pg-cat .hub{
  flex:0 0 118px!important;width:118px!important;scroll-snap-align:start;
  background:rgba(255,255,255,.045)!important;border:1px solid var(--mkLine)!important;
  border-radius:24px!important;padding:16px 10px 13px!important;
  display:flex!important;flex-direction:column;align-items:center;gap:10px;
  text-align:center;box-shadow:none!important;
  opacity:1!important;transform:none!important}
.pg-cat .hub .tile{
  background:none!important;background-image:none!important;
  width:34px!important;height:44px!important;min-height:0!important;
  border:1.6px solid rgba(255,255,255,.34)!important;border-radius:7px!important;
  display:block!important;padding:0!important;position:relative}
.pg-cat .hub .tile::after{
  content:"";position:absolute;left:50%;top:4px;transform:translateX(-50%);
  width:12px;height:2.5px;border-radius:2px;background:rgba(255,255,255,.34)}
.pg-cat .hub .tile b{display:none!important}
.pg-cat .hub .lbl{
  color:#fff!important;font-size:12.5px!important;font-weight:600!important;
  line-height:1.2;padding:0!important;display:block}
/* first tile reads as the one you are on, per the reference */
.pg-cat .hub:first-child{border-color:rgba(216,160,61,.55)!important;background:rgba(216,160,61,.08)!important}
.pg-cat .hub:first-child .tile{border-color:var(--mkGold)!important}
.pg-cat .hub:first-child .tile::after{background:var(--mkGold)}

/* ---- 3. ACCESSORY PILLS: single file, edge to edge ---- */
.pg-cat .pills{
  display:flex!important;flex-wrap:nowrap!important;gap:9px!important;
  overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;
  scrollbar-width:none;-ms-overflow-style:none;
  margin-left:calc(50% - 50vw)!important;margin-right:calc(50% - 50vw)!important;
  width:100vw!important;max-width:100vw!important;
  padding:2px 20px 8px!important;box-sizing:border-box!important}
.pg-cat .pills::-webkit-scrollbar{display:none;height:0}
.pg-cat .pills a{flex:0 0 auto!important;white-space:nowrap!important;padding:10px 16px!important;font-size:13px!important}

/* tighten the run-in to the product grid so the sections read as one flow */
.pg-cat .sec{padding-top:38px!important}
}
/* ============ v33: cut-out hero render (transparent PNG) ============
   The catalogue is shot on white, so .mch-shot normally sits the photo on a
   white plate. Where a background-removed PNG exists (uploads/mascot-hero/cut/
   hero-cut-<term>.png, generated server-side with an edge-seeded Imagick flood
   fill) the device floats free, as in the reference. Drop the plate and let the
   gold glow read as the light source behind it.                            */
@media (max-width:840px){
.pg-cat .mch-shot.is-cut{width:min(82vw,330px);aspect-ratio:auto;min-height:240px}
.pg-cat .mch-shot.is-cut img{
  width:100%!important;height:auto!important;max-height:300px;
  object-fit:contain!important;
  background:none!important;padding:0!important;border-radius:0!important;
  box-shadow:none!important;
  filter:drop-shadow(0 26px 34px rgba(0,0,0,.85)) drop-shadow(0 4px 10px rgba(0,0,0,.55))}
.pg-cat .mch-shot.is-cut .mch-glow{
  inset:-8%;
  background:radial-gradient(circle at 50% 52%,rgba(216,160,61,.34),rgba(216,160,61,.12) 44%,transparent 72%);
  filter:blur(10px)}
}
/* ============ v34: WooCommerce screen-reader price text was VISIBLE ============
   Variable products ("iPhone 16 et 16 Plus", every Pixel, etc.) render as
     145 999 CFA - 185 999 CFA  +  <span class="screen-reader-text">Price range:
     145 999 CFA through 185 999 CFA</span>
   The self-rendering Mascot templates never shipped the visually-hidden rule
   for .screen-reader-text, so that accessibility string was painted on screen
   at the full 19px price size and blew the card open. Simple products were
   unaffected, which is why it only showed on ranges.

   Restore the STANDARD visually-hidden pattern - it must stay readable to
   screen readers, so display:none would be the wrong fix. Deliberately OUTSIDE
   the media query: the same text was leaking on desktop.                   */
.screen-reader-text{
  position:absolute!important;width:1px!important;height:1px!important;
  padding:0!important;margin:-1px!important;overflow:hidden!important;
  clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important;
  white-space:nowrap!important;border:0!important}
.screen-reader-text:focus{
  position:static!important;width:auto!important;height:auto!important;
  clip:auto!important;clip-path:none!important;margin:0!important}

@media (max-width:840px){
/* a price RANGE is twice the text of a single price - step it down so it sits on
   one or two tidy lines instead of towering over the rest of the card */
.pg-cat .bc-price:has([aria-hidden="true"]){font-size:15.5px!important;line-height:1.3!important}
.pg-cat .bc-price{overflow-wrap:anywhere}
}
/* ============ v35: WAVE 2 - featured carousel, why-buy, in-store, avis ============ */
@media (max-width:840px){

/* ---- shared full-bleed rail geometry, same as the homepage carousels ---- */
:is(.pg-cat,.pg-acc) .mfeat,:is(.pg-cat,.pg-acc) .mwhy,:is(.pg-cat,.pg-acc) .mrev{
  display:flex!important;flex-wrap:nowrap!important;box-sizing:border-box!important;
  overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;
  overscroll-behavior-x:contain;scroll-behavior:auto;-webkit-overflow-scrolling:touch;
  scrollbar-width:none;-ms-overflow-style:none;
  margin-left:calc(50% - 50vw)!important;margin-right:calc(50% - 50vw)!important;
  width:100vw!important;max-width:100vw!important;
  padding-left:calc((100vw - clamp(280px,78vw,470px))/2)!important;
  padding-right:calc((100vw - clamp(280px,78vw,470px))/2)!important;
  gap:10px!important;padding-bottom:10px!important;align-items:stretch}
:is(.pg-cat,.pg-acc) .mfeat::-webkit-scrollbar,:is(.pg-cat,.pg-acc) .mwhy::-webkit-scrollbar,:is(.pg-cat,.pg-acc) .mrev::-webkit-scrollbar{display:none;height:0}
:is(.pg-cat,.pg-acc) .mfc,:is(.pg-cat,.pg-acc) .mw,:is(.pg-cat,.pg-acc) .mr{
  scroll-snap-align:center!important;
  flex:0 0 clamp(280px,78vw,470px)!important;width:clamp(280px,78vw,470px)!important;
  min-width:0;opacity:1!important;transform:none!important}

/* ---- 1. featured product card ---- */
:is(.pg-cat,.pg-acc) .mfc{
  display:flex;flex-direction:column;text-decoration:none;
  background:var(--mkCard);border:1px solid var(--mkLine);border-radius:32px;overflow:hidden;
  box-shadow:0 26px 46px -28px rgba(0,0,0,.95)}
:is(.pg-cat,.pg-acc) .mfc-img{background:#fff;aspect-ratio:1/1;display:grid;place-items:center;padding:22px}
:is(.pg-cat,.pg-acc) .mfc-img img{max-width:100%;max-height:100%;object-fit:contain}
:is(.pg-cat,.pg-acc) .mfc-b{padding:18px 20px 22px;display:flex;flex-direction:column;gap:0;position:relative}
:is(.pg-cat,.pg-acc) .mfc-tag{
  position:absolute;top:-15px;right:20px;
  background:linear-gradient(135deg,var(--mkGold),#B8842B);color:#12100a;
  font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;
  padding:7px 13px;border-radius:100px;box-shadow:0 10px 22px -10px rgba(216,160,61,.9)}
:is(.pg-cat,.pg-acc) .mfc-n{color:#fff;font-size:21px;line-height:1.16;font-weight:600;letter-spacing:-.02em}
:is(.pg-cat,.pg-acc) .mfc-s{color:var(--mkDim);font-size:12.5px;margin-top:7px}
/* WooCommerce emits <del>old</del> <ins>new</ins>; the grid cards render current
   price first, so flip the order here to match rather than contradict them. */
:is(.pg-cat,.pg-acc) .mfc-p{color:#fff;font-family:'Clash Display',sans-serif;font-size:19px;font-weight:600;
  margin-top:11px;display:flex;flex-wrap:wrap;align-items:baseline;gap:8px}
:is(.pg-cat,.pg-acc) .mfc-p ins{order:1;text-decoration:none;color:#fff}
:is(.pg-cat,.pg-acc) .mfc-p>.amount{order:1}
:is(.pg-cat,.pg-acc) .mfc-p del{order:2;color:rgba(255,255,255,.34);font-size:13px;font-weight:400}
:is(.pg-cat,.pg-acc) .mfc-p .screen-reader-text{display:none}
:is(.pg-cat,.pg-acc) .mfc-cta{
  margin-top:16px;display:inline-flex;align-items:center;justify-content:center;gap:9px;
  background:#fff;color:#0a0c10;border-radius:100px;padding:13px 22px;
  font-size:14.5px;font-weight:600}
:is(.pg-cat,.pg-acc) .mfc-cta .arw{color:#0a0c10}

/* ---- 2. pourquoi mascot ---- */
:is(.pg-cat,.pg-acc) .mw{
  background:rgba(255,255,255,.045);border:1px solid var(--mkLine);border-radius:26px;
  padding:22px 20px 24px;display:flex;flex-direction:column}
:is(.pg-cat,.pg-acc) .mw-n{
  color:var(--mkGold);font-family:'Clash Display',sans-serif;font-size:13px;
  font-weight:600;letter-spacing:.14em;margin-bottom:12px}
:is(.pg-cat,.pg-acc) .mw-t{color:#fff;font-size:19px;font-weight:600;letter-spacing:-.02em;line-height:1.15}
:is(.pg-cat,.pg-acc) .mw-p{color:var(--mkDim);font-size:13.5px;line-height:1.55;margin:9px 0 0}

/* ---- 3. in-store experience card ---- */
:is(.pg-cat,.pg-acc) .mexp{
  position:relative;border-radius:30px;overflow:hidden;isolation:isolate;
  border:1px solid var(--mkLine);min-height:400px;display:flex;align-items:flex-end;
  box-shadow:0 30px 54px -30px rgba(0,0,0,.95)}
:is(.pg-cat,.pg-acc) .mexp::before{
  content:"";position:absolute;inset:0;z-index:0;
  background-image:var(--mexp-img);background-size:cover;background-position:center 38%}
:is(.pg-cat,.pg-acc) .mexp::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(6,7,9,.34) 0%,rgba(6,7,9,.18) 26%,rgba(6,7,9,.72) 58%,rgba(6,7,9,.96) 100%)}
:is(.pg-cat,.pg-acc) .mexp-in{position:relative;z-index:2;padding:26px 22px 28px}
:is(.pg-cat,.pg-acc) .mexp-k{
  display:block;color:var(--mkGold);font-size:10.5px;font-weight:600;
  letter-spacing:.2em;text-transform:uppercase;margin-bottom:10px}
:is(.pg-cat,.pg-acc) .mexp h3{
  color:#fff;font-size:28px;line-height:1.08;letter-spacing:-.02em;margin:0 0 10px}
:is(.pg-cat,.pg-acc) .mexp h3 em{font-style:normal;color:var(--mkGold)}
:is(.pg-cat,.pg-acc) .mexp p{color:rgba(255,255,255,.78);font-size:14px;line-height:1.55;margin:0 0 18px}
:is(.pg-cat,.pg-acc) .mexp-cta{
  display:inline-flex;align-items:center;gap:9px;background:#fff;color:#0a0c10;
  border-radius:100px;padding:13px 22px;font-size:14.5px;font-weight:600;text-decoration:none}
:is(.pg-cat,.pg-acc) .mexp-cta .arw{color:#0a0c10}

/* ---- 4. avis clients ---- */
:is(.pg-cat,.pg-acc) .mrev-note{
  color:var(--mkGold);font-size:12px;line-height:1.5;margin:-8px 0 16px;
  background:rgba(216,160,61,.10);border:1px dashed rgba(216,160,61,.45);
  border-radius:14px;padding:11px 13px}
:is(.pg-cat,.pg-acc) .mr{
  background:rgba(255,255,255,.045);border:1px solid var(--mkLine);border-radius:26px;
  padding:22px 20px;display:flex;flex-direction:column;position:relative}
:is(.pg-cat,.pg-acc) .mr.is-ph{border-style:dashed;opacity:.72}
:is(.pg-cat,.pg-acc) .mr-ph{
  position:absolute;top:-10px;left:20px;background:rgba(216,160,61,.9);color:#12100a;
  font-size:9.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  padding:4px 9px;border-radius:100px}
:is(.pg-cat,.pg-acc) .mr-s{color:var(--mkGold);font-size:15px;letter-spacing:2px}
:is(.pg-cat,.pg-acc) .mr-t{color:#fff;font-size:15px;line-height:1.55;margin:11px 0 0}
:is(.pg-cat,.pg-acc) .mr-w{color:var(--mkDim);font-size:12.5px;margin-top:12px}

/* ---- 5. product-card extras ---- */
:is(.pg-cat,.pg-acc) .bc-spec{color:var(--mkDim);font-size:11.5px;margin:0 0 8px;line-height:1.3}
:is(.pg-cat,.pg-acc) .bc-warr{
  display:flex;align-items:center;gap:6px;margin-top:11px;padding-top:11px;
  border-top:1px solid var(--mkLine);
  color:rgba(255,255,255,.55);font-size:10.5px;letter-spacing:.04em}
:is(.pg-cat,.pg-acc) .bc-warr::before{
  content:"";width:12px;height:12px;flex:none;background:var(--mkGold);
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2l8 3.5v6c0 5-3.4 9-8 10.5C7.4 20.5 4 16.5 4 11.5v-6z'/%3E%3C/svg%3E") center/contain no-repeat;
          mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2l8 3.5v6c0 5-3.4 9-8 10.5C7.4 20.5 4 16.5 4 11.5v-6z'/%3E%3C/svg%3E") center/contain no-repeat}

:is(.pg-cat,.pg-acc) .mfeat-sec,:is(.pg-cat,.pg-acc) .mwhy-sec,:is(.pg-cat,.pg-acc) .mrev-sec{padding-top:40px!important}
}
/* ============ v37: /reparation gets the premium treatment ============
   The page alternated dark / white / paper across 11 sections, which is why it
   read as a different product to the technology pages. This commits it to one
   dark canvas, gives the hero the technology-banner language (cut-out render +
   glass badge card + one gold CTA) and turns the card groups into the same
   centred loop carousels used everywhere else.
   The before/after band deliberately STAYS LIGHT (user's choice) - the damage
   is easier to read on paper, and it gives a very long page one contrast beat.
   .bagrid is never railed: those cards own a horizontal drag gesture and a
   snap rail would fight the finger.                                        */
@media (max-width:840px){

/* ---- palette: one dark canvas, except the before/after band ---- */
.pg-reparation{background:var(--mkBg,#050505)!important}
.pg-reparation .sec.white,.pg-reparation .sec.paper{background:#050505!important}
.pg-reparation .sec.white h2,.pg-reparation .sec.paper h2,
.pg-reparation .sec.white h3,.pg-reparation .sec.paper h3,
.pg-reparation .sec.white h4,.pg-reparation .sec.paper h4{color:#fff!important}
.pg-reparation .sec.white p,.pg-reparation .sec.paper p,
.pg-reparation .sec.white li,.pg-reparation .sec.paper li{color:#A8A8A8!important}
/* the one deliberate light band */
.pg-reparation .sec.paper:has(.bagrid){background:#F1F2F0!important}
.pg-reparation .sec.paper:has(.bagrid) h2{color:#0A0C10!important}
.pg-reparation .sec.paper:has(.bagrid) p{color:#4b5057!important}

/* ---- HERO: technology-banner language ---- */
.pg-reparation .hero{background:#050505!important}
.pg-reparation .hero .kick{
  display:inline-block;background:rgba(255,255,255,.06)!important;
  border:1px solid rgba(255,255,255,.08);border-radius:100px;
  color:rgba(255,255,255,.82)!important;font-size:10.5px!important;
  letter-spacing:.16em!important;padding:9px 15px!important;margin-bottom:14px}
.pg-reparation .hero .crumb{font-size:11.5px!important;opacity:.5}
.pg-reparation .hero h1{font-size:clamp(32px,8.6vw,42px)!important;line-height:1.04!important}
.pg-reparation .hero .sub{font-size:15.5px!important;line-height:1.55!important;color:#A8A8A8!important}

.rep-shot{
  position:relative;margin:24px auto 0;width:min(84vw,340px);
  display:grid;place-items:center}
.rep-glow{
  position:absolute;inset:-10%;border-radius:50%;z-index:0;pointer-events:none;
  background:radial-gradient(circle at 50% 50%,rgba(19,190,109,.30),rgba(19,190,109,.10) 46%,transparent 74%);
  filter:blur(10px)}
/* Cut-out render (user-supplied cracked iPhone, white backdrop removed). This
   one WORKS where the earlier attempt failed because the SUBJECT is bright -
   gold titanium, luma ~190-230 against a hero of ~5 - so it separates from the
   page instead of merging into it. No plate, no border: it floats. */
.rep-shot img{
  position:relative;z-index:1;width:100%;height:auto;max-height:330px;
  object-fit:contain;
  filter:drop-shadow(0 30px 38px rgba(0,0,0,.9)) drop-shadow(0 6px 14px rgba(0,0,0,.6))}

.rep-badges{
  display:grid;grid-template-columns:repeat(3,1fr);gap:0;
  margin:24px auto 0;max-width:380px;
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);
  border-radius:24px;padding:16px 6px;
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  box-shadow:0 22px 44px -28px rgba(0,0,0,.95)}
.rep-badge{display:flex;flex-direction:column;align-items:center;gap:5px;text-align:center;padding:0 5px}
.rep-badge svg{width:21px;height:21px;color:#13BE6D}
.rep-badge b{color:#fff;font-size:12px;font-weight:600;line-height:1.15}
.rep-badge span{color:#A8A8A8;font-size:10px;line-height:1.25}

/* one dominant CTA, second demoted to a text link */
.pg-reparation .hero .cta{display:flex!important;flex-direction:column!important;gap:10px!important;margin-top:24px!important}
.pg-reparation .hero .cta .btn-o{width:100%!important;justify-content:center!important}
.pg-reparation .hero .cta .btn-g{
  background:transparent!important;border:0!important;color:#A8A8A8!important;
  text-decoration:underline;text-underline-offset:4px;font-size:13.5px!important;padding:4px 0!important;width:auto!important}

/* ---- booking form -> dark glass, its own block under the hero ---- */
.pg-reparation .book{
  background:rgba(255,255,255,.045)!important;border:1px solid rgba(255,255,255,.08)!important;
  border-radius:28px!important;margin-top:30px!important;
  box-shadow:0 26px 46px -28px rgba(0,0,0,.95)!important}
.pg-reparation .book h4{color:#fff!important}
.pg-reparation .book .sub,.pg-reparation .book .lbl{color:#A8A8A8!important}
.pg-reparation .book .opt{
  background:rgba(255,255,255,.05)!important;border-color:rgba(255,255,255,.10)!important;
  color:#fff!important}
.pg-reparation .book .opt.on{border-color:#13BE6D!important;background:rgba(19,190,109,.14)!important}
.pg-reparation .book .num{background:#fff!important;color:#0a0c10!important}

/* ---- card groups -> centred loop carousels ---- */
.pg-reparation .g4,.pg-reparation .g3,.pg-reparation .rpromise{
  display:flex!important;flex-wrap:nowrap!important;grid-template-columns:none!important;
  box-sizing:border-box!important;overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x mandatory!important;overscroll-behavior-x:contain;scroll-behavior:auto;
  -webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none;
  margin-left:calc(50% - 50vw)!important;margin-right:calc(50% - 50vw)!important;
  width:100vw!important;max-width:100vw!important;
  padding-left:calc((100vw - clamp(280px,78vw,470px))/2)!important;
  padding-right:calc((100vw - clamp(280px,78vw,470px))/2)!important;
  gap:10px!important;padding-bottom:10px!important;align-items:stretch!important}
.pg-reparation .g4::-webkit-scrollbar,.pg-reparation .g3::-webkit-scrollbar,
.pg-reparation .rpromise::-webkit-scrollbar{display:none;height:0}
.pg-reparation .g4>*,.pg-reparation .g3>*,.pg-reparation .rpromise>*{
  scroll-snap-align:center!important;
  flex:0 0 clamp(280px,78vw,470px)!important;width:clamp(280px,78vw,470px)!important;
  max-width:clamp(280px,78vw,470px)!important;min-width:0;margin:0!important;
  opacity:1!important;transform:none!important}

/* the cards themselves -> dark glass */
.pg-reparation .sec.white .g4>*,.pg-reparation .sec.paper .g4>*,
.pg-reparation .sec.white .g3>*,.pg-reparation .sec.dark .g3>*,
.pg-reparation .rpromise>*{
  background:#111111!important;border:1px solid rgba(255,255,255,.08)!important;
  border-radius:26px!important;overflow:hidden!important;
  box-shadow:0 20px 38px -24px rgba(0,0,0,.95)!important}
.pg-reparation .g4>* h3,.pg-reparation .g4>* h4,
.pg-reparation .g3>* h3,.pg-reparation .g3>* h4,
.pg-reparation .rpromise>* h3,.pg-reparation .rpromise>* h4{color:#fff!important}
.pg-reparation .g4>* p,.pg-reparation .g3>* p,.pg-reparation .rpromise>* p{color:#A8A8A8!important}

/* ---- before/after band: cards stay light, no rail ---- */
.pg-reparation .bagrid{display:grid!important;grid-template-columns:1fr!important;gap:16px!important;overflow:visible!important}
.pg-reparation .bagrid>*{width:auto!important;max-width:none!important;min-width:0}

/* ---- FAQ -> dark ---- */
.pg-reparation .faq-wrap details,.pg-reparation .faq-wrap .faq{
  background:rgba(255,255,255,.045)!important;border:1px solid rgba(255,255,255,.08)!important;
  border-radius:20px!important;color:#fff!important}
.pg-reparation .faq-wrap summary,.pg-reparation .faq-wrap h4{color:#fff!important}
.pg-reparation .faq-wrap p{color:#A8A8A8!important}

/* ---- trust chips -> glass ---- */
.pg-reparation .rchips>*{
  background:rgba(255,255,255,.05)!important;border:1px solid rgba(255,255,255,.08)!important;
  color:#fff!important}

/* the render + badges are a mobile-only addition; keep desktop untouched */
}
@media (min-width:841px){
/* v81: /reparation now shows its render + badges on desktop, so the hide is
   scoped away from it. .rep-shot is SHARED with /impression (v45), and the same
   guard family covers .tr-shot and .acc-shot, so those stay hidden until their
   own desktop pass lands - do not widen this without checking them. */
body:not(.pg-reparation) .rep-shot,body:not(.pg-reparation) .rep-badges{display:none!important}
}
/* ============ v39: repair hero order + before/after side by side ============ */
@media (max-width:840px){

/* the CTA was moved in the markup to sit AFTER the badge card, so the hero now
   reads headline -> copy -> render -> badges -> orange CTA, matching the
   technology banner. Give it the spacing that order needs. */
.pg-reparation .hero .cta{margin-top:22px!important;margin-bottom:4px!important}

/* ---- before / after: centred loop carousel ----
   Earlier note said never rail a draggable widget. That still holds by default,
   but here the conflict is resolved explicitly: the drag is scoped to the KNOB
   via touch-action, so a swipe on the rest of the card scrolls the rail, and
   mk-mobile.js drives the slider through a DELEGATED handler so the cloned
   cards work too.                                                          */
.pg-reparation .bagrid{
  display:flex!important;flex-wrap:nowrap!important;grid-template-columns:none!important;
  box-sizing:border-box!important;overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x mandatory!important;overscroll-behavior-x:contain;scroll-behavior:auto;
  -webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none;
  margin-left:calc(50% - 50vw)!important;margin-right:calc(50% - 50vw)!important;
  width:100vw!important;max-width:100vw!important;
  padding-left:calc((100vw - clamp(280px,78vw,470px))/2)!important;
  padding-right:calc((100vw - clamp(280px,78vw,470px))/2)!important;
  gap:10px!important;padding-bottom:10px!important;align-items:stretch!important}
.pg-reparation .bagrid::-webkit-scrollbar{display:none;height:0}
.pg-reparation .bagrid>*{
  scroll-snap-align:center!important;
  flex:0 0 clamp(280px,78vw,470px)!important;width:clamp(280px,78vw,470px)!important;
  max-width:clamp(280px,78vw,470px)!important;min-width:0;margin:0!important;
  opacity:1!important;transform:none!important}
/* the image area may pan the rail horizontally and the page vertically; only the
   knob swallows the gesture, which is what lets drag and swipe coexist */
.pg-reparation .bagrid .baview{touch-action:pan-y!important}
.pg-reparation .bagrid .grip,.pg-reparation .bagrid .handle{touch-action:none!important}
.pg-reparation .bagrid .grip{cursor:ew-resize}
/* at half width the chrome has to come down or the card is all label */
.pg-reparation .bagrid .ba-cap,.pg-reparation .bagrid figcaption,
.pg-reparation .bagrid .cap{padding:11px 12px!important}
.pg-reparation .bagrid h4{font-size:17px!important;line-height:1.2!important}
.pg-reparation .bagrid p{font-size:13.5px!important;line-height:1.4!important}
.pg-reparation .bagrid .tag,.pg-reparation .bagrid .ba-b,.pg-reparation .bagrid .ba-a{
  font-size:9.5px!important;padding:5px 9px!important}
/* CAREFUL: .handle is the vertical DIVIDER BAR (thin, full height), not the
   drag knob - sizing it 38x38 turned it into a white block covering the Apres
   pill. The knob is .grip. Leave .handle alone; only shrink .grip. */
.pg-reparation .bagrid .grip{width:44px!important;height:44px!important}
.pg-reparation .bagrid .grip svg{width:18px!important;height:18px!important}
/* two 62px pills + insets fit inside a 168px stage, but tighten them so they
   never crowd the divider in the middle */
.pg-reparation .bagrid .bl{font-size:11px!important;padding:6px 11px!important;left:12px!important;top:12px!important}
.pg-reparation .bagrid .bl.aft{left:auto!important;right:12px!important}
}
/* ============ v43: FIX horizontal page overflow on /reparation ============
   The page measured 4,746px wide against a 390px viewport - content visibly
   ran off the right and the page could be dragged sideways into empty space.

   Cause: two rails computed `overflow-x: visible`, so their off-screen cards
   were laid out on the PAGE instead of being clipped by the rail:
     .bagrid   - left over `overflow:visible!important` from the v37 pass that
                 made it a stacked grid, never removed when it became a rail
     .rpromise - same, from the v7 sub-page 2-col grid rules
   `body` has overflow-x:hidden but `html` does not, so the overflow escaped.

   LESSON: when a group is converted from grid -> rail across several passes,
   re-check computed overflow-x. An !important from an earlier block silently
   wins and the only symptom is page-level horizontal scroll.               */
@media (max-width:840px){
.pg-reparation .bagrid,
.pg-reparation .rpromise{overflow-x:auto!important;overflow-y:hidden!important}

/* belt and braces: nothing on these pages should ever scroll the page sideways */
.mk-page{overflow-x:hidden}
}
/* ============ v44a: /impression - dark canvas, hero, premium service cards ==== */
@media (max-width:840px){
.pg-impression{background:#050505!important}
.pg-impression .sec.white,.pg-impression .sec.paper,.pg-impression .hero{background:#050505!important}
.pg-impression .sec h2,.pg-impression .sec h3,.pg-impression .sec h4{color:#fff!important}
.pg-impression .sec p,.pg-impression .sec li{color:#A8A8A8!important}

/* hero: one dominant CTA, second demoted - same as repair + technology */
.pg-impression .hero .cta{display:flex!important;flex-direction:column!important;gap:10px!important;margin-top:22px!important}
.pg-impression .hero .cta .btn-o{width:100%!important;justify-content:center!important}
.pg-impression .hero .cta .btn-g{
  background:transparent!important;border:0!important;color:#A8A8A8!important;
  text-decoration:underline;text-underline-offset:4px;font-size:13.5px!important;
  padding:4px 0!important;width:auto!important}

/* service cards -> full-bleed photo cards, the homepage .scard recipe */
.pg-impression .g4>.icard{
  position:relative!important;aspect-ratio:3/4;border-radius:26px!important;overflow:hidden!important;
  background:#111111!important;border:1px solid rgba(255,255,255,.08)!important;
  box-shadow:0 26px 44px -26px rgba(0,0,0,.9)!important;display:block!important;padding:0!important}
.pg-impression .g4>.icard .ic-top{
  position:absolute!important;inset:0!important;aspect-ratio:auto!important;
  height:100%!important;width:100%!important;margin:0!important;border-radius:0!important;overflow:hidden}
.pg-impression .g4>.icard .ic-top img{width:100%!important;height:100%!important;object-fit:cover!important;display:block}
.pg-impression .g4>.icard .ic-top::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(6,7,9,.28) 0%,rgba(6,7,9,.12) 24%,rgba(6,7,9,.55) 50%,rgba(6,7,9,.91) 76%,rgba(6,7,9,.98) 100%)}
.pg-impression .g4>.icard .ic-body{
  position:absolute!important;left:0;right:0;bottom:0;z-index:3;
  padding:0 20px 20px!important;background:none!important;text-align:left}
.pg-impression .g4>.icard .ic-body h4{
  color:#fff!important;font-size:22px!important;line-height:1.1!important;
  letter-spacing:-.02em;margin:0 0 8px!important}
.pg-impression .g4>.icard .ic-body p{
  color:rgba(255,255,255,.74)!important;font-size:13.5px!important;line-height:1.5!important;
  margin:0!important;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.pg-impression .g4>.icard .ic-body .go,.pg-impression .g4>.icard .ic-body a{
  display:inline-flex!important;align-items:center;gap:8px;margin-top:14px;
  background:#fff!important;color:#0a0c10!important;border-radius:100px!important;
  padding:11px 20px!important;font-size:14px!important;font-weight:600!important;text-decoration:none}
}
/* ============ v44b: /impression galerie + the shared closing contact card ==== */
@media (max-width:840px){

/* ---- galerie: the homepage treatment. .hgal already uses the same
        .art/.frame/.mat markup, so mk-mobile.js builds the SAME featured
        carousel above it and the framed 3-col grid sits underneath. ---- */
.pg-impression .hgal{
  display:grid!important;grid-template-columns:repeat(3,1fr)!important;
  gap:18px 9px!important;overflow:visible!important}
.pg-impression .hgal .aname{color:#fff!important}
.pg-impression .hgal .aartist{color:rgba(255,255,255,.5)!important}
.pg-impression .hgal .aprice{color:#E8B84B!important}
.pg-impression .hgal .abm{color:rgba(255,255,255,.35)!important}
.pg-impression .hgal .art .frame{
  box-shadow:0 14px 24px -12px rgba(0,0,0,.95),inset 0 0 0 1px rgba(0,0,0,.3)!important}

/* ---- closing contact card: one treatment for BOTH /impression and
        /reparation, which also finishes the last light band on the repair
        page. Dark glass card on the dark canvas, gold CTA, white ghost. ---- */
.pg-reparation .sec.paper:not(:has(.bagrid)),
.pg-impression .sec.paper{background:#050505!important}
.pg-reparation .store,.pg-impression .store{
  background:linear-gradient(180deg,#131417,#0d0e11)!important;
  border:1px solid rgba(255,255,255,.09)!important;border-radius:30px!important;
  padding:28px 22px 30px!important;
  box-shadow:0 30px 54px -30px rgba(0,0,0,.95)!important}
.pg-reparation .store h3,.pg-impression .store h3{
  color:#fff!important;font-size:26px!important;line-height:1.1!important;letter-spacing:-.02em}
.pg-reparation .store p,.pg-impression .store p{
  color:rgba(255,255,255,.72)!important;font-size:14px!important;line-height:1.55!important}
.pg-reparation .store .cta,.pg-impression .store .cta{
  display:flex!important;flex-direction:column!important;gap:10px!important;margin-top:18px!important}
.pg-reparation .store .cta .btn,.pg-impression .store .cta .btn{
  width:100%!important;justify-content:center!important}
.pg-reparation .store .cta .btn-g,.pg-impression .store .cta .btn-g{
  background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.16)!important;
  color:#fff!important}
/* the address / phone / hours rows read as glass rows on the dark card */
.pg-reparation .store .l2row,.pg-impression .store .l2row,
.pg-reparation .store .row,.pg-impression .store .row{
  background:rgba(255,255,255,.045)!important;border:1px solid rgba(255,255,255,.08)!important;
  border-radius:16px!important;color:#fff!important}
.pg-reparation .store b,.pg-impression .store b{color:rgba(255,255,255,.5)!important}
}
/* ============ v45: print hero render (shared .rep-shot / .rep-badges) ========
   The repair hero's render + glass badge card are reused verbatim on the print
   page, so their selectors are no longer scoped to .pg-reparation. The print
   render is WIDE (a row of machines, 1247x431) rather than a single portrait
   device, so it gets its own sizing.                                        */
@media (max-width:840px){
.imp-shot{width:min(94vw,420px)!important;margin-top:26px!important}
.imp-shot img{max-height:200px!important;object-fit:contain!important}
.pg-impression .rep-glow{
  background:radial-gradient(circle at 50% 58%,rgba(74,125,255,.26),rgba(74,125,255,.09) 46%,transparent 74%)!important}
.pg-impression .rep-badge svg{color:#4A7DFF}
.pg-impression .rep-badges{max-width:400px}
.pg-impression .hero .cta{margin-top:22px!important}
}
/* ============ v46: drop the hero collage on /impression ============
   The "PRINT SERVICES" collage was flat clip-art on white and read as stock
   filler against the new dark hero, which now carries the real equipment
   render. Hidden on mobile only - the markup and the desktop layout are
   untouched, so this is reversible by deleting this rule.                  */
@media (max-width:840px){
.pg-impression .hero .card{display:none!important}
.pg-impression .hero .hgrid{gap:0!important}
.pg-impression .hero .cta{margin-bottom:8px!important}
}
/* ============ v47: /paiement-de-facture premium pass ============
   Same language as repair / print / technology. The page has TWO .g3 groups -
   the biller cards (in .sec.white) and the 3 steps (in .sec.paper) - so they
   are targeted by their section, never by .g3 alone.                       */
@media (max-width:840px){

/* one dark canvas */
.pg-facture{background:#050505!important}
.pg-facture .sec.white,.pg-facture .sec.paper,.pg-facture .hero{background:#050505!important}
.pg-facture .sec h2,.pg-facture .sec h3,.pg-facture .sec h4{color:#fff!important}
.pg-facture .sec p,.pg-facture .sec li{color:#A8A8A8!important}

/* hero: drop the old illustration card, one dominant CTA */
.pg-facture .hero .card{display:none!important}
.pg-facture .hero .hgrid{gap:0!important}
.fac-shot{width:min(80vw,320px)!important;margin-top:24px!important}
.fac-shot img{max-height:250px!important;object-fit:contain!important}
.pg-facture .rep-glow{
  background:radial-gradient(circle at 50% 52%,rgba(247,161,43,.26),rgba(247,161,43,.09) 46%,transparent 74%)!important}
.pg-facture .rep-badge svg{color:#F7A12B}
.pg-facture .hero .cta{display:flex!important;flex-direction:column!important;gap:10px!important;margin-top:22px!important}
.pg-facture .hero .cta .btn-o{width:100%!important;justify-content:center!important}
.pg-facture .hero .cta .btn-g{
  background:transparent!important;border:0!important;color:#A8A8A8!important;
  text-decoration:underline;text-underline-offset:4px;font-size:13.5px!important;
  padding:4px 0!important;width:auto!important}

/* ---- BILLER cards (.sec.white .g3) -> dark glass, logo plate kept white so
        the CIE / SODECI / Canal+ marks stay legible ---- */
.pg-facture .sec.white .g3>*{
  background:#111111!important;border:1px solid rgba(255,255,255,.08)!important;
  border-radius:26px!important;overflow:hidden!important;
  box-shadow:0 20px 38px -24px rgba(0,0,0,.95)!important}
.pg-facture .sec.white .g3>* img{background:#fff!important}
.pg-facture .sec.white .g3>* h3,.pg-facture .sec.white .g3>* h4{color:#fff!important}
.pg-facture .sec.white .g3>* p{color:#A8A8A8!important}

/* ---- 3 STEPS (.sec.paper .g3) -> the homepage .why photo-card recipe:
        photo on ::before, scrim on ::after, copy bottom-aligned ---- */
.pg-facture .sec.paper .g3>*{
  position:relative!important;display:flex!important;flex-direction:column;justify-content:flex-end;
  aspect-ratio:3/4;border-radius:26px!important;overflow:hidden!important;padding:20px!important;
  background:#101216!important;border:1px solid rgba(255,255,255,.09)!important;
  box-shadow:0 26px 44px -26px rgba(0,0,0,.9)!important}
.pg-facture .sec.paper .g3>*::before{
  content:"";position:absolute;inset:0;z-index:0;
  background-size:cover;background-position:center;background-repeat:no-repeat}
.pg-facture .sec.paper .g3>*::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(6,7,9,.30) 0%,rgba(6,7,9,.12) 22%,rgba(6,7,9,.55) 48%,rgba(6,7,9,.91) 74%,rgba(6,7,9,.98) 100%)}
.pg-facture .sec.paper .g3>*>*{position:relative;z-index:2;flex:0 0 auto!important}
/* the big orange 01/02/03 becomes the gold kicker, as on the homepage */
.pg-facture .sec.paper .g3>* .n,.pg-facture .sec.paper .g3>* b:first-child,
.pg-facture .sec.paper .g3>* span:first-child{
  color:#E8B84B!important;font-size:11px!important;font-weight:600!important;
  letter-spacing:1.9px!important;text-transform:uppercase;margin:0 0 7px!important;
  line-height:1.2!important}
.pg-facture .sec.paper .g3>* h3,.pg-facture .sec.paper .g3>* h4{
  color:#fff!important;font-size:22px!important;line-height:1.1!important;margin:0 0 8px!important}
.pg-facture .sec.paper .g3>* p{
  color:rgba(255,255,255,.74)!important;font-size:13.5px!important;line-height:1.5!important;margin:0!important}
/* same photography as the homepage "Pourquoi Mascot" cards, per the request */
.pg-facture .sec.paper .g3>*:nth-child(3n+1)::before{background-image:url('/wp-content/uploads/mascot-hero/contact.jpg')}
.pg-facture .sec.paper .g3>*:nth-child(3n+2)::before{background-image:url('/wp-content/uploads/mascot-hero/learn-laptop.jpg')}
.pg-facture .sec.paper .g3>*:nth-child(3n+3)::before{background-image:url('/wp-content/uploads/mascot-hero/kids-community.jpg')}

/* closing contact card - reuse the repair/print treatment */
.pg-facture .store{
  background:linear-gradient(180deg,#131417,#0d0e11)!important;
  border:1px solid rgba(255,255,255,.09)!important;border-radius:30px!important;
  padding:28px 22px 30px!important;box-shadow:0 30px 54px -30px rgba(0,0,0,.95)!important}
.pg-facture .store h3{color:#fff!important;font-size:26px!important;line-height:1.1!important}
.pg-facture .store p{color:rgba(255,255,255,.72)!important;font-size:14px!important}
.pg-facture .store .cta{display:flex!important;flex-direction:column!important;gap:10px!important;margin-top:18px!important}
.pg-facture .store .cta .btn{width:100%!important;justify-content:center!important}
.pg-facture .store .cta .btn-g{
  background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.16)!important;color:#fff!important}
}
/* ============ v48: /transfert-dargent premium pass ============
   The last of the three "services en boutique" pages to be converted, so it
   speaks exactly the language of facture / impression / reparation: one dark
   canvas, a cut-out hero render over a glass badge row, one dominant CTA, the
   homepage photo-card recipe on the three steps, and the shared closing card.

   THE HERO RENDER IS A TRUE CUT-OUT HERE - a first for this site. Every earlier
   hero was a flatten-to-dark (flood fill to rgb(5,5,7)) because the sources
   were photographed on white, which leaves a faint rectangle edge wherever the
   hero gradient sits behind it. This source arrived as a genuine transparent
   PNG, so there is nothing to remove and no edge to hide.

   .feat is RESTYLED into the glass badge card rather than having new markup
   injected: its .fi children already carry icon + label + description, which is
   exactly .rep-badge's structure. Only `order` lifts it above the CTA.       */
@media (max-width:840px){

/* one dark canvas */
.pg-transfert{background:#050505!important}
.pg-transfert .sec.white,.pg-transfert .sec.paper,.pg-transfert .hero{background:#050505!important}
.pg-transfert .sec h2,.pg-transfert .sec h3,.pg-transfert .sec h4{color:#fff!important}
.pg-transfert .sec p,.pg-transfert .sec li,.pg-transfert .shead p{color:#A8A8A8!important}

/* ---- HERO ----
   The copy column becomes a flex column purely so `order` can lift the badge
   row and the CTA below the render without touching the DOM order. */
.pg-transfert .hero .hgrid{gap:0!important}
.pg-transfert .hero .hgrid>div:first-child{display:flex!important;flex-direction:column!important}
.pg-transfert .hero .feat{order:1}
.pg-transfert .hero .cta{order:2}

.tr-shot{width:min(84vw,340px)!important;margin-top:22px!important}
.tr-shot img{max-height:215px!important;object-fit:contain!important}
/* the page accent is the same green as /reparation, so .rep-glow's default
   green radial and .rep-badge's #13BE6D icons are already correct here */

/* .feat -> the glass badge card. Its base .ic is a 40px tinted chip built for
   the desktop stacked rows; in a 3-up badge row that chip crowds the label, so
   it is stripped back to a bare icon. */
.pg-transfert .hero .feat{
  display:grid!important;grid-template-columns:repeat(3,1fr)!important;gap:0!important;
  margin:24px auto 0!important;max-width:390px!important;width:100%!important;
  background:rgba(255,255,255,.05)!important;border:1px solid rgba(255,255,255,.08)!important;
  border-radius:24px!important;padding:16px 6px!important;
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  box-shadow:0 22px 44px -28px rgba(0,0,0,.95)!important}
.pg-transfert .hero .feat .fi{
  display:flex!important;flex-direction:column!important;align-items:center!important;
  gap:5px!important;text-align:center!important;padding:0 5px!important}
.pg-transfert .hero .feat .fi .ic{
  width:auto!important;height:auto!important;flex:none!important;
  background:none!important;border:0!important;border-radius:0!important;
  color:#13BE6D!important;display:block!important}
.pg-transfert .hero .feat .fi .ic svg{width:21px!important;height:21px!important;display:block}
.pg-transfert .hero .feat .fi b{
  display:block;color:#fff!important;font-size:12px!important;font-weight:600!important;
  line-height:1.15!important}
.pg-transfert .hero .feat .fi span{
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  color:#A8A8A8!important;font-size:10px!important;line-height:1.25!important;margin-top:2px}

/* one dominant CTA, second demoted to a text link */
.pg-transfert .hero .cta{
  display:flex!important;flex-direction:column!important;align-items:stretch!important;
  gap:10px!important;margin-top:22px!important}
.pg-transfert .hero .cta .btn-o{width:100%!important;justify-content:center!important}
.pg-transfert .hero .cta .btn-g{
  background:transparent!important;border:0!important;color:#A8A8A8!important;
  text-decoration:underline;text-underline-offset:4px;font-size:13.5px!important;
  padding:4px 0!important;width:auto!important;align-self:center!important}

/* ---- the "Transfert en boutique" operator card STAYS (user's request) but
        goes dark glass so it belongs on the new canvas. The operator logo
        plates stay WHITE - the same call made for the facture biller cards,
        because Wave / Orange / WU / MoneyGram are coloured marks that lose
        legibility on dark. ---- */
.pg-transfert .tr-card{
  background:linear-gradient(180deg,#131417,#0d0e11)!important;color:#fff!important;
  border:1px solid rgba(255,255,255,.09)!important;border-radius:28px!important;
  box-shadow:0 30px 54px -30px rgba(0,0,0,.95)!important;margin-top:26px!important}
.pg-transfert .tr-card .ct b{color:#fff!important}
.pg-transfert .tr-card .oprow{border-top-color:rgba(255,255,255,.07)!important}
.pg-transfert .tr-card .oprow .on{color:#fff!important}
.pg-transfert .tr-card .oprow .os{color:#8b8f8a!important}
.pg-transfert .tr-card .oprow .lg{
  background:#fff!important;border:1px solid rgba(255,255,255,.14)!important;border-radius:12px!important}
.pg-transfert .tr-card .oprow .tag{
  background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.14)!important;
  color:rgba(255,255,255,.82)!important}
.pg-transfert .tr-card .badge{
  background:rgba(19,190,109,.14)!important;border:1px solid rgba(19,190,109,.3)!important;
  color:#13BE6D!important}
.pg-transfert .tr-card .btn-o{margin-top:16px!important}

/* ---- 3 STEPS -> the homepage "Pourquoi Mascot" photo-card recipe, with the
        same photography the user asked for. NOTE the extra nesting: here the
        copy lives in .scard > .step, not directly on the card, so .step is the
        element that has to be lifted above the scrim. ---- */
.pg-transfert .sec.white .g3>.scard{
  position:relative!important;display:flex!important;flex-direction:column!important;
  justify-content:flex-end!important;aspect-ratio:3/4!important;
  border-radius:26px!important;overflow:hidden!important;padding:20px!important;
  background:#101216!important;border:1px solid rgba(255,255,255,.09)!important;
  box-shadow:0 26px 44px -26px rgba(0,0,0,.9)!important}
.pg-transfert .sec.white .g3>.scard::before{
  content:"";position:absolute;inset:0;z-index:0;
  background-size:cover;background-position:center;background-repeat:no-repeat}
.pg-transfert .sec.white .g3>.scard::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(6,7,9,.30) 0%,rgba(6,7,9,.12) 22%,rgba(6,7,9,.55) 48%,rgba(6,7,9,.91) 74%,rgba(6,7,9,.98) 100%)}
.pg-transfert .sec.white .g3>.scard .step{position:relative;z-index:2;display:block}
/* the big orange 01/02/03 becomes the gold kicker, as on the homepage */
.pg-transfert .sec.white .g3>.scard .step .n{
  color:#E8B84B!important;font-size:11px!important;font-weight:600!important;
  letter-spacing:1.9px!important;text-transform:uppercase;line-height:1.2!important;
  margin:0 0 7px!important;font-family:inherit!important}
.pg-transfert .sec.white .g3>.scard .step h4{
  color:#fff!important;font-size:22px!important;line-height:1.1!important;margin:0 0 8px!important}
.pg-transfert .sec.white .g3>.scard .step p{
  color:rgba(255,255,255,.74)!important;font-size:13.5px!important;line-height:1.5!important;margin:0!important}
/* :nth-child(3n+k), not :nth-child(k) - mkCarousel clones whole sets of three,
   so the index has to repeat or every clone would take card 1's photograph. */
.pg-transfert .sec.white .g3>.scard:nth-child(3n+1)::before{background-image:url('/wp-content/uploads/mascot-hero/contact.jpg')}
.pg-transfert .sec.white .g3>.scard:nth-child(3n+2)::before{background-image:url('/wp-content/uploads/mascot-hero/learn-laptop.jpg')}
.pg-transfert .sec.white .g3>.scard:nth-child(3n+3)::before{background-image:url('/wp-content/uploads/mascot-hero/kids-community.jpg')}

/* the steps become the centred loop carousel used everywhere else */
.pg-transfert .sec.white .g3{
  padding-left:calc((100vw - clamp(280px,78vw,470px))/2)!important;
  padding-right:calc((100vw - clamp(280px,78vw,470px))/2)!important}
.pg-transfert .sec.white .g3>.scard{
  scroll-snap-align:center!important;
  flex:0 0 clamp(280px,78vw,470px)!important;
  width:clamp(280px,78vw,470px)!important;
  max-width:clamp(280px,78vw,470px)!important}

/* ---- PARTNERS -> premium 2x2 glass grid ----
   The marks themselves are brand-coloured tiles (Wave blue, Orange orange) or
   dark-on-transparent (Western Union), so each sits on its own white plate for
   legibility, and the GLASS is the card around it: a translucent pane with a
   specular sheen across the top-left corner and an inset top highlight. ---- */
.pg-transfert .plogos{
  display:grid!important;grid-template-columns:1fr 1fr!important;
  gap:12px!important;margin-top:4px!important}
.pg-transfert .plogo{
  position:relative!important;overflow:hidden!important;
  width:auto!important;height:auto!important;aspect-ratio:1/1!important;
  background:linear-gradient(158deg,rgba(255,255,255,.10),rgba(255,255,255,.028) 52%,rgba(255,255,255,.05))!important;
  border:1px solid rgba(255,255,255,.11)!important;border-radius:26px!important;
  padding:22px!important;display:grid!important;place-items:center!important;
  backdrop-filter:blur(18px) saturate(1.25);-webkit-backdrop-filter:blur(18px) saturate(1.25);
  box-shadow:0 26px 46px -28px rgba(0,0,0,.95),inset 0 1px 0 rgba(255,255,255,.16)!important}
/* the specular sweep that sells the glass */
.pg-transfert .plogo::after{
  content:"";position:absolute;left:-40%;top:-70%;width:120%;height:120%;
  background:linear-gradient(128deg,rgba(255,255,255,.19),rgba(255,255,255,.06) 34%,transparent 62%);
  transform:rotate(-8deg);pointer-events:none;z-index:2}
.pg-transfert .plogo img{
  position:relative;z-index:1;
  width:100%!important;max-width:118px!important;height:auto!important;
  max-height:none!important;aspect-ratio:1/1;object-fit:contain!important;
  background:#fff!important;border-radius:20px!important;padding:13px!important;
  box-shadow:0 12px 26px -14px rgba(0,0,0,.9)!important}

/* ---- closing contact card: the shared repair / print / facture treatment.
        .store is already dark on this page, but it is the OLD 26px radius,
        radial-amber, two-column card - restyle it to the same object the other
        pages now close with. ---- */
.pg-transfert .store{
  background:linear-gradient(180deg,#131417,#0d0e11)!important;
  border:1px solid rgba(255,255,255,.09)!important;border-radius:30px!important;
  padding:28px 22px 30px!important;
  box-shadow:0 30px 54px -30px rgba(0,0,0,.95)!important}
.pg-transfert .store::before{display:none!important}
.pg-transfert .store h3{color:#fff!important;font-size:26px!important;line-height:1.1!important;letter-spacing:-.02em}
.pg-transfert .store p{color:rgba(255,255,255,.72)!important;font-size:14px!important;line-height:1.55!important}
.pg-transfert .store .cta{
  display:flex!important;flex-direction:column!important;gap:10px!important;margin-top:18px!important}
.pg-transfert .store .cta .btn{width:100%!important;justify-content:center!important}
.pg-transfert .store .cta .btn-g{
  background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.16)!important;color:#fff!important}
/* the address / phone / hours rows read as glass rows, as on the other pages */
.pg-transfert .store .info{gap:10px!important;margin-top:20px!important}
.pg-transfert .store .ir{
  background:rgba(255,255,255,.045)!important;border:1px solid rgba(255,255,255,.08)!important;
  border-radius:16px!important;padding:12px 14px!important}
.pg-transfert .store .ir .ic{
  background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.12)!important}
.pg-transfert .store .ir b{color:rgba(255,255,255,.5)!important}
.pg-transfert .store .ir span{color:#fff!important}
}
/* the render is a mobile-only addition; keep the desktop hgrid untouched */
@media (min-width:841px){
  .tr-shot{display:none!important}
}

/* ============ v48b: /mascot-galerie gets the homepage galerie section ============
   The category template already renders the identical .art/.frame/.mat markup as
   the homepage .ggrid, so mk-mobile.js builds the SAME featured carousel above
   it and the framed 3-col grid of every print sits underneath.

   The page also carries the Wave-2 "À la une" product carousel (.mfeat), which
   would be a SECOND featured shelf showing the same prints as plain product
   cards. On this page only, that one is hidden - the framed carousel is the
   better object for artwork. Everything is keyed off .pg-gal, a body class the
   template now adds for term 46, because .pg-cat is shared by all 16 category
   pages.                                                                     */
@media (max-width:840px){
.pg-gal .mfeat-sec{display:none!important}
.pg-gal .ggrid{
  display:grid!important;grid-template-columns:repeat(3,1fr)!important;
  gap:18px 9px!important;overflow:visible!important}
.pg-gal .ggrid .aname{color:#fff!important}
.pg-gal .ggrid .aartist{color:rgba(255,255,255,.5)!important}
.pg-gal .ggrid .aprice{color:#E8B84B!important}
.pg-gal .ggrid .abm{color:rgba(255,255,255,.35)!important}
.pg-gal .ggrid .art .frame{
  box-shadow:0 14px 24px -12px rgba(0,0,0,.95),inset 0 0 0 1px rgba(0,0,0,.3)!important}

/* closing contact card - the same object the service pages close with */
.pg-cat .store{
  background:linear-gradient(180deg,#131417,#0d0e11)!important;
  border:1px solid rgba(255,255,255,.09)!important;border-radius:30px!important;
  padding:28px 22px 30px!important;
  box-shadow:0 30px 54px -30px rgba(0,0,0,.95)!important}
.pg-cat .store h3{color:#fff!important;font-size:26px!important;line-height:1.1!important;letter-spacing:-.02em}
.pg-cat .store p{color:rgba(255,255,255,.72)!important;font-size:14px!important;line-height:1.55!important}
.pg-cat .store .cta{
  display:flex!important;flex-direction:column!important;gap:10px!important;margin-top:18px!important}
.pg-cat .store .cta .btn{width:100%!important;justify-content:center!important}
.pg-cat .store .cta .btn-g{
  background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.16)!important;color:#fff!important}
.pg-cat .store .info{display:flex;flex-direction:column;gap:10px!important;margin-top:20px!important}
.pg-cat .store .ir{
  display:flex;gap:12px;align-items:center;
  background:rgba(255,255,255,.045)!important;border:1px solid rgba(255,255,255,.08)!important;
  border-radius:16px!important;padding:12px 14px!important}
.pg-cat .store .ir .ic{
  flex:none;width:42px;height:42px;border-radius:12px;display:grid;place-items:center;color:#E8B84B;
  background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.12)!important}
.pg-cat .store .ir b{display:block;font-size:12px;text-transform:uppercase;letter-spacing:.5px;color:rgba(255,255,255,.5)!important}
.pg-cat .store .ir span{font-size:15.5px;color:#fff!important}
}

/* ============ v48c: buttons for the category-page contact card ============
   mascot-category.php has no .btn / .btn-o / .btn-g / .arw of its own - those
   live in the static pages' inline <style>, not here - so the shared .store
   card has to bring its own button chrome. Checked before writing rather than
   assumed: the template only defines .wrap and .sec.                        */
@media (max-width:840px){
.pg-cat .mstore-sec{padding-bottom:clamp(34px,6vw,60px)!important}
.pg-cat .store .cta .btn{
  display:inline-flex!important;align-items:center!important;justify-content:center!important;
  gap:9px!important;padding:15px 22px!important;border-radius:100px!important;
  font-size:15px!important;font-weight:600!important;line-height:1!important;
  text-decoration:none!important;border:1px solid transparent!important;
  font-family:inherit!important;cursor:pointer}
.pg-cat .store .cta .btn-o{
  background:linear-gradient(135deg,#F7A12B,#F2890E)!important;color:#12100a!important;
  box-shadow:0 16px 30px -16px rgba(242,137,14,.8)!important}
.pg-cat .store .cta .btn-o .arw{color:#12100a!important}
.pg-cat .store .cta .btn-g .arw{color:#fff!important}
.pg-cat .store>div:first-child{display:block}
.pg-cat .store .reveal,.pg-cat .store.reveal{opacity:1!important;transform:none!important}
}

/* ============ v48d: partner cards - real glass, uniform plates ============
   Two faults in the first build, both visible on the live page:

   1. backdrop-filter did NOTHING. The section behind these cards is flat
      #050505, so there is no backdrop to blur or saturate and the "glass" read
      as a plain dark tile. On an opaque dark canvas glass has to be BUILT from
      layered gradients - a translucent pane, a bright specular top edge and a
      diagonal sweep - not delegated to the compositor.
   2. The white plate was the <img> itself, so a non-square mark produced a
      non-square plate: Wave rendered as a tall rectangle next to three squares.
      The marks are now padded to square canvases and the plate has a fixed
      square box, so the four are identical regardless of artwork aspect.     */
@media (max-width:840px){
.pg-transfert .plogos{
  display:grid!important;grid-template-columns:1fr 1fr!important;
  gap:13px!important;margin-top:4px!important}

.pg-transfert .plogo{
  position:relative!important;overflow:hidden!important;isolation:isolate;
  width:auto!important;height:auto!important;aspect-ratio:1/1!important;
  display:grid!important;place-items:center!important;padding:24px!important;
  border-radius:28px!important;
  background:
    linear-gradient(158deg,rgba(255,255,255,.13) 0%,rgba(255,255,255,.035) 42%,rgba(255,255,255,.015) 62%,rgba(255,255,255,.06) 100%),
    linear-gradient(180deg,#15171b,#0d0f12)!important;
  border:1px solid rgba(255,255,255,.13)!important;
  backdrop-filter:none!important;-webkit-backdrop-filter:none!important;
  box-shadow:
    0 28px 50px -30px rgba(0,0,0,.98),
    inset 0 1px 0 rgba(255,255,255,.22),
    inset 0 -1px 0 rgba(255,255,255,.05)!important}

/* the specular sweep - this is what actually sells the glass */
.pg-transfert .plogo::after{
  content:"";position:absolute;z-index:2;pointer-events:none;
  left:-45%;top:-85%;width:135%;height:135%;transform:rotate(-14deg);
  background:linear-gradient(122deg,
    rgba(255,255,255,.16) 0%,
    rgba(255,255,255,.07) 26%,
    rgba(255,255,255,.015) 44%,
    transparent 60%)}

/* uniform square plate. Not pure white - a hair of gradient and a hairline
   keep it from reading as a cut-out hole on the near-black card. */
.pg-transfert .plogo img{
  position:relative;z-index:1;
  width:112px!important;height:112px!important;max-width:112px!important;max-height:112px!important;
  aspect-ratio:1/1!important;object-fit:contain!important;
  background:linear-gradient(170deg,#ffffff,#f1f2f5)!important;
  border:1px solid rgba(255,255,255,.6)!important;
  border-radius:24px!important;padding:14px!important;
  box-shadow:0 14px 28px -14px rgba(0,0,0,.95),0 2px 6px -2px rgba(0,0,0,.5)!important}
}

/* ============ v50: /accessoires gets the technology-page treatment ============
   This page was the one gap left in the mobile pass. It renders from
   mascot-accessories.php - a bespoke template with its OWN macc-* namespace,
   its own nav and footer, and its own inline <style> - so it shared no classes
   with the rest of the site and none of the earlier work reached it.

   Everything below maps the technology-page language onto those macc-* classes:
   #050505 canvas, #111 glass cards, gold #D8A03D, green #32D17B, a white plate
   under each product (the catalogue is shot on white), glass pills, and the
   hero pattern used on repair / print / facture / transfert - render, glass
   badge row, one dominant CTA.

   Scoped to .pg-acc, and the page deliberately does NOT carry .mk-page: the
   shared sheet's generic rules (.hero .btn, .hgrid, .g3/.g4) were written for
   the static pages and would fire on unrelated markup here.                  */
@media (max-width:840px){

/* ---- canvas ---- */
body.macc.pg-acc{background:#050505!important;color:#fff!important;overflow-x:hidden!important}
.pg-acc .macc-compat,.pg-acc .macc-main,.pg-acc .macc-hero{background:#050505!important}
.pg-acc .macc-compat{border-bottom:1px solid rgba(255,255,255,.07)!important}
.pg-acc .macc-shead h2,.pg-acc .macc-body h3,.pg-acc .macc-body h3 a{color:#fff!important}
.pg-acc .macc-shead p{color:#A8A8A8!important}
/* the hero orbs are tuned for the old navy hero and bloom too hot on black */
.pg-acc .macc-orb{opacity:.28!important;filter:blur(110px)!important}

/* ---- HERO: render -> badges -> one dominant CTA ---- */
.pg-acc .macc-hero{padding-top:70px!important}
.pg-acc .macc-hero-in{display:flex!important;flex-direction:column!important;padding-bottom:26px!important}
.pg-acc .acc-shot{order:1}
.pg-acc .acc-badges{order:2}
.pg-acc .macc-hero-cta{order:3}
/* the badge card now carries warranty + testing + pickup, so the stat row below
   is a straight duplicate - the technology hero drops it for the same reason */
.pg-acc .macc-stats{display:none!important}
.pg-acc .macc-hero h1{font-size:clamp(34px,9vw,46px)!important;margin:18px 0 14px!important}
.pg-acc .macc-sub{font-size:15px!important;line-height:1.6!important;color:rgba(255,255,255,.72)!important}
.pg-acc .macc-kicker{
  background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.14)!important;
  color:rgba(255,255,255,.86)!important;font-size:11.5px!important}

.pg-acc .acc-shot{
  position:relative;margin:22px auto 0;width:min(94vw,430px);display:grid;place-items:center}
.pg-acc .acc-glow{
  position:absolute;inset:-14%;border-radius:50%;z-index:0;pointer-events:none;
  background:radial-gradient(circle at 50% 54%,rgba(247,161,43,.24),rgba(247,161,43,.08) 46%,transparent 74%);
  filter:blur(12px)}
.pg-acc .acc-shot img{
  position:relative;z-index:1;width:100%;height:auto;max-height:200px;object-fit:contain;
  filter:drop-shadow(0 26px 34px rgba(0,0,0,.9)) drop-shadow(0 6px 14px rgba(0,0,0,.55))}

.pg-acc .acc-badges{
  display:grid;grid-template-columns:repeat(3,1fr);gap:0;
  margin:24px auto 0;max-width:390px;width:100%;
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);
  border-radius:24px;padding:16px 6px;
  box-shadow:0 22px 44px -28px rgba(0,0,0,.95)}
.pg-acc .acc-badge{
  display:flex;flex-direction:column;align-items:center;gap:5px;text-align:center;padding:0 5px}
.pg-acc .acc-badge svg{color:#D8A03D}
.pg-acc .acc-badge b{color:#fff;font-size:12px;font-weight:600;line-height:1.15}
.pg-acc .acc-badge span{color:#A8A8A8;font-size:10px;line-height:1.25}

.pg-acc .macc-hero-cta{
  display:flex!important;flex-direction:column!important;align-items:stretch!important;
  gap:10px!important;margin:24px 0 0!important}
.pg-acc .macc-hero-cta .btn-primary{width:100%!important;text-align:center!important;padding:15px 22px!important}
.pg-acc .macc-hero-cta .btn-ghost{
  background:transparent!important;border:0!important;color:#A8A8A8!important;
  text-decoration:underline;text-underline-offset:4px;font-size:13.5px!important;
  padding:4px 0!important;width:auto!important;align-self:center!important}

/* ---- device picker -> glass pills on one scrolling line ---- */
.pg-acc .macc-compat{padding:40px 0!important}
.pg-acc .macc-devs{
  display:flex!important;flex-wrap:nowrap!important;gap:9px!important;
  overflow-x:auto!important;scrollbar-width:none;
  margin-inline:calc(50% - 50vw)!important;width:100vw!important;
  padding:2px clamp(20px,5vw,26px) 6px!important}
.pg-acc .macc-devs::-webkit-scrollbar{display:none;height:0}
.pg-acc .macc-dev{
  flex:0 0 auto!important;white-space:nowrap!important;
  background:rgba(255,255,255,.055)!important;border:1px solid rgba(255,255,255,.12)!important;
  color:rgba(255,255,255,.88)!important;border-radius:100px!important;
  padding:11px 17px!important;font-size:13.5px!important}
.pg-acc .macc-dev.on{
  background:linear-gradient(135deg,#F7A12B,#F2890E)!important;color:#12100a!important;
  border-color:transparent!important;box-shadow:0 14px 26px -14px rgba(242,137,14,.8)!important}

/* ---- filter bar -> dark, family pills on one line ---- */
.pg-acc .macc-bar{
  background:rgba(5,5,5,.94)!important;backdrop-filter:blur(12px);
  border-bottom:1px solid rgba(255,255,255,.06)!important;
  flex-direction:column!important;align-items:stretch!important;gap:11px!important}
.pg-acc .macc-fams{
  display:flex!important;flex-wrap:nowrap!important;gap:8px!important;
  overflow-x:auto!important;scrollbar-width:none;
  margin-inline:calc(50% - 50vw)!important;width:100vw!important;
  padding:0 clamp(20px,5vw,26px)!important}
.pg-acc .macc-fams::-webkit-scrollbar{display:none;height:0}
.pg-acc .macc-fam{
  flex:0 0 auto!important;white-space:nowrap!important;
  background:rgba(255,255,255,.055)!important;border:1px solid rgba(255,255,255,.12)!important;
  color:rgba(255,255,255,.82)!important}
.pg-acc .macc-fam.on{background:#fff!important;color:#0a0c10!important;border-color:#fff!important}
.pg-acc .macc-search input{
  background:rgba(255,255,255,.05)!important;border:1px solid rgba(255,255,255,.12)!important;
  color:#fff!important;border-radius:100px!important}
.pg-acc .macc-search input::placeholder{color:rgba(255,255,255,.42)!important}
.pg-acc .macc-count{color:rgba(255,255,255,.5)!important}

/* ---- PRODUCT CARDS -> the technology-page .bc card ----
   2 across, dark glass, and the photo keeps a WHITE plate because the whole
   catalogue is shot on white: dropping the plate would leave every product
   floating on a white rectangle against the black page. ---- */
.pg-acc .macc-main{padding:26px 0 60px!important}
.pg-acc .macc-grid{
  display:grid!important;grid-template-columns:1fr 1fr!important;gap:12px!important}
.pg-acc .macc-card{
  background:#111111!important;border:1px solid rgba(255,255,255,.08)!important;
  border-radius:22px!important;
  box-shadow:0 22px 40px -26px rgba(0,0,0,.95)!important}
.pg-acc .macc-media{
  background:#fff!important;border-radius:18px!important;margin:8px 8px 0!important;
  padding:12px!important;aspect-ratio:1/1!important}
.pg-acc .macc-body{padding:10px 13px 14px!important;gap:8px!important}
.pg-acc .macc-body h3{font-size:13.5px!important;line-height:1.3!important}
.pg-acc .macc-mini{display:none!important}
.pg-acc .macc-tag{
  background:linear-gradient(135deg,#E0AE4E,#D8A03D)!important;color:#12100a!important;
  border-radius:100px!important;font-size:10px!important;font-weight:700!important;
  letter-spacing:.06em;padding:5px 10px!important}
.pg-acc .macc-save{
  background:#32D17B!important;color:#04120a!important;border-radius:100px!important;
  font-size:10.5px!important;font-weight:700!important;padding:5px 9px!important}
.pg-acc .macc-foot{flex-direction:column!important;align-items:stretch!important;gap:9px!important}
.pg-acc .macc-price b{color:#fff!important;font-size:16px!important}
.pg-acc .macc-price s{color:rgba(255,255,255,.4)!important}
.pg-acc .macc-price i{color:rgba(255,255,255,.45)!important}
.pg-acc .macc-look{
  width:100%!important;background:rgba(255,255,255,.07)!important;
  border:1px solid rgba(255,255,255,.16)!important;color:#fff!important;
  border-radius:100px!important;padding:9px 0!important;font-size:12.5px!important}

/* ---- trust band -> glass cards, 2 across ---- */
.pg-acc .macc-trust{background:#050505!important;padding:38px 0!important;
  border-top:1px solid rgba(255,255,255,.07)!important}
.pg-acc .macc-trow{
  display:grid!important;grid-template-columns:1fr 1fr!important;gap:11px!important}
.pg-acc .macc-trow>div{
  background:rgba(255,255,255,.05)!important;border:1px solid rgba(255,255,255,.09)!important;
  border-radius:20px!important;padding:16px 14px!important;
  display:flex;flex-direction:column;gap:7px}
.pg-acc .macc-trow .ti{color:#D8A03D!important}
.pg-acc .macc-trow b{color:#fff!important;font-size:13.5px!important;line-height:1.2}
.pg-acc .macc-trow small{color:#A8A8A8!important;font-size:11.5px!important;line-height:1.4}

/* ---- empty state + quick-look modal ---- */
.pg-acc .macc-empty{color:rgba(255,255,255,.7)!important}
.pg-acc .macc-empty .btn-ghost{color:#fff!important;border-color:rgba(255,255,255,.28)!important}
.pg-acc .macc-modal-in{background:#111111!important;color:#fff!important;
  border:1px solid rgba(255,255,255,.1)!important}
.pg-acc .macc-modal-in h3{color:#fff!important}
.pg-acc .macc-m-top img{background:#fff!important;border-radius:14px!important}
.pg-acc .macc-x{color:#fff!important}
}

/* v50b: .store p spacing on the category contact card (no base rule there) */
@media (max-width:840px){
.pg-cat .store p{margin:12px 0 0!important}
.pg-cat .store h3{margin:0!important}
}

/* ============ v51: three defects found on the live /accessoires build ========

   1. THE FIRST DEVICE PILL WAS UNREACHABLE. .macc-devs inherits
      justify-content:center from the desktop layout. Centred flex content that
      overflows its container spills past BOTH edges, and the left overflow is
      not scrollable - scrollLeft:0 is already the leftmost position, yet
      "Tous les appareils" sat at x=-183. Classic centring-plus-overflow trap:
      any flex row that becomes a scroller must be flex-start.

   2. The tag and the discount pill COLLIDED. Both are absolutely positioned
      12px from opposite corners of .macc-media, which is fine at the desktop
      card width but not at 165px: "Charge rapide" measured 95px wide and ran
      under the -25% pill. The tag moves to the BOTTOM of the plate, where it
      has the full width and cannot meet the pill at all.

   3. The search field stayed white. The white background is on the .macc-search
      WRAPPER, not the <input> - v50 styled the input, which was already
      transparent, so nothing visibly changed.                                */
@media (max-width:840px){

/* 1 */
.pg-acc .macc-devs{justify-content:flex-start!important}
.pg-acc .macc-fams{justify-content:flex-start!important}

/* 2 */
.pg-acc .macc-tag{
  top:auto!important;bottom:10px!important;left:10px!important;right:auto!important;
  max-width:calc(100% - 20px)!important;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pg-acc .macc-save{top:10px!important;right:10px!important}

/* 3 */
.pg-acc .macc-search{
  background:rgba(255,255,255,.05)!important;
  border:1px solid rgba(255,255,255,.12)!important;
  border-radius:100px!important;color:rgba(255,255,255,.55)!important}
.pg-acc .macc-search svg{color:rgba(255,255,255,.45)!important}
.pg-acc .macc-search input{background:transparent!important;border:0!important;color:#fff!important}
}

/* ============ v52: hide the injected /accessoires hero DOM on desktop ========
   BUG SHIPPED IN v50 AND CAUGHT ON A FRESH 1280px LOAD. .acc-shot and
   .acc-badges are real markup added to mascot-accessories.php, so they exist at
   every width - but every rule that sizes them lives inside max-width:840px.
   Above the breakpoint the render fell back to its intrinsic 1294px width
   inside the light desktop hero, and the badge row rendered as three unstyled
   stacked blocks.

   Same guard the repair/print render already carries
   (@media (min-width:841px){.rep-shot,.rep-badges{display:none}}). The rule
   from v48 covered .tr-shot on /transfert-dargent; this is its counterpart.

   RULE, again: markup injected for one side of a media query must be given
   explicit behaviour on the OTHER side - the v27 lesson, in a new place.    */
@media (min-width:841px){
  .acc-shot,.acc-badges{display:none!important}
}

/* ============ v53: gate the galerie contact card to mobile ============
   mascot_cat_contact() adds a .store block to /mascot-galerie, but every rule
   that styles it (v48b/v48c/v50b) is inside max-width:840px - and
   mascot-category.php has no .store, .info, .ir or .btn of its own. Above the
   breakpoint it therefore rendered as an unstyled heading, paragraph and two
   bare links on the desktop page.

   This whole pass is mobile-only and desktop is deliberately untouched
   everywhere else, so the card is gated to match rather than given a desktop
   design that nobody asked for. To promote it to desktop later, delete this
   rule and add the desktop layout.

   Third instance this session of the same rule: markup added for one side of a
   media query needs explicit behaviour on the other side.                   */
@media (min-width:841px){
  .pg-cat .mstore-sec{display:none!important}
}

/* ============ v54a: /accessoires hero render was overhanging the page ========
   Reported and measured: .acc-shot computed 366.6px wide (min(94vw,430px))
   inside a .macc-hero-in content box of only 342px (390 - 2x24 padding), so it
   started at the content-box left edge and ran to x=391 - 1px past the viewport
   and 25px past its container. It read as "leaning to the side and falling off
   the page", which is exactly what it was doing.

   WHY THE auto MARGINS DID NOT SAVE IT: v50 made .macc-hero-in a flex column so
   `order` could rearrange the hero. `margin:0 auto` centres an over-wide BLOCK
   by overflowing both sides, but an over-wide FLEX ITEM is pinned to the start
   edge and overflows one way only. Sizing an element in vw inside a padded
   container is the actual mistake - the cap has to come from the container.

   Fixed by sizing off the container (100%), keeping it centred with
   align-self, and letting it run slightly wider than the copy column on
   purpose - the lineup render is the focal point - while staying inside the
   viewport at every width.                                                  */
@media (max-width:840px){
.pg-acc .acc-shot{
  width:min(100%,440px)!important;
  max-width:100%!important;
  margin-left:auto!important;margin-right:auto!important;
  align-self:center!important}
.pg-acc .acc-shot img{max-height:210px!important}
.pg-acc .acc-badges{align-self:center!important}
}

/* ============ v54b: the galerie section gets its homepage sub-banner ========
   /mascot-galerie opened with a plain dark text block (.top > .crumb + .htitle
   + .hsub) while the homepage leads the same content with the rich .svc-banner.
   This renders that banner on the category page.

   Same class names on purpose: mk-mobile.css's generic .svc-banner mobile rules
   (v24 - photo becomes the full-bleed background, scrim on .sb-media::after,
   .sb-inner padding) then apply here with no duplication. What has to be added
   is the BASE structure, because those base rules live in accueil.html's inline
   <style> and never reached mascot-category.php - along with .btn/.btn-primary
   /.arw, which this template also does not define.

   The banner repeats the headline and the count, so .htitle/.hsub are hidden
   here rather than shown twice; the crumb stays for navigation. The banner's
   heading is an <h1> so the page still has exactly one.

   Mobile only, like the rest of this pass - gated below so the desktop page is
   untouched.                                                                */
@media (max-width:840px){

.pg-gal .gal-banner-wrap{padding-left:0!important;padding-right:0!important}
/* the banner now carries both, so the plain block would be a duplicate */
.pg-gal .top .htitle,.pg-gal .top .hsub{display:none!important}
.pg-gal .top{padding-bottom:0!important}

/* ---- base structure, ported from accueil.html and scoped to this page ---- */
.pg-gal .svc-banner{
  position:relative;display:flex;align-items:center;overflow:hidden;isolation:isolate;
  margin:14px 0 22px;background:#0a0c10;
  --acc:#E8B84B;--accW:rgba(232,184,75,.20)}
.pg-gal .svc-banner::before{
  content:"";position:absolute;inset:0;z-index:0;
  background:
    radial-gradient(780px 440px at 84% 45%,var(--accW),transparent 60%),
    linear-gradient(118deg,#0a0c10 0%,#0f131b 64%)}
.pg-gal .svc-banner .edge{
  position:absolute;left:0;top:0;bottom:0;width:6px;z-index:3;
  background:linear-gradient(180deg,var(--acc),transparent)}
.pg-gal .svc-banner .sb-num{
  position:absolute;top:4px;left:clamp(16px,4vw,44px);z-index:1;
  font-family:'Clash Display',sans-serif;font-weight:700;font-size:clamp(52px,8vw,120px);
  line-height:1;color:rgba(255,255,255,.05);pointer-events:none}
.pg-gal .svc-banner .sb-inner{
  position:relative;z-index:3;width:100%;margin:0 auto;
  display:grid;grid-template-columns:1fr}
.pg-gal .svc-banner .sb-in{position:relative;z-index:2;max-width:560px}
.pg-gal .svc-banner .sb-flag{
  display:flex;width:62px;height:4px;border-radius:4px;overflow:hidden;margin-bottom:16px;
  box-shadow:0 2px 12px rgba(0,0,0,.4)}
.pg-gal .svc-banner .sb-flag i{flex:1}
.pg-gal .svc-banner .sb-flag i:nth-child(1){background:#F2890E}
.pg-gal .svc-banner .sb-flag i:nth-child(2){background:#fff}
.pg-gal .svc-banner .sb-flag i:nth-child(3){background:#13BE6D}
.pg-gal .svc-banner .kick{
  display:block;color:var(--acc);font-size:12px;font-weight:600;letter-spacing:2.4px;
  text-transform:uppercase;text-shadow:0 2px 14px rgba(0,0,0,.55)}
.pg-gal .svc-banner h1{
  color:#fff;font-family:'Clash Display',sans-serif;font-weight:600;
  font-size:clamp(28px,8vw,42px);letter-spacing:-.02em;line-height:1.02;
  margin:12px 0 8px;text-shadow:0 3px 30px rgba(0,0,0,.5)}
.pg-gal .svc-banner p{
  color:rgba(255,255,255,.88);max-width:48ch;font-size:15px;line-height:1.5;
  margin:0;text-shadow:0 2px 14px rgba(0,0,0,.5)}
.pg-gal .svc-banner .sb-chips{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:18px 0 22px}
.pg-gal .svc-banner .sb-chips span{
  font-size:11.5px;font-weight:500;padding:8px 10px;border-radius:100px;text-align:center;
  background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.25);color:#fff;
  white-space:nowrap}
/* the template defines no .btn at all - bring its chrome, as the .store card does */
.pg-gal .svc-banner .btn-primary{
  display:flex;align-items:center;justify-content:center;gap:9px;width:100%;
  background:linear-gradient(135deg,#F7A12B,#F2890E);color:#12100a;
  padding:15px 22px;border-radius:100px;text-decoration:none;
  font-size:15px;font-weight:600;line-height:1;
  box-shadow:0 16px 30px -16px rgba(242,137,14,.8)}
.pg-gal .svc-banner .btn-primary .arw{color:#12100a}
/* the painting is the highest-contrast background on the site - same heavier
   scrim the homepage galerie banner uses (v24) */
.pg-gal .svc-banner .sb-media::after{
  background:
    radial-gradient(620px 380px at 84% 6%,var(--accW),transparent 62%),
    linear-gradient(180deg,rgba(6,7,9,.93) 0%,rgba(6,7,9,.88) 32%,rgba(6,7,9,.93) 70%,rgba(6,7,9,.98) 100%)!important}
}
/* mobile-only addition, like every other injected block in this pass */
@media (min-width:841px){
  .pg-gal .gal-banner-wrap{display:none!important}
}

/* ============ v55: Wave 2 sections on /accessoires ============
   The four Wave-2 blocks (À la une / Pourquoi Mascot / L'expérience / Avis
   clients) are now rendered on the accessories page by the SAME functions the
   technology category pages use. Their CSS in the v35 block above was
   `.pg-cat`-scoped; it has been widened in place to
   `:is(.pg-cat,.pg-acc)` — 50 selectors — rather than duplicating ~7 KB of
   rules or adding a misleading `pg-cat` class to a page that is not a category.

   What still has to be added here is the SHELL those sections sit in.
   mascot-accessories.php has its own `macc-*` namespace and defines no `.sec`,
   `.wrap` or `.sh` — the Wave-2 markup uses all three, and on the category
   pages they come from mascot-category.php's inline <style>. Same gap that bit
   the `.store` card and the galerie banner: these shared blocks assume a host
   page that supplies the basic layout classes.

   Copy note: mascot_cat_why() and mascot_cat_experience() now take copy
   overrides, because the defaults say "appareil" — accurate for a phone, wrong
   for a cable. The accessories page passes wording about compatibility and
   testing instead.                                                          */
@media (max-width:840px){

/* ---- the shell the shared sections expect ---- */
.pg-acc .sec{padding:26px 0}
.pg-acc .wrap{max-width:1220px;margin:0 auto;padding:0 clamp(20px,5vw,26px)}
.pg-acc .sh{
  color:#fff!important;font-family:'Clash Display',sans-serif;font-weight:600;
  font-size:clamp(24px,7vw,32px);letter-spacing:-.02em;line-height:1.05;margin:0 0 16px}

/* the full-bleed rails measure against the viewport, so they must not also
   inherit .wrap's padding */
.pg-acc .mfeat,.pg-acc .mwhy,.pg-acc .mrev{margin-top:2px}

/* ---- .macc-trust is now a DUPLICATE of "Pourquoi Mascot Inc." ----
   Both are trust bands and four of the five claims are the same sentence
   ("Testé avant vente", "Garanti 12 mois", "Retrait à Yamoussoukro",
   "Conseil gratuit"). Showing both says everything twice, so the older,
   plainer band gives way to the Wave-2 carousel the user asked for.
   Markup untouched — deleting this rule brings it straight back, and desktop
   still shows it. */
.pg-acc .macc-trust{display:none!important}

/* the page ends on Avis clients now, so give the last section room above the
   footer that .macc-trust used to provide */
.pg-acc .mrev-sec{padding-bottom:44px!important}
}

/* ============ v57: gate the /accessoires Wave-2 sections to mobile ==========
   FOURTH time this session, same root cause, so it is worth stating as a
   standing rule rather than a note:

     ANY markup added to a page for a mobile-only pass MUST be given explicit
     behaviour above the breakpoint. Rendering it is a PHP decision; styling it
     is a CSS-inside-@media decision. Those two do not cancel out.

   Measured on a fresh 1280px load before writing this: .mfc computed
   background:transparent and width:1265px (one full-page-width card per row),
   .mexp transparent, .wrap padding:0 - i.e. the four sections rendered as a
   long unstyled stack under the desktop product grid.

   The category pages don't need this gate because mascot-category.php supplies
   .sec/.wrap/.sh itself and the desktop layout was designed with them present.
   mascot-accessories.php supplies none of that, so the sections are mobile-only
   here. To promote them to desktop later: delete this rule and give
   :is(.pg-acc) .mfeat/.mwhy/.mexp/.mrev a desktop grid.                     */
@media (min-width:841px){
  .pg-acc .mfeat-sec,
  .pg-acc .mwhy-sec,
  .pg-acc .mexp-sec,
  .pg-acc .mrev-sec{display:none!important}
}

/* ============ v58: one standing gate for mobile-only markup ============
   The CSS side of mobile/desktop separation is already effectively total:
   98.5% of this sheet sits inside @media (max-width:840px) and cannot reach
   desktop at all. The failures this project keeps hitting are never CSS bleed —
   they are MARKUP: an element rendered by PHP/JS for the mobile layout that
   nobody remembered to hide above the breakpoint, so it lands on the desktop
   page with no styling. It happened four times in one session
   (.acc-shot/.acc-badges, the galerie .store, the Wave-2 sections, and .tr-shot
   caught just before shipping).

   Each of those got its own bespoke gate. This is the generic one: put
   `mk-m-only` on ANY element added for the mobile layout and it is hidden above
   the breakpoint by default — safe without anyone having to remember.

   The reverse also exists for completeness: `mk-d-only` marks desktop-only
   markup that must not appear on phones.

   DO NOT put mk-m-only inside a renderer that is SHARED with the desktop
   layout (e.g. mascot_cat_featured(), which the technology category pages show
   on desktop) — it belongs on page-specific injected markup only.           */
@media (min-width:841px){
  .mk-m-only{display:none!important}
}
@media (max-width:840px){
  .mk-d-only{display:none!important}
}

/* ============ v59: before/after carousel on the /reparation hero ============
   The hero render becomes a three-frame auto-crossfading stack:
     1. cracked iPhone   (Avant)  - the render that was already there
     2. cracked iPad Pro (Avant)
     3. the SAME iPad Pro, repaired (Après)
   Frames 2 and 3 are the same device at the same size and angle, so the 2→3
   crossfade reads as the screen healing - that transition is the whole point,
   and it holds longest.

   BOTH SOURCE FILES ARRIVED AS TRUE TRANSPARENT WEBP (corner alpha 0), so no
   flood fill or flatten-to-dark was needed - only a trim, a resize and a
   256-colour quantise. Third time a user-supplied asset has come in clean.

   ⚠️ SUBJECT/BACKGROUND CONTRAST WAS CHECKED FIRST, because this is exactly
   where the earlier repair cut-out failed: `repair-ecran-casse.jpg` was removed
   cleanly but the phones were near-black and vanished into the #050505 hero.
   Here the aluminium body measures luma ~82 (51-139 down the left edge) against
   a background of ~5. Verified on a preview sheet rendered on the REAL hero
   colour before shipping: both iPads separate clearly. A rim-light drop-shadow
   was tried and REJECTED - it read as a halo, and .rep-glow already supplies
   the ambient separation.

   Scoped to .pg-reparation: `.rep-shot` is shared with /impression (v45), which
   still has a single plain <img> inside it and must not be touched.          */
@media (max-width:840px){

.pg-reparation .rep-shot{position:relative}

/* the stack needs a definite height because the slides are absolute; the base
   rule sized the single <img> with max-height instead */
.pg-reparation .rep-shot .rs-stack{
  position:relative;z-index:1;width:100%;height:300px}
.pg-reparation .rep-shot .rs-slide{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:contain;object-position:center bottom;
  opacity:0;transform:scale(.985);
  transition:opacity .85s cubic-bezier(.4,0,.2,1),transform .85s cubic-bezier(.4,0,.2,1);
  filter:drop-shadow(0 26px 34px rgba(0,0,0,.9)) drop-shadow(0 6px 14px rgba(0,0,0,.55));
  max-height:none}
.pg-reparation .rep-shot .rs-slide.on{opacity:1;transform:scale(1)}

/* Avant / Après state pill - the label is what turns a slideshow into a
   before/after story. Amber while broken, green once repaired (the page's
   own repair accent). */
.pg-reparation .rep-shot .rs-state{
  position:absolute;z-index:3;left:50%;transform:translateX(-50%);
  top:2px;
  display:inline-flex;align-items:center;gap:7px;
  padding:6px 14px;border-radius:100px;
  font-size:11px;font-weight:700;letter-spacing:1.6px;text-transform:uppercase;
  background:rgba(247,161,43,.16);border:1px solid rgba(247,161,43,.42);color:#F7A12B;
  transition:background .5s,border-color .5s,color .5s}
.pg-reparation .rep-shot .rs-state::before{
  content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
.pg-reparation .rep-shot .rs-state.is-apres{
  background:rgba(19,190,109,.16);border-color:rgba(19,190,109,.45);color:#13BE6D}

/* dots, in the same language as every other carousel on the site */
.pg-reparation .rep-shot .rs-dots{
  position:relative;z-index:3;display:flex;justify-content:center;gap:7px;margin-top:14px}
.pg-reparation .rep-shot .rs-dots button{
  position:relative;width:22px;height:14px;padding:0;border:0;background:none;cursor:pointer}
.pg-reparation .rep-shot .rs-dots button::after{
  content:"";position:absolute;left:0;top:5px;width:22px;height:4px;border-radius:4px;
  background:rgba(255,255,255,.22);
  transform:scaleX(.5);transform-origin:left center;
  transition:transform .4s cubic-bezier(.4,0,.2,1),background .4s}
.pg-reparation .rep-shot .rs-dots button.on::after{
  background:linear-gradient(90deg,#19d67a,#13BE6D);transform:scaleX(1)}

/* the glow sits behind the stack and tracks the state */
.pg-reparation .rep-shot .rep-glow{transition:background .8s}
.pg-reparation .rep-shot.is-apres .rep-glow{
  background:radial-gradient(circle at 50% 50%,rgba(19,190,109,.38),rgba(19,190,109,.12) 46%,transparent 74%)!important}
}

/* Respect reduced-motion: mk-mobile.js stops auto-rotating, so make sure the
   crossfade itself is instant rather than a long dissolve on manual taps. */
@media (prefers-reduced-motion:reduce){
  .pg-reparation .rep-shot .rs-slide{transition:none!important;transform:none!important}
}

/* ============ v60: move the Avant/Après pill out of the artwork ============
   v59 pinned the pill to the top of the stack, which was fine over the iPhone
   (narrow, short) but lands squarely ON the screen of both iPad frames - they
   are taller and reach the top of the 300px box. Caught on the live page.

   The pill moves into normal flow BELOW the render instead. `.rep-shot` is
   already `display:grid; place-items:center`, so a static child simply becomes
   its own centred row - render, then state, then dots. It can no longer collide
   with artwork of any aspect ratio, which also makes the component safe if more
   before/after pairs are added later.                                        */
@media (max-width:840px){
.pg-reparation .rep-shot .rs-state{
  position:static!important;left:auto!important;top:auto!important;
  transform:none!important;
  margin:16px 0 0!important}
.pg-reparation .rep-shot .rs-dots{margin-top:11px}
}

/* ============ v62: category hero -> multi-frame crossfade carousel ============
   Same language as the /reparation hero stack (v59): absolutely-stacked frames,
   one .on at a time, 0.85s opacity+scale crossfade, dots below. Driven by
   mk-mobile.js section 7. Currently only /iphone (term 48) has a set.

   NO Avant/Apres pill here - that label is specific to the repair story and is
   meaningless on a product lineup. Crossfade + dots + auto-rotation only.

   NOTE the desktop gate at the bottom is NOT optional. .mch-shot has NO desktop
   CSS at all (every rule for it lives inside max-width:840px), so above 840px
   the frames would each render at natural size in normal flow - seven stacked
   ~1000px images. Same markup-leak class of bug as v27/v52/v57.             */
@media (max-width:840px){
.pg-cat .mch-shot.is-multi{
  position:relative;margin:22px auto 0;width:min(86vw,360px);
  aspect-ratio:auto;display:block}
.pg-cat .mch-shot.is-multi .mch-stack{
  position:relative;z-index:1;width:100%;height:300px}
.pg-cat .mch-shot.is-multi .mch-slide{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:contain;object-position:center center;
  opacity:0;transform:scale(.985);
  transition:opacity .85s cubic-bezier(.4,0,.2,1),transform .85s cubic-bezier(.4,0,.2,1);
  background:none;padding:0;border-radius:0;
  filter:drop-shadow(0 26px 34px rgba(0,0,0,.85)) drop-shadow(0 4px 10px rgba(0,0,0,.55));
  box-shadow:none}
.pg-cat .mch-shot.is-multi .mch-slide.on{opacity:1;transform:scale(1)}
.pg-cat .mch-shot.is-multi .mch-glow{
  inset:-8%;
  background:radial-gradient(circle at 50% 52%,rgba(216,160,61,.34),rgba(216,160,61,.12) 44%,transparent 72%);
  filter:blur(10px)}
.pg-cat .mch-dots{
  position:relative;z-index:3;display:flex;justify-content:center;gap:7px;margin-top:16px}
.pg-cat .mch-dots button{
  position:relative;width:22px;height:14px;padding:0;border:0;background:none;cursor:pointer}
.pg-cat .mch-dots button::after{
  content:"";position:absolute;left:0;top:5px;width:22px;height:4px;border-radius:4px;
  background:rgba(255,255,255,.22);
  transform:scaleX(.5);transform-origin:left center;
  transition:transform .4s cubic-bezier(.4,0,.2,1),background .4s}
.pg-cat .mch-dots button.on::after{
  background:linear-gradient(90deg,#E8B84B,#D8A03D);transform:scaleX(1)}
}
@media (prefers-reduced-motion:reduce){
  .pg-cat .mch-shot.is-multi .mch-slide{transition:none!important;transform:none!important}
}
/* v65: the v62 DESKTOP GATE that used to live here has been REMOVED.
   It set display:none on .mch-slide:not(:first-child) while Phase 1 controls
   frame visibility with OPACITY. On the resize path (load at 390 -> drag to
   841 without reloading) mk-mobile.js has already set data-mch-init and is
   still rotating, so it handed .on/opacity:1 to slide 5 while this gate kept
   slide 5 display:none and slide 1 opacity:0 -> BLANK HERO. A fresh desktop
   load hid the fault because the JS bails there and the :not([data-mch-init])
   fail-safe fires. Caught only by testing the resize path, per the v27 rule.
   Phase 1's three :not([data-mch-init]) rules fully replace this gate.     */

/* ============ v62b: /reparation sub-banner colour ============
   Two user-flagged problems. (1) The photo scrim started at only .35, so the
   top of the band was a bright grey workbench shot sitting in an otherwise
   near-black page. (2) Its accents were the site amber while the whole repairs
   page runs on green #13BE6D - the badge label, the "mains." gradient and the
   animated dot progress fill were the last amber holdouts.

   The accents are done by REDEFINING --amber/--orange scoped to .rsub rather
   than overriding each rule: .rbadge{color:var(--amber)}, .grad{linear-gradient
   (var(--amber),var(--orange))} and .dot.on::after all read those vars, so one
   declaration recolours all three and any future rule inherits it too.
   .rbadge i is already var(--green) and is deliberately left alone.        */
@media (max-width:840px){
.pg-reparation .rsub{--amber:#19d67a;--orange:#13BE6D}
.pg-reparation .rsub .scrim{
  background:linear-gradient(rgba(8,10,14,.72),rgba(8,10,14,.95) 72%)!important}
}


/* ============================================================================
   v63 PHASE 1 - WIDTH-AGNOSTIC CATEGORY HERO   (replaces the Phase 0 gate)
   ============================================================================
   THE BUG: v32 added .mch-shot / .mch-glow / .mch-badges to mascot-category.php
   but every rule for them lived inside @media (max-width:840px) and the
   template's own <style> never covered them. Above 840px they fell back to
   browser defaults - .mch-badges display:block => each badge 1108x1135 => card
   3,404px tall; .mch-shot img at natural 1200x1200. Measured live: hero 5,345px
   on /google-pixel, 4,667px on /iphone, on ALL 14 category pages that render it.

   THE STRUCTURAL FIX: this whole block carries NO @media AT ALL. The desktop
   hero is already the same centred-column shape as mobile (.mch-in is
   text-align:center, h1 76px centred, .mch-sub capped 620px) - so there is no
   redesign here, only scaling, and clamp() does scaling without a breakpoint.
   A component with no mobile/desktop divergence CANNOT suffer the "mobile-only
   markup leaked to desktop" bug, which has now bitten 6 times (v27 clones, v52
   .acc-shot, v53 galerie .store, v57 Wave-2, and this). Testing harder does not
   fix that class of bug; removing the divergence does.

   Every clamp below is tuned so the 390px phone value is IDENTICAL to v62.
   The mobile layout must not move by a single pixel.

   These rules sit at the END of the sheet, so at equal specificity they win
   over the earlier copies inside the 840px block - which are now dead weight
   but harmless, and deliberately left in place rather than surgically excised
   from a 153 KB file mid-session.
   ========================================================================= */

/* ---- base .mch-shot : white plate, for categories with neither cut nor set --- */
.pg-cat .mch-shot{
  position:relative;margin:22px auto 0;width:clamp(260px,74vw,420px);
  aspect-ratio:1/1;display:grid;place-items:center}
  /* 390px -> 288.6px  (v62: min(74vw,300px) = 288.6px, unchanged) | 1280px -> 420px */

.pg-cat .mch-glow{
  position:absolute;inset:-14%;border-radius:50%;z-index:0;pointer-events:none;
  background:radial-gradient(circle at 50% 45%,rgba(216,160,61,.30),rgba(216,160,61,.10) 42%,transparent 70%);
  filter:blur(6px)}

.pg-cat .mch-shot img{
  position:relative;z-index:1;width:86%;height:86%;object-fit:contain;
  border-radius:26px;background:#fff;padding:12px;
  box-shadow:0 40px 70px -30px rgba(0,0,0,.95),0 0 0 1px rgba(255,255,255,.10)}

/* ---- .is-cut : the ~11 pages served a hero-cut-<term>.jpg ---- */
.pg-cat .mch-shot.is-cut{
  width:clamp(300px,82vw,480px);aspect-ratio:auto;min-height:240px}
  /* 390px -> 319.8px  (v62: min(82vw,330px) = 319.8px, unchanged) | 1280px -> 480px */
.pg-cat .mch-shot.is-cut img{
  width:100%!important;height:auto!important;
  max-height:clamp(300px,34vw,420px);
  object-fit:contain!important;
  background:none!important;padding:0!important;border-radius:0!important;
  box-shadow:none!important;
  filter:drop-shadow(0 26px 34px rgba(0,0,0,.85)) drop-shadow(0 4px 10px rgba(0,0,0,.55))}
  /* 390px -> max-height 300px (unchanged) | 1280px -> 420px.
     The !important flags are CARRIED OVER, not reasoned away: they exist to beat
     the base `.pg-cat .mch-shot img` plate rule directly above, which is equal
     specificity and would otherwise win on source order for background/padding. */
.pg-cat .mch-shot.is-cut .mch-glow{
  inset:-8%;
  background:radial-gradient(circle at 50% 52%,rgba(216,160,61,.34),rgba(216,160,61,.12) 44%,transparent 72%);
  filter:blur(10px)}

/* ---- .is-multi : the option-driven frame sets (terms 48 / 50 / 64) ---- */
.pg-cat .mch-shot.is-multi{
  position:relative;margin:22px auto 0;width:clamp(300px,86vw,520px);
  aspect-ratio:auto;display:block}
  /* 390px -> 335.4px  (v62: min(86vw,360px) = 335.4px, unchanged) | 1280px -> 520px */
.pg-cat .mch-shot.is-multi .mch-stack{
  position:relative;z-index:1;width:100%;height:clamp(300px,42vw,460px)}
  /* 390px -> 300px (unchanged) | 1280px -> 460px.
     Fixed height => a frame change causes ZERO layout shift / no CLS. */
.pg-cat .mch-shot.is-multi .mch-slide{
  position:absolute;inset:0;width:100%;height:100%;max-width:none;margin:0;
  object-fit:contain;object-position:center center;
  opacity:0;transform:scale(.985);
  transition:opacity .85s cubic-bezier(.4,0,.2,1),transform .85s cubic-bezier(.4,0,.2,1);
  background:none;padding:0;border-radius:0;box-shadow:none;
  filter:drop-shadow(0 26px 34px rgba(0,0,0,.85)) drop-shadow(0 4px 10px rgba(0,0,0,.55))}
.pg-cat .mch-shot.is-multi .mch-slide.on{opacity:1;transform:scale(1)}
.pg-cat .mch-shot.is-multi .mch-glow{
  inset:-8%;
  background:radial-gradient(circle at 50% 52%,rgba(216,160,61,.34),rgba(216,160,61,.12) 44%,transparent 72%);
  filter:blur(10px)}

/* ---- THE FAIL-SAFE, and why there is no @media here ----
   mk-mobile.js section 7 sets `shot.dataset.mchInit = '1'` when it takes the
   carousel over. That attribute is the honest signal for "JS is driving this",
   and it is a far better hook than a width breakpoint:

     JS ran (mobile today, desktop after Phase 2) -> attribute present, these
       three rules drop out, the carousel owns opacity.
     JS bailed (desktop today, at the max-width:840px guard)  -> static frame 1.
     JS blocked / errored / slow ANYWHERE -> static frame 1, never a blank hero.

   That last line is a real improvement on v62: because .mch-slide now carries
   opacity:0 at every width, a width-gated fallback would have shown an EMPTY
   hero anywhere JS failed to run. Keying off the attribute instead of the
   viewport makes the failure mode correct by construction.

   PHASE 2 THEREFORE NEEDS ZERO CSS CHANGE - loading mk-hero.js on desktop makes
   the attribute appear and these rules stand down on their own.            */
.pg-cat .mch-shot.is-multi:not([data-mch-init]) .mch-slide:not(:first-child){display:none}
.pg-cat .mch-shot.is-multi:not([data-mch-init]) .mch-slide:first-child{opacity:1;transform:none}
.pg-cat .mch-shot.is-multi:not([data-mch-init]) .mch-dots{display:none}

/* ---- badge card : 3 columns at EVERY width ---- */
.pg-cat .mch-badges{
  display:grid!important;grid-template-columns:repeat(3,1fr);gap:0;
  margin:24px auto 0;max-width:clamp(360px,50vw,560px);
  background:rgba(255,255,255,.05);border:1px solid var(--mkLine);
  border-radius:24px;padding:16px 6px;
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  box-shadow:0 22px 44px -28px rgba(0,0,0,.95)}
  /* 390px -> 360px (unchanged) | 1280px -> 560px.
     display:grid keeps its !important - that flag is what stops the browser
     default display:block that produced the 3,404px card. */
.pg-cat .mch-badge{
  display:flex;flex-direction:column;align-items:center;gap:5px;
  text-align:center;padding:0 4px}
.pg-cat .mch-badge svg{
  width:clamp(21px,1.9vw,26px);height:clamp(21px,1.9vw,26px);color:var(--mkGold)}
.pg-cat .mch-badge b{
  color:#fff;font-size:clamp(12.5px,1.1vw,15px);font-weight:600;letter-spacing:-.01em}
.pg-cat .mch-badge span{
  color:var(--mkDim);font-size:clamp(11px,.95vw,13px)}

/* ---- dots ---- */
.pg-cat .mch-dots{
  position:relative;z-index:3;display:flex;justify-content:center;gap:7px;margin-top:16px}
.pg-cat .mch-dots button{
  position:relative;width:22px;height:14px;padding:0;border:0;background:none;cursor:pointer}
.pg-cat .mch-dots button::after{
  content:"";position:absolute;left:0;top:5px;width:22px;height:4px;border-radius:4px;
  background:rgba(255,255,255,.22);
  transform:scaleX(.5);transform-origin:left center;
  transition:transform .4s cubic-bezier(.4,0,.2,1),background .4s}
.pg-cat .mch-dots button.on::after{
  background:linear-gradient(90deg,#E8B84B,#D8A03D);transform:scaleX(1)}

@media (prefers-reduced-motion:reduce){
  .pg-cat .mch-shot.is-multi .mch-slide{transition:none!important}
}

/* ============================================================================
   v66 - "REFLET" NEW-ARRIVAL TREATMENT (option C, chosen from the effects lab)
   ============================================================================
   A specular highlight sweeps across the device, MASKED TO THE SILHOUETTE
   rather than to a rectangle - that masking is the whole point, it is what
   separates a product shine from a banner-ad glare. Plus a NOUVEAU pill.

   Applies ONLY to frames carrying data-new="1", which mascot-category.php emits
   from the 'new' flag in the mascot_cat_hero_set option. Today that is the 7
   iPhone frames (17 Pro / 17 / Air) and the 5 Pixel frames (10 Pro / 10 Pro
   Fold). Nothing on Android/Samsung/tablets - no new products exist there and a
   NOUVEAU pill over a Galaxy S24 would just be untrue. Clearing the flag is the
   off-switch; no CSS or template change needed.

   NO @media, deliberately - same reasoning as the Phase 1 hero block. This
   markup exists at every width, so width-gating it is exactly how the
   mobile-only-markup leak keeps recurring. It therefore also works unchanged
   when Phase 2 turns the desktop carousel on.
   ========================================================================= */

/* The sheen is the IMMEDIATELY ADJACENT sibling of its own slide, so the plain
   sibling selector below does all the work: no JS change, and the sweep
   restarts by itself every time that slide regains .on (the rule stops
   matching, the animation is dropped, and re-added on the next turn).

   inset:0 + mask "center/contain" aligns the mask box EXACTLY with the slide's
   object-fit:contain box, so the highlight tracks the device however the frame
   is letterboxed - which is why wide lineups and tall pairs both work. */
.pg-cat .mch-sheen{
  position:absolute;inset:0;z-index:3;pointer-events:none;opacity:0;
  -webkit-mask:var(--sweep) center/contain no-repeat;
          mask:var(--sweep) center/contain no-repeat;
  background:linear-gradient(115deg,
    transparent 38%,rgba(255,255,255,.85) 50%,transparent 62%);
  background-size:280% 100%;background-position:130% 0;
  mix-blend-mode:screen}

/* only the ACTIVE new frame paints or animates - 16 always-animating blend
   layers would be real work for a phone GPU, for something invisible */
.pg-cat .mch-slide.on[data-new] + .mch-sheen{
  opacity:1;animation:mchSheen 3.4s cubic-bezier(.5,0,.3,1) infinite}

@keyframes mchSheen{
  0%{background-position:130% 0}
  55%,100%{background-position:-60% 0}}

/* ---- the NOUVEAU pill ----
   IN NORMAL FLOW ABOVE THE STACK, not floated over the artwork. The v59 repair
   hero had to move its Avant/Apres pill out of the render for exactly this
   reason: a badge pinned over the image is only ever validated against the
   first frame, and these 16 frames range from a narrow single handset to a
   1462px-wide six-colour lineup. Out of the artwork it cannot collide with any
   of them.

   The height is reserved UNCONDITIONALLY and only opacity animates, so frames
   entering and leaving cause ZERO layout shift - the stack never moves. */
.pg-cat .mch-shot.is-multi .mch-new{
  display:flex;align-items:center;justify-content:center;gap:6px;
  width:fit-content;height:26px;margin:0 auto 10px;padding:0 13px;
  border-radius:999px;white-space:nowrap;
  font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  color:#0A0C10;background:linear-gradient(90deg,#F7D774,#E8B84B);
  box-shadow:0 8px 20px -8px rgba(232,184,75,.95);
  opacity:0;transform:translateY(-4px);
  transition:opacity .5s cubic-bezier(.16,1,.3,1),transform .5s cubic-bezier(.16,1,.3,1)}
.pg-cat .mch-shot.is-multi .mch-new i{
  width:5px;height:5px;border-radius:50%;background:#0A0C10}

/* :has() reveals it only while a new frame is showing. Where :has() is
   unsupported the pill stays hidden and the sweep still runs - degradation is
   "less", never "broken". */
.pg-cat .mch-shot.is-multi:has(.mch-slide.on[data-new]) .mch-new{
  opacity:1;transform:none}

@media (prefers-reduced-motion:reduce){
  .pg-cat .mch-slide.on[data-new] + .mch-sheen{animation:none;opacity:0}
  .pg-cat .mch-shot.is-multi .mch-new{transition:none}
}

/* ============================================================================
   v67 - ADAPTIVE HERO DOTS (fixes a real overflow the 16-frame iPhone set exposed)
   ============================================================================
   MEASURED at 390px with 16 frames: .mch-dots was 457px wide inside a 335px
   .mch-shot, spanning x=-33 to x=424 - spilling off BOTH edges and only
   invisible because .mk-page carries overflow-x:hidden, which CLIPPED the first
   and last dots rather than revealing a page-level scroll. `document
   .scrollWidth` therefore read clean, which is exactly why this needs measuring
   at the ELEMENT level too, not just the page level.

   Latent since v62 - it simply never fired, because the largest set until now
   was 8 frames (16 x 22px + 15 x 7px gap = 457 is the first count that breaks).

   The fix is to let the bars SHARE the available width instead of each
   demanding a fixed 22px:
     - few dots  (<=8, i.e. every other category) -> max-width caps them at 22px,
       so those pages render EXACTLY as before;
     - many dots (16)                             -> they compress to ~14px and
       stay on one tidy centred row.
   No wrapping, no second row, and it adapts to any future frame count without
   another breakpoint. `min-width` keeps them from collapsing to a hairline.

   The ::after bar is switched from a fixed 22px to width:100% so it tracks the
   button instead of overflowing it - without that, the button would shrink and
   the visible bar would not, which is the same trap in a different place.     */
.pg-cat .mch-dots{
  max-width:100%;flex-wrap:nowrap}
.pg-cat .mch-dots button{
  flex:1 1 22px;max-width:22px;min-width:9px}
.pg-cat .mch-dots button::after{
  width:100%}

/* ============================================================================
   v68 - DESKTOP CATEGORY PAGES: port the premium dark design up from mobile
   ============================================================================
   MEASURED on a fresh 1280px load of /iphone before writing a line of this:
     body                 background #fff        (light, under a now-DARK hero)
     .mfeat               1265 x 4167px          (.mfc computed display:INLINE)
     .mfc-img             1265 x 581px           raw image, no plate, no card
     .mwhy / .mexp        unstyled blocks
     page                 11,362px  vs ~9,700 on mobile
   i.e. the dark Phase-1 hero handed over to a white page and three giant
   unstyled stacks. This is the 7th instance of the mobile-only-markup class of
   bug and by far the largest: mascot_cat_featured()/why()/experience() render
   at EVERY width, but their entire stylesheet lived inside max-width:840px.

   WHY THIS BLOCK IS @media-GATED, when v63 argued for width-agnostic CSS:
   the v63 hero had NO real mobile/desktop divergence, so removing the gate
   removed a bug class. Here the divergence is GENUINE - mobile deliberately
   uses full-bleed centred CAROUSELS (78vw cards, snap, cloned sets) and desktop
   wants GRIDS. Forcing one geometry on both would be worse, not safer. So the
   split is by intent:
     - design language (colour, card chrome, typography, plates) mirrors mobile
     - layout (rail vs grid) is the only thing that differs
   Tokens are re-declared rather than shared because the mobile :root sits inside
   the 840px block; duplicating six values is cheaper than restructuring a
   167 KB sheet mid-session, and they are listed together here so they stay in
   step.
   ========================================================================= */
@media (min-width:841px){

  .pg-cat{
    --mkBg:#050505; --mkCard:#111111; --mkLine:rgba(255,255,255,.08);
    --mkGold:#D8A03D; --mkDim:#A8A8A8; --mkGreen:#32D17B;
    background:var(--mkBg)!important; color:#fff!important}

  .pg-cat .sec{background:transparent!important; padding:56px 0 10px!important}
  .pg-cat .sec:last-of-type{padding-bottom:76px!important}
  .pg-cat .mch{background:var(--mkBg)!important}

  /* the marquee track is ~2818px wide by design; without this its own container
     lets it escape and the page can be dragged sideways between 841 and 1024px */
  .pg-cat .mch-mq{overflow:hidden!important}

  .pg-cat .sh{color:#fff!important; letter-spacing:-.02em}
  .pg-cat .sec p{color:var(--mkDim)}

  /* ---- category hub tiles: lime blocks -> dark glass ----
     the lime is an INLINE style on .tile, so background-image must be nuked */
  .pg-cat .hubs{display:grid!important; gap:14px!important;
    grid-template-columns:repeat(auto-fit,minmax(180px,1fr))!important}
  .pg-cat .hub{
    background:rgba(255,255,255,.045)!important; border:1px solid var(--mkLine)!important;
    border-radius:20px!important; overflow:hidden; padding:18px 16px 16px!important;
    display:flex!important; flex-direction:column; align-items:center; gap:12px;
    text-decoration:none; transition:background .2s ease,border-color .2s ease,transform .2s ease}
  .pg-cat .hub:hover{background:rgba(255,255,255,.075)!important; transform:translateY(-2px)}
  .pg-cat .hub *{color:#fff!important}
  .pg-cat .hub .tile{
    background-image:none!important; background:transparent!important;
    width:44px!important; height:66px!important; flex:none!important;
    border:2px solid rgba(255,255,255,.55)!important; border-radius:9px!important;
    position:relative; display:block!important}
  .pg-cat .hub .tile::after{
    content:""; position:absolute; top:7px; left:50%; transform:translateX(-50%);
    width:14px; height:2px; border-radius:2px; background:rgba(255,255,255,.55)}
  .pg-cat .hub .tile b{display:none!important}
  .pg-cat .hub .lbl{font-size:14px!important; font-weight:600; text-align:center}
  /* first tile = the category you are on */
  .pg-cat .hub:first-child{
    border-color:rgba(216,160,61,.55)!important; background:rgba(216,160,61,.08)!important}
  .pg-cat .hub:first-child .tile{border-color:var(--mkGold)!important}
  .pg-cat .hub:first-child .tile::after{background:var(--mkGold)}

  /* ---- accessory pills ---- */
  .pg-cat .pills{display:flex!important; flex-wrap:wrap!important; gap:10px!important}
  .pg-cat .pills a,.pg-cat .pills span{
    background:rgba(255,255,255,.06)!important; border:1px solid var(--mkLine)!important;
    border-radius:100px!important; color:#fff!important; padding:11px 18px!important;
    font-size:13.5px!important; text-decoration:none;
    transition:background .2s ease,border-color .2s ease}
  .pg-cat .pills a:hover{background:rgba(255,255,255,.12)!important;
    border-color:rgba(255,255,255,.2)!important}

  /* ---- product cards ---- */
  .pg-cat .bc{
    background:var(--mkCard)!important; border:1px solid var(--mkLine)!important;
    border-radius:26px!important; overflow:hidden!important;
    transition:border-color .2s ease,transform .2s ease,box-shadow .2s ease}
  .pg-cat .bc:hover{
    border-color:rgba(255,255,255,.18)!important; transform:translateY(-3px);
    box-shadow:0 26px 50px -30px rgba(0,0,0,.95)}
  /* the catalogue is shot on WHITE, so the photo keeps a white plate - the card
     chrome around it is what goes dark. Same decision as mobile. */
  .pg-cat .bc-img{
    background:#fff!important; border-radius:0!important;
    aspect-ratio:1/1!important; display:grid!important; place-items:center!important;
    padding:18px!important}
  .pg-cat .bc-img img{max-width:100%!important; max-height:100%!important;
    object-fit:contain!important; mix-blend-mode:normal!important}
  .pg-cat .bc-badge{
    background:linear-gradient(135deg,var(--mkGold),#B8842B)!important;
    color:#12100a!important; border:0!important}
  .pg-cat .bc-body{padding:16px 16px 18px!important}
  .pg-cat .bc-name{color:#fff!important}
  .pg-cat .bc-rate{color:var(--mkDim)!important}
  .pg-cat .bc-price{color:#fff!important; overflow-wrap:anywhere}
  .pg-cat .bc-price ins{text-decoration:none!important; color:#fff!important}
  .pg-cat .bc-price del,.pg-cat .bc-price s{color:rgba(255,255,255,.34)!important}
  .pg-cat .bc-save,.pg-cat .bc-econ,.pg-cat .bc-body .save{
    background:rgba(50,209,123,.12)!important; color:var(--mkGreen)!important;
    border:0!important}
  .pg-cat .bc-spec{color:var(--mkDim)!important}
  .pg-cat .bc-warr{border-top:1px solid var(--mkLine)!important; color:var(--mkDim)!important}
  .pg-cat .bc-warr::before{background:var(--mkGold)!important}
  /* a two-part variable-price range must not tower over single prices */
  .pg-cat .bc-price:has([aria-hidden="true"]){font-size:16px!important; line-height:1.3!important}

  /* =====================================================================
     WAVE-2 SECTIONS - the ones that were rendering completely unstyled.
     Mobile gives these a full-bleed loop carousel; desktop gets a grid.
     ===================================================================== */
  .pg-cat .mfeat-sec,.pg-cat .mwhy-sec,.pg-cat .mrev-sec{padding-top:52px!important}

  .pg-cat .mfeat,.pg-cat .mwhy,.pg-cat .mrev{
    display:grid!important; gap:20px!important;
    margin:0!important; padding:0!important; width:auto!important;
    overflow:visible!important; scroll-snap-type:none!important}
  .pg-cat .mfeat{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))!important}
  .pg-cat .mwhy {grid-template-columns:repeat(auto-fit,minmax(210px,1fr))!important}
  .pg-cat .mrev {grid-template-columns:repeat(auto-fit,minmax(280px,1fr))!important}
  /* kill the rail sizing the mobile block puts on the children */
  .pg-cat .mfc,.pg-cat .mw,.pg-cat .mr{
    flex:none!important; width:auto!important; max-width:none!important;
    scroll-snap-align:none!important}

  /* featured product card */
  .pg-cat .mfc{
    display:flex!important; flex-direction:column;
    background:var(--mkCard)!important; border:1px solid var(--mkLine)!important;
    border-radius:32px!important; overflow:hidden!important;
    transition:border-color .2s ease,transform .2s ease,box-shadow .2s ease}
  .pg-cat .mfc:hover{border-color:rgba(255,255,255,.18)!important;
    transform:translateY(-3px); box-shadow:0 30px 56px -32px rgba(0,0,0,.95)}
  .pg-cat .mfc-img{
    background:#fff!important; aspect-ratio:1/1!important;
    display:grid!important; place-items:center!important; padding:24px!important;
    width:auto!important; height:auto!important}
  .pg-cat .mfc-img img{max-width:100%!important; max-height:100%!important;
    width:auto!important; height:auto!important; object-fit:contain!important}
  .pg-cat .mfc-b{padding:20px 22px 24px!important; display:flex!important;
    flex-direction:column; position:relative; flex:1 1 auto}
  .pg-cat .mfc-tag{background:linear-gradient(135deg,var(--mkGold),#B8842B)!important;
    color:#12100a!important}
  .pg-cat .mfc-n{color:#fff!important; font-size:20px!important; line-height:1.16;
    font-weight:600; letter-spacing:-.02em}
  .pg-cat .mfc-s{color:var(--mkDim)!important; font-size:12.5px!important; margin-top:7px}
  .pg-cat .mfc-p{color:#fff!important}
  .pg-cat .mfc-p ins{text-decoration:none!important; color:#fff!important}
  .pg-cat .mfc-p del{color:rgba(255,255,255,.34)!important}
  .pg-cat .mfc-p .screen-reader-text{display:none!important}
  .pg-cat .mfc-cta .arw{color:#0a0c10!important}

  /* "Pourquoi Mascot" cards */
  .pg-cat .mw{
    background:rgba(255,255,255,.045)!important; border:1px solid var(--mkLine)!important;
    border-radius:26px!important; padding:22px 20px 24px!important;
    transition:background .2s ease,border-color .2s ease}
  .pg-cat .mw:hover{background:rgba(255,255,255,.07)!important;
    border-color:rgba(255,255,255,.16)!important}
  .pg-cat .mw-k{color:var(--mkGold)!important}
  .pg-cat .mw-t{color:#fff!important}
  .pg-cat .mw-p{color:var(--mkDim)!important}

  /* in-store experience: full-bleed photo card, copy anchored bottom-left */
  .pg-cat .mexp{
    position:relative!important; overflow:hidden!important;
    border:1px solid var(--mkLine)!important; border-radius:32px!important;
    min-height:420px!important; display:flex!important; align-items:flex-end!important;
    width:auto!important; margin:0!important}
  .pg-cat .mexp-in{position:relative; z-index:2; padding:38px 40px 40px!important;
    max-width:620px}
  .pg-cat .mexp-k{color:var(--mkGold)!important}
  .pg-cat .mexp h3{color:#fff!important}
  .pg-cat .mexp h3 em{font-style:normal; color:var(--mkGold)!important}
  .pg-cat .mexp p{color:rgba(255,255,255,.78)!important}
  .pg-cat .mexp-cta .arw{color:#0a0c10!important}

  /* reviews (real ones only; the dashed card is the admin-only placeholder) */
  .pg-cat .mr{
    background:rgba(255,255,255,.045)!important; border:1px solid var(--mkLine)!important;
    border-radius:26px!important; padding:22px 20px!important}
  .pg-cat .mr-s{color:var(--mkGold)!important}
  .pg-cat .mr-t,.pg-cat .mr-q{color:#fff!important}
  .pg-cat .mr-w{color:var(--mkDim)!important}
  .pg-cat .mrev-note{color:var(--mkGold)!important}

  /* the closing contact card, where the category template renders one */
  .pg-cat .store{
    background:rgba(255,255,255,.045)!important; border:1px solid var(--mkLine)!important;
    border-radius:32px!important; color:#fff!important}
  .pg-cat .store h2,.pg-cat .store h3{color:#fff!important}
  .pg-cat .store p{color:var(--mkDim)!important}

  /* scroll-reveal children can be parked invisible if their observer never
     fires; on a grid there is no off-screen parking, so force them visible */
  .pg-cat .mfeat>.reveal,.pg-cat .mwhy>.reveal,.pg-cat .mrev>.reveal,
  .pg-cat .grid>.reveal,.pg-cat .hubs>.reveal{opacity:1!important; transform:none!important}
}

/* ============================================================================
   v69 - LIFT THE WAVE-2 SUB-ELEMENT RULES OUT OF THE MOBILE QUERY
   ============================================================================
   Measured on desktop after v68: the CONTAINERS were styled but every child
   was raw - .mfc-tag rendered as a full-width block instead of a gold pill,
   .mfc-cta as plain text instead of a white pill, .mexp-k/.mexp h3/.mexp-cta
   as unstyled inline text, and .mexp::before computed content:none so the
   experience card showed NO PHOTO AT ALL.

   None of those rules have any genuine mobile/desktop divergence - a gold pill
   is a gold pill at every width. Only the CONTAINER layout differs (mobile
   rail vs desktop grid), and that stays gated in v68. So rather than duplicate
   90 lines by hand and risk a transcription error, this block is copied
   VERBATIM from the same rules inside @media(max-width:840px) and re-emitted
   with NO query. Identical selectors + identical declarations means mobile is
   provably unchanged (a duplicate identical rule is a no-op); desktop gains
   them. Where v68 deliberately wants a different desktop value it carries
   !important, so it still wins.

   The --mk* tokens are re-declared here because the mobile :root ALSO lives
   inside the 840 block - without this, every var() below resolves to nothing
   above 841px. Values are byte-identical to that :root.
   ========================================================================= */
:root{--mkBg:#050505;--mkCard:#111111;--mkLine:rgba(255,255,255,.08);
       --mkGold:#D8A03D;--mkDim:#A8A8A8;--mkGreen:#32D17B}
:is(.pg-cat,.pg-acc) .mfc{
  display:flex;flex-direction:column;text-decoration:none;
  background:var(--mkCard);border:1px solid var(--mkLine);border-radius:32px;overflow:hidden;
  box-shadow:0 26px 46px -28px rgba(0,0,0,.95)}
:is(.pg-cat,.pg-acc) .mfc-img{background:#fff;aspect-ratio:1/1;display:grid;place-items:center;padding:22px}
:is(.pg-cat,.pg-acc) .mfc-img img{max-width:100%;max-height:100%;object-fit:contain}
:is(.pg-cat,.pg-acc) .mfc-b{padding:18px 20px 22px;display:flex;flex-direction:column;gap:0;position:relative}
:is(.pg-cat,.pg-acc) .mfc-tag{
  position:absolute;top:-15px;right:20px;
  background:linear-gradient(135deg,var(--mkGold),#B8842B);color:#12100a;
  font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;
  padding:7px 13px;border-radius:100px;box-shadow:0 10px 22px -10px rgba(216,160,61,.9)}
:is(.pg-cat,.pg-acc) .mfc-n{color:#fff;font-size:21px;line-height:1.16;font-weight:600;letter-spacing:-.02em}
:is(.pg-cat,.pg-acc) .mfc-s{color:var(--mkDim);font-size:12.5px;margin-top:7px}
/* WooCommerce emits <del>old</del> <ins>new</ins>; the grid cards render current
   price first, so flip the order here to match rather than contradict them. */
:is(.pg-cat,.pg-acc) .mfc-p{color:#fff;font-family:'Clash Display',sans-serif;font-size:19px;font-weight:600;
  margin-top:11px;display:flex;flex-wrap:wrap;align-items:baseline;gap:8px}
:is(.pg-cat,.pg-acc) .mfc-p ins{order:1;text-decoration:none;color:#fff}
:is(.pg-cat,.pg-acc) .mfc-p>.amount{order:1}
:is(.pg-cat,.pg-acc) .mfc-p del{order:2;color:rgba(255,255,255,.34);font-size:13px;font-weight:400}
:is(.pg-cat,.pg-acc) .mfc-p .screen-reader-text{display:none}
:is(.pg-cat,.pg-acc) .mfc-cta{
  margin-top:16px;display:inline-flex;align-items:center;justify-content:center;gap:9px;
  background:#fff;color:#0a0c10;border-radius:100px;padding:13px 22px;
  font-size:14.5px;font-weight:600}
:is(.pg-cat,.pg-acc) .mfc-cta .arw{color:#0a0c10}

/* ---- 2. pourquoi mascot ---- */
:is(.pg-cat,.pg-acc) .mw{
  background:rgba(255,255,255,.045);border:1px solid var(--mkLine);border-radius:26px;
  padding:22px 20px 24px;display:flex;flex-direction:column}
:is(.pg-cat,.pg-acc) .mw-n{
  color:var(--mkGold);font-family:'Clash Display',sans-serif;font-size:13px;
  font-weight:600;letter-spacing:.14em;margin-bottom:12px}
:is(.pg-cat,.pg-acc) .mw-t{color:#fff;font-size:19px;font-weight:600;letter-spacing:-.02em;line-height:1.15}
:is(.pg-cat,.pg-acc) .mw-p{color:var(--mkDim);font-size:13.5px;line-height:1.55;margin:9px 0 0}

/* ---- 3. in-store experience card ---- */
:is(.pg-cat,.pg-acc) .mexp{
  position:relative;border-radius:30px;overflow:hidden;isolation:isolate;
  border:1px solid var(--mkLine);min-height:400px;display:flex;align-items:flex-end;
  box-shadow:0 30px 54px -30px rgba(0,0,0,.95)}
:is(.pg-cat,.pg-acc) .mexp::before{
  content:"";position:absolute;inset:0;z-index:0;
  background-image:var(--mexp-img);background-size:cover;background-position:center 38%}
:is(.pg-cat,.pg-acc) .mexp::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(6,7,9,.34) 0%,rgba(6,7,9,.18) 26%,rgba(6,7,9,.72) 58%,rgba(6,7,9,.96) 100%)}
:is(.pg-cat,.pg-acc) .mexp-in{position:relative;z-index:2;padding:26px 22px 28px}
:is(.pg-cat,.pg-acc) .mexp-k{
  display:block;color:var(--mkGold);font-size:10.5px;font-weight:600;
  letter-spacing:.2em;text-transform:uppercase;margin-bottom:10px}
:is(.pg-cat,.pg-acc) .mexp h3{
  color:#fff;font-size:28px;line-height:1.08;letter-spacing:-.02em;margin:0 0 10px}
:is(.pg-cat,.pg-acc) .mexp h3 em{font-style:normal;color:var(--mkGold)}
:is(.pg-cat,.pg-acc) .mexp p{color:rgba(255,255,255,.78);font-size:14px;line-height:1.55;margin:0 0 18px}
:is(.pg-cat,.pg-acc) .mexp-cta{
  display:inline-flex;align-items:center;gap:9px;background:#fff;color:#0a0c10;
  border-radius:100px;padding:13px 22px;font-size:14.5px;font-weight:600;text-decoration:none}
:is(.pg-cat,.pg-acc) .mexp-cta .arw{color:#0a0c10}

/* ---- 4. avis clients ---- */
:is(.pg-cat,.pg-acc) .mrev-note{
  color:var(--mkGold);font-size:12px;line-height:1.5;margin:-8px 0 16px;
  background:rgba(216,160,61,.10);border:1px dashed rgba(216,160,61,.45);
  border-radius:14px;padding:11px 13px}
:is(.pg-cat,.pg-acc) .mr{
  background:rgba(255,255,255,.045);border:1px solid var(--mkLine);border-radius:26px;
  padding:22px 20px;display:flex;flex-direction:column;position:relative}
:is(.pg-cat,.pg-acc) .mr.is-ph{border-style:dashed;opacity:.72}
:is(.pg-cat,.pg-acc) .mr-ph{
  position:absolute;top:-10px;left:20px;background:rgba(216,160,61,.9);color:#12100a;
  font-size:9.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  padding:4px 9px;border-radius:100px}
:is(.pg-cat,.pg-acc) .mr-s{color:var(--mkGold);font-size:15px;letter-spacing:2px}
:is(.pg-cat,.pg-acc) .mr-t{color:#fff;font-size:15px;line-height:1.55;margin:11px 0 0}
:is(.pg-cat,.pg-acc) .mr-w{color:var(--mkDim);font-size:12.5px;margin-top:12px}

/* ---- 5. product-card extras ---- */
:is(.pg-cat,.pg-acc) .bc-spec{color:var(--mkDim);font-size:11.5px;margin:0 0 8px;line-height:1.3}
:is(.pg-cat,.pg-acc) .bc-warr{
  display:flex;align-items:center;gap:6px;margin-top:11px;padding-top:11px;
  border-top:1px solid var(--mkLine);
  color:rgba(255,255,255,.55);font-size:10.5px;letter-spacing:.04em}
:is(.pg-cat,.pg-acc) .bc-warr::before{
  content:"";width:12px;height:12px;flex:none;background:var(--mkGold);
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2l8 3.5v6c0 5-3.4 9-8 10.5C7.4 20.5 4 16.5 4 11.5v-6z'/%3E%3C/svg%3E") center/contain no-repeat;
          mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2l8 3.5v6c0 5-3.4 9-8 10.5C7.4 20.5 4 16.5 4 11.5v-6z'/%3E%3C/svg%3E") center/contain no-repeat}


/* ============================================================================
   v70 - .is-flat: present a NON-cut-out hero as a deliberate framed panel
   ============================================================================
   Two of the eight heroes could not be re-cut to true transparency:
     term 24 - a PHOTOGRAPH on a wooden surface (border std ~90), so there is no
               flat backdrop to flood at all;
     term 56 - 27%% of the dark fill is ENCLOSED by the iPad and unreachable by a
               border-seeded flood; raising tolerance would punch through the
               tablet's own dark screen.
   A rectangle wearing a floating drop-shadow reads as a FAILED cut-out. The
   same situation on /reparation (v37) was solved by owning it: give the panel a
   radius and a hairline border so it reads as an intentional framed image.
   No @media - the treatment is correct at every width.                       */
.pg-cat .mch-shot.is-flat img{
  border-radius:22px!important;
  border:1px solid rgba(255,255,255,.10)!important;
  filter:none!important;
  box-shadow:0 30px 60px -34px rgba(0,0,0,.95)!important}
.pg-cat .mch-shot.is-flat .mch-glow{opacity:.55}

/* ============================================================================
   v71 - HOMEPAGE DESKTOP: mirror the mobile section rhythm and card language
   ============================================================================
   MEASURED both sides section-by-section before designing, because the mobile
   homepage is NOT uniformly dark - it alternates deliberately, and copying it
   wholesale would have destroyed that rhythm. The only real gaps were:

     section              mobile      desktop     action
     .mk-sv  (#services)  #08090B     #FFF        -> dark
     .mk-sv  (impression) #08090B     #F6F7F5     -> dark
     .mk-gal (galerie)    #08090B     #F6F7F5     -> dark
     .mk-su  (signup)     #08090B     #F6F7F5     -> dark
     .why-grid cards      #101216     #FFF        -> dark photo cards
     .rgrid cards         #101216     rgba(.05)   -> dark photo cards

   EVERYTHING ELSE ALREADY MATCHED and is deliberately left alone: the hero,
   .sbsec, #tech, the promo band, réparation, workspace, the café teaser (its own
   espresso brand), the film section, the locator, partners and the footer.
   In particular the "Pourquoi Mascot" BAND STAYS LIGHT - dark photo cards on a
   light band is the intentional contrast beat mobile already uses, not an
   oversight, and flattening it would make the page one long tunnel.

   Card recipes are copied from the mobile rules with ONLY the carousel sizing
   removed (`flex:0 0 84%;width:84%;max-width:320px`), because that is genuinely
   the only mobile-specific part - everything else (photo on ::before/.simg,
   scrim, tinted icon chip, bottom-aligned copy, white pill CTA) is layout
   agnostic and should read identically at both sizes.
   ========================================================================= */
@media (min-width:841px){

  /* ---- section canvases ---- */
  .mk-sv,.mk-gal,.mk-su{background:#08090b!important}
  .mk-sv .shead h2,.mk-gal .shead h2,.mk-su .shead h2,
  .mk-sv .chead h2,.mk-gal .chead h2{color:#fff!important}
  .mk-sv .shead p,.mk-gal .shead p,.mk-sv .chead p,.mk-gal .chead p{color:rgba(255,255,255,.62)!important}

  /* =====================================================================
     SERVICE CARDS - photo full-bleed, copy at the base, tinted icon chip
     ===================================================================== */
  .mk-sv .grid3{gap:22px!important}
  .mk-sv .grid3>.scard{
    position:relative;aspect-ratio:3/4;border-radius:26px;overflow:hidden;
    background:#101216;border:1px solid rgba(255,255,255,.09);
    box-shadow:0 26px 44px -26px rgba(0,0,0,.9);
    display:block!important;padding:0!important;
    transition:transform .25s cubic-bezier(.16,1,.3,1),box-shadow .25s ease,border-color .25s ease}
  .mk-sv .grid3>.scard:hover{
    transform:translateY(-4px);border-color:rgba(255,255,255,.18);
    box-shadow:0 38px 62px -30px rgba(0,0,0,.95)}

  .mk-sv .grid3>.scard .simg{
    position:absolute!important;inset:0!important;aspect-ratio:auto!important;
    height:100%!important;width:100%!important;margin:0!important;border-radius:0!important;
    overflow:hidden;background-color:#101216!important}
  .mk-sv .grid3>.scard .simg img{
    width:100%!important;height:100%!important;object-fit:cover!important;display:block;
    transition:transform .5s cubic-bezier(.16,1,.3,1)}
  .mk-sv .grid3>.scard:hover .simg img{transform:scale(1.04)}
  .mk-sv .grid3>.scard .simg::after{
    content:"";position:absolute;inset:0;
    background:linear-gradient(180deg,rgba(6,7,9,.10) 0%,rgba(6,7,9,.34) 38%,rgba(6,7,9,.86) 72%,rgba(6,7,9,.97) 100%)}

  .mk-sv .grid3>.scard::before{
    content:"";position:absolute;z-index:3;top:18px;left:18px;width:52px;height:52px;
    border-radius:16px;background:var(--mkAccBg,rgba(247,161,43,.22));
    border:1px solid var(--mkAccBd,rgba(247,161,43,.42));
    backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
    background-repeat:no-repeat;background-position:center;background-size:24px 24px;
    box-shadow:0 8px 20px -8px rgba(0,0,0,.7)}

  .mk-sv .grid3>.scard .sbody{
    position:absolute!important;left:0;right:0;bottom:0;z-index:3;
    padding:0 24px 24px!important;background:none!important;text-align:left}
  .mk-sv .grid3>.scard .sbody h4{
    color:#fff!important;font-size:26px!important;line-height:1.08!important;
    letter-spacing:-.02em;margin:0 0 10px!important}
  .mk-sv .grid3>.scard .sbody p{
    color:rgba(255,255,255,.74)!important;font-size:14px!important;line-height:1.5!important;
    margin:0 0 18px!important;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
  .mk-sv .grid3>.scard .sbody .btn{
    display:inline-flex!important;align-items:center;gap:9px;
    background:#fff!important;color:#0a0c10!important;border:0!important;
    padding:12px 22px!important;border-radius:100px!important;
    font-size:14.5px!important;font-weight:600;box-shadow:0 10px 24px -12px rgba(0,0,0,.8);
    width:auto!important;justify-content:flex-start!important}
  .mk-sv .grid3>.scard .sbody .btn .arw{color:#0a0c10!important}

  /* per-card accent tint (3 cards per section, so 3n+k is stable) */
  .mk-sv .grid3>.scard:nth-child(3n+1){--mkAccBg:rgba(247,161,43,.24);--mkAccBd:rgba(247,161,43,.45)}
  .mk-sv .grid3>.scard:nth-child(3n+2){--mkAccBg:rgba(74,125,255,.24);--mkAccBd:rgba(74,125,255,.45)}
  .mk-sv .grid3>.scard:nth-child(3n+3){--mkAccBg:rgba(19,190,109,.24);--mkAccBd:rgba(19,190,109,.45)}
  .mk-sv:not(#services) .grid3>.scard:nth-child(3n+2){--mkAccBg:rgba(155,109,255,.24);--mkAccBd:rgba(155,109,255,.45)}
  .mk-sv:not(#services) .grid3>.scard:nth-child(3n+3){--mkAccBg:rgba(232,184,75,.24);--mkAccBd:rgba(232,184,75,.45)}

  #services .grid3>.scard:nth-child(3n+1)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 8h13M14 5l3 3-3 3M20 16H7M10 13l-3 3 3 3'/%3E%3C/svg%3E")}
  #services .grid3>.scard:nth-child(3n+2)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 9V4h10v5M7 18H5.5A1.5 1.5 0 0 1 4 16.5v-4A1.5 1.5 0 0 1 5.5 11h13a1.5 1.5 0 0 1 1.5 1.5v4a1.5 1.5 0 0 1-1.5 1.5H17M7 15h10v5H7z'/%3E%3C/svg%3E")}
  #services .grid3>.scard:nth-child(3n+3)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 3h12v18l-3-2-3 2-3-2-3 2V3z'/%3E%3Cpath d='M9.5 8h5M9.5 12h5'/%3E%3C/svg%3E")}
  .mk-sv:not(#services) .grid3>.scard:nth-child(3n+1)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 3h9a2 2 0 0 1 2 2v9'/%3E%3Crect x='4' y='7' width='12' height='14' rx='2'/%3E%3C/svg%3E")}
  .mk-sv:not(#services) .grid3>.scard:nth-child(3n+2)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='14' rx='2'/%3E%3Ccircle cx='8.5' cy='10' r='1.6'/%3E%3Cpath d='M21 15.5L16 10.5 5.5 19'/%3E%3C/svg%3E")}
  .mk-sv:not(#services) .grid3>.scard:nth-child(3n+3)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='18' height='18' rx='1.5'/%3E%3Crect x='7' y='7' width='10' height='10' rx='.6'/%3E%3C/svg%3E")}

  /* THREE of the six service photos are flat clip-art or carry a logo strip -
     fine as a small light thumbnail, but they read as stock art once they are
     full-bleed on a dark card, which is exactly why mobile swapped them. The
     same swap is needed here now that desktop is full-bleed too. The <img> src
     is left untouched; only the painted background changes. */
  #services .grid3>.scard:nth-child(3n+1) .simg{background:url('/wp-content/uploads/mascot-hero/money-jump.jpg') center/cover no-repeat}
  #services .grid3>.scard:nth-child(3n+2) .simg{background:url('/wp-content/uploads/mascot-hero/svc-cartes-visite.jpg') center/cover no-repeat}
  .mk-sv:not(#services) .grid3>.scard:nth-child(3n+1) .simg{background:url('/wp-content/uploads/mascot-hero/svc-id-photos.jpg') center 42%/cover no-repeat}
  #services .grid3>.scard:nth-child(3n+1) .simg img,
  #services .grid3>.scard:nth-child(3n+2) .simg img,
  .mk-sv:not(#services) .grid3>.scard:nth-child(3n+1) .simg img{opacity:0}

  /* ---- galerie: gold frames on black ---- */
  .mk-gal .ggrid .aname{color:#fff!important}
  .mk-gal .ggrid .aartist{color:rgba(255,255,255,.5)!important}
  .mk-gal .ggrid .aprice{color:#E8B84B!important}
  .mk-gal .ggrid .abm{color:rgba(255,255,255,.35)!important}

  /* =====================================================================
     .rcard / .why - same premium photo card. They carry no <img>, so the
     photo rides on ::before and the scrim on ::after.
     ===================================================================== */
  .dark-sec .rgrid>.rcard,
  .why-grid>.why{
    position:relative!important;display:flex!important;flex-direction:column;
    justify-content:flex-end;aspect-ratio:3/4;
    border-radius:26px!important;overflow:hidden;
    padding:24px!important;background:#101216!important;
    border:1px solid rgba(255,255,255,.09)!important;
    box-shadow:0 26px 44px -26px rgba(0,0,0,.9)!important;
    transition:transform .25s cubic-bezier(.16,1,.3,1),box-shadow .25s ease,border-color .25s ease}
  .dark-sec .rgrid>.rcard:hover,.why-grid>.why:hover{
    transform:translateY(-4px);border-color:rgba(255,255,255,.18)!important;
    box-shadow:0 38px 62px -30px rgba(0,0,0,.95)!important}
  .dark-sec .rgrid>.rcard::before,
  .why-grid>.why::before{
    content:"";position:absolute;inset:0;z-index:0;
    background-size:cover;background-position:center;background-repeat:no-repeat}
  .dark-sec .rgrid>.rcard::after,
  .why-grid>.why::after{
    content:"";position:absolute;inset:0;z-index:1;
    background:linear-gradient(180deg,rgba(6,7,9,.30) 0%,rgba(6,7,9,.12) 22%,rgba(6,7,9,.55) 48%,rgba(6,7,9,.91) 74%,rgba(6,7,9,.98) 100%)}
  .dark-sec .rgrid>.rcard>*,
  .why-grid>.why>*{position:relative;z-index:2}

  .dark-sec .rgrid>.rcard .ric,
  .why-grid>.why .wic{
    position:absolute!important;z-index:3;top:18px;left:18px;
    width:52px!important;height:52px!important;margin:0!important;
    border-radius:16px!important;display:flex!important;align-items:center;justify-content:center;
    background:var(--mkAccBg,rgba(247,161,43,.24))!important;
    border:1px solid var(--mkAccBd,rgba(247,161,43,.45))!important;
    backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
    color:#fff!important;box-shadow:0 8px 20px -8px rgba(0,0,0,.7)}
  .dark-sec .rgrid>.rcard .ric svg,
  .why-grid>.why .wic svg{width:24px;height:24px;stroke:#fff}

  .dark-sec .rgrid>.rcard h4,
  .why-grid>.why h4{
    color:#fff!important;font-size:26px!important;line-height:1.08!important;
    letter-spacing:-.02em;margin:0 0 10px!important}
  .dark-sec .rgrid>.rcard p,
  .why-grid>.why p{
    color:rgba(255,255,255,.74)!important;font-size:14px!important;line-height:1.5!important;
    margin:0!important;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
  .why-grid>.why .wn{
    color:#E8B84B!important;font-size:10.5px!important;font-weight:600!important;
    letter-spacing:1.9px!important;text-transform:uppercase;margin:0 0 7px!important}

  .dark-sec .rgrid>.rcard .rbtn{
    display:inline-flex!important;align-items:center;gap:9px;align-self:flex-start;
    margin-top:18px!important;background:#fff!important;color:#0a0c10!important;
    border:0!important;padding:12px 22px!important;border-radius:100px!important;
    font-size:14.5px!important;font-weight:600;width:auto!important;
    box-shadow:0 10px 24px -12px rgba(0,0,0,.8)}
  .dark-sec .rgrid>.rcard .rbtn .arw{color:#0a0c10!important}

  .dark-sec .rgrid>.rcard.green,.why-grid>.why.g{--mkAccBg:rgba(19,190,109,.26);--mkAccBd:rgba(19,190,109,.48)}
  .dark-sec .rgrid>.rcard.blue,.why-grid>.why.b{--mkAccBg:rgba(74,125,255,.26);--mkAccBd:rgba(74,125,255,.48)}

  .dark-sec .rgrid>.rcard:nth-child(3n+1)::before{background-image:url('/wp-content/uploads/mascot-hero/repair-car-1.jpg')}
  .dark-sec .rgrid>.rcard:nth-child(3n+2)::before{background-image:url('/wp-content/uploads/mascot-hero/repair-ecran-casse.jpg')}
  .dark-sec .rgrid>.rcard:nth-child(3n+3)::before{background-image:url('/wp-content/uploads/mascot-hero/repair-sub-4.jpg')}
  .why-grid>.why:nth-child(3n+1)::before{background-image:url('/wp-content/uploads/mascot-hero/contact.jpg')}
  .why-grid>.why:nth-child(3n+2)::before{background-image:url('/wp-content/uploads/mascot-hero/learn-laptop.jpg')}
  .why-grid>.why:nth-child(3n+3)::before{background-image:url('/wp-content/uploads/mascot-hero/kids-community.jpg')}

  /* the base .rcard gives its <p> flex-grow:1 to equalise heights in the ORIGINAL
     desktop grid; inside a bottom-aligned photo card that stretches the copy and
     pins the title to the top, where it collides with the icon chip. This bit me
     once already on mobile (v15) - pin every child to its natural size. */
  .dark-sec .rgrid>.rcard>*,.why-grid>.why>*{flex:0 0 auto!important}

  /* ---- signup ---- */
  .mk-su .signup{position:relative;overflow:hidden;isolation:isolate}
  .mk-su .signup img{object-position:center 30%!important}
  /* an EVEN scrim, not the base 90deg left-to-right one: that gradient was built
     for a 2-column layout, and here the copy sits over the whole card, so faces
     punch through the headline (the v17 lesson). */
  .mk-su .signup::after{
    content:"";position:absolute;inset:0;z-index:1;
    background:linear-gradient(180deg,rgba(6,7,9,.82),rgba(6,7,9,.72) 42%,rgba(6,7,9,.86) 74%,rgba(6,7,9,.95))}
  .mk-su .su-in{position:relative;z-index:2}
  .mk-su .signup h3{color:#fff!important}
  .mk-su .signup p{color:rgba(255,255,255,.76)!important}
  .mk-su .su-note{color:rgba(255,255,255,.6)!important}
}

/* ============================================================================
   v72 - REPLACE svc-cartes-visite.jpg ON THE "Service d'impression" CARD
   ============================================================================
   That file is a STOCK TEMPLATE MOCKUP carrying a FICTITIOUS French estate
   agent - "DUPONT Marc / Agent Immobilier / www.agenceimmo.fr / 32 Rue
   Ferrari, 06000 Nice" with a phone number. It was tolerable as a small light
   thumbnail, and v24 already swapped it off the Impression BANNER for exactly
   this reason - but the v71 desktop pass makes it full-bleed on a 370x493 card
   where the name, phone number and web address become legible.

   Applied at EVERY width, not just desktop: another business's (invented)
   contact details on Mascot's own homepage is a content problem regardless of
   how small it renders. print-photo.jpg is the right subject for a print
   service, is 1400x1397 so it holds up full-bleed, and carries no text.      */
#services .grid3>.scard:nth-child(3n+2) .simg{
  background:url('/wp-content/uploads/mascot-hero/print-photo.jpg') center/cover no-repeat!important}


/* ===== v74 - RE-ARM THE CLONE GUARD (regression introduced in v68) =========
   mkCarousel() clones whole card sets on mobile. v27 parked them above the
   breakpoint with `@media(min-width:841px){[data-mk-clone]{display:none}}`.

   v68's desktop pass then added `.pg-cat .mfc{display:flex!important}` in the
   SAME query. Both carry !important, so specificity decides - and .pg-cat .mfc
   (0,2,0) beats [data-mk-clone] (0,1,0). The guard lost, and on the RESIZE path
   (phone rotated to landscape, foldable opened, window dragged wider) all 22
   clones fell into the desktop grid - 22 'A la une' cards instead of 6.

   A fresh desktop load never shows it: the mobile JS bails there, so no clone
   is ever created. That is exactly why v68's fresh-load checks missed it, and
   it is the same failure mode v27 documented. Repeating the rule here:
   ANY JS THAT INJECTS DOM BEHIND A MEDIA QUERY MUST DEFINE WHAT THAT DOM DOES
   ON THE OTHER SIDE OF THE QUERY - and every later desktop rule must be
   checked against that guard, because a plain class pair silently outranks it.

   The tripled attribute selector is deliberate: 0,3,0 outranks any realistic
   `.page .card` desktop rule, so a future desktop pass cannot quietly beat it
   again. It is also last in the file, so it wins ties outright.            */
@media (min-width:841px){
  [data-mk-clone][data-mk-clone][data-mk-clone]{display:none!important}
}


/* ============================================================================
   v76 - GALERIE FEATURED CAROUSEL ON DESKTOP (homepage).
   ----------------------------------------------------------------------------
   User: "on the gallery section of the homepage, can we have the same design as
   mobile - the large print carousel at the top and the small prints below?"

   The carousel already existed; it was mobile-only for two separate reasons,
   and BOTH had to be undone:
     1. JS  - it is built by mk-mobile.js, which bails above 840px. Fixed by
              extracting the builder to mk-gallery.js and the engine to
              mk-carousel.js, neither of which is width-gated (v76).
     2. CSS - its entire design block lived inside @media(max-width:840px), and
              a v27 rule explicitly hid it above 841px.

   The design block below is LIFTED VERBATIM from the mobile block, copied
   server-side rather than retyped (the v69 method). An identical duplicate is a
   no-op for mobile - and mobile keeps winning on GEOMETRY because its rules
   carry !important and sit earlier under their own query. Only the desktop
   geometry at the bottom is new.

   Card sizing is clamped, per the v28 lesson: the mobile rail is sized in vw
   for a phone, which would produce an absurd card on a 1440px screen.       */

/* ---- lifted verbatim: featured-card design (was mobile-only) ---- */
/* ================= GALERIE: featured carousel above the grid ================= */
.mk-artfeat{
  display:flex;flex-wrap:nowrap;gap:14px;overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;
  scrollbar-width:none;-ms-overflow-style:none;padding-bottom:2px}
.mk-artfeat::-webkit-scrollbar{display:none;height:0;width:0}
.mk-af{
  flex:0 0 87%;max-width:330px;scroll-snap-align:center;
  display:block;text-decoration:none;color:inherit;
  background:linear-gradient(180deg,#131418,#0d0e11);
  border:1px solid rgba(255,255,255,.09);border-radius:26px;padding:16px 16px 18px;
  box-shadow:0 30px 50px -28px rgba(0,0,0,.95)}
.mk-af-stage{
  background:radial-gradient(120% 90% at 50% 0%,rgba(232,184,75,.10),transparent 62%),#0a0b0e;
  border-radius:16px;padding:20px 22px;display:flex;justify-content:center}
/* ornate gold frame: layered gradients read as moulding at this size */
.mk-af-frame{
  position:relative;padding:9px;border-radius:3px;
  background:linear-gradient(135deg,#f2d894 0%,#c8a253 26%,#8f6f34 46%,#e6c87e 62%,#a5813d 82%,#d8b76a 100%);
  box-shadow:0 20px 34px -18px rgba(0,0,0,.9),inset 0 0 0 1px rgba(0,0,0,.32),inset 0 0 0 4px rgba(255,255,255,.10)}
.mk-af-mat{background:#fbfaf7;padding:9px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.08)}
.mk-af-mat img{display:block;width:100%;aspect-ratio:4/5;object-fit:cover}
.mk-af-meta{padding:16px 4px 0}
.mk-af-kick{
  display:block;color:#E8B84B;font-size:10.5px;font-weight:600;
  letter-spacing:1.9px;text-transform:uppercase;margin-bottom:7px}
.mk-af-name{
  color:#fff;font-family:'Clash Display',sans-serif;font-weight:600;
  font-size:23px;line-height:1.12;letter-spacing:-.02em;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.mk-af-row{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-top:8px}
.mk-af-artist{color:rgba(255,255,255,.55);font-size:13px}
.mk-af-price{color:#E8B84B;font-size:14px;font-weight:600;white-space:nowrap}
.mk-af-cta{
  display:flex;align-items:center;justify-content:center;gap:9px;
  margin-top:16px;background:#fff;color:#0a0c10;
  padding:13px 22px;border-radius:100px;font-size:14.5px;font-weight:600}
.mk-af-cta .arw{color:#0a0c10}

/* divider that introduces the full grid underneath */
.mk-allprints{
  display:flex;align-items:center;gap:14px;margin:30px 0 18px;
  color:rgba(255,255,255,.42);font-size:11px;font-weight:600;
  letter-spacing:2px;text-transform:uppercase}
.mk-allprints::before,.mk-allprints::after{
  content:"";flex:1;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.16),transparent)}

/* ---- lifted verbatim: dot VISUALS only. NOT the `.mk-dots{display:flex}`
     container rule - line 227 sets a global `.mk-dots{display:none}` default and
     that default must stand, or every rail on every page would sprout dots at
     widths where its carousel does not even run. Visibility is opted into
     explicitly, per surface, in the desktop block below.              ---- */
.mk-dots button{position:relative;width:22px;height:14px;padding:0;border:0;background:none;cursor:pointer}
.mk-dots button::after{
  content:"";position:absolute;left:50%;top:50%;width:20px;height:6px;border-radius:100px;
  background:rgba(255,255,255,.24);
  transform:translate(-50%,-50%) scaleX(.34);transform-origin:center;
  transition:transform .35s cubic-bezier(.22,.61,.36,1),background .35s}
.mk-dots button.on::after{
  transform:translate(-50%,-50%) scaleX(1);
  background:linear-gradient(90deg,var(--amber,#F7A12B),var(--orange,#F2890E))}

@media (min-width:841px){
  /* one big centred print with its neighbours peeking, exactly the mobile
     composition - just scaled up and kept inside .wrap instead of full-bleed.
     The centring padding is DERIVED from the clamped card width (v28 lesson),
     so the active card stays centred at any desktop width. % resolves against
     the rail's containing block, which is what makes this work without vw and
     therefore without the scrollbar-width error vw would introduce. */
  .pg-home .mk-artfeat{
    --mkAf:clamp(300px,25vw,390px);
    gap:22px;padding-bottom:6px;
    padding-left:calc((100% - var(--mkAf))/2);
    padding-right:calc((100% - var(--mkAf))/2)}
  .pg-home .mk-artfeat>.mk-af{
    flex:0 0 var(--mkAf);width:var(--mkAf);max-width:var(--mkAf);
    scroll-snap-align:center}

  /* the divider that introduces the full grid underneath */
  .pg-home .mk-allprints{margin:46px 0 26px}

  /* opt THIS carousel's dots back in (see the note above the lifted block) */
  .pg-home .mk-artfeat~.mk-dots{display:flex;justify-content:center;gap:7px;margin:20px 0 0}

  /* v77 - EXEMPT THIS CAROUSEL FROM THE v74 CLONE GUARD.
     v74 hides [data-mk-clone] above 841px because mobile-injected clones used to
     leak into desktop grids. That guard is still right for every OTHER rail - but
     this one is now a REAL desktop carousel, and its clones are what make the
     loop endless. With them hidden, mkCarousel still starts in the middle set,
     so it was centring on a zero-width display:none node and the rail silently
     degraded to a bounded 4-card strip. Measured: 4 visible of 12, 0 visible
     clones.
     Specificity is 0,4,0 (two attribute selectors) to clear the guard's 0,3,0
     outright rather than relying on source order to win a tie.
     GENERAL RULE: a blanket "hide the clones" guard needs an explicit carve-out
     the moment any cloned rail becomes a legitimate desktop component. */
  .pg-home .mk-artfeat>[data-mk-clone][data-mk-clone]{display:block!important}

}


/* ============================================================================
   v79 - SUB-BANNER PHOTO AS BACKGROUND ON DESKTOP (the v24 treatment ported).
   ----------------------------------------------------------------------------
   User pointed at the three .sb-media photos and asked for them to become the
   banner background on desktop, as on mobile. There are FOUR .svc-banner
   blocks (services #services, impression .mk-sv:not(#services), galerie
   .mk-gal, reparation .dark-sec); all four are done so the run stays uniform.

   MEASURED at 1280 first: banner 1280x416, position:relative + overflow:hidden
   + isolation:isolate already in place, .sb-inner a 2-col grid (539|518) with
   z-index:2, .sb-media relative 518x324.

   THE v24 STACKING-CONTEXT TRAP APPLIES HERE TOO - .sb-inner carries z-index:2,
   so it is its OWN stacking context and .svc-banner::before can never paint over
   the photo inside it. The scrim therefore rides on .sb-media::after (z-index:2,
   above the img, below .sb-in). Getting this wrong is what shipped faces
   punching through the headline on mobile.

   Scrim is the heavy EVEN kind, not bottom-weighted: the copy sits over the
   whole banner, not just its base (the v17 sign-up lesson).                 */
@media (min-width:841px){

  /* ---- photo -> full-bleed background ---- */
  /* ⚠️ INSET IS NEGATIVE, DELIBERATELY. .sb-media's containing block is
     .sb-inner (position:relative), NOT .svc-banner - measured: inner 1220x335
     inside a 1280x340 banner, so a plain inset:0 left a 30px unphotographed
     frame down both sides. Over-extending and letting .svc-banner's existing
     overflow:hidden clip it is robust to whatever padding .sb-inner carries,
     where hard-coded -30px would silently break if that padding changed.
     The ::after scrim inherits the same box, so it covers exactly the same area. */
  .svc-banner .sb-media{
    position:absolute!important;inset:-60px!important;z-index:0!important;
    width:auto!important;height:auto!important;aspect-ratio:auto!important;
    border:0!important;border-radius:0!important;box-shadow:none!important;
    margin:0!important;overflow:hidden!important}
  .svc-banner .sb-media>img,
  .svc-banner .sb-media .rpc-slide img{
    width:100%!important;height:100%!important;object-fit:cover!important;filter:none!important}

  /* ---- the scrim, inside .sb-inner's stacking context ---- */
  .svc-banner .sb-media::after,
  .svc-banner .sb-media.rpc::after{
    content:""!important;display:block!important;position:absolute!important;
    inset:0!important;z-index:2!important;pointer-events:none;
    background:
      radial-gradient(760px 460px at 86% 4%,var(--accW),transparent 62%),
      linear-gradient(100deg,rgba(6,7,9,.94) 0%,rgba(6,7,9,.88) 42%,rgba(6,7,9,.72) 72%,rgba(6,7,9,.80) 100%)!important}

  /* the copy column was half the grid; with the photo out of flow it would
     stretch the full 1153px and read as a banner ad. One track, and the copy
     capped so the measure stays readable. */
  .svc-banner .sb-inner{
    grid-template-columns:1fr!important;z-index:3!important;
    padding:56px 56px 58px!important}
  .svc-banner .sb-in{max-width:600px!important}

  /* the galerie painting is the highest-contrast image on the site (v24) */
  .mk-gal .svc-banner .sb-media::after,
  .pg-gal .svc-banner .sb-media::after{
    background:
      radial-gradient(760px 460px at 86% 4%,var(--accW),transparent 62%),
      linear-gradient(100deg,rgba(6,7,9,.96) 0%,rgba(6,7,9,.92) 42%,rgba(6,7,9,.80) 72%,rgba(6,7,9,.86) 100%)!important}

  /* ---- Impression: impression-banner.jpg is FLAT CLIP-ART on white (coloured
     circles with printer icons). Fine as a small thumbnail, unusable as a
     full-bleed background. Swapped to a real photo via background-image so the
     <img> src is untouched - same call v24 made on mobile. NOT
     svc-cartes-visite.jpg: that is a stock mockup carrying a fictitious French
     estate agent, readable once enlarged. ---- */
  .mk-sv:not(#services) .svc-banner .sb-media{
    background:url('/wp-content/uploads/mascot-hero/print-photo.jpg') center 45%/cover no-repeat!important}
  .mk-sv:not(#services) .svc-banner .sb-media>img{opacity:0!important}

  /* ---- Reparation carousel: dots hidden (as on mobile); the rotating caption
     is real content, so it is kept and moved to the bottom-right, clear of the
     600px copy column. On desktop mk-mobile.js does NOT move it into .sb-in,
     so it is still absolutely positioned inside .sb-media - which now fills the
     whole banner, so these coordinates are banner-relative. ---- */
  .svc-banner .sb-media .rpc-dots{display:none!important}
  .svc-banner .sb-media .rpc-caps{
    left:auto!important;right:28px!important;bottom:22px!important;top:auto!important;
    z-index:3!important;text-align:right!important}
  .svc-banner .sb-media .rpc-cap{
    left:auto!important;right:0!important;bottom:0!important;top:auto!important;
    font-size:12.5px!important;color:rgba(255,255,255,.72)!important;text-shadow:none!important}
}


/* ============================================================================
   v81 - /reparation HERO RENDER + AVANT/APRES CAROUSEL ON DESKTOP.
   ----------------------------------------------------------------------------
   MEASURED at 1280 first: .hgrid is a 2-col grid (542|490) x 2 rows, children
   [copy, .rep-shot(none), .rep-badges(none), .cta, .book]. The right column held
   only the 50px CTA and everything below it was empty - exactly the area the
   user circled. The render markup was already present (#repHero, 4 .rs-slide)
   but was display:none AND its carousel JS never ran above 840px.

   Same DOUBLE LOCK as the galerie carousel; both had to be undone:
     JS  - section 6 moved to mk-hero.js (ungated), now loaded on reparation.html
     CSS - design LIFTED VERBATIM below, and the desktop hide scoped away from
           .pg-reparation.
   Mobile unaffected: identical duplicate rules are a no-op, and every phone
   size is re-stated in the min-width block at the end.                      */

/* ---- lifted verbatim: render + glow + glass badge card ---- */
.rep-shot{
  position:relative;margin:24px auto 0;width:min(84vw,340px);
  display:grid;place-items:center}
.rep-glow{
  position:absolute;inset:-10%;border-radius:50%;z-index:0;pointer-events:none;
  background:radial-gradient(circle at 50% 50%,rgba(19,190,109,.30),rgba(19,190,109,.10) 46%,transparent 74%);
  filter:blur(10px)}
/* Cut-out render (user-supplied cracked iPhone, white backdrop removed). This
   one WORKS where the earlier attempt failed because the SUBJECT is bright -
   gold titanium, luma ~190-230 against a hero of ~5 - so it separates from the
   page instead of merging into it. No plate, no border: it floats. */
.rep-shot img{
  position:relative;z-index:1;width:100%;height:auto;max-height:330px;
  object-fit:contain;
  filter:drop-shadow(0 30px 38px rgba(0,0,0,.9)) drop-shadow(0 6px 14px rgba(0,0,0,.6))}

.rep-badges{
  display:grid;grid-template-columns:repeat(3,1fr);gap:0;
  margin:24px auto 0;max-width:380px;
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);
  border-radius:24px;padding:16px 6px;
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  box-shadow:0 22px 44px -28px rgba(0,0,0,.95)}
.rep-badge{display:flex;flex-direction:column;align-items:center;gap:5px;text-align:center;padding:0 5px}
.rep-badge svg{width:21px;height:21px;color:#13BE6D}
.rep-badge b{color:#fff;font-size:12px;font-weight:600;line-height:1.15}
.rep-badge span{color:#A8A8A8;font-size:10px;line-height:1.25}

/* ---- lifted verbatim: the Avant/Apres crossfade carousel ---- */
.pg-reparation .rep-shot{position:relative}

/* the stack needs a definite height because the slides are absolute; the base
   rule sized the single <img> with max-height instead */
.pg-reparation .rep-shot .rs-stack{
  position:relative;z-index:1;width:100%;height:300px}
.pg-reparation .rep-shot .rs-slide{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:contain;object-position:center bottom;
  opacity:0;transform:scale(.985);
  transition:opacity .85s cubic-bezier(.4,0,.2,1),transform .85s cubic-bezier(.4,0,.2,1);
  filter:drop-shadow(0 26px 34px rgba(0,0,0,.9)) drop-shadow(0 6px 14px rgba(0,0,0,.55));
  max-height:none}
.pg-reparation .rep-shot .rs-slide.on{opacity:1;transform:scale(1)}

/* Avant / Après state pill - the label is what turns a slideshow into a
   before/after story. Amber while broken, green once repaired (the page's
   own repair accent). */
.pg-reparation .rep-shot .rs-state{
  position:absolute;z-index:3;left:50%;transform:translateX(-50%);
  top:2px;
  display:inline-flex;align-items:center;gap:7px;
  padding:6px 14px;border-radius:100px;
  font-size:11px;font-weight:700;letter-spacing:1.6px;text-transform:uppercase;
  background:rgba(247,161,43,.16);border:1px solid rgba(247,161,43,.42);color:#F7A12B;
  transition:background .5s,border-color .5s,color .5s}
.pg-reparation .rep-shot .rs-state::before{
  content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
.pg-reparation .rep-shot .rs-state.is-apres{
  background:rgba(19,190,109,.16);border-color:rgba(19,190,109,.45);color:#13BE6D}

/* dots, in the same language as every other carousel on the site */
.pg-reparation .rep-shot .rs-dots{
  position:relative;z-index:3;display:flex;justify-content:center;gap:7px;margin-top:14px}
.pg-reparation .rep-shot .rs-dots button{
  position:relative;width:22px;height:14px;padding:0;border:0;background:none;cursor:pointer}
.pg-reparation .rep-shot .rs-dots button::after{
  content:"";position:absolute;left:0;top:5px;width:22px;height:4px;border-radius:4px;
  background:rgba(255,255,255,.22);
  transform:scaleX(.5);transform-origin:left center;
  transition:transform .4s cubic-bezier(.4,0,.2,1),background .4s}
.pg-reparation .rep-shot .rs-dots button.on::after{
  background:linear-gradient(90deg,#19d67a,#13BE6D);transform:scaleX(1)}

/* the glow sits behind the stack and tracks the state */
.pg-reparation .rep-shot .rep-glow{transition:background .8s}
.pg-reparation .rep-shot.is-apres .rep-glow{
  background:radial-gradient(circle at 50% 50%,rgba(19,190,109,.38),rgba(19,190,109,.12) 46%,transparent 74%)!important}

/* ---- lifted verbatim: v60 - pill below the artwork, not over it ---- */
.pg-reparation .rep-shot .rs-state{
  position:static!important;left:auto!important;top:auto!important;
  transform:none!important;
  margin:16px 0 0!important}
.pg-reparation .rep-shot .rs-dots{margin-top:11px}

@media (min-width:841px){
  /* Right column becomes [CTA, render, badges]; left stays [copy, booking].
     Explicit line placement rather than source order: the markup order is
     [copy, shot, badges, cta, book], tuned in v39 for the MOBILE reading order
     (headline > render > badges > CTA > form) and deliberately left alone here,
     because that order is still what phones need. */
  .pg-reparation .hero .hgrid>*:first-child{grid-column:1;grid-row:1}
  .pg-reparation .hero .hgrid>.cta{grid-column:2;grid-row:1;align-self:start}
  .pg-reparation .hero .hgrid>.rep-shot{grid-column:2;grid-row:2;align-self:start}
  .pg-reparation .hero .hgrid>.rep-badges{grid-column:2;grid-row:3;align-self:start}
  .pg-reparation .hero .hgrid>.book{grid-column:1;grid-row:2/span 2;align-self:start}

  /* mobile sizes are phone-sized (84vw / 330px img / 300px stack); restate for
     the 490px column - taller render, wider badge card. */
  .pg-reparation .rep-shot{width:100%;max-width:440px;margin:0 auto}
  .pg-reparation .rep-shot .rs-stack{height:400px}
  .pg-reparation .rep-badges{max-width:440px;margin:22px auto 0;padding:18px 8px}
  .pg-reparation .rep-badge b{font-size:13px}
  .pg-reparation .rep-badge span{font-size:10.5px}
  .pg-reparation .rep-shot .rs-dots{margin-top:13px}
}


/* ============================================================================
   v82 - SOFTEN THE SUB-BANNER PHOTO EDGES (desktop).
   ----------------------------------------------------------------------------
   User: the banner photos are not big enough to stretch the full page and the
   lines at their edges are visible - can they be faded in?

   MEASURED, and the diagnosis is NOT what it looks like. The photos DO cover:
   object-fit:cover, media box 1340 wide inside a 1280 banner. There is no gap.
   What reads as a "line" is the hard rectangular boundary where the photo stops
   and the flat #0A0C10 section begins - a pasted-rectangle edge, not a shortfall.

   So the fix is a MASK, not a bigger image. The photo now dissolves into the
   section colour on all four sides, which also disguises the second, real
   problem below.

   ⚠️ THE REAL RESOLUTION LIMIT, for the record: the Hostinger CDN caps every
   served image at 1600px WIDE (v23). celebrations.jpg is 2600x1733 on disk but
   arrives 1600x1066. At 1340 CSS px on a dpr-2 screen the browser wants 2680
   device px, so these banners run a ~1.68x upscale and always look soft on a
   retina display. The v23 "crop width, never resize" trick CANNOT help here -
   that trick buys back HEIGHT for a portrait phone hero, and what a full-bleed
   desktop banner needs is WIDTH, which is exactly what the cap removes. Only a
   different delivery path (or an art-directed <picture>) would fix it.

   The mask sits on .sb-media, so it fades the ::after scrim with the photo. That
   is deliberate: both dissolve into the same #0A0C10, so the edge reads as one
   soft vignette instead of a scrim rectangle floating over a faded photo.    */
@media (min-width:841px){
  .svc-banner .sb-media{
    -webkit-mask-image:
      linear-gradient(90deg,transparent 0,#000 10%,#000 90%,transparent 100%),
      linear-gradient(180deg,transparent 0,#000 12%,#000 86%,transparent 100%);
    -webkit-mask-composite:source-in;
    mask-image:
      linear-gradient(90deg,transparent 0,#000 10%,#000 90%,transparent 100%),
      linear-gradient(180deg,transparent 0,#000 12%,#000 86%,transparent 100%);
    mask-composite:intersect}

  /* the copy sits over the left 600px, which is now a fading region. Give it its
     own local scrim so legibility never depends on the photo mask. */
  .svc-banner .sb-inner::before{
    content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
    background:linear-gradient(100deg,rgba(10,12,16,.92) 0%,rgba(10,12,16,.72) 34%,transparent 66%)}
}


/* ============================================================================
   v83 - GALERIE FEATURED CAROUSEL SCALED UP TO THE apple.com COMPOSITION.
   ----------------------------------------------------------------------------
   User supplied an apple.com "Get to know Apple Watch" screenshot: big cards
   running FULL-BLEED so the ones at each screen edge are cropped mid-card, with
   the small-print grid staying underneath. v76 built this carousel inside .wrap
   at 320px, which reads as a modest widget rather than a hero moment.

   WHAT CHANGED: the rail breaks out of .wrap to the full viewport and the card
   grows 320 -> clamp(340,27vw,430)px. Centre-snap is KEPT rather than switching
   to Apple's start-snap, because mkCarousel's loop repositioning measures from
   the rail centre - start-snap would need JS changes to a working endless
   carousel, for a difference of a few pixels of alignment.

   ⚠️ 100vw INCLUDES THE SCROLLBAR while the rail's % padding does not, so the
   two must not be mixed: the full-bleed break-out uses 100vw (it has to - that
   is the viewport), and the centring padding is derived from the SAME 100vw so
   the error cancels instead of compounding. The homepage already carries a
   known 15px 100vw overflow on .hero, clipped by body{overflow-x:hidden}; this
   rail is clipped by the same rule, so it adds nothing new.                  */
@media (min-width:841px){
  .pg-home .mk-artfeat{
    --mkAf:clamp(340px,27vw,430px);
    margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw);
    width:100vw;max-width:100vw;
    gap:26px;
    padding-left:calc((100vw - var(--mkAf))/2);
    padding-right:calc((100vw - var(--mkAf))/2)}

  /* taller print plate so the card reads like Apple's tall editorial tiles */
  .pg-home .mk-artfeat>.mk-af{padding:20px 20px 22px;border-radius:30px}
  .pg-home .mk-artfeat .mk-af-mat img{aspect-ratio:4/5}
  .pg-home .mk-artfeat .mk-af-name{font-size:27px}
  .pg-home .mk-artfeat .mk-af-cta{padding:14px 24px;font-size:15px}

  /* the divider + grid underneath stay inside .wrap - only the rail breaks out */
  .pg-home .mk-allprints{margin:52px 0 28px}
}


/* ============================================================================
   v84 - SUB-HERO BANNERS BECOME SIGNUP-STYLE CONTAINED CARDS (desktop).
   ----------------------------------------------------------------------------
   User circled the sign-up card at the foot of the homepage and asked for the
   four sub-hero banners to look like it. Measured the reference first:
   .signup is 1153x379 (the .wrap width, NOT full-bleed), border-radius 26px,
   position:relative + overflow:hidden, photo inside, a heavy EVEN scrim on
   ::after (.82/.72/.86/.95) and centred copy in a 560px column.

   .svc-banner reaches full-bleed via margin-inline:-63.5px + width:1280px, so
   the conversion is simply to stop breaking out and take the radius.

   ⚠️ THIS SUPERSEDES THE v82 EDGE MASK, and deliberately REMOVES it. v82 faded
   the photo edges because a full-bleed photo ended in a hard rectangle against
   the flat section. A contained card does not have that problem at all - its
   rounded, overflow-clipped boundary IS the edge treatment, exactly as on the
   sign-up card. Keeping the mask would fade the photo away from the card edge
   and read as a smudge inside a crisp radius. Structural fix beats a cosmetic
   one - do not re-add the mask here.

   IT ALSO IMPROVES SHARPNESS, which the mask could not: the media box drops
   1340 -> 1153 CSS px, so the dpr-2 demand falls 2680 -> 2306 against the CDN's
   1600px cap - upscale 1.68x -> 1.44x. Still soft (see v82 on the cap), but
   measurably better rather than merely disguised.                           */
@media (min-width:841px){
  /* stop the full-bleed break-out; take the sign-up card geometry */
  .svc-banner{
    margin-left:0!important;margin-right:0!important;
    width:auto!important;max-width:none!important;
    border-radius:26px!important;overflow:hidden!important}

  /* v82 mask off - the card radius is the edge now (see note above) */
  .svc-banner .sb-media{
    -webkit-mask-image:none!important;mask-image:none!important}

  /* the sign-up card's EVEN scrim: copy sits over the whole card, not its base
     (the v17 lesson). Accent radial kept so each banner keeps its identity. */
  .svc-banner .sb-media::after,
  .svc-banner .sb-media.rpc::after{
    background:
      radial-gradient(680px 420px at 84% 6%,var(--accW),transparent 62%),
      linear-gradient(180deg,rgba(6,7,9,.82) 0%,rgba(6,7,9,.72) 42%,rgba(6,7,9,.86) 74%,rgba(6,7,9,.95) 100%)!important}
  .mk-gal .svc-banner .sb-media::after{
    background:
      radial-gradient(680px 420px at 84% 6%,var(--accW),transparent 62%),
      linear-gradient(180deg,rgba(6,7,9,.90) 0%,rgba(6,7,9,.84) 42%,rgba(6,7,9,.90) 74%,rgba(6,7,9,.97) 100%)!important}

  /* the v82 left-weighted local scrim was for LEFT-aligned copy; centred copy
     needs it even, or the right half of the headline loses its backing. */
  .svc-banner .sb-inner::before{
    background:linear-gradient(180deg,rgba(10,12,16,.30),rgba(10,12,16,.10) 45%,rgba(10,12,16,.42))!important}

  /* centred copy column, like .su-in */
  .svc-banner .sb-inner{padding:52px 44px 54px!important}
  .svc-banner .sb-in{
    max-width:660px!important;margin:0 auto!important;text-align:center!important}
  .svc-banner .sb-chips{justify-content:center!important}
  .svc-banner .sb-in .btn,.svc-banner .sb-in .btn-primary{margin-left:auto;margin-right:auto}

  /* the reparation caption was parked bottom-right for the full-bleed layout;
     inside a centred card it belongs centred under the copy. */
  .svc-banner .sb-media .rpc-caps{
    left:0!important;right:0!important;bottom:16px!important;text-align:center!important}
  .svc-banner .sb-media .rpc-cap{left:0!important;right:0!important;text-align:center!important}
}


/* ============================================================================
   v85 - /transfert-dargent ON THE PREMIUM DARK CANVAS (desktop) + the hero
         cut-out render placed in the empty right-hand area.
   ----------------------------------------------------------------------------
   MEASURED at 1280 first: body #F6F7F5 under a dark hero; .hgrid 2 cols
   (542|490) where col1 = [flag,crumb,kick,h1,sub,.tr-shot(none),cta,feat] and
   col2 = the white .card (491x442). Hero 799px, so ~190px of dead space sat
   below the operator card - the emptiness the user pointed at.

   The cut-out ALREADY EXISTED: hero-transfert-coin.png, 754x614, sitting in the
   markup but display:none above 840px. Nothing had to be generated.

   ⚠️ PLACED WITH position:absolute, NOT by moving the DOM. .tr-shot lives INSIDE
   the col1 copy div, and on mobile .hgrid collapses to one column where the
   order headline > sub > RENDER > cta > badges is deliberate. Promoting it to a
   direct .hgrid child to grid-place it would have pushed the render below the
   CTA on phones - a mobile regression to fix a desktop gap. Absolute positioning
   keeps the phone order untouched.

   The operator card STAYS (explicit user request from the mobile pass) and its
   logo plates STAY WHITE - Wave / Orange Money / WU / MoneyGram are coloured
   marks that lose legibility on dark.                                        */
@media (min-width:841px){
  /* ---- one dark canvas ---- */
  .pg-transfert{background:#050505!important}
  .pg-transfert .sec.white,.pg-transfert .sec.paper,.pg-transfert .hero{background:#050505!important}
  .pg-transfert .sec h2,.pg-transfert .sec h3,.pg-transfert .sec h4{color:#fff!important}
  .pg-transfert .sec p,.pg-transfert .sec li,.pg-transfert .shead p{color:#A8A8A8!important}

  /* ---- hero: the cut-out fills the dead area under the operator card ---- */
  /* ⚠️ THE CLEARANCE IS MEASURED, NOT GUESSED. First attempt used padding-bottom:40
     and a 330px render: the operator card ends at y=697 while .hgrid ended at 829,
     leaving only 132px of free space for a 274px-tall render - it overlapped the
     card by 142px and would have covered its "Passez en boutique" button.
     280px wide => 233px tall. padding-bottom:150 cleared the card by only 9px
     (the hero grows as the padding does, so the gain is not 1:1); 196 gives ~55px.
     Re-measure BOTH rects if either size changes - do not extrapolate. */
  .pg-transfert .hero .hgrid{position:relative;padding-bottom:196px}
  .pg-transfert .hero .tr-shot{
    display:block!important;position:absolute!important;
    right:0;bottom:0;width:280px;margin:0!important;z-index:1;pointer-events:none}
  .pg-transfert .hero .tr-shot img{
    width:100%!important;height:auto!important;max-height:none!important;object-fit:contain!important;
    filter:drop-shadow(0 30px 38px rgba(0,0,0,.9)) drop-shadow(0 6px 14px rgba(0,0,0,.6))}
  /* the page accent is the same green as /reparation, so .rep-glow default works */
  .pg-transfert .hero .tr-shot .rep-glow{inset:-14%}

  /* ⚠️ REAL TEXT BUG ON DESKTOP: .fi > b and > span are both inline, so the rows
     read "En toute securiteOperations verifiees..." with no break. Mobile fixes
     it with display:block inside its own block; desktop never got that rule. */
  .pg-transfert .hero .feat .fi b{display:block}
  .pg-transfert .hero .feat .fi span{display:block;color:#A8A8A8!important}

  /* ---- operator card -> dark glass; logo plates stay WHITE ---- */
  .pg-transfert .tr-card{
    background:linear-gradient(180deg,#131417,#0d0e11)!important;color:#fff!important;
    border:1px solid rgba(255,255,255,.09)!important;border-radius:28px!important;
    box-shadow:0 30px 54px -30px rgba(0,0,0,.95)!important}
  .pg-transfert .tr-card .ct b{color:#fff!important}
  .pg-transfert .tr-card .oprow{border-top-color:rgba(255,255,255,.07)!important}
  .pg-transfert .tr-card .oprow .on{color:#fff!important}
  .pg-transfert .tr-card .oprow .os{color:#8b8f8a!important}
  .pg-transfert .tr-card .oprow .lg{
    background:#fff!important;border:1px solid rgba(255,255,255,.14)!important;border-radius:12px!important}
  .pg-transfert .tr-card .oprow .tag{
    background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.14)!important;
    color:rgba(255,255,255,.82)!important}
  .pg-transfert .tr-card .badge{
    background:rgba(19,190,109,.14)!important;border:1px solid rgba(19,190,109,.3)!important;
    color:#13BE6D!important}
}


/* ---- v85b: /transfert-dargent - 3 steps, partners, contact card (desktop) ----
   ⚠️ THE :not([data-mk-clone]) GUARD ON .scard IS LOAD-BEARING. .sec.white .g3 is
   a mkCarousel rail on mobile, so its children get cloned. This rule sets
   `display:flex` and scores 0,5,0 - it would out-specify the v74 clone guard
   (0,3,0) and put all 15 clones back into the desktop grid on the resize path.
   Excluding clones from the selector leaves the guard unopposed. Rules that only
   set colour/border/shadow need no guard: a display:none clone cannot paint. */
@media (min-width:841px){
  .pg-transfert .sec.white .g3>.scard:not([data-mk-clone]){
    position:relative!important;display:flex!important;flex-direction:column!important;
    justify-content:flex-end!important;aspect-ratio:3/4!important;
    border-radius:26px!important;overflow:hidden!important;padding:24px!important;
    background:#101216!important;border:1px solid rgba(255,255,255,.09)!important;
    box-shadow:0 26px 44px -26px rgba(0,0,0,.9)!important}
  /* neutralise inherited flex-grow before bottom-aligning (the v15 lesson) */
  .pg-transfert .sec.white .g3>.scard>*{flex:0 0 auto!important}
  .pg-transfert .sec.white .g3>.scard::before{
    content:"";position:absolute;inset:0;z-index:0;
    background-size:cover;background-position:center;background-repeat:no-repeat}
  .pg-transfert .sec.white .g3>.scard::after{
    content:"";position:absolute;inset:0;z-index:1;
    background:linear-gradient(180deg,rgba(6,7,9,.30) 0%,rgba(6,7,9,.12) 22%,rgba(6,7,9,.55) 48%,rgba(6,7,9,.91) 74%,rgba(6,7,9,.98) 100%)}
  .pg-transfert .sec.white .g3>.scard .step{position:relative;z-index:2;display:block}
  .pg-transfert .sec.white .g3>.scard .step .n{
    color:#E8B84B!important;font-size:11px!important;font-weight:600!important;
    letter-spacing:1.9px!important;text-transform:uppercase;line-height:1.2!important;
    margin:0 0 7px!important;font-family:inherit!important}
  .pg-transfert .sec.white .g3>.scard .step h4{
    color:#fff!important;font-size:24px!important;line-height:1.1!important;margin:0 0 9px!important}
  .pg-transfert .sec.white .g3>.scard .step p{
    color:rgba(255,255,255,.74)!important;font-size:14px!important;line-height:1.5!important;margin:0!important}
  /* :nth-child(3n+k), matching the mobile pattern so clones stay correct */
  .pg-transfert .sec.white .g3>.scard:nth-child(3n+1)::before{background-image:url('/wp-content/uploads/mascot-hero/contact.jpg')}
  .pg-transfert .sec.white .g3>.scard:nth-child(3n+2)::before{background-image:url('/wp-content/uploads/mascot-hero/learn-laptop.jpg')}
  .pg-transfert .sec.white .g3>.scard:nth-child(3n+3)::before{background-image:url('/wp-content/uploads/mascot-hero/kids-community.jpg')}

  /* ---- partners -> the built-from-gradients glass tiles (v-mobile recipe).
     On an opaque dark canvas glass has to be BUILT from layered gradients - a
     translucent pane, a bright specular top edge and a diagonal sweep - not
     delegated to backdrop-filter, which has nothing behind it to blur. ---- */
  .pg-transfert .plogos{
    display:grid!important;grid-template-columns:repeat(4,1fr)!important;gap:18px!important}
  .pg-transfert .plogo{
    position:relative!important;overflow:hidden!important;isolation:isolate;
    width:auto!important;height:auto!important;aspect-ratio:1/1!important;
    display:grid!important;place-items:center!important;padding:26px!important;
    border-radius:28px!important;
    background:
      linear-gradient(158deg,rgba(255,255,255,.13) 0%,rgba(255,255,255,.035) 42%,rgba(255,255,255,.015) 62%,rgba(255,255,255,.06) 100%),
      linear-gradient(180deg,#15171b,#0d0f12)!important;
    border:1px solid rgba(255,255,255,.13)!important;
    backdrop-filter:none!important;-webkit-backdrop-filter:none!important;
    box-shadow:0 28px 50px -30px rgba(0,0,0,.98),inset 0 1px 0 rgba(255,255,255,.22),inset 0 -1px 0 rgba(255,255,255,.05)!important}
  .pg-transfert .plogo::after{
    content:"";position:absolute;z-index:2;pointer-events:none;
    left:-45%;top:-85%;width:135%;height:135%;transform:rotate(-14deg);
    background:linear-gradient(122deg,rgba(255,255,255,.16) 0%,rgba(255,255,255,.07) 26%,rgba(255,255,255,.015) 44%,transparent 60%)}
  /* uniform square plate; the marks are coloured and must stay on white */
  .pg-transfert .plogo img{
    position:relative;z-index:1;
    width:130px!important;height:130px!important;max-width:130px!important;max-height:130px!important;
    aspect-ratio:1/1!important;object-fit:contain!important;
    background:linear-gradient(170deg,#ffffff,#f1f2f5)!important;
    border:1px solid rgba(255,255,255,.6)!important;border-radius:26px!important;padding:16px!important}

  /* ---- closing contact card ---- */
  .pg-transfert .store{
    background:linear-gradient(180deg,#131417,#0d0e11)!important;
    border:1px solid rgba(255,255,255,.09)!important;border-radius:30px!important;
    padding:34px 30px 36px!important;box-shadow:0 30px 54px -30px rgba(0,0,0,.95)!important}
  .pg-transfert .store::before{display:none!important}
  .pg-transfert .store h3{color:#fff!important;letter-spacing:-.02em}
  .pg-transfert .store p{color:rgba(255,255,255,.72)!important}
  .pg-transfert .store .ir{
    background:rgba(255,255,255,.045)!important;border:1px solid rgba(255,255,255,.08)!important;
    border-radius:16px!important}
  .pg-transfert .store .ir b{color:rgba(255,255,255,.5)!important}
  .pg-transfert .store .ir span{color:#fff!important}
  .pg-transfert .store .cta .btn-g{
    background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.16)!important;color:#fff!important}
}


/* ============================================================================
   v86 - /service-dimpression ON THE PREMIUM DARK CANVAS (desktop).
   ----------------------------------------------------------------------------
   MEASURED at 1280 first: body #F6F7F5 under a dark hero; .sec.white holds .g4
   = 8 .icard in a 4-col 256px grid on WHITE cards; .sec.paper holds .hgal
   (3 cols, 6 .art) and the .store contact block. Page 4,299px.

   ⚠️ THE :not([data-mk-clone]) GUARD ON .icard IS LOAD-BEARING - same reason as
   v85b. .pg-impression .g4 is a mkCarousel rail on mobile, so its children are
   cloned; this rule sets `display:block` and would out-specify the v74 clone
   guard, refilling the desktop grid with clones on the resize path.

   NOTE the galerie grid here keeps its GOLD WOOD FRAMES - stripping that motif
   was rejected once already (v5); only the surrounding text colours change.  */
@media (min-width:841px){
  /* ---- one dark canvas ---- */
  .pg-impression{background:#050505!important}
  .pg-impression .sec.white,.pg-impression .sec.paper,.pg-impression .hero{background:#050505!important}
  .pg-impression .sec h2,.pg-impression .sec h3,.pg-impression .sec h4{color:#fff!important}
  .pg-impression .sec p,.pg-impression .sec li{color:#A8A8A8!important}

  /* ---- service cards -> full-bleed photo cards (the homepage .scard recipe) ---- */
  .pg-impression .g4>.icard:not([data-mk-clone]){
    position:relative!important;aspect-ratio:3/4;border-radius:26px!important;overflow:hidden!important;
    background:#111111!important;border:1px solid rgba(255,255,255,.08)!important;
    box-shadow:0 26px 44px -26px rgba(0,0,0,.9)!important;display:block!important;padding:0!important}
  .pg-impression .g4>.icard .ic-top{
    position:absolute!important;inset:0!important;aspect-ratio:auto!important;
    height:100%!important;width:100%!important;margin:0!important;border-radius:0!important;overflow:hidden}
  .pg-impression .g4>.icard .ic-top img{width:100%!important;height:100%!important;object-fit:cover!important;display:block}
  .pg-impression .g4>.icard .ic-top::after{
    content:"";position:absolute;inset:0;
    background:linear-gradient(180deg,rgba(6,7,9,.28) 0%,rgba(6,7,9,.12) 24%,rgba(6,7,9,.55) 50%,rgba(6,7,9,.91) 76%,rgba(6,7,9,.98) 100%)}
  .pg-impression .g4>.icard .ic-body{
    position:absolute!important;left:0;right:0;bottom:0;z-index:3;
    padding:0 20px 20px!important;background:none!important;text-align:left}
  .pg-impression .g4>.icard .ic-body h4{
    color:#fff!important;font-size:21px!important;line-height:1.1!important;
    letter-spacing:-.02em;margin:0 0 8px!important}
  .pg-impression .g4>.icard .ic-body p{
    color:rgba(255,255,255,.74)!important;font-size:13.5px!important;line-height:1.5!important;
    margin:0!important;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
  .pg-impression .g4>.icard .ic-body .go,.pg-impression .g4>.icard .ic-body a{
    display:inline-flex!important;align-items:center;gap:8px;margin-top:14px;
    background:#fff!important;color:#0a0c10!important;border-radius:100px!important;
    padding:11px 20px!important;font-size:14px!important;font-weight:600!important;text-decoration:none}

  /* ---- galerie grid: gold frames KEPT, surrounding text recoloured ---- */
  .pg-impression .hgal .aname{color:#fff!important}
  .pg-impression .hgal .aartist{color:rgba(255,255,255,.5)!important}
  .pg-impression .hgal .aprice{color:#E8B84B!important}
  .pg-impression .hgal .abm{color:rgba(255,255,255,.35)!important}
  .pg-impression .hgal .art .frame{
    box-shadow:0 14px 24px -12px rgba(0,0,0,.95),inset 0 0 0 1px rgba(0,0,0,.3)!important}

  /* ---- closing contact card (same treatment as /reparation) ---- */
  .pg-impression .store{
    background:linear-gradient(180deg,#131417,#0d0e11)!important;
    border:1px solid rgba(255,255,255,.09)!important;border-radius:30px!important;
    padding:34px 30px 36px!important;box-shadow:0 30px 54px -30px rgba(0,0,0,.95)!important}
  .pg-impression .store h3{color:#fff!important;letter-spacing:-.02em}
  .pg-impression .store p{color:rgba(255,255,255,.72)!important}
  .pg-impression .store .l2row,.pg-impression .store .row,.pg-impression .store .ir{
    background:rgba(255,255,255,.045)!important;border:1px solid rgba(255,255,255,.08)!important;
    border-radius:16px!important;color:#fff!important}
  .pg-impression .store b{color:rgba(255,255,255,.5)!important}
  .pg-impression .store .cta .btn-g{
    background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.16)!important;color:#fff!important}
}


/* ============================================================================
   v89 - CATEGORY PAGES: kill the orphan row in "A la une" (desktop).
   ----------------------------------------------------------------------------
   Asked to apply "phase 2" to the desktop category pages. PROFILED BOTH WIDTHS
   FIRST and the honest finding is that there was nothing left to port - every
   group already matches:
     .mfeat  rail 304x465 #111 r32   <->  grid 301x464 #111 r32
     .mwhy   rail 304x149 .043 r26   <->  grid 237x170 .043 r26
     .mexp   350x400 contact.jpg r30 <->  1108x420 contact.jpg r32
     .hubs   rail gold-tint r24      <->  grid 5-col gold-tint r20
     .bc     2-col 169x353 #111 r26  <->  4-col 261x464 #111 r26
   (Desktop hero rotation - the thing actually named "Phase 2" in the plan - had
   already shipped in v73.)

   What the profile could NOT show, but a screenshot did: mascot_cat_featured()
   renders SIX products into a FOUR-column grid, so desktop got a 4 + orphan-2
   row. Mobile cannot show this because it is a rail. 3 columns gives 3+3 and a
   bigger card (~360px) into the bargain.

   ⚠️ 3 IS TIED TO THE DATA: mascot_cat_featured() takes 6 products. If that count
   ever changes, re-check this - 3 columns only balances a multiple of 3.      */
@media (min-width:841px){
  .pg-cat .mfeat{grid-template-columns:repeat(3,1fr)!important}
}


/* ============================================================================
   v90 - CATEGORY "Pourquoi Mascot Inc." CARDS: TINTED ICON CHIP + GOLD KICKER.
   ----------------------------------------------------------------------------
   The v89 profile found desktop/mobile parity everywhere on the category pages,
   but flagged .mwhy as the weakest band on the page: five flat glass boxes with
   no icon and no photography, at BOTH widths. The homepage equivalent (.why)
   got the premium photo-card recipe in v15/v71.

   Chosen treatment: the icon-chip + gold-kicker language already used by the
   homepage service cards - NOT photo cards. These five are abstract trust points
   (Garantie / Teste / Paiement / Retrait / Support) and no honest photograph
   exists for them; arbitrary imagery would read as padding. Icons are truthful.

   ⚠️ nth-child(5n+k), NOT nth-child(k). .mwhy is a mkCarousel rail on mobile and
   the engine clones WHOLE SETS of its 5 children (15 in the DOM). With plain
   nth-child every clone would inherit card 1's icon. The modulo degrades
   perfectly with JS off - 5 children means 5n+k reduces to k. This is the same
   trap documented in v22.

   ⚠️ NO display IS SET ON .mw, so the v74 clone guard stays unopposed and needs
   no :not([data-mk-clone]) here. A ::before on a display:none clone cannot paint.

   UNGATED on purpose: this is design LANGUAGE, not layout, so it applies at every
   width (the v68 rule - gate layout, never the language).                    */
.mwhy>.mw{position:relative}
.mwhy>.mw::before{
  content:"";display:block;width:42px;height:42px;border-radius:13px;
  border:1px solid rgba(216,160,61,.28);
  background-color:rgba(216,160,61,.12);
  background-repeat:no-repeat;background-position:center;background-size:21px 21px;
  margin:0 0 15px}

/* the bare "01" becomes a proper kicker in the site language */
.mwhy>.mw .mw-n{
  display:block;color:#D8A03D;font-size:11px;font-weight:600;
  letter-spacing:1.9px;text-transform:uppercase;line-height:1.2;margin:0 0 7px}

.mwhy>.mw:nth-child(5n+1)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23D8A03D' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l7 3v5c0 4.4-3 8.3-7 10-4-1.7-7-5.6-7-10V6l7-3z'/%3E%3Cpath d='m9 12 2 2 4-4'/%3E%3C/svg%3E")}
.mwhy>.mw:nth-child(5n+2)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23D8A03D' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 4h6v3H9z'/%3E%3Cpath d='M8 4H6a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1h-2'/%3E%3Cpath d='m9 13 2 2 4-4'/%3E%3C/svg%3E")}
.mwhy>.mw:nth-child(5n+3)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23D8A03D' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 10V8a6 6 0 0 1 12 0v2'/%3E%3Cpath d='M5 10h14v10H5z'/%3E%3Cpath d='M12 14v3'/%3E%3C/svg%3E")}
.mwhy>.mw:nth-child(5n+4)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23D8A03D' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 8h12l-1 12H7L6 8z'/%3E%3Cpath d='M9 8V6a3 3 0 0 1 6 0v2'/%3E%3C/svg%3E")}
.mwhy>.mw:nth-child(5n+5)::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23D8A03D' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5h16v11H9l-5 4V5z'/%3E%3Cpath d='M8 9h8'/%3E%3Cpath d='M8 12h5'/%3E%3C/svg%3E")}


/* ============================================================================
   v91 - HOMEPAGE HERO: give the headline real backing + a glass trust bar.
   ----------------------------------------------------------------------------
   User: the category pages look stronger than the homepage, and the homepage
   should be the wow factor. Profiled the hero before changing anything:
   860px tall, 84px headline, 6-slide Ken Burns (verified RUNNING - kbA, 6.2s,
   transform animating 1.18 -> 1.05, so motion was never the problem).

   ⚠️ THE REAL DEFECT, AND IT IS THE v17 SIGN-UP LESSON AGAIN: .hero .scrim is a
   VERTICAL gradient - rgba(10,12,16,.82) at 0%, dropping to .15 by 24%. The
   headline sits at roughly 18-26% of the hero, i.e. exactly in the band where
   the scrim is weakest, over a BRIGHT photo (kids in a sunlit room). That is why
   the type read as flat next to the category heroes, which are art-directed on a
   near-black canvas. A scrim has to be weighted where the COPY is, not where the
   chrome is.

   Fix is a left-weighted cinematic gradient layered UNDER the existing vertical
   one: the copy column gets authority, the right side stays open so the
   photograph still carries the emotion. The .tint orange radial is untouched.

   Desktop only. The mobile hero was tuned across v22/v23/v28 (CTA pills, -m.jpg
   crops, gentler Ken Burns) and its copy sits differently; re-weighting its scrim
   blind would undo that work.                                               */
@media (min-width:841px){
  .pg-home .hero .scrim{
    background:
      linear-gradient(100deg,rgba(8,10,14,.93) 0%,rgba(8,10,14,.78) 30%,rgba(8,10,14,.34) 56%,rgba(8,10,14,.10) 76%,transparent 100%),
      linear-gradient(180deg,rgba(10,12,16,.70) 0%,rgba(10,12,16,.10) 26%,rgba(10,12,16,.30) 66%,rgba(10,12,16,.80) 100%)!important}

  /* ---- glass trust bar, the category heroes' proven .mch-badges pattern ----
     Markup added to accueil.html (v91). It is REAL MARKUP behind a media query,
     so per the v27 rule it is given explicit behaviour on the other side: it is
     hidden below 841px (see the block after this one) rather than left to fall
     into the tuned mobile hero. */
  .pg-home .hero .hero-trust{
    display:inline-flex;align-items:stretch;gap:0;margin-top:26px;
    background:rgba(255,255,255,.055);border:1px solid rgba(255,255,255,.13);
    border-radius:20px;padding:14px 6px;
    backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
    box-shadow:0 22px 44px -28px rgba(0,0,0,.95)}
  .pg-home .hero .hero-trust .ht-i{
    display:flex;align-items:center;gap:9px;padding:0 18px;color:#fff;
    font-size:13.5px;line-height:1.2;white-space:nowrap}
  .pg-home .hero .hero-trust .ht-i+.ht-i{border-left:1px solid rgba(255,255,255,.12)}
  .pg-home .hero .hero-trust svg{width:19px;height:19px;color:#F7A12B;flex:none}
  .pg-home .hero .hero-trust b{font-weight:600}
}
@media (max-width:840px){
  /* the mobile hero is tuned; do not add height to it without a decision */
  .pg-home .hero .hero-trust{display:none}
}


/* ============================================================================
   v92 - /reparation BODY SECTIONS ON THE DARK CANVAS (desktop).
   ----------------------------------------------------------------------------
   ⚠️ CORRECTING A MIS-RECORDED CLAIM. v85-v88 logged "this closes the service-page
   programme - /reparation was done in v81". That was WRONG: v81 built only the
   HERO (render + Avant/Apres carousel). The BODY was never ported, and the user
   caught it from a screenshot of a white "Les pannes les plus courantes" band.
   Re-measured at 1280 and six sections were still light:
     body #F6F7F5 | .sec.white(g4 pannes) #FFF | .sec.paper(g4 steps) | 
     .sec.white(why2) | .sec.white(faq-wrap) | .sec.paper(store)
   LESSON: "done" for a page means every band measured, not the hero shipped.

   Values copied from the mobile block (css ~1241-1355 + 1497-1520), layout left
   desktop-native: these grids already work, only surfaces change.

   ⚠️ .sec.paper:has(.bagrid) STAYS LIGHT - the before/after band is a deliberate
   contrast beat the user chose in v38. Do not darken it.

   ⚠️ NO display IS SET on .g4/.g3/.rpromise children. They are mkCarousel rails on
   mobile, so their clones exist in the DOM; setting display here would out-
   specify the v74 clone guard. Colour-only rules need no :not([data-mk-clone]) -
   a display:none clone cannot paint.                                        */
@media (min-width:841px){
  /* ---- palette: one dark canvas, except the before/after band ---- */
  .pg-reparation{background:#050505!important}
  .pg-reparation .sec.white,.pg-reparation .sec.paper{background:#050505!important}
  .pg-reparation .sec.white h2,.pg-reparation .sec.paper h2,
  .pg-reparation .sec.white h3,.pg-reparation .sec.paper h3,
  .pg-reparation .sec.white h4,.pg-reparation .sec.paper h4{color:#fff!important}
  .pg-reparation .sec.white p,.pg-reparation .sec.paper p,
  .pg-reparation .sec.white li,.pg-reparation .sec.paper li{color:#A8A8A8!important}

  /* the one deliberate light band (v38 user choice) */
  .pg-reparation .sec.paper:has(.bagrid){background:#F1F2F0!important}
  .pg-reparation .sec.paper:has(.bagrid) h2{color:#0A0C10!important}
  .pg-reparation .sec.paper:has(.bagrid) p{color:#4b5057!important}

  /* ---- cards -> dark glass ---- */
  .pg-reparation .sec.white .g4>*,.pg-reparation .sec.paper .g4>*,
  .pg-reparation .sec.white .g3>*,.pg-reparation .sec.dark .g3>*,
  .pg-reparation .rpromise>*{
    background:#111111!important;border:1px solid rgba(255,255,255,.08)!important;
    border-radius:26px!important;overflow:hidden!important;
    box-shadow:0 20px 38px -24px rgba(0,0,0,.95)!important}
  .pg-reparation .g4>* h3,.pg-reparation .g4>* h4,
  .pg-reparation .g3>* h3,.pg-reparation .g3>* h4,
  .pg-reparation .rpromise>* h3,.pg-reparation .rpromise>* h4{color:#fff!important}
  .pg-reparation .g4>* p,.pg-reparation .g3>* p,.pg-reparation .rpromise>* p{color:#A8A8A8!important}

  /* ---- FAQ -> dark glass ---- */
  .pg-reparation .faq-wrap details,.pg-reparation .faq-wrap .faq{
    background:rgba(255,255,255,.045)!important;border:1px solid rgba(255,255,255,.08)!important;
    border-radius:20px!important;color:#fff!important}
  .pg-reparation .faq-wrap summary,.pg-reparation .faq-wrap h4{color:#fff!important}
  .pg-reparation .faq-wrap p{color:#A8A8A8!important}

  /* ---- trust chips -> glass ---- */
  .pg-reparation .rchips>*{
    background:rgba(255,255,255,.05)!important;border:1px solid rgba(255,255,255,.08)!important;
    color:#fff!important}

  /* ---- closing contact card ---- */
  .pg-reparation .store{
    background:linear-gradient(180deg,#131417,#0d0e11)!important;
    border:1px solid rgba(255,255,255,.09)!important;border-radius:30px!important;
    padding:34px 30px 36px!important;box-shadow:0 30px 54px -30px rgba(0,0,0,.95)!important}
  .pg-reparation .store h3{color:#fff!important;letter-spacing:-.02em}
  .pg-reparation .store p{color:rgba(255,255,255,.72)!important}
  .pg-reparation .store .l2row,.pg-reparation .store .row,.pg-reparation .store .ir{
    background:rgba(255,255,255,.045)!important;border:1px solid rgba(255,255,255,.08)!important;
    border-radius:16px!important;color:#fff!important}
  .pg-reparation .store b{color:rgba(255,255,255,.5)!important}
  .pg-reparation .store .cta .btn-g{
    background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.16)!important;color:#fff!important}
}


/* ============================================================================
   v93 - CATEGORY PRODUCT CARDS SCALED BACK (desktop).
   ----------------------------------------------------------------------------
   User: the product cards on the category pages look very large - bring them
   back in line with the rest of the site.

   MEASURED THE CAUSE RATHER THAN JUST SHRINKING THINGS:
     .mfc  card 408x572, plate .mfc-img aspect-ratio:1/1 = 406x406, but the
           product image inside is only 358x202 - so ~200px of the card is EMPTY
           WHITE PLATE. That dead space is what reads as oversized, not the width.
     .bc   card 261x464, plate 259x259 holding a 223x223 image - much better
           filled, so it only needs a modest trim.

   ⚠️ v89 MADE THIS WORSE. Going 4 columns -> 3 to kill an orphan row also grew
   the card 301 -> 408px. The orphan fix was right; the size that came with it
   was not. Keeping 3 columns (6 products = 3+3, still balanced) but capping the
   grid width, so both problems stay solved.

   ⚠️ 4/3 PLATES, NOT 1/1. A square plate is only right when the product fills it;
   this catalogue is shot as wide device groups, so a square guarantees dead air.
   No display is set anywhere here, so the v74 clone guard stays unopposed.    */
@media (min-width:841px){
  /* featured: keep 3 columns (3+3, no orphan) but cap the width */
  .pg-cat .mfeat{max-width:1040px!important;margin-left:auto!important;margin-right:auto!important}
  .pg-cat .mfeat>.mfc .mfc-img{aspect-ratio:4/3!important}
  .pg-cat .mfeat>.mfc .mfc-n{font-size:18px!important}
  .pg-cat .mfeat>.mfc .mfc-cta{padding:12px 20px!important;font-size:14px!important}

  /* grid product cards: modest trim - the plate is well filled, so only the
     square is relaxed, nothing else changes */
  .pg-cat .grid>.bc .bc-img{aspect-ratio:4/3!important}
}


/* ============================================================================
   v94 - HOMEPAGE PARTNER LOGOS -> GLASS TILES IN A SINGLE LINE (desktop).
   ----------------------------------------------------------------------------
   User supplied the mobile treatment as the reference (dark glass tiles, each
   holding a white rounded plate) and asked for it on the homepage, in one line.

   MEASURED: .partners-sec was WHITE with 5 flat .plogo tiles (172x92, white on a
   #ECEEEA hairline). That white slab also sat directly after the signup and
   locator bands, which are both dark - so it read as an unfinished footer strip.
   Darkening it is what lets the glass work AND closes the page properly.

   Recipe reused verbatim from the /transfert-dargent partners (v85b) so the two
   partner strips on the site are identical rather than similar.

   ⚠️ THE LOGO PLATES STAY WHITE, deliberately. Wave / Orange Money / Western
   Union / MoneyGram / CIE-SODECI are COLOURED marks - on a dark tile they lose
   legibility and, for a partner logo, that is a brand-usage problem as much as a
   design one. Same call made on /transfert-dargent.

   ⚠️ GLASS IS BUILT FROM GRADIENTS, NOT backdrop-filter. On an opaque dark canvas
   there is nothing behind the tile to blur, so the pane, the specular top edge
   and the diagonal sweep are all painted explicitly.                         */
@media (min-width:841px){
  .pg-home .partners-sec{background:#050505!important}
  .pg-home .partners-sec .kick,.pg-home .partners-sec h2,.pg-home .partners-sec .sh{
    color:rgba(255,255,255,.55)!important}
  .pg-home .partners-sec p{color:#A8A8A8!important}

  /* one line, five equal tiles */
  .pg-home .plogos{
    display:grid!important;grid-template-columns:repeat(5,1fr)!important;
    gap:18px!important;justify-content:stretch!important}
  .pg-home .plogo{
    position:relative!important;overflow:hidden!important;isolation:isolate;
    width:auto!important;height:auto!important;aspect-ratio:1/1!important;
    display:grid!important;place-items:center!important;padding:22px!important;
    border-radius:26px!important;
    background:
      linear-gradient(158deg,rgba(255,255,255,.13) 0%,rgba(255,255,255,.035) 42%,rgba(255,255,255,.015) 62%,rgba(255,255,255,.06) 100%),
      linear-gradient(180deg,#15171b,#0d0f12)!important;
    border:1px solid rgba(255,255,255,.13)!important;
    backdrop-filter:none!important;-webkit-backdrop-filter:none!important;
    box-shadow:0 28px 50px -30px rgba(0,0,0,.98),inset 0 1px 0 rgba(255,255,255,.22),inset 0 -1px 0 rgba(255,255,255,.05)!important}
  .pg-home .plogo::after{
    content:"";position:absolute;z-index:2;pointer-events:none;
    left:-45%;top:-85%;width:135%;height:135%;transform:rotate(-14deg);
    background:linear-gradient(122deg,rgba(255,255,255,.16) 0%,rgba(255,255,255,.07) 26%,rgba(255,255,255,.015) 44%,transparent 60%)}
  .pg-home .plogo img{
    position:relative;z-index:1;
    width:118px!important;height:118px!important;max-width:118px!important;max-height:118px!important;
    aspect-ratio:1/1!important;object-fit:contain!important;
    background:linear-gradient(170deg,#ffffff,#f1f2f5)!important;
    border:1px solid rgba(255,255,255,.6)!important;border-radius:24px!important;padding:14px!important}
}


/* ============================================================================
   v95 - SERVICE HEROES REBUILT IN THE PRODUCT-CATEGORY LANGUAGE (desktop)
         + the homepage galerie composition on /service-dimpression.
   ----------------------------------------------------------------------------
   ⚠️ THIS IS A LAYOUT CHANGE, NOT A REBUILD - the DOM was already right. Measured
   both heroes and .hgrid children are already in the order the user asked for:
     [copy, render, badges, cta, card/booking]
   That order was tuned in v39 for the MOBILE reading flow. Collapsing the desktop
   grid to ONE CENTRED COLUMN therefore produces exactly the category-hero
   structure (pill > headline > sub > big render > dots > glass badges > CTAs >
   card at the bottom) with no markup edit and no risk to phones.

   This SUPERSEDES the v81 two-column grid placement for /reparation. Those rules
   are explicitly reset below rather than left to fight this block - two sets of
   placement rules on one grid is the v65 stale-gate mistake.                */
@media (min-width:841px){

  /* ---------- shared: one centred column ---------- */
  .pg-reparation .hero .hgrid,.pg-impression .hero .hgrid{
    grid-template-columns:1fr!important;justify-items:center!important;
    max-width:900px!important;margin-left:auto!important;margin-right:auto!important;
    gap:0!important;text-align:center!important;padding-bottom:0!important}
  /* reset v81's explicit placement so nothing is stranded in a phantom column 2 */
  .pg-reparation .hero .hgrid>*,.pg-impression .hero .hgrid>*{
    grid-column:1!important;grid-row:auto!important;align-self:auto!important;width:100%}
  .pg-reparation .hero .hgrid>*:first-child,.pg-impression .hero .hgrid>*:first-child{max-width:760px}
  .pg-reparation .hero .flag,.pg-impression .hero .flag{margin-left:auto;margin-right:auto}
  .pg-reparation .hero .sub,.pg-impression .hero .sub{margin-left:auto;margin-right:auto;max-width:640px}

  /* ---------- the render: large, centred, the hero's subject ---------- */
  .pg-reparation .hero .rep-shot,.pg-impression .hero .imp-shot{
    display:grid!important;place-items:center!important;
    max-width:560px!important;margin:34px auto 0!important}
  /* the Avant/Apres crossfade stack - bigger than the v81 right-column size */
  .pg-reparation .hero .rep-shot .rs-stack{height:470px!important}
  .pg-impression .hero .imp-shot{max-width:820px!important}
  .pg-impression .hero .imp-shot img{max-height:330px!important;object-fit:contain!important}

  /* ---------- glass badge bar, as on the category heroes ---------- */
  .pg-reparation .hero .rep-badges,.pg-impression .hero .rep-badges{
    display:grid!important;grid-template-columns:repeat(3,1fr)!important;
    max-width:560px!important;margin:30px auto 0!important;padding:18px 8px!important}

  /* ---------- CTAs centred under the badges ---------- */
  .pg-reparation .hero .cta,.pg-impression .hero .cta{
    display:flex!important;justify-content:center!important;gap:14px!important;
    margin:30px auto 0!important;max-width:640px!important}

  /* ---------- the card sits at the BOTTOM of the banner (user request) ---------- */
  .pg-reparation .hero .book{
    max-width:660px!important;margin:44px auto 0!important;text-align:left!important}
  /* ⚠️ the print hero's .card is svc-print.jpg - the FLAT CLIP-ART collage
     (a "PRINT SERVICES" logo lockup), not a photograph. It is the weakest thing
     on the page and has no counterpart in the category-hero language, so on
     desktop the real equipment render (hero-print-equipment.jpg, 1247x431) takes
     its place and the collage is dropped. Mobile is untouched. */
  .pg-impression .hero .card{display:none!important}
}


/* ---- v95b: the homepage galerie composition on /service-dimpression -------
   The carousel was ALREADY BEING BUILT here - mk-gallery.js has run on this page
   since v76 and produced 12 cards from .pg-impression .hgal. It was only hidden
   above 841px by the body:not(.pg-home) guard, so this is a one-line unlock plus
   geometry, not new work. Same clamp + derived-centring recipe as the homepage
   (v83) so the two galerie sections read identically.                       */
@media (min-width:841px){
  .pg-impression .mk-artfeat{
    --mkAf:clamp(320px,25vw,400px);
    margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw);
    width:100vw;max-width:100vw;gap:24px;padding-bottom:6px;
    padding-left:calc((100vw - var(--mkAf))/2);
    padding-right:calc((100vw - var(--mkAf))/2)}
  .pg-impression .mk-artfeat>.mk-af{
    flex:0 0 var(--mkAf);width:var(--mkAf);max-width:var(--mkAf);
    scroll-snap-align:center;padding:20px 20px 22px;border-radius:30px}
  .pg-impression .mk-allprints{margin:48px 0 26px}
  /* dots are globally display:none by default (line 227) - opt this one in */
  .pg-impression .mk-artfeat~.mk-dots{display:flex;justify-content:center;gap:7px;margin:20px 0 0}
  /* ⚠️ same v77 carve-out as the homepage: the v74 clone guard would hide the
     loop clones and silently reduce this to a bounded 4-card strip. 0,4,0 to
     clear the guard's 0,3,0 outright. */
  .pg-impression .mk-artfeat>[data-mk-clone][data-mk-clone]{display:block!important}
}


/* ============================================================================
   v96 - /mascot-galerie GETS THE HOMEPAGE GALERIE COMPOSITION (desktop).
   ----------------------------------------------------------------------------
   Predicted in the v95 notes and confirmed by measurement: the carousel was
   ALREADY BUILT here (12 cards in the DOM, 4 visible) - mk-gallery.js has run on
   this page since v76. Three things were suppressing it on desktop:
     1. the body:not(...) visibility guard        -> .pg-gal added to the chain
     2. the v74 clone guard hiding the 8 clones   -> carve-out below (0,4,0)
     3. .gal-banner-wrap display:none from v53    -> re-shown below
   Without #2 the rail silently degrades to a bounded 4-card strip - it LOOKS
   like it works. That is the v77 lesson, now applied pre-emptively for the
   third surface running.                                                    */
@media (min-width:841px){
  /* 1. the banner the user asked to carry over from the homepage */
  .pg-gal .gal-banner-wrap{display:block!important}

  /* 2. carousel geometry - same clamp + derived centring as homepage (v83) */
  .pg-gal .mk-artfeat{
    --mkAf:clamp(320px,25vw,400px);
    margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw);
    width:100vw;max-width:100vw;gap:24px;padding-bottom:6px;
    padding-left:calc((100vw - var(--mkAf))/2);
    padding-right:calc((100vw - var(--mkAf))/2)}
  .pg-gal .mk-artfeat>.mk-af{
    flex:0 0 var(--mkAf);width:var(--mkAf);max-width:var(--mkAf);
    scroll-snap-align:center;padding:20px 20px 22px;border-radius:30px}
  .pg-gal .mk-allprints{margin:48px 0 26px}
  .pg-gal .mk-artfeat~.mk-dots{display:flex;justify-content:center;gap:7px;margin:20px 0 0}

  /* 3. THE CLONE CARVE-OUT - without this the loop cannot work (v77) */
  .pg-gal .mk-artfeat>[data-mk-clone][data-mk-clone]{display:block!important}

  /* 4. the grid underneath: 4 small columns -> 3 large, matching the homepage,
     so the prints below the carousel read at the same scale. */
  .pg-gal .ggrid{grid-template-columns:repeat(3,1fr)!important;gap:26px 22px!important}
}


/* ============================================================================
   v97 - two follow-up fixes.
   ----------------------------------------------------------------------------
   (a) ⚠️ 60px HORIZONTAL OVERFLOW ON /mascot-galerie, introduced by v96.
   Traced it rather than guessing: the offender is .sb-media at 1385px wide with
   its right edge at 1325 against a 1265 clientWidth. That is the v79 inset:-60px,
   which exists because .sb-media resolves against .sb-inner and needed to be
   over-extended to cover a 30px gap. On the homepage v84 turned the banner into a
   contained card WITH overflow:hidden, so the overhang is clipped. This page wraps
   its banner in .gal-banner-wrap, which does NOT clip - so the overhang escaped.
   LESSON: an intentionally over-extended child is only safe while SOMETHING
   clips it. When you re-show that component on a new surface, re-check the clip.

   (b) the repair booking card read as a wide letterbox in the new centred hero.
   660 -> 520px so it is closer to square, per the user.                     */
@media (min-width:841px){
  /* ⚠️ THE FIX IS position:relative, NOT overflow. First attempt added overflow:
     hidden to the wrap and the banner and the 60px did NOT move. Traced the chain:
     .svc-banner is position:STATIC on this page (it is relative on the homepage),
     so .sb-media{position:absolute;inset:-60px} resolves against an ancestor
     further up and escapes to 1325px against a 1265 clientWidth.
     CSS RULE WORTH REMEMBERING: overflow:hidden does NOT clip an absolutely-
     positioned descendant whose CONTAINING BLOCK lies outside that element. The
     ancestor must establish the containing block (position != static) for its
     overflow to apply. Making the banner relative fixes both at once.
     Applied to .svc-banner generally so no future surface inherits the same trap. */
  .svc-banner{position:relative!important}
  .pg-gal .gal-banner-wrap,.pg-gal .svc-banner{overflow:hidden!important}
  .pg-reparation .hero .book{max-width:520px!important}
}


/* ============================================================================
   v99 - CAFE "ON VIENT POUR" -> VisionOS-STYLE GLASS CARD SECTION.
   ----------------------------------------------------------------------------
   Built from the user's design brief. THE BRIEF SPECIFIED React + Next.js +
   Tailwind + Framer Motion + Lucide + a <WorkspaceCard/> component. THIS SITE IS
   NONE OF THOSE - cafe.html is a static HTML file served by mascot-router.php and
   styled by this sheet. Agreed with the user to build the DESIGN in the real
   stack rather than fork the architecture for one section. Everything in the
   brief maps over except Framer Motion spring physics, which has no exact CSS
   equivalent - a tuned cubic-bezier stands in (see the note on transitions).

   ⚠️ ONE BRIEF SPEC WAS GEOMETRICALLY IMPOSSIBLE AND WAS ADJUSTED: cards were
   given as 420x280 while also holding a 96px cube + a ~44px Playfair title +
   18px body + a 48px button. That is ~230px of content plus padding in a 280px
   box. Card height is 340px and the title 30px, which keeps the proportions of
   the reference image. Everything else follows the brief literally.

   Icons are inline SVG drawn in the Lucide idiom (stroke 2.2, round caps) rather
   than the lucide-react package - same shapes, no dependency.               */

/* ---- section shell: cream canvas with a slowly drifting gradient ---- */
.sanct-sec{background:#F8F4EA!important;position:relative;overflow:hidden;
  padding-top:clamp(72px,9vw,140px)!important;padding-bottom:clamp(72px,9vw,140px)!important}
.sanct-sec::before{content:"";position:absolute;inset:-20%;z-index:0;pointer-events:none;
  background:
    radial-gradient(38% 42% at 18% 22%,rgba(231,201,140,.30),transparent 62%),
    radial-gradient(34% 40% at 82% 30%,rgba(214,226,240,.34),transparent 62%),
    radial-gradient(40% 44% at 50% 88%,rgba(226,214,196,.34),transparent 64%);
  animation:sanctDrift 26s ease-in-out infinite alternate}
@keyframes sanctDrift{0%{transform:translate3d(0,0,0) scale(1)}
  50%{transform:translate3d(2.2%,-1.6%,0) scale(1.05)}
  100%{transform:translate3d(-1.8%,1.8%,0) scale(1.02)}}
.sanct-sec>.wrap{position:relative;z-index:1;max-width:1500px!important}

/* ---- eyebrow + headline, moved ABOVE the grid per the brief ---- */
.sanct-lead{text-align:center;margin:0 auto clamp(38px,4.6vw,64px);max-width:900px}
.sanct-eyebrow{display:block;color:#A77A2F;letter-spacing:.25em;text-transform:uppercase;
  font-size:12px;font-weight:600;margin-bottom:18px}
.sanct-sec .elegance{font-family:"Playfair Display",Georgia,serif;font-weight:700;
  font-size:clamp(34px,5.2vw,72px);line-height:1.05;letter-spacing:-.015em;color:#171310;margin:0}
.sanct-sec .elegance i{font-style:italic;color:#A77A2F}

/* ---- the grid ---- */
.sanct-sec .sanct{display:grid!important;grid-template-columns:repeat(3,1fr)!important;
  gap:32px!important;align-items:stretch;
  /* ⚠️ the page's own CSS caps .sanct at 900px, which squeezed the cards to 279px
     instead of the ~420 the brief asks for. Released here; the .wrap (1500 max,
     48px padding) is now the only constraint, so cards land at ~368px on a 1280
     screen and reach the brief's 420 from about 1400 up. */
  max-width:none!important;margin-left:auto!important;margin-right:auto!important}

/* ---- the card ---- */
.sanct-sec .sanct>.s{
  position:relative;display:flex!important;flex-direction:column;align-items:center;
  justify-content:flex-start;text-align:center;min-height:340px;padding:34px 28px 30px!important;
  background:rgba(255,255,255,.86)!important;border:1px solid rgba(255,255,255,.7)!important;
  border-radius:34px!important;box-shadow:0 30px 60px rgba(0,0,0,.06)!important;
  overflow:visible!important;
  transition:transform .5s cubic-bezier(.16,1,.3,1),box-shadow .5s cubic-bezier(.16,1,.3,1),background .5s}
.sanct-sec .sanct>.s:hover{transform:translateY(-8px);box-shadow:0 44px 80px rgba(0,0,0,.10)!important}

/* the ambient glow the cube casts onto the card */
.sanct-sec .sanct>.s::before{content:"";position:absolute;left:50%;top:16px;
  width:210px;height:210px;transform:translateX(-50%);border-radius:50%;z-index:0;pointer-events:none;
  background:radial-gradient(circle,var(--sg,rgba(231,181,90,.55)),transparent 66%);
  filter:blur(30px);opacity:.55;transition:opacity .5s,transform .5s}
.sanct-sec .sanct>.s:hover::before{opacity:.9;transform:translateX(-50%) scale(1.12)}

/* ---- the floating glass cube ---- */
.sanct-sec .s-cube{position:relative;z-index:2;display:grid;place-items:center;
  width:96px;height:96px;border-radius:30px;margin-bottom:24px;
  background:linear-gradient(180deg,rgba(255,255,255,.80),rgba(255,255,255,.15)),var(--sc,#E3B341);
  border:1px solid rgba(255,255,255,.8);
  box-shadow:0 18px 34px -12px var(--sg,rgba(231,181,90,.55)),
    inset 0 1px 0 rgba(255,255,255,.95),inset 0 -10px 18px rgba(0,0,0,.10);
  backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
  transform-style:preserve-3d;
  animation:sanctFloat 5s ease-in-out infinite;
  transition:transform .55s cubic-bezier(.16,1,.3,1),box-shadow .55s}
@keyframes sanctFloat{0%{translate:0 0}50%{translate:0 -6px}100%{translate:0 0}}
.sanct-sec .sanct>.s:nth-child(1) .s-cube{animation-delay:0s}
.sanct-sec .sanct>.s:nth-child(2) .s-cube{animation-delay:.6s}
.sanct-sec .sanct>.s:nth-child(3) .s-cube{animation-delay:1.2s}
.sanct-sec .sanct>.s:nth-child(4) .s-cube{animation-delay:1.8s}
.sanct-sec .sanct>.s:nth-child(5) .s-cube{animation-delay:2.4s}
.sanct-sec .sanct>.s:nth-child(6) .s-cube{animation-delay:3s}

/* the moving specular reflection */
.sanct-sec .s-glass{position:absolute;inset:0;border-radius:30px;overflow:hidden;pointer-events:none}
.sanct-sec .s-glass::after{content:"";position:absolute;left:-40%;top:-70%;width:120%;height:120%;
  transform:rotate(-16deg) translateY(0);
  background:linear-gradient(120deg,rgba(255,255,255,.85) 0%,rgba(255,255,255,.28) 26%,transparent 52%);
  transition:transform .6s cubic-bezier(.16,1,.3,1)}
.sanct-sec .sanct>.s:hover .s-glass::after{transform:rotate(-16deg) translateY(26%)}
.sanct-sec .s-ico{position:relative;z-index:2;display:grid;place-items:center;color:#fff;
  filter:drop-shadow(0 2px 4px rgba(0,0,0,.28))}
.sanct-sec .s-ico svg{width:42px;height:42px;display:block}
/* hover tilt - the JS cursor-follow overrides this inline while the mouse is on */
.sanct-sec .sanct>.s:hover .s-cube{transform:scale(1.08) rotateX(6deg) rotateY(-6deg)}

/* ---- typography ---- */
.sanct-sec .s-t{position:relative;z-index:2;display:block;
  font-family:"Playfair Display",Georgia,serif;font-weight:700;font-size:30px;line-height:1.15;
  color:#171310;margin:0 0 8px}
.sanct-sec .sanct>.s small{position:relative;z-index:2;display:block;
  font-size:16px;line-height:1.5;color:#666;margin:0}

/* ---- the circular button ---- */
.sanct-sec .s-go{position:relative;z-index:2;display:grid;place-items:center;
  width:48px;height:48px;border-radius:50%;margin-top:auto;color:#171310;
  background:#fff;box-shadow:0 10px 22px -10px rgba(0,0,0,.35);
  opacity:0;transform:translateY(8px);
  transition:opacity .45s cubic-bezier(.16,1,.3,1),transform .45s cubic-bezier(.16,1,.3,1),background .3s,color .3s}
.sanct-sec .s-go svg{width:20px;height:20px;transition:transform .35s cubic-bezier(.16,1,.3,1)}
.sanct-sec .sanct>.s:hover .s-go{opacity:1;transform:translateY(0)}
.sanct-sec .sanct>.s:hover .s-go:hover{background:#F2890E;color:#fff}
.sanct-sec .sanct>.s:hover .s-go:hover svg{transform:translateX(3px)}

/* ---- per-card colour: --sc = cube tint, --sg = ambient glow ---- */
.sanct-sec .sanct>.s:nth-child(1){--sc:#E3B341;--sg:rgba(227,179,65,.55)}
.sanct-sec .sanct>.s:nth-child(2){--sc:#F2890E;--sg:rgba(242,137,14,.50)}
.sanct-sec .sanct>.s:nth-child(3){--sc:#5B8DEF;--sg:rgba(91,141,239,.48)}
.sanct-sec .sanct>.s:nth-child(4){--sc:#A78BFA;--sg:rgba(167,139,250,.48)}
.sanct-sec .sanct>.s:nth-child(5){--sc:#4FD1C5;--sg:rgba(79,209,197,.48)}
.sanct-sec .sanct>.s:nth-child(6){--sc:#3FA96B;--sg:rgba(63,169,107,.50)}

/* ---- the one active card ---- */
.sanct-sec .sanct>.s.is-active{
  background:linear-gradient(180deg,rgba(233,245,236,.92),rgba(246,251,247,.92))!important;
  border:1px solid rgba(63,169,107,.42)!important;
  box-shadow:0 30px 60px rgba(24,88,54,.10)!important}
.sanct-sec .sanct>.s.is-active::before{opacity:.95;width:250px;height:250px}
.sanct-sec .sanct>.s.is-active .s-cube{box-shadow:0 22px 40px -12px rgba(63,169,107,.65),
  inset 0 1px 0 rgba(255,255,255,.95),inset 0 -10px 18px rgba(0,0,0,.10)}
.sanct-sec .sanct>.s.is-active .s-go{opacity:1;transform:translateY(0);background:#3FA96B;color:#fff}

.sanct-dots{display:none}

/* ---- reduced motion: kill the drift, float and tilt ---- */
@media (prefers-reduced-motion:reduce){
  .sanct-sec::before,.sanct-sec .s-cube{animation:none!important}
  .sanct-sec .sanct>.s,.sanct-sec .s-cube,.sanct-sec .s-go{transition:none!important}}

/* ---- mobile: one card per screen, next peeking, scroll-snap + dots ---- */
@media (max-width:840px){
  .sanct-sec .sanct{display:flex!important;grid-template-columns:none!important;
    flex-wrap:nowrap!important;overflow-x:auto;overflow-y:hidden;
    scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;
    scrollbar-width:none;-ms-overflow-style:none;
    margin-left:calc(50% - 50vw)!important;margin-right:calc(50% - 50vw)!important;
    width:100vw!important;max-width:100vw!important;
    padding-left:calc((100vw - 88vw)/2)!important;padding-right:calc((100vw - 88vw)/2)!important;
    gap:16px!important;padding-bottom:6px!important}
  .sanct-sec .sanct::-webkit-scrollbar{display:none;height:0}
  .sanct-sec .sanct>.s{flex:0 0 88vw!important;width:88vw!important;max-width:88vw!important;
    scroll-snap-align:center;min-height:300px;opacity:1!important;transform:none!important}
  .sanct-sec .s-go{opacity:1;transform:none}
  .sanct-dots{display:flex;justify-content:center;gap:7px;margin:22px 0 0}
  .sanct-dots button{position:relative;width:22px;height:14px;padding:0;border:0;background:none;cursor:pointer}
  .sanct-dots button::after{content:"";position:absolute;left:50%;top:50%;width:20px;height:6px;
    border-radius:100px;background:rgba(23,19,16,.18);
    transform:translate(-50%,-50%) scaleX(.34);transform-origin:center;
    transition:transform .35s cubic-bezier(.22,.61,.36,1),background .35s}
  .sanct-dots button.on::after{transform:translate(-50%,-50%) scaleX(1);background:#A77A2F}
}


/* ============================================================================
   v101 - /reparation "Comment ca marche" -> PHOTO CARDS (both widths)
   User asked for the four flat step cards to carry photography, reusing the
   /transfert-dargent "Comment ca marche" photo set, and was explicit that the
   BLACK PALETTE STAYS. So this is the v85b recipe transplanted, not a redesign.

   ⚠️ SELECTOR IS DELIBERATELY `.sec.paper .g4`, NOT `.g4`. /reparation has TWO
   .g4 grids: the 8 "Les pannes" cards in .sec.white (which already carry photos
   of their own) and these 4 step cards in .sec.paper. Verified by slicing the
   file between <section> boundaries: .sec.paper contains .bagrid, this .g4, and
   .store - so .sec.paper .g4 resolves to the step band alone.

   ⚠️ THE CARDS CARRY AN INLINE style="padding:26px 24px". Inline beats any
   selector, so the padding override here MUST keep !important.

   ⚠️ :nth-child(4n+k), NOT :nth-child(k) - .pg-reparation .g4 is an mkCarousel
   rail on mobile and its four children are cloned in whole sets. Plain
   nth-child would give every clone card 1's photograph (the v22 trap).

   ⚠️ The DESKTOP rule carries :not([data-mk-clone]); the MOBILE one must not.
   Setting `display:flex` at 0,5,0 out-specifies the v74 clone guard (0,3,0) and
   would refill the desktop grid with clones on the resize path - the exact bug
   proven on .pg-transfert in v85. On mobile the clones SHOULD paint, so the
   guard is correctly absent there. Same two-sided shape as v85b.
   ============================================================================ */

/* ---- shared: photo + scrim + copy, identical values to the transfert cards --- */
.pg-reparation .sec.paper .g4>.icard::before{
  content:"";position:absolute;inset:0;z-index:0;
  background-size:cover;background-position:center;background-repeat:no-repeat}
.pg-reparation .sec.paper .g4>.icard::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(6,7,9,.30) 0%,rgba(6,7,9,.12) 22%,rgba(6,7,9,.55) 48%,rgba(6,7,9,.91) 74%,rgba(6,7,9,.98) 100%)}
.pg-reparation .sec.paper .g4>.icard .step{position:relative;z-index:2;display:block}
/* the big orange 01-04 becomes the site's gold kicker, as on transfert/homepage */
.pg-reparation .sec.paper .g4>.icard .step .n{
  color:#E8B84B!important;font-size:11px!important;font-weight:600!important;
  letter-spacing:1.9px!important;text-transform:uppercase;line-height:1.2!important;
  margin:0 0 7px!important;font-family:inherit!important}
.pg-reparation .sec.paper .g4>.icard .step h4{
  color:#fff!important;font-size:20px!important;line-height:1.1!important;margin:0 0 8px!important}
.pg-reparation .sec.paper .g4>.icard .step p{
  color:rgba(255,255,255,.74)!important;font-size:13.5px!important;line-height:1.5!important;margin:0!important}

/* ---- the photographs: the transfert set on 01-03, and celebrations.jpg on 04.

   v106b: card 04 was repair-sub-5.jpg (a bench macro of tweezers on a board).
   The user replaced it with the celebration shot, and the reasoning is sound:
   04 is "Recuperez" - the customer getting their device back - so the emotional
   beat is RELIEF, not workbench detail. A triumphant photo lands that; a macro
   of a circuit board repeats step 02's subject and ends the row on process
   rather than on the payoff.

   celebrations.jpg was ALREADY on the server (2600x1733, used by the homepage
   hero slides and the sub-banners) - no upload needed. The user's local original
   is 5203x3469, but the Hostinger CDN caps served images at 1600px wide (v82),
   so the larger file would be downscaled to exactly the same delivered pixels.

   Side effect worth knowing: all four cards now come from the same community
   photo family as /transfert-dargent, so the two "Comment ca marche" bands are
   now a matched set rather than three-plus-one.                              */
.pg-reparation .sec.paper .g4>.icard:nth-child(4n+1)::before{background-image:url('/wp-content/uploads/mascot-hero/contact.jpg')}
.pg-reparation .sec.paper .g4>.icard:nth-child(4n+2)::before{background-image:url('/wp-content/uploads/mascot-hero/learn-laptop.jpg')}
.pg-reparation .sec.paper .g4>.icard:nth-child(4n+3)::before{background-image:url('/wp-content/uploads/mascot-hero/kids-community.jpg')}
.pg-reparation .sec.paper .g4>.icard:nth-child(4n+4)::before{background-image:url('/wp-content/uploads/mascot-hero/celebrations.jpg')}

/* ---- MOBILE: no clone guard, clones must paint in the rail ---- */
@media (max-width:840px){
  .pg-reparation .sec.paper .g4>.icard{
    position:relative!important;display:flex!important;flex-direction:column!important;
    justify-content:flex-end!important;aspect-ratio:3/4!important;
    border-radius:26px!important;overflow:hidden!important;padding:20px!important;
    background:#101216!important;border:1px solid rgba(255,255,255,.09)!important;
    box-shadow:0 26px 44px -26px rgba(0,0,0,.9)!important}
  .pg-reparation .sec.paper .g4>.icard>*{flex:0 0 auto!important}
}

/* ---- DESKTOP: clone guard load-bearing (see header note) ---- */
@media (min-width:841px){
  .pg-reparation .sec.paper .g4>.icard:not([data-mk-clone]){
    position:relative!important;display:flex!important;flex-direction:column!important;
    justify-content:flex-end!important;aspect-ratio:3/4!important;
    border-radius:26px!important;overflow:hidden!important;padding:24px!important;
    background:#101216!important;border:1px solid rgba(255,255,255,.09)!important;
    box-shadow:0 26px 44px -26px rgba(0,0,0,.9)!important}
  /* neutralise inherited flex-grow before bottom-aligning (the v15 lesson) */
  .pg-reparation .sec.paper .g4>.icard>*{flex:0 0 auto!important}
}

/* ============================================================================
   v112 - CAFE BUTTON GEOMETRY ON MOBILE (two separate surfaces, one theme)
   Both are LAYOUT-ONLY. The user was explicit: "Keep the colors the same."
   No background, border or text colour is touched in this block - only width,
   flow and padding. Verify that stays true if this is ever edited.

   THE REFERENCE FOR BOTH IS THE HOMEPAGE HERO, measured rather than eyeballed:
     .pg-home .hero .cta-row -> display:grid, grid-template-columns:170px 170px,
     gap:10px, justify-content:center, buttons padding 14px 12px @ 14.5px.
   ============================================================================ */

@media (max-width:840px){

/* ---- A. homepage "Herman & Le Cafe" band: three full-bleed slabs -> short pills
   The three CTAs (.btn-cafe, .btn-cafe-alt, .cafe-fp) were each forced to
   width:390px - the full column - so the band read as three stacked slabs.

   ⚠️ THEY CANNOT GO SIDE BY SIDE AND THAT IS A LABEL PROBLEM, NOT A CSS ONE.
   "Decouvrir Herman & Le Cafe" and "Rejoindre le programme fidelite" measure
   ~250px each at 15px; two of them plus a gap needs ~510px against a 390px
   column. Shrinking type far enough to fit would cost more than the row gains.
   So they become AUTO-WIDTH and centred instead: each pill now hugs its own
   label (~300 / ~300 / ~230px), which is the "shorter" the user asked for and
   makes the band read as three links rather than three walls.

   Centring is free: .cafeT .up is already text-align:center at this width, so
   inline-flex children centre themselves. No flex wrapper is possible here -
   the buttons are siblings of the kicker, headline, paragraph and chips inside
   one .up block, so making that parent a flex container would relayout the copy.
   ---- */
.pg-home .cafeT .btn-cafe,
.pg-home .cafeT .btn-cafe-alt,
.pg-home .cafeT .cafe-fp{
  width:auto!important;
  display:inline-flex!important;
  padding:12px 22px!important;
  font-size:14px!important;
  margin:0 4px 10px!important}


/* ---- B. /cafe hero: stacked -> side by side, matching the homepage hero ----
   ⚠️ THE CAUSE WAS A GLOBAL RULE, NOT A CAFE ONE. mk-mobile.css carries
     @media(max-width:840px){ .mk-page .cta .btn, .mk-page .hero .btn{width:100%} }
   which forces every .mk-page hero button to full width - that is why the two
   café buttons wrapped onto separate lines despite .hero .cta already being
   display:flex with flex-wrap:wrap.

   FIXED BY SCOPING, NOT BY EDITING THAT RULE. It is load-bearing for
   /reparation, /transfert-dargent, /paiement-de-facture, /service-dimpression,
   /workspace and /a-propos, whose hero CTAs are deliberately full-width stacked
   pills. Only .pg-cafe opts out.

   The 350px cap reproduces the homepage's 170+10+170 exactly, so the two heroes
   now share one geometry instead of merely looking similar.
   Labels fit: "Voir le menu →" and "Notre histoire" are both under 120px at
   14.5px, comfortably inside a 170px column. ---- */
.pg-cafe .hero .cta{
  display:grid!important;
  grid-template-columns:1fr 1fr!important;
  gap:10px!important;
  justify-content:center!important;
  max-width:350px!important;
  margin-left:auto!important;margin-right:auto!important}
.pg-cafe .hero .cta .btn{
  width:auto!important;
  padding:14px 12px!important;
  font-size:14.5px!important;
  justify-content:center!important;
  text-align:center}

/* ⚠️ THE STACKING MARGIN MUST BE KILLED OR THE GRID IS COSMETIC ONLY.
   mk-mobile.css also carries, earlier in this same 840px query:
     .mk-page .hero .btn + .btn{margin-top:10px!important}
   written when every hero CTA was a stacked full-width pill. Inside a grid that
   margin does TWO things, and the second one is what made this confusing:
     1. it pushes the second button 10px down, so the pair is not aligned;
     2. it EATS 10px of the stretched grid cell, so the ghost measured 48px
        against the gold's 58px - which reads as "the gold button is taller"
        and sends you hunting a padding/pseudo-element difference that does not
        exist. Both buttons have byte-identical padding, border and font rules.
   The override needs the SAME `+ .btn` combinator to out-specify it: the plain
   `.pg-cafe .hero .cta .btn` selector above is (0,4,0) and merely TIES with
   `.mk-page .hero .btn + .btn`, so it does not win on a longhand margin-top. */
.pg-cafe .hero .cta .btn + .btn{margin:0!important}

}