/* ==========================================================================
   RASA Public — design tokens + reset + shared components
   Tokens sourced verbatim from the claude.ai/design canvas (RASA.dc.html).
   No CDN. No @import http(s). All fonts self-hosted via fonts.css.
   ========================================================================== */

:root {
  /* Palette Day (default) */
  --paper:       #FAF9F5;
  --paper2:      #EFE8DB;
  --card:        #FBF8F2;
  /* Result-card fill (op 2026-07-07) : a very light beige, LIGHTER than the
     comparables card fill (--paper2 #EFE8DB) yet warm enough to read as a card.
     --card-result-2 is the lighter end of the card's lightening gradient. */
  --card-result:  #F7F1E7;
  --card-result-2: #F9F4EA;
  /* Same-object badge text (op 2026-07-07) : a sober, desaturated forest green
     (NOT neon) — reads on the light beige card. */
  --badge-green: #4E7A3A;
  --ink:         #1A1611;
  --inksoft:     #4A423A;
  --line:        #D8CDBA;
  --gold:        #967736;
  --gold-accent: #C9A24B;
  --logo-gold:   #B8923F;

  /* Nav header colour — switchable live via ?nav=ink|paper|bordeaux */
  --nav-bg:      #b10c0c;
  --nav-fg:      #ffffff;
  --nav-line:    rgba(255,255,255,.32);
  --nav-fg-dim:  rgba(255,255,255,.7);

  /* Type */
  --font-serif: 'Bodoni Moda', 'Bodoni Moda Fallback', Georgia, serif;
  --font-sans:  'Libre Franklin', 'Libre Franklin Fallback', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --font-mono:  'IBM Plex Mono', 'IBM Plex Mono Fallback', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

  /* Radii + shadows (parsimonious) */
  --shadow-lot:  0 18px 50px -34px rgba(0,0,0,.4);
  --shadow-thumb:0 10px 26px -20px rgba(0,0,0,.5);

  /* Widths */
  --content-max: 1500px;
  --content-pad: 30px;
  --facet-rail:  268px;
  --nav-height:  70px;
}

/* Night variant — via `data-theme="night"` on <html>. */
html[data-theme="night"] {
  --paper:       #0E0C0D;
  --paper2:      #14100F;
  --card:        #17130F;
  --card-result:  #1A1511;
  --card-result-2: #221C16;
  --badge-green: #86AE64;
  --ink:         #ECE3D4;
  --inksoft:     #B0A896;
  --line:        #302A22;
  --gold:        #B4914E;
  --gold-accent: #D2A85A;
  --nav-bg:      #0E0C0D;
  --nav-fg:      #ECE3D4;
  --nav-line:    rgba(236,227,212,.28);
  --nav-fg-dim:  rgba(236,227,212,.68);
}

/* Nav-colour presets (switchable via body attr for A/B) */
html[data-nav="ink"]      { --nav-bg: #1A1611; }
html[data-nav="paper"]    { --nav-bg: #F4EFE6; --nav-fg: #1A1611; --nav-line: #D8CDBA; --nav-fg-dim: rgba(26,22,17,.6); }
html[data-nav="bordeaux"] { --nav-bg: #b10c0c; }

/* ==========================================================================
   Reset
   ========================================================================== */
* { box-sizing: border-box; }
html, body { margin: 0; background: var(--paper); color: var(--ink); font-family: var(--font-sans); }
body { min-height: 100vh; }
/* Contain overscroll bounce so scrolling past the top or bottom doesn't
   momentarily reveal content sliding into the 25 px interstice between the
   nav and the sticky lot header (bounce briefly pushes content past its
   fixed-position mask). */
html { overscroll-behavior-y: none; }
/* Contain the off-canvas nav drawer's translateX(100%) so a closed drawer
   never adds phantom horizontal scroll. `clip` (not `hidden`) does NOT create a
   scroll container, so `position: sticky` in page content keeps working. */
html, body { overflow-x: clip; }
body { overscroll-behavior-y: none; }
::selection { background: var(--gold); color: var(--paper); }
img, svg { display: block; }
button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }
input, select, textarea { font: inherit; color: inherit; }
a { color: inherit; }

/* Scrollbar */
::-webkit-scrollbar { width: 11px; height: 11px; }
::-webkit-scrollbar-thumb { background: var(--paper2); border: 3px solid var(--paper); }

/* Skip-to-content (a11y) */
.skip-link { position: absolute; left: -9999px; top: 0; padding: 8px 14px; background: var(--ink); color: var(--paper); z-index: 1000; }
.skip-link:focus { left: 12px; top: 12px; }

/* ==========================================================================
   Utility text
   ========================================================================== */
.mono { font-family: var(--font-mono); font-feature-settings: 'tnum' 1; }
.serif { font-family: var(--font-serif); }
.italic { font-style: italic; }
/* Tabular numerals + widened thousand separator (~+15% of a normal space)
   for readability of grouped digits like `79 737 €`. */
.tnum { font-feature-settings: 'tnum' 1; word-spacing: 0.04em; }

/* ± step buttons flanking the range-slider number inputs (10k € per click) */
.rasa-stepbtn {
  width: 20px; height: 34px; flex: none;
  background: none; border: 1px solid var(--line);
  color: var(--inksoft); font-size: 14px; line-height: 1;
  cursor: pointer; padding: 0;
}
.rasa-stepbtn:hover { border-color: var(--inksoft); color: var(--ink); }
.eyebrow { font-size: 11px; letter-spacing: .2em; text-transform: uppercase; color: var(--inksoft); font-weight: 600; }
.eyebrow-gold { color: var(--gold); }

/* ==========================================================================
   NAV
   ========================================================================== */
.rasa-nav {
  position: sticky; top: 0; z-index: 60;
  background: var(--nav-bg); color: var(--nav-fg);
  border-bottom: 1px solid var(--line);
  height: var(--nav-height);
}
.rasa-nav__inner {
  max-width: none; margin: 0; padding: 0 40px;
  height: var(--nav-height); display: flex; align-items: center; gap: 34px;
}
.rasa-nav__brand {
  display: flex; align-items: center; gap: 13px;
  text-decoration: none; color: var(--nav-fg);
}
.rasa-nav__brand-word {
  font-family: var(--font-serif); font-weight: 600; font-size: 24px;
  line-height: 1; letter-spacing: .2em; padding-left: .2em;
}
.rasa-nav__links { display: flex; align-items: stretch; height: var(--nav-height); gap: 0; }
.rasa-nav__link {
  display: flex; align-items: center; padding: 0 18px;
  font-size: 13px; letter-spacing: .04em;
  color: var(--nav-fg); opacity: .82; text-decoration: none;
  border-bottom: 2px solid transparent;
}
.rasa-nav__link:hover, .rasa-nav__link.is-active { opacity: 1; border-bottom-color: var(--gold-accent); }

.rasa-nav__right { margin-left: auto; display: flex; align-items: center; gap: 8px; }

.rasa-nav__search {
  display: flex; align-items: center; height: 38px;
  background: rgba(255,255,255,.07); border: 1px solid var(--nav-line);
}
.rasa-nav__search:hover,
.rasa-nav__search:focus-within { border-color: var(--nav-fg); }
.rasa-nav__search-btn {
  display: flex; align-items: center; gap: 10px; height: 100%;
  padding: 0 14px 0 13px; color: var(--nav-fg); text-decoration: none;
  font-size: 13px; min-width: 168px;
}
.rasa-nav__search-form {
  display: flex; align-items: center; gap: 9px; height: 100%;
  padding: 0 12px 0 13px; min-width: 168px;
}
.rasa-nav__search-ico { font-size: 14px; line-height: 1; color: var(--nav-fg); flex: none; }
.rasa-nav__search-input {
  flex: 1 1 auto; min-width: 0; height: 100%;
  background: none; border: none; outline: none;
  color: var(--nav-fg); font-size: 13px; font-family: inherit; letter-spacing: inherit;
}
.rasa-nav__search-input::placeholder { color: var(--nav-fg-dim); opacity: 1; }
/* Safari search-input chrome (cancel button / inner decorations) removed. */
.rasa-nav__search-input::-webkit-search-decoration,
.rasa-nav__search-input::-webkit-search-cancel-button { -webkit-appearance: none; }
.rasa-nav__search-sep { width: 1px; height: 20px; background: var(--nav-line); flex: none; }
.rasa-nav__search-img {
  width: 38px; height: 100%; display: flex; align-items: center; justify-content: center;
  color: var(--nav-fg-dim);
}
.rasa-nav__search-img:hover { color: var(--nav-fg); }

.rasa-nav__cta {
  display: flex; align-items: center; gap: 9px; height: 38px; padding: 0 12px;
  color: var(--nav-fg); text-decoration: none; font-size: 13px;
}
.rasa-nav__cta:hover { color: var(--gold-accent); }
.rasa-nav__cta-count { font-family: var(--font-mono); font-size: 12px; color: var(--nav-fg-dim); font-weight: 600; }

.rasa-nav__avatar {
  width: 38px; height: 38px; border-radius: 50%;
  color: #5c5850; background: #e3dacc;
  border: 1px solid rgba(255,255,255,.14);
  display: flex; align-items: center; justify-content: center;
  font-size: 10px; letter-spacing: .04em; font-weight: 300; margin-left: 18px;
  text-decoration: none;
}
.rasa-nav__lang {
  display: inline-flex; margin-right: 4px;
  border: 1px solid var(--nav-line); height: 26px; align-items: stretch;
}
.rasa-nav__lang-btn { padding: 0 8px; font-size: 11px; letter-spacing: .06em; color: var(--nav-fg-dim); background: none; text-transform: uppercase; }
.rasa-nav__lang-btn.is-active { color: var(--nav-fg); background: rgba(255,255,255,.09); }

/* Mobile burger + off-canvas drawer — hidden on desktop, revealed ≤899px. */
.rasa-nav__burger { display: none; flex-direction: column; justify-content: center;
  gap: 4px; width: 40px; height: 34px; margin-left: 4px; padding: 0 8px;
  background: none; border: 0; cursor: pointer; flex: none; }
.rasa-nav__burger-bar { display: block; height: 2px; width: 22px; background: var(--nav-fg); }
/* z88/z89 (op 2026-07-28) — AU-DESSUS du bandeau de sélection (z80).
   Mesuré : le bandeau peignait par-dessus le tiroir, et « Se déconnecter »,
   placé en dernier exprès, finissait à 781px alors que le bandeau commence à
   763 — inatteignable, caché dessous. Le tiroir ouvert est une surface
   MODALE : rien ne doit flotter dessus. Reste sous le sélecteur de dossier
   (95) et la visionneuse (100), qui ne coexistent pas avec lui. */
.rasa-nav__overlay { position: fixed; inset: 0; z-index: 88;
  background: rgba(20,16,10,.42); opacity: 0; pointer-events: none;
  transition: opacity .22s ease; }
.rasa-nav__drawer { position: fixed; top: 0; right: 0; z-index: 89;
  width: min(78vw, 320px); height: 100%; overflow-y: auto;
  /* Coupe le CHAÎNAGE du défilement : arrivé en butée (ou quand le contenu
     tient dans la hauteur, cas le plus fréquent), le geste partait faire
     défiler la page derrière — « tantôt le menu, tantôt la page ». Le verrou
     `position: fixed` du body (rasa.js bindNavDrawer) traite l'autre moitié
     du problème, `body { overflow: hidden }` seul étant sans effet au doigt
     sur Safari iOS. */
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
  background: var(--paper); border-left: 1px solid var(--line);
  box-shadow: -18px 0 50px -30px rgba(0,0,0,.5);
  padding: calc(var(--nav-height) + 8px) 22px 28px;
  display: flex; flex-direction: column; gap: 2px;
  transform: translateX(100%); transition: transform .24s ease;
  visibility: hidden; }
.rasa-nav__drawer-link { display: flex; align-items: center; gap: 8px;
  padding: 13px 2px; font-family: var(--font-serif); font-size: 17px;
  color: var(--ink); text-decoration: none; border-bottom: 1px solid var(--line-faint, var(--line)); }
.rasa-nav__drawer-link.is-active { color: var(--gold); }
.rasa-nav__drawer-row { display: flex; gap: 18px; }
.rasa-nav__drawer-row .rasa-nav__drawer-link { border-bottom: 0; }
.rasa-nav__drawer-sep { height: 1px; background: var(--line); margin: 10px 0; }
.rasa-nav__drawer .rasa-nav__lang { margin: 6px 0 0; }
body.rasa-nav-open .rasa-nav__overlay { opacity: 1; pointer-events: auto; }
body.rasa-nav-open .rasa-nav__drawer { transform: translateX(0); visibility: visible; }
body.rasa-nav-open { overflow: hidden; }

/* ==========================================================================
   Layout containers
   ========================================================================== */
.rasa-container { max-width: var(--content-max); margin: 0 auto; padding: 0 var(--content-pad); }
.rasa-section { padding: 28px var(--content-pad) 0; }
.rasa-page-title { font-family: var(--font-serif); font-weight: 500; font-size: 38px; line-height: 1; color: var(--ink); margin: 0; }

/* ==========================================================================
   Buttons + chips
   ========================================================================== */
.rasa-btn { display: inline-flex; align-items: center; gap: 9px; height: 42px; padding: 0 22px;
  border: 1px solid var(--ink); color: var(--ink); background: none; font-size: 13px; letter-spacing: .02em;
  text-decoration: none; }
.rasa-btn:hover { background: var(--paper2); }
.rasa-btn--primary { background: var(--ink); color: var(--paper); border: none; }
.rasa-btn--primary:hover { background: var(--gold); color: var(--paper); }
.rasa-btn--gold { background: var(--gold); color: var(--paper); border: none; }
.rasa-btn--gold:hover { background: var(--ink); }

/* Compare-toggle button : alternate label + subdued state when the item is
   already in the cart. Any button carrying `data-rasa-select-key` opts in. */
.rasa-btn[data-rasa-select-key] .cmp-label-remove { display: none; }
.rasa-btn[data-rasa-select-key].is-on { background: var(--inksoft); color: var(--paper); }
.rasa-btn[data-rasa-select-key].is-on:hover { background: var(--ink); }
.rasa-btn[data-rasa-select-key].is-on .cmp-label-add    { display: none; }
.rasa-btn[data-rasa-select-key].is-on .cmp-label-remove { display: inline; }
.rasa-btn[data-rasa-select-key].is-on .cmp-icon { transform: rotate(180deg); }
.cmp-icon { display: inline-block; transition: transform .15s ease; }
.rasa-btn--ghost { background: none; border: 1px solid var(--line); }
.rasa-btn--ghost:hover { border-color: var(--ink); }
.rasa-btn--tall { height: 50px; padding: 0 30px; font-size: 14px; }

.rasa-chip {
  display: inline-flex; align-items: center; gap: 9px; height: 30px; padding: 0 8px 0 12px;
  background: var(--ink); color: var(--paper); font-size: 12px;
}
.rasa-chip__facet { opacity: .6; font-size: 10px; letter-spacing: .08em; text-transform: uppercase; }
.rasa-chip__x { opacity: .7; font-size: 13px; }

/* ==========================================================================
   Facet rail (Explore) — 268px sticky
   ========================================================================== */
/* Explore layout : full-bleed grid — the rail always hugs the LEFT viewport
   edge, results fill everything else. No artificial max-width so cards
   always fill the available space (no dead space on wide screens). */
.rasa-container:has(> .rasa-explore) { max-width: none; padding: 0; margin: 0; }

.rasa-explore {
  display: grid;
  grid-template-columns: var(--facet-rail) minmax(0, 1fr);
  gap: 0;
  align-items: start;
}
.rasa-facet-rail {
  border-right: 1px solid var(--line);
  padding: 28px 26px 64px 30px;
  position: sticky; top: var(--nav-height);
  /* --searchhead-h : published by rasa.js bindSearchHead on /search/keyword only
     (the sticky parameters band) — 0px anywhere else, so the rail never slides
     under that band. */
  max-height: calc(100vh - var(--nav-height) - var(--searchhead-h, 0px));
  overflow-y: auto; overflow-x: visible;
  /* Arrivé au bout du rail, le geste partait faire défiler la page entière
     d'un coup (« saut » signalé après un passage dans les filtres). */
  overscroll-behavior-y: contain;
  box-sizing: border-box;
}
.rasa-facet-rail::-webkit-scrollbar { width: 6px; }
.rasa-facet-rail::-webkit-scrollbar-thumb { background: var(--paper2); border: none; }
.rasa-facet-rail__head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 4px; }
.rasa-facet-group { border-top: 1px solid var(--line); padding: 15px 0 14px; }
.rasa-facet-group__toggle { width: 100%; display: flex; align-items: center; justify-content: space-between; }
.rasa-facet-group__label { font-size: 12.5px; letter-spacing: .04em; color: var(--ink); font-weight: 600; }
.rasa-facet-group__body { margin-top: 13px; }
.rasa-facet-group[data-closed="1"] .rasa-facet-group__body { display: none; }
.rasa-facet-opt { width: 100%; display: flex; align-items: center; gap: 9px; padding: 5px 0; text-align: left; }
.rasa-facet-opt:hover { opacity: .72; }
.rasa-facet-opt__label { font-size: 13px; color: var(--ink); flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rasa-facet-opt__count { font-family: var(--font-mono); font-size: 12px; color: var(--inksoft); }
.rasa-check { width: 15px; height: 15px; border: 1px solid var(--ink); background: none; display: inline-flex; align-items: center; justify-content: center; font-size: 10px; flex: none; }
.rasa-check.is-on { background: var(--ink); color: var(--paper); }

/* Facet range slider */
.rasa-range { height: 3px; background: var(--line); position: relative; margin: 18px 4px 14px; }
.rasa-range__fill { position: absolute; height: 3px; background: var(--gold); }
.rasa-range__handle { position: absolute; width: 13px; height: 13px; border-radius: 50%; background: var(--paper); border: 1.5px solid var(--ink); top: 50%; transform: translate(-50%, -50%); }

/* Dual-thumb range slider (min + max on one track). */
.rasa-dslider { position: relative; padding: 24px 6px 10px; }
.rasa-dslider__track { position: relative; height: 3px; background: var(--line); }
.rasa-dslider__fill  { position: absolute; height: 3px; background: var(--gold); }
.rasa-dslider__lo, .rasa-dslider__hi {
  position: absolute; left: -6px; right: -6px; width: calc(100% + 12px);
  top: -8px; height: 20px;
  -webkit-appearance: none; appearance: none;
  background: transparent; pointer-events: none;
  margin: 0; padding: 0;
}
.rasa-dslider__lo::-webkit-slider-thumb, .rasa-dslider__hi::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none;
  width: 15px; height: 15px; border-radius: 50%;
  background: var(--paper); border: 1.5px solid var(--ink);
  cursor: pointer; pointer-events: auto;
}
.rasa-dslider__lo::-moz-range-thumb, .rasa-dslider__hi::-moz-range-thumb {
  width: 15px; height: 15px; border-radius: 50%;
  background: var(--paper); border: 1.5px solid var(--ink);
  cursor: pointer; pointer-events: auto;
}
.rasa-dslider__lo::-webkit-slider-runnable-track,
.rasa-dslider__hi::-webkit-slider-runnable-track { background: transparent; }
.rasa-dslider__vals { display: flex; justify-content: space-between; margin-top: 8px; font-family: var(--font-mono); font-size: 11px; color: var(--inksoft); font-feature-settings: 'tnum' 1; }
.rasa-dslider__hint { font-size: 10px; color: var(--inksoft); opacity: .7; margin-top: 4px; text-align: center; }

/* Autocomplete input */
.rasa-input {
  width: 100%; height: 34px; padding: 0 11px;
  background: var(--card); border: 1px solid var(--line); font-size: 13px; color: var(--ink);
  outline: none;
}
.rasa-input:focus { border-color: var(--ink); background: var(--paper); }

/* ==========================================================================
   Results header + sort + view mode selector
   ========================================================================== */
.rasa-results {
  padding: 28px 30px 0;
  min-height: 80vh;
  min-width: 0;
}
/* Pinned header : keeps eyebrow + h1 + tools + chips visible under the nav. */
.rasa-results__pinned {
  position: sticky;
  top: var(--nav-height);
  background: var(--paper);
  z-index: 10;
  padding-top: 28px; margin-top: -28px;
  padding-bottom: 12px;
}
.rasa-results__head { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; flex-wrap: wrap; }
.rasa-results__tools { display: flex; align-items: center; gap: 18px; padding-bottom: 4px; }
.rasa-sort .rasa-sort__menu { display: none; }
.rasa-sort.is-open .rasa-sort__menu { display: block !important; }
.rasa-sort__menu a:hover { background: var(--paper2); }

.rasa-viewmodes { display: flex; border: 1px solid var(--line); }
.rasa-viewmodes__btn { width: 36px; height: 34px; display: flex; align-items: center; justify-content: center; color: var(--inksoft); font-size: 16px; }
.rasa-viewmodes__btn.is-active { background: var(--ink); color: var(--paper); }
.rasa-viewmodes__btn:hover { color: var(--ink); }

/* Sticky search parameters (op 2026-07-08, v2 PROGRESSIVE) — /search/keyword.
   rasa.js bindSearchHead drives --shrink from 0 (top of page) to 1 over the
   first scroll range (rAF-throttled) ; every dimension below interpolates via
   calc(), so the scroll literally compresses the band instead of snapping it.
   The title/tabs live OUTSIDE the band (template) and get pushed up with the
   page ; the results summary stays visible at all times. */
.rasa-searchhead {
  position: sticky; top: var(--nav-height); z-index: 40;
  background: var(--paper);
  padding-top: calc(22px - 12px * var(--shrink, 0));
  padding-bottom: calc(16px - 6px * var(--shrink, 0));
  /* Slot effect : shadow fades in with the shrink, clipped to the BOTTOM edge
     only (no lateral shadows) — the band reads as a slit the results slide
     under, not a floating card. */
  box-shadow: 0 10px 22px -16px rgba(0, 0, 0, calc(.45 * var(--shrink, 0)));
  clip-path: inset(0 0 -30px 0);
}
/* Query field shrinks progressively (overrides the inline height/font-size). */
.rasa-searchhead #kwsearch input[name="q"] {
  height: calc(56px - 14px * var(--shrink, 0)) !important;
  font-size: calc(19px - 3px * var(--shrink, 0)) !important;
}
.rasa-searchhead .rasa-corpus-chips { margin-top: calc(14px - 5px * var(--shrink, 0)); }
/* Disclaimer folds away progressively (height + fade). */
.rasa-searchhead .rasa-searchhead__note {
  overflow: hidden;
  max-height: calc(30px * (1 - var(--shrink, 0)));
  opacity: calc(1 - 1.4 * var(--shrink, 0));
  margin-top: calc(14px * (1 - var(--shrink, 0)));
}
/* Results summary is ALWAYS visible in the band (op 2026-07-08 v2). */
.rasa-searchhead .rasa-searchhead__summary { display: block; }

/* Keyword-search corpus toggles (op 2026-07-06) : check one or several. */
.rasa-corpus-chips { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin-top: 14px; }
.rasa-corpus-chip {
  display: inline-flex; align-items: center; gap: 7px; height: 32px; padding: 0 14px;
  border: 1px solid var(--line); color: var(--inksoft); background: var(--card);
  font-size: 12.5px; letter-spacing: .02em; cursor: pointer; user-select: none;
}
.rasa-corpus-chip:hover { border-color: var(--ink); color: var(--ink); }
/* On-state : server `.is-on` is the socle ; `:has(:checked)` makes the click feel
   instant (before the auto-submit reload). */
.rasa-corpus-chip.is-on,
.rasa-corpus-chip:has(input:checked) { border-color: var(--ink); background: var(--ink); color: var(--paper); }
/* The native checkbox drives state (form submit) but is visually replaced by the chip. */
.rasa-corpus-chip input { position: absolute; opacity: 0; width: 0; height: 0; }
/* Per-corpus result count on a checked chip (op 2026-07-08). Inherits the chip's
   text colour (ink, or paper when the chip is on). */
.rasa-corpus-chip__count { font-size: 10.5px; opacity: .68; margin-left: 3px; }
.rasa-corpus-chip::before {
  content: ""; width: 12px; height: 12px; border: 1px solid currentColor; flex: none;
  display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box;
}
/* Checked chip : the square carries an actual ✓ (op 2026-07-08), ink on paper. */
.rasa-corpus-chip.is-on::before,
.rasa-corpus-chip:has(input:checked)::before {
  content: "✓"; background: var(--paper); border-color: var(--paper);
  color: var(--ink); font-size: 10px; line-height: 1; font-weight: 700;
}
/* « Tous » — an elegant link-chip (no checkbox square) : small caps, gold accent
   on hover ; is-on (every corpus selected) inherits the dark chip look. */
.rasa-corpus-chip--all { text-decoration: none; }
.rasa-corpus-chip--all::before { content: none !important; }
.rasa-corpus-chip--all span { font-size: 10.5px; letter-spacing: .14em; text-transform: uppercase; }
.rasa-corpus-chip--all:hover { border-color: var(--gold); color: var(--gold); }
.rasa-corpus-chip--all.is-on:hover { color: var(--paper); border-color: var(--ink); }
.rasa-corpus-chip input:focus-visible + span { text-decoration: underline; }
/* Opt-in to show image-less results (op 2026-07-06). */
.rasa-noimg-toggle {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  margin-top: 12px; font-size: 12px; color: var(--inksoft); cursor: pointer; user-select: none;
}
.rasa-noimg-toggle:hover { color: var(--ink); }
.rasa-noimg-toggle input { width: 14px; height: 14px; accent-color: var(--ink); cursor: pointer; }
/* Sort + filter controls row under the search box (op 2026-07-06). */
.rasa-search-controls { display: flex; align-items: center; justify-content: center; gap: 24px; flex-wrap: wrap; margin-top: 14px; }
.rasa-search-controls .rasa-noimg-toggle { margin-top: 0; }
/* Same opt-in as a link toggle in the museum browse tools row (op 2026-07-07). */
.rasa-results__tools .rasa-noimg-toggle { margin-top: 0; text-decoration: none; white-space: nowrap; }
.rasa-sort { display: inline-flex; align-items: center; gap: 8px; font-size: 12px; color: var(--inksoft); }
.rasa-sort > span { letter-spacing: .1em; text-transform: uppercase; }
.rasa-sort select { height: 30px; padding: 0 12px; border: 1px solid var(--line); background: var(--card); color: var(--ink); font-size: 12.5px; cursor: pointer; }
.rasa-sort select:hover { border-color: var(--ink); }
/* Per-corpus facet rail on the keyword results (op 2026-07-06, Phase 1). */
.rasa-search-sec.has-rail { display: grid; grid-template-columns: 216px 1fr; gap: 32px; align-items: start; }
.rasa-search-sec.has-rail .rasa-search-sec__head { grid-column: 1 / -1; }
.rasa-facet-rail { position: sticky; top: calc(var(--nav-height) + var(--searchhead-h, 0px) + 14px); }
.rasa-facet { margin-bottom: 22px; }
/* Category headers pin at the top of the SCROLLING rail while their values
   scroll (op 2026-07-08) — each label sticks within its own .rasa-facet block,
   so consecutive labels hand over naturally. Used only by /search/keyword. */
.rasa-facet__label { font-size: 11px; letter-spacing: .12em; text-transform: uppercase; color: var(--ink); font-weight: 600; margin-bottom: 9px; position: sticky; top: 0; z-index: 2; background: var(--paper); padding: 4px 0; }
.rasa-facet__val { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--inksoft); cursor: pointer; padding: 2px 0; }
.rasa-facet__val:hover { color: var(--ink); }
.rasa-facet__val.is-on { color: var(--ink); }
.rasa-facet__val input { position: absolute; opacity: 0; width: 0; height: 0; }
.rasa-facet__val::before { content: ""; width: 11px; height: 11px; border: 1px solid var(--line); flex: none; box-sizing: border-box; }
.rasa-facet__val.is-on::before { background: var(--ink); border-color: var(--ink); }
.rasa-facet__v { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rasa-facet__c { flex: none; font-size: 11px; color: var(--inksoft); }
/* Unified left rail in multi-corpus mode (op 2026-07-06) : one filter panel for all
   selected corpora, sub-grouped by corpus, with the result sections stacked right. */
.rasa-multi.has-rail { display: grid; grid-template-columns: 216px 1fr; gap: 32px; align-items: start; }
.rasa-facet-rail--global { position: sticky; top: calc(var(--nav-height) + var(--searchhead-h, 0px) + 14px); }
.rasa-facet-rail__title { font-size: 11px; letter-spacing: .12em; text-transform: uppercase; color: var(--inksoft); font-weight: 600; margin-bottom: 16px; }
.rasa-facet-corpus { margin-bottom: 24px; }
.rasa-facet-corpus__head { font-size: 12px; letter-spacing: .04em; color: var(--ink); font-weight: 700; margin-bottom: 13px; padding-bottom: 6px; border-bottom: 1px solid var(--line); }
@media (max-width: 900px) {
  .rasa-search-sec.has-rail { grid-template-columns: 1fr; }
  .rasa-facet-rail { position: static; margin-bottom: 24px; }
  .rasa-multi.has-rail { grid-template-columns: 1fr; }
  .rasa-facet-rail--global { position: static; margin-bottom: 24px; }
}

/* ==========================================================================
   Card / Grid item
   ========================================================================== */
.rasa-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(317px, 1fr)); gap: 47px 34px; }
/* Whole-card lightening gradient (op 2026-07-07, inverted) : a single continuous
   gradient over the card — lighter beige at top → deeper beige at bottom. The image
   box is transparent (below) so the gradient shows through the letterbox = one surface. */
.rasa-card { display: flex; flex-direction: column; padding-bottom: 12px;
  background: linear-gradient(160deg, var(--card-result-2) 0%, var(--card-result) 100%); }
.rasa-card__img {
  position: relative; aspect-ratio: 4/5;
  /* Transparent so the card's lightening gradient shows through the letterbox
     (object-fit:contain) — one continuous surface across the whole card. */
  background: transparent;
  display: flex; align-items: center; justify-content: center; overflow: hidden;
}
.rasa-card__img img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }
.rasa-card__glyph { font-family: var(--font-serif); font-style: italic; font-size: 21px; color: var(--ink); opacity: .28; text-align: center; padding: 14px; }
.rasa-card__cap { font-family: var(--font-mono); font-size: 9.5px; letter-spacing: .1em; color: var(--inksoft); margin-top: 9px; }
.rasa-card__actions {
  position: absolute; top: 8px; right: 8px;
  display: flex; gap: 6px; z-index: 2;
  opacity: 0; pointer-events: none;
  transition: opacity .15s ease;
}
.rasa-card__img:hover .rasa-card__actions,
.rasa-card__actions:focus-within { opacity: 1; pointer-events: auto; }
.rasa-card__act {
  width: 32px; height: 32px; display: flex; align-items: center; justify-content: center;
  background: var(--paper); border: 1px solid var(--ink); color: var(--ink); font-size: 14px;
}
.rasa-card__select {
  position: absolute; top: 8px; left: 8px; z-index: 2;
  width: 22px; height: 22px; background: var(--paper); border: 1px solid var(--ink);
  display: flex; align-items: center; justify-content: center; font-size: 12px;
  opacity: 0; pointer-events: none;
  transition: opacity .15s ease;
}
/* Visible when the card is hovered OR the item is already picked
   (the .is-on indicator must always show its state). The comparable tiles
   (.rasa-cmpcard__img) reuse the same overlay. */
.rasa-card__img:hover .rasa-card__select,
.rasa-cmpcard__img:hover .rasa-card__select,
.rasa-card__select.is-on,
.rasa-card__select:focus-visible { opacity: 1; pointer-events: auto; }
.rasa-card__select.is-on { background: var(--gold); color: var(--paper); border-color: var(--gold); }
/* Quick-compare badge on comparable tiles (op 2026-07-05 v2) — mirrors the
   ✓ overlay but top-RIGHT, revealed on hover of the WHOLE card. Clicking it
   opens the 1-vs-1 duo pop-up (bindDuo) ; clicking anywhere else on the
   card navigates to the object page. */
.rasa-cmpcard__duo {
  position: absolute; top: 8px; right: 8px; z-index: 2;
  width: 22px; height: 22px; background: var(--paper); border: 1px solid var(--ink);
  display: flex; align-items: center; justify-content: center;
  font-size: 13px; line-height: 1; color: var(--ink); cursor: pointer;
  opacity: 0; pointer-events: none;
  transition: opacity .15s ease;
}
.rasa-cmpcard:hover .rasa-cmpcard__duo,
.rasa-cmpcard__duo:focus-visible { opacity: 1; pointer-events: auto; }
.rasa-cmpcard__duo:hover { background: var(--gold); color: var(--paper); border-color: var(--gold); }

/* ★ favori sur la carte comparable (op 2026-07-10) — empilé sous le badge ⇄.
   Révélé au hover comme lui ; PERSISTANT quand l'objet est favorisé. */
.rasa-cmpcard__fav {
  position: absolute; top: 36px; right: 8px; z-index: 2;
  width: 22px; height: 22px; background: var(--paper); border: 1px solid var(--ink);
  display: flex; align-items: center; justify-content: center;
  font-size: 13px; line-height: 1; color: var(--ink); cursor: pointer;
  opacity: 0; pointer-events: none; padding: 0;
  transition: opacity .15s ease;
}
.rasa-cmpcard:hover .rasa-cmpcard__fav,
.rasa-cmpcard__fav.is-on,
.rasa-cmpcard__fav:focus-visible { opacity: 1; pointer-events: auto; }
.rasa-cmpcard__fav:hover { background: var(--gold); color: var(--paper); border-color: var(--gold); }
.rasa-cmpcard__fav.is-on { color: var(--gold); border-color: var(--gold); }
/* ⛶ agrandir + dossier sur la carte comparable (op 2026-07-28) — les quatre
   badges attendus sur toute carte de résultat sont compare / agrandir /
   favori / dossier. Empilés sous ★, révélés au survol comme leurs voisins. */
.rasa-cmpcard__acts {
  position: absolute; top: 8px; right: 8px; z-index: 2;
  display: flex; flex-direction: column; gap: 6px;
  margin-top: 62px;   /* sous ⇄ (22) + ★ (22) + les deux écarts */
  opacity: 0; pointer-events: none; transition: opacity .15s ease;
}
.rasa-cmpcard:hover .rasa-cmpcard__acts,
.rasa-cmpcard__acts:focus-within { opacity: 1; pointer-events: auto; }
.rasa-cmpcard__act {
  width: 22px; height: 22px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  background: var(--paper); border: 1px solid var(--ink); color: var(--ink);
  font-size: 12px; line-height: 1; cursor: pointer;
}
.rasa-cmpcard__act:hover { background: var(--gold); color: var(--paper); border-color: var(--gold); }
/* Le bouton de dossier arrive avec la classe des grilles — l'aligner ici. */
.rasa-cmpcard__acts .rasa-card__act { width: 22px; height: 22px; font-size: 12px; }
/* "Unsold / Invendu" tag — sits in the card footer's price slot */
.rasa-card__unsold {
  font-size: 9.5px; letter-spacing: .14em; text-transform: uppercase;
  color: var(--inksoft); border: 1px solid var(--line); padding: 2px 7px;
  white-space: nowrap;
}
/* ==========================================================================
   Comparables — design canvas RASA.dc.html §Comparables + screenshots/final.png
   Sticky head (title + live count + view toggle + controls) parks under the
   nav by default ; the lot page drives --cmp-head-top per frame (real band
   bottom). z25 : over the band backdrop (20), under the band itself (30) —
   ejects invisibly through the band like .rasa-lot__sec-head.
   ========================================================================== */
.rasa-cmp__head {
  position: sticky; top: var(--cmp-head-top, var(--nav-height)); z-index: 25;
  background: var(--paper);
}
/* Bouton « Réglages » du header comparables — construit par rasa.js quelle que
   soit la largeur, c'est la feuille qui décide où il existe (téléphone
   seulement). Cette règle de base doit vivre AVANT la media query qui le
   révèle : à spécificité égale, la dernière déclarée l'emporte, et placée
   après elle rendait le bouton définitivement invisible (mesuré). */
.rasa-cmp__settings { display: none; }
.rasa-cmp__tbtn {
  height: 27px; padding: 0 12px; background: none; color: var(--inksoft);
  border: 1px solid var(--line); font-size: 12px; cursor: pointer;
}
.rasa-cmp__tbtn + .rasa-cmp__tbtn { border-left: none; }
.rasa-cmp__tbtn.is-on { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.rasa-cmp__ctl-label {
  font-size: 10.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--inksoft);
}
.rasa-cmp__srcbtn {
  display: flex; align-items: center; gap: 8px; background: none; border: none;
  cursor: pointer; padding: 0; font-size: 13px; color: var(--ink);
}
.rasa-cmp__srcbtn:hover { opacity: .72; }
.rasa-cmp__srcbox {
  width: 15px; height: 15px; flex: none; display: flex; align-items: center;
  justify-content: center; font-size: 10px; border: 1px solid var(--inksoft);
  background: transparent; color: transparent;
}
.rasa-cmp__srcbtn.is-on .rasa-cmp__srcbox { border-color: var(--gold); background: var(--gold); color: var(--paper); }
.rasa-cmp__range { width: 128px; accent-color: var(--gold); cursor: pointer; }
.rasa-cmp__mosaic {
  display: grid; gap: 30px 22px;
  grid-template-columns: repeat(auto-fill, minmax(max(245px, calc((100% - 88px)/5)), 1fr));
}
/* align-items:stretch (op 2026-07-11) : les colonnes prennent toutes la
   hauteur de la plus grande → une colonne SANS résultat (ex. HAR à 0) reste
   assez haute pour que son en-tête sticky (.rasa-cmp__colhead) tienne toute
   la course, comme les colonnes pleines (bug : l'en-tête d'une colonne vide
   se décrochait immédiatement, son parent flex-start ne faisant que ~77px). */
.rasa-cmp__cols { display: flex; gap: 30px; align-items: stretch; }
.rasa-cmp__col { flex: 1; min-width: 0; }
/* With 1-2 sources checked the surviving columns get very wide — cap the
   ratio-driven tile so a card never exceeds 1000px tall (op 2026-07-05) ;
   the contained image letterboxes inside the capped box. */
.rasa-cmp__col .rasa-cmpcard__img { max-height: 1000px; }

/* ── Duo compare pop-up (op 2026-07-05) — clicked comparable vs page object.
   Overlay shell built by rasa.js (bindDuo) ; the panel ships as the
   /compare/duo partial. data-mode="overlay" stacks the two figures in ONE
   box (images contained + centered → aligned superposition, B's opacity
   driven by --duo-op — the operator chains-review full-size compare idiom). */
.rasa-duo-overlay {
  position: fixed; inset: 0; z-index: 90;
  background: rgba(20, 16, 12, .78);
  display: flex; align-items: center; justify-content: center;
  padding: 24px;
}
.rasa-duo__panel {
  background: var(--paper); border: 1px solid var(--ink);
  width: min(1500px, 96vw); max-height: 94vh;
  display: flex; flex-direction: column; overflow: hidden;
}
.rasa-duo__head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; flex-wrap: wrap; padding: 14px 22px;
  border-bottom: 1px solid var(--line); flex: none;
}
.rasa-duo__stage {
  display: flex; gap: 22px; padding: 18px 22px 6px;
  min-height: 0; flex: 1 1 auto;
}
.rasa-duo__fig { flex: 1; min-width: 0; margin: 0; display: flex; flex-direction: column; min-height: 0; }
.rasa-duo__imgbox {
  flex: 1 1 auto; min-height: 220px; max-height: 58vh;
  background: var(--paper2); border: 1px solid var(--line);
  display: flex; align-items: center; justify-content: center; overflow: hidden;
}
.rasa-duo__imgbox img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; transition: transform .25s ease; }
.rasa-duo__cap { font-size: 11px; letter-spacing: .08em; color: var(--inksoft); margin-top: 8px; text-transform: uppercase; }
/* Superposition : les deux figures dans la MÊME boîte, B par-dessus. */
.rasa-duo__stage[data-mode="overlay"] { position: relative; }
.rasa-duo__stage[data-mode="overlay"] .rasa-duo__fig { position: absolute; inset: 18px 22px 6px; }
.rasa-duo__stage[data-mode="overlay"] .rasa-duo__imgbox { max-height: none; }
.rasa-duo__stage[data-mode="overlay"] [data-duo-fig="b"] .rasa-duo__imgbox {
  background: transparent; border-color: transparent;
}
.rasa-duo__stage[data-mode="overlay"] [data-duo-fig="b"] img { opacity: var(--duo-op, .5); }
.rasa-duo__stage[data-mode="overlay"] .rasa-duo__cap { position: absolute; bottom: -2px; }
.rasa-duo__stage[data-mode="overlay"] [data-duo-fig="b"] .rasa-duo__cap { right: 0; }
/* `contain` : ce cartel vit DANS la pop-up duo — sans lui, le défilement
   arrivé en butée s'échappait vers la page derrière la modale. */
.rasa-duo__cartel { overflow: auto; overscroll-behavior: contain; padding: 10px 22px 18px; flex: none; max-height: 34vh; }
.rasa-duo__cartel table { width: 100%; border-collapse: collapse; font-size: 13px; color: var(--ink); }
.rasa-duo__cartel th {
  text-align: left; font-size: 12px; font-weight: 600; padding: 8px 14px 8px 0;
  border-bottom: 1px solid var(--ink); vertical-align: bottom;
}
.rasa-duo__cartel td { padding: 7px 14px 7px 0; border-bottom: 1px solid var(--line); vertical-align: top; }
.rasa-duo__cartel th:first-child, .rasa-duo__cartel td:first-child { width: 140px; }
.rasa-duo__rowlabel {
  font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--inksoft);
}
/* final.png : light column header — label + count over a 2px ink rule.
   Sticky (op 2026-07-04) : pins flush under the sticky comparables head —
   --cmp-head-top follows the lot-page dock, --cmp-head-h is measured by
   bindCmpControls (92px fallback = compact head). z5 sits above the card
   hover overlays (z2) and below every band mask (z20+) ; paper background
   so the cards scroll cleanly under the rule. Releases naturally at the
   end of its own column (sticky is bounded by the parent .rasa-cmp__col). */
.rasa-cmp__colhead {
  position: sticky;
  /* +10px (op 2026-07-11) : petit filet d'air sous la ligne inférieure du
     header comparables, sinon le colhead y est collé quand il est pinné. */
  top: calc(var(--cmp-head-top, var(--nav-height)) + var(--cmp-head-h, 92px) + 10px);
  z-index: 5;
  background: var(--paper);
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px;
  font-size: 11px; letter-spacing: .14em; text-transform: uppercase;
  color: var(--ink); font-weight: 600;
  border-bottom: 2px solid var(--ink); padding-bottom: 8px; margin-bottom: 18px;
}
/* Masque le ruban entre le bas du header comparables (.rasa-cmp__head, z25) et
   le haut du colhead pinné (z5). Sans lui, les cards de la colonne (z auto) y
   remontent au scroll (op 2026-07-11 « les cards passent dans l'interstice »).
   #1316 masquait un filet FIXE de 10px, mais l'écart head↔colhead n'est PAS
   toujours 10px : tant que le header n'est pas pinné en verrou avec le colhead
   (course de scroll où le colhead est déjà pinné et le header encore mobile),
   il grimpe à ~30px (mesuré CDP, op 2026-07-12) → 20px de cards fuient sous le
   filet de 10. Le masque couvre donc TOUTE la hauteur du header (--cmp-head-h,
   mesurée live) + les 10px de filet : il remonte jusqu'au haut du header. Le
   surplus (quand l'écart réel < masque) tombe DERRIÈRE le header opaque (z25 >
   ::before z5) → invisible ; le manque (écart > 10) est avalé. Borné à la
   largeur de colonne (left/right:0). */
.rasa-cmp__colhead::before {
  content: ""; position: absolute; left: 0; right: 0;
  top: calc(-1 * (var(--cmp-head-h, 92px) + 10px));
  height: calc(var(--cmp-head-h, 92px) + 10px);
  background: var(--paper);
}
.rasa-cmp__colhead .tnum { font-family: var(--font-mono); font-size: 11px; color: var(--inksoft); font-weight: 400; }
.rasa-cmp__colbody { display: flex; flex-direction: column; gap: 24px; }
.rasa-cmp__empty { font-size: 12px; color: var(--inksoft); font-style: italic; padding: 10px 0; }
/* Cards */
/* Same treatment as the result cards (op 2026-07-07) : the whole comparable card
   carries the lightening beige gradient (lighter top → deeper bottom) and its image
   box is transparent/borderless so the gradient is one continuous surface. */
.rasa-cmpcard { padding-bottom: 10px;
  background: linear-gradient(160deg, var(--card-result-2) 0%, var(--card-result) 100%); }
.rasa-cmpcard__link { all: unset; cursor: pointer; display: block; }
.rasa-cmpcard__link:hover { opacity: .82; }
.rasa-cmpcard__img {
  background: transparent; border: none; overflow: hidden;
  display: flex; align-items: center; justify-content: center;
  position: relative;  /* anchors the hover .rasa-card__select overlay */
}
.rasa-cmpcard__img img { width: 100%; height: 100%; object-fit: contain; display: block; }
.rasa-cmpcard__glyph { font-family: var(--font-serif); font-style: italic; font-size: 20px; color: var(--ink); opacity: .4; }
.rasa-cmpcard__meta { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 10px; }
.rasa-cmpcard__detail {
  font-size: 9px; letter-spacing: .1em; text-transform: uppercase; color: var(--gold);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Pilier (MUSÉES/PUBLICATIONS/VENTES/HAR) en gras dans le label carte (op
   2026-07-11) — le distingue de la 2ᵉ partie (maison / titre / type). */
.rasa-cmpcard__pillar { font-weight: 700; }
.rasa-cmpcard__sim { font-size: 10.5px; color: var(--inksoft); }
/* Confirmed same-object badge (op 2026-07-07) — replaces the similarity % on a
   comparable that is a validated reconciliation link with the page object. */
.rasa-cmpcard__same { font-size: 8.5px; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: var(--badge-green); white-space: nowrap; flex: none; }
.rasa-cmpcard__bar { height: 2px; background: var(--line); margin-top: 6px; }
.rasa-cmpcard__bar > div { height: 2px; background: var(--gold); }
.rasa-cmpcard__bar--same > div { background: var(--badge-green); }
/* Réserve du bloc texte = marge du titre (10) + 2 lignes de titre (2×1.2×14px)
   + marge du contexte (5) + 1 ligne de contexte (1.35×11px). Hauteur de carte
   uniforme dans LES DEUX vues (op 2026-07-04), la ligne de contexte venant
   épouser un titre d'une seule ligne — le mou reste en bas du bloc.
   `overflow: hidden` empêche aussi la marge haute du titre de s'échapper du
   bloc par fusion.

   `min-height` et non `height` (op 2026-07-28) : depuis que les cartes
   comparables du corpus VENTES portent une ligne d'estimation (#1539), le
   contenu dépasse la réserve — calculée, elle, avant que cette ligne existe.
   Avec une hauteur FIGÉE + `overflow: hidden`, l'estimation était donc
   ROGNÉE, et seulement sur les cartes au titre de deux lignes : mesuré à
   390px, 6 cartes sur 12, le pied débordant de 10 à 12px sous la boîte.
   Un plancher laisse la carte grandir quand il le faut ; les cartes d'une
   même rangée s'étirent à la plus haute (grille), donc les tailles restent
   harmonisées — ce que l'op demande — sans jamais couper un prix. */
.rasa-cmpcard__text {
  min-height: calc(10px + 2 * 1.2 * 14px + 5px + 1.35 * 11px);
  overflow: hidden;
}
/* Cartes VENTES : elles portent en plus la ligne estimation/prix (marge 12 +
   boîte mesurée 30). On lui réserve sa place, et on fige le titre à deux
   lignes pleines : sans cela une carte au titre court faisait 439px et sa
   voisine au titre long 458px — l'op demande des tailles harmonisées, pas
   seulement un prix visible. Les cartes des autres corpus gardent la réserve
   d'origine ; elles n'ont pas de ligne de prix à loger. */
.rasa-cmpcard--priced .rasa-cmpcard__text {
  min-height: calc(10px + 2 * 1.2 * 14px + 5px + 1.35 * 11px + 12px + 30px);
}
.rasa-cmpcard--priced .rasa-cmpcard__title { min-height: calc(2 * 1.2 * 14px); }
.rasa-cmpcard__title {
  font-family: var(--font-serif); font-style: italic; font-size: 14px;
  color: var(--ink); margin-top: 10px; line-height: 1.2;
  /* Max 2 lines (ellipsis) at NATURAL height (op 2026-07-04 rev 2) : a
     1-line title lets the context line rise to hug it — the slack sits at
     the card bottom, not as a hole between title and context. Rows still
     top-align (grid). */
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
/* One fixed line — rendered unconditionally (empty keeps the slot) so cards
   with no context line stay the same height as their neighbours. */
.rasa-cmpcard__ext {
  font-size: 11px; color: var(--inksoft); margin-top: 5px; line-height: 1.35;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  height: 1.35em;
}
/* Agnostic (blind) mode : source, similarity and context rows disappear. */
.rasa-cmp.is-agnostic [data-cmp-ext] { display: none !important; }
/* Recherche mots-clés (op 2026-07-11) : même mode Agnostique appliqué aux
   cards de grille des deux vues (Par corpus + mosaïque) — rasa.js
   bindKwControls pose .is-agnostic sur [data-kw-root]. */
[data-kw-root].is-agnostic [data-cmp-ext] { display: none !important; }

.rasa-card__topline { margin-top: 14px; display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.rasa-card__toplabel { font-size: 10px; letter-spacing: .13em; text-transform: uppercase; color: var(--inksoft); }
.rasa-card__topright { font-family: var(--font-mono); font-size: 10px; color: var(--inksoft); }
.rasa-card__title {
  font-family: var(--font-serif); font-style: italic; font-weight: 500;
  font-size: 11.375px; line-height: 1.22; color: var(--ink); margin-top: 7px;
  text-wrap: pretty; text-transform: uppercase; letter-spacing: .04em;
  /* Constant card height : the title box is ALWAYS exactly 2 lines tall —
     longer titles are clamped with an ellipsis, shorter ones keep the slot. */
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; height: calc(2 * 1.22em);
}

/* Ligne artiste au-dessus du titre (#1243 parité public — Spec 061, champ
   dédié seulement ; supprimée serveur quand le titre porte déjà le nom). */
.rasa-card__artist {
  font-size: 11px; font-weight: 600; letter-spacing: .4px;
  text-transform: uppercase; color: var(--ink);
  margin: 6px 0 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.rasa-card__artist + .rasa-card__title { margin-top: 2px; }
/* Taille sous le titre — posée par la route UNIQUEMENT quand la taille est la
   clé de tri active de la recherche mots-clés (op 2026-07-11). */
.rasa-card__size {
  font-size: 11px; color: var(--inksoft); margin-top: 2px;
  font-variant-numeric: tabular-nums;
}
.rasa-card__meta { font-size: 12.5px; color: var(--inksoft); margin-top: 6px; line-height: 1.4; }
/* Museum attribution on museum cards (op 2026-07-07) : name left, logo flag-right on
   the SAME line (logo pushed to the right edge via margin-left:auto ; when a museum has
   no logo the name simply keeps the left). */
.rasa-card__museum { display: flex; align-items: center; gap: 7px; margin-top: 7px; min-width: 0; }
.rasa-card__museum-logo { height: 15px; width: auto; max-width: 42px; object-fit: contain; flex: none; margin-left: auto; }
.rasa-card__museum-name { text-align: left; font-size: 11px;
  color: var(--inksoft); letter-spacing: .02em; min-width: 0; flex: 0 1 auto;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rasa-card__foot { margin-top: 12px; border-top: 1px solid var(--line); padding-top: 9px; display: flex; align-items: baseline; justify-content: space-between; }
.rasa-card__foot-l { font-size: 11px; color: var(--inksoft); letter-spacing: .02em; }
.rasa-card__price { font-family: var(--font-mono); font-size: 14px; font-weight: 500; color: var(--ink); }
.rasa-card__price--sold { color: var(--gold); }

/* Gallery (masonry) */
.rasa-gallery { column-gap: 18px; }
.rasa-gallery__item { break-inside: avoid; margin-bottom: 18px; position: relative; background: var(--paper); overflow: hidden; }
/* Caption overlay hidden until hover — the image itself is the primary
   viewing target in gallery mode. */
.rasa-gallery__cap { opacity: 0; transition: opacity .18s ease; }
.rasa-gallery__item:hover .rasa-gallery__cap,
.rasa-gallery__item:focus-within .rasa-gallery__cap { opacity: 1; }

/* Table */
.rasa-table { width: 100%; }
.rasa-table__head, .rasa-table__row { display: grid; grid-template-columns: 32px 60px 70px 1fr 180px 200px 120px 120px; align-items: center; padding: 12px 12px; border-bottom: 1px solid var(--line); }
.rasa-table__head { font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--inksoft); font-weight: 600; }
.rasa-table__row:hover { background: var(--card); }

/* Skeleton (loading) */
.rasa-sk { animation: rasaSh 1.3s linear infinite; background: linear-gradient(90deg, var(--paper2) 25%, var(--card) 50%, var(--paper2) 75%); background-size: 720px 100%; }
@keyframes rasaSh { 0% { background-position: -360px 0; } 100% { background-position: 360px 0; } }
@keyframes rasaPulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: .3; transform: scale(.7); } }

/* Empty state */
.rasa-empty { text-align: center; padding: 90px 20px 110px; }
.rasa-empty__title { font-family: var(--font-serif); font-style: italic; font-size: 34px; color: var(--ink); }
.rasa-empty__body { font-size: 14px; color: var(--inksoft); margin: 16px auto 26px; max-width: 430px; line-height: 1.6; }

/* Pagination */
.rasa-pager { display: flex; align-items: center; justify-content: center; gap: 4px; margin-top: 54px; padding-top: 30px; border-top: 1px solid var(--line); }
.rasa-pager__btn { height: 36px; padding: 0 14px; border: 1px solid var(--line); color: var(--ink); font-size: 13px; }
.rasa-pager__btn:hover { border-color: var(--ink); }
.rasa-pager__num.is-active { background: var(--ink); color: var(--paper); border-color: var(--ink); }

/* ==========================================================================
   Comparison tray (persistent bottom bar)
   ========================================================================== */
.rasa-tray {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 80;
  background: var(--ink); border-top: 2px solid var(--gold);
  display: none;
}
.rasa-tray.is-open { display: block; }
/* --- Replié en ONGLET (op 2026-07-28) ---------------------------------
   Déployé en permanence, le bandeau barrait le bas de chaque page : mesuré,
   il recouvrait les badges des cartes qui s'y trouvaient — un tap sur ☆
   atterrissait sur « Comparer », d'où le « tantôt ça marche » signalé.
   Replié, il ne reste qu'une pastille en bas à droite, qui porte le compte.
   `pointer-events: none` sur le conteneur : replié, il ne doit plus rien
   intercepter sur toute la largeur de l'écran. */
.rasa-tray.is-min { background: none; border-top: 0; pointer-events: none; }
.rasa-tray.is-min .rasa-tray__inner { display: none; }
.rasa-tray__tab { display: none; }
.rasa-tray.is-min .rasa-tray__tab {
  display: flex; align-items: center; gap: 8px; pointer-events: auto;
  position: fixed; right: 16px; bottom: 16px; z-index: 1;
  height: 46px; padding: 0 16px;
  background: var(--ink); color: var(--paper);
  border: 1px solid var(--gold); cursor: pointer;
  box-shadow: 0 10px 26px -14px rgba(0, 0, 0, .55);
}
.rasa-tray__tab-ico { font-size: 16px; line-height: 1; }
.rasa-tray__tab-count { font-family: var(--font-mono); font-size: 13px; color: var(--gold); font-weight: 600; }
/* Bouton de repli, présent seulement quand le bandeau est déployé. */
.rasa-tray__min {
  flex: none; width: 34px; height: 34px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  background: none; border: 1px solid var(--nav-line, rgba(244,239,230,.3));
  color: rgba(244,239,230,.75); font-size: 15px; line-height: 1; cursor: pointer;
}
.rasa-tray__min:hover { color: var(--paper); border-color: var(--paper); }
.rasa-tray.is-min .rasa-tray__min { display: none; }
.rasa-tray__inner { max-width: var(--content-max); margin: 0 auto; padding: 13px var(--content-pad); display: flex; align-items: center; gap: 18px; }
.rasa-tray__label { font-size: 10px; letter-spacing: .2em; text-transform: uppercase; color: rgba(244,239,230,.55); flex: none; line-height: 1.4; }
/* La bande de vignettes défile horizontalement : `overscroll-behavior-x`
   empêche le geste d'aller ensuite tirer l'historique du navigateur (retour
   arrière au balayage) une fois arrivé au bout. */
.rasa-tray__thumbs {
  display: flex; gap: 7px; flex: 1; overflow-x: auto;
  /* Marges INCHANGÉES sur écran pointeur : la hauteur du bandeau alimente
     `trayReserve()` du rig de la fiche objet (rasa.js bindLotDetail), qui en
     borne son image au repos — l'élargir déplaçait la bande image de 10px
     (mesuré à y=300). Le ✕ vit donc DANS la vignette ici, et ne déborde
     qu'au doigt, où le rig est éteint. */
  padding: 2px 0;
  overscroll-behavior-x: contain;
  -webkit-overflow-scrolling: touch;
}
/* Cellule = vignette (lien vers la fiche) + ✕ (retrait). Séparer les deux est
   le correctif du 27/07 : la vignette entière était un bouton de suppression,
   sans indice visuel — on tapait pour revoir un objet, il disparaissait. */
.rasa-tray__cell { flex: none; position: relative; }
.rasa-tray__thumb {
  /* `flex` et non `block` : ce n'est plus un <button> (qui centrait son
     glyphe tout seul) mais un <a> / <span>. */
  display: flex; align-items: center; justify-content: center;
  width: 46px; height: 46px; background: var(--card);
  border: 1px solid var(--line); color: var(--ink);
  font-family: var(--font-serif); font-style: italic; font-size: 15px;
  overflow: hidden; position: relative; text-decoration: none;
}
.rasa-tray__thumb img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }
.rasa-tray__thumb:hover { border-color: var(--gold); opacity: .7; }
/* Écran pointeur : le ✕ se loge DANS la vignette et n'apparaît qu'au survol
   — le bandeau garde exactement ses dimensions réglées. */
.rasa-tray__rm {
  position: absolute; top: 2px; right: 2px; z-index: 2;
  width: 18px; height: 18px; padding: 0; line-height: 1;
  display: flex; align-items: center; justify-content: center;
  background: var(--paper); color: var(--ink);
  border: 1px solid var(--ink); border-radius: 50%;
  font-size: 10px; cursor: pointer;
  opacity: 0; pointer-events: none; transition: opacity .14s ease;
}
.rasa-tray__cell:hover .rasa-tray__rm,
.rasa-tray__rm:focus-visible { opacity: 1; pointer-events: auto; }
.rasa-tray__rm:hover { background: var(--gold); color: var(--paper); border-color: var(--gold); }
.rasa-tray__clear { color: rgba(244,239,230,.55); font-size: 12px; }
.rasa-tray__clear:hover { color: var(--paper); }
.rasa-tray__compare {
  height: 44px; padding: 0 26px; background: var(--gold); color: var(--paper);
  font-size: 13.5px; letter-spacing: .02em; display: flex; align-items: center; gap: 10px;
}
.rasa-tray__compare:hover { background: var(--paper); color: var(--ink); }
/* Réserve sous le bandeau fixe, pour que la fin de page ne se loge ni contre
   lui ni dessous. Valeur de bureau CONSERVÉE TELLE QUELLE : le rig de la fiche
   objet (rasa.js bindLotDetail) borne son image au repos sur la place restante,
   et la course du défilement dépend de la hauteur totale du document — y
   toucher déplace la bande image (mesuré : 10px de largeur à y=300). Le rig
   est réglé finement, il n'a pas à bouger pour un correctif téléphone. */
body.has-tray { padding-bottom: 140px; }

/* Sur téléphone, en revanche, le rig est éteint et rien ne dépend de cette
   valeur — or elle réservait 140px pour un bandeau MESURÉ à 79px, soit 61px
   de vide mort au bas de CHAQUE page dès qu'un objet est sélectionné.
   `--tray-h` est publiée par rasa.js (render) à partir de la hauteur réelle,
   même mécanique que `--searchhead-h` pour la bande de recherche ; le repli
   couvre le tout premier rendu, avant mesure. */
@media (max-width: 899px) {
  body.has-tray { padding-bottom: calc(var(--tray-h, 78px) + 24px); }
}

/* ==========================================================================
   Lightbox
   ========================================================================== */
.rasa-lightbox { position: fixed; inset: 0; z-index: 100; background: rgba(14,12,13,.94); display: none; flex-direction: column; color: var(--paper); }
.rasa-lightbox.is-open { display: flex; }
.rasa-lightbox__head { display: flex; align-items: center; justify-content: space-between; padding: 16px 24px; }
.rasa-lightbox__stage { flex: 1; display: flex; align-items: center; justify-content: center; overflow: hidden; position: relative; }
/* z-index explicite (2026-07-27) : l'image porte un `transform` (posé par
   LB.render pour le zoom/déplacement), ce qui la place dans la MÊME couche de
   peinture que ces boutons absolus. À z-index égal, c'est l'ordre du DOM qui
   tranche — or il est `prev → img → next` : l'image recouvrait donc la flèche
   GAUCHE et se faisait recouvrir par la droite. Invisible tant que l'image
   restait plus étroite que l'écran (desktop, max-width:90vw) ; révélé sur
   téléphone où elle occupe 100vw. Les flèches passent devant, des deux côtés. */
.rasa-lightbox__nav { position: absolute; z-index: 2; width: 50px; height: 50px; border: 1px solid rgba(244,239,230,.3); color: var(--paper); font-size: 22px; }
.rasa-lightbox__nav.prev { left: 24px; }
.rasa-lightbox__nav.next { right: 24px; }
.rasa-lightbox__nav:hover { background: rgba(244,239,230,.1); }
/* Single-image object → no prev/next arrows (nothing to scroll). Set by rasa.js openList(). */
.rasa-lightbox[data-lb-single="1"] .rasa-lightbox__nav { display: none; }
.rasa-lightbox__foot { text-align: center; padding: 14px; font-family: var(--font-mono); font-size: 11px; color: rgba(244,239,230,.45); }
.rasa-lightbox__ctl { width: 38px; height: 38px; background: none; border: 1px solid rgba(244,239,230,.3); color: var(--paper); font-size: 17px; }
.rasa-lightbox__zoom { font-family: var(--font-mono); font-size: 12px; color: rgba(244,239,230,.7); width: 54px; text-align: center; }

/* Zoom slider (between − and + buttons) */
.rasa-lightbox__slider {
  -webkit-appearance: none; appearance: none;
  width: 160px; height: 4px;
  background: rgba(244,239,230,.25);
  border-radius: 2px; outline: none; cursor: pointer;
}
.rasa-lightbox__slider::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none;
  width: 14px; height: 14px; border-radius: 50%;
  background: var(--paper); cursor: pointer;
  box-shadow: 0 0 0 1px rgba(0,0,0,.15);
}
.rasa-lightbox__slider::-moz-range-thumb {
  width: 14px; height: 14px; border-radius: 50%;
  background: var(--paper); cursor: pointer; border: none;
  box-shadow: 0 0 0 1px rgba(0,0,0,.15);
}
.rasa-lightbox__slider:focus::-webkit-slider-thumb { box-shadow: 0 0 0 3px rgba(244,239,230,.35); }
.rasa-lightbox__slider:focus::-moz-range-thumb     { box-shadow: 0 0 0 3px rgba(244,239,230,.35); }

/* Pan cursor when the zoomed image is draggable */
.rasa-lightbox[data-lb-zoomed="1"] [data-rasa-lb-img] { cursor: grab; }
.rasa-lightbox[data-lb-panning="1"] [data-rasa-lb-img] { cursor: grabbing; }

/* ==========================================================================
   Add-to-folder popover
   ========================================================================== */
.rasa-popover-bg { position: fixed; inset: 0; z-index: 90; background: rgba(20,16,12,.32); display: none; align-items: center; justify-content: center; }
.rasa-popover-bg.is-open { display: flex; }
.rasa-popover { background: var(--paper); border: 1px solid var(--ink); width: 360px; max-width: 90vw; padding: 26px; }

/* Anchored "Ranger dans un dossier" dropdown (op 2026-07-17) — body-appended,
   position:fixed (escapes card clipping), sibling affordance of the ★. */
.rasa-folderpick { display: inline-block; }
.rasa-folderpick__pop {
  position: fixed; z-index: 95; min-width: 230px; max-width: 300px;
  background: var(--paper); border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 8px 28px rgba(0,0,0,.18); padding: 6px; font-size: 13px;
  color: var(--ink); max-height: 320px; overflow-y: auto;
  /* Menu flottant : le défilement ne doit pas s'échapper vers la page — il
     déplacerait le menu sous le doigt (il est repositionné au défilement). */
  overscroll-behavior: contain;
}
.rasa-folderpick__hd {
  font-size: 11px; letter-spacing: .04em; text-transform: uppercase;
  color: var(--inksoft); padding: 4px 8px 6px;
}
.rasa-folderpick__list { list-style: none; margin: 0; padding: 0; }
.rasa-folderpick__item {
  display: flex; align-items: center; gap: 8px; width: 100%;
  background: none; border: 0; text-align: left; cursor: pointer;
  padding: 7px 8px; border-radius: 6px; color: var(--ink); font: inherit; line-height: 1.3;
}
.rasa-folderpick__item:hover { background: var(--card); }
.rasa-folderpick__chk { width: 14px; flex: 0 0 14px; color: var(--gold); font-weight: 700; text-align: center; }
.rasa-folderpick__nm { flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rasa-folderpick__item[data-in="1"] .rasa-folderpick__nm { color: var(--gold); }
.rasa-folderpick__new { border-top: 1px solid var(--line); margin-top: 4px; padding-top: 4px; }
.rasa-folderpick__newbtn {
  display: block; width: 100%; text-align: left; background: none; border: 0;
  cursor: pointer; padding: 7px 8px; border-radius: 6px; color: var(--gold); font: inherit;
}
.rasa-folderpick__newbtn:hover { background: var(--card); }
.rasa-folderpick__newform { display: flex; gap: 6px; padding: 4px; }
.rasa-folderpick__newinput {
  flex: 1 1 auto; min-width: 0; padding: 6px 8px; border: 1px solid var(--line);
  border-radius: 6px; background: var(--paper); color: var(--ink); font: inherit;
}
.rasa-folderpick__newform button[type="submit"] {
  background: var(--gold); color: var(--paper); border: 0; border-radius: 6px;
  padding: 6px 10px; cursor: pointer; font: inherit; white-space: nowrap;
}

/* ==========================================================================
   Alerts / flash
   ========================================================================== */
.rasa-alert { padding: 12px 16px; background: var(--card); border-left: 3px solid var(--gold); font-size: 13px; color: var(--ink); margin: 12px 0; }
.rasa-alert--error { border-left-color: #b10c0c; color: #b10c0c; }

/* ==========================================================================
   Responsive
   Breakpoints :
     ≥1100px : full desktop layout (facet rail sticky left, results large)
     900-1099 : rail narrows, page padding tightens
     600-899 : rail collapses to a top strip, results full-width
     <600 : mobile — nav compacts, cards shrink, tray becomes minimal
   ========================================================================== */
@media (max-width: 1099px) {
  :root { --content-pad: 20px; --facet-rail: 232px; }
}

@media (max-width: 899px) {
  .rasa-explore { grid-template-columns: 1fr; }
  .rasa-facet-rail {
    position: static; max-height: none;
    border-right: none; border-bottom: 1px solid var(--line);
    padding: 20px 20px 24px;
    overflow: visible;
  }
  .rasa-results { padding: 20px 20px 0; }
  .rasa-nav__inner { padding: 0 20px; gap: 12px; }
  .rasa-nav__links { display: none; }
  .rasa-nav__burger { display: flex; }
  /* The pillar/account/lang controls move into the drawer; the header keeps
     brand + a shrinkable search + burger, so nothing overflows the viewport. */
  .rasa-nav__cta, .rasa-nav__lang, .rasa-nav__avatar { display: none; }
  .rasa-nav__right { margin-left: auto; min-width: 0; flex: 1 1 auto; justify-content: flex-end; }
  .rasa-nav__search { min-width: 0; flex: 1 1 auto; max-width: 100%; }
  .rasa-nav__search-btn { min-width: 0; padding: 0 12px; }
  .rasa-nav__search-form { min-width: 0; padding: 0 10px; }
  .rasa-nav__search-input { min-width: 0; }
  .rasa-nav__search-btn span:last-child { display: none; }
  .rasa-page-title { font-size: 30px; }

  /* Object detail pages (lot / museum / crop / HAR / image-search) — the shared
     `.rasa-lot__grid` is an inline `auto 1fr` two-column layout with a sticky,
     full-bleed, 56vw image. On mobile it crushed the text column to ~80px and
     pushed the comparables off-screen. Collapse to ONE column: image on top
     (static, full-width), text + comparables below at full width.
     `!important` overrides the templates' inline grid/size styles. */
  .rasa-lot__grid { grid-template-columns: minmax(0, 1fr) !important; gap: 20px !important; }
  /* Grid/flex children must be allowed to shrink below their content width,
     else a single wide descendant (price row, action bar) re-expands the track
     past the viewport. */
  .rasa-lot__grid > * { min-width: 0 !important; }
  .rasa-lot__grid > div[style*="sticky"] {
    position: static !important; margin-left: 0 !important; z-index: auto !important; }
  .rasa-lot__grid [data-lot-img] { max-width: 100% !important; width: 100% !important; }
  .rasa-lot__grid [data-lot-img] img {
    max-width: 100% !important; width: 100% !important; height: auto !important;
    max-height: 68vh !important; object-position: center top !important; }
  /* Rig machinery (fixed shrink-band overlays) — no image shrink on mobile. */
  .rasa-lot__grid [data-band-bg], .rasa-lot__grid [data-interstice-mask] { display: none !important; }
  /* Text column is a sticky, self-scrolling container on desktop (the rig).
     On mobile it must be a normal full-width block that scrolls with the page. */
  .rasa-lot__grid [data-lot-header] {
    position: static !important; overflow: visible !important; max-height: none !important; }
  .rasa-lot__topbar { position: static !important; margin-left: 0 !important; flex-wrap: wrap !important; }
  /* Action buttons (compare / favourite / folder) wrap instead of overflowing. */
  .rasa-lot__topbar [data-c="actions"] { flex-wrap: wrap !important; }
  /* Condensed identification grid (inline `repeat(3, …)`) stacks to 1 column. */
  .rasa-obj__grid { grid-template-columns: 1fr !important; }
  /* Field rows (label 148px + value) — shrink the label so long values (prices,
     estimates) fit the narrow column instead of overflowing. */
  .rasa-lot__fields > div[style*="148px"] { grid-template-columns: 92px 1fr !important; gap: 10px !important; }
  /* Help-bubble text never wider than the column. */
  .rasa-help__text { max-width: 100% !important; }
  /* Têtes de section (Description / Notice / Provenance / Exposé /
     Bibliographie). Elles étaient rendues STATIQUES sur téléphone parce que
     leur ancrage `--sec-head-top` vaut la valeur du rig de bureau (~403px) :
     éteint le rig, elles se garaient en plein milieu de l'écran.
     Elles redeviennent collantes (demande op 2026-07-28) mais sur un ancrage
     MOBILE : sous la nav et sous la barre d'identité, dont la hauteur réelle
     est publiée par rasa.js en `--objbar-h` (0 tant que la barre est repliée,
     donc aucun trou avant qu'elle n'apparaisse). */
  .rasa-lot__sec-head {
    position: sticky !important;
    top: calc(var(--nav-height) + var(--objbar-h, 0px)) !important;
    z-index: 24;
  }

  /* Bloc comparables — CORRECTION 2026-07-27 (régression de #1498).
     #1498 avait épinglé `.rasa-cmp__head` sous la nav pour garder les filtres
     accessibles. Erreur : ce header est SOLIDAIRE de deux autres pièces qui,
     elles, continuaient de se caler sur le rig desktop —
       · `.rasa-cmp__colhead` s'ancre à `--cmp-head-top + --cmp-head-h + 10px`.
         `--cmp-head-top` vaut 403px (valeur du rig, écrite par bindCmpControls
         qui n'a pas de garde mobile) ⇒ les en-têtes MUSÉES/PUBLICATIONS/
         VENTES/HAR se collaient à 669px sur un écran de 844, donc EN BAS ;
       · `.rasa-cmp__colhead::before` est un masque de `--cmp-head-h + 10px`
         (mesuré 266px) couleur papier, dont le seul rôle est de disparaître
         DERRIÈRE le header épinglé. Le header parti sous la nav, le masque
         restait à découvert ⇒ un rectangle crème de 266px par-dessus les
         cartes (le « carré blanc » signalé par l'op).
     Sur téléphone le bloc entier défile donc normalement : plus d'ancrage
     desktop, plus d'interstice à masquer, et le header rend ses 262px (31 %
     de l'écran) au contenu. Les filtres restent à un écran au-dessus. */
  /* CORRECTION DE LA CORRECTION (op 2026-07-28) — le bloc redevient collant.
     Le défaut de #1498 n'était PAS le principe du header épinglé : c'était son
     ANCRAGE. `--cmp-head-top` est posé en style INLINE par le gabarit à la
     valeur du rig de bureau — `calc(var(--nav-height) + 25px + 300px + 8px)`,
     soit 403px — d'où les en-têtes de corpus collés à 669px sur un écran de
     844 (donc EN BAS) et le masque `::before` de 266px resté à découvert (le
     « carré blanc »). On corrige donc la VARIABLE, et tout le reste de la
     mécanique existante (colhead à `top + --cmp-head-h + 10`, masque
     d'interstice dimensionné sur `--cmp-head-h` mesurée en direct par
     `measureHead()`) retombe juste sans être touchée.
     `!important` : la déclaration adverse est inline sur la section. */
  [data-cmp-block] {
    --cmp-head-top: calc(var(--nav-height) + var(--objbar-h, 0px)) !important;
  }
  /* Le bloc comparables n'est PAS toujours épinglé (`data-cmp-block` n'est
     posé que sur les fiches objet) : hors de ce cas, l'ancrage par défaut
     `var(--nav-height)` de la règle de base convient déjà. */
  .rasa-cmp__head { z-index: 26; }

  /* --- Header comparables réduit à UNE ligne (demande op) ---------------
     Mesuré : 294px sur téléphone, soit 35 % de l'écran une fois épinglé.
     Ne restent visibles que le titre et le compteur, plus le bouton de
     réglages ; les deux curseurs, la bascule de vue, les sources et les
     étiquettes passent derrière ce bouton (rasa.js bindCmpControls). */
  .rasa-cmp__hrow { flex-wrap: nowrap !important; padding-top: 8px !important; margin-bottom: 0 !important; }
  /* UNE ligne : l'intitulé et le compteur côte à côte, la prose masquée.
     Le compteur reste visible parce qu'il est VIVANT — il suit le curseur de
     seuil ; le masquer priverait d'un retour immédiat sur le filtrage. */
  .rasa-cmp__htitle {
    min-width: 0; display: flex; align-items: baseline; gap: 10px;
  }
  .rasa-cmp__htitle .eyebrow {
    min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    /* .2em d'approche coupait « COMPARABLES — TOUT… » : à .09em l'intitulé
       tient en entier dans la largeur restante une fois le compteur et le
       bouton posés. */
    letter-spacing: .09em !important;
  }
  .rasa-cmp__hsum { flex: none; margin-top: 0 !important; }
  .rasa-cmp__hsumtxt { display: none; }
  .rasa-cmp__hctl, .rasa-cmp__hview { display: none !important; }
  .rasa-cmp__hrow2 { display: none !important; }
  /* Déplié : les réglages reviennent, sous la ligne de titre. */
  .rasa-cmp__head.is-settings .rasa-cmp__hctl,
  .rasa-cmp__head.is-settings .rasa-cmp__hview { display: flex !important; }
  .rasa-cmp__head.is-settings .rasa-cmp__hrow2 { display: flex !important; }
  .rasa-cmp__head.is-settings .rasa-cmp__hrow { flex-wrap: wrap !important; margin-bottom: 8px !important; }

  .rasa-cmp__settings {
    flex: none; min-height: 34px; padding: 0 12px; margin-left: auto;
    display: flex; align-items: center; gap: 7px;
    background: var(--paper2); border: 1px solid var(--line); color: var(--ink);
    font-family: var(--font-mono); font-size: 10px;
    letter-spacing: .12em; text-transform: uppercase; cursor: pointer;
  }
  .rasa-cmp__head.is-settings .rasa-cmp__settings { background: var(--ink); color: var(--paper); border-color: var(--ink); }

  /* Têtes de corpus (MUSÉES / PUBLICATIONS / VENTES / HAR) : collantes sous
     le header. En colonne unique sur téléphone, chacune tient donc le haut
     pendant tout le défilement de son corpus. */
  .rasa-cmp__colhead { z-index: 23; }
  /* Les 4 corpus tenaient sur une rangée : 60px par colonne, titres coupés
     (« PUBLICATIONVENTES »). Un corpus par rangée, pleine largeur. `flex:none`
     car en direction colonne, `flex:1` égaliserait les HAUTEURS. */
  .rasa-cmp__cols { flex-direction: column; gap: 26px; }
  .rasa-cmp__col { flex: none; }
}

@media (max-width: 599px) {
  :root { --content-pad: 14px; }
  .rasa-grid { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 22px 12px; }
  .rasa-container { padding: 0 14px; }
  .rasa-nav__inner { padding: 0 14px; gap: 12px; }
  .rasa-nav__brand-word { font-size: 20px; letter-spacing: .16em; }
  .rasa-nav__avatar { margin-left: 6px; }
  .rasa-results { padding: 14px 14px 0; }
  .rasa-facet-rail { padding: 14px 14px 20px; }
  .rasa-results__head { flex-direction: column; align-items: flex-start; gap: 10px; }
  .rasa-page-title { font-size: 24px; }
  .rasa-viewmodes__btn { width: 32px; height: 30px; font-size: 14px; }
  .rasa-tray__inner { padding: 10px 14px; gap: 10px; }
  .rasa-tray__label { display: none; }
  /* ---- Vue tableau : refonte op 2026-07-28 --------------------------------
     La règle précédente (`28px 44px 1fr 90px` + masquage des colonnes 5→8)
     produisait trois défauts MESURÉS à 390px, tous signalés par l'op :
       · la vignette fait 52px dans une colonne de 44 → elle débordait sur la
         colonne suivante (droite 106 > gauche 98) : la superposition vue ;
       · le NUMÉRO de lot recevait 176px et le TITRE 90px — la répartition
         exactement inversée, d'où des titres qui enroulaient sur 5 lignes et
         des hauteurs de ligne de 109 à 155px ;
       · estimation et résultat étaient purement masqués : sur un tableau de
         ventes, la donnée la plus utile n'était pas affichable.
     Les deux tableaux du service (ventes, musées) ont la MÊME structure à 8
     cellules — ✓, vignette, identifiant, titre, champ A, champ B, puis deux
     champs alignés à droite — donc une seule règle suffit.
     L'en-tête disparaît : une fois les cellules empilées, ses libellés ne
     surmontent plus rien. Chaque cellule se lit seule (l'estimation porte son
     propre « Est. »). */
  /* Pied de carte (estimation ↔ prix) : les deux éléments se partagent la
     largeur, et quand ils n'y tiennent pas c'est le TEXTE qui cassait —
     « Est. 7 346–11 019 » sur une ligne et « € » seul sur la suivante (vu à
     390px). On laisse plutôt le conteneur passer à la ligne, l'estimation
     gardant la sienne entière. */
  .rasa-card__foot { flex-wrap: wrap; row-gap: 4px; }
  .rasa-card__foot-l { white-space: nowrap; }

  .rasa-table__head { display: none; }
  .rasa-table__row {
    /* 4e colonne en `fit-content` : elle prend la largeur de son contenu mais
       ne dépasse jamais 96px. `auto` laissait un identifiant long
       (« 01361(IS) to 01361A2/(IS) », mesuré côté musées) occuper 180px et ne
       laisser que 50px au titre ; `minmax(0, 96px)` faisait l'inverse en se
       figeant à 96px même pour « 2 638 € ». */
    grid-template-columns: 26px 52px minmax(0, 1fr) fit-content(96px);
    grid-template-areas:
      "chk thumb titre num"
      "chk thumb sec   res";
    column-gap: 10px; row-gap: 3px;
    align-items: start;
    padding: 10px 12px;
  }
  .rasa-table__row > *:nth-child(1) { grid-area: chk;   align-self: center; }
  .rasa-table__row > *:nth-child(2) { grid-area: thumb; align-self: center; }
  .rasa-table__row > *:nth-child(3) { grid-area: num;   text-align: right; }
  .rasa-table__row > *:nth-child(4) { grid-area: titre; min-width: 0; }
  /* Champs secondaires (école · période / culture · matière) : la place
     manque, et ils sont souvent vides. Le titre et le prix priment. */
  .rasa-table__row > *:nth-child(5),
  .rasa-table__row > *:nth-child(6) { display: none; }
  .rasa-table__row > *:nth-child(7) { grid-area: sec; text-align: left !important; }
  .rasa-table__row > *:nth-child(8) { grid-area: res; text-align: right !important; }
  /* Le titre s'arrête à deux lignes : sans cette borne une ligne pouvait
     faire 155px quand sa voisine en faisait 109, et le tableau perdait sa
     régularité — c'est le « mal répartis » de l'op.
     `display` porte un `!important` : les deux gabarits posent
     `style="…display:block"` EN LIGNE sur le titre, et un style en ligne bat
     n'importe quel sélecteur de feuille. Sans lui le rognage restait inerte —
     mesuré côté musées, une ligne montait à 330px quand sa voisine faisait
     73px. */
  .rasa-table__row > *:nth-child(4) > *:first-child {
    display: -webkit-box !important; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden; overflow-wrap: anywhere;
  }
  .rasa-table__row > *:nth-child(4) > *:last-child { overflow-wrap: anywhere; }
  /* Les trois cellules courtes sont bornées à deux lignes, et coupables
     n'importe où : un numéro d'inventaire sans espace (« 64.167.15 »)
     dépassait sa colonne, et un champ date libre côté musées
     (« Sunday, September 14, 1119 (year 239 of… ») s'étalait sur cinq lignes
     — à lui seul il portait la ligne à 169px. */
  .rasa-table__row > *:nth-child(3),
  .rasa-table__row > *:nth-child(7),
  .rasa-table__row > *:nth-child(8) {
    display: -webkit-box !important; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden; overflow-wrap: anywhere;
  }
}

/* ==========================================================================
   Audit responsive téléphone (2026-07-27) — suite de #1495/#1496/#1498.
   Sweep de 29 pages × 3 gabarits (360/390/414) sur le code servi en prod.
   Rappel du piège de fond : html/body portent `overflow-x: clip` — un
   contenu qui dépasse n'est PAS défilable, il est INATTEIGNABLE. Chaque
   règle ci-dessous corrige un dépassement mesuré, pas une hypothèse.
   ========================================================================== */
@media (max-width: 899px) {
  /* (1) Barre d'outils des pages « Explorer ». Elle est en `flex` sans
     wrap (l. 375) : sur /museums/objects, seule page à porter en plus le
     lien « inclure les objets sans image », elle mesure 542px pour 390 —
     le sélecteur de tri (x=302→440) ET les 3 modes d'affichage
     (x=458→556) sortent de l'écran et deviennent inatteignables.
     Les 3 autres pages de navigation tiennent (362px) : le wrap ne les
     change pas, il ne s'active que s'il y a débordement. */
  .rasa-results__tools { flex-wrap: wrap; row-gap: 10px; }

  /* (2) RETIRÉ le 28/07 — le panneau de confirmation `.rasa-folder__confirm`
     n'existe plus : la refonte « tiroir » a remplacé le dépliant de suppression
     par le menu « ⋯ » de l'en-tête de dossier (§MES DOSSIERS), dont la version
     téléphone est traitée là-bas (`.rasa-fold__menu`, ancré à gauche et pleine
     largeur). Le défaut d'origine reste documenté : le panneau se posait à
     left=-174 et son bouton « Confirmer » à left=-161, donc entièrement hors
     écran — supprimer un dossier était impossible au doigt. */

  /* (3) Ligne de synthèse d'un parcours (« N passages · N ans · +X % ·
     +Y %/an annualisé »), en `white-space:nowrap` inline : coupée de
     66px à 390 et de 124px à 360 — le rendement annualisé disparaissait.
     La ligne titre+synthèse passe en colonne, la synthèse se replie. */
  .rasa-jrn__head { flex-wrap: wrap; gap: 6px 18px !important; }
  .rasa-jrn__sum { white-space: normal !important; }

  /* (4) Zoom automatique d'iOS Safari : tout champ de saisie sous 16px
     déclenche un zoom au focus qui décale la mise en page. Mesuré : le
     champ de recherche de la nav est à 13px SUR TOUTES LES PAGES, le
     couple e-mail/mot de passe de la connexion à 15px, le champ d'accueil
     des ventes à 15,5px, les listes tri/pagination à 12,5px.
     `!important` : ces tailles sont posées en style inline. */
  .rasa-nav__search-input,
  input[type="text"], input[type="search"], input[type="email"],
  input[type="password"], input[type="number"], input[type="tel"],
  input[type="url"], input:not([type]), textarea, select { font-size: 16px !important; }

  /* (5) Indications d'un geste qui n'existe pas au doigt (molette, survol). */
  .rasa-hint-pointer { display: none; }
}

@media (max-width: 599px) {
  /* (6) Titres de page dont la taille est posée en style inline : ils
     échappent à l'échelle mobile de `.rasa-page-title`. Mesuré de 31 à
     46px conservés tels quels sur téléphone. `overflow-wrap` protège le
     titre de /account, qui est une adresse e-mail (chaîne insécable). */
  .rasa-hero-title {
    font-size: 28px !important;
    line-height: 1.14 !important;
    overflow-wrap: anywhere;
  }

  /* (7) Champ de recherche d'accueil des ventes. Mesuré : 159px de texte
     utile pour un libellé d'invitation qui en demande 515 → 31 % visible,
     alors que c'est le geste central de la page. Le champ et le bouton
     s'empilent, chacun sur toute la largeur. */
  .rasa-auc { padding-left: 20px !important; padding-right: 20px !important; }
  .rasa-auc__searchform { height: auto !important; flex-wrap: wrap; }
  .rasa-auc__searchform > input { flex: 1 0 100% !important; height: 52px; }
  .rasa-auc__searchform > button { flex: 1 0 100%; height: 48px !important; padding: 0 16px !important; }

  /* (8) Marge latérale des pages « fiche/liste ». Plusieurs gabarits posent
     `padding:34px 30px 80px` en style INLINE sur `.rasa-container` : la règle
     mobile (14px) ne gagne jamais, et 32px de largeur sont perdus. Sur
     /folders et /favorites cela suffisait à faire basculer la grille de 2
     colonnes à 1 — `minmax(160px, 1fr)` avec 330px utiles et 12px de
     gouttière donne 159px par colonne, UN pixel sous le minimum. D'où des
     pages de 43 écrans (mesuré 36 364px) faites de cartes de 525px empilées
     une par une. On ne corrige QUE l'horizontal : le rythme vertical inline
     des gabarits est conservé. Les pages « Explorer » gardent leur padding 0
     (leur rail et leurs résultats portent déjà le leur) — d'où le :not(). */
  .rasa-container:not(:has(> .rasa-explore)) {
    padding-left: 14px !important;
    padding-right: 14px !important;
  }
}

/* ==========================================================================
   Audit responsive téléphone — 2e passe (2026-07-27) : lisibilité, place à
   l'écran et cibles tactiles. Suite de #1501, mêmes mesures (390px sauf
   mention). `!important` est nécessaire partout où la valeur d'origine est
   posée en style inline dans un gabarit ou dans un <style> de gabarit :
   rasa.css est chargé AVANT ces blocs et perdrait à spécificité égale.
   ========================================================================== */
@media (max-width: 899px) {
  /* (9) Bandeau de paramètres de /search/keyword. Mesuré après défilement :
     nav 70px + bandeau 350px = 420px figés, soit 50 % d'un écran de 844.
     Le repli existant (`--shrink`, piloté par rasa.js bindSearchHead) ne
     comprime que le champ (56→42) et replie l'avertissement (14→0) ; les
     pastilles de corpus (112px) et la rangée de contrôles (128px) restent
     à pleine taille — 240px des 350. On les replie sur le même `--shrink`,
     exactement comme l'avertissement : le bandeau tombe à ~110px (13 %).
     Elles reviennent en remontant en haut de page. 200px de marge : la
     valeur haute couvre les pastilles qui passent à la ligne. */
  .rasa-searchhead .rasa-corpus-chips,
  .rasa-searchhead .rasa-search-controls {
    overflow: hidden;
    max-height: calc(200px * (1 - var(--shrink, 0)));
    opacity: calc(1 - 1.4 * var(--shrink, 0));
    margin-top: calc(14px * (1 - var(--shrink, 0)));
  }

  /* (10) En-tête collé de la fiche publication : 258px sous la nav, soit
     328px au total = 39 % de l'écran, pour une information d'identité (pas
     de contrôle). Il défile avec la page sur téléphone. */
  .rasa-pubhead { position: static !important; }

  /* (11) Plancher de lisibilité à 11px. Mesuré à 390px avant correction :
     8,4px sur la note de méthode d'un parcours, 8,8px sur les <small>,
     9px sur les intitulés de la fiche publication, 9,5px (82 occurrences),
     et 10px sur les étiquettes de carte — répétées ~470 fois par page de
     grille. Le corps de texte étant à 12,5-16px, la hiérarchie tient. */
  .rasa-card__toplabel, .rasa-card__topright, .rasa-card__unsold,
  .eyebrow, .tnum, .rasa-jrn__pill, .rasa-jd__kl, .rasa-jd__ratio,
  .rasa-corpus-chip__count, .rasa-corpus-chip--all span,
  .rasa-cmp__ctl-label, .rasa-login__eyebrow,
  .rasa-jd__method, .rasa-searchhead__note {
    font-size: 11px !important;
  }
  /* `small` est RELATIF (~0.83em) : dans un contexte déjà réduit à 10,5px il
     tombait à 8,75px. `max()` pose un vrai plancher — il relève les cas trop
     petits SANS rapetisser ceux qui vivent dans un contexte plus grand, ce
     qu'une taille fixe aurait fait. */
  small { font-size: max(11px, 0.83em) !important; }

  /* (12) Cibles tactiles sous le minimum WCAG 2.2 AA (24×24). Mesuré :
     replis de facettes 362×18 (11 par page de navigation), cases à cocher
     des piliers 13×13, liens du pied de page 27×15 (toutes les pages),
     icône de recherche par image de la nav 23px de large. Seule la ZONE
     grandit — le rendu visuel est inchangé. */
  .rasa-facet-group__toggle { min-height: 32px; }
  .rasa-footer a { display: inline-block; padding-top: 5px; padding-bottom: 5px; }
  .rasa-nav__search-img { min-width: 24px; }
  input[type="checkbox"][name="sources"] { width: 24px; height: 24px; }

  /* (14) Curseurs au doigt (op 2026-07-27). Deux familles, deux problèmes :
     · les curseurs natifs (seuil et nombre de comparables, opacité du duo,
       taille des vignettes en galerie) mesuraient 88 à 128px de large pour
       ~20px de haut : la bande où le doigt accroche est trop mince. On
       augmente la HAUTEUR de la zone sensible sans toucher au rendu natif
       (`accent-color` conservé) ;
     · les curseurs doubles (prix, estimation, années) sont custom : seul le
       POUCE est sensible (`pointer-events:auto`), et il faisait 15px — sous
       le minimum WCAG de 24. Porté à 28px, la bande d'entrée suit. */
  .rasa-cmp__range, input[type="range"][data-img-size] { height: 34px; }
  .rasa-cmp__range { width: 100%; min-width: 150px; }
  input[type="range"][data-img-size] { width: 116px !important; }
  .rasa-dslider__lo, .rasa-dslider__hi { height: 34px; top: -15px; }
  .rasa-dslider__lo::-webkit-slider-thumb, .rasa-dslider__hi::-webkit-slider-thumb {
    width: 28px; height: 28px;
  }
  .rasa-dslider__lo::-moz-range-thumb, .rasa-dslider__hi::-moz-range-thumb {
    width: 28px; height: 28px;
  }

  /* (15) Tiroir de navigation — sortie visible + sections lisibles. */
  .rasa-nav__drawer-close {
    position: absolute; top: 10px; right: 14px;
    width: 44px; height: 44px; line-height: 1;
    background: none; border: 0; color: var(--ink);
    font-size: 30px; cursor: pointer;
  }
  .rasa-nav__drawer { position: fixed; }   /* ancre du bouton ci-dessus */
  .rasa-nav__drawer-sect {
    margin: 18px 0 4px; padding-bottom: 6px;
    border-bottom: 1px solid var(--line);
    font-size: 10.5px; letter-spacing: .16em; text-transform: uppercase;
    color: var(--inksoft); font-weight: 600;
  }
  .rasa-nav__drawer-sect:first-of-type { margin-top: 4px; }
  .rasa-nav__drawer-signout { margin: 18px 0 0; padding-top: 14px; border-top: 1px solid var(--line); }
  .rasa-nav__drawer-link--signout {
    width: 100%; text-align: left; background: none; border: 0;
    font: inherit; color: var(--inksoft); cursor: pointer;
    /* `padding: 0` écrasait le `13px 2px` des autres liens du tiroir : la
       cible retombait à la hauteur du texte, 19px MESURÉS — sous le plancher
       WCAG 2.2 AA (24) et deux fois moins que ses voisines. Défaut introduit
       avec la déconnexion elle-même (#1515). */
    padding: 13px 2px;
  }
  .rasa-nav__drawer-link--signout:hover { color: var(--ink); }

  /* (13) Visionneuse d'image (tape sur l'image d'un objet). Mesuré avant :
     l'en-tête prenait 420px sur 844 — la moitié de l'écran — parce que le
     titre et le bloc de zoom (deux boutons + un curseur + un pourcentage,
     calibrés pour la souris) se disputaient une rangée de 390px : le titre
     tombait dans une colonne de 102px, un mot par ligne, et le bloc de
     contrôles débordait jusqu'à 506px, emportant le × HORS DE L'ÉCRAN — la
     visionneuse ne pouvait plus être fermée au doigt.
     Ici : le zoom passe aux gestes (pincer / double-tape, cf. rasa.js
     LB._bindTouch), le × devient une cible de 44px ancrée en haut à droite,
     et la légende occupe la largeur sur deux lignes au plus. */
  .rasa-lightbox__head {
    display: block; padding: 12px 62px 10px 16px; position: relative;
  }
  .rasa-lightbox__head [data-rasa-lb-title] {
    font-size: 15px !important; line-height: 1.25;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden;
  }
  /* Curseur, +, −, % : remplacés par les gestes. Le × reste, agrandi. */
  .rasa-lightbox__slider,
  .rasa-lightbox__zoom,
  [data-rasa-lb-zoomin], [data-rasa-lb-zoomout] { display: none !important; }
  .rasa-lightbox__head > div:last-child {
    position: absolute; top: 8px; right: 10px; gap: 0 !important;
  }
  [data-rasa-lb-close] {
    width: 44px !important; height: 44px !important;
    font-size: 26px !important; margin-left: 0 !important;
  }
  /* Le geste doit appartenir à la visionneuse, pas faire défiler la page
     derrière elle. */
  .rasa-lightbox__stage { touch-action: none; }
  .rasa-lightbox__stage [data-rasa-lb-img] {
    max-width: 100vw !important; max-height: 100% !important;
  }
  /* « ← → · ＋ − · Esc » : des raccourcis clavier, sur un écran tactile. */
  .rasa-lightbox__foot { display: none; }
  /* Flèches ramenées au bord, au même gabarit tactile que le × (44px). Le
     balayage fait le même travail, mais les flèches restent la voie
     découvrable — et un fond translucide les décolle des images claires. */
  .rasa-lightbox__nav {
    width: 44px; height: 44px;
    background: rgba(14, 12, 13, .45);
    border-color: rgba(244, 239, 230, .45);
  }
  .rasa-lightbox__nav.prev { left: 6px; }
  .rasa-lightbox__nav.next { right: 6px; }
}

/* ==========================================================================
   Native currency reveal (op 2026-07-09 — mutualisé depuis le template lot) :
   the EUR-normalized value stays primary ; the source-currency equivalent
   reveals on hover of its row. Base class here ; each page wires its own
   hover trigger (lot fieldrow dans son template / compare price row ici).
   ========================================================================== */
.rasa-native {
  display: inline-block;
  opacity: 0;
  margin-left: 12px;
  color: var(--inksoft);
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 11.5px;
  font-weight: 400;
  letter-spacing: 0;
  transition: opacity .15s ease;
  pointer-events: none;
}
.rasa-native::before { content: "≈ "; font-style: normal; color: var(--inksoft); opacity: .7; }
[data-attr-row="price"] > div:hover .rasa-native { opacity: 1; }

/* ==========================================================================
   Cartel sections (op 2026-07-09) — shared by the lot AND museum detail pages
   (filter `cartel`, routes/public/cartel_text.py). Real <p> blocks, 90ch
   reading measure (op choice ; the 1120px frame stays for the sticky
   sec-heads). NO hyphens:auto — pages are lang=fr, texts mostly English →
   wrong French hyphenation ("tra-ced", "Pun-jab"), seen on the design mockup.
   ========================================================================== */
/* Single-column content sits in the 2-column GRID : capped at the LEFT
   column's width (50% − half the 44px gap), so provenance / bibliographie /
   exposé and short prose all read as « colonne de gauche » under the 2-col
   prose above (op 2026-07-09 — replaces the earlier 90ch cap). */
.rasa-cartel p { white-space: pre-line; margin: 0 0 12px; max-width: calc(50% - 22px); text-wrap: pretty; }
.rasa-cartel p:last-child { margin-bottom: 0; }
/* V2 sub-heads (op choice, faithful to the source treatment) : serif italic,
   ink, one blank line above — embedded "Provenance"/"Literature"… titles
   detected by the closed bilingual list. */
.rasa-cartel__sub {
  display: block;
  font-family: var(--font-serif);
  font-style: italic;
  font-size: 1.05em;
  color: var(--ink);
  font-weight: 500;
  margin: 20px 0 8px;
}
.rasa-cartel > .rasa-cartel__sub:first-child { margin-top: 0; }
/* Reference lists (Bibliographie / Exposé / exhibitions / after an embedded
   list-like heading) : one entry per line, left-column width like the rest,
   turnovers FLUSH LEFT (op 2026-07-09 — the 20px hanging indent read as an
   accidental indentation). text-wrap normal (NOT pretty) : pretty's last-line
   balancing broke « Philip / Wilson » mid-publisher ; the NBSP bindings in
   cartel_text._bind_ref keep the turnovers semantic instead. */
/* Entrées de référence (exhibition / exhibited / literature) : même écart inter-entrées
   que la provenance (0.5rem > interligne intra-entrée), pour distinguer chaque entrée.
   Interligne hérité de .rasa-cartel. Largeur = même mesure de lecture 34rem que la
   provenance (au lieu du cap 50% du conteneur), pour l'homogénéité (op 2026-07-18). */
.rasa-cartel p.rasa-cartel__ref { margin: 0 0 0.5rem; text-wrap: initial; max-width: 34rem; }
/* Prose of a cols-enabled section (Description / Notice / Overview).
   LARGEUR DE COLONNE IDENTIQUE entre sections ET RESPONSIVE (op 2026-07-14) : à un
   instant donné toutes les sections d'une page ont EXACTEMENT la même largeur de
   colonne, mais cette largeur n'est PAS figée — elle grandit/rétrécit avec le cadre
   (fluide, bornée 24rem…34rem). Seul le NOMBRE de colonnes (1→3) diffère entre
   sections. Une colonne s'ajoute ssi (1) le texte a de quoi la remplir (palier
   contenu `_COL_CHAR_CAP`, filtre `cartel_sections` → `--cols2`/`--cols3` = le
   « voulu ») ET (2) le cadre est assez large (capacité `--cap`, container queries).
   Mécanique :
   - `--cap` = nb max de colonnes que le CADRE peut tenir (à ≥ 24rem/colonne),
     relevé par les container queries (1 → 2 à 50.75rem → 3 à 77.5rem).
   - `--wc` = largeur de colonne PARTAGÉE = min(cadre / cap, 34rem). Comme `--cap`
     et `100cqi` (largeur du cadre) sont les MÊMES pour toutes les sections, `--wc`
     est identique partout → colonnes de même largeur, quel que soit leur nombre.
   - `--n` = colonnes effectives = min(voulu, cap) (posé par bande × palier).
   - Le bloc fait EXACTEMENT `n × wc + (n-1) gouttières` (`column-count` + `width`
     calc) → aucun étirement/écrasement ; seul le BLOC varie de largeur avec n.
   Container queries = réagissent au CADRE réel (pas au viewport) → robustes fiche
   lot ET musée. Root font-size 16px (aucun override) → gouttière 2.75rem = 44px.
   Justification + césure sur TOUTE la prose (mono-colonne comprise). */
/* Interligne UNIQUE pour tout le texte de cartel (op 2026-07-18) : une seule règle
   ici, héritée par .rasa-cartel__body p / .rasa-cartel__ref / .rasa-cartel p — plus
   de valeurs inline par <div> (crop/musée/lot) ni d'override 1.55 sur les refs, qui
   rendaient l'interligne incohérent d'une section/page à l'autre. Ratio (pas px) →
   cohérent quelle que soit la font-size de la section (14px prose / 13.5px refs). */
.rasa-cartel { container-type: inline-size; line-height: 1.66; }
.rasa-cartel__body {
  --gap: 2.75rem;
  --cap: 1;     /* capacité du cadre (nb max de colonnes), relevée par les CQ */
  --want: 1;    /* colonnes voulues par le contenu (paliers ci-dessous) */
  --n: 1;       /* effectif = min(voulu, cap) — posé par bande × palier */
  column-gap: var(--gap);
}
.rasa-cartel__body--cols2 { --want: 2; }
.rasa-cartel__body--cols3 { --want: 3; }
@container (min-width: 50.75rem) {   /* tient 2 colonnes (2 × 24rem + 1 gouttière) */
  .rasa-cartel__body { --cap: 2; }
  .rasa-cartel__body--cols2,
  .rasa-cartel__body--cols3 { --n: 2; }
}
@container (min-width: 77.5rem) {    /* tient 3 colonnes (3 × 24rem + 2 gouttières) */
  .rasa-cartel__body { --cap: 3; }
  .rasa-cartel__body--cols3 { --n: 3; }
}
.rasa-cartel__body {
  /* largeur de colonne partagée = cadre / capacité, plafonnée à 34rem (lisibilité) */
  --wc: min(calc((100cqi - (var(--cap) - 1) * var(--gap)) / var(--cap)), 34rem);
  column-count: var(--n);
  width: calc(var(--n) * var(--wc) + (var(--n) - 1) * var(--gap));
  max-width: 100%;
}
.rasa-cartel__body p {
  max-width: none;   /* la largeur du bloc fixe déjà la mesure par colonne */
  text-align: justify;
  text-justify: inter-word;
  orphans: 2;
  widows: 2;
  hyphens: auto;
  -webkit-hyphens: auto;
  margin: 0;                       /* alinéa : les §§ ne s'espacent pas verticalement */
}
/* Prose multi-§ en alinéas (op 2026-07-15) : §§ séparés par un retrait de 1re ligne
   (text-indent) plutôt qu'un espace vertical → les 2 colonnes s'équilibrent. Sinon
   `column-fill: balance` égalise le NOMBRE DE LIGNES mais les 3 marges inter-§ tombent
   toutes dans la colonne 2, qui finit ~1,5 ligne plus basse (décrochage col1↔col2). */
.rasa-cartel__body p + p { text-indent: 1.5em; }
/* Description issue d'une caption DÉCOMPOSÉE (op 2026-07-17, divine_pleasures) : les
   blocs sont une entrée de catalogue distincte (médium / inscription / statut), pas un
   essai en prose continue → pas d'alinéa 1re-ligne, un espacement vertical les sépare
   (fer à gauche, la métadonnée ne se justifie pas comme de la prose). */
.rasa-cartel--catalogue .rasa-cartel__body p + p { text-indent: 0; }
/* Liste (provenance) = UNE colonne à largeur STABLE = espace dispo plafonné à la mesure
   de lecture, PAS la largeur frame/cap des essais multi-colonnes (op 2026-07-18). Cette
   dernière divise la colonne unique par --cap (1→2→3 selon la fenêtre via les container
   queries) → la colonne RÉTRÉCIT quand on ÉLARGIT la fenêtre, déclenchant un retour à la
   ligne contre-intuitif (« …given to the » / « Cleveland Museum of Art »). */
.rasa-cartel--catalogue .rasa-cartel__body { column-count: 1; width: auto; max-width: 34rem; }
/* Entrées de référence (provenance) — op 2026-07-18 : (1) écart inter-entrées
   DÉLIBÉRÉMENT plus grand que l'interligne intra-entrée (line-height 1.66) pour
   distinguer chaque entrée (même écart que les refs/exhibition, ci-dessus) ; (2) fer à
   gauche ; (3) PAS de césure — les noms propres / citations ne se coupent pas
   (« given to the » / « Cleveland Museum of Art » se cassait mal en responsive). */
.rasa-cartel--catalogue .rasa-cartel__body p { margin: 0 0 0.5rem; text-align: left; hyphens: none; -webkit-hyphens: none; }
.rasa-cartel--catalogue .rasa-cartel__body p:last-child { margin-bottom: 0; }
/* Bloc-titre de tête (désignation tout-capitales / titre CJK) SORTI des colonnes
   (op 2026-07-14, lot 35065 « A SANDSTONE STELE OF GANESHA / CENTRAL INDIA, CIRCA
   10TH CENTURY ») → pleine largeur AU-DESSUS des colonnes, fer à gauche (pas
   justifié : c'est un titre) → les deux colonnes de prose démarrent EN DESSOUS,
   alignées. `white-space: pre-line` hérité → les lignes du titre restent séparées. */
.rasa-cartel__head { margin: 0 0 1.1rem; }
.rasa-cartel__head p {
  max-width: none;
  text-align: left;
  hyphens: none;
  -webkit-hyphens: none;
  margin: 0 0 2px;
}
/* Cadres étroits (mobile) : les listes incrustées `.rasa-cartel p` (hors body,
   ex. provenance/exposé) lèvent leur cap 50% pour lire pleine largeur. */
@media (max-width: 899px) {
  .rasa-cartel p { max-width: none; }
}

/* ==========================================================================
   Help bubble (« bulle d'aide ») — composant réutilisable, op 2026-07-11.
   Markup : templates/public_overrides/_help.html ; dismiss : rasa.js
   bindHelpBubbles (localStorage). La visibilité est du CSS PUR — survol OU
   focus clavier (:focus-within), aucun JS requis pour l'ouverture (CSP).
   La bulle est FLUSH sous (ou sur, --up) son hôte : le pointeur peut y
   voyager sans interstice pour cliquer « Ne plus afficher ».
   z70 dans le stacking context de l'hôte : au-dessus des rigs voisins
   (cmp head 25, masque d'interstice 26, bande image 30) — une bulle
   ouverte depuis un header sticky ne doit jamais passer sous un masque.
   Jamais coupée tant que les ancêtres de l'hôte ne posent pas
   d'overflow:hidden (les strips de vignettes et .rasa-cmp__head n'en
   posent pas ; [data-lot-img] en pose un — placer l'hôte À CÔTÉ, pas
   dedans). Résiste au contexte typographique de l'hôte (eyebrow
   uppercase/letter-spacing) : la bulle re-déclare famille/casse/châsse.
   ========================================================================== */
.rasa-help { position: relative; display: inline-flex; vertical-align: middle; }
.rasa-help__btn {
  width: 16px; height: 16px; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--inksoft); border-radius: 50%;
  color: var(--inksoft); background: none; padding: 0; cursor: help;
  font-family: var(--font-serif); font-style: italic;
  font-size: 11px; line-height: 1; letter-spacing: 0; text-transform: none;
}
.rasa-help:hover .rasa-help__btn,
.rasa-help:focus-within .rasa-help__btn { border-color: var(--gold); color: var(--gold); }
.rasa-help__pop {
  position: absolute; top: 100%; left: 0; z-index: 70;
  width: max-content; max-width: 300px;
  padding: 10px 12px;
  background: var(--paper); color: var(--ink);
  border: 1px solid var(--ink); box-shadow: var(--shadow-thumb);
  font-family: var(--font-sans); font-style: normal; font-weight: 400;
  font-size: 12px; line-height: 1.45; letter-spacing: normal;
  text-transform: none; white-space: normal; text-align: left;
  opacity: 0; visibility: hidden; transition: opacity .12s ease;
  pointer-events: none;
}
.rasa-help--up .rasa-help__pop { top: auto; bottom: 100%; }
.rasa-help--right .rasa-help__pop { left: auto; right: 0; }
.rasa-help:hover .rasa-help__pop,
.rasa-help:focus-within .rasa-help__pop { opacity: 1; visibility: visible; pointer-events: auto; }
.rasa-help__text { display: block; }
.rasa-help__dismiss {
  display: inline-block; margin-top: 8px; padding: 0;
  background: none; border: none; cursor: pointer;
  font-size: 10.5px; letter-spacing: .08em; text-transform: uppercase;
  color: var(--gold); text-decoration: underline; text-underline-offset: 2px;
}
.rasa-help__dismiss:hover { color: var(--ink); }
/* Ancêtre-contexte d'empilement à élever pendant l'affichage d'une bulle.
   Le z-index de .rasa-help__pop (70) ne joue QUE dans son propre contexte :
   si l'ancêtre sticky (ex. wrapper image z30 de la page résultats upload)
   peint sous le cartel (z30, plus tard dans le DOM), la bulle passe dessous.
   Poser data-help-raise sur l'ancêtre → élevé au survol/focus de la bulle.
   !important : le z-index de ces wrappers est inline dans les templates. */
[data-help-raise]:has(.rasa-help:hover),
[data-help-raise]:has(.rasa-help:focus-within) { z-index: 40 !important; }
/* Dismissed (rasa.js marque l'hôte depuis localStorage) : survol inerte. */
.rasa-help.is-dismissed .rasa-help__pop { display: none; }
/* Bulles display-gated : cachées sauf si un ancêtre porte le gate.
   Usage 'cmp-multiview' (header des comparables) : le partial async est
   agnostique de la page — c'est l'ancre [data-cmp-swap] (stable à travers
   les swaps rasa.js) qui porte data-cmp-multiview quand l'objet a ≥ 2 vues
   ET que changer de vue rafraîchit les comparables (lot / musée / upload —
   PAS la fiche HAR, dont les vignettes ne swappent que l'image). */
.rasa-help[data-help-gate] { display: none; }
[data-cmp-multiview] .rasa-help[data-help-gate="cmp-multiview"] { display: inline-flex; }

/* ==========================================================================
   TÉLÉPHONE — la fiche objet garde son identité au défilement (op 2026-07-27)
   --------------------------------------------------------------------------
   Mesuré à 390×844 sur le code servi, AVANT correction :
     · fiche lot     — image 95→323, vignettes 340→398, barre d'actions
                       461→557, cartel 579→827 : le titre est à 681, la
                       première section de texte à 897, donc SOUS la ligne de
                       flottaison (844). Passé y=900, il ne reste que la nav :
                       on lit une notice sans savoir de quel objet il s'agit.
     · fiche musée   — pire : l'image fait 574px de haut, le titre est à 1029.
                       Il faut défiler plus d'un écran entier pour le lire.
   Sur ORDINATEUR ce problème n'existe pas : le « rig » (rasa.js
   bindLotDetail) rétrécit l'image en une bande de 300px et comprime le
   cartel à côté — l'objet reste présent pendant toute la lecture. Ce rig
   sort explicitement sur mobile (rasa.js l.682) : deux colonnes ne tiennent
   pas dans 390px, et sa barre d'actions épinglée sortirait de l'écran.

   Traduction mobile — le geste, pas la mécanique. Plutôt que de rétrécir en
   continu (une course de shrink se bat contre l'inertie du défilement
   tactile), l'objet se REPLIE en cartel de musée : une barre unique sous la
   nav, vignette + ligne de source + titre. Elle n'apparaît QUE lorsque le
   vrai cartel est sorti par le haut, et disparaît dès qu'il revient — au
   repos la page est strictement inchangée.
   Deux gestes : la vignette rouvre la visionneuse sur la vue courante, le
   reste de la barre ramène en haut de fiche.
   Le pilotage (bascule + course de la nav) est dans rasa.js `bindMobileObjBar`.
   ========================================================================== */
/* Inerte HORS téléphone — règle de base, volontairement à l'extérieur de la
   media query. rasa.js construit la barre dès qu'il reconnaît une fiche objet,
   sans regarder la largeur ; si sa mise en forme n'existait qu'à ≤899px, elle
   apparaîtrait en bloc brut sur ordinateur. */
.rasa-objbar { display: none; }

@media (max-width: 899px) {
  /* --- Nav comprimée à la course (70 → 52px) ---------------------------
     `--nav-shrink` (0→1) est écrit par rasa.js sur <html>. Redéfinir
     `--nav-height` ICI suffit : les ~10 ancrages sticky de la feuille
     (bande de recherche, rail de facettes, barre d'identité ci-dessous)
     sont tous exprimés en `var(--nav-height)` et suivent donc seuls.
     18px rendus au contenu, sans jamais escamoter la nav : le burger doit
     rester atteignable à tout moment (le tiroir est la seule voie vers les
     corpus et la déconnexion sur téléphone). */
  :root { --nav-height: calc(70px - 18px * var(--nav-shrink, 0)); }
  .rasa-nav__brand-word { font-size: calc(20px - 3.5px * var(--nav-shrink, 0)); }
  .rasa-nav__search { height: calc(38px - 6px * var(--nav-shrink, 0)); }
  /* Le liseré bas de la nav se densifie avec la course : au repos il se
     confond avec le fond, comprimé il marque la limite du contenu. */
  .rasa-nav { box-shadow: 0 6px 16px -12px rgba(0, 0, 0, calc(.55 * var(--nav-shrink, 0))); }

  /* --- Barre d'identité de l'objet ------------------------------------
     `fixed` et non `sticky` : injectée par JS hors flux, elle ne doit
     déplacer aucun contenu en apparaissant (un `sticky` en tête de <main>
     décalerait la page de 58px au moment du repli). `top` suit la nav
     comprimée. z45 : au-dessus du contenu et de la bande de recherche
     (40), sous la nav (60) et la visionneuse.
     AUCUN attribut `hidden` ici — c'est le piège de #1515 : un `hidden`
     HTML bat la règle CSS et rend l'élément définitivement inerte. */
  .rasa-objbar {
    display: flex;
    position: fixed; top: var(--nav-height); left: 0; right: 0; z-index: 45;
    align-items: center; gap: 14px;
    /* +25 % (demande op 2026-07-28) : 58 → 73px, vignette 42 → 52.
       `--objbar-h` est publiée par rasa.js à la hauteur RÉELLE — les têtes
       de section et le header comparables s'y empilent (cf. plus bas). */
    padding: 10px 14px; min-height: 73px;
    background: var(--paper); border-bottom: 1px solid var(--line);
    /* Repos : repliée au-dessus de sa propre ligne, inerte. */
    transform: translateY(-101%);
    opacity: 0; visibility: hidden; pointer-events: none;
    transition: transform .26s cubic-bezier(.2, .7, .3, 1),
                opacity .18s ease, visibility 0s linear .26s;
  }
  .rasa-objbar.is-on {
    transform: translateY(0); opacity: 1; visibility: visible; pointer-events: auto;
    box-shadow: 0 12px 24px -20px rgba(0, 0, 0, .5);
    transition: transform .26s cubic-bezier(.2, .7, .3, 1),
                opacity .18s ease, visibility 0s;
  }
  /* La vignette « se pose » dans le cartel : léger retard sur la barre, elle
     grandit de 88% à 100%. Un seul temps fort, pas dix micro-animations. */
  .rasa-objbar__thumb {
    width: 52px; height: 52px; flex: none; padding: 0; border: 0;
    background: var(--paper2); overflow: hidden; cursor: zoom-in;
    display: flex; align-items: center; justify-content: center;
    transform: scale(.88); opacity: .4;
    transition: transform .3s cubic-bezier(.2, .9, .3, 1.1) .05s, opacity .22s ease .05s;
  }
  .rasa-objbar.is-on .rasa-objbar__thumb { transform: scale(1); opacity: 1; }
  .rasa-objbar__thumb img { width: 100%; height: 100%; object-fit: contain; display: block; }

  /* Zone « retour en haut de fiche » — tout le reste de la barre, donc une
     cible tactile pleine largeur plutôt qu'une flèche de 20px. */
  .rasa-objbar__nav {
    flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: 10px;
    padding: 4px 0; background: none; border: 0; cursor: pointer; text-align: left;
  }
  .rasa-objbar__txt { flex: 1 1 auto; min-width: 0; display: block; }
  .rasa-objbar__eyebrow {
    display: block; font-family: var(--font-mono);
    font-size: 11px; letter-spacing: .16em; text-transform: uppercase;
    color: var(--gold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .rasa-objbar__title {
    display: block; font-family: var(--font-serif); font-style: italic;
    font-size: 17px; line-height: 1.3; color: var(--ink); margin-top: 3px;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  /* Chevron de remontée : 28px visibles dans une cible de 44 (la zone
     cliquable est la barre entière, ceci n'est que le repère visuel). */
  .rasa-objbar__up {
    flex: none; width: 35px; height: 35px;
    display: flex; align-items: center; justify-content: center;
    font-size: 19px; line-height: 1; color: var(--inksoft);
    border: 1px solid var(--line);
  }
  /* La visionneuse (z100, fond opaque) recouvre déjà la barre — rien à
     prévoir de ce côté. */

  /* Bandeau de CONTEXTE (pages de liste et de lecture) : même composant, mais
     sa vignette est une couverture d'ouvrage — format portrait, pas carré. */
  .rasa-objbar[data-objbar-context] .rasa-objbar__thumb {
    width: 40px; height: 54px; cursor: default;
  }
  .rasa-objbar[data-objbar-context] .rasa-objbar__thumb img { object-fit: cover; }

  /* --- Vue TABLEAU (op 2026-07-28) ---------------------------------------
     Mesuré sur /dataset/browse?view=table : le pagineur déborde à 402 et
     482px pour un écran de 390 — `overflow-x: clip` sur html/body rend ce
     dépassement INATTEIGNABLE, donc changer de page était impossible.
     L'en-tête de colonnes, lui, était rendu COLLANT pour qu'on ne perde pas la
     signification des colonnes en défilant. Cette règle a été retirée le
     28/07 : les cellules sont désormais EMPILÉES (§Vue tableau, media 899px),
     donc l'en-tête ne surmonte plus rien et il est masqué. Chaque cellule se
     lit seule — l'estimation porte son propre « Est. ». */
  .rasa-pager { flex-wrap: wrap; justify-content: center; row-gap: 8px; }
  .rasa-pager__btn { min-height: 34px; }
}

/* ==========================================================================
   TÉLÉPHONE — les filtres derrière un dépliant (op 2026-07-27)
   --------------------------------------------------------------------------
   MESURÉ à 390×844 sur le code servi, le rail replié sous la recherche :
     /search/keyword ?pillar=museums      rail 1311px → 1re carte à y=2088 (2,5 écrans)
     /search/keyword ventes + musées      rail 2368px → 1re carte à y=3220 (3,8 écrans)
     /dataset/browse                      rail  735px → 1re carte à y=1002 (1,2 écran)
   On cherche, et il faut traverser deux à quatre écrans de filtres avant le
   premier résultat. L'écart entre les pages tient à la structure : « Explorer »
   a des groupes repliables (10-11), la recherche par mot-clé des listes PLATES
   toujours ouvertes (56 valeurs pour les seuls musées, 95 à deux corpus).

   Le rail passe derrière un dépliant replié par défaut. Le bouton PORTE le
   nombre de filtres actifs : replier ne doit jamais cacher qu'un filtre est
   en vigueur. Le pilotage est dans rasa.js `bindFacetDisclosure`.
   ========================================================================== */
/* Inerte hors téléphone — règle de base volontairement à l'extérieur de la
   media query : rasa.js construit le bouton sans regarder la largeur. */
.rasa-facets-toggle { display: none; }

@media (max-width: 899px) {
  .rasa-facets-toggle {
    display: flex; align-items: center; gap: 10px;
    width: 100%; min-height: 46px; padding: 0 14px;
    margin: 0 0 18px;
    background: var(--paper2); border: 1px solid var(--line); color: var(--ink);
    font-family: var(--font-mono); font-size: 11px;
    letter-spacing: .14em; text-transform: uppercase;
    cursor: pointer; text-align: left;
  }
  .rasa-facets-toggle__label { flex: 1 1 auto; min-width: 0; }
  /* Filtres en vigueur : pastille d'accent — c'est ce qui rend le repli
     honnête (on ne masque pas un état actif sans le dire). */
  .rasa-facets-toggle__count {
    flex: none; min-width: 20px; height: 20px; padding: 0 6px;
    display: flex; align-items: center; justify-content: center;
    background: var(--gold); color: var(--paper);
    font-size: 11px; letter-spacing: 0;
  }
  .rasa-facets-toggle__chev { flex: none; font-size: 15px; line-height: 1; color: var(--inksoft); }
  /* `display: none` : le rail replié ne laisse ni bordure ni marge derrière
     lui, rien à neutraliser en plus. */
  .rasa-facet-rail.is-collapsed { display: none; }
}

/* ==========================================================================
   TÉLÉPHONE — les actions des cartes existent enfin au doigt (op 2026-07-27)
   --------------------------------------------------------------------------
   Constat MESURÉ (390×844, tap tactile réel simulé sur /dataset/browse) :
   `.rasa-card__actions` est `opacity:0 ; pointer-events:none` et n'est
   révélé que par `:hover` (l.525). Sans souris il n'y a pas de survol —
   après un vrai `touchstart`/`touchend` sur le bouton, les styles calculés
   valent TOUJOURS opacity 0 / pointer-events none. Ce n'est donc pas une
   cible trop petite : la cible N'EXISTE PAS. Sauvegarder un objet ou le
   ranger dans un dossier depuis une grille était impossible au téléphone.
   Accessoirement les tailles étaient sous les seuils : ✓ de sélection et
   badges des comparables à 22×22, sous le minimum WCAG 2.2 AA (24×24).

   `(hover: none)` plutôt qu'une largeur : le signal juste est l'absence de
   dispositif de survol, pas la taille de l'écran.

   Tout révéler en permanence a été essayé et REJETÉ (mesuré) : ✓ + ⛶ + ☆ +
   dossier font 4 × 36 + 3 × 8 = 168px sur une carte qui en fait 168 — une
   barre d'outils opaque en travers du haut de chaque œuvre, sur toute la
   grille. D'où le dépliant : une seule pastille « ⋯ » par carte, qui ouvre
   les trois actions à la demande. Le ✓ de sélection, lui, reste visible en
   permanence : ce n'est pas une action mais un ÉTAT (« cet objet est déjà
   dans ma sélection à comparer »), il doit se lire d'un coup d'œil.
   ========================================================================== */
/* RÉVISION op 2026-07-28 — rien par défaut, tout au tap.
   -----------------------------------------------------
   La version de la veille laissait deux badges permanents sur chaque carte de
   grille (✓ 30px + ⋯ 34px) et QUATRE sur chaque carte comparable (⇄ ★ ⛶ 🗂) —
   mesuré à 390px : 190 cartes comparables sur une fiche lot, donc 760 pastilles
   peintes en travers des œuvres. L'op a tranché : sur téléphone la carte montre
   l'ŒUVRE, et rien d'autre, jusqu'à ce qu'on la touche.
   La pastille « ⋯ » est retirée (gabarit + feuille) : un glyphe muet n'apprend
   pas ce qu'il ouvre — l'op ne l'a pas reconnue. Le tap se fait donc sur la
   carte, et `bindCardActions` s'occupe de ne pas naviguer au premier contact.
   Seule exception assumée : un ✓ DÉJÀ coché reste visible (`.is-on`). Ce n'est
   pas une action offerte mais une sélection en cours ; la masquer ferait
   disparaître de l'écran ce que l'utilisateur vient de choisir. */
.rasa-card__more { display: none; }

@media (hover: none) {
  /* La pastille n'est plus rendue par le gabarit ; la règle reste comme
     garde-fou si un gabarit tiers en émettait encore une. */
  .rasa-card__more { display: none !important; }

  /* --- cartes de grille --- */
  .rasa-card__actions {
    top: 8px; right: 8px;
    flex-direction: column; gap: 8px;
    opacity: 0; pointer-events: none;
    transform: translateY(-6px);
    transition: opacity .16s ease, transform .16s ease;
  }
  .rasa-card__img.is-acts .rasa-card__actions {
    opacity: 1; pointer-events: auto; transform: translateY(0);
  }
  .rasa-card__act { width: 36px; height: 36px; font-size: 15px; }

  /* ✓ de sélection : masqué au repos, révélé au tap — SAUF s'il est coché.
     30px (le plancher WCAG 2.2 AA est 24). */
  .rasa-card__select {
    opacity: 0; pointer-events: none;
    width: 30px; height: 30px; font-size: 14px;
  }
  .rasa-card__img.is-acts .rasa-card__select,
  .rasa-cmpcard__img.is-acts .rasa-card__select,
  .rasa-card__select.is-on { opacity: 1; pointer-events: auto; }

  /* --- cartes comparables : même contrat --- */
  .rasa-cmpcard__duo, .rasa-cmpcard__fav {
    opacity: 0; pointer-events: none; width: 30px; height: 30px; font-size: 15px;
  }
  .rasa-cmpcard__img.is-acts .rasa-cmpcard__duo,
  .rasa-cmpcard__img.is-acts .rasa-cmpcard__fav,
  .rasa-cmpcard__fav.is-on { opacity: 1; pointer-events: auto; }

  /* L'empilement suit les badges agrandis (30 + 30 + deux écarts de 8 = 76). */
  .rasa-cmpcard__acts {
    opacity: 0; pointer-events: none; gap: 8px; margin-top: 76px;
    transition: opacity .16s ease;
  }
  .rasa-cmpcard__img.is-acts .rasa-cmpcard__acts { opacity: 1; pointer-events: auto; }
  .rasa-cmpcard__act,
  .rasa-cmpcard__acts .rasa-card__act { width: 30px; height: 30px; font-size: 15px; }

  /* Barre d'actions des fiches objet (⇄ comparer / ☆ favori / dossier) :
     30px de haut mesurés, sous le confort tactile. */
  .rasa-lot__topbar [data-c="actbtn"] { height: 40px !important; padding: 0 15px !important; }

  /* ✕ de retrait du bandeau : sans survol il doit être VISIBLE en permanence,
     et à 26px (le plancher WCAG 2.2 AA est 24). Il déborde alors de sa
     vignette pour ne pas couvrir l'image — d'où la réserve élargie du
     conteneur défilant, sans quoi il serait rogné. Le rig étant éteint sur
     téléphone, cet élargissement n'y déplace rien. */
  .rasa-tray__rm {
    opacity: 1; pointer-events: auto;
    width: 26px; height: 26px; font-size: 12px; top: -8px; right: -8px;
  }
  /* L'écart de 7px laissait le ✕ d'une vignette mordre sur sa voisine (il
     déborde de 8px) : deux cibles tactiles jointives, donc une erreur de
     suppression au pouce. 16px d'écart = 8px de dégagement franc. */
  .rasa-tray__thumbs { padding: 11px 11px 2px 2px; gap: 16px; }
}

/* ==========================================================================
   Print
   ========================================================================== */
/* ==========================================================================
   Mouvement réduit — respect du réglage système (aucune prise en charge
   jusqu'au 27/07). Concerne directement le défilement : le retour en haut de
   fiche est animé, la barre d'identité glisse, la bande de recherche et la
   nav se compriment. Pour qui a demandé moins d'animation, tout cela doit
   être instantané — c'est un réglage d'accessibilité, pas une préférence
   esthétique (mal des transports, troubles vestibulaires).
   ========================================================================== */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

@media print { .rasa-nav, .rasa-tray, .rasa-lightbox, .rasa-objbar { display: none !important; } }

/* ==========================================================================
   MES DOSSIERS — le « tiroir » (op 2026-07-28, proposition C)
   --------------------------------------------------------------------------
   L'ancienne page empilait TOUS les dossiers en grandes vignettes. Mesuré sur
   les 72 objets de l'opérateur : 12 614 px, soit 14 écrans d'ordinateur, et
   15 471 px, 18,3 écrans de téléphone — dont 9 626 px pour le seul dossier
   « Favoris ». Chaque carte occupait 513 px pour livrer cinq informations.

   Ici : un index à gauche, UN dossier déplié, des lignes de 40 px qui livrent
   autant. Mesuré sur la maquette : 3,2 écrans d'ordinateur, 4,2 de téléphone.
   La vignette tombe à 26 px — assez pour reconnaître une œuvre qu'on a soi-même
   rangée, pas assez pour dicter la hauteur.
   ========================================================================== */
.rasa-fold { padding: 34px 30px 90px; }
.rasa-fold__head {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 16px; flex-wrap: wrap;
  border-bottom: 1px solid var(--line); padding-bottom: 20px; margin-bottom: 26px;
}
.rasa-fold__new { margin: 0; display: flex; gap: 6px; align-items: center; }
.rasa-fold__new .rasa-input { height: 38px; padding: 0 10px; width: 220px; }
.rasa-fold__new button { height: 38px; padding: 0 16px; }

/* `min-width: 0` sur les DEUX colonnes : un élément de grille ne descend pas
   sous la largeur de son contenu (min-width auto). Sans lui, un titre long ou
   la bande d'onglets élargit le DOCUMENT — et html/body portent `overflow-x:
   clip`, donc ce débordement ne serait pas défilable mais INATTEIGNABLE.
   Mesuré sur la maquette : 521px de document pour une fenêtre de 390. */
.rasa-fold__split { display: grid; grid-template-columns: 250px minmax(0, 1fr); gap: 34px; align-items: start; }

/* ---- l'index ---- */
.rasa-fold__rail {
  position: sticky; top: calc(var(--nav-height) + 16px); min-width: 0;
  display: flex; flex-direction: column;
}
.rasa-fold__fi {
  display: block; text-decoration: none; color: var(--ink);
  border-left: 2px solid transparent; padding: 10px 12px;
}
.rasa-fold__fi:hover { background: var(--card-result); }
.rasa-fold__fi.is-on { border-left-color: var(--nav-bg); background: var(--card); }
.rasa-fold__fn {
  display: block; font-family: var(--font-serif); font-style: italic;
  font-size: 16px; line-height: 1.2;
}
.rasa-fold__star { color: var(--gold); font-style: normal; margin-right: 5px; }
.rasa-fold__fc { display: block; font-size: 10px; color: var(--inksoft); margin-top: 3px; }
.rasa-fold__mix { display: flex; height: 3px; margin-top: 7px; gap: 1px; }
.rasa-fold__mix i { display: block; height: 3px; min-width: 2px; }
.rasa-fold__mx--lot { background: var(--gold); }
.rasa-fold__mx--museum_object { background: var(--badge-green); }
.rasa-fold__mx--har_object { background: var(--gold-accent); }
.rasa-fold__mx--publication_illustration { background: var(--inksoft); }

/* ---- le panneau ---- */
.rasa-fold__panel { min-width: 0; }
/* La pile collante — nav, puis (sur téléphone) la bande d'onglets, puis
   l'en-tête du dossier, puis celui du corpus. Les deux hauteurs variables sont
   PUBLIÉES par rasa.js (`bindFolderStack`, même procédé que `--objbar-h`) :
   elles dépendent du contenu — un titre long, des boutons qui passent à la
   ligne — et une constante en dur les faisait se recouvrir (mesuré : le groupe
   passait sous l'en-tête de 12px sur ordinateur, 52px sur téléphone).
   Les valeurs de repli sont celles de l'ordinateur, donc justes script coupé,
   le cas le plus probable sans JavaScript. */
.rasa-fold__ph {
  position: sticky; top: calc(var(--nav-height) + var(--fold-rail-h, 0px));
  z-index: 24; background: var(--paper);
  display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  padding: 12px 0 11px; border-bottom: 1px solid var(--ink);
}
.rasa-fold__pn { font-family: var(--font-serif); font-style: italic; font-size: 25px; }
.rasa-fold__pc { font-size: 11px; color: var(--inksoft); }
.rasa-fold__pa { margin-left: auto; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.rasa-fold__b { height: 32px; padding: 0 13px; font-size: 12px; display: inline-flex; align-items: center; gap: 6px; }
.rasa-fold__b--gold { border-color: var(--gold); color: var(--gold); }
.rasa-fold__more { position: relative; }
.rasa-fold__more > summary { list-style: none; cursor: pointer; }
.rasa-fold__more > summary::-webkit-details-marker { display: none; }
.rasa-fold__menu {
  position: absolute; right: 0; top: 38px; z-index: 30; background: var(--paper);
  border: 1px solid var(--ink); padding: 12px; min-width: 260px;
  display: flex; flex-direction: column; gap: 12px;
}
.rasa-fold__menu form { margin: 0; display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.rasa-fold__menu .rasa-input { height: 30px; padding: 0 8px; font-size: 12px; flex: 1; min-width: 0; }
.rasa-fold__menu .rasa-btn { height: 30px; padding: 0 12px; font-size: 12px; }
.rasa-fold__del { background: #b10c0c; color: #fff; border-color: #b10c0c; }
.rasa-fold__warn { font-size: 10.5px; color: var(--inksoft); flex-basis: 100%; }
.rasa-fold__gap { font-size: 12px; color: var(--inksoft); font-style: italic; padding: 12px 0 0; }
.rasa-fold__vide { color: var(--inksoft); font-style: italic; font-family: var(--font-serif); font-size: 17px; padding: 30px 0; }

/* ---- un groupe par corpus ---- */
.rasa-fgrp { margin: 0; }
.rasa-fgrp__h {
  position: sticky;
  top: calc(var(--nav-height) + var(--fold-rail-h, 0px) + var(--fold-ph-h, 62px));
  z-index: 22;
  background: var(--paper2); margin: 0;
  display: flex; align-items: center; gap: 10px; padding: 7px 12px;
  border-bottom: 1px solid var(--line); border-top: 1px solid var(--line);
}
.rasa-fgrp__t { font-size: 9.5px; letter-spacing: .15em; text-transform: uppercase; font-weight: 700; }
.rasa-fgrp__n { font-size: 10px; color: var(--inksoft); }

/* ---- la ligne ---- */
.rasa-frow {
  display: grid; grid-template-columns: 22px minmax(0, 1fr) 26px;
  align-items: center; gap: 10px; padding: 0 12px;
  border-bottom: 1px solid var(--line);
}
.rasa-frow:hover { background: var(--card-result); }
/* La case porte toujours son glyphe (`.rasa-check` l'écrit en dur) : visible en
   permanence, elle donne à lire une ligne DÉJÀ cochée. On ne révèle le ✓ qu'une
   fois la sélection faite ; au repos la case reste vide, comme une case à cocher. */
.rasa-frow__sel { opacity: 0; transition: opacity .14s ease; color: transparent; }
.rasa-frow:hover .rasa-frow__sel, .rasa-frow__sel.is-on { opacity: 1; }
.rasa-frow__sel.is-on { color: var(--paper); }
.rasa-frow__link {
  display: grid; grid-template-columns: 26px minmax(0, 1fr) auto;
  align-items: center; gap: 12px; min-width: 0;
  text-decoration: none; color: inherit; height: 40px;
}
.rasa-frow__i {
  width: 26px; height: 26px; border: 1px solid var(--line);
  background: var(--paper2); overflow: hidden; flex: none;
}
.rasa-frow__i img { width: 100%; height: 100%; object-fit: cover; display: block; }
.rasa-frow__x { min-width: 0; }
.rasa-frow__t {
  display: block; font-family: var(--font-serif); font-style: italic; font-size: 14.5px;
  line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.rasa-frow__m {
  display: block; font-size: 10.5px; color: var(--inksoft); margin-top: 1px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.rasa-frow__money { display: flex; align-items: baseline; gap: 12px; white-space: nowrap; }
.rasa-frow__e { font-family: var(--font-mono); font-size: 10.5px; color: var(--inksoft); font-variant-numeric: tabular-nums; }
.rasa-frow__p { font-family: var(--font-mono); font-size: 12.5px; color: var(--gold); font-variant-numeric: tabular-nums; }
.rasa-frow__p--no { font-size: 9px; letter-spacing: .11em; text-transform: uppercase; color: var(--inksoft); }
.rasa-frow__rm button {
  width: 26px; height: 26px; padding: 0; background: none; border: 1px solid transparent;
  color: var(--inksoft); cursor: pointer; font-size: 12px; line-height: 1;
  opacity: 0; transition: opacity .14s ease;
}
.rasa-frow:hover .rasa-frow__rm button { opacity: 1; }
.rasa-frow__rm button:hover { border-color: var(--ink); color: var(--ink); }

/* ==========================================================================
   TÉLÉPHONE — l'index devient une bande d'onglets collante.
   Trois précautions mesurées : `min-width: 0` partout (sinon le document
   s'élargit et `overflow-x: clip` rend le dépassement inatteignable) ; les
   actions de ligne deviennent PERMANENTES (sans survol, `opacity: 0` les rend
   inexistantes au doigt) ; et l'en-tête de groupe se cale sous la bande ET
   sous l'en-tête de panneau, qui sont tous deux collants.
   ========================================================================== */
@media (max-width: 899px) {
  .rasa-fold { padding: 20px 14px 90px; }
  .rasa-fold__head { gap: 12px; padding-bottom: 14px; margin-bottom: 16px; }
  .rasa-fold__new { width: 100%; }
  .rasa-fold__new .rasa-input { width: auto; flex: 1; min-width: 0; }
  .rasa-fold__split { grid-template-columns: minmax(0, 1fr); gap: 0; }

  .rasa-fold__rail {
    position: sticky; top: var(--nav-height); z-index: 26; min-width: 0;
    flex-direction: row; gap: 8px; overflow-x: auto; overscroll-behavior-x: contain;
    background: var(--paper); padding: 9px 0; border-bottom: 1px solid var(--line);
    scrollbar-width: none;
  }
  .rasa-fold__rail::-webkit-scrollbar { display: none; }
  .rasa-fold__fi {
    flex: none; border: 1px solid var(--line); border-left-width: 1px;
    padding: 7px 12px; white-space: nowrap;
  }
  .rasa-fold__fi.is-on { border-color: var(--nav-bg); }
  .rasa-fold__fn { display: inline; font-size: 14px; }
  .rasa-fold__fc { display: inline; margin-left: 8px; }
  .rasa-fold__mix { display: none; }

  .rasa-fold__ph { padding: 10px 0 9px; }
  .rasa-fold__pn { font-size: 21px; }
  .rasa-fold__pa { margin-left: 0; flex-basis: 100%; }
  .rasa-fold__b { height: 34px; }
  .rasa-fold__menu { right: auto; left: 0; min-width: 0; width: 100%; }

  /* Deux lignes : le titre au-dessus, l'argent en dessous — 90px de plus
     qu'un écran de 390 ne peut pas loger sur la même ligne que le titre. */
  .rasa-frow { grid-template-columns: 22px minmax(0, 1fr) 30px; gap: 8px; padding: 0 2px; }
  .rasa-frow__link {
    grid-template-columns: 30px minmax(0, 1fr); gap: 10px; height: auto;
    padding: 8px 0; align-items: start;
  }
  .rasa-frow__i { width: 30px; height: 30px; }
  .rasa-frow__t { white-space: normal; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
  .rasa-frow__money { grid-column: 2; margin-top: 3px; }
  /* Sans survol, une action à `opacity: 0` n'existe pas : on les montre. */
  .rasa-frow__sel { opacity: 1; }
  .rasa-frow__rm button { opacity: 1; width: 30px; height: 30px; }
}
