/* ============================================================
   UniLearnora page — ported from "UniLearnora Landing"

   Loaded AFTER home.css and scoped entirely under `body.ul`. It carries
   this page's layout, motion and vocabulary — not its colours. Every
   colour comes from the active site theme, so the theme switcher in the
   header moves this page with the rest of the site.

   The reference painted every rule inline. Here the same rules are
   classes so the page can be themed, printed and reduced-motion'd in
   one place.

   Type: Sora (display) · Instrument Sans (body)
   ============================================================ */

body.ul {
  /* No palette here any more. Every colour comes from the active site
     theme, so the header's theme switcher moves this page with the rest of
     the site. The page keeps its own vocabulary — the names the rules below
     read by — now pointing at theme tokens.

     The split that mattered stays: the bright pair is decorative (rings,
     dots, borders, fills) and the -ink pair carries text, because the
     bright one is chosen to sit on the ground rather than to be read on it. */
  --ul-blue:      var(--accent);
  --ul-blue-lt:   var(--green-m);
  --ul-blue-pale: var(--lime-b);
  --ul-blue-ink:  var(--accent-2);
  --ul-amber:     var(--pending);
  --ul-amber-lt:  var(--warm-2);
  --ul-amber-ink: var(--warm);
  --ul-cream:     color-mix(in srgb, var(--pending) 10%, var(--surface));

  --radius: 18px;
  --radius-sm: 999px;

  --ff-display: "Sora", system-ui, sans-serif;
  --ff-body: "Instrument Sans", system-ui, sans-serif;
  --ff-mono: "Sora", ui-monospace, monospace;
  --ff-serif: "Sora", system-ui, sans-serif;

  font-family: var(--ff-body);
  background: var(--bg);
  color: var(--ink);
}


/* The decorative rings overhang the measure on purpose, so the overhang
   has to be clipped somewhere. Not on <body>: overflow-x:hidden there
   computes overflow-y to auto, making the body a scroll container and
   unsticking the header. `clip` creates no scroll container, and scoping
   it to <main> leaves the shared chrome alone. */
body.ul main { overflow-x: clip; }

/* the particle field replaces the home page's dotted bit field */
body.ul::before { display: none; }

body.ul ::selection { background: color-mix(in srgb, var(--ul-blue) 30%, transparent); }

body.ul h1, body.ul h2, body.ul h3 {
  font-family: var(--ff-display);
  font-weight: 800;
  letter-spacing: -1px;
}

/* The reference centres on a 1200px measure. Scoped to <main> on purpose:
   the header and footer are shared with every other page and run
   full-bleed there, so capping them here would make this one page's
   chrome narrower than the rest of the site. */
/* the site measure, not this page's own — see the note in allyvora.css */
body.ul main .wrap { max-width: var(--maxw); padding-inline: 48px; }

/* the header is sticky, so an in-page jump has to stop short of it */
body.ul main section[id] { scroll-margin-top: 84px; }

/* ---------- the motion vocabulary ---------- */
@keyframes ul-rise      { from { opacity: 0; transform: translateY(28px); } to { opacity: 1; transform: none; } }
@keyframes ul-spin      { from { transform: rotate(0deg); }   to { transform: rotate(360deg); } }
@keyframes ul-spin-back { from { transform: rotate(360deg); } to { transform: rotate(0deg); } }
@keyframes ul-caret     { 0%, 100% { opacity: 1; } 50% { opacity: .15; } }
@keyframes ul-float     { 0%, 100% { transform: translateY(-10px); } 50% { transform: translateY(12px); } }
@keyframes ul-glow      { 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--ul-amber) 50%, transparent); }
                          50%      { box-shadow: 0 0 0 12px color-mix(in srgb, var(--ul-amber) 0%, transparent); } }
@keyframes ul-talk      { 0%, 100% { transform: scaleY(.3); } 50% { transform: scaleY(1); } }

/* ============================================================
   THE FIELD — particles and the cursor glow
   ============================================================ */

/* A <canvas>, so the browser offers no "Save image as…" on it — the site
   emits no <img> anywhere and this page is no exception. */
.ul-field {
  position: fixed; inset: 0;
  width: 100%; height: 100%;
  z-index: 0; pointer-events: none;
}
.ul-glow {
  position: fixed; left: 0; top: 0;
  width: 520px; height: 520px; margin: -260px 0 0 -260px;
  border-radius: 50%;
  background: radial-gradient(circle,
              color-mix(in srgb, var(--ul-blue) 18%, transparent),
              transparent 60%);
  pointer-events: none; z-index: 1;
  opacity: 0; transition: opacity .8s ease;
}
.ul-glow.on { opacity: 1; }

/* Everything real sits above the field. The z-index matters: the canvas
   is position:fixed with z-index 0, and a positioned box outranks a
   non-positioned one in the same stacking context — so the shared
   footer (static in home.css) would paint UNDER the field without it.

   The nav is deliberately absent: home.css makes it position:sticky at
   z-index 50, which already clears the field — restating it here as
   relative would unstick the header on this page alone. */
body.ul main,
body.ul .footer { position: relative; z-index: 2; }

/* ============================================================
   SHARED FURNITURE
   ============================================================ */
.ul-eyebrow {
  font-size: 13px; letter-spacing: 3px; text-transform: uppercase;
  color: var(--ul-amber-ink); font-weight: 600;
  margin: 0;
}
.ul-h2 {
  font-size: clamp(34px, 3.6vw, 52px);
  line-height: 1.1; margin: 18px 0 0;
}
.ul-lead {
  font-size: 17.5px; line-height: 1.7;
  color: var(--ink-2); margin: 22px 0 0;
  text-wrap: pretty;
}
.ul-sec { padding-block: 110px; }

/* two decorative rings, each drifting at its own rate */
.ul-ring {
  position: absolute; border-radius: 50%;
  pointer-events: none;
}
.ul-ring i {
  position: absolute; left: 50%;
  border-radius: 50%;
}

/* the pill buttons */
body.ul .btn {
  border-radius: 999px;
  font-family: var(--ff-display); font-weight: 700;
  font-size: 16px; padding: 16px 34px;
}
/* fill and label from home.css: one primary button across the whole site */
body.ul .btn-primary { box-shadow: none; }
body.ul .btn-primary:hover {
  transform: translateY(-3px) scale(1.03);
  box-shadow: 0 14px 40px color-mix(in srgb, var(--ul-blue) 35%, transparent);
}
body.ul .btn-ghost {
  border: 1px solid color-mix(in srgb, var(--ink-2) 40%, transparent);
  color: var(--ink); background: none;
}
body.ul .btn-ghost:hover {
  border-color: var(--ul-amber); background: color-mix(in srgb, var(--ul-amber) 10%, transparent);
  color: var(--ul-amber-ink); transform: translateY(-3px);
}
/* the trial button: amber fill carries ink, not white — white on this
   amber is 2.7:1, the same fill under the page ink is 6.0:1. */
/* the trial button is the site's primary fill, one size up — a mid-tone
   amber fill has no label colour that reads on it */
body.ul .btn-amber {
  background: var(--lime-b); color: var(--on-accent); border-color: transparent;
  font-size: 17px; padding: 18px 42px;
}
body.ul .btn-amber:hover {
  color: var(--on-accent);
  transform: translateY(-3px) scale(1.04);
  box-shadow: 0 16px 48px color-mix(in srgb, var(--lime-c) 45%, transparent);
}

/* ============================================================
   HERO
   ============================================================ */
.ul-hero { position: relative; padding: 190px 0 90px; }
.ul-hero .wrap { position: relative; }

.ul-ring-a {
  right: -60px; top: 120px; width: 560px; height: 560px;
  border: 1px solid color-mix(in srgb, var(--ul-blue) 25%, transparent);
  animation: ul-spin 70s linear infinite;
}
.ul-ring-a i {
  top: -7px; width: 14px; height: 14px; margin-left: -7px;
  background: var(--ul-amber); animation: ul-glow 3s ease-in-out infinite;
}
.ul-ring-b {
  right: 40px; top: 220px; width: 360px; height: 360px;
  border: 1px dashed color-mix(in srgb, var(--ul-amber) 35%, transparent);
  animation: ul-spin-back 50s linear infinite;
}
.ul-ring-b i {
  bottom: -5px; width: 10px; height: 10px; margin-left: -5px;
  background: var(--ul-blue);
}

.ul-badge {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 8px 18px; border-radius: 999px;
  border: 1px solid color-mix(in srgb, var(--ul-blue) 35%, transparent);
  background: color-mix(in srgb, var(--ul-blue) 7%, transparent);
  font-size: 13.5px; color: var(--ul-blue-ink);
  letter-spacing: .8px; text-transform: uppercase;
  margin: 0;
  animation: ul-rise .8s ease both;
}
.ul-badge i {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--ul-amber);
  animation: ul-glow 2.4s ease-in-out infinite;
}

.ul-hero h1 {
  font-size: clamp(52px, 7.2vw, 96px);
  line-height: 1.02; letter-spacing: -2px;
  margin: 28px 0 0; max-width: 860px;
  text-wrap: pretty;
}
.ul-hero h1 span { display: inline-block; animation: ul-rise .8s .1s ease both; }
.ul-hero h1 .grad {
  animation-delay: .25s;
  background: linear-gradient(100deg, var(--ul-blue), var(--ul-blue-lt) 55%, var(--ul-amber));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: transparent;
}
.ul-hero-lead {
  font-size: 19px; line-height: 1.65; color: var(--ink-2);
  max-width: 620px; margin: 30px 0 0;
  animation: ul-rise .8s .4s ease both;
  text-wrap: pretty;
}
.ul-hero-actions {
  display: flex; align-items: center; gap: 18px; flex-wrap: wrap;
  margin-top: 40px;
  animation: ul-rise .8s .55s ease both;
}
.ul-figures {
  display: flex; gap: 56px; flex-wrap: wrap;
  margin-top: 78px;
  animation: ul-rise .8s .7s ease both;
}
.ul-figures div b {
  display: block;
  font-family: var(--ff-display); font-weight: 800;
  font-size: 38px; color: var(--ul-blue-ink);
}
.ul-figures div.amber b { color: var(--ul-amber-ink); }
.ul-figures div span {
  display: block; font-size: 14px; color: var(--ink-2); margin-top: 4px;
}

/* ============================================================
   THE NAME — UNI / LEARN / ORA
   ============================================================ */
.ul-name { display: grid; gap: 8px; margin-top: 36px; }
.ul-name-row {
  display: grid; grid-template-columns: minmax(220px, 340px) 1fr;
  align-items: baseline; gap: 32px;
  padding: 30px 28px; border-radius: 20px;
  border: 1px solid transparent;
  transition: background .35s ease, border-color .35s ease, transform .35s ease;
  cursor: default;
}
.ul-name-row:hover {
  background: color-mix(in srgb, var(--ul-blue-pale) 7%, transparent);
  border-color: color-mix(in srgb, var(--ul-blue) 30%, transparent);
  transform: translateX(12px);
}
.ul-name-row.amber:hover {
  background: color-mix(in srgb, var(--ul-amber-lt) 6%, transparent);
  border-color: color-mix(in srgb, var(--ul-amber) 35%, transparent);
}
.ul-name-key {
  font-family: var(--ff-display); font-weight: 800;
  font-size: clamp(44px, 5vw, 68px); letter-spacing: 6px;
}
.ul-name-key .caret { animation: ul-caret 1.6s step-end infinite; }
.ul-name-row p { font-size: 18px; color: var(--ink-2); line-height: 1.55; margin: 0; }
.ul-name-row p strong { color: var(--ink); }

/* ============================================================
   TWO-COLUMN SECTIONS
   ============================================================ */
.ul-split {
  display: grid; grid-template-columns: 1fr 1fr;
  gap: 72px; align-items: center;
}
.ul-ticks {
  list-style: none; padding: 0; margin: 28px 0 0;
  display: grid; gap: 14px;
  font-size: 16px; color: var(--ink-soft);
}
.ul-ticks li { display: flex; gap: 12px; align-items: baseline; }
.ul-ticks li::before { content: "◆"; color: var(--ul-blue-ink); }

/* --- the booking diagram --- */
.ul-diagram { position: relative; display: grid; gap: 18px; justify-items: center; }
.ul-res-row { display: flex; gap: 18px; flex-wrap: wrap; justify-content: center; }
.ul-res {
  padding: 22px 28px; border-radius: 18px;
  background: var(--wash-2);
  border: 1px solid color-mix(in srgb, var(--ul-blue) 35%, transparent);
  text-align: center;
  animation: ul-float 6s ease-in-out infinite;
  transition: border-color .3s ease, transform .3s ease;
}
.ul-res:nth-child(2) { animation-delay: 1.2s; }
.ul-res:hover { border-color: var(--ul-blue); transform: scale(1.06); }
.ul-res b { display: block; font-family: var(--ff-display); font-weight: 700; font-size: 17px; }
.ul-res span { display: block; font-size: 13px; color: var(--ink-2); margin-top: 3px; }
.ul-drop {
  width: 1px; height: 44px;
  background: linear-gradient(color-mix(in srgb, var(--ul-blue) 55%, transparent),
                              color-mix(in srgb, var(--ul-amber-lt) 80%, transparent));
}
.ul-booking {
  padding: 26px 40px; border-radius: 18px;
  background: color-mix(in srgb, var(--ul-cream) 95%, transparent);
  border: 1px solid color-mix(in srgb, var(--ul-amber) 50%, transparent);
  text-align: center;
  animation: ul-float 6s 2.4s ease-in-out infinite, ul-glow 4s ease-in-out infinite;
  transition: transform .3s ease;
}
.ul-booking:hover { transform: scale(1.06); }
.ul-booking b {
  display: block; font-family: var(--ff-display); font-weight: 800;
  font-size: 19px; color: var(--ul-amber-ink);
}
.ul-booking span { display: block; font-size: 13.5px; color: var(--ul-amber-ink); margin-top: 4px; }

/* --- the classroom mock --- */
.ul-tinted {
  border-top: 1px solid var(--line);
  background: linear-gradient(180deg, color-mix(in srgb, var(--surface) 75%, transparent), transparent);
}
.ul-mock {
  position: relative; border-radius: 22px;
  background: var(--wash-3);
  border: 1px solid color-mix(in srgb, var(--ul-blue) 30%, transparent);
  padding: 18px;
  box-shadow: 0 30px 80px color-mix(in srgb, var(--shadow) 15%, transparent);
}
.ul-stage { display: grid; grid-template-columns: 2fr 1fr; gap: 12px; }
.ul-speaker {
  position: relative; border-radius: 14px;
  background: linear-gradient(135deg,
              color-mix(in srgb, var(--ul-blue) 30%, transparent),
              color-mix(in srgb, var(--ul-blue-pale) 6%, transparent));
  min-height: 240px;
  border: 1px solid color-mix(in srgb, var(--ul-blue) 35%, transparent);
  display: flex; align-items: flex-end; padding: 14px;
}
.ul-pin {
  position: absolute; top: 12px; left: 12px;
  font-size: 11.5px; letter-spacing: 1.5px; text-transform: uppercase;
  color: var(--ul-amber-ink);
  border: 1px solid color-mix(in srgb, var(--ul-amber) 50%, transparent);
  border-radius: 999px; padding: 4px 10px;
  background: color-mix(in srgb, var(--ul-cream) 90%, transparent);
}
.ul-vu { display: flex; align-items: flex-end; gap: 3px; height: 26px; }
.ul-vu i {
  width: 4px; height: 100%; background: var(--ul-blue);
  transform-origin: bottom;
  animation: ul-talk 1s ease-in-out infinite;
}
.ul-vu i:nth-child(2) { animation-delay: .15s; }
.ul-vu i:nth-child(3) { animation-delay: .3s; }
.ul-vu i:nth-child(4) { animation-delay: .45s; }

.ul-tiles { display: grid; gap: 12px; }
.ul-tile {
  position: relative; border-radius: 14px;
  background: color-mix(in srgb, var(--bg-2) 95%, transparent);
  border: 1px solid color-mix(in srgb, var(--ink-2) 25%, transparent);
  display: flex; align-items: center; justify-content: center;
  font-size: 13px; color: var(--ink-2); min-height: 70px;
}
.ul-tile.hand { border-color: color-mix(in srgb, var(--ul-amber) 50%, transparent); color: var(--ink); }
.ul-tile .raised {
  position: absolute; top: -9px; right: -9px;
  width: 24px; height: 24px; border-radius: 50%;
  /* outlined rather than filled: a mid-tone amber fill has no label colour
     that reads on it, and this is the one place the page filled one */
  background: var(--surface); color: var(--ul-amber-ink);
  border: 1.5px solid var(--ul-amber);
  display: flex; align-items: center; justify-content: center;
  font-size: 13px;
  animation: ul-glow 2s ease-in-out infinite;
}
.ul-controls { display: flex; justify-content: center; gap: 12px; margin-top: 16px; flex-wrap: wrap; }
.ul-controls span {
  padding: 8px 16px; border-radius: 999px;
  background: color-mix(in srgb, var(--ul-blue) 15%, transparent);
  border: 1px solid color-mix(in srgb, var(--ul-blue) 35%, transparent);
  font-size: 12.5px; color: var(--ul-blue-ink);
}
.ul-controls span.amber {
  background: color-mix(in srgb, var(--ul-amber) 12%, transparent);
  border-color: color-mix(in srgb, var(--ul-amber) 45%, transparent);
  color: var(--ul-amber-ink);
}

/* ============================================================
   CARD GRIDS
   ============================================================ */
.ul-grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-top: 48px; }
.ul-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 48px; }

.ul-mod {
  padding: 26px 24px; border-radius: 18px;
  background: var(--wash-2);
  border: 1px solid color-mix(in srgb, var(--ink-2) 18%, transparent);
  transition: transform .3s ease, border-color .3s ease, background .3s ease;
}
.ul-mod:hover {
  transform: translateY(-8px);
  border-color: color-mix(in srgb, var(--ul-blue) 50%, transparent);
  background: color-mix(in srgb, var(--ul-blue) 7%, transparent);
}
.ul-mod b {
  display: block; font-family: var(--ff-display);
  font-size: 13px; color: var(--ul-blue-ink); font-weight: 700;
}
.ul-mod h3 { font-family: var(--ff-display); font-weight: 700; font-size: 17px; margin: 10px 0 0; letter-spacing: 0; }
.ul-mod p { font-size: 14px; color: var(--ink-2); line-height: 1.55; margin: 8px 0 0; }
/* the live classroom card is the one the whole product turns on */
.ul-mod.hot { border-color: color-mix(in srgb, var(--ul-amber) 35%, transparent); }
.ul-mod.hot b { color: var(--ul-amber-ink); }
.ul-mod.hot:hover {
  border-color: color-mix(in srgb, var(--ul-amber) 60%, transparent);
  background: color-mix(in srgb, var(--ul-amber) 8%, transparent);
}

.ul-guard {
  padding: 28px; border-radius: 18px;
  background: var(--wash-2);
  border: 1px solid color-mix(in srgb, var(--ink-2) 18%, transparent);
  transition: border-color .3s ease, transform .3s ease;
}
.ul-guard:hover {
  border-color: color-mix(in srgb, var(--ul-amber) 50%, transparent);
  transform: translateY(-6px);
}
.ul-guard h3 {
  font-family: var(--ff-display); font-weight: 700; font-size: 18px;
  color: var(--ul-amber-ink); margin: 0; letter-spacing: 0;
}
.ul-guard p { font-size: 15px; color: var(--ink-2); line-height: 1.6; margin: 10px 0 0; }

/* ============================================================
   CTA
   ============================================================ */
.ul-start { position: relative; padding: 130px 0 120px; text-align: center; }
.ul-start .wrap { position: relative; }
.ul-ring-c {
  left: 50%; top: 60px; width: 700px; height: 700px; margin-left: -350px;
  border: 1px solid color-mix(in srgb, var(--ul-blue) 18%, transparent);
  animation: ul-spin 90s linear infinite;
}
.ul-ring-c i:first-child  { top: -6px;    width: 12px; height: 12px; margin-left: -6px; background: var(--ul-blue); }
.ul-ring-c i:last-child   { bottom: -6px; width: 12px; height: 12px; margin-left: -6px; background: var(--ul-amber); }
.ul-start h2 {
  font-size: clamp(40px, 5vw, 72px);
  letter-spacing: -1.5px; line-height: 1.05; margin: 0;
}
.ul-start h2 .grad {
  background: linear-gradient(100deg, var(--ul-blue), var(--ul-amber));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: transparent;
}
.ul-start p {
  font-size: 18px; color: var(--ink-2);
  margin: 26px auto 0; max-width: 560px; line-height: 1.65;
}
.ul-start-actions { display: flex; justify-content: center; gap: 18px; margin-top: 42px; flex-wrap: wrap; }

/* ============================================================
   THE SHARED CHROME, RE-TINTED
   ============================================================ */
body.ul .nav {
  background: color-mix(in srgb, var(--bg) 70%, transparent);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--line);
}
body.ul .footer { background: var(--bg); border-top: 1px solid var(--line); }

/* ============================================================
   REVEALS
   Armed by the script (body.ul-js), so with JavaScript blocked the page
   renders plainly instead of staying invisible — the reference hid the
   sections from the script and left a blank page behind a failed one.
   ============================================================ */
body.ul-js [data-reveal] {
  opacity: 0; transform: translateY(36px);
  transition: opacity .9s ease, transform .9s cubic-bezier(.2, .7, .2, 1);
}
body.ul-js [data-reveal].ul-in { opacity: 1; transform: none; }

/* ============================================================
   RESPONSIVE
   ============================================================ */
@media (max-width: 1040px) {
  .ul-grid-4 { grid-template-columns: repeat(2, 1fr); }
  .ul-split { grid-template-columns: 1fr; gap: 48px; }
  .ul-grid-3 { grid-template-columns: 1fr; }
  /* the rings are sized for a wide measure; they swamp a narrow one */
  .ul-ring-a, .ul-ring-b { display: none; }
}
@media (max-width: 880px) {
  .ul-grid-3 { grid-template-columns: 1fr; }
}
@media (max-width: 760px) {
  body.ul main .wrap { padding-inline: 22px; }
  .ul-hero { padding-top: 140px; }
  .ul-sec { padding-block: 78px; }
  .ul-start { padding: 88px 0 78px; }
  .ul-figures { gap: 32px; }
  .ul-name-row { grid-template-columns: 1fr; gap: 12px; }
  .ul-name-row:hover { transform: none; }
  .ul-stage { grid-template-columns: 1fr; }
  .ul-hero-lead { font-size: 17px; }
  .ul-ring-c { width: 420px; height: 420px; margin-left: -210px; }
}
@media (max-width: 560px) {
  .ul-grid-4 { grid-template-columns: 1fr; }
  .ul-hero-actions .btn, .ul-start-actions .btn { width: 100%; justify-content: center; }
}

/* ============================================================
   REDUCED MOTION
   Everything decorative stops. The reveals are neutralised too, so a
   section can never be left invisible.
   ============================================================ */
/* the glow follows a pointer that a phone does not have */
@media (hover: none) and (pointer: coarse) {
  body.ul .ul-glow { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  body.ul *,
  body.ul *::before,
  body.ul *::after {
    animation: none !important;
    transition: none !important;
  }
  body.ul-js [data-reveal] { opacity: 1; transform: none; }
  body.ul .ul-glow { display: none; }
}
