/*
 * The stage: the home page's banner, one picture the width of the window.
 *
 * Operator, 12 October 2026, of the banner as it stood (a colour panel, three
 * tall strips of picture and a numbered bar of names under them): the banners
 * are bad, "we dont need this" of the bar, and the site "still same no major
 * UI change". So the picture is the whole stage, the words stand on it, and
 * what turns it is three small buttons and a row of lines.
 *
 * HOW IT IS BUILT. Every slide is laid over the same box (`.stage-slides`,
 * which has a height and nothing in its flow), so a turn changes opacity and
 * transform and moves nothing on the page: the layout shift of a turn is zero
 * by construction, at every width.
 *
 * TWO SHAPES OF SLIDE.
 *   bleed  one wide photograph, edge to edge, words over its calm side.
 *   split  a portrait and a small still life on a ground of one colour, for
 *          the pictures that were shot upright.
 * On a phone, and on a tablet held upright, both are the same thing: the
 * picture fills the stage and the words stand at its foot.
 *
 * THE WINDOW'S BOTTOM RIGHT CORNER is the chat button's (DESIGN.md). Nothing
 * that can be pressed is put there: the controls start at the left gutter.
 *
 * Motion is in the last block, and only under `body[data-motion="full"]`
 * (flagship.js). A slide moves when it ENTERS (`.is-entering`,
 * campaign-hero.js), never on the page's first paint.
 */

.stage {
  --stage-gutter: 20px;
  --stage-shade: 43 43 45; /* charcoal, as an overlay under words */
  position: relative;
  isolation: isolate;
  overflow: clip;
  background: var(--charcoal);
  color: var(--offwhite);
}

/* The box every slide lies in. A phone keeps a strip of the next section in view under it. */
.stage-slides {
  position: relative;
  height: clamp(480px, calc(100svh - 132px), 780px);
}

.stage-slide {
  position: absolute;
  inset: 0;
  overflow: hidden;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.9s var(--ease), visibility 0s linear 0.9s;
}

.stage-slide.is-active {
  opacity: 1;
  visibility: visible;
  transition: opacity 0.9s var(--ease);
}

.stage-frame {
  margin: 0;
  overflow: hidden;
}

.stage-frame picture {
  display: block;
  width: 100%;
  height: 100%;
}

.stage-photo {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/*
 * A slide's film lies over its first frame, cut to the frame exactly as the photograph under it is, and is shown
 * only once it is moving (campaign-hero.js). Until then, and for anyone who asked for less motion, the slide is
 * the photograph.
 */
.stage-film {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  pointer-events: none;
  transition: opacity .9s ease;
}

.stage-film.is-ready {
  opacity: 1;
}

body[data-motion="reduced"] .stage-film {
  display: none;
}

/* Upright window: one picture fills the slide, whichever shape the slide is. */
.stage-media,
.stage-poster,
.stage-frame--bleed,
.stage-frame--lead {
  position: absolute;
  inset: 0;
}

.stage-frame--inset,
.stage-frame--snap,
.stage-frame--strip,
.stage-frame--wall,
.stage-inset {
  display: none;
}

/* The shade the words stand on. */
.stage-slide::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: linear-gradient(180deg, rgb(var(--stage-shade) / 0) 30%, rgb(var(--stage-shade) / 0.5) 58%, rgb(var(--stage-shade) / 0.86) 100%);
}

.stage-words {
  position: absolute;
  z-index: 2;
  left: var(--stage-gutter);
  right: var(--stage-gutter);
  bottom: 84px;
}

.stage-kicker {
  margin: 0 0 12px;
  font: 600 12px/1.4 Inter, sans-serif;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

.stage-title {
  margin: 0;
  font: 300 clamp(2.6rem, 11.4vw, 4.25rem)/1 Jost, sans-serif;
  letter-spacing: -0.03em;
}

.stage-title span {
  display: block;
}

.stage-sub {
  max-width: 34ch;
  margin: 14px 0 0;
  font: 400 15px/1.5 Inter, sans-serif;
}

.stage-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 20px 0 0;
}

.stage-cta {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  min-height: 50px;
  padding: 0 22px;
  border: 1px solid var(--offwhite);
  border-radius: 4px;
  background: var(--offwhite);
  color: var(--berry);
  font: 600 14px/1 Inter, sans-serif;
  letter-spacing: 0.01em;
  cursor: pointer;
  transition: background-color 0.25s var(--ease), color 0.25s var(--ease), border-color 0.25s var(--ease);
}

.stage-cta .icon {
  width: 18px;
  height: 18px;
  transition: transform 0.35s var(--ease);
}

.stage-cta--ghost {
  background: none;
  color: var(--offwhite);
}

/* The code, as the thing to press: the word itself, and what pressing it does. */
.stage-cta--code {
  gap: 12px;
  padding-left: 18px;
}

.stage-code {
  padding-right: 12px;
  border-right: 1px solid color-mix(in srgb, currentColor 34%, transparent);
  font: 500 17px/1 Jost, sans-serif;
  letter-spacing: 0.2em;
}

.stage-note {
  margin: 14px 0 0;
  font: 400 12px/1.5 Inter, sans-serif;
}

.stage-status:not(:empty) {
  margin-left: 6px;
  font-weight: 600;
}

/* What turns the stage: back, on, pause, and a line for each slide. Left, clear of the chat button's corner. */
.stage-controls {
  position: absolute;
  z-index: 3;
  left: var(--stage-gutter);
  right: 96px;
  bottom: 22px;
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--offwhite);
}

.stage-arrow,
.stage-pause {
  display: grid;
  place-items: center;
  flex: none;
  width: 44px;
  height: 44px;
  padding: 0;
  border: 1px solid color-mix(in srgb, currentColor 55%, transparent);
  border-radius: 50%;
  background: none;
  color: inherit;
  transition: background-color 0.25s var(--ease), color 0.25s var(--ease), border-color 0.25s var(--ease);
}

.stage-arrow svg,
.stage-pause svg {
  width: 18px;
  height: 18px;
}

.stage-pause:disabled {
  opacity: 0.5;
}

.stage-pause [data-glyph="play"],
.stage-pause[aria-pressed="true"] [data-glyph="pause"] {
  display: none;
}

.stage-pause[aria-pressed="true"] [data-glyph="play"] {
  display: block;
}

.stage-lines {
  display: flex;
  flex: 1;
  gap: 5px;
  min-width: 0;
  max-width: 300px;
  margin-left: 8px;
}

.stage-line {
  flex: 1 1 0;
  min-width: 0;
  height: 2px;
  background: color-mix(in srgb, currentColor 34%, transparent);
}

.stage-line i {
  display: block;
  height: 100%;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: left;
}

.stage-line[data-current] i {
  transform: scaleX(1);
}

/*
 * Where each picture is held when the window is not its shape. An upright
 * window shows the middle two fifths of a wide photograph: these say which.
 */
/* Upright, the window is held on her: her whole face, the earring and the pendant (operator, 13 October 2026: "center model a bit"). */
.stage-slide--house .stage-photo { object-position: 88% 30%; }
/* The last banner is a film: the ruby pendant on black. Upright, the window holds the pendant where it hangs in every shot. */
.stage-slide--ruby .stage-photo,
.stage-slide--ruby .stage-film { object-position: 40% 50%; }
.stage-slide--ruby { --stage-close-ground: #050806; }
/*
 * The hoops on pale limestone (AR-0252, 15 October 2026, after the client's rule against black grounds). Upright, the
 * frame is held low, so the right hoop's base stands above the 70px the picture lets go into its ground (at 50% 70%
 * that fade began at the base itself) and both discs' tops stay in. Its ground is the limestone's own, sampled at the
 * frame's foot where that fade meets it. Wide, its review holds it at 72% 60%: at 54% the right hoop's base was cut on
 * stages wider than about 2.5:1, and at 60% the pair stays whole to about 2.7:1.
 */
.stage-slide--facetta .stage-photo { object-position: 70% 92%; }
.stage-slide--facetta { --stage-close-ground: #d9d2ca; --stage-still-hold: 72% 60%; }
/*
 * The Classic Station Necklace alone on pale limestone (AR-0261, 15 October 2026, after the client's rule against black
 * grounds). Upright, phones included, the slide shows the whole frame, filled by its height and held by its right edge,
 * where the five stations are. A phone's 4:5 window was cut to the stations' own width, so it filled by width and lost
 * the top two under a short phone's header (its review at 390x700); the whole frame keeps every station between the
 * header and the fade at any upright window. Held 64% down, as on a wide stage, where a window too wide for that fill
 * crops it. Its ground is the limestone's own, sampled at the frame's foot where that fade meets it.
 */
.stage-slide--classic .stage-photo { object-position: 100% 64%; }
.stage-slide--classic { --stage-close-ground: #c9c0b5; }
.stage-slide--infinity .stage-photo { object-position: 50% 64%; }
.stage-slide--infinity { --stage-close-ground: #2b1a1c; }
.stage-slide--evening .stage-photo { object-position: 50% 100%; }
.stage-slide--evening { --stage-close-ground: #1a0d0a; }
.stage-slide--weekday .stage-photo { object-position: 50% 55%; }
.stage-slide--weekday { --stage-close-ground: #302c29; }
.stage-slide--utsav .stage-frame--lead .stage-photo { object-position: 50% 60%; }
.stage-slide--navratri .stage-photo { object-position: 50% 100%; }
.stage-slide--navratri { --stage-close-ground: #3a0d14; }
.stage-slide--pujo .stage-photo { object-position: 50% 0; }
.stage-slide--men .stage-frame--lead .stage-photo { object-position: 50% 30%; }
.stage-slide--diwali .stage-frame--lead .stage-photo { object-position: 50% 55%; }

@media (min-width: 600px) {
  .stage {
    --stage-gutter: 32px;
  }

  .stage-words {
    right: auto;
    width: min(78%, 560px);
  }
}

/* A window wider than it is tall, from a tablet on its side upward: the wide stage. */
@media (max-width: 767px), (max-width: 1100px) and (orientation: portrait) {
  /*
   * A close slide: a jewellery photograph from her brow to her collarbone, with the pieces in its lower half
   * (operator, 13 October 2026: "make the poster shoot like such that the jewellery is highlighted not
   * artifiially but naturally feels like"). An upright slide's words stand over that half, so the picture stops
   * above them, on a dark of its own. No shade is laid over the pieces: only the picture's last 70px are let go
   * into that dark, which is where the first line of the words begins.
   */
  .stage-slide--close {
    background: var(--stage-close-ground, var(--charcoal));
  }

  .stage-slide--close .stage-frame--bleed {
    inset: 0 0 280px;
  }

  .stage-slide--close::after {
    background: linear-gradient(0deg, var(--stage-close-ground, var(--charcoal)) 280px, transparent 350px);
  }

  /* The necklace's middle stone, Navratri's bracelet and the pendant's foot hang lowest of any piece, so those slides' shade is shorter and stops under them. */
  .stage-slide--navratri::after,
  .stage-slide--infinity::after {
    background: linear-gradient(0deg, var(--stage-close-ground, var(--charcoal)) 280px, transparent 330px);
  }

  /* The necklace's lowest station stands 0.129 of the picture's height above its foot: 45px or more at the shortest upright stage, so its fade stops 42px up. */
  .stage-slide--classic::after {
    background: linear-gradient(0deg, var(--stage-close-ground, var(--charcoal)) 280px, transparent 322px);
  }

  /*
   * A close slide on a light ground (the Facetta still, since 15 October 2026): its words are the house's dark, as a
   * light slide's are on a wide stage, and so is what turns the stage while it shows.
   */
  .stage-slide--close[data-tone="light"] {
    color: var(--charcoal);
  }

  .stage-slide--close[data-tone="light"] .stage-kicker {
    color: var(--signature-ink);
  }

  .stage-slide--close[data-tone="light"] .stage-cta {
    border-color: var(--berry);
    background: var(--berry);
    color: var(--offwhite);
  }

  .stage:has(.stage-slide--close[data-tone="light"].is-active) .stage-controls,
  .stage:has(.stage-slide--utsav.is-active) .stage-controls {
    color: var(--charcoal);
  }

  /*
   * The Utsav slide upright (its review, 15 October 2026). Filled by its picture, the ring's halo stood under the
   * kicker and the headline, and under the charcoal shade; the frame is not tall enough for any crop of it to lift the
   * ring clear of four lines of words. So the picture is held above the words, in the room they leave, on the slide's
   * own blush: its foot is let go into that ground and nothing is laid over it, and the words take the house's dark,
   * as they do on a wide stage.
   */
  .stage-slide--utsav {
    display: flex;
    flex-direction: column;
    background: var(--blush);
    color: var(--charcoal);
  }

  .stage-slide--utsav::after {
    content: none;
  }

  .stage-slide--utsav .stage-media {
    position: relative;
    inset: auto;
    flex: 1 1 0;
    order: -1;
    min-height: 0;
  }

  .stage-slide--utsav .stage-frame--lead {
    -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 56px), transparent);
    mask-image: linear-gradient(180deg, #000 calc(100% - 56px), transparent);
  }

  .stage-slide--utsav .stage-frame--lead .stage-photo {
    object-position: 50% 48%;
  }

  .stage-slide--utsav .stage-words {
    position: relative;
    inset: auto;
    margin: 12px var(--stage-gutter) 84px;
  }

  .stage-slide--utsav .stage-kicker {
    color: var(--signature-ink);
  }

  .stage-slide--utsav .stage-title {
    color: var(--berry);
  }

  .stage-slide--utsav .stage-cta {
    border-color: var(--berry);
    background: var(--berry);
    color: var(--offwhite);
  }

  .stage-slide--utsav .stage-cta--ghost {
    background: none;
    color: var(--berry);
  }
}

/* A phone: the Classic slide's small first line would stand on that stone, so the words begin at the headline. */
@media (max-width: 599px) {
  .stage-slide--classic .stage-kicker {
    display: none;
  }
}

/*
 * A short phone has no room for the picture and four lines of words. There the line that names the pieces is
 * not drawn (the picture's description and the button still name them), and the picture takes its height.
 */
@media (max-width: 599px) and (max-height: 760px) {
  .stage-slide--close .stage-sub {
    display: none;
  }

  .stage-slide--close .stage-frame--bleed {
    inset: 0 0 200px;
  }

  .stage-slide--close::after {
    background: linear-gradient(0deg, var(--stage-close-ground, var(--charcoal)) 200px, transparent 270px);
  }

  .stage-slide--navratri::after,
  .stage-slide--infinity::after {
    background: linear-gradient(0deg, var(--stage-close-ground, var(--charcoal)) 200px, transparent 250px);
  }

  /*
   * There the necklace's picture stops 12px higher, so its lowest station keeps 12px or more from the headline (its
   * review: 4px at 320x568), and it stands 34px or more above the picture's foot, so its fade is 30px.
   */
  .stage-slide--classic .stage-frame--bleed {
    inset: 0 0 212px;
  }

  .stage-slide--classic::after {
    background: linear-gradient(0deg, var(--stage-close-ground, var(--charcoal)) 212px, transparent 242px);
  }

  /*
   * The Utsav slide likewise drops its line of terms there (the headline and the code's button still carry the
   * offer, and the offer's own window its last day), and lets go of only the last 32px of its picture, so the ring
   * keeps its whole halo above the words on a phone's own height (a stage of about 530px).
   */
  .stage-slide--utsav .stage-sub {
    display: none;
  }

  .stage-slide--utsav .stage-frame--lead {
    -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 32px), transparent);
    mask-image: linear-gradient(180deg, #000 calc(100% - 32px), transparent);
  }

  .stage-slide--utsav .stage-frame--lead .stage-photo {
    object-position: 50% 50%;
  }

  /*
   * The Facetta still there: its 4:5 window, the width of a phone, stands the hoops about 260px tall, more than the
   * room above the first line of words. So its words begin at the headline (as the Classic slide's do), only the
   * picture's last 40px are let go into its ground, and the frame is held higher, the discs' tops in and the right
   * hoop's base above that fade.
   */
  .stage-slide--facetta .stage-kicker {
    display: none;
  }

  .stage-slide--facetta::after {
    background: linear-gradient(0deg, var(--stage-close-ground) 200px, transparent 240px);
  }

  .stage-slide--facetta .stage-photo {
    object-position: 70% 78%;
  }
}

@media (min-width: 1101px), (min-width: 768px) and (orientation: landscape) {
  .stage {
    --stage-gutter: max(56px, calc((100% - 1360px) / 2));
  }

  .stage-slides {
    height: clamp(480px, calc(100svh - 86px), 900px);
  }

  .stage-slide--bleed::after {
    background:
      linear-gradient(90deg, rgb(var(--stage-shade) / 0.6) 0%, rgb(var(--stage-shade) / 0.3) 36%, rgb(var(--stage-shade) / 0) 60%),
      linear-gradient(0deg, rgb(var(--stage-shade) / 0.42) 0%, rgb(var(--stage-shade) / 0) 26%);
  }

  .stage-slide--split::after {
    content: none;
  }

  .stage-words {
    bottom: clamp(104px, 16%, 156px);
    width: min(48%, 660px);
  }

  .stage-title {
    font-size: clamp(3.5rem, 1.2rem + 5.4vw, 7.75rem);
    line-height: 0.96;
    letter-spacing: -0.035em;
  }

  .stage-title span {
    white-space: nowrap;
  }

  .stage-kicker {
    margin-bottom: 18px;
  }

  .stage-sub {
    max-width: 38ch;
    margin-top: 22px;
    font-size: clamp(1rem, 0.9rem + 0.3vw, 1.18rem);
  }

  .stage-actions {
    gap: 12px;
    margin-top: 28px;
  }

  .stage-cta {
    min-height: 54px;
    padding: 0 26px;
    font-size: 15px;
  }

  .stage-note {
    margin-top: 18px;
    font-size: 13px;
  }

  .stage-controls {
    right: auto;
    bottom: 30px;
    width: min(46%, 440px);
  }

  /* A split slide: the ground is one colour, the portrait stands the height of the stage on its right. */
  .stage-slide--split {
    background: var(--stage-ground, var(--berry));
  }

  .stage-slide--split .stage-words {
    width: min(40%, 560px);
  }

  .stage-slide--split .stage-title {
    font-size: clamp(2.9rem, 0.9rem + 4.1vw, 6rem);
  }

  .stage-media {
    left: auto;
    width: 52%;
  }

  .stage-frame--lead {
    inset: 0 0 0 auto;
    width: 76%;
  }

  .stage-frame--inset {
    display: block;
    position: absolute;
    left: 0;
    bottom: 13%;
    width: 31%;
    aspect-ratio: 4 / 5;
    border: 6px solid var(--stage-ground, var(--berry));
    box-shadow: 0 34px 60px -26px rgb(var(--stage-shade) / 0.6);
  }

  /*
   * A ground is never left blank (operator, 12 October 2026, of the offer's
   * slide: "the left side looks blank always use images as bg"). Behind the
   * words stands a wall of the studio's own pictures, three columns set at
   * different heights, under a veil of the slide's colour: the ground keeps
   * its colour, the words keep their contrast, and the eye finds jewellery
   * wherever it rests. The veil thins toward the portrait.
   */
  .stage-frame--wall {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    position: absolute;
    inset: 0 auto 0 0;
    width: 62%;
    /* The columns' scroll is measured against the wall's own height (stage-wall-scroll). */
    container-type: size;
  }

  .stage-wall-col {
    display: grid;
    flex: 1 1 0;
    gap: 10px;
    min-width: 0;
  }

  .stage-wall-col:nth-child(1) { transform: translateY(-7%); }
  .stage-wall-col:nth-child(2) { transform: translateY(-21%); }
  .stage-wall-col:nth-child(3) { transform: translateY(-12%); }

  .stage-frame--wall .stage-photo {
    height: auto;
    aspect-ratio: 4 / 5;
  }

  .stage-frame--wall::after {
    content: "";
    position: absolute;
    inset: 0;
    background: var(--stage-ground, var(--berry));
    opacity: 0.8;
  }

  @supports (background: color-mix(in srgb, red 50%, blue)) {
    .stage-frame--wall::after {
      background: linear-gradient(90deg,
        color-mix(in srgb, var(--stage-ground, var(--berry)) var(--stage-veil, 82%), transparent) 0%,
        color-mix(in srgb, var(--stage-ground, var(--berry)) var(--stage-veil, 82%), transparent) 58%,
        color-mix(in srgb, var(--stage-ground, var(--berry)) var(--stage-veil-thin, 56%), transparent) 100%);
      opacity: 1;
    }
  }

  /*
   * More than one picture of the piece (operator, 12 October 2026: "multiple
   * snaps of the ring animated floating snaps on this ... same for other
   * posters which have snaps"). The first still keeps its place; one or two
   * more stand by it, smaller, each tilted a little as a print would lie.
   * They drift while their slide is shown (see the motion rules below) and
   * stop with the stage's pause.
   */
  .stage-frame--snap {
    display: block;
    position: absolute;
    z-index: 2;
    aspect-ratio: 4 / 5;
    border-radius: 4px;
    box-shadow: 0 26px 48px -22px rgb(var(--stage-shade) / 0.7);
  }

  .stage-slide--split .stage-frame--snap-b {
    left: 7%;
    top: 12%;
    width: 21%;
    border: 5px solid var(--stage-ground, var(--berry));
    rotate: -3deg;
  }

  .stage-slide--utsav { --stage-ground: var(--blush); }
  .stage-slide--diwali { --stage-ground: var(--champagne); }
  /* The men's slide is inside the men's scope, the one place Midnight Ink is used (DESIGN.md). */
  .stage-slide--men { --stage-ground: #141B2D; --stage-veil: 86%; --stage-veil-thin: 68%; }

  .stage-slide--house .stage-photo { object-position: 50% 30%; }

  /*
   * A poster: one person, head to foot, in a festival's own dress on a studio
   * backdrop. The photograph is shown whole, the height of the stage, against
   * its right edge, and its backdrop is carried on to the left as the ground
   * (a strip one column wide cut from the photograph's own left edge, so the
   * wall and the floor meet where they do in the picture). The words stand on
   * that ground. Nothing is laid over the person.
   */
  .stage-slide--poster {
    background: var(--berry) var(--stage-ground-picture, none) 0 0 / 100% 100% no-repeat;
  }

  .stage-poster {
    inset: 0 0 0 auto;
    width: auto;
    max-width: 100%;
    height: 100%;
    aspect-ratio: 3 / 2;
  }

  .stage-slide--poster .stage-frame--bleed {
    -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 10%);
    mask-image: linear-gradient(90deg, transparent 0%, #000 10%);
  }

  .stage-slide--poster .stage-photo,
  .stage-slide--pujo .stage-photo {
    object-position: 100% 50%;
  }

  .stage-slide--poster::after {
    background: linear-gradient(0deg, rgb(var(--stage-shade) / 0.34) 0%, rgb(var(--stage-shade) / 0) 24%);
  }

  /* A skirt takes more of the stage than a portrait does, so the words are set a size down, as on a split slide. */
  .stage-slide--poster .stage-words {
    width: min(40%, 560px);
  }

  .stage-slide--poster .stage-title {
    font-size: clamp(2.9rem, 0.9rem + 4.1vw, 6rem);
  }

  /*
   * A close slide on a wide stage is set as a poster is: the photograph whole, the height of the stage, against
   * its right edge, its backdrop carried on to the left for the words. Only the left is shaded: the pieces are
   * in the foot of the picture and nothing is laid over them.
   */
  .stage-slide--close {
    background: var(--stage-close-ground, var(--charcoal)) var(--stage-ground-picture, none) 0 0 / 100% 100% no-repeat;
  }

  .stage-slide--close .stage-frame--bleed {
    -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 10%);
    mask-image: linear-gradient(90deg, transparent 0%, #000 10%);
  }

  .stage-slide--close .stage-photo {
    object-position: 100% 50%;
  }

  .stage-slide--close::after {
    background: linear-gradient(90deg, rgb(var(--stage-shade) / 0.5) 0%, rgb(var(--stage-shade) / 0.22) 30%, rgb(var(--stage-shade) / 0) 48%);
  }

  .stage-slide--close .stage-words {
    width: min(40%, 560px);
  }

  .stage-slide--close .stage-title {
    font-size: clamp(2.9rem, 0.9rem + 4.1vw, 6rem);
  }

  .stage-slide--navratri { --stage-ground-picture: url("https://aryamond-assets-cbabcjahhkd0fsbf.z02.azurefd.net/landing/media/revamp/navratri-aarti-wide-ground.webp"); }
  .stage-slide--classic { --stage-ground-picture: url("https://aryamond-assets-cbabcjahhkd0fsbf.z02.azurefd.net/landing/media/revamp/classic-limestone-wide-ground.webp"); }

  /*
   * A still: a close slide with no person in it (operator, 13 October 2026: "dont use model do abstract jewellery
   * shoot ... best posters instead of models"). A still life loses nothing to a crop at its head and foot, so on a
   * wide stage it fills the stage edge to edge, held on the piece, and keeps the close slide's shade on the left.
   */
  .stage-slide--still {
    background: var(--stage-close-ground, var(--charcoal));
    container-type: size;
  }

  .stage-slide--still .stage-poster {
    inset: 0;
    max-width: none;
    height: auto;
    aspect-ratio: auto;
  }

  .stage-slide--still .stage-frame--bleed {
    -webkit-mask-image: none;
    mask-image: none;
  }

  .stage-slide--still .stage-photo {
    object-position: var(--stage-still-hold, 70% 50%);
  }

  .stage-slide--still .stage-words {
    width: min(40%, 560px, var(--stage-clear, 560px));
  }

  /*
   * The Facetta still is on pale limestone (since 15 October 2026) and its words are the house's dark, so the shade
   * on its left is the limestone's own colour, sampled at the frame's left, and not the house's dark: nothing dark is
   * laid on a light picture.
   */
  .stage-slide--facetta::after {
    background: linear-gradient(90deg, rgb(224 217 210 / 0.6) 0%, rgb(224 217 210 / 0.26) 30%, rgb(224 217 210 / 0) 48%);
  }

  /*
   * The Classic still (AR-0261). Its review, 15 October 2026: the words stop short of x 1250 of the frame, 354px clear
   * of the metal, and a station is drawn no smaller than 40px. It fills the stage as the other stills do, which keeps
   * its stations 46px or more on a 1280 by 720 window (set the height of the stage they were 35px), held at 64% down:
   * its stations run from y 461 to y 1790 of the 2048, and at 64% they stay whole on a stage up to 9:4. The frame is
   * 3072 by 2048, so x 1250 is 40.6% of the stage's width; on a stage narrower than 3:2 it is held by its right edge,
   * and there x 1250 is 89% of the stage's height in from the right.
   */
  .stage-slide--classic {
    --stage-still-hold: 100% 64%;
    background: var(--stage-close-ground) var(--stage-ground-picture) 0 0 / 100% 100% no-repeat;
  }

  .stage-slide--classic .stage-words {
    --stage-clear: calc(min(40.6cqw, 100cqw - 89cqh) - max(56px, (100cqw - 1360px) / 2) - 12px);
  }

  .stage-slide--classic .stage-title {
    font-size: min(clamp(2.9rem, 0.9rem + 4.1vw, 6rem), calc(var(--stage-clear) / 5.6));
  }

  /*
   * Wider than 9:4 a filled stage would cut a station off, so there the frame stands whole, the height of the stage,
   * against its right edge, as a person's does, and the limestone is carried on to the left as its ground. x 1250 is
   * then 89% of the stage's height in from the right.
   */
  @container (min-aspect-ratio: 9 / 4) {
    .stage-slide--classic .stage-poster {
      inset: 0 0 0 auto;
      max-width: 100%;
      height: 100%;
      aspect-ratio: 3 / 2;
    }

    .stage-slide--classic .stage-frame--bleed {
      -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 10%);
      mask-image: linear-gradient(90deg, transparent 0%, #000 10%);
    }

    .stage-slide--classic .stage-photo {
      object-position: 100% 50%;
    }

    .stage-slide--classic .stage-words {
      --stage-clear: calc(100cqw - 89cqh - max(56px, (100cqw - 1360px) / 2) - 12px);
    }
  }

  /* Its words are the house's dark on the limestone, so the shade on its left is the limestone's own colour, sampled at the frame's left. */
  .stage-slide--classic::after {
    background: linear-gradient(90deg, rgb(223 213 202 / 0.6) 0%, rgb(223 213 202 / 0.26) 30%, rgb(223 213 202 / 0) 48%);
  }

  /*
   * The film slide. The film is as wide as the stage (operator, 13 October 2026: "why cant the first video in
   * banner be full screen width in large screen make it"), and it is placed by its pendant, not by the stage's
   * edge: in the two shots where the pendant hangs nearest the words, its head's left edge is 30% across the film,
   * and the frame is set so that that edge stands 56px right of the words' column (30% or 420px from the gutter)
   * at every width. That starts the film 100px to 480px in from the stage's left edge, under the words, where its
   * edge is let out into the film's own black; what runs past the right edge is cut. The words stand on a shade of
   * that black, which is what makes them readable over the close shots that fill the frame with pale stone. The
   * shade is measured from the words' column too (the gutter grows on a very wide stage, and a shade measured
   * from the stage's edge had thinned to nothing under the words at 3440px).
   */
  .stage-slide--film .stage-frame--bleed {
    left: calc(var(--stage-gutter) + min(30cqw, 420px) + 56px - 30cqw);
    right: auto;
    width: 100cqw;
    -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 9%);
    mask-image: linear-gradient(90deg, transparent 0, #000 9%);
  }

  .stage-slide--film .stage-photo,
  .stage-slide--film .stage-film {
    object-position: 50% 50%;
  }

  .stage-slide--film .stage-words {
    width: min(30%, 420px);
  }

  .stage-slide--film::after {
    --stage-words-edge: calc(var(--stage-gutter) + min(30%, 420px));
    background: linear-gradient(
      90deg,
      rgb(5 8 6 / 0.92) 0%,
      rgb(5 8 6 / 0.72) var(--stage-words-edge),
      rgb(5 8 6 / 0.28) calc(var(--stage-words-edge) + 9%),
      rgb(5 8 6 / 0) calc(var(--stage-words-edge) + 21%)
    );
  }

  /*
   * The Infinity slide's review: "Words and buttons stay left of x = 1040; nothing is laid over the block." Its
   * web copy is 2448 by 1462 and is held at 70% across, so on a stage wider than that shape x 1040 is 42.4% of
   * the stage's width, and on a narrower one it is 70% of the width less 46.1% of the height. The gutter is
   * written out in the slide's own units: `--stage-gutter` holds a percentage, which in a font size would be a
   * percentage of the type and not of the stage, and the headline is sized from this too.
   */
  .stage-slide--infinity {
    --stage-clear: calc(min(42.4cqw, 70cqw - 46.1cqh) - max(56px, (100cqw - 1360px) / 2) - 8px);
  }

  .stage-slide--infinity .stage-title {
    font-size: min(clamp(2.9rem, 0.9rem + 4.1vw, 6rem), calc(var(--stage-clear) / 5.6));
  }

  /*
   * Navratri's review, 13 October 2026: "On wide screens the words stay inside x 0 to 980 and y 0 to 1100 of the
   * frame, clear of her dupatta." By the same measure that is 102.2% of the stage's height in from the right and
   * 46.3% of it up from the foot. The headline is sized to that width so its two lines stay two, and on a stage
   * too short for all four lines the one that names the pieces is not drawn.
   */
  .stage-slide--navratri {
    --stage-clear: calc(100cqw - 102.2cqh - var(--stage-gutter) - 12px);
    container-type: size;
  }

  .stage-slide--navratri .stage-words {
    bottom: 47%;
    width: min(40%, 560px, var(--stage-clear));
  }

  .stage-slide--navratri .stage-title {
    font-size: min(clamp(2.9rem, 0.9rem + 4.1vw, 6rem), calc(var(--stage-clear) / 4.9));
  }

  @container (max-height: 620px) {
    .stage-slide--navratri .stage-sub {
      display: none;
    }
  }
  .stage-slide--evening { --stage-ground-picture: url("https://aryamond-assets-cbabcjahhkd0fsbf.z02.azurefd.net/landing/media/revamp/evening-bloom-wide-ground.webp"); }
  .stage-slide--weekday { --stage-ground-picture: url("https://aryamond-assets-cbabcjahhkd0fsbf.z02.azurefd.net/landing/media/revamp/week-ring-wide-ground.webp"); }
  .stage-slide--pujo { --stage-ground-picture: url("https://aryamond-assets-cbabcjahhkd0fsbf.z02.azurefd.net/landing/media/revamp/pujo-saree-wide-ground.webp"); }

  /*
   * The piece the slide sells, as a small still. It is placed by the
   * photograph's own measure, so it keeps its distance from the person at
   * every size of stage, and it stops above the chat button's corner.
   */
  .stage-slide--poster .stage-frame--inset {
    z-index: 2;
    left: auto;
    bottom: auto;
    width: auto;
    height: 23%;
    border: 0;
    border-radius: 4px;
    box-shadow: 0 30px 54px -24px rgb(var(--stage-shade) / 0.7);
  }


  /*
   * Durga Puja's poster is a portrait from the chest up, and since 15 October 2026 nothing is laid over it: the
   * client asked for the still of the ring to go (operator: "remove the ring picture"), and the prints on its wall
   * were rings and stills on black, which the client has ruled out.
   */

  /*
   * And on a poster, more of them: the wall beside a full-length figure is most of the stage (operator, 12 October
   * 2026: "add more snaps cover most negative space on posters"). A row of prints stands above the words and, where
   * she leaves room, one beside them. They start at the words' own edge and are sized and spaced by the stage's
   * height (container units), as the photograph is, so on any wide window they keep their spacing and stop short of
   * her. A stage under 1280px wide or 674px tall has no wall to spare: the words reach the row, so it is not drawn.
   */
  @media (min-width: 1280px) and (min-height: 760px) {
    .stage-frame--strip {
      display: block;
      position: absolute;
      inset: 0;
      z-index: 2;
      overflow: visible;
      container-type: size;
      pointer-events: none;
    }

    .stage-strip-snap {
      position: absolute;
      width: auto;
      aspect-ratio: 4 / 5;
      border-radius: 4px;
      box-shadow: 0 26px 48px -22px rgb(var(--stage-shade) / 0.7);
    }

    .stage-strip-snap:nth-child(1) { left: var(--stage-gutter); top: 7%; height: 22%; rotate: -3deg; }
    .stage-strip-snap:nth-child(2) { left: calc(var(--stage-gutter) + 21cqh); top: 15%; height: 17%; rotate: 2deg; }
    .stage-strip-snap:nth-child(3) { left: calc(var(--stage-gutter) + 37cqh); top: 5%; height: 25%; rotate: 3deg; }
    .stage-strip-snap:nth-child(4) { left: calc(var(--stage-gutter) + 60cqh); top: 13%; height: 19%; rotate: -2deg; }
    .stage-strip-snap:nth-child(5) { left: calc(var(--stage-gutter) + min(40%, 560px) + 4cqh); top: 47%; height: 23%; rotate: 2deg; }
    /* Past the fifth, a print waits for the room it needs: none is drawn until its own rule below places it. */
    .stage-strip-snap:nth-child(n + 6) { display: none; }
    /* Navratri's words stand in the upper wall (its review), so its prints stand under them, short of her dupatta. */
    .stage-slide--navratri .stage-strip-snap:nth-child(1) { top: 58%; height: 21%; }
    .stage-slide--navratri .stage-strip-snap:nth-child(2) { left: calc(var(--stage-gutter) + 19cqh); top: 63%; height: 16%; }
    .stage-slide--navratri .stage-strip-snap:nth-child(3) { left: calc(var(--stage-gutter) + 34cqh); top: 57%; height: 22%; }
  }

  @media (min-width: 1440px) and (min-height: 760px) {
    .stage-strip-snap:nth-child(6) { display: block; left: calc(var(--stage-gutter) + 80cqh); top: 8%; height: 19%; rotate: 3deg; }
  }

  /* From here the page's column leaves a margin to the left of the words, and two prints stand in it. */
  @media (min-width: 1800px) and (min-height: 760px) {
    .stage-strip-snap:nth-child(7) { display: block; left: calc(var(--stage-gutter) - 27cqh); top: 9%; height: 27%; rotate: 2deg; }
    .stage-strip-snap:nth-child(8) { display: block; left: calc(var(--stage-gutter) - 23cqh); top: 56%; height: 24%; rotate: -3deg; }
  }

  /* A light ground: the words are the house's dark, and so is what turns the stage while it shows. */
  .stage-slide[data-tone="light"] {
    color: var(--charcoal);
  }

  .stage-slide[data-tone="light"] .stage-kicker {
    color: var(--signature-ink);
  }

  .stage-slide--utsav .stage-title {
    color: var(--berry);
  }

  .stage-slide[data-tone="light"] .stage-cta {
    border-color: var(--berry);
    background: var(--berry);
    color: var(--offwhite);
  }

  .stage-slide[data-tone="light"] .stage-cta--ghost {
    background: none;
    color: var(--berry);
  }

  .stage[data-tone="light"] .stage-controls {
    color: var(--charcoal);
  }

  /*
   * The four colours, as a card at the foot of the first slide. It keeps to the
   * picture's own right edge, over her shoulder: the page's gutter grows with the
   * window, and a card hung from it walked onto her jaw and neck on a large
   * screen. Her face ends 85% of the way across at every width, and this card
   * starts past 86%. It stops above the chat button's corner.
   */
  .stage-inset {
    display: block;
    position: absolute;
    z-index: 2;
    right: clamp(20px, 2vw, 40px);
    bottom: 104px;
    width: clamp(132px, 11.5vw, 236px);
    overflow: hidden;
    border-radius: 4px;
    background: var(--blush);
    color: var(--berry);
    box-shadow: 0 34px 60px -26px rgb(var(--stage-shade) / 0.7);
  }

  .stage-inset-media {
    display: block;
    position: relative;
    aspect-ratio: 4 / 5;
    overflow: hidden;
  }

  .stage-inset-media img,
  .stage-inset-media video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }

  .stage-inset-caption {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    padding: 12px 14px;
    font: 400 15px/1.2 Jost, sans-serif;
  }

  .stage-inset-caption strong {
    font-weight: 500;
  }

  .stage-inset-caption .icon {
    width: 18px;
    height: 18px;
    flex: none;
  }

  /* The card at its narrowest: its two lines stay two. */
  @media (max-width: 1279px) {
    .stage-inset-caption {
      gap: 6px;
      padding: 10px 12px;
      font-size: 13px;
    }

    .stage-inset-caption .icon {
      width: 16px;
      height: 16px;
    }
  }
}

/* A window too short for the words at their size (a laptop with its dock and toolbars open). */
@media (min-width: 768px) and (orientation: landscape) and (max-height: 640px) {
  .stage-words {
    bottom: 92px;
  }

  .stage-title {
    font-size: clamp(2.75rem, 1rem + 3.6vw, 4.5rem);
  }

  .stage-slide--split .stage-title {
    font-size: clamp(2.5rem, 0.8rem + 3.3vw, 4rem);
  }

  .stage-sub {
    margin-top: 14px;
  }

  .stage-actions {
    margin-top: 18px;
  }

  .stage-inset {
    display: none;
  }
}

/* A large monitor: the stage is allowed more height, so the picture is not a letterbox, and the small words grow with it. */
@media (min-width: 1800px) {
  .stage-slides {
    height: clamp(690px, calc(100svh - 86px), 1080px);
  }

  .stage-kicker {
    font-size: 13px;
  }

  .stage-sub {
    font-size: 1.3rem;
  }

  .stage-cta {
    min-height: 60px;
    padding: 0 30px;
    font-size: 16px;
  }

  .stage-note {
    font-size: 14px;
  }
}

@media (hover: hover) {
  .stage-cta:hover {
    background: var(--berry);
    border-color: var(--berry);
    color: var(--offwhite);
  }

  .stage-cta:hover .icon {
    transform: translateX(4px);
  }

  .stage-arrow:hover,
  .stage-pause:not(:disabled):hover {
    background: currentColor;
  }

  .stage-arrow:hover svg,
  .stage-pause:not(:disabled):hover svg {
    color: var(--charcoal);
  }

  .stage[data-tone="light"] .stage-arrow:hover svg,
  .stage[data-tone="light"] .stage-pause:not(:disabled):hover svg {
    color: var(--offwhite);
  }
}

@media (hover: hover) and (min-width: 768px) and (orientation: landscape), (hover: hover) and (min-width: 1101px) {
  .stage-slide[data-tone="light"] .stage-cta:hover {
    background: var(--charcoal);
    border-color: var(--charcoal);
    color: var(--offwhite);
  }
}

.stage :focus-visible {
  outline: 2px solid currentColor;
  outline-offset: 3px;
}

/*
 * Motion. A slide that has just been turned to settles: its picture eases
 * back from a little too close, its words rise in order, and the line under
 * it fills for as long as it is shown. None of it runs on the first paint,
 * under reduced motion, or with the page's switch off.
 */
@media (prefers-reduced-motion: no-preference) {
  body[data-motion="full"] .stage-slide.is-entering .stage-frame--bleed .stage-photo,
  body[data-motion="full"] .stage-slide.is-entering .stage-frame--lead .stage-photo {
    animation: stage-settle 7s cubic-bezier(0.16, 0.7, 0.2, 1) both;
  }

  body[data-motion="full"] .stage-slide.is-entering .stage-words > * {
    animation: stage-rise 0.9s var(--ease) both;
  }

  body[data-motion="full"] .stage-slide.is-entering .stage-words > :nth-child(1) { animation-delay: 0.18s; }
  body[data-motion="full"] .stage-slide.is-entering .stage-words > :nth-child(2) { animation-delay: 0.28s; }
  body[data-motion="full"] .stage-slide.is-entering .stage-words > :nth-child(3) { animation-delay: 0.4s; }
  body[data-motion="full"] .stage-slide.is-entering .stage-words > :nth-child(4) { animation-delay: 0.5s; }
  body[data-motion="full"] .stage-slide.is-entering .stage-words > :nth-child(5) { animation-delay: 0.58s; }

  /*
   * The wall's columns scroll on their own (operator, 12 October 2026: "can the vertical collages be auto
   * scrolling"). The outer two go up and the middle one down, each at its own pace, from the column's top
   * standing at the wall's top to its foot standing at the wall's foot and back again, so a column never
   * runs out of pictures. A column moves only while its slide is the one shown, holds where it is while
   * the slide fades out, and holds when the stage is paused.
   */
  @supports (height: 1cqh) {
    body[data-motion="full"] .stage-wall-col { animation: stage-wall-scroll 28s linear -5s infinite alternate paused; }
    body[data-motion="full"] .stage-wall-col:nth-child(2) { animation-duration: 34s; animation-delay: -12s; animation-direction: alternate-reverse; }
    body[data-motion="full"] .stage-wall-col:nth-child(3) { animation-duration: 24s; animation-delay: -9s; }
    body[data-motion="full"] .stage-slide.is-active .stage-wall-col { animation-play-state: running; }
    body[data-motion="full"] [data-still] .stage-slide.is-active .stage-wall-col { animation-play-state: paused; }
  }

  /*
   * A still rises into place, then drifts for as long as its slide is shown: each a different way and
   * at a different pace, so the group never moves as one. This is the stage's one continuous motion,
   * and the stage's own pause stops it.
   */
  body[data-motion="full"] .stage-slide.is-entering .stage-frame--inset {
    animation: stage-rise 1s var(--ease) 0.45s both, stage-drift-a 5.6s ease-in-out 1.45s infinite alternate;
  }

  body[data-motion="full"] .stage-slide.is-entering .stage-frame--snap-b {
    animation: stage-rise 1s var(--ease) 0.6s both, stage-drift-b 6.8s ease-in-out 1.6s infinite alternate;
  }

  body[data-motion="full"] .stage-slide.is-entering .stage-frame--snap-c {
    animation: stage-rise 1s var(--ease) 0.75s both, stage-drift-a 7.4s ease-in-out 1.75s infinite alternate;
  }

  body[data-motion="full"] .stage-slide.is-entering .stage-strip-snap:nth-child(odd) {
    animation: stage-rise 1s var(--ease) 0.5s both, stage-drift-b 7.2s ease-in-out 1.5s infinite alternate;
  }

  body[data-motion="full"] .stage-slide.is-entering .stage-strip-snap:nth-child(even) {
    animation: stage-rise 1s var(--ease) 0.7s both, stage-drift-a 6.1s ease-in-out 1.7s infinite alternate;
  }

  /* Written to outweigh the rules above, whose shorthand sets the state back to running. */
  body[data-motion="full"] .stage:has(.stage-pause[aria-pressed="true"]) .stage-slide .stage-frame--inset,
  body[data-motion="full"] .stage:has(.stage-pause[aria-pressed="true"]) .stage-slide .stage-frame--snap,
  body[data-motion="full"] .stage:has(.stage-pause[aria-pressed="true"]) .stage-slide .stage-frame--strip .stage-strip-snap {
    animation-play-state: paused;
  }

  body[data-motion="full"] .stage-controls[data-turning] .stage-line[data-current] i {
    animation: stage-fill 7s linear both;
  }
}

@keyframes stage-wall-scroll {
  from { transform: translateY(0); }
  to { transform: translateY(calc(100cqh - 100%)); }
}

@keyframes stage-drift-a {
  from { transform: translateY(0); }
  to { transform: translateY(-12px); }
}

@keyframes stage-drift-b {
  from { transform: translateY(0); }
  to { transform: translateY(10px); }
}

@keyframes stage-settle {
  from { transform: scale(1.07); }
  to { transform: scale(1); }
}

@keyframes stage-rise {
  from { opacity: 0; transform: translateY(22px); }
  to { opacity: 1; transform: none; }
}

@keyframes stage-fill {
  from { transform: scaleX(0); }
  to { transform: scaleX(1); }
}

@media (prefers-reduced-motion: reduce) {
  /* Nobody who asked for less motion is shown the film: the slide is its photograph. */
  .stage-film {
    display: none;
  }

  .stage-slide,
  .stage-slide.is-active {
    transition: none;
  }
}
