/* OUT2 perf fixes (loaded last). See README "Performance". */
/* Hidden-card fix: masonry pins live in CSS multi-columns, which rebalance every time the feed appends a batch,
   so pins jump to the top of later columns (above the viewport) and their .rv IntersectionObserver never fires.
   Pins no longer depend on an observer: they are visible by default and fade in once via a CSS animation on insert.
   (prefers-reduced-motion: base.css already disables all animations, so they simply appear.) */
.masonry .pin.rv{opacity:1;transform:none;transition:none;animation:solaPinIn .55s cubic-bezier(.2,.7,.2,1) backwards} /* r72.0.1: backwards, not both (a finished 'both' animation kept every card a GPU layer; iPhone ran out of memory at the end of home) */
/* r72.0.1: no translateZ(0) per card photo (theme css); isolation keeps the rounded clip in Safari */
.masonry .pin-img.pin-img{-webkit-transform:none;transform:none}
@keyframes solaPinIn{from{opacity:0;transform:translateY(12px)}}
/* CLS: JS-rendered pages start empty, so the footer painted at the top and was pushed down (CLS ~0.6-0.75).
   Reserve a viewport of height for the main containers. */
#app,#ev,#gd,#st{min-height:100vh;min-height:100svh}
body.map-loading{cursor:progress}
/* LCP: base.css fades #app in from opacity 0 once rendered; Chrome ignores anything first painted at opacity 0, so the
   hero never counted as LCP. Start the same fade from .01 instead (looks identical; the empty shell is hidden either way). */
html:not(.ready) #app{opacity:.01}
html.early #app{opacity:1;transition:none} /* homepage hero painted early (tools/build_homehero.py) */
/* Home speed (r20b): rows from the third one down skip style/layout/paint until they near the viewport.
   `auto` keeps each row's real height once it has rendered, so scroll position and anchors stay stable. */
#app section.row.rv ~ section.row.rv ~ section.row.rv:not(.hh-row){content-visibility:auto;contain-intrinsic-size:auto 440px}
/* (happy hour + brunch rows are skipped: their cards hang below the row box and paint containment would clip them) */
/* Event speed (r20b): collapsed mobile sections skip layout until opened; the switch back to hidden waits for the
   close animation (allow-discrete), so opening and closing still slide. Far-down blocks render as they near the view. */
@media (max-width:767px){
  .ev2 .ev2-acc .eg:not(.on) .eg-c{content-visibility:hidden;transition:opacity .3s .05s,transform .35s,content-visibility .38s allow-discrete}
}
#ev #gallery,#ev .verify,#ev .nx,#ev .more,#ev #similar{content-visibility:auto;contain-intrinsic-size:auto 600px}

/* r82 battery: only the hero slide on screen runs its slow Ken Burns zoom (the stacked hidden slides were all animating) */
.hero .slide:not(.on) [data-ev].kb-on>img,.hero .slide:not(.on) .hb-dot,.hero .slide:not(.on) .hero-now i{animation-play-state:paused!important}
