/* Nicecard demo — "Poster Story" (海报风) invitation style. Everything is scoped under .nci--poster,
   .nci-cover--poster and .nci-float--poster so the built-in styles are untouched; new classes use the
   pst- prefix. The page is a size container, so every measurement is in cqw and the layout is identical
   in proportion in the 372px phone frame, the 390px editor canvas and a 390px phone. */

.nci--poster,
.nci-cover--poster,
.nci-float--poster {
  --pst-ink: #1d1b1a;
  --pst-grey: #6f6a66;
  --pst-rule: #bdbab6;
  --pst-wine: #9b1b23;
  --pst-sage: #e9ece6;
  --pst-paper: #fff;
  --pst-g: 9cqw;
  --pst-hand: 'Long Cang', 'Caveat', 'Noto Serif SC', cursive;
  --pst-sign: 'Mrs Saint Delafield', 'Parisienne', cursive;
  --pst-vibes: 'Great Vibes', 'Parisienne', cursive;
  --pst-ital: 'Italianno', 'Parisienne', cursive;
  --pst-caps: 'Cinzel', 'Cormorant Garamond', Georgia, serif;
  --pst-round: 'Quicksand', 'Jost', 'Noto Sans SC', system-ui, sans-serif;
  --pst-serif: 'Noto Serif SC', 'Cormorant Garamond', Georgia, serif;
  --pst-ital-serif: 'Cormorant Garamond', 'Noto Serif SC', Georgia, serif;
}

.nci--poster {
  container-type: inline-size;
  overflow-x: clip;
  overflow-y: visible;
  background: var(--pst-paper);
  color: var(--pst-ink);
  font-family: var(--pst-round);
  --nci-bg: #fff;
  --nci-soft: #edeeea;
  --nci-slot-line: rgba(155, 27, 35, 0.4);
  --nci-slot-ink: var(--pst-grey);
  --nci-hint: rgba(155, 27, 35, 0.45);
}

/* flow-root keeps a section's first and last child margins inside it, so a text-first section
   (venue) still opens with air and a text-last one does not run into the next photo poster. */
.nci--poster .nci-section {
  display: flow-root;
  padding: 0;
}

.nci--poster .nci-s-gallery,
.nci--poster .nci-s-countdown,
.nci--poster .nci-s-schedule,
.nci--poster .nci-s-faq {
  padding-bottom: 15cqw;
}

/* White text sitting on a photo keeps a lighter edit hint. */
.nci--poster .pst-poster-body .nci-f--hint,
.nci--poster .pst-band-body .nci-f--hint {
  border-bottom-color: rgba(255, 255, 255, 0.65);
}

/* ───── Full-bleed photo posters (cover, calendar, closing) ───── */

.nci--poster .pst-poster {
  position: relative;
  overflow: hidden;
  background: #2a2f29;
  min-height: 420px;
}

/* Taller than the photograph it carries, so the whole height of the frame stays in view and the two of
   them scale up with it. The type below is sized in cqw, i.e. in fixed pixels against the 390 width, so
   a taller frame also shrinks the share of the picture the display block covers — which is what opens
   the clear band between their faces and the first printed line. */
.nci--poster .pst-poster--cover {
  aspect-ratio: 66 / 125;
}

.nci--poster .pst-poster--cal {
  aspect-ratio: 19 / 30;
}

.nci--poster .pst-poster--finale {
  aspect-ratio: 2 / 3;
}

.nci--poster .pst-poster-img {
  position: absolute;
  inset: 0;
}

.nci--poster .pst-poster-veil {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(24, 30, 24, 0.64) 0%, rgba(24, 30, 24, 0.28) 26%, rgba(24, 30, 24, 0) 44%),
    linear-gradient(0deg, rgba(24, 30, 24, 0.68) 0%, rgba(24, 30, 24, 0.3) 20%, rgba(24, 30, 24, 0) 48%);
}

/* The calendar panel is translucent white, so the lower half of the photo carries a deeper scrim. */
.nci--poster .pst-poster-veil--cal {
  background:
    linear-gradient(180deg, rgba(24, 30, 24, 0.4) 0%, rgba(24, 30, 24, 0.06) 22%, rgba(24, 30, 24, 0) 40%),
    linear-gradient(0deg, rgba(24, 30, 24, 0.46) 0%, rgba(24, 30, 24, 0.3) 46%, rgba(24, 30, 24, 0) 74%);
}

.nci--poster .pst-poster-veil--top {
  background: linear-gradient(180deg, rgba(24, 30, 24, 0.4) 0%, rgba(24, 30, 24, 0.08) 34%, rgba(24, 30, 24, 0) 56%);
}

/* The cover carries no type in its upper half any more, so it drops the shared veil's top wash: that
   gradient ran to 44% and would sit straight across both faces, which is the one thing a wash over a
   photograph must not do. What is left is a single bottom ramp, flatly transparent above 0.52 — below
   the chins by a wide margin — gathering weight only across the gown the display block prints on. */
.nci--poster .pst-poster--cover .pst-poster-veil {
  background: linear-gradient(
    0deg,
    rgba(24, 30, 24, 0.78) 0%,
    rgba(24, 30, 24, 0.72) 16%,
    rgba(24, 30, 24, 0.62) 30%,
    rgba(24, 30, 24, 0.5) 42%,
    rgba(24, 30, 24, 0.36) 52%,
    rgba(24, 30, 24, 0.2) 60%,
    rgba(24, 30, 24, 0.07) 65%,
    rgba(24, 30, 24, 0) 68%
  );
}

.nci--poster .pst-poster-body {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  height: 100%;
  color: #fff;
  text-align: center;
  pointer-events: none;
}

/* Blank areas of the overlay fall through, so the photo slot itself stays selectable in the editor.
   Every decorative layer above the photo (the veils and the sage blocks) is pointer-events: none for
   the same reason — otherwise a click on a full-bleed poster would land on the scrim, not the slot. */
.nci--poster .pst-poster-body .nci-f,
.nci--poster .pst-poster-body button,
.nci--poster .pst-band-body .nci-f {
  pointer-events: auto;
}

/* The display block sits under the couple, not over them. In this frame the two faces run from about
   0.10 to 0.24 of the cover and everything from 0.30 down is veil, gown and black suit, so the opening
   lines start well below the chins and print on empty fabric. The foot keeps its margin-top: auto, so
   this padding is what sets the gap; raise it and the block climbs back onto their faces. */
.nci--poster .pst-poster--cover .pst-poster-body {
  padding: 69cqw 0 0;
}

.nci--poster .pst-poster--cal .pst-poster-body {
  padding: 5cqw 0 0;
}

.nci--poster .pst-poster--finale .pst-poster-body {
  padding: 11cqw 0 0;
}

/* Cover copy */

.nci--poster .pst-quote {
  padding: 0 16cqw;
  font-weight: 300;
  font-size: 2.75cqw;
  line-height: 2;
  letter-spacing: 0.05em;
  color: rgba(255, 255, 255, 0.95);
  /* The smallest type on the cover, and it prints on the bride's gown, which runs near white. A tight
     dark halo under a wider soft one holds its edges there; the wash below only reaches this line
     faintly, because it must stay off her face. */
  text-shadow: 0 1px 3px rgba(20, 26, 20, 0.55), 0 2px 12px rgba(20, 26, 20, 0.5);
}

.nci--poster .pst-welcome {
  margin-top: 3.4cqw;
  font-family: 'Dancing Script', var(--pst-vibes);
  font-weight: 700;
  font-size: 7.6cqw;
  line-height: 1.2;
  color: #fff;
  text-shadow: 0 1px 3px rgba(20, 26, 20, 0.45), 0 2px 16px rgba(20, 26, 20, 0.5);
}

/* In the editor a field's own box is its hit target, and multi-line fields are laid out as blocks so
   the gaps between their lines belong to them. On the cover those boxes lie across the photograph, and
   a full-measure box makes the middle of the picture un-clickable — the click lands on a line of type
   and the photo tray never opens. Shrinking each field to the width of its own words gives the slot
   underneath its picture back, and changes nothing in the guest view, where the fields are inline. */
.nci--poster .pst-poster--cover .pst-quote .nci-f,
.nci--poster .pst-poster--cover .pst-welcome .nci-f,
.nci--poster .pst-cover-foot .nci-f {
  width: fit-content;
  margin-inline: auto;
}

.nci--poster .pst-hand-a .nci-f,
.nci--poster .pst-hand-b .nci-f {
  width: fit-content;
}

.nci--poster .pst-hand {
  position: relative;
  margin-top: 3cqw;
  text-align: left;
}

.nci--poster .pst-hand-a,
.nci--poster .pst-hand-b {
  display: block;
  /* The wine script below is absolutely positioned and its inline box is far taller than its glyphs,
     so without this the second handwriting line sits under it and cannot be clicked in the editor. */
  position: relative;
  z-index: 1;
  font-family: var(--pst-hand);
  font-size: 14cqw;
  line-height: 1.18;
  color: #fff;
  text-shadow: 0 1px 4px rgba(20, 26, 20, 0.42), 0 2px 20px rgba(20, 26, 20, 0.5);
}

.nci--poster .pst-hand-a {
  margin-left: 5cqw;
}

.nci--poster .pst-hand-b {
  margin-left: 21cqw;
}

/* Crosses the gap between the two handwriting lines, over the trees — the photo's right third is
   where the groom stands, and a wine script over a face reads badly. */
.nci--poster .pst-hand-sign {
  position: absolute;
  top: 44%;
  right: 38cqw;
  font-family: var(--pst-sign);
  font-size: 9.2cqw;
  line-height: 1;
  color: var(--pst-wine);
  /* A hairline script in wine over a sunlit photo needs a halo, not a drop shadow, to hold its edges. */
  text-shadow:
    0 0 2px rgba(255, 255, 255, 0.95),
    0 0 12px rgba(255, 255, 255, 0.8),
    0 1px 3px rgba(20, 26, 20, 0.3);
  transform: rotate(-5deg);
}

.nci--poster .pst-hand--finale {
  margin: 0;
}

.nci--poster .pst-hand--finale .pst-hand-a {
  margin-left: 10cqw;
}

.nci--poster .pst-hand--finale .pst-hand-b {
  margin-left: 26cqw;
}

/* The names, date and venue land wherever the photo happens to end — on cover.jpg that is the white
   tablecloth — so the block carries its own scrim instead of trusting the poster veil. */
.nci--poster .pst-cover-foot {
  margin-top: auto;
  padding: 18cqw var(--pst-g) 8cqw;
  background: linear-gradient(0deg, rgba(18, 24, 18, 0.64) 0%, rgba(18, 24, 18, 0.6) 84%, rgba(18, 24, 18, 0) 100%);
}

.nci--poster .pst-couple {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6cqw;
}

.nci--poster .pst-couple-side {
  flex: 1 1 0;
  min-width: 0;
}

.nci--poster .pst-couple-name {
  display: block;
  font-family: var(--pst-serif);
  font-size: 5.4cqw;
  line-height: 1.3;
  letter-spacing: 0.06em;
  text-shadow: 0 2px 10px rgba(20, 26, 20, 0.4);
  overflow-wrap: anywhere;
}

.nci--poster .pst-couple-role {
  display: block;
  margin-top: 0.6cqw;
  font-family: var(--pst-caps);
  font-size: 3.3cqw;
  letter-spacing: 0.22em;
  color: rgba(255, 255, 255, 0.92);
  text-shadow: 0 2px 10px rgba(20, 26, 20, 0.4);
}

.nci--poster .pst-couple-xi {
  flex: 0 0 auto;
  font-family: var(--pst-serif);
  font-weight: 600;
  font-size: 7cqw;
  line-height: 1;
  color: var(--pst-wine);
  text-shadow: 0 1px 10px rgba(255, 255, 255, 0.45);
}

.nci--poster .pst-foot-date {
  margin-top: 5.4cqw;
  font-family: var(--pst-caps);
  font-size: 4.2cqw;
  letter-spacing: 0.3em;
  text-indent: 0.3em;
  text-shadow: 0 2px 10px rgba(20, 26, 20, 0.4);
}

.nci--poster .pst-cover-venue {
  margin-top: 2.6cqw;
  font-family: var(--pst-serif);
  font-size: 3.5cqw;
  letter-spacing: 0.2em;
  text-indent: 0.2em;
  text-shadow: 0 2px 10px rgba(20, 26, 20, 0.4);
}

/* ───── Serif caps ribbon ───── */

.nci--poster .pst-ribbon {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 2cqw;
  padding: 3.8cqw var(--pst-g);
  background: var(--pst-paper);
  font-family: var(--pst-caps);
  font-size: 3.4cqw;
  letter-spacing: 0.16em;
  color: var(--pst-ink);
}

.nci--poster .pst-ribbon--ink {
  border-top: 1px solid rgba(29, 27, 26, 0.1);
  border-bottom: 1px solid rgba(29, 27, 26, 0.1);
}

.nci--poster .pst-ribbon > span:last-child {
  text-align: right;
}

/* ───── Photo band with a spaced tagline ───── */

.nci--poster .pst-band {
  position: relative;
  overflow: hidden;
  height: 47cqw;
  background: #2a2f29;
}

.nci--poster .pst-band-img {
  position: absolute;
  inset: 0;
}

.nci--poster .pst-band-veil {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(0deg, rgba(24, 30, 24, 0.74) 0%, rgba(24, 30, 24, 0.32) 44%, rgba(24, 30, 24, 0) 80%);
}

.nci--poster .pst-band-body {
  position: absolute;
  inset: auto 0 5cqw;
  padding: 0 6cqw;
  color: #fff;
  text-align: center;
  pointer-events: none;
}

.nci--poster .pst-tagline {
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--pst-serif);
  font-size: 3.9cqw;
  letter-spacing: 0.32em;
  text-indent: 0.32em;
  text-shadow: 0 2px 10px rgba(20, 26, 20, 0.45);
}

.nci--poster .pst-tagline span + span::before {
  content: '|';
  margin: 0 1.6cqw 0 0.4cqw;
  font-family: var(--pst-round);
  font-weight: 300;
  letter-spacing: 0;
  opacity: 0.7;
}

.nci--poster .pst-band-en {
  margin-top: 2.4cqw;
  font-weight: 300;
  font-size: 2.6cqw;
  line-height: 1.85;
  letter-spacing: 0.04em;
  color: rgba(255, 255, 255, 0.92);
  text-shadow: 0 1px 8px rgba(20, 26, 20, 0.4);
}

.nci--poster .pst-plainband {
  height: 52cqw;
}

/* ───── Story · love-letter heading ───── */

.nci--poster .pst-head {
  padding: 13cqw 5cqw 0;
}

.nci--poster .pst-head-row {
  display: flex;
  align-items: baseline;
  justify-content: center;
  gap: 3.4cqw;
}

.nci--poster .pst-head-zh {
  font-family: var(--pst-serif);
  font-weight: 600;
  font-size: 5cqw;
  letter-spacing: 0.22em;
  text-indent: 0.22em;
  color: var(--pst-ink);
}

.nci--poster .pst-head-mark {
  font-size: 2.7cqw;
  letter-spacing: 0.16em;
  color: var(--pst-wine);
}

.nci--poster .pst-head-en {
  margin-top: 1.4cqw;
  font-family: var(--pst-caps);
  font-weight: 400;
  font-size: 8.4cqw;
  line-height: 1.16;
  letter-spacing: 0.02em;
  text-align: center;
  color: #b8b5b1;
}

.nci--poster .pst-head-sub {
  margin-top: 1cqw;
  padding-right: 2cqw;
  font-size: 2.8cqw;
  letter-spacing: 0.16em;
  text-align: right;
  color: var(--pst-grey);
}

/* ───── Story · letter photo with the big red script ───── */

.nci--poster .pst-letter {
  position: relative;
  margin: 9cqw var(--pst-g) 15cqw;
}

.nci--poster .pst-letter-img {
  aspect-ratio: 4 / 3;
}

.nci--poster .pst-sweet {
  position: absolute;
  right: -1.5cqw;
  bottom: -9cqw;
  font-family: var(--pst-vibes);
  font-size: 21cqw;
  line-height: 1;
  color: var(--pst-wine);
}

/* ───── Laurel badge ───── */

.nci--poster .pst-badge {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 2.6cqw;
  color: var(--pst-grey);
}

.nci--poster .pst-poster-body .pst-badge {
  margin-top: 3cqw;
  color: rgba(255, 255, 255, 0.95);
}

.nci--poster .pst-laurel {
  width: 4cqw;
  height: 5.4cqw;
  flex: 0 0 auto;
}

.nci--poster .pst-laurel--r {
  transform: scaleX(-1);
}

.nci--poster .pst-badge-t {
  font-family: var(--pst-caps);
  font-size: 3cqw;
  line-height: 1.55;
  letter-spacing: 0.14em;
  text-align: center;
}

/* ───── Poems and short centred lines ───── */

.nci--poster .pst-poem {
  margin: 11cqw var(--pst-g) 0;
  font-family: var(--pst-serif);
  font-size: 3.4cqw;
  line-height: 2.5;
  letter-spacing: 0.16em;
  text-indent: 0.16em;
  text-align: center;
  color: var(--pst-grey);
}

.nci--poster .pst-poem--right {
  margin: 0;
  text-align: right;
  text-indent: 0;
}

.nci--poster .pst-story-date {
  margin-top: 7cqw;
  font-family: var(--pst-caps);
  font-size: 4cqw;
  letter-spacing: 0.26em;
  text-indent: 0.26em;
  text-align: center;
  color: var(--pst-ink);
}

.nci--poster .pst-meet {
  margin-top: 3.4cqw;
  font-family: var(--pst-serif);
  font-weight: 600;
  font-size: 5.6cqw;
  letter-spacing: 0.08em;
  text-align: center;
  color: var(--pst-ink);
}

/* ───── Story · collage ───── */

.nci--poster .pst-collage {
  position: relative;
  height: 126cqw;
  margin-top: 10cqw;
}

.nci--poster .pst-collage-sage {
  position: absolute;
  pointer-events: none;
  top: 8cqw;
  left: 14cqw;
  width: 62cqw;
  height: 46cqw;
  background: var(--pst-sage);
}

.nci--poster .pst-collage-title {
  position: absolute;
  top: 0;
  right: var(--pst-g);
  z-index: 3;
  font-family: var(--pst-caps);
  font-weight: 600;
  font-size: 9.6cqw;
  line-height: 1.32;
  letter-spacing: 0.02em;
  text-align: right;
  color: var(--pst-wine);
}

.nci--poster .pst-collage-title span {
  display: block;
}

.nci--poster .pst-collage-main {
  position: absolute;
  top: 13cqw;
  left: 25cqw;
  z-index: 2;
  width: 66cqw;
  height: 73cqw;
}

.nci--poster .pst-vert {
  position: absolute;
  top: 14cqw;
  left: 5cqw;
  z-index: 3;
  height: 62cqw;
  writing-mode: vertical-rl;
  font-family: var(--pst-ital);
  font-size: 4.4cqw;
  letter-spacing: 0.08em;
  color: var(--pst-grey);
}

.nci--poster .pst-collage-low {
  position: absolute;
  top: 79cqw;
  left: 8cqw;
  z-index: 4;
  width: 63cqw;
  height: 41cqw;
}

.nci--poster .pst-collage-date {
  position: absolute;
  top: 88cqw;
  right: 2.5cqw;
  writing-mode: vertical-rl;
  font-family: var(--pst-caps);
  font-size: 3.4cqw;
  letter-spacing: 0.42em;
  color: var(--pst-grey);
}

/* ───── Three-word caps rows ───── */

.nci--poster .pst-wordrow {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 2cqw;
  padding: 0 var(--pst-g);
  font-family: var(--pst-caps);
  font-size: 3.6cqw;
  letter-spacing: 0.08em;
  color: var(--pst-grey);
}

.nci--poster .pst-wordrow--grey {
  margin-top: 11cqw;
}

.nci--poster .pst-wordrow > span:last-child {
  text-align: right;
}

/* ───── Story · portrait with the two-line red script ───── */

.nci--poster .pst-hug {
  position: relative;
  margin: 3.4cqw var(--pst-g) 16cqw;
}

.nci--poster .pst-hug-img {
  aspect-ratio: 3 / 4;
}

.nci--poster .pst-hug-script {
  position: absolute;
  right: -3cqw;
  bottom: -7cqw;
  text-align: right;
  font-family: var(--pst-sign);
  font-size: 11cqw;
  line-height: 1.15;
  color: var(--pst-wine);
}

.nci--poster .pst-hug-script span {
  display: block;
}

.nci--poster .pst-hug-script span:last-child {
  margin-right: 5cqw;
}

/* ───── Gallery (R5) ───── */

.nci--poster .pst-rule-row {
  margin: 12cqw var(--pst-g) 0;
  padding: 3.4cqw 0;
  border-top: 1px solid var(--pst-rule);
  border-bottom: 1px solid var(--pst-rule);
}

.nci--poster .pst-rule-row .pst-wordrow {
  padding: 0;
}

.nci--poster .pst-duo {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 3cqw;
  margin: 10cqw var(--pst-g) 0;
}

.nci--poster .pst-duo-item {
  aspect-ratio: 3 / 4;
}

/* Positioned so it paints above the sage band, which overhangs the bottom of .pst-pair. */
.nci--poster .pst-script2 {
  position: relative;
  margin: 7cqw var(--pst-g) 0;
  font-family: var(--pst-ital);
  font-size: 5.6cqw;
  line-height: 1.45;
  letter-spacing: 0.04em;
  text-align: center;
  color: #4a4744;
}

.nci--poster .pst-script2 span {
  display: block;
}

.nci--poster .pst-script2--right {
  text-align: right;
}

.nci--poster .pst-keep {
  display: flex;
  align-items: center;
  gap: 4cqw;
  margin: 15cqw var(--pst-g) 0;
}

.nci--poster .pst-keep-zh {
  font-family: var(--pst-serif);
  font-weight: 600;
  font-size: 11cqw;
  line-height: 1.1;
  color: var(--pst-wine);
}

.nci--poster .pst-keep-caps {
  font-family: var(--pst-caps);
  font-size: 4.2cqw;
  line-height: 1.55;
  letter-spacing: 0.1em;
  color: var(--pst-grey);
}

.nci--poster .pst-keep-line {
  margin: 3.4cqw var(--pst-g) 0;
  font-family: var(--pst-serif);
  font-size: 3.4cqw;
  letter-spacing: 0.12em;
  color: var(--pst-grey);
}

/* ───── Countdown · calendar poster ───── */

.nci--poster .pst-cal-top {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 2cqw;
  padding: 0 5cqw;
  font-weight: 300;
  font-size: 2.55cqw;
  letter-spacing: 0.18em;
  color: rgba(255, 255, 255, 0.95);
  text-shadow: 0 1px 8px rgba(20, 26, 20, 0.4);
}

/* A white wash would only work over dark ground (as in the reference); cal.jpg puts a white dress
   under half the grid, so the panel is a smoked one with a hairline edge — the white grid stays
   legible whatever photo the couple drops in. */
.nci--poster .pst-cal {
  position: relative;
  margin: auto var(--pst-g) 7cqw;
  padding: 4.5cqw 4cqw 5cqw;
  background: rgba(26, 32, 26, 0.4);
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.22);
  backdrop-filter: blur(3px);
  text-align: left;
}

.nci--poster .pst-cal-year {
  position: absolute;
  inset: 34% 0 auto;
  font-family: var(--pst-caps);
  font-weight: 600;
  font-size: 25cqw;
  line-height: 1;
  letter-spacing: 0.06em;
  text-align: center;
  color: rgba(255, 255, 255, 0.15);
}

.nci--poster .pst-cal-md {
  display: flex;
  align-items: baseline;
  gap: 1.4cqw;
  font-weight: 400;
  font-size: 11cqw;
  line-height: 1.1;
  color: #fff;
  text-shadow: 0 2px 10px rgba(20, 26, 20, 0.3);
}

.nci--poster .pst-cal-md i {
  font-size: 5cqw;
  font-style: normal;
  opacity: 0.85;
}

.nci--poster .pst-cal-grid {
  position: relative;
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  margin-top: 3cqw;
  color: #fff;
  text-shadow: 0 1px 6px rgba(20, 26, 20, 0.28);
}

.nci--poster .pst-cal-h,
.nci--poster .pst-cal-d {
  display: flex;
  align-items: center;
  justify-content: center;
  aspect-ratio: 1;
  font-weight: 400;
  font-size: 3.2cqw;
}

.nci--poster .pst-cal-h {
  font-size: 3cqw;
  opacity: 0.9;
}

.nci--poster .pst-cal-d.is-day {
  background: var(--pst-wine);
  border-radius: 50%;
  font-weight: 500;
  text-shadow: none;
  box-shadow: 0 2px 10px rgba(155, 27, 35, 0.4);
}

/* ───── Countdown · date lines and red boxes ───── */

.nci--poster .pst-datelines {
  margin: 11cqw var(--pst-g) 0;
  font-family: var(--pst-ital-serif);
  font-style: italic;
  font-weight: 500;
  font-size: 4.4cqw;
  line-height: 2;
  text-align: center;
  color: var(--pst-ink);
}

.nci--poster .pst-cdrow {
  display: flex;
  align-items: flex-start;
  gap: 5cqw;
  margin: 10cqw var(--pst-g) 0;
}

.nci--poster .pst-cd {
  display: flex;
  flex: 0 0 auto;
  flex-direction: column;
  gap: 2.4cqw;
  width: 19cqw;
}

.nci--poster .pst-cd-box {
  padding: 2.4cqw 0 2.2cqw;
  border-radius: 1.6cqw;
  background: var(--pst-wine);
  color: #fff;
  text-align: center;
}

.nci--poster .pst-cd-box b {
  display: block;
  font-weight: 600;
  font-size: 5.4cqw;
  line-height: 1.2;
}

.nci--poster .pst-cd-box i {
  display: block;
  font-size: 2.8cqw;
  font-style: normal;
  letter-spacing: 0.08em;
  opacity: 0.92;
}

.nci--poster .pst-cd-done {
  padding: 3cqw 2cqw;
  border-radius: 1.6cqw;
  background: var(--pst-wine);
  color: #fff;
  font-size: 3.2cqw;
  text-align: center;
}

.nci--poster .pst-cd-side {
  flex: 1 1 auto;
  min-width: 0;
  text-align: right;
}

.nci--poster .pst-slash {
  display: block;
  margin-bottom: 1cqw;
  font-family: var(--pst-serif);
  font-size: 4.4cqw;
  color: var(--pst-grey);
}

/* ───── Countdown · pair of photos over a sage band ───── */

.nci--poster .pst-pair {
  position: relative;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 3cqw;
  padding: 9cqw var(--pst-g) 0 38cqw;
}

.nci--poster .pst-pair-sage {
  position: absolute;
  pointer-events: none;
  top: 46%;
  right: 0;
  bottom: -14cqw;
  left: 0;
  background: var(--pst-sage);
}

.nci--poster .pst-pair-item {
  position: relative;
  z-index: 1;
  aspect-ratio: 3 / 4;
}

.nci--poster .pst-pair + .pst-script2 {
  margin-top: 5cqw;
}

/* ───── Countdown · square photo on a white mat ───── */

.nci--poster .pst-square {
  position: relative;
  margin-top: 8cqw;
  padding: 0 17cqw 0 var(--pst-g);
}

.nci--poster .pst-square-mat {
  padding: 4cqw;
  background: var(--pst-paper);
  box-shadow: 0 2px 22px rgba(29, 27, 26, 0.12);
}

.nci--poster .pst-square-img {
  aspect-ratio: 1;
}

.nci--poster .pst-forever {
  position: absolute;
  top: 16%;
  right: 3.5cqw;
  font-family: var(--pst-caps);
  font-size: 3.4cqw;
  letter-spacing: 0.34em;
  color: var(--pst-grey);
}

.nci--poster .pst-forever span {
  display: block;
  margin-bottom: 7cqw;
  writing-mode: vertical-rl;
}

/* ───── Venue ───── */

.nci--poster .pst-mapwrap {
  margin: 8cqw var(--pst-g) 0;
}

.nci--poster .nci-map {
  height: 45cqw;
  border: 1px solid var(--pst-rule);
  background: #eef0ea;
  overflow: hidden;
}

.nci--poster .nci-map::before {
  content: '';
  position: absolute;
  inset: 0 0 0 58%;
  background: #dce6ea;
}

.nci--poster .nci-map::after {
  content: '';
  position: absolute;
  inset: 0;
  background:
    repeating-linear-gradient(64deg, rgba(255, 255, 255, 0.85) 0 2px, rgba(255, 255, 255, 0) 2px 13cqw),
    repeating-linear-gradient(-28deg, rgba(255, 255, 255, 0.7) 0 1.5px, rgba(255, 255, 255, 0) 1.5px 9cqw);
}

.nci--poster .nci-map-road {
  top: 56%;
  height: 2.4cqw;
  background: #fff;
  box-shadow: 0 0 0 1px rgba(29, 27, 26, 0.06);
}

.nci--poster .nci-map-pin {
  top: 38%;
  left: 47%;
  z-index: 2;
  width: 5.6cqw;
  height: 5.6cqw;
  background: var(--pst-wine);
  box-shadow: 0 4px 10px rgba(29, 27, 26, 0.24);
}

.nci--poster .pst-venue {
  margin: 5cqw var(--pst-g) 0;
  font-family: var(--pst-ital-serif);
  font-style: italic;
  font-weight: 600;
  font-size: 4.6cqw;
  text-align: center;
  color: var(--pst-ink);
}

.nci--poster .pst-addr {
  margin: 1.8cqw var(--pst-g) 0;
  font-size: 2.9cqw;
  line-height: 1.7;
  letter-spacing: 0.08em;
  text-align: center;
  color: var(--pst-grey);
}

.nci--poster .pst-maps {
  display: flex;
  justify-content: center;
  gap: 3cqw;
  margin-top: 4cqw;
}

.nci--poster .pst-maps-a {
  padding: 2.2cqw 4.4cqw;
  border: 1px solid var(--pst-rule);
  font-family: var(--pst-caps);
  font-size: 2.9cqw;
  letter-spacing: 0.14em;
  color: var(--pst-ink);
}

.nci--poster .pst-travel {
  margin: 7cqw var(--pst-g) 0;
}

.nci--poster .pst-travel-row + .pst-travel-row {
  margin-top: 3.4cqw;
  padding-top: 3.4cqw;
  border-top: 1px solid rgba(29, 27, 26, 0.08);
}

.nci--poster .pst-travel-k {
  font-family: var(--pst-caps);
  font-size: 3cqw;
  letter-spacing: 0.2em;
  color: var(--pst-wine);
}

.nci--poster .pst-travel-v {
  margin-top: 1cqw;
  font-size: 3.1cqw;
  line-height: 1.85;
  color: var(--pst-grey);
}

.nci--poster .pst-plainband {
  margin-top: 11cqw;
}

/* ───── Schedule and notes (off by default) ───── */

.nci--poster .pst-title {
  margin: 13cqw var(--pst-g) 0;
  text-align: center;
}

.nci--poster .pst-title-caps {
  font-family: var(--pst-caps);
  font-size: 2.9cqw;
  letter-spacing: 0.3em;
  text-indent: 0.3em;
  color: var(--pst-grey);
}

.nci--poster .pst-title-zh {
  margin-top: 2cqw;
  font-family: var(--pst-serif);
  font-weight: 600;
  font-size: 6cqw;
  letter-spacing: 0.26em;
  text-indent: 0.26em;
  color: var(--pst-ink);
}

.nci--poster .pst-sched {
  margin: 7cqw var(--pst-g) 0;
}

.nci--poster .pst-sched-row {
  display: flex;
  align-items: baseline;
  gap: 4cqw;
  padding: 3cqw 0;
  border-bottom: 1px solid rgba(29, 27, 26, 0.08);
}

.nci--poster .pst-sched-at {
  flex: 0 0 20cqw;
  font-family: var(--pst-caps);
  font-size: 3.4cqw;
  letter-spacing: 0.12em;
  color: var(--pst-wine);
}

.nci--poster .pst-sched-t {
  font-family: var(--pst-serif);
  font-size: 3.4cqw;
  letter-spacing: 0.1em;
  color: var(--pst-ink);
}

.nci--poster .pst-cal-link {
  display: block;
  margin: 5cqw var(--pst-g) 0;
  padding: 3cqw;
  border: 1px solid var(--pst-rule);
  font-family: var(--pst-caps);
  font-size: 3cqw;
  letter-spacing: 0.18em;
  text-align: center;
  color: var(--pst-ink);
}

.nci--poster .pst-faq {
  margin: 7cqw var(--pst-g) 0;
}

.nci--poster .pst-faq-item + .pst-faq-item {
  margin-top: 4.4cqw;
}

.nci--poster .pst-faq-q {
  font-family: var(--pst-serif);
  font-weight: 600;
  font-size: 3.4cqw;
  letter-spacing: 0.08em;
  color: var(--pst-ink);
}

.nci--poster .pst-faq-a {
  margin-top: 1.2cqw;
  font-size: 3.1cqw;
  line-height: 1.9;
  color: var(--pst-grey);
}

/* ───── RSVP ───── */

.nci--poster .pst-title--rsvp {
  margin-top: 12cqw;
}

.nci--poster .pst-title-pinyin {
  margin-top: 1.4cqw;
  font-size: 2.9cqw;
  letter-spacing: 0.55em;
  text-indent: 0.55em;
  color: var(--pst-wine);
}

.nci--poster .pst-form {
  margin: 9cqw var(--pst-g) 0;
}

.nci--poster .pst-in {
  display: flex;
  align-items: center;
  gap: 3cqw;
  margin-bottom: 3.4cqw;
  padding: 3.4cqw 4cqw;
  border: 1px solid rgba(155, 27, 35, 0.55);
}

.nci--poster .pst-in-label {
  flex: 0 0 auto;
  font-size: 3.6cqw;
  letter-spacing: 0.1em;
  color: var(--pst-wine);
}

.nci--poster .pst-in-field {
  flex: 1 1 auto;
  min-width: 0;
  padding: 0;
  border: 0;
  background: transparent;
  font-size: 3.8cqw;
  color: var(--pst-ink);
  outline: none;
}

.nci--poster .pst-step {
  display: flex;
  align-items: center;
  gap: 3cqw;
  margin-left: auto;
  font-size: 3.8cqw;
  color: var(--pst-ink);
}

.nci--poster .pst-step button {
  width: 7cqw;
  height: 7cqw;
  padding: 0;
  border: 1px solid rgba(155, 27, 35, 0.5);
  border-radius: 50%;
  background: transparent;
  color: var(--pst-wine);
  font-size: 3.6cqw;
  line-height: 1;
}

.nci--poster .pst-step button:disabled {
  opacity: 0.4;
}

.nci--poster .pst-choice {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 3.4cqw;
  margin-bottom: 4.4cqw;
}

.nci--poster .pst-choice button {
  padding: 3.2cqw 2cqw;
  border: 1px solid rgba(155, 27, 35, 0.5);
  background: transparent;
  color: var(--pst-wine);
  font-family: var(--pst-serif);
  font-size: 3.4cqw;
  letter-spacing: 0.14em;
}

.nci--poster .pst-choice button[aria-pressed='true'] {
  background: rgba(155, 27, 35, 0.1);
  border-color: var(--pst-wine);
}

.nci--poster .pst-diet {
  margin-bottom: 4cqw;
}

.nci--poster .pst-diet-label {
  display: block;
  margin-bottom: 2.2cqw;
  font-size: 3.2cqw;
  letter-spacing: 0.1em;
  color: var(--pst-grey);
}

.nci--poster .pst-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 2.2cqw;
}

.nci--poster .pst-tag {
  padding: 1.8cqw 3.4cqw;
  border: 1px solid rgba(155, 27, 35, 0.32);
  background: transparent;
  font-size: 3cqw;
  letter-spacing: 0.06em;
  color: var(--pst-grey);
}

.nci--poster .pst-tag[aria-pressed='true'] {
  border-color: var(--pst-wine);
  background: rgba(155, 27, 35, 0.1);
  color: var(--pst-wine);
}

.nci--poster .pst-tag:disabled {
  opacity: 0.45;
}

.nci--poster .pst-submit {
  display: block;
  width: 100%;
  padding: 4.4cqw;
  border: 0;
  background: var(--pst-wine);
  color: #fff;
  font-family: var(--pst-serif);
  font-size: 4cqw;
  letter-spacing: 0.3em;
  text-indent: 0.3em;
}

.nci--poster .pst-err {
  margin: -2cqw 0 3cqw;
  font-size: max(12px, 3cqw);
  color: var(--pst-wine);
}

.nci--poster .pst-err--server {
  margin: 0 0 3cqw;
}

.nci--poster .pst-submit[aria-busy='true'],
.nci--poster .pst-wish-post[aria-busy='true'] {
  opacity: 0.7;
  cursor: progress;
}

.nci--poster .pst-done {
  margin: 9cqw var(--pst-g) 0;
  padding: 7cqw 5cqw;
  border: 1px solid rgba(155, 27, 35, 0.3);
  text-align: center;
}

.nci--poster .pst-done-t {
  font-family: var(--pst-serif);
  font-weight: 600;
  font-size: 4.8cqw;
  letter-spacing: 0.2em;
  text-indent: 0.2em;
  color: var(--pst-wine);
}

.nci--poster .pst-done-b {
  margin-top: 2.6cqw;
  font-size: 3.2cqw;
  line-height: 1.9;
  color: var(--pst-grey);
}

.nci--poster .pst-done-when {
  margin-top: 1.6cqw;
  font-size: 2.8cqw;
  color: var(--pst-grey);
}

.nci--poster .pst-done-edit {
  margin-top: 3.4cqw;
  padding: 0;
  border: 0;
  border-bottom: 1px solid var(--pst-rule);
  background: none;
  font-size: 3cqw;
  letter-spacing: 0.12em;
  color: var(--pst-grey);
}

.nci--poster .pst-close {
  margin: 16cqw var(--pst-g) 0;
  text-align: center;
}

.nci--poster .pst-close-zh {
  font-family: var(--pst-serif);
  font-weight: 600;
  font-size: 6cqw;
  line-height: 1.7;
  letter-spacing: 0.34em;
  text-indent: 0.34em;
  color: #57534e;
}

.nci--poster .pst-close-en {
  margin: 2.4cqw 0;
  font-family: var(--pst-caps);
  font-size: 3.8cqw;
  letter-spacing: 0.1em;
  color: var(--pst-wine);
}

/* ───── Wishes ───── */

.nci--poster .pst-wishform {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 2.6cqw;
  margin: 8cqw var(--pst-g) 0;
}

.nci--poster .pst-wish-in {
  min-width: 0;
  padding: 3cqw 3.4cqw;
  border: 1px solid var(--pst-rule);
  background: transparent;
  font-size: 3.3cqw;
  color: var(--pst-ink);
}

.nci--poster .pst-wish-in::placeholder {
  color: #a6a29d;
}

.nci--poster .pst-wish-in--text {
  grid-column: 1;
}

.nci--poster .pst-wish-err {
  grid-column: 1 / -1;
  margin: 0;
}

.nci--poster .pst-wish-post {
  padding: 0 4.4cqw;
  border: 0;
  background: var(--pst-wine);
  color: #fff;
  font-size: 3.2cqw;
  letter-spacing: 0.18em;
}

.nci--poster .pst-wishes {
  margin: 7cqw var(--pst-g) 0;
}

.nci--poster .pst-wish {
  padding: 4cqw 0;
  border-bottom: 1px solid rgba(29, 27, 26, 0.08);
}

.nci--poster .pst-wish-text {
  font-family: var(--pst-serif);
  font-size: 3.4cqw;
  line-height: 1.95;
  letter-spacing: 0.06em;
  color: #4a4744;
  overflow-wrap: anywhere;
}

.nci--poster .pst-wish-from {
  margin-top: 1.4cqw;
  font-family: var(--pst-caps);
  font-size: 2.9cqw;
  letter-spacing: 0.12em;
  color: var(--pst-grey);
}

.nci--poster .pst-wish-empty {
  font-size: 3.2cqw;
  color: var(--pst-grey);
}

/* ───── Latin content ─────
   The display faces and the tracking above are set for 中文. A doc the couple wrote in English gets a
   Latin handwriting face and much tighter tracking, because CJK tracking scatters Latin words into
   loose letters. `nci--lang-*` comes from the renderer and reads the couple's own names. */

.nci--poster.nci--lang-en {
  --pst-hand: 'Caveat', 'Long Cang', cursive;
}

.nci--poster.nci--lang-en .pst-hand-a,
.nci--poster.nci--lang-en .pst-hand-b {
  font-size: 13cqw;
  line-height: 1.26;
}

/* Latin at this size is far thinner than CJK, so the cover quote needs weight to survive the bright sky. */
.nci--poster.nci--lang-en .pst-quote {
  font-weight: 400;
  font-size: 3cqw;
  letter-spacing: 0.02em;
  text-shadow: 0 1px 10px rgba(20, 26, 20, 0.55);
}

.nci--poster.nci--lang-en .pst-head-zh {
  letter-spacing: 0.08em;
  text-indent: 0.08em;
}

.nci--poster.nci--lang-en .pst-title-zh {
  letter-spacing: 0.1em;
  text-indent: 0.1em;
}

.nci--poster.nci--lang-en .pst-close-zh {
  letter-spacing: 0.12em;
  text-indent: 0.12em;
}

.nci--poster.nci--lang-en .pst-done-t {
  letter-spacing: 0.08em;
  text-indent: 0.08em;
}

.nci--poster.nci--lang-en .pst-submit {
  letter-spacing: 0.14em;
  text-indent: 0.14em;
}

/* ═════════════ Guest cover overlay ═════════════ */

.nci-cover--poster {
  container-type: inline-size;
  display: block;
  padding: 0;
  overflow: hidden;
  background: #20241f;
  font-family: var(--pst-round);
}

/* Everything below is scoped to the overlay root, as the file header promises. The in-page cover has
   its own .pst-foot-date, so the two covers cannot reach into each other. */

.nci-cover--poster .pst-cover-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 46%;
}

/* Same reading as the page's cover, and now every printed line on this screen sits in the bottom
   stack, so the wash is a single bottom ramp with no top wash at all. It is flatly transparent above
   0.46 — the couple runs from the top edge to about 0.30 — and carries enough weight under the badge
   and the names to hold white type over the gown they print on. */
.nci-cover--poster .pst-cover-veil {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(
    0deg,
    rgba(20, 26, 20, 0.88) 0%,
    rgba(20, 26, 20, 0.78) 20%,
    rgba(20, 26, 20, 0.58) 32%,
    rgba(20, 26, 20, 0.3) 42%,
    rgba(20, 26, 20, 0) 54%
  );
}

.nci-cover--poster .pst-cover-body {
  position: relative;
  display: flex;
  height: 100%;
  flex-direction: column;
  align-items: center;
  justify-content: flex-end;
  padding: 0 9cqw 15cqw;
  color: #fff;
  text-align: center;
}

/* The badge joins the bottom stack instead of hanging from the top of the screen. On this frame the
   groom's head reaches the top edge, so a top-anchored line printed across his forehead; set directly
   above the names it keeps its place in the hierarchy and leaves the whole upper screen to the two of
   them. */
.nci-cover--poster .pst-cover-badge {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 2.6cqw;
  margin-bottom: 5cqw;
  font-family: var(--pst-caps);
  font-size: 3cqw;
  letter-spacing: 0.24em;
  color: rgba(255, 255, 255, 0.95);
}

.nci-cover--poster .pst-cover-badge .pst-laurel {
  width: 4cqw;
  height: 5.4cqw;
}

.nci-cover--poster .pst-cover-names {
  font-family: var(--pst-serif);
  font-weight: 600;
  font-size: 7.4cqw;
  line-height: 1.4;
  letter-spacing: 0.08em;
  text-shadow: 0 2px 14px rgba(20, 26, 20, 0.5);
  overflow-wrap: anywhere;
}

.nci-cover--poster .pst-cover-names i {
  margin: 0 2.4cqw;
  font-style: normal;
  color: rgba(255, 255, 255, 0.8);
}

.nci-cover--poster .pst-cover-date {
  margin-top: 2.4cqw;
  font-family: var(--pst-caps);
  font-size: 3.6cqw;
  letter-spacing: 0.3em;
  text-indent: 0.3em;
  text-shadow: 0 2px 10px rgba(20, 26, 20, 0.5);
}

.nci-cover--poster .pst-seal {
  width: 22cqw;
  height: 22cqw;
  margin-top: 9cqw;
  border: 0;
  border-radius: 50%;
  background: var(--pst-wine);
  color: #fff;
  font-family: var(--pst-serif);
  font-weight: 600;
  font-size: 8cqw;
  line-height: 1;
  letter-spacing: 0.02em;
  box-shadow: 0 8px 26px rgba(20, 26, 20, 0.42);
  animation: pst-seal-pulse 2.8s ease-in-out infinite;
}

.nci-cover--poster .pst-seal:focus-visible {
  outline: 2px solid #fff;
  outline-offset: 4px;
}

.nci-cover--poster .pst-cover-hint {
  margin-top: 4.4cqw;
  font-size: 2.9cqw;
  letter-spacing: 0.24em;
  text-indent: 0.24em;
  color: rgba(255, 255, 255, 0.88);
}

.nci-cover--poster.pst-cover--opening {
  pointer-events: none;
  animation: pst-cover-out 520ms cubic-bezier(0.2, 0.7, 0.2, 1) forwards;
}

@keyframes pst-seal-pulse {
  0%,
  100% {
    transform: scale(1);
  }
  50% {
    transform: scale(1.045);
  }
}

@keyframes pst-cover-out {
  to {
    opacity: 0;
    transform: scale(1.06);
  }
}

/* ═════════════ Floating bar — circular music note, top right ═════════════ */

.nci-float--poster {
  top: 14px;
  right: 14px;
  bottom: auto;
  left: auto;
  justify-content: flex-end;
  gap: 8px;
}

.nci-float--poster button {
  gap: 0;
  padding: 0;
  font-family: var(--pst-round);
}

.nci-float--poster .nci-float-music {
  width: 38px;
  height: 38px;
  justify-content: center;
  border: 1px solid rgba(255, 255, 255, 0.8);
  background: rgba(255, 255, 255, 0.16);
  color: #fff;
  font-size: 0;
  letter-spacing: 0;
  backdrop-filter: blur(6px);
}

.nci-float--poster .nci-float-dot {
  width: auto;
  height: auto;
  border-radius: 0;
  background: none;
  font-size: 15px;
  line-height: 1;
  color: #fff;
}

/* Escaped, so the note survives however the sheet is decoded. */
.nci-float--poster .nci-float-dot::before {
  content: '\266A';
}

.nci-float--poster .nci-float-music[aria-pressed='true'] {
  background: rgba(155, 27, 35, 0.86);
  border-color: rgba(255, 255, 255, 0.9);
}

.nci-float--poster .nci-float-music[aria-pressed='true'] .nci-float-dot {
  background: none;
  animation: pst-spin 3.6s linear infinite;
}

.nci-float--poster .nci-float-share {
  height: 38px;
  padding: 0 14px;
  background: rgba(255, 255, 255, 0.92);
  color: var(--pst-ink);
  font-size: 10px;
  letter-spacing: 0.18em;
}

@keyframes pst-spin {
  to {
    transform: rotate(360deg);
  }
}

@media (prefers-reduced-motion: reduce) {
  .nci-cover--poster .pst-seal,
  .nci-float--poster .nci-float-music[aria-pressed='true'] .nci-float-dot {
    animation: none;
  }

  .nci-cover--poster.pst-cover--opening {
    animation-duration: 1ms;
  }
}
