:root{
    --bg:#F1F3EE;          /* misty cool off-white */
    --bg-2:#E7EBE3;        /* deeper stone (alt sections) */
    --ink:#1B2620;         /* green-charcoal text */
    --ink-soft:#54605A;    /* muted body */
    --line:#D5DAD0;        /* hairlines on light */
    --teal:#143A31;        /* deep tropical teal-green */
    --teal-deep:#0E2A23;
    --sage:#7C9184;
    --gold:#B08D4C;        /* brass — garis, ikon, aksen dekoratif */
    --gold-ink:#806632;    /* brass gelap — HANYA untuk teks di latar terang.
                              #B08D4C cuma 2.57:1 terhadap --bg-2, gagal WCAG AA.
                              Yang ini 4.86:1 di --bg dan 4.50:1 di --bg-2. */
    --gold-lt:#CBAE72;
    --cream:#F3EFE6;       /* text on dark */
    --cream-soft:#C9C6B8;
    --aqua:#9FC6BE;
    --olive:#5d7440;
    --hero-cream:#EFEEE5;

    --serif:'Cormorant Garamond',Georgia,serif;
    --display2:'Fraunces',Georgia,serif;
    --sans:'Jost',system-ui,-apple-system,sans-serif;

    --pad: clamp(1.25rem, 5vw, 4.5rem);
    --sec: clamp(4.5rem, 9vw, 8rem);
    --maxw: 1220px;
  }

  *{box-sizing:border-box;margin:0;padding:0}
  html{scroll-behavior:smooth}
  body{
    font-family:var(--sans);
    background:var(--bg);
    color:var(--ink);
    font-weight:300;
    line-height:1.65;
    -webkit-font-smoothing:antialiased;
    overflow-x:hidden;
  }
  img{max-width:100%;display:block}
  a{color:inherit;text-decoration:none}
  ::selection{background:var(--gold);color:var(--cream)}

  .wrap{max-width:var(--maxw);margin:0 auto;padding-inline:var(--pad)}

  /* ---------- shared type ---------- */
  .eyebrow{
    font-family:var(--sans);
    font-size:.7rem;
    font-weight:400;
    letter-spacing:.34em;
    text-transform:uppercase;
    color:var(--gold);
    display:inline-flex;
    align-items:center;
    gap:.85rem;
  }
  .eyebrow::before{
    content:"";width:26px;height:1px;background:var(--gold);opacity:.7;
  }
  .eyebrow.center{justify-content:center}
  h1,h2,h3{font-family:var(--serif);font-weight:400;line-height:1.06;letter-spacing:.005em}
  .lead{font-size:1.06rem;color:var(--ink-soft);max-width:44ch;font-weight:300}

  /* ---------- buttons ---------- */
  .btn{
    font-family:var(--sans);font-size:.74rem;letter-spacing:.22em;text-transform:uppercase;
    font-weight:400;display:inline-flex;align-items:center;gap:.6rem;cursor:pointer;
    padding:.95rem 1.7rem;border-radius:2px;border:1px solid transparent;
    transition:background .35s ease,color .35s ease,border-color .35s ease,transform .35s ease;
    background:none;
  }
  .btn--gold{background:var(--gold);color:var(--cream)}
  .btn--gold:hover{background:var(--teal);color:var(--cream)}
  .btn--outline{border-color:var(--ink);color:var(--ink)}
  .btn--outline:hover{background:var(--ink);color:var(--bg)}
  .btn--ghost-lt{border-color:rgba(243,239,230,.5);color:var(--cream)}
  .btn--ghost-lt:hover{background:var(--cream);color:var(--teal);border-color:var(--cream)}

  .arrow-link{
    font-family:var(--sans);font-size:.74rem;letter-spacing:.2em;text-transform:uppercase;
    color:var(--gold);display:inline-flex;align-items:center;gap:.6rem;transition:gap .3s ease;
  }
  .arrow-link:hover{gap:1rem}
  .arrow-link .ln{width:24px;height:1px;background:currentColor;display:inline-block}

  /* ---------- header ---------- */
  header{
    position:fixed;top:0;left:0;right:0;z-index:60;
    padding:1.5rem 0;
    transition:background .4s ease,padding .4s ease,box-shadow .4s ease;
  }
  header .bar{display:flex;align-items:center;justify-content:space-between;gap:2rem}
  /* Wordmark kini PNG, bukan teks — dirender dari font yang sama supaya
     tampilannya identik, tapi tidak lagi bergantung pada Google Fonts
     selesai memuat. Tinggi dikunci, lebar mengikuti rasio. */
  .brand{display:flex;align-items:center;line-height:1;color:var(--ink);transition:opacity .4s ease}
  .brand img{height:42px;width:auto;display:block}
  .brand:hover{opacity:.72}
  .f-brand .f-logo{height:50px;width:auto;display:block;margin-bottom:1.15rem}
  @media(max-width:560px){.brand img{height:34px}}
  .brand .name{font-family:var(--serif);font-size:1.55rem;font-weight:500;letter-spacing:.02em}
  .brand .sub{font-family:var(--sans);font-size:.56rem;letter-spacing:.42em;text-transform:uppercase;margin-top:.4rem;opacity:.85}

  nav.main{display:flex;align-items:center;gap:2.2rem}
  nav.main a{
    font-family:var(--sans);font-size:.76rem;letter-spacing:.18em;text-transform:uppercase;
    font-weight:400;color:var(--ink);opacity:.82;position:relative;padding:.2rem 0;transition:opacity .3s ease;
  }
  nav.main a::after{content:"";position:absolute;left:0;bottom:-3px;height:1px;width:0;background:var(--gold);transition:width .3s ease}
  nav.main a:hover{opacity:1}
  nav.main a:hover::after{width:100%}

  .nav-cta{display:flex;align-items:center;gap:1.4rem}

  /* scrolled state */
  header.scrolled{background:var(--bg);padding:1rem 0;box-shadow:0 1px 0 var(--line)}
  header.scrolled .brand{color:var(--ink)}
  header.scrolled nav.main a{color:var(--ink)}
  header.scrolled .btn--book{background:var(--olive);color:var(--cream);border-color:transparent}
  header.scrolled .btn--book:hover{background:var(--teal);color:var(--cream)}
  header.scrolled .hamburger span{background:var(--ink)}

  .btn--book{background:var(--olive);color:var(--cream);border:1px solid transparent;border-radius:999px}
  .btn--book:hover{background:var(--teal);color:var(--cream)}

  /* hamburger */
  .hamburger{display:none;flex-direction:column;gap:5px;background:none;border:0;cursor:pointer;padding:6px}
  .hamburger span{display:block;width:26px;height:1.5px;background:var(--ink);transition:transform .35s ease,opacity .3s ease,background .4s ease}
  .hamburger.open span:nth-child(1){transform:translateY(6.5px) rotate(45deg)}
  .hamburger.open span:nth-child(2){opacity:0}
  .hamburger.open span:nth-child(3){transform:translateY(-6.5px) rotate(-45deg)}

  /* mobile panel */
  .mobile-menu{
    position:fixed;inset:0 0 0 0;background:var(--teal);z-index:55;
    display:flex;flex-direction:column;justify-content:center;gap:.4rem;padding:var(--pad);
    transform:translateY(-100%);transition:transform .5s cubic-bezier(.7,0,.2,1);
  }
  .mobile-menu.open{transform:translateY(0)}
  .mobile-menu a{
    font-family:var(--serif);font-size:2.4rem;color:var(--cream);font-weight:400;
    padding:.5rem 0;border-bottom:1px solid rgba(243,239,230,.12);
  }
  .mobile-menu a .idx{font-family:var(--sans);font-size:.7rem;letter-spacing:.2em;color:var(--gold);margin-right:1rem;vertical-align:middle}
  .mobile-menu .mm-book{margin-top:2rem;align-self:flex-start}

  /* ---------- hero (organic) ---------- */
  .hero{position:relative;background:var(--hero-cream);padding-top:clamp(7rem,13vh,9.5rem);padding-bottom:clamp(3rem,6vw,5rem);overflow:hidden}
  .hero .wrap{position:relative;z-index:2}
  .hero-title{font-family:var(--display2);text-align:center;text-transform:uppercase;font-weight:500;color:var(--ink);line-height:.96;letter-spacing:-.005em;font-size:clamp(2.5rem,8.6vw,6.6rem);margin:0 auto clamp(1.4rem,3vw,2.4rem);max-width:16ch}
  .hero-shape{position:relative;max-width:1140px;margin:0 auto}
  .hero-svg{display:block;width:100%;height:auto;filter:drop-shadow(0 26px 46px rgba(20,58,49,.20))}
  .hero-cta{position:absolute;top:47%;left:50%;transform:translate(-50%,-50%);z-index:3;display:inline-flex;align-items:center;gap:.7rem;background:var(--olive);color:var(--cream);font-family:var(--sans);font-size:.76rem;font-weight:400;letter-spacing:.16em;text-transform:uppercase;padding:.85rem 1rem .85rem 1.6rem;border-radius:999px;box-shadow:0 14px 32px rgba(20,58,49,.3);transition:background .35s ease,transform .35s ease}
  .hero-cta:hover{background:var(--teal);transform:translate(-50%,-50%) scale(1.03)}
  .hero-cta .ci{width:30px;height:30px;border-radius:50%;background:rgba(243,239,230,.16);display:grid;place-items:center;font-size:.95rem}
  @media(max-width:600px){.hero-cta{font-size:.68rem;padding:.7rem .8rem .7rem 1.2rem}}
  /* ---------- sanctuary (cinematic) ---------- */
  .sanctuary{position:relative;overflow:hidden;color:var(--cream);padding-block:clamp(4.5rem,10vw,8rem);background-position:center;background-size:cover;background-repeat:no-repeat}
  .sanctuary .s-scrim{position:absolute;inset:0;z-index:0;background:
      linear-gradient(180deg,rgba(10,32,27,.80),rgba(10,32,27,.60) 45%,rgba(10,32,27,.88)),
      linear-gradient(105deg,rgba(20,58,49,.55),rgba(20,58,49,.10))}
  .sanctuary .s-grain{position:absolute;inset:0;z-index:1;opacity:.5;mix-blend-mode:overlay;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.4'/%3E%3C/svg%3E")}
  .sanctuary .s-inner{position:relative;z-index:2}
  .sanctuary .eyebrow{color:var(--gold-lt)}
  .sanctuary h2{font-size:clamp(2.3rem,5vw,3.9rem);margin:1.1rem 0 1.3rem;max-width:16ch;color:var(--cream)}
  .sanctuary h2 .amp{color:var(--gold-lt);font-style:italic}
  .sanctuary .s-lead{max-width:56ch;font-size:1.08rem;color:rgba(243,239,230,.85);font-weight:300;margin-bottom:clamp(2.5rem,5vw,3.5rem)}
  .sanctuary .s-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:1.1rem;align-items:stretch}
  .sanctuary .s-stat{padding:1.6rem 1.4rem;border-top:1px solid rgba(203,174,114,.4)}
  .sanctuary .s-stat .n{font-family:var(--serif);font-size:clamp(2.6rem,5vw,3.7rem);line-height:1;color:var(--cream)}
  .sanctuary .s-stat .n span{font-family:var(--sans);font-size:.9rem;font-weight:300;letter-spacing:.08em;margin-left:.35rem;color:var(--gold-lt)}
  .sanctuary .s-stat .l{font-size:.66rem;letter-spacing:.2em;text-transform:uppercase;color:rgba(243,239,230,.7);margin-top:.9rem}
  .sanctuary .s-stat.box{background:var(--gold);border-top:0;border-radius:12px}
  .sanctuary .s-stat.box .n{color:var(--teal-deep)}
  .sanctuary .s-stat.box .n span{color:rgba(14,42,35,.65)}
  .sanctuary .s-stat.box .l{color:rgba(14,42,35,.7)}
  @media(max-width:720px){.sanctuary .s-stats{grid-template-columns:repeat(2,1fr)}}

  /* photo placeholder system (swap with real photos) */
  .ph{position:relative;overflow:hidden;border-radius:3px;background:var(--sage)}
  .ph::after{content:"";position:absolute;inset:0;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E");opacity:.13;mix-blend-mode:overlay;pointer-events:none}
  .ph--garden{background:radial-gradient(120% 100% at 70% 20%,#8fae8f,transparent 60%),linear-gradient(150deg,#5f7d5f,#324a34)}
  .ph--pool{background:radial-gradient(120% 100% at 30% 15%,rgba(159,198,190,.7),transparent 55%),linear-gradient(160deg,#2c6a5e,#0f2f28)}
  .ph--room{background:radial-gradient(120% 100% at 75% 20%,rgba(203,174,114,.55),transparent 60%),linear-gradient(155deg,#9a8f7c,#54473a)}
  .ph--villa{background:radial-gradient(120% 100% at 25% 20%,rgba(203,174,114,.45),transparent 55%),linear-gradient(150deg,#3a6a5c,#123027)}
  .ph--dining{background:radial-gradient(130% 110% at 80% 15%,rgba(214,164,92,.5),transparent 55%),linear-gradient(150deg,#2a453d,#0e211c)}
  .ph--spa{background:radial-gradient(120% 100% at 25% 20%,rgba(159,198,190,.55),transparent 55%),linear-gradient(155deg,#8ca79b,#4a655b)}
  .ph .cap{position:absolute;left:1.2rem;bottom:1.1rem;z-index:2;font-size:.58rem;letter-spacing:.24em;text-transform:uppercase;color:rgba(243,239,230,.8)}

  /* ---------- rooms (listing cards) ---------- */
  .villas{padding-block:var(--sec);background:var(--bg-2)}
  .sec-head{display:flex;justify-content:space-between;align-items:flex-end;gap:2rem;flex-wrap:wrap;margin-bottom:clamp(2.5rem,5vw,4rem)}
  .sec-head h2{font-size:clamp(2.2rem,4.6vw,3.6rem);margin-top:1rem}
  .cards{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(1.2rem,2.5vw,1.8rem)}
  /* Empat kartu: 2x2, bukan 3+1 yatim. Lebar dibatasi agar tiap kartu tetap
     sebesar kartu di grid 3 kolom. Di <=880px keduanya jatuh ke 1 kolom. */
  .cards--four{grid-template-columns:repeat(2,1fr);max-width:920px;margin-inline:auto}
  .card{position:relative;overflow:hidden;border-radius:16px;aspect-ratio:4/5;display:flex;flex-direction:column;justify-content:flex-end;background-size:cover;background-position:center;background-repeat:no-repeat;transition:transform .5s cubic-bezier(.2,.7,.2,1),box-shadow .5s ease;box-shadow:0 18px 44px -30px rgba(20,58,49,.55)}
  .card:hover{transform:translateY(-8px);box-shadow:0 30px 58px -30px rgba(20,58,49,.5)}
  .card .c-scrim{position:absolute;inset:0;z-index:1;background:linear-gradient(to top,rgba(12,32,26,.95) 0%,rgba(12,32,26,.78) 20%,rgba(12,32,26,.2) 46%,transparent 66%)}
  .card .badge{position:absolute;top:15px;left:15px;z-index:3;display:inline-flex;align-items:center;gap:.4rem;background:var(--cream);color:var(--ink);font-family:var(--sans);font-size:.72rem;font-weight:400;padding:.5rem .9rem;border-radius:999px;box-shadow:0 4px 16px rgba(0,0,0,.2)}
  .card .badge .st{color:var(--gold);font-size:.82rem;line-height:1}
  .card .c-content{position:relative;z-index:2;padding:clamp(1.15rem,1.8vw,1.5rem);color:var(--cream)}
  .card .c-row{display:flex;justify-content:space-between;align-items:flex-end;gap:.8rem}
  .card .c-price{font-family:var(--sans);font-size:clamp(1.35rem,1.8vw,1.6rem);font-weight:500;line-height:1.05}
  .card .c-price span{font-weight:300;font-size:.78rem;color:rgba(243,239,230,.7)}
  .card .c-name{font-family:var(--serif);font-size:1.15rem;color:rgba(243,239,230,.92);margin-top:.4rem;line-height:1.15}
  .card .c-name small{display:block;font-family:var(--sans);font-size:.78rem;font-weight:300;color:rgba(243,239,230,.62);margin-top:.15rem}
  .card .c-stats{display:flex;align-items:flex-end;gap:.9rem;flex-shrink:0}
  .card .c-stat .sv{display:flex;align-items:center;gap:.35rem;font-family:var(--sans);font-weight:500;font-size:1.02rem;white-space:nowrap}
  .card .c-stat .sv svg{width:16px;height:16px;color:rgba(243,239,230,.72)}
  .card .c-stat .sl{font-size:.6rem;letter-spacing:.13em;text-transform:uppercase;color:rgba(243,239,230,.6);margin-top:.25rem}
  .card .c-vline{width:1px;align-self:stretch;background:rgba(243,239,230,.22)}
  .card .c-divider{height:1px;background:rgba(243,239,230,.2);margin:.95rem 0 .8rem}
  .card .c-foot{display:flex;align-items:center;gap:.45rem;font-family:var(--sans);font-size:.8rem;color:rgba(243,239,230,.66)}
  .card .c-foot .st{color:var(--gold)}
  .card .c-foot b{color:var(--cream);font-weight:500}
  /* ---------- feature bands ---------- */
  .feature{display:grid;grid-template-columns:1fr 1fr;align-items:stretch;min-height:min(88vh,720px)}
  .feature .ph{border-radius:0}
  .feature .f-text{display:flex;flex-direction:column;justify-content:center;padding:clamp(2.5rem,6vw,6rem)}
  .feature.dark{background:var(--teal);color:var(--cream)}
  .feature.dark .f-text h2{color:var(--cream)}
  .feature.dark .lead{color:rgba(243,239,230,.8)}
  .feature.light{background:var(--bg)}
  .feature h2{font-size:clamp(2.2rem,4.4vw,3.4rem);margin:1.1rem 0 1.4rem}
  .feature .lead{margin-bottom:2rem;max-width:40ch}
  .feature .rev-order{order:-1} /* image first on desktop */
  .feature.dark .arrow-link{color:var(--gold-lt)}

  /* ---------- amenities strip (beranda) ----------
     Dulu kelasnya .amen dan itu BENTROK: .amen dipakai lagi di baris ~583
     untuk satu butir amenity di halaman kamar, dengan padding-top:1rem.
     Aturan yang belakangan menang, jadi strip beranda kehilangan padding
     atasnya sementara padding bawahnya tetap — timpang, dan itu yang
     terlihat aneh. Namanya kini .amen-strip, tidak lagi beririsan.

     Titik bulat kecil diganti ikon, mengikuti .facility di halaman Rooms
     supaya bahasa visualnya sama di seluruh situs. Delapan butir dalam
     grid 4 kolom: dua baris penuh, tanpa butir yatim di baris terakhir. */
  .amen-strip{padding-block:clamp(2.6rem,5vw,3.6rem);
    border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
  .amen-strip ul{list-style:none;display:grid;grid-template-columns:repeat(4,1fr);
    gap:clamp(1.6rem,3vw,2.4rem) clamp(1rem,2vw,1.6rem)}
  .amen-strip li{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.7rem}
  .amen-strip svg{width:26px;height:26px;color:var(--gold);flex:none}
  .amen-strip span{font-size:.7rem;letter-spacing:.16em;text-transform:uppercase;
    color:var(--ink-soft);line-height:1.45}
  @media(max-width:820px){
    .amen-strip ul{grid-template-columns:repeat(2,1fr)}
  }

  /* ---------- gallery ---------- */
  .gallery{padding-block:var(--sec)}
  .g-grid{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:190px;gap:clamp(.6rem,1.4vw,1rem);margin-top:clamp(2rem,4vw,3rem)}
  .g-grid .ph{border-radius:11px}
  .g-grid .g1{grid-column:span 2;grid-row:span 2}
  .g-grid .g4{grid-column:span 2}
  .g-grid .g6{grid-row:span 2}

  /* ---------- quote ---------- */
  .quote{padding-block:var(--sec);background:var(--teal);color:var(--cream);text-align:center}
  .quote .mark{font-family:var(--serif);font-size:5rem;color:var(--gold);line-height:.5;opacity:.8}
  .quote blockquote{font-family:var(--serif);font-size:clamp(1.7rem,3.6vw,2.9rem);font-weight:300;font-style:italic;line-height:1.3;max-width:20ch;margin:1.5rem auto 2rem}
  .quote .by{font-size:.72rem;letter-spacing:.24em;text-transform:uppercase;color:var(--cream-soft)}
  .quote .by b{color:var(--gold-lt);font-weight:400}

  /* ---------- cta ---------- */
  .cta{position:relative;overflow:hidden;color:var(--cream);text-align:center;padding-block:clamp(5rem,10vw,9rem)}
  .cta .ph{position:absolute;inset:0;border-radius:0;z-index:0}
  .cta .ph::before{content:"";position:absolute;inset:0;background:rgba(14,42,35,.5);z-index:1}
  .cta .inner{position:relative;z-index:2}
  .cta h2{font-size:clamp(2.6rem,6vw,5rem);margin:1.3rem 0 1.2rem;font-weight:400}
  .cta p{max-width:38ch;margin:0 auto 2.4rem;color:rgba(243,239,230,.85)}

  /* ---------- footer ---------- */
  footer{background:var(--teal-deep);color:var(--cream-soft);padding-block:clamp(3.5rem,6vw,5rem) 2rem}
  .f-top{display:grid;grid-template-columns:1.4fr 1fr 1fr 1.2fr;gap:2.5rem}
  .f-brand .name{font-family:var(--serif);font-size:1.8rem;color:var(--cream);font-weight:500}
  .f-brand .sub{font-size:.56rem;letter-spacing:.4em;text-transform:uppercase;margin-top:.5rem;color:var(--gold-lt)}
  .f-brand p{margin-top:1.3rem;max-width:30ch;font-size:.9rem;line-height:1.7}
  .f-col h4{font-family:var(--sans);font-size:.66rem;letter-spacing:.24em;text-transform:uppercase;color:var(--cream);font-weight:400;margin-bottom:1.3rem}
  .f-col a,.f-col p{display:block;font-size:.9rem;margin-bottom:.7rem;color:var(--cream-soft);transition:color .3s ease}
  .f-col a:hover{color:var(--gold-lt)}
  .f-news{display:flex;border-bottom:1px solid rgba(243,239,230,.25);padding-bottom:.5rem;margin-top:.4rem}
  .f-news input{flex:1;background:none;border:0;color:var(--cream);font-family:var(--sans);font-size:.9rem;padding:.3rem 0}
  .f-news input::placeholder{color:rgba(201,198,184,.6)}
  .f-news input:focus{outline:none}
  .f-news button{background:none;border:0;color:var(--gold-lt);cursor:pointer;font-size:1.2rem;padding:0 .3rem}
  .f-bottom{margin-top:clamp(3rem,5vw,4rem);padding-top:1.6rem;border-top:1px solid rgba(243,239,230,.12);display:flex;justify-content:space-between;align-items:center;gap:1rem;flex-wrap:wrap;font-size:.76rem;letter-spacing:.1em}
  .f-bottom .ig{display:inline-flex;align-items:center;gap:.6rem;color:var(--cream);text-transform:uppercase;letter-spacing:.18em;font-size:.7rem}
  .f-bottom .ig svg{width:16px;height:16px}

  /* ---------- reveal animation ---------- */
  .reveal{opacity:0;transform:translateY(26px);transition:opacity .9s ease,transform .9s cubic-bezier(.2,.7,.2,1)}
  .reveal.in{opacity:1;transform:none}

  /* ---------- responsive ---------- */
  @media(max-width:980px){
    .f-top{grid-template-columns:1fr 1fr}
    .g-grid{grid-template-columns:repeat(2,1fr)}
  }
  @media(max-width:880px){
    nav.main,.nav-cta .btn--book{display:none}
    .hamburger{display:flex}
    .story .grid{grid-template-columns:1fr}
    .story .ph{aspect-ratio:16/10;order:-1}
    .cards{grid-template-columns:1fr;max-width:420px;margin-inline:auto}
    .card .desc{min-height:0}
    .feature{grid-template-columns:1fr}
    .feature .ph{min-height:52vh}
    .feature .rev-order{order:0}
  }
  @media(max-width:720px){
    .booking{grid-template-columns:1fr 1fr;max-width:460px}
    .booking .field:nth-child(3){grid-column:span 2}
    .booking .go{grid-column:span 2;margin:.9rem}
    .g-grid .g1{grid-column:span 2;grid-row:span 1}
    .g-grid .g4{grid-column:span 2}
    .story .meta{gap:2rem}
  }
  @media(max-width:460px){
    .booking{grid-template-columns:1fr}
    .booking .field{grid-column:span 1 !important}
    .booking .field:nth-child(3){grid-column:span 1}
    .amen-strip ul{gap:1.4rem 1rem}
  }

  @media(prefers-reduced-motion:reduce){
    *{scroll-behavior:auto !important}
    .hero-bg,.hero-bg::before,.scrollcue .dot::after{animation:none}
    .reveal{opacity:1;transform:none;transition:none}
  }

  :focus-visible{outline:2px solid var(--gold);outline-offset:3px}

  /* inner pages */
  .page-head{background:var(--hero-cream);padding-top:clamp(8rem,16vh,11rem);padding-bottom:clamp(2.8rem,6vw,4.5rem);text-align:center}
  .page-head h1{font-family:var(--display2);text-transform:uppercase;font-weight:500;color:var(--ink);line-height:1;letter-spacing:-.005em;font-size:clamp(2.5rem,7vw,5.2rem);margin:1.1rem 0}
  .page-head .ph-lead{max-width:54ch;margin:0 auto;color:var(--ink-soft);font-size:1.08rem;font-weight:300}
  nav.main{gap:1.5rem}
  nav.main a{font-size:.72rem;letter-spacing:.14em}
  nav.main a.active{opacity:1}
  nav.main a.active::after{width:100%}
  @media(max-width:1080px){nav.main{gap:1.05rem}nav.main a{font-size:.66rem;letter-spacing:.08em}}
  .section{padding-block:clamp(3.5rem,7vw,6rem)}
  .prose-list{max-width:780px;margin:0 auto;list-style:none;padding:0}
  .trow{display:flex;justify-content:space-between;align-items:flex-start;gap:1.5rem;padding:1.25rem 0;border-bottom:1px solid var(--line);transition:padding-left .35s ease}
  .trow:hover{padding-left:.6rem}
  .trow h4{font-family:var(--serif);font-size:1.4rem;color:var(--ink);font-weight:500;line-height:1.1}
  .trow .tmeta{font-size:.92rem;color:var(--ink-soft);margin-top:.3rem;max-width:48ch;font-weight:300}
  .trow .tprice{font-family:var(--serif);font-size:1.2rem;color:var(--teal);white-space:nowrap;text-align:right}
  .trow .tprice span{display:block;font-family:var(--sans);font-size:.58rem;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-soft);margin-top:.25rem}
  /* Tata letak .pg-grid didefinisikan di bawah, di blok galeri —
     dulu CSS columns, sekarang baris terjustifikasi. */
  .trio{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(1.5rem,3vw,2.8rem);margin-top:clamp(2rem,4vw,3rem)}
  .trio .ic{width:40px;height:40px;color:var(--gold)}
  .trio h4{font-family:var(--serif);font-size:1.55rem;color:var(--ink);margin:.9rem 0 .5rem;font-weight:500}
  .trio p{color:var(--ink-soft);font-size:.96rem;font-weight:300;max-width:34ch}
  .trio>div{transition:transform .5s ease}
  .trio>div:hover{transform:translateY(-6px)}
  @media(max-width:760px){.trio{grid-template-columns:1fr;gap:2rem}}
  /* hero heading + subheading */
  .hero-kicker{display:block;text-align:center;font-family:var(--sans);font-size:.7rem;letter-spacing:.32em;text-transform:uppercase;color:var(--olive);margin-bottom:1.1rem}
  .hero-sub{text-align:center;max-width:48ch;margin:0 auto clamp(2rem,4vw,3rem);color:var(--ink-soft);font-size:1.06rem;font-weight:300}
  /* filter bar */
  .filter-bar{display:flex;flex-wrap:wrap;gap:.6rem;justify-content:center;margin-bottom:clamp(2rem,4vw,3rem)}
  .filter-btn{font-family:var(--sans);font-size:.7rem;letter-spacing:.14em;text-transform:uppercase;padding:.6rem 1.2rem;border-radius:999px;border:1px solid var(--line);background:transparent;color:var(--ink-soft);cursor:pointer;transition:all .3s ease}
  .filter-btn:hover{border-color:var(--olive);color:var(--ink);transform:translateY(-2px)}
  .filter-btn.active{background:var(--olive);color:var(--cream);border-color:transparent}
  /* facilities icon grid */
  .facilities{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(1rem,2.2vw,1.6rem)}
  .facility{text-align:center;padding:1.7rem 1rem;background:var(--bg);border-radius:14px;transition:transform .5s cubic-bezier(.2,.7,.2,1),box-shadow .5s ease}
  .facility:hover{transform:translateY(-6px);box-shadow:0 20px 40px -26px rgba(20,58,49,.4)}
  .facility svg{width:32px;height:32px;color:var(--gold)}
  .facility h4{font-family:var(--serif);font-size:1.12rem;margin-top:.75rem;color:var(--ink);font-weight:500}
  @media(max-width:820px){.facilities{grid-template-columns:repeat(2,1fr)}}
  /* blog */
  .blog-feature{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(1.5rem,3vw,3rem);align-items:center;margin-bottom:clamp(2.5rem,5vw,4rem)}
  .blog-feature .bimg{aspect-ratio:4/3;border-radius:16px;background-size:cover;background-position:center}
  .blog-feature h2{font-size:clamp(1.8rem,3.5vw,2.8rem);margin:.7rem 0 1rem;font-family:var(--serif);color:var(--ink)}
  .blog-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(1.4rem,3vw,2rem)}
  .blog-card{display:flex;flex-direction:column;background:var(--bg);border-radius:14px;overflow:hidden;transition:transform .5s cubic-bezier(.2,.7,.2,1),box-shadow .5s ease}
  .blog-card:hover{transform:translateY(-8px);box-shadow:0 26px 50px -30px rgba(20,58,49,.42)}
  .blog-card .bimg{aspect-ratio:16/10;background-size:cover;background-position:center}
  .blog-card .bbody{padding:1.4rem 1.4rem 1.5rem;display:flex;flex-direction:column;flex:1}
  .bcat{font-size:.62rem;letter-spacing:.18em;text-transform:uppercase;color:var(--gold)}
  .blog-card h3{font-family:var(--serif);font-size:1.35rem;color:var(--ink);margin:.5rem 0 .55rem;line-height:1.15;font-weight:500}
  .blog-card p{font-size:.9rem;color:var(--ink-soft);font-weight:300;flex:1}
  .blog-card .bmeta{margin-top:1rem;font-size:.72rem;color:var(--ink-soft);display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--line);padding-top:.85rem}
  .blog-card .bmeta a{color:var(--gold);text-transform:uppercase;letter-spacing:.14em;font-size:.66rem}
  @media(max-width:860px){.blog-grid{grid-template-columns:repeat(2,1fr)}.blog-feature{grid-template-columns:1fr}}
  @media(max-width:560px){.blog-grid{grid-template-columns:1fr;max-width:420px;margin-inline:auto}}
  /* contact */
  .contact-grid{display:grid;grid-template-columns:1fr 1fr;gap:clamp(2rem,4vw,4rem);align-items:start}
  .ci-row{padding:1.15rem 0;border-bottom:1px solid var(--line)}
  .ci-row .l{font-size:.62rem;letter-spacing:.18em;text-transform:uppercase;color:var(--gold);margin-bottom:.4rem}
  .ci-row .v{font-family:var(--serif);font-size:1.25rem;color:var(--ink);line-height:1.3}
  .ci-row .v a{color:inherit}
  .contact-map{position:relative;border-radius:16px;overflow:hidden;min-height:360px;background:linear-gradient(150deg,#8ca79b,#4a655b)}
  .map-link{position:absolute;left:50%;bottom:1rem;transform:translateX(-50%);z-index:2;
    background:var(--bg);color:var(--ink);border:1px solid var(--line);padding:.62rem 1.15rem;
    border-radius:999px;text-decoration:none;font-family:var(--sans);font-size:.72rem;
    letter-spacing:.14em;text-transform:uppercase;white-space:nowrap;
    box-shadow:0 12px 26px -14px rgba(20,58,49,.5);
    transition:transform .45s cubic-bezier(.2,.7,.2,1),box-shadow .45s ease}
  .map-link:hover{transform:translateX(-50%) translateY(-3px);box-shadow:0 18px 32px -14px rgba(20,58,49,.55)}
  .contact-map iframe{width:100%;height:100%;min-height:360px;border:0;display:block}
  .cform{margin-top:1.6rem;display:grid;gap:.9rem}
  .cform input,.cform textarea{font-family:var(--sans);font-size:.95rem;padding:.9rem 1rem;border:1px solid var(--line);border-radius:10px;background:var(--bg);color:var(--ink);width:100%}
  .cform textarea{min-height:120px;resize:vertical}
  .cform input:focus,.cform textarea:focus{outline:none;border-color:var(--olive)}
  .cform button{justify-self:start}
  @media(max-width:820px){.contact-grid{grid-template-columns:1fr}}
  /* chatbot */
  .chat-fab{position:fixed;right:22px;bottom:22px;z-index:90;width:60px;height:60px;border-radius:50%;background:var(--olive);color:var(--cream);border:0;cursor:pointer;box-shadow:0 12px 30px rgba(20,58,49,.35);display:grid;place-items:center;transition:transform .3s ease,background .3s ease}
  .chat-fab:hover{transform:scale(1.08);background:var(--teal)}
  .chat-fab svg{width:26px;height:26px}
  .chat-panel{position:fixed;right:22px;bottom:94px;z-index:91;width:min(340px,calc(100vw - 44px));background:var(--bg);border-radius:18px;box-shadow:0 30px 60px -24px rgba(14,42,35,.5);overflow:hidden;transform:translateY(16px) scale(.96);opacity:0;pointer-events:none;transition:transform .35s cubic-bezier(.2,.7,.2,1),opacity .3s ease}
  .chat-panel.open{transform:none;opacity:1;pointer-events:auto}
  .chat-head{background:var(--teal);color:var(--cream);padding:1.1rem 1.3rem}
  .chat-head .ch-name{font-family:var(--serif);font-size:1.2rem}
  .chat-head .ch-status{font-size:.68rem;color:var(--gold-lt);margin-top:.25rem;display:flex;align-items:center;gap:.4rem}
  .chat-head .dot{width:7px;height:7px;border-radius:50%;background:#7fc98a;display:inline-block}
  .chat-msgs{padding:1.1rem;height:250px;overflow-y:auto;display:flex;flex-direction:column;gap:.65rem;background:var(--bg-2)}
  .chat-msgs .m{max-width:82%;padding:.65rem .85rem;border-radius:14px;font-size:.88rem;line-height:1.4}
  .chat-msgs .bot{background:var(--bg);color:var(--ink);align-self:flex-start;border-bottom-left-radius:4px}
  .chat-msgs .me{background:var(--olive);color:var(--cream);align-self:flex-end;border-bottom-right-radius:4px}
  .chat-input{display:flex;border-top:1px solid var(--line);background:var(--bg)}
  .chat-input input{flex:1;border:0;padding:.9rem 1rem;font-family:var(--sans);font-size:.9rem;background:transparent;color:var(--ink)}
  .chat-input input:focus{outline:none}
  .chat-input button{border:0;background:transparent;color:var(--olive);font-size:1.15rem;padding:0 1rem;cursor:pointer}
  /* ═════════════════════════════════════════════════════════════════
     PARALLAX
     Dulu memakai background-attachment:fixed. Itu memaksa browser
     melukis ulang lapisan tiap frame scroll — sumber jank-nya, dan iOS
     Safari tidak mendukungnya sama sekali. Sekarang: lapisan ::before
     yang digeser dengan transform, jadi dikomposit GPU dan mulus.
     Nilai --px diisi main.js. Tanpa JS lapisan diam dan tetap tampil
     benar, jadi ini aman kalau script gagal dimuat.
     ═════════════════════════════════════════════════════════════════ */
  /* background-attachment:fixed mengunci latar ke viewport, jadi saat band
     melintas 1620px foto ikut tampak bergeser 1620px — rasio 1:1.

     Sempat diganti lapisan ::before yang digeser transform, tapi cara itu
     hanya sanggup rasio ~0.18; menyamai 1:1 butuh lapisan setinggi 325%
     sehingga fotonya ter-crop parah. Alasan penggantian dulu adalah dugaan
     jank — dan pengukuran membantahnya: scroll 3200px di Edge menghasilkan
     60fps dengan 0% frame melewati 20ms, identik dengan versi transform.

     Tetap dibatasi min-width:769px. iOS Safari tidak mendukung fixed dan
     di sana justru benar-benar tersendat, jadi mobile sengaja tanpa parallax. */
  @media(min-width:769px){.sanctuary,.cta .ph,.feature .ph{background-attachment:fixed !important}}

  /* ── Kartu kamar: hover ──────────────────────────────────────────
     Kartu sekarang tautan ke halaman kamar, jadi hover-nya harus jelas
     mengundang klik: foto membesar pelan, kartu terangkat, bayangan
     dalam, dan garis emas tipis muncul di tepi. */
  .card{text-decoration:none;color:inherit;will-change:transform;
    transition:transform .6s cubic-bezier(.2,.7,.2,1),box-shadow .6s cubic-bezier(.2,.7,.2,1)}
  .card::before{content:"";position:absolute;inset:0;z-index:0;
    background-image:inherit;background-size:cover;background-position:center;background-repeat:no-repeat;
    transform:scale(1);transition:transform 1.2s cubic-bezier(.2,.7,.2,1);will-change:transform}
  .card::after{content:"";position:absolute;inset:0;z-index:3;border-radius:inherit;pointer-events:none;
    box-shadow:inset 0 0 0 1px rgba(203,174,114,0);transition:box-shadow .6s ease}
  .card .c-scrim{transition:opacity .6s ease}
  .card:hover,.card:focus-visible{transform:translateY(-10px);
    box-shadow:0 38px 72px -34px rgba(20,58,49,.62)}
  .card:hover::before,.card:focus-visible::before{transform:scale(1.085)}
  .card:hover::after,.card:focus-visible::after{box-shadow:inset 0 0 0 1px rgba(203,174,114,.55)}
  .card:hover .c-scrim,.card:focus-visible .c-scrim{opacity:.93}
  .card:focus-visible{outline:2px solid var(--gold);outline-offset:4px}

  /* ── Foto yang bisa dibuka ───────────────────────────────────────── */
  /* Grid galeri: baris terjustifikasi (lihat gallery.js), bukan CSS columns.
     Dengan columns, isi mengalir turun kolom 1 lalu pindah ke kolom 2 dan 3,
     sehingga tiap batch baru seolah muncul di kanan alih-alih menyambung ke
     bawah. Tinggi dan lebar tiap <img> diatur inline oleh gallery.js. */
  .pg-grid{display:flex;flex-direction:column;gap:14px;
    max-width:var(--maxw);margin:0 auto}
  /* nowrap wajib: lebar tiap baris sudah dihitung pas oleh gallery.js.
     Kalau boleh wrap, selisih sub-piksel bikin foto terakhir jatuh ke
     baris berikutnya dan grid runtuh jadi satu kolom. */
  .pg-row{display:flex;gap:14px;justify-content:flex-start;flex-wrap:nowrap}
  .pg-grid img,.g-grid .ph{cursor:zoom-in}
  .pg-grid img{display:block;border-radius:12px;object-fit:cover;flex:none;
    opacity:0;transform:translateY(16px);
    transition:opacity .55s ease,transform .55s cubic-bezier(.2,.7,.2,1),box-shadow .5s ease}
  .pg-grid img.in{opacity:1;transform:translateY(0)}
  .pg-grid img.in:hover{transform:translateY(-4px) scale(1.015);
    box-shadow:0 26px 48px -26px rgba(20,58,49,.5)}
  .g-grid .ph{transition:transform .6s cubic-bezier(.2,.7,.2,1),box-shadow .6s ease}
  .g-grid .ph::before{content:"";position:absolute;inset:0;z-index:0;
    background-image:inherit;background-size:cover;background-position:center;background-repeat:no-repeat;
    transform:scale(1);transition:transform 1.15s cubic-bezier(.2,.7,.2,1)}
  .g-grid .ph::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
    background:rgba(12,32,26,0);transition:background .5s ease}
  .g-grid .ph:hover{box-shadow:0 26px 50px -28px rgba(20,58,49,.55)}
  .g-grid .ph:hover::before{transform:scale(1.075)}
  .g-grid .ph:hover::after{background:rgba(12,32,26,.14)}

  /* ── Spinner (dipakai lightbox dan galeri) ───────────────────────── */
  .spin{width:24px;height:24px;border-radius:50%;flex:none;
    border:2px solid rgba(243,239,230,.22);border-top-color:var(--gold-lt);
    animation:spin .8s linear infinite}
  @keyframes spin{to{transform:rotate(360deg)}}
  .g-loader{display:flex;align-items:center;justify-content:center;gap:.75rem;height:70px;
    font-family:var(--sans);font-size:.72rem;letter-spacing:.18em;text-transform:uppercase;
    color:var(--ink-soft);opacity:0;transition:opacity .3s ease}
  .g-loader.on{opacity:1}
  .g-loader .spin{border-color:rgba(27,38,32,.16);border-top-color:var(--olive)}

  /* ── Lightbox ────────────────────────────────────────────────────── */
  .lb{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;
    background:rgba(9,20,17,.95);opacity:0;visibility:hidden;
    transition:opacity .4s ease,visibility .4s}
  .lb.open{opacity:1;visibility:visible}
  .lb-stage{position:relative;width:100%;height:100%;display:flex;align-items:center;
    justify-content:center;padding:clamp(3.2rem,7vw,4.5rem) clamp(1rem,7vw,5rem);overflow:hidden}
  .lb-img{max-width:100%;max-height:100%;object-fit:contain;border-radius:4px;
    box-shadow:0 40px 90px -40px rgba(0,0,0,.85);cursor:zoom-in;
    user-select:none;-webkit-user-drag:none;
    opacity:0;transform:translateX(var(--sx,0)) scale(.965);
    transition:opacity .38s ease,transform .5s cubic-bezier(.2,.7,.2,1)}
  .lb-img.ready{opacity:1;transform:translateX(0) scale(1)}
  .lb-img.zoom{cursor:zoom-out;transform:scale(2.1);transition:transform .5s cubic-bezier(.2,.7,.2,1)}
  /* pointer-events:none wajib — spinner ber-opacity:0 tetap menangkap klik
     dan persis menutupi titik tengah foto, sehingga klik-untuk-zoom mati. */
  .lb-spin{position:absolute;z-index:1;opacity:0;pointer-events:none;transition:opacity .25s ease}
  .lb-spin.on{opacity:1}
  .lb-btn{position:absolute;z-index:3;width:clamp(42px,5vw,54px);height:clamp(42px,5vw,54px);
    border-radius:50%;border:1px solid rgba(243,239,230,.24);background:rgba(9,20,17,.45);
    color:var(--cream);cursor:pointer;display:flex;align-items:center;justify-content:center;
    transition:background .3s ease,border-color .3s ease,transform .3s cubic-bezier(.2,.7,.2,1)}
  .lb-btn svg{width:40%;height:40%}
  .lb-btn:hover{background:rgba(243,239,230,.15);border-color:rgba(243,239,230,.55)}
  .lb-btn:focus-visible{outline:2px solid var(--gold-lt);outline-offset:3px}
  .lb-prev,.lb-next{top:50%;margin-top:calc(clamp(42px,5vw,54px) / -2)}
  .lb-prev{left:clamp(.5rem,2vw,1.6rem)}
  .lb-prev:hover{transform:translateX(-3px)}
  .lb-next{right:clamp(.5rem,2vw,1.6rem)}
  .lb-next:hover{transform:translateX(3px)}
  .lb-close{top:clamp(.7rem,2vw,1.4rem);right:clamp(.7rem,2vw,1.4rem)}
  .lb-close:hover{transform:rotate(90deg)}
  .lb-cap{position:absolute;left:0;right:0;bottom:clamp(.7rem,2.4vw,1.5rem);z-index:3;
    text-align:center;color:var(--cream-soft);font-family:var(--sans);
    font-size:.74rem;letter-spacing:.16em;text-transform:uppercase;pointer-events:none}
  .lb-cap b{color:var(--cream);font-weight:400}
  body.lb-open{overflow:hidden}
  @media(max-width:560px){
    .lb-prev,.lb-next{top:auto;bottom:3.4rem;margin-top:0}
    .lb-cap{bottom:1rem}
  }

  /* ── Perpindahan filter (Dining, Spa, Galeri) ─────────────────────
     Sebelumnya display di-set langsung tanpa transisi sehingga baris
     berkedip kasar. Sekarang keluar dulu, baru masuk bertahap. */
  .trow{transition:opacity .32s ease,transform .32s cubic-bezier(.2,.7,.2,1)}
  .trow.f-out{opacity:0;transform:translateY(8px)}
  .trow.f-in{animation:rowIn .55s cubic-bezier(.2,.7,.2,1) both;animation-delay:var(--d,0ms)}
  @keyframes rowIn{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
  .filter-btn{transition:background .35s ease,color .35s ease,border-color .35s ease}
  .pg-grid.swapping{opacity:0;transform:translateY(10px)}
  .pg-grid{transition:opacity .3s ease,transform .3s cubic-bezier(.2,.7,.2,1)}

  /* ═════════════════════════════════════════════════════════════════
     HALAMAN DETAIL KAMAR  (room-*.html)
     ═════════════════════════════════════════════════════════════════ */
  .rg-grid{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:210px;
    gap:clamp(.5rem,1.2vw,.85rem)}
  .rg-grid img{width:100%;height:100%;object-fit:cover;display:block;border-radius:12px;
    cursor:zoom-in;transition:transform .6s cubic-bezier(.2,.7,.2,1),box-shadow .6s ease}
  .rg-grid img:hover{transform:translateY(-4px) scale(1.012);
    box-shadow:0 26px 48px -26px rgba(20,58,49,.5)}
  .rg-grid img:nth-child(1){grid-column:span 2;grid-row:span 2}
  .rg-grid img:nth-child(6){grid-column:span 2}

  .room-body{display:grid;grid-template-columns:1.55fr .95fr;
    gap:clamp(2rem,5vw,4.5rem);align-items:start}
  .room-prose p{font-size:1.02rem;line-height:1.85;color:var(--ink-soft);margin-bottom:1.15rem}
  .room-prose p:first-child{font-family:var(--serif);font-size:clamp(1.25rem,2vw,1.55rem);
    line-height:1.6;color:var(--ink)}

  .book-card{position:sticky;top:110px;background:var(--bg-2);border:1px solid var(--line);
    border-radius:16px;padding:clamp(1.4rem,2.4vw,2rem)}
  .book-card .bc-price{font-family:var(--serif);font-size:2.1rem;color:var(--ink);line-height:1}
  .book-card .bc-price span{font-family:var(--sans);font-size:.8rem;color:var(--ink-soft)}
  .book-card .bc-specs{margin:1.4rem 0;border-top:1px solid var(--line)}
  .book-card .bc-row{display:flex;justify-content:space-between;gap:1rem;
    padding:.72rem 0;border-bottom:1px solid var(--line);font-size:.9rem}
  .book-card .bc-row .k{color:var(--ink-soft)}
  .book-card .bc-row .v{color:var(--ink)}
  .book-card .btn{width:100%;justify-content:center;text-align:center}
  .book-card .bc-note{margin-top:.9rem;font-size:.76rem;color:var(--ink-soft);text-align:center}

  .amen-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(1rem,2.2vw,1.7rem)}
  .amen{border-top:1px solid var(--line);padding-top:1rem}
  .amen h4{font-family:var(--sans);font-weight:500;font-size:.88rem;color:var(--ink);
    margin-bottom:.35rem;letter-spacing:.01em}
  .amen p{font-size:.82rem;line-height:1.6;color:var(--ink-soft)}

  .room-nav{display:flex;justify-content:space-between;gap:1rem;flex-wrap:wrap;
    border-top:1px solid var(--line);padding-top:1.6rem;margin-top:clamp(2.5rem,5vw,4rem)}

  /* ═════════════════════════════════════════════════════════════════
     HALAMAN ARTIKEL  (post-*.html)
     ═════════════════════════════════════════════════════════════════ */
  .post-meta{display:flex;justify-content:center;gap:.7rem;align-items:center;
    font-family:var(--sans);font-size:.74rem;letter-spacing:.16em;text-transform:uppercase;
    color:var(--ink-soft);margin-top:1.4rem}
  .post-meta .dot{width:3px;height:3px;border-radius:50%;background:var(--gold);flex:none}
  .post-hero{width:100%;aspect-ratio:16/8;object-fit:cover;display:block;border-radius:16px}
  .post-body{max-width:68ch;margin:0 auto}
  .post-body p{font-size:1.06rem;line-height:1.88;color:var(--ink-soft);margin-bottom:1.5rem}
  .post-body p:first-of-type{font-family:var(--serif);font-size:clamp(1.3rem,2.2vw,1.62rem);
    line-height:1.6;color:var(--ink)}
  .post-body .pull{font-family:var(--serif);font-size:clamp(1.5rem,3vw,2.15rem);
    line-height:1.35;color:var(--teal);text-align:center;
    margin:clamp(2.2rem,5vw,3.5rem) 0;padding:clamp(1.6rem,3vw,2.4rem) 0;
    border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
  .post-back{display:flex;justify-content:center;margin-top:clamp(2.5rem,5vw,3.5rem)}

  /* Seluruh kartu blog bisa diklik lewat tautan "Read more" yang sudah ada —
     lapisan ::after menutupi kartu. Menghindari <a> bersarang, yang HTML-nya
     tidak sah, dan tidak butuh JS. */
  .blog-card,.blog-feature{position:relative}
  .blog-card .bmeta a::after,.blog-feature .arrow-link::after{content:"";position:absolute;inset:0;z-index:1}
  .blog-card{transition:transform .55s cubic-bezier(.2,.7,.2,1),box-shadow .55s ease}
  .blog-card:hover{transform:translateY(-6px);box-shadow:0 30px 56px -30px rgba(20,58,49,.5)}
  .blog-card .bimg{transition:transform 1.1s cubic-bezier(.2,.7,.2,1)}
  .blog-card:hover .bimg{transform:scale(1.05)}
  .blog-card{overflow:hidden}

  @media(max-width:980px){
    .rg-grid{grid-template-columns:repeat(2,1fr);grid-auto-rows:200px}
    .rg-grid img:nth-child(1){grid-column:span 2;grid-row:span 1}
    .rg-grid img:nth-child(6){grid-column:span 1}
    .amen-grid{grid-template-columns:repeat(2,1fr)}
  }
  @media(max-width:880px){
    .room-body{grid-template-columns:1fr}
    .book-card{position:static}
  }
  @media(max-width:560px){
    .rg-grid{grid-template-columns:1fr;grid-auto-rows:230px}
    .rg-grid img:nth-child(1){grid-column:span 1}
    .amen-grid{grid-template-columns:1fr}
  }

  /* ═════════════════════════════════════════════════════════════════
     PERBAIKAN RESPONSIF & KETERBACAAN
     ═════════════════════════════════════════════════════════════════ */

  /* 1. Menu mobile bocor.
     Sebelumnya keadaan tertutup hanya translateY(-100%) tanpa disembunyikan.
     Karena isinya (9 tautan + tombol) bisa lebih tinggi dari viewport,
     flex centering membuatnya meluber keluar kotak — dan kotak itu cuma
     digeser setinggi satu viewport, jadi luberannya jatuh kembali ke layar.
     Itu sebabnya tombol Book Now muncul mengambang di bawah header.
     Sekarang: benar-benar disembunyikan saat tertutup, dan bisa discroll
     kalau isinya kepanjangan. */
  .mobile-menu{
    z-index:70;                       /* di atas header (60), dulu 55 —
                                         itu sebabnya logo tembus ke menu */
    justify-content:flex-start;
    padding-block:5.5rem 3rem;
    overflow-y:auto;
    overscroll-behavior:contain;
    visibility:hidden;pointer-events:none;
    transition:transform .5s cubic-bezier(.7,0,.2,1),visibility .5s;
  }
  .mobile-menu.open{visibility:visible;pointer-events:auto}
  /* Header disembunyikan selagi menu terbuka supaya logo tidak menimpa
     daftar menu. Tombol tutup disuntikkan main.js ke dalam menu. */
  body.menu-open header{opacity:0;pointer-events:none}
  /* FAB chat z-index-nya 90, di atas menu — ikut disembunyikan supaya
     tidak mengambang menutupi daftar menu. */
  body.menu-open .chat-fab,body.menu-open .chat-panel{opacity:0;pointer-events:none}
  .chat-fab{transition:transform .3s ease,background .3s ease,opacity .3s ease}
  header{transition:background .4s ease,padding .4s ease,box-shadow .4s ease,opacity .3s ease}
  .mm-close{position:absolute;top:1.15rem;right:var(--pad);z-index:2;
    width:46px;height:46px;border:1px solid rgba(243,239,230,.28);border-radius:50%;
    background:none;color:var(--cream);cursor:pointer;display:grid;place-items:center;
    transition:background .3s ease,transform .3s ease}
  .mm-close:hover{background:rgba(243,239,230,.12);transform:rotate(90deg)}
  .mm-close svg{width:19px;height:19px}
  /* .mobile-menu a menetapkan padding:.5rem 0 dan itu menimpa padding milik
     .btn karena selektornya lebih spesifik — akibatnya tombol Book Now di
     menu mobile kehilangan padding kiri-kanan dan tidak terlihat seperti
     tombol. Dikembalikan di sini dengan spesifisitas yang cukup. */
  .mobile-menu a.mm-book{
    margin-top:2.2rem;align-self:flex-start;
    padding:1rem 2.1rem;border-bottom:0;border-radius:999px;
    background:var(--olive);color:var(--cream);border-color:transparent;
    min-height:48px;display:inline-flex;align-items:center;justify-content:center;
  }
  .mobile-menu a.mm-book:hover{background:var(--cream);color:var(--teal)}

  /* 2. Teks fasilitas di band gelap.
     .amen dirancang untuk latar terang, tapi dipakai di dalam .feature.dark —
     hijau-arang di atas teal gelap, rasio 1.25:1, praktis tak terbaca. */
  .feature.dark .amen{border-top-color:rgba(243,239,230,.22)}
  .feature.dark .amen h4{color:var(--cream)}
  .feature.dark .amen p{color:rgba(243,239,230,.74)}

  /* 3. Label emas di latar terang memakai varian gelap agar lolos AA.
     Garis dekoratif ::before tetap emas cerah. */
  .eyebrow{color:var(--gold-ink)}
  .eyebrow::before{background:var(--gold)}
  .bcat,.blog-card .bmeta a,.contact-info .l{color:var(--gold-ink)}
  /* Di latar gelap emas cerah justru yang kontras — kembalikan. */
  .sanctuary .eyebrow,.cta .eyebrow,.feature.dark .eyebrow,
  .mobile-menu .eyebrow{color:var(--gold-lt)}
  .sanctuary .eyebrow::before,.cta .eyebrow::before,
  .feature.dark .eyebrow::before{background:var(--gold-lt)}

  /* 4. Target sentuh minimal 44px di layar sentuh (WCAG 2.5.5). */
  .hamburger{min-width:44px;min-height:44px;align-items:center;justify-content:center}
  .f-news{align-items:center}
  .f-news input{min-height:44px}
  .f-news button{min-width:44px;min-height:44px;display:grid;place-items:center}
  @media(max-width:880px){
    .footer-nav a,.f-col a{min-height:40px;display:flex;align-items:center}
    .ci-row .v a{min-height:40px;display:inline-flex;align-items:center}
  }

  /* 5. Pil filter terasa sesak dan terlalu pendek untuk disentuh.
     Padding dilonggarkan dan tingginya dinaikkan ke 44px. */
  .filter-btn{padding:.82rem 1.5rem;min-height:44px;display:inline-flex;
    align-items:center;justify-content:center}
  .filter-bar{gap:.6rem;flex-wrap:wrap}

  /* 6. Tautan teks: minimal 24px tinggi (WCAG 2.5.8 AA). */
  .arrow-link,.ig,.bmeta a,.bcat{min-height:24px;align-items:center}
  .arrow-link,.ig,.bmeta a{display:inline-flex}

  /* 7. Kicker hero 4.47:1 — meleset tipis dari 4.5. Olive digelapkan
     sedikit khusus untuk teks kecil ini. */
  .hero-kicker{color:#55693a}

  /* 8. FOOTER MEMBUAT HALAMAN MELAR DI PONSEL 360-393px.
     .f-top berhenti di 2 kolom (media 980px). Di layar 360px ruangnya
     cuma ~305px, sedangkan kolom newsletter butuh ~182px dan kolom
     tautan ~152px: total 374px. Item grid punya min-width:auto bawaan
     sehingga menolak menyusut, dokumen melar ke 394px, dan halaman jadi
     bisa digeser ke samping — itu "gap" yang terlihat di ponsel.
     HP >=412px kebetulan muat, makanya sebagian terlihat normal. */
  .f-top > *{min-width:0}
  .f-news input{min-width:0}
  @media(max-width:620px){
    .f-top{grid-template-columns:1fr;gap:2.2rem}
  }
  /* Jaring pengaman: tidak ada satu pun elemen boleh melebihi lebar layar. */
  html{overflow-x:hidden}

  /* 9. FOTO LATAR DITUNDA MUAT.
     Beranda sempat menarik 5 MB sekaligus karena 13 foto dipasang lewat
     background-image, yang tidak punya loading="lazy" seperti <img>.

     URL-nya kini disimpan di --bg. Browser TIDAK mengunduh url() di dalam
     custom property sampai property itu dipakai, jadi fotonya baru diambil
     ketika main.js menambahkan .bg-in saat elemen mendekati layar.
     Blok <noscript> di head.php menerapkannya langsung kalau JS gagal. */
  .lazy-bg{background-image:none;
    background-position:center;background-size:cover;background-repeat:no-repeat}
  .lazy-bg.bg-in{background-image:var(--bg)}
  /* Warna dasar selagi foto belum turun, supaya tidak berkedip putih. */
  .card.lazy-bg,.g-grid .ph.lazy-bg,.blog-card .bimg.lazy-bg{background-color:var(--bg-2)}
  .sanctuary.lazy-bg,.cta .ph.lazy-bg,.feature .ph.lazy-bg{background-color:var(--teal-deep)}
  .lazy-bg.bg-in{transition:background-color .4s ease}

  /* 8. .arrow-link juga emas di latar terang: 2.57:1. Ini sempat lolos dari
     audit karena pemeriksa kontras hanya melihat simpul tanpa anak, padahal
     .arrow-link punya <span class="ln"> di dalamnya. */
  .arrow-link{color:var(--gold-ink)}
  .sanctuary .arrow-link,.cta .arrow-link,.feature.dark .arrow-link,
  .card .arrow-link{color:var(--gold-lt)}

  /* 9. Lewati-ke-konten untuk pengguna papan ketik. */
  .skip{position:absolute;left:-9999px;top:0;z-index:200;
    background:var(--teal);color:var(--cream);padding:.85rem 1.4rem;
    font-family:var(--sans);font-size:.78rem;letter-spacing:.14em;text-transform:uppercase}
  .skip:focus{left:.75rem;top:.75rem}

  /* 10. Formulir kontak: status kirim dan umpan bot. */
  .cform-status{margin-top:.9rem;font-size:.85rem;line-height:1.6;color:var(--ink-soft)}
  .cform-status.ok{color:var(--teal)}
  .cform-status.err{color:#8c3b2e}
  .cform-status:empty{margin-top:0}
  .cform button[type=submit][disabled]{opacity:.6;cursor:progress}
  /* Umpan bot: disembunyikan dari mata DAN dari pembaca layar, tapi tetap
     ada di DOM. Jangan pakai display:none — sebagian bot melewatinya. */
  .cform-hp{position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden}

  /* ══════════════════════════════════════════════════════════════════
     EXELY BOOKING ENGINE
     ══════════════════════════════════════════════════════════════════

     Search form dan mesin pemesanan dirender di dalam IFRAME same-origin
     milik Exely. Warna, font, dan tata letak DI DALAM iframe tidak bisa
     disentuh dari berkas ini — itu diatur tema di Exely Suite. Yang kita
     kuasai adalah pembungkusnya, dan itulah yang ditata di bawah.

     Lihat deploy/scripts/exely-theme.css untuk potongan CSS yang perlu
     ditempel ke tema Exely agar isi widgetnya ikut memakai palet ini. */

  /* Pita search form. Dipasang tepat DI BAWAH hero atau page-head, di
     setiap halaman kecuali halaman pemesanan (checklist Exely poin 2:
     semua halaman, selebar konten utama, di atas lipatan).

     Di atas judul halaman posisinya sempat dicoba dan ditolak: pita form
     menempel ke header dan menekan judul turun.

     Latarnya --hero-cream, sama dengan .hero dan .page-head yang selalu
     mendahuluinya, jadi keduanya terbaca sebagai satu blok pembuka.
     padding-top nol karena jarak atasnya sudah diberi padding bawah blok
     di atasnya — kalau tidak, jaraknya jadi dobel. */
  .searchband{
    background:var(--hero-cream);
    padding-top:0;
    padding-bottom:clamp(2rem,4.5vw,3.2rem);
  }

  /* Kartu pembungkus widget.

     Berkas asli Exely memberi #block-search latar #F2F2F2 dan bayangan abu
     — abu terang generik yang bertabrakan dengan palet hijau-batu. Diganti
     token situs. min-height mengunci tinggi sebelum widget termuat supaya
     halaman tidak melompat: 93px di lebar penuh (tata letak horizontal
     Exely), 180px saat widget menumpuk jadi empat baris. */
  #block-search{
    background:var(--bg);
    border:1px solid var(--line);
    border-radius:14px;
    box-shadow:0 10px 30px rgba(20,58,49,.08);
    overflow:hidden;
    min-height:93px;
  }
  #block-search,#block-search *{box-sizing:border-box}
  #block-search iframe{display:block;border:0}

  /* Isi #be-search-form diganti seluruhnya oleh widget begitu termuat, jadi
     dua elemen ini hanya terlihat kalau skrip Exely gagal. Tanpa keduanya
     yang tersisa hanyalah kotak kosong setinggi 93px. */
  .sf-fallback{
    font-size:.92rem;color:var(--ink-soft);padding:1.4rem 1.6rem;margin:0;
  }
  .sf-fallback a{color:var(--gold-ink);text-decoration:underline}
  .sf-credit{
    display:block;padding:0 1.6rem 1.2rem;
    font-size:.72rem;letter-spacing:.04em;color:var(--ink-soft);opacity:.55;
  }

  @media(max-width:820px){
    #block-search{min-height:180px}
  }
  @media(max-width:560px){
    #block-search{border-radius:12px;min-height:396px}
  }

  /* Halaman pemesanan. Sengaja sunyi: tanpa band CTA, tanpa widget chat,
     footer ringkas — checklist poin 3.3. */
  .page-head--slim{padding-bottom:clamp(1.6rem,3.5vw,2.4rem)}
  .page-head--slim h1{font-size:clamp(2rem,5vw,3.4rem)}
  .booking-section{padding-block:0 var(--sec)}
  /* Exely memberi #be-booking-form max-width 1200px; .wrap sudah membatasi
     di 1220px berikut padding kiri-kanan, yang sekaligus memenuhi syarat
     "search form dan booking engine harus punya jarak kiri dan kanan"
     (checklist poin 5). */
  #be-booking-form{width:100%;margin:0 auto;min-height:420px;position:relative;z-index:1}
  .booking-fallback{color:var(--ink-soft);font-size:.95rem;max-width:52ch}
  .booking-fallback a{color:var(--gold-ink);text-decoration:underline}

  .footer--slim{background:var(--teal);color:var(--cream-soft);padding-block:1.6rem}
  .footer--slim .f-bottom{border-top:0;margin-top:0;padding-top:0;
    display:flex;justify-content:space-between;align-items:center;gap:1rem;flex-wrap:wrap}
  .footer--slim a{color:var(--cream-soft);min-height:24px;display:inline-flex;align-items:center}
  .footer--slim a:hover{color:var(--cream)}

  /* Jalur kedua di band CTA: tombol utama kini menuju mesin pemesanan,
     tautan ini menjaga form pertanyaan tetap punya pintu masuk. */
  .cta-alt{
    display:inline-flex;align-items:center;min-height:24px;margin-top:1.4rem;
    font-family:var(--sans);font-size:.8rem;letter-spacing:.06em;
    color:rgba(243,239,230,.78);border-bottom:1px solid rgba(243,239,230,.3);
    padding-bottom:2px;transition:color .3s ease,border-color .3s ease;
  }
  .cta-alt:hover{color:var(--cream);border-color:var(--cream)}
  .cta .inner{display:flex;flex-direction:column;align-items:center}
  .cta .inner > .btn{align-self:center}

  /* ── Hormati preferensi kurangi-gerak ────────────────────────────── */
  @media(prefers-reduced-motion:reduce){
    .px::before{transform:none !important}
    .card::before,.g-grid .ph::before,.lb-img,.pg-grid img{transition-duration:.01ms !important}
    .trow.f-in{animation:none}
    .spin{animation-duration:2.4s}
  }
