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

/* ---------- NAV ---------- */
header{
  position:fixed; top:0; left:0; right:0; z-index:100;
  display:flex; align-items:center; justify-content:space-between;
  padding:32px 48px;
  mix-blend-mode:difference;
  transition:background-color .35s ease, backdrop-filter .35s ease, padding .35s ease;
}
header.scrolled{
  background-color:rgba(254,255,249,0.72);
  backdrop-filter:blur(14px);
  -webkit-backdrop-filter:blur(14px);
  mix-blend-mode:normal;
  border-bottom:1px solid rgba(25,25,25,0.06);
}
header svg{height:45px; width:auto; fill:var(--porcelain);}
header.scrolled svg{fill:var(--carbon);}
/* Homepage only: keep the logo a plain, fixed white over the photo hero,
   before scrolling. Once the white/frosted scrolled navbar appears, it
   still switches to dark via header.scrolled svg above, same as every
   other page — only the un-scrolled state gets the homepage-specific
   treatment here.
   Other pages keep the existing behavior untouched: header's own
   mix-blend-mode:difference makes the logo/nav/lang-switch auto-invert
   against whatever's behind the transparent header.
   A child element can't opt out of an ancestor's mix-blend-mode with its
   own CSS — the parent+children are composited as one group and blended
   against the backdrop as a unit — so the only way to exempt the logo is
   to remove the blend mode from the shared header ancestor itself (below)
   and re-apply it directly to just the two elements that still need the
   adaptive contrast (.nav-lang-wrap, .mobile-nav-toggle), both of which
   are logo siblings, not ancestors, so this doesn't touch the logo at all.
   body.home is the same homepage-scoping class already used elsewhere in
   this file (e.g. the scroll fade-in section). */
body.home header{mix-blend-mode:normal;}
body.home .nav-lang-wrap,
body.home .mobile-nav-toggle{mix-blend-mode:difference;}
/* .nav-lang-wrap/.mobile-nav-toggle's own mix-blend-mode above is set
   independently of header's — resetting header.scrolled back to "normal"
   does nothing to these two, since each element's blend mode only governs
   how THAT element (and its own descendants) blends against its backdrop.
   Without this, the nav links inside .nav-lang-wrap keep auto-inverting
   via difference even once scrolled, despite the header itself correctly
   computing "normal" at that point. Only needed once scrolled — the
   un-scrolled homepage state still wants the difference blend above, to
   auto-invert against the full-bleed hero photo before any scrolling. */
body.home header.scrolled .nav-lang-wrap,
body.home header.scrolled .mobile-nav-toggle{mix-blend-mode:normal;}
nav{display:flex; gap:36px;}
nav ul{
  display:flex; gap:36px;
  list-style:none; margin:0; padding:0;
}
nav ul li{
  list-style:none; margin:0; padding:0;
}
nav a{
  font-size:12.5px; letter-spacing:.12em; text-transform:uppercase;
  color:var(--porcelain); font-weight:500;
  position:relative; padding-bottom:2px;
}
nav a.current{opacity:1; color:var(--ash);}
nav a:not(.current){opacity:.7; transition:opacity .3s ease;}
nav a:not(.current):hover{opacity:1;}
header.scrolled nav a{color:var(--carbon);}
header.scrolled nav a.current{color:var(--onyx);}

/* Wraps <nav> + the "FR / EN" toggle so the toggle sits beside Contact
   (the nav menu's last item) without joining the menu's own 36px item
   gap — .lang-switch's structural rule lives near .footer-col (~line 353);
   this tracks header's own light/dark scroll-state color swap (nav a
   above), and matches nav a's font-size/letter-spacing/weight so the
   toggle reads as part of the same nav typography rather than a visibly
   smaller label next to it. Needs no "a" override since the toggle's link
   is a sibling of <nav>, not a descendant of it — nav a's descendant
   selector never reaches it. */
.nav-lang-wrap{display:flex; align-items:center; gap:24px;}
.nav-lang-wrap .lang-switch{
  color:var(--porcelain);
  font-size:12.5px; letter-spacing:.12em; font-weight:500;
}
header.scrolled .nav-lang-wrap .lang-switch{color:var(--carbon);}

.mobile-nav-toggle{
  display:none;
  flex-direction:column; justify-content:center; gap:5px;
  width:26px; height:20px; background:none; border:none; padding:0; cursor:pointer;
}
.mobile-nav-toggle span{
  display:block; width:100%; height:1px; background-color:var(--porcelain); transition:background-color .3s ease;
}
header.scrolled .mobile-nav-toggle span{background-color:var(--carbon);}

.mobile-nav-panel{
  display:none; position:fixed; inset:0; z-index:200;
  background-color:var(--porcelain);
  flex-direction:column; align-items:flex-start; justify-content:center;
  padding:32px 24px;
}
.mobile-nav-panel.active{display:flex;}
.mobile-nav-logo{position:absolute; top:24px; left:24px;}
.mobile-nav-logo svg{height:30px; width:auto; fill:var(--carbon);}
.mobile-nav-close{
  position:absolute; top:24px; right:24px;
  background:none; border:none; cursor:pointer; padding:0;
  font-family:var(--sans); font-size:22px; color:var(--carbon); line-height:1;
}
.mobile-nav-menu{width:100%;}
.mobile-nav-menu ul{list-style:none; margin:0; padding:0; counter-reset:mobilenav;}
.mobile-nav-menu li{
  list-style:none; margin:0; padding:20px 0;
  border-bottom:1px solid var(--cloud);
  counter-increment:mobilenav;
  opacity:0; transform:translateY(14px);
  transition:opacity .4s ease, transform .4s ease;
}
.mobile-nav-menu li:first-child{padding-top:0;}
.mobile-nav-menu li:last-child{border-bottom:none;}
.mobile-nav-panel.nav-revealed .mobile-nav-menu li{opacity:1; transform:translateY(0);}
.mobile-nav-menu a{
  font-family:var(--sans); font-size:24px; letter-spacing:.04em; text-transform:uppercase;
  color:var(--carbon); font-weight:500; display:inline-block;
}
.mobile-nav-menu a::before{
  content:"[" counter(mobilenav, decimal-leading-zero) "] ";
  font-family:'Courier New', monospace; font-size:13px; letter-spacing:.02em; color:var(--ash);
}
.mobile-nav-menu a.current{opacity:1;}
.mobile-nav-menu a:not(.current){opacity:.55;}

.mobile-nav-footer{
  position:absolute; bottom:32px; left:24px; right:24px;
  display:flex; flex-direction:column; gap:12px;
}
.mobile-nav-footer a{font-family:var(--sans); font-size:13px; color:var(--ash); transition:color .25s ease;}
.mobile-nav-footer a:hover{color:var(--carbon);}
.mobile-nav-footer-bottom-row{display:flex; align-items:center; justify-content:space-between; gap:16px;}
.mobile-nav-footer-socials{display:flex; gap:20px;}
/* .lang-switch structure defined near .footer-col (main.css ~line 336);
   sized up and darkened relative to that base (and relative to the
   socials/email links beside it, which stay --ash) so it reads as more
   prominent here rather than blending into the muted secondary links —
   also beats .mobile-nav-footer a's descendant-selector reach into the
   toggle's inner link, same reasoning as the footer's own former override. */
.mobile-nav-footer-bottom-row .lang-switch{color:var(--carbon); font-size:14px;}
.mobile-nav-footer-bottom-row .lang-switch a{display:inline; font-size:inherit; color:inherit;}

/* ---------- HERO ---------- */
.hero{
  position:relative;
  height:100vh; min-height:680px;
  display:flex; flex-direction:column; justify-content:center;
  padding:56px 48px;
  overflow:hidden;
}
.hero-art{
  position:absolute; inset:0; z-index:0; overflow:hidden;
}
.hero-art img{
  width:100% !important;
  max-width:none !important;
  height:100vh !important;
  height:100dvh !important;
  object-fit:cover !important;
  object-position:50% 60% !important;
  display:block;
}
.hero-overlay{
  position:absolute; inset:0; z-index:0; pointer-events:none;
  background:linear-gradient(180deg, rgba(0,0,0,0.45) 0%, rgba(0,0,0,0) 25%, rgba(0,0,0,0) 55%, rgba(0,0,0,0.6) 100%);
}
.hero-content{
  position:relative; z-index:1;
  display:flex; justify-content:center; align-items:center;
  gap:64px;
}
/* Centered in the hero via normal flex flow (.hero's justify-content:
   center + this), not position:fixed/absolute — it needs to scroll away
   with the rest of the hero like any other in-flow content, not stay
   pinned to the screen once the visitor scrolls past it. */
.hero-text{
  max-width:620px;
  display:flex; flex-direction:column; align-items:center; gap:24px;
  text-align:center; width:80%;
}
/* Flex + align-items:center so "Curation", the separator, and "Art
   Advisory" sit vertically centered on the same line. The separator is a
   plain drawn circle rather than a literal "." character — a period
   glyph sits low in its own font's box near the baseline, so scaling it
   up (as text) just produces a bigger low-sitting dot that never
   actually centers against the surrounding words, no matter how it's
   nudged; a plain shape has no such baseline offset to fight. */
.hero-eyebrow{
  font-size:12.5px; letter-spacing:.16em; text-transform:uppercase;
  color:var(--ash); margin-bottom:8px; font-weight:500;
  display:flex; align-items:center; gap:0.6em;
}
.hero-eyebrow-dot{
  width:7px; height:7px; border-radius:50%; background:currentColor;
  flex-shrink:0; display:inline-block;
}
.hero-line{
  font-family:var(--serif);
  font-size:clamp(24px, 3vw, 38px);
  line-height:1.4;
  color:var(--porcelain);
  font-weight:400;
  letter-spacing:.002em;
}
.hero-cta{
  display:flex; gap:16px; flex-shrink:0; justify-content:center;
}
.btn{
  font-family:var(--sans); font-size:12.5px; letter-spacing:.1em; text-transform:uppercase;
  padding:14px 26px; border:1px solid var(--porcelain); color:var(--porcelain);
  white-space:nowrap; transition:all .35s ease;
  font-weight:500;
}
.btn:hover{background:var(--porcelain); color:var(--onyx);}
.btn.filled{background:var(--porcelain); color:var(--onyx);}
.btn.filled:hover{background:transparent; color:var(--porcelain);}

/* ---------- WORKS GRID (Zita-style: full-width 4-col grid, bottom-aligned per row) ---------- */
.works-scroll{
  display:grid; grid-template-columns:repeat(3, 1fr);
  column-gap:40px; row-gap:56px; align-items:end;
  padding:8px 0 8px;
}
.work-card-h{
  cursor:pointer;
}
.work-num{
  font-family:'Courier New', monospace; font-size:13px; letter-spacing:.02em;
  color:var(--ash); margin-bottom:14px; display:block;
}
.work-thumb{
  width:100%; aspect-ratio:0.75; overflow:hidden; margin-bottom:16px; background:var(--cloud); position:relative;
}
.work-thumb img{
  width:100%; height:100%; object-fit:cover; display:block;
  /* opacity is here (not left to .kechad-img-fade alone) because this
     selector's specificity (0,1,1) beats .kechad-img-fade's (0,1,0) — the
     transition shorthand doesn't merge across rules, so without this the
     load-fade would silently lose the cascade and just snap to visible. */
  transition:transform .6s ease, opacity .5s ease-out;
}
.work-status{
  position:absolute; top:14px; left:14px; z-index:2; font-size:10px; letter-spacing:.1em; text-transform:uppercase;
  background:var(--porcelain); color:var(--carbon); padding:5px 10px;
}
.work-name{font-family:var(--serif); font-weight:400; font-size:19px; color:var(--carbon); margin-bottom:2px;}
.work-type{
  font-size:13px; color:var(--ash); font-family:var(--serif); font-style:italic;
}

@media (max-width: 860px){
  .works-scroll{grid-template-columns:repeat(2, 1fr); column-gap:24px; row-gap:36px; align-items:start;}
  .work-name{font-size:16px;}
}

/* ---------- SECTION SHARED ---------- */
.section{padding:48px 48px;}
.section-head{
  display:flex; justify-content:space-between; align-items:flex-end;
  margin-bottom:56px; border-bottom:1px solid var(--cloud); padding-bottom:24px;
}
.section-label{
  font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--ash);
}
.section-title{
  font-family:var(--serif); font-size:clamp(28px,3.4vw,42px); margin-top:8px;
}
.view-all{
  display:inline-block;
  font-size:12px; letter-spacing:.08em; text-transform:uppercase;
  border:1px solid var(--cloud); color:var(--carbon);
  padding:12px 22px; transition:all .3s ease;
}
.view-all:hover{border-color:var(--carbon); background:var(--carbon); color:var(--porcelain);}

/* ---------- ARTISTS (Francis Gallery-style: list + hover reveal) ---------- */
.artists-wrap{
  display:grid; grid-template-columns:0.9fr 1.4fr; gap:60px; align-items:start;
}
.artists-names{display:flex; flex-direction:column;}
.artist-name-row{
  font-family:var(--serif); font-size:clamp(22px,2.4vw,32px);
  color:var(--cloud); cursor:pointer; line-height:1.5;
  transition:color .3s ease; width:fit-content;
}
.artist-name-row.active, .artist-name-row:hover{color:var(--carbon);}
.artists-preview{position:relative; min-height:340px;}
.artist-preview-item{
  position:absolute; inset:0; opacity:0; pointer-events:none; transition:opacity .5s ease;
  display:flex; flex-direction:row; gap:32px; align-items:flex-start;
}
.artist-preview-item.active{opacity:1; pointer-events:auto; position:relative;}
.artist-preview-photo{
  flex:0 0 240px; width:240px; aspect-ratio:4/5;
  background-size:cover; background-position:center; filter:grayscale(1) contrast(1.05);
}
.artist-preview-bio{flex:1; padding-top:2px;}
.artist-preview-name{
  font-family:var(--serif); font-size:22px; color:var(--carbon); margin-bottom:14px;
}
.artist-preview-text{
  font-size:14px; line-height:1.75; color:var(--ash); margin-bottom:24px; max-width:480px;
  text-align:justify;
}
/* Inline "Lire la suite" appended right after the trimmed excerpt's own
   "…" — deliberately understated (no border/box like .view-all below it,
   which is the real CTA) so it reads as a continuation of the sentence,
   not a second competing button. */
.artist-preview-more{color:var(--carbon); text-decoration:underline; white-space:nowrap;}
.artist-preview-more:hover{color:var(--ash);}

/* Homepage only ("#artists" — the archive page's ".artists-section" reuses
   all the classes above unchanged, bio/name included). Row layout, same as
   the base .artist-preview-item above: photo on the left, bio text + CTA
   stacked in the flex:1 column on the right. No name repeated — that's
   already the row on the left-hand artist list. */
#artists .artist-preview-photo{width:340px; flex:0 0 340px; cursor:pointer;}
#artists .artists-preview{min-height:425px;}
/* Short excerpt reads better left-aligned than the base's justify, which
   is tuned for a longer, full-width bio. */
#artists .artist-preview-text{text-align:left;}

@media (max-width: 860px){
  .artists-wrap{grid-template-columns:1fr; gap:32px;}
  .artist-name-row{font-size:22px;}
  .artist-preview-item{flex-direction:column;}
  .artist-preview-photo{width:100%; flex:0 0 auto;}
}

/* ---------- CURATORIAL PROJECTS (image right, text left — every row) ---------- */
.projects-list{display:flex; flex-direction:column; gap:72px;}
.project-row-inner{display:flex; flex-direction:row-reverse; align-items:center; gap:56px;}
.project-image{
  position:relative;
  flex:0 0 58%; aspect-ratio:16/10; overflow:hidden;
}
.project-image img{
  width:100%; height:100%; object-fit:cover; display:block;
  filter:grayscale(0.15) contrast(1.05);
}
/* Same badge treatment as .work-status/.catalog-status (position, size,
   colors) — kept as its own rule rather than a shared selector since it
   applies to a differently-shaped container (.project-image/.project-hero
   are 16:10 and full-width respectively, not the square-ish work/catalog
   thumbs), but the visual spec is identical by design. */
.project-status{
  position:absolute; top:14px; left:14px; z-index:2; font-size:10px; letter-spacing:.1em; text-transform:uppercase;
  background:var(--porcelain); color:var(--carbon); padding:5px 10px;
}
.project-text{flex:1;}
.project-title{font-family:var(--serif); font-size:clamp(24px,2.8vw,34px); color:var(--carbon); margin-bottom:12px;}
.project-meta{font-size:12.5px; letter-spacing:.04em; color:var(--ash); margin-bottom:24px;}
.project-desc{font-size:14.5px; line-height:1.75; color:var(--ash); margin-bottom:28px; max-width:400px;}
.project-cta{
  display:inline-block; font-family:var(--sans); font-size:12px; letter-spacing:.1em; text-transform:uppercase;
  padding:14px 26px; border:1px solid var(--carbon); background:var(--carbon); color:var(--porcelain);
  transition:all .3s ease;
}
.project-cta:hover{background:transparent; color:var(--carbon);}

@media (max-width: 860px){
  .project-row-inner{flex-direction:column !important; gap:24px; align-items:flex-start;}
  .project-image{flex:0 0 auto; width:100%;}
  .project-desc{max-width:100%;}
}

/* ---------- FOUNDER (now: platform blurb, no photo) ---------- */
.founder-inner{width:60%; margin:0 auto;}
.founder-bio{font-size:15px; line-height:1.8; color:var(--ash); margin-bottom:28px; text-align:justify;}
.founder-bio-highlight{color:var(--carbon); font-weight:600;}
.founder-actions{display:flex; align-items:center; gap:16px; flex-wrap:wrap;}

@media (max-width: 860px){
  .founder-inner{width:100%;}
}

/* ---------- FOOTER ---------- */
footer{
  background:var(--carbon); color:var(--porcelain);
  padding:80px 48px 40px;
}
.footer-grid{
  display:grid; grid-template-columns:1.4fr 1fr 1fr; gap:56px;
  padding-bottom:60px; border-bottom:1px solid rgba(254,255,249,0.15);
  align-items:start;
}
.footer-col-main{padding-right:20px;}
.footer-top-row{
  display:flex; align-items:center; justify-content:space-between;
  flex-wrap:wrap; gap:12px 24px;
  margin-bottom:24px;
}
.footer-logo svg{height:45px; width:auto; fill:var(--porcelain);}
.footer-top-row .footer-claim-quiet{
  font-family:var(--serif); font-style:italic; font-size:15px;
  color:var(--ash); margin-bottom:12px; line-height:1;
}
.footer-desc{
  font-size:14px; color:var(--cloud); line-height:1.6; margin-bottom:28px;
}
/* ---------- FOOTER NEWSLETTER (Fluent Forms "Newsletter" embed) ----------
   Same override approach as the CONTACT/MODAL Fluent Forms block further
   below: the default fluentform-public-default skin is dequeued sitewide
   in functions.php, and every visual rule here replaces it from scratch to
   match the original static input+button design exactly. */
.footer-newsletter{max-width:100%;}
.footer-newsletter .fluentform{width:100%;}
.footer-newsletter fieldset{
  display:flex; align-items:center; gap:16px;
}
.footer-newsletter .ff-el-group{margin:0;}
/* Same specificity tie as the contact-form-wrap .ff-el-group fix elsewhere in
   this file: Fluent Forms' own .fluentform .ff-el-group{margin-bottom:20px}
   is (0,2,0), equal to a plain ".footer-newsletter .ff-el-group" — naming
   the .fluentform ancestor here (0,3,0) is what actually wins. */
.footer-newsletter .fluentform .ff-el-group{margin:0;}
.footer-newsletter .ff-el-group:not(.ff_submit_btn_wrapper){flex:1;}
.footer-newsletter .ff-el-form-control{
  width:100%; background:transparent; border:none; outline:none; box-shadow:none;
  font-family:var(--sans); font-size:14px; color:var(--porcelain); padding:12px 0;
  border-bottom:1px solid rgba(254,255,249,0.3);
}
.footer-newsletter .ff-el-form-control::placeholder{color:var(--ash); opacity:1;}
/* Matches the site's other bordered CTAs (e.g. the hero's .btn) — same
   border/fill-on-hover treatment, just in the footer's own dark tone
   (--carbon) instead of the hero's --onyx, so it reads as a real button
   rather than plain text next to the input. */
.footer-newsletter .ff-btn-submit{
  background:transparent; border:1px solid var(--porcelain); color:var(--porcelain);
  font-size:12px; letter-spacing:.08em; text-transform:uppercase; cursor:pointer; padding:12px 20px;
  white-space:nowrap; transition:all .3s ease;
}
.footer-newsletter .ff-btn-submit:hover{background:var(--porcelain); color:var(--carbon);}
.footer-newsletter .text-danger{color:#e08b7d; font-size:11px; margin-top:4px;}
.newsletter-confirm{display:none;}
.newsletter-confirm.active{display:block;}
.newsletter-confirm-text{
  font-family:var(--sans); font-size:14px; color:var(--porcelain); padding:12px 0;
  border-bottom:1px solid rgba(254,255,249,0.3);
}
.footer-col-label{
  font-size:11px; letter-spacing:.14em; text-transform:uppercase; color:var(--ash);
  margin-bottom:20px;margin-top:10px;
}
.footer-col a, .footer-col p{
  display:block; font-size:14px; color:var(--cloud); margin-bottom:12px; line-height:1.6;
}
.footer-col a:hover{color:var(--porcelain);}

/* Shared "FR / EN" toggle structure — see .nav-lang-wrap (header, ~line 18)
   and .mobile-nav-footer-bottom-row below for the two placement contexts,
   which set color and, where needed, override the ambient "a" link styling
   each context would otherwise impose. */
.lang-switch{
  display:inline-flex; align-items:center;
  font-family:var(--sans); font-size:11px; letter-spacing:.06em; text-transform:uppercase;
}
.lang-switch .lang-sep{margin:0 5px; opacity:.5;}
.lang-switch .lang-current{opacity:1;}
.lang-switch a{opacity:.55; transition:opacity .25s ease, color .25s ease;}
.lang-switch a:hover{opacity:1;}

.footer-bottom{
  display:flex; justify-content:space-between; align-items:center;
  padding-top:32px; font-size:12px; color:var(--ash);
}
.footer-legal{display:flex; align-items:center; gap:10px;}
.footer-legal a{color:var(--ash); transition:color .25s ease;}
.footer-legal a:hover{color:var(--porcelain);}
.footer-legal-sep{color:var(--ash); opacity:.5;}
.footer-credit a{color:var(--ash); transition:color .25s ease;}
.footer-credit a:hover{color:var(--porcelain);}

@media (max-width: 860px){
  header{padding:24px;}
  .nav-lang-wrap{display:none;}
  .mobile-nav-toggle{display:flex;}
  .hero{padding:32px 24px; justify-content:flex-end;}
  .hero-content{flex-direction:column; justify-content:flex-start; align-items:flex-start; gap:32px;}
  .hero-text{align-items:flex-start; text-align:left; width:100%; max-width:none;}
  .hero-cta{justify-content:flex-start;}
  .hero-line{text-align:justify;}
  .hero-art img{
    width:100vw !important;
    height:100dvh !important;
    object-fit:cover !important;
    transform:scale(1) !important;
  }
  .section{padding:35px 24px;}
  .footer-grid{grid-template-columns:1fr; gap:40px;}
  .footer-col-main{padding-right:0;}
  footer{padding:56px 24px 32px;}
}

/* ---------- WORKS CATALOG PAGE ---------- */
.catalog-header{padding:160px 48px 40px;}
.catalog-eyebrow{font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--ash); margin-bottom:16px;}
.catalog-title{font-family:var(--serif); font-size:clamp(34px,4.4vw,54px); color:var(--carbon); margin-bottom:20px;}
.catalog-intro{font-size:15px; color:var(--ash); max-width:560px; line-height:1.7;}

.catalog-filters{
  display:flex; flex-wrap:wrap; gap:28px;
  padding:32px 48px; border-top:1px solid var(--cloud); border-bottom:1px solid var(--cloud);
}
.filter-tag{
  font-size:13px; letter-spacing:.03em; color:var(--ash); cursor:pointer;
  padding-bottom:3px; border-bottom:1px solid transparent; transition:all .25s ease;
}
.filter-tag.active, .filter-tag:hover{color:var(--carbon); border-color:var(--carbon);}

.catalog-grid-wrap{padding:56px 48px 100px;}
.catalog-grid{
  display:grid; grid-template-columns:repeat(3, 1fr);
  column-gap:40px; row-gap:64px; align-items:end;
}
.catalog-card{cursor:pointer;}
.catalog-thumb{width:100%; aspect-ratio:0.75; overflow:hidden; margin-bottom:16px; position:relative; background:var(--cloud);}
.catalog-thumb img{width:100%; height:100%; object-fit:cover; display:block; transition:transform .6s ease, opacity .5s ease-out;}
.catalog-status{
  position:absolute; top:14px; left:14px; z-index:2; font-size:10px; letter-spacing:.1em; text-transform:uppercase;
  background:var(--porcelain); color:var(--carbon); padding:5px 10px;
}
.catalog-num{
  font-family:'Courier New', monospace; font-size:13px; color:var(--ash); margin-bottom:14px; display:block;
}
.catalog-name{font-family:var(--serif); font-weight:400; font-size:19px; color:var(--carbon); margin-bottom:2px;}
.catalog-artist{font-size:13px; color:var(--ash); font-family:var(--serif); font-style:italic; margin-bottom:8px;}
.catalog-detail{font-size:12px; color:var(--ash); margin-bottom:4px;}
.catalog-price{
  display:inline-block; font-family:var(--sans); font-size:11.5px; letter-spacing:.06em; text-transform:uppercase;
  color:var(--carbon); background:transparent; border:1px solid var(--cloud); padding:8px 14px; margin-top:4px;
  cursor:pointer; transition:all .25s ease;
}
.catalog-price:hover{border-color:var(--carbon); background:var(--carbon); color:var(--porcelain);}
/* Artworks archive page only — .catalog-price is also reused inside
   .work-card-h cards on single-artwork.php's/single-artist.php's "more
   works" grids, which should keep their own current sizing. */
.catalog-card .catalog-price{width:100%; box-sizing:border-box; text-align:center;}
.catalog-unavailable{
  display:inline-block; font-family:var(--serif); font-size:11.5px; letter-spacing:.06em; text-transform:uppercase;
  color:var(--ash); background:transparent; border:1px solid var(--cloud); padding:8px 14px; margin-top:4px;
  cursor:default;
}

/* ---------- ARTISTS ARCHIVE (grid: name, photo, button — replaces the
   old list + hover-preview layout on this page only; the homepage still
   uses that list/preview pattern via .artists-wrap/.artist-name-row/
   .artist-preview-item, untouched) ---------- */
.artists-grid-wrap{padding:56px 48px 100px;}
.artists-grid{
  display:grid; grid-template-columns:repeat(3, 1fr);
  column-gap:40px; row-gap:64px;
}
.artist-card-name{font-family:var(--serif); font-size:19px; color:var(--carbon); margin-bottom:16px;}
.artist-card-photo{
  display:block; width:100%; aspect-ratio:4/5; margin-bottom:16px;
  background-size:cover; background-position:center; filter:grayscale(1) contrast(1.05);
  transition:opacity .3s ease;
}
.artist-card-photo:hover{opacity:.85;}
.artist-card-btn{
  display:block; width:100%; box-sizing:border-box; text-align:center;
  font-family:var(--sans); font-size:11.5px; letter-spacing:.06em; text-transform:uppercase;
  color:var(--carbon); background:transparent; border:1px solid var(--cloud); padding:8px 14px;
  cursor:pointer; transition:all .25s ease;
}
.artist-card-btn:hover{border-color:var(--carbon); background:var(--carbon); color:var(--porcelain);}

.load-more-wrap{display:flex; justify-content:center; padding-top:72px;}
.pagination{display:flex; justify-content:center; align-items:center; gap:12px; padding-top:72px;}
.page-btn{
  width:38px; height:38px; display:flex; align-items:center; justify-content:center;
  font-size:13px; letter-spacing:.04em; color:var(--ash); background:none; border:1px solid transparent;
  cursor:pointer; transition:all .25s ease;
}
.page-btn:hover{border-color:var(--cloud); color:var(--carbon);}
.page-btn.active{background:var(--carbon); color:var(--porcelain); border-color:var(--carbon);}
.page-btn.next{width:auto; padding:0 16px; text-transform:uppercase; font-size:11px; letter-spacing:.08em;}

@media (max-width: 860px){
  .catalog-header{padding:110px 24px 32px;}
  .catalog-filters{padding:24px; gap:20px;}
  .catalog-grid-wrap{padding:40px 24px 64px;}
  .catalog-grid{grid-template-columns:repeat(2, 1fr); column-gap:20px; row-gap:40px; align-items:start;}
  .catalog-name{font-size:16px;}
  .artists-grid-wrap{padding:40px 24px 64px;}
  .artists-grid{grid-template-columns:repeat(2, 1fr); column-gap:20px; row-gap:40px;}
  .artist-card-name{font-size:16px;}
}

/* ---------- ARTWORK DETAIL PAGE ---------- */
.breadcrumb{
  margin:0 auto; padding:150px 48px 0; font-size:12px; letter-spacing:.04em; color:var(--ash);
}
.breadcrumb a{color:var(--ash); transition:color .25s ease;}
.breadcrumb a:hover{color:var(--carbon);}
.breadcrumb .sep{margin:0 8px; color:var(--cloud);}
.breadcrumb .current{color:var(--carbon);}

.artwork-layout{
  display:grid; grid-template-columns:auto 1fr; gap:96px;
  padding:40px 48px 0; align-items:start;
}
.artwork-gallery{display:flex; gap:14px; align-items:flex-start;}
.artwork-main{
  width:auto; height:576px; aspect-ratio:4/5; overflow:hidden; background:var(--cloud); flex-shrink:0; cursor:zoom-in;
}
.artwork-main img{width:100%; height:100%; object-fit:cover; display:block; transition:transform .4s ease, object-position .4s ease; transform-origin:center;}
.artwork-thumbs{display:flex; flex-direction:column; gap:8px;}
.artwork-thumb{
  width:120px; height:138px; overflow:hidden; cursor:pointer; opacity:.55;
  border:1px solid transparent; transition:all .25s ease; flex-shrink:0;
}
.artwork-thumb.active{opacity:1; border-color:var(--carbon);}
.artwork-thumb:hover{opacity:1;}
.artwork-thumb img{width:100%; height:100%; object-fit:cover; display:block;}

.artwork-info{padding-top:8px;}
/* Order: "Œuvre" eyebrow, status tag, then artist name (plain text now,
   not a link), then a row pairing the artwork's own title with its year
   on the right — all three (artist name, title, year) share the same
   heading size/style, no visual hierarchy between them. No artist
   assigned: the title+year row is the only heading, same size regardless. */
.artwork-eyebrow{font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--ash); margin-bottom:12px;}
.artwork-status-tag{
  display:inline-block; font-size:10px; letter-spacing:.1em; text-transform:uppercase;
  border:1px solid var(--cloud); padding:6px 12px; color:var(--carbon); margin-bottom:16px;
}
.artwork-title{font-family:var(--serif); font-size:clamp(22px,2.4vw,30px); color:var(--carbon); margin-bottom:0px;}
.artwork-artist-row{display:flex; align-items:baseline; gap:20px; margin-bottom:16px; flex-wrap:wrap;}
.artwork-artist, .artwork-year{font-family:var(--serif); font-size:clamp(22px,2.4vw,30px); color:var(--carbon);}
.artwork-meta-row{
  font-size:13px; color:var(--ash);
  margin-bottom:28px; display:flex; flex-direction:column; gap:8px;
}
/* Disponible pieces: a plain price status line (no button chrome — it's
   information, not an action) followed by two real actions. */
.artwork-price-note{
  display:block; font-family:var(--sans); font-size:12px; letter-spacing:.08em; text-transform:uppercase;
  color:var(--carbon); margin-bottom:20px;
}
.artwork-actions{display:flex; flex-direction:column; gap:12px; margin-bottom:32px;}
.artwork-inquire-btn{
  display:inline-block; font-family:var(--sans); font-size:12px; letter-spacing:.08em; text-transform:uppercase;
  background:var(--carbon); color:var(--porcelain); border:1px solid var(--carbon);
  padding:14px 26px; cursor:pointer; transition:all .3s ease;
  width:100%; text-align:center; box-sizing:border-box;
}
.artwork-inquire-btn:hover{background:transparent; color:var(--carbon);}
/* Secondary action — outlined/lighter than the primary Inquire button
   above, so it doesn't compete with it. */
.artwork-whatsapp-btn{
  display:inline-block; font-family:var(--sans); font-size:12px; letter-spacing:.08em; text-transform:uppercase;
  background:transparent; color:var(--carbon); border:1px solid var(--cloud);
  padding:14px 26px; cursor:pointer; transition:all .3s ease;
  width:100%; text-align:center; box-sizing:border-box;
}
.artwork-whatsapp-btn:hover{border-color:var(--carbon);}
/* Inside the inquiry modal (moved there from .artwork-actions) — needs
   its own gap before the form below it, since .modal-heading's own
   margin-bottom only spaces the heading from this button, not this
   button from whatever comes after it. */
#modalFormWrap .artwork-whatsapp-btn{margin-bottom:24px;}
.artwork-desc{font-size:15px; line-height:1.8; color:var(--ash); margin-bottom:0;}
/* Wraps the optional series label+description and the artwork's own
   description — gap only matters when both render, since a single child
   has nothing to space itself from. */
.artwork-desc-wrap{margin-top:16px; display:flex; flex-direction:column; gap:8px;}

/* ---------- ABOUT THE ARTIST + MORE WORKS ---------- */
.artist-strip{
  margin-top:56px; padding:0 48px 100px;
}
.artist-strip-divider{border-top:1px solid var(--cloud); margin-bottom:64px;}
.artist-strip-head{display:flex; gap:32px; align-items:stretch; margin-bottom:56px; max-width:720px;}
.artist-strip-photo{width:170px; height:auto; flex-shrink:0; overflow:hidden; filter:grayscale(1);}
.artist-strip-photo img{width:100%; height:100%; object-fit:cover; display:block;}
.artist-strip-name{font-family:var(--serif); font-size:22px; color:var(--carbon); margin-bottom:10px;}
.artist-strip-bio{font-size:14px; line-height:1.7; color:var(--ash); margin-bottom:18px; text-align:justify;}
.artist-strip-head .view-all{width:100%; text-align:center; box-sizing:border-box;}

.more-works-label{font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--ash); margin-bottom:20px;}
.more-works-grid{display:grid; grid-template-columns:repeat(3, 1fr); column-gap:40px; row-gap:56px; max-width:1400px; align-items:end;}

.more-artist{padding:0 48px 100px;}

@media (max-width: 860px){
  .breadcrumb{padding:110px 24px 0;}
  .artwork-layout{grid-template-columns:1fr; gap:32px; padding:24px 24px 0;}
  .artwork-gallery{flex-direction:column; min-width:0;}
  .artwork-main{width:100%; height:auto;}
  .artwork-thumb{flex:1; width:auto; height:auto; aspect-ratio:150/172;}
  .artwork-thumbs{flex-direction:row; overflow-x:auto; -webkit-overflow-scrolling:touch; padding-bottom:4px; min-width:0; width:100%;}
  .artist-strip{padding:0 24px 64px;}
  .artist-strip-head{flex-direction:column; gap:20px;}
  .artist-strip-photo{width:100%; height:auto; aspect-ratio:4/5;}
  .artist-strip-divider{margin-bottom:48px;}
  .more-works-grid{grid-template-columns:repeat(2, 1fr); gap:20px; align-items:start;}
}

/* ---------- INQUIRY MODAL ---------- */
.modal-overlay{
  display:none; position:fixed; inset:0; z-index:300;
  background:rgba(0,0,0,0.6);
  align-items:center; justify-content:center; padding:24px;
}
.modal-overlay.active{display:flex;}
.modal-box{
  background:var(--porcelain); width:100%; max-width:860px; max-height:88vh; overflow-y:auto;
  position:relative; display:flex;
}
.modal-close{
  position:absolute; top:20px; right:20px; z-index:2;
  font-size:20px; line-height:1; cursor:pointer; color:var(--carbon); background:none; border:none;
}
.modal-left{
  flex:0 0 280px; padding:48px 32px; border-right:1px solid var(--cloud);
}
.modal-thumb{width:100%; aspect-ratio:4/5; overflow:hidden; margin-bottom:20px; background:var(--cloud);}
.modal-thumb img{width:100%; height:100%; object-fit:cover; display:block;}
/* Mirrors .artwork-info's own hierarchy (single-artwork.php): artist name
   as the heading, title+year paired underneath, no label prefixes on the
   meta line — just scaled down to fit this narrower column. */
.modal-artist{font-family:var(--serif); font-size:20px; color:var(--carbon); margin-bottom:6px;}
.modal-title-row{display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; margin-bottom:16px;}
.modal-title, .modal-year{font-family:var(--serif); font-size:14px; color:var(--carbon);}
.modal-meta{font-size:12px; color:var(--ash); line-height:1.8;}

.modal-right{flex:1; padding:48px 40px;}
.modal-label{font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--ash); margin-bottom:8px;}
.modal-heading{font-family:var(--serif); font-size:24px; color:var(--carbon); margin-bottom:28px;}
.modal-form{display:flex; flex-direction:column; gap:18px;}
.modal-row{display:grid; grid-template-columns:1fr 1fr; gap:18px;}
.modal-form input, .modal-form textarea{
  width:100%; background:transparent; border:none; border-bottom:1px solid var(--cloud);
  font-family:var(--sans); font-size:14px; color:var(--carbon); padding:10px 0; outline:none;
  transition:border-color .25s ease;
}
.modal-form input:focus, .modal-form textarea:focus{border-color:var(--carbon);}
.modal-form input::placeholder, .modal-form textarea::placeholder{color:var(--ash);}
.modal-form textarea{resize:vertical; min-height:70px;}
.modal-required{font-size:11px; color:var(--ash); margin-top:-6px;}
.modal-submit{
  align-self:flex-start; margin-top:8px;
  font-family:var(--sans); font-size:12px; letter-spacing:.1em; text-transform:uppercase;
  padding:14px 28px; border:1px solid var(--carbon); background:var(--carbon); color:var(--porcelain);
  cursor:pointer; transition:all .3s ease;
}
.modal-submit:hover{background:transparent; color:var(--carbon);}

.modal-confirm{display:none; padding:80px 40px; text-align:center;}
.modal-confirm.active{display:block;}
.modal-confirm-title{font-family:var(--serif); font-size:26px; color:var(--carbon); margin-bottom:14px;}
.modal-confirm-text{font-size:14px; color:var(--ash); max-width:360px; margin:0 auto;}

@media (max-width: 720px){
  .modal-box{flex-direction:column; max-height:92vh;}
  .modal-left{border-right:none; border-bottom:1px solid var(--cloud); padding:32px 24px;}
  .modal-right{padding:32px 24px;}
  .modal-row{grid-template-columns:1fr;}
}

/* ---------- ARTWORK ZOOM LIGHTBOX ---------- */
.lightbox-overlay{
  display:none; position:fixed; inset:0; z-index:400;
  background:rgba(0,0,0,0.92);
  align-items:center; justify-content:center; padding:24px;
}
.lightbox-overlay.active{display:flex;}
.lightbox-close{
  position:absolute; top:24px; right:32px; z-index:2;
  font-size:22px; line-height:1; cursor:pointer; color:var(--porcelain); background:none; border:none;
}
.lightbox-stage{width:100%; height:100%; display:flex; align-items:center; justify-content:center; overflow:hidden; cursor:zoom-in;}
.lightbox-stage.zoomed{cursor:zoom-out;}
.lightbox-stage img{max-width:100%; max-height:100%; object-fit:contain; transition:transform .35s ease; transform-origin:center;}
.lightbox-stage.zoomed img{transform:scale(2.2);}

@media (max-width: 720px){
  .lightbox-close{top:16px; right:20px;}
  .lightbox-stage.zoomed img{transform:scale(1.8);}
}

/* ---------- ARTIST PROFILE PAGE ---------- */
.profile-layout{
  display:grid; grid-template-columns:480px 1fr; gap:64px;
  padding:40px 48px 0; align-items:start;
}
.profile-photo{width:100%; aspect-ratio:4/5; overflow:hidden; filter:grayscale(1) contrast(1.05); margin-bottom:48px;}
.profile-photo img{width:100%; height:100%; object-fit:cover; display:block;}
.profile-name{font-family:var(--serif); font-size:clamp(28px,3vw,38px); color:var(--carbon); margin-bottom:8px;}
.profile-role{font-size:13px; letter-spacing:.06em; text-transform:uppercase; color:var(--ash); margin-bottom:28px;}
.profile-bio{font-size:15px; line-height:1.85; color:var(--ash); max-width:700px; margin-bottom:32px;}
.profile-bio p{margin-bottom:18px;text-align: justify;}
.profile-bio p:last-child{margin-bottom:0;}
.profile-actions{display:flex; gap:16px; margin-bottom:32px;}
.profile-inquire-btn{
  font-family:var(--sans); font-size:12px; letter-spacing:.1em; text-transform:uppercase;
  padding:14px 28px; border:1px solid var(--carbon); background:var(--carbon); color:var(--porcelain);
  cursor:pointer; transition:all .3s ease;
}
.profile-inquire-btn:hover{background:transparent; color:var(--carbon);}

.profile-works{padding:0 48px 120px;}
.profile-works-inner{border-top:1px solid var(--cloud); padding-top:64px;}
.profile-works-label{font-family:var(--serif); font-size:clamp(24px,2.6vw,32px); color:var(--carbon); margin-bottom:32px;}
.profile-works-grid{display:grid; grid-template-columns:repeat(3, 1fr); column-gap:40px; row-gap:56px; align-items:end;}

@media (max-width: 860px){
  .profile-layout{grid-template-columns:1fr; gap:32px; padding:24px 24px 0;}
  .profile-inquire-btn{width:100%; text-align:center; box-sizing:border-box;}
  .profile-works{padding:0 24px 64px;}
  .profile-works-inner{padding-top:48px;}
  .profile-works-grid{grid-template-columns:repeat(2, 1fr); column-gap:20px; row-gap:36px; align-items:start;}
}

/* ---------- PROJECT DETAIL PAGE ---------- */
.project-hero{position:relative; width:100%; height:70vh; min-height:480px; overflow:hidden;}
.project-hero img{width:100%; height:100%; object-fit:cover; display:block; filter:grayscale(0.1) contrast(1.05);}

.project-header{padding:40px 48px 24px; max-width:800px;}
.project-eyebrow{font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--ash); margin-bottom:16px;}
.project-header-title{font-family:var(--serif); font-size:clamp(32px,4vw,50px); color:var(--carbon); margin-bottom:16px;}
.project-header-meta{font-size:13px; color:var(--ash);}
.project-header-meta a{border-bottom:1px solid transparent; transition:border-color .25s ease, color .25s ease;}
.project-header-meta a:hover{color:var(--carbon); border-color:var(--carbon);}

.project-lead{padding:40px 48px 24px; max-width:820px;}
.project-lead p{
  font-family:var(--serif); font-style:italic; font-size:clamp(19px,2.2vw,26px);
  line-height:1.55; color:var(--carbon);
}

.project-body{padding:24px 48px; max-width:720px;}
.project-body p{font-size:15px; line-height:1.85; color:var(--ash); margin-bottom:20px; text-align: justify;}
.project-body p:last-child{margin-bottom:0;}
.project-body-label{font-size:12px; letter-spacing:.2em; text-transform:uppercase; color:var(--carbon); margin-bottom:16px;}

.project-duo{display:grid; grid-template-columns:1fr 1fr; gap:24px; padding:24px 48px 40px;}
.project-duo img{width:100%; height:auto; aspect-ratio:3/4; object-fit:cover; display:block;}
.project-duo .tall{aspect-ratio:3/4;}

.gallery-slider-wrap{
  position:relative; overflow:hidden; padding:60px 0;
  height:800px; width:100%; margin:0 auto;
  display:flex; align-items:center;
}
.gallery-slider-track{
  display:flex; align-items:center; gap:16px;
  transition:transform .5s cubic-bezier(.4,0,.2,1);
  will-change:transform;
}
.slider-item{
  /* 3:4 (0.75), not 4:5 — matches typical phone-shot portrait photos better,
     reducing how much object-fit:cover has to crop. Heights are unchanged
     from the previous 4:5 sizing (same carousel height budget); widths are
     recomputed for the new ratio. kechadActiveWidth()/kechadNearWidth()/
     kechadFarWidth() in main.js mirror these exact numbers for the
     centering math — keep both in sync if these change again. */
  flex-shrink:0; width:94px; height:125px; opacity:.35; cursor:pointer;
  overflow:hidden; transition:width .4s ease, height .4s ease, opacity .4s ease;
}
.slider-item img{width:100%; height:100%; object-fit:cover; display:block;}
.slider-item.near{width:131px; height:175px; opacity:.6;}
.slider-item.active{width:auto; height:680px; aspect-ratio:auto; opacity:1; cursor:default;}
.slider-arrow{
  position:absolute; top:50%; transform:translateY(-50%); z-index:2;
  background:var(--porcelain); border:1px solid var(--cloud); width:44px; height:44px;
  border-radius:50%; cursor:pointer; font-size:16px; color:var(--carbon);
  display:flex; align-items:center; justify-content:center; transition:all .25s ease;
}
.slider-arrow:hover{border-color:var(--carbon);}
.slider-arrow.prev{left:96px;}
.slider-arrow.next{right:96px;}

.artists-involved{padding:0 48px 24px;}
.artists-involved-divider{border-top:1px solid var(--cloud); margin-bottom:64px;}
.artists-involved-label{font-family:var(--serif); font-size:24px; color:var(--carbon); margin-bottom:32px;}
/* One .artists-involved-group per collaborator type (Galerie/Artistes) —
   its own small label above that group's own row of cards, so the two
   types read as distinct groups under the shared "En collaboration avec"
   heading rather than one flat mixed list. */
.artists-involved-group{margin-bottom:40px;}
.artists-involved-group:last-child{margin-bottom:0;}
.artists-involved-group-label{font-size:12px; letter-spacing:.14em; text-transform:uppercase; color:var(--ash); margin-bottom:24px;}
.artists-involved-list{display:flex; flex-wrap:wrap; gap:48px;}
.involved-artist{display:flex; flex-direction:column; width:auto;}
/* Photos hidden site-wide in this section for now, on request — internal
   artists_involved profiles do have a real photo (unlike the external
   pool, which currently has none set), so without this they'd show up
   while external collaborators wouldn't. Template/data logic underneath
   is untouched — flip this back on later by removing this one rule. */
.artists-involved .involved-artist-photo{display:none;}
.involved-artist-photo{width:100%; aspect-ratio:4/5; overflow:hidden; filter:grayscale(1); margin-bottom:16px;}
.involved-artist-photo img{width:100%; height:100%; object-fit:cover; display:block; transition:transform .5s ease, opacity .5s ease-out;}
.involved-artist:hover .involved-artist-photo img{transform:scale(1.04);}
.involved-artist-name{
  font-family:var(--serif); font-size:18px; color:var(--carbon); margin-bottom:14px; text-transform:capitalize;
  display:inline-block; border-bottom:1px solid transparent; transition:border-color .25s ease; width:fit-content;
}
a.involved-artist-name:hover{border-color:var(--carbon);}

.project-back{padding:40px 48px 120px; text-align:center;}

@media (max-width: 860px){
  .project-hero{height:45vh; min-height:280px;}
  .project-header{padding:24px 24px 16px;}
  .project-lead{padding:16px 24px;}
  .project-body{padding:16px 24px;}
  .project-back{padding:24px 24px 64px;}
  .project-body p{text-align:justify;}
  .project-duo{grid-template-columns:1fr; gap:16px; padding:16px 24px 24px;}
  .project-duo img{aspect-ratio:3/4;}
  .project-duo .tall{aspect-ratio:3/4;}
  .gallery-slider-wrap{height:440px; width:100%; padding:40px 0;}
  .gallery-slider-track{gap:12px;}
  .slider-item{width:19px; height:25px;}
  .slider-item.near{width:26px; height:35px;}
  .slider-item.active{width:auto; height:360px;}
  .slider-arrow{width:36px; height:36px; font-size:14px;}
  .slider-arrow.prev{left:32px;}
  .slider-arrow.next{right:32px;}
  .artists-involved{padding:0 24px 64px;}
  .artists-involved-divider{margin-bottom:48px;}
  .artists-involved-list{display:grid; grid-template-columns:repeat(1, 1fr); gap:12px 20px;}
  .involved-artist{width:auto;}
}

/* ---------- ABOUT PAGE ---------- */
.about-hero{
  display:grid; grid-template-columns:320px 1fr; gap:72px;
  padding:20px 48px 100px; align-items:start;
}
/* .about-hero is itself the grid (photo + text columns), unlike
   .about-section's separate divider+inner-wrapper split above — so the
   divider needs to span both grid columns explicitly rather than just
   sitting above them as a block-level sibling. */
.about-hero .about-section-divider{grid-column:1 / -1;}
.about-photo{width:100%; aspect-ratio:4/5; overflow:hidden; filter:grayscale(1) contrast(1.05);}
.about-photo img{width:100%; height:100%; object-fit:cover; display:block;}
.about-eyebrow{font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--ash); margin-bottom:16px;}
.about-name{font-family:var(--serif); font-size:clamp(28px,3.6vw,44px); color:var(--carbon); margin-bottom:24px;}
.about-intro{font-size:16px; line-height:1.8; color:var(--ash); max-width:520px; text-align:justify;}

.about-section{
  padding:0 48px 64px;
}
.about-section-divider{border-top:1px solid var(--cloud); margin-bottom:64px;}
.about-section-inner{display:grid; grid-template-columns:280px 1fr; gap:72px; max-width:1200px; margin:0 auto;}
.about-section-label{font-family:var(--serif); font-size:24px; color:var(--carbon);}
.about-section-text{font-size:15px; line-height:1.85; color:var(--ash); max-width:700px; text-align:justify;}
.about-section-text p{margin-bottom:20px;}
.about-section-text p:last-child{margin-bottom:0;}

.services-grid{
  display:grid; grid-template-columns:repeat(2, 1fr); gap:64px;
  max-width:820px; margin:0 auto;
}
.service-title{font-family:var(--serif); font-size:20px; color:var(--carbon); margin-bottom:10px;}
.service-text{font-size:13.5px; line-height:1.7; color:var(--ash);}

.about-closing{
  text-align:center; padding:0 48px 100px;
}
.about-closing-divider{border-top:1px solid var(--cloud); margin-bottom:100px;}
.about-closing-text{font-family:var(--serif); font-style:italic; font-size:clamp(20px,2.4vw,28px); color:var(--carbon); margin-bottom:28px;}
.about-contact-btn{
  display:inline-block; font-family:var(--sans); font-size:12px; letter-spacing:.1em; text-transform:uppercase;
  padding:14px 28px; border:1px solid var(--carbon); background:var(--carbon); color:var(--porcelain);
  transition:all .3s ease;
}
.about-contact-btn:hover{background:transparent; color:var(--carbon);}

@media (max-width: 860px){
  .about-hero{grid-template-columns:1fr; gap:32px; padding:0 24px 64px;}
  .about-section{padding:0 24px 48px;}
  .about-section-divider{margin-bottom:48px;}
  .about-section-inner{grid-template-columns:1fr; gap:20px;}
  .services-grid{grid-template-columns:1fr; gap:32px;}
  .about-closing{padding:0 24px 64px;}
  .about-closing-divider{margin-bottom:64px;}
}

/* ---------- CONTACT PAGE ---------- */
.contact-layout{
  display:grid; grid-template-columns:0.8fr 1.2fr; gap:72px;
  padding:160px 48px 140px; align-items:start;
}
.page-eyebrow{font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--ash); margin-bottom:16px;}
.page-title{font-family:var(--serif); font-size:clamp(34px,4.4vw,54px); color:var(--carbon); margin-bottom:20px;}
.page-intro{font-size:15px; color:var(--ash); max-width:480px; line-height:1.7; margin-bottom:56px;}
@media (max-width: 860px){
  .page-intro{text-align:justify;}
}
.contact-info-label{font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--ash); margin-bottom:24px;}
.contact-block{margin-bottom:32px;}
.contact-block-label{font-size:12px; color:var(--ash); margin-bottom:6px;}
.contact-block a, .contact-block p{font-size:15px; color:var(--carbon); line-height:1.6;}
.contact-block a{border-bottom:1px solid transparent; transition:border-color .25s ease;}
.contact-block a:hover{border-color:var(--carbon);}
.contact-socials{display:flex; gap:24px; margin-top:8px;}
.contact-socials a{
  font-size:13px; letter-spacing:.04em; color:var(--carbon);
  border-bottom:1px solid var(--cloud); padding-bottom:4px; transition:border-color .25s ease;
}
.contact-socials a:hover{border-color:var(--carbon);}

.contact-form-wrap{margin-top:112px;}
.contact-form{display:flex; flex-direction:column; gap:20px;}
.contact-row{display:grid; grid-template-columns:1fr 1fr; gap:20px;}
.contact-form input, .contact-form textarea{
  width:100%; background:transparent; border:none; border-bottom:1px solid var(--cloud);
  font-family:var(--sans); font-size:14px; color:var(--carbon); padding:12px 0; outline:none;
  transition:border-color .25s ease;
}
.contact-form input:focus, .contact-form textarea:focus{border-color:var(--carbon);}
.contact-form input::placeholder, .contact-form textarea::placeholder{color:var(--ash);}
.contact-form textarea{resize:vertical; min-height:100px;}
.contact-submit{
  align-self:flex-start; margin-top:8px;
  font-family:var(--sans); font-size:12px; letter-spacing:.1em; text-transform:uppercase;
  padding:14px 28px; border:1px solid var(--carbon); background:var(--carbon); color:var(--porcelain);
  cursor:pointer; transition:all .3s ease;
}
.contact-submit:hover{background:transparent; color:var(--carbon);}

.contact-confirm{display:none; padding:40px 0; max-width:520px;}
.contact-confirm.active{display:block;}
.contact-confirm-title{font-family:var(--serif); font-size:24px; color:var(--carbon); margin-bottom:12px;}
.contact-confirm-text{font-size:14px; color:var(--ash);}

@media (max-width: 860px){
  .contact-layout{grid-template-columns:1fr; gap:48px; padding:110px 24px 80px;}
  .contact-form-wrap{margin-top:0;}
  .contact-row{grid-template-columns:1fr;}
}

/* ---------- PROJECTS INDEX PAGE ---------- */
.page-header{padding:160px 48px 24px;}
/* Reference specifies different .page-intro sizing/spacing here than on the
   contact page; scoped to .page-header so the shared rule (and contact.php)
   is untouched. */
.page-header .page-intro{max-width:560px; margin-bottom:0;}
.projects-wrap{padding:20px 48px 140px;}
/* Reference also specifies a wider .projects-list gap (96px) here than the
   homepage teaser (72px) uses for the same shared class — scoped rather
   than changed globally, so the homepage's spacing is untouched. */
.projects-wrap .projects-list{gap:96px;}
/* Anchor targets for the scroll-filter links below — clears the fixed
   header (~96px tall) so the target row isn't hidden underneath it once
   scrolled into place. */
.project-row{scroll-margin-top:120px;}
.projects-filters{
  display:flex; flex-wrap:wrap; gap:28px;
  padding:32px 48px; border-top:1px solid var(--cloud); border-bottom:1px solid var(--cloud);
}
.filter-tag-disabled{cursor:not-allowed; opacity:.45;}
.filter-tag-disabled:hover{color:var(--ash); border-color:transparent;}

@media (max-width: 860px){
  .page-header{padding:110px 24px 40px;}
  .projects-wrap{padding:0 24px 80px;}
  .projects-filters{padding:20px 24px; gap:20px; margin-bottom: 24px;}
  .project-row{scroll-margin-top:90px;}
}

/* ---------- ARTISTS INDEX PAGE ---------- */
.artists-section{padding:0 48px 120px;}

@media (max-width: 860px){
  .artists-section{padding:0 24px 64px;}
}

/* ---------- LEGAL PAGES (Terms / Privacy / Accessibility) ---------- */
.legal-content{padding:0 48px 120px; max-width:820px;}
.legal-content h2{font-family:var(--serif); font-size:24px; color:var(--carbon); margin:48px 0 16px;}
.legal-content h2:first-child{margin-top:0;}
.legal-content p{font-size:15px; line-height:1.85; color:var(--ash); margin-bottom:20px;}
.legal-content p:last-child{margin-bottom:0;}
.legal-content a{color:var(--carbon); border-bottom:1px solid var(--cloud); transition:border-color .25s ease;}
.legal-content a:hover{border-color:var(--carbon);}
.legal-content ul{margin:0 0 20px; padding:0; list-style:none;}
.legal-content li{font-size:15px; line-height:1.85; color:var(--ash); margin-bottom:8px; padding-left:20px; position:relative;}
.legal-content li::before{content:'–'; position:absolute; left:0; color:var(--cloud);}
.legal-content li:last-child{margin-bottom:0;}

@media (max-width: 860px){
  .legal-content{padding:0 24px 64px;}
}

/* ---------- FLUENT FORMS OVERRIDES (contact page + inquiry modals) ----------
   fluentform-public-default (FF's own "skin" stylesheet) is dequeued in
   functions.php — fluent-form-styles (structural: spacing, error display)
   stays enqueued. Everything visual below replaces the skin from scratch,
   matching the exact input/textarea/button treatment the static markup
   used before Fluent Forms replaced it, right down to hiding field labels
   in favor of placeholder-only inputs, since that's what the original
   design already did. */
.contact-form-wrap fieldset,
.modal-right fieldset{
  display:grid; grid-template-columns:1fr 1fr; gap:20px;
}
.modal-right fieldset{gap:18px;}

.contact-form-wrap .ff-el-group,
.modal-right .ff-el-group{grid-column:1 / -1;}
/* Fluent Forms' own structural CSS sets .fluentform .ff-el-group{margin-bottom:20px}
   at the SAME specificity (0,2,0) as a plain ".contact-form-wrap .ff-el-group"/
   ".modal-right .ff-el-group" override, and its stylesheet prints after ours
   (it's enqueued lazily from inside the shortcode callback, confirmed via
   wp_print_styles() order) — so on a tie it silently wins, stacking an
   unwanted 20px under every field on top of the 18-20px grid gap already set
   above. Naming the real .fluentform ancestor here (0,3,0) is what actually
   wins the override, not just re-stating margin:0. */
.contact-form-wrap .fluentform .ff-el-group,
.modal-right .fluentform .ff-el-group{margin:0;}
.contact-form-wrap .ff-el-group:has(input[data-name="first_name"]),
.modal-right .ff-el-group:has(input[data-name="first_name"]){grid-column:1 / 2;}
.contact-form-wrap .ff-el-group:has(input[data-name="last_name"]),
.modal-right .ff-el-group:has(input[data-name="last_name"]){grid-column:2 / 3;}

/* Same specificity-tie issue as the .ff-el-group fix above:
   .fluentform .ff-el-input--label{display:inline-block; ...} is (0,2,0),
   identical to a plain ".contact-form-wrap .ff-el-input--label"/
   ".modal-right .ff-el-input--label" override, and FF's stylesheet prints
   after ours — so display:none was silently losing, leaving the label
   visible above each field alongside the placeholder (visible duplicate
   text). Naming .fluentform explicitly (0,3,0) wins the tie. Kept as a
   visually-hidden pattern rather than display:none, so the label stays in
   the accessibility tree for screen readers while being invisible on
   screen — the standard sr-only technique, not removal from the DOM. */
.contact-form-wrap .fluentform .ff-el-input--label,
.modal-right .fluentform .ff-el-input--label{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0;
}

.contact-form-wrap .ff-el-form-control,
.modal-right .ff-el-form-control{
  width:100%; background:transparent; border:none; border-bottom:1px solid var(--cloud); border-radius:0;
  font-family:var(--sans); font-size:14px; color:var(--carbon); padding:12px 0; outline:none;
  transition:border-color .25s ease; box-shadow:none;
}
.modal-right .ff-el-form-control{padding:10px 0;}
.contact-form-wrap .ff-el-form-control:focus,
.modal-right .ff-el-form-control:focus{border-color:var(--carbon); box-shadow:none;}
.contact-form-wrap .ff-el-form-control::placeholder,
.modal-right .ff-el-form-control::placeholder{color:var(--ash); opacity:1;}
.contact-form-wrap textarea.ff-el-form-control{min-height:100px; resize:vertical;}
/* height, not min-height: Fluent Forms renders <textarea rows="4">, and a
   rows=4 textarea's intrinsic content height (~89px with this font-size +
   padding) already exceeds 70px on its own, making min-height:70px a no-op.
   An explicit height caps it at the original design's size regardless of
   the rows attribute; resize:vertical still lets a visitor drag it taller. */
.modal-right textarea.ff-el-form-control{height:70px; resize:vertical;}

.contact-form-wrap .ff_submit_btn_wrapper,
.modal-right .ff_submit_btn_wrapper{margin-top:8px;}
/* Modal only (not the contact page, which isn't in a scrolling container):
   .modal-box already caps at max-height:88vh with overflow-y:auto, so at
   small window heights the form scrolls internally rather than the page —
   but the button itself just scrolled away with everything else. Pinning
   it to the bottom of that scroll area is a robust fallback regardless of
   how tight the field spacing ends up being on a given viewport. */
.modal-right .ff_submit_btn_wrapper{
  position:sticky; bottom:0; background:var(--porcelain); padding-top:8px; margin-top:0;
}
.contact-form-wrap .ff-btn-submit,
.modal-right .ff-btn-submit{
  display:inline-block;
  font-family:var(--sans); font-size:12px; letter-spacing:.1em; text-transform:uppercase;
  padding:14px 28px; border:1px solid var(--carbon); border-radius:0;
  background:var(--carbon); color:var(--porcelain);
  cursor:pointer; transition:all .3s ease;
}
.contact-form-wrap .ff-btn-submit:hover,
.modal-right .ff-btn-submit:hover{background:transparent; color:var(--carbon);}

.contact-form-wrap .text-danger,
.modal-right .text-danger{color:#c0392b; font-size:12px; margin-top:4px;}

@media (max-width: 720px){
  .modal-right fieldset{grid-template-columns:1fr;}
  .modal-right .ff-el-group:has(input[data-name="first_name"]),
  .modal-right .ff-el-group:has(input[data-name="last_name"]){grid-column:1 / -1;}
  /* Sticky footer button reads better on a tall desktop modal than on a
     near-full-screen mobile one — revert to normal in-flow here, no pinned
     background/border, just the plain button back where it was. */
  .modal-right .ff_submit_btn_wrapper{position:static; background:none; border:none; padding-top:0; margin-top:8px;}
  .modal-right .ff-btn-submit{width:100%; text-align:center; box-sizing:border-box;}
}
@media (max-width: 860px){
  .contact-form-wrap fieldset{grid-template-columns:1fr;}
  .contact-form-wrap .ff-el-group:has(input[data-name="first_name"]),
  .contact-form-wrap .ff-el-group:has(input[data-name="last_name"]){grid-column:1 / -1;}
  .contact-form-wrap .ff-btn-submit{width:100%; text-align:center; box-sizing:border-box;}
}

/* ---------- MOBILE FIXES (homepage) ----------
   Deliberately placed at the very end of the stylesheet, after every other
   rule in the file including general/desktop ones. .hero-cta, .btn,
   .section-head, .footer-bottom and .footer-legal are all defined near the
   top of this file — equal-specificity rules resolve by source order
   regardless of which media query wraps them, so a mobile override placed
   before its own general rule loses to that later general rule and gets
   silently overridden. This exact bug already happened once with a partial
   version of this fix. Only true end-of-file placement guarantees these
   actually win. */
@media (max-width: 860px){
  /* 1. Hero CTA buttons */
  .hero-cta{flex-direction:column; width:100%; gap:12px;}
  .btn{padding:12px 26px; width:100%; text-align:center; box-sizing:border-box;}

  /* 2. Section headers — .view-all is scoped to .section-head rather than
     applied bare: that class is also reused for inline text links elsewhere
     (artist bio "Voir le profil", hover-card links, footer-adjacent social
     links on other templates) where a full-width centered button would be
     wrong. Scoping to .section-head .view-all still covers all four
     section-head buttons on this page (Œuvres, Artistes, Projets,
     Fondatrice) since they all share the same markup pattern. */
  .section-head{flex-direction:column; align-items:flex-start; gap:20px;}
  .section-head .view-all{width:100%; text-align:center; box-sizing:border-box; padding:12px 22px;}

  /* 3. Footer bottom bar — the copyright line has no class in the markup
     (it's a bare <span> inside .footer-bottom), so it's targeted directly
     rather than via a .footer-bottom-copyright class that doesn't exist. */
  .footer-bottom{flex-direction:column; gap:16px; text-align:center;}
  .footer-legal{flex-wrap:wrap; justify-content:center;}
}

/* ---------- SCROLL FADE-IN (homepage only, IntersectionObserver-driven — see main.js) ----------
   Classes are added/removed entirely by JS, never present in the PHP markup,
   so prefers-reduced-motion / no-JS visitors simply see normal full-opacity
   content — this CSS block only ever matters for the specific visitors JS
   opts in. The @media block below is a defensive fallback only. */
.kechad-fade-in{
  opacity:0; transform:translateY(44px);
  transition:opacity .65s ease-out, transform .65s ease-out;
}
.kechad-fade-in.kechad-visible{opacity:1; transform:translateY(0);}

.kechad-img-fade{opacity:0; transition:opacity .5s ease-out;}
.kechad-img-fade.kechad-img-loaded{opacity:1;}

@media (prefers-reduced-motion: reduce){
  .kechad-fade-in{opacity:1; transform:none; transition:none;}
  .kechad-img-fade{opacity:1; transition:none;}
}

/* ---------- PRELOADER (homepage only, first session visit — see the
   inline skip-check script right after this markup in front-page.php,
   and the animation sequence in main.js) ---------- */
.kechad-preloader{
  position:fixed; inset:0; z-index:9999;
  background:#FFFFFF;
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:28px;
  transition:opacity .6s cubic-bezier(.4,0,.2,1);
}
.kechad-preloader.kechad-preloader-fade-out{opacity:0; pointer-events:none;}
/* The real wordmark (same path data as header/footer), not a text
   rendering — sized for a full-screen preloader and filled dark against
   the white overlay background. */
.kechad-preloader-logo{width:min(70vw, 340px); height:auto; fill:var(--carbon);}
/* Opacity + a small lift together (not opacity alone), eased with the same
   curve as .kechad-preloader/the carousel elsewhere — reads noticeably
   smoother than a flat fade at this speed. */
.kechad-preloader-letter{
  opacity:0; transform:translateY(6px);
  transition:opacity .26s cubic-bezier(.4,0,.2,1), transform .26s cubic-bezier(.4,0,.2,1);
}
.kechad-preloader-letter.visible{opacity:1; transform:translateY(0);}
/* Second phase, after the wordmark holds — same fade+lift idea as the
   letters above, but slower/gentler per word (see KECHAD_WORD_TRANSITION
   in main.js, which this duration must match) since this is prose, not a
   4-letter-a-beat wordmark. Dark on white, same as the logo, unlike
   .hero-line's white-on-photo treatment — this is a different backdrop. */
.kechad-preloader-tagline{
  font-family:var(--serif); font-size:clamp(18px,2.2vw,26px); color:var(--carbon);
  text-align:center; margin:0;
}
.kechad-preloader-word{
  display:inline-block; opacity:0; transform:translateY(6px);
  transition:opacity .38s cubic-bezier(.4,0,.2,1), transform .38s cubic-bezier(.4,0,.2,1);
}
.kechad-preloader-word.visible{opacity:1; transform:translateY(0);}

@media (prefers-reduced-motion: reduce){
  .kechad-preloader{display:none !important;}
}
