feat: tambahkan toggle kontrol visibilitas FAQ dan modul aksesibilitas disabilitas WCAG

This commit is contained in:
Mas Budi Kusuma
2026-09-15 23:50:05 +07:00
parent 9dd84e2c23
commit 3b8d105623
3 changed files with 223 additions and 6 deletions
+137
View File
@@ -136,6 +136,48 @@ if ( substr( $wa_clean, 0, 1 ) === '0' ) {
</div> </div>
</footer> </footer>
<!-- WIDGET AKSESIBILITAS DISABILITAS NATIVE -->
<?php if ( get_option( 'edukarsa_tampil_accessibility', 1 ) == 1 ) : ?>
<div class="edukarsa-a11y-wrapper" id="a11y-wrapper">
<button type="button" class="edukarsa-a11y-trigger" id="a11y-trigger" aria-label="Buka Menu Aksesibilitas" title="Aksesibilitas Disabilitas">
<svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z"/></svg>
</button>
<div class="edukarsa-a11y-panel" id="a11y-panel">
<div class="a11y-panel-header">
<h4>♿ Aksesibilitas</h4>
<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">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">Normal</button>
<button type="button" class="a11y-btn" id="a11y-font-inc">A+</button>
</div>
</div>
<div class="a11y-group">
<span class="a11y-label">Tampilan Visual</span>
<div class="a11y-btn-grid">
<button type="button" class="a11y-btn" id="a11y-contrast">Kontras</button>
<button type="button" class="a11y-btn" id="a11y-grayscale">Monokrom</button>
</div>
</div>
<div class="a11y-group">
<span class="a11y-label">Navigasi</span>
<div class="a11y-btn-grid">
<button type="button" class="a11y-btn" id="a11y-links">Garis Tautan</button>
<button type="button" class="a11y-btn a11y-btn-danger" id="a11y-reset-all">Reset</button>
</div>
</div>
</div>
</div>
</div>
<?php endif; ?>
<!-- FLOATING WHATSAPP --> <!-- FLOATING WHATSAPP -->
<?php if ( ! empty( $wa_clean ) ) : ?> <?php if ( ! empty( $wa_clean ) ) : ?>
<a href="https://wa.me/<?php echo esc_attr( $wa_clean ); ?>?text=Halo%20Admin%20EduKarsa,%20saya%20ingin%20bertanya%20mengenai%20pendaftaran." target="_blank" rel="noopener" class="edukarsa-wa-float" title="Chat WhatsApp Panitia PMB"> <a href="https://wa.me/<?php echo esc_attr( $wa_clean ); ?>?text=Halo%20Admin%20EduKarsa,%20saya%20ingin%20bertanya%20mengenai%20pendaftaran." target="_blank" rel="noopener" class="edukarsa-wa-float" title="Chat WhatsApp Panitia PMB">
@@ -149,6 +191,7 @@ if ( substr( $wa_clean, 0, 1 ) === '0' ) {
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
// 1. Mobile Menu Drawer
const toggleBtn = document.getElementById("mobile-menu-toggle"); const toggleBtn = document.getElementById("mobile-menu-toggle");
const navMenu = document.getElementById("site-navigation"); const navMenu = document.getElementById("site-navigation");
if (toggleBtn && navMenu) { if (toggleBtn && navMenu) {
@@ -158,6 +201,7 @@ if ( substr( $wa_clean, 0, 1 ) === '0' ) {
}); });
} }
// 2. Back to Top
const bttBtn = document.getElementById("back-to-top"); const bttBtn = document.getElementById("back-to-top");
if (bttBtn) { if (bttBtn) {
window.addEventListener("scroll", function() { window.addEventListener("scroll", function() {
@@ -167,6 +211,99 @@ if ( substr( $wa_clean, 0, 1 ) === '0' ) {
window.scrollTo({ top: 0, behavior: "smooth" }); window.scrollTo({ top: 0, behavior: "smooth" });
}); });
} }
// 3. Aksesibilitas Disabilitas Logic (Persistent via localStorage)
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();
});
}
}); });
</script> </script>
+31 -6
View File
@@ -45,6 +45,7 @@ function edukarsa_register_settings() {
$options = array( $options = array(
'edukarsa_font_choice', 'edukarsa_primary_color', 'edukarsa_secondary_color', 'edukarsa_heading_color', 'edukarsa_font_choice', 'edukarsa_primary_color', 'edukarsa_secondary_color', 'edukarsa_heading_color',
'edukarsa_tampil_bilingual', 'edukarsa_lang_en', 'edukarsa_lang_ar', 'edukarsa_lang_zh', 'edukarsa_lang_ja', 'edukarsa_tampil_bilingual', 'edukarsa_lang_en', 'edukarsa_lang_ar', 'edukarsa_lang_zh', 'edukarsa_lang_ja',
'edukarsa_tampil_accessibility',
'edukarsa_tampil_slider', 'edukarsa_tampil_stats', 'edukarsa_tampil_about', 'edukarsa_tampil_milestone', 'edukarsa_tampil_program', 'edukarsa_tampil_video', 'edukarsa_tampil_keunggulan', 'edukarsa_tampil_cta', 'edukarsa_tampil_faq', 'edukarsa_tampil_news', 'edukarsa_tampil_slider', 'edukarsa_tampil_stats', 'edukarsa_tampil_about', 'edukarsa_tampil_milestone', 'edukarsa_tampil_program', 'edukarsa_tampil_video', 'edukarsa_tampil_keunggulan', 'edukarsa_tampil_cta', 'edukarsa_tampil_faq', 'edukarsa_tampil_news',
'edukarsa_header_logo', 'edukarsa_header_logo',
'edukarsa_milestone_subtitle', 'edukarsa_milestone_title', 'edukarsa_milestone_subtitle', 'edukarsa_milestone_title',
@@ -142,7 +143,7 @@ function edukarsa_settings_page_html() {
<div class="edukarsa-admin-layout"> <div class="edukarsa-admin-layout">
<div class="edukarsa-admin-main"> <div class="edukarsa-admin-main">
<!-- 1. Header, Logo, Slider & Multilingual Switcher --> <!-- 1. Header, Logo, Slider, Bahasa & Aksesibilitas -->
<div class="edukarsa-card"> <div class="edukarsa-card">
<div class="edukarsa-card-header"><h2>🏛️ 1. Header, Logo & Slider</h2></div> <div class="edukarsa-card-header"><h2>🏛️ 1. Header, Logo & Slider</h2></div>
<div class="edukarsa-card-body"> <div class="edukarsa-card-body">
@@ -169,8 +170,7 @@ function edukarsa_settings_page_html() {
</label> </label>
</div> </div>
<!-- Checkbox Pilihan Bahasa Tambahan --> <div id="lang-options-box" style="background: #f8fafc; border: 1px dashed #cbd5e1; border-radius: 8px; padding: 14px 18px; margin-bottom: 14px;">
<div id="lang-options-box" style="background: #f8fafc; border: 1px dashed #cbd5e1; border-radius: 8px; padding: 14px 18px; margin-bottom: 16px;">
<span style="font-weight: 700; font-size: 12px; color: #475569; display: block; margin-bottom: 10px;">Bahasa Tambahan yang Diaktifkan:</span> <span style="font-weight: 700; font-size: 12px; color: #475569; display: block; margin-bottom: 10px;">Bahasa Tambahan yang Diaktifkan:</span>
<div style="display: flex; gap: 20px; flex-wrap: wrap;"> <div style="display: flex; gap: 20px; flex-wrap: wrap;">
<label style="font-size: 13px; font-weight: 600; color: #334155; cursor: pointer;"> <label style="font-size: 13px; font-weight: 600; color: #334155; cursor: pointer;">
@@ -188,6 +188,21 @@ function edukarsa_settings_page_html() {
</div> </div>
</div> </div>
<!-- Opsi Fitur Aksesibilitas Disabilitas -->
<div class="switch-row" style="background: #f0fdf4; border-color: #bbf7d0;">
<div class="switch-label-wrap">
<div class="switch-label" style="color: #166534;">
<span>♿ Fitur Aksesibilitas Disabilitas (WCAG Toolbar)</span>
<span class="tooltip-hint">?<span class="tooltip-text">Menampilkan tombol melayang di pojok kiri bawah untuk pengunjung berkebutuhan khusus (ukuran huruf, kontras, monokrom, garis tautan).</span></span>
</div>
<span style="font-size: 11px; color: #15803d;">Toolbar ramah disabilitas yang dapat dioperasikan langsung oleh pengunjung situs.</span>
</div>
<label class="edukarsa-switch">
<input type="checkbox" name="edukarsa_tampil_accessibility" value="1" <?php checked(1, get_option('edukarsa_tampil_accessibility', 1)); ?>>
<span class="slider-round"></span>
</label>
</div>
<div class="switch-row-inline" style="margin-top: 15px;"> <div class="switch-row-inline" style="margin-top: 15px;">
<div class="switch-row"> <div class="switch-row">
<div class="switch-label-wrap"> <div class="switch-label-wrap">
@@ -332,13 +347,22 @@ function edukarsa_settings_page_html() {
<div class="switch-label-wrap"><span class="switch-label">Tampilkan CTA Banner</span><span style="font-size: 11px; color: #64748b;">Pengaturan Khusus PPDB</span></div> <div class="switch-label-wrap"><span class="switch-label">Tampilkan CTA Banner</span><span style="font-size: 11px; color: #64748b;">Pengaturan Khusus PPDB</span></div>
<label class="edukarsa-switch"><input type="checkbox" class="section-toggle" data-target="#cta-settings-box" name="edukarsa_tampil_cta" value="1" <?php checked(1, get_option('edukarsa_tampil_cta', 1)); ?>><span class="slider-round"></span></label> <label class="edukarsa-switch"><input type="checkbox" class="section-toggle" data-target="#cta-settings-box" name="edukarsa_tampil_cta" value="1" <?php checked(1, get_option('edukarsa_tampil_cta', 1)); ?>><span class="slider-round"></span></label>
</div> </div>
<!-- Toggle FAQ (Sembunyikan/Aktifkan tanpa menghapus CPT) -->
<div class="switch-row"> <div class="switch-row">
<div class="switch-label-wrap"> <div class="switch-label-wrap">
<div class="switch-label"><span>Tampilkan Seksi FAQ</span><span class="tooltip-hint">?<span class="tooltip-text">Daftar tanya jawab diisi lewat menu ❓ Tanya Jawab (FAQ).</span></span></div> <div class="switch-label">
<a href="<?php echo admin_url('edit.php?post_type=faq'); ?>" class="cpt-shortcut-link">Kelola FAQ ↗</a> <span>Tampilkan Seksi FAQ</span>
<span class="tooltip-hint">?<span class="tooltip-text">Jika dimatikan, seksi FAQ disembunyikan dari beranda. Seluruh item FAQ yang sudah dibuat tetap tersimpan aman.</span></span>
</div> </div>
<label class="edukarsa-switch"><input type="checkbox" class="section-toggle" data-target="#faq-settings-box" name="edukarsa_tampil_faq" value="1" <?php checked(1, get_option('edukarsa_tampil_faq', 1)); ?>><span class="slider-round"></span></label> <a href="<?php echo admin_url('edit.php?post_type=faq'); ?>" class="cpt-shortcut-link">Kelola Data FAQ ↗</a>
</div> </div>
<label class="edukarsa-switch">
<input type="checkbox" class="section-toggle" data-target="#faq-settings-box" name="edukarsa_tampil_faq" value="1" <?php checked(1, get_option('edukarsa_tampil_faq', 1)); ?>>
<span class="slider-round"></span>
</label>
</div>
<div class="switch-row"> <div class="switch-row">
<div class="switch-label-wrap"><div class="switch-label"><span>Tampilkan Berita Kampus</span><span class="tooltip-hint">?<span class="tooltip-text">Berita otomatis diambil dari menu 'Pos'.</span></span></div><a href="<?php echo admin_url('edit.php'); ?>" class="cpt-shortcut-link">Kelola Berita ↗</a></div> <div class="switch-label-wrap"><div class="switch-label"><span>Tampilkan Berita Kampus</span><span class="tooltip-hint">?<span class="tooltip-text">Berita otomatis diambil dari menu 'Pos'.</span></span></div><a href="<?php echo admin_url('edit.php'); ?>" class="cpt-shortcut-link">Kelola Berita ↗</a></div>
<label class="edukarsa-switch"><input type="checkbox" name="edukarsa_tampil_news" value="1" <?php checked(1, get_option('edukarsa_tampil_news', 1)); ?>><span class="slider-round"></span></label> <label class="edukarsa-switch"><input type="checkbox" name="edukarsa_tampil_news" value="1" <?php checked(1, get_option('edukarsa_tampil_news', 1)); ?>><span class="slider-round"></span></label>
@@ -357,6 +381,7 @@ function edukarsa_settings_page_html() {
</div> </div>
</div> </div>
<!-- Panel Pengaturan Label FAQ -->
<div id="faq-settings-box" class="stat-config-box" style="margin-bottom: 20px;"> <div id="faq-settings-box" class="stat-config-box" style="margin-bottom: 20px;">
<h4>Label Tampilan Seksi FAQ (Tanya Jawab)</h4> <h4>Label Tampilan Seksi FAQ (Tanya Jawab)</h4>
<div class="form-grid-2"> <div class="form-grid-2">
+55
View File
@@ -382,3 +382,58 @@ body {
.goog-tooltip, .goog-tooltip:hover { display: none !important; } .goog-tooltip, .goog-tooltip:hover { display: none !important; }
.goog-text-highlight { background-color: transparent !important; box-shadow: none !important; } .goog-text-highlight { background-color: transparent !important; box-shadow: none !important; }
font { background-color: transparent !important; box-shadow: none !important; } font { background-color: transparent !important; box-shadow: none !important; }
/* 18. AKSESIBILITAS DISABILITAS WIDGET & EFFECT */
.edukarsa-a11y-wrapper { position: fixed; bottom: 80px; left: 25px; z-index: 998; }
.edukarsa-a11y-trigger {
width: 44px; height: 44px; border-radius: 50%;
background-color: var(--primary-color); color: #ffffff;
border: 2px solid rgba(255,255,255,0.25);
box-shadow: 0 4px 15px rgba(0,0,0,0.18);
display: flex; align-items: center; justify-content: center;
cursor: pointer; transition: all 0.25s ease;
}
.edukarsa-a11y-trigger:hover { background-color: var(--secondary-color); transform: scale(1.06); }
.edukarsa-a11y-panel {
position: absolute; bottom: 55px; left: 0;
width: 250px; background: #ffffff;
border: 1px solid #e2e8f0; border-radius: 12px;
box-shadow: 0 15px 35px rgba(15,23,42,0.18);
opacity: 0; visibility: hidden; transform: translateY(10px);
transition: all 0.25s ease; overflow: hidden;
}
.edukarsa-a11y-panel.active { opacity: 1; visibility: visible; transform: translateY(0); }
.a11y-panel-header {
background: #0f172a; color: #ffffff;
padding: 12px 16px; display: flex; justify-content: space-between; align-items: center;
}
.a11y-panel-header h4 { margin: 0; font-size: 13px; color: #ffffff; font-weight: 700; }
.a11y-close-btn { background: transparent; border: none; color: #ffffff; font-size: 18px; cursor: pointer; line-height: 1; }
.a11y-panel-body { padding: 14px 16px; display: flex; flex-direction: column; gap: 12px; }
.a11y-group { display: flex; flex-direction: column; gap: 6px; }
.a11y-label { font-size: 11px; font-weight: 700; color: #64748b; text-transform: uppercase; letter-spacing: 0.5px; }
.a11y-btn-grid { display: flex; gap: 6px; }
.a11y-btn {
flex: 1; padding: 7px 0; background: #f1f5f9;
border: 1px solid #cbd5e1; border-radius: 6px;
font-size: 12px; font-weight: 700; color: #334155;
cursor: pointer; transition: all 0.2s ease;
}
.a11y-btn:hover { background: #e2e8f0; color: var(--primary-color); }
.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; }
body.a11y-font-lg h3 { font-size: 22px !important; }
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; }