<!doctype html>
<html class="no-js" lang="id">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="author" content="Ruangguru Tech Team" />
<meta name="description" content="Belajar mandiri untuk SMP terlengkap dengan materi, video pembelajaran, & latihan soal untuk semua mapel. Langganan sekarang, harga mulai Rp 300 ribuan!" />
<meta name="generator" content="HubSpot" />
<title>Paket Hemat Ruangbelajar untuk SMP, Diskon 56% Cuma 200 Ribuan</title>
<link rel="shortcut icon" href="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/favicon60x60-3.png" />
<meta
property="og:description"
content="Belajar mandiri untuk SMP terlengkap dengan materi, video pembelajaran, & latihan soal untuk semua mapel. Langganan sekarang, harga mulai Rp 300 ribuan!"
/>
<meta property="og:title" content="Paket Hemat Ruangbelajar untuk SMP, Diskon 56% Cuma 200 Ribuan" />
<meta
name="twitter:description"
content="Belajar mandiri untuk SMP terlengkap dengan materi, video pembelajaran, & latihan soal untuk semua mapel. Langganan sekarang, harga mulai Rp 300 ribuan!"
/>
<meta name="twitter:title" content="Paket Hemat Ruangbelajar untuk SMP, Diskon 56% Cuma 200 Ribuan" />
<style>
a.cta_button {
-moz-box-sizing: content-box !important;
-webkit-box-sizing: content-box !important;
box-sizing: content-box !important;
vertical-align: middle;
}
.hs-breadcrumb-menu {
list-style-type: none;
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
}
.hs-breadcrumb-menu-item {
float: left;
padding: 10px 0px 10px 10px;
}
.hs-breadcrumb-menu-divider:before {
content: '›';
padding-left: 10px;
}
.hs-featured-image-link {
border: 0;
}
.hs-featured-image {
float: right;
margin: 0 0 20px 20px;
max-width: 50%;
}
@media (max-width: 568px) {
.hs-featured-image {
float: none;
margin: 0;
width: 100%;
max-width: 100%;
}
}
.hs-screen-reader-text {
clip: rect(1px, 1px, 1px, 1px);
height: 1px;
overflow: hidden;
position: absolute !important;
width: 1px;
}
</style>
<link
rel="stylesheet"
href="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/module_assets/87562389674/1670556296985/module_87562389674_Module_RG_Detail_Page_ruangbelajar.min.css"
/>
<!-- Added by GoogleAnalytics integration -->
<script>
var _hsp = (window._hsp = window._hsp || []);
_hsp.push([
'addPrivacyConsentListener',
function (consent) {
if (consent.allowed || (consent.categories && consent.categories.analytics)) {
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
(i[r] =
i[r] ||
function () {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-49650255-1', 'auto');
ga('send', 'pageview');
}
},
]);
</script>
<!-- /Added by GoogleAnalytics integration -->
<link rel="canonical" href="https://www.ruangguru.com/ruangbelajar-smp" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script>
(function (h, e, a, t, m, p) {
m = e.createElement(a);
m.async = !0;
m.src = t;
p = e.getElementsByTagName(a)[0];
p.parentNode.insertBefore(m, p);
})(window, document, 'script', 'https://u.heatmap.it/log.js');
</script>
<meta name="google-site-verification" content="VJAn1g6wmtTZPpTXh-B4xoSFEkUi5jcV74xQSr6jnOM" />
<script>
document.querySelector('meta[name="author"]').setAttribute('content', 'Ruangguru Tech Team');
</script>
<meta name="publisher" content="PT Ruang Raya Indonesia" />
<!-- Global site tag (gtag.js) - Google Analytics -->
<!--
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-49650255-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-49650255-1');
</script>
-->
<!-- Google Tag Manager -->
<script>
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-PVNLZFT');
</script>
<!-- End Google Tag Manager -->
<meta property="og:image" content="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/ruangguru-1.jpeg#keepProtocol" />
<meta property="og:image:width" content="400" />
<meta property="og:image:height" content="300" />
<meta name="twitter:image" content="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/ruangguru-1.jpeg#keepProtocol" />
<meta property="og:url" content="https://www.ruangguru.com/ruangbelajar-smp" />
<meta name="twitter:card" content="summary_large_image" />
<meta http-equiv="content-language" content="id" />
<link rel="stylesheet" href="https://cdn-web-2.ruangguru.com/landing-page-web/public/assets/common/layout.min.css" />
<link
rel="stylesheet"
href="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/template_assets/44980440489/1661483386153/A_Ruangguru_Projects/Project_Hofar/CSS_Javascript_Auto_Generate_Breadcrumb_-_V1.min.css"
/>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.css" />
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick-theme.css" />
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&Nunito:ital,wght@0,700;0,800;1,700;1,800&family=Source+Sans+Pro:ital,wght@0,400;0,600;0,700;1,400;1,600;1,700&display=swap');
.container,
.container-lg,
.container-md,
.container-sm,
.container-xl,
.page-center {
float: none !important;
width: 90% !important;
max-width: 1200px !important;
margin: 0 auto !important;
}
body,
html {
height: 100% !important;
margin: 0;
min-height: 100% !important;
scroll-behavior: smooth;
}
img {
max-width: 100%;
}
button,
a {
cursor: pointer !important;
}
.fn-ma {
float: none;
margin: auto;
}
h1,
h2,
h3,
h4,
h5,
h6,
p,
a {
margin: 0 !important;
}
a {
text-decoration: none;
}
/* Used on all text */
.font-inter {
font-family: 'Inter';
}
.font-source {
font-family: 'Source Sans Pro', sans-serif;
}
.font-nunito {
font-family: 'Nunito', sans-serif;
}
/* Used on H1 tag */
.font-header-one,
.font-header-two,
.font-header-three {
font-weight: 700;
}
/* Black main color */
.font-black {
color: #2c313a;
}
/* Black secondary color */
.font-black-secondary {
color: #333333;
}
.font-green {
color: #13939e;
}
.font-gray {
color: #424242;
}
.font-light-gray {
color: #5f6570;
}
/* White color */
.font-white {
color: #ffffff;
}
.font-red {
color: #e52a34;
}
.font-blue {
background: linear-gradient(299.69deg, #0a5ad1 7.23%, #3db6fa 105.51%), #ffffff;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-fill-color: transparent;
}
/* Letter spacing */
.ls-1 {
letter-spacing: -0.01em;
}
.ls-5 {
letter-spacing: -0.005em;
}
/* Display */
.display-block {
display: block;
}
.display-none {
display: none;
}
.display-flex {
display: flex;
}
.display-grid {
display: grid;
}
/* Slick Button */
/* .slick-button-orange .slick-arrow {}
.slick-button-orange .slick-next {}
.slick-button-orange .slick-prev {} */
.slick-arrow {
}
.slick-next {
}
.slick-button-orange {
}
.slick-button-white {
}
/* Slick Dots */
/* .slick-dots-white .slick-dots li button:before {}
.slick-dots-white .slick-dots li.slick-active button:before {} */
/* Button */
/* Used on all button */
.button-basic-white {
background: #ffffff;
border-radius: 96px;
text-decoration: none;
}
.button-basic-white:hover {
filter: brightness(95%);
}
.button-basic-orange {
background: #f26d0f;
border-radius: 100px;
text-decoration: none;
}
.button-basic-orange:hover {
filter: brightness(95%);
}
/* List */
.ul-basic {
list-style: none;
}
.ol-basic {
list-style: none;
}
@media (min-width: 1025px) {
.font-header-one {
font-size: 32px;
line-height: 48px;
}
.font-header-two {
font-size: 18px;
line-height: 28px;
}
.font-header-three {
font-size: 20px;
line-height: 30px;
}
.desktop {
display: block !important;
}
.mobile {
display: none !important;
}
}
@media (max-width: 1024px) {
.font-header-one {
font-size: 20px;
line-height: 22px;
}
.font-header-two,
.font-header-three {
font-size: 16px;
line-height: 24px;
}
.desktop {
display: none !important;
}
.mobile {
display: block !important;
}
}
</style>
<script type="module" crossorigin src="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/ruangbelajar-smp/assets/index-Dqv5PPZA.js"></script>
</head>
<body class="hs-content-id-88650962846 hs-landing-page hs-page" style="">
<div class="header-container-wrapper">
<div class="header-container container-fluid"></div>
<!--end header -->
</div>
<!--end header wrapper -->
<div class="body-container-wrapper">
<div class="body-container container-fluid">
<div class="row-fluid-wrapper row-depth-1 row-number-1">
<div class="row-fluid">
<div class="span12 widget-span widget-type-custom_widget" style="" data-widget-type="custom_widget" data-x="0" data-w="12">
<div
id="hs_cos_wrapper_module_166539239949538"
class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module"
style=""
data-hs-cos-general-type="widget"
data-hs-cos-type="module"
>
<section class="hero">
<div class="page-center">
<div class="hero-content fn-ma">
<div class="hero-content_top">
<a href="https://www.ruangguru.com" id="backToReferrer" role="button" style="cursor: pointer">
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/Iconback.svg"
width="32"
height="32"
class="ic-back"
alt="Icon Back"
/>
</a>
<nav aria-label="breadcrumb">
<ol id="breadcrumb" class="breadcrumb bg-transparent p-0"></ol>
</nav>
</div>
<div class="hero-content_bottom display-grid">
<div class="hero-content_bottom--left">
<p class="font-inter font-white font-notes-hero desktop">ruangbelajar</p>
<h1 class="font-inter font-white font-header-one" id="product-hero-title">Video belajar</h1>
<p class="font-inter font-desc-hero" id="product-hero-description">Video belajar adaptif yang menyesuaikan kecepatan belajarmu!</p>
</div>
<div class="hero-content_bottom--right">
<div class="hero-video fn-ma">
<a href="#" class="js-video-button" data-channel="video" data-video-url="https://www.youtube.com/embed/7lCmzw25yRI?autoplay=1" rel=" noopener">
<div class="video-box">
<picture>
<source
srcset="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/rubel-hero-non-sd.png?convert=webp "
type="image/webp"
id="heroWebp"
/>
<source
srcset="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/rubel-hero-non-sd.png "
type="image/png"
id="heroSrcPng"
/>
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/rubel-hero-non-sd.png"
class="img-hero"
alt="Video Ruangbelajar"
loading="lazy"
id="heroPng"
/>
</picture>
</div>
</a>
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/ic-star.svg"
class="ic-hero"
id="ic-star-top"
loading="lazy"
alt=""
/>
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/ic-star.svg"
class="ic-hero"
id="ic-star-bottom"
loading="lazy"
alt=""
/>
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/ic-playlist.png"
class="ic-hero"
id="ic-playlist"
loading="lazy"
alt=""
/>
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/ic-brain.png"
class="ic-hero"
id="ic-live"
loading="lazy"
alt=""
/>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="detail">
<div class="detail-wrapper">
<div class="detail-content fn-ma">
<div class="detail-content_left">
<div class="detail-navbar-usp-wrapper">
<div class="detail-navbar">
<div class="detail-navbar_tier navbar-select" id="navbar-tier">
<p class="font-inter font-black" id="selectedGrade">Kelas 3 SD</p>
<button class="font-inter" id="btn-select-grade">
Ganti
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/ic-ChevronRight%20(1).svg"
width="16"
height="16"
loading="lazy"
alt=""
/>
</button>
</div>
<div class="detail-navbar_info">
<a class="btn-navbar active" href="#detail-package">Detail Paket</a>
<a class="btn-navbar" href="#video-simulation">Contoh Video</a>
<a class="btn-navbar" href="#reviews">Ulasan</a>
</div>
</div>
<div class="detail-usp" id="detail-package">
<h2 class="font-inter font-black-secondary font-header-two ls-5">Yang akan kamu dapatkan:</h2>
<ul id="usp-list"></ul>
<button class="btn-read mobile">
<span id="toggle-usp-text">Selengkapnya</span>
<img
class="toggle-usp-arrow down"
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/ic-ChevronDown.svg"
width="16"
height="16"
loading="lazy"
alt=""
/>
</button>
</div>
</div>
<div class="detail-video" id="video-simulation">
<h2 class="font-inter font-black-secondary font-header-three ls-5">Contoh video ruangbelajar</h2>
<p class="font-inter font-black font-desc-video" id="choose-grade-lesson">Pilih Mata Pelajaran</p>
<div class="detail-video_tier navbar-select sd">
<p class="font-inter font-black" id="selectedLesson">Matematika</p>
<button class="font-inter" id="change-lesson-sd">
Ganti
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/ic-ChevronRight%20(1).svg"
width="16"
height="16"
loading="lazy"
alt=""
/>
</button>
</div>
<div class="detail-video_tier navbar-select non-sd">
<div class="navbar-select-item grade">
<p class="font-inter font-black" id="selectedGradeLesson">SD Kelas 3</p>
</div>
<div id="navbar-video-divider"></div>
<div class="navbar-select-item lesson">
<p class="font-inter font-black" id="selectedLessonNonSD">Matematika</p>
</div>
</div>
<div class="detail-video_content">
<div class="video-box" id="videoPreview">
<iframe
frameborder="0"
allowfullscreen
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
src="https://www.youtube.com/embed/JEqa8VGnQ_0"
></iframe>
</div>
</div>
<div class="detail-video_topics">
<h2 id="topic-title" class="detail-video_topics-title font-inter font-black-secondary ls-5 font-header-two">
Daftar Bab -
<span id="topic-lesson-name">Matematika</span>
<span id="topic-grade-name">Kelas 1 SD</span>
</h2>
<ul id="topic-list" class="topic-list"></ul>
</div>
</div>
<div class="detail-fitur">
<div class="detail-fitur_info">
<div class="detail-fitur_text">
<h2 class="font-inter font-white ls-5 font-header-two font-title-fitur">Dapatkan semua contoh fitur ruangbelajar!</h2>
<p class="font-inter font-white font-desc-fitur">Kamu bisa lihat contoh video adaptif, latihan soal, rangkuman, dan banyak lagi.</p>
</div>
<a class="font-inter font-black btn-white" href="https://ruangguru.com/ruangbelajar">Lihat Contoh Fitur</a>
</div>
</div>
<div class="detail-testimoni" id="reviews">
<h2 class="font-inter font-black-secondary ls-5 font-header-two">Cerita para pengguna ruangbelajar</h2>
<div class="testimoni-wrapper">
<div class="testimoni-card smp">
<div class="testimoni-card_top">
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/8f2be4af-761b-4e26-b386-07b196f7f425.png?width=56&height=56&name=sunflower.png"
width="56"
height="56"
loading="lazy"
alt="Asrul C"
srcset="https://cdn-web-2.ruangguru.com/landing-pages/assets/8f2be4af-761b-4e26-b386-07b196f7f425.png?width=28&height=28&name=sunflower.png 28w, https://cdn-web-2.ruangguru.com/landing-pages/assets/8f2be4af-761b-4e26-b386-07b196f7f425.png?width=56&height=56&name=sunflower.png 56w, https://cdn-web-2.ruangguru.com/landing-pages/assets/8f2be4af-761b-4e26-b386-07b196f7f425.png?width=84&height=84&name=sunflower.png 84w, https://cdn-web-2.ruangguru.com/landing-pages/assets/8f2be4af-761b-4e26-b386-07b196f7f425.png?width=112&height=112&name=sunflower.png 112w, https://cdn-web-2.ruangguru.com/landing-pages/assets/8f2be4af-761b-4e26-b386-07b196f7f425.png?width=140&height=140&name=sunflower.png 140w, https://cdn-web-2.ruangguru.com/landing-pages/assets/8f2be4af-761b-4e26-b386-07b196f7f425.png?width=168&height=168&name=sunflower.png 168w"
sizes="(max-width: 56px) 100vw, 56px"
/>
<div class="testimoni-card_top-text">
<p class="font-inter font-black ls-5 font-nama">Nabila T</p>
<p class="font-inter font-light-gray font-sekolah ls-5">Pengguna ruangbelajar</p>
</div>
</div>
<p class="font-inter font-black font-testimoni ls-5">
Sebelum aku menggunakan ruangguru aku ngerasa kurang faham dengan materi yang dijelaskan oleh guru waktu di sekolah namun setelah menggunakan ruangguru dan ada fitur
adapto aku jadi lebih ngerti tentang materi yang aku pelajari aku juga berhasil mempertahankan posisiku sebagai peringkat 1 di sekolah sejak menggunakan ruangguru
terlebih lagi ada fitur rangkuman yang ngebuat aku jadi lebih gampang belajar kalau ada ulangan mendadak.
</p>
</div>
<div class="testimoni-card smp">
<div class="testimoni-card_top">
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Student/Dasmasura%20Y.jpg?width=56&height=56&name=Dasmasura%20Y.jpg"
width="56"
height="56"
loading="lazy"
alt="Dasmasura Y"
srcset="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Student/Dasmasura%20Y.jpg?width=28&height=28&name=Dasmasura%20Y.jpg 28w, https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Student/Dasmasura%20Y.jpg?width=56&height=56&name=Dasmasura%20Y.jpg 56w, https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Student/Dasmasura%20Y.jpg?width=84&height=84&name=Dasmasura%20Y.jpg 84w, https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Student/Dasmasura%20Y.jpg?width=112&height=112&name=Dasmasura%20Y.jpg 112w, https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Student/Dasmasura%20Y.jpg?width=140&height=140&name=Dasmasura%20Y.jpg 140w, https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Student/Dasmasura%20Y.jpg?width=168&height=168&name=Dasmasura%20Y.jpg 168w"
sizes="(max-width: 56px) 100vw, 56px"
/>
<div class="testimoni-card_top-text">
<p class="font-inter font-black ls-5 font-nama">Dasmasura Y</p>
<p class="font-inter font-light-gray font-sekolah ls-5">Pengguna ruangbelajar</p>
</div>
</div>
<p class="font-inter font-black font-testimoni ls-5">
Dulu, aku belajar dari buku pelajaran aja. Penjelasannya kurang rinci jadi susah memahaminya. Aku pun coba langganan Ruangguru dan ternyata helpful banget! Belajarku
lebih lebih lengkap dan teratur sesuai kebutuhan sekolah.
</p>
</div>
</div>
</div>
</div>
<div class="detail-content_right">
<div class="page-center-content">
<h2 class="font-inter font-black ls-5 font-header-two desktop">Beli paket ruangbelajar</h2>
<div id="package-price"></div>
</div>
</div>
</div>
</div>
</section>
<div id="jenjangModal" class="modal-jenjang">
<!-- Modal content -->
<div class="modal-content-jenjang">
<div class="modal-body-jenjang">
<span class="close-jenjang">×</span>
<p class="modal-jenjang-title">Selamat datang di Ruangguru!</p>
<p class="modal-jenjang-subtitle">Ingin tahu produk untuk jenjang apa?</p>
<button type="button" class="btn-level" value="sd" on>SD</button>
<button type="button" class="btn-level" value="smp">SMP</button>
<button type="button" class="btn-level" value="sma">SMA</button>
<button type="button" class="btn-level" value="utbk">
UTBK / SNBT
<span class="new-level">Terbaru!</span>
</button>
</div>
</div>
</div>
<div id="gradeSDModal" class="modal-jenjang">
<!-- Modal content -->
<div class="modal-content-jenjang">
<div class="modal-body-jenjang">
<p class="modal-jenjang-title">Anak Anda sekarang kelas berapa?</p>
<button type="button" class="btn-sd-grade" value="1-2" on>Kelas 1 SD</button>
<button type="button" class="btn-sd-grade" value="1-2" on>Kelas 2 SD</button>
<button type="button" class="btn-sd-grade" value="3-4" on>Kelas 3 SD</button>
<button type="button" class="btn-sd-grade" value="3-4" on>Kelas 4 SD</button>
<button type="button" class="btn-sd-grade" value="5-6" on>Kelas 5 SD</button>
<button type="button" class="btn-sd-grade" value="5-6" on>Kelas 6 SD</button>
</div>
</div>
</div>
<div id="gradeNonSDModal" class="modal-jenjang">
<!-- Modal content -->
<div class="modal-content-jenjang">
<div class="modal-body-jenjang">
<span class="close-jenjang" id="gradeNonSDCloseModal">×</span>
<p class="modal-jenjang-title">Pilih Kelas</p>
<button type="button" class="btn-smp-sma-grade smp" value="smp-7" name="kelas-7-smp" on>Kelas 7 SMP</button>
<button type="button" class="btn-smp-sma-grade smp" value="smp-8" name="kelas-7-smp" on>Kelas 8 SMP</button>
<button type="button" class="btn-smp-sma-grade smp" value="smp-9" name="kelas-7-smp" on>Kelas 9 SMP</button>
<button type="button" class="btn-smp-sma-grade sma" value="sma-10-ipa" on>Kelas 10 IPA SMA</button>
<button type="button" class="btn-smp-sma-grade sma" value="sma-10-ips" on>Kelas 10 IPS SMA</button>
<button type="button" class="btn-smp-sma-grade sma" value="sma-11-ipa" on>Kelas 11 IPA SMA</button>
<button type="button" class="btn-smp-sma-grade sma" value="sma-11-ips" on>Kelas 11 IPS SMA</button>
<button type="button" class="btn-smp-sma-grade sma" value="sma-12-ipa" on>Kelas 12 IPA SMA</button>
<button type="button" class="btn-smp-sma-grade sma" value="sma-12-ips" on>Kelas 12 IPS SMA</button>
<button type="button" class="btn-smp-sma-grade utbk" value="utbk" on>UTBK</button>
</div>
</div>
</div>
<div id="packageListModal" class="modal-jenjang">
<!-- Modal content -->
<div class="modal-content-jenjang">
<div class="modal-body-jenjang">
<span class="close-jenjang" id="packageListModalClose">×</span>
<p class="modal-jenjang-title">Mau langganan untuk berapa lama?</p>
<p class="modal-jenjang-subtitle">Makin lama durasinya, makin murah harga per harinya, lho!</p>
<div class="filterPackages">
<button type="button" class="btn-filter durasi-9-bulan" value="durasi-9-bulan" on>9 bulan</button>
<button type="button" class="btn-filter durasi-12-bulan" value="durasi-12-bulan" on>1 tahun</button>
<button type="button" class="btn-filter durasi-18-bulan" value="durasi-18-bulan" on>1,5 tahun</button>
<button type="button" class="btn-filter durasi-24-bulan" value="durasi-24-bulan" on>2 tahun</button>
<button type="button" class="btn-filter durasi-30-bulan" value="durasi-30-bulan" on>2,5 tahun</button>
<button type="button" class="btn-filter durasi-6-bulan" value="durasi-6-bulan" on>6 bulan</button>
<button type="button" class="btn-filter durasi-3-bulan" value="durasi-3-bulan" on>3 bulan</button>
<button type="button" class="btn-filter durasi-1-bulan" value="durasi-1-bulan" on>1 bulan</button>
<button type="button" class="btn-filter other" value="other" on>Lainnya</button>
</div>
<p class="modal-jenjang-title" style="margin-top: 8px !important; margin-bottom: 8px !important">Pilih paket yang tersedia</p>
<div id="availablePackages"></div>
<div class="package-upgrades">
<p class="modal-jenjang-title">Lengkapi paket belajarmu, yuk!</p>
<div id="packageUpgradesWrapper"></div>
</div>
<div class="package-total" id="packageTotalWrapper"></div>
</div>
</div>
</div>
<div id="chooseSubjectModal" class="modal-jenjang">
<!-- Modal content -->
<div class="modal-content-jenjang">
<div class="modal-body-jenjang">
<span class="close-jenjang" id="chooseSubjectCloseModal">×</span>
<p class="modal-jenjang-title">Pilih Mata Pelajaran</p>
<div id="chooseSubjectWrapper"></div>
</div>
</div>
</div>
</div>
</div>
<!--end widget-span -->
</div>
<!--end row-->
</div>
<!--end row-wrapper -->
</div>
<!--end body -->
</div>
<!--end body wrapper -->
<!-- HubSpot performance collection script -->
<script defer src="https://static.hsappstatic.net/content-cwv-embed/static-1.240/embed.js"></script>
<script src="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/template_assets/47442333552/1667882001713/A_Ruangguru_Projects/Project_Hofar/Javascript_Auto_Generate_Breadcrumb_-_V1_3.min.js"></script>
<script src="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/template_assets/89254424350/1666672114193/toast.min.js"></script>
<!-- <script src="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/module_assets/87562389674/1670556295832/module_87562389674_Module_RG_Detail_Page_ruangbelajar.min.js"></script> -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
const videoPreviewData = [
{
gradeSerial: 'sd-1',
gradeName: 'Kelas 1 SD',
lessons: [
{ name: 'Matematika', youtubeUrl: 'https://youtube.com/embed/fjmFP7Mpop8', lessonSerial: 'sd-1-matematika', topics: [{ name: 'Kegiatanku', subtopics: ['Kegiatan Malam Hari'] }] },
{
name: 'Bahasa Indonesia',
youtubeUrl: 'https://youtube.com/embed/MgUNTyiHuxY',
lessonSerial: 'sd-1-bahasaindonesia',
topics: [{ name: 'Peristiwa Alam', subtopics: ['Peristiwa Siang dan Malam'] }],
},
],
},
{
gradeSerial: 'sd-2',
gradeName: 'Kelas 2 SD',
lessons: [
{
name: 'Matematika',
youtubeUrl: 'https://youtube.com/embed/Kr6hpV5e5OY',
lessonSerial: 'sd-2-matematika',
topics: [{ name: 'Bermain di Lingkunganku', subtopics: ['Bermain di Rumah Teman'] }],
},
{
name: 'Bahasa Indonesia',
youtubeUrl: 'https://youtube.com/embed/mnORGTAmhpE',
lessonSerial: 'sd-2-bahasaindonesia',
topics: [{ name: 'Tugasku Sehari-hari', subtopics: ['Tugasku Sebagai Umat Beragama'] }],
},
],
},
{
gradeSerial: 'sd-3',
gradeName: 'Kelas 3 SD',
lessons: [
{
name: 'Matematika',
youtubeUrl: 'https://youtube.com/embed/svOu-cxbxOY',
lessonSerial: 'sd-3-matematika',
topics: [{ name: 'Perkembangan Teknologi', subtopics: ['Perkembangan Teknologi Produksi Sandang'] }],
},
{
name: 'Bahasa Indonesia',
youtubeUrl: 'https://youtube.com/embed/3N61bsBrb24',
lessonSerial: 'sd-3-bahasaindonesia',
topics: [{ name: 'Perubahan di Alam', subtopics: ['Perubahan Cuaca dan Iklim'] }],
},
],
},
{
gradeSerial: 'sd-4',
gradeName: 'Kelas 4 SD',
lessons: [
{
name: 'IPA',
youtubeUrl: 'https://youtube.com/embed/JEqa8VGnQ_0',
lessonSerial: 'sd-4-ipa',
topics: [{ name: 'Indahnya Keragaman Di Negeriku', subtopics: ['Indahnya Keragaman Budaya Negeriku'] }],
},
{ name: 'IPS', youtubeUrl: 'https://youtube.com/embed/BltJgckmivQ', lessonSerial: 'sd-4-ips', topics: [{ name: 'Indahnya Kebersamaan', subtopics: ['Keberagaman Budaya Bangsaku'] }] },
{
name: 'Matematika',
youtubeUrl: 'https://youtube.com/embed/PNe9wj8yVBs',
lessonSerial: 'sd-4-matematika',
topics: [{ name: 'Data dan Pengukuran', subtopics: ['Penyajian Data: Diagram Batang'] }],
},
],
},
{
gradeSerial: 'sd-5',
gradeName: 'Kelas 5 SD',
lessons: [
{ name: 'IPA', youtubeUrl: 'https://youtube.com/embed/plIhynuJr_U', lessonSerial: 'sd-5-ipa', topics: [{ name: 'Makanan Sehat', subtopics: ['Bagaimana Tubuh Mengolah Makanan?'] }] },
{ name: 'IPS', youtubeUrl: 'https://youtube.com/embed/aa9X-NvB0YM', lessonSerial: 'sd-5-ips', topics: [{ name: 'Organ Gerak Hewan dan Manusia', subtopics: ['Manusia dan Lingkungan'] }] },
{
name: 'Bahasa Indonesia',
youtubeUrl: 'https://youtube.com/embed/ovKdxfQZPZA',
lessonSerial: 'sd-5-bahasaindonesia',
topics: [{ name: 'Makanan Sehat', subtopics: ['Pentingnya Makanan Sehat Bagi Tubuh'] }],
},
],
},
{
gradeSerial: 'sd-6',
gradeName: 'Kelas 6 SD',
lessons: [
{ name: 'IPA', youtubeUrl: 'https://youtube.com/embed/N0Or_9LqcEE', lessonSerial: 'sd-6-ipa', topics: [{ name: 'Bumiku', subtopics: ['Bumi, Matahari, dan Bulan'] }] },
{
name: 'IPS',
youtubeUrl: 'https://youtube.com/embed/s5rEZO8meio',
lessonSerial: 'sd-6-ips',
topics: [{ name: 'Menuju Masyarakat Sejahtera', subtopics: ['Masyarakat Peduli Lingkungan'] }],
},
{ name: 'Matematika', youtubeUrl: 'https://youtube.com/embed/NIuboCrlbwk', lessonSerial: 'sd-6-matematika', topics: [{ name: 'Lingkaran', subtopics: ['Keliling Lingkaran'] }] },
],
},
{
gradeSerial: 'smp-7',
gradeName: 'Kelas 7 SMP',
lessons: [
{ name: 'Biologi', youtubeUrl: 'https://youtube.com/embed/E91uGdhqBr4', lessonSerial: 'smp-7-biologi', topics: [{ name: 'Klasifikasi Makhluk Hidup', subtopics: ['Konsep Kilat'] }] },
],
},
{
gradeSerial: 'smp-8',
gradeName: 'Kelas 8 SMP',
lessons: [{ name: 'Bahasa Indonesia', youtubeUrl: 'https://youtube.com/embed/PYZnWHLytlE', lessonSerial: 'smp-8-bahasaindonesia', topics: [{ name: 'Iklan', subtopics: ['Konsep Kilat'] }] }],
},
{
gradeSerial: 'smp-9',
gradeName: 'Kelas 9 SMP',
lessons: [
{
name: 'Matematika',
youtubeUrl: 'https://youtube.com/embed/AxVLh6rNzKc',
lessonSerial: 'smp-9-matematika',
topics: [{ name: 'Bilangan Berpangkat (Eksponen)', subtopics: ['Konsep Kilat'] }],
},
],
},
{
gradeSerial: 'sma-10-ipa',
gradeName: 'Kelas 10 IPA',
lessons: [
{ name: 'Fisika', youtubeUrl: 'https://youtube.com/embed/oJ0U0q-Nmr8', lessonSerial: 'sma-10-ipa-fisika', topics: [{ name: 'Besaran dan Satuan', subtopics: ['Konsep Kilat'] }] },
{ name: 'Biologi', youtubeUrl: 'https://youtube.com/embed/AIG7SER9ngU', lessonSerial: 'sma-10-ipa-biologi', topics: [{ name: 'Ruang Lingkup Biologi', subtopics: ['Konsep Kilat'] }] },
{
name: 'Kimia',
youtubeUrl: 'https://youtube.com/embed/YbC8gTl8j2U',
lessonSerial: 'sma-10-ipa-kimia',
topics: [{ name: 'Ilmu Kimia dan Ruang Lingkupnya', subtopics: ['Konsep Kilat'] }],
},
],
},
{
gradeSerial: 'sma-10-ips',
gradeName: 'Kelas 10 IPS',
lessons: [
{
name: 'Geografi',
youtubeUrl: 'https://youtube.com/embed/730SXDFdUlQ',
lessonSerial: 'sma-10-ips-geografi',
topics: [{ name: 'Pengetahuan Dasar Geografi', subtopics: ['Konsep Kilat'] }],
},
{ name: 'Ekonomi', youtubeUrl: 'https://youtube.com/embed/6X3ujv0AJck', lessonSerial: 'sma-10-ips-ekonomi', topics: [{ name: 'Sistem Ekononomi', subtopics: ['Konsep Kilat'] }] },
{
name: 'Sosiologi',
youtubeUrl: 'https://youtube.com/embed/GUI6SppuUUY',
lessonSerial: 'sma-10-ips-sosiologi',
topics: [{ name: 'Fungsi Sosiologi Untuk Mengenali Gejala Sosial di Masyarakat I', subtopics: ['Konsep Kilat'] }],
},
{ name: 'Bahasa Indonesia', youtubeUrl: 'https://youtube.com/embed/8F2zf4fPe1A', lessonSerial: 'sma-10-ips-bahasaindonesia', topics: [{ name: 'Puisi', subtopics: ['Konsep Kilat'] }] },
],
},
{
gradeSerial: 'sma-11-ipa',
gradeName: 'Kelas 11 IPA',
lessons: [
{ name: 'Fisika', youtubeUrl: 'https://youtube.com/embed/IMFDfx7tTMY', lessonSerial: 'sma-11-ipa-fisika', topics: [{ name: 'Fluida Statis', subtopics: ['Konsep Kilat'] }] },
{ name: 'Biologi', youtubeUrl: 'https://youtube.com/embed/fqxKOF3k4nw', lessonSerial: 'sma-11-ipa-biologi', topics: [{ name: 'Sel', subtopics: ['Konsep Kilat'] }] },
],
},
{
gradeSerial: 'sma-11-ips',
gradeName: 'Kelas 11 IPS',
lessons: [
{
name: 'Ekonomi',
youtubeUrl: 'https://youtube.com/embed/aC5fHkTbwU0',
lessonSerial: 'sma-11-ips-ekonomi',
topics: [{ name: 'Pertumbuhan dan Pembangunan Ekonomi', subtopics: ['Konsep Kilat'] }],
},
{
name: 'Bahasa Inggris',
youtubeUrl: 'https://youtube.com/embed/eJSL3RNpxVw',
lessonSerial: 'sma-11-ips-bahasainggris',
topics: [{ name: 'Sharing Advice', subtopics: ['Konsep Kilat'] }],
},
],
},
{
gradeSerial: 'sma-12-ipa',
gradeName: 'Kelas 12 IPA',
lessons: [
{
name: 'Biologi',
youtubeUrl: 'https://youtube.com/embed/oeUZW75cBSY',
lessonSerial: 'sma-12-ipa-biologi',
topics: [{ name: 'Pertumbuhan dan Perkembangan Tumbuhan', subtopics: ['Konsep Kilat'] }],
},
{ name: 'Fisika', youtubeUrl: 'https://youtube.com/embed/AT26vrXa0Jw', lessonSerial: 'sma-12-ipa-fisika', topics: [{ name: 'Listrik Arus Searah', subtopics: ['Konsep Kilat'] }] },
{ name: 'Kimia', youtubeUrl: 'https://youtube.com/embed/LMi_TbXhaes', lessonSerial: 'sma-12-ipa-kimia', topics: [{ name: 'Sifat Koligatif Larutan', subtopics: ['Konsep Kilat'] }] },
],
},
{
gradeSerial: 'sma-12-ips',
gradeName: 'Kelas 12 IPS',
lessons: [
{
name: 'Sejarah Peminatan',
youtubeUrl: 'https://youtube.com/embed/YJJ4us4uEO8',
lessonSerial: 'sma-12-ips-sejarahpeminatan',
topics: [{ name: 'Respons Internasional terhadap Proklamasi', subtopics: ['Konsep Kilat'] }],
},
{ name: 'Sosiologi', youtubeUrl: 'https://youtube.com/embed/MvNnekt11E8', lessonSerial: 'sma-12-ips-sosiologi', topics: [{ name: 'Perubahan Sosial', subtopics: ['Konsep Kilat'] }] },
{
name: 'Geografi',
youtubeUrl: 'https://youtube.com/embed/HVD1aez9mAQ',
lessonSerial: 'sma-12-ips-geografi',
topics: [{ name: 'Konsep Wilayah dan Tata Ruang', subtopics: ['Konsep Kilat'] }],
},
],
},
{
gradeSerial: 'utbk',
gradeName: 'UTBK',
lessons: [
{
name: 'UTBK Strategi',
youtubeUrl: 'https://youtube.com/embed/Rhetkjg5Sxs',
lessonSerial: 'utbk-utbkstrategi',
topics: [{ name: 'Strategi Umum Penalaran Matematika (NEW)', subtopics: ['Strategi Belajar'] }],
},
{
name: 'UTBK Konsep Kilat',
youtubeUrl: 'https://youtube.com/embed/lSD4XDmJ24w',
lessonSerial: 'utbk-utbkkonsepkilat',
topics: [{ name: 'Reading Comprehension for UTBK', subtopics: ['Konsep Kilat Specific Information'] }],
},
],
},
];
function updateProductHeroText({ title: title, description: description }) {
$('#product-hero-title').text(title), $('#product-hero-description').text(description);
}
if (
($(window).one('scroll', function () {
$('#package-price').css('display', 'block');
}),
setTimeout(function () {
$('#package-price').css('display', 'block');
}, 3e3),
$('.btn-read.mobile').click(function () {
$('.detail-usp > ul > li:nth-child(n+7)').toggle(400, function () {
$(this).is(':visible')
? ($('#toggle-usp-text').text('Lihat lebih sedikit'), $('.toggle-usp-arrow').removeClass('down'), $('.toggle-usp-arrow').addClass('up'))
: ($('#toggle-usp-text').text('Selengkapnya'), $('.toggle-usp-arrow').removeClass('up'), $('.toggle-usp-arrow').addClass('down'));
});
}),
$('#btn-select-grade').click(function () {
$('#gradeSDModal').css('display', 'block');
}),
window.location.pathname.includes('sd'))
) {
const srcRubelSDHero = 'https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/rubel-hero-sd.png';
$('#heroWebp').attr('srcset', srcRubelSDHero + '?convert=webp'),
$('#heroSrcPng').attr('srcset', srcRubelSDHero),
$('#heroPng').attr('src', srcRubelSDHero),
$('#gradeSDModal').css('display', 'block'),
$('#navbar-tier').addClass('show'),
$('.testimoni-card.sd').css('display', 'block'),
$('.detail-video_tier.non-sd').css('display', 'none'),
$('.detail-video_tier.sd').css('display', 'flex'),
updateProductHeroText({ title: 'Video belajar bersama guru', description: 'Video belajar SD dengan pembahasan lengkap dan mudah dipahami' });
}
function changeGrade(grade, gradeId) {
switch (grade) {
case '1-2':
endpoint = 'https://gw.ruangguru.com/api/v3/rg-product-package-api/active-packages?page=1&pageSize=30&excludedTags=old-flow,ios&tags=rubel,kelas-1-2-sd';
break;
case '3-4':
endpoint = 'https://gw.ruangguru.com/api/v3/rg-product-package-api/active-packages?page=1&pageSize=30&excludedTags=old-flow,ios&tags=rubel,kelas-3-4-sd&includeInstallments=true';
break;
case '5-6':
endpoint = 'https://gw.ruangguru.com/api/v3/rg-product-package-api/active-packages?page=1&pageSize=30&excludedTags=old-flow,ios&tags=rubel,kelas-5-6-sd&includeInstallments=true';
break;
case 'smp':
endpoint = 'https://gw.ruangguru.com/api/v3/rg-product-package-api/active-packages?page=1&pageSize=30&excludedTags=old-flow,ios&tags=rubel,kelas-smp&includeInstallments=true';
break;
case 'smp-roboguru':
endpoint =
'https://gw.ruangguru.com/api/v3/rg-product-package-api/active-packages?page=1&pageSize=30&excludedTags=old-flow,ios&tags=rubel-roboguru-plus,kelas-smp&includeInstallments=true';
break;
case 'sma':
endpoint = 'https://gw.ruangguru.com/api/v3/rg-product-package-api/active-packages?page=1&pageSize=30&excludedTags=old-flow,ios&tags=rubel,kelas-sma-regular&includeInstallments=true';
break;
case 'utbk':
endpoint = 'https://gw.ruangguru.com/api/v3/rg-product-package-api/active-packages?page=1&pageSize=30&excludedTags=old-flow,ios&tags=rubel-utbk,kelas-sbmptn&includeInstallments=true';
}
fetchData(endpoint, function (response) {
return response.json().then(d => {
createContent(d.data.items[0], gradeId, 0),
(function (packageList) {
const availableListEl = document.getElementById('availablePackages');
let selectedInputGroup, selectedPackage;
for (let i = 0; i < packageList.length; i++) {
let count;
const hasFlashsale = '' !== packageList[i].flashsale.flashsaleSerial,
durationTag = packageList[i].tags.find(t => t.name.includes('durasi')),
durationClassName = durationTag ? durationTag.name : 'other';
hasFlashsale
? (count = setInterval(function () {
timer(parseInt(packageList[i].flashsale.flashsaleEndTime));
}, 1e3))
: clearInterval(count),
durationTag ? $('.btn-filter.' + durationClassName).css('display', 'block') : $('.btn-filter.other').css('display', 'block'),
0 === i
? ($('.btn-filter.' + durationClassName).addClass('active-btn-level'),
(selectedInputGroup = '.inputGroup.' + durationClassName),
(selectedPackage = packageList[i]),
(availableListEl.innerHTML = ` <div class="inputGroup active ${durationClassName}"> \n <input id="package${i}" name="package" type="radio" value=${
packageList[i].serial
} checked />\n <label for="package${i}">\n <div class="radio-wrapper-text">\n <p class="font-inter" style="font-size: 14px; font-weight: 600; margin-bottom: 4px;">\n ${
packageList[i].name
}\n </p>\n <p class="font-inter" style="font-size: 11px; font-weight: 400; margin-bottom: 4px;">\n ${createDescriptionPackageByName(
packageList[i].name
)}\n </p>\n <div style="display: flex; align-items:center; column-gap:4px;">\n <p class="font-inter font-red font-diskon" style="font-size: 10px;">${
packageList[i].voucherValidation.voucherPercentage
}%</p>\n <p class="font-inter font-gray font-coret" >${createRupiahStr(packageList[i].originalPrice)}</p>\n <p class="font-inter font-red font-harga">${createRupiahStr(
packageList[i].finalPrice
)}</p>\n </div>\n </div> \n </label>\n </div>`))
: (availableListEl.innerHTML += ` <div class="inputGroup ${durationClassName}">\n <input id="package${i}" name="package" type="radio" value=${
packageList[i].serial
} />\n <label for="package${i}">\n <div class="radio-wrapper-text">\n <p class="font-inter" style="font-size: 14px; font-weight: 600; margin-bottom: 4px;">\n ${
packageList[i].name
}\n </p>\n <p class="font-inter" style="font-size: 11px; font-weight: 400; margin-bottom: 4px;">\n ${createDescriptionPackageByName(
packageList[i].name
)}\n </p>\n <div style="display: flex; align-items:center; column-gap:4px;">\n <p class="font-inter font-red font-diskon" style="font-size: 10px;">${
packageList[i].voucherValidation.voucherPercentage
}%</p>\n <p class="font-inter font-gray font-coret" >${createRupiahStr(packageList[i].originalPrice)}</p>\n <p class="font-inter font-red font-harga">${createRupiahStr(
packageList[i].finalPrice
)}</p>\n </div>\n </div> \n </label>\n </div>`),
$(selectedInputGroup).css('display', 'block');
}
$(`input[value="${selectedPackageSerial}"]`).prop('checked', !0),
$(`input[value="${selectedPackageSerial}"]`).closest('.inputGroup').addClass('active'),
createSubtotalElement(selectedPackage, gradeId),
$('.inputGroup').click(function () {
$('.inputGroup.active').removeClass('active'), $(this).addClass('active');
const selectedVal = $('input[name="package"]:checked').val();
createSubtotalElement(
packageList.find(p => p.serial === selectedVal),
gradeId
);
});
})(d.data.items);
});
});
}
function fetchData(endpoint, callback) {
return fetch(endpoint, {
headers: { 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json', 'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS', platform: 'web', country: 'id' },
})
.then(response => {
callback(response);
})
.catch(error => {
console.log(error);
});
}
window.location.pathname.includes('smp') &&
!window.location.pathname.includes('roboguru') &&
(changeGrade('smp', 'kelas-9-smp'),
$('.testimoni-card.smp').css('display', 'block'),
$('.btn-smp-sma-grade.smp').css('display', 'block'),
setVideoPreviewData('smp-9'),
updateProductHeroText({ title: 'Video belajar + latihan soal', description: 'Video adaptif satu-satunya di Indonesia yang bisa menyesuaikan kecepatan belajar' })),
window.location.pathname.includes('roboguruplus-smp') &&
(changeGrade('smp-roboguru', 'kelas-9-smp'),
$('.testimoni-card.smp').css('display', 'block'),
$('.btn-smp-sma-grade.smp').css('display', 'block'),
setVideoPreviewData('smp-9'),
updateProductHeroText({
title: 'Video belajar + Konsultasi tutor',
description: 'Video adaptif satu-satunya di Indonesia dilengkapi konsultasi tutor 24 jam untuk bahas soal sampai tuntas',
})),
window.location.pathname.includes('sma') &&
(changeGrade('sma', 'kelas-11-ipa'),
$('.testimoni-card.sma').css('display', 'block'),
$('.btn-smp-sma-grade.sma').css('display', 'block'),
setVideoPreviewData('sma-11-ipa'),
updateProductHeroText({ title: 'Video belajar + UTBK skolastik', description: 'Video adaptif satu-satunya di Indonesia yang bisa menyesuaikan kecepatan belajar' })),
window.location.pathname.includes('utbk') &&
(changeGrade('utbk', 'kelas-utbk'),
$('.testimoni-card.utbk').css('display', 'block'),
$('.btn-smp-sma-grade.utbk').css('display', 'block'),
setVideoPreviewData('utbk'),
updateProductHeroText({ title: 'Video belajar + UTBK skolastik', description: 'Video adaptif satu-satunya di Indonesia yang dilengkapi persiapan hadapi UTBK skolastik terbaru' }));
let jenjangModal = document.getElementById('jenjangModal'),
jenjangClosing = (document.getElementById('jenjangBtn'), document.getElementsByClassName('close-jenjang'));
function changeQueryParamOnGradeSelected(grade) {
let newpath = window.location.origin + window.location.pathname + '?kelas=' + grade;
window.history.replaceState({ path: newpath }, '', newpath);
}
function setVideoPreviewData(kelas) {
const newVideoPreviewData = videoPreviewData.find(d => d.gradeSerial === kelas);
(defaultVideoPreviewData = newVideoPreviewData),
$('#selectedGrade').text(defaultVideoPreviewData.gradeName),
$('#selectedGradeLesson').text(defaultVideoPreviewData.gradeName),
$('#topic-grade-name').text(defaultVideoPreviewData.gradeName),
(function () {
defaultVideoPreviewData.lessons[0].lessonSerial;
const selectedLessonText = defaultVideoPreviewData.lessons[0].name,
selectedLessonUrl = defaultVideoPreviewData.lessons[0].youtubeUrl;
$('#selectedLesson').text(selectedLessonText),
$('#selectedLessonNonSD').text(selectedLessonText),
$('#topic-lesson-name').text(selectedLessonText),
$('.video-box iframe').attr('src', selectedLessonUrl),
(document.getElementById('videoPreview').innerHTML =
`<iframe \n frameborder="0" allowfullscreen\n allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"\n src="${selectedLessonUrl}">\n </iframe>`),
createTopicsElement(defaultVideoPreviewData.lessons[0].topics),
(function (lessons) {
const chooseSubjectWrapperEl = document.getElementById('chooseSubjectWrapper');
for (let i = 0; i < lessons.length; i++)
0 === i
? (chooseSubjectWrapperEl.innerHTML = `<button type="button" class="btn-lesson" value="${lessons[i].lessonSerial}" data-video-url="${lessons[i].youtubeUrl}">${lessons[i].name}</button>`)
: (chooseSubjectWrapperEl.innerHTML += `<button type="button" class="btn-lesson" value="${lessons[i].lessonSerial}" data-video-url="${lessons[i].youtubeUrl}">${lessons[i].name}</button>`);
$('.btn-lesson').click(function () {
$('.btn-lesson.active-btn-level').removeClass('active-btn-level'), $(this).addClass('active-btn-level');
const selectedLessonVal = $(this).val(),
selectedLessonText = $(this).text(),
selectedVideoUrl = $(this).data('video-url'),
currentLesson = lessons.find(l => l.lessonSerial == selectedLessonVal);
$('#selectedLesson').text(selectedLessonText),
$('#topic-lesson-name').text(selectedLessonText),
$('#selectedLessonNonSD').text(selectedLessonText),
(document.getElementById('videoPreview').innerHTML =
`<iframe \n frameborder="0" allowfullscreen\n allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"\n src="${selectedVideoUrl}">\n </iframe>`),
createTopicsElement(currentLesson.topics),
$('#chooseSubjectModal').css('display', 'none');
});
})(defaultVideoPreviewData.lessons);
})();
}
function createSubtopicsElement(subtopics, idx) {
const subtopicList = document.getElementById('accordion-panel-topic-' + idx);
for (let i = 0; i < subtopics.length; i++) 0 === i ? (subtopicList.innerHTML = `<li>${subtopics[i]}</li>`) : (subtopicList.innerHTML += `<li>${subtopics[i]}</li>`);
}
function createTopicsElement(topics) {
const topicList = document.getElementById('topic-list');
for (let i = 0; i < topics.length; i++)
0 === i
? (topicList.innerHTML = `<li class="accordion-topic" id="accordion-topic-${i}" ><p class="font-inter font-black-secondary ls-5 font-topic-name">${topics[i].name}</p><ul class="accordion-panel-topic" id="accordion-panel-topic-${i}"></ul></li>`)
: (topicList.innerHTML += `<li class="accordion-topic" id="accordion-topic-${i}"><p class="font-inter font-black-secondary ls-5 font-topic-name">${topics[i].name}</p><ul class="accordion-panel-topic" id="accordion-panel-topic-${i}></ul></li>`),
topics[i].subtopics.length > 0 && createSubtopicsElement(topics[i].subtopics, i),
document.getElementById('accordion-topic-' + i).addEventListener('click', function () {
this.classList.toggle('active');
});
}
function createRupiahStr(amount) {
return amount.toLocaleString('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 });
}
function createSubtotalElement(packageItem, gradeId) {
const subtotalWrapper = document.getElementById('packageTotalWrapper'),
pricePerDayEl = packageItem && packageItem.pricePerDay > 0 ? `<p class="font-inter font-blue font-hari">Hanya ${createRupiahStr(packageItem.pricePerDay)}/hari</p>` : '',
voucherPercentage = packageItem && packageItem.voucherValidation.voucherPercentage >= 0 ? packageItem.voucherValidation.voucherPercentage : 0,
originalPrice = packageItem ? createRupiahStr(packageItem.originalPrice) : 0,
finalPrice = packageItem ? createRupiahStr(packageItem.finalPrice) : 0,
isDafalulu = packageItem && packageItem.tags.find(t => t.name.includes('dafalulu')) ? 1 : 0;
(subtotalWrapper.innerHTML = `<div class="package-total-top">\n <div class="package-total-top-left">\n <p class="font-inter font-header-two" style="margin-bottom: 8px">\n Total\n </p>\n </div>\n <div class="package-total-top-right">\n <div style="display: flex; margin-bottom: 4px; align-items:center; column-gap:4px;">\n <p class="font-inter font-red font-diskon">${voucherPercentage}%</p>\n <p class="font-inter font-gray font-coret" >${originalPrice}</p>\n <p class="font-inter font-red font-harga">${finalPrice}</p>\n </div> \n ${pricePerDayEl}\n </div>\n \n </div>\n <div class="package-total-bottom"><button type="button" class="btn-package-save btn-orange">Simpan</button></div>`),
$('.btn-package-save').click(function () {
createContent(packageItem, gradeId, isDafalulu),
$('#packageListModal').css('display', 'none'),
(function () {
generateToast({ message: 'Info paket diperbarui sesuai pilihanmu!', status: 'success' });
document.getElementById('detail-package').scrollIntoView({ top: 0 });
})();
});
}
function pad(num) {
return num < 10 && num >= 0 ? '0' + num : num >= 0 ? num : '00';
}
$('.btn-level').click(function () {
$(this).addClass('active-btn-level');
let selectedJenjang = $(this).val();
changeGrade(selectedJenjang), (jenjangModal.style.display = 'none'), 'sd' === selectedJenjang && $('#gradeSDModal').css('display', 'flex');
let newpath = window.location.href + '?jenjang=' + selectedJenjang;
window.history.replaceState({ path: newpath }, '', newpath);
}),
$('.btn-navbar').click(function () {
$('.btn-navbar.active').removeClass('active'), $(this).addClass('active');
}),
$('.btn-sd-grade').click(function () {
$('.btn-sd-grade.active-btn-level').removeClass('active-btn-level'), $(this).addClass('active-btn-level');
const selectedGradeVal = $(this).val(),
selectedGradeName = $(this).attr('name'),
selectedGradeText = $(this).text();
$('#selectedGrade').text(selectedGradeText),
changeGrade(selectedGradeVal, selectedGradeName),
$('#gradeSDModal').css('display', 'none'),
$('#change-lesson-sd').css('display', 'flex'),
$('#topic-grade-name').text(selectedGradeText),
(function (gradeText) {
switch (gradeText) {
case 'Kelas 1 SD':
setVideoPreviewData('sd-1'), changeQueryParamOnGradeSelected('sd-1');
break;
case 'Kelas 2 SD':
setVideoPreviewData('sd-2'), changeQueryParamOnGradeSelected('sd-2');
break;
case 'Kelas 3 SD':
setVideoPreviewData('sd-3'), changeQueryParamOnGradeSelected('sd-3');
break;
case 'Kelas 4 SD':
setVideoPreviewData('sd-4'), changeQueryParamOnGradeSelected('sd-4');
break;
case 'Kelas 5 SD':
setVideoPreviewData('sd-5'), changeQueryParamOnGradeSelected('sd-5');
break;
case 'Kelas 6 SD':
setVideoPreviewData('sd-6'), changeQueryParamOnGradeSelected('sd-6');
}
})(selectedGradeText);
}),
$('.btn-smp-sma-grade').click(function () {
$('.btn-smp-sma-grade.active-btn-level').removeClass('active-btn-level'), $(this).addClass('active-btn-level');
const selectedGradeVal = $(this).val(),
selectedGradeText = $(this).text();
$('#selectedGradeLesson').text(selectedGradeText),
$('#topic-grade-name').text(selectedGradeText),
$('#gradeNonSDModal').css('display', 'none'),
setVideoPreviewData(selectedGradeVal),
changeQueryParamOnGradeSelected(selectedGradeVal);
}),
(jenjangClosing.onclick = function () {
jenjangModal.style.display = 'none';
}),
$('#packageListModalClose').click(function () {
$('#packageListModal').css('display', 'none');
}),
$('#chooseSubjectCloseModal').click(function () {
$('#chooseSubjectModal').css('display', 'none');
}),
$('#change-lesson-sd').click(function () {
$('#chooseSubjectModal').css('display', 'block');
}),
$('.navbar-select-item.lesson').click(function () {
$('#chooseSubjectModal').css('display', 'block');
}),
$('.navbar-select-item.grade').click(function () {
$('#gradeNonSDModal').css('display', 'block');
}),
$('#gradeNonSDCloseModal').click(function () {
$('#gradeNonSDModal').css('display', 'none');
});
const timer = endTime => {
let diff = endTime - new Date().getTime(),
hours = Math.floor((diff % 864e5) / 36e5),
minutes = Math.floor((diff % 36e5) / 6e4),
seconds = Math.floor((diff % 6e4) / 1e3);
(document.querySelector('#hour').textContent = pad(hours)), (document.querySelector('#minute').textContent = pad(minutes)), (document.querySelector('#second').textContent = pad(seconds));
};
let counter;
function createPackagePriceWrapperElement(packageItem, gradeId, isDafalulu) {
const packageName = packageItem.name,
hasFlashsale = '' !== packageItem.flashsale.flashsaleSerial,
originalPrice = createRupiahStr(packageItem.originalPrice),
finalPrice = createRupiahStr(packageItem.finalPrice),
discountPercentage = packageItem.voucherValidation.voucherPercentage,
subscriptionEndDate = packageItem.subscriptionEndDate,
subEndDateStr = new Date(packageItem.subscriptionEndDate).toLocaleString('id-ID', { year: 'numeric', month: 'long', day: 'numeric' }),
packageSerial = packageItem.serial,
voucherSerial = packageItem.voucherValidation.voucherSerial,
subEndDate = new Date(packageItem.subscriptionEndDate),
subStartDate = new Date(packageItem.subscriptionStartDate),
pricePerDay = (subEndDate.getTime(), subStartDate.getTime(), createRupiahStr(packageItem.pricePerDay)),
flashsaleEl = hasFlashsale
? '<div class="flashsale">\n <img\n src="https://roboguru-forum-cdn.ruangguru.com/image/edce724c-3b7a-49aa-9a34-ec89513a8a38.png"\n width="12"\n height="12"\n loading="lazy"\n alt=""\n />\n <p class="font-inter font-white font-flashsale">\n Flash Sale \n <span class="hour" id="hour">00</span>:\n <span class="minute" id="minute">00</span>:\n <span class="second" id="second">00</span>\n </p>\n </div>'
: '',
pricePerDayEl = packageItem.pricePerDay > 0 ? `<p class="font-inter font-blue font-hari">Hanya ${pricePerDay}/hari</p>` : '',
subscriptionEndDateEl =
'' !== subscriptionEndDate ? `<p class="font-inter" style="color: #5E677B; font-size: 12px; margin-bottom: 6px !important;">Paket aktif hingga ${subEndDateStr}</p>` : '';
hasFlashsale
? (counter = setInterval(function () {
timer(parseInt(packageItem.flashsale.flashsaleEndTime));
}, 1e3))
: clearInterval(counter);
(document.getElementById('package-price').innerHTML =
`\n \n <div class="detail-paket">\n <p class="font-inter font-black font-nama-paket">${packageName}</p>\n ${subscriptionEndDateEl}\n <div class="detail-paket_detail"> \n <div style="padding-top: 10px;" id="flashsale">\n ${flashsaleEl}\n <div class="detail-paket_harga mobile">\n <p class="font-inter font-red font-diskon">${discountPercentage}%</p>\n <p class="font-inter font-gray font-coret">${originalPrice}</p>\n <p class="font-inter font-red font-harga">${finalPrice}</p>\n </div>\n <div class="detail-paket_harga desktop">\n <div>\n <p class="font-inter font-red font-diskon">${discountPercentage}%</p>\n <p class="font-inter font-gray font-coret">${originalPrice}</p>\n </div> \n <p class="font-inter font-red font-harga">${finalPrice}</p>\n </div>\n ${pricePerDayEl}\n </div>\n <button class="font-inter" id="btn-change-package">Ganti<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/ic-ChevronRight%20(1).svg" width="16" height="16" loading="lazy" alt=""></button>\n </div> \n </div> \n <div class="detail-kelas"> \n <button class="font-inter font-white btn-orange" id="paymentMethodButton">Pilih Paket</button>\n <button class="font-inter font-green btn-tanya zendesk-button" target-value="close">Tanya <img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Ruangguru%20Revamp%202022/Detail%20Page/Header/ic-chat.svg" width="24" height="24" loading="lazy" alt=""></button>\n </div>\n `),
$('#btn-change-package').click(function () {
$('#packageListModal').css('display', 'flex');
}),
$('#paymentMethodButton').click(function () {
if (isDafalulu) {
window.open(`https://bayar.ruangguru.com/draft-invoice?tag=dafalulu&grade=${gradeId}&package_serial=${packageSerial}&voucher_serial=${voucherSerial}`);
} else {
window.open(`https://bayar.ruangguru.com/draft-invoice?tag=rubel&grade=${gradeId}&package_serial=${packageSerial}&voucher_serial=${voucherSerial}`);
}
});
const zendeskButton = document.querySelector('.zendesk-button'),
poller = (comparison, callback, timerStep = 250, maxTime = 5e3) => {
let currTime = 0;
const checkCondition = () => {
!0 === comparison() ? callback() : currTime <= maxTime && ((currTime += timerStep), setTimeout(checkCondition, timerStep));
};
checkCondition();
},
loadZendeskChat = callback => {
(() => {
if (null !== document.getElementById('ze-snippet')) console.log();
else {
const zenDeskScript = document.createElement('script');
(zenDeskScript.id = 'ze-snippet'),
(zenDeskScript.src = 'https://static.zdassets.com/ekr/snippet.js?key=a2ac30ed-dd6d-47f6-99ba-0d5aeae351a0'),
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0] || document.getElementsByTagName('script')[0].parentNode).insertBefore(zenDeskScript, null);
}
})(),
callback && callback();
},
openZendeskChat = () => {
poller(
() => 'undefined' != typeof zE,
() => {
zE('messenger', 'open'),
poller(
() => {
const launcher = document.querySelector('#launcher'),
webWidget = document.querySelector('#webWidget');
return null !== launcher && null !== webWidget && '1' === webWidget.style.opacity;
},
() => {
(zendeskButton.style.opacity = '0'), localStorage.setItem('zd_hasOpened', 'true');
}
);
}
);
};
localStorage.getItem('zd_hasOpened') ? loadZendeskChat() : (zendeskButton.style.opacity = '1'),
zendeskButton.addEventListener('click', () => {
const btnValue = zendeskButton.getAttribute('target-value');
window.matchMedia('(max-width: 767px)').matches
? loadZendeskChat(openZendeskChat)
: (loadZendeskChat(openZendeskChat),
'close' == btnValue
? (loadZendeskChat(openZendeskChat), zendeskButton.setAttribute('target-value', 'open'))
: (zE('messenger', 'close'), zendeskButton.setAttribute('target-value', 'close')));
});
}
function createDescriptionPackageByName(packageName) {
const name = packageName.toLowerCase(),
utbk = name.includes('utbk'),
roboguru = name.includes('roboguru'),
animasi = name.includes('animasi');
return utbk && !roboguru
? 'Akses semua fitur ruangbelajar + persiapan masuk kampus, lengkap dengan Tes Skolastik '
: !utbk && roboguru
? 'Akses semua fitur ruangbelajar + konsultasikan PR sulit ke Tutor sampai tuntas'
: utbk && roboguru
? 'Akses semua fitur ruangbelajar + persiapan masuk kampus, lengkap dengan Tes Skolastik + konsultasikan PR sulit ke Tutor sampai tuntas'
: animasi
? 'Akses semua fitur ruangbelajar + video animasi'
: 'Video pembelajaran interaktif, latihan soal, rangkuman infografis, dan fitur seru lainnya';
}
function createContent(packageItem, gradeId, isDafalulu) {
(selectedPackageSerial = packageItem.serial),
(function (packageInformation) {
const uspList = document.getElementById('usp-list');
for (let i = 0; i < packageInformation.list.values.length; i++)
0 === i ? (uspList.innerHTML = `<li>${packageInformation.list.values[i]}</li>`) : (uspList.innerHTML += `<li>${packageInformation.list.values[i]}</li>`);
})(JSON.parse(packageItem.packageInformation)),
createPackagePriceWrapperElement(packageItem, gradeId, isDafalulu);
}
$('.btn-filter').click(function () {
$('.btn-filter.active-btn-level').removeClass('active-btn-level'), $(this).addClass('active-btn-level');
const currentClassElement = '.inputGroup.' + $(this).val();
$('.inputGroup').css('display', 'none'), $(currentClassElement).css('display', 'block'), ($(document.getElementById('packageTotalWrapper')).innerHTML = '');
}),
$(document).ready(function () {
const referrer = '' === document.referrer ? 'https://www.ruangguru.com' : document.referrer;
document.getElementById('backToReferrer').href = referrer;
});
</script>
<!-- Start of HubSpot Analytics Code -->
<script type="text/javascript">
var _hsq = _hsq || [];
_hsq.push(['setContentType', 'landing-page']);
_hsq.push(['setCanonicalUrl', 'https:\/\/www.ruangguru.com\/ruangbelajar-smp']);
_hsq.push(['setPageId', '88650962846']);
_hsq.push([
'setContentMetadata',
{
contentPageId: 88650962846,
legacyPageId: '88650962846',
contentFolderId: null,
contentGroupId: null,
abTestId: null,
languageVariantId: 88650962846,
languageCode: 'id',
},
]);
</script>
<script type="text/javascript">
var hsVars = {
render_id: '4bf52e6b-a0bc-4629-8145-ee3c45aa1141',
ticks: 1684632188770,
page_id: 88650962846,
content_group_id: 0,
portal_id: 2828691,
app_hs_base_url: 'https://app.hubspot.com',
cp_hs_base_url: 'https://cp.hubspot.com',
language: 'id',
analytics_page_type: 'landing-page',
analytics_page_id: '88650962846',
category_id: 1,
folder_id: 0,
is_hubspot_user: false,
};
</script>
<script src="https://unpkg.com/@dotlottie/player-component@latest/dist/dotlottie-player.mjs" type="module"></script>
<!-- Load CSS for all versions -->
<script>
// CSS loading function available for all versions
function loadFloatingCSS() {
// Check if CSS is already loaded
if (document.getElementById('fb-component-css')) {
return;
}
// Create and append CSS style block to head
const style = document.createElement('style');
style.id = 'fb-component-css';
style.textContent = `
.bantuan-container {
position: relative;
}
.bantuan-element {
position: fixed;
z-index: 999;
display: flex;
align-items: flex-end;
justify-content: flex-end;
cursor: pointer;
transition: all 0.6s ease;
}
.bantuan-top {
bottom: 11rem;
right: 2rem;
}
.bantuan-bottom {
bottom: 2rem;
right: 2rem;
}
.bantuan-top-2 {
bottom: 15rem;
right: 2rem;
}
.bantuan-top-3 {
bottom: 19rem;
right: 2rem;
}
.bantuan-bottom-2 {
bottom: 5rem;
right: 2rem;
}
.bantuan-bottom-3 {
bottom: 8rem;
right: 2rem;
}
@media (min-width: 768px) {
.bantuan-element img {
width: auto;
transition: all 0.4s ease;
}
.bantuan-top img {
width: 140px;
}
.bantuan-bottom img {
width: 140px;
}
.bantuan-top-2 img,
.bantuan-top-3 img {
width: 140px;
}
.bantuan-bottom-2 img,
.bantuan-bottom-3 img {
width: 140px;
}
.bantuan-element.clicked {
bottom: 9rem;
right: 2.5rem;
}
.bantuan-element.clicked img {
width: auto;
height: 64px;
}
}
@media (max-width: 767px) {
.bantuan-top {
bottom: 8rem;
right: 1rem;
align-items: center;
}
.bantuan-bottom {
bottom: 2rem;
right: 1.25rem;
align-items: center;
}
.bantuan-top-2 {
bottom: 12rem;
right: 1rem;
align-items: center;
}
.bantuan-top-3 {
bottom: 16rem;
right: 1rem;
align-items: center;
}
.bantuan-bottom-2 {
bottom: 5rem;
right: 1.25rem;
align-items: center;
}
.bantuan-bottom-3 {
bottom: 8rem;
right: 1.25rem;
align-items: center;
}
.bantuan-element img {
width: auto;
}
.bantuan-top img,
.bantuan-top-2 img,
.bantuan-top-3 img {
width: 96px;
}
.bantuan-bottom img,
.bantuan-bottom-2 img,
.bantuan-bottom-3 img {
width: 96px;
}
}
.bantuan-element:hover {
transform: scale(1.05);
}
.bantuan-element img {
max-width: 100%;
height: auto;
}
`;
document.head.appendChild(style);
}
// Load CSS immediately
loadFloatingCSS();
</script>
<div id="bantuan-divs-container" style="position: relative" data-product="ruangguru" data-table=""></div>
<script>
class FloatingDivsComponent {
constructor(product = 'ruangguru', table = 'rg_promo_banner') {
this.container = document.getElementById('bantuan-divs-container');
this.floatingElements = [];
this.product = product;
this.table = table;
// Configuration
this.config = {
baseApiUrl: 'https://gw.ruangguru.com/api/v3/rdb/p_ddgy8hjx5dxsqx/rg_banner/views/',
apiKey: 'vLyK3dJrDBRmOwueX2OJXibMkgsUbBk0WS4ua2p1',
maxElements: 2,
zIndexBase: 100,
};
// Build dynamic API URL based on table parameter
this.config.apiUrl = this.buildApiUrl();
this.init();
}
buildApiUrl() {
const baseUrl = this.config.baseApiUrl;
const tableName = this.table || 'rg_promo_banner';
const queryParams =
'offset=0&limit=99999&sort=rankPosition&where=(type,eq,floating)~and(showIn,anyof,landingPage)~and(hide,is,false)~and(product,eq,' +
this.product +
')&nested%5Bcta%5D%5Bfields%5D=Id,name,ctaId,imageUrl,ctaLink,targetUrl';
return `${baseUrl}${tableName}?${queryParams}`;
}
async init() {
try {
await this.fetchFloatingElements();
this.renderFloatingElements();
} catch (error) {
console.error('Failed to initialize floating divs component:', error);
}
}
async fetchFloatingElements() {
try {
const options = {
method: 'GET',
headers: {
'xc-token': this.config.apiKey || 'vLyK3dJrDBRmOwueX2OJXibMkgsUbBk0WS4ua2p1',
},
};
const urlNoco = this.config.apiUrl;
const response = await fetch(urlNoco, options);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
this.floatingElements = this.processApiResponse(data);
} catch (error) {
console.error('Error fetching floating elements:', error);
throw error;
}
}
processApiResponse(data) {
if (!data || !data.list || !Array.isArray(data.list)) {
return [];
}
// Ensure we only get maximum 2 elements
const limitedElements = data.list.slice(0, this.config.maxElements);
return limitedElements;
}
renderFloatingElements() {
if (!this.container || this.floatingElements.length === 0) {
return;
}
// Additional safeguard: ensure we never render more than maxElements
const elementsToRender = this.floatingElements.slice(0, this.config.maxElements);
// Clean up existing elements and their event listeners
this.cleanupExistingElements();
// Clear existing content
this.container.innerHTML = '';
elementsToRender.forEach((element, index) => {
const floatingDiv = this.createFloatingDiv(element, index);
this.container.appendChild(floatingDiv);
});
}
cleanupExistingElements() {
// Clear existing elements (no need for event listener cleanup with CSS approach)
const existingElements = this.container.querySelectorAll('[data-floating-element]');
existingElements.forEach(element => {
element.remove();
});
}
createFloatingDiv(element, index) {
const div = document.createElement('div');
const cta = element.cta[0]; // Use the first CTA
// Add data attribute for cleanup tracking
div.setAttribute('data-floating-element', 'true');
// Apply CSS classes based on rankPosition
const positionClass = this.getPositionClass(element.rankPosition, index);
div.className = `bantuan-element ${positionClass}`;
div.style.zIndex = this.config.zIndexBase + index;
// Create the link and image
const link = document.createElement('a');
link.href = 'https://cta.ruangguru.com/' + cta.ctaId || '#';
link.target = '_blank';
// Add tracking attributes
link.setAttribute('data-tracking-event-type', 'landing_page__core__item_click');
link.setAttribute(
'data-tracking-context',
JSON.stringify({
product_name: this.product,
cta_action: 'redirection',
cta_action_detail: link.href,
item_type: 'floating',
item_name: element.name || 'Floating element',
item_category: 'payment',
item_position: index,
item_serial: null,
section_type: 'floating_item',
section_position: 'body',
section_name: 'floating_item',
})
);
const img = document.createElement('img');
img.src = element.imageUrl + '?h=200&convert=webp';
img.alt = element.name || 'Floating element';
img.loading = 'lazy';
// Add click tracking
link.addEventListener('click', () => {
this.trackClick(element, cta);
});
link.appendChild(img);
div.appendChild(link);
return div;
}
getPositionClass(rankPosition, index) {
// Define positioning classes based on rankPosition
if (rankPosition === 1) {
return 'bantuan-top'; // Top position
} else if (rankPosition === 2) {
return 'bantuan-bottom'; // Bottom position
} else {
// For additional elements, distribute them evenly
return `bantuan-${index % 2 === 0 ? 'top' : 'bottom'}-${Math.floor(index / 2) + 1}`;
}
}
trackClick(element, cta) {
// Implement click tracking logic here
console.log('Floating element clicked:', {
elementId: element.Id,
elementName: cta.name,
ctaId: cta.ctaId,
targetUrl: cta.targetUrl,
});
}
// Public method to manually refresh
async refresh() {
try {
await this.fetchFloatingElements();
this.renderFloatingElements();
} catch (error) {
console.error('Failed to refresh floating elements:', error);
throw error;
}
}
// Public method to get current floating elements
getFloatingElements() {
return [...this.floatingElements];
}
}
// Initialize the component when DOM is ready
document.addEventListener('DOMContentLoaded', () => {
// Get product and table parameters from data attributes
const container = document.getElementById('bantuan-divs-container');
const product = container.getAttribute('data-product') || 'ruangguru';
const table = container.getAttribute('data-table') || 'rg_promo_banner';
new FloatingDivsComponent(product, table);
});
// Export for use in other modules if needed
if (typeof module !== 'undefined' && module.exports) {
module.exports = FloatingDivsComponent;
}
</script>
<!-- Tracker -->
<script src="https://unpkg.com/analytics@0.8.1/dist/analytics.min.js"></script>
<script type="text/javascript" src="https://unpkg.com/analytics-plugin-trackable/dist/analytics-plugin-trackable.min.js"></script>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-N8DPXH6" height="0" width="0" style="display: none; visibility: hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<script type="text/javascript" defer>
/* Initialize analytics */
var Analytics = _analytics.init({
app: 'brainAcademyLandingPage',
debug: false,
plugins: [analyticsTrackable()],
});
Analytics.ready(function () {
Analytics.page();
});
</script>
<style>
@media (min-width: 1025px) {
.breadcrumb-item > a,
.breadcrumb-item.active {
font-size: 16px;
line-height: 24px;
}
}
@media (max-width: 1024px) {
.breadcrumb-item > a,
.breadcrumb-item.active {
font-size: 12px;
line-height: 20px;
}
}
.breadcrumb {
padding: 0 1rem;
margin: 0;
}
.breadcrumb-item > a,
.breadcrumb-item.active {
font-family: 'Inter';
color: #ffffff !important;
}
.breadcrumb-item > a {
font-weight: 400;
}
.breadcrumb-item.active {
font-weight: 600;
}
.breadcrumb-item + .breadcrumb-item::before {
color: #ffffff !important;
}
@media (max-width: 768px) {
.modal-jenjang {
z-index: 1000;
}
.modal-content-jenjang {
overflow-x: hidden;
}
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/template_assets/10729457848/1615619794843/Templates/Custom/Page/Fadhli/All_Template_for_Marketing_Engineer/Source_Modal_Video/modal-video.js"></script>
<script src="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/template_assets/10729457994/1615619961343/Templates/Custom/Page/Fadhli/All_Template_for_Marketing_Engineer/Source_Modal_Video/jquery-modal-video-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.min.js"></script>
<script>
$('.js-video-button').modalVideo({
youtube: {
controls: 0,
nocookie: true,
},
});
</script>
<!-- Generated by the HubSpot Template Builder - template version 1.03 -->
</body>
</html>