/* ============================================================
   Philippine Loan Solutions — design system
   Navy + champagne-gold. Mobile first, scales up to desktop.

   Colour values are sampled directly from the approved artwork
   in design/ — keep them in sync if the artwork is re-cut.
   ============================================================ */

/* ---------- reset ---------- */
*,
*::before,
*::after { box-sizing: border-box; }

html,
body,
h1, h2, h3, h4, h5, h6,
p, figure, blockquote, dl, dd,
ul, ol { margin: 0; padding: 0; }

ul, ol { list-style: none; }

/* height:auto matters — the width/height attributes that reserve layout
   space would otherwise fix the rendered height once width is constrained */
img, svg { display: block; max-width: 100%; }
img { height: auto; }
[hidden] { display: none !important; }

button,
input,
select,
textarea { font: inherit; color: inherit; }

button { background: none; border: 0; cursor: pointer; }

a { text-decoration: none; color: inherit; }


/* ---------- tokens ---------- */
:root {
  /* Navy — the section gradient runs 500 (top) to 800 (bottom).
     Same hue as the artwork was drawn against, lifted about nine points
     of lightness: the old ramp bottomed out near black, which read as
     gloomy rather than premium. */
  --av-navy-900: #141947;
  --av-navy-800: #191e54;
  --av-navy-700: #1e2460;
  --av-navy-600: #232a6b;
  --av-navy-500: #293176;
  --av-navy-400: #313a85;

  /* champagne gold */
  --av-gold-100: #fff6dd;
  --av-gold-200: #f6e7d2;
  --av-gold-300: #e8d3ab;
  --av-gold-400: #d4bb8c;
  --av-gold-500: #c1a273;
  --av-gold-600: #ab8653;
  --av-gold-700: #9a7540;
  --av-gold-800: #7a5c31;

  /* the champagne tint nested parts (chips, fields, mini cards) are built from */
  --av-tint: 234, 219, 190;

  /* Two surfaces, one family.
     --av-surface is the deep panel every CARD is made of; its colour is
     sampled from the artwork's own backdrop so pictures sit in it seamlessly.
     --av-chrome is the navigation furniture — the top bar and the tab bar.
     It sits one step lighter, between the cards and the page, so the bars
     read as a layer floating above the content rather than as more cards,
     while staying the same hue. Both are opaque: nothing scrolling behind
     can tint them. */
  --av-surface: linear-gradient(180deg,
      #070d2e 0%, #0c103b 28%, #0c103d 62%, #081036 100%);
  --av-surface-line: rgba(226, 196, 116, .42);

  --av-chrome: linear-gradient(180deg, #1a2057 0%, #151b4b 100%);
  --av-chrome-line: rgba(226, 196, 116, .30);

  --av-text:       #f3f1fa;
  --av-text-dim:   #cfcbe2;
  --av-text-faint: #a9a5c0;

  /* metallic sheen used by buttons and rules */
  --av-sheen: linear-gradient(95deg,
      #9a7540  0%,
      #b48f58 20%,
      #d4bb8c 40%,
      #f6e7d2 57%,
      #cdab79 72%,
      #ab8653 88%,
      #94703e 100%);

  /* champagne text gradient for display headings */
  --av-text-sheen: linear-gradient(180deg, #fdf3dd 0%, #ecd8b2 48%, #cfb183 100%);

  --av-radius-sm: 12px;
  --av-radius:    18px;
  --av-radius-lg: 26px;
  --av-radius-pill: 999px;

  /* the artwork insets content by ~13.5% of the column on each side —
     clamped so it never gets silly on a very small or very wide phone */
  --av-gutter: clamp(20px, 13.5%, 58px);
  --av-measure: 440px;   /* the phone column the artwork was drawn for */

  --av-font-display: "Playfair Display", "Times New Roman", serif;
  --av-font-ui: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
}


/* ---------- page ---------- */
html { background: var(--av-navy-700); }

body {
  min-height: 100%;
  font-family: var(--av-font-ui);
  font-size: 15px;
  line-height: 1.55;
  color: var(--av-text);
  background: var(--av-navy-700);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}


/* ---------- the page backdrop ----------
   One fixed layer behind everything: the gradient and the starfield stay
   put while the content scrolls over them, the way a normal site behaves.
   Sections used to each carry their own copy, which made the whole
   backdrop travel with the page. */
.av-body::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -10;
  pointer-events: none;
  background:
    radial-gradient(120% 60% at 50% -10%, rgba(126, 142, 224, .22), transparent 62%),
    linear-gradient(180deg,
      var(--av-navy-500) 0%,
      var(--av-navy-600) 30%,
      var(--av-navy-700) 64%,
      var(--av-navy-800) 100%);
}

.av-body::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -9;
  pointer-events: none;
  animation: av-twinkle 9s ease-in-out infinite;
  background-image:
    radial-gradient(1.4px 1.4px at 12% 18%,  rgba(255,255,255,.75), transparent 60%),
    radial-gradient(1.1px 1.1px at 78% 9%,   rgba(255,255,255,.55), transparent 60%),
    radial-gradient(1.6px 1.6px at 34% 62%,  rgba(255,246,221,.70), transparent 60%),
    radial-gradient(1.0px 1.0px at 88% 44%,  rgba(255,255,255,.50), transparent 60%),
    radial-gradient(1.3px 1.3px at 6%  73%,  rgba(255,246,221,.60), transparent 60%),
    radial-gradient(1.1px 1.1px at 62% 88%,  rgba(255,255,255,.45), transparent 60%),
    radial-gradient(1.5px 1.5px at 49% 31%,  rgba(255,255,255,.55), transparent 60%),
    radial-gradient(1.0px 1.0px at 92% 77%,  rgba(255,246,221,.50), transparent 60%),
    radial-gradient(1.2px 1.2px at 21% 41%,  rgba(255,255,255,.40), transparent 60%),
    radial-gradient(1.4px 1.4px at 70% 67%,  rgba(255,246,221,.45), transparent 60%),
    radial-gradient(5px 5px at 9%  28%, rgba(226,196,116,.42), transparent 70%),
    radial-gradient(4px 4px at 93% 21%, rgba(226,196,116,.32), transparent 70%),
    radial-gradient(6px 6px at 16% 84%, rgba(226,196,116,.36), transparent 70%),
    radial-gradient(4px 4px at 83% 91%, rgba(226,196,116,.28), transparent 70%);
}

/* ---------- section ----------
   Each section carries its own top-light / bottom-dark gradient —
   that repetition is exactly how the reference artwork reads. */
/* transparent: the fixed backdrop above shows through every section */
.av-section {
  position: relative;
  padding: 30px 0 18px;
}
/* the opening section keeps room under the top of the screen */
.av-section:first-of-type { padding-top: 44px; }

/* a repeat-header section sits closer to the one above it */
.av-section--tight { padding-top: 22px; }

/* starfield + warm bokeh, baked as gradients so there is no JS and
   no layout cost. Two layers at different scales avoid visible tiling. */
/* decorative concentric arcs, bottom-left and top-right */
.av-section--arcs > .av-arc {
  position: fixed;
  z-index: -1;
  pointer-events: none;
  border-radius: 50%;
  border: 1px solid rgba(226, 196, 116, .13);
}
.av-section--arcs:not(:first-of-type) > .av-arc { display: none; }

.av-arc--bl { width: 460px; height: 460px; left: -250px; bottom: -190px; }
.av-arc--bl::before,
.av-arc--bl::after {
  content: "";
  position: absolute;
  border-radius: 50%;
  border: 1px solid rgba(226, 196, 116, .10);
}
.av-arc--bl::before { inset: 42px; }
.av-arc--bl::after  { inset: 86px; }

.av-arc--tr { width: 380px; height: 380px; right: -215px; top: -150px; }
.av-arc--tr::before {
  content: "";
  position: absolute;
  inset: 48px;
  border-radius: 50%;
  border: 1px solid rgba(226, 196, 116, .10);
}

.av-container {
  width: 100%;
  max-width: var(--av-measure);
  margin: 0 auto;
  padding: 0 var(--av-gutter);
  position: relative;
  z-index: 1;
}


/* ---------- type ---------- */
.av-display {
  font-family: var(--av-font-display);
  font-weight: 500;
  line-height: 1.14;
  letter-spacing: .005em;
  background: var(--av-text-sheen);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

.av-display--xl { font-size: clamp(26px, 7.6vw, 40px); }
.av-display--lg { font-size: clamp(20px, 5.7vw, 30px); }
.av-display--md { font-size: clamp(19px, 5.4vw, 27px); }

.av-eyebrow {
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: .20em;
  text-transform: uppercase;
  color: var(--av-gold-400);
}

.av-lede {
  font-size: 15px;
  line-height: 1.6;
  color: var(--av-text-dim);
}

.av-fine {
  font-size: 12.5px;
  line-height: 1.65;
  color: var(--av-text-faint);
}

.av-gold-text {
  background: var(--av-text-sheen);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}


/* ---------- glass card ----------
   Fill sampled from the artwork: a champagne tint at ~13%, lifted to
   ~30% along the top-left edge where the light falls. */
/* Every card is the same deep panel. The colour is sampled from the
   artwork's own backdrop, which is what lets a picture sit inside one with
   no seam — and keeping all cards identical is what makes the set read as
   one surface rather than a mix of materials. */
.av-card {
  position: relative;
  border-radius: var(--av-radius);
  padding: 20px;
  background: var(--av-surface);
  border: 1px solid var(--av-surface-line);
  box-shadow:
    0 16px 36px rgba(6, 8, 32, .45),
    inset 0 1px 0 rgba(255, 248, 232, .14);
}



/* ---------- buttons ---------- */
.av-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  /* the artwork draws this at 40px; 48 is the smallest comfortable tap
     target, and the extra 8px is invisible next to the reference */
  min-height: 48px;
  padding: 0 26px;
  border-radius: var(--av-radius-pill);
  font-size: 15.5px;
  font-weight: 600;
  letter-spacing: .01em;
  transition: transform .18s ease, box-shadow .18s ease, filter .18s ease;
}

.av-btn:active { transform: translateY(1px) scale(.995); }

.av-btn--primary {
  color: #2a1e06;
  background: var(--av-sheen);
  box-shadow:
    0 10px 26px rgba(196, 154, 74, .34),
    inset 0 1px 0 rgba(255, 255, 255, .45),
    inset 0 -1px 0 rgba(104, 76, 30, .30);
}
.av-btn--primary:hover { filter: brightness(1.05); }

/* opaque, like the bars: a 7% wash let the page show through and the
   button read as a faint outline rather than something you can press */
.av-btn--ghost {
  color: var(--av-gold-200);
  background: var(--av-chrome);
  border: 1px solid rgba(240, 214, 150, .44);
  box-shadow: 0 8px 18px rgba(6, 8, 32, .34),
              inset 0 1px 0 rgba(255, 248, 232, .14);
}
.av-btn--ghost:hover { filter: brightness(1.16); border-color: rgba(240, 214, 150, .66); }

.av-btn__chev { font-size: 17px; opacity: .8; }


/* ---------- misc parts ---------- */
.av-rule {
  height: 1px;
  border: 0;
  background: linear-gradient(90deg,
      transparent, rgba(226, 196, 116, .38), transparent);
}

/* rule with three dots in the middle, as in the footer artwork */
.av-rule-dots {
  display: flex;
  align-items: center;
  gap: 14px;
  color: rgba(226, 196, 116, .55);
}
.av-rule-dots::before,
.av-rule-dots::after {
  content: "";
  flex: 1;
  height: 1px;
  background: linear-gradient(90deg,
      transparent, rgba(226, 196, 116, .34), transparent);
}
.av-rule-dots i {
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: currentColor;
  display: inline-block;
}

/* the "Secure 256-bit encrypted platform" line that closes most screens */
.av-note {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  text-align: center;
  font-size: 11px;
  color: var(--av-text-faint);
}
.av-note svg { width: 11px; height: 11px; flex: none; }

.av-dots { display: flex; gap: 6px; justify-content: center; }
.av-dots span {
  width: 6px; height: 6px;
  border-radius: 50%;
  background: rgba(226, 196, 116, .30);
}
.av-dots span[data-on] { background: var(--av-gold-400); }


/* ---------- auth pages (login / register) ---------- */
/* The artwork sits the card high on the screen and pins the security
   line to the bottom edge, so the two auto margins split the slack. */
.av-auth {
  position: relative;
  isolation: isolate;
  min-height: 100svh;
  display: flex;
  flex-direction: column;
  padding: 34px 0 24px;
}
.av-auth__body { margin-top: 8px; }
.av-auth__foot { margin-top: auto; padding-top: 28px; }

.av-auth__head { text-align: center; }

.av-shield {
  width: 78px;
  height: 78px;
  margin: 0 auto 14px;
  filter: drop-shadow(0 12px 28px rgba(214, 170, 92, .42));
}

.av-auth__sub {
  margin-top: 8px;
  font-size: 13px;
  line-height: 1.45;
  color: var(--av-text-dim);
}

.av-auth__card { margin-top: 24px; padding: 18px 15px 19px; }

/* --- a field row: round gold icon, small gold label, input beneath --- */
.av-field {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 6px 13px 6px 6px;
  border-radius: var(--av-radius-pill);
  border: 1px solid rgba(226, 196, 116, .34);
  background: rgba(var(--av-tint), .05);
  transition: border-color .2s ease, box-shadow .2s ease;
}
.av-field + .av-field { margin-top: 11px; }
.av-field:focus-within {
  border-color: rgba(242, 216, 154, .66);
  box-shadow: 0 0 0 3px rgba(226, 196, 116, .13);
}


.av-field__main { flex: 1; min-width: 0; }

.av-field__label {
  display: block;
  font-size: 9.5px;
  font-weight: 700;
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--av-gold-400);
}

.av-field input {
  display: block;
  width: 100%;
  padding: 1px 0 0;
  border: 0;
  outline: none;
  background: none;
  font-size: 14.5px;
  color: var(--av-text);
}
.av-field input::placeholder { color: var(--av-text-faint); }

/* Chrome paints autofilled inputs opaque white — repaint them by hand */
.av-field input:-webkit-autofill,
.av-field input:-webkit-autofill:hover,
.av-field input:-webkit-autofill:focus {
  -webkit-text-fill-color: var(--av-text);
  caret-color: var(--av-text);
  transition: background-color 9999s ease-out 0s;
}

.av-field__eye {
  flex: none;
  width: 30px;
  height: 30px;
  display: grid;
  place-items: center;
  color: var(--av-gold-400);
}
.av-field__eye svg { width: 19px; height: 19px; }
.av-field__eye:hover { color: var(--av-gold-200); }

/* --- notices --- */
.av-notice {
  margin-bottom: 14px;
  padding: 10px 13px;
  border-radius: var(--av-radius-sm);
  font-size: 12.5px;
  line-height: 1.45;
  border: 1px solid rgba(235, 120, 120, .40);
  background: rgba(150, 44, 44, .22);
  color: #f6d6d6;
}
.av-notice--warn {
  border-color: rgba(226, 196, 116, .45);
  background: rgba(120, 92, 36, .22);
  color: var(--av-gold-200);
}

.av-auth__alt {
  margin-top: 14px;
  text-align: center;
  font-size: 12.5px;
  color: var(--av-text-dim);
}
.av-auth__alt a { font-weight: 600; color: var(--av-gold-200); }
.av-auth__alt a:hover { color: var(--av-gold-100); }

/* --- slowly drifting gears and coins behind the card ---
   Fixed, not absolute: they belong to the backdrop, so they hold still
   while the content scrolls over them. */
.av-decor {
  position: fixed;
  inset: 0;
  z-index: -1;
  overflow: hidden;
  pointer-events: none;
}
/* low enough to stay behind the card, high enough that the gold still
   reads as gold rather than grey */
.av-decor > * { position: absolute; opacity: .34; }

@keyframes av-spin  { to { transform: rotate(360deg) } }
@keyframes av-bobL  { 0%,100% { transform: translateY(0) rotate(-8deg) } 50% { transform: translateY(-16px) rotate(6deg) } }
@keyframes av-bobR  { 0%,100% { transform: translateY(0) rotate(7deg) }  50% { transform: translateY(-13px) rotate(-6deg) } }

.av-decor .d-spin { animation: av-spin 46s linear infinite; }
.av-decor .d-spin-slow { animation: av-spin 72s linear infinite reverse; }
.av-decor .d-bob-l { animation: av-bobL 11s ease-in-out infinite; }
.av-decor .d-bob-r { animation: av-bobR 13s ease-in-out infinite; }


/* ---------- signed-in app shell ---------- */
.av-app {
  position: relative;
  isolation: isolate;
  min-height: 100svh;
  padding: 16px 0 108px;            /* room for the floating tab bar */
  /* the signed-in screens run wider than the marketing pages — the
     artwork insets them by ~10% rather than the landing page's 13.5% */
  --av-gutter: clamp(16px, 10%, 40px);
}

/* --- app header ---
   Not a pill in a bar: the brand sits on the page itself, a gold hairline
   closes it off, and the reassurance line runs beneath as a thin ribbon of
   three marks. Less boxed-in, and it gives the brand somewhere to live. */
.av-appbar {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 2px 2px 11px;
}

.av-appbar__brand {
  flex: 1;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 8px;
}
.av-appbar__mark { width: 30px; height: 30px; flex: none; }
.av-appbar__name { font-size: 18px; }

/* a bare glyph, not a button in a circle */
.av-bell {
  position: relative;
  flex: none;
  width: 30px;
  height: 30px;
  display: grid;
  place-items: center;
}
.av-bell svg { width: 21px; height: 21px; }
.av-bell__dot {
  position: absolute;
  top: -1px;
  right: -2px;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: 999px;
  display: grid;
  place-items: center;
  background: #d8504f;
  border: 2px solid var(--av-navy-600);
  font-size: 9px;
  font-weight: 700;
  color: #fff;
}

.av-appbar__rule {
  height: 1px;
  border: 0;
  background: linear-gradient(90deg,
      rgba(226, 196, 116, .46), rgba(226, 196, 116, .12) 62%, transparent);
}

/* the wordmark, set from the domain: a spaced "PHILIPPINE" between gold
   hairlines over "Loan Solutions" in the display serif. Size it with
   font-size on .av-word; everything else scales from that. */
.av-word {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  line-height: 1;
  font-size: 17px;
}
.av-word small {
  display: flex;
  align-items: center;
  gap: .55em;
  margin-bottom: .32em;
  padding-left: .5em;
  font-family: var(--av-font-ui);
  font-size: .4em;
  font-weight: 700;
  letter-spacing: .5em;
  text-transform: uppercase;
  color: var(--av-gold-400);
}
.av-word small::before,
.av-word small::after {
  content: "";
  width: 1.8em;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(226, 196, 116, .7));
}
.av-word small::after { background: linear-gradient(90deg, rgba(226, 196, 116, .7), transparent); }
.av-word b {
  font-family: var(--av-font-display);
  font-weight: 500;
  letter-spacing: .01em;
  white-space: nowrap;
  background: var(--av-text-sheen);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
/* in the app header it sits beside the mark, so it reads from the left */
.av-word--start { align-items: flex-start; }
.av-word--start small { padding-left: 0; }
.av-word--start small::before { display: none; }

/* the reassurance strip: a pulsing "Protected" light and a running ticker */
.av-ticker {
  position: relative;
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 10px 0 16px;
  padding: 5px 5px 5px 5px;
  border-radius: var(--av-radius-pill);
  border: 1px solid var(--av-chrome-line);
  background: var(--av-chrome);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .06), 0 10px 22px -14px rgba(2, 4, 22, .9);
  overflow: hidden;
}
/* a slow gold glint sweeping across the strip */
.av-ticker::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(100deg, transparent 35%, rgba(255, 236, 190, .12) 50%, transparent 65%);
  background-size: 250% 100%;
  animation: av-ticker-glint 6s ease-in-out infinite;
  pointer-events: none;
}
.av-ticker__live {
  position: relative;
  z-index: 1;
  flex: none;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px 10px 5px 9px;
  border-radius: var(--av-radius-pill);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .04em;
  color: #2a1e06;
  background: var(--av-sheen);
  box-shadow: 0 4px 12px rgba(196, 154, 74, .35), inset 0 1px 0 rgba(255, 255, 255, .5);
}
.av-ticker__live i {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: #1f9d5c;
  box-shadow: 0 0 0 0 rgba(31, 157, 92, .6);
  animation: av-ticker-pulse 1.8s ease-out infinite;
}
.av-ticker__view {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  -webkit-mask: linear-gradient(90deg, transparent, #000 14%, #000 86%, transparent);
          mask: linear-gradient(90deg, transparent, #000 14%, #000 86%, transparent);
}
.av-ticker__track {
  display: flex;
  width: max-content;
  animation: av-ticker-run 16s linear infinite;
}
.av-ticker:hover .av-ticker__track { animation-play-state: paused; }
.av-ticker__group { display: flex; flex: none; }
.av-ticker__item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0 14px 0 4px;
  font-size: 11.5px;
  font-weight: 600;
  white-space: nowrap;
  color: var(--av-gold-200);
}
.av-ticker__item::after {
  content: "";
  width: 4px;
  height: 4px;
  margin-left: 10px;
  transform: rotate(45deg);
  background: rgba(226, 196, 116, .6);
}
.av-ticker__item svg {
  width: 14px;
  height: 14px;
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
@keyframes av-ticker-run   { to { transform: translateX(-50%); } }
@keyframes av-ticker-pulse { 70% { box-shadow: 0 0 0 7px rgba(31, 157, 92, 0); } 100% { box-shadow: 0 0 0 0 rgba(31, 157, 92, 0); } }
@keyframes av-ticker-glint { 0%, 100% { background-position: 120% 0; } 50% { background-position: -20% 0; } }
@media (prefers-reduced-motion: reduce) {
  .av-ticker__track, .av-ticker::after, .av-ticker__live i { animation: none; }
}

/* --- inner-page header: a back pill and a centred title --- */
.av-pagebar {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 10px;
  margin-bottom: 18px;
}
.av-pagebar__back {
  justify-self: start;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 7px 14px 7px 11px;
  border-radius: var(--av-radius-pill);
  border: 1px solid var(--av-chrome-line);
  background: var(--av-chrome);
  font-size: 12.5px;
  font-weight: 500;
  color: var(--av-gold-200);
}
.av-pagebar__back svg { width: 14px; height: 14px; }
.av-pagebar__back:hover { filter: brightness(1.12); }
.av-pagebar__title {
  font-family: var(--av-font-display);
  font-size: clamp(21px, 5.6vw, 26px);
  font-weight: 500;
  white-space: nowrap;
  background: var(--av-text-sheen);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

/* --- small labelled pill, used for status and feature chips --- */
.av-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border-radius: var(--av-radius-pill);
  border: 1px solid rgba(226, 196, 116, .30);
  background: rgba(var(--av-tint), .07);
  font-size: 11.5px;
  font-weight: 600;
  color: var(--av-gold-200);
  white-space: nowrap;
}
.av-chip svg { width: 13px; height: 13px; flex: none; }
.av-chip--gold {
  border-color: rgba(240, 214, 150, .62);
  background: var(--av-sheen);
  color: #2a1e06;
}
.av-chip--live { color: var(--av-text-dim); }
.av-chip__led {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: #49c67d;
  box-shadow: 0 0 0 3px rgba(73, 198, 125, .18);
  flex: none;
}

/* --- the 2x2 trust grid --- */
.av-mini-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.av-mini {
  padding: 13px 12px 14px;
  border-radius: var(--av-radius-sm);
  border: 1px solid rgba(226, 196, 116, .22);
  background: rgba(var(--av-tint), .05);
}
.av-mini h4 { font-size: 13px; font-weight: 600; color: var(--av-text); }
.av-mini p { margin-top: 2px; font-size: 11px; color: var(--av-text-faint); }

/* --- the gold balance card, styled as a real payment card --- */
.av-goldcard {
  position: relative;
  overflow: hidden;
  border-radius: var(--av-radius);
  padding: 16px 16px 15px;
  min-height: 158px;
  display: flex;
  flex-direction: column;
  background: linear-gradient(108deg,
      #9a7540 0%, #c6a46c 18%, #f3e3c3 38%, #e0c895 52%,
      #c9a670 68%, #a98650 86%, #8d6b38 100%);
  border: 1px solid rgba(255, 244, 214, .55);
  box-shadow: 0 16px 34px rgba(6, 8, 32, .5),
              inset 0 1px 0 rgba(255, 255, 255, .6);
}
/* a slow sheen travelling across the metal */
.av-goldcard::after {
  content: "";
  position: absolute;
  top: -40%;
  bottom: -40%;
  width: 36%;
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .42), transparent);
  transform: skewX(-18deg);
  animation: av-sheen 7s ease-in-out infinite;
  pointer-events: none;
}
.av-goldcard > * { position: relative; z-index: 1; }

.av-goldcard__top { display: flex; align-items: flex-start; gap: 12px; }
.av-goldcard__chip { width: 44px; height: 34px; flex: none; }
.av-goldcard__meta { margin-left: auto; text-align: right; }
.av-goldcard__tag {
  display: inline-flex;
  align-items: center;
  padding: 5px 12px;
  border-radius: var(--av-radius-pill);
  background: rgba(32, 24, 8, .34);
  border: 1px solid rgba(255, 246, 221, .34);
  font-size: 11px;
  font-weight: 600;
  white-space: nowrap;
  color: #fff6dd;
}
.av-goldcard__name {
  margin-top: 9px;
  font-size: 17px;
  font-weight: 700;
  color: #241a06;
}
.av-goldcard__sub { font-size: 12.5px; color: rgba(40, 29, 8, .72); }
.av-goldcard__amt {
  margin-top: auto;
  padding-top: 14px;
  font-size: 32px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: .01em;
  color: #241a06;
  text-shadow: 0 1px 0 rgba(255, 255, 255, .45);
}

/* --- a large figure entry, for amounts --- */
.av-amount {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px 15px 12px;
  border-radius: var(--av-radius-sm);
  border: 1px solid rgba(226, 196, 116, .34);
  background: rgba(var(--av-tint), .06);
}
.av-amount input {
  flex: 1;
  min-width: 0;
  width: 100%;
  border: 0;
  outline: none;
  background: none;
  text-align: center;
  font-size: 30px;
  font-weight: 700;
  color: #fff;
  border-bottom: 1px solid rgba(226, 196, 116, .5);
  padding-bottom: 5px;
}
.av-amount input::placeholder { color: rgba(255, 255, 255, .42); }
.av-amount input::-webkit-outer-spin-button,
.av-amount input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.av-amount input[type="number"] { -moz-appearance: textfield; }
.av-amount__cur { flex: none; font-size: 24px; color: var(--av-gold-300); }

/* a plain bordered field, for codes */
.av-code {
  width: 100%;
  padding: 13px 15px;
  border-radius: var(--av-radius-sm);
  border: 1px solid rgba(226, 196, 116, .34);
  background: rgba(var(--av-tint), .06);
  font-size: 15px;
  color: var(--av-text);
  outline: none;
}
.av-code::placeholder { color: var(--av-text-faint); }
.av-code:focus { border-color: rgba(242, 216, 154, .66); }

.av-label {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 9px;
}
.av-label b {
  flex: 1;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--av-gold-300);
}
.av-hint { margin-top: 7px; font-size: 11.5px; color: var(--av-text-faint); }
.av-hint--bad { color: #f0b4b4; }

/* --- a solid gold bar, for a single headline figure --- */
.av-goldbar {
  display: flex;
  align-items: center;
  gap: 11px;
  padding: 13px 16px;
  border-radius: var(--av-radius-pill);
  background: var(--av-sheen);
  box-shadow: 0 10px 24px rgba(196, 154, 74, .30),
              inset 0 1px 0 rgba(255, 255, 255, .5);
}
.av-goldbar svg { width: 21px; height: 21px; flex: none; }
.av-goldbar b {
  flex: 1;
  font-size: 14.5px;
  font-weight: 700;
  letter-spacing: .05em;
  text-transform: uppercase;
  color: #241a06;
}
.av-goldbar span { font-size: 19px; font-weight: 700; color: #241a06; }

/* --- two-up tiles, for a menu of destinations ---
   These sit straight on the page, not inside a card, so they need the full
   panel surface to read as objects: a faint wash over the brighter page
   disappeared into it. The icon well carries actual gold so each tile has
   colour of its own. */
.av-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 11px; }
.av-tile {
  position: relative;
  display: block;
  padding: 14px 13px 15px;
  border-radius: var(--av-radius-sm);
  border: 1px solid var(--av-surface-line);
  background: var(--av-surface);
  box-shadow: 0 10px 22px rgba(6, 8, 32, .40),
              inset 0 1px 0 rgba(255, 248, 232, .12);
  transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease;
}
.av-tile:hover {
  transform: translateY(-2px);
  border-color: rgba(240, 214, 150, .7);
  box-shadow: 0 14px 28px rgba(6, 8, 32, .5),
              inset 0 1px 0 rgba(255, 248, 232, .2);
}
.av-tile:active { transform: translateY(0); }

/* line icons in a gold-rimmed well (profile tiles, stat cards) */
.av-tile__ico,
.av-ico,
.av-row__ico,
.av-mini__ico,
.av-field__ico {
  width: 42px;
  height: 42px;
  flex: none;
  margin-bottom: 12px;
  border-radius: 13px;
  display: grid;
  place-items: center;
  border: 1px solid transparent;
  background:
    radial-gradient(90% 70% at 50% 0%, rgba(236, 200, 126, .22), transparent 70%) padding-box,
    linear-gradient(160deg, #1f2768 0%, #0d1240 100%) padding-box,
    linear-gradient(150deg, #f6e3b0 0%, #b8883f 42%, #6d5126 68%, #e8c983 100%) border-box;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .10),
              0 6px 14px -6px rgba(2, 4, 22, .8);
  color: #ecd29a;
}
.av-tile__ico svg,
.av-ico svg,
.av-row__ico svg,
.av-mini__ico svg,
.av-field__ico svg {
  width: 21px;
  height: 21px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.6;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.av-row__ico,
.av-field__ico { width: 38px; height: 38px; margin-bottom: 0; border-radius: 12px; }
.av-row__ico svg,
.av-field__ico svg { width: 18px; height: 18px; }
.av-ico--green { color: #8ee6b4; }
.av-stat__ico { margin-bottom: 0; }

.av-tile__go {
  position: absolute;
  top: 15px;
  right: 13px;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  border: 1px solid rgba(236, 210, 154, .22);
  color: rgba(236, 210, 154, .7);
  transition: color .18s ease, border-color .18s ease, transform .18s ease;
}
.av-tile__go svg { width: 13px; height: 13px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.av-tile:hover .av-tile__go { color: #f3dfb0; border-color: rgba(236, 210, 154, .55); transform: translate(1px, -1px); }

.av-tile h3 {
  font-size: 13.5px;
  font-weight: 600;
  line-height: 1.25;
  background: var(--av-text-sheen);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.av-tile p { margin-top: 2px; font-size: 11px; line-height: 1.35; color: var(--av-text-dim); }

.av-sectionlabel {
  margin: 20px 0 11px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--av-gold-300);
}

/* --- floating tab bar with a raised Apply button --- */
.av-tabbar {
  position: fixed;
  left: 50%;
  bottom: 14px;
  transform: translateX(-50%);
  z-index: 40;
  width: calc(100% - 28px);
  max-width: 412px;
  height: 62px;
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  align-items: center;
  border-radius: 26px;
  border: 1px solid var(--av-chrome-line);
  background: var(--av-chrome);
  box-shadow: 0 16px 38px rgba(6, 8, 32, .52);
  padding-bottom: env(safe-area-inset-bottom);
}
.av-tab {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
  font-size: 10.5px;
  color: var(--av-text-faint);
}
.av-tab svg { width: 21px; height: 21px; }
.av-tab[aria-current] { color: var(--av-gold-200); }
.av-tab[aria-current]::after {
  content: "";
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--av-gold-300);
}

/* the Apply button rises out of the bar */
.av-tab--fab { position: relative; }
.av-tab--fab .av-fab {
  position: absolute;
  left: 50%;
  bottom: 14px;
  transform: translateX(-50%);
  width: 56px;
  height: 56px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: var(--av-sheen);
  color: #2a1e06;
  box-shadow: 0 10px 24px rgba(196, 154, 74, .46),
              inset 0 1px 0 rgba(255, 255, 255, .5);
}
.av-tab--fab .av-fab svg { width: 25px; height: 25px; }
.av-tab--fab span { margin-top: 30px; }


/* ---------- wider screens ----------
   The product is a phone app; on a desktop it keeps the very same portrait
   column, simply centred with the page colour around it. Nothing reflows
   into rows, so one layout is designed, drawn and tested — not two. */
@media (min-width: 900px) {
  /* the whole phone column is drawn about 14% larger on a computer, so it
     reads at a comfortable size instead of a small strip in the middle;
     full-height screens divide the zoom back out so they still fit */
  html { zoom: 1.14; }
  .av-auth,
  .av-app { min-height: calc(100svh / 1.14); }

  .av-section { padding: 40px 0 26px; }
  .av-section:first-of-type { padding-top: 64px; }

  /* the arcs can breathe into the space either side of the column */
  .av-arc--bl { width: 760px; height: 760px; left: -340px; bottom: -300px; }
  .av-arc--tr { width: 620px; height: 620px; right: -280px; top: -230px; }
}

/* ---------- list-page parts ----------
   Shared by notifications, transactions and the payment schedule. */

/* --- segmented filter: a recessed track, the current option a gold pill --- */
.av-segment {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  gap: 4px;
  padding: 4px;
  border-radius: var(--av-radius-pill);
  background: rgba(2, 4, 24, .42);
  border: 1px solid rgba(255, 255, 255, .08);
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, .45), 0 1px 0 rgba(255, 255, 255, .05);
}
.av-segment button {
  min-height: 38px;
  border-radius: var(--av-radius-pill);
  font-size: 13.5px;
  font-weight: 600;
  color: var(--av-text-dim);
  transition: color .18s ease, background .18s ease;
}
.av-segment button:hover { color: var(--av-gold-200); }
.av-segment button[aria-pressed="true"] {
  color: #241a06;
  background: var(--av-sheen);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .55), 0 2px 0 #7d5e2f,
              0 6px 14px -4px rgba(196, 154, 74, .45);
}

/* --- empty state: artwork, a serif line, one sentence, one way out --- */
.av-empty { text-align: center; padding: 22px 18px 24px; }
/* several source images run coins and gears off their own edges; an oval
   fade dissolves those cuts so no straight image border ever shows */
.av-empty__art {
  width: min(76%, 250px);
  margin: 0 auto 6px;
  -webkit-mask-image: radial-gradient(closest-side, #000 64%, transparent 100%);
          mask-image: radial-gradient(closest-side, #000 64%, transparent 100%);
}
.av-empty h2 {
  font-family: var(--av-font-display);
  font-size: clamp(22px, 6vw, 27px);
  font-weight: 500;
  line-height: 1.2;
  background: var(--av-text-sheen);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.av-empty p {
  margin: 8px auto 0;
  max-width: 290px;
  font-size: 13.5px;
  line-height: 1.55;
  color: var(--av-text-dim);
}
.av-empty .av-btn { margin: 20px auto 0; width: auto; padding: 0 30px; display: inline-flex; }

/* --- two figures side by side --- */
.av-statpair { display: grid; grid-template-columns: 1fr 1fr; gap: 11px; }
.av-stat {
  display: flex;
  align-items: center;
  gap: 11px;
  padding: 14px 13px;
}
.av-stat__lbl { display: block; font-size: 12px; color: var(--av-text-dim); }
.av-stat__val {
  display: block;
  margin-top: 1px;
  font-size: 21px;
  font-weight: 700;
  line-height: 1.15;
  color: #fff;
  white-space: nowrap;
}

/* --- two buttons side by side --- */
.av-btnpair { display: grid; grid-template-columns: 1fr 1fr; gap: 11px; }
.av-btnpair .av-btn { min-width: 0; padding: 0 14px; }

/* --- list rows inside a card --- */
.av-row {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 13px 0;
}
.av-row + .av-row { border-top: 1px solid rgba(255, 255, 255, .07); }
.av-row__main { flex: 1; min-width: 0; }
.av-row__title { display: block; font-size: 14px; font-weight: 600; color: var(--av-text); }
.av-row__sub { display: block; margin-top: 1px; font-size: 11.5px; color: var(--av-text-faint); }
.av-row__body { display: block; margin-top: 5px; font-size: 13px; line-height: 1.5; color: var(--av-text-dim); }
.av-row__end { flex: none; text-align: right; }
.av-row__amt { display: block; font-size: 15px; font-weight: 700; color: var(--av-gold-200); }

.av-state {
  display: inline-block;
  margin-top: 3px;
  padding: 3px 9px;
  border-radius: var(--av-radius-pill);
  font-size: 10.5px;
  font-weight: 600;
  letter-spacing: .03em;
  border: 1px solid rgba(240, 214, 150, .3);
  color: var(--av-gold-200);
}
.av-state--good { border-color: rgba(109, 205, 150, .45); color: #8ddcae; }
.av-state--bad  { border-color: rgba(226, 120, 120, .45); color: #f0b4b4; }

/* a quiet line for a filter that matches nothing */
.av-nomatch { padding: 22px 0 8px; text-align: center; font-size: 13px; color: var(--av-text-faint); }

/* ============================================================
   SURFACE TREATMENT
   What separates a premium surface from a dark box with a gold line:
   - the edge catches light: a gradient border, bright gold at the top-left
     fading to almost nothing, instead of one uniform hairline
   - a soft sheen across the top of every raised surface
   - depth from layered shadow, plus a faint gold spill off the top edge
   - inputs sit INTO the card (inset wells), content tiles sit ON it
   - icons are struck gold coins, not outlines in a circle
   - gold buttons have a lip, so they read as pressable objects
   ============================================================ */
:root {
  --av-sheen-top: linear-gradient(180deg,
      rgba(255, 255, 255, .075) 0%, rgba(255, 255, 255, .02) 22%, rgba(255, 255, 255, 0) 46%);
  --av-edge: linear-gradient(150deg,
      rgba(252, 232, 186, .92) 0%, rgba(224, 186, 112, .44) 18%,
      rgba(255, 255, 255, .11) 42%, rgba(255, 255, 255, .06) 68%,
      rgba(214, 178, 108, .34) 100%);
  --av-coin: radial-gradient(130% 130% at 28% 18%,
      #fff5dc 0%, #ebd09c 30%, #c9a466 62%, #94703c 100%);
  --av-glass: linear-gradient(165deg, #1b2263 0%, #121849 100%);
}

/* --- the light-catching edge, shared by every raised surface --- */
.av-card,
.av-tile,
.av-btn--ghost,
.av-pagebar__back { position: relative; }
.av-card,
.av-tile { isolation: isolate; }

.av-card::after,
.av-tile::after,
.av-btn--ghost::after,
.av-pagebar__back::after,
.av-tabbar::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 3;
  border-radius: inherit;
  padding: 1px;
  background: var(--av-edge);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
          mask-composite: exclude;
  pointer-events: none;
}

/* --- cards --- */
.av-card {
  border: 0;
  border-radius: 22px;
  background: var(--av-sheen-top), var(--av-surface);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .06),
    0 2px 4px rgba(0, 0, 0, .30),
    0 26px 50px -18px rgba(2, 4, 22, .85),
    0 -10px 30px -18px rgba(236, 200, 126, .30);
}

/* --- tiles that sit straight on the page --- */
.av-tile {
  border: 0;
  border-radius: 18px;
  background: var(--av-sheen-top), var(--av-surface);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .06),
    0 16px 30px -14px rgba(2, 4, 22, .8);
}
.av-tile:hover {
  transform: translateY(-3px);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .08),
    0 22px 36px -14px rgba(2, 4, 22, .9),
    0 -8px 24px -14px rgba(236, 200, 126, .35);
}

/* --- small raised glass inside a card --- */
.av-mini {
  border: 1px solid rgba(255, 255, 255, .07);
  border-radius: 16px;
  background: linear-gradient(180deg, rgba(255, 255, 255, .055), rgba(255, 255, 255, .015));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .07), 0 8px 16px -10px rgba(0, 0, 0, .6);
}


/* --- inputs sit INTO the card --- */
.av-field,
.av-amount,
.av-code {
  background: rgba(2, 4, 24, .42);
  border: 1px solid rgba(255, 255, 255, .08);
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, .45), 0 1px 0 rgba(255, 255, 255, .05);
}
.av-field:focus-within,
.av-amount:focus-within,
.av-code:focus {
  border-color: rgba(240, 214, 150, .7);
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, .45), 0 0 0 3px rgba(226, 196, 116, .16);
}

/* --- buttons --- */
.av-btn--primary {
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .6),
    inset 0 -1px 0 rgba(110, 80, 30, .35),
    0 3px 0 #7d5e2f,
    0 12px 24px -6px rgba(196, 154, 74, .5);
}
.av-btn--primary:active {
  transform: translateY(2px);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .5),
    0 1px 0 #7d5e2f,
    0 6px 14px -4px rgba(196, 154, 74, .4);
}

.av-btn--ghost {
  border: 0;
  color: #f3e3bf;
  background: var(--av-sheen-top), var(--av-glass);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .08), 0 12px 24px -12px rgba(2, 4, 22, .8);
}
.av-btn--ghost:hover { filter: brightness(1.12); }

.av-pagebar__back {
  border: 0;
  background: var(--av-sheen-top), var(--av-glass);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .08), 0 8px 18px -10px rgba(2, 4, 22, .8);
}

.av-goldbar {
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .6),
    inset 0 -1px 0 rgba(110, 80, 30, .35),
    0 3px 0 #7d5e2f,
    0 14px 28px -8px rgba(196, 154, 74, .45);
}

.av-chip:not(.av-chip--gold) {
  background: rgba(255, 255, 255, .05);
  border-color: rgba(240, 214, 150, .30);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .06);
}

/* --- the tab bar: frosted glass, a lit pill behind the current tab --- */
.av-tabbar {
  border: 0;
  border-radius: 28px;
  background: var(--av-sheen-top),
              linear-gradient(180deg, rgba(30, 37, 100, .94), rgba(17, 22, 66, .96));
  -webkit-backdrop-filter: blur(16px) saturate(140%);
          backdrop-filter: blur(16px) saturate(140%);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .08), 0 18px 40px -10px rgba(2, 4, 22, .85);
}
.av-tab { position: relative; z-index: 0; height: 100%; justify-content: center; }
.av-tab[aria-current] { color: #f6e4bb; }
.av-tab[aria-current]::before {
  content: "";
  position: absolute;
  z-index: -1;
  inset: 7px 9px;
  border-radius: 16px;
  background: radial-gradient(90% 100% at 50% 25%,
      rgba(236, 200, 126, .28), rgba(236, 200, 126, .07) 70%, transparent);
  box-shadow: inset 0 1px 0 rgba(255, 240, 205, .16);
}
.av-tab[aria-current] svg { filter: drop-shadow(0 0 6px rgba(236, 200, 126, .55)); }
.av-tab[aria-current]::after { display: none; }

/* the label sits on the same baseline as the other tabs, and the larger
   coin rises clear of it instead of covering it */
.av-tab--fab { justify-content: flex-end; padding-bottom: 12px; }
.av-tab--fab span { margin-top: 0; }
.av-tab--fab .av-fab {
  width: 58px;
  height: 58px;
  bottom: 29px;
  box-shadow:
    0 0 0 5px rgba(24, 30, 84, 1),
    inset 0 1px 0 rgba(255, 255, 255, .6),
    inset 0 -2px 4px rgba(110, 80, 30, .4),
    0 4px 0 #7d5e2f,
    0 14px 28px -6px rgba(196, 154, 74, .55);
}


/* ---------- motion ----------
   Deliberately understated: a short rise-and-fade as a block scrolls in,
   a slow drift on the hero artwork, and a sheen that crosses the gold
   buttons now and then. Nothing loops fast enough to pull the eye. */

[data-reveal] {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity .72s cubic-bezier(.22, .61, .36, 1),
              transform .72s cubic-bezier(.22, .61, .36, 1);
  transition-delay: var(--av-delay, 0ms);
}
[data-reveal].is-in { opacity: 1; transform: none; }

/* no JS, no hiding: the content must never depend on the observer */
.no-js [data-reveal] { opacity: 1; transform: none; }

@keyframes av-drift {
  0%, 100% { transform: translateY(0) }
  50%      { transform: translateY(-9px) }
}
.av-drift { animation: av-drift 7.5s ease-in-out infinite; }

/* a slow highlight travelling across brushed metal */
@keyframes av-sheen {
  0%        { transform: translateX(-120%) skewX(-18deg) }
  58%, 100% { transform: translateX(260%)  skewX(-18deg) }
}
.av-btn--primary { position: relative; overflow: hidden; }
.av-btn--primary::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  width: 34%;
  background: linear-gradient(90deg,
      transparent, rgba(255, 253, 244, .50), transparent);
  animation: av-sheen 6s ease-in-out infinite;
  pointer-events: none;
}
.av-btn--primary > * { position: relative; z-index: 1; }

@keyframes av-twinkle {
  0%, 100% { opacity: .55 }
  50%      { opacity: .95 }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
  [data-reveal] { opacity: 1 !important; transform: none !important; }
}
