/* ============================================================================
   AMYAR GHAFFARY — Services & Rates · 2026
   File: services.css
   Loads AFTER Amyar.portfolio.css, which supplies the fonts, the reset and the
   design tokens (--bg, --ink, --accent-cool, --space-*, --ease, …). Nothing in
   here redefines those; this file only adds the page's own material system.

   THE MATERIAL — "light through glass"
   ------------------------------------
   Every surface on this page is one of three things, and never a fourth:

     1. GLASS      a translucent slab. Blurred backdrop, a 1px rim that is
                   brightest along its top edge (light falls from above), and
                   a specular bloom that tracks the pointer.
     2. LIGHT      pure emission. Blue radial gradients, no border, no fill —
                   used for the aurora backdrop and the card bloom.
     3. INK        type and hairlines. Flat, no effects, maximum legibility.

   One light source governs the page. `services.js` writes the pointer position
   into --lx / --ly on <body>, and each glass slab converts that into its own
   local --mx / --my (percent, slab-relative) plus --prox (0..1, how close the
   pointer is). Specular strength, rim brightness and bloom all read --prox, so
   slabs near the cursor genuinely catch more light than slabs far from it.
   That single shared source is what stops this reading as "six cards that each
   have a hover state".

   Nothing on this page moves under the pointer. The slabs do not tilt, lift or
   follow the cursor — only the light travels across them. Depth comes from the
   layered fills, the rim and the two-part shadow, not from motion.

   Palette is strictly the site's moonlight blue (#a8c8ee → #6f9fd1) on near
   black. No second hue anywhere.

   Section numbering skips 4, 5 and 8: the hero, the 3D prism that stood in it
   and the price-match slab were all removed on request. The gaps are left in
   place so the remaining numbers keep matching the comments that reference
   them elsewhere.
   ============================================================================ */

/* ============================================================================
   1. PAGE TOKENS
   ============================================================================ */
.rates-page {
  /* Glass fills — layered so the slab reads as a solid with thickness, not a
     flat transparent rectangle. */
  --glass-fill:
    linear-gradient(157deg,
      rgba(255, 255, 255, 0.058) 0%,
      rgba(255, 255, 255, 0.022) 38%,
      rgba(255, 255, 255, 0.008) 68%,
      rgba(168, 200, 238, 0.030) 100%);
  /* The hovered fill sits only just above the resting one. Most of the "this
     slab is live" signal comes from the rim; the fill only has to nudge. */
  --glass-fill-hi:
    linear-gradient(157deg,
      rgba(255, 255, 255, 0.070) 0%,
      rgba(255, 255, 255, 0.027) 38%,
      rgba(255, 255, 255, 0.011) 68%,
      rgba(168, 200, 238, 0.038) 100%);

  --glass-edge:    rgba(255, 255, 255, 0.085);
  --glass-edge-hi: rgba(168, 200, 238, 0.22);

  /* Blur is expensive; one value, reused, so the compositor can share work. */
  --glass-blur: blur(26px) saturate(150%);

  /* Depth. Two shadows: a tight contact shadow that anchors the slab, and a
     wide soft one that lifts it off the page. */
  --slab-shadow:
    0 1px 0 0 rgba(255, 255, 255, 0.055) inset,
    0 -1px 0 0 rgba(0, 0, 0, 0.30) inset,
    0 2px 6px -2px rgba(0, 0, 0, 0.6),
    0 26px 60px -28px rgba(0, 0, 0, 0.9);
  --slab-shadow-hi:
    0 1px 0 0 rgba(255, 255, 255, 0.10) inset,
    0 -1px 0 0 rgba(0, 0, 0, 0.30) inset,
    0 2px 8px -2px rgba(0, 0, 0, 0.6),
    0 44px 90px -34px rgba(0, 0, 0, 0.95),
    0 0 46px -38px rgba(111, 159, 209, 0.26);

  --r-slab: 20px;
  --r-tier: 13px;

  /* Secondary text, lifted for this page.
     The site-wide greys were set for large type on flat near-black. Here they
     carry small print — tier descriptions, card one-liners, terms — sitting on
     glass that is itself slightly lighter than the page, which eats what little
     separation they had. The old --ink-4 (#6e6e6e) measured 3.8:1 against the
     background: under the 4.5:1 minimum for body text, and the reason it read
     as half-visible. Both are raised until they clear it comfortably —
     ~6.4:1 and ~9.9:1 — while staying clearly subordinate to --ink.

     Overridden here rather than at :root so the home page keeps its own
     calibration; every rule on this page reads these tokens, so the whole
     page lifts together and nothing drifts out of step. */
  --ink-3: #b4b6bb;   /* was #9a9a9a — section subs, terms copy */
  --ink-4: #8f9298;   /* was #6e6e6e — tier descriptions, labels, footnotes */

  background: var(--bg);
}

/* ============================================================================
   2. THE AURORA — the page's light, fixed behind everything.
   Two slow-drifting blue fields plus a vignette. Fixed, so it never scrolls
   past; the content moves through the light rather than the light moving with
   the content. `pointer-events:none` throughout — this layer is decoration.
   ============================================================================ */
.rates-aurora {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
  /* Own layer, so the drift animation never repaints the page content. */
  will-change: transform;
  contain: strict;
}

.rates-aurora span {
  position: absolute;
  display: block;
  border-radius: 50%;
  filter: blur(90px);
  opacity: 0.5;
}

/* Upper-left cool wash */
.rates-aurora .au-1 {
  top: -22vh;
  left: -12vw;
  width: 62vw;
  height: 62vw;
  background: radial-gradient(circle, rgba(111, 159, 209, 0.20), transparent 66%);
  animation: au-drift-1 34s var(--ease) infinite alternate;
}
/* Right-hand pale highlight, lifts the top of the page */
.rates-aurora .au-2 {
  top: 4vh;
  right: -18vw;
  width: 54vw;
  height: 54vw;
  background: radial-gradient(circle, rgba(168, 200, 238, 0.17), transparent 64%);
  animation: au-drift-2 41s var(--ease) infinite alternate;
}
/* Deep pool low on the page, warms the bundles/terms end */
.rates-aurora .au-3 {
  bottom: -26vh;
  left: 24vw;
  width: 58vw;
  height: 58vw;
  background: radial-gradient(circle, rgba(111, 159, 209, 0.13), transparent 68%);
  animation: au-drift-3 47s var(--ease) infinite alternate;
}

@keyframes au-drift-1 { to { transform: translate3d(7vw, 5vh, 0) scale(1.14); } }
@keyframes au-drift-2 { to { transform: translate3d(-6vw, 8vh, 0) scale(1.09); } }
@keyframes au-drift-3 { to { transform: translate3d(5vw, -6vh, 0) scale(1.12); } }

/* No grain layer here on purpose: Amyar.portfolio.css already lays one over
   every page via body::before. A second one would double the texture. */

/* Everything real sits above the aurora. */
.rates-main {
  position: relative;
  z-index: 2;
}

/* ============================================================================
   3. SHELL
   ============================================================================ */
.rates-wrap {
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.rates-section {
  padding-block: clamp(64px, 11vh, 128px);
}

/* With no hero, the first section is the top of the page and has to clear the
   fixed Back pill on its own. */
.rates-main > .rates-section:first-child {
  padding-top: clamp(112px, 15vh, 168px);
}

/* Section heading — mirrors .section-head on the home page but tighter, since
   this page is a document rather than a showcase. */
.rs-head {
  max-width: 62ch;
  margin-bottom: clamp(32px, 5vh, 56px);
}
.rs-kicker {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-4);
  margin-bottom: var(--space-5);
}
.rs-kicker::before {
  content: "";
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--accent-cool);
  box-shadow: 0 0 10px 1px rgba(168, 200, 238, 0.8);
}
.rs-title {
  font-size: clamp(28px, 4.4vw, 46px);
  font-weight: 300;
  letter-spacing: -0.025em;
  line-height: 1.1;
  color: var(--ink);
}
/* Upright, not italic. The Bai Jamjuree faces this site loads are all
   font-style:normal — no italic cut is ever downloaded — so `font-style:
   italic` was making the browser synthesise one by shearing the uprights.
   That is the "tilted" look. Colour alone carries the emphasis. */
.rs-title em {
  font-style: normal;
  color: var(--accent-cool);
}
.rs-sub {
  margin-top: var(--space-5);
  font-size: clamp(15px, 1.5vw, 17px);
  font-weight: 300;
  line-height: 1.65;
  color: var(--ink-3);
}

/* ============================================================================
   6. CATEGORY SLABS — the heart of the page.
   Six glass slabs. Collapsed they show the category and its entry price; open
   they reveal the tiers.

   TWO INDEPENDENT COLUMNS, NOT ONE GRID
   -------------------------------------
   The obvious build — six slabs in a two-column grid — shares rows between the
   columns, so opening a slab grows its row and shoves the slab beside it down
   too. Nothing can fix that from inside a grid; shared rows are what a grid is.

   So the columns are real: two flex stacks side by side, each owning its own
   slabs. Opening one only moves what is below it in the same column.

   The split is 01–03 / 04–06 rather than odds/evens, which means the DOM order
   stays 01→06. Two things fall out of that for free: the single-column layout
   needs no `order` juggling and no `display:contents`, and reading order,
   keyboard tab order and visual order never disagree — the trap that comes
   with reordering columns visually. The trade is that the desktop eye reads
   down the left column then down the right, which is how a menu or a printed
   price list is read anyway.
   ============================================================================ */
.cat-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  align-items: start;
  gap: clamp(16px, 2vw, 24px);
}

/* The grid's row-gap and this column-gap are the same value on purpose: when
   the grid collapses to one column on mobile, the two stacks run together as
   a single evenly spaced list with no seam where they join. */
.cat-col {
  display: flex;
  flex-direction: column;
  gap: clamp(16px, 2vw, 24px);
  min-width: 0;
}

.cat {
  /* Pointer state, written by services.js. Defaults keep the slab looking
     correct before the first pointermove and on touch devices, which never
     send one. Nothing here moves the slab — only the light travels. */
  --mx: 50%;
  --my: 0%;
  --prox: 0;

  position: relative;
  border: 1px solid var(--glass-edge);
  border-radius: var(--r-slab);
  background: var(--glass-fill);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  box-shadow: var(--slab-shadow);
  transition:
    box-shadow 0.5s var(--ease),
    border-color 0.5s var(--ease),
    background 0.5s var(--ease);
  /* Rounded corners must clip the specular sheet and the tier drawer. */
  overflow: hidden;
}

/* Specular — a small bloom centred on the pointer, faded by distance. This is
   the layer that makes six slabs behave like one lit surface. Kept low: on a
   near-black page a highlight this size reads clearly at very little alpha,
   and anything stronger washes out the tier text underneath it. */
.cat::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  border-radius: inherit;
  background: radial-gradient(
    180px circle at var(--mx) var(--my),
    rgba(168, 200, 238, 0.035),
    rgba(168, 200, 238, 0.010) 34%,
    transparent 58%);
  opacity: var(--prox);
  transition: opacity 0.45s var(--ease);
}

/* Rim light — a 1px inner stroke that brightens on the pointer's side. Drawn
   as a masked gradient border so it can be lit independently of the fill. */
.cat::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  border-radius: inherit;
  padding: 1px;
  background: radial-gradient(
    215px circle at var(--mx) var(--my),
    var(--glass-edge-hi),
    rgba(168, 200, 238, 0.03) 55%,
    transparent 78%);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  /* Never fully off. --mx/--my rest at (50%, 0%), so with no pointer in play
     the slab still carries a soft highlight along its top edge — light falling
     from above. That resting state is all a touch device ever sees, and it is
     what stops the collapsed grid reading as six grey rectangles.

     The two numbers do different jobs: the first sets that resting edge, the
     second is how far the pointer can push it. Only the second was cut — the
     rim brightens far less under the cursor now, while the cards keep exactly
     the same definition when nothing is hovering them. */
  opacity: calc(0.34 + var(--prox) * 0.38);
  transition: opacity 0.45s var(--ease);
}

.cat.is-lit {
  background: var(--glass-fill-hi);
  border-color: rgba(255, 255, 255, 0.13);
  box-shadow: var(--slab-shadow-hi);
}

/* When any category is open, the others step back. They stay readable and
   fully interactive — this is focus, not a lock — and any slab recovers the
   moment it is hovered or focused within. */
.cat-grid.has-open .cat:not(.is-open) {
  opacity: 0.58;
  transition: opacity 0.5s var(--ease), transform 0.5s var(--ease-out),
              box-shadow 0.5s var(--ease), border-color 0.5s var(--ease),
              background 0.5s var(--ease);
}
.cat-grid.has-open .cat:not(.is-open):hover,
.cat-grid.has-open .cat:not(.is-open):focus-within {
  opacity: 1;
}

/* --- Slab header: the always-visible button ------------------------------- */
.cat-head {
  position: relative;
  z-index: 2;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: clamp(14px, 1.8vw, 22px);
  width: 100%;
  padding: clamp(22px, 2.6vw, 30px);
  text-align: left;
  background: none;
  border: 0;
  cursor: pointer;
}
.cat-head:focus-visible {
  outline: 2px solid var(--accent-cool);
  outline-offset: -4px;
  border-radius: var(--r-slab);
}

.cat-icon {
  position: relative;
  display: grid;
  place-items: center;
  width: 46px;
  height: 46px;
  flex: none;
  border: 1px solid var(--glass-edge);
  border-radius: 13px;
  background: rgba(255, 255, 255, 0.035);
  color: var(--accent-cool);
  transition: color 0.5s var(--ease), border-color 0.5s var(--ease), box-shadow 0.5s var(--ease);
}
.cat-icon svg { width: 21px; height: 21px; }
.cat.is-lit .cat-icon {
  color: #dbe8f8;
  border-color: rgba(168, 200, 238, 0.34);
  box-shadow: 0 0 22px -4px rgba(111, 159, 209, 0.7), inset 0 0 16px -6px rgba(168, 200, 238, 0.6);
}

.cat-titles { min-width: 0; }
.cat-num {
  display: block;
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.2em;
  color: var(--ink-4);
  margin-bottom: 6px;
}
/* Both are <span>s inside a <button>, so they need to be told to stack. */
.cat-name {
  display: block;
  font-size: clamp(17px, 1.9vw, 21px);
  font-weight: 400;
  letter-spacing: -0.015em;
  line-height: 1.2;
  color: var(--ink);
}
.cat-line {
  display: block;
  margin-top: 7px;
  font-size: 13px;
  font-weight: 300;
  line-height: 1.5;
  color: var(--ink-4);
}

.cat-right {
  display: flex;
  align-items: center;
  gap: clamp(12px, 1.5vw, 18px);
  flex: none;
}
.cat-from {
  text-align: right;
  line-height: 1.15;
}
.cat-from small {
  display: block;
  font-family: var(--mono);
  font-size: 9.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-4);
  margin-bottom: 4px;
}
.cat-from b {
  font-size: clamp(18px, 2.1vw, 23px);
  font-weight: 300;
  letter-spacing: -0.02em;
  color: var(--ink);
}
/* "/mo" and friends: a unit rides at a fraction of whatever price it follows,
   so it never competes with the number itself. */
.unit {
  font-size: 0.55em;
  color: var(--ink-4);
  letter-spacing: 0;
}

/* Open/close affordance — a plus that becomes a minus. Two bars, one rotates. */
.cat-toggle {
  position: relative;
  width: 32px;
  height: 32px;
  flex: none;
  border: 1px solid var(--glass-edge);
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.03);
  transition: border-color 0.5s var(--ease), background 0.5s var(--ease), transform 0.5s var(--ease-out);
}
.cat-toggle::before,
.cat-toggle::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 11px;
  height: 1.5px;
  border-radius: 2px;
  background: var(--ink-2);
  transform: translate(-50%, -50%);
  transition: transform 0.55s var(--ease-out), background 0.5s var(--ease);
}
.cat-toggle::after { transform: translate(-50%, -50%) rotate(90deg); }
.cat.is-lit .cat-toggle { border-color: rgba(168, 200, 238, 0.3); }
.cat.is-open .cat-toggle { transform: rotate(180deg); background: rgba(168, 200, 238, 0.10); }
.cat.is-open .cat-toggle::after { transform: translate(-50%, -50%) rotate(0deg); }
.cat.is-open .cat-toggle::before,
.cat.is-open .cat-toggle::after { background: var(--accent-cool); }

/* --- Tier drawer ----------------------------------------------------------
   grid-template-rows 0fr → 1fr is the only way to animate to an unknown
   content height without measuring it in JS. The inner element must carry
   min-height:0 and overflow:hidden for the row to actually compress. -------- */
.cat-drawer {
  position: relative;
  z-index: 2;
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 0.62s var(--ease-out);
}
.cat.is-open .cat-drawer { grid-template-rows: 1fr; }

.cat-drawer-inner {
  min-height: 0;
  overflow: hidden;
}

.cat-tiers {
  padding: 0 clamp(22px, 2.6vw, 30px) clamp(22px, 2.6vw, 30px);
}

/* Hairline that separates the head from the tiers, drawn as a light streak
   rather than a border so it belongs to the same lighting model. */
.cat-tiers::before {
  content: "";
  display: block;
  height: 1px;
  margin-bottom: var(--space-5);
  background: linear-gradient(90deg, transparent, rgba(168, 200, 238, 0.28) 18%, rgba(168, 200, 238, 0.10) 62%, transparent);
}

/* Optional group label inside a category (Video uses two). */
.tier-group {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--ink-4);
  margin: var(--space-5) 0 var(--space-3);
}
.tier-group:first-child { margin-top: 0; }

.tier {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: baseline;
  gap: var(--space-4);
  padding: 13px 14px;
  margin-inline: -14px;
  border-radius: var(--r-tier);
  transition: background 0.35s var(--ease);
}
.tier:hover { background: rgba(255, 255, 255, 0.035); }

.tier-name {
  font-size: 14.5px;
  font-weight: 500;
  color: var(--ink);
  letter-spacing: -0.005em;
}
/* Marks a tier that is an add-on to the plans above it rather than a plan. */
.tier-tag {
  font-style: normal;
  font-weight: 300;
  color: var(--ink-4);
}
.tier-what {
  margin-top: 5px;
  font-size: 12.5px;
  font-weight: 300;
  line-height: 1.55;
  color: var(--ink-4);
}
.tier-price {
  font-size: 15.5px;
  font-weight: 400;
  letter-spacing: -0.01em;
  color: var(--accent-cool);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.tier-price span {
  font-size: 11.5px;
  color: var(--ink-4);
}

/* ---------------------------------------------------------------------------
   Case-study link — the last thing in an open card.
   It sits under a hairline that is the exact same streak as the one dividing
   the card header from the tiers (.cat-tiers::before), so the drawer reads as
   a panel bracketed top and bottom rather than a list that stops.
   Quiet by default: the tiers are what the visitor came for, and this should
   only announce itself once they have finished reading them.
   --------------------------------------------------------------------------- */
.cat-case {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  margin-top: var(--space-6);
  padding-top: var(--space-6);
  position: relative;
  color: var(--ink-3);
  transition: color 0.4s var(--ease);
}
.cat-case::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(168, 200, 238, 0.28) 18%, rgba(168, 200, 238, 0.10) 62%, transparent);
}
.cat-case:hover { color: var(--ink); }
.cat-case:focus-visible {
  outline: 2px solid var(--accent-cool);
  outline-offset: 4px;
  border-radius: 8px;
}

.cc-kicker {
  display: block;
  font-family: var(--mono);
  font-size: 9.5px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--accent-cool);
  margin-bottom: 5px;
}
.cc-name {
  display: block;
  font-size: 13.5px;
  font-weight: 400;
  line-height: 1.4;
  color: inherit;
}

.cc-arrow {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  flex: none;
  border: 1px solid var(--glass-edge);
  border-radius: 50%;
  color: var(--ink-3);
  transition: color 0.4s var(--ease), border-color 0.4s var(--ease),
              background 0.4s var(--ease), transform 0.5s var(--ease-out);
}
.cc-arrow svg { width: 15px; height: 15px; }
.cat-case:hover .cc-arrow,
.cat-case:focus-visible .cc-arrow {
  color: #eaf2fd;
  border-color: rgba(168, 200, 238, 0.38);
  background: rgba(168, 200, 238, 0.10);
  transform: translateX(4px);
}

/* Add-ons / footnote strip at the bottom of a category. */
.tier-note {
  margin-top: var(--space-5);
  padding: 14px 16px;
  border: 1px dashed rgba(255, 255, 255, 0.10);
  border-radius: var(--r-tier);
  font-size: 12.5px;
  font-weight: 300;
  line-height: 1.65;
  color: var(--ink-4);
}
.tier-note b {
  font-weight: 500;
  color: var(--ink-2);
}

/* ============================================================================
   7. BUNDLES — three emissive cards. Louder than the category slabs on purpose:
   this is the page's offer, so it gets more light than the menu above it.
   ============================================================================ */
.bundle-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(16px, 2vw, 24px);
}

.bundle {
  --mx: 50%;
  --my: 0%;
  --prox: 0;

  position: relative;
  display: flex;
  flex-direction: column;
  padding: clamp(24px, 2.8vw, 34px);
  border: 1px solid rgba(168, 200, 238, 0.14);
  border-radius: var(--r-slab);
  background: var(--glass-fill);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  box-shadow: var(--slab-shadow);
  transition:
    box-shadow 0.5s var(--ease),
    border-color 0.5s var(--ease);
  overflow: hidden;
}
.bundle::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  border-radius: inherit;
  background: radial-gradient(
    190px circle at var(--mx) var(--my),
    rgba(168, 200, 238, 0.042),
    transparent 58%);
  opacity: var(--prox);
  transition: opacity 0.45s var(--ease);
}
.bundle.is-lit {
  border-color: rgba(168, 200, 238, 0.3);
  box-shadow: var(--slab-shadow-hi);
}

.bundle > * { position: relative; z-index: 1; }

.bn-tag {
  align-self: flex-start;
  padding: 5px 11px;
  border: 1px solid rgba(168, 200, 238, 0.26);
  border-radius: 999px;
  font-family: var(--mono);
  font-size: 9.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--accent-cool);
}
.bn-name {
  margin-top: var(--space-5);
  font-size: clamp(20px, 2.3vw, 26px);
  font-weight: 300;
  letter-spacing: -0.025em;
  color: var(--ink);
}
.bn-includes {
  margin-top: var(--space-3);
  font-size: 13px;
  font-weight: 300;
  line-height: 1.6;
  color: var(--ink-4);
  flex: 1;
}
.bn-prices {
  display: flex;
  align-items: baseline;
  gap: var(--space-3);
  margin-top: var(--space-6);
}
.bn-was {
  font-size: 14px;
  font-weight: 300;
  color: var(--ink-4);
  text-decoration: line-through;
  text-decoration-thickness: 1px;
}
.bn-now {
  font-size: clamp(24px, 2.8vw, 32px);
  font-weight: 300;
  letter-spacing: -0.03em;
  color: #dbe8f8;
  font-variant-numeric: tabular-nums;
  text-shadow: 0 0 26px rgba(168, 200, 238, 0.45);
}
.bn-save {
  margin-top: var(--space-2);
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--live);
}

/* ============================================================================
   9. TERMS — deliberately the quietest block on the page. Flat, no glass, no
   glow. After all that light, plain type reads as honesty.
   ============================================================================ */
.terms-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(20px, 2.6vw, 36px) clamp(28px, 4vw, 56px);
}
.term dt {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--accent-cool);
  margin-bottom: 9px;
}
.term dd {
  margin: 0;
  font-size: 13.5px;
  font-weight: 300;
  line-height: 1.62;
  color: var(--ink-3);
}

.rates-validity {
  margin-top: clamp(36px, 5vh, 56px);
  padding-top: var(--space-6);
  border-top: 1px solid var(--line);
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-4);
}

/* ============================================================================
   10. CLOSING CTA
   ============================================================================ */
.rates-cta-block {
  position: relative;
  text-align: center;
  /* Tighter on top: the terms section above already ends with its own generous
     padding, and stacking both left a dead band before the close. */
  padding-block: clamp(36px, 6vh, 76px) clamp(80px, 14vh, 150px);
}
.rcb-title {
  font-size: clamp(30px, 5.2vw, 62px);
  font-weight: 200;
  letter-spacing: -0.035em;
  line-height: 1.06;
  color: var(--ink);
}
.rcb-title em {
  font-style: normal;   /* see .rs-title em — no italic cut exists to use */
  background: linear-gradient(96deg, #dbe8f8, var(--accent-cool) 55%, var(--accent-deep));
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: transparent;
}
.rcb-sub {
  margin: var(--space-5) auto 0;
  max-width: 46ch;
  font-size: clamp(14px, 1.5vw, 16.5px);
  font-weight: 300;
  line-height: 1.65;
  color: var(--ink-3);
}
.rcb-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-3);
  margin-top: clamp(28px, 4vh, 40px);
}
.rcb-btn {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 15px 26px;
  border-radius: 999px;
  border: 1px solid var(--glass-edge);
  background: rgba(255, 255, 255, 0.035);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  font-size: 14px;
  color: var(--ink-2);
  transition: color 0.4s var(--ease), border-color 0.4s var(--ease), background 0.4s var(--ease), transform 0.4s var(--ease-out);
}
.rcb-btn:hover {
  color: var(--ink);
  border-color: rgba(168, 200, 238, 0.34);
  background: rgba(168, 200, 238, 0.07);
  transform: translateY(-2px);
}
.rcb-btn:focus-visible {
  outline: 2px solid var(--accent-cool);
  outline-offset: 3px;
}
.rcb-btn.primary {
  border-color: rgba(168, 200, 238, 0.34);
  background: linear-gradient(180deg, rgba(168, 200, 238, 0.16), rgba(111, 159, 209, 0.08));
  color: #eaf2fd;
  box-shadow: 0 0 40px -12px rgba(111, 159, 209, 0.75);
}
.rcb-btn svg { width: 15px; height: 15px; }

.rates-foot {
  padding: var(--space-7) 0 clamp(40px, 6vh, 64px);
  border-top: 1px solid var(--line);
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: var(--space-4);
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-4);
}
.rates-foot a:hover { color: var(--ink-2); }

/* ============================================================================
   11. ENTRANCE — slabs rise into place rather than simply fading in.
   ============================================================================ */
/* A plain rise. The rotateX this used to carry needed a perspective ancestor,
   and that went with the tilt — without one it degrades to a vertical squash
   rather than a rotation, so there is nothing left for it to buy. */
[data-rise] {
  opacity: 0;
  transform: translateY(28px);
  transition:
    opacity 0.85s var(--ease-out),
    transform 0.85s var(--ease-out);
}
[data-rise].is-in {
  opacity: 1;
  transform: translateY(0);
}
/* Stagger inside a grid so a row lands left-to-right. */
/* The grid's children are the two columns now, not the slabs, so the stagger
   hangs off the column: the right-hand stack lands just after the left. */
.cat-col:nth-child(2) > [data-rise] { transition-delay: 0.09s; }
.bundle-grid > [data-rise]:nth-child(2)  { transition-delay: 0.1s;  }
.bundle-grid > [data-rise]:nth-child(3)  { transition-delay: 0.2s;  }

/* ============================================================================
   12. RESPONSIVE
   ============================================================================ */
@media (max-width: 1080px) {
  .terms-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .bundle-grid { grid-template-columns: 1fr; }
}

@media (max-width: 900px) {
  .cat-grid { grid-template-columns: 1fr; }
}

@media (max-width: 720px) {
  .cat-head {
    grid-template-columns: auto minmax(0, 1fr);
    row-gap: var(--space-5);
  }
  /* Price + toggle drop to their own full-width row under the title. */
  .cat-right {
    grid-column: 1 / -1;
    justify-content: space-between;
    padding-top: var(--space-4);
    border-top: 1px solid var(--line);
  }
  .cat-from { text-align: left; }
  .cat-line { display: none; }

  .tier {
    grid-template-columns: 1fr;
    row-gap: 6px;
  }
  .tier-price { justify-self: start; }

  .terms-grid { grid-template-columns: 1fr; }
  .rcb-btn { width: 100%; justify-content: center; }
}

/* ============================================================================
   13. REDUCED MOTION — the page still lights up, it just stops moving.
   The slabs never move under the pointer in the first place, so only the
   ambient drift and the entrance need switching off here.
   ============================================================================ */
@media (prefers-reduced-motion: reduce) {
  .rates-aurora span {
    animation: none !important;
  }

  [data-rise] {
    opacity: 1;
    transform: none;
    transition: none;
  }
  .cat-drawer { transition: none; }
}

/* ============================================================================
   14. PRESS FEEDBACK — the price list's half of the tap-flash replacement.
   The browser highlight is switched off globally in Amyar.portfolio.css; these
   are what a finger gets instead on this page. Surfaces brighten, small
   controls press in. Nothing scales the slabs themselves: they are large, and
   a whole card shrinking under a thumb reads as a glitch rather than a press.
   ============================================================================ */
.cat-head:active {
  background: rgba(255, 255, 255, 0.035);
}
.cat-head:active .cat-toggle {
  border-color: rgba(168, 200, 238, 0.4);
  background: rgba(168, 200, 238, 0.12);
}

/* The case link has no hover on touch, so :active is the only chance it gets
   to acknowledge the tap before the next page loads. */
.cat-case:active { color: var(--ink); }
.cat-case:active .cc-arrow {
  color: #eaf2fd;
  border-color: rgba(168, 200, 238, 0.38);
  background: rgba(168, 200, 238, 0.10);
}

.rcb-btn:active {
  transform: scale(0.978);
  transition-duration: 0.08s;
}

@media (prefers-reduced-motion: reduce) {
  .rcb-btn:active { transform: none; }
}
