Compare commits

..
1 Commits
Author SHA1 Message Date
masbudikusuma d95675fe76 Upload files to "screenshots" 2026-09-16 15:53:24 +07:00
20 changed files with 1015 additions and 777 deletions
-69
View File
@@ -1,69 +0,0 @@
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
@@ -1,41 +0,0 @@
<?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>
+229 -30
View File
@@ -1,6 +1,8 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
defined( 'ABSPATH' ) || exit;
/**
* Template Footer EduKarsa Modern 4-Kolom
*/
$footer_logo = get_option( 'edukarsa_footer_logo' );
if ( empty( $footer_logo ) ) {
$footer_logo = get_option( 'edukarsa_header_logo' );
@@ -10,12 +12,16 @@ $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 ) ) : ?>
@@ -32,30 +38,31 @@ $wa_def_msg = get_option( 'edukarsa_wa_default_msg', 'Halo Admin EduKarsa, say
if ( ! empty( $jam ) ) :
?>
<div class="footer-hours-box">
<span class="hours-icon">&#128344;</span>
<span class="hours-icon">🕒</span>
<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-size: 11px; text-transform: uppercase; letter-spacing: 0.8px; opacity: 0.8;">Jam Layanan</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"><?php esc_html_e( 'Hubungi Kami', 'edukarsa' ); ?></h4>
<h4 class="footer-col-title">Hubungi Kami</h4>
<ul class="footer-contact-list">
<li>
<span class="f-icon">&#128205;</span>
<span class="f-icon">📍</span>
<span><?php echo nl2br( esc_html( get_option( 'edukarsa_footer_alamat', 'Alamat belum diatur di dashboard' ) ) ); ?></span>
</li>
<li>
<span class="f-icon">&#128222;</span>
<span class="f-icon">📞</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">&#9993;</span>
<span class="f-icon">✉️</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>
@@ -63,9 +70,10 @@ $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"><?php esc_html_e( 'Tautan Penting', 'edukarsa' ); ?></h4>
<nav class="footer-nav-clean" aria-label="<?php esc_attr_e( 'Menu Footer', 'edukarsa' ); ?>">
<h4 class="footer-col-title">Tautan Penting</h4>
<nav class="footer-nav-clean">
<?php
wp_nav_menu( array(
'theme_location' => 'menu-footer',
@@ -78,10 +86,11 @@ $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"><?php esc_html_e( 'Media Sosial', 'edukarsa' ); ?></h4>
<h4 class="footer-col-title">Media Sosial</h4>
<p style="font-size: 13px; opacity: 0.85; margin-bottom: 18px; line-height: 1.5;">
<?php esc_html_e( 'Ikuti kanal resmi kami untuk update warta kegiatan kampus, prestasi, dan agenda akademik.', 'edukarsa' ); ?>
Ikuti kanal resmi kami untuk update warta kegiatan kampus, prestasi, dan agenda akademik.
</p>
<div class="footer-social-icons">
<?php if ( get_option( 'edukarsa_tampil_fb', 1 ) == 1 && get_option( 'edukarsa_footer_fb' ) ) : ?>
@@ -89,80 +98,93 @@ $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', 1 ) == 1 && get_option( 'edukarsa_footer_tiktok' ) ) : ?>
<?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', 1 ) == 1 && get_option( 'edukarsa_footer_x' ) ) : ?>
<?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 esc_html( date( 'Y' ) ); ?> <?php echo esc_html( get_option( 'edukarsa_footer_copyright', 'EduKarsa. All Rights Reserved.' ) ); ?>
&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>
</p>
<div class="footer-bottom-badge">
<span><?php esc_html_e( 'Terakreditasi BAN-PT &bull; Kampus Merdeka', 'edukarsa' ); ?></span>
<span>Terakreditasi BAN-PT &bull; Kampus Merdeka</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="<?php esc_attr_e( 'Buka Menu Aksesibilitas', 'edukarsa' ); ?>" title="<?php esc_attr_e( 'Aksesibilitas Disabilitas', 'edukarsa' ); ?>">
<button type="button" class="edukarsa-a11y-trigger" id="a11y-trigger" aria-label="Buka Menu Aksesibilitas" title="Aksesibilitas Disabilitas">
<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><?php esc_html_e( 'Aksesibilitas', 'edukarsa' ); ?></h4>
<h4>♿ Aksesibilitas</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"><?php esc_html_e( 'Pembaca Suara (Audio)', 'edukarsa' ); ?></span>
<span class="a11y-label">Pembaca Suara (Audio)</span>
<div class="a11y-btn-grid">
<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>
<button type="button" class="a11y-btn" id="a11y-speak-play">🔊 Baca</button>
<button type="button" class="a11y-btn" id="a11y-speak-stop">⏹ Berhenti</button>
</div>
</div>
<div class="a11y-group">
<span class="a11y-label"><?php esc_html_e( 'Ukuran Teks', 'edukarsa' ); ?></span>
<span class="a11y-label">Ukuran Teks</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"><?php esc_html_e( 'Normal', 'edukarsa' ); ?></button>
<button type="button" class="a11y-btn" id="a11y-font-reset">Normal</button>
<button type="button" class="a11y-btn" id="a11y-font-inc">A+</button>
</div>
</div>
<div class="a11y-group">
<span class="a11y-label"><?php esc_html_e( 'Tampilan Visual', 'edukarsa' ); ?></span>
<span class="a11y-label">Tampilan Visual</span>
<div class="a11y-btn-grid">
<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>
<button type="button" class="a11y-btn" id="a11y-contrast">Kontras</button>
<button type="button" class="a11y-btn" id="a11y-grayscale">Monokrom</button>
</div>
</div>
<div class="a11y-group">
<span class="a11y-label"><?php esc_html_e( 'Navigasi', 'edukarsa' ); ?></span>
<span class="a11y-label">Navigasi</span>
<div class="a11y-btn-grid">
<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>
<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>
</div>
</div>
</div>
@@ -170,6 +192,7 @@ $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>
@@ -177,7 +200,183 @@ $wa_def_msg = get_option( 'edukarsa_wa_default_msg', 'Halo Admin EduKarsa, say
</a>
<?php endif; ?>
<button id="back-to-top" class="back-to-top-btn" aria-label="<?php esc_attr_e( 'Kembali ke atas', 'edukarsa' ); ?>">&#8679;</button>
<!-- 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>
<?php wp_footer(); ?>
</body>
+14 -24
View File
@@ -1,28 +1,18 @@
<?php
/**
* File Loader / Router Tema EduKarsa
* Seluruh logika modular ditempatkan di folder inc/
* File ini berfungsi sebagai 'Router/Loader'.
* Seluruh fungsionalitas diisolasi ke dalam sub-berkas direktori inc/.
*/
defined('ABSPATH') || exit; // Hardened Security Native
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';
// 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;
}
}
}
+72 -12
View File
@@ -1,6 +1,4 @@
<?php
defined( 'ABSPATH' ) || exit;
?>
<?php defined( 'ABSPATH' ) || exit; ?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
@@ -9,13 +7,6 @@ defined( 'ABSPATH' ) || exit;
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php
if ( function_exists( 'wp_body_open' ) ) {
wp_body_open();
} else {
do_action( 'wp_body_open' );
}
?>
<header class="site-header">
<div class="container header-container">
@@ -31,8 +22,10 @@ if ( function_exists( 'wp_body_open' ) ) {
<?php endif; ?>
</a>
</div>
<!-- Area Navigasi & Bahasa -->
<div class="header-nav-wrap">
<nav class="main-navigation" id="site-navigation" aria-label="<?php esc_attr_e( 'Menu Utama', 'edukarsa' ); ?>">
<nav class="main-navigation" id="site-navigation">
<?php
wp_nav_menu( array(
'theme_location' => 'menu-utama',
@@ -43,6 +36,8 @@ if ( function_exists( 'wp_body_open' ) ) {
) );
?>
</nav>
<!-- MULTI-LANGUAGE SWITCHER DINAMIS -->
<?php
if ( get_option( 'edukarsa_tampil_bilingual', 1 ) == 1 ) :
$available_langs = array( 'id' => 'ID' );
@@ -50,6 +45,8 @@ if ( function_exists( 'wp_body_open' ) ) {
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 ) );
?>
<div class="edukarsa-lang-switcher" id="lang-switcher">
<?php
@@ -64,11 +61,74 @@ if ( function_exists( 'wp_body_open' ) ) {
</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' ); ?>">
<!-- Tombol Hamburger Mobile -->
<button class="menu-toggle" id="mobile-menu-toggle" aria-label="Buka Menu Navigasi">
<span></span>
<span></span>
<span></span>
</button>
</div>
</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; ?>
+83 -4
View File
@@ -1,7 +1,86 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
/**
* 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).
* Registrasi Seluruh Custom Post Type (CPT) Native EduKarsa
*/
defined( 'ABSPATH' ) || exit;
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');
+55 -6
View File
@@ -1,11 +1,13 @@
<?php
/**
* Hardened Security Native untuk Tema EduKarsa
* Menangani HTTP Headers aman dan pencegahan enumerasi pengguna
* Modul Pengamanan Native Tema EduKarsa
* Mencegah XSS, SQLi, Clickjacking, User Harvesting, dan Information Leakage
*/
defined( 'ABSPATH' ) || exit;
function edukarsa_send_security_headers() {
// 1. INJEKSI NATIVE HTTP SECURITY HEADERS
function edukarsa_security_headers() {
if ( ! is_admin() ) {
header( 'X-Content-Type-Options: nosniff' );
header( 'X-Frame-Options: SAMEORIGIN' );
@@ -13,12 +15,59 @@ function edukarsa_send_security_headers() {
header( 'Referrer-Policy: strict-origin-when-cross-origin' );
}
}
add_action( 'send_headers', 'edukarsa_send_security_headers' );
add_action( 'send_headers', 'edukarsa_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'] ) && ! empty( $_REQUEST['author'] ) ) {
wp_safe_redirect( home_url(), 301 );
if ( ! is_admin() && isset( $_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' );
+36 -71
View File
@@ -1,90 +1,55 @@
<?php
/**
* File ini menangani dukungan tema (Theme Support) dan antrean aset (CSS/JS).
*/
defined('ABSPATH') || exit;
if ( ! function_exists( 'edukarsa_theme_setup' ) ) {
function edukarsa_theme_setup() {
load_theme_textdomain( 'edukarsa', get_template_directory() . '/languages' );
add_theme_support( 'automatic-feed-links' );
// 1. PENGATURAN DASAR
function edukarsa_setup() {
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',
) );
// Pastikan tema mendukung excerpt (kutipan) untuk CPT
add_post_type_support( 'page', 'excerpt' );
register_nav_menus( array(
'menu-utama' => esc_html__( 'Menu Navigasi Utama', 'edukarsa' ),
'menu-footer' => esc_html__( 'Menu Tautan Footer', 'edukarsa' ),
'menu-utama' => __( 'Menu Utama', 'edukarsa' ),
'menu-footer' => __( 'Menu Footer', 'edukarsa' ),
) );
}
}
add_action( 'after_setup_theme', 'edukarsa_theme_setup' );
add_action( 'after_setup_theme', 'edukarsa_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' ),
)
// 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( 'init', 'edukarsa_register_block_components' );
add_action( 'wp_enqueue_scripts', 'edukarsa_scripts' );
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>',
) );
// 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();
}
add_action( 'widgets_init', 'edukarsa_register_sidebars' );
}
add_action( 'admin_enqueue_scripts', 'edukarsa_admin_scripts' );
function edukarsa_enqueue_scripts() {
wp_enqueue_style( 'edukarsa-style', get_stylesheet_uri(), array(), time() );
// 4. REDIRECT SETELAH AKTIVASI TEMA
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 );
// 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( 'wp_enqueue_scripts', 'edukarsa_enqueue_scripts' );
add_action( 'admin_init', 'edukarsa_activation_redirect' );
+28 -11
View File
@@ -1,21 +1,34 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
defined( 'ABSPATH' ) || exit;
/**
* Template Halaman Statis (Page) EduKarsa
* Menampilkan konten halaman penuh dan sidebar kustom yang sinkron dengan single.php
*/
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 HALAMAN -->
<div class="single-content-column">
<?php while ( have_posts() ) : the_post(); ?>
<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>
<!-- Breadcrumbs -->
<nav class="edukarsa-breadcrumbs" aria-label="Breadcrumb">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>">Beranda</a>
<span class="bc-sep">/</span>
<span class="bc-current"><?php the_title(); ?></span>
</nav>
<article id="post-<?php the_ID(); ?>" <?php post_class( 'card-style single-article-card' ); ?>>
<header class="entry-header" style="margin-bottom: 25px; border-bottom: 1px solid #f1f5f9; padding-bottom: 15px;">
<h1 class="single-article-title" style="margin: 0;"><?php the_title(); ?></h1>
<h1 class="single-article-title" style="margin: 0;">
<?php the_title(); ?>
</h1>
</header>
<?php if ( has_post_thumbnail() ) : ?>
<div class="single-featured-image">
<?php the_post_thumbnail( 'full' ); ?>
@@ -24,30 +37,34 @@ get_header();
<?php endif; ?>
</div>
<?php endif; ?>
<div class="entry-content">
<?php
the_content();
// Paginasi internal halaman jika konten dipecah dengan <!--nextpage-->
wp_link_pages( array(
'before' => '<div class="intra-post-pagination"><span class="page-links-title">' . esc_html__( 'Halaman:', 'edukarsa' ) . '</span>',
'before' => '<div class="intra-post-pagination"><span class="page-links-title">' . __( 'Halaman:', 'edukarsa' ) . '</span>',
'after' => '</div>',
'link_before' => '<span class="page-number-box">',
'link_after' => '</span>',
) );
?>
</div>
</article>
<?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();
?>
-35
View File
@@ -1,35 +0,0 @@
=== 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 is a native, modern institutional WordPress theme tailored for schools, Islamic boarding institutions, colleges, and higher education portals.
== Description ==
EduKarsa is developed with a strict "100% Native & Zero Plugin" architecture, delivering maximum speed, stability, and security without relying on bulky third-party builders like Elementor or ACF.
= Key Highlights =
* **Zero Plugin Dependency**: Native hero sliders, program grids, facility lightbox, and announcement modals running solely on core WordPress APIs.
* **WCAG 2.1 Accessibility Suite**: Native floating toolbar equipped with Web Speech API audio reader (Text-to-Speech), high-contrast toggle, monochrome view, and text resizer.
* **Instant Multi-Language Switcher**: Built-in instant translation integration supporting Indonesian, English, Arabic, Chinese, and Japanese.
* **Modern Educational Card Layout**: Contemporary clean design featuring navy blue branding (#0b4a8e), pill buttons, responsive grids, and floating KPI stats cards.
* **Native Section Layout Builder**: Reorder homepage sections via WordPress core drag-and-drop admin panel.
* **Hardened Core Security**: Built-in HTTP security headers and user enumeration prevention.
== Installation ==
1. Navigate to your WordPress Dashboard > Appearance > Themes > Add New.
2. Upload the edukarsa.zip file and click Install Now.
3. Activate the theme.
4. Go to the "EduKarsa" menu on the sidebar to configure institutional profile, branding, contacts, and homepage sections.
== Frequently Asked Questions ==
= Does this theme require page builder plugins? =
No. EduKarsa runs natively on core WordPress Settings API and templates.
== Copyright ==
EduKarsa WordPress Theme, Copyright 2026 Mas Budi Kusuma.
EduKarsa is distributed under the terms of the GNU General Public License v2 or later.
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 KiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 927 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 901 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 973 KiB

-15
View File
@@ -1,15 +0,0 @@
<?php
defined( 'ABSPATH' ) || exit;
?>
<form role="search" method="get" class="search-form edukarsa-search-form" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<label class="search-form-label">
<span class="screen-reader-text"><?php echo esc_html_x( 'Cari untuk:', 'label', 'edukarsa' ); ?></span>
<input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Cari informasi / warta...', 'placeholder', 'edukarsa' ); ?>" value="<?php echo get_search_query(); ?>" name="s" required />
</label>
<button type="submit" class="search-submit" aria-label="<?php echo esc_attr_x( 'Kirim Pencarian', 'submit button', 'edukarsa' ); ?>">
<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<circle cx="11" cy="11" r="8"></circle>
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
</svg>
</button>
</form>
+25 -28
View File
@@ -1,19 +1,25 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
defined( 'ABSPATH' ) || exit;
/**
* Template Sidebar Native EduKarsa
* Dikelola 100% dari Dashboard EduKarsa (Bebas Menu Widget WP)
*/
?>
<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; ?>
<aside id="secondary" class="edukarsa-custom-sidebar">
<!-- 1. Pencarian Cepat Native -->
<?php if ( get_option( 'edukarsa_sidebar_tampil_search', 1 ) == 1 ) : ?>
<div class="card-style sidebar-widget">
<?php get_search_form(); ?>
<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>
</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>
@@ -27,6 +33,7 @@ defined( 'ABSPATH' ) || exit;
</div>
<?php endif; ?>
<!-- 3. BOX HTML KUSTOM NATIVE (Maps, Widget Luar, Teks Tambahan) -->
<?php
if ( get_option( 'edukarsa_sidebar_tampil_html', 0 ) == 1 ) :
$html_content = get_option( 'edukarsa_sidebar_html_content' );
@@ -46,6 +53,7 @@ defined( 'ABSPATH' ) || exit;
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>
@@ -57,6 +65,7 @@ defined( 'ABSPATH' ) || exit;
'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();
?>
@@ -67,7 +76,7 @@ defined( 'ABSPATH' ) || exit;
</a>
<?php endif; ?>
<div class="sidebar-recent-info">
<span class="sidebar-recent-date">&#128197; <?php echo get_the_date( 'd M Y' ); ?></span>
<span class="sidebar-recent-date">📅 <?php echo get_the_date( 'd M Y' ); ?></span>
<h4 class="sidebar-recent-title">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h4>
@@ -77,29 +86,20 @@ defined( 'ABSPATH' ) || exit;
endwhile;
wp_reset_postdata();
else :
echo '<p style="font-size:13px; color:var(--text-muted); margin:0;">' . esc_html__( 'Belum ada artikel lainnya.', 'edukarsa' ) . '</p>';
echo '<p style="font-size:13px; color:var(--text-muted); margin:0;">Belum ada artikel lainnya.</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>
<ul class="sidebar-category-list">
<?php
$cat_limit = intval( get_option( 'edukarsa_sidebar_cats_count', 10 ) );
$cat_args = array(
'hide_empty' => true,
'orderby' => 'count',
'order' => 'DESC',
);
if ( $cat_limit > 0 ) {
$cat_args['number'] = $cat_limit;
}
$categories = get_categories( $cat_args );
if ( ! empty( $categories ) ) :
$categories = get_categories( array( 'hide_empty' => true ) );
foreach ( $categories as $category ) :
?>
<li>
@@ -108,16 +108,12 @@ defined( 'ABSPATH' ) || exit;
<span class="sidebar-cat-count"><?php echo esc_html( $category->count ); ?></span>
</a>
</li>
<?php
endforeach;
else :
echo '<li style="font-size:13px; color:var(--text-muted);">' . esc_html__( 'Belum ada kategori.', 'edukarsa' ) . '</li>';
endif;
?>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<!-- 6. Banner Poster Sidebar -->
<?php
$banner_img = get_option( 'edukarsa_sidebar_banner_img' );
if ( ! empty( $banner_img ) ) :
@@ -125,8 +121,9 @@ defined( 'ABSPATH' ) || exit;
?>
<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="<?php esc_attr_e( 'Banner Pengumuman', 'edukarsa' ); ?>" style="width: 100%; height: auto; border-radius: 8px; display: block;">
<img src="<?php echo esc_url( $banner_img ); ?>" alt="Banner Pengumuman" style="width: 100%; height: auto; border-radius: 8px; display: block;">
</a>
</div>
<?php endif; ?>
</aside>
+62 -20
View File
@@ -1,13 +1,23 @@
<?php defined( 'ABSPATH' ) || exit; ?>
<?php
defined( 'ABSPATH' ) || exit;
/**
* Template Baca Artikel Penuh (Single Post) EduKarsa
* Dilengkapi Breadcrumbs, Intra-post Paging, Inter-post Paging, dan Native Social Share
*/
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(); ?>
<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>
<!-- BREADCRUMBS NATIVE -->
<nav class="edukarsa-breadcrumbs" aria-label="Breadcrumb">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>">Beranda</a>
<span class="bc-sep">/</span>
<?php
$categories = get_the_category();
@@ -18,18 +28,27 @@ 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>&#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>
<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>
</div>
</header>
<!-- GAMBAR UTAMA DENGAN CAPTION -->
<?php if ( has_post_thumbnail() ) : ?>
<div class="single-featured-image">
<?php the_post_thumbnail( 'full' ); ?>
@@ -38,9 +57,13 @@ 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>',
@@ -49,56 +72,75 @@ get_header();
) );
?>
</div>
<!-- TAGS & BAGIKAN ARTIKEL -->
<div class="single-article-footer">
<div class="single-tags-list">
<?php the_tags( '<span class="tag-label">' . esc_html__( 'Topik Terkait:', 'edukarsa' ) . '</span> ', ' ', '' ); ?>
<?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>
</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; <?php esc_html_e( 'Artikel Sebelumnya', 'edukarsa' ); ?></span>
<span class="nav-direction">&laquo; Artikel Sebelumnya</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; <?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>
<span class="nav-direction">&laquo; Paling Awal</span>
<h4 class="nav-post-title" style="color:#94a3b8;">Tidak ada artikel sebelumnya</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"><?php esc_html_e( 'Artikel Selanjutnya', 'edukarsa' ); ?> &raquo;</span>
<span class="nav-direction">Artikel Selanjutnya &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"><?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>
<span class="nav-direction">Paling Akhir &raquo;</span>
<h4 class="nav-post-title" style="color:#94a3b8;">Tidak ada artikel selanjutnya</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();
?>
+284 -284
View File
@@ -3,15 +3,9 @@ Theme Name: EduKarsa
Theme URI: https://edukarsa.masbudi.my.id
Author: masbudikusuma
Author URI: https://masbudi.my.id
Description: EduKarsa is a modern, responsive, and lightweight WordPress theme engineered for schools, universities, Islamic colleges, and academic institutions. Built with a 100% native zero-plugin architecture, it features a contemporary floating card layout, built-in WCAG 2.1 AAA accessibility tools (Text-to-Speech audio reader, high contrast, font scaler), an instant 5-language frontend switcher (Indonesian, English, Arabic, Chinese, Japanese), SEO structured data schema, and a native drag-and-drop homepage section builder.
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
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
*/
:root {
@@ -42,55 +36,7 @@ body {
}
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;
overflow-wrap: break-word;
word-break: break-word;
}
/* 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; }
h1, h2, h3, h4, h5, h6 { color: var(--heading-color); font-weight: 800; line-height: 1.3; }
/* 2. LAYOUT UTAMA */
.container { max-width: 1200px; margin: 0 auto; padding: 0 20px; }
@@ -99,62 +45,37 @@ h1, h2, h3, h4, h5, h6 {
.edukarsa-section { padding: 50px 0; }
.section-title { font-size: 30px; color: var(--heading-color); margin-bottom: 12px; font-weight: 800; letter-spacing: -0.5px; }
/* 3. HEADER & RESPONSIVE NAV */
.site-header { position: sticky; top: 0; z-index: 999; box-shadow: 0 4px 15px rgba(0,0,0,0.12); padding: 12px 0; background-color: var(--primary-color); }
.header-container { display: flex; justify-content: space-between; align-items: center; gap: 15px; }
.site-branding { flex-shrink: 0; }
/* 3. HEADER & NAV */
.site-header { position: sticky; top: 0; z-index: 999; box-shadow: 0 4px 15px rgba(0,0,0,0.12); padding: 15px 0; background-color: var(--primary-color); }
.header-container { display: flex; justify-content: space-between; align-items: center; }
.logo-link { display: flex; align-items: center; gap: 15px; color: #fff; }
.site-title { margin: 0; font-size: 20px; font-weight: 800; color: #fff; letter-spacing: -0.5px; white-space: nowrap; }
.header-nav-wrap { display: flex; align-items: center; gap: 14px; justify-content: flex-end; flex: 1; min-width: 0; }
.main-navigation { min-width: 0; }
.nav-menu-custom {
list-style: none;
display: flex;
align-items: center;
gap: 16px;
margin: 0;
padding: 0;
flex-wrap: wrap;
}
.nav-menu-custom li { position: relative; }
.nav-menu-custom li a {
display: block;
color: #ffffff;
font-weight: 700;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 0.4px;
padding: 6px 0;
white-space: nowrap;
}
.site-title { margin: 0; font-size: 22px; font-weight: 800; color: #fff; letter-spacing: -0.5px; }
.header-nav-wrap { display: flex; align-items: center; gap: 20px; }
.nav-menu-custom { list-style: none; display: flex; gap: 25px; margin: 0; padding: 0; }
.nav-menu-custom li a { display: block; color: #ffffff; font-weight: 600; font-size: 14px; text-transform: uppercase; letter-spacing: 0.8px; padding: 10px 0; }
.nav-menu-custom li a:hover { color: #f39c12; }
/* DROPDOWN MENU */
/* DROPDOWN */
.nav-menu-custom li { position: relative; }
.nav-menu-custom .sub-menu {
position: absolute;
top: 100%;
left: 0;
background-color: var(--primary-color);
min-width: 220px;
padding: 8px 0;
padding: 10px 0;
border-radius: 0 0 8px 8px;
box-shadow: 0 10px 25px rgba(0,0,0,0.25);
box-shadow: 0 10px 25px rgba(0,0,0,0.2);
opacity: 0;
visibility: hidden;
transform: translateY(12px);
transition: all 0.25s ease;
transform: translateY(15px);
transition: all 0.3s ease;
z-index: 1000;
}
.nav-menu-custom li:hover > .sub-menu { opacity: 1; visibility: visible; transform: translateY(0); }
.nav-menu-custom .sub-menu li a {
padding: 8px 18px;
font-size: 13px;
text-transform: none;
border-bottom: 1px solid rgba(255,255,255,0.06);
white-space: nowrap;
}
.nav-menu-custom .sub-menu li a { padding: 10px 20px; font-size: 14px; text-transform: none; border-bottom: 1px solid rgba(255,255,255,0.05); }
.nav-menu-custom .sub-menu li:last-child a { border-bottom: none; }
.nav-menu-custom .sub-menu .sub-menu { top: 0; left: 100%; transform: translateX(12px); }
.nav-menu-custom .sub-menu .sub-menu { top: 0; left: 100%; transform: translateX(15px); }
.nav-menu-custom .sub-menu li:hover > .sub-menu { transform: translateX(0); }
/* 4. SLIDER */
@@ -190,9 +111,11 @@ h1, h2, h3, h4, h5, h6 {
.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; }
@@ -263,20 +186,24 @@ h1, h2, h3, h4, h5, h6 {
.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); }
@@ -287,8 +214,8 @@ h1, h2, h3, h4, h5, h6 {
.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 & COMMENTS */
.entry-content { font-size: 16px; color: #334155; line-height: 1.85; overflow-wrap: break-word; word-break: break-word; }
/* 10. TYPOGRAPHY KONTEN */
.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); }
.entry-content h3 { font-size: 21px; margin: 28px 0 12px; color: var(--heading-color); }
@@ -296,12 +223,6 @@ h1, h2, h3, h4, h5, h6 {
.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; }
@@ -309,9 +230,7 @@ h1, h2, h3, h4, h5, h6 {
.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); }
@@ -321,6 +240,7 @@ h1, h2, h3, h4, h5, h6 {
}
@media (max-width: 768px) {
.header-container { flex-direction: row; }
.nav-menu-custom { flex-wrap: wrap; justify-content: center; }
.footer-grid-wrapper { grid-template-columns: 1fr; gap: 30px; }
.footer-bottom-inner { flex-direction: column; text-align: center; }
.program-grid, .milestone-grid, .news-grid { grid-template-columns: 1fr; }
@@ -331,19 +251,20 @@ h1, h2, h3, h4, h5, h6 {
.cta-floating-title { font-size: 20px; }
}
/* 13. MOBILE MENU TOGGLE & DRAWER (SWITCH AT 992px) */
.menu-toggle { display: none; background: transparent; border: none; cursor: pointer; padding: 8px; flex-direction: column; gap: 5px; z-index: 1001; }
.menu-toggle span { display: block; width: 24px; height: 3px; background-color: #ffffff; border-radius: 3px; transition: all 0.3s ease; }
/* 13. MOBILE MENU TOGGLE & DRAWER */
.menu-toggle { display: none; background: transparent; border: none; cursor: pointer; padding: 10px; flex-direction: column; gap: 5px; z-index: 1001; }
.menu-toggle span { display: block; width: 26px; height: 3px; background-color: #ffffff; border-radius: 3px; transition: all 0.3s ease; }
.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: 992px) {
@media (max-width: 768px) {
.menu-toggle { display: flex; }
.main-navigation {
position: fixed;
top: 0;
right: -100%;
width: 300px;
width: 280px;
height: 100vh;
background: var(--primary-color);
box-shadow: -5px 0 25px rgba(0,0,0,0.3);
@@ -416,7 +337,6 @@ h1, h2, h3, h4, h5, h6 {
padding: 3px 8px;
border-radius: 20px;
backdrop-filter: blur(4px);
flex-shrink: 0;
}
.lang-btn {
background: transparent;
@@ -444,13 +364,22 @@ h1, h2, h3, h4, h5, h6 {
}
/* 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; }
@@ -495,6 +424,7 @@ 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; }
@@ -503,11 +433,13 @@ 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;
@@ -534,6 +466,7 @@ 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;
@@ -568,6 +501,7 @@ 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;
@@ -609,6 +543,7 @@ 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;
@@ -631,6 +566,7 @@ 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 {
@@ -653,6 +589,7 @@ 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;
@@ -682,64 +619,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. SIDEBAR KATEGORI DENGAN LIMIT & SCROLLABLE CONTAINER */
.sidebar-category-list {
list-style: none;
padding: 0;
margin: 0;
max-height: 380px;
overflow-y: auto;
padding-right: 6px;
}
.sidebar-category-list::-webkit-scrollbar {
width: 5px;
}
.sidebar-category-list::-webkit-scrollbar-track {
background: #f1f5f9;
border-radius: 4px;
}
.sidebar-category-list::-webkit-scrollbar-thumb {
background: #cbd5e1;
border-radius: 4px;
}
.sidebar-category-list::-webkit-scrollbar-thumb:hover {
background: #94a3b8;
}
.sidebar-category-list li { margin-bottom: 8px; }
.sidebar-cat-link {
display: flex;
justify-content: space-between;
align-items: center;
padding: 9px 14px;
background: #f8fafc;
border: 1px solid #f1f5f9;
border-radius: 6px;
font-size: 13px;
font-weight: 600;
color: var(--text-color);
transition: all 0.2s ease;
word-break: break-word;
}
.sidebar-cat-link:hover {
background: var(--primary-color);
color: #ffffff;
border-color: var(--primary-color);
}
.sidebar-cat-count {
padding: 2px 8px;
background: rgba(0,0,0,0.06);
border-radius: 12px;
font-size: 11px;
font-weight: 800;
flex-shrink: 0;
margin-left: 8px;
}
.sidebar-cat-link:hover .sidebar-cat-count {
background: rgba(255,255,255,0.25);
color: #ffffff;
}
/* 21. SIDEBAR SEARCH & HTML BOX */
/* 20. KOMPONEN SIDEBAR NATIVE TERINTEGRASI */
.sidebar-search-form { position: relative; }
.sidebar-search-wrapper { display: flex; position: relative; }
.sidebar-search-input {
@@ -764,6 +644,7 @@ 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;
@@ -783,6 +664,7 @@ 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; }
@@ -792,12 +674,54 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
.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 {
display: flex;
justify-content: space-between;
align-items: center;
padding: 9px 14px;
background: #f8fafc;
border: 1px solid #f1f5f9;
border-radius: 6px;
font-size: 13px;
font-weight: 600;
color: var(--text-color);
transition: all 0.2s ease;
}
.sidebar-cat-link:hover {
background: var(--primary-color);
color: #ffffff;
border-color: var(--primary-color);
}
.sidebar-cat-count {
padding: 2px 8px;
background: rgba(0,0,0,0.06);
border-radius: 12px;
font-size: 11px;
font-weight: 800;
}
.sidebar-cat-link:hover .sidebar-cat-count {
background: rgba(255,255,255,0.25);
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 */
/* ---------------------------------------------------------
MODUL GALERI & FASILITAS (GRID + LIGHTBOX)
--------------------------------------------------------- */
.gallery-filters { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; }
.gallery-filter-btn {
background: #ffffff;
@@ -816,7 +740,13 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
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;
@@ -826,10 +756,28 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
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%);
@@ -837,8 +785,15 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
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 {
@@ -850,7 +805,7 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
background: #e0f2fe; padding: 4px 12px; border-radius: 20px;
}
/* NATIVE LIGHTBOX */
/* NATIVE LIGHTBOX (ZOOM EFEK) */
.ek-lightbox {
position: fixed; top: 0; left: 0; width: 100%; height: 100%;
background: rgba(15, 23, 42, 0.96); z-index: 9999;
@@ -859,12 +814,14 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
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;
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;
@@ -873,12 +830,25 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
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);
@@ -890,7 +860,18 @@ body.a11y-underline-links a { text-decoration: underline !important; text-underl
.ek-lb-prev { left: 40px; }
.ek-lb-next { right: 40px; }
/* FIX SUB-MENU DROPDOWN */
@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,
.nav-menu-custom .sub-menu li {
list-style: none !important;
@@ -902,120 +883,139 @@ 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; }
.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;
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-btn {
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); }
/* 22. MODERN NATIVE SEARCH FORM */
.search-form.edukarsa-search-form,
.search-form {
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;
position: relative;
width: 100%;
margin: 0;
}
.search-form .search-form-label,
.search-form label {
flex: 1;
margin: 0;
position: relative;
width: 100%;
display: block;
}
.search-form .search-field {
width: 100%;
padding: 13px 52px 13px 20px;
background-color: #f8fafc;
border: 1.5px solid #e2e8f0;
border-radius: 50px;
font-size: 14px;
font-weight: 500;
color: var(--heading-color);
outline: none;
transition: all 0.25s ease;
font-family: inherit;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.03);
}
.search-form .search-field::placeholder {
color: #94a3b8;
font-size: 13.5px;
}
.search-form .search-field:focus {
background-color: #ffffff;
border-color: var(--secondary-color);
box-shadow: 0 0 0 4px rgba(26, 115, 232, 0.12);
}
.search-form .search-submit {
position: absolute;
right: 5px;
top: 50%;
transform: translateY(-50%);
width: 38px;
height: 38px;
border-radius: 50%;
background: linear-gradient(135deg, var(--secondary-color), var(--primary-color));
color: #ffffff;
border: none;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
transition: all 0.25s ease;
padding: 0;
box-shadow: 0 4px 12px rgba(11, 74, 142, 0.25);
cursor: pointer;
z-index: 10;
transition: background 0.2s, transform 0.2s;
}
.search-form .search-submit:hover {
background: var(--primary-color);
transform: translateY(-50%) scale(1.05);
box-shadow: 0 6px 16px rgba(11, 74, 142, 0.35);
.edukarsa-popup-close:hover {
background: #e11d48;
transform: scale(1.1);
}
.search-form .search-submit svg {
.edukarsa-popup-media {
width: 100%;
background: #0f172a;
display: block;
stroke: #ffffff;
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;
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-btn {
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; }
}