/*
JFS shared base styles — tokens, reset, navbar (+ About dropdown), footer,
buttons, reveal-on-scroll, section-head. Dipakai Home DAN semua halaman
About (page-vision-mission, page-meet-our-team, page-learning-materials,
page-why-choose-jfs, page-faq). Loaded lewat jfs_is_custom_template_page()
di functions.php — jangan dobel-load bareng home.css punya token sendiri.

V6 — upgrade dari Inter ke Plus Jakarta Sans + JetBrains Mono, double-bezel
card architecture, ambient mesh glow. Sesuai DESIGN.md project root.
*/

/* ===== Self-hosted fonts (variable, single file per family) ===== */
@font-face{
  font-family:'Plus Jakarta Sans';
  font-style:normal;
  font-weight:400 800;
  font-display:swap;
  src:url('../fonts/PlusJakartaSans-Variable.woff2') format('woff2');
}
@font-face{
  font-family:'JetBrains Mono';
  font-style:normal;
  font-weight:400 600;
  font-display:swap;
  src:url('../fonts/JetBrainsMono-Variable.woff2') format('woff2');
}

html{scroll-behavior:smooth;}

:root{
  --green:#16A34A;
  --green-light:#ECFDF5;
  --green-dark:#0F7A38;
  --blue:#2563EB;
  --blue-light:#EFF6FF;
  --blue-dark:#1D4ED8;
  --gradient: linear-gradient(135deg, var(--green), var(--blue));
  --navy:#0F1729;
  --n50:#F8FAFC;
  --n100:#F1F5F9;
  --n200:#E2E8F0;
  --n300:#CBD5E1;
  --n500:#64748B;
  --n700:#334155;
  --white:#FFFFFF;
  --radius:20px;
  --shadow: 0 10px 30px rgba(15,23,41,0.08);
  --shadow-lg: 0 24px 60px -12px rgba(15,23,41,0.16);

  --sans:'Plus Jakarta Sans', sans-serif;
  --mono:'JetBrains Mono', ui-monospace, monospace;
  --ease-out: cubic-bezier(0.23,1,0.32,1);
  --ease-inout: cubic-bezier(0.77,0,0.175,1);
  --ease-reveal: cubic-bezier(0.16,1,0.3,1);

  /* Radius scale (SHAPE CONSISTENCY LOCK — pakai salah satu dari 4 ini,
     jangan bikin angka baru): sm = input/dropdown kecil, md = card/button,
     lg = shell/banner besar, full = pill/circle. */
  --radius-sm:12px;
  --radius-md:20px;
  --radius-lg:28px;
  --radius-core:22px;
  --radius-full:999px;

  /* Spacing scale (dipakai konsisten di semua halaman, jangan px acak) */
  --space-1:8px;
  --space-2:16px;
  --space-3:24px;
  --space-4:32px;
  --space-5:48px;
  --space-6:64px;
  --space-7:88px;
}
.jfs-home .jfs-icon{width:1.05em; height:1.05em; display:inline-block; vertical-align:-0.15em; flex-shrink:0;}
.jfs-home *{box-sizing:border-box; margin:0; padding:0;}
.jfs-home{font-family:var(--sans); color:var(--n700); background:var(--white); line-height:1.55;}

/* AMBIENT MESH GLOW — fixed layer, pointer-events:none, TIDAK ikut scroll
   container (hindari repaint cost). Dipasang sekali di body via header-site.php. */
.jfs-ambient{position:fixed; inset:0; z-index:-1; pointer-events:none; overflow:hidden;}
.jfs-ambient .orb{position:absolute; border-radius:50%; filter:blur(80px); opacity:.28;}
.jfs-ambient .o1{width:480px; height:480px; background:radial-gradient(circle,var(--green),transparent 70%); top:-160px; left:-100px;}
.jfs-ambient .o2{width:560px; height:560px; background:radial-gradient(circle,var(--blue),transparent 70%); top:15%; right:-180px;}

/* Teks khusus screen reader (label tombol icon-only, caption tambahan).
   Tetap di accessibility tree — bukan display:none. */
.jfs-home .screen-reader-text{position:absolute; width:1px; height:1px; margin:-1px; padding:0; overflow:hidden; clip:rect(0 0 0 0); clip-path:inset(50%); white-space:nowrap; border:0;}

/* SKIP LINK — keyboard user boleh lompat langsung ke konten, wajib
   (ui-ux-pro-max Priority 1). Disembunyikan sampai di-focus. */
.jfs-home .jfs-skip-link{position:fixed; top:-100px; left:20px; z-index:200; background:var(--navy); color:#fff; padding:12px 20px; border-radius:var(--radius-full); font-size:13.5px; font-weight:700; transition:top .25s var(--ease-out);}
.jfs-home .jfs-skip-link:focus-visible{top:20px;}

/* SCROLL PROGRESS — bar tipis di atas viewport, memberi feedback posisi
   baca di halaman panjang. Motivated: orientasi, bukan dekorasi. Lebarnya
   di-drive transform:scaleX dari jfs-base.js (bukan width — hindari layout). */
.jfs-home .jfs-scroll-progress{position:fixed; top:0; left:0; right:0; height:3px; z-index:120; pointer-events:none; background:transparent;}
.jfs-home .jfs-scroll-progress span{display:block; height:100%; width:100%; transform:scaleX(0); transform-origin:left center; background:var(--gradient); border-radius:0 999px 999px 0;}

/* DOUBLE-BEZEL CARD ARCHITECTURE — outer shell (tinted, hairline) wraps
   inner core (white, inset highlight). Dipakai semua card besar. */
.jfs-home .shell{background:rgba(15,23,41,0.035); border:1px solid rgba(15,23,41,0.06); border-radius:var(--radius-lg); padding:8px; transition:transform .5s var(--ease-out), box-shadow .5s var(--ease-out);}
.jfs-home .shell:hover{transform:translateY(-6px); box-shadow:var(--shadow-lg);}
.jfs-home .shell .core{background:#fff; border-radius:var(--radius-core); box-shadow:inset 0 1px 0 rgba(255,255,255,.6); height:100%;}
.jfs-home img,.jfs-home svg{display:block; max-width:100%;}
.jfs-home a{text-decoration:none; color:inherit;}
.jfs-home ul{list-style:none;}
.jfs-home .container{max-width:1240px; margin:0 auto; padding:0 32px;}
.jfs-home .btn{display:inline-flex; align-items:center; gap:4px; font-weight:700; font-size:14.5px; padding:13px 26px; border-radius:999px; border:none; cursor:pointer; transition:transform .25s var(--ease-out), box-shadow .25s var(--ease-out), background .25s; white-space:nowrap;}
.jfs-home .btn:active{transform:scale(.97);}
/* Button-in-button: trailing icon nested dalam wrapper lingkaran sendiri.
   :has() dipakai supaya cuma tombol yang BENAR punya icon trailing yang
   dapat padding asimetris ini — tombol tanpa icon (contoh "Attend Info
   Session") tetap padding normal, tidak ikut kepotong. */
.jfs-home .btn:has(> .jfs-icon:last-child){padding:8px 8px 8px 22px;}
.jfs-home .btn > .jfs-icon:last-child{width:28px; height:28px; border-radius:50%; background:rgba(255,255,255,.2); display:flex; align-items:center; justify-content:center; flex-shrink:0; transition:transform .35s var(--ease-out); margin-left:6px;}
.jfs-home .btn-secondary > .jfs-icon:last-child{background:var(--n100); color:var(--navy);}
.jfs-home .btn-primary{background:var(--green); color:#fff; box-shadow:0 8px 20px rgba(22,163,74,0.28);}
.jfs-home .btn-primary:hover{background:var(--green-dark); transform:translateY(-2px); box-shadow:0 14px 28px rgba(22,163,74,0.34);}
.jfs-home .btn-primary:hover > .jfs-icon:last-child{transform:translate(3px,-3px);}
.jfs-home .btn-secondary{background:#fff; color:var(--navy); border:1.5px solid var(--n200);}
.jfs-home .btn-secondary:hover{border-color:var(--navy); transform:translateY(-2px);}
.jfs-home .btn-secondary:hover > .jfs-icon:last-child{transform:translate(3px,-3px);}
.jfs-home .btn-light{background:#fff; color:var(--navy);}
.jfs-home .btn-light > .jfs-icon:last-child{background:var(--n100); color:var(--navy);}
.jfs-home .btn-light:hover > .jfs-icon:last-child{transform:translate(3px,-3px);}
.jfs-home .eyebrow{display:inline-flex; align-items:center; gap:6px; font-size:12.5px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:var(--green-dark); background:var(--green-light); padding:7px 16px; border-radius:999px; margin-bottom:18px;}
.jfs-home h1,.jfs-home h2,.jfs-home h3{color:var(--navy); font-weight:800; letter-spacing:-0.02em; text-wrap:balance;}
.jfs-home section{padding:68px 0;}

/* section head generik (eyebrow + h2 + subtext center) dipakai tiap halaman */
.jfs-home .section-head{text-align:center; max-width:620px; margin:0 auto 52px;}
.jfs-home .section-head h2{font-size:32px; margin-bottom:12px;}
.jfs-home .section-head p{color:var(--n500); font-size:15px;}

/* PAGE HERO (dipakai halaman About — hero kecil, bukan hero-slider Home) */
.jfs-home .page-hero{padding:64px 0 24px;}
.jfs-home .page-hero-shell{background:var(--n50); border-radius:var(--radius-lg); padding:52px 48px; text-align:center; position:relative; overflow:hidden;}
.jfs-home .page-hero-shell::before,
.jfs-home .page-hero-shell::after{content:''; position:absolute; border-radius:50%; filter:blur(60px); opacity:.3; z-index:0; pointer-events:none;}
.jfs-home .page-hero-shell::before{width:200px; height:200px; background:var(--green); top:-60px; right:40px;}
.jfs-home .page-hero-shell::after{width:220px; height:220px; background:var(--blue); bottom:-70px; left:-50px;}
.jfs-home .page-hero-shell > *{position:relative; z-index:1;}
.jfs-home .page-hero h1{font-size:36px; margin-bottom:14px;}
.jfs-home .page-hero h1 .accent{background:linear-gradient(90deg,var(--green),var(--blue),var(--green)); background-size:200% auto; -webkit-background-clip:text; background-clip:text; color:transparent;}
.jfs-home .page-hero p{color:var(--n500); font-size:15.5px; max-width:560px; margin:0 auto;}

/* reveal-on-scroll — uses `animation`, deliberately NOT `transition`.
   Every card that combines .reveal with its own hover transition (e.g.
   .leader-card{transition:transform .3s .., box-shadow .3s ..}) would
   otherwise clobber .reveal's transition-property list wholesale (CSS
   shorthand longhands don't merge across rules — the later declaration
   wins outright), silently dropping `opacity` from the list. Net effect
   was cards popping in instantly (no fade) while only sliding, AND the
   stagger's transition-delay leaking into hover response (up to 500ms
   lag before a card would even start lifting). Using `animation` here
   is fully independent of each card's own `transition`, so neither
   problem can happen regardless of what hover CSS a card adds later.
   Still one-shot (fires once via IntersectionObserver in jfs-base.js,
   never loops) and fully covered by the prefers-reduced-motion block. */
/* Progressive enhancement: hidden state HANYA saat JS aktif (class `js`
   dipasang sedini mungkin di header). Tanpa ini, JS gagal/diblokir =
   seluruh section ikut hilang permanen. */
.js .jfs-home .reveal{opacity:0;}
.jfs-home .reveal.in{animation:jfs-reveal-in .6s cubic-bezier(.16,1,.3,1) forwards;}

/* stagger generik: dipakai apa aja grid kartu (kasih class "reveal-grid" di wrapper-nya) */
.jfs-home .reveal-grid .reveal.in{animation-delay:.03s;}
.jfs-home .reveal-grid .reveal:nth-child(2).in{animation-delay:.09s;}
.jfs-home .reveal-grid .reveal:nth-child(3).in{animation-delay:.15s;}
.jfs-home .reveal-grid .reveal:nth-child(4).in{animation-delay:.21s;}
.jfs-home .reveal-grid .reveal:nth-child(5).in{animation-delay:.27s;}
.jfs-home .reveal-grid .reveal:nth-child(6).in{animation-delay:.33s;}
.jfs-home .reveal-grid .reveal:nth-child(n+7).in{animation-delay:.38s;}
@keyframes jfs-reveal-in{from{opacity:0; transform:translateY(28px) scale(.97);} to{opacity:1; transform:translateY(0) scale(1);}}

/* link underline-draw — replaces flat color-only hover on inline text
   links (Read More / Learn More style), motivated: signals interactivity. */
.jfs-home .link-draw{position:relative;}
.jfs-home .link-draw::after{content:''; position:absolute; left:0; right:0; bottom:-2px; height:1.5px; background:currentColor; transform:scaleX(0); transform-origin:left; transition:transform .3s cubic-bezier(.16,1,.3,1);}
.jfs-home .link-draw:hover::after{transform:scaleX(1);}

/* press feedback — subtle scale-down on click. No transition declared
   here on purpose: every element using .press-card already lists
   `transform` in its own component transition (leader-card,
   value-card, etc.), so it animates using that card's own easing —
   declaring a second, different easing here would only re-trigger the
   same clobbering problem the reveal fix above just solved. */
.jfs-home .press-card:active{transform:scale(.98);}

/* HERO LOAD-IN — shared utility (first used on Home, see update.txt
   Update 24; reused here on any above-the-fold hero, e.g. page-hero on
   About pages) — content is always visible on page load, so it animates
   in immediately instead of waiting for scroll: children arrive one
   after another instead of popping in together. One-shot, no loop. */
.jfs-home .hero-in-stagger > *{opacity:0; animation:jfs-hero-rise .7s cubic-bezier(.16,1,.3,1) forwards;}
.jfs-home .hero-in-stagger > *:nth-child(1){animation-delay:.05s;}
.jfs-home .hero-in-stagger > *:nth-child(2){animation-delay:.14s;}
.jfs-home .hero-in-stagger > *:nth-child(3){animation-delay:.23s;}
.jfs-home .hero-in-stagger > *:nth-child(4){animation-delay:.32s;}
.jfs-home .hero-in-stagger > *:nth-child(5){animation-delay:.41s;}
.jfs-home .hero-in-visual{opacity:0; animation:jfs-hero-rise-scale .8s .3s cubic-bezier(.16,1,.3,1) forwards;}
@keyframes jfs-hero-rise{from{opacity:0; transform:translateY(22px);} to{opacity:1; transform:translateY(0);}}
@keyframes jfs-hero-rise-scale{from{opacity:0; transform:translateY(26px) scale(.96);} to{opacity:1; transform:translateY(0) scale(1);}}

@keyframes jfs-float{0%,100%{transform:translateY(0) scale(1);} 50%{transform:translateY(-18px) scale(1.05);}}
@keyframes jfs-gradient-shift{0%{background-position:0% 50%;} 50%{background-position:100% 50%;} 100%{background-position:0% 50%;}}
@keyframes jfs-badge-pulse{0%,100%{box-shadow:0 0 0 0 rgba(22,163,74,.28);} 50%{box-shadow:0 0 0 7px rgba(22,163,74,0);}}

/* CTA BANNER (reusable — Home & halaman About) */
.jfs-home .cta{background:var(--gradient); border-radius:var(--radius-lg); margin:0 32px; padding:60px 48px; text-align:center; color:#fff; position:relative; overflow:hidden;}
.jfs-home .cta::before,
.jfs-home .cta::after{content:''; position:absolute; border-radius:50%; background:rgba(255,255,255,.14); pointer-events:none;}
.jfs-home .cta::before{width:320px; height:320px; top:-160px; right:-80px;}
.jfs-home .cta::after{width:240px; height:240px; bottom:-130px; left:-60px; background:rgba(255,255,255,.10);}
.jfs-home .cta h2,.jfs-home .cta p,.jfs-home .cta a{position:relative; z-index:1;}
.jfs-home .cta h2{color:#fff; font-size:28px; margin-bottom:12px;}
.jfs-home .cta p{color:rgba(255,255,255,0.9); margin-bottom:26px; font-size:15px;}
.jfs-home .cta .btn-light{transition:transform .25s ease, box-shadow .25s ease;}
.jfs-home .cta .btn-light:hover{transform:translateY(-3px); box-shadow:0 12px 24px rgba(0,0,0,.18);}
.jfs-home .cta-buttons{display:flex; gap:14px; justify-content:center; flex-wrap:wrap;}
.jfs-home .btn-outline-light{background:transparent; color:#fff; border-color:rgba(255,255,255,.5);}

/* CTA split variant — left copy / right button, used where the page wants
   to break out of the "everything centered" rhythm (opt-in, base .cta
   above stays centered for pages that haven't adopted this yet). */
.jfs-home .cta-split{display:flex; align-items:center; justify-content:space-between; gap:32px; text-align:left;}
.jfs-home .cta-split h2{margin-bottom:8px;}
.jfs-home .cta-split p{margin-bottom:0;}
.jfs-home .cta-split .btn-light{flex-shrink:0;}
@media(max-width:700px){
  .jfs-home .cta-split{flex-direction:column; text-align:center;}
}
.jfs-home .btn-outline-light:hover{border-color:#fff; background:rgba(255,255,255,.1);}

/* SPLIT ROW (icon block + text block, alternating) — dipakai Programs
   (Course Structure, IGCSE, A & AS Level) buat baris konten Cambridge-info,
   reusable kalau halaman lain butuh layout sama. */
.jfs-home .split-row{display:grid; grid-template-columns:.32fr .68fr; gap:36px; align-items:center;}
.jfs-home .split-row + .split-row{margin-top:40px;}
.jfs-home .split-row-reverse{grid-template-columns:.68fr .32fr;}
.jfs-home .split-row-reverse .split-icon{order:2;}
.jfs-home .split-row-reverse .split-body{order:1;}
.jfs-home .split-icon{aspect-ratio:1/1; border-radius:var(--radius-lg); display:flex; align-items:center; justify-content:center; box-shadow:var(--shadow); background:var(--gradient); color:#fff;}
.jfs-home .split-icon .jfs-icon{width:44px; height:44px;}
.jfs-home .split-body h2{font-size:25px; margin-bottom:12px;}
.jfs-home .split-body p{color:var(--n500); font-size:14.5px; line-height:1.75; white-space:pre-line;}

@media(max-width:900px){
  .jfs-home .split-row,
  .jfs-home .split-row-reverse{grid-template-columns:1fr;}
  .jfs-home .split-row-reverse .split-icon{order:1;}
  .jfs-home .split-row-reverse .split-body{order:2;}
  .jfs-home .split-icon{max-width:150px; margin:0 auto; font-size:38px;}
}

/* NAVBAR — floating glass pill, detached dari top (DESIGN.md: floating
   navbar, backdrop-blur, radius full). <header> jadi sticky wrapper
   dengan padding-top supaya pill "melayang" berjarak dari viewport top;
   background/blur/border/shadow dipindah ke <nav> supaya bentuknya pill,
   bukan strip full-width. */
.jfs-home header{position:sticky; top:0; z-index:50; padding:14px 20px 0; background:transparent; border-bottom:none; transition:padding .35s var(--ease-out);}
.jfs-home nav{position:relative; display:flex; align-items:center; justify-content:space-between; gap:20px; max-width:1240px; margin:0 auto; padding:10px 12px 10px 22px; background:rgba(255,255,255,0.72); backdrop-filter:blur(22px) saturate(150%); -webkit-backdrop-filter:blur(22px) saturate(150%); border:1px solid rgba(15,23,41,0.07); border-radius:var(--radius-full); box-shadow:0 10px 26px rgba(15,23,41,.07); transition:padding .35s var(--ease-out),max-width .35s var(--ease-out),background .35s var(--ease-out),box-shadow .35s var(--ease-out);}
.jfs-home header.is-compact{padding-top:7px;}
.jfs-home header.is-compact nav{max-width:1080px; padding-top:7px; padding-bottom:7px; background:rgba(255,255,255,0.9); box-shadow:0 16px 38px rgba(15,23,41,.13);}
.jfs-home .logo{display:flex; align-items:center; gap:10px; font-weight:800; font-size:16px; color:var(--navy); flex-shrink:0;}
.jfs-home .site-logo-image{display:block; width:auto; height:52px; max-width:240px; object-fit:contain;}
.jfs-home header.is-compact .site-logo-image{height:40px;}
@media(max-width:600px){.jfs-home .site-logo-image{height:40px; max-width:190px;}}
.jfs-home .logo-mark{width:32px; height:32px; border-radius:10px; background:var(--gradient); display:flex; align-items:center; justify-content:center; color:#fff; font-weight:800; font-size:13px; flex-shrink:0; transition:transform .4s var(--ease-out), box-shadow .4s var(--ease-out);}
.jfs-home .logo:hover .logo-mark{transform:rotate(-8deg) scale(1.06); box-shadow:0 8px 18px rgba(22,163,74,.32);}
.jfs-home .nav-links{display:flex; align-items:center; gap:18px; font-size:13.5px; font-weight:500;}
.jfs-home .nav-links > a{position:relative; color:var(--n700); transition:color .2s var(--ease-out);}
.jfs-home .nav-links > a:hover{color:var(--green-dark);}
/* underline-draw pada nav link (bukan warna doang) — sinyal interaktif
   yang sama dengan .link-draw, tapi tanpa menggeser layout. */
.jfs-home .nav-links > a::after{content:''; position:absolute; left:0; right:0; bottom:-9px; height:2px; background:var(--green); border-radius:999px; transform:scaleX(0); transform-origin:left; transition:transform .3s var(--ease-out);}
.jfs-home .nav-links > a:hover::after{transform:scaleX(1);}
.jfs-home .nav-links > a.active{color:var(--navy); font-weight:700;}
.jfs-home .nav-links > a.active::after{transform:scaleX(1);}
.jfs-home .nav-right{display:flex; align-items:center; gap:10px; flex-shrink:0;}
.jfs-home .nav-login-btn{padding:10px 18px; font-size:13px;}
.jfs-home .nav-login-mobile{display:none;}
.jfs-home .menu-toggle{display:none; background:none; border:none; cursor:pointer; color:var(--navy); padding:6px;}
.jfs-home .menu-toggle .jfs-icon{width:22px; height:22px;}

/* NAVBAR — About dropdown (bukan link, cuma toggle) */
.jfs-home .nav-dropdown{position:relative;}
.jfs-home .nav-dropdown-toggle{display:flex; align-items:center; gap:4px; background:none; border:none; font:inherit; font-weight:500; color:var(--n700); cursor:pointer; padding:0; transition:.2s;}
.jfs-home .nav-dropdown-toggle:hover{color:var(--green-dark);}
.jfs-home .nav-dropdown-toggle.active{color:var(--navy);font-weight:700;}
.jfs-home .nav-dropdown-menu a.active{background:var(--green-light);color:var(--green-dark);font-weight:700;}
.jfs-home .nav-dropdown-menu a.active .jfs-icon{color:var(--green-dark);}
.jfs-home .nav-dropdown-toggle .chevron{width:13px; height:13px; transition:transform .25s ease;}
.jfs-home .nav-dropdown:hover .nav-dropdown-toggle .chevron,
.jfs-home .nav-dropdown.open .nav-dropdown-toggle .chevron{transform:rotate(180deg);}
.jfs-home .nav-dropdown-menu{position:absolute; top:calc(100% + 16px); left:50%; transform:translateX(-50%) translateY(8px); min-width:250px; background:#fff; border-radius:var(--radius-sm); box-shadow:0 16px 36px rgba(15,23,41,.14); border:1px solid var(--n200); padding:10px; opacity:0; visibility:hidden; transition:opacity .22s ease, transform .22s ease, visibility .22s; z-index:60;}
.jfs-home .nav-dropdown-menu a{display:flex; align-items:center; gap:10px; padding:10px 14px; border-radius:var(--radius-sm); font-size:13.5px; font-weight:500; color:var(--n700); transition:.15s ease;}
.jfs-home .nav-dropdown-menu a .jfs-icon{color:var(--n500); width:16px; height:16px;}
.jfs-home .nav-dropdown-menu a:hover .jfs-icon{color:var(--green-dark);}
.jfs-home .nav-dropdown-menu a:hover{background:var(--green-light); color:var(--green-dark); transform:translateX(2px);}
.jfs-home .nav-dropdown:hover .nav-dropdown-menu,
.jfs-home .nav-dropdown.open .nav-dropdown-menu{opacity:1; visibility:visible; transform:translateX(-50%) translateY(0);}

/* FOOTER */
/* margin-top dihapus: tiap section sudah membawa jarak bawahnya sendiri,
   margin tambahan di sini menumpuk jadi celah kosong sebelum footer. */
.jfs-home footer{position:relative; background:var(--navy); color:var(--n300); padding:60px 0 0; margin-top:0; overflow:hidden;}
/* garis aksen gradient tipis di tepi atas footer — penanda transisi
   akhir halaman, sekaligus mengikat footer ke palet brand. */
.jfs-home footer::before{content:''; position:absolute; top:0; left:0; right:0; height:2px; background:var(--gradient);}
.jfs-home .footer-top{display:grid; grid-template-columns:1.4fr 1fr 1fr; gap:48px; padding-bottom:44px;}
/* Kolom keempat hanya muncul kalau kartu Instagram dirender (class
   ditambahkan dari PHP, bukan :has() — grid tidak boleh menyisakan sel
   kosong saat admin belum upload foto, dan dukungan :has masih timpang di
   browser lama). */
.jfs-home .footer-top.has-social-card{grid-template-columns:1.2fr .8fr .8fr 1.1fr; gap:40px;}
.jfs-home .footer-ig-card{display:block; border-radius:var(--radius-core); overflow:hidden; background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.12); transition:transform .35s var(--ease-out), border-color .35s var(--ease-out), background .35s var(--ease-out);}
.jfs-home .footer-ig-card:hover{transform:translateY(-4px); border-color:rgba(157,229,184,.5); background:rgba(255,255,255,.09);}
.jfs-home .footer-ig-media{display:block; position:relative; aspect-ratio:4/3; overflow:hidden; background:rgba(255,255,255,.08);}
.jfs-home .footer-ig-media img{width:100%; height:100%; object-fit:cover; transition:transform .6s var(--ease-out);}
.jfs-home .footer-ig-card:hover .footer-ig-media img{transform:scale(1.05);}
.jfs-home .footer-ig-body{display:block; padding:18px 20px 20px;}
.jfs-home .footer-ig-handle{display:flex; align-items:center; gap:9px; color:#fff; font-size:14px; font-weight:700;}
.jfs-home .footer-ig-handle .jfs-icon{width:17px; height:17px; color:#9de5b8;}
.jfs-home .footer-ig-caption{display:block; margin-top:8px; font-size:13.5px; line-height:1.55; color:var(--n300);}
.jfs-home .footer-ig-cta{display:inline-flex; align-items:center; gap:7px; margin-top:14px; font-size:13.5px; font-weight:700; color:#9de5b8;}
.jfs-home .footer-ig-cta .jfs-icon{width:15px; height:15px; transition:transform .25s var(--ease-out);}
.jfs-home .footer-ig-card:hover .footer-ig-cta .jfs-icon{transform:translateX(4px);}
.jfs-home .footer-col h4{color:#fff; font-size:14.5px; margin-bottom:16px; font-weight:600;}
.jfs-home .footer-col ul li{margin-bottom:10px; font-size:13.5px;}
.jfs-home .footer-col ul li a{display:inline-block; transition:color .2s var(--ease-out), transform .25s var(--ease-out);}
.jfs-home .footer-col ul li a:hover{color:#fff; transform:translateX(4px);}
.jfs-home .footer-brand{font-weight:800; font-size:17px; color:var(--navy); margin-bottom:14px; display:inline-flex; align-items:center; justify-content:center; gap:10px; width:fit-content; padding:10px 18px; background:#fff; border-radius:12px;}
.jfs-home .footer-logo-image{display:block; width:auto; height:72px; max-width:260px; object-fit:contain;}
.jfs-home .footer-contact li{display:flex; gap:10px; align-items:flex-start; margin-bottom:12px; font-size:13.5px;}
.jfs-home .footer-contact li .jfs-icon{width:16px; height:16px; margin-top:2px; color:var(--n500); flex-shrink:0;}
.jfs-home .footer-social{display:flex; gap:12px; margin-top:16px;}
.jfs-home .footer-social a{width:32px; height:32px; border-radius:50%; background:rgba(255,255,255,0.08); display:flex; align-items:center; justify-content:center; transition:.2s;}
.jfs-home .footer-social a .jfs-icon{width:15px; height:15px;}
.jfs-home .footer-social a:hover{background:var(--green);}
.jfs-home .footer-bottom{border-top:1px solid rgba(255,255,255,0.1); padding:18px 0; display:flex; justify-content:space-between; align-items:center; font-size:12.5px; flex-wrap:wrap; gap:10px;}
.jfs-home .footer-bottom-links{display:flex; gap:20px;}
.jfs-home .footer-bottom-links a:hover{color:#fff;}

/* Astra parent theme's default "Scroll to Top" (#ast-scroll-top) is a
   31.5px, 2px-radius box in Astra's own blue — off-brand and under the
   44px touch-target minimum. Hide it, use our own branded button instead. */
#ast-scroll-top{display:none !important;}
.jfs-home .jfs-scroll-top{position:fixed; right:26px; bottom:26px; z-index:80; width:46px; height:46px; border-radius:var(--radius-full); background:var(--navy); color:#fff; border:none; box-shadow:var(--shadow); display:flex; align-items:center; justify-content:center; cursor:pointer; opacity:0; visibility:hidden; transform:translateY(12px); transition:opacity .25s ease, transform .25s ease, background .2s ease;}
.jfs-home .jfs-scroll-top .jfs-icon{width:19px; height:19px;}
.jfs-home .jfs-scroll-top.show{opacity:1; visibility:visible; transform:translateY(0);}
.jfs-home .jfs-scroll-top:hover{background:var(--green);}
.jfs-home .jfs-scroll-top:active{transform:scale(.93);}
@media(max-width:600px){.jfs-home .jfs-scroll-top{right:16px; bottom:16px; width:42px; height:42px;}}

/* ACCESSIBILITY — visible keyboard focus (ui-ux-pro-max Priority 1: never
   remove/skip focus rings) + honor prefers-reduced-motion (taste-skill 6.B,
   mandatory for anything above static). */
.jfs-home a:focus-visible,
.jfs-home button:focus-visible{outline:2px solid var(--green); outline-offset:2px; border-radius:4px;}

@media (prefers-reduced-motion: reduce){
  .jfs-home *{animation-duration:.001ms !important; animation-iteration-count:1 !important; transition-duration:.001ms !important; scroll-behavior:auto !important;}
  .jfs-home .reveal{opacity:1; transform:none;}
  .jfs-home .hero-in-stagger > *,
  .jfs-home .hero-in-visual{opacity:1;}
  .jfs-home .jfs-scroll-progress{display:none;}
}

/* Direction-aware reveal (e.g. spotlight cards: one leads from left, the
   other follows from right — reinforces the layout relationship instead
   of every section fading up the same way). One-shot on scroll into
   view, never a looping/decorative animation. Own keyframes for the
   same clobbering reason as .reveal above — a dir-left/dir-right card
   also carries its own hover `transition`, so this must not depend on
   `transition` at all. */
.jfs-home .reveal.dir-left.in{animation-name:jfs-reveal-in-left;}
.jfs-home .reveal.dir-right.in{animation-name:jfs-reveal-in-right;}
@keyframes jfs-reveal-in-left{from{opacity:0; transform:translateX(-28px);} to{opacity:1; transform:translateX(0);}}
@keyframes jfs-reveal-in-right{from{opacity:0; transform:translateX(28px);} to{opacity:1; transform:translateX(0);}}

/* CTA buttons carry a visible arrow (not hover-only — touch users can't
   hover) that nudges forward on hover/focus for extra affordance. */
.jfs-home .btn .jfs-icon{transition:transform .2s ease;}
.jfs-home .btn:hover .jfs-icon,
.jfs-home .btn:focus-visible .jfs-icon{transform:translateX(3px);}

/* RESPONSIVE (base) */
/* Drawer nav dipakai sampai 1024px supaya tablet (iPad portrait & landscape)
   ikut navigasi sentuh — navbar desktop mulai sesak/wrap di lebar segitu.
   Semua isi drawer rata tengah: di layout kolom penuh-lebar, item rata kiri
   menyisakan whitespace kanan yang bikin submenu kelihatan "lari ke kiri". */
@media(max-width:1024px){
  .jfs-home .nav-links{display:flex; flex-direction:column; align-items:center; position:absolute; top:calc(100% + 8px); left:20px; right:20px; background:#fff; gap:14px; padding:0 24px; max-height:0; opacity:0; overflow:hidden; pointer-events:none; box-shadow:0 16px 36px rgba(15,23,41,.14); border:1px solid var(--n200); border-radius:var(--radius-md); transition:max-height .35s var(--ease-inout), opacity .28s ease, padding .35s ease;}
  /* 80vh + overflow-y: drawer Programs (7 submenu) melebihi cap 600px lama
     dan item terakhir kepotong di HP kecil. */
  .jfs-home .nav-links.open{max-height:80vh; opacity:1; padding:22px 24px; pointer-events:auto; overflow-y:auto; -webkit-overflow-scrolling:touch;}
  /* underline-draw dimatikan di drawer mobile — di layout kolom garis
     full-width di bawah link kebaca sebagai separator, bukan hover state. */
  .jfs-home .nav-links > a::after{display:none;}
  .jfs-home .nav-links > a,
  .jfs-home .nav-dropdown-toggle{min-height:44px; display:flex; align-items:center; justify-content:center; width:100%; text-align:center;}
  .jfs-home .nav-login-btn{display:none;}
  .jfs-home .nav-login-mobile{display:flex; align-items:center; justify-content:center; gap:8px; font-weight:700; color:var(--green-dark);}
  .jfs-home .menu-toggle{display:block;}
  .jfs-home .nav-dropdown{width:100%;}
  .jfs-home .nav-dropdown-menu{position:static; opacity:1; visibility:visible; transform:none; box-shadow:none; border:1px solid var(--n200); background:var(--n50); border-radius:var(--radius-sm); width:100%; max-width:320px; margin:4px auto 0; padding:8px 10px; display:none; min-width:0;}
  /* transform:none WAJIB diulang di sini: rule desktop
     `.nav-dropdown.open .nav-dropdown-menu{transform:translateX(-50%)}`
     spesifisitasnya (0,4,0) mengalahkan reset `.nav-dropdown-menu` (0,2,0)
     di atas — itu penyebab submenu tergeser ke kiri sejauh 50% lebarnya
     saat dibuka di HP/tablet. */
  .jfs-home .nav-dropdown:hover .nav-dropdown-menu{transform:none;}
  .jfs-home .nav-dropdown.open .nav-dropdown-menu{display:block; transform:none;}
  .jfs-home .nav-dropdown-menu a{justify-content:center; text-align:center; min-height:44px;}
  /* hover translateX dimatikan: di layout rata tengah geseran 2px terbaca
     sebagai item yang tidak sejajar, bukan feedback. */
  .jfs-home .nav-dropdown-menu a:hover{transform:none;}
}

@media(max-width:900px){
  .jfs-home .page-hero-shell{padding:32px 24px;}
  .jfs-home .page-hero h1{font-size:28px;}
  .jfs-home .footer-top,
  .jfs-home .footer-top.has-social-card{grid-template-columns:1fr;}
  .jfs-home .footer-ig-media{aspect-ratio:16/9;}
}

/* COMPACT VERTICAL RHYTHM
   Page CSS dimuat setelah base, jadi override spacing ini sengaja memakai
   !important. Scope hanya jarak luar section/hero/closing; padding card,
   field form, tap target, dan grid gap tetap mengikuti komponen asal. */
.jfs-home section:not([class*="-hero"]):not([class*="-closing"]):not(.home-proof):not(.home-partners):not(.home-promo){padding-top:56px!important;padding-bottom:56px!important}
.jfs-home section[class*="-hero"]{padding-top:48px!important;padding-bottom:20px!important}
.jfs-home .home-hero{padding-top:56px!important;padding-bottom:40px!important}
.jfs-home section[class*="-closing"]{padding-top:0!important;padding-bottom:40px!important}
.jfs-home [class*="-section-head"],
.jfs-home .section-head,
.jfs-home .home-head{margin-bottom:24px!important}
.jfs-home [class*="-closing-box"]{padding:48px!important}
/* Section pasangan yang memang berbagi satu alur tidak diberi dua sisi
   penuh; ini mencegah ruang baru muncul akibat override global. */
.jfs-home .pcs-offer{padding-bottom:0!important}
.jfs-home .pcs-architecture,
.jfs-home .pig-progression{padding-top:0!important}
.jfs-home footer{padding-top:48px}
.jfs-home .footer-top,
.jfs-home .footer-top.has-social-card{gap:32px}

/* Proof/highlight strip di bawah hero sebelumnya 44–58px dari copy. */
.jfs-home .vm-credentials,
.jfs-home .team-proof,
.jfs-home .lm-readiness,
.jfs-home .wc-proof,
.jfs-home .sl-metrics,
.jfs-home .ss-metrics,
.jfs-home .ao-hero-facts,
.jfs-home .at-guarantees,
.jfs-home [class*="-hero-metrics"]{margin-top:40px!important}

@media(max-width:900px){
  .jfs-home section:not([class*="-hero"]):not([class*="-closing"]):not(.home-proof):not(.home-partners):not(.home-promo){padding-top:48px!important;padding-bottom:48px!important}
  .jfs-home section[class*="-hero"]{padding-top:40px!important;padding-bottom:18px!important}
  .jfs-home .home-hero{padding-top:48px!important;padding-bottom:32px!important}
  .jfs-home section[class*="-closing"]{padding-bottom:32px!important}
  .jfs-home [class*="-closing-box"]{padding:40px 32px!important}
  .jfs-home .vm-credentials,
  .jfs-home .team-proof,
  .jfs-home .lm-readiness,
  .jfs-home .wc-proof,
  .jfs-home .sl-metrics,
  .jfs-home .ss-metrics,
  .jfs-home .ao-hero-facts,
  .jfs-home .at-guarantees,
  .jfs-home [class*="-hero-metrics"]{margin-top:32px!important}
  .jfs-home footer{padding-top:40px}
}

@media(max-width:640px){
  .jfs-home section:not([class*="-hero"]):not([class*="-closing"]):not(.home-proof):not(.home-partners):not(.home-promo){padding-top:40px!important;padding-bottom:40px!important}
  .jfs-home section[class*="-hero"]{padding-top:32px!important;padding-bottom:16px!important}
  .jfs-home .home-hero{padding-top:40px!important;padding-bottom:28px!important}
  .jfs-home [class*="-section-head"],
  .jfs-home .section-head,
  .jfs-home .home-head{margin-bottom:20px!important}
  .jfs-home [class*="-closing-box"]{padding:32px 24px!important}
  .jfs-home .vm-credentials,
  .jfs-home .team-proof,
  .jfs-home .lm-readiness,
  .jfs-home .wc-proof,
  .jfs-home .sl-metrics,
  .jfs-home .ss-metrics,
  .jfs-home .ao-hero-facts,
  .jfs-home .at-guarantees,
  .jfs-home [class*="-hero-metrics"]{margin-top:24px!important}
  .jfs-home footer{padding-top:36px}
}
