2 Commits

Author SHA1 Message Date
tistopandita b856dce066 feat: add animation 2026-06-05 13:09:29 +07:00
tistopandita ad70dbd2d5 feat: add lazyloading 2026-06-05 12:24:44 +07:00
2 changed files with 105 additions and 56 deletions
+40 -22
View File
@@ -2,6 +2,7 @@
<html lang="id" class="scroll-smooth"> <html lang="id" class="scroll-smooth">
<head> <head>
<link rel="preload" as="image" href="images/hero.webp" />
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Group 03 &ndash; HarusSelesaiKP | Informatika UNTAN</title> <title>Group 03 &ndash; HarusSelesaiKP | Informatika UNTAN</title>
@@ -1276,15 +1277,12 @@
<section class="hero-section"> <section class="hero-section">
<div class="hero-overlay"></div> <div class="hero-overlay"></div>
<h1 class="hero-title"> <h1 class="hero-title reveal">
Study at Study at
<span class="highlight-text">Universitas Tanjungpura</span> Pontianak <span class="highlight-text">Universitas Tanjungpura</span> Pontianak
</h1> </h1>
<p class="hero-description" data-skp-i18n="skp_hero_desc"> <p class="hero-description reveal" data-skp-i18n="skp_hero_desc">
=======
<p class="hero-description" data-skp-i18n="skp_hero_desc">
>>>>>>> origin/main
Kuliah di kampus unggulan Kalimantan Barat dengan fasilitas lengkap, Kuliah di kampus unggulan Kalimantan Barat dengan fasilitas lengkap,
lingkungan nyaman dan kehidupan mahasiswa yang terjangkau lingkungan nyaman dan kehidupan mahasiswa yang terjangkau
</p> </p>
@@ -1292,12 +1290,12 @@
<!-- ABOUT SECTION --> <!-- ABOUT SECTION -->
<section class="about-section"> <section class="about-section">
<div class="about-image-wrapper"> <div class="about-image-wrapper reveal>
<span class="image-bg-decorator"></span> <span class=" image-bg-decorator"></span>
<div class="main-image"></div> <div class="main-image"></div>
</div> </div>
<div class="about-content"> <div class="about-content reveal">
<span class="eyebrow-component" data-skp-i18n="skp_about_eyebrow">Tentang Untan</span> <span class="eyebrow-component" data-skp-i18n="skp_about_eyebrow">Tentang Untan</span>
<h2 class="about-title" data-skp-i18n="skp_about_title"> <h2 class="about-title" data-skp-i18n="skp_about_title">
@@ -1338,7 +1336,7 @@
<section class="facilities-section"> <section class="facilities-section">
<span class="eyebrow-component" data-skp-i18n="skp_fac_eyebrow">Fasilitas Kampus</span> <span class="eyebrow-component" data-skp-i18n="skp_fac_eyebrow">Fasilitas Kampus</span>
<h2 class="facilities-title" data-skp-i18n="skp_fac_main_title"> <h2 class="facilities-title reveal" data-skp-i18n="skp_fac_main_title">
Fasilitas Kampus untuk Pengalaman Belajar yang Nyaman Fasilitas Kampus untuk Pengalaman Belajar yang Nyaman
</h2> </h2>
@@ -1349,10 +1347,10 @@
<section class="campus-section"> <section class="campus-section">
<span class="eyebrow-component" data-skp-i18n="skp_campus_eyebrow">Kehidupan Kampus</span> <span class="eyebrow-component" data-skp-i18n="skp_campus_eyebrow">Kehidupan Kampus</span>
<h2 class="campus-title" data-skp-i18n="skp_campus_title"> <h2 class="campus-title reveal data-skp-i18n=" skp_campus_title">
Aktivitas Mahasiswa & Organisasi Kampus Aktivitas Mahasiswa & Organisasi Kampus
</h2> </h2>
<p class="campus-subtitle" data-skp-i18n="skp_campus_subtitle"> <p class="campus-subtitle reveal data-skp-i18n=" skp_campus_subtitle">
Mahasiswa UNTAN memiliki berbagai kesempatan untuk berkembang melalui Mahasiswa UNTAN memiliki berbagai kesempatan untuk berkembang melalui
organisasi, UKM, komunitas, dan kegiatan ekstrakurikuler. organisasi, UKM, komunitas, dan kegiatan ekstrakurikuler.
</p> </p>
@@ -1368,8 +1366,8 @@
<section class="pontianak-city-section"> <section class="pontianak-city-section">
<div class="pontianak-overlay"></div> <div class="pontianak-overlay"></div>
<div class="pontianak-content"> <div class="pontianak-content reveal>
<span class="eyebrow-component" data-skp-i18n="skp_pontianak_eyebrow">Kota Pontianak</span> <span class=" eyebrow-component" data-skp-i18n="skp_pontianak_eyebrow">Kota Pontianak</span>
<h2 class="pontianak-title" data-skp-i18n="skp_pontianak_title"> <h2 class="pontianak-title" data-skp-i18n="skp_pontianak_title">
Live In Pontianak Live In Pontianak
</h2> </h2>
@@ -1388,7 +1386,7 @@
<section class="destination-section"> <section class="destination-section">
<span class="eyebrow-component" data-skp-i18n="skp_dest_eyebrow">Wisata & Destinasi</span> <span class="eyebrow-component" data-skp-i18n="skp_dest_eyebrow">Wisata & Destinasi</span>
<h2 class="destination-title" data-skp-i18n="skp_dest_title"> <h2 class="destination-title reveal data-skp-i18n=" skp_dest_title">
Tempat Menarik di Pontianak Tempat Menarik di Pontianak
</h2> </h2>
@@ -1401,7 +1399,7 @@
<section class="culinary-section"> <section class="culinary-section">
<span class="eyebrow-component" data-skp-i18n="skp_cul_eyebrow">Cafe & Kuliner</span> <span class="eyebrow-component" data-skp-i18n="skp_cul_eyebrow">Cafe & Kuliner</span>
<h2 class="culinary-title" data-skp-i18n="skp_cul_title"> <h2 class="culinary-title reveal" data-skp-i18n="skp_cul_title">
Kuliner dan Coffee Shop Favorit Mahasiswa Kuliner dan Coffee Shop Favorit Mahasiswa
</h2> </h2>
<hr class="culinary-divider" /> <hr class="culinary-divider" />
@@ -1414,11 +1412,11 @@
<!-- LIVING COST SECTION --> <!-- LIVING COST SECTION -->
<section class="living-cost-section"> <section class="living-cost-section">
<div class="cost-banner-wrapper"> <div class="cost-banner-wrapper">
<img src="images/biaya-hidup.jpg" alt="biaya hidup" class="cost-banner-img" /> <img src="images/biaya-hidup.jpg" alt="biaya hidup" class="cost-banner-img" loading="lazy" />
<div class="cost-banner-overlay"></div> <div class="cost-banner-overlay"></div>
</div> </div>
<div class="cost-info-panel"> <div class="cost-info-panel reveal">
<span class="eyebrow-component" data-skp-i18n="skp_cost_eyebrow">Biaya Hidup Mahasiswa</span> <span class="eyebrow-component" data-skp-i18n="skp_cost_eyebrow">Biaya Hidup Mahasiswa</span>
<h2 class="cost-title" data-skp-i18n="skp_cost_title"> <h2 class="cost-title" data-skp-i18n="skp_cost_title">
@@ -1716,7 +1714,7 @@
typeof skpT === "function" ? skpT(item.descKey) : item.descKey; typeof skpT === "function" ? skpT(item.descKey) : item.descKey;
cardsHtmlHTML += ` cardsHtmlHTML += `
<div class="facility-card"> <div class="facility-card reveal">
<img src="${item.imgSrc}" alt="${displayTitle}" class="card-image" loading="lazy" decoding="async" /> <img src="${item.imgSrc}" alt="${displayTitle}" class="card-image" loading="lazy" decoding="async" />
<div class="card-body"> <div class="card-body">
<span class="card-icon-badge"> <span class="card-icon-badge">
@@ -1856,7 +1854,7 @@
typeof skpT === "function" ? skpT(dir.descKey) : dir.descKey; typeof skpT === "function" ? skpT(dir.descKey) : dir.descKey;
return ` return `
<div class="directory-card"> <div class="directory-card reveal">
<div class="img-wrapper"> <div class="img-wrapper">
<img src="${dir.image}" alt="${displayTitle}" loading="lazy" decoding="async" /> <img src="${dir.image}" alt="${displayTitle}" loading="lazy" decoding="async" />
</div> </div>
@@ -1992,7 +1990,7 @@
typeof skpT === "function" ? skpT(dest.descKey) : dest.descKey; typeof skpT === "function" ? skpT(dest.descKey) : dest.descKey;
return ` return `
<div class="destination-card" style="background-image: url('${dest.image}')"> <div class="destination-card reveal" style="background-image: url('${dest.image}')">
<div class="card-overlay"></div> <div class="card-overlay"></div>
<div class="card-content"> <div class="card-content">
<h3 class="card-name">${displayName}</h3> <h3 class="card-name">${displayName}</h3>
@@ -2145,7 +2143,7 @@
typeof skpT === "function" ? skpT(item.descKey) : item.descKey; typeof skpT === "function" ? skpT(item.descKey) : item.descKey;
return ` return `
<div class="culinary-card"> <div class="culinary-card reveal">
<img src="${item.image}" alt="${item.name}" class="card-thumb" loading="lazy" decoding="async" /> <img src="${item.image}" alt="${item.name}" class="card-thumb" loading="lazy" decoding="async" />
<div class="card-body"> <div class="card-body">
<h3>${item.name}</h3> <h3>${item.name}</h3>
@@ -2210,7 +2208,7 @@
typeof skpT === "function" ? skpT("skp_cost_period") : "per bulan"; typeof skpT === "function" ? skpT("skp_cost_period") : "per bulan";
return ` return `
<div class="cost-item-card"> <div class="cost-item-card reveal">
${detail.iconSvg} ${detail.iconSvg}
<p class="cost-type">${displayType}</p> <p class="cost-type">${displayType}</p>
<p class="cost-price">Rp ${detail.price}</p> <p class="cost-price">Rp ${detail.price}</p>
@@ -2227,6 +2225,26 @@
renderLivingCostCards(); renderLivingCostCards();
}); });
</script> </script>
<script>
document.addEventListener("DOMContentLoaded", () => {
const reveals = document.querySelectorAll(".reveal");
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add("active");
observer.unobserve(entry.target);
}
});
}, {
threshold: 0.15
});
reveals.forEach((element) => {
observer.observe(element);
});
});
</script>
</body> </body>
</html> </html>
+65 -34
View File
@@ -119,7 +119,7 @@ body {
display: block; display: block;
} }
.article-body > * + * { .article-body>*+* {
margin-top: 1.1em; margin-top: 1.1em;
} }
@@ -300,12 +300,10 @@ body {
position: absolute; position: absolute;
inset: 0; inset: 0;
z-index: 1; z-index: 1;
background: linear-gradient( background: linear-gradient(270deg,
270deg, rgba(0, 0, 0, 0) 21.76%,
rgba(0, 0, 0, 0) 21.76%, rgba(0, 0, 0, 0.4) 63.31%,
rgba(0, 0, 0, 0.4) 63.31%, rgba(0, 49, 80, 0.72) 78.24%);
rgba(0, 49, 80, 0.72) 78.24%
);
} }
/* Judul Hero */ /* Judul Hero */
@@ -427,7 +425,7 @@ body {
font-size: 8px; font-size: 8px;
font-weight: 500; font-weight: 500;
p + p { p+p {
margin-top: 8px; margin-top: 8px;
} }
} }
@@ -984,12 +982,10 @@ body {
.pontianak-overlay { .pontianak-overlay {
position: absolute; position: absolute;
inset: 0; inset: 0;
background: linear-gradient( background: linear-gradient(0deg,
0deg, rgba(0, 0, 0, 0.9) -14.48%,
rgba(0, 0, 0, 0.9) -14.48%, rgba(0, 0, 0, 0.4) 42.76%,
rgba(0, 0, 0, 0.4) 42.76%, rgba(0, 0, 0, 0) 100%);
rgba(0, 0, 0, 0) 100%
);
z-index: 1; z-index: 1;
} }
@@ -1132,12 +1128,10 @@ body {
.card-overlay { .card-overlay {
position: absolute; position: absolute;
inset: 0; inset: 0;
background: linear-gradient( background: linear-gradient(0deg,
0deg, rgba(0, 0, 0, 0.8) 0%,
rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.2) 50%,
rgba(0, 0, 0, 0.2) 50%, rgba(0, 0, 0, 0) 100%);
rgba(0, 0, 0, 0) 100%
);
z-index: 1; z-index: 1;
} }
@@ -1406,12 +1400,10 @@ body {
.cost-banner-overlay { .cost-banner-overlay {
position: absolute; position: absolute;
inset: 0; inset: 0;
background: linear-gradient( background: linear-gradient(0deg,
0deg, #012338 0%,
#012338 0%, rgba(1, 35, 56, 0.4) 55%,
rgba(1, 35, 56, 0.4) 55%, rgba(1, 35, 56, 0) 100%);
rgba(1, 35, 56, 0) 100%
);
} }
} }
@@ -1534,12 +1526,10 @@ body {
/* Perubahan Arah Gradasi: Mengabur ke arah kiri panel Navy */ /* Perubahan Arah Gradasi: Mengabur ke arah kiri panel Navy */
.cost-banner-overlay { .cost-banner-overlay {
background: linear-gradient( background: linear-gradient(270deg,
270deg, #012338 0%,
#012338 0%, rgba(0, 0, 0, 0.4) 65%,
rgba(0, 0, 0, 0.4) 65%, rgba(0, 0, 0, 0) 78%);
rgba(0, 0, 0, 0) 78%
);
} }
} }
@@ -1634,13 +1624,13 @@ body.lang-pending {
will-change: box-shadow; will-change: box-shadow;
} }
#nav-wrapper > div:first-child { #nav-wrapper>div:first-child {
transform: translateZ(0); transform: translateZ(0);
-webkit-transform: translateZ(0); -webkit-transform: translateZ(0);
} }
@media (max-width: 1023px) { @media (max-width: 1023px) {
#nav-wrapper > div:first-child { #nav-wrapper>div:first-child {
min-height: 0 !important; min-height: 0 !important;
max-height: none; max-height: none;
} }
@@ -1658,6 +1648,7 @@ body.lang-pending {
} }
@media (prefers-reduced-motion: reduce) { @media (prefers-reduced-motion: reduce) {
*, *,
*::before, *::before,
*::after { *::after {
@@ -1832,6 +1823,7 @@ body.lang-pending {
} }
@keyframes lucoPulse { @keyframes lucoPulse {
0%, 0%,
100% { 100% {
transform: scale(1); transform: scale(1);
@@ -1878,6 +1870,7 @@ body.lang-pending {
} }
@keyframes bounce { @keyframes bounce {
0%, 0%,
80%, 80%,
100% { 100% {
@@ -1901,3 +1894,41 @@ body.lang-pending {
border-right: 1px solid #e2e8f0; border-right: 1px solid #e2e8f0;
border-bottom: 1px solid #e2e8f0; border-bottom: 1px solid #e2e8f0;
} }
/* ===== PAGE LOAD ANIMATIONS ===== */
@keyframes fadeInUplarge {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* Hero */
.reveal {
opacity: 0;
transform: translateY(50px);
transition:
opacity 0.8s ease,
transform 0.8s ease;
}
.reveal.active {
opacity: 1;
transform: translateY(0);
}