/* ===========================================================================
   mk-idhero.css  -  v115 / widened v124  -  the premium Mascot treatment for
   the print sub-pages. Built for /photo-identite, now worn by all eight.

   Linked from ALL EIGHT imp-*.html since v124, after mk-mobile.css.
   (It was imp-photo-identite.html ONLY from v115 to v123 - see the v124 note
   at the end of this header before you add anything.)

   ---------------------------------------------------------------------------
   WHY EVERY SELECTOR IN THIS FILE STARTS .pg-imppro
   ---------------------------------------------------------------------------
   ALL EIGHT imp-*.html sub-pages ship the SAME body class, `pg-imp`:

     imp-calendriers / imp-cartes-de-visite / imp-cartes-invitations /
     imp-design-graphique / imp-flyers-affiches / imp-photo-identite /
     imp-photocopie-documents / imp-tirages-photo

   They also share a near-identical section skeleton (.feat/.fcard, .uses, .g3
   of .step, a .store card, .rel). So a rule written against `.pg-imp .g3` -
   or against any of those generic class names - would silently restyle SEVEN
   pages nobody asked about, and the damage would not show up on the page being
   worked on. That is the v6/v7 lesson ("generic class names mean different
   things on different pages, so never blanket-style them") with a sharper edge,
   because here the pages are same-shaped enough that it would look deliberate.

   So imp-photo-identite.html gets a SECOND body class, `pg-idphoto`, and every
   rule below is scoped to it. `pg-imp` is left on the element untouched so the
   page keeps everything the shared sheet already gives it.

   To promote this treatment to another imp-* page later: add pg-idphoto's
   sibling class to that page and widen these selectors with :is() - the same
   move mk-mobile.css made when .mwhy went from .pg-cat to :is(.pg-cat,.pg-acc).

   ---------------------------------------------------------------------------
   v124 - THAT PROMOTION HAPPENED, AND FOR ALL SEVEN AT ONCE
   ---------------------------------------------------------------------------
   The user asked for the remaining seven print sub-pages to become this page.
   Rather than grow an :is() list to eight entries and then have to keep it in
   step forever, the generic treatment moved onto ONE SHARED HOOK CLASS:

       pg-imppro   -> sections 1-5, 7, 8 below. On ALL EIGHT pages.
       pg-idphoto  -> the v122/v123 GALERIE blocks at the foot of this file,
                      and nothing else. On imp-photo-identite.html only.

   So every imp-* page now carries `mk-page pg-imp pg-imppro pg-<slug>`, and
   photo-identite additionally keeps `pg-idphoto` so its galerie band and its
   featured-print rail stay exactly where they were. NOTHING about how
   /photo-identite renders changed in v124 - it was verified by measurement
   after the rename, not assumed.

   `pg-imp` is still left on every element untouched, and `pg-<slug>` exists so
   that genuinely per-page work has somewhere to go that is not `pg-imp` - the
   trap this file was created to avoid in the first place.

   THIS FILE IS NOW LOADED BY ALL EIGHT imp-*.html, NOT ONE. Read that sentence
   before adding a rule here: an unscoped or `.pg-imp`-scoped selector no longer
   costs one page, it costs eight.
   =========================================================================== */

.pg-imppro{
  --idInk:#050505;
  --idCard:#111111;
  --idLine:rgba(255,255,255,.08);
  --idGold:#D8A03D;
  --idDim:#A8A8A8;
  --idBlue:#4A7DFF;

  /* v124 - PER-PAGE ACCENT. The eight imp-* pages do not share one accent:
     photo-identite and calendriers/cartes-de-visite are blue, tirages /
     flyers / invitations orange, photocopie green, design graphique purple.
     Each page overrides these two inline on <body>; the values below are
     photo-identite's, so that page needs no inline override at all.
     ⚠️ THE DEFAULT IS LOAD-BEARING: rgba(var(--idAccRgb),.20) with an
     undefined variable is an INVALID declaration and drops silently, which
     would leave the icon chips with no fill at all. */
  --idAccRgb:74,125,255;
  --idAccSoft:#9FBBFF;

  background:var(--idInk)!important;
}

/* The page alternated .sec.white (#FDFBF6) and .sec.paper, which is what made
   it read as a different product to /transfert-dargent. One canvas, like the
   other three service pages got in v103-v105. */
.pg-imppro .sec.white,
.pg-imppro .sec.paper{background:transparent!important}

.pg-imppro .shead h2,
.pg-imppro h1,
.pg-imppro h3,
.pg-imppro h4{color:#fff}
.pg-imppro .sub,
.pg-imppro .shead p,
.pg-imppro p{color:var(--idDim)}


/* ===========================================================================
   1. THE HERO  -  centred column, carousel below the headline
   ---------------------------------------------------------------------------
   Same move as v95/v103: the .hgrid children are ALREADY in the order the
   category heroes use, so collapsing the two-column grid to one centred column
   produces the category structure with no markup reordering. The only markup
   change is that the old single <img> card became a .mch-shot carousel.
   =========================================================================== */
.pg-imppro .hero .hgrid{
  display:block!important;
  max-width:760px;margin:0 auto;text-align:center;
}
/* v124 - the bar itself has to be centred, not its stripes. The inline <style>
   on every imp-*.html declares `.flag{display:flex;width:64px}`, so the
   justify-content below only ever centred the three <i> INSIDE a 64px box that
   was still parked at the left edge of the 760px column. Latent since v115 on
   /photo-identite; it only became obvious once seven more pages wore it. */
.pg-imppro .hero .flag{justify-content:center;display:flex;margin-left:auto;margin-right:auto}
.pg-imppro .hero .crumb,
.pg-imppro .hero .kick,
.pg-imppro .hero h1,
.pg-imppro .hero .sub{text-align:center}
.pg-imppro .hero .sub{margin-left:auto;margin-right:auto;max-width:620px}
.pg-imppro .hero .cta{justify-content:center;display:flex;flex-wrap:wrap;gap:12px}


/* ---------------------------------------------------------------------------
   2. THE CAROUSEL
   ---------------------------------------------------------------------------
   BEHAVIOUR IS FREE: mk-hero.js is loaded as-is and its first IIFE queries
   `.mch-shot.is-multi` / `.mch-slide` / `.mch-dots` with NO body-class scope,
   so it drives this hero without a line of new JavaScript. It also bails
   cleanly when those elements are absent, which is why loading it on this page
   costs the other imp-* pages nothing. (v62's payoff, a third time: a data
   change, not a code change.)

   STYLING IS NOT FREE: every .mch-* rule in mk-mobile.css is scoped .pg-cat,
   so the look has to be redeclared here. It is deliberately NOT a copy of the
   category rules - those use object-fit:contain + drop-shadow because they
   render transparent PNG cut-outs on the page background. These four frames are
   two photographs and two flat illustrations that each carry their own opaque
   background, so `contain` would letterbox them and a drop-shadow would have
   nothing to hug. A framed card with object-fit:cover is the honest treatment,
   and it also preserves the rounded photo card this page already had.

   The dot language IS copied verbatim (22x4 pill, scaleX transition, gold
   gradient when active) so the control reads as the same site.

   NO WIDTH GATE - a hero carousel must run at every width. That is the whole
   reason mk-hero.js was extracted from mk-mobile.js in the first place; gating
   its CSS here would reintroduce the bug from the other side.
   --------------------------------------------------------------------------- */
.pg-imppro .hero .mch-shot{
  position:relative;
  width:min(88vw,420px);
  margin:34px auto 0;
  z-index:1;
}
.pg-imppro .hero .mch-stack{
  position:relative;
  width:100%;
  aspect-ratio:4/5;
  border-radius:30px;
  overflow:hidden;
  background:var(--idCard);
  border:1px solid var(--idLine);
  box-shadow:0 34px 60px -30px rgba(0,0,0,.95),0 6px 16px rgba(0,0,0,.5);
}
.pg-imppro .hero .mch-slide{
  position:absolute;inset:0;
  width:100%;height:100%;
  object-fit:cover;object-position:center;
  opacity:0;transform:scale(1.015);
  transition:opacity .85s cubic-bezier(.4,0,.2,1),transform .85s cubic-bezier(.4,0,.2,1);
}
.pg-imppro .hero .mch-slide.on{opacity:1;transform:scale(1)}

/* FAIL-SAFE, the same guarantee mk-hero.js's own CSS makes: if the script never
   runs (blocked, throws, cached out), data-mch-init is never set and frame 1 is
   shown statically rather than the hero going blank. */
.pg-imppro .hero .mch-shot:not([data-mch-init]) .mch-slide:first-child{opacity:1;transform:none}

/* ambient gold glow behind the card, matching the category hero */
.pg-imppro .hero .mch-glow{
  position:absolute;inset:-9%;z-index:0;pointer-events:none;
  background:radial-gradient(circle at 50% 52%,rgba(216,160,61,.30),rgba(216,160,61,.10) 46%,transparent 72%);
  filter:blur(12px);
}

.pg-imppro .hero .mch-dots{
  position:relative;z-index:3;
  display:flex;justify-content:center;gap:7px;margin-top:18px;
}
.pg-imppro .hero .mch-dots button{
  position:relative;width:22px;height:14px;padding:0;border:0;background:none;cursor:pointer;
}
.pg-imppro .hero .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-imppro .hero .mch-dots button.on::after{
  background:linear-gradient(90deg,#E8B84B,#D8A03D);transform:scaleX(1);
}

@media (prefers-reduced-motion:reduce){
  .pg-imppro .hero .mch-slide{transition:none!important;transform:none!important}
}


/* ===========================================================================
   3. "Ce que nous proposons" - the .fcard grid as dark glass
   =========================================================================== */
.pg-imppro .feat{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:18px}
.pg-imppro .fcard{
  background:rgba(255,255,255,.045);
  border:1px solid var(--idLine);
  border-radius:24px;
  padding:24px 22px 26px;
  transition:background .2s ease,border-color .2s ease;
}
.pg-imppro .fcard:hover{background:rgba(255,255,255,.07);border-color:rgba(255,255,255,.16)}
.pg-imppro .fcard .fi{
  width:46px;height:46px;border-radius:14px;
  display:grid;place-items:center;margin-bottom:15px;
  background:rgba(var(--idAccRgb),.20);
  border:1px solid rgba(var(--idAccRgb),.42);
  color:var(--idAccSoft);
}
.pg-imppro .fcard h4{margin:0 0 7px;font-size:18px;letter-spacing:-.02em}
.pg-imppro .fcard p{margin:0;font-size:13.5px;line-height:1.55;color:var(--idDim)}


/* ===========================================================================
   4. "Ideal pour" - the .uses chips
   =========================================================================== */
.pg-imppro .uses{display:flex;flex-wrap:wrap;gap:10px;justify-content:center}
.pg-imppro .uses span{
  display:inline-flex;align-items:center;
  padding:11px 20px;border-radius:100px;
  background:rgba(255,255,255,.05);
  border:1px solid var(--idLine);
  color:#EDEDED;font-size:14px;font-weight:500;
}


/* ===========================================================================
   5. "Comment ca marche"  -  the /transfert-dargent photo-card recipe
   ---------------------------------------------------------------------------
   Ported from the .pg-transfert block in mk-mobile.css (v103), INCLUDING the
   same three photographs, which is what was asked for.

   TWO DIFFERENCES FROM THE SOURCE, both deliberate:

   1. The source block lives inside @media (max-width:840px) - on /transfert the
      desktop steps are a different treatment. Here it is UNGATED, because this
      page has no competing desktop rule for .g3 and the photo cards are the
      design at both widths. Gating it would leave desktop with the bare .step
      boxes, which is the v27/v57/v68 markup-leak bug.

   2. The markup was changed to match the source rather than the CSS bent to fit
      this page: the steps here were bare `.step` children of .g3, whereas
      /transfert nests them `.scard > .step`. Matching the markup means this is
      the same recipe rather than a lookalike, and .step stays the element
      lifted above the scrim exactly as the source comment describes.

   nth-child(3n+k) not nth-child(k), per v22/v90: if this grid is ever handed to
   mkCarousel it clones whole sets of three and plain nth-child would give every
   clone card 1's photograph. With three children 3n+k reduces to k today.
   =========================================================================== */
.pg-imppro .sec.comment .g3{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:20px;
}
.pg-imppro .sec.comment .g3>.scard{
  position:relative;display:flex;flex-direction:column;justify-content:flex-end;
  aspect-ratio:3/4;border-radius:26px;overflow:hidden;
  background:var(--idCard);border:1px solid var(--idLine);
  box-shadow:0 26px 44px -26px rgba(0,0,0,.9);
  padding:0;
}
.pg-imppro .sec.comment .g3>.scard::before{
  content:"";position:absolute;inset:0;z-index:0;
  background-image:var(--scardImg);
  background-size:cover;background-position:var(--scardPos,center);background-repeat:no-repeat;
}
.pg-imppro .sec.comment .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%);
}
/* .step is the element lifted above the scrim - see the source note */
.pg-imppro .sec.comment .g3>.scard>.step{
  position:relative;z-index:2;padding:0 22px 24px;background:none;border:0;
}
.pg-imppro .sec.comment .g3>.scard>.step .n{
  display:inline-block;color:var(--idGold);
  font-size:11px;font-weight:600;letter-spacing:1.9px;margin:0 0 8px;
}
.pg-imppro .sec.comment .g3>.scard>.step h4{
  margin:0 0 6px;font-size:20px;color:#fff;letter-spacing:-.02em;line-height:1.15;
}
.pg-imppro .sec.comment .g3>.scard>.step p{
  margin:0;font-size:13.5px;line-height:1.55;color:rgba(255,255,255,.78);
}

/* v125b - THE THREE PHOTOGRAPHS ARE NO LONGER FIXED HERE.
   v115 hard-coded contact/learn-laptop/kids-community by nth-child, which was
   right while this file dressed ONE page. Across eight pages that would print
   the same three photographs eight times, and the whole point of the clone is
   that the pages share a DESIGN, not a set of pictures.
   So the image moves to an inline --scardImg on each .scard, exactly the
   contract .mexp already uses for --mexpA/--mexpB: one block of CSS, eight
   surfaces, twenty-four photographs. --scardPos is an optional per-card crop
   nudge, needed because a 16:9 source in a 3/4 card is a deep centre crop.
   /photo-identite passes its original three inline, so it is unchanged. */


/* ===========================================================================
   6. THE EXPERIENCE BAND  -  MOVED OUT OF THIS FILE (v116).
   ---------------------------------------------------------------------------
   This page-specific band was originally built here as .idexp. When the same
   section was then asked for on /transfert-dargent, /service-dimpression and
   /paiement-de-facture, keeping a page-specific copy would have left two
   near-identical implementations to maintain in step - the exact drift the
   mk-loc.css note warns about.

   So the recipe was generalised into mk-why.css under the reference own class
   names (.mexp / .mexp-in / .mexp-k / .mexp-cta), and THIS PAGE MARKUP WAS
   CONVERTED to use it. All four surfaces now share one block; each supplies
   its own pair of photographs via the inline --mexpA / --mexpB variables.

   /photo-identite keeps celebrations.jpg <-> hero-kids.jpg, unchanged from
   what shipped in v115. Nothing about how this page looks changed.
   =========================================================================== */


/* ===========================================================================
   7. "Autres services" - the .rel link row on dark
   =========================================================================== */
.pg-imppro .rel{display:flex;flex-wrap:wrap;gap:10px;justify-content:center}
.pg-imppro .rel a{
  display:inline-flex;align-items:center;
  padding:11px 20px;border-radius:100px;
  background:rgba(255,255,255,.05);
  border:1px solid var(--idLine);
  color:#EDEDED;font-size:14px;text-decoration:none;
  transition:background .2s ease,border-color .2s ease;
}
.pg-imppro .rel a:hover{background:rgba(255,255,255,.09);border-color:rgba(255,255,255,.18)}


/* ===========================================================================
   8. PHONE
   =========================================================================== */
@media (max-width:640px){
  .pg-imppro .hero .mch-shot{width:min(84vw,330px);margin-top:26px}
  .pg-imppro .hero .mch-stack{border-radius:24px}
  .pg-imppro .feat{grid-template-columns:1fr;gap:14px}
  /* .sec.comment .g3 rail lives in its own <=840px block below (v143). */
  /* the experience band's phone sizing moved to mk-why.css with the rest of
     .mexp in v116 - these two rules were dead once the markup converted. */
}

/* ===========================================================================
   v143 - COMMENT ("Comment ca marche") STEPS -> compact swipe carousel.
   The eight print pages showed three full-width 3/4 photo cards STACKED - a
   whole screen of oversized kids photos. This makes them the same 78%-width
   scroll-snap rail /transfert-dargent and /reparation use, so one card shows
   with a peek of the next. mk-hero.js calls mkCarousel on it (dots + loop);
   mk-mobile.css line 301 shows .mk-dots on mobile.
   Breakpoint is <=840px to match mk-hero.js's init guard: above it the desktop
   grid stands and mkCarousel never runs.
   =========================================================================== */
@media (max-width:840px){
  .pg-imppro .sec.comment .g3{
    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:8px!important}
  .pg-imppro .sec.comment .g3::-webkit-scrollbar{display:none;height:0;width:0}
  .pg-imppro .sec.comment .g3>.scard{
    flex:0 0 78%!important;width:78%!important;max-width:300px;min-width:0;
    scroll-snap-align:center;opacity:1!important;transform:none!important}
}
/* clones only exist after a mobile->desktop resize; keep them out of the grid */
@media (min-width:841px){
  .pg-imppro .sec.comment .g3>.scard[data-mk-clone]{display:none!important}
}


/* ===== v122 - the galerie band, after "Autres services" =====================
   The homepage's gallery section, brought onto /photo-identite: same six
   prints, same headline ("L'art qui vous ressemble."), same .art/.frame/.mat
   cards.

   ⚠️ IT IS THE SERVICE-PAGE SHELL (.shead + .hgal), NOT THE HOMEPAGE ONE, AND
   THAT IS DELIBERATE. accueil.html wraps its gallery in `.svc-banner` - a
   full-bleed promo block whose ENTIRE base CSS lives in accueil.html's own
   inline <style>, not in any shared sheet. Two things follow, both checked:
     * dropped in here it renders essentially unstyled, because this page loads
       mk-mobile.css (which only carries .svc-banner OVERRIDES) and never sees
       those base rules;
     * it is full-bleed with `margin-top: calc(clamp(56px,8vw,104px) * -1)`,
       tuned to butt against the homepage section above it. After a normal
       `.sec` here that negative margin pulls it up INTO the previous section.
   Porting ~60 rules to chase it would duplicate a homepage-coupled component.
   `.hgal` is the same gallery in the idiom this page already speaks - and
   /service-dimpression, this page's own parent, uses exactly it.

   ZERO NEW LAYOUT CSS WAS NEEDED: imp-photo-identite.html's inline <style>
   already ships the whole `.hgal` + `.art` component (3-col, gold frame, white
   mat, 4/5 crop, 2-col under 920px). Only the COLOURS needed work, because
   those inline rules are light-mode (.aartist #6a6f67, .aprice #3a3f38) and
   measured live THIS PAGE IS DARK - every `.sec white` / `.sec paper` computes
   to transparent over a dark body, so the price would have been near-invisible
   on it. Mirrors mk-mobile.css's `.pg-impression .hgal` block exactly; the gold
   frames are kept and only the surrounding text is recoloured.

   SCOPED `.pg-imppro`, NEVER `.pg-imp` - all EIGHT imp-*.html share pg-imp,
   and none of the other seven has this markup. mk-idhero.css is loaded by this
   page and no other, but the scope is written explicitly anyway. */
.pg-imppro .gal-cta{text-align:center;margin-bottom:6px}
.pg-imppro .hgal .aname{color:#fff!important}
.pg-imppro .hgal .aartist{color:rgba(255,255,255,.5)!important}
.pg-imppro .hgal .aprice{color:#E8B84B!important}
.pg-imppro .hgal .abm{color:rgba(255,255,255,.35)!important}
.pg-imppro .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}


/* ===== v123 - the LARGE featured print above the galerie grid ===============
   The user's follow-up: "the large print of the Home page Gallery section is
   missing from this page." That large print is the `.mk-artfeat` rail that
   mk-gallery.js clones out of the first four cards and inserts ABOVE the grid,
   with `.mk-allprints` ("Tous les tirages") labelling the grid underneath.

   THIS IS THE DOCUMENTED EXTENSION PATH, NOT A NEW MECHANISM. mk-mobile.css's
   v96 note says the desktop guard "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". /service-dimpression (v95b) and /mascot-galerie
   (v96) were each enabled exactly this way. So, three changes, same as theirs:
     1. mk-gallery.js  - `.pg-imppro .hgal` added to the grid selector chain,
                         which is what makes the rail get BUILT here at all.
     2. mk-mobile.css  - `:not(.pg-imppro)` added to the min-width:841px
                         visibility guard. Adding a :not() can only narrow that
                         rule, so it cannot regress a page I am not looking at.
     3. this block     - the geometry, mirroring `.pg-impression` verbatim so
                         the two galerie sections read identically.
   The page also had to start loading mk-carousel.js and mk-gallery.js, in that
   order - mk-gallery.js bails silently if window.mkCarousel is absent.

   MOBILE NEEDS NOTHING: below 841px the shared clamp recipe already sizes
   `.mk-artfeat>.mk-af` and derives the centring padding (mk-mobile.css ~797),
   and `.mk-dots` is only display:none above the breakpoint.

   ⚠️ THE TWO CARVE-OUTS BELOW ARE NOT OPTIONAL - both are load-bearing and both
   are copied from the /impression block for the same stated reasons:
     * the v74 clone guard `[data-mk-clone]{display:none!important}` would hide
       mkCarousel's loop clones and silently reduce this to a bounded 4-card
       strip. Doubling the attribute selector clears it outright.
     * `.mk-dots` is globally display:none (mk-mobile.css:227); each surface
       opts its own rail back in. */
@media (min-width:841px){
  .pg-imppro .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-imppro .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-imppro .mk-allprints{margin:48px 0 26px}
  .pg-imppro .mk-artfeat~.mk-dots{display:flex;justify-content:center;gap:7px;margin:20px 0 0}
  .pg-imppro .mk-artfeat>[data-mk-clone][data-mk-clone]{display:block!important}
}


/* ===========================================================================
   v131 - THE "SIGNATURE" MOTION TREATMENT, PORTED TO THE .mch-shot HERO
   ---------------------------------------------------------------------------
   /service-dimpression got this in v129 (mk-heroshot.css, on .rs-shot). The
   user asked for the same carousel on /photo-identite and /tirages-photo.
   Those two run the OTHER hero component - .mch-shot, driven by mk-hero.js's
   first IIFE - so the three gestures are re-expressed here rather than the
   pages being switched to .rs-shot, which would have meant loading
   mk-heroshot.css and inheriting its cutout geometry on a 4/5 photo card.

   OPT-IN VIA data-mch-fx="signature" ON THE SHOT, exactly as v129 did it, and
   NOT via a body class: mk-idhero.css is loaded by all EIGHT imp-* pages, so a
   .pg-imppro scope would have switched the motion on for all eight. The
   attribute means the other six adopt it with one word of markup, and this
   whole block is inert on a page that has not asked for it.

   ---------------------------------------------------------------------------
   TWO GESTURES DIFFER FROM v129, BECAUSE THESE SLIDES ARE PHOTOGRAPHS
   ---------------------------------------------------------------------------
   1. NO ALPHA MASK ON THE SWEEP. v129 masks the highlight with
      mask-image:var(--m) - the active frame's own URL - so the reflection
      rides the silhouette of the Mimaki. That works only because those frames
      are transparent WebP. These are opaque JPEGs: masking with one resolves
      to a plain rectangle and buys nothing. Here the sweep is clipped by the
      CARD instead - .mch-stack is already overflow:hidden;border-radius:30px -
      so it reads as a gloss travelling across the print, which is the right
      gesture for a photograph.
   2. THE ENTRANCE IS SCALE-ONLY, NEVER translateY. The slides are
      object-fit:cover and fill the card edge to edge; translating one by 18px
      the way v129 does would expose the card's own background along one edge
      for the length of the transition. Scaling ABOVE 1 and settling to 1 can
      never uncover an edge, and gives the same "arrives" feeling.

   The float itself is on .mch-stack for the v129 reason, restated because it
   is the trap in this component: an ANIMATION ranks above normal declarations
   but BELOW !important ones, and .mch-slide.on's transform is pinned below.
   .mch-stack carries no transform of its own, so animating it is unobstructed.
   =========================================================================== */

/* 1 - the card breathes, and the gold glow breathes with it on the same clock */
[data-mch-fx="signature"] .mch-stack{
  --mchLift:-11px;
  animation:mchBreathe 8s ease-in-out infinite}
@keyframes mchBreathe{0%,100%{transform:translateY(0)}50%{transform:translateY(var(--mchLift,-11px))}}

[data-mch-fx="signature"] .mch-glow{animation:mchHalo 8s ease-in-out infinite}
@keyframes mchHalo{0%,100%{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}

/* 2 - each frame settles into place instead of merely appearing. !important at
   (0,2,0)+attr: the base rule is .pg-imppro .hero .mch-slide at (0,3,0) and
   would otherwise win on specificity whatever the source order. */
[data-mch-fx="signature"] .mch-stack .mch-slide{
  transform:scale(1.055)!important;
  transition:opacity .6s cubic-bezier(.4,0,.2,1),
             transform 1.15s cubic-bezier(.16,1,.3,1)!important}
[data-mch-fx="signature"] .mch-stack .mch-slide.on{transform:scale(1)!important}

/* 3 - the specular sweep. Delayed 1.2s so it fires AFTER the entrance has
   settled rather than during it; 6.5s so it stays an accent, not a strobe.
   z-index:2 puts it over the slides (z-auto, inside the stack) and under the
   dots (z-index:3, a sibling of .mch-stack). */
[data-mch-fx="signature"] .mch-fx{
  position:absolute;inset:0;z-index:2;pointer-events:none;
  background:linear-gradient(108deg,transparent 42%,rgba(255,255,255,.28) 50%,transparent 58%);
  background-size:260% 100%;background-repeat:no-repeat;
  animation:mchSweep 6.5s cubic-bezier(.5,0,.2,1) infinite 1.2s}
@keyframes mchSweep{0%{background-position:170% 0}55%,100%{background-position:-70% 0}}

/* Reduced motion: every gesture off. mk-hero.js already stops the rotation
   timer, so the hero settles to a clean static frame 1. This block has to come
   AFTER the base sheet's own prefers-reduced-motion rule and carry !important
   of its own, or the !important entrance above would outlive it. */
@media (prefers-reduced-motion:reduce){
  [data-mch-fx="signature"] .mch-stack,
  [data-mch-fx="signature"] .mch-glow,
  [data-mch-fx="signature"] .mch-fx{animation:none!important;transform:none!important}
  [data-mch-fx="signature"] .mch-fx{opacity:0}
  [data-mch-fx="signature"] .mch-stack .mch-slide,
  [data-mch-fx="signature"] .mch-stack .mch-slide.on{
    transform:none!important;transition:opacity .2s linear!important}
}

/* Phone: the card is 330px wide down here, so the float is scaled back to stay
   a suggestion rather than a lurch. Custom property read from inside the
   keyframe rather than a second @keyframes block of the same name. */
@media (max-width:840px){
  [data-mch-fx="signature"] .mch-stack{--mchLift:-7px}
}


/* ===== v146 - print sub-pages: WhatsApp + Nous trouver side-by-side under the
   hero, matching the homepage hero .cta-row. On mobile the two buttons wrapped
   (the long WhatsApp label pushed the second pill to its own line); a 2-col grid
   with full-width equal pills fixes it. Scoped to .pg-imppro (all 8 imp pages). */
@media (max-width:840px){
  .pg-imppro .hero .cta{
    display:grid!important;grid-template-columns:1fr 1fr;gap:10px;
    width:100%;max-width:420px;margin-left:auto;margin-right:auto}
  .pg-imppro .hero .cta .btn{
    width:100%;margin:0;justify-content:center;
    padding-left:12px;padding-right:12px;gap:7px}
}
