Skip to content

Massif kontributor dan branding#25

Merged
Ardelyo merged 2 commits intomainfrom
massif-kontributor-dan-branding
Dec 23, 2025
Merged

Massif kontributor dan branding#25
Ardelyo merged 2 commits intomainfrom
massif-kontributor-dan-branding

Conversation

@Ardelyo
Copy link
Copy Markdown
Collaborator

@Ardelyo Ardelyo commented Dec 23, 2025

📋 Deskripsi

Jelaskan perubahan yang kamu buat secara singkat.

🔗 Issue Terkait

Fixes #(nomor issue)

🔄 Tipe Perubahan

  • 🐛 Bug fix (perubahan yang memperbaiki issue)
  • ✨ Fitur baru (perubahan yang menambah fungsionalitas)
  • 📝 Dokumentasi (perubahan pada dokumentasi)
  • 🎨 Style (formatting, tidak ada perubahan kode)
  • ♻️ Refactor (perubahan kode tanpa menambah fitur/fix)
  • 🔧 Chore (maintenance, dependencies)

📸 Screenshot (jika UI berubah)

Sebelum Sesudah
(screenshot) (screenshot)

✅ Checklist

  • Kode saya mengikuti standar proyek
  • Saya sudah melakukan self-review
  • Saya sudah menambahkan komentar di bagian yang kompleks
  • Saya sudah update dokumentasi yang terkait
  • Perubahan saya tidak menghasilkan warning baru
  • Saya sudah test perubahan saya secara lokal

📝 Catatan untuk Reviewer

Tambahkan catatan atau pertanyaan untuk reviewer di sini.

@vercel
Copy link
Copy Markdown

vercel bot commented Dec 23, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
ourcreativity Ready Ready Preview, Comment Dec 23, 2025 4:42pm

@Ardelyo Ardelyo merged commit 4152d1c into main Dec 23, 2025
2 checks passed
@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello @Ardelyo, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

Pull request ini menghadirkan peningkatan signifikan pada antarmuka pengguna dan arsitektur aplikasi, terutama berfokus pada presentasi konten yang dinamis dan efek animasi. Perubahan inti melibatkan perombakan total halaman 'Story' dengan transisi ke pustaka animasi GSAP untuk pengalaman berbasis scroll yang lebih canggih. Selain itu, komponen UI baru untuk efek visual dan tampilan waktu video telah ditambahkan, dan data untuk halaman video telah dieksternalisasi untuk pemeliharaan yang lebih baik. Penyesuaian kecil pada teks dan jalur gambar di berbagai halaman juga berkontribusi pada peningkatan branding dan lokalisasi.

Highlights

  • Pembaruan Animasi Halaman 'Story': Halaman 'Story' telah sepenuhnya ditulis ulang untuk menggunakan GSAP dan ScrollTrigger, menggantikan Framer Motion. Ini memungkinkan efek animasi berbasis scroll yang lebih canggih dan performa yang lebih baik, dengan penambahan bagian-bagian baru seperti Hero, Visi, Filosofi Logo, Linimasa, Pilar, Dampak, Galeri, dan CTA.
  • Komponen Efek Visual Baru: Dua komponen efek visual baru, GlitchText dan MatrixRain, telah ditambahkan dan diintegrasikan, terutama pada halaman divisi 'Coding', untuk memberikan tampilan yang lebih dinamis dan modern.
  • Komponen Timecode Video: Komponen Timecode baru telah diperkenalkan untuk menampilkan waktu video berdasarkan progres scroll, meningkatkan interaktivitas pada halaman divisi 'Video'.
  • Sentralisasi Data: Data terkait halaman divisi 'Video' kini diekstraksi ke dalam file data/videoPageData.ts yang terpisah, meningkatkan keterbacaan dan kemudahan pemeliharaan kode.
  • Penambahan Dependensi: Pustaka animasi gsap dan @gsap/react telah ditambahkan sebagai dependensi proyek untuk mendukung implementasi animasi baru.
  • Pembaruan Teks dan Branding: Berbagai teks di seluruh aplikasi telah diperbarui untuk lokalisasi yang lebih baik (misalnya, 'Home' menjadi 'Beranda', 'What's New?' menjadi 'Ada Apa yang Baru?') dan konsistensi branding, termasuk pembaruan jalur gambar logo divisi.
  • Restrukturisasi File Supabase: File skema dan seed Supabase telah dipindahkan dan diubah namanya ke dalam struktur direktori supabase/migrations dan supabase/seed untuk organisasi yang lebih baik.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

Secara keseluruhan, ini adalah pull request yang sangat baik dan masif, melakukan refactoring besar pada halaman Story dengan beralih dari framer-motion ke gsap, yang merupakan perubahan arsitektur yang signifikan. Perubahan ini juga memperkenalkan beberapa komponen efek baru yang dapat digunakan kembali seperti GlitchText dan MatrixRain, serta memisahkan data ke dalam file khusus, yang sangat meningkatkan keterbacaan dan pemeliharaan kode. Selain itu, ada banyak perbaikan branding dan lokalisasi teks ke Bahasa Indonesia, yang menunjukkan perhatian terhadap detail. Saya menemukan beberapa masalah tingkat menengah hingga tinggi terkait dependensi hook, penanganan event, dan type safety yang perlu ditangani untuk menyempurnakan implementasi.

Comment thread pages/Story.tsx
Comment on lines +41 to +60
useGSAP(() => {
if (!elementRef.current) return;

const obj = { val: 0 };
gsap.to(obj, {
val: numericValue,
duration: duration,
ease: "power2.out",
scrollTrigger: {
trigger: elementRef.current,
start: "top 90%",
},
onUpdate: () => {
if (elementRef.current) {
const formatted = obj.val % 1 === 0 ? obj.val.toFixed(0) : obj.val.toFixed(1);
elementRef.current.innerText = formatted + suffix;
}
}
});
}, { scope: elementRef });
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Hook useGSAP di sini tidak memiliki array dependensi. Callback di dalam useGSAP bergantung pada props numericValue dan duration. Tanpa menyertakannya dalam dependensi, animasi tidak akan diperbarui jika props ini berubah setelah render awal. Ini dapat menyebabkan perilaku yang tidak konsisten jika komponen AnimatedNumber dirender ulang dengan nilai yang berbeda.

Untuk memperbaikinya, tambahkan numericValue dan duration ke dalam objek konfigurasi useGSAP.

Suggested change
useGSAP(() => {
if (!elementRef.current) return;
const obj = { val: 0 };
gsap.to(obj, {
val: numericValue,
duration: duration,
ease: "power2.out",
scrollTrigger: {
trigger: elementRef.current,
start: "top 90%",
},
onUpdate: () => {
if (elementRef.current) {
const formatted = obj.val % 1 === 0 ? obj.val.toFixed(0) : obj.val.toFixed(1);
elementRef.current.innerText = formatted + suffix;
}
}
});
}, { scope: elementRef });
useGSAP(() => {
if (!elementRef.current) return;
const obj = { val: 0 };
gsap.to(obj, {
val: numericValue,
duration: duration,
ease: "power2.out",
scrollTrigger: {
trigger: elementRef.current,
start: "top 90%",
},
onUpdate: () => {
if (elementRef.current) {
const formatted = obj.val % 1 === 0 ? obj.val.toFixed(0) : obj.val.toFixed(1);
elementRef.current.innerText = formatted + suffix;
}
}
});
}, { scope: elementRef, dependencies: [numericValue, duration] });

Comment thread pages/Story.tsx
Comment on lines +303 to +305
<button className="flex items-center gap-2 text-white font-bold uppercase tracking-widest text-xs group">
Eksplorasi <ChevronRight className="group-hover:translate-x-1 transition-transform" size={16} />
</button>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Elemen ini terlihat seperti tombol interaktif, tetapi saat ini tidak memiliki fungsi apa pun (tidak ada onClick atau href). Ini dapat membingungkan pengguna. Sebaiknya jadikan elemen ini sebagai tautan (<Link>) yang mengarah ke halaman detail divisi yang relevan, atau tambahkan handler onClick jika ada aksi yang dimaksudkan.

Suggested change
<button className="flex items-center gap-2 text-white font-bold uppercase tracking-widest text-xs group">
Eksplorasi <ChevronRight className="group-hover:translate-x-1 transition-transform" size={16} />
</button>
<Link to={`/division/${title.toLowerCase()}`} className="flex items-center gap-2 text-white font-bold uppercase tracking-widest text-xs group">
Eksplorasi <ChevronRight className="group-hover:translate-x-1 transition-transform" size={16} />
</Link>

Comment thread pages/Story.tsx
Comment on lines +579 to +583
<div className="flex justify-center gap-12 text-gray-600 font-bold uppercase tracking-widest text-xs">
<span className="hover:text-white transition-colors cursor-pointer">Instagram</span>
<span className="hover:text-white transition-colors cursor-pointer">Discord</span>
<span className="hover:text-white transition-colors cursor-pointer">GitHub</span>
</div>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Tautan media sosial ini saat ini menggunakan tag <span>, yang membuatnya tidak dapat diklik dan tidak dapat diakses oleh pembaca layar. Untuk fungsionalitas dan aksesibilitas yang benar, elemen-elemen ini harus diubah menjadi tag <a> dengan atribut href yang sesuai.

Suggested change
<div className="flex justify-center gap-12 text-gray-600 font-bold uppercase tracking-widest text-xs">
<span className="hover:text-white transition-colors cursor-pointer">Instagram</span>
<span className="hover:text-white transition-colors cursor-pointer">Discord</span>
<span className="hover:text-white transition-colors cursor-pointer">GitHub</span>
</div>
<div className="flex justify-center gap-12 text-gray-600 font-bold uppercase tracking-widest text-xs">
<a href="#" className="hover:text-white transition-colors cursor-pointer">Instagram</a>
<a href="#" className="hover:text-white transition-colors cursor-pointer">Discord</a>
<a href="#" className="hover:text-white transition-colors cursor-pointer">GitHub</a>
</div>

Comment on lines +48 to +55
const handleResize = () => {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const newColumns = canvas.width / fontSize;
for (let i = drops.length; i < newColumns; i++) {
drops[i] = 1;
}
};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Fungsi handleResize saat ini hanya menangani kasus ketika jendela diperlebar (menambah drops baru), tetapi tidak menangani kasus ketika jendela menyempit. Hal ini dapat menyebabkan array drops terus bertambah tanpa batas jika pengguna mengubah ukuran jendela berulang kali, yang berpotensi menyebabkan kebocoran memori kecil.

Sebaiknya atur ulang panjang array drops agar sesuai dengan jumlah kolom yang baru setiap kali ukuran jendela diubah.

        const handleResize = () => {
            if (!canvas) return;
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;
            const newColumns = canvas.width / fontSize;
            drops.length = Math.floor(newColumns);
            for (let i = 0; i < drops.length; i++) {
                if (!drops[i]) drops[i] = 1;
            }
        };

import { useTransform } from 'framer-motion';

interface TimecodeProps {
scrollProgress: any;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Tipe prop scrollProgress diatur sebagai any. Untuk meningkatkan keamanan tipe (type safety) dan keterbacaan kode dalam proyek TypeScript, sebaiknya gunakan tipe yang lebih spesifik. Dari framer-motion, tipe yang sesuai adalah MotionValue<number>.

Suggested change
scrollProgress: any;
scrollProgress: MotionValue<number>;

</div>
<div className="text-center mt-20 text-gray-600 text-xs font-mono">
<p>TERMINAL SESSION ACTIVE // ID: {Math.random().toString(36).substr(2, 6).toUpperCase()}</p>
<p>SESI TERMINAL AKTIF // ID: {Math.random().toString(36).substr(2, 6).toUpperCase()}</p>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

ID sesi terminal ini dibuat menggunakan Math.random() langsung di dalam JSX, yang berarti ID baru akan dibuat setiap kali komponen dirender ulang. Hal ini mungkin bukan perilaku yang diinginkan jika Anda ingin ID tetap konsisten selama masa aktif komponen.

Untuk memastikan ID hanya dibuat sekali saat komponen pertama kali dimuat, gunakan hook useMemo.

Suggested change
<p>SESI TERMINAL AKTIF // ID: {Math.random().toString(36).substr(2, 6).toUpperCase()}</p>
<p>SESI TERMINAL AKTIF // ID: {sessionId}</p>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant