1 Commits

Author SHA1 Message Date
Andrie 5e59063642 hapus gitignore 2026-06-04 19:29:45 +07:00
6 changed files with 191 additions and 240 deletions
+88
View File
@@ -570,6 +570,50 @@ const translations = {
kontrib_guideline_4: "Hindari plagiarisme. Karya harus orisinal.", kontrib_guideline_4: "Hindari plagiarisme. Karya harus orisinal.",
kontrib_guideline_5: "Tim redaksi berhak menyunting konten untuk keperluan editorial.", kontrib_guideline_5: "Tim redaksi berhak menyunting konten untuk keperluan editorial.",
// --- Group 06: ACAAB - Prestasi & Karya Mahasiswa ---
grp_acaab_hero_badge: "MAHASISWA & PRESTASI",
grp_acaab_hero_title: "Sorotan dan Prestasi Karya Mahasiswa",
grp_acaab_hero_desc: "Galeri pencapaian, penghargaan, dan portofolio inovasi teknologi yang dikembangkan oleh mahasiswa Program Studi Informatika Universitas Tanjungpura.",
grp_acaab_stats_heading: "Pencapaian dalam Angka",
grp_acaab_stats_total_ach: "Total Prestasi",
grp_acaab_stats_total_proj: "Total Karya",
grp_acaab_stats_intl: "Internasional",
grp_acaab_stats_national: "Nasional",
grp_acaab_stats_regional: "Regional",
grp_acaab_stats_data_note: "Data dikumpulkan per",
grp_acaab_ach_title: "Prestasi Mahasiswa",
grp_acaab_ach_desc: "Daftar pencapaian dan penghargaan yang diraih oleh mahasiswa Informatika UNTAN di berbagai kompetisi.",
grp_acaab_ach_search: "Cari prestasi...",
grp_acaab_ach_filter_level: "Semua Level",
grp_acaab_ach_filter_cat: "Semua Kategori",
grp_acaab_ach_filter_year: "Semua Tahun",
grp_acaab_ach_showing: "Menampilkan",
grp_acaab_ach_results: "prestasi",
grp_acaab_ach_load_more: "Tampilkan Lebih Banyak",
grp_acaab_ach_show_less: "Tampilkan Lebih Sedikit",
grp_acaab_ach_empty: "Tidak ada prestasi yang cocok dengan filter.",
grp_acaab_ach_loading: "Memuat data prestasi...",
grp_acaab_ach_error: "Gagal memuat data prestasi.",
grp_acaab_proj_title: "Top Projects & Portofolio",
grp_acaab_proj_desc: "Jelajahi inovasi digital dan aplikasi nyata yang dikembangkan oleh mahasiswa Informatika UNTAN.",
grp_acaab_proj_scroll_hint: "← Geser untuk melihat lebih banyak →",
grp_acaab_proj_search: "Cari karya...",
grp_acaab_proj_filter_cat: "Semua Kategori",
grp_acaab_proj_filter_year: "Semua Tahun",
grp_acaab_proj_load_more: "Tampilkan Lebih Banyak",
grp_acaab_proj_empty: "Tidak ada karya yang cocok dengan filter.",
grp_acaab_proj_loading: "Memuat data karya...",
grp_acaab_proj_error: "Gagal memuat data karya.",
grp_acaab_modal_team: "Tim / Peserta",
grp_acaab_modal_generation: "Angkatan",
grp_acaab_modal_members: "Anggota Tim",
grp_acaab_modal_visit: "Kunjungi Proyek",
grp_acaab_modal_read_more: "Selengkapnya",
grp_acaab_modal_no_link: "Link tidak tersedia",
grp_acaab_cta_badge: "HUBUNGI KAMI",
grp_acaab_cta_title: "Ingin Tahu Lebih Lanjut?",
grp_acaab_cta_desc: "Tertarik bergabung dengan Program Studi Informatika UNTAN, mendaftarkan prestasi mahasiswa, atau menjalin kerja sama? Hubungi kami sekarang.",
grp_acaab_cta_btn: "Chat via WhatsApp",
}, },
en: { en: {
@@ -1137,6 +1181,50 @@ const translations = {
kontrib_guideline_4: "Avoid plagiarism. Work must be original.", kontrib_guideline_4: "Avoid plagiarism. Work must be original.",
kontrib_guideline_5: "The editorial team reserves the right to edit content for editorial purposes.", kontrib_guideline_5: "The editorial team reserves the right to edit content for editorial purposes.",
// --- Group 06: ACAAB - Prestasi & Karya Mahasiswa ---
grp_acaab_hero_badge: "STUDENTS & ACHIEVEMENTS",
grp_acaab_hero_title: "Student Spotlights & Achievements",
grp_acaab_hero_desc: "Gallery of accomplishments, awards, and technology innovation portfolios developed by Informatics students of Tanjungpura University.",
grp_acaab_stats_heading: "Achievements by the Numbers",
grp_acaab_stats_total_ach: "Total Achievements",
grp_acaab_stats_total_proj: "Total Projects",
grp_acaab_stats_intl: "International",
grp_acaab_stats_national: "National",
grp_acaab_stats_regional: "Regional",
grp_acaab_stats_data_note: "Data collected as of",
grp_acaab_ach_title: "Student Achievements",
grp_acaab_ach_desc: "List of awards and accomplishments by Informatics UNTAN students in various competitions.",
grp_acaab_ach_search: "Search achievements...",
grp_acaab_ach_filter_level: "All Levels",
grp_acaab_ach_filter_cat: "All Categories",
grp_acaab_ach_filter_year: "All Years",
grp_acaab_ach_showing: "Showing",
grp_acaab_ach_results: "achievements",
grp_acaab_ach_load_more: "Show More",
grp_acaab_ach_show_less: "Show Less",
grp_acaab_ach_empty: "No achievements match the current filter.",
grp_acaab_ach_loading: "Loading achievements...",
grp_acaab_ach_error: "Failed to load achievements.",
grp_acaab_proj_title: "Top Projects & Portfolios",
grp_acaab_proj_desc: "Explore digital innovations and real-world applications developed by Informatics UNTAN students.",
grp_acaab_proj_scroll_hint: "← Scroll to see more →",
grp_acaab_proj_search: "Search projects...",
grp_acaab_proj_filter_cat: "All Categories",
grp_acaab_proj_filter_year: "All Years",
grp_acaab_proj_load_more: "Show More",
grp_acaab_proj_empty: "No projects match the current filter.",
grp_acaab_proj_loading: "Loading projects...",
grp_acaab_proj_error: "Failed to load projects.",
grp_acaab_modal_team: "Team / Participant",
grp_acaab_modal_generation: "Batch Year",
grp_acaab_modal_members: "Team Members",
grp_acaab_modal_visit: "Visit Project",
grp_acaab_modal_read_more: "Read More",
grp_acaab_modal_no_link: "Link not available",
grp_acaab_cta_badge: "CONTACT US",
grp_acaab_cta_title: "Want to Know More?",
grp_acaab_cta_desc: "Interested in joining the Informatics Study Program at UNTAN, registering a student achievement, or establishing a partnership? Contact us now.",
grp_acaab_cta_btn: "Chat via WhatsApp",
} }
}; };
-1
View File
@@ -1 +0,0 @@
node_modules/
+81 -81
View File
@@ -1,4 +1,4 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="id" class="scroll-smooth"> <html lang="id" class="scroll-smooth">
<head> <head>
@@ -1177,7 +1177,7 @@
style="background:rgba(254,180,1,0.08);filter:blur(80px);margin-right:-5rem;margin-top:-5rem;"> style="background:rgba(254,180,1,0.08);filter:blur(80px);margin-right:-5rem;margin-top:-5rem;">
</div> </div>
<div class="container mx-auto px-4 lg:px-8"> <div class="container mx-auto px-4" style="max-width:1100px;">
<div style="display:grid;grid-template-columns:1fr;gap:1.5rem;align-items:center;" <div style="display:grid;grid-template-columns:1fr;gap:1.5rem;align-items:center;"
class="lg-hero-grid"> class="lg-hero-grid">
<!-- Left: text --> <!-- Left: text -->
@@ -1234,65 +1234,67 @@
<div <div
style="background:#feb401;border-radius:0.75rem;box-shadow:0 10px 30px -10px rgba(253,184,19,0.4);padding:1.25rem 1.5rem 1.5rem;"> style="background:#feb401;border-radius:0.75rem;box-shadow:0 10px 30px -10px rgba(253,184,19,0.4);padding:1.25rem 1.5rem 1.5rem;">
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;"> <!-- Row 1: Dua chip header navy -->
<!-- Prestasi Block --> <div style="display:flex;gap:0.75rem;margin-bottom:1.25rem;">
<div style="flex:4;min-width:240px;"> <!-- TOTAL PRESTASI chip — lebar 4x -->
<div style="background:#003150;border-radius:0.5rem;padding:0.5rem 0.75rem;text-align:center;margin-bottom:1.25rem;"> <div
<span style="color:white;font-size:0.875rem;font-weight:800;letter-spacing:0.12em;text-transform:uppercase;" style="flex:4;background:#003150;border-radius:0.5rem;padding:0.5rem 0.75rem;text-align:center;">
data-i18n="grp_acaab_stats_total_ach">Total Prestasi</span> <span
</div> style="color:white;font-size:0.65rem;font-weight:800;letter-spacing:0.12em;text-transform:uppercase;"
<div style="display:flex;gap:0.25rem;"> data-i18n="grp_acaab_stats_total_ach">Total Prestasi</span>
<!-- Prestasi Mahasiswa (total) -->
<div style="flex:1;text-align:center;padding:0 0.15rem;">
<div id="stat-total-ach"
style="font-size:clamp(2rem,4.5vw,4rem);font-weight:900;color:#003150;line-height:1;font-family:'Roboto Condensed',sans-serif;">
0</div>
<div style="font-size:clamp(0.5rem,1.2vw,0.85rem);font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:#003150;margin-top:0.5rem;line-height:1.3;word-break:break-word;">
Prestasi<br>Mahasiswa</div>
</div>
<!-- Internasional -->
<div style="flex:1;text-align:center;padding:0 0.15rem;">
<div id="stat-intl"
style="font-size:clamp(2rem,4.5vw,4rem);font-weight:900;color:#003150;line-height:1;font-family:'Roboto Condensed',sans-serif;">
0</div>
<div style="font-size:clamp(0.5rem,1.2vw,0.85rem);font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:#003150;margin-top:0.5rem;word-break:break-word;"
data-i18n="grp_acaab_stats_intl">Internasional</div>
</div>
<!-- Nasional -->
<div style="flex:1;text-align:center;padding:0 0.15rem;">
<div id="stat-national"
style="font-size:clamp(2rem,4.5vw,4rem);font-weight:900;color:#003150;line-height:1;font-family:'Roboto Condensed',sans-serif;">
0</div>
<div style="font-size:clamp(0.5rem,1.2vw,0.85rem);font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:#003150;margin-top:0.5rem;word-break:break-word;"
data-i18n="grp_acaab_stats_national">Nasional</div>
</div>
<!-- Regional -->
<div style="flex:1;text-align:center;padding:0 0.15rem;">
<div id="stat-regional"
style="font-size:clamp(2rem,4.5vw,4rem);font-weight:900;color:#003150;line-height:1;font-family:'Roboto Condensed',sans-serif;">
0</div>
<div style="font-size:clamp(0.5rem,1.2vw,0.85rem);font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:#003150;margin-top:0.5rem;word-break:break-word;"
data-i18n="grp_acaab_stats_regional">Regional</div>
</div>
</div>
</div> </div>
<!-- TOTAL PORTOFOLIO chip — lebar 1x -->
<div
style="flex:1;background:#003150;border-radius:0.5rem;padding:0.5rem 0.75rem;text-align:center;">
<span
style="color:white;font-size:0.65rem;font-weight:800;letter-spacing:0.12em;text-transform:uppercase;"
data-i18n="grp_acaab_stats_total_proj">Total Portofolio</span>
</div>
</div>
<!-- Proyek Block --> <!-- Row 2: 5 angka sejajar (4 prestasi + 1 proyek) -->
<div style="flex:1;min-width:120px;"> <div style="display:flex;gap:0.25rem;">
<div style="background:#003150;border-radius:0.5rem;padding:0.5rem 0.75rem;text-align:center;margin-bottom:1.25rem;"> <!-- Prestasi Mahasiswa (total) -->
<span style="color:white;font-size:0.875rem;font-weight:800;letter-spacing:0.12em;text-transform:uppercase;" <div style="flex:1;text-align:center;padding:0 0.25rem;">
data-i18n="grp_acaab_stats_total_proj">Total Portofolio</span> <div id="stat-total-ach"
</div> style="font-size:clamp(2rem,4.5vw,4rem);font-weight:900;color:#003150;line-height:1;font-family:'Roboto Condensed',sans-serif;">
<div style="display:flex;justify-content:center;"> 0</div>
<!-- Proyek Mahasiswa (total) --> <div
<div style="text-align:center;padding:0 0.15rem;"> style="font-size:0.55rem;font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:#003150;margin-top:0.5rem;line-height:1.3;">
<div id="stat-total-proj" Prestasi<br>Mahasiswa</div>
style="font-size:clamp(2rem,4.5vw,4rem);font-weight:900;color:#003150;line-height:1;font-family:'Roboto Condensed',sans-serif;"> </div>
0</div> <!-- Internasional -->
<div style="font-size:clamp(0.5rem,1.2vw,0.85rem);font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:#003150;margin-top:0.5rem;line-height:1.3;word-break:break-word;"> <div style="flex:1;text-align:center;padding:0 0.25rem;">
Proyek<br>Mahasiswa</div> <div id="stat-intl"
</div> style="font-size:clamp(2rem,4.5vw,4rem);font-weight:900;color:#003150;line-height:1;font-family:'Roboto Condensed',sans-serif;">
</div> 0</div>
<div style="font-size:0.55rem;font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:#003150;margin-top:0.5rem;"
data-i18n="grp_acaab_stats_intl">Internasional</div>
</div>
<!-- Nasional -->
<div style="flex:1;text-align:center;padding:0 0.25rem;">
<div id="stat-national"
style="font-size:clamp(2rem,4.5vw,4rem);font-weight:900;color:#003150;line-height:1;font-family:'Roboto Condensed',sans-serif;">
0</div>
<div style="font-size:0.55rem;font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:#003150;margin-top:0.5rem;"
data-i18n="grp_acaab_stats_national">Nasional</div>
</div>
<!-- Regional -->
<div style="flex:1;text-align:center;padding:0 0.25rem;">
<div id="stat-regional"
style="font-size:clamp(2rem,4.5vw,4rem);font-weight:900;color:#003150;line-height:1;font-family:'Roboto Condensed',sans-serif;">
0</div>
<div style="font-size:0.55rem;font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:#003150;margin-top:0.5rem;"
data-i18n="grp_acaab_stats_regional">Regional</div>
</div>
<!-- Proyek Mahasiswa (total) -->
<div style="flex:1;text-align:center;padding:0 0.25rem;">
<div id="stat-total-proj"
style="font-size:clamp(2rem,4.5vw,4rem);font-weight:900;color:#003150;line-height:1;font-family:'Roboto Condensed',sans-serif;">
0</div>
<div
style="font-size:0.55rem;font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:#003150;margin-top:0.5rem;line-height:1.3;">
Proyek<br>Mahasiswa</div>
</div> </div>
</div> </div>
@@ -1353,7 +1355,7 @@
<!-- Cards grid --> <!-- Cards grid -->
<div id="acaab-ach-grid" <div id="acaab-ach-grid"
style="display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:2rem;justify-content:center;"> style="display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:1.5rem;">
</div> </div>
<!-- Pagination buttons --> <!-- Pagination buttons -->
@@ -1369,16 +1371,27 @@
<!-- ── PROJECT CAROUSEL ───────────────────────────────────────────────── --> <!-- ── PROJECT CAROUSEL ───────────────────────────────────────────────── -->
<section id="acaab-proj-section" class="not-prose acaab-full-bleed" style="padding:2.5rem 0 3rem;background:#f8fafc;"> <section id="acaab-proj-section" class="not-prose acaab-full-bleed" style="padding:2.5rem 0 3rem;background:#f8fafc;">
<div class="container mx-auto px-4 lg:px-8"> <div class="container mx-auto px-4" style="max-width:1100px;">
<!-- Section header row: title + scroll buttons (seperti di React source) --> <!-- Section header row: title + scroll buttons (seperti di React source) -->
<div <div
style="display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem;"> style="display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem;">
<div style="flex:1;min-width:250px;"> <div>
<h2 style="font-size:clamp(1.5rem,3vw,2.25rem);font-weight:900;color:#003150;margin:0 0 0.5rem;font-family:'Roboto Condensed',sans-serif;" <h2 style="font-size:clamp(1.5rem,3vw,2.25rem);font-weight:900;color:#003150;margin:0 0 0.5rem;font-family:'Roboto Condensed',sans-serif;"
data-i18n="grp_acaab_proj_title">Top Projects Portofolio</h2> data-i18n="grp_acaab_proj_title">Top Projects &amp; Portofolio</h2>
<p style="color:#64748b;font-size:1rem;max-width:42rem;margin:0;line-height:1.6;" <p style="color:#64748b;font-size:1rem;max-width:42rem;margin:0;line-height:1.6;"
data-i18n="grp_acaab_proj_desc">Jelajahi inovasi digital dan aplikasi nyata yang dikembangkan oleh mahasiswa Informatika UNTAN.</p> data-i18n="grp_acaab_proj_desc">Jelajahi inovasi digital dan aplikasi nyata yang dikembangkan oleh mahasiswa Informatika UNTAN.</p>
</div> </div>
<!-- Scroll control buttons (atas, kanan) -->
<div style="display:flex;align-items:center;gap:0.5rem;flex-shrink:0;margin-top:0.25rem;">
<button id="acaab-proj-prev" aria-label="Geser kiri"
style="width:2.5rem;height:2.5rem;border-radius:50%;border:2px solid rgba(0,49,80,0.2);display:flex;align-items:center;justify-content:center;color:#003150;background:white;cursor:pointer;transition:all 0.2s;">
<i class="fas fa-chevron-left" style="font-size:0.875rem;"></i>
</button>
<button id="acaab-proj-next" aria-label="Geser kanan"
style="width:2.5rem;height:2.5rem;border-radius:50%;border:2px solid rgba(0,49,80,0.2);display:flex;align-items:center;justify-content:center;color:#003150;background:white;cursor:pointer;transition:all 0.2s;">
<i class="fas fa-chevron-right" style="font-size:0.875rem;"></i>
</button>
</div>
</div> </div>
<!-- Filter panel --> <!-- Filter panel -->
@@ -1420,18 +1433,6 @@
<div id="acaab-proj-track" class="acaab-carousel-track acaab-hide-scrollbar" <div id="acaab-proj-track" class="acaab-carousel-track acaab-hide-scrollbar"
style="display:flex;gap:1.25rem;overflow-x:auto;padding-bottom:1rem;"></div> style="display:flex;gap:1.25rem;overflow-x:auto;padding-bottom:1rem;"></div>
<!-- Scroll control buttons (bawah) -->
<div style="display:flex;justify-content:center;align-items:center;gap:1rem;margin-top:1rem;">
<button id="acaab-proj-prev" aria-label="Geser kiri"
style="width:3rem;height:3rem;border-radius:50%;border:2px solid rgba(0,49,80,0.2);display:flex;align-items:center;justify-content:center;color:#003150;background:white;cursor:pointer;transition:all 0.2s;">
<i class="fas fa-chevron-left" style="font-size:1rem;"></i>
</button>
<button id="acaab-proj-next" aria-label="Geser kanan"
style="width:3rem;height:3rem;border-radius:50%;border:2px solid rgba(0,49,80,0.2);display:flex;align-items:center;justify-content:center;color:#003150;background:white;cursor:pointer;transition:all 0.2s;">
<i class="fas fa-chevron-right" style="font-size:1rem;"></i>
</button>
</div>
<!-- Load more --> <!-- Load more -->
<div style="text-align:center;margin-top:1.5rem;"> <div style="text-align:center;margin-top:1.5rem;">
<button id="acaab-proj-more" <button id="acaab-proj-more"
@@ -1443,8 +1444,8 @@
<!-- ── CTA ────────────────────────────────────────────────────────────── --> <!-- ── CTA ────────────────────────────────────────────────────────────── -->
<section class="not-prose acaab-full-bleed bg-untan-navy" <section class="not-prose acaab-full-bleed bg-untan-navy"
style="padding:3.5rem 0; margin-bottom: 3rem;"> style="padding:3.5rem 0;">
<div class="container mx-auto px-4 lg:px-8"> <div class="container mx-auto px-4" style="max-width:1100px;">
<!-- Inner card: kuning transparan dengan border, rounded-2xl --> <!-- Inner card: kuning transparan dengan border, rounded-2xl -->
<div <div
style="background:rgba(254,180,1,0.08);border:1px solid rgba(254,180,1,0.2);border-radius:1rem;padding:2.5rem 2rem;"> style="background:rgba(254,180,1,0.08);border:1px solid rgba(254,180,1,0.2);border-radius:1rem;padding:2.5rem 2rem;">
@@ -1659,9 +1660,8 @@
})(); })();
</script> </script>
<script src="../../assets/global/localization.js"></script>
<script src="./localization.js"></script>
<script src="./main.js"></script> <script src="./main.js"></script>
<script src="../../assets/global/localization.js"></script>
</body> </body>
</html> </html>
-105
View File
@@ -1,105 +0,0 @@
/**
* ACAAB localization extension.
* Keep group-specific translations outside assets/global/localization.js
* to avoid conflicts with the main project.
*/
(function extendAcaabTranslations() {
if (typeof translations === 'undefined') return;
const acaabTranslations = {
id: {
grp_acaab_hero_badge: "MAHASISWA & PRESTASI",
grp_acaab_hero_title: "Sorotan dan Prestasi Karya Mahasiswa",
grp_acaab_hero_desc: "Galeri pencapaian, penghargaan, dan portofolio inovasi teknologi yang dikembangkan oleh mahasiswa Program Studi Informatika Universitas Tanjungpura.",
grp_acaab_stats_heading: "Pencapaian dalam Angka",
grp_acaab_stats_total_ach: "Total Prestasi",
grp_acaab_stats_total_proj: "Total Karya",
grp_acaab_stats_intl: "Internasional",
grp_acaab_stats_national: "Nasional",
grp_acaab_stats_regional: "Regional",
grp_acaab_stats_data_note: "Data dikumpulkan per",
grp_acaab_ach_title: "Prestasi Mahasiswa",
grp_acaab_ach_desc: "Daftar pencapaian dan penghargaan yang diraih oleh mahasiswa Informatika UNTAN di berbagai kompetisi.",
grp_acaab_ach_search: "Cari prestasi...",
grp_acaab_ach_filter_level: "Semua Level",
grp_acaab_ach_filter_cat: "Semua Kategori",
grp_acaab_ach_filter_year: "Semua Tahun",
grp_acaab_ach_showing: "Menampilkan",
grp_acaab_ach_results: "prestasi",
grp_acaab_ach_load_more: "Tampilkan Lebih Banyak",
grp_acaab_ach_show_less: "Tampilkan Lebih Sedikit",
grp_acaab_ach_empty: "Tidak ada prestasi yang cocok dengan filter.",
grp_acaab_ach_loading: "Memuat data prestasi...",
grp_acaab_ach_error: "Gagal memuat data prestasi.",
grp_acaab_proj_title: "Top Projects & Portofolio",
grp_acaab_proj_desc: "Jelajahi inovasi digital dan aplikasi nyata yang dikembangkan oleh mahasiswa Informatika UNTAN.",
grp_acaab_proj_scroll_hint: "Geser untuk melihat lebih banyak",
grp_acaab_proj_search: "Cari karya...",
grp_acaab_proj_filter_cat: "Semua Kategori",
grp_acaab_proj_filter_year: "Semua Tahun",
grp_acaab_proj_load_more: "Tampilkan Lebih Banyak",
grp_acaab_proj_empty: "Tidak ada karya yang cocok dengan filter.",
grp_acaab_proj_loading: "Memuat data karya...",
grp_acaab_proj_error: "Gagal memuat data karya.",
grp_acaab_modal_team: "Tim / Peserta",
grp_acaab_modal_generation: "Angkatan",
grp_acaab_modal_members: "Anggota Tim",
grp_acaab_modal_visit: "Kunjungi Proyek",
grp_acaab_modal_read_more: "Selengkapnya",
grp_acaab_modal_no_link: "Link tidak tersedia",
grp_acaab_cta_badge: "HUBUNGI KAMI",
grp_acaab_cta_title: "Ingin Tahu Lebih Lanjut?",
grp_acaab_cta_desc: "Tertarik bergabung dengan Program Studi Informatika UNTAN, mendaftarkan prestasi mahasiswa, atau menjalin kerja sama? Hubungi kami sekarang.",
grp_acaab_cta_btn: "Chat via WhatsApp",
},
en: {
grp_acaab_hero_badge: "STUDENTS & ACHIEVEMENTS",
grp_acaab_hero_title: "Student Spotlights & Achievements",
grp_acaab_hero_desc: "Gallery of accomplishments, awards, and technology innovation portfolios developed by Informatics students of Tanjungpura University.",
grp_acaab_stats_heading: "Achievements by the Numbers",
grp_acaab_stats_total_ach: "Total Achievements",
grp_acaab_stats_total_proj: "Total Projects",
grp_acaab_stats_intl: "International",
grp_acaab_stats_national: "National",
grp_acaab_stats_regional: "Regional",
grp_acaab_stats_data_note: "Data collected as of",
grp_acaab_ach_title: "Student Achievements",
grp_acaab_ach_desc: "List of awards and accomplishments by Informatics UNTAN students in various competitions.",
grp_acaab_ach_search: "Search achievements...",
grp_acaab_ach_filter_level: "All Levels",
grp_acaab_ach_filter_cat: "All Categories",
grp_acaab_ach_filter_year: "All Years",
grp_acaab_ach_showing: "Showing",
grp_acaab_ach_results: "achievements",
grp_acaab_ach_load_more: "Show More",
grp_acaab_ach_show_less: "Show Less",
grp_acaab_ach_empty: "No achievements match the current filter.",
grp_acaab_ach_loading: "Loading achievements...",
grp_acaab_ach_error: "Failed to load achievements.",
grp_acaab_proj_title: "Top Projects & Portfolios",
grp_acaab_proj_desc: "Explore digital innovations and real-world applications developed by Informatics UNTAN students.",
grp_acaab_proj_scroll_hint: "Scroll to see more",
grp_acaab_proj_search: "Search projects...",
grp_acaab_proj_filter_cat: "All Categories",
grp_acaab_proj_filter_year: "All Years",
grp_acaab_proj_load_more: "Show More",
grp_acaab_proj_empty: "No projects match the current filter.",
grp_acaab_proj_loading: "Loading projects...",
grp_acaab_proj_error: "Failed to load projects.",
grp_acaab_modal_team: "Team / Participant",
grp_acaab_modal_generation: "Batch Year",
grp_acaab_modal_members: "Team Members",
grp_acaab_modal_visit: "Visit Project",
grp_acaab_modal_read_more: "Read More",
grp_acaab_modal_no_link: "Link not available",
grp_acaab_cta_badge: "CONTACT US",
grp_acaab_cta_title: "Want to Know More?",
grp_acaab_cta_desc: "Interested in joining the Informatics Study Program at UNTAN, registering a student achievement, or establishing a partnership? Contact us now.",
grp_acaab_cta_btn: "Chat via WhatsApp",
},
};
Object.assign(translations.id, acaabTranslations.id);
Object.assign(translations.en, acaabTranslations.en);
}());
+20 -35
View File
@@ -181,7 +181,7 @@ document.addEventListener('DOMContentLoaded', async () => {
]); ]);
if (achResult.status === 'fulfilled') { if (achResult.status === 'fulfilled') {
achievements = achResult.value.sort((a, b) => b.year - a.year); achievements = achResult.value;
} else { } else {
console.error('[ACAAB] achievements error:', achResult.reason); console.error('[ACAAB] achievements error:', achResult.reason);
showError('acaab-ach-grid', t('grp_acaab_ach_error')); showError('acaab-ach-grid', t('grp_acaab_ach_error'));
@@ -359,11 +359,9 @@ function renderAchievements() {
if (moreBtn) moreBtn.style.display = achVisible < filtered.length ? 'inline-block' : 'none'; if (moreBtn) moreBtn.style.display = achVisible < filtered.length ? 'inline-block' : 'none';
if (lessBtn) lessBtn.style.display = achVisible > ACH_INIT ? 'inline-block' : 'none'; if (lessBtn) lessBtn.style.display = achVisible > ACH_INIT ? 'inline-block' : 'none';
grid.querySelectorAll('.acaab-ach-card').forEach(card => { grid.querySelectorAll('.acaab-ach-readmore').forEach(btn => {
card.addEventListener('click', (e) => { btn.addEventListener('click', () => {
// Biarkan tombol yang merupakan link tetap berfungsi const ach = achievements.find(a => a.id === btn.dataset.id);
if (e.target.closest('a')) return;
const ach = achievements.find(a => a.id === card.dataset.id);
if (ach) openAchModal(ach); if (ach) openAchModal(ach);
}); });
}); });
@@ -371,7 +369,7 @@ function renderAchievements() {
function achCardHtml(a, idx) { function achCardHtml(a, idx) {
return ` return `
<article class="acaab-ach-card acaab-fade-in" data-id="${escHtml(a.id)}" style="animation-delay:${idx * 0.05}s;cursor:pointer;"> <article class="acaab-ach-card acaab-fade-in" style="animation-delay:${idx * 0.05}s;">
<div class="acaab-ach-top-bar"></div> <div class="acaab-ach-top-bar"></div>
<!-- Image h-56 (224px) --> <!-- Image h-56 (224px) -->
<div style="position:relative;height:224px;overflow:hidden;background:#f1f5f9;"> <div style="position:relative;height:224px;overflow:hidden;background:#f1f5f9;">
@@ -496,11 +494,11 @@ function openAchModal(a) {
</div>` : ''; </div>` : '';
renderModal(` renderModal(`
<!-- Image header --> <!-- Image header h-56 -->
<div style="position:relative;border-radius:0.75rem 0.75rem 0 0;background:#0f172a;flex-shrink:0;"> <div style="position:relative;height:224px;overflow:hidden;border-radius:0.75rem 0.75rem 0 0;background:#e2e8f0;flex-shrink:0;">
<img src="${escHtml(a.image)}" alt="${escHtml(a.title)}" style="width:100%;max-height:450px;object-fit:contain;display:block;" <img src="${escHtml(a.image)}" alt="${escHtml(a.title)}" style="width:100%;height:100%;object-fit:cover;"
onerror="this.src='https://placehold.co/800x600/0f172a/FDB813?text=Informatika+UNTAN'"> onerror="this.src='https://placehold.co/800x600/003150/FDB813?text=Informatika+UNTAN'">
<div style="position:absolute;inset:0;background:linear-gradient(to top,rgba(0,0,0,0.8) 0%,rgba(0,0,0,0.1) 40%,transparent 100%);pointer-events:none;"></div> <div style="position:absolute;inset:0;background:linear-gradient(to top,rgba(0,0,0,0.8) 0%,rgba(0,0,0,0.2) 50%,transparent 100%);pointer-events:none;"></div>
<!-- Close button: white rounded-full --> <!-- Close button: white rounded-full -->
<button id="acaab-modal-close" aria-label="Tutup" <button id="acaab-modal-close" aria-label="Tutup"
style="position:absolute;top:0.75rem;right:0.75rem;width:2.25rem;height:2.25rem;background:rgba(255,255,255,0.9);backdrop-filter:blur(4px);border:none;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 1px 3px rgba(0,0,0,0.2);"> style="position:absolute;top:0.75rem;right:0.75rem;width:2.25rem;height:2.25rem;background:rgba(255,255,255,0.9);backdrop-filter:blur(4px);border:none;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 1px 3px rgba(0,0,0,0.2);">
@@ -570,18 +568,13 @@ function buildProjFilterOptions() {
function filterProjects() { function filterProjects() {
const q = projFilter.search.toLowerCase(); const q = projFilter.search.toLowerCase();
const result = projects.filter(p => { return projects.filter(p => {
const matchSearch = !q || [p.title, p.studentName, p.description, ...p.categories] const matchSearch = !q || [p.title, p.studentName, p.description, ...p.categories]
.some(s => (s || '').toLowerCase().includes(q)); .some(s => (s || '').toLowerCase().includes(q));
const matchCat = !projFilter.cat || p.categories.includes(projFilter.cat); const matchCat = !projFilter.cat || p.categories.includes(projFilter.cat);
const matchYear = !projFilter.year || String(p.year) === projFilter.year; const matchYear = !projFilter.year || String(p.year) === projFilter.year;
return matchSearch && matchCat && matchYear; return matchSearch && matchCat && matchYear;
}); });
// Sort descending by year
result.sort((a, b) => (b.year || 0) - (a.year || 0));
return result;
} }
function renderProjects() { function renderProjects() {
@@ -605,17 +598,9 @@ function renderProjects() {
track.innerHTML = visible.map((p, i) => projCardHtml(p, i)).join(''); track.innerHTML = visible.map((p, i) => projCardHtml(p, i)).join('');
if (moreBtn) moreBtn.style.display = projVisible < filtered.length ? 'inline-block' : 'none'; if (moreBtn) moreBtn.style.display = projVisible < filtered.length ? 'inline-block' : 'none';
// Responsif: Sembunyikan scroll button & center jika cuma 1 data track.querySelectorAll('.acaab-proj-readmore').forEach(btn => {
const prevBtn = document.getElementById('acaab-proj-prev'); btn.addEventListener('click', () => {
const nextBtn = document.getElementById('acaab-proj-next'); const proj = projects.find(p => p.id === btn.dataset.id);
if (prevBtn) prevBtn.style.display = filtered.length <= 1 ? 'none' : 'flex';
if (nextBtn) nextBtn.style.display = filtered.length <= 1 ? 'none' : 'flex';
track.style.justifyContent = filtered.length === 1 ? 'center' : 'flex-start';
track.querySelectorAll('.acaab-proj-card-wrap').forEach(card => {
card.addEventListener('click', (e) => {
if (e.target.closest('a') && e.target.closest('a').href) return;
const proj = projects.find(p => p.id === card.dataset.id);
if (proj) openProjModal(proj); if (proj) openProjModal(proj);
}); });
}); });
@@ -628,7 +613,7 @@ function projCardHtml(p, idx) {
</span>`).join(''); </span>`).join('');
return ` return `
<div class="acaab-proj-card acaab-proj-card-wrap acaab-fade-in" data-id="${escHtml(p.id)}" style="animation-delay:${idx * 0.05}s;cursor:pointer;"> <div class="acaab-proj-card acaab-proj-card-wrap acaab-fade-in" style="animation-delay:${idx * 0.05}s;">
<div class="acaab-proj-left-bar"></div> <div class="acaab-proj-left-bar"></div>
<!-- Image h-52 (208px) dengan title overlay --> <!-- Image h-52 (208px) dengan title overlay -->
<div style="height:208px;overflow:hidden;position:relative;"> <div style="height:208px;overflow:hidden;position:relative;">
@@ -735,11 +720,11 @@ function openProjModal(p) {
</div>`; </div>`;
renderModal(` renderModal(`
<!-- Image header --> <!-- Image header h-56 -->
<div style="position:relative;border-radius:0.75rem 0.75rem 0 0;background:#0f172a;flex-shrink:0;"> <div style="position:relative;height:224px;overflow:hidden;border-radius:0.75rem 0.75rem 0 0;background:#e2e8f0;flex-shrink:0;">
<img src="${escHtml(p.image)}" alt="${escHtml(p.title)}" style="width:100%;max-height:450px;object-fit:contain;display:block;" <img src="${escHtml(p.image)}" alt="${escHtml(p.title)}" style="width:100%;height:100%;object-fit:cover;"
onerror="this.src='https://placehold.co/800x600/0f172a/FDB813?text=Informatika+UNTAN'"> onerror="this.src='https://placehold.co/800x600/003150/FDB813?text=Informatika+UNTAN'">
<div style="position:absolute;inset:0;background:linear-gradient(to top,rgba(0,0,0,0.8) 0%,rgba(0,0,0,0.1) 40%,transparent 100%);pointer-events:none;"></div> <div style="position:absolute;inset:0;background:linear-gradient(to top,rgba(0,0,0,0.8) 0%,rgba(0,0,0,0.2) 50%,transparent 100%);pointer-events:none;"></div>
<!-- Close button --> <!-- Close button -->
<button id="acaab-modal-close" aria-label="Tutup" <button id="acaab-modal-close" aria-label="Tutup"
style="position:absolute;top:0.75rem;right:0.75rem;width:2.25rem;height:2.25rem;background:rgba(255,255,255,0.9);backdrop-filter:blur(4px);border:none;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 1px 3px rgba(0,0,0,0.2);"> style="position:absolute;top:0.75rem;right:0.75rem;width:2.25rem;height:2.25rem;background:rgba(255,255,255,0.9);backdrop-filter:blur(4px);border:none;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 1px 3px rgba(0,0,0,0.2);">
+2 -18
View File
@@ -201,22 +201,6 @@ body.acaab-modal-open {
/* --- Reduced motion --- */ /* --- Reduced motion --- */
@media (prefers-reduced-motion: reduce) { @media (prefers-reduced-motion: reduce) {
.acaab-fade-in, .acaab-skeleton, .acaab-card-img,
.acaab-ach-card, .acaab-proj-card-wrap { animation: none !important; transition: none !important; }
} }
/* --- Modal Responsiveness Overrides --- */
.acaab-modal-achievement {
max-width: 500px !important;
}
.acaab-modal-project {
max-width: 700px !important;
}
@media (max-width: 639px) {
.acaab-modal-achievement, .acaab-modal-project {
max-width: 100% !important;
margin: 0 !important;
border-radius: 1rem 1rem 0 0 !important;
}
}