{"id":7545,"date":"2026-10-23T11:34:52","date_gmt":"2026-10-23T11:34:52","guid":{"rendered":"https:\/\/rosevilleconfinement.com\/?page_id=7545"},"modified":"2026-11-05T06:11:48","modified_gmt":"2026-11-05T06:11:48","slug":"keahlian-spa","status":"publish","type":"page","link":"https:\/\/rosevilleconfinement.com\/en\/keahlian-spa\/","title":{"rendered":"Keahlian Spa"},"content":{"rendered":"<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"><link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin><link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@400;500;600;700;800&amp;display=swap\"><style>.rv2{--latar:#FBF8F4;--kad:#fff;--blush:#F3DCD7;--blush2:#F9ECE8;--mawar:#C27C7A;--mawar-tua:#9A5654;--sage:#DCE8DF;--sage2:#EEF4EF;--euc:#2F6B5E;--euc-tua:#24564B;--emas:#C9A46A;--teks:#2E2A2B;--sub:#5F5658;--garis:#EDE3DD;--wa:#25D366;--wa-tua:#0F7A3F;--serif:\"Montserrat\",system-ui,-apple-system,\"Segoe UI\",sans-serif;--sans:\"Montserrat\",system-ui,-apple-system,\"Segoe UI\",sans-serif;--r:22px;--rk:14px;--bayang:0 12px 34px rgba(46,42,43,.08);--grad:linear-gradient(100deg,#C27C7A 0%,#B58B5E 45%,#2F6B5E 100%)}.rv2,.rv2 *,.rv2 *::before,.rv2 *::after{box-sizing:border-box}.rv2{color:var(--teks);font:16.5px\/1.72 var(--sans);-webkit-font-smoothing:antialiased}.rv2 img{max-width:100%;display:block}.rv2 a{color:var(--euc)}.rv2 h1,.rv2 h2,.rv2 h3{line-height:1.15;margin:0 0 .4em}.rv2 h1,.rv2 h2{font-family:var(--serif);font-weight:700;letter-spacing:-.025em}.rv2 h1{font-size:clamp(32px,4.5vw,54px);line-height:1.12}.rv2 h2{font-size:clamp(25px,2.9vw,36px)}.rv2 h3{font-size:18px;font-weight:700;letter-spacing:-.01em}.rv2 .wrap{max-width:1180px;margin:0 auto;padding:0 20px;position:relative}.rv2 .eye{font-size:12.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--mawar-tua);margin:0 0 10px}.rv2 .lead{font-size:19px;color:var(--sub);max-width:58ch}.rv2 .pengantar{color:var(--sub);max-width:68ch}.rv2 .tengah{text-align:center;margin-left:auto;margin-right:auto}.rv2 .grad{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}.rv2 .ik{flex:0 0 auto;vertical-align:middle}.rv2 .kecil-sub{font-size:13.5px;color:var(--sub)}.rv2 .kepala-laman{position:sticky;top:44px;z-index:50;padding:12px 20px 0}.rv2 .nav-pil{max-width:1180px;margin:0 auto;display:flex;align-items:center;gap:6px;background:rgba(255,255,255,.74);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid rgba(255,255,255,.9);box-shadow:0 10px 30px rgba(46,42,43,.08);border-radius:999px;padding:8px 8px 8px 16px}.rv2 .logo{display:flex;align-items:center;gap:9px;text-decoration:none;color:var(--teks);margin-right:auto}.rv2 .logo img{width:30px;height:auto}.rv2 .logo b{font-family:var(--serif);font-size:21px;font-weight:600;color:var(--mawar-tua)}.rv2 .logo small{display:block;font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--sub);margin-top:-3px}.rv2 .nav-pil nav{display:flex;gap:2px}.rv2 .nav-pil nav a{font-size:14.5px;font-weight:600;color:var(--teks);text-decoration:none;padding:8px 13px;border-radius:999px}.rv2 .nav-pil nav a:hover,.rv2 .nav-pil nav a.aktif{background:var(--blush2);color:var(--mawar-tua)}.rv2 .bahasa{font-size:13px;font-weight:700;color:var(--sub);padding:0 8px;text-decoration:none}.rv2 .menu-btn{display:none;background:none;border:0;padding:8px;color:var(--teks);cursor:pointer}.rv2 .btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font:700 15.5px\/1 var(--sans);border-radius:999px;padding:14px 22px;text-decoration:none;border:2px solid transparent;cursor:pointer;transition:transform .15s,box-shadow .15s,background .15s}.rv2 .btn:hover{transform:translateY(-1px)}.rv2 .btn:focus-visible,.rv2 a:focus-visible,.rv2 button:focus-visible,.rv2 input:focus-visible,.rv2 select:focus-visible{outline:3px solid var(--emas);outline-offset:2px}.rv2 .btn-utama{background:var(--euc);color:#fff;box-shadow:0 8px 20px rgba(47,107,94,.25)}.rv2 .btn-utama:hover{background:var(--euc-tua)}.rv2 .btn-kedua{background:#fff;color:var(--teks);border-color:var(--garis)}.rv2 .btn-garis{background:transparent;color:var(--euc);border-color:var(--euc)}.rv2 .btn-wa{background:var(--wa);color:#063D1E}.rv2 .btn-wa:hover{background:#1FBF5B}.rv2 .btn-utama-wa{background:var(--wa);color:#063D1E;box-shadow:0 8px 20px rgba(37,211,102,.28)}.rv2 .btn.kecil{padding:10px 15px;font-size:14px}.rv2 .btn.penuh{width:100%}.rv2 .cta-baris{display:flex;gap:10px;flex-wrap:wrap;margin:22px 0 0}.rv2 .cta-baris.tengah{justify-content:center}.rv2 .pautan-anak{font-weight:700;text-decoration:none;color:var(--euc)}.rv2 .wa-teks{color:var(--wa-tua)}.rv2 .wa-teks .ik{display:none}.rv2 .hero{position:relative;overflow:hidden;padding:46px 0 70px}.rv2 .hero-grid{display:grid;grid-template-columns:1.05fr 1fr;gap:46px;align-items:center}.rv2 .hero h1{max-width:15ch}.rv2 .bukti{list-style:none;padding:0;margin:22px 0 0;display:flex;flex-wrap:wrap;gap:8px 18px;font-size:14.5px;color:var(--sub);font-weight:600}.rv2 .bukti li{display:flex;gap:6px;align-items:center}.rv2 .bukti .ik{color:var(--euc)}.rv2 .hero-vis{position:relative}.rv2 .bingkai{border-radius:var(--r);overflow:hidden;background:var(--blush2);box-shadow:var(--bayang)}.rv2 .bingkai.besar{border-radius:34px;aspect-ratio:4\/3.3}.rv2 .bingkai.besar img{width:100%;height:100%;object-fit:cover}.rv2 .bingkai img.foto{width:100%;height:100%;object-fit:cover;aspect-ratio:3\/2}.rv2 .kaca{position:absolute;background:rgba(255,255,255,.82);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid #fff;border-radius:18px;padding:12px 16px;box-shadow:var(--bayang);display:flex;flex-direction:column;font-size:13px;color:var(--sub)}.rv2 .kaca b{font-size:20px;color:var(--teks);display:flex;align-items:center;gap:4px}.rv2 .kaca .ik{color:var(--emas)}.rv2 .k1{left:-22px;bottom:34px}.rv2 .k2{right:-14px;top:26px}.rv2 .blob{position:absolute;border-radius:50%;filter:blur(8px);z-index:-1;opacity:.85}.rv2 .hero .b1,.rv2 .kepala .b1{width:420px;height:420px;background:var(--blush);right:-120px;top:-80px}.rv2 .hero .b2,.rv2 .kepala .b2{width:300px;height:300px;background:var(--sage);left:-110px;bottom:-120px}.rv2 .ganti{display:grid;place-items:center;text-align:center;color:var(--mawar-tua);background:repeating-linear-gradient(135deg,var(--blush2),var(--blush2) 12px,#fff 12px,#fff 24px);aspect-ratio:3\/2;font-weight:700;font-size:14px}.rv2 .ganti small{font-weight:600;color:var(--sub)}.rv2 .kepala{position:relative;overflow:hidden;padding:56px 0 46px}.rv2 .kepala h1{max-width:18ch}.rv2 .stat{padding:0 0 30px}.rv2 .stat-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:12px}.rv2 .stat-grid div{background:var(--kad);border:1px solid var(--garis);border-radius:20px;padding:18px;text-align:center;box-shadow:0 6px 18px rgba(46,42,43,.04)}.rv2 .stat-grid b{display:block;font:600 36px\/1.1 var(--serif);color:var(--euc)}.rv2 .stat-grid span{font-size:13.5px;color:var(--sub)}.rv2 .blok{padding:64px 0}.rv2 .blok.lembut{background:linear-gradient(180deg,var(--blush2),var(--latar))}.rv2 .tajuk-baris{display:flex;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:26px;flex-wrap:wrap}.rv2 .niat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-top:26px}.rv2 .niat-kad{background:var(--kad);border:1px solid var(--garis);border-radius:var(--r);padding:20px;display:flex;flex-direction:column;gap:6px;box-shadow:0 8px 22px rgba(46,42,43,.05);transition:transform .2s}.rv2 .niat-kad:hover{transform:translateY(-3px)}.rv2 .niat-kad h3{font-family:var(--serif);font-weight:600;font-size:21px}.rv2 .niat-kad p{color:var(--sub);margin:0 0 6px;font-size:15px;flex:1}.rv2 .empati{background:var(--euc);color:#F4F8F5;padding:70px 0;position:relative;overflow:hidden}.rv2 .empati .ungkap{font:500 clamp(26px,3.6vw,44px)\/1.25 var(--serif);max-width:26ch;margin:0 auto;text-align:center}.rv2 .ungkap span{opacity:.18;transition:opacity .5s}.rv2 .ungkap span.nampak{opacity:1}.rv2 .ciri-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:26px}.rv2 .ciri{background:var(--kad);border:1px solid var(--garis);border-radius:var(--r);padding:22px}.rv2 .ciri .ik{color:var(--mawar);margin-bottom:10px}.rv2 .ciri p{color:var(--sub);margin:0;font-size:15px}.rv2 .ciri.kecil{display:flex;gap:12px;align-items:flex-start}.rv2 .ciri.kecil h3{font-size:16px;margin-bottom:2px}@media (max-width:420px){.rv2 .ciri.kecil{padding:16px}}.rv2 .tab-pil{display:inline-flex;gap:4px;background:#fff;border:1px solid var(--garis);border-radius:999px;padding:5px;margin:0 0 22px;flex-wrap:wrap}.rv2 .tab-pil button{font:700 14.5px var(--sans);border:0;background:none;border-radius:999px;padding:10px 16px;cursor:pointer;color:var(--sub)}.rv2 .tab-pil button[aria-selected=\"true\"]{background:var(--euc);color:#fff}.rv2 .tab-pil.gulung{display:flex;overflow-x:auto;flex-wrap:nowrap;max-width:100%}.rv2 .tab-panel{display:none}.rv2 .tab-panel.aktif{display:block;animation:muncul .35s ease}@keyframes muncul{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.rv2 .bilik-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}.rv2 .kad-bilik{text-decoration:none;color:inherit;background:#fff;border:1px solid var(--garis);border-radius:var(--r);overflow:hidden;transition:transform .2s,box-shadow .2s}.rv2 .kad-bilik:hover{transform:translateY(-4px);box-shadow:var(--bayang)}.rv2 .kad-bilik .bingkai{border-radius:0;box-shadow:none}.rv2 .isi{padding:18px 20px 22px}.rv2 .isi p{color:var(--sub);margin:0;font-size:15px}.rv2 .cip{display:inline-block;font-size:12px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;background:var(--sage);color:var(--euc);border-radius:999px;padding:4px 10px;margin-bottom:8px}.rv2 .langkah{list-style:none;padding:0;margin:28px 0;display:grid;grid-template-columns:repeat(4,1fr);gap:14px;counter-reset:l}.rv2 .langkah li{counter-increment:l;background:#fff;border:1px solid var(--garis);border-radius:var(--r);padding:22px 20px 20px;position:relative}.rv2 .langkah li::before{content:counter(l);display:grid;place-items:center;width:38px;height:38px;border-radius:50%;background:var(--blush);color:var(--mawar-tua);font:700 18px var(--serif);margin-bottom:10px}.rv2 .langkah b{display:block;font-size:17px}.rv2 .langkah span{color:var(--sub);font-size:15px}.rv2 .pelan-promo{display:grid;grid-template-columns:1.2fr 1fr;gap:26px;align-items:center;background:linear-gradient(135deg,var(--sage2),var(--blush2));border-radius:32px;padding:34px}.rv2 .pelan-promo p{color:var(--sub)}.rv2 .pelan-mini{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end;background:#fff;border-radius:22px;padding:18px}.rv2 .pelan-mini label{flex:1;min-width:180px;font-weight:700;font-size:14px;display:flex;flex-direction:column;gap:6px}.rv2 input:not([type=checkbox]):not([type=radio]),.rv2 select{font:16px var(--sans);border:1.5px solid var(--garis);border-radius:14px;padding:12px 14px;background:#fff;color:var(--teks);width:100%}.rv2 .ulasan-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.rv2 .ulasan{margin:0;background:#fff;border:1px solid var(--garis);border-radius:var(--r);padding:22px}.rv2 .ulasan .bintang{color:var(--emas);display:flex;gap:2px}.rv2 .ulasan blockquote{margin:12px 0;font:500 18px\/1.5 var(--serif);color:var(--teks)}.rv2 .ulasan figcaption{font-size:14px;color:var(--sub)}.rv2 .art-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}.rv2 .art-grid.satu{grid-template-columns:1fr}.rv2 .kad-art{text-decoration:none;color:inherit;background:#fff;border:1px solid var(--garis);border-radius:var(--r);overflow:hidden;display:flex;flex-direction:column;transition:transform .2s,box-shadow .2s}.rv2 .kad-art:hover{transform:translateY(-3px);box-shadow:var(--bayang)}.rv2 .kad-art .bingkai{border-radius:0;box-shadow:none}.rv2 .kad-art h3{font-family:var(--serif);font-weight:600;font-size:20px}.rv2 .kad-art .meta{display:flex;gap:6px;align-items:center;font-size:13px;color:var(--euc);font-weight:700;margin-top:10px}.rv2 .sampul{aspect-ratio:3\/2;height:100%;display:grid;place-items:center;align-content:center;gap:6px;text-align:center;padding:20px;color:var(--euc)}.rv2 .sampul b{font:600 clamp(22px,2.4vw,30px)\/1.15 var(--serif);color:var(--teks)}.rv2 .sampul span{font-size:12px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mawar-tua)}.rv2 .s0{background:linear-gradient(135deg,var(--blush),var(--sage2))}.rv2 .s1{background:linear-gradient(135deg,var(--sage),var(--latar))}.rv2 .s2{background:linear-gradient(135deg,var(--blush2),#EBD9BC)}.rv2 .s3{background:linear-gradient(135deg,var(--sage2),var(--blush))}.rv2 .kad-art.besar{display:grid;grid-template-columns:1.2fr 1fr;margin-bottom:18px}.rv2 .kad-art.besar h3{font-size:28px}.rv2 .art-grid.satu .kad-art{display:grid;grid-template-columns:150px 1fr}.rv2 .art-grid.satu .kad-art p{display:none}.rv2 .akhir{padding:70px 0;text-align:center;background:linear-gradient(135deg,var(--blush),var(--sage));}.rv2 .akhir h2{max-width:20ch;margin:0 auto 8px}.rv2 .akhir p{color:var(--sub);margin:0}.rv2 .jadual-bungkus{overflow-x:auto;background:#fff;border:1px solid var(--garis);border-radius:var(--r)}.rv2 .jadual{width:100%;border-collapse:collapse;font-size:15.5px}.rv2 .jadual th{text-align:left;font-size:13px;letter-spacing:.05em;text-transform:uppercase;color:var(--sub);padding:14px 18px;background:var(--sage2)}.rv2 .jadual td{padding:14px 18px;border-top:1px solid var(--garis);vertical-align:middle}.rv2 .jadual td small{display:block;color:var(--sub);font-size:13px}.rv2 .jadual td.h{font:600 20px var(--serif);color:var(--euc);white-space:nowrap}.rv2 .jadual.banding td:not(:first-child){text-align:center;color:var(--euc)}.rv2 .sahkan{font:600 13px var(--sans);color:var(--mawar-tua);background:var(--blush2);border:1px dashed var(--mawar);border-radius:8px;padding:3px 7px;white-space:normal}.rv2 .dua-lajur{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:center}.rv2 .dua-lajur.atas{align-items:start}.rv2 .senarai-harga{list-style:none;padding:0;margin:14px 0 0;display:grid;gap:8px}.rv2 .senarai-harga li{display:flex;justify-content:space-between;gap:12px;background:#fff;border:1px solid var(--garis);border-radius:14px;padding:12px 16px}.rv2 .senarai-harga b{color:var(--euc)}.rv2 .kad-panduan{background:#fff;border:1px solid var(--garis);border-radius:28px;padding:26px;box-shadow:0 8px 24px rgba(46,42,43,.05)}.rv2 .kad-panduan p{color:var(--sub)}.rv2 .kad-panduan hr{border:0;border-top:1px solid var(--garis);margin:22px 0}.rv2 .bilik-senarai{display:grid;grid-template-columns:repeat(2,1fr);gap:20px}.rv2 .bilik{background:#fff;border:1px solid var(--garis);border-radius:26px;overflow:hidden}.rv2 .bilik .bingkai{border-radius:0;box-shadow:none}.rv2 .bilik h3{font-family:var(--serif);font-weight:600;font-size:28px}.rv2 .bilik[hidden]{display:none}.rv2 .kem{list-style:none;padding:0;margin:8px 0 0;display:grid;grid-template-columns:1fr 1fr;gap:6px 14px;font-size:14.5px;color:var(--sub)}.rv2 .kem li{display:flex;gap:6px;align-items:center}.rv2 .kem .ik{color:var(--euc)}.rv2 .kem li.sub{grid-column:1\/-1;font-weight:700;color:var(--teks)}.rv2 .video-kad{display:grid;grid-template-columns:1fr 1.1fr;gap:30px;align-items:center}.rv2 .video-ganti{aspect-ratio:16\/9;border-radius:26px;background:linear-gradient(135deg,var(--blush),var(--sage));display:grid;place-items:center;align-content:center;gap:8px;color:var(--euc);font-weight:700}.rv2 .menu-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}.rv2 .menu-kump h3{font-family:var(--serif);font-weight:600;font-size:23px}.rv2 .rawatan-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}.rv2 .kad-rawatan{background:#fff;border:1px solid var(--garis);border-radius:var(--r);padding:22px;display:flex;flex-direction:column;gap:6px}.rv2 .kad-rawatan .ik{color:var(--mawar)}.rv2 .kad-rawatan p{color:var(--sub);flex:1;font-size:15px}.rv2 .ahli-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;align-items:stretch}.rv2 .ahli{background:#fff;border:1px solid var(--garis);border-radius:28px;padding:28px;position:relative;display:flex;flex-direction:column}.rv2 .ahli.pilihan{border:2px solid var(--euc);box-shadow:var(--bayang)}.rv2 .lencana{position:absolute;top:-13px;left:28px;background:var(--euc);color:#fff;font-size:12px;font-weight:800;border-radius:999px;padding:5px 12px}.rv2 .ahli h3{font-family:var(--serif);font-weight:600;font-size:30px;margin:0}.rv2 .ahli .tag{color:var(--sub);margin:0}.rv2 .ahli .harga{margin:14px 0 0}.rv2 .ahli .harga b{font:600 44px var(--serif);color:var(--euc)}.rv2 .ahli .harga span{color:var(--sub)}.rv2 .ahli .jum{font-weight:700;color:var(--mawar-tua);margin:0 0 10px}.rv2 .ahli .kem{grid-template-columns:1fr;flex:1;margin-bottom:20px}.rv2 .pasukan-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:22px}.rv2 .ahli-pasukan{margin:0;text-align:center}.rv2 .potret{aspect-ratio:1;border-radius:50%;background:linear-gradient(135deg,var(--blush),var(--sage));display:grid;place-items:center;align-content:center;color:var(--mawar-tua);max-width:190px;margin:0 auto 12px}.rv2 .potret small{font-size:12px;color:var(--sub)}.rv2 .ahli-pasukan figcaption b{display:block}.rv2 .ahli-pasukan figcaption span{display:block;color:var(--euc);font-weight:700;font-size:14px}.rv2 .ahli-pasukan figcaption small{color:var(--sub)}.rv2 .kenyataan{display:flex;gap:16px;background:#fff;border:1px solid var(--garis);border-left:6px solid var(--euc);border-radius:22px;padding:24px}.rv2 .kenyataan .ik{color:var(--euc)}.rv2 .kenyataan p{color:var(--sub);margin:.3em 0}.rv2 .senarai-ikon{list-style:none;padding:0;margin:18px 0 26px;display:grid;gap:14px}.rv2 .senarai-ikon li{display:flex;gap:14px;align-items:flex-start}.rv2 .senarai-ikon .ik{color:var(--mawar);margin-top:3px}.rv2 .senarai-ikon b{display:block}.rv2 .senarai-ikon span{color:var(--sub);font-size:15.5px}.rv2 .borang{background:#fff;border:1px solid var(--garis);border-radius:30px;padding:28px;box-shadow:var(--bayang);display:grid;gap:14px}.rv2 .borang label{display:flex;flex-direction:column;gap:6px;font-weight:700;font-size:14.5px}.rv2 fieldset{border:0;padding:0;margin:0}.rv2 legend{font-weight:700;font-size:14.5px;margin-bottom:8px}.rv2 legend small{font-weight:600;color:var(--mawar-tua)}.rv2 .cip-pilih{display:flex;gap:8px;flex-wrap:wrap}.rv2 .cip-pilih button{font:600 14px var(--sans);border:1.5px solid var(--garis);background:#fff;border-radius:14px;padding:9px 12px;cursor:pointer;line-height:1.25}.rv2 .cip-pilih button small{display:block;color:var(--sub);font-size:12px}.rv2 .cip-pilih button[aria-pressed=\"true\"]{border-color:var(--euc);background:var(--sage2);color:var(--euc)}.rv2 .pelan-borang{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;background:#fff;border:1px solid var(--garis);border-radius:28px;padding:24px;box-shadow:var(--bayang)}.rv2 .pelan-borang label{flex:1;min-width:200px;display:flex;flex-direction:column;gap:6px;font-weight:700;font-size:14.5px}.rv2 .pelan-hasil{margin-top:28px}.rv2 .pelan-kepala{display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap;align-items:flex-end}.rv2 .garis-masa{list-style:none;padding:0;margin:24px 0 0;position:relative;display:grid;gap:12px}.rv2 .garis-masa li{display:grid;grid-template-columns:150px 1fr;gap:18px;background:#fff;border:1px solid var(--garis);border-radius:20px;padding:18px 20px;position:relative}.rv2 .garis-masa li.utama{border:2px solid var(--euc);background:var(--sage2)}.rv2 .garis-masa .tarikh{font:600 18px\/1.3 var(--serif);color:var(--euc)}.rv2 .garis-masa b{display:block;font-size:17px}.rv2 .garis-masa span{color:var(--sub);font-size:15px}.rv2 .semak-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}.rv2 .semak-kump{background:#fff;border:1px solid var(--garis);border-radius:24px;padding:20px}.rv2 .semak-kump h3{font-family:var(--serif);font-weight:600;font-size:22px}.rv2 .semak{display:flex;gap:10px;align-items:flex-start;padding:8px 0;border-top:1px solid var(--garis);font-size:15px;cursor:pointer}.rv2 .semak input{width:20px;height:20px;accent-color:var(--euc);margin-top:3px;flex:0 0 auto}.rv2 .semak input:checked+span{text-decoration:line-through;color:var(--sub)}.rv2 .kemajuan{font-weight:800;color:var(--euc);background:var(--sage);border-radius:999px;padding:6px 14px}.rv2 .penafian{display:flex;gap:10px;align-items:flex-start;color:var(--sub);font-size:14.5px;background:#fff;border:1px dashed var(--garis);border-radius:18px;padding:16px}.rv2 .hubungi-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}.rv2 .hubungi-kad{background:#fff;border:1px solid var(--garis);border-radius:var(--r);padding:22px;display:flex;flex-direction:column;gap:6px;align-items:flex-start}.rv2 .hubungi-kad .ik{color:var(--mawar)}.rv2 .hubungi-kad p{margin:0 0 6px;color:var(--sub);flex:1}.rv2 .cari{display:flex;gap:8px;max-width:560px;margin-top:22px}.rv2 .topik{margin-bottom:22px}.rv2 .faq-wrap{max-width:860px}.rv2 .faq-kump{margin-bottom:34px}.rv2 .faq-kump h2{font-size:28px}.rv2 .faq{background:#fff;border:1px solid var(--garis);border-radius:18px;padding:16px 20px;margin:10px 0}.rv2 .faq summary{font-weight:700;cursor:pointer;list-style:none;display:flex;justify-content:space-between;gap:10px}.rv2 .faq summary::after{content:\"+\";color:var(--euc);font-size:22px;line-height:1}.rv2 .faq[open] summary::after{content:\"\u2212\"}.rv2 .faq p{color:var(--sub);margin:10px 0 0}.rv2 footer.kaki{background:#fff;border-top:1px solid var(--garis);padding:46px 0 110px;font-size:14.5px;color:var(--sub)}.rv2 .kaki-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:26px}.rv2 .kaki-grid b{color:var(--teks);display:block;margin-bottom:8px}.rv2 .kaki-grid a{display:block;color:var(--sub);text-decoration:none;padding:3px 0}.rv2 .kaki-grid a:hover{color:var(--euc)}.rv2 .kaki-bawah{border-top:1px solid var(--garis);margin-top:26px;padding-top:16px;display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;font-size:13px}.rv2 .wa-terapung{position:fixed;right:20px;bottom:22px;z-index:55;display:flex;align-items:center;gap:8px;background:var(--wa);color:#063D1E;font-weight:800;text-decoration:none;border-radius:999px;padding:14px 18px;box-shadow:0 12px 30px rgba(15,122,63,.35)}.rv2 .wa-terapung .ik{width:24px;height:24px}.rv2 .bar-telefon{display:none}.rv2 .hero h1{max-width:none;font-size:clamp(30px,3.7vw,48px)}.rv2 .pautan-bintang{color:inherit;text-decoration:none;display:inline-flex;gap:6px;align-items:center;border-bottom:1px dashed var(--emas)}.rv2 .bukti .pautan-bintang .ik{color:var(--emas)}.rv2 a.kaca{text-decoration:none}.rv2 .art-grid.satu .sampul{aspect-ratio:auto;width:100%;height:100%;min-height:96px}.rv2 .dua-pintu{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:40px;position:relative;z-index:1}.rv2 .pintu{display:flex;flex-direction:column;gap:2px;text-decoration:none;color:var(--teks);border-radius:26px;padding:22px 24px;border:1px solid var(--garis);box-shadow:var(--bayang);transition:transform .2s}.rv2 .pintu:hover{transform:translateY(-3px)}.rv2 .pintu.villa{background:linear-gradient(135deg,#fff,var(--blush2))}.rv2 .pintu.spa{background:linear-gradient(135deg,#fff,var(--sage2))}.rv2 .pintu b{font:700 22px\/1.25 var(--serif);letter-spacing:-.015em}.rv2 .pintu span:not(.eye){color:var(--sub);font-size:15px}.rv2 .pintu em{font-style:normal;font-weight:700;color:var(--euc);margin-top:8px}.rv2 .blok-nipis{padding:6px 0 34px}.rv2 .bukti-jalur{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.rv2 .bukti-jalur div{background:#fff;border:1px solid var(--garis);border-radius:16px;padding:14px 16px;display:flex;flex-direction:column;gap:2px}.rv2 .bukti-jalur b{font-size:12px;letter-spacing:.07em;text-transform:uppercase;color:var(--euc)}.rv2 .bukti-jalur span{font-size:14.5px;color:var(--sub);line-height:1.5}.rv2 .harga3 th small{display:block;font-size:11.5px;letter-spacing:0;text-transform:none;font-weight:600;color:var(--sub);margin-top:2px}.rv2 .harga3 td:first-child b{display:block;white-space:nowrap}.rv2 .tt-tajuk{margin:30px 0 12px}.rv2 .tt-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.rv2 .tt{background:#fff;border:1px solid var(--garis);border-radius:var(--r);padding:18px}.rv2 .tt ul{list-style:none;padding:0;margin:6px 0 0;display:grid;gap:8px;font-size:14.5px;color:var(--sub);line-height:1.5}.rv2 .tt li{display:flex;gap:7px;align-items:flex-start}.rv2 .tt .ik{color:var(--euc);flex:none;margin-top:3px}.rv2 .kenyataan.kopetro{margin-top:22px}.rv2 .kenyataan.kopetro .btn{margin-top:10px}.rv2 .kenyataan.klinik{margin-top:22px;border-left-color:var(--mawar)}.rv2 .kenyataan.klinik .ik{color:var(--mawar)}.rv2 .spa-pakej-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin:24px 0}.rv2 .spa-pakej{background:#fff;border:1px solid var(--garis);border-radius:26px;padding:24px;display:flex;flex-direction:column}.rv2 .spa-pakej.pilihan{border:2px solid var(--euc);box-shadow:var(--bayang)}.rv2 .spa-pakej h3{font:700 26px var(--serif);margin:0}.rv2 .spa-pakej .eye{margin:0 0 4px}.rv2 .spa-pakej .harga{margin:8px 0 6px}.rv2 .spa-pakej .harga b{font:700 38px var(--serif);color:var(--euc)}.rv2 .kem.satu{grid-template-columns:1fr;gap:10px}.rv2 .kem.satu li{align-items:flex-start}.rv2 .kem.satu .ik{flex:none;margin-top:5px}.rv2 .spa-pakej .kem{grid-template-columns:1fr;flex:1;margin-bottom:18px;align-content:start}.rv2 .spa-pakej .kem li{align-items:flex-start}.rv2 .spa-pakej .kem .ik{flex:none;margin-top:4px}.rv2 .lokasi-grid{display:grid;grid-template-columns:1.25fr 1fr;gap:20px;margin-top:22px;align-items:stretch}.rv2 .peta-bingkai{border-radius:var(--r);overflow:hidden;border:1px solid var(--garis);background:var(--sage2);min-height:400px}.rv2 .peta-bingkai iframe{width:100%;height:100%;min-height:400px;border:0;display:block}.rv2 .nap-kotak{background:#fff;border:1px solid var(--garis);border-radius:var(--r);padding:22px;display:flex;flex-direction:column;gap:16px}.rv2 .nap{margin:0;display:grid;gap:12px}.rv2 .nap div{display:grid;grid-template-columns:86px 1fr;gap:10px}.rv2 .nap dt{font-size:12px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:var(--mawar-tua);padding-top:3px}.rv2 .nap dd{margin:0;font-size:15px;line-height:1.55}.rv2 .nap-cta{display:flex;flex-wrap:wrap;gap:10px}.rv2 .ringkasan-ulasan{display:flex;gap:14px;align-items:center;text-decoration:none;color:var(--teks);background:#fff;border:1px solid var(--garis);border-radius:20px;padding:12px 18px}.rv2 .ringkasan-ulasan b{font:700 42px\/1 var(--serif);color:var(--euc)}.rv2 .ringkasan-ulasan span{font-size:13.5px;color:var(--sub);line-height:1.55}.rv2 .ringkasan-ulasan .ik{color:var(--emas)}.rv2 .ringkasan-ulasan u{color:var(--euc);font-weight:700}.rv2 .senarai-ikon.dua{grid-template-columns:1fr 1fr;margin-top:22px}@media (max-width:1000px){.rv2 .tt-grid,.rv2 .bukti-jalur{grid-template-columns:repeat(2,1fr)}.rv2 .spa-pakej-grid,.rv2 .lokasi-grid{grid-template-columns:1fr}}@media (max-width:620px){.rv2 .dua-pintu,.rv2 .senarai-ikon.dua,.rv2 .tt-grid{grid-template-columns:1fr}.rv2 .bukti-jalur{grid-template-columns:1fr 1fr}.rv2 .jadual.harga3 thead{display:none}.rv2 .jadual.harga3,.rv2 .jadual.harga3 tbody{display:block}.rv2 .jadual.harga3 tr{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 10px;align-items:center;padding:14px 16px;border-top:1px solid var(--garis)}.rv2 .jadual.harga3 tr:first-child{border-top:0}.rv2 .jadual.harga3 td{display:block;border:0;padding:0}.rv2 .jadual.harga3 td:first-child{grid-column:1\/3;grid-row:1}.rv2 .jadual.harga3 td:last-child{grid-column:3;grid-row:1;justify-self:end}.rv2 .jadual.harga3 td.h{font-size:17px;background:var(--sage2);border-radius:12px;padding:8px 10px}.rv2 .jadual.harga3 td.h::before{content:attr(data-label);display:block;font:800 10px\/1.4 var(--sans);letter-spacing:.07em;text-transform:uppercase;color:var(--sub)}.rv2 .nap-cta .btn{width:100%;justify-content:center}.rv2 .art-grid.satu .kad-art{grid-template-columns:96px minmax(0,1fr)}.rv2 .art-grid.satu .sampul{padding:10px}.rv2 .art-grid.satu .sampul b{font-size:13px}.rv2 .art-grid.satu .sampul span{display:none}.rv2 .peta-bingkai,.rv2 .peta-bingkai iframe{min-height:300px}.rv2 .nap div{grid-template-columns:1fr;gap:2px}.rv2 .ringkasan-ulasan b{font-size:34px}}@media (max-width:1000px){.rv2 .nav-pil nav{display:none}.rv2 .menu-btn{display:block}.rv2 .nav-pil.buka nav{display:flex;position:absolute;top:66px;left:20px;right:20px;flex-direction:column;background:#fff;border-radius:22px;padding:10px;box-shadow:var(--bayang)}.rv2 .hero-grid,.rv2 .dua-lajur,.rv2 .pelan-promo,.rv2 .video-kad,.rv2 .kad-art.besar{grid-template-columns:1fr}.rv2 .stat-grid{grid-template-columns:repeat(3,1fr)}.rv2 .niat-grid,.rv2 .ciri-grid,.rv2 .rawatan-grid,.rv2 .hubungi-grid,.rv2 .pasukan-grid,.rv2 .langkah{grid-template-columns:repeat(2,1fr)}.rv2 .bilik-grid,.rv2 .art-grid,.rv2 .ulasan-grid,.rv2 .menu-grid,.rv2 .ahli-grid,.rv2 .semak-grid,.rv2 .bilik-senarai{grid-template-columns:1fr}.rv2 .kaki-grid{grid-template-columns:1fr 1fr}.rv2 .k1{left:10px}.rv2 .k2{right:10px}}@media (max-width:620px){.rv2{font-size:16.5px}.rv2 .niat-grid,.rv2 .ciri-grid,.rv2 .rawatan-grid,.rv2 .hubungi-grid,.rv2 .pasukan-grid,.rv2 .langkah,.rv2 .stat-grid{grid-template-columns:1fr 1fr}.rv2 .niat-grid,.rv2 .langkah{grid-template-columns:1fr}.rv2 .hero{padding-top:26px}.rv2 .wa-terapung{display:none}.rv2 .bar-telefon{display:grid;grid-template-columns:1fr 1fr;gap:8px;position:fixed;left:0;right:0;bottom:0;z-index:55;background:rgba(255,255,255,.92);backdrop-filter:blur(12px);padding:10px 12px calc(10px + env(safe-area-inset-bottom));border-top:1px solid var(--garis)}.rv2 .bar-telefon .btn{padding:13px 10px;font-size:14.5px}.rv2 .nav-pil>.btn-utama,.rv2 .bahasa{display:none}.rv2 .logo small{white-space:nowrap;font-size:8.5px}.rv2 .stat-grid{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;padding-bottom:6px}.rv2 .stat-grid div{flex:0 0 46%;scroll-snap-align:start}.rv2 .garis-masa li{grid-template-columns:1fr}.rv2 .kem{grid-template-columns:1fr}.rv2 .kepala-laman{top:40px}.rv2 .jadual td,.rv2 .jadual th{padding:12px}.rv2 .kaki-grid{grid-template-columns:1fr}}.rv2 .harga3 td.h s{display:block;font:600 12.5px\/1.3 var(--sans);color:var(--sub);opacity:.85}.rv2 .pasukan-grid.lima{grid-template-columns:repeat(5,1fr)}.rv2 .potret.ada-foto{background:none;overflow:hidden;padding:0}.rv2 .potret.ada-foto img{width:100%;height:100%;object-fit:cover;display:block;border-radius:50%}.rv2 .bukti-jalur.tiga{grid-template-columns:repeat(3,1fr)}.rv2 .manfaat-ahli{margin-bottom:26px}@media (max-width:1000px){.rv2 .pasukan-grid.lima{grid-template-columns:repeat(3,1fr)}}@media (max-width:620px){.rv2 .pasukan-grid.lima{grid-template-columns:1fr 1fr}.rv2 .bukti-jalur.tiga{grid-template-columns:1fr}}.rv2 .bahasa{cursor:pointer}.rv2 .bahasa b{color:var(--mawar-tua)}.rv2 .langkah.satu-lajur{grid-template-columns:1fr}@media print{.rv2 .kepala-laman,.rv2 footer.kaki,.rv2 .wa-terapung,.rv2 .bar-telefon,.rv2 .pelan-borang,.rv2 .cta-baris{display:none!important}.rv2{}}.rv2 .rawatan-grid.tiga{grid-template-columns:repeat(3,1fr)}@media (max-width:700px){.rv2 .rawatan-grid.tiga{grid-template-columns:1fr}}@font-face{font-family:\"Montserrat Fallback\";font-weight:100 550;src:local(\"Arial\"),local(\"ArialMT\"),local(\"Roboto\"),local(\"Roboto-Regular\");size-adjust:111.98%;ascent-override:86.44%;descent-override:22.41%;line-gap-override:0%}@font-face{font-family:\"Montserrat Fallback\";font-weight:551 900;src:local(\"Arial Bold\"),local(\"Arial-BoldMT\"),local(\"Roboto Bold\"),local(\"Roboto-Bold\");size-adjust:111%;ascent-override:87.21%;descent-override:22.62%;line-gap-override:0%}.rv2{--serif:\"Montserrat\",\"Montserrat Fallback\",system-ui,-apple-system,\"Segoe UI\",sans-serif;--sans:\"Montserrat\",\"Montserrat Fallback\",system-ui,-apple-system,\"Segoe UI\",sans-serif}.rv2 .lead{max-width:38.4em}.rv2 .pengantar{max-width:45em}.rv2 .kepala h1{max-width:12.22em}.rv2 .akhir h2{max-width:13.58em}.rv2 .empati .ungkap{max-width:17.34em}body:has(.rv2){background:#FBF8F4;margin:0}body:has(.rv2) #qlwapp{display:none!important}.rv2-kepala{position:sticky;top:0;z-index:50}.admin-bar .rv2-kepala{top:32px}@media (max-width:782px){.admin-bar .rv2-kepala{top:46px}}.rv2 .kepala-laman{position:relative;top:auto}.rv2 [hidden]{display:none!important}.rv2 .hero,.rv2 .kepala{isolation:isolate}.rv2 h1,.rv2 h2,.rv2 h3,.rv2 h4{color:inherit;text-transform:none;font-style:normal}.rv2 p{margin-top:1em;margin-bottom:1em}.rv2 button{text-transform:none;letter-spacing:normal;box-shadow:none;min-height:0}.rv2 blockquote{border:0;padding:0;quotes:none;font-style:normal;background:none}.rv2 blockquote::before,.rv2 blockquote::after{content:none}.rv2 svg.ik{fill:none}.rv2 a:hover{color:var(--euc-tua)}.rv2 a.btn-utama:hover,.rv2 a.btn-utama:focus{color:#fff}.rv2 a.btn-wa:hover,.rv2 a.btn-utama-wa:hover,.rv2 a.wa-terapung:hover{color:#063D1E}.rv2 a.btn-kedua:hover{color:var(--teks)}.rv2 a.btn-garis:hover{color:var(--euc)}.rv2 .kaki-grid a:hover{color:var(--euc)}.rv2 .video-lawatan{display:block;width:100%;height:auto;max-height:72vh;border-radius:26px;background:#2E2A2B;box-shadow:var(--bayang)}.rv2 .ralat{color:#9A3412;font-weight:700;margin:0}.rv2-sembunyi{position:absolute;left:-9999px}.rv2{overflow-wrap:break-word}.rv2 .hubungi-grid>*{min-width:0}.rv2 .hubungi-kad p{overflow-wrap:anywhere}.rv2 .no-tel{white-space:nowrap}@media (min-width:1001px){.rv2 .hero-grid{grid-template-columns:1fr 1.1fr;gap:44px}.rv2 .hero-vis{margin-right:calc(-20px - max(0px, (100vw - 1180px) \/ 2))}.rv2 .hero .bingkai.besar{aspect-ratio:1.12;max-height:72vh;border-radius:34px 0 0 34px}.rv2 .hero .k2{right:28px}}@media (max-width:1000px){.rv2 .hero .hero-vis{width:100vw;max-width:none;margin-left:calc(50% - 50vw)}.rv2 .hero .bingkai.besar{border-radius:0;aspect-ratio:16\/11}}@media (max-width:620px){.rv2 .hero{padding-top:0}.rv2 .hero .hero-vis{order:-1}.rv2 .hero .bingkai.besar{aspect-ratio:4\/3.2}.rv2 .hero .kaca{padding:7px 11px;border-radius:14px;font-size:11.5px}.rv2 .hero .kaca b{font-size:15px}.rv2 .hero .k1{bottom:12px}.rv2 .hero .k2{top:12px}}@media (max-width:480px){.rv2 .hubungi-grid{grid-template-columns:1fr}}@media (max-width:620px){.rv2 .kepala-laman{top:auto}}\/* 28 Okt 2026 (Halim: telefon tiada pilihan English): pemilih BM \u00b7 EN kekal nampak di kepala laman telefon, sebelah butang menu *\/@media (max-width:620px){.rv2 .nav-pil>.bahasa{display:inline-block;line-height:34px;padding:0 11px;margin-right:2px;font-size:12.5px;color:var(--teks);border:1px solid var(--garis);border-radius:999px;background:rgba(255,255,255,.9);white-space:nowrap}}@media (max-width:380px){.rv2 .logo small{letter-spacing:.08em}.rv2 .nav-pil>.bahasa{padding:0 9px}}\/* 29 Okt 2026 (Halim: susunan topik Panduan di telefon tak profesional): cip topik jadi satu baris boleh leret, setiap cip berbingkai sendiri *\/@media (max-width:1100px){.rv2 .tab-pil.topik{display:flex;flex-wrap:nowrap;gap:8px;overflow-x:auto;background:none;border:0;border-radius:0;padding:2px 20px 8px;margin:0 -20px 18px;scroll-snap-type:x proximity;scroll-padding:0 20px;-webkit-overflow-scrolling:touch;scrollbar-width:none;-webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 36px),transparent);mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 36px),transparent)}.rv2 .tab-pil.topik::-webkit-scrollbar{display:none}.rv2 .tab-pil.topik button{flex:0 0 auto;white-space:nowrap;scroll-snap-align:start;background:#fff;border:1px solid var(--garis);padding:9px 15px;font-size:14px;line-height:1.2}.rv2 .tab-pil.topik button[aria-selected=\"true\"]{background:var(--euc);border-color:var(--euc);color:#fff}.rv2 .tab-pil.topik::after{content:\"\";flex:0 0 16px}}\/* 28 Okt 2026: bar tab bawah telefon (nav_bawah, RV_NAVBAWAH=1) *\/.rv2 .nav-bawah{display:none}@media (max-width:620px){.rv2 .nav-bawah{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));align-items:end;position:fixed;left:0;right:0;bottom:0;z-index:55;background:rgba(255,255,255,.96);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-top:1px solid var(--garis);box-shadow:0 -6px 20px rgba(46,42,43,.07);padding:4px 2px calc(4px + env(safe-area-inset-bottom))}.rv2 .nav-bawah a{display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:3px;min-height:52px;min-width:0;padding:6px 0;font:600 10.5px\/1.2 var(--sans);letter-spacing:-.01em;color:var(--sub);text-decoration:none;text-align:center;white-space:nowrap}.rv2 .nav-bawah a .ik{color:var(--mawar-tua)}.rv2 .nav-bawah a[aria-current]{color:var(--mawar-tua);font-weight:800}.rv2 .nav-bawah a.nb-wa{color:var(--wa-tua);font-weight:800}.rv2 .nav-bawah .nb-bulat{display:flex;align-items:center;justify-content:center;width:50px;height:50px;margin-top:-24px;border-radius:999px;background:var(--wa);color:#063D1E;border:3px solid #fff;box-shadow:0 6px 16px rgba(37,211,102,.35)}.rv2 .nav-bawah .nb-bulat .ik{width:26px;height:26px;color:#fff}body:has(.nav-bawah){padding-bottom:calc(64px + env(safe-area-inset-bottom))!important}}@media (max-width:380px){.rv2 .nav-bawah a{font-size:9.5px}.rv2 .nav-bawah a .ik{width:19px;height:19px}.rv2 .nav-bawah .nb-bulat{width:46px;height:46px}}<\/style>\n\n\n\n<div data-no-translation style=\"display:contents\"><div class=\"rv2 rv2-kepala\" data-bahasa=\"en\"><div class=\"kepala-laman\"><div class=\"nav-pil\"><a class=\"logo\" href=\"\/en\/\"><img decoding=\"async\" src=\"https:\/\/rosevilleconfinement.com\/wp-content\/uploads\/2026\/10\/roseville-logo-90.webp\" width=\"30\" height=\"33\" alt=\"Roseville\"><span><b>Roseville<\/b><small>Confinement Villa &amp; Spa<\/small><\/span><\/a><nav aria-label=\"Main\"><a href=\"\/en\/harga-pakej-berpantang\/\">Packages<\/a><a href=\"\/en\/bilik\/\">Rooms<\/a><a href=\"\/en\/spa-wanita-bangi\/\">Spa<\/a><a href=\"\/en\/panduan-berpantang\/\">Guides<\/a><a href=\"\/en\/tentang-kami\/\">About<\/a><a href=\"\/en\/hubungi\/\">Contact<\/a><\/nav><a class=\"bahasa\" href=\"\/keahlian-spa\/\" hreflang=\"ms\" lang=\"ms\" title=\"Bahasa Melayu\">BM \u00b7 <b>EN<\/b><\/a><a class=\"btn btn-utama kecil\" href=\"\/en\/tempah-lawatan\/\"><svg class=\"ik\" width=\"18\" height=\"18\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"3\"\/><path d=\"M3 10h18M8 3v4M16 3v4\"\/><\/svg><span>Book a Visit<\/span><\/a><button class=\"menu-btn\" type=\"button\" aria-label=\"Menu\" aria-expanded=\"false\"><svg class=\"ik\" width=\"24\" height=\"24\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 7h16M4 12h16M4 17h16\"\/><\/svg><\/button><\/div><\/div><\/div><\/div>\n\n\n\n<div data-no-translation style=\"display:contents\"><div class=\"rv2\" data-bahasa=\"en\"><header class=\"kepala\"><div class=\"wrap\"><p class=\"eye\">Spa membership<\/p><h1>Spa membership: one treatment a month, <span class=\"grad\">for six months.<\/span><\/h1>\n<p class=\"lead\">Choose the level that suits you. One treatment each month is included in your membership, subject to availability.<\/p><\/div><i class=\"blob b1\"><\/i><i class=\"blob b2\"><\/i><\/header><\/div><\/div>\n\n\n\n<div data-no-translation style=\"display:contents\"><div class=\"rv2\" data-bahasa=\"en\"><section class=\"blok\"><div class=\"wrap\"><h2 class=\"tengah\">Choose a membership package<\/h2><div class=\"kenyataan manfaat-ahli\"><svg class=\"ik\" width=\"26\" height=\"26\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1-4.4-4.3 6.1-.9z\"\/><\/svg><div><h3>Member price: save 20%<\/h3>\n<p>All membership tiers enjoy 20% off normal prices on eligible spa treatments and packages.<\/p><\/div><\/div>\n<div class=\"ahli-grid\"><article class=\"ahli\"><h3>Serenity<\/h3><p class=\"tag\">Essential wellbeing<\/p>\n<p class=\"harga\"><b>RM199<\/b><span>\/ 6 months<\/span><\/p><p class=\"jum\">6 treatment options<\/p><ul class=\"kem\"><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Foot spa &amp; foot massage<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Foot spa &amp; foot scrub<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Far-infrared sauna<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Herbal bath<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Sitz bath<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Hair wash treatment<\/li><\/ul>\n<a class=\"btn btn-wa penuh\" href=\"https:\/\/wa.me\/601155599174?text=Hi%20Roseville%2C%20I%20am%20on%20your%20%22Spa%20Membership%22%20page.%20I%20would%20like%20to%20ask%20about%20the%20Serenity%20membership.%0A%0ARef%3A%20RV-EN-MEMBER-SERENITY\" target=\"_blank\" rel=\"noopener\" data-wa-kod=\"RV-EN-MEMBER-SERENITY\" data-wa-topik=\"the Serenity membership\" data-wa-kedudukan=\"membership-card\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M12 2a10 10 0 0 0-8.7 14.9L2 22l5.3-1.3A10 10 0 1 0 12 2zm0 18.2a8.2 8.2 0 0 1-4.2-1.2l-.3-.2-3.1.8.8-3-.2-.3A8.2 8.2 0 1 1 12 20.2zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8s-.4-.1-.6.1-.7.8-.8 1-.3.2-.5.1a6.7 6.7 0 0 1-3.3-2.9c-.3-.4.2-.4.7-1.3.1-.2 0-.3 0-.4l-.8-1.8c-.2-.5-.4-.4-.6-.4h-.5a1 1 0 0 0-.7.3 3 3 0 0 0-.9 2.2 5.2 5.2 0 0 0 1.1 2.7 11.9 11.9 0 0 0 4.6 4 5.2 5.2 0 0 0 3.2.7 2.7 2.7 0 0 0 1.8-1.3 2.2 2.2 0 0 0 .2-1.3c-.1-.1-.3-.2-.5-.3z\"\/><\/svg><span>Choose Serenity<\/span><\/a><\/article><article class=\"ahli pilihan\"><h3>Radiance<\/h3><p class=\"tag\">Complete self-care<\/p>\n<p class=\"harga\"><b>RM399<\/b><span>\/ 6 months<\/span><\/p><p class=\"jum\">12 treatment options<\/p><ul class=\"kem\"><li class=\"sub\">All Serenity options, plus:<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Full-body scrub<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Full-body hot compress (tuam)<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Facial<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Milk bath<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Flower bath<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Half-body massage<\/li><\/ul>\n<a class=\"btn btn-wa penuh\" href=\"https:\/\/wa.me\/601155599174?text=Hi%20Roseville%2C%20I%20am%20on%20your%20%22Spa%20Membership%22%20page.%20I%20would%20like%20to%20ask%20about%20the%20Radiance%20membership.%0A%0ARef%3A%20RV-EN-MEMBER-RADIANCE\" target=\"_blank\" rel=\"noopener\" data-wa-kod=\"RV-EN-MEMBER-RADIANCE\" data-wa-topik=\"the Radiance membership\" data-wa-kedudukan=\"membership-card\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M12 2a10 10 0 0 0-8.7 14.9L2 22l5.3-1.3A10 10 0 1 0 12 2zm0 18.2a8.2 8.2 0 0 1-4.2-1.2l-.3-.2-3.1.8.8-3-.2-.3A8.2 8.2 0 1 1 12 20.2zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8s-.4-.1-.6.1-.7.8-.8 1-.3.2-.5.1a6.7 6.7 0 0 1-3.3-2.9c-.3-.4.2-.4.7-1.3.1-.2 0-.3 0-.4l-.8-1.8c-.2-.5-.4-.4-.6-.4h-.5a1 1 0 0 0-.7.3 3 3 0 0 0-.9 2.2 5.2 5.2 0 0 0 1.1 2.7 11.9 11.9 0 0 0 4.6 4 5.2 5.2 0 0 0 3.2.7 2.7 2.7 0 0 0 1.8-1.3 2.2 2.2 0 0 0 .2-1.3c-.1-.1-.3-.2-.5-.3z\"\/><\/svg><span>Choose Radiance<\/span><\/a><\/article><article class=\"ahli\"><h3>Signature<\/h3><p class=\"tag\">Premium women&#x27;s wellbeing<\/p>\n<p class=\"harga\"><b>RM599<\/b><span>\/ 6 months<\/span><\/p><p class=\"jum\">16 treatment options<\/p><ul class=\"kem\"><li class=\"sub\">All Radiance options, plus:<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Full-body massage<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Tummy &amp; waist massage<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Postnatal breast massage<\/li><li><svg class=\"ik\" width=\"14\" height=\"14\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12l4 4 10-10\"\/><\/svg>Prenatal &amp; postnatal massage<\/li><\/ul>\n<a class=\"btn btn-wa penuh\" href=\"https:\/\/wa.me\/601155599174?text=Hi%20Roseville%2C%20I%20am%20on%20your%20%22Spa%20Membership%22%20page.%20I%20would%20like%20to%20ask%20about%20the%20Signature%20membership.%0A%0ARef%3A%20RV-EN-MEMBER-SIGNATURE\" target=\"_blank\" rel=\"noopener\" data-wa-kod=\"RV-EN-MEMBER-SIGNATURE\" data-wa-topik=\"the Signature membership\" data-wa-kedudukan=\"membership-card\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M12 2a10 10 0 0 0-8.7 14.9L2 22l5.3-1.3A10 10 0 1 0 12 2zm0 18.2a8.2 8.2 0 0 1-4.2-1.2l-.3-.2-3.1.8.8-3-.2-.3A8.2 8.2 0 1 1 12 20.2zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8s-.4-.1-.6.1-.7.8-.8 1-.3.2-.5.1a6.7 6.7 0 0 1-3.3-2.9c-.3-.4.2-.4.7-1.3.1-.2 0-.3 0-.4l-.8-1.8c-.2-.5-.4-.4-.6-.4h-.5a1 1 0 0 0-.7.3 3 3 0 0 0-.9 2.2 5.2 5.2 0 0 0 1.1 2.7 11.9 11.9 0 0 0 4.6 4 5.2 5.2 0 0 0 3.2.7 2.7 2.7 0 0 0 1.8-1.3 2.2 2.2 0 0 0 .2-1.3c-.1-.1-.3-.2-.5-.3z\"\/><\/svg><span>Choose Signature<\/span><\/a><\/article><\/div>\n<p class=\"kecil-sub\">One treatment per month \u00b7 Subject to availability \u00b7 Terms and conditions apply<\/p>\n<p class=\"kecil-sub\">Looking for a gift? <a href=\"\/en\/baucar-hadiah-spa\/\">See our spa gift vouchers<\/a>.<\/p>\n<\/div><\/section><\/div><\/div>\n\n\n\n<div data-no-translation style=\"display:contents\"><div class=\"rv2\" data-bahasa=\"en\"><section class=\"blok lembut\"><div class=\"wrap faq-wrap\"><h2>FAQ: the spa<\/h2><details class=\"faq\"><summary>Can I book the spa without staying?<\/summary><p>Yes. All spa treatments can be booked on their own, including the Closing Confinement package.<\/p><\/details><details class=\"faq\"><summary>Are these spa treatments medical treatments?<\/summary><p>No. Spa treatments are for comfort and wellbeing, not for treating illness.<\/p><\/details><details class=\"faq\"><summary>I&#x27;m having my confinement at home. Can I just use the spa?<\/summary><p>Yes. Roseville Muslimah Spa is open to all women, including mothers having their confinement at home. Book a slot on WhatsApp.<\/p><\/details><p class=\"kecil-sub\"><a href=\"\/en\/soalan-lazim\/\">See all FAQs<\/a><\/p><\/div><\/section><\/div><\/div>\n\n\n\n<div data-no-translation style=\"display:contents\"><div class=\"rv2 rv2-kaki\" data-bahasa=\"en\"><footer class=\"kaki\"><div class=\"wrap\"><div class=\"kaki-grid\"><div><a class=\"logo\" href=\"\/en\/\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/rosevilleconfinement.com\/wp-content\/uploads\/2026\/10\/roseville-logo-90.webp\" width=\"30\" height=\"33\" alt=\"\"><span><b>Roseville<\/b><small>Confinement Villa &amp; Spa<\/small><\/span><\/a><p>A Shariah-friendly confinement centre and women&#x27;s spa in Bangi Gateway. A postnatal care centre, not a clinic or hospital.<\/p><\/div><div><b>Confinement<\/b><a href=\"\/en\/harga-pakej-berpantang\/\">Packages &amp; prices<\/a><a href=\"\/en\/bilik\/\">Rooms &amp; villa<\/a><a href=\"\/en\/tempah-lawatan\/\">Book a visit<\/a><a href=\"\/en\/pelan-pantang\/\">Free Confinement Plan<\/a><\/div><div><b>Spa<\/b><a href=\"\/en\/spa-wanita-bangi\/\">Spa menu<\/a><a href=\"\/en\/keahlian-spa\/\">Membership<\/a><a href=\"\/en\/panduan-berpantang\/\">Confinement guides<\/a><a href=\"\/en\/soalan-lazim\/\">FAQ<\/a><\/div><div><b>Contact<\/b><a href=\"tel:+601155599174\">Call <span class=\"no-tel\">011-5559 9174<\/span><\/a><a href=\"https:\/\/wa.me\/601155599174?text=Hi%20Roseville%2C%20I%20am%20on%20your%20%22Spa%20Membership%22%20page.%20I%20would%20like%20to%20ask%3A%0A%0ARef%3A%20RV-EN-MEMBER-FOOTER\" target=\"_blank\" rel=\"noopener\" data-wa-kod=\"RV-EN-MEMBER-FOOTER\" data-wa-kedudukan=\"footer\">WhatsApp <span class=\"no-tel\">011-5559 9174<\/span><\/a><a href=\"tel:+60389259174\">Office line <span class=\"no-tel\">03-8925 9174<\/span><\/a><a href=\"mailto:villaroseville@gmail.com\">villaroseville@gmail.com<\/a><a href=\"https:\/\/www.google.com\/maps\/dir\/?api=1&amp;destination=Roseville%20Confinement%20Villa%20Bangi\" target=\"_blank\" rel=\"noopener\">Plaza Bangi Perdana, Bangi Gateway<\/a><a href=\"\/en\/tentang-kami\/\">About Roseville<\/a><\/div><\/div><div class=\"kaki-bawah\"><span>\u00a9 2026 Rose Omnicare Sdn Bhd (1361290-T) \u00b7 Kajang Municipal Council licence LBUS-12972 \u00b7 Roseville Confinement Villa &amp; Spa<\/span><span><a href=\"https:\/\/www.facebook.com\/rosevilleconfinement\" target=\"_blank\" rel=\"noopener\">Facebook \/rosevilleconfinement<\/a> \u00b7 <a href=\"https:\/\/www.instagram.com\/rosevilleconfinement\/\" target=\"_blank\" rel=\"noopener\">Instagram @rosevilleconfinement<\/a><\/span><\/div><\/div><\/footer><\/div><\/div>\n\n\n\n<div data-no-translation style=\"display:contents\"><div class=\"rv2 rv2-terapung\" data-bahasa=\"en\"><a class=\"wa-terapung\" href=\"https:\/\/wa.me\/601155599174?text=Hi%20Roseville%2C%20I%20am%20on%20your%20%22Spa%20Membership%22%20page.%20I%20would%20like%20to%20ask%3A%0A%0ARef%3A%20RV-EN-MEMBER-FLOAT\" target=\"_blank\" rel=\"noopener\" data-wa-kod=\"RV-EN-MEMBER-FLOAT\" data-wa-kedudukan=\"float\" aria-label=\"WhatsApp Roseville\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M12 2a10 10 0 0 0-8.7 14.9L2 22l5.3-1.3A10 10 0 1 0 12 2zm0 18.2a8.2 8.2 0 0 1-4.2-1.2l-.3-.2-3.1.8.8-3-.2-.3A8.2 8.2 0 1 1 12 20.2zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8s-.4-.1-.6.1-.7.8-.8 1-.3.2-.5.1a6.7 6.7 0 0 1-3.3-2.9c-.3-.4.2-.4.7-1.3.1-.2 0-.3 0-.4l-.8-1.8c-.2-.5-.4-.4-.6-.4h-.5a1 1 0 0 0-.7.3 3 3 0 0 0-.9 2.2 5.2 5.2 0 0 0 1.1 2.7 11.9 11.9 0 0 0 4.6 4 5.2 5.2 0 0 0 3.2.7 2.7 2.7 0 0 0 1.8-1.3 2.2 2.2 0 0 0 .2-1.3c-.1-.1-.3-.2-.5-.3z\"\/><\/svg><span>Ask us<\/span><\/a><nav class=\"nav-bawah\" aria-label=\"Quick links\"><a href=\"\/en\/harga-pakej-berpantang\/\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 12V4a1 1 0 0 1 1-1h8l9 9-9 9z\"\/><circle cx=\"7.5\" cy=\"7.5\" r=\"1.5\"\/><\/svg><span>Packages<\/span><\/a><a href=\"\/en\/bilik\/\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 18V8a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10M3 14h18M7 10h4\"\/><\/svg><span>Rooms<\/span><\/a><a href=\"\/en\/spa-wanita-bangi\/\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 21c-4 0-7-3-7-7 3 0 5 1 7 4 2-3 4-4 7-4 0 4-3 7-7 7zM12 14c-2-3-2-7 0-10 2 3 2 7 0 10z\"\/><\/svg><span>Spa<\/span><\/a><a class=\"nb-wa\" href=\"https:\/\/wa.me\/601155599174?text=Hi%20Roseville%2C%20I%20am%20on%20your%20%22Spa%20Membership%22%20page.%20I%20would%20like%20to%20ask%3A%0A%0ARef%3A%20RV-EN-MEMBER-BAR\" target=\"_blank\" rel=\"noopener\" data-wa-kod=\"RV-EN-MEMBER-BAR\" data-wa-kedudukan=\"bar-telefon\"><span class=\"nb-bulat\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M12 2a10 10 0 0 0-8.7 14.9L2 22l5.3-1.3A10 10 0 1 0 12 2zm0 18.2a8.2 8.2 0 0 1-4.2-1.2l-.3-.2-3.1.8.8-3-.2-.3A8.2 8.2 0 1 1 12 20.2zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8s-.4-.1-.6.1-.7.8-.8 1-.3.2-.5.1a6.7 6.7 0 0 1-3.3-2.9c-.3-.4.2-.4.7-1.3.1-.2 0-.3 0-.4l-.8-1.8c-.2-.5-.4-.4-.6-.4h-.5a1 1 0 0 0-.7.3 3 3 0 0 0-.9 2.2 5.2 5.2 0 0 0 1.1 2.7 11.9 11.9 0 0 0 4.6 4 5.2 5.2 0 0 0 3.2.7 2.7 2.7 0 0 0 1.8-1.3 2.2 2.2 0 0 0 .2-1.3c-.1-.1-.3-.2-.5-.3z\"\/><\/svg><\/span><span>WhatsApp<\/span><\/a><a href=\"\/en\/panduan-berpantang\/\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 5a2 2 0 0 1 2-2h13v16H6a2 2 0 0 0-2 2zM4 21V5M8 7h7M8 11h5\"\/><\/svg><span>Guides<\/span><\/a><a href=\"\/en\/tempah-lawatan\/\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"3\"\/><path d=\"M3 10h18M8 3v4M16 3v4\"\/><\/svg><span>Visit<\/span><\/a><a href=\"\/en\/hubungi\/\"><svg class=\"ik\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 4h4l2 5-3 2a11 11 0 0 0 5 5l2-3 5 2v4a2 2 0 0 1-2 2A16 16 0 0 1 3 6a2 2 0 0 1 2-2z\"\/><\/svg><span>Contact<\/span><\/a><\/nav><\/div><\/div>\n\n\n\n<div data-no-translation style=\"display:contents\"><script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@graph\": [{\"@type\": [\"LocalBusiness\", \"Organization\"], \"@id\": \"https:\/\/rosevilleconfinement.com\/en\/#organization\", \"identifier\": [{\"@type\": \"PropertyValue\", \"propertyID\": \"SSM\", \"value\": \"1361290-T\"}, {\"@type\": \"PropertyValue\", \"propertyID\": \"Lesen Majlis Perbandaran Kajang (MPKj)\", \"value\": \"LBUS-12972\"}], \"sameAs\": [\"https:\/\/www.facebook.com\/rosevilleconfinement\", \"https:\/\/www.instagram.com\/rosevilleconfinement\/\"], \"department\": [{\"@id\": \"https:\/\/rosevilleconfinement.com\/en\/#villa\"}, {\"@id\": \"https:\/\/rosevilleconfinement.com\/en\/#spa\"}], \"name\": \"Roseville Confinement Villa & Spa\", \"alternateName\": \"Roseville\", \"legalName\": \"Rose Omnicare Sdn Bhd\", \"url\": \"https:\/\/rosevilleconfinement.com\/en\/\", \"description\": \"A Shariah-friendly confinement centre and women's spa in Bangi Gateway. A postnatal care centre, not a clinic or hospital.\", \"email\": \"villaroseville@gmail.com\", \"telephone\": \"+601155599174\", \"address\": {\"@type\": \"PostalAddress\", \"streetAddress\": \"No 2-17 & 2-18, Plaza Bangi Perdana, Jalan Gerbang Wawasan 1, Bangi Gateway, Seksyen 15\", \"addressLocality\": \"Bandar Baru Bangi\", \"postalCode\": \"43650\", \"addressRegion\": \"Selangor\", \"addressCountry\": \"MY\"}, \"hasMap\": \"https:\/\/www.google.com\/maps\/search\/?api=1&query=Roseville%20Confinement%20Villa%20Bangi\", \"logo\": {\"@type\": \"ImageObject\", \"url\": \"https:\/\/rosevilleconfinement.com\/wp-content\/uploads\/2023\/07\/512.png\", \"width\": 468, \"height\": 512}, \"image\": {\"@type\": \"ImageObject\", \"url\": \"https:\/\/rosevilleconfinement.com\/wp-content\/uploads\/2026\/10\/roseville-og-bilik-rose.jpg\", \"width\": 1200, \"height\": 630}, \"contactPoint\": [{\"@type\": \"ContactPoint\", \"telephone\": \"+601155599174\", \"contactType\": \"reservations\", \"availableLanguage\": [\"ms\", \"en\"]}, {\"@type\": \"ContactPoint\", \"telephone\": \"+60389259174\", \"contactType\": \"customer service\", \"availableLanguage\": [\"ms\", \"en\"]}]}, {\"@type\": \"WebSite\", \"@id\": \"https:\/\/rosevilleconfinement.com\/en\/#website\", \"url\": \"https:\/\/rosevilleconfinement.com\/en\/\", \"name\": \"Roseville Confinement Villa & Spa\", \"alternateName\": \"Roseville\", \"publisher\": {\"@id\": \"https:\/\/rosevilleconfinement.com\/en\/#organization\"}, \"inLanguage\": \"en-US\"}, {\"@type\": \"DaySpa\", \"@id\": \"https:\/\/rosevilleconfinement.com\/en\/#spa\", \"name\": \"Roseville Muslimah Spa\", \"url\": \"https:\/\/rosevilleconfinement.com\/en\/spa-wanita-bangi\/\", \"telephone\": \"+601155599174\", \"address\": {\"@type\": \"PostalAddress\", \"streetAddress\": \"No 2-17 & 2-18, Plaza Bangi Perdana, Jalan Gerbang Wawasan 1, Bangi Gateway, Seksyen 15\", \"addressLocality\": \"Bandar Baru Bangi\", \"postalCode\": \"43650\", \"addressRegion\": \"Selangor\", \"addressCountry\": \"MY\"}, \"hasMap\": \"https:\/\/www.google.com\/maps\/search\/?api=1&query=Roseville%20Confinement%20Villa%20Bangi\", \"image\": {\"@type\": \"ImageObject\", \"url\": \"https:\/\/rosevilleconfinement.com\/wp-content\/uploads\/2026\/10\/roseville-og-spa.jpg\", \"width\": 1200, \"height\": 630}, \"parentOrganization\": {\"@id\": \"https:\/\/rosevilleconfinement.com\/en\/#organization\"}, \"makesOffer\": [{\"@type\": \"Offer\", \"name\": \"Essential spa package\", \"price\": \"150\", \"priceCurrency\": \"MYR\"}, {\"@type\": \"Offer\", \"name\": \"Signature spa package\", \"price\": \"250\", \"priceCurrency\": \"MYR\"}, {\"@type\": \"Offer\", \"name\": \"Facial Treatment spa package\", \"price\": \"90\", \"priceCurrency\": \"MYR\"}, {\"@type\": \"Offer\", \"name\": \"Serenity spa membership\", \"description\": \"Essential wellbeing\", \"price\": \"199\", \"priceCurrency\": \"MYR\", \"eligibleDuration\": {\"@type\": \"QuantitativeValue\", \"value\": 6, \"unitCode\": \"MON\"}, \"url\": \"https:\/\/rosevilleconfinement.com\/en\/keahlian-spa\/\"}, {\"@type\": \"Offer\", \"name\": \"Radiance spa membership\", \"description\": \"Complete self-care\", \"price\": \"399\", \"priceCurrency\": \"MYR\", \"eligibleDuration\": {\"@type\": \"QuantitativeValue\", \"value\": 6, \"unitCode\": \"MON\"}, \"url\": \"https:\/\/rosevilleconfinement.com\/en\/keahlian-spa\/\"}, {\"@type\": \"Offer\", \"name\": \"Signature spa membership\", \"description\": \"Premium women's wellbeing\", \"price\": \"599\", \"priceCurrency\": \"MYR\", \"eligibleDuration\": {\"@type\": \"QuantitativeValue\", \"value\": 6, \"unitCode\": \"MON\"}, \"url\": \"https:\/\/rosevilleconfinement.com\/en\/keahlian-spa\/\"}]}, {\"@type\": \"WebPage\", \"@id\": \"https:\/\/rosevilleconfinement.com\/en\/keahlian-spa\/#webpage\", \"url\": \"https:\/\/rosevilleconfinement.com\/en\/keahlian-spa\/\", \"name\": \"Muslimah Spa Membership, 6 Months from RM199 | Roseville\", \"description\": \"One spa treatment every month for six months: Serenity RM199, Radiance RM399, Signature RM599. A thoughtful gift.\", \"isPartOf\": {\"@id\": \"https:\/\/rosevilleconfinement.com\/en\/#website\"}, \"about\": {\"@id\": \"https:\/\/rosevilleconfinement.com\/en\/#spa\"}, \"publisher\": {\"@id\": \"https:\/\/rosevilleconfinement.com\/en\/#organization\"}, \"primaryImageOfPage\": {\"@type\": \"ImageObject\", \"url\": \"https:\/\/rosevilleconfinement.com\/wp-content\/uploads\/2026\/10\/roseville-og-spa.jpg\", \"width\": 1200, \"height\": 630}, \"inLanguage\": \"en-US\", \"datePublished\": \"2026-10-23\", \"dateModified\": \"2026-11-05\", \"breadcrumb\": {\"@id\": \"https:\/\/rosevilleconfinement.com\/en\/keahlian-spa\/#breadcrumb\"}}, {\"@type\": \"BreadcrumbList\", \"@id\": \"https:\/\/rosevilleconfinement.com\/en\/keahlian-spa\/#breadcrumb\", \"itemListElement\": [{\"@type\": \"ListItem\", \"position\": 1, \"name\": \"Home\", \"item\": \"https:\/\/rosevilleconfinement.com\/en\/\"}, {\"@type\": \"ListItem\", \"position\": 2, \"name\": \"Spa Membership\", \"item\": \"https:\/\/rosevilleconfinement.com\/en\/keahlian-spa\/\"}]}]}<\/script><\/div>\n\n\n\n<script>(function () {\n  'use strict';\n  \/* Skrip interaksi redesign A Roseville (laman WordPress sebenar). Dijana bersama bina_wp.py; sumber: wp_interaksi.js.\n     Tiada penghala hash: setiap halaman WordPress berasingan. Butang WhatsApp = pautan wa.me biasa (GTM kira generate_lead);\n     skrip ini hanya untuk borang lawatan, Pelan Pantang Percuma, tab, penapis, senarai semak dan menu telefon. *\/\n  if (window.rv2Mula) return;\n  window.rv2Mula = true;\n  function $(s, r) { return (r || document).querySelector(s); }\n  function $$(s, r) { return Array.prototype.slice.call((r || document).querySelectorAll(s)); }\n  var akar = $('.rv2[data-bahasa]');\n  if (!akar) return;\n  var EN = akar.getAttribute('data-bahasa') === 'en' || \/^en\/i.test(document.documentElement.lang || '');\n  var NO = '601155599174';\n  var PETA = {};\n  var PRATONTON = \/[?&]preview=true\/.test(location.search);\n\n  var L = EN ? {\n    hari: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], hp: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n    bulan: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n    pilihDulu: 'Please choose one date and one time slot first.', semakTarikh: 'Enter a due date within the next 10 months.',\n    belumPasti: 'Not sure yet', ditanda: 'ticked', kodLawatan: 'RV-EN-VISIT', kodPelan: 'RV-EN-PLAN-SEND',\n    lawatan: function (t, m, n, edd, b, i) { return 'Hi Roseville, I would like to book a villa visit.\\nDate: ' + t + ', ' + m + '\\nName: ' + n + '\\nDue date: ' + edd + '\\nRoom of interest: ' + b + '\\nComing with: ' + i + '\\n\\nRef: RV-EN-VISIT'; },\n    pakej: function (m) { return (m + 1) + '-day, ' + m + '-night package'; },\n    hantar: function (edd, m, akhir) { return 'Hi Roseville, I have created a Free Confinement Plan. Due date: ' + edd + '. Planning a ' + (m + 1) + '-day, ' + m + '-night package (approx. ' + edd + ' to ' + akhir + '). Could you check room availability?\\n\\nRef: RV-EN-PLAN-SEND'; },\n    kongsi: function (edd, h44, url) { return 'Hi love, here is our confinement plan: estimated delivery ' + edd + ', day 44 of confinement ' + h44 + '. Shall we visit Roseville first? ' + url; },\n    tajuk: function (edd) { return 'Estimated delivery ' + edd; },\n    sub: function (m, h44) { return (m + 1) + '-day, ' + m + '-night package at Roseville. Day 44 of confinement falls on ' + h44 + '.'; },\n    garis: function (minggu, beza, lawatTeks, akhirLabel) {\n      return [['Now', 'About ' + minggu + ' weeks pregnant', beza > 0 ? beza + ' days to your due date.' : 'Your due date has arrived or passed.', ''],\n        [lawatTeks, 'Visit the villa', 'At around 28 to 34 weeks, before travelling gets less comfortable. Bring your husband or mother.', 'utama'],\n        [null, 'Book & confirm your dates', 'Rooms are limited (7 rooms). Book after your visit to secure your dates.', ''],\n        [null, 'Pack your confinement bag', 'Three weeks before your due date. Use the checklist below.', ''],\n        [null, 'Confinement begins (estimate)', 'Straight from the hospital after delivery. The actual date follows the day your baby is born.', 'utama'],\n        [null, akhirLabel, 'Go home with a settled baby routine.', ''],\n        [null, 'Day 44 after birth', 'The traditional full confinement period ends (estimate). Many mothers book a Closing Confinement session around this day.', '']];\n    },\n    akhir: function (m) { return 'End of your ' + (m + 1) + '-day, ' + m + '-night package'; },\n    secepat: 'As soon as possible (this week or next)', hingga: ' to '\n  } : {\n    hari: ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'], hp: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n    bulan: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogo', 'Sep', 'Okt', 'Nov', 'Dis'],\n    pilihDulu: 'Sila pilih satu tarikh dan satu slot masa lawatan dahulu.', semakTarikh: 'Sila masukkan tarikh jangkaan bersalin dalam tempoh 10 bulan akan datang.',\n    belumPasti: 'Belum pasti', ditanda: 'ditanda', kodLawatan: 'RV-LAWATAN', kodPelan: 'RV-PELAN-HANTAR',\n    lawatan: function (t, m, n, edd, b, i) { return 'Salam Roseville, saya ingin menempah lawatan vila.\\nTarikh: ' + t + ', ' + m + '\\nNama: ' + n + '\\nTarikh jangkaan bersalin: ' + edd + '\\nBilik diminati: ' + b + '\\nDatang bersama: ' + i + '\\n\\nRuj: RV-LAWATAN'; },\n    pakej: function (m) { return 'pakej ' + (m + 1) + ' hari ' + m + ' malam'; },\n    hantar: function (edd, m, akhir) { return 'Salam Roseville, saya sudah membuat Pelan Pantang Percuma. Tarikh jangkaan bersalin: ' + edd + '. Rancang pakej ' + (m + 1) + ' hari ' + m + ' malam (anggaran ' + edd + ' hingga ' + akhir + '). Boleh semak kekosongan bilik?\\n\\nRuj: RV-PELAN-HANTAR'; },\n    kongsi: function (edd, h44, url) { return 'Sayang, ni pelan pantang kita: anggaran bersalin ' + edd + ', hari ke-44 pantang ' + h44 + '. Jom lawat Roseville dulu? ' + url; },\n    tajuk: function (edd) { return 'Anggaran bersalin: ' + edd; },\n    sub: function (m, h44) { return 'Pakej ' + (m + 1) + ' hari ' + m + ' malam di Roseville. Hari ke-44 pantang jatuh pada ' + h44 + '.'; },\n    garis: function (minggu, beza, lawatTeks, akhirLabel) {\n      return [['Sekarang', 'Kandungan sekitar ' + minggu + ' minggu', beza > 0 ? beza + ' hari lagi sebelum tarikh jangkaan bersalin.' : 'Tarikh jangkaan bersalin sudah tiba atau berlalu.', ''],\n        [lawatTeks, 'Lawat vila', 'Ketika kandungan sekitar 28 hingga 34 minggu, sebelum perjalanan menjadi kurang selesa. Bawa suami atau ibu.', 'utama'],\n        [null, 'Tempah & sahkan tarikh', 'Bilik terhad (7 bilik). Tempah selepas lawatan supaya tarikh anda terjamin.', ''],\n        [null, 'Kemas beg pantang', 'Tiga minggu sebelum tarikh jangkaan bersalin. Guna senarai semak di bawah.', ''],\n        [null, 'Mula berpantang (anggaran)', 'Terus dari hospital selepas bersalin. Tarikh sebenar mengikut hari bayi lahir.', 'utama'],\n        [null, akhirLabel, 'Pulang dengan rutin bayi yang sudah teratur.', ''],\n        [null, 'Hari ke-44 selepas bersalin', 'Tamat tempoh pantang penuh mengikut adat (anggaran). Ramai ibu memilih sesi Penutup Pantang sekitar hari ini.', '']];\n    },\n    akhir: function (m) { return 'Tamat pakej ' + (m + 1) + ' hari ' + m + ' malam'; },\n    secepat: 'Secepat mungkin (minggu ini atau minggu depan)', hingga: ' hingga '\n  };\n\n  function tarikh(d, pendek) { return (pendek ? '' : L.hari[d.getDay()] + ', ') + d.getDate() + ' ' + L.bulan[d.getMonth()] + ' ' + d.getFullYear(); }\n  function tambah(d, n) { var x = new Date(d.getTime()); x.setDate(x.getDate() + n); return x; }\n  function iso(d) { return d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2); }\n  function waUrl(teks) { return 'https:\/\/wa.me\/' + NO + '?text=' + encodeURIComponent(teks); }\n  function el(tag, kelas, teks) { var x = document.createElement(tag); if (kelas) x.className = kelas; if (teks != null) x.textContent = teks; return x; }\n\n  \/* ---------- pratonton draf: pautan dalaman ke halaman draf yang sepadan (hanya bila ?preview=true) *\/\n  function keDraf(href) {\n    try {\n      var u = new URL(href, location.origin);\n      if (u.origin !== location.origin) return null;\n      var id = PETA[u.pathname];\n      if (!id) return null;\n      var q = (typeof id === 'string' ? '\/?p=' + id.slice(1) : '\/?page_id=' + id) + '&preview=true';\n      u.searchParams.forEach(function (v, k) { q += '&' + encodeURIComponent(k) + '=' + encodeURIComponent(v); });\n      return q + u.hash;\n    } catch (err) { return null; }\n  }\n  if (PRATONTON) $$('.rv2 a[href]').forEach(function (a) { var d = keDraf(a.getAttribute('href')); if (d) a.setAttribute('href', d); });\n  function pergi(laluan) { location.href = (PRATONTON && keDraf(laluan)) || laluan; }\n  \/* buka WhatsApp melalui pautan sebenar supaya pencetus klik pautan GTM (generate_lead) tetap berjalan *\/\n  function bukaPautan(url, kod) {\n    var a = el('a', 'rv2-sembunyi', 'WhatsApp');\n    a.href = url; a.target = '_blank'; a.rel = 'noopener'; a.setAttribute('data-wa-kod', kod);\n    document.body.appendChild(a); a.click();\n    setTimeout(function () { if (a.parentNode) a.parentNode.removeChild(a); }, 1000);\n  }\n  function ralat(borang, mesej) {\n    var p = $('.ralat', borang);\n    if (!p) { p = el('p', 'ralat'); p.setAttribute('role', 'alert'); borang.appendChild(p); }\n    p.textContent = mesej; p.hidden = !mesej;\n  }\n\n  \/* ---------- menu telefon *\/\n  $$('.rv2 .menu-btn').forEach(function (b) {\n    b.addEventListener('click', function () {\n      var n = b.closest('.nav-pil'); var buka = n.classList.toggle('buka');\n      b.setAttribute('aria-expanded', buka ? 'true' : 'false');\n    });\n  });\n\n  \/* ---------- tab (spa) dan penapis bilik *\/\n  $$('.rv2 [data-tabs]').forEach(function (t) {\n    $$('[data-tab]', t).forEach(function (b) {\n      b.addEventListener('click', function () {\n        $$('[data-tab]', t).forEach(function (x) { x.setAttribute('aria-selected', x === b ? 'true' : 'false'); });\n        $$('[data-panel]', t).forEach(function (p) { p.classList.toggle('aktif', p.getAttribute('data-panel') === b.getAttribute('data-tab')); });\n      });\n    });\n  });\n  $$('.rv2 [data-tapis] button').forEach(function (b) {\n    b.addEventListener('click', function () {\n      $$('.rv2 [data-tapis] button').forEach(function (x) { x.setAttribute('aria-selected', x === b ? 'true' : 'false'); });\n      var k = b.getAttribute('data-k');\n      $$('.rv2 .bilik').forEach(function (c) { c.hidden = !(k === 'semua' || c.getAttribute('data-k') === k); });\n    });\n  });\n\n  \/* ---------- panduan: topik + carian (tapis kad) *\/\n  var topik = $$('.rv2 .topik button'), cari = $('.rv2 [data-cari] input'), pilih = 0;\n  function tapisPanduan() {\n    var q = (cari && cari.value || '').toLowerCase().trim(), t = pilih > 0 ? topik[pilih].textContent.toLowerCase().trim() : '', ada = 0;\n    $$('.rv2 .kad-art').forEach(function (k) {\n      var cip = ($('.cip', k) || {}).textContent || '';\n      var ok = (!t || cip.toLowerCase().trim() === t) && (!q || k.textContent.toLowerCase().indexOf(q) !== -1);\n      k.hidden = !ok; if (ok) ada++;\n    });\n    var m = $('.rv2 [data-cari-kosong]'); if (m) m.hidden = ada !== 0;\n  }\n  topik.forEach(function (b, i) {\n    b.setAttribute('aria-selected', i === 0 ? 'true' : 'false');\n    b.addEventListener('click', function () { pilih = i; topik.forEach(function (x) { x.setAttribute('aria-selected', x === b ? 'true' : 'false'); }); tapisPanduan(); });\n  });\n  var fc = $('.rv2 [data-cari]');\n  if (fc) { fc.addEventListener('submit', function (ev) { ev.preventDefault(); tapisPanduan(); }); if (cari) cari.addEventListener('input', tapisPanduan); }\n\n  \/* ---------- kiraan naik (statistik) dan ayat empati muncul perkataan demi perkataan *\/\n  $$('.rv2 .ungkap').forEach(function (u) {\n    var kata = u.textContent.split(' '); u.textContent = '';\n    kata.forEach(function (w, i) { u.appendChild(el('span', '', w)); if (i !== kata.length - 1) u.appendChild(document.createTextNode(' ')); });\n  });\n  var io = ('IntersectionObserver' in window) ? new IntersectionObserver(function (ent) {\n    ent.forEach(function (x) {\n      if (!x.isIntersecting) return;\n      var t = x.target; io.unobserve(t);\n      if (t.classList.contains('kira')) {\n        var n = parseFloat(t.getAttribute('data-n')), p = parseInt(t.getAttribute('data-p') || '0', 10), t0 = null;\n        var langkah = function (ms) { if (!t0) t0 = ms; var k = Math.min(1, (ms - t0) \/ 1100); t.textContent = (n * k).toFixed(p); if (k !== 1) requestAnimationFrame(langkah); };\n        requestAnimationFrame(langkah);\n      }\n      if (t.classList.contains('ungkap')) $$('span', t).forEach(function (s, i) { setTimeout(function () { s.classList.add('nampak'); }, i * 70); });\n    });\n  }, { threshold: 0.4 }) : null;\n  $$('.rv2 .kira, .rv2 .ungkap').forEach(function (t) { if (io) io.observe(t); else $$('span', t).forEach(function (s) { s.classList.add('nampak'); }); });\n\n  \/* ---------- borang tempah lawatan -> mesej WhatsApp siap ditulis *\/\n  var tb = $('.rv2 [data-tarikh]');\n  if (tb) {\n    var kini = new Date();\n    for (var i = 1; i !== 15; i++) {\n      var d = tambah(kini, i), b = el('button', '', L.hp[d.getDay()]);\n      b.type = 'button'; b.setAttribute('aria-pressed', 'false'); b.setAttribute('data-t', tarikh(d, true));\n      b.appendChild(el('small', '', d.getDate() + ' ' + L.bulan[d.getMonth()])); tb.appendChild(b);\n    }\n  }\n  $$('.rv2 .cip-pilih').forEach(function (g) {\n    g.addEventListener('click', function (ev) {\n      var b = ev.target.closest('button'); if (!b) return;\n      $$('button', g).forEach(function (x) { x.setAttribute('aria-pressed', x === b ? 'true' : 'false'); });\n    });\n  });\n  var qp = new URLSearchParams(location.search);\n  var fl = $('.rv2 [data-lawatan]');\n  if (fl) {\n    var bq = qp.get('bilik') || qp.get('room'), sb = fl.querySelector('select[name=bilik]');\n    if (bq && sb) $$('option', sb).forEach(function (o) { if (o.value === bq) sb.value = o.value; });\n    fl.addEventListener('submit', function (ev) {\n      ev.preventDefault();\n      var t = $('[data-tarikh] [aria-pressed=\"true\"]', fl), m = $('[data-masa] [aria-pressed=\"true\"]', fl);\n      if (!t || !m) { ralat(fl, L.pilihDulu); return; }\n      ralat(fl, '');\n      var f = new FormData(fl), eddV = f.get('edd'), edd = eddV ? tarikh(new Date(eddV + 'T00:00:00'), true) : '-';\n      bukaPautan(waUrl(L.lawatan(t.getAttribute('data-t'), m.textContent, f.get('nama'), edd, f.get('bilik') || L.belumPasti, f.get('ikut'))), L.kodLawatan);\n    });\n  }\n\n  \/* ---------- Pelan Pantang Percuma *\/\n  var fp = $('.rv2 [data-pelan]');\n  function jana(eddStr, malam) {\n    var edd = new Date(eddStr + 'T00:00:00'), kini2 = new Date(); kini2.setHours(0, 0, 0, 0);\n    var beza = Math.round((edd - kini2) \/ 864e5);\n    if (isNaN(beza) || beza < -21 || beza > 300) { ralat(fp, L.semakTarikh); return; }\n    ralat(fp, '');\n    var minggu = Math.max(0, Math.min(42, Math.round(40 - beza \/ 7)));\n    var lawatA = tambah(edd, -84), lawatB = tambah(edd, -42), tamat = tambah(edd, malam), h44 = tambah(edd, 43);\n    var lawatTeks = kini2 > lawatB ? L.secepat : tarikh(lawatA, true) + L.hingga + tarikh(lawatB, true);\n    var item = L.garis(minggu, beza, lawatTeks, L.akhir(malam));\n    var tarikhItem = [null, null, tambah(edd, -56), tambah(edd, -21), edd, tamat, h44];\n    var ol = $('.rv2 [data-garis-masa]'); ol.textContent = '';\n    item.forEach(function (x, i) {\n      var li = el('li', x[3]); li.appendChild(el('span', 'tarikh', x[0] != null ? x[0] : tarikh(tarikhItem[i])));\n      var div = el('div'); div.appendChild(el('b', '', x[1])); div.appendChild(el('span', '', x[2])); li.appendChild(div); ol.appendChild(li);\n    });\n    $('.rv2 [data-pelan-tajuk]').textContent = L.tajuk(tarikh(edd, true));\n    $('.rv2 [data-pelan-sub]').textContent = L.sub(malam, tarikh(h44, true));\n    var wa = $('.rv2 [data-wa-kod=\"' + L.kodPelan + '\"]');\n    if (wa) wa.href = waUrl(L.hantar(tarikh(edd, true), malam, tarikh(tamat, true)));\n    var ks = $('.rv2 [data-kongsi-suami]');\n    if (ks) ks.href = 'whatsapp:\/\/send?text=' + encodeURIComponent(L.kongsi(tarikh(edd, true), tarikh(h44, true), location.origin + (EN ? '\/en' : '') + '\/pelan-pantang\/?edd=' + iso(edd) + '&malam=' + malam));\n    var hasil = $('.rv2 [data-pelan-hasil]'); hasil.hidden = false; hasil.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    (window.dataLayer = window.dataLayer || []).push({ event: 'pelan_pantang_dijana', malam: malam });\n  }\n  if (fp) {\n    fp.addEventListener('submit', function (ev) { ev.preventDefault(); jana(fp.edd.value, parseInt(fp.malam.value, 10)); });\n    var e0 = qp.get('edd');\n    if (e0 && \/^[0-9]{4}-[0-9]{2}-[0-9]{2}$\/.test(e0)) {\n      fp.edd.value = e0;\n      var m0 = qp.get('malam') || qp.get('nights');\n      if (m0 && fp.malam.querySelector('option[value=\"' + parseInt(m0, 10) + '\"]')) fp.malam.value = String(parseInt(m0, 10));\n      setTimeout(function () { jana(e0, parseInt(fp.malam.value, 10)); }, 80);\n    }\n  }\n  $$('.rv2 [data-pelan-mini]').forEach(function (f) {\n    f.addEventListener('submit', function (ev) {\n      ev.preventDefault(); var v = $('input', f).value; if (!v) return;\n      pergi(f.getAttribute('data-pelan-mini') + '?edd=' + v + '&malam=13');\n    });\n  });\n  \/* ---------- Kalkulator Hari Pantang (2 Nov 2026): hari ke-N = tarikh bersalin + (N - 1), sama seperti Pelan Pantang (h44 = EDD + 43).\n     Fakta daripada artikel 01 (tempoh, pemeriksaan WHO), 03 (penutup pantang) dan 05 (czer). *\/\n  var fk = $('.rv2 [data-kira]');\n  if (fk) {\n    var K = EN ? {\n      semak: 'Enter a delivery date within the last 12 months or the next 10 months.', kod: 'RV-EN-CALC-CLOSING', hingga: ' to ',\n      lahir: 'Delivery day (day 1)', lahirD: 'Day 1 of your confinement.',\n      cek1: 'First postnatal check-up', cek1D: 'WHO recommends a check-up 48 to 72 hours after birth.',\n      cek2: 'Second postnatal check-up', cek2D: 'WHO recommends another check-up 7 to 14 days after birth.',\n      cek6: '6-week postnatal check-up', cek6D: 'The postnatal period lasts about six weeks (42 days). WHO recommends a check-up in week six.',\n      cek6Czer: ' After a C-section, recovery usually takes about six weeks.',\n      penutup: 'Closing confinement week', penutupD: 'No fixed day: many mothers choose the final week of their confinement.',\n      penutupCzer: \" After a C-section, get your doctor's approval first.\",\n      hari: function (n) { return 'Day ' + n + ' of confinement'; },\n      pilihan: function (n) { return 'End of a ' + n + '-day confinement.'; },\n      tamat: function (n) { return 'Your ' + n + '-day confinement ends.'; },\n      tajuk: function (n, t) { return 'Day ' + n + ' falls on ' + t; },\n      kini: function (h, n, baki) { return 'Today is day ' + h + ' of your confinement. ' + (baki > 0 ? baki + ' days to go until day ' + n + '.' : 'Your ' + n + '-day confinement ends today.'); },\n      lepas: function (n, t) { return 'Your ' + n + '-day confinement ended on ' + t + '.'; },\n      awal: function (b) { return 'This date is ' + b + ' days away, so the dates below are estimates.'; },\n      wa: function (lahir, n, a, b, czer) { return 'Hi Roseville, I used the Confinement Date Calculator. Delivery date: ' + lahir + (czer ? ' (C-section)' : '') + '. Planning a ' + n + '-day confinement; closing confinement week ' + a + ' to ' + b + '. Could you check availability for the Closing Confinement package?\\n\\nRef: RV-EN-CALC-CLOSING'; },\n      kongsi: function (lahir, n, t, url) { return 'Hi love, here are our confinement dates: delivery ' + lahir + ', day ' + n + ' falls on ' + t + '. ' + url; }\n    } : {\n      semak: 'Sila masukkan tarikh bersalin dalam tempoh 12 bulan lepas atau 10 bulan akan datang.', kod: 'RV-KIRA-PENUTUP', hingga: ' hingga ',\n      lahir: 'Hari bersalin (hari ke-1)', lahirD: 'Hari pertama pantang anda.',\n      cek1: 'Pemeriksaan pertama selepas bersalin', cek1D: 'WHO mengesyorkan pemeriksaan 48 hingga 72 jam selepas bersalin.',\n      cek2: 'Pemeriksaan kedua selepas bersalin', cek2D: 'WHO mengesyorkan pemeriksaan sekali lagi 7 hingga 14 hari selepas bersalin.',\n      cek6: 'Pemeriksaan 6 minggu', cek6D: 'Tempoh selepas bersalin kira-kira enam minggu (42 hari). WHO mengesyorkan pemeriksaan pada minggu keenam.',\n      cek6Czer: ' Selepas czer, pemulihan biasanya kira-kira enam minggu.',\n      penutup: 'Minggu penutup pantang', penutupD: 'Tiada hari tetap: ramai ibu memilih minggu terakhir tempoh pantang.',\n      penutupCzer: ' Bersalin czer: dapatkan kebenaran doktor dahulu.',\n      hari: function (n) { return 'Hari ke-' + n + ' pantang'; },\n      pilihan: function (n) { return 'Tamat jika anda memilih pantang ' + n + ' hari.'; },\n      tamat: function (n) { return 'Pantang ' + n + ' hari anda tamat.'; },\n      tajuk: function (n, t) { return 'Hari ke-' + n + ' jatuh pada ' + t; },\n      kini: function (h, n, baki) { return 'Hari ini hari ke-' + h + ' pantang anda. ' + (baki > 0 ? baki + ' hari lagi hingga hari ke-' + n + '.' : 'Pantang ' + n + ' hari anda tamat hari ini.'); },\n      lepas: function (n, t) { return 'Pantang ' + n + ' hari anda sudah tamat pada ' + t + '.'; },\n      awal: function (b) { return 'Tarikh ini ' + b + ' hari lagi, jadi tarikh di bawah ialah anggaran.'; },\n      wa: function (lahir, n, a, b, czer) { return 'Salam Roseville, saya guna Kalkulator Hari Pantang. Tarikh bersalin: ' + lahir + (czer ? ' (czer)' : '') + '. Rancang pantang ' + n + ' hari; minggu penutup pantang ' + a + ' hingga ' + b + '. Boleh semak kekosongan Pakej Penutup Pantang?\\n\\nRuj: RV-KIRA-PENUTUP'; },\n      kongsi: function (lahir, n, t, url) { return 'Sayang, ni tarikh pantang kita: bersalin ' + lahir + ', hari ke-' + n + ' jatuh pada ' + t + '. ' + url; }\n    };\n    var kira = function (lahirStr, T, czer) {\n      var lahir = new Date(lahirStr + 'T00:00:00'), kini3 = new Date(); kini3.setHours(0, 0, 0, 0);\n      var beza = Math.round((kini3 - lahir) \/ 864e5);\n      if (isNaN(beza) || beza < -300 || beza > 366) { ralat(fk, K.semak); return; }\n      ralat(fk, '');\n      var hk = function (n) { return tambah(lahir, n - 1); };\n      var julat = function (a, b) { return tarikh(a, true) + K.hingga + tarikh(b, true); };\n      var item = [[0, tarikh(lahir), K.lahir, K.lahirD, 'utama'], [2, julat(tambah(lahir, 2), tambah(lahir, 3)), K.cek1, K.cek1D, ''],\n        [7, julat(tambah(lahir, 7), tambah(lahir, 14)), K.cek2, K.cek2D, ''], [42, tarikh(tambah(lahir, 42)), K.cek6, K.cek6D + (czer ? K.cek6Czer : ''), ''],\n        [T - 6.9, julat(hk(T - 6), hk(T)), K.penutup, K.penutupD + (czer ? K.penutupCzer : ''), 'utama']];\n      [14, 28, 40, 44].forEach(function (n) { item.push([n - 1, tarikh(hk(n)), K.hari(n), n === T ? K.tamat(n) : K.pilihan(n), n === T ? 'utama' : '']); });\n      item.sort(function (a, b) { return a[0] - b[0]; });\n      var ol = $('.rv2 [data-kira-garis]'); ol.textContent = '';\n      item.forEach(function (x) {\n        var li = el('li', x[4]); li.appendChild(el('span', 'tarikh', x[1]));\n        var div = el('div'); div.appendChild(el('b', '', x[2])); div.appendChild(el('span', '', x[3])); li.appendChild(div); ol.appendChild(li);\n      });\n      $('.rv2 [data-kira-tajuk]').textContent = K.tajuk(T, tarikh(hk(T)));\n      $('.rv2 [data-kira-sub]').textContent = beza < 0 ? K.awal(-beza) : (beza <= T - 1 ? K.kini(beza + 1, T, T - beza - 1) : K.lepas(T, tarikh(hk(T), true)));\n      $('.rv2 [data-kira-czer]').hidden = !czer;\n      $('.rv2 [data-kira-awal]').hidden = beza >= 0;\n      var w = $('.rv2 [data-wa-kod=\"' + K.kod + '\"]');\n      if (w) w.href = waUrl(K.wa(tarikh(lahir, true), T, tarikh(hk(T - 6), true), tarikh(hk(T), true), czer));\n      var ks2 = $('.rv2 [data-kira-kongsi]');\n      if (ks2) ks2.href = 'whatsapp:\/\/send?text=' + encodeURIComponent(K.kongsi(tarikh(lahir, true), T, tarikh(hk(T), true),\n        location.origin + (EN ? '\/en' : '') + '\/kira-hari-pantang\/?lahir=' + iso(lahir) + '&tempoh=' + T + (czer ? '&cara=czer' : '')));\n      var hasil = $('.rv2 [data-kira-hasil]'); hasil.hidden = false; hasil.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      (window.dataLayer = window.dataLayer || []).push({ event: 'kira_pantang_dijana', tempoh: T, cara: czer ? 'czer' : 'normal' });\n    };\n    fk.addEventListener('submit', function (ev) { ev.preventDefault(); kira(fk.lahir.value, parseInt(fk.tempoh.value, 10), fk.cara.value === 'czer'); });\n    var l0 = qp.get('lahir');\n    if (l0 && \/^[0-9]{4}-[0-9]{2}-[0-9]{2}$\/.test(l0)) {\n      fk.lahir.value = l0;\n      var t0 = parseInt(qp.get('tempoh'), 10);\n      if ([14, 28, 40, 44].indexOf(t0) > -1) fk.tempoh.value = String(t0);\n      if (qp.get('cara') === 'czer') fk.cara.value = 'czer';\n      setTimeout(function () { kira(l0, parseInt(fk.tempoh.value, 10), fk.cara.value === 'czer'); }, 80);\n    }\n  }\n  \/* ---------- Kalkulator Cuti Bersalin (artikel 10, 3 Nov 2026): hari terakhir = tarikh mula + (N - 1), kembali bekerja = mula + N.\n     Fakta daripada artikel 10: Akta Kerja 1955 s.37, s.40(2), s.60FA; Ordinan Buruh Sabah dan Sarawak (98 hari, mula seawal 30 hari);\n     PPSM JPA SR.5.4.1 (60 hingga 90 hari, mula seawal 14 hari sebelum jangkaan) dan SR.5.7.1 (CTR Kelompok suami).\n     JANGAN guna aksara kurang-daripada dalam blok ini: wptexturize WordPress (kandungan post) menukar && kepada &#038;&#038; selepasnya (4 Nov 2026). *\/\n  var fc = $('.rv2 [data-cuti]');\n  if (fc) {\n    var C = EN ? {\n      semak: 'Enter a due date or delivery date within the last 12 months or the next 10 months.', semakTempoh: 'Civil servants choose between 60 and 90 days.',\n      hingga: ' to ', mulai: 'From ', sebelum: 'By ', segera: 'As soon as possible', kod: 'RV-ART-CUTI-BERSALIN-CALC',\n      notis: 'Tell your employer', notisD: 'Under the Employment Act 1955 (Peninsular Malaysia and Labuan), give notice within 60 days before your due date, including your leave start date. If you don\\u2019t, your allowance can be held back until you give notice.',\n      suamiNotis: 'Your husband tells his employer', suamiNotisD: 'For 7-day paternity leave in the private sector: at least 30 days before the due date, or as soon as possible after the birth.',\n      mula: 'Maternity leave starts', mulaD: function (n) { return 'Day 1 of ' + n + '. Each day taken before the birth is one day less after it.'; },\n      jangka: 'Due date', lahir: 'Delivery day',\n      lahirD: function (a) { return (a ? 'Day ' + (a + 1) + ' of maternity leave' : 'Day 1 of maternity leave') + ' and day 1 of confinement.'; },\n      paterniti: 'Husband\u2019s paternity leave (private sector)', paternitiD: '7 consecutive days from the delivery day, weekends and public holidays included. Civil servant husbands: CTR Kelompok of 1 to 20 days a year, with the head of department\u2019s approval.',\n      h44: 'Day 44 of confinement', h44D: function (h, b) { return 'Day ' + h + ' of your maternity leave. Leave left after confinement: ' + b + ' days.'; },\n      akhir: 'Last day of maternity leave', akhirD: function (n) { return 'Day ' + n + ' of your leave.'; },\n      balik: 'Back to work', balikD: 'Or your next working day if this falls on a rest day or public holiday.',\n      notaSwasta: 'If your baby arrives early or late, recalculate with the actual delivery date. Days taken more than 30 days before the birth do not count as maternity leave. Pay depends on the conditions explained below.',\n      notaAwam: 'Budget 2027 announced up to 98 days per birth for civil servants, but no start date has been set. Check with your department\u2019s HR unit.',\n      tajuk: function (n, t) { return 'Your ' + n + '-day leave ends on ' + t; },\n      kini: function (h, n) { return 'Today is day ' + h + ' of your ' + n + '-day leave. '; },\n      jadual: function (a, b) { return 'Leave starts ' + a + ' and you are back at work on ' + b + '.'; },\n      anggaran: ' These are estimates based on your due date.', lepas: function (t) { return 'Your maternity leave ended on ' + t + '.'; },\n      wa: function (belum, l, a, b, h) { return 'Hi Roseville, I used the Maternity Leave Calculator. ' + (belum ? 'Due date: ' : 'Delivery date: ') + l + '. My maternity leave: ' + a + ' to ' + b + '. I would like to plan my confinement at Roseville (day 44: ' + h + '). Could you check room availability?\\n\\nRef: RV-ART-CUTI-BERSALIN-CALC'; },\n      waLewat: function (l) { return 'Hi Roseville, I used the Maternity Leave Calculator. I gave birth on ' + l + ' and would like to ask about the Closing Confinement package or the spa.\\n\\nRef: RV-ART-CUTI-BERSALIN-CALC'; },\n      kongsi: function (belum, l, a, b, s, url) { return 'Hi love, here are our maternity leave dates: ' + (belum ? 'due date ' : 'delivery ') + l + ', my leave ' + a + ' to ' + b + '. Private-sector paternity leave is 7 days from the delivery day' + (s ? ', so tell your employer by ' + s : '') + '. ' + url; }\n    } : {\n      semak: 'Sila masukkan tarikh jangkaan bersalin atau tarikh bersalin dalam tempoh 12 bulan lepas atau 10 bulan akan datang.', semakTempoh: 'Penjawat awam memilih antara 60 hingga 90 hari.',\n      hingga: ' hingga ', mulai: 'Mulai ', sebelum: 'Sebelum ', segera: 'Secepat mungkin', kod: 'RV-ART-CUTI-BERSALIN-KIRA',\n      notis: 'Maklumkan majikan anda', notisD: 'Di bawah Akta Kerja 1955 (Semenanjung dan Labuan), beri notis dalam tempoh 60 hari sebelum tarikh jangkaan bersalin, termasuk tarikh mula cuti. Jika tidak, elaun boleh ditangguhkan sehingga notis diberi.',\n      suamiNotis: 'Suami maklumkan majikannya', suamiNotisD: 'Untuk cuti paterniti 7 hari di sektor swasta: sekurang-kurangnya 30 hari sebelum tarikh jangkaan bersalin, atau seawal mungkin selepas kelahiran.',\n      mula: 'Cuti bersalin bermula', mulaD: function (n) { return 'Hari ke-1 daripada ' + n + ' hari. Setiap hari cuti sebelum bersalin mengurangkan satu hari cuti selepas bersalin.'; },\n      jangka: 'Tarikh jangkaan bersalin', lahir: 'Hari bersalin',\n      lahirD: function (a) { return 'Hari ke-' + (a + 1) + ' cuti bersalin dan hari ke-1 pantang.'; },\n      paterniti: 'Cuti paterniti suami (swasta)', paternitiD: '7 hari berturut-turut bermula pada hari bersalin, termasuk hujung minggu dan cuti umum. Suami penjawat awam: CTR Kelompok 1 hingga 20 hari setahun, dengan kelulusan Ketua Jabatan.',\n      h44: 'Hari ke-44 pantang', h44D: function (h, b) { return 'Hari ke-' + h + ' cuti bersalin anda. Baki cuti selepas pantang: ' + b + ' hari.'; },\n      akhir: 'Hari terakhir cuti bersalin', akhirD: function (n) { return 'Hari ke-' + n + ' cuti anda.'; },\n      balik: 'Kembali bekerja', balikD: 'Atau hari bekerja anda yang berikutnya jika tarikh ini hari rehat atau cuti umum.',\n      notaSwasta: 'Jika bayi lahir lebih awal atau lewat, kira semula dengan tarikh bersalin sebenar. Hari cuti yang diambil lebih daripada 30 hari sebelum bersalin tidak dikira sebagai cuti bersalin. Elaun bergantung pada syarat yang diterangkan di bawah.',\n      notaAwam: 'Belanjawan 2027 mengumumkan maksimum 98 hari bagi setiap kelahiran untuk penjawat awam, tetapi tarikh kuat kuasa belum dinyatakan. Semak dengan unit sumber manusia jabatan anda.',\n      tajuk: function (n, t) { return 'Cuti ' + n + ' hari anda tamat pada ' + t; },\n      kini: function (h, n) { return 'Hari ini hari ke-' + h + ' daripada ' + n + ' hari cuti anda. '; },\n      jadual: function (a, b) { return 'Cuti bermula ' + a + ' dan anda kembali bekerja pada ' + b + '.'; },\n      anggaran: ' Tarikh ini ialah anggaran mengikut tarikh jangkaan bersalin.', lepas: function (t) { return 'Cuti bersalin anda sudah tamat pada ' + t + '.'; },\n      wa: function (belum, l, a, b, h) { return 'Salam Roseville, saya guna Kalkulator Cuti Bersalin. ' + (belum ? 'Tarikh jangkaan bersalin: ' : 'Tarikh bersalin: ') + l + '. Cuti bersalin saya ' + a + ' hingga ' + b + '. Saya nak rancang pantang di Roseville (hari ke-44: ' + h + '). Boleh semak kekosongan bilik?\\n\\nRuj: RV-ART-CUTI-BERSALIN-KIRA'; },\n      waLewat: function (l) { return 'Salam Roseville, saya guna Kalkulator Cuti Bersalin. Saya bersalin pada ' + l + ' dan nak tanya tentang Pakej Penutup Pantang atau spa.\\n\\nRuj: RV-ART-CUTI-BERSALIN-KIRA'; },\n      kongsi: function (belum, l, a, b, s, url) { return 'Sayang, ni tarikh cuti bersalin kita: ' + (belum ? 'jangkaan bersalin ' : 'bersalin ') + l + ', cuti saya ' + a + ' hingga ' + b + '. Cuti paterniti (swasta) 7 hari bermula hari bersalin' + (s ? ', jadi maklumkan majikan sebelum ' + s : '') + '. ' + url; }\n    };\n    var segerak = function () {  \/\/ penjawat awam: tempoh 60 hingga 90 hari, mula paling awal 14 hari sebelum jangkaan\n      var awam = fc.sektor.value === 'awam';\n      $('[data-cuti-tempoh]', fc).hidden = !awam;\n      $$('option[data-swasta]', fc.awal).forEach(function (o) { o.hidden = o.disabled = awam; });\n      if (awam && parseInt(fc.awal.value, 10) > 14) fc.awal.value = '14';\n    };\n    fc.sektor.addEventListener('change', segerak);\n    var kiraCuti = function (gulung) {\n      var lahir = new Date(fc.lahir.value + 'T00:00:00'), kini4 = new Date(); kini4.setHours(0, 0, 0, 0);\n      var beza = Math.round((lahir - kini4) \/ 864e5);\n      if (isNaN(beza) || -366 > beza || beza > 300) { ralat(fc, C.semak); return; }\n      var awam = fc.sektor.value === 'awam', N = awam ? parseInt(fc.tempoh.value, 10) : 98;\n      if (awam && !(N >= 60 && 90 >= N)) { ralat(fc, C.semakTempoh); return; }\n      ralat(fc, '');\n      var A = Math.min(parseInt(fc.awal.value, 10) || 0, awam ? 14 : 30), belum = beza > 0;\n      var mula = tambah(lahir, -A), akhir = tambah(mula, N - 1), balik = tambah(mula, N), h44 = tambah(lahir, 43);\n      var hadPada = function (d, awalan) { return kini4 > d ? C.segera : awalan + tarikh(d, true); };\n      var item = [];  \/\/ [kunci susunan (hari dari tarikh bersalin), teks tarikh, tajuk, huraian, kelas]\n      if (belum && !awam) item.push([-60.5, hadPada(tambah(lahir, -60), C.mulai), C.notis, C.notisD, '']);\n      if (belum) item.push([-30.5, hadPada(tambah(lahir, -30), C.sebelum), C.suamiNotis, C.suamiNotisD, '']);\n      if (A) item.push([-A, tarikh(mula), C.mula, C.mulaD(N), '']);\n      item.push([0, tarikh(lahir), belum ? C.jangka : C.lahir, C.lahirD(A), '']);\n      item.push([0.5, tarikh(lahir, true) + C.hingga + tarikh(tambah(lahir, 6), true), C.paterniti, C.paternitiD, '']);\n      item.push([43, tarikh(h44), C.h44, C.h44D(A + 44, N - A - 44), 'utama']);\n      item.push([N - A - 1, tarikh(akhir), C.akhir, C.akhirD(N), 'utama']);\n      item.push([N - A, tarikh(balik), C.balik, C.balikD, '']);\n      item.sort(function (a, b) { return a[0] - b[0]; });\n      var ol = $('.rv2 [data-cuti-garis]'); ol.textContent = '';\n      item.forEach(function (x) {\n        var li = el('li', x[4]); li.appendChild(el('span', 'tarikh', x[1]));\n        var div = el('div'); div.appendChild(el('b', '', x[2])); div.appendChild(el('span', '', x[3])); li.appendChild(div); ol.appendChild(li);\n      });\n      var hari = Math.round((kini4 - mula) \/ 864e5);\n      $('.rv2 [data-cuti-tajuk]').textContent = C.tajuk(N, tarikh(akhir));\n      $('.rv2 [data-cuti-sub]').textContent = hari >= N ? C.lepas(tarikh(akhir, true)) :\n        (hari >= 0 ? C.kini(hari + 1, N) : '') + C.jadual(tarikh(mula, true), tarikh(balik, true)) + (belum ? C.anggaran : '');\n      $('.rv2 [data-cuti-nota]').textContent = awam ? C.notaAwam : C.notaSwasta;\n      var l = tarikh(lahir, true), a = tarikh(mula, true), b = tarikh(akhir, true);\n      var w = $('.rv2 [data-wa-kod=\"' + C.kod + '\"]');\n      if (w) w.href = waUrl(-43 > beza ? C.waLewat(l) : C.wa(belum, l, a, b, tarikh(h44, true)));\n      var kp = $('.rv2 [data-cuti-pantang]');\n      if (kp) kp.href = (EN ? '\/en' : '') + '\/kira-hari-pantang\/?lahir=' + iso(lahir) + '&tempoh=44';\n      var ks3 = $('.rv2 [data-cuti-kongsi]'), sn = tambah(lahir, -30);\n      if (ks3) ks3.href = 'whatsapp:\/\/send?text=' + encodeURIComponent(C.kongsi(belum, l, a, b, belum && sn >= kini4 ? tarikh(sn, true) : '',\n        location.origin + location.pathname + '?lahir=' + iso(lahir) + '&sektor=' + fc.sektor.value + '&awal=' + A + (awam ? '&tempoh=' + N : '') + '#kalkulator'));\n      var hasil = $('.rv2 [data-cuti-hasil]'); hasil.hidden = false;\n      if (gulung) hasil.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      (window.dataLayer = window.dataLayer || []).push({ event: 'kalkulator_cuti_dijana', sektor: fc.sektor.value, awal: A, tempoh: N });\n    };\n    fc.addEventListener('submit', function (ev) { ev.preventDefault(); kiraCuti(true); });\n    var c0 = qp.get('lahir');\n    if (c0 && \/^[0-9]{4}-[0-9]{2}-[0-9]{2}$\/.test(c0)) {\n      fc.lahir.value = c0;\n      if (qp.get('sektor') === 'awam') fc.sektor.value = 'awam';\n      var tp = parseInt(qp.get('tempoh'), 10); if (tp >= 60 && 90 >= tp) fc.tempoh.value = String(tp);\n      var aw = qp.get('awal'); if (aw && fc.awal.querySelector('option[value=\"' + parseInt(aw, 10) + '\"]')) fc.awal.value = String(parseInt(aw, 10));\n      segerak();\n      setTimeout(function () { kiraCuti(true); }, 80);\n    } else segerak();\n  }\n  $$('.rv2 [data-cetak]').forEach(function (b) { b.addEventListener('click', function () { window.print(); }); });\n\n  \/* ---------- senarai semak barang pantang (disimpan dalam telefon sahaja) *\/\n  var KUNCI = EN ? 'rvSemakEN' : 'rvSemak', simpan = {};\n  try { simpan = JSON.parse(localStorage.getItem(KUNCI) || '{}'); } catch (err) { simpan = {}; }\n  function kiraSemak() {\n    var k = $('.rv2 [data-semak-kira]');\n    if (k) k.textContent = $$('.rv2 [data-semak]:checked').length + ' \/ ' + $$('.rv2 [data-semak]').length + ' ' + L.ditanda;\n  }\n  $$('.rv2 [data-semak]').forEach(function (c) {\n    c.checked = !!simpan[c.getAttribute('data-semak')];\n    c.addEventListener('change', function () {\n      simpan[c.getAttribute('data-semak')] = c.checked;\n      try { localStorage.setItem(KUNCI, JSON.stringify(simpan)); } catch (err) { \/* storan disekat: abaikan *\/ }\n      kiraSemak();\n    });\n  });\n  kiraSemak();\n})();\n<\/script>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":7747,"parent":0,"menu_order":4,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-7545","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/rosevilleconfinement.com\/en\/wp-json\/wp\/v2\/pages\/7545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rosevilleconfinement.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rosevilleconfinement.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rosevilleconfinement.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rosevilleconfinement.com\/en\/wp-json\/wp\/v2\/comments?post=7545"}],"version-history":[{"count":15,"href":"https:\/\/rosevilleconfinement.com\/en\/wp-json\/wp\/v2\/pages\/7545\/revisions"}],"predecessor-version":[{"id":8314,"href":"https:\/\/rosevilleconfinement.com\/en\/wp-json\/wp\/v2\/pages\/7545\/revisions\/8314"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rosevilleconfinement.com\/en\/wp-json\/wp\/v2\/media\/7747"}],"wp:attachment":[{"href":"https:\/\/rosevilleconfinement.com\/en\/wp-json\/wp\/v2\/media?parent=7545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}