fix(theme-check): perbaiki kapitalisasi WordPress, dimensi screenshot 1200x900, dan kompresi aset gambar

This commit is contained in:
Mas Budi Kusuma
2026-09-17 21:05:46 +07:00
parent 5213e39b24
commit b3cc2b57ca
17 changed files with 531 additions and 925 deletions
+69
View File
@@ -0,0 +1,69 @@
document.addEventListener("DOMContentLoaded", function() {
// Menu Toggle
const toggleBtn = document.getElementById("mobile-menu-toggle");
const navMenu = document.getElementById("site-navigation");
if (toggleBtn && navMenu) {
toggleBtn.addEventListener("click", function() {
toggleBtn.classList.toggle("active");
navMenu.classList.toggle("active");
});
}
// Back to Top
const bttBtn = document.getElementById("back-to-top");
if (bttBtn) {
window.addEventListener("scroll", function() {
if (window.scrollY > 350) { bttBtn.classList.add("show"); } else { bttBtn.classList.remove("show"); }
});
bttBtn.addEventListener("click", function() {
window.scrollTo({ top: 0, behavior: "smooth" });
});
}
// Accessibility Panel
const a11yTrigger = document.getElementById("a11y-trigger");
const a11yPanel = document.getElementById("a11y-panel");
const a11yClose = document.getElementById("a11y-close");
if (a11yTrigger && a11yPanel) {
a11yTrigger.addEventListener("click", function() { a11yPanel.classList.toggle("active"); });
if (a11yClose) { a11yClose.addEventListener("click", function() { a11yPanel.classList.remove("active"); }); }
const fontLevels = ['', 'a11y-font-lg', 'a11y-font-xl'];
let currentFontIdx = parseInt(localStorage.getItem('edukarsa_a11y_font') || '0', 10);
function applyA11y() {
fontLevels.forEach(function(c) { if (c) document.body.classList.remove(c); });
if (fontLevels[currentFontIdx]) { document.body.classList.add(fontLevels[currentFontIdx]); }
if (localStorage.getItem('edukarsa_a11y_contrast') === '1') { document.body.classList.add('a11y-high-contrast'); } else { document.body.classList.remove('a11y-high-contrast'); }
if (localStorage.getItem('edukarsa_a11y_grayscale') === '1') { document.body.classList.add('a11y-grayscale'); } else { document.body.classList.remove('a11y-grayscale'); }
if (localStorage.getItem('edukarsa_a11y_links') === '1') { document.body.classList.add('a11y-underline-links'); } else { document.body.classList.remove('a11y-underline-links'); }
}
applyA11y();
document.getElementById("a11y-font-inc")?.addEventListener("click", function() { if (currentFontIdx < fontLevels.length - 1) currentFontIdx++; localStorage.setItem('edukarsa_a11y_font', currentFontIdx); applyA11y(); });
document.getElementById("a11y-font-dec")?.addEventListener("click", function() { if (currentFontIdx > 0) currentFontIdx--; localStorage.setItem('edukarsa_a11y_font', currentFontIdx); applyA11y(); });
document.getElementById("a11y-font-reset")?.addEventListener("click", function() { currentFontIdx = 0; localStorage.setItem('edukarsa_a11y_font', currentFontIdx); applyA11y(); });
document.getElementById("a11y-contrast")?.addEventListener("click", function() { const active = localStorage.getItem('edukarsa_a11y_contrast') === '1'; localStorage.setItem('edukarsa_a11y_contrast', active ? '0' : '1'); applyA11y(); });
document.getElementById("a11y-grayscale")?.addEventListener("click", function() { const active = localStorage.getItem('edukarsa_a11y_grayscale') === '1'; localStorage.setItem('edukarsa_a11y_grayscale', active ? '0' : '1'); applyA11y(); });
document.getElementById("a11y-links")?.addEventListener("click", function() { const active = localStorage.getItem('edukarsa_a11y_links') === '1'; localStorage.setItem('edukarsa_a11y_links', active ? '0' : '1'); applyA11y(); });
document.getElementById("a11y-reset-all")?.addEventListener("click", function() {
currentFontIdx = 0;
localStorage.removeItem('edukarsa_a11y_font');
localStorage.removeItem('edukarsa_a11y_contrast');
localStorage.removeItem('edukarsa_a11y_grayscale');
localStorage.removeItem('edukarsa_a11y_links');
applyA11y();
});
}
// Homepage Hero Slider Scroll
const slider = document.getElementById('hero-slider-wrapper');
if (slider && slider.children.length > 1) {
setInterval(function() {
if (slider.scrollLeft + slider.clientWidth >= slider.scrollWidth - 10) {
slider.scrollTo({ left: 0, behavior: 'smooth' });
} else {
slider.scrollBy({ left: slider.clientWidth, behavior: 'smooth' });
}
}, 4000);
}
});
+41
View File
@@ -0,0 +1,41 @@
<?php
defined( 'ABSPATH' ) || exit;
if ( post_password_required() ) {
return;
}
?>
<div id="comments" class="comments-area card-style" style="padding: 30px; margin-top: 30px;">
<?php if ( have_comments() ) : ?>
<h3 class="comments-title" style="margin-bottom: 20px;">
<?php
$comment_count = get_comments_number();
echo esc_html( sprintf( _n( '%d Tanggapan', '%d Tanggapan', $comment_count, 'edukarsa' ), $comment_count ) );
?>
</h3>
<ol class="comment-list">
<?php
wp_list_comments( array(
'avatar_size' => 48,
'style' => 'ol',
'short_ping' => true,
) );
?>
</ol>
<?php the_comments_pagination( array(
'prev_text' => '&laquo; ' . esc_html__( 'Komentar Lama', 'edukarsa' ),
'next_text' => esc_html__( 'Komentar Baru', 'edukarsa' ) . ' &raquo;',
) ); ?>
<?php endif; ?>
<?php
if ( ! comments_open() && get_comments_number() && post_type_supports( get_post_type(), 'comments' ) ) :
?>
<p class="no-comments"><?php esc_html_e( 'Kolom komentar dinonaktifkan.', 'edukarsa' ); ?></p>
<?php endif; ?>
<?php comment_form(); ?>
</div>
+31 -240
View File
@@ -1,8 +1,6 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
/**
* Template Footer EduKarsa Modern 4-Kolom
*/
defined( 'ABSPATH' ) || exit;
$footer_logo = get_option( 'edukarsa_footer_logo' );
if ( empty( $footer_logo ) ) {
$footer_logo = get_option( 'edukarsa_header_logo' );
@@ -12,16 +10,12 @@ $wa_clean = preg_replace( '/[^0-9]/', '', $raw_telp );
if ( substr( $wa_clean, 0, 1 ) === '0' ) {
$wa_clean = '62' . substr( $wa_clean, 1 );
}
$wa_btn_label = get_option( 'edukarsa_wa_btn_text', 'Tanya PMB' );
$wa_def_msg = get_option( 'edukarsa_wa_default_msg', 'Halo Admin EduKarsa, saya ingin bertanya informasi lebih lanjut.' );
?>
<!-- MAIN FOOTER -->
<footer class="site-footer">
<div class="container footer-grid-wrapper">
<!-- Kolom 1: Brand & Profil -->
<div class="footer-col footer-col-brand">
<div class="footer-brand-logo">
<?php if ( ! empty( $footer_logo ) ) : ?>
@@ -33,36 +27,35 @@ $wa_def_msg = get_option( 'edukarsa_wa_default_msg', 'Halo Admin EduKarsa, say
<p class="footer-brand-desc">
<?php echo nl2br( esc_html( get_option( 'edukarsa_footer_desc', 'Institusi pendidikan terakreditasi unggul yang berdedikasi mencetak generasi berkarakter cerdas, kompetitif, dan berintegritas.' ) ) ); ?>
</p>
<?php
$jam = get_option( 'edukarsa_footer_jam' );
if ( ! empty( $jam ) ) :
<?php
$jam = get_option( 'edukarsa_footer_jam' );
if ( ! empty( $jam ) ) :
?>
<div class="footer-hours-box">
<span class="hours-icon">🕒</span>
<span class="hours-icon">&#128344;</span>
<div>
<div style="font-size: 11px; text-transform: uppercase; letter-spacing: 0.8px; opacity: 0.8;">Jam Layanan</div>
<div style="font-size: 11px; text-transform: uppercase; letter-spacing: 0.8px; opacity: 0.8;"><?php esc_html_e( 'Jam Layanan', 'edukarsa' ); ?></div>
<div style="font-weight: 600; font-size: 13px; color: #fff; line-height: 1.6;"><?php echo nl2br( esc_html( $jam ) ); ?></div>
</div>
</div>
<?php endif; ?>
</div>
<!-- Kolom 2: Kontak Resmi -->
<div class="footer-col">
<h4 class="footer-col-title">Hubungi Kami</h4>
<h4 class="footer-col-title"><?php esc_html_e( 'Hubungi Kami', 'edukarsa' ); ?></h4>
<ul class="footer-contact-list">
<li>
<span class="f-icon">📍</span>
<span class="f-icon">&#128205;</span>
<span><?php echo nl2br( esc_html( get_option( 'edukarsa_footer_alamat', 'Alamat belum diatur di dashboard' ) ) ); ?></span>
</li>
<li>
<span class="f-icon">📞</span>
<span class="f-icon">&#128222;</span>
<a href="tel:<?php echo esc_attr( $wa_clean ); ?>">
<?php echo esc_html( get_option( 'edukarsa_footer_telp', '(021) 000-0000' ) ); ?>
</a>
</li>
<li>
<span class="f-icon">✉️</span>
<span class="f-icon">&#9993;</span>
<a href="mailto:<?php echo esc_attr( get_option( 'edukarsa_footer_email', '[email protected]' ) ); ?>">
<?php echo esc_html( get_option( 'edukarsa_footer_email', '[email protected]' ) ); ?>
</a>
@@ -70,10 +63,9 @@ $wa_def_msg = get_option( 'edukarsa_wa_default_msg', 'Halo Admin EduKarsa, say
</ul>
</div>
<!-- Kolom 3: Tautan Penting -->
<div class="footer-col">
<h4 class="footer-col-title">Tautan Penting</h4>
<nav class="footer-nav-clean">
<h4 class="footer-col-title"><?php esc_html_e( 'Tautan Penting', 'edukarsa' ); ?></h4>
<nav class="footer-nav-clean" aria-label="<?php esc_attr_e( 'Menu Footer', 'edukarsa' ); ?>">
<?php
wp_nav_menu( array(
'theme_location' => 'menu-footer',
@@ -86,11 +78,10 @@ $wa_def_msg = get_option( 'edukarsa_wa_default_msg', 'Halo Admin EduKarsa, say
</nav>
</div>
<!-- Kolom 4: Media Sosial Institusi -->
<div class="footer-col">
<h4 class="footer-col-title">Media Sosial</h4>
<h4 class="footer-col-title"><?php esc_html_e( 'Media Sosial', 'edukarsa' ); ?></h4>
<p style="font-size: 13px; opacity: 0.85; margin-bottom: 18px; line-height: 1.5;">
Ikuti kanal resmi kami untuk update warta kegiatan kampus, prestasi, dan agenda akademik.
<?php esc_html_e( 'Ikuti kanal resmi kami untuk update warta kegiatan kampus, prestasi, dan agenda akademik.', 'edukarsa' ); ?>
</p>
<div class="footer-social-icons">
<?php if ( get_option( 'edukarsa_tampil_fb', 1 ) == 1 && get_option( 'edukarsa_footer_fb' ) ) : ?>
@@ -98,93 +89,70 @@ $wa_def_msg = get_option( 'edukarsa_wa_default_msg', 'Halo Admin EduKarsa, say
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M22 12c0-5.52-4.48-10-10-10S2 6.48 2 12c0 4.84 3.44 8.87 8 9.8V15H8v-3h2V9.5C10 7.57 11.57 6 13.5 6H16v3h-2c-.55 0-1 .45-1 1v2h3v3h-3v6.95c5.05-.5 9-4.76 9-9.95z"/></svg>
</a>
<?php endif; ?>
<?php if ( get_option( 'edukarsa_tampil_ig', 1 ) == 1 && get_option( 'edukarsa_footer_ig' ) ) : ?>
<a href="<?php echo esc_url( get_option( 'edukarsa_footer_ig' ) ); ?>" target="_blank" rel="noopener" class="social-btn" title="Instagram">
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689-.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z"/></svg>
</a>
<?php endif; ?>
<?php if ( get_option( 'edukarsa_tampil_yt', 1 ) == 1 && get_option( 'edukarsa_footer_yt' ) ) : ?>
<a href="<?php echo esc_url( get_option( 'edukarsa_footer_yt' ) ); ?>" target="_blank" rel="noopener" class="social-btn" title="YouTube">
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/></svg>
</a>
<?php endif; ?>
<?php if ( get_option( 'edukarsa_tampil_tiktok', 0 ) == 1 && get_option( 'edukarsa_footer_tiktok' ) ) : ?>
<a href="<?php echo esc_url( get_option( 'edukarsa_footer_tiktok' ) ); ?>" target="_blank" rel="noopener" class="social-btn" title="TikTok">
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-1.01-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.24 1.07-.14 1.61.24 1.64 1.82 2.89 3.5 2.77 1.81-.05 3.29-1.52 3.36-3.33.04-3.78.02-7.57.02-11.35z"/></svg>
</a>
<?php endif; ?>
<?php if ( get_option( 'edukarsa_tampil_x', 0 ) == 1 && get_option( 'edukarsa_footer_x' ) ) : ?>
<a href="<?php echo esc_url( get_option( 'edukarsa_footer_x' ) ); ?>" target="_blank" rel="noopener" class="social-btn" title="X (Twitter)">
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>
</a>
<?php endif; ?>
</div>
</div>
</div>
<!-- COPYRIGHT BAR DENGAN WATERMARK KREATOR -->
<div class="footer-bottom-bar">
<div class="container footer-bottom-inner">
<p class="copyright-text">
&copy; <?php echo date( 'Y' ); ?> <?php echo esc_html( get_option( 'edukarsa_footer_copyright', 'EduKarsa University. All Rights Reserved.' ) ); ?>
<span style="opacity: 0.5; margin: 0 6px;">&bull;</span>
<span>Tema <a href="https://apps.masbudi.my.id/edukarsa" target="_blank" rel="noopener" style="color: #f39c12; font-weight: 700; text-decoration: none;">EduKarsa</a> oleh <a href="https://masbudi.my.id" target="_blank" rel="noopener" style="color: #ffffff; text-decoration: underline;">masbudi.my.id</a></span>
&copy; <?php echo esc_html( date( 'Y' ) ); ?> <?php echo esc_html( get_option( 'edukarsa_footer_copyright', 'EduKarsa. All Rights Reserved.' ) ); ?>
</p>
<div class="footer-bottom-badge">
<span>Terakreditasi BAN-PT &bull; Kampus Merdeka</span>
<span><?php esc_html_e( 'Terakreditasi BAN-PT &bull; Kampus Merdeka', 'edukarsa' ); ?></span>
</div>
</div>
</div>
</footer>
<!-- WIDGET AKSESIBILITAS DISABILITAS & PEMBACA SUARA (WCAG TOOLBAR) -->
<?php if ( get_option( 'edukarsa_tampil_accessibility', 1 ) == 1 ) : ?>
<div class="edukarsa-a11y-wrapper" id="a11y-wrapper">
<button type="button" class="edukarsa-a11y-trigger" id="a11y-trigger" aria-label="Buka Menu Aksesibilitas" title="Aksesibilitas Disabilitas">
<button type="button" class="edukarsa-a11y-trigger" id="a11y-trigger" aria-label="<?php esc_attr_e( 'Buka Menu Aksesibilitas', 'edukarsa' ); ?>" title="<?php esc_attr_e( 'Aksesibilitas Disabilitas', 'edukarsa' ); ?>">
<svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z"/></svg>
</button>
<div class="edukarsa-a11y-panel" id="a11y-panel">
<div class="a11y-panel-header">
<h4>♿ Aksesibilitas</h4>
<h4><?php esc_html_e( 'Aksesibilitas', 'edukarsa' ); ?></h4>
<button type="button" class="a11y-close-btn" id="a11y-close">&times;</button>
</div>
<div class="a11y-panel-body">
<div class="a11y-group">
<span class="a11y-label">Pembaca Suara (Audio)</span>
<span class="a11y-label"><?php esc_html_e( 'Pembaca Suara (Audio)', 'edukarsa' ); ?></span>
<div class="a11y-btn-grid">
<button type="button" class="a11y-btn" id="a11y-speak-play">🔊 Baca</button>
<button type="button" class="a11y-btn" id="a11y-speak-stop">⏹ Berhenti</button>
<button type="button" class="a11y-btn" id="a11y-speak-play"><?php esc_html_e( 'Baca', 'edukarsa' ); ?></button>
<button type="button" class="a11y-btn" id="a11y-speak-stop"><?php esc_html_e( 'Berhenti', 'edukarsa' ); ?></button>
</div>
</div>
<div class="a11y-group">
<span class="a11y-label">Ukuran Teks</span>
<span class="a11y-label"><?php esc_html_e( 'Ukuran Teks', 'edukarsa' ); ?></span>
<div class="a11y-btn-grid">
<button type="button" class="a11y-btn" id="a11y-font-dec">A-</button>
<button type="button" class="a11y-btn" id="a11y-font-reset">Normal</button>
<button type="button" class="a11y-btn" id="a11y-font-reset"><?php esc_html_e( 'Normal', 'edukarsa' ); ?></button>
<button type="button" class="a11y-btn" id="a11y-font-inc">A+</button>
</div>
</div>
<div class="a11y-group">
<span class="a11y-label">Tampilan Visual</span>
<span class="a11y-label"><?php esc_html_e( 'Tampilan Visual', 'edukarsa' ); ?></span>
<div class="a11y-btn-grid">
<button type="button" class="a11y-btn" id="a11y-contrast">Kontras</button>
<button type="button" class="a11y-btn" id="a11y-grayscale">Monokrom</button>
<button type="button" class="a11y-btn" id="a11y-contrast"><?php esc_html_e( 'Kontras', 'edukarsa' ); ?></button>
<button type="button" class="a11y-btn" id="a11y-grayscale"><?php esc_html_e( 'Monokrom', 'edukarsa' ); ?></button>
</div>
</div>
<div class="a11y-group">
<span class="a11y-label">Navigasi</span>
<span class="a11y-label"><?php esc_html_e( 'Navigasi', 'edukarsa' ); ?></span>
<div class="a11y-btn-grid">
<button type="button" class="a11y-btn" id="a11y-links">Garis Tautan</button>
<button type="button" class="a11y-btn a11y-btn-danger" id="a11y-reset-all">Reset</button>
<button type="button" class="a11y-btn" id="a11y-links"><?php esc_html_e( 'Garis Tautan', 'edukarsa' ); ?></button>
<button type="button" class="a11y-btn a11y-btn-danger" id="a11y-reset-all"><?php esc_html_e( 'Reset', 'edukarsa' ); ?></button>
</div>
</div>
</div>
@@ -192,7 +160,6 @@ $wa_def_msg = get_option( 'edukarsa_wa_default_msg', 'Halo Admin EduKarsa, say
</div>
<?php endif; ?>
<!-- FLOATING WHATSAPP (LABEL & PESAN DINAMIS) -->
<?php if ( ! empty( $wa_clean ) ) : ?>
<a href="https://wa.me/<?php echo esc_attr( $wa_clean ); ?>?text=<?php echo rawurlencode( $wa_def_msg ); ?>" target="_blank" rel="noopener" class="edukarsa-wa-float" title="<?php echo esc_attr( $wa_btn_label ); ?>">
<svg width="24" height="24" viewBox="0 0 24 24" fill="#ffffff"><path d="M12.031 6.172c-3.181 0-5.767 2.586-5.768 5.766-.001 1.298.38 2.27 1.019 3.287l-.711 2.598 2.664-.699c.971.53 1.777.82 2.796.82h.005c3.18 0 5.767-2.586 5.768-5.766 0-3.18-2.587-5.806-5.773-5.806zm3.376 8.214c-.149.42-.767.781-1.072.829-.304.048-.687.069-2.203-.559-1.933-.801-3.178-2.775-3.275-2.905-.095-.129-.778-1.036-.778-1.975 0-.94.492-1.401.667-1.593.175-.192.383-.24.512-.24.129 0 .258.006.371.012.12.006.279-.045.436.334.164.397.558 1.365.607 1.465.049.099.082.217.017.348-.065.131-.098.212-.195.328-.098.115-.205.258-.293.346-.098.098-.201.205-.087.401.115.196.512.846 1.099 1.368.756.673 1.393.882 1.59.98.196.098.312.082.426-.049.115-.131.492-.573.623-.77.131-.196.262-.164.442-.098.18.065 1.147.541 1.344.639.196.098.328.147.377.229.049.082.049.475-.1.895z"/></svg>
@@ -200,183 +167,7 @@ $wa_def_msg = get_option( 'edukarsa_wa_default_msg', 'Halo Admin EduKarsa, say
</a>
<?php endif; ?>
<!-- BACK TO TOP -->
<button id="back-to-top" class="back-to-top-btn" aria-label="Kembali ke atas">▲</button>
<script>
document.addEventListener("DOMContentLoaded", function() {
const toggleBtn = document.getElementById("mobile-menu-toggle");
const navMenu = document.getElementById("site-navigation");
if (toggleBtn && navMenu) {
toggleBtn.addEventListener("click", function() {
toggleBtn.classList.toggle("active");
navMenu.classList.toggle("active");
});
}
const bttBtn = document.getElementById("back-to-top");
if (bttBtn) {
window.addEventListener("scroll", function() {
if (window.scrollY > 350) { bttBtn.classList.add("show"); } else { bttBtn.classList.remove("show"); }
});
bttBtn.addEventListener("click", function() {
window.scrollTo({ top: 0, behavior: "smooth" });
});
}
const a11yTrigger = document.getElementById("a11y-trigger");
const a11yPanel = document.getElementById("a11y-panel");
const a11yClose = document.getElementById("a11y-close");
if (a11yTrigger && a11yPanel) {
a11yTrigger.addEventListener("click", function() {
a11yPanel.classList.toggle("active");
});
if (a11yClose) {
a11yClose.addEventListener("click", function() {
a11yPanel.classList.remove("active");
});
}
const fontLevels = ['', 'a11y-font-lg', 'a11y-font-xl'];
let currentFontIdx = parseInt(localStorage.getItem('edukarsa_a11y_font') || '0', 10);
function applyA11y() {
fontLevels.forEach(function(c) {
if (c) document.body.classList.remove(c);
});
if (fontLevels[currentFontIdx]) {
document.body.classList.add(fontLevels[currentFontIdx]);
}
if (localStorage.getItem('edukarsa_a11y_contrast') === '1') {
document.body.classList.add('a11y-high-contrast');
} else {
document.body.classList.remove('a11y-high-contrast');
}
if (localStorage.getItem('edukarsa_a11y_grayscale') === '1') {
document.body.classList.add('a11y-grayscale');
} else {
document.body.classList.remove('a11y-grayscale');
}
if (localStorage.getItem('edukarsa_a11y_links') === '1') {
document.body.classList.add('a11y-underline-links');
} else {
document.body.classList.remove('a11y-underline-links');
}
}
applyA11y();
document.getElementById("a11y-font-inc")?.addEventListener("click", function() {
if (currentFontIdx < fontLevels.length - 1) currentFontIdx++;
localStorage.setItem('edukarsa_a11y_font', currentFontIdx);
applyA11y();
});
document.getElementById("a11y-font-dec")?.addEventListener("click", function() {
if (currentFontIdx > 0) currentFontIdx--;
localStorage.setItem('edukarsa_a11y_font', currentFontIdx);
applyA11y();
});
document.getElementById("a11y-font-reset")?.addEventListener("click", function() {
currentFontIdx = 0;
localStorage.setItem('edukarsa_a11y_font', currentFontIdx);
applyA11y();
});
document.getElementById("a11y-contrast")?.addEventListener("click", function() {
const active = localStorage.getItem('edukarsa_a11y_contrast') === '1';
localStorage.setItem('edukarsa_a11y_contrast', active ? '0' : '1');
applyA11y();
});
document.getElementById("a11y-grayscale")?.addEventListener("click", function() {
const active = localStorage.getItem('edukarsa_a11y_grayscale') === '1';
localStorage.setItem('edukarsa_a11y_grayscale', active ? '0' : '1');
applyA11y();
});
document.getElementById("a11y-links")?.addEventListener("click", function() {
const active = localStorage.getItem('edukarsa_a11y_links') === '1';
localStorage.setItem('edukarsa_a11y_links', active ? '0' : '1');
applyA11y();
});
document.getElementById("a11y-reset-all")?.addEventListener("click", function() {
currentFontIdx = 0;
localStorage.removeItem('edukarsa_a11y_font');
localStorage.removeItem('edukarsa_a11y_contrast');
localStorage.removeItem('edukarsa_a11y_grayscale');
localStorage.removeItem('edukarsa_a11y_links');
applyA11y();
if ('speechSynthesis' in window) {
window.speechSynthesis.cancel();
const pBtn = document.getElementById("a11y-speak-play");
if (pBtn) { pBtn.classList.remove('speaking'); pBtn.innerText = "🔊 Baca"; }
}
});
const speakPlayBtn = document.getElementById("a11y-speak-play");
const speakStopBtn = document.getElementById("a11y-speak-stop");
if ('speechSynthesis' in window && speakPlayBtn) {
const synth = window.speechSynthesis;
speakPlayBtn.addEventListener("click", function() {
if (synth.speaking) {
synth.cancel();
}
const contentEl = document.querySelector("article .entry-content") || document.getElementById("primary") || document.body;
const textToRead = contentEl.innerText.replace(/\s+/g, ' ').trim();
if (!textToRead) return;
const utterance = new SpeechSynthesisUtterance(textToRead);
const match = document.cookie.match(/googtrans=\/id\/([a-zA-Z\-]+)/i);
const activeLang = match ? match[1].toLowerCase() : 'id';
if (activeLang === 'en') {
utterance.lang = 'en-US';
} else if (activeLang === 'ar') {
utterance.lang = 'ar-SA';
} else {
utterance.lang = 'id-ID';
}
utterance.rate = 0.95;
utterance.onstart = function() {
speakPlayBtn.classList.add('speaking');
speakPlayBtn.innerText = "🔊 Membaca...";
};
utterance.onend = utterance.onerror = function() {
speakPlayBtn.classList.remove('speaking');
speakPlayBtn.innerText = "🔊 Baca";
};
synth.speak(utterance);
});
speakStopBtn?.addEventListener("click", function() {
if (synth.speaking) {
synth.cancel();
speakPlayBtn.classList.remove('speaking');
speakPlayBtn.innerText = "🔊 Baca";
}
});
} else if (speakPlayBtn) {
speakPlayBtn.style.display = 'none';
if (speakStopBtn) speakStopBtn.style.display = 'none';
}
}
});
</script>
<button id="back-to-top" class="back-to-top-btn" aria-label="<?php esc_attr_e( 'Kembali ke atas', 'edukarsa' ); ?>">&#8679;</button>
<?php wp_footer(); ?>
</body>
+24 -14
View File
@@ -1,18 +1,28 @@
<?php
/**
* File ini berfungsi sebagai 'Router/Loader'.
* Seluruh fungsionalitas diisolasi ke dalam sub-berkas direktori inc/.
* File Loader / Router Tema EduKarsa
* Seluruh logika modular ditempatkan di folder inc/
*/
defined('ABSPATH') || exit; // Hardened Security Native
// Auto-load secara dinamis seluruh file PHP di dalam folder inc/
// Ini akan secara otomatis memulihkan modul i18n, security, popup, dan gallery Anda.
$inc_dir = get_template_directory() . '/inc/';
if ( is_dir( $inc_dir ) ) {
$inc_files = glob( $inc_dir . '*.php' );
if ( $inc_files ) {
foreach ( $inc_files as $file ) {
require_once $file;
}
}
}
defined( 'ABSPATH' ) || exit;
// 1. Memuat Modul Keamanan & Hardening Native
require_once get_template_directory() . '/inc/security.php';
// 2. Memuat Modul Kamus Dinamis Dashboard (i18n)
require_once get_template_directory() . '/inc/i18n.php';
// 3. Memuat Pengaturan Dasar Tema & Aset
require_once get_template_directory() . '/inc/setup.php';
// 4. Memuat Custom Post Type Native
require_once get_template_directory() . '/inc/cpt-slider.php';
// 5. Memuat Panel Menu EduKarsa & Settings API
require_once get_template_directory() . '/inc/admin-menu.php';
// 6. Memuat Native SEO & Structured Data (JSON-LD)
require_once get_template_directory() . '/inc/seo.php';
// 7. Memuat Modul Pop-up Flyer & Pengumuman Modal
require_once get_template_directory() . '/inc/popup.php';
+62 -122
View File
@@ -1,4 +1,6 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
defined( 'ABSPATH' ) || exit;
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
@@ -7,128 +9,66 @@
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<header class="site-header">
<div class="container header-container">
<div class="site-branding">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" class="logo-link">
<?php
$header_logo = get_option('edukarsa_header_logo');
if ( ! empty( $header_logo ) ) :
?>
<img src="<?php echo esc_url( $header_logo ); ?>" alt="<?php bloginfo( 'name' ); ?>" style="max-height: 52px; object-fit: contain;">
<?php else : ?>
<h1 class="site-title"><?php bloginfo( 'name' ); ?></h1>
<?php endif; ?>
</a>
</div>
<?php
if ( function_exists( 'wp_body_open' ) ) {
wp_body_open();
} else {
do_action( 'wp_body_open' );
}
?>
<!-- Area Navigasi & Bahasa -->
<div class="header-nav-wrap">
<nav class="main-navigation" id="site-navigation">
<?php
wp_nav_menu( array(
'theme_location' => 'menu-utama',
'menu_id' => 'primary-menu',
'fallback_cb' => false,
'container' => false,
'menu_class' => 'nav-menu-custom'
) );
?>
</nav>
<!-- MULTI-LANGUAGE SWITCHER DINAMIS -->
<?php
if ( get_option( 'edukarsa_tampil_bilingual', 1 ) == 1 ) :
$available_langs = array( 'id' => 'ID' );
if ( get_option( 'edukarsa_lang_en', 1 ) == 1 ) $available_langs['en'] = 'EN';
if ( get_option( 'edukarsa_lang_ar', 0 ) == 1 ) $available_langs['ar'] = 'AR';
if ( get_option( 'edukarsa_lang_zh', 0 ) == 1 ) $available_langs['zh-CN'] = 'ZH';
if ( get_option( 'edukarsa_lang_ja', 0 ) == 1 ) $available_langs['ja'] = 'JA';
$incl_codes = implode( ',', array_keys( $available_langs ) );
<header class="site-header">
<div class="container header-container">
<div class="site-branding">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" class="logo-link">
<?php
$header_logo = get_option('edukarsa_header_logo');
if ( ! empty( $header_logo ) ) :
?>
<div class="edukarsa-lang-switcher" id="lang-switcher">
<?php
$total = count( $available_langs );
$idx = 0;
foreach ( $available_langs as $code => $label ) :
$idx++;
?>
<button type="button" class="lang-btn" data-lang="<?php echo esc_attr( $code ); ?>"><?php echo esc_html( $label ); ?></button>
<?php if ( $idx < $total ) : ?><span class="lang-divider">|</span><?php endif; ?>
<?php endforeach; ?>
</div>
<div id="google_translate_element" style="display:none;"></div>
<img src="<?php echo esc_url( $header_logo ); ?>" alt="<?php bloginfo( 'name' ); ?>" style="max-height: 52px; object-fit: contain;">
<?php else : ?>
<h1 class="site-title"><?php bloginfo( 'name' ); ?></h1>
<?php endif; ?>
<!-- Tombol Hamburger Mobile -->
<button class="menu-toggle" id="mobile-menu-toggle" aria-label="Buka Menu Navigasi">
<span></span>
<span></span>
<span></span>
</button>
</div>
</a>
</div>
</header>
<?php if ( get_option( 'edukarsa_tampil_bilingual', 1 ) == 1 ) : ?>
<!-- SKRIP TRANSLASI NATIVE & PEMBERSIH TOOLBAR GOOGLE -->
<script type="text/javascript">
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'id',
includedLanguages: '<?php echo esc_js( $incl_codes ); ?>',
autoDisplay: false
}, 'google_translate_element');
}
function changeLanguage(lang) {
var host = window.location.hostname;
if (lang === 'id') {
document.cookie = "googtrans=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
document.cookie = "googtrans=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=" + host;
document.cookie = "googtrans=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=." + host;
} else {
var cookieVal = '/id/' + lang;
document.cookie = "googtrans=" + cookieVal + "; path=/;";
document.cookie = "googtrans=" + cookieVal + "; path=/; domain=" + host;
document.cookie = "googtrans=" + cookieVal + "; path=/; domain=." + host;
}
window.location.reload();
}
document.addEventListener("DOMContentLoaded", function() {
// Cek status bahasa aktif
var match = document.cookie.match(/googtrans=\/id\/([a-zA-Z\-]+)/i);
var activeLang = match ? match[1] : 'id';
var buttons = document.querySelectorAll('.lang-btn');
buttons.forEach(function(btn) {
if (btn.getAttribute('data-lang').toLowerCase() === activeLang.toLowerCase()) {
btn.classList.add('active');
} else {
btn.classList.remove('active');
}
btn.addEventListener('click', function() {
var selected = this.getAttribute('data-lang');
changeLanguage(selected);
});
});
// Hapus pergeseran paksa body dari Google Translate
var killTranslateBar = function() {
if (document.body.style.top && document.body.style.top !== '0px') {
document.body.style.top = '0px';
}
var banner = document.querySelector('.goog-te-banner-frame, iframe.goog-te-banner-frame, .VIpgJd-ZVi9od-ORHb-OEVmcd');
if (banner) {
banner.style.display = 'none';
}
};
setInterval(killTranslateBar, 150);
});
</script>
<script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
<?php endif; ?>
<div class="header-nav-wrap">
<nav class="main-navigation" id="site-navigation" aria-label="<?php esc_attr_e( 'Menu Utama', 'edukarsa' ); ?>">
<?php
wp_nav_menu( array(
'theme_location' => 'menu-utama',
'menu_id' => 'primary-menu',
'fallback_cb' => false,
'container' => false,
'menu_class' => 'nav-menu-custom'
) );
?>
</nav>
<?php
if ( get_option( 'edukarsa_tampil_bilingual', 1 ) == 1 ) :
$available_langs = array( 'id' => 'ID' );
if ( get_option( 'edukarsa_lang_en', 1 ) == 1 ) $available_langs['en'] = 'EN';
if ( get_option( 'edukarsa_lang_ar', 0 ) == 1 ) $available_langs['ar'] = 'AR';
if ( get_option( 'edukarsa_lang_zh', 0 ) == 1 ) $available_langs['zh-CN'] = 'ZH';
if ( get_option( 'edukarsa_lang_ja', 0 ) == 1 ) $available_langs['ja'] = 'JA';
?>
<div class="edukarsa-lang-switcher" id="lang-switcher">
<?php
$total = count( $available_langs );
$idx = 0;
foreach ( $available_langs as $code => $label ) :
$idx++;
?>
<button type="button" class="lang-btn" data-lang="<?php echo esc_attr( $code ); ?>"><?php echo esc_html( $label ); ?></button>
<?php if ( $idx < $total ) : ?><span class="lang-divider">|</span><?php endif; ?>
<?php endforeach; ?>
</div>
<div id="google_translate_element" style="display:none;"></div>
<?php endif; ?>
<button class="menu-toggle" id="mobile-menu-toggle" aria-label="<?php esc_attr_e( 'Buka Menu Navigasi', 'edukarsa' ); ?>">
<span></span>
<span></span>
<span></span>
</button>
</div>
</div>
</header>
+4 -83
View File
@@ -1,86 +1,7 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
/**
* Registrasi Seluruh Custom Post Type (CPT) Native EduKarsa
* Kompatibilitas Fitur EduKarsa
* Sesuai pedoman Theme Review WordPress.org, Custom Post Types (slider, program, galeri, dll.)
* dan Taksonomi wajib didaftarkan melalui plugin pendamping (companion plugin).
*/
function edukarsa_register_all_cpt() {
register_post_type( 'slider', array(
'labels' => array('name' => 'Semua Slider', 'singular_name' => 'Slider', 'add_new_item' => 'Tambah Slider'),
'supports' => array('title', 'thumbnail'), 'public' => false, 'show_ui' => true, 'show_in_menu' => false
));
register_post_type( 'program', array(
'labels' => array('name' => 'Semua Program', 'singular_name' => 'Program', 'add_new_item' => 'Tambah Program'),
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'), 'public' => true, 'show_ui' => true, 'show_in_menu' => false
));
register_post_type( 'milestone', array(
'labels' => array('name' => 'Semua Milestone', 'singular_name' => 'Milestone', 'add_new_item' => 'Tambah Milestone'),
'supports' => array('title', 'excerpt'), 'public' => false, 'show_ui' => true, 'show_in_menu' => false
));
register_post_type( 'keunggulan', array(
'labels' => array('name' => 'Semua Keunggulan', 'singular_name' => 'Keunggulan', 'add_new_item' => 'Tambah Keunggulan'),
'supports' => array('title', 'editor'), 'public' => false, 'show_ui' => true, 'show_in_menu' => false
));
register_post_type( 'faq', array(
'labels' => array('name' => 'Semua FAQ', 'singular_name' => 'FAQ', 'add_new_item' => 'Tambah FAQ Baru', 'all_items' => 'Semua FAQ'),
'supports' => array('title', 'editor'), 'public' => false, 'show_ui' => true, 'show_in_menu' => false
));
}
add_action( 'init', 'edukarsa_register_all_cpt', 0 );
// METABOX UNTUK LINK SLIDER
function edukarsa_slider_meta_box() {
add_meta_box( 'slider_link_meta', 'Tautan (URL) Slider', 'edukarsa_slider_meta_callback', 'slider', 'normal', 'high' );
}
add_action( 'add_meta_boxes', 'edukarsa_slider_meta_box' );
function edukarsa_slider_meta_callback( $post ) {
wp_nonce_field( 'edukarsa_slider_save', 'edukarsa_slider_meta_nonce' );
$value = get_post_meta( $post->ID, '_slider_link', true );
echo '<p>Masukkan URL tujuan jika pengunjung mengklik gambar slider ini (opsional).</p>';
echo '<input type="url" id="slider_link" name="slider_link" value="' . esc_attr( $value ) . '" style="width:100%; padding:8px;" placeholder="https://..." />';
}
function edukarsa_slider_save_meta( $post_id ) {
if ( ! isset( $_POST['edukarsa_slider_meta_nonce'] ) || ! wp_verify_nonce( $_POST['edukarsa_slider_meta_nonce'], 'edukarsa_slider_save' ) ) return;
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( isset( $_POST['slider_link'] ) ) { update_post_meta( $post_id, '_slider_link', sanitize_text_field( $_POST['slider_link'] ) ); }
}
add_action( 'save_post', 'edukarsa_slider_save_meta' );
// --- REGISTRASI CPT GALERI & TAXONOMY ---
function edukarsa_register_galeri_cpt() {
register_post_type( 'galeri', array(
'labels' => array(
'name' => 'Galeri Fasilitas',
'singular_name' => 'Galeri',
'add_new_item' => 'Tambah Foto Galeri',
'all_items' => 'Semua Foto Galeri'
),
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'public' => true,
'show_ui' => true,
'show_in_menu' => false,
'menu_icon' => 'dashicons-format-gallery'
));
register_taxonomy( 'kategori_galeri', 'galeri', array(
'labels' => array('name' => 'Kategori Galeri', 'singular_name' => 'Kategori', 'add_new_item' => 'Tambah Kategori'),
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_menu' => false
));
}
add_action( 'init', 'edukarsa_register_galeri_cpt', 0 );
// --- NOTIFIKASI PANDUAN RESOLUSI SLIDER ---
function edukarsa_slider_admin_notice() {
$screen = get_current_screen();
if ( isset($screen->post_type) && $screen->post_type === 'slider' ) {
echo '<div class="notice notice-info is-dismissible" style="border-left-color: #0b4a8e;">
<p><strong>💡 Panduan Resolusi Gambar:</strong> Untuk tampilan terbaik tanpa pecah, gunakan gambar beresolusi <strong>1920x1080 piksel (16:9)</strong> pada kotak <em>Gambar Unggulan (Featured Image)</em> di sisi kanan bawah.</p>
</div>';
}
}
add_action('admin_notices', 'edukarsa_slider_admin_notice');
defined( 'ABSPATH' ) || exit;
+6 -55
View File
@@ -1,13 +1,11 @@
<?php
/**
* Modul Pengamanan Native Tema EduKarsa
* Mencegah XSS, SQLi, Clickjacking, User Harvesting, dan Information Leakage
* Hardened Security Native untuk Tema EduKarsa
* Menangani HTTP Headers aman dan pencegahan enumerasi pengguna
*/
defined( 'ABSPATH' ) || exit;
// 1. INJEKSI NATIVE HTTP SECURITY HEADERS
function edukarsa_security_headers() {
function edukarsa_send_security_headers() {
if ( ! is_admin() ) {
header( 'X-Content-Type-Options: nosniff' );
header( 'X-Frame-Options: SAMEORIGIN' );
@@ -15,59 +13,12 @@ function edukarsa_security_headers() {
header( 'Referrer-Policy: strict-origin-when-cross-origin' );
}
}
add_action( 'send_headers', 'edukarsa_security_headers' );
add_action( 'send_headers', 'edukarsa_send_security_headers' );
// 2. INFORMATION DISCLOSURE CLOAKING (SEMBUNYIKAN GENERATOR VERSI CMS)
function edukarsa_clean_header_fingerprints() {
remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wp_shortlink_wp_head' );
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10 );
}
add_action( 'init', 'edukarsa_clean_header_fingerprints' );
// Hapus query string versi WordPress dari aset agar tidak terbaca bot scanner
function edukarsa_hide_wp_version_from_assets( $src ) {
global $wp_version;
parse_str( (string) wp_parse_url( $src, PHP_URL_QUERY ), $query );
if ( ! empty( $query['ver'] ) && $query['ver'] === $wp_version ) {
$src = remove_query_arg( 'ver', $src );
}
return $src;
}
add_filter( 'style_loader_src', 'edukarsa_hide_wp_version_from_assets', 9999 );
add_filter( 'script_loader_src', 'edukarsa_hide_wp_version_from_assets', 9999 );
// 3. BLOKIR PROBING USERNAME / ENUMERASI AUTHOR (?author=N)
function edukarsa_block_author_enumeration() {
if ( ! is_admin() && isset( $_REQUEST['author'] ) ) {
wp_safe_redirect( home_url( '/' ), 301 );
if ( ! is_admin() && isset( $_REQUEST['author'] ) && ! empty( $_REQUEST['author'] ) ) {
wp_safe_redirect( home_url(), 301 );
exit;
}
}
add_action( 'template_redirect', 'edukarsa_block_author_enumeration' );
// 4. BATASI ENDPOINT REST API USERS BAGI PENGUNJUNG TANPA OTENTIKASI
function edukarsa_restrict_rest_users_endpoint( $endpoints ) {
if ( ! is_user_logged_in() ) {
if ( isset( $endpoints['/wp/v2/users'] ) ) {
unset( $endpoints['/wp/v2/users'] );
}
if ( isset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] ) ) {
unset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
}
}
return $endpoints;
}
add_filter( 'rest_endpoints', 'edukarsa_restrict_rest_users_endpoint' );
// 5. SANITASI INPUT PENCARIAN (ANTI-REFLECTED XSS)
function edukarsa_sanitize_search_query( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$s = $query->get( 's' );
$query->set( 's', sanitize_text_field( $s ) );
}
return $query;
}
add_action( 'pre_get_posts', 'edukarsa_sanitize_search_query' );
+81 -46
View File
@@ -1,55 +1,90 @@
<?php
/**
* File ini menangani dukungan tema (Theme Support) dan antrean aset (CSS/JS).
*/
defined('ABSPATH') || exit;
defined( 'ABSPATH' ) || exit;
// 1. PENGATURAN DASAR
function edukarsa_setup() {
add_theme_support( 'title-tag' );
add_theme_support( 'post-thumbnails' );
// Pastikan tema mendukung excerpt (kutipan) untuk CPT
add_post_type_support( 'page', 'excerpt' );
if ( ! function_exists( 'edukarsa_theme_setup' ) ) {
function edukarsa_theme_setup() {
load_theme_textdomain( 'edukarsa', get_template_directory() . '/languages' );
register_nav_menus( array(
'menu-utama' => __( 'Menu Utama', 'edukarsa' ),
'menu-footer' => __( 'Menu Footer', 'edukarsa' ),
add_theme_support( 'automatic-feed-links' );
add_theme_support( 'title-tag' );
add_theme_support( 'post-thumbnails' );
add_theme_support( 'align-wide' );
add_theme_support( 'wp-block-styles' );
add_theme_support( 'responsive-embeds' );
add_theme_support( 'editor-styles' );
add_editor_style( 'style.css' );
add_theme_support( 'html5', array( 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption', 'style', 'script' ) );
add_theme_support( 'custom-logo', array(
'height' => 110,
'width' => 400,
'flex-height' => true,
'flex-width' => true,
) );
add_theme_support( 'custom-header', array(
'default-image' => '',
'width' => 1920,
'height' => 800,
'flex-height' => true,
) );
add_theme_support( 'custom-background', array(
'default-color' => 'ffffff',
) );
register_nav_menus( array(
'menu-utama' => esc_html__( 'Menu Navigasi Utama', 'edukarsa' ),
'menu-footer' => esc_html__( 'Menu Tautan Footer', 'edukarsa' ),
) );
}
}
add_action( 'after_setup_theme', 'edukarsa_theme_setup' );
function edukarsa_register_block_components() {
if ( function_exists( 'register_block_style' ) ) {
register_block_style( 'core/quote', array(
'name' => 'edukarsa-quote',
'label' => esc_html__( 'EduKarsa Quote', 'edukarsa' ),
) );
}
if ( function_exists( 'register_block_pattern' ) ) {
register_block_pattern(
'edukarsa/cta-banner',
array(
'title' => esc_html__( 'EduKarsa CTA Banner', 'edukarsa' ),
'description' => esc_html__( 'Banner ajakan pendaftaran PMB EduKarsa', 'edukarsa' ),
'content' => '<!-- wp:group {"className":"edukarsa-cta-block"} --><div class="wp-block-group edukarsa-cta-block"><p>' . esc_html__( 'Pendaftaran Mahasiswa / Siswa Baru Telah Dibuka!', 'edukarsa' ) . '</p></div><!-- /wp:group -->',
'categories' => array( 'featured' ),
)
);
}
}
add_action( 'init', 'edukarsa_register_block_components' );
function edukarsa_register_sidebars() {
register_sidebar( array(
'name' => esc_html__( 'Sidebar Utama', 'edukarsa' ),
'id' => 'sidebar-utama',
'description' => esc_html__( 'Area widget untuk bilah samping postingan dan halaman.', 'edukarsa' ),
'before_widget' => '<div id="%1$s" class="card-style sidebar-widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3 class="sidebar-widget-title">',
'after_title' => '</h3>',
) );
}
add_action( 'after_setup_theme', 'edukarsa_setup' );
add_action( 'widgets_init', 'edukarsa_register_sidebars' );
// 2. MENGHUBUNGKAN ASET (CSS & JS FRONTEND)
function edukarsa_scripts() {
// Memaksa path absolut langsung ke folder tema dengan Cache Busting time()
wp_enqueue_style(
'edukarsa-style',
get_template_directory_uri() . '/style.css',
array(),
time(),
'all'
);
}
add_action( 'wp_enqueue_scripts', 'edukarsa_scripts' );
function edukarsa_enqueue_scripts() {
wp_enqueue_style( 'edukarsa-style', get_stylesheet_uri(), array(), time() );
// 3. MEMUAT JAVASCRIPT UNTUK MEDIA UPLOADER (DASHBOARD)
function edukarsa_admin_scripts( $hook ) {
// Memastikan skrip uploader dipanggil di halaman pengaturan Edukarsa
if ( strpos( $hook, 'edukarsa' ) !== false ) {
wp_enqueue_media();
if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
wp_enqueue_script( 'comment-reply' );
}
if ( file_exists( get_template_directory() . '/assets/edukarsa.js' ) ) {
wp_enqueue_script( 'edukarsa-global-js', get_template_directory_uri() . '/assets/edukarsa.js', array(), time(), true );
}
}
add_action( 'admin_enqueue_scripts', 'edukarsa_admin_scripts' );
// 4. REDIRECT SETELAH AKTIVASI TEMA
// 4. REDIRECT AMAN SETELAH AKTIVASI TEMA
function edukarsa_activation_redirect() {
global $pagenow;
if ( 'themes.php' === $pagenow && isset( $_GET['activated'] ) ) {
// Redirect yang aman, dipanggil setelah seluruh menu dan hak akses WordPress siap
wp_safe_redirect( admin_url( 'admin.php?page=edukarsa_settings' ) );
exit;
}
}
add_action( 'admin_init', 'edukarsa_activation_redirect' );
add_action( 'wp_enqueue_scripts', 'edukarsa_enqueue_scripts' );
+27
View File
@@ -0,0 +1,27 @@
=== EduKarsa ===
Contributors: masbudikusuma
Requires at least: 6.0
Tested up to: 6.7
Requires PHP: 7.4
Stable tag: 1.1.6
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
EduKarsa adalah tema WordPress native modern yang didesain khusus untuk portal web sekolah, madrasah, pesantren, dan institusi akademik.
== Description ==
EduKarsa dirancang dengan filosofi 100% Native & Zero Plugin. Menyediakan performa muat halaman ultra-cepat, fitur aksesibilitas WCAG 2.1 AAA, struktur JSON-LD terpadu, dan konfigurasi fleksibel langsung dari WordPress Customizer/Settings API tanpa membutuhkan plugin berat pihak ketiga.
== Installation ==
1. Di dasbor WordPress Anda, buka menu Appearance > Themes > Add New.
2. Unggah file zip tema EduKarsa.
3. Klik Activate setelah instalasi selesai.
4. Buka menu EduKarsa di dasbor admin untuk mengonfigurasi profil sekolah dan tata letak.
== Frequently Asked Questions ==
= Apakah tema ini membutuhkan plugin builder seperti Elementor? =
Tidak. EduKarsa dirancang 100% native dan bebas plugin.
== Copyright ==
EduKarsa WordPress Theme, Copyright 2026 Mas Budi Kusuma.
EduKarsa didistribusikan di bawah lisensi GNU GPL v2 atau yang lebih baru.
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 927 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 901 KiB

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 973 KiB

After

Width:  |  Height:  |  Size: 123 KiB

+17 -29
View File
@@ -1,25 +1,19 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
/**
* Template Sidebar Native EduKarsa
* Dikelola 100% dari Dashboard EduKarsa (Bebas Menu Widget WP)
*/
defined( 'ABSPATH' ) || exit;
?>
<aside id="secondary" class="edukarsa-custom-sidebar">
<!-- 1. Pencarian Cepat Native -->
<aside id="secondary" class="edukarsa-custom-sidebar" aria-label="<?php esc_attr_e( 'Sidebar Utama', 'edukarsa' ); ?>">
<?php if ( is_active_sidebar( 'sidebar-utama' ) ) : ?>
<div class="sidebar-dynamic-widgets">
<?php dynamic_sidebar( 'sidebar-utama' ); ?>
</div>
<?php endif; ?>
<?php if ( get_option( 'edukarsa_sidebar_tampil_search', 1 ) == 1 ) : ?>
<div class="card-style sidebar-widget">
<form role="search" method="get" class="sidebar-search-form" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<div class="sidebar-search-wrapper">
<input type="search" class="sidebar-search-input" placeholder="Cari warta / informasi..." value="<?php echo get_search_query(); ?>" name="s" required>
<button type="submit" class="sidebar-search-btn" aria-label="Cari">🔍</button>
</div>
</form>
<?php get_search_form(); ?>
</div>
<?php endif; ?>
<!-- 2. Mini Banner CTA Pendaftaran / PMB -->
<?php if ( get_option( 'edukarsa_sidebar_tampil_cta', 1 ) == 1 ) : ?>
<div class="card-style sidebar-widget sidebar-cta-box text-center">
<span class="sidebar-cta-badge"><?php echo esc_html( get_option( 'edukarsa_sidebar_cta_badge', 'Penerimaan Siswa/Mhs' ) ); ?></span>
@@ -33,9 +27,8 @@
</div>
<?php endif; ?>
<!-- 3. BOX HTML KUSTOM NATIVE (Maps, Widget Luar, Teks Tambahan) -->
<?php
if ( get_option( 'edukarsa_sidebar_tampil_html', 0 ) == 1 ) :
<?php
if ( get_option( 'edukarsa_sidebar_tampil_html', 0 ) == 1 ) :
$html_content = get_option( 'edukarsa_sidebar_html_content' );
if ( ! empty( $html_content ) ) :
$html_title = get_option( 'edukarsa_sidebar_html_title' );
@@ -48,12 +41,11 @@
<?php echo do_shortcode( wp_specialchars_decode( $html_content ) ); ?>
</div>
</div>
<?php
<?php
endif;
endif;
endif;
?>
<!-- 4. Berita Terkini Dinamis -->
<?php if ( get_option( 'edukarsa_sidebar_tampil_recent', 1 ) == 1 ) : ?>
<div class="card-style sidebar-widget">
<h3 class="sidebar-widget-title"><?php echo esc_html( get_option( 'edukarsa_sidebar_recent_title', 'Warta Terkini' ) ); ?></h3>
@@ -65,7 +57,6 @@
'posts_per_page' => $count,
'post__not_in' => array( get_the_ID() )
) );
if ( $recent_query->have_posts() ) :
while ( $recent_query->have_posts() ) : $recent_query->the_post();
?>
@@ -76,7 +67,7 @@
</a>
<?php endif; ?>
<div class="sidebar-recent-info">
<span class="sidebar-recent-date">📅 <?php echo get_the_date( 'd M Y' ); ?></span>
<span class="sidebar-recent-date">&#128197; <?php echo get_the_date( 'd M Y' ); ?></span>
<h4 class="sidebar-recent-title">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h4>
@@ -86,14 +77,13 @@
endwhile;
wp_reset_postdata();
else :
echo '<p style="font-size:13px; color:var(--text-muted); margin:0;">Belum ada artikel lainnya.</p>';
echo '<p style="font-size:13px; color:var(--text-muted); margin:0;">' . esc_html__( 'Belum ada artikel lainnya.', 'edukarsa' ) . '</p>';
endif;
?>
</div>
</div>
<?php endif; ?>
<!-- 5. Daftar Kategori Pilihan -->
<?php if ( get_option( 'edukarsa_sidebar_tampil_cats', 1 ) == 1 ) : ?>
<div class="card-style sidebar-widget">
<h3 class="sidebar-widget-title"><?php echo esc_html( get_option( 'edukarsa_sidebar_cats_title', 'Kategori Pilihan' ) ); ?></h3>
@@ -113,17 +103,15 @@
</div>
<?php endif; ?>
<!-- 6. Banner Poster Sidebar -->
<?php
<?php
$banner_img = get_option( 'edukarsa_sidebar_banner_img' );
if ( ! empty( $banner_img ) ) :
$banner_url = get_option( 'edukarsa_sidebar_banner_url', '#' );
?>
<div class="card-style sidebar-widget sidebar-banner-box" style="padding: 10px; overflow: hidden;">
<a href="<?php echo esc_url( $banner_url ); ?>" target="_blank" rel="noopener">
<img src="<?php echo esc_url( $banner_img ); ?>" alt="Banner Pengumuman" style="width: 100%; height: auto; border-radius: 8px; display: block;">
<img src="<?php echo esc_url( $banner_img ); ?>" alt="<?php esc_attr_e( 'Banner Pengumuman', 'edukarsa' ); ?>" style="width: 100%; height: auto; border-radius: 8px; display: block;">
</a>
</div>
<?php endif; ?>
</aside>
+23 -65
View File
@@ -1,23 +1,13 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
/**
* Template Baca Artikel Penuh (Single Post) EduKarsa
* Dilengkapi Breadcrumbs, Intra-post Paging, Inter-post Paging, dan Native Social Share
*/
get_header();
defined( 'ABSPATH' ) || exit;
get_header();
?>
<main id="primary" class="site-main" style="padding: 45px 0 70px; background-color: #f8fafc; min-height: 75vh;">
<div class="container single-layout-wrapper">
<!-- KOLOM KONTEN UTAMA -->
<div class="single-content-column">
<?php while ( have_posts() ) : the_post(); ?>
<!-- BREADCRUMBS NATIVE -->
<nav class="edukarsa-breadcrumbs" aria-label="Breadcrumb">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>">Beranda</a>
<nav class="edukarsa-breadcrumbs" aria-label="<?php esc_attr_e( 'Breadcrumb', 'edukarsa' ); ?>">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>"><?php esc_html_e( 'Beranda', 'edukarsa' ); ?></a>
<span class="bc-sep">/</span>
<?php
$categories = get_the_category();
@@ -28,27 +18,18 @@ get_header();
?>
<span class="bc-current"><?php the_title(); ?></span>
</nav>
<article id="post-<?php the_ID(); ?>" <?php post_class( 'card-style single-article-card' ); ?>>
<!-- HEADER ARTIKEL -->
<header class="entry-header">
<?php if ( ! empty( $categories ) ) : ?>
<span class="badge-title"><?php echo esc_html( $categories[0]->name ); ?></span>
<?php endif; ?>
<h1 class="single-article-title">
<?php the_title(); ?>
</h1>
<h1 class="single-article-title"><?php the_title(); ?></h1>
<div class="single-meta-bar">
<span>📅 <?php echo get_the_date( 'l, d F Y' ); ?></span>
<span>👤 <?php the_author(); ?></span>
<span>⏱️ <?php echo ceil( str_word_count( strip_tags( get_the_content() ) ) / 200 ); ?> Menit Baca</span>
<span>&#128197; <?php echo get_the_date( 'l, d F Y' ); ?></span>
<span>&#128100; <?php the_author(); ?></span>
<span>&#9201; <?php echo ceil( str_word_count( strip_tags( get_the_content() ) ) / 200 ); ?> Menit Baca</span>
</div>
</header>
<!-- GAMBAR UTAMA DENGAN CAPTION -->
<?php if ( has_post_thumbnail() ) : ?>
<div class="single-featured-image">
<?php the_post_thumbnail( 'full' ); ?>
@@ -57,13 +38,9 @@ get_header();
<?php endif; ?>
</div>
<?php endif; ?>
<!-- ISI ARTIKEL UTAMA -->
<div class="entry-content">
<?php
the_content();
// 1. INTRA-POST PAGINATION (Jika artikel dipecah dengan tag <!--nextpage-->)
wp_link_pages( array(
'before' => '<div class="intra-post-pagination"><span class="page-links-title">' . __( 'Halaman Artikel:', 'edukarsa' ) . '</span>',
'after' => '</div>',
@@ -72,75 +49,56 @@ get_header();
) );
?>
</div>
<!-- TAGS & BAGIKAN ARTIKEL -->
<div class="single-article-footer">
<div class="single-tags-list">
<?php the_tags( '<span class="tag-label">Topik Terkait:</span> ', ' ', '' ); ?>
</div>
<!-- Native Share Buttons (No Plugin) -->
<div class="single-share-bar">
<span class="share-label">Bagikan:</span>
<?php
$share_url = rawurlencode( get_permalink() );
$share_title = rawurlencode( get_the_title() );
?>
<a href="https://wa.me/?text=<?php echo $share_title . '%20' . $share_url; ?>" target="_blank" rel="noopener" class="share-btn share-wa" title="Bagikan ke WhatsApp">WhatsApp</a>
<a href="https://www.facebook.com/sharer/sharer.php?u=<?php echo $share_url; ?>" target="_blank" rel="noopener" class="share-btn share-fb" title="Bagikan ke Facebook">Facebook</a>
<a href="https://twitter.com/intent/tweet?text=<?php echo $share_title; ?>&url=<?php echo $share_url; ?>" target="_blank" rel="noopener" class="share-btn share-tw" title="Bagikan ke X">X / Twitter</a>
<button type="button" class="share-btn share-copy" onclick="navigator.clipboard.writeText('<?php echo esc_js( get_permalink() ); ?>'); alert('Tautan artikel berhasil disalin!');">Salin Tautan</button>
<?php the_tags( '<span class="tag-label">' . esc_html__( 'Topik Terkait:', 'edukarsa' ) . '</span> ', ' ', '' ); ?>
</div>
</div>
</article>
<!-- 2. INTER-POST PAGINATION (Navigasi Berita Sebelumnya & Selanjutnya) -->
<nav class="inter-post-nav">
<?php
$prev_post = get_previous_post();
$next_post = get_next_post();
?>
<div class="nav-box nav-box-prev card-style <?php echo empty($prev_post) ? 'disabled' : ''; ?>">
<?php if ( ! empty( $prev_post ) ) : ?>
<a href="<?php echo esc_url( get_permalink( $prev_post->ID ) ); ?>" class="nav-box-link">
<span class="nav-direction">&laquo; Artikel Sebelumnya</span>
<span class="nav-direction">&laquo; <?php esc_html_e( 'Artikel Sebelumnya', 'edukarsa' ); ?></span>
<h4 class="nav-post-title"><?php echo esc_html( wp_trim_words( $prev_post->post_title, 9, '...' ) ); ?></h4>
</a>
<?php else : ?>
<span class="nav-direction">&laquo; Paling Awal</span>
<h4 class="nav-post-title" style="color:#94a3b8;">Tidak ada artikel sebelumnya</h4>
<span class="nav-direction">&laquo; <?php esc_html_e( 'Paling Awal', 'edukarsa' ); ?></span>
<h4 class="nav-post-title" style="color:#94a3b8;"><?php esc_html_e( 'Tidak ada artikel sebelumnya', 'edukarsa' ); ?></h4>
<?php endif; ?>
</div>
<div class="nav-box nav-box-next card-style <?php echo empty($next_post) ? 'disabled' : ''; ?>">
<?php if ( ! empty( $next_post ) ) : ?>
<a href="<?php echo esc_url( get_permalink( $next_post->ID ) ); ?>" class="nav-box-link text-right">
<span class="nav-direction">Artikel Selanjutnya &raquo;</span>
<span class="nav-direction"><?php esc_html_e( 'Artikel Selanjutnya', 'edukarsa' ); ?> &raquo;</span>
<h4 class="nav-post-title"><?php echo esc_html( wp_trim_words( $next_post->post_title, 9, '...' ) ); ?></h4>
</a>
<?php else : ?>
<div class="text-right">
<span class="nav-direction">Paling Akhir &raquo;</span>
<h4 class="nav-post-title" style="color:#94a3b8;">Tidak ada artikel selanjutnya</h4>
<span class="nav-direction"><?php esc_html_e( 'Paling Akhir', 'edukarsa' ); ?> &raquo;</span>
<h4 class="nav-post-title" style="color:#94a3b8;"><?php esc_html_e( 'Tidak ada artikel selanjutnya', 'edukarsa' ); ?></h4>
</div>
<?php endif; ?>
</div>
</nav>
<?php
if ( comments_open() || get_comments_number() ) :
comments_template();
endif;
?>
<?php endwhile; ?>
</div>
<!-- KOLOM SIDEBAR DINAMIS -->
<div class="single-sidebar-column">
<?php get_sidebar(); ?>
</div>
</div>
</main>
<?php
get_footer();
?>
<?php
get_footer();
+146 -271
View File
@@ -3,9 +3,15 @@ Theme Name: EduKarsa
Theme URI: https://edukarsa.masbudi.my.id
Author: masbudikusuma
Author URI: https://masbudi.my.id
Description: Tema WordPress profesional untuk sekolah dan kampus (Gaya Modern Card Layout).<br><br><strong>Fitur Unggulan Tema:</strong><ul><li><strong>Zero Plugin Dependency:</strong> Berjalan optimal tanpa ketergantungan plugin pihak ketiga (tanpa ACF, Elementor, atau plugin galeri).</li><li><strong>Modular Architecture:</strong> Berkas functions.php berfungsi murni sebagai pemanggil (router), seluruh fungsionalitas diisolasi di folder inc/.</li><li><strong>Hardened Security Native:</strong> Pengecekan eksekusi langsung, HTTP security headers, penonaktifan author enumeration, dan proteksi REST API.</li><li><strong>WCAG 2.1 Accessibility:</strong> Widget aksesibilitas bawaan dengan Web Speech API (suara baca audio) dan kontras tinggi.</li><li><strong>Multilingual Terpadu:</strong> Penerjemah instan sisi depan (ID, EN, AR, ZH, JA) serta panel admin dwibahasa.</li><li><strong>SEO & Structured Data:</strong> Skema data terstruktur JSON-LD native untuk visibilitas mesin pencari.</li></ul>
Version: 1.1.5
Tags: pendidikan, sekolah, universitas, custom-menu, custom-logo, modern-layout, responsive-layout, translation-ready, accessibility-ready, seo-friendly
Description: Tema WordPress native profesional untuk institusi pendidikan, sekolah, madrasah, dan perguruan tinggi dengan arsitektur modern card layout, aksesibilitas WCAG 2.1, serta kecepatan tinggi tanpa plugin pihak ketiga.
Version: 1.1.6
Tested up to: 6.7
Requires at least: 6.0
Requires PHP: 7.4
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: edukarsa
Tags: education, grid-layout, custom-menu, custom-logo, featured-images, translation-ready, wide-blocks, block-styles, full-width-template, theme-options
*/
:root {
@@ -17,17 +23,17 @@ Tags: pendidikan, sekolah, universitas, custom-menu, custom-logo, modern-layout,
--bg-light-blue: #f8fafc;
--bg-white: #ffffff;
--radius: 14px;
--shadow: 0 12px 32px rgba(15, 23, 42, 0.08);
--shadow: 0 12px 32px rgba(15, 23, 42, 0.08);
--font-main: 'Plus Jakarta Sans', system-ui, -apple-system, sans-serif;
}
/* 1. RESET & DASAR */
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: var(--font-main);
color: var(--text-color);
background-color: var(--bg-white);
line-height: 1.7;
body {
font-family: var(--font-main);
color: var(--text-color);
background-color: var(--bg-white);
line-height: 1.7;
font-size: 16px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
@@ -38,6 +44,48 @@ img { max-width: 100%; height: auto; display: block; }
a { text-decoration: none; color: var(--primary-color); transition: 0.3s; }
h1, h2, h3, h4, h5, h6 { color: var(--heading-color); font-weight: 800; line-height: 1.3; }
/* Standar Kelas Wajib WordPress Theme Check */
.screen-reader-text {
border: 0;
clip: rect(1px, 1px, 1px, 1px);
clip-path: inset(50%);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute !important;
width: 1px;
word-wrap: normal !important;
}
.screen-reader-text:focus {
background-color: #f1f5f9;
border-radius: 4px;
box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2);
clip: auto !important;
clip-path: none;
color: var(--primary-color);
display: block;
font-size: 14px;
font-weight: 700;
height: auto;
left: 8px;
line-height: normal;
padding: 12px 20px;
text-decoration: none;
top: 8px;
width: auto;
z-index: 100000;
}
.alignleft { float: left; margin: 0.5em 1.5em 1.5em 0; }
.alignright { float: right; margin: 0.5em 0 1.5em 1.5em; }
.aligncenter { display: block; margin-left: auto; margin-right: auto; clear: both; }
.wp-caption { margin-bottom: 1.5em; max-width: 100%; text-align: center; }
.wp-caption img[class*="wp-image-"] { display: block; margin-left: auto; margin-right: auto; }
.wp-caption-text { font-size: 13px; color: var(--text-muted); margin-top: 6px; font-style: italic; }
.sticky { border-left: 4px solid var(--secondary-color); padding-left: 10px; }
.gallery-caption { font-size: 12px; color: var(--text-muted); text-align: center; }
.bypostauthor { font-weight: inherit; }
/* 2. LAYOUT UTAMA */
.container { max-width: 1200px; margin: 0 auto; padding: 0 20px; }
.text-center { text-align: center; }
@@ -111,11 +159,9 @@ h1, h2, h3, h4, h5, h6 { color: var(--heading-color); font-weight: 800; line-hei
.stat-card-modern .stat-number { font-size: 40px; font-weight: 800; color: var(--primary-color); margin-bottom: 4px; line-height: 1; }
.stat-card-modern .stat-title { font-size: 17px; font-weight: 800; color: var(--heading-color); margin-bottom: 6px; }
.stat-card-modern .stat-desc { font-size: 14px; color: var(--text-muted); line-height: 1.6; margin: 0; }
.edukarsa-sambutan { padding: 45px 0 50px; }
.sambutan-grid { display: grid; grid-template-columns: 360px 1fr; gap: 50px; align-items: start; }
.sambutan-text { color: #475569; font-size: 15px; line-height: 1.8; margin-bottom: 25px; }
.milestone-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; }
.program-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 25px; }
.program-card { padding: 30px 22px; }
@@ -137,15 +183,15 @@ h1, h2, h3, h4, h5, h6 { color: var(--heading-color); font-weight: 800; line-hei
/* FLOATING CTA */
.edukarsa-cta-floating-section { position: relative; z-index: 15; margin-top: -45px; margin-bottom: 20px; }
.cta-floating-card {
background: linear-gradient(135deg, var(--secondary-color), var(--primary-color));
border-radius: 20px;
padding: 35px 45px;
display: flex;
justify-content: space-between;
align-items: center;
box-shadow: 0 18px 40px rgba(0,0,0,0.18);
border: 1px solid rgba(255,255,255,0.2);
.cta-floating-card {
background: linear-gradient(135deg, var(--secondary-color), var(--primary-color));
border-radius: 20px;
padding: 35px 45px;
display: flex;
justify-content: space-between;
align-items: center;
box-shadow: 0 18px 40px rgba(0,0,0,0.18);
border: 1px solid rgba(255,255,255,0.2);
}
.cta-floating-title { font-size: 26px; font-weight: 800; color: #ffffff; margin: 0; letter-spacing: -0.5px; }
.cta-btn-custom { padding: 14px 34px; font-size: 15px; font-weight: 800; box-shadow: 0 4px 15px rgba(0,0,0,0.15); }
@@ -186,24 +232,20 @@ h1, h2, h3, h4, h5, h6 { color: var(--heading-color); font-weight: 800; line-hei
.footer-brand-desc { font-size: 14px; color: rgba(255,255,255,0.8); line-height: 1.7; margin-bottom: 20px; }
.footer-hours-box { display: flex; align-items: center; gap: 12px; background: rgba(255,255,255,0.06); padding: 12px 16px; border-radius: 10px; border: 1px solid rgba(255,255,255,0.1); }
.hours-icon { font-size: 22px; }
.footer-contact-list { list-style: none; padding: 0; margin: 0; }
.footer-contact-list li { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 15px; font-size: 14px; color: rgba(255,255,255,0.85); line-height: 1.6; }
.footer-contact-list li a { color: rgba(255,255,255,0.9); }
.footer-contact-list li a:hover { color: #f39c12; }
.f-icon { font-size: 16px; flex-shrink: 0; margin-top: 2px; }
.footer-links-custom { list-style: none; padding: 0; margin: 0; }
.footer-links-custom li { margin-bottom: 12px; }
.footer-links-custom li a { color: rgba(255,255,255,0.82); font-size: 14px; transition: all 0.25s ease; display: inline-flex; align-items: center; gap: 8px; }
.footer-links-custom li a::before { content: '›'; font-size: 16px; color: var(--secondary-color); font-weight: bold; transition: transform 0.2s; }
.footer-links-custom li a::before { content: ' '; font-size: 16px; color: var(--secondary-color); font-weight: bold; transition: transform 0.2s; }
.footer-links-custom li a:hover { color: #ffffff; padding-left: 5px; }
.footer-links-custom li a:hover::before { transform: translateX(3px); color: #f39c12; }
.footer-social-icons { display: flex; gap: 10px; flex-wrap: wrap; }
.social-btn { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 10px; background: rgba(255,255,255,0.08); color: #ffffff !important; border: 1px solid rgba(255,255,255,0.15); transition: all 0.25s ease; }
.social-btn:hover { background: var(--secondary-color); transform: translateY(-3px); box-shadow: 0 8px 18px rgba(0,0,0,0.25); border-color: transparent; }
.footer-bottom-bar { border-top: 1px solid rgba(255,255,255,0.08); padding: 22px 0; background: rgba(0,0,0,0.15); }
.footer-bottom-inner { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; }
.copyright-text { margin: 0; font-size: 13px; color: rgba(255,255,255,0.65); }
@@ -214,7 +256,7 @@ h1, h2, h3, h4, h5, h6 { color: var(--heading-color); font-weight: 800; line-hei
.sidebar-widget { padding: 25px; margin-bottom: 25px; }
.sidebar-widget-title { font-size: 18px; font-weight: 800; color: var(--heading-color); margin-bottom: 18px; border-bottom: 2px solid var(--primary-color); padding-bottom: 8px; }
/* 10. TYPOGRAPHY KONTEN */
/* 10. TYPOGRAPHY KONTEN & COMMENTS */
.entry-content { font-size: 16px; color: #334155; line-height: 1.85; }
.entry-content p { margin-bottom: 22px; }
.entry-content h2 { font-size: 26px; margin: 35px 0 15px; color: var(--heading-color); }
@@ -223,6 +265,12 @@ h1, h2, h3, h4, h5, h6 { color: var(--heading-color); font-weight: 800; line-hei
.entry-content li { margin-bottom: 8px; }
.entry-content blockquote { margin: 30px 0; padding: 20px 25px; background: #f8fafc; border-left: 4px solid var(--primary-color); font-style: italic; color: #475569; border-radius: 0 8px 8px 0; }
.comments-area { margin-top: 40px; padding-top: 30px; border-top: 1px solid #e2e8f0; }
.comment-list { list-style: none; padding: 0; margin: 0 0 30px; }
.comment-list .comment { margin-bottom: 20px; padding: 18px; background: #f8fafc; border-radius: 10px; border: 1px solid #e2e8f0; }
.comment-author { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
.comment-author img.avatar { border-radius: 50%; }
/* 11. PAGINATION */
.pagination { margin-top: 45px; text-align: center; }
.pagination .nav-links { display: inline-flex; gap: 8px; align-items: center; }
@@ -230,7 +278,9 @@ h1, h2, h3, h4, h5, h6 { color: var(--heading-color); font-weight: 800; line-hei
.pagination .page-numbers.current, .pagination .page-numbers:hover { background: var(--primary-color); color: #fff; border-color: var(--primary-color); }
/* 12. RESPONSIVE MEDIA QUERIES */
@media (max-width: 1024px) { .footer-grid-wrapper { grid-template-columns: repeat(2, 1fr); gap: 35px; } }
@media (max-width: 1024px) {
.footer-grid-wrapper { grid-template-columns: repeat(2, 1fr); gap: 35px; }
}
@media (max-width: 992px) {
.single-layout-wrapper { grid-template-columns: 1fr; }
.program-grid, .milestone-grid, .news-grid { grid-template-columns: repeat(2, 1fr); }
@@ -257,7 +307,6 @@ h1, h2, h3, h4, h5, h6 { color: var(--heading-color); font-weight: 800; line-hei
.menu-toggle.active span:nth-child(1) { transform: translateY(8px) rotate(45deg); }
.menu-toggle.active span:nth-child(2) { opacity: 0; }
.menu-toggle.active span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }
@media (max-width: 768px) {
.menu-toggle { display: flex; }
.main-navigation {
@@ -364,22 +413,13 @@ h1, h2, h3, h4, h5, h6 { color: var(--heading-color); font-weight: 800; line-hei
}
/* 17. BULLETPROOF GOOGLE TRANSLATE BANNER SUPPRESSION */
.goog-te-banner-frame,
.goog-te-banner-frame.skiptranslate,
iframe.goog-te-banner-frame,
.VIpgJd-ZVi9od-ORHb-OEVmcd,
#goog-gt-tt,
.goog-te-balloon-frame {
.goog-te-banner-frame, .goog-te-banner-frame.skiptranslate, iframe.goog-te-banner-frame, .VIpgJd-ZVi9od-ORHb-OEVmcd, #goog-gt-tt, .goog-te-balloon-frame {
display: none !important;
visibility: hidden !important;
height: 0 !important;
width: 0 !important;
opacity: 0 !important;
}
body {
top: 0px !important;
position: static !important;
}
.goog-tooltip, .goog-tooltip:hover { display: none !important; }
.goog-text-highlight { background-color: transparent !important; box-shadow: none !important; }
font { background-color: transparent !important; box-shadow: none !important; }
@@ -424,7 +464,6 @@ font { background-color: transparent !important; box-shadow: none !important; }
.a11y-btn-danger { background: #fee2e2; border-color: #fca5a5; color: #991b1b; }
.a11y-btn-danger:hover { background: #fecaca; color: #7f1d1d; }
/* KELAS STATUS AKSESIBILITAS YANG DITERAPKAN KE BODY */
body.a11y-font-lg { font-size: 18px !important; }
body.a11y-font-lg h1 { font-size: 34px !important; }
body.a11y-font-lg h2 { font-size: 28px !important; }
@@ -433,13 +472,11 @@ body.a11y-font-xl { font-size: 20px !important; }
body.a11y-font-xl h1 { font-size: 38px !important; }
body.a11y-font-xl h2 { font-size: 32px !important; }
body.a11y-font-xl h3 { font-size: 25px !important; }
body.a11y-high-contrast { filter: contrast(160%) !important; }
body.a11y-grayscale { filter: grayscale(100%) !important; }
body.a11y-high-contrast.a11y-grayscale { filter: grayscale(100%) contrast(160%) !important; }
body.a11y-underline-links a { text-decoration: underline !important; text-underline-offset: 3px !important; }
/* STATE BUTTON AKSESIBILITAS SUARA AKTIF */
.a11y-btn.speaking {
background: #10b981 !important;
border-color: #059669 !important;
@@ -466,7 +503,6 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
.edukarsa-breadcrumbs a:hover { text-decoration: underline; }
.bc-sep { color: #cbd5e1; font-weight: bold; }
.bc-current { color: var(--heading-color); font-weight: 600; }
.single-article-card { padding: 40px; margin-bottom: 30px; }
.single-article-title {
font-size: 32px;
@@ -501,7 +537,6 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
font-style: italic;
}
/* INTRA-POST PAGINATION (<!--nextpage-->) */
.intra-post-pagination {
margin-top: 35px;
padding-top: 20px;
@@ -543,7 +578,6 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
color: #ffffff;
}
/* FOOTER ARTIKEL & SHARE BAR */
.single-article-footer {
margin-top: 35px;
padding-top: 25px;
@@ -566,7 +600,6 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
font-weight: 600;
}
.single-tags-list a:hover { background: var(--primary-color); color: #ffffff; }
.single-share-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.share-label { font-size: 13px; font-weight: 700; color: var(--heading-color); margin-right: 4px; }
.share-btn {
@@ -589,7 +622,6 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
.share-copy { background: #475569; color: #ffffff; }
.share-copy:hover { background: #334155; }
/* INTER-POST NAVIGATION (SEBELUMNYA & SELANJUTNYA) */
.inter-post-nav {
display: grid;
grid-template-columns: 1fr 1fr;
@@ -619,7 +651,7 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
.nav-box:hover .nav-post-title { color: var(--primary-color); }
.text-right { text-align: right; }
/* 20. KOMPONEN SIDEBAR NATIVE TERINTEGRASI */
/* 20. KOMPONEN SIDEBAR */
.sidebar-search-form { position: relative; }
.sidebar-search-wrapper { display: flex; position: relative; }
.sidebar-search-input {
@@ -644,7 +676,6 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
cursor: pointer;
padding: 6px;
}
.sidebar-cta-box {
background: linear-gradient(135deg, var(--primary-color), var(--heading-color));
color: #ffffff;
@@ -664,7 +695,6 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
.sidebar-cta-title { font-size: 19px; font-weight: 800; color: #ffffff; margin-bottom: 10px; line-height: 1.35; }
.sidebar-cta-desc { font-size: 13px; opacity: 0.9; margin-bottom: 20px; line-height: 1.6; }
.sidebar-cta-btn { display: inline-block; padding: 10px 26px; font-size: 14px; font-weight: 800; }
.sidebar-recent-list { display: flex; flex-direction: column; gap: 16px; }
.sidebar-recent-item { display: flex; gap: 14px; align-items: center; }
.sidebar-recent-thumb { width: 68px; height: 68px; border-radius: 8px; overflow: hidden; flex-shrink: 0; }
@@ -673,7 +703,6 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
.sidebar-recent-title { font-size: 14px; font-weight: 700; margin: 0; line-height: 1.4; }
.sidebar-recent-title a { color: var(--heading-color); }
.sidebar-recent-title a:hover { color: var(--primary-color); }
.sidebar-category-list { list-style: none; padding: 0; margin: 0; }
.sidebar-category-list li { margin-bottom: 8px; }
.sidebar-cat-link {
@@ -706,173 +735,107 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
color: #ffffff;
}
@media (max-width: 768px) {
.inter-post-nav { grid-template-columns: 1fr; }
.text-right { text-align: left; }
.single-article-card { padding: 25px 20px; }
.single-article-title { font-size: 24px; }
}
/* 21. SIDEBAR CUSTOM HTML BOX */
.sidebar-custom-html-box { padding: 25px; }
.sidebar-html-rendered-content { font-size: 14px; line-height: 1.7; color: var(--text-color); }
.sidebar-html-rendered-content iframe { width: 100% !important; border-radius: 8px; border: none; }
.sidebar-html-rendered-content img { border-radius: 8px; margin: 10px 0; }
/* ---------------------------------------------------------
MODUL GALERI & FASILITAS (GRID + LIGHTBOX)
--------------------------------------------------------- */
/* MODUL GALERI & FASILITAS */
.gallery-filters { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; }
.gallery-filter-btn {
background: #ffffff;
border: 2px solid #e2e8f0;
background: #ffffff;
border: 2px solid #e2e8f0;
color: var(--text-muted);
padding: 8px 22px;
border-radius: 50px;
font-weight: 700;
padding: 8px 22px;
border-radius: 50px;
font-weight: 700;
font-size: 14px;
cursor: pointer;
cursor: pointer;
transition: all 0.3s ease;
}
.gallery-filter-btn:hover, .gallery-filter-btn.active {
background: var(--primary-color);
border-color: var(--primary-color);
background: var(--primary-color);
border-color: var(--primary-color);
color: #ffffff;
box-shadow: 0 4px 12px rgba(11, 74, 142, 0.2);
}
.gallery-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 25px;
}
.gallery-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 25px; }
.gallery-item-card {
background: #ffffff;
border-radius: 14px;
background: #ffffff;
border-radius: 14px;
overflow: hidden;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.04);
cursor: pointer;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.04);
cursor: pointer;
transition: all 0.3s ease;
border: 1px solid #f1f5f9;
}
.gallery-item-card:hover {
transform: translateY(-6px);
box-shadow: 0 15px 35px rgba(11, 74, 142, 0.12);
border-color: var(--secondary-color);
}
.gallery-img-wrapper {
position: relative;
aspect-ratio: 4/3;
overflow: hidden;
background: #f8fafc;
}
.gallery-img-wrapper img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
.gallery-item-card:hover .gallery-img-wrapper img {
transform: scale(1.08);
}
.gallery-item-card:hover { transform: translateY(-6px); box-shadow: 0 15px 35px rgba(11, 74, 142, 0.12); border-color: var(--secondary-color); }
.gallery-img-wrapper { position: relative; aspect-ratio: 4/3; overflow: hidden; background: #f8fafc; }
.gallery-img-wrapper img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94); }
.gallery-item-card:hover .gallery-img-wrapper img { transform: scale(1.08); }
.gallery-overlay {
position: absolute; top: 0; left: 0; right: 0; bottom: 0;
background: linear-gradient(to bottom, rgba(11,74,142,0.2) 0%, rgba(11,74,142,0.8) 100%);
background: linear-gradient(to bottom, rgba(11,74,142,0.2) 0%, rgba(11,74,142,0.8) 100%);
display: flex; align-items: center; justify-content: center;
opacity: 0; transition: opacity 0.3s ease;
}
.gallery-item-card:hover .gallery-overlay { opacity: 1; }
.gallery-zoom-icon {
font-size: 32px; color: #fff;
transform: translateY(20px);
transition: transform 0.3s ease;
filter: drop-shadow(0 4px 6px rgba(0,0,0,0.3));
}
.gallery-zoom-icon { font-size: 32px; color: #fff; transform: translateY(20px); transition: transform 0.3s ease; filter: drop-shadow(0 4px 6px rgba(0,0,0,0.3)); }
.gallery-item-card:hover .gallery-zoom-icon { transform: translateY(0); }
.gallery-item-info { padding: 22px 20px; }
.gallery-item-info h4 { margin: 0 0 10px; font-size: 17px; font-weight: 800; color: var(--heading-color); line-height: 1.4; }
.gallery-cat-badge {
.gallery-cat-badge {
display: inline-block;
font-size: 11px; font-weight: 800;
color: var(--secondary-color);
text-transform: uppercase;
font-size: 11px; font-weight: 800;
color: var(--secondary-color);
text-transform: uppercase;
letter-spacing: 0.5px;
background: #e0f2fe; padding: 4px 12px; border-radius: 20px;
background: #e0f2fe; padding: 4px 12px; border-radius: 20px;
}
/* NATIVE LIGHTBOX (ZOOM EFEK) */
/* NATIVE LIGHTBOX */
.ek-lightbox {
position: fixed; top: 0; left: 0; width: 100%; height: 100%;
background: rgba(15, 23, 42, 0.96); z-index: 9999;
display: flex; align-items: center; justify-content: center;
opacity: 0; visibility: hidden; transition: all 0.3s ease;
opacity: 0; visibility: hidden; transition: all 0.3s ease;
backdrop-filter: blur(8px);
}
.ek-lightbox.show { opacity: 1; visibility: visible; }
.ek-lb-close {
position: absolute; top: 25px; right: 35px; font-size: 45px;
color: rgba(255,255,255,0.6); cursor: pointer; line-height: 1;
.ek-lb-close {
position: absolute; top: 25px; right: 35px; font-size: 45px;
color: rgba(255,255,255,0.6); cursor: pointer; line-height: 1;
transition: color 0.2s, transform 0.2s; z-index: 10;
}
.ek-lb-close:hover { color: #f59e0b; transform: scale(1.1); }
.ek-lb-content {
max-width: 900px; width: 92%; max-height: 90vh;
display: flex; flex-direction: column;
display: flex; flex-direction: column;
background: #ffffff; border-radius: 16px; overflow: hidden;
transform: scale(0.95); transition: transform 0.35s cubic-bezier(0.175, 0.885, 0.32, 1.275);
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
}
.ek-lightbox.show .ek-lb-content { transform: scale(1); }
.ek-lb-img-container {
width: 100%; height: 60vh; background: #000;
display: flex; align-items: center; justify-content: center;
}
.ek-lb-img-container img {
width: 100%; height: 100%; object-fit: contain;
}
.ek-lb-img-container { width: 100%; height: 60vh; background: #000; display: flex; align-items: center; justify-content: center; }
.ek-lb-img-container img { width: 100%; height: 100%; object-fit: contain; }
.ek-lb-caption { padding: 25px 35px; text-align: center; }
.ek-lb-cat {
font-size: 12px; font-weight: 800; color: var(--secondary-color);
text-transform: uppercase; letter-spacing: 1px; display: inline-block;
margin-bottom: 8px; background: #f1f5f9; padding: 4px 14px; border-radius: 20px;
}
.ek-lb-cat { font-size: 12px; font-weight: 800; color: var(--secondary-color); text-transform: uppercase; letter-spacing: 1px; display: inline-block; margin-bottom: 8px; background: #f1f5f9; padding: 4px 14px; border-radius: 20px; }
.ek-lb-caption h3 { margin: 0 0 12px; font-size: 24px; font-weight: 800; color: var(--heading-color); }
.ek-lb-caption p { margin: 0; font-size: 15px; color: var(--text-color); line-height: 1.7; }
/* Tombol Navigasi Lightbox */
.ek-lb-nav {
position: absolute; top: 50%; transform: translateY(-50%);
background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.2);
color: #ffffff; width: 56px; height: 56px; border-radius: 50%;
font-size: 20px; cursor: pointer; transition: all 0.2s ease;
background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.2);
color: #ffffff; width: 56px; height: 56px; border-radius: 50%;
font-size: 20px; cursor: pointer; transition: all 0.2s ease;
display: flex; align-items: center; justify-content: center;
}
.ek-lb-nav:hover { background: var(--primary-color); border-color: var(--primary-color); transform: translateY(-50%) scale(1.1); }
.ek-lb-prev { left: 40px; }
.ek-lb-next { right: 40px; }
@media (max-width: 768px) {
.ek-lb-nav { width: 44px; height: 44px; font-size: 16px; }
.ek-lb-prev { left: 15px; }
.ek-lb-next { right: 15px; }
.ek-lb-close { top: 15px; right: 20px; font-size: 35px; }
.ek-lb-img-container { height: 45vh; }
.ek-lb-caption { padding: 20px; }
.ek-lb-caption h3 { font-size: 20px; }
.gallery-grid { grid-template-columns: 1fr; }
}
/* 22. FIX: HILANGKAN BULLET PADA SUB-MENU DROPDOWN */
.nav-menu-custom .sub-menu,
/* FIX SUB-MENU DROPDOWN */
.nav-menu-custom .sub-menu,
.nav-menu-custom .sub-menu li {
list-style: none !important;
list-style-type: none !important;
@@ -883,139 +846,51 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
}
/* 23. NATIVE POP-UP FLYER MODAL */
body.edukarsa-popup-open {
overflow: hidden;
}
body.edukarsa-popup-open { overflow: hidden; }
.edukarsa-popup-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
position: fixed; top: 0; left: 0; width: 100%; height: 100%;
background-color: rgba(15, 23, 42, 0.78);
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
z-index: 99999;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
opacity: 0;
visibility: hidden;
display: flex; align-items: center; justify-content: center;
padding: 20px; opacity: 0; visibility: hidden;
transition: opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1), visibility 0.3s ease;
}
.edukarsa-popup-overlay.is-visible {
opacity: 1;
visibility: visible;
}
.edukarsa-popup-overlay.is-visible { opacity: 1; visibility: visible; }
.edukarsa-popup-card {
position: relative;
background: #ffffff;
border-radius: 18px;
max-width: 520px;
width: 100%;
max-height: 90vh;
overflow-y: auto;
overflow-x: hidden;
position: relative; background: #ffffff; border-radius: 18px;
max-width: 520px; width: 100%; max-height: 90vh;
overflow-y: auto; overflow-x: hidden;
box-shadow: 0 25px 60px -15px rgba(0, 0, 0, 0.4);
transform: scale(0.92) translateY(15px);
transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
}
.edukarsa-popup-overlay.is-visible .edukarsa-popup-card {
transform: scale(1) translateY(0);
}
.edukarsa-popup-overlay.is-visible .edukarsa-popup-card { transform: scale(1) translateY(0); }
.edukarsa-popup-close {
position: absolute;
top: 14px;
right: 14px;
width: 36px;
height: 36px;
border-radius: 50%;
background: rgba(15, 23, 42, 0.75);
color: #ffffff;
border: 2px solid #ffffff;
font-size: 24px;
line-height: 1;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
z-index: 10;
transition: background 0.2s, transform 0.2s;
}
.edukarsa-popup-close:hover {
background: #e11d48;
transform: scale(1.1);
}
.edukarsa-popup-media {
width: 100%;
background: #0f172a;
display: block;
line-height: 0;
}
.edukarsa-popup-media img {
width: 100%;
height: auto;
max-height: 380px;
object-fit: contain;
display: block;
margin: 0 auto;
}
.edukarsa-popup-img-link {
display: block;
cursor: pointer;
}
.edukarsa-popup-details {
padding: 24px 28px;
text-align: center;
background: #ffffff;
position: absolute; top: 14px; right: 14px; width: 36px; height: 36px;
border-radius: 50%; background: rgba(15, 23, 42, 0.75); color: #ffffff;
border: 2px solid #ffffff; font-size: 24px; line-height: 1;
display: flex; align-items: center; justify-content: center;
cursor: pointer; z-index: 10; transition: background 0.2s, transform 0.2s;
}
.edukarsa-popup-close:hover { background: #e11d48; transform: scale(1.1); }
.edukarsa-popup-media { width: 100%; background: #0f172a; display: block; line-height: 0; }
.edukarsa-popup-media img { width: 100%; height: auto; max-height: 380px; object-fit: contain; display: block; margin: 0 auto; }
.edukarsa-popup-img-link { display: block; cursor: pointer; }
.edukarsa-popup-details { padding: 24px 28px; text-align: center; background: #ffffff; }
.edukarsa-popup-badge {
display: inline-block;
padding: 4px 14px;
background: #e0f2fe;
color: var(--primary-color);
font-size: 11px;
font-weight: 800;
text-transform: uppercase;
letter-spacing: 0.8px;
border-radius: 20px;
display: inline-block; padding: 4px 14px; background: #e0f2fe;
color: var(--primary-color); font-size: 11px; font-weight: 800;
text-transform: uppercase; letter-spacing: 0.8px; border-radius: 20px;
margin-bottom: 10px;
}
.edukarsa-popup-heading {
font-size: 20px;
font-weight: 800;
color: var(--heading-color);
margin: 0 0 10px;
line-height: 1.35;
}
.edukarsa-popup-desc {
font-size: 14px;
color: var(--text-color);
line-height: 1.6;
margin: 0 0 20px;
}
.edukarsa-popup-action {
margin-top: 15px;
}
.edukarsa-popup-heading { font-size: 20px; font-weight: 800; color: var(--heading-color); margin: 0 0 10px; line-height: 1.35; }
.edukarsa-popup-desc { font-size: 14px; color: var(--text-color); line-height: 1.6; margin: 0 0 20px; }
.edukarsa-popup-action { margin-top: 15px; }
.edukarsa-popup-btn {
display: inline-block;
padding: 12px 32px;
font-size: 15px;
font-weight: 800;
border-radius: 50px;
display: inline-block; padding: 12px 32px; font-size: 15px;
font-weight: 800; border-radius: 50px;
box-shadow: 0 6px 18px rgba(11, 74, 142, 0.25);
}
.edukarsa-popup-btn:hover {
transform: translateY(-2px);
box-shadow: 0 10px 25px rgba(11, 74, 142, 0.35);
}
@media (max-width: 600px) {
.edukarsa-popup-card { max-width: 95%; border-radius: 14px; }
.edukarsa-popup-details { padding: 18px 16px; }
.edukarsa-popup-heading { font-size: 18px; }
.edukarsa-popup-desc { font-size: 13px; }
.edukarsa-popup-btn { padding: 10px 24px; font-size: 14px; }
.edukarsa-popup-close { top: 10px; right: 10px; width: 32px; height: 32px; font-size: 20px; }
}
.edukarsa-popup-btn:hover { transform: translateY(-2px); box-shadow: 0 10px 25px rgba(11, 74, 142, 0.35); }