:root{--site-bg:#1a1a1a;--site-chrome:#141414;--site-text:#ffffff;--site-accent:#dd9933;--site-accent-selected:#dd9933;--nav-text:#dddddd;--card-title:#dddddd;--muted:#777777;--panel:#0d0d0d;--panel-deep:#000000;--font-stack:'Helvetica Neue', Helvetica, -apple-system, BlinkMacSystemFont, Arial, sans-serif;--brand-size:28px;--brand-color:#ffffff;--brand-transform:none;--scroll-thumb:rgba(255,255,255,.45);--scroll-thumb-hover:rgba(255,255,255,.75);--header-h:81px;--footer-h:120px;--content-inset:280px}
/* --- global skeleton (main.css) ------------------------------------------ */
*,*::before,*::after{box-sizing:border-box}

html,body{
  overflow-x:auto;
  overflow-y:hidden;
  height:100%;
  margin:0;
}

body{
  background:var(--site-bg);
  color:var(--site-text);
  font-family:var(--font-stack);
  /* A column of header, content, footer. The content takes what is left,
     which is the point: the height used to be calc(100vh - header - footer)
     against a --header-h of exactly 81px, and that constant was a promise the
     header could not keep. One nav item it held; five, and the brand wrapped,
     the header grew, and the strip ran under the footer. Nothing measures the
     header now because nothing has to. */
  display:flex;
  flex-direction:column;
}

.body-architect{
  border:0;
  flex:1 1 auto;
  min-height:0;
}

/* The fixed-viewport contract above -- no vertical scroll, content sized to
   exactly one screen -- belongs to the horizontal strip, and the strip is a
   desktop layout. Every mobile block below stacks its content into a column
   TALLER than the viewport, so the contract has to be lifted here or that
   content is unreachable and paints over the footer.

   Same opt-out the grid layout takes further down; expressed twice because
   this one is a width, not a class on <html>. */
@media (max-width:767px){
  html,body{overflow-x:hidden}
  /* The content area scrolls on a narrow screen too, so the brand and the
     menu stay reachable without scrolling back up for them. Releasing the
     page instead -- which this did before the footer had to stay put -- left
     the header at the top of a long document, minutes away on a phone. */
  .body-architect{overflow-y:auto}
}

/* --- navigation, style A: vertical overlay (main.css) --------------------
   A fixed column down the left that sits transparently OVER the horizontally
   scrolling images. Both nav styles ship; each site picks one, which is why
   both exist in the live markup with Elementor hiding the unused one. On
   ernestrdickerson.com the horizontal bar is the chosen style, so this
   computes to display:none there.
   ------------------------------------------------------------------------- */
.nav-architect{
  /* Fixed, so the images scroll underneath it. No background of its own —
     the menu floats over the artwork rather than sitting on a panel, and
     opacity .95 is what makes it read as part of the image rather than a
     layer on top. Measured on alexrivera.vegas. */
  position:fixed;
  top:0;
  left:50px;
  width:200px;
  height:100%;
  min-height:550px;
  z-index:998;
  opacity:.95;
  background:transparent;
  display:flex;
}

.nav-container-architect{
  position:absolute;
  left:10px;
  top:50%;
  margin-top:-275px;
  height:550px;
  width:200px;
  z-index:10;
  display:flex;
  flex-direction:column;
  justify-content:space-between;
  text-align:left;
  overflow:visible;
}

.nav-container-top-architect{
  height:100%;
  display:flex;
  flex-direction:column;
  position:static;
}

/* 38px pitch: 18px line plus a 20px gap. */
.nav-architect .selection-architect,
.nav-architect .selection-architect-selected{margin-bottom:20px}

.nav-architect h4{
  margin:0;
  font-size:16px;
  font-weight:300;
  line-height:18px;
}

.nav-architect a{color:var(--nav-text);text-decoration:none}
.nav-architect .selection-architect-selected a{color:var(--site-accent-selected)}

/* With the vertical nav the content runs full height — there is no bar. */
/* The vertical nav is fixed and out of flow, so it takes no room in the
   column and needs no special case -- it used to need one only because the
   calc it replaced subtracted a header that was not there. */

/* --- navigation, style B: horizontal bar ---------------------------------
   The conventional top menu. Measured from the live page: 81px on #141414,
   brand 28px bold, links 15px right-aligned.
   ------------------------------------------------------------------------- */
.site-header{
  /* min-height, not height: 81px is what the live header measures with this
     brand and this many links, not a size the content must be cut down to.
     A hard height clipped the brand the moment the menu grew. */
  min-height:var(--header-h);
  background:var(--site-chrome);
  display:flex;
  align-items:center;
  justify-content:space-between;
  /* The header itself does not wrap: brand left, menu right, at every width
     wide enough for both. Letting it wrap dropped the whole menu onto a
     full-width second row, which stops looking like a header. The menu wraps
     inside its own box instead. */
  flex-wrap:nowrap;
  /* Never shrink. An explicit min-height REPLACES a flex item's automatic
     content-based minimum, so the 81px above is a floor flexbox is allowed to
     squeeze down to -- the very declaration meant to protect the header would
     license clipping it, with align-items:center splitting the overflow top
     and bottom. Chrome is not doing that here at any width or viewport height
     I can measure, because the content area absorbs the shrinking first. That
     is a fact about how the free space happens to distribute today, not a
     guarantee, and the header is chrome: it should keep its content whatever
     the column does. */
  flex-shrink:0;
  padding:12px 55px;
  gap:24px;
}

.site-brand{display:flex;flex-direction:column;justify-content:center}

.site-brand__name{
  font-size:var(--brand-size);
  font-weight:400;
  line-height:1.2;
  color:var(--brand-color);
  text-transform:var(--brand-transform);
}

.site-brand__tagline{font-size:15px;color:var(--muted);line-height:1.4}

.site-nav{
  list-style:none;
  margin:0;
  padding:0;
  /* No display here on purpose. A display on the list would override the
     browser's own hiding of closed <details> content, and the panel would
     hang open on every narrow screen. Each size states its own: flex in the
     bar, none-until-open in the panel. */
  align-items:stretch;
  flex-wrap:wrap;
  justify-content:flex-end;
  gap:0;
  /* Stretches to the header's height however tall that turns out to be, which
     is what keeps the filled-block selection spanning the full bar. A
     percentage height would resolve to auto now the header has no fixed one. */
  align-self:stretch;
}

.site-nav li{display:flex}

.site-nav a{
  color:var(--nav-text);
  text-decoration:none;
  font-size:15px;
  text-transform:uppercase;
  padding:6px 10px;
  display:flex;
  align-items:center;
}

/* Current item, style A: recoloured label. */
.site-header.nav-selected--text .selection-architect-selected a{
  color:var(--site-accent-selected);
}

/* Current item, style B: filled block, label reversed out. */
.site-header.nav-selected--block .selection-architect-selected a{
  background:var(--site-accent-selected);
  color:#fff;
}

/* Both columns may shrink below their content width, which is what lets the
   menu wrap instead of pushing the brand off the bar. */
.site-brand,.site-nav{min-width:0}

/* --- the menu, at two sizes ----------------------------------------------
   One piece of markup: a <details> holding the same <ul> the bar has always
   used. Above 1024 the disclosure gets out of the way entirely -- the summary
   is hidden and the details is display:contents, so the list is a direct flex
   child of the header and every rule written for the bar still applies. Below
   it, the summary becomes a hamburger and the list becomes a panel.

   1024 is the line because that is where a tablet stops being a tablet, not
   because of any one tenant's menu: five items happen to stop fitting around
   950, but a site with two would fit much further down and a site with eight
   would not fit at 1100. A breakpoint that moves with the content would put
   the control in a different place on every site.
   ------------------------------------------------------------------------- */
@media (min-width:1024px){
  .site-menu{display:contents}
  .site-menu__button{display:none}
  /* Newer Chrome hides closed details content with content-visibility on
     ::details-content, which an author display on the list cannot reach. */
  .site-menu::details-content{content-visibility:visible}
  .site-nav{display:flex}
}

/* The 55px gutter is measured from a wide viewport; the live page's own is
   nearer 28px at 960, where it buys the room a long menu needs. */
@media (min-width:1024px) and (max-width:1200px){
  .site-header{padding-left:28px;padding-right:28px}
}

@media (max-width:1023px){
  /* The panel hangs off the HEADER, not off the button: the button is one
     line tall inside a bar that may be two, so anchoring to it drops the
     panel inside the bar and over the tagline. */
  .site-header{position:relative}
  .site-menu{position:static}

  /* Explicit rather than leaning on the UA's own hiding of closed details
     content: engines disagree about how they do it -- display on a child in
     some, content-visibility on ::details-content in newer Chrome -- and a
     menu that hangs open on one of them is not a menu. */
  .site-nav{display:none}
  .site-menu[open] .site-nav{display:flex}

  /* Bars over the word, not beside it -- michelloliveros.com's own control,
     where MENU sits under the three lines in small caps. */
  .site-menu__button{
    display:flex;
    flex-direction:column;
    align-items:center;
    gap:5px;
    padding:6px 2px;
    cursor:pointer;
    list-style:none;
    color:var(--nav-text);
    line-height:1;
  }

  .site-menu__label{
    font-size:10px;
    font-weight:700;
    letter-spacing:.06em;
    text-transform:uppercase;
  }

  /* Safari renders the disclosure triangle through a pseudo-element of its
     own, which list-style alone does not remove. */
  .site-menu__button::-webkit-details-marker{display:none}
  .site-menu__button::marker{content:''}

  .site-menu__button:focus-visible{outline:2px solid var(--site-accent);outline-offset:2px}

  /* Three bars, drawn rather than shipped: an icon font or an SVG file would
     be another request for six pixels of line. */
  .site-menu__bars,
  .site-menu__bars::before,
  .site-menu__bars::after{
    display:block;
    width:26px;
    height:3px;
    background:var(--nav-text);
    transition:transform .2s ease,opacity .2s ease;
  }

  /* The middle bar is the element itself; the outer two are its pseudos, so
     the span needs the height of all three to sit right above the label. */
  .site-menu__bars{position:relative;margin:8px 0}
  .site-menu__bars::before,.site-menu__bars::after{content:'';position:absolute;left:0}
  .site-menu__bars::before{top:-8px}
  .site-menu__bars::after{top:8px}

  /* Open, the bars become a cross -- the control says what it will do next. */
  .site-menu[open] .site-menu__bars{background:transparent}
  .site-menu[open] .site-menu__bars::before{transform:translateY(8px) rotate(45deg)}
  .site-menu[open] .site-menu__bars::after{transform:translateY(-8px) rotate(-45deg)}

  /* It hangs rather than pushing the header down: a menu that resized the bar
     would move the page under the finger that opened it. */
  .site-nav{
    position:absolute;
    right:16px;
    top:100%;
    z-index:999;
    flex-direction:column;
    align-items:stretch;
    min-width:min(70vw,260px);
    padding:8px 0;
    background:var(--site-chrome);
    border-radius:4px;
    box-shadow:0 8px 24px rgba(0,0,0,.25);
  }

  .site-nav a{padding:12px 20px;width:100%}

  /* The filled-block selection spans the row here, not the bar. */
  .site-header.nav-selected--block .selection-architect-selected a{border-radius:0}
}

/* Was '.elementor .elementor-widget.selection-architect a:hover'. */
.selection-architect a:hover{color:var(--site-accent)}
.selection-architect-selected a{color:var(--site-accent-selected)}

/* --- horizontal scroll wrapper (page.css) --------------------------------
   The original pulled this left with 'margin-left:-280px', offset by a
   positive margin on an Elementor container. Measured on the live page the
   track lands 280px from the left edge, so that is expressed directly.
   ------------------------------------------------------------------------- */
.clearfix-architect-google{
  overflow-x:auto;
  overflow-y:hidden;
  height:100%;
}

@media (min-width:768px){
  .object-view.clearfix-architect-google{padding-left:var(--content-inset)}
}

@media (max-width:767px){
  .clearfix-architect-google{overflow-y:auto;height:auto}
}

/* --- overlay scrollbars (page.css + estebagel-scroll.js) -----------------
   The thumb is hidden until the element is actually scrolling, which is what
   the is-scrolling class marks -- CSS cannot detect scrolling, so the class is
   toggled by /assets/scroll.js and the fade lives here. The thumb colour comes
   from the palette's own luminance (lib/color.ts); upstream sniffed it from
   the DOM at load time because WordPress, not the engine, set the background.
   ------------------------------------------------------------------------- */
.clearfix-architect-google,.picture-gallery,.detail-view,.gallery-grid,.content-page{
  scrollbar-width:thin;
  scrollbar-color:transparent transparent;
  transition:scrollbar-color .35s ease;
}

.is-scrolling{scrollbar-color:var(--scroll-thumb) transparent}

.clearfix-architect-google::-webkit-scrollbar,
.picture-gallery::-webkit-scrollbar,
.detail-view::-webkit-scrollbar,
.gallery-grid::-webkit-scrollbar,
.content-page::-webkit-scrollbar{height:8px;width:8px}

.clearfix-architect-google::-webkit-scrollbar-track,
.picture-gallery::-webkit-scrollbar-track,
.detail-view::-webkit-scrollbar-track,
.gallery-grid::-webkit-scrollbar-track,
.content-page::-webkit-scrollbar-track{background:transparent}

.clearfix-architect-google::-webkit-scrollbar-thumb,
.picture-gallery::-webkit-scrollbar-thumb,
.detail-view::-webkit-scrollbar-thumb,
.gallery-grid::-webkit-scrollbar-thumb,
.content-page::-webkit-scrollbar-thumb{
  background:transparent;
  border-radius:4px;
  transition:background .35s ease;
}

.is-scrolling::-webkit-scrollbar-thumb{background:var(--scroll-thumb)}
.is-scrolling::-webkit-scrollbar-thumb:hover{background:var(--scroll-thumb-hover)}

/* A pointer that cannot hover — a touchscreen — has the platform's own
   transient scrollbar and no way to trigger ours. */
@media (hover:none){
  .is-scrolling{scrollbar-color:transparent transparent}
  .is-scrolling::-webkit-scrollbar-thumb{background:transparent}
}

/* The Drive player must not eat the wheel gesture while a strip is scrolling;
   scroll.js hands it back on click. */
.video-wrapper iframe{pointer-events:none}
.video-wrapper.is-playing iframe{pointer-events:auto}

@media (min-width:768px){
  .assets-architect-google{
    width:max-content;
    touch-action:pan-x;
    height:100vh;
    overflow-x:inherit;
    white-space:nowrap;
  }
}

/* --- object view (object-view.css) --------------------------------------- */
.object-view{color:var(--site-text)}

.object-view--error{padding:60px 50px;color:var(--muted)}

/* Mobile default — vertical stacking. */
.object-view__track{
  display:flex;
  flex-direction:column;
  gap:4px;
  padding:24px 16px;
}

@media (min-width:768px){
  .object-view__track{
    display:inline-flex;
    flex-direction:row;
    align-items:stretch;
    gap:40px;
    padding:20px 40px;
  }

  /* assets-architect-google sets height:100vh, which exceeds the visible
     content area; match the content viewport instead. */
  .object-view .object-view__track{height:76vh}

  .assets-architect-google:has(.object-view){overflow-y:hidden}

  /* width:fit-content resolves only when the image has a definite height, so
     the card ends up exactly as wide as its poster. */
  .object-view__card{height:100%;width:fit-content}

  .object-view__card-image{
    height:calc(76vh - 50px);
    overflow:hidden;
    background:transparent;
  }

  .object-view__card-image img{
    height:100%;
    width:auto;
    max-width:none;
    display:block;
  }

  .object-view__card-placeholder{height:100%;width:200px}
}

@media (min-width:768px) and (min-height:980px){
  .object-view .object-view__track{height:78vh}
  .object-view__card-image{height:calc(78vh - 50px)}
}

.object-view__card{
  display:inline-flex;
  flex-direction:column;
  height:100%;
  flex-shrink:0;
  text-decoration:none;
  color:var(--site-text);
  cursor:pointer;
  transition:opacity .2s;
}

.object-view__card:hover{opacity:.85}

.object-view__card-image{
  flex:1;
  min-height:0;
  overflow:hidden;
  background:transparent;
}

.object-view__card-image img{height:100%;width:auto;display:block}

.object-view__card-placeholder{height:100%;width:200px;background:var(--site-bg)}

.object-view__card-meta{
  flex-shrink:0;
  padding:10px 4px 6px;
  display:flex;
  flex-direction:column;
  gap:3px;
}

.object-view__card-title{
  font-size:13px;
  font-weight:500;
  line-height:1.3;
  color:var(--card-title);
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
  max-width:220px;
}

.object-view__card-year{font-size:11px;color:var(--muted);letter-spacing:.05em}

@media (max-width:767px){
  /* A hard 81px clips the brand: at this width the name wraps to two lines and
     the tagline to two more, and align-items:center splits the overflow top
     and bottom, so the top of the name is sliced off. The footer already uses
     min-height for the same reason. */
  /* Brand and hamburger on one row. This used to stack the brand over a menu
     that wrapped across three rows and took 176px of a 600px screen; before
     that it did not wrap at all and two of the five links were off-screen
     with no way to reach them. */
  .site-header{padding:12px 16px;gap:16px}

  .object-view__track{
    display:flex;
    flex-direction:column;
    height:auto;
    min-height:unset;
    gap:16px;
    padding:16px;
  }

  .object-view__card{width:100%;height:auto}
  .object-view__card-image{flex:none;width:100%;height:auto}
  .object-view__card-image img{width:100%;height:auto}
  .object-view__card-placeholder{width:100%;height:auto;aspect-ratio:2/3}
  .object-view__card-title{max-width:100%;white-space:normal}

  .nav-architect{
    position:static;
    width:auto;
    height:auto;
    min-height:0;
    left:auto;
    float:none;
    padding:16px;
  }

  .nav-container-architect{
    position:static;
    height:auto;
    margin-top:0;
    flex-direction:row;
    gap:16px;
    flex-wrap:wrap;
  }

  .nav-container-top-architect{flex-direction:row;gap:16px;flex-wrap:wrap}
  .selection-architect h4,.selection-architect-selected h4{margin:0}
}

/* --- gallery view (picture-player.css) -----------------------------------
   One folder of pictures as a horizontal strip. The photo-site counterpart to
   the film-style detail view.
   ------------------------------------------------------------------------- */
.gallery-navigation{padding:16px 40px 0}

.back-to-galleries{
  color:var(--site-accent);
  text-decoration:none;
  font-size:13px;
  letter-spacing:.08em;
  text-transform:uppercase;
}

.back-to-galleries:hover{text-decoration:underline}

.gallery-error,.gallery-empty{padding:60px 50px;color:var(--muted)}

.gallery-view{height:calc(100% - 44px)}

/* A strip that is itself the page has no back-link row above it, so it takes
   the whole content area -- and sits at the same left inset as the listing
   cards, which is where the live front page starts its first photograph. */
.gallery-view--page{height:100%}

@media (min-width:768px){
  .gallery-view--page .picture-gallery{padding-left:var(--content-inset)}
}

.picture-gallery{
  display:flex;
  flex-wrap:nowrap;
  gap:40px;
  padding:20px 40px;
  align-items:center;
  height:100%;
}

.picture-container{display:flex;flex-direction:column;flex-shrink:0;height:100%}

.picture-wrapper{flex:1;min-height:0;overflow:hidden}

/* Measured live: each container reserved the full thousand-pixel width of the
   source file while its photo rendered 289px, leaving ~700px of dead space
   between portrait shots.

   Shrink-to-fit width is computed from the image's max-content contribution,
   and during that pass the browser cannot resolve height:100% against a
   wrapper whose own height comes from flex:1 -- so it falls back to the
   image's natural width, which every Drive sz=w1000 URL caps at the same
   thousand pixels regardless of the shape of the photo.

   The object view already solved this (see .object-view__card): a DEFINITE
   height on the image box makes width:fit-content resolve, and the box ends
   up exactly as wide as the picture. Same fix, same arithmetic -- the strip
   fills the content area minus the back-link row and the gallery's padding. */
@media (min-width:768px){
  .picture-container{width:fit-content}

  /* A definite height, taken from the container rather than computed from the
     viewport. It used to be calc(100vh - header - footer - 84px), which meant
     a strip whose picture height depended on --header-h being honest -- and a
     header that grew by a row left the pictures overflowing by exactly that
     row. Percentages resolve all the way down now that the content area is a
     flex item with a used height, and nothing has to know how tall the header
     turned out. */
  .picture-wrapper{flex:none;height:100%}
}

.picture-container img{
  height:100%;
  width:auto;
  max-width:none;
  object-fit:contain;
  display:block;
}

.picture-container h3{
  font-size:1.4em;
  font-weight:700;
  margin:10px 0 5px;
  padding-left:10px;
  color:var(--card-title);
}

.picture-container p{
  font-size:1em;
  line-height:1.6;
  margin:0 0 15px;
  padding-left:15px;
  color:var(--muted);
}

/* A video sits in the same strip as the stills (video-player.css), so it takes
   the container's height and lets its aspect ratio set the width. Without the
   inline aspect-ratio Drive's iframe falls back to 150px tall and the item
   collapses, which is why the renderer emits one whenever Drive reports the
   video's real dimensions. */
.video-container{display:flex;flex-direction:column;flex-shrink:0;height:100%}

.video-wrapper{flex:1;min-height:0;height:100%;aspect-ratio:16/9;background:#000}

.video-wrapper iframe{width:100%;height:100%;border:0;display:block}

.video-container h3{
  font-size:1.4em;
  font-weight:700;
  margin:10px 0 5px;
  padding-left:10px;
  color:var(--card-title);
}

.video-container p{
  font-size:1em;
  line-height:1.6;
  margin:0 0 15px;
  padding-left:15px;
  color:var(--muted);
}

@media (max-width:767px){
  .gallery-view{height:auto}
  .picture-gallery{flex-direction:column;height:auto;gap:16px;padding:16px}
  .picture-container{width:100%;height:auto}
  .picture-container img{width:100%;height:auto}
  .video-container{width:100%;height:auto}
  .video-wrapper{width:100%;height:auto}
}

/* --- detail view (detail-view.css) ---------------------------------------
   A horizontal run of panels sharing the object view's scroll contract. The
   original hardcoded #000 / #0d0d0d / #555 throughout, which only works on a
   dark site; those become tokens so the light palettes render correctly.
   ------------------------------------------------------------------------- */
.detail-view{color:var(--site-text);height:100%}

.detail-view--error{padding:60px 50px;color:var(--muted)}

.detail-view__track{
  display:inline-flex;
  flex-direction:row;
  align-items:stretch;
  height:100%;
  min-height:80vh;
}

.detail-view__panel{
  display:inline-flex;
  flex-direction:column;
  justify-content:center;
  height:100%;
  flex-shrink:0;
  position:relative;
  padding:60px 40px;
  white-space:normal;
}

.detail-view__section-label{
  display:block;
  font-size:11px;
  letter-spacing:.15em;
  text-transform:uppercase;
  color:var(--muted);
  margin-bottom:20px;
  flex-shrink:0;
}

.detail-view__section-label--spaced{margin-top:36px}

.detail-view__panel--back{
  width:fit-content;
  min-width:120px;
  background:var(--panel);
  align-items:center;
  padding:60px 36px;
}

.detail-view__back a{
  color:var(--site-accent);
  text-decoration:none;
  font-size:13px;
  letter-spacing:.08em;
  text-transform:uppercase;
}

.detail-view__back a:hover{text-decoration:underline}

.detail-view__panel--hero{
  width:fit-content;
  padding:0;
  overflow:hidden;
  background:var(--panel-deep);
  justify-content:flex-start;
}

.detail-view__panel--hero img{height:100%;width:auto;display:block}

.detail-view__panel--info{
  width:520px;
  max-width:90vw;
  background:var(--panel);
}

.detail-view__type-badge{
  display:inline-block;
  align-self:flex-start;
  font-size:11px;
  letter-spacing:.15em;
  text-transform:uppercase;
  color:var(--site-accent);
  margin-bottom:16px;
}

.detail-view__title{
  font-size:clamp(26px,3vw,48px);
  font-weight:700;
  margin:0 0 12px;
  line-height:1.1;
  letter-spacing:-.02em;
}

.detail-view__meta{color:var(--muted);font-size:13px;margin:0 0 28px;flex-shrink:0}
.detail-view__meta-sep{opacity:.5}

.detail-view__synopsis{
  font-size:14px;
  line-height:1.8;
  color:var(--card-title);
  margin:0 0 28px;
}

.detail-view__director{font-size:13px;color:var(--muted);margin:0}

.detail-view__panel--trailer{width:min(880px,85vw);background:var(--panel-deep)}

.detail-view__trailer-wrapper{width:100%;flex:1;position:relative;min-height:0}

.detail-view__trailer-wrapper iframe{
  position:absolute;
  inset:0;
  width:100%;
  height:100%;
  border:0;
}

.detail-view__panel--stills{
  background:var(--panel-deep);
  padding:40px 40px 40px 20px;
  width:max-content;
}

.detail-view__stills-row{display:flex;gap:20px;height:100%;align-items:center}

.detail-view__still{
  height:100%;
  width:auto;
  min-width:20px;
  display:block;
  background:var(--panel);
}

.detail-view__panel--credits{width:420px;max-width:90vw;background:var(--panel)}

.detail-view__credits-text,
.detail-view__awards-text{
  font-size:13px;
  line-height:1.8;
  color:var(--card-title);
  margin:0;
}

@media (max-width:767px){
  .detail-view,.detail-view__track{height:auto;min-height:0;display:block}
  .detail-view__panel{width:100%!important;max-width:none;height:auto;padding:32px 16px}
  .detail-view__panel--hero img{width:100%;height:auto}
  .detail-view__stills-row{flex-direction:column;height:auto}
  .detail-view__still{width:100%;height:auto}
  .detail-view__trailer-wrapper{aspect-ratio:16/9}
}

/* --- vertical gallery grid (PersonalGalleryGrid.php) ----------------------
   The alternative to the horizontal strip: a page of cards that scrolls down,
   which is what michelloliveros.com/galleries renders today.
   ------------------------------------------------------------------------- */
/* The class sits on <html>. The page itself never scrolls in either layout --
   what scrolls is the content area between the header and the footer, so both
   stay put and the visitor is scrolling the contents of a window rather than
   the page. The strip does this sideways; the grid does it downwards.

   Scrolling the *container* rather than fixing the footer is what avoids the
   hack. A fixed footer leaves the flow and the content then needs bottom
   padding exactly as tall as the footer, which CSS cannot know -- the legal
   links wrap on a narrow screen and the height changes. Sticky does not work
   either: the footer is the last child, so its containing block ends exactly
   where it does and there is no range for it to stick within. A flex column
   whose middle item scrolls needs none of that arithmetic. */
html.layout--grid .body-architect{overflow-y:auto}

/* --- content page (personal_content_text + PersonalLeftColumnContent) -----
   One Drive folder as a page. Measured on michelloliveros.com/about/ at 960px:
   the folder's picture runs the full height of the content area in a column
   inset from the left edge, and the document sits to its right with its own
   title as the heading. Upstream that pairing was an Elementor two-column
   layout holding two unrelated shortcodes; here it is one rule.

   The picture column is proportional rather than the measured 376px, because
   that number is one viewport width's answer -- at 960px it is 39% of the
   content area, which is what this keeps.

   The document brings its own inline colours from Google Docs, which is why
   the body sets none of its own beyond the site text colour: whatever the
   writer chose in the Doc survives, and everything they did not inherits the
   palette.
   ------------------------------------------------------------------------- */
.content-page{
  display:flex;
  align-items:flex-start;
  gap:48px;
  padding:40px 55px 80px;
  color:var(--site-text);
  line-height:1.7;
}

@media (min-width:768px){
  .content-page{padding-left:var(--content-inset)}
}

.content-page__media{flex:0 0 39%;max-width:39%}

.content-page__text{flex:1;min-width:0;max-width:34rem}

/* A page whose folder holds a document but no picture is one column, and
   should not sit in the 39% the absent column would have taken. */
.content-page--text-only .content-page__text{max-width:46rem}

.personal-content-image{display:flex;flex-direction:column;gap:24px}

.personal-content-item img{
  width:100%;
  height:auto;
  display:block;
}

.content-page__title{
  font-size:2em;
  font-weight:700;
  margin:0 0 .8em;
  color:var(--card-title);
}

.content-page__empty{color:var(--muted)}

/* --- contact form --------------------------------------------------------
   Not ported -- upstream had no form. Sits under the document in the same
   column, which is where the WordPress plugin's is on the live page.
   ------------------------------------------------------------------------- */
.contact-form{margin:2em 0 0;max-width:34rem}

.contact-form__row{display:flex;gap:16px}
.contact-form__row > *{flex:1;min-width:0}

.contact-form__field{margin:0 0 16px}

.contact-form__field label{
  display:block;
  font-size:14px;
  margin:0 0 6px;
  color:var(--muted);
}

.contact-form input[type=text],
.contact-form input[type=email],
.contact-form textarea{
  width:100%;
  padding:10px 12px;
  font:inherit;
  font-size:15px;
  color:var(--site-text);
  background:var(--panel);
  border:1px solid var(--panel-deep);
  border-radius:4px;
}

.contact-form textarea{resize:vertical;min-height:8em}

.contact-form input:focus,.contact-form textarea:focus{
  outline:2px solid var(--site-accent);
  outline-offset:1px;
}

.contact-form__field--bad input,.contact-form__field--bad textarea{
  border-color:var(--site-accent);
}

.contact-form__error{margin:6px 0 0;font-size:13px;color:var(--site-accent)}

.contact-form__notice{
  margin:0 0 16px;
  padding:10px 12px;
  border-radius:4px;
  background:var(--panel);
  font-size:14px;
}

.contact-form__send{
  font:inherit;
  font-size:14px;
  letter-spacing:.08em;
  text-transform:uppercase;
  padding:10px 24px;
  color:#fff;
  background:var(--site-accent);
  border:0;
  border-radius:4px;
  cursor:pointer;
}

.contact-form__send:hover{opacity:.9}

.contact-form--sent{color:var(--site-text)}

/* The honeypot. Clipped rather than display:none, because a bot that can see
   the field is hidden is a bot that skips it -- and clipping keeps it out of
   the layout without moving it thousands of pixels off-canvas, which is its
   own giveaway. */
.contact-form__trap{
  position:absolute;
  width:1px;
  height:1px;
  padding:0;
  margin:-1px;
  overflow:hidden;
  clip-path:inset(50%);
  white-space:nowrap;
  border:0;
}

@media (max-width:767px){
  .contact-form__row{flex-direction:column;gap:0}
}

@media (max-width:767px){
  /* The picture leads on a narrow screen rather than squeezing beside the
     words -- 39% of 390px is a thumbnail, not a photograph. */
  .content-page{flex-direction:column;gap:24px;padding:24px 16px 48px}
  .content-page__media{flex:none;max-width:100%;width:100%}
  .content-page__text{max-width:100%}
}

.content-page__body p{margin:0 0 1.1em}
.content-page__body h1,.content-page__body h2,.content-page__body h3,
.content-page__body h4,.content-page__body h5,.content-page__body h6{
  color:var(--card-title);
  margin:1.6em 0 .6em;
  line-height:1.3;
}
.content-page__body a{color:var(--site-accent)}
.content-page__body img{max-width:100%;height:auto;display:block;margin:1.4em 0}
.content-page__body ul,.content-page__body ol{margin:0 0 1.1em;padding-left:1.4em}
.content-page__body li{margin:.3em 0}
.content-page__body blockquote{
  margin:1.4em 0;
  padding-left:1.2em;
  border-left:2px solid var(--site-accent);
  color:var(--muted);
}
.content-page__body table{border-collapse:collapse;margin:1.4em 0;width:100%}
.content-page__body th,.content-page__body td{
  border:1px solid var(--panel-deep);
  padding:.5em .7em;
  text-align:left;
}
.content-page__body hr{border:0;border-top:1px solid var(--panel-deep);margin:2em 0}

.gallery-grid{
  display:grid;
  grid-template-columns:repeat(auto-fill,minmax(280px,1fr));
  gap:32px 24px;
  padding:40px 55px;
  align-items:start;
}

.gallery-grid--empty{display:block;color:var(--muted);padding:60px 55px}

.gallery-item{display:flex;flex-direction:column;gap:12px}

.gallery-item__image img{
  width:100%;
  height:auto;
  display:block;
  /* Reserves space without asserting the 399x269 the PHP hardcoded onto
     every image regardless of its real shape. */
  aspect-ratio:3/4;
  object-fit:cover;
}

.gallery-item__placeholder{width:100%;aspect-ratio:3/4;background:var(--site-chrome)}

.gallery-item a{color:inherit;text-decoration:none}
.gallery-item a:hover{opacity:.85}

.estebagel-gallery-title{
  margin:0;
  font-size:16px;
  font-weight:500;
  line-height:1.3;
  color:var(--card-title);
}

.gallery-description{margin:0;font-size:14px;line-height:1.5;color:var(--muted)}
.gallery-file-count{margin:0;font-size:12px;color:var(--muted);letter-spacing:.05em}

@media (max-width:767px){
  .gallery-grid{padding:24px 16px;gap:24px 16px;grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
}

/* --- footer ---------------------------------------------------------------
   Measured from the live page: 120px on #141414, social icons centred, legal
   links in the accent colour, two centred credit lines beneath.
   ------------------------------------------------------------------------- */
.site-footer{
  min-height:var(--footer-h);
  /* Same reasoning as the header, and the same trap waiting: this min-height
     replaces the footer's automatic minimum too, so the day the legal links
     wrap or a fourth social icon arrives, the column could squeeze it back to
     120px and cut the credit lines off. */
  flex-shrink:0;
  background:var(--site-chrome);
  padding:14px 55px;
  text-align:center;
  font-size:15px;
}

.site-footer__top{
  display:flex;
  align-items:center;
  justify-content:center;
  position:relative;
  gap:24px;
  min-height:44px;
}

.site-footer__legal{
  position:absolute;
  right:0;
  display:flex;
  gap:14px;
}

.site-footer__legal-link{color:var(--site-accent);text-decoration:none}
.site-footer__legal-link:hover{text-decoration:underline}

.site-footer__line{line-height:1.6;color:var(--site-text)}

@media (max-width:767px){
  .site-footer{padding:14px 16px}
  .site-footer__top{flex-direction:column;gap:12px}
  .site-footer__legal{position:static}
}

/* --- social icons (main.css) --------------------------------------------- */
.social-media-footer{text-align:center}
.social-media-list{list-style:none;margin:0;padding:0;display:inline-flex;gap:14px}
.social-media-item img{width:28px;height:28px;display:block}
