/* ───────────────────────── Pricing page ─────────────────────────
   Calm + flat, matching the site design language: white cards on the
   soft backdrop, purple accents, no glows. Scoped to .pricing-page. */

.pricing-page .price-hero {
  position: relative;
  text-align: center;
  padding-bottom: 26px;
}

.pricing-page .price-hero h1 {
  margin-inline: auto;
  max-width: 16ch;
}

.pricing-page .price-hero .eyebrow {
  margin-inline: auto;
}

.pricing-page .price-lede {
  max-width: 54ch;
  margin: 18px auto 0;
  color: var(--ink-soft, #5b5566);
  font-size: clamp(1rem, 1.35vw, 1.16rem);
  line-height: 1.6;
}

/* Billing toggle */




/* Cards grid */
.price-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(18px, 2.4vw, 30px);
  align-items: stretch;
  margin-top: clamp(34px, 4vw, 54px);
}

.price-card {
  position: relative;
  display: flex;
  flex-direction: column;
  border-radius: 26px;
  background: #ffffff;
  border: 1px solid rgba(31, 17, 66, 0.08);
  box-shadow: 0 16px 40px rgba(31, 17, 66, 0.07);
  padding: clamp(24px, 2.6vw, 34px);
  transition: transform 260ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 260ms ease;
}

.price-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 24px 54px rgba(31, 17, 66, 0.11);
}

.price-card.is-featured {
  border: 2px solid var(--purple, #6a1cf6);
  box-shadow: 0 22px 54px rgba(106, 28, 246, 0.16);
}

.price-card.is-future {
  background: linear-gradient(180deg, #ffffff 0%, #faf7ff 100%);
}

.price-ribbon {
  position: absolute;
  top: -14px;
  left: 50%;
  transform: translateX(-50%);
  white-space: nowrap;
  padding: 6px 14px;
  border-radius: 999px;
  background: var(--purple, #6a1cf6);
  color: #fff;
  font: 800 0.72rem "Plus Jakarta Sans", Inter, sans-serif;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}

.price-ribbon.is-soon {
  background: #1f1142;
}

.price-plan-name {
  margin: 0;
  font: 800 1.05rem "Plus Jakarta Sans", Inter, sans-serif;
  letter-spacing: 0.02em;
  color: #1f1142;
  text-transform: uppercase;
}

.price-plan-for {
  margin: 4px 0 0;
  color: #7a7387;
  font-size: 0.92rem;
  font-weight: 600;
}

.price-amount {
  display: flex;
  align-items: baseline;
  gap: 8px;
  margin-top: 18px;
  min-height: 64px;
}

.price-amount .num {
  font: 800 clamp(2.5rem, 3.6vw, 3.2rem) "Plus Jakarta Sans", Inter, sans-serif;
  color: #1f1142;
  letter-spacing: -0.02em;
}

.price-card.is-featured .price-amount .num {
  color: var(--purple, #6a1cf6);
}

.price-amount .per {
  color: #7a7387;
  font-weight: 700;
  font-size: 0.95rem;
}

.price-save {
  display: inline-block;
  width: fit-content;
  margin-top: 6px;
  padding: 4px 11px;
  border-radius: 999px;
  background: rgba(47, 143, 106, 0.14);
  color: #196b4d;
  font: 800 0.72rem "Plus Jakarta Sans", Inter, sans-serif;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  opacity: 0;
  transform: translateY(4px);
  transition: opacity 260ms ease, transform 260ms cubic-bezier(0.22, 1, 0.36, 1);
}

.pricing-page[data-billing="yearly"] .price-save.has-save {
  opacity: 1;
  transform: none;
}

.price-sub {
  margin: 10px 0 0;
  color: #7a7387;
  font-size: 0.9rem;
  line-height: 1.5;
}

/* Benefits list */
.price-list {
  list-style: none;
  margin: 22px 0 0;
  padding: 22px 0 0;
  border-top: 1px solid rgba(31, 17, 66, 0.08);
  display: flex;
  flex-direction: column;
  gap: 12px;
  flex: 1;
}

.price-list li {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  color: #3c3548;
  font-size: 0.95rem;
  line-height: 1.45;
}

.price-list li.lead-in {
  color: #1f1142;
  font-weight: 800;
}

.price-check {
  flex: 0 0 auto;
  width: 19px;
  height: 19px;
  margin-top: 2px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: rgba(106, 28, 246, 0.1);
  color: var(--purple, #6a1cf6);
}

.price-card.is-future .price-check {
  background: rgba(31, 17, 66, 0.08);
  color: #1f1142;
}

.price-check svg {
  width: 11px;
  height: 11px;
}

/* CTAs */
.price-cta {
  margin-top: 26px;
}

.price-cta .btn-3d,
.price-cta .outline-button {
  width: 100%;
  justify-content: center;
  text-align: center;
}

.price-cta .cta-soon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  min-height: 52px;
  border-radius: 999px;
  border: 1.5px dashed rgba(31, 17, 66, 0.26);
  color: #7a7387;
  font: 800 0.95rem "Plus Jakarta Sans", Inter, sans-serif;
  letter-spacing: 0.02em;
  cursor: default;
  user-select: none;
}

.price-cta-note {
  margin: 10px 0 0;
  text-align: center;
  color: #9a93a8;
  font-size: 0.8rem;
  line-height: 1.5;
}

/* Fine print */
.price-fineprint {
  margin: clamp(40px, 5vw, 64px) auto 0;
  max-width: 72ch;
  text-align: center;
  color: #9a93a8;
  font-size: 0.84rem;
  line-height: 1.7;
}

.price-fineprint a {
  color: #6a1cf6;
  text-decoration: none;
  font-weight: 700;
}

/* Responsive */
@media (max-width: 980px) {
  .price-grid {
    grid-template-columns: minmax(0, 1fr);
    max-width: 480px;
    margin-inline: auto;
  }
  .price-card.is-featured {
    order: -1;
  }
}

/* Plus price block. The amount comes from the Pages Function; these three lines
   carry the annual/monthly comparison and the changeover date around it. */
.price-permonth {
  margin: 8px 0 0;
  color: #4a4358;
  font-size: 0.95rem;
  font-weight: 700;
}

.price-monthly-compare {
  margin: 4px 0 0;
  color: #7a7387;
  font-size: 0.88rem;
}

.price-effective {
  margin: 8px 0 0;
  color: #8b8398;
  font-size: 0.78rem;
  line-height: 1.45;
}

/* Fallback when the function did not run: the slot holds a sentence, not a
   number, so it must not be set at display-figure size. */
.price-card.is-price-unknown .price-amount .num {
  font-size: 1.05rem;
  font-weight: 800;
  line-height: 1.35;
}

.price-card.is-price-unknown .price-amount .per {
  display: none;
}

/* ── Billing toggle ───────────────────────────────────────────────────── */
.billing-toggle {
  display: inline-flex;
  gap: 4px;
  margin: 0 auto 30px;
  padding: 5px;
  border-radius: 999px;
  background: rgba(106, 28, 246, 0.07);
}

.billing-toggle button {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 20px;
  border: 0;
  border-radius: 999px;
  color: #5b5468;
  background: transparent;
  cursor: pointer;
  font: 800 0.9rem "Plus Jakarta Sans", Inter, sans-serif;
  transition: color 180ms ease, background 180ms ease, box-shadow 180ms ease;
}

.billing-toggle button:hover {
  color: #2a2335;
}

.billing-toggle button.is-active {
  color: #2a2335;
  background: #ffffff;
  box-shadow: 0 2px 10px rgba(40, 22, 78, 0.12);
}

.billing-toggle .toggle-hint {
  padding: 3px 8px;
  border-radius: 999px;
  background: rgba(47, 143, 106, 0.16);
  color: #196b4d;
  font-size: 0.68rem;
  letter-spacing: 0.03em;
  text-transform: uppercase;
}

/* ── Blob cards ──────────────────────────────────────────────────────────
   A structural port of the BlobCard component. The two-layer shape is the
   whole point and cannot be collapsed into one element: the OUTER box carries
   the glow (inset -1.5px, radius 21.5, clipped), and the INNER card paints an
   opaque background over it, so only the ring escapes. Squeezing both into a
   single element put the glow above the card's own background — a negative
   z-index child paints over its parent's background, not behind it — and the
   colour washed across the entire card.

   Sizes, colours and the glow angle are written by initBlobCards() in
   script.js, which ports FluidBlobs and GlowEffect directly. */
.blob-card {
  position: relative;
  width: 100%;
  display: flex;
}

.blob-card-glow {
  position: absolute;
  inset: -1.5px;
  z-index: 0;
  border-radius: 21.5px;
  overflow: hidden;
  pointer-events: none;
}

.blob-card-glow-inner {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  filter: blur(24px);
  backface-visibility: hidden;
  will-change: transform;
}

/* The inner card: opaque, clipped, and above the glow. */
.blob-card > .price-card {
  position: relative;
  z-index: 10;
  flex: 1;
  border-radius: 20px;
  overflow: hidden;
  border-color: transparent;
}

/* Flush to the card edges, so the wash reaches the corners the way it does in
   the component. The negative margins undo the card's own padding. */
.blob-card-header {
  position: relative;
  height: 224px;
  margin: calc(-1 * clamp(24px, 2.6vw, 34px));
  margin-bottom: 0;
  overflow: hidden;
  border-radius: 20px 20px 0 0;
}

.blob-card-blobs {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

/* The component's `to-background` overlay: transparent through the first half,
   then down to the card colour, so the wash never ends on a line. */
.blob-card-fade {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(to bottom, transparent 0%, transparent 50%, #ffffff 100%);
}

.blob-card-headtext {
  position: relative;
  z-index: 10;
  display: flex;
  flex-direction: column;
  padding: clamp(24px, 2.6vw, 34px) clamp(24px, 2.6vw, 34px) 0;
}

/* Plus wears the orange, Business the purple. */
.price-card.blobs-plus {
  --accent: #ff7733;
  --accent-ink: #b8480f;
  --accent-soft: rgba(255, 119, 51, 0.14);
}

.price-card.blobs-business {
  --accent: #6a1cf6;
  --accent-ink: #4a13ad;
  --accent-soft: rgba(106, 28, 246, 0.14);
}

.price-card.has-blobs .price-ribbon,
.price-card.blobs-business .price-ribbon.is-soon {
  background: var(--accent);
}

.price-card.has-blobs .price-amount .num { color: var(--accent-ink); }

.price-card.has-blobs .price-check {
  background: var(--accent-soft);
  color: var(--accent-ink);
}

/* The ribbon sat half outside the card; the header clips now, so keep it in. */
.blob-card .price-ribbon {
  position: static;
  transform: none;
  align-self: center;
  margin-bottom: 10px;
}

/* ── MagicCard border ─────────────────────────────────────────────────────
   Ported from magic card, colorful border.txt (default "gradient" mode). The
   border is a radial gradient centred on the cursor: the padding-box layer
   paints the card face, the border-box layer paints the ring, and a 1px
   transparent border is what lets the second layer show. --mx/--my are written
   by the spring in pricing.html, so the colour trails the pointer instead of
   snapping to it. */
.blob-card > .price-card {
  border: 1px solid transparent;
  background:
    linear-gradient(#ffffff 0 0) padding-box,
    radial-gradient(
      var(--mc-size, 260px) circle at var(--mx, -260px) var(--my, -260px),
      var(--mc-from, #9e7aff),
      var(--mc-to, #fe8bbb),
      rgba(31, 17, 66, 0.09) 100%
    )
    border-box;
}

/* The inner sheen, also centred on the cursor. Hidden until the pointer is on
   the card, exactly like the component's group-hover opacity. */
.blob-card > .price-card::after {
  content: "";
  position: absolute;
  inset: 1px;
  z-index: 0;
  border-radius: inherit;
  pointer-events: none;
  opacity: 0;
  transition: opacity 300ms ease;
  background: radial-gradient(
    var(--mc-size, 260px) circle at var(--mx, -260px) var(--my, -260px),
    var(--mc-sheen, rgba(106, 28, 246, 0.14)),
    transparent 100%
  );
}

.blob-card > .price-card.is-lit::after {
  opacity: 0.8;
}

.price-card.blobs-plus {
  --mc-from: #ffb38a;
  --mc-to: #ff7733;
  --mc-sheen: rgba(255, 119, 51, 0.16);
}

.price-card.blobs-business {
  --mc-from: #b39aff;
  --mc-to: #6a1cf6;
  --mc-sheen: rgba(106, 28, 246, 0.14);
}

@media (prefers-reduced-motion: reduce) {
  .blob-card > .price-card::after { transition: none; }
}
