Akses kelas selamanya

Ambil Promo
flash sale
hamburger-menu

Tips Frontend Development

Meningkatkan skills menjadi 1% lebih baik

Kelas Mengubah Design Figma Menjadi HTML, TailwindCSS, JavaScript dan Deploy ke Github Pages di BuildWithAngga

Mengubah Design Figma Menjadi HTML, TailwindCSS, JavaScript dan Deploy ke Github Pages

Daftar Isi Latar BelakangPersyaratanProses Mengubah Desain Figma ke HTML, TailwindCSS, JavaScriptDeploy Projek ke Github Pages Menggunakan Github Action Latar Belakang Figma banyak digunakan untuk mendesain antarmuka web. Namun, desain tersebut perlu dikonversi ke kode agar bisa diakses secara online. Proses ini melibatkan HTML untuk struktur, Tailwind CSS untuk styling yang cepat dan konsisten, serta JavaScript untuk interaktivitas. Setelah selesai, halaman hasil konversi dapat dideploy menggunakan Github Pages secara gratis. Dengan demikian, penting untuk mempelajari alur kerja dari desain Figma hingga menjadi halaman web yang aktif dan responsif. Persyaratan Personal Computer atau LaptopAkun FigmaAkun GithubCode Editor (Pada tutorial ini menggunakan VSCode)Git Proses Mengubah Desain Figma ke HTML, TailwindCSS, JavaScript Buka file desain yang akan diubah menjadi HTML. Pada tutorial ini saya menggunakan desain dari Shayna.com yaitu Pricing Pro. PricingPro - Figma Page Selanjutnya kita akan buat projek. Buka Terminal lalu buat folder baru dengan perintah mkdir pricing-pro (pricing-pro adalah nama projek, silahkan sesuaikan dengan projek kalian). Pricing Pro - Create Page Kemudian pilih direktori yang kita buat dengan perintah cd pricing-pro lalu buka code editor dengan perintah code . Pricing Pro - Open Text Editor Maka akan tampil windows baru VSCode dengan projek yang sudah kita buat. Sekarang bisa tutup Terminal dan bisa menggunakan Command Prompt bawaan VSCode. Pricing Pro - After Open VSCode Untuk membuka Command Prompt di VSCode tekan ctrl + j atau kalian juga bisa menggunakan Terminal bawaan dari Windows seperti sebelumnya.Selanjutnya kita perlu inisialisasi projek node.js dengan perintah npm init -y Pricing Pro - Terminal Selanjutnya kita install tailwindcss dan @tailwindcss/cli dengan perintah npm i tailwindcss @tailwindcss/cli Pricing Pro - Terminal Kemudian buat struktur projek seperti berikut ini Pricing Pro - Structure Folder Buka file input.css lalu import tailwindcss seperti pada gambar berikut Pricing Pro - CSS File Buka file index.html dan ubah jadi seperti berikut Pricing Pro - HTML File Buka command prompt lalu ketik perintah berikut npx @tailwindcss/cli -i ./src/input.css -o ./src/output.css --watch Pricing Pro - Running The Project Tambah command prompt baru kemudian install live-server dengan cara npm i -g live-server. Jika sudah jalankan perintah live-server —watch=”src/index.html” Pricing Pro - Terminal Buka browser jika tampilan sudah seperti berikut ini maka TailwindCSS sudah terpasang dengan benar. Pricing Pro - Result in Browser Sekarang kita akan menentukan font dan color. Buka desain figma lalu pilih teks untuk mengetahui jenis font yang dipakai, umumnya desain web hanya menggunakan satu jenis font. Pada tutorial ini kita akan menggunakan Poppins. Pricing Pro - Text in Figma Buka lagi file input.css lalu tambahkan custom font Poppins ke TailwindCSS Pricing Pro - CSS File Jika berhasil maka font nya akan berubah seperti pada gambar berikut Pricing Pro - Result in Browser Sekarang kita akan membuat variable color untuk TailwindCSS. Pada desain figma pilih layer terluar dan lihat pada sidebar kanan Selections colors. Pada tutorial ini saya akan menggunakan #FFFFFF ****sebagai background color, #0A0815 sebagai foreground color, dan #EB7145 sebagai primary color. ****Untuk penamaan color tidak harus sama, silahkan bebas tentukan sesuai keinginan kalian. Pricing Pro - CSS File Sekarang lihat hasilnya, jika sukses maka akan seperti berikut ini Pricing Pro - Detection Sekarang kita akan mencoba slicing header. Pada desain figma pilih frame untuk header, di sini kita akan menentukan lebar, tinggi, dan warna background. Sesuai dengan desain lebar 1512px, tinggi 752px, dan warna background adalah warna foreground. Pricing Pro - HTML File Untuk menentukan padding horizontal dan padding top dari navbar, pilih frame yang diperlukan lalu tekan alt sambil arahkan kursor ke frame lain yang ingin kita ketahui jaraknya. Dari sini kita dapat tentukan padding x nya 100px dan padding top nya 30px Kita tarapkan pada kode HTML seperti berikut ini Pricing Pro - Header in HTML File Sekarang kita akan buat logo, karena di sini logonya hanya menggunakan teks kita hanya perlu menerapkan style nya menggunakan TailwindCSS. Dari desain ini kita tahu font size 32px, font weight bold, line height auto, dan warna teks primary. Pricing Pro - Company Logos Figma Sekarang kita coba terapkan pada kode HTML. Biasanya logo akan dibungkus oleh tag a. Oh iya, kita perlu menambahkan class -z-50 pada background agar background tidak menutupi teks. Pricing Pro - Company Logos VSCode Dan hasilnya akan seperti ini Pricing Pro - Result Deploy Projek ke Github Pages Menggunakan Github Action Buat repository baru di Github Pricing Pro - Github Sebelum inisialisasi git, buat file dengan nama .gitignore di root direktori projek lalu tambahkan node_modules Pricing Pro - Ignore File Sekarang buat Github Action. Buat file dengan nama gh-page.yml letakkan pada direktori .github/workflows, maka akan seperti berikut ini. Pricing Pro - File Kemudian tambahkan kode berikut ini ke dalam file gh-page.yml name: Deploy to GitHub Pages on: push: branches: - main # Pastikan branch utama sesuai dengan repo kamu permissions: contents: write # Izinkan workflow menulis ke repository jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Deploy to GitHub Pages uses: JamesIves/github-pages-deploy-action@v4 with: branch: gh-pages # Membuat dan mengupdate branch gh-pages folder: src # Sesuaikan dengan lokasi index.html (src/) clean: true Sekarang buka command prompt lalu ketik perintah git init (Pastikan Git sudah terinstall)Kemudian git add .Lalu git commit -m “chore: first commit”Setelah itu buat branch dengan perintah git branch -M mainLalu tambahkan repository dengan perintah git remote add origin <https://github.com/cakfan/bwa-pricing-pro.git>Kemudian push ke repository yang sudah kita buat dengan perintah git push -u origin main Pricing Pro - Terminal Buka halaman Settings pada repository. Kemudain pilih Pages di bagian Code and automation. Kemudan pada Branch pilih gh-page lalu klik Save Pricing Pro - Github Untuk mengakses github page kita https://{username}.github.io/{nama_repository} pada tutorial ini adalah https://cakfan.github.io/bwa-pricing-pro untuk slicing yang sudah selesai bisa diakses di https://cakfan.github.io/pricing-pro

Kelas Slicing Figma ke HTML : Hero Section - Broperti di BuildWithAngga

Slicing Figma ke HTML : Hero Section - Broperti

Daftar Isi Sebelum Mulai SlicingStruktur HTMLNavigasi AtasJudul dan DeskripsiForm Filter PropertiFull KodePenutup Broperti - Hero Section Kalau dilihat sekilas, hero section itu kelihatan gampang tinggal pasang logo, bikin menu, tulis judul gede, kasih gambar background, selesai. Tapi waktu mulai nyoba slicing beneran, baru deh kerasa : “Lho kok spacing nya beda?”“Ini teks kenapa nggak center center amat ya?”“Kenapa form nya geser padahal di figma lurus?” Nah, di artikel ini kita akan bahas bareng cara slicing Hero Section - Broperti, dari desain Figma ke HTML menggunakan Tailwind CSS. Sebelum Mulai Slicing Biasanya godaan terbesar waktu buka FIgma itu langsung aja bikin div kasih class dan jalan terus. Tapi percayalah, tanpa paham dulu pola layout nya kamu bakal bolak balik revisi. Jadi, sebelum ngetik satu baris pun, ada baiknya kita pelajari dulu strukturnya. Di Hero Broperti ini ada 3 bagian utama : Navigasi (Logo, Menu, Tombol Akun)Headline + DeskripsiForm filter properti Dan semuanya ditaruh di atas background gambar yang full screen. Struktur HTML Kita mulai dengan membungkus semuanya dalam <header> dan kasih id="hero" : <header id="hero"> ... </header> <header> ... </header> Ini adalah tag semantik HTML5 yang dipakai buat menandai bagian header dari sebuah halaman atau section. Ini penanda “bagian atas” dari konten penting. Bukan cuma buat SEO, tapi juga bantu screen reader memahami struktur halaman. id="hero” Ini adalah atribut HTML yang ngasih identitas unik ke elemen tersebut. Berfungsi buat nandain bahwa ini adalah Hero Section bagian yang biasanya pertama kali dilihat pengunjung saat buka website. CSS untuk mengatur background image biar full : #hero { background-image: url(assets/images/photos/hero-background.png); background-size: cover; background-position: center; background-repeat: no-repeat; width: 100vw; height: 800px; } #hero { ... } Ini artinya kita lagi ngasih gaya khusus ke elemen yang punya id="hero". background-image: url(...) Ini buat ngasih gambar latar belakang ke hero section. url(assets/images/photos/hero-background.png) Artinya gambar di-load dari folder assets/images/photos. background-size: cover Gambar background-nya di-zoom biar nutupin seluruh area hero. background-position: center Ini ngatur posisi gambar supaya bagian tengahnya yang tampil. background-repeat: no-repeat Gambar nggak diulang (no tile/tile-tile gitu). width: 100vw vw = viewport width (lebar layar browser). 100vw artinya lebarnya 100% dari layar browser, jadi bener-bener full lebar. height: 800px Ini ngatur tinggi si hero section: 800 pixel. Navigasi Atas Bagian nav ini isinya adalah : Logo di kiriMenu di tengahTombol “My Account” di kanan Kita pakai flex dan kasih justify-between biar rapi : <nav class="px-[90px] pt-[40px] flex items-center justify-between"> px-[90px] Ini ngatur padding kiri dan kanan jadi 90 pixel, supaya isi <nav> gak nempel ke pinggir layar. pt-[40px] Ini buat ngasih jarak dari atas (padding top) sebesar 40 pixel, jadi nav-nya turun dikit dari atas halaman. flex Ini aktifin mode flexbox di <nav>, biar elemen-elemen di dalamnya (kayak logo dan menu) bisa disusun sejajar secara horizontal. items-center Ini bikin semua item di dalam flex disejajarkan di tengah secara vertikal, jadi tampilannya lebih rapi. justify-between Ini bikin elemen pertama nempel kiri dan elemen terakhir nempel kanan, dengan jarak kosong maksimal di antara mereka. Cocok buat layout logo di kiri, menu di kanan. Menu nya pakai <ul> dan dikasih gap-x-[43px] biat spasinya sesuai desain. Untuk hover, tinggal mainin hover:text-[#83D987] dan hover:font-medium . Judul dan Deskripsi Setelah nav, lanjut ke konten utama : Judul besar dan deskripsi kecil di bawahnya. Tailwind bantu banget buat ngatur Typography tanpa ribet. <h1 class="text-[48px] text-white font-semibold leading-[65px] max-w-[461px]"> Discover Your <br> Own Future Empire Easy Cozy </h1> <p class="text-[16px] text-[#9094A2] max-w-[352px] mt-[20px] leading-[32px]"> Saving much time by finding the match one using our algorithm... </p> text-[48px] Ini ngatur ukuran hurufnya jadi 48 pixel, supaya judulnya besar dan mencolok. text-white Warna teksnya diubah jadi putih, biar kontras sama background. font-semibold Ini bikin hurufnya agak tebal, tapi nggak setebal bold. leading-[65px] Ini ngatur jarak antar baris teksnya jadi 65 pixel, supaya teks gak dempet-dempet pas ada <br>. max-w-[461px] Ini batasi lebar maksimum elemen jadi 461 pixel, biar teks nggak kepanjangan ke samping. Di sini penting banget perhatiin ukuran teks dan line height biar visualnya enak dilihat, dan sama persis dengan desain. Form Filter Properti Bagian paling “Interaktif” di hero ini adalah : Form pencarian properti berdasarkan lokasi dan tipe. Strukturnya simpel : 2 dropdown dan satu tombol <form action="" class="flex items-end gap-x-[21px] text-[#020B2A]"> <div> <div class="w-[230px]"> <label id="location" class="text-[14px] font-normal">Location</label> <select name="location" id="location" class="mt-[4px] appearance-none w-full focus:outline-none bg-[#F7F7F9] px-[10px] py-[10.5px] rounded-[6px] text-[16px] font-medium" > <option value="">Sumatra Tenggara</option> <option value="">Sumatra Selatan</option> <option value="">Sumatra Utara</option> <option value="">Sumatra Barat</option> </select> </div> </div> <div> <div class="w-[230px]"> <label id="type" class="text-[14px] font-normal">Type</label> <select name="type" id="type" class="mt-[4px] appearance-none w-full focus:outline-none bg-[#F7F7F9] px-[10px] py-[10.5px] rounded-[6px] text-[16px] font-medium" > <option value="">Apartement</option> <option value="">Townhouse</option> <option value="">Mansion</option> <option value="">Resort</option> </select> </div> </div> <div> <button type="submit" class="px-[30px] py-[21.5px] text-[#132039] bg-[#83D987] hover:bg-[#70bb74] duration-300 transition-all cursor-pointer rounded-[4px] font-medium text-[18px]" > Explore Now </button> </div> </form> form Tag HTML untuk membungkus input, biasanya digunakan untuk kirim data ke server. flex Bikin elemen di dalam <form> disusun horizontal (sejajar). items-end Semua elemen di dalam form ditempatkan sejajar di bagian bawah (end), supaya button dan dropdown rata bawah. gap-x-[21px] Ngatur jarak horizontal antar elemen jadi 21 pixel, supaya gak nempel. text-[#020B2A] Semua teks di dalam form warnanya jadi biru gelap kehitaman, biar lebih readable. w-[230px] Lebar div dibatasi jadi 230 pixel, buat ngebatesin lebar dropdown. label Tag untuk menjelaskan input, berguna juga untuk aksesibilitas. text-[14px] Ukuran teks label: 14 pixel, kecil dan elegan. font-normal Berarti hurufnya normal (nggak tebal). select Tag untuk bikin dropdown pilihan. mt-[4px] Ngasih jarak 4 pixel ke atas dari label. appearance-none Hilangkan tampilan default browser (panah dropdown bawaan), biar bisa dikustom pakai CSS. w-full Dropdown ngikutin lebar div induknya (230px). focus:outline-none Waktu elemen ini difokuskan (klik/tab), outline bawaan browser dihilangkan. bg-[#F7F7F9] Warna latar belakang dropdown jadi abu terang (#F7F7F9), bikin tampilannya bersih. px-[10px] py-[10.5px] Padding dalam dropdown: horizontal 10px, vertikal 10.5px. Buat isinya gak terlalu sempit. rounded-[6px] Bikin sudut dropdown agak membulat (radius 6px), biar modern. text-[16px] Ukuran teks dropdown: 16 pixel. font-medium Hurufnya agak tebal sedikit, bukan normal tapi juga bukan bold. button Tag untuk tombol aksi. Di sini fungsinya untuk kirim form. type="submit" Ini penting biar waktu tombol diklik, form akan dikirim (submit). px-[30px] py-[21.5px] Padding tombol: horizontal 30px, vertikal 21.5px. Biar kelihatan besar dan gampang diklik. text-[#132039] Warna teks: biru gelap (#132039). bg-[#83D987] Warna background tombol: hijau muda (#83D987). hover:bg-[#70bb74] Waktu kursor diarahkan ke tombol, warnanya jadi hijau sedikit lebih gelap. duration-300 transition-all Efek transisinya halus selama 300ms saat hover (warna berubah pelan, nggak langsung). cursor-pointer Bikin kursor berubah jadi tangan saat diarahkan ke tombol, tanda tombol bisa diklik. rounded-[4px] Sudut tombol dibikin sedikit membulat (4px), tampak modern. font-medium Teks di tombol agak tebal. text-[18px] Ukuran huruf tombol: 18 pixel, cukup besar buat CTA. Dropdown-nya pakai select, dikasih appearance-none biar styling default browser hilang. Background-nya abu muda (#F7F7F9), dan semuanya dibungkus dalam div putih dengan padding dan rounded corner Full Kode <header id="hero"> <nav class="px-[90px] pt-[40px] flex items-center justify-between"> <div> <a href=""> <img src="assets/images/logos/logo.svg" alt="" class="w-[53.4px] h-[60px] shrink-0" /> </a> </div> <div> <ul class="text-[18px] font-normal text-[#9094A2] flex items-center gap-x-[43px]" > <li class="font-medium text-[#83D987]"><a href="">Home</a></li> <li class="hover:font-medium hover:text-[#83D987] transition-all duration-300" > <a href="">Featured</a> </li> <li class="hover:font-medium hover:text-[#83D987] transition-all duration-300" > <a href="">Stories</a> </li> <li class="hover:font-medium hover:text-[#83D987] transition-all duration-300" > <a href="">Partner</a> </li> <li class="hover:font-medium hover:text-[#83D987] transition-all duration-300" > <a href="">About</a> </li> </ul> </div> <div> <a href=""> <div class="px-[31.5px] py-[11.5px] bg-[#83D987] hover:bg-[#70bb74] duration-300 transition-all text-[18px] text-[#132039] font-medium rounded-[4px]" > My Account </div> </a> </div> </nav> <section class="px-[90px] mt-[119px]"> <h1 class="text-[48px] text-white font-semibold leading-[65px] max-w-[461px]" > Discover Your <br /> Own Future Empire Easy Cozy </h1> <p class="text-[16px] text-[#9094A2] max-w-[352px] mt-[20px] leading-[32px]" > Saving much time by finding the match one using our algorithm that we designed </p> <div class="bg-white p-[21px] w-fit mt-[60px] rounded-[6px]"> <form action="" class="flex items-end gap-x-[21px] text-[#020B2A]"> <div> <div class="w-[230px]"> <label id="location" class="text-[14px] font-normal" >Location</label > <select name="location" id="location" class="mt-[4px] appearance-none w-full focus:outline-none bg-[#F7F7F9] px-[10px] py-[10.5px] rounded-[6px] text-[16px] font-medium" > <option value="">Sumatra Tenggara</option> <option value="">Sumatra Selatan</option> <option value="">Sumatra Utara</option> <option value="">Sumatra Barat</option> </select> </div> </div> <div> <div class="w-[230px]"> <label id="type" class="text-[14px] font-normal">Type</label> <select name="type" id="type" class="mt-[4px] appearance-none w-full focus:outline-none bg-[#F7F7F9] px-[10px] py-[10.5px] rounded-[6px] text-[16px] font-medium" > <option value="">Apartement</option> <option value="">Townhouse</option> <option value="">Mansion</option> <option value="">Resort</option> </select> </div> </div> <div> <button type="submit" class="px-[30px] py-[21.5px] text-[#132039] bg-[#83D987] hover:bg-[#70bb74] duration-300 transition-all cursor-pointer rounded-[4px] font-medium text-[18px]" > Explore Now </button> </div> </form> </div> </section> </header> Penutup Slicing desain hero section ini sebenarnya nggak ribet, asal kamu: Paham dulu struktur layout-nyaPerhatiin spacing dan ukuran font sesuai desainJangan asal pakai grid atau flex — sesuaikan dengan kebutuhan layout Dengan pendekatan step-by-step seperti ini, kamu bisa slicing desain apapun dari Figma ke HTML + Tailwind dengan lebih percaya diri. 🎯

Kelas Cara Cepat Membuat Komponen UI Menggunakan ChatGPT di BuildWithAngga

Cara Cepat Membuat Komponen UI Menggunakan ChatGPT

Daftar Isi Kenapa Perlu menggunakan ChatGPT?Contoh Kasus: Komponen Tombol TailwindHasil yang Bisa Kita Dapatkan:Struktur Dasar Dokumen HTML:Bagian <head> :Bagian <body>:Komponen Tombol:Tips Prompting Buat KomponenReusable dan ModularReview Manual Tetap PentingKesimpulan Source : https://unsplash.com/photos/a-computer-chip-with-the-letter-a-on-top-of-it-eGGFZ5X2LnA Sebagai seorang UI Engineer, kita sering kali dihadapkan pada kebutuhan untuk membuat berbagai komponen dengan tampilan dan logika yang serupa. Proses ini dapat memakan waktu, terutama jika setiap kali harus dimulai dari awal. Dalam konteks inilah ChatGPT dapat berperan sebagai asisten coding yang efisien dan membantu mempercepat alur kerja. Kenapa Perlu menggunakan ChatGPT? Meskipun kita sudah jago membuat komponen, tetap saja mengetik manual dari awal itu memakan waktu. Dengan ChatGPT, kita bisa malakukan beberapa yaitu : Dapatkan draft awal kode komponen dalam hitungan detikFokus ke bagian logika atau desain yang lebih kompleksHemat waktu untuk pekerjaan berulang Contoh Kasus: Komponen Tombol Tailwind Misalnya kita ingin membuat tombol sederhana dengan Tailwind CSS. Cukup memberi perintah seperti ini ke ChatGPT : Prompt:Buatkan komponen tombol HTML dengan Tailwind CSS. Harus ada versi primary dan secondary, dengan hover effect dan disabled state. Hasil yang Bisa Kita Dapatkan: My First Search ChatGPT <button class="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700 disabled:bg-gray-400"> Primary Button </button> <button class="bg-white border border-blue-600 text-blue-600 px-4 py-2 rounded hover:bg-blue-50 disabled:opacity-50"> Secondary Button </button> Kita bisa langsung menggunakan, atau modifikasi agar lebih sesuai dengan guideline desain tim kita. Selain itu kita juga bisa meletakkan kode tersebut di dalam kode yang telah ada seperti berikut: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <!-- CDN Tailwind --> <script src="<https://cdn.tailwindcss.com>"></script> <title>Sidebar Scroll Independent</title> </head> <body class="flex justify-center gap-4 py-32"> <!-- dari sini --> <button class="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700 disabled:bg-gray-400"> Primary Button </button> <button class="bg-white border border-blue-600 text-blue-600 px-4 py-2 rounded hover:bg-blue-50 disabled:opacity-50"> Secondary Button </button> <!-- sampai sini --> </body> </html> Struktur Dasar Dokumen HTML: <!DOCTYPE html> Mendefinisikan bahwa dokumen ini adalah dokumen HTML5. <html lang="en"> Elemen root HTML dengan atribut lang="en" yang menandakan bahasa utama adalah Inggris (baik untuk SEO dan screen reader). Bagian <head>: <meta charset="UTF-8" /> Menetapkan karakter encoding ke UTF-8 agar teks ditampilkan dengan benar, termasuk karakter internasional. <meta name="viewport" content="width=device-width, initial-scale=1.0" /> Mengatur tampilan agar responsive di perangkat mobile. width=device-width memastikan lebar sesuai perangkat, initial-scale=1.0 mengatur zoom awal. <script src="https://cdn.tailwindcss.com"></script> Memuat Tailwind CSS dari CDN. Ini memungkinkan kamu menggunakan class Tailwind langsung tanpa build proses. <title>Sidebar Scroll Independent</title> Judul halaman yang muncul di tab browser. Bagian <body>: <body class="flex justify-center gap-4 py-32"> flex: Mengatur layout menjadi flex container (horizontal secara default).justify-center: Memposisikan isi secara horizontal di tengah.gap-4: Memberi jarak antar elemen sebesar 1rem.py-32: Padding atas dan bawah sebesar 8rem. Komponen Tombol: Tombol Primary <button class="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700 disabled:bg-gray-400">Primary Button</button> bg-blue-600: Latar biru.text-white: Teks putih.px-4 py-2: Padding horizontal 1rem, vertikal 0.5rem.rounded: Sudut membulat.hover:bg-blue-700: Ubah warna saat di-hover.disabled:bg-gray-400: Jika tombol disabled, warnanya abu-abu. Tombol Secondary <button class="bg-white border border-blue-600 text-blue-600 px-4 py-2 rounded hover:bg-blue-50 disabled:opacity-50">Secondary Button</button> bg-white: Latar putih.border border-blue-600: Garis tepi biru.text-blue-600: Teks biru.hover:bg-blue-50: Hover menjadi biru muda.disabled:opacity-50: Jika disabled, tampilannya transparan 50%. Akan menghasilkan : My VSCode Result Tips Prompting Buat Komponen Supaya hasil dari ChatGPT makin relevan, maka kita perlu : Jelaskan framework yang kita pakai: HTML, React, Vue, dsb.Sebutkan library styling: Tailwind, Bootstrap, CSS Modules, dll.Minta variasi (primary/secondary), ukuran, dan kondisi (hover, focus, disabled)Sertakan spesifikasi desain jika ada Contoh prompt yang lebih kompleks: My Second Search ChatGPT Buat komponen tombol React menggunakan Tailwind, dengan props variant (primary, secondary), dan event onClick. Reusable dan Modular Kalau kita menggunakan React atau Vue, minta ChatGPT buatkan komponen yang sudah siap menerima props, seperti kode dibawah ini : const Button = ({ variant = 'primary', children, ...props }) => { const baseStyle = 'px-4 py-2 rounded'; const styles = { primary: 'bg-blue-600 text-white hover:bg-blue-700', secondary: 'bg-white border border-blue-600 text-blue-600 hover:bg-blue-50', }; return ( <button className={`${baseStyle} ${styles[variant]}`} {...props}> {children} </button> ); }; Review Manual Tetap Penting Walau sangat membantu, hasil dari ChatGPT tetap perlu kita review: Pastikan aksesibilitas (contoh: penggunaan aria-label)Periksa konsistensi dengan design system timJangan langsung copy-paste ke production Kesimpulan ChatGPT bukan pengganti kita sebagai UI Engineer, tapi bisa jadi partner yang mempercepat workflow. Dengan prompt yang tepat, kita bisa menghemat banyak waktu dalam membuat komponen UI dari tombol sederhana sampai layout kompleks. Apabila kalian ingin mempelajari AI lebih lanjut, di BuildWithAngga telah menyediakan kelas yang membahas tentang tentang AI, dimuali dari A hingga Z, sehingga membantu menambah pemahaman kalian di era zaman AI ini. Terimakasih!

Kelas Membuat Efek Love (Like) dari Outline Menjadi Full di Website di BuildWithAngga

Membuat Efek Love (Like) dari Outline Menjadi Full di Website

Daftar Isi TujuanStruktur HTMLStyling CSSJavascript Untuk Efek LikePenutup Efek "love" atau "like" sering kita jumpai di aplikasi belanja online, seperti saat pengguna menyukai sebuah produk. Efek ini biasanya berupa ikon hati kosong (outline) yang berubah menjadi hati penuh saat diklik, disertai dengan animasi kecil yang memperkuat pengalaman pengguna. Tujuan Shaynakit - ShoSo Cards Preview Memberikan feedback visual interaktif kepada pengguna melalui efek "love".Menambahkan fitur favorit produk yang dapat dikembangkan menjadi wishlist.Meningkatkan tampilan UI/UX agar lebih modern dan menarik.Memperkenalkan integrasi JavaScript dan Tailwind CSS secara sederhana. Struktur HTML Kita mulai dengan struktur HTML untuk menampilkan nama produk dan tombol love. <div class="mt-[10px] flex justify-between relative z-50"> <div> <p class="text-[12px] text-[#9E9E9E]">7 Colours</p> <h6 class="text-[16px] text-[#131E3F] font-semibold mt-[2px] line-clamp-1 max-w-[160px] duration-300 transition-all break-words w-full"> Nike Red Shoe </h6> </div> <div class="love-container pt-[9px]"> <button type="button" class="love-button"> <img src="assets/images/icons/love-outline.svg" alt="Like" class="w-[24px] h-[24px] shrink-0 love-icon"> </button> </div> </div> Styling CSS Tambahkan CSS berikut ke file style.css kamu atau di dalam <style> .love-button { transition: all 0.3s ease; } .love-button:hover .love-icon { transform: scale(1.1); } .love-button.active .love-icon { transform: scale(1.1); } .love-icon { transition: transform 0.2s ease; } Javascript Untuk Efek Like Tambahkan kode ini di file main.js dan hubungkan ke file HTML kamu. const loveButtons = document.querySelectorAll('.love-button'); loveButtons.forEach(button => { let isLoved = false; const icon = button.querySelector('.love-icon'); button.addEventListener('click', function() { isLoved = !isLoved; if (isLoved) { icon.src = "assets/images/icons/love.svg"; icon.alt = "Unlike"; button.classList.add('active'); } else { icon.src = "assets/images/icons/love-outline.svg"; icon.alt = "Like"; button.classList.remove('active'); } icon.style.transform = 'scale(1.2)'; setTimeout(() => { icon.style.transform = 'scale(1)'; }, 200); }); }); Penjelasan: Variabel isLoved menyimpan status like.Mengganti src dan alt dari ikon tergantung status.Animasi scale(1.2) memberi efek membesar saat diklik lalu kembali normal. Penutup Dengan kombinasi HTML, Tailwind CSS, dan JavaScript sederhana, kamu bisa menambahkan efek "love" interaktif yang menarik dan modern untuk meningkatkan UX pada website e-commerce atau galeri produkmu. Apabila kalian ingin mempelajari logika setipe lebih lanjut, di BuildWithAngga telah menyediakan kelas yang membahas hal tersebut, sehingga membantu menambah pengalaman belajar lebih baik by study kasus yang mana ilmu tersebut sangat relevan di era sekarang. Terimakasih!

Kelas Cara Mudah Membuat Dropdown Smooth dengan jQuery ( Tailwind CSS ) di BuildWithAngga

Cara Mudah Membuat Dropdown Smooth dengan jQuery ( Tailwind CSS )

Daftar Isi Pengenalan Dropdown Menu InteraktifApa Itu Dropdown Menu?Kenapa Menggunakan Animasi Smooth?Keuntungan Dropdown Default Terbuka Sejak AwalMembangun Struktur HTMLKeseluruhanHeadBodyMembangun Struktur JavaScript (JQuery)Penutup Pengenalan Dropdown Menu Interaktif Apa Itu Dropdown Menu? Dropdown menu (sering juga disebut select menu atau pulldown menu) adalah komponen navigasi/interaksi yang menyembunyikan daftar opsi di balik sebuah kontrol tunggal (misalnya tombol atau bidang teks), dan menampilkannya saat pengguna mengaktifkan kontrol tersebut. Karakteristik utama:Terselubung (collapsed): Pada kondisi normal, hanya judul atau label menu yang terlihat.Melebar (expanded): Saat diaktifkan, daftar opsi muncul bisa berupa teks, ikon, atau elemen kompleks lainnya.Interaksi: Biasanya menggunakan klik, tap, atau hover. Setelah pengguna memilih salah satu item, menu otomatis menutup kembali (kecuali diatur lain).Kegunaan umum:Memilih opsi pada form (misalnya memilih negara, jenis kelamin, dsb.)Navigasi situs (menu utama dengan sub-menu)Menyembunyikan opsi-opsi lanjutan agar tampilan lebih ringkas Lalu ada dropdown menu otomatis terbuka yang saat ini sedang kita pelajari, adalah varian di mana daftar opsi muncul tanpa perlu klik/tap, melainkan dipicu oleh Saat Halaman Dimuat (on-load), yaitu : Dropdown langsung terbuka begitu halaman selesai dimuat (page load).Umumnya digunakan untuk menekankan pilihan awal atau menampilkan pengumuman. Kenapa Menggunakan Animasi Smooth? Mengurangi Kejutan VisualMemberi Indikasi StatusDengan transisi, konten dropdown perlahan muncul → mata pengguna lebih siap membaca dan menyerap informasi.Gerakan dari atas ke bawah, atau fade-in, memberi sinyal visual tentang asal-usul dan tujuan menu itu sendiri.Website atau aplikasi dengan transisi halus terlihat lebih modern, meyakinkan, dan berkualitas tinggi. Keuntungan Dropdown Default Terbuka Sejak Awal Pengguna langsung melihat semua opsi tanpa harus klik dulu. Tidak perlu klik untuk membuka → cocok untuk akses cepat. Berguna di perangkat mobile atau untuk pengguna dengan keterbatasan motorik. Pilihan dropdown default terbuka bisa mempercepat pengisian data. Membangun Struktur HTML Keseluruhan <!-- index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Dropdown Menu Jquery</title> </head> <body> <!-- abaikan ini dulu --> </body> </html> <!DOCTYPE html> (Deklarasi doctype) Menyatakan bahwa dokumen ini menggunakan HTML5. <html lang="en"> (Tag pembuka <html> dengan atribut lang="en") Awal dari dokumen HTML; lang="en" menyatakan bahasa Inggris. <head> (Tag pembuka <head>) Bagian metadata, tidak ditampilkan di halaman secara langsung. <meta charset="UTF-8" /> (Meta charset) Mengatur encoding karakter ke UTF-8, mendukung banyak bahasa/simbol. <meta name="viewport" content="width=device-width, initial-scale=1.0" /> (Meta viewport) Membuat tampilan responsif di perangkat mobile/tablet. <title>Dropdown Menu Jquery</title> (Tag <title>) Judul halaman yang muncul di tab browser atau hasil pencarian. </head> (Tag penutup <head>) Mengakhiri bagian metadata. <body> (Tag pembuka <body>) Bagian utama tempat elemen konten ditampilkan di browser. <!-- abaikan ini dulu --> (Komentar HTML) Catatan pengembang; tidak akan terlihat di tampilan browser. </body> (Tag penutup <body>) Mengakhiri bagian konten utama halaman. </html> (Tag penutup <html>) Menandakan akhir dokumen HTML. Head <!-- index.html --> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link href="<https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap>" rel="stylesheet" /> <script src="<https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4>"></script> <title>Dropdown Menu Jquery</title> <style> body { font-family: "Poppins", sans-serif; } </style> </head> <link href="<https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap>" rel="stylesheet" /> (Tag <link> untuk font) Mengimpor font Poppins dari Google Fonts dengan varian ketebalan 400, 500, 600, dan 700. Digunakan untuk mempercantik tampilan teks pada halaman. rel="stylesheet" menandakan bahwa ini adalah file CSS eksternal. <script src="<https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4>"></script> (Tag <script> untuk Tailwind via CDN) Mengimpor versi browser dari Tailwind CSS langsung dari CDN jsDelivr. Script ini memungkinkan penggunaan Tailwind CSS tanpa perlu proses build, cocok untuk proyek kecil atau prototipe. Tag <style> Menambahkan CSS langsung di dalam HTML. Dalam contoh ini, font pada elemen <body> diatur agar menggunakan Poppins (dengan fallback sans-serif jika font gagal dimuat). Body <!-- index.html --> <main class="relative mx-auto px-5 pt-[100px] min-h-screen w-full max-w-[640px] bg-[#F4F5F7]"> <section id="BookingDetails" class="flex flex-col gap-4 rounded-3xl border border-[#E4E5E9] bg-white px-[14px] py-[14px]"> <div class="flex items-center justify-between"> <h2 class="font-semibold">Booking Details</h2> <!-- fokus pada sini --> <button type="button" data-expand="BookingDetailsJ" class="cursor-pointer"> <img src="assets/arrow.svg" alt="icon" class="h-[32px] w-[32px] shrink-0 transition-all duration-300" /> </button> <!-- sampai sini --> </div> <!-- fokus pada sini --> <div class="flex flex-col gap-4" id="BookingDetailsJ"> <!-- sampai sini --> <div class="flex justify-between"> <div class="flex items-center gap-[10px]"> <img src="assets/note.svg" alt="icon" class="h-[24px] w-[24px] shrink-0" /> <p class="text-[#43484C]">Sub Total</p> </div> <strong class="font-semibold">Rp 180.394.392</strong> </div> <hr class="border-[#E4E5E9]" /> <div class="flex justify-between"> <div class="flex items-center gap-[10px]"> <img src="assets/note.svg" alt="icon" class="h-[24px] w-[24px] shrink-0" /> <p class="text-[#43484C]">Tax 11%</p> </div> <strong class="font-semibold">Rp 18.495.699</strong> </div> <hr class="border-[#E4E5E9]" /> <div class="flex justify-between"> <div class="flex items-center gap-[10px]"> <img src="assets/note.svg" alt="icon" class="h-[24px] w-[24px] shrink-0" /> <p class="text-[#43484C]">Insurance</p> </div> <strong class="font-semibold">Free for All</strong> </div> <hr class="border-[#E4E5E9]" /> <div class="flex justify-between"> <div class="flex items-center gap-[10px]"> <img src="assets/note.svg" alt="icon" class="h-[24px] w-[24px] shrink-0" /> <p class="text-[#43484C]">Service Tools</p> </div> <strong class="font-semibold">Free for All</strong> </div> </div> </section> </main> <!-- fokus pada sini --> <script src="<https://code.jquery.com/jquery-3.7.1.min.js>" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script> <script src="jquery.js"></script> <!-- sampai sini --> Script pertama : <script src="<https://code.jquery.com/jquery-3.7.1.min.js>" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script> memuat pustaka jQuery dari CDN, agar $ dan semua fungsi jQuery tersedia.Kedua memuat file jquery.js, yang berisi kode pada bab dibawah ini : Membangun Struktur JavaScript ( JQuery ) // jquery.js $(() => { $("[data-expand]").on("click", function (e) { $(this).children("img").toggleClass("-rotate-180"); let target = $(`#${$(this).data("expand")}`); target.slideToggle(); }); }); Kode JS ini mencari semua elemen yang memiliki atribut data-expand (dalam kasus kita hanya <button … data-expand="BookingDetailsJ">). Lalu dipasang event handler untuk klik.Di dalam handler, $(this) merujuk ke tombol yang diklik. Pemanggilan .data("expand") akan mengambil string "BookingDetailsJ", yaitu nilai dari atribut data-expand.Karakter back-tick (```) dan ${key} membentuk selektor jQuery "#BookingDetailsJ". jQuery kemudian mencari elemen dengan id="BookingDetailsJ" yaitu <div … id="BookingDetailsJ">..toggleClass("-rotate-180") menambahkan/menukar kelas Tailwind yang memutar ikon 180° setiap klik..slideToggle() menjalankan animasi “slide down/up” pada elemen target, sehingga bagian detail (#BookingDetailsJ) muncul atau hilang. Dengan cara ini, tombol <button data-expand="BookingDetailsJ"> “mengomunikasikan” ke mana ia harus mencari konten tersembunyi lewat nilai data-expand, dan jQuery menggunakan nilai itu untuk menemukan <div id="BookingDetailsJ"> agar bisa di-slideToggle(). Sederhana tapi sangat fleksibel—cukup ubah data-expand dan id untuk membuat dropdown lain tanpa mengubah kode JavaScript-nya. Penutup Dengan mekanisme data-expand dan id yang saling terhubung ini, kalian dapat membuat dropdown interaktif yang mudah dikembangkan dan dipelihara cukup dengan menyesuaikan nilai pada atribut HTML tanpa perlu mengubah logika JavaScript-nya. Apabila kalian ingin mengasah keterampilan slicing kalian maka jangan ragu belajar di website BuildWithAngga. Terima Kasih!

Kelas Membuat Video Player Youtube Custom dengan Plyr.io di BuildWithAngga

Membuat Video Player Youtube Custom dengan Plyr.io

Di tutorial kali ini, kita akan membahas cara membuat video player Youtube custom menggunakan **Plyr.io,** sebuah library ringan dan responsif yang mendukung berbagai jenis media seperti Youtube, Vimeo, HTML5 Video. Kita juga akan mengkombinasikannya dengan Tailwind CSS untuk tampilan yang modern dan fleksibel di berbagai ukuran layar. Tujuan Preview Kita akan slicing section Youtube player dengan : Tampilan responsif dan roundedTombol play tengah custom (menggunakan ikon SVG sendiri)Poster video customKontrol terbatas : Play, Progres, Mute, Fullscreen Struktur HTML <div class="max-w-[321.61px] h-[227.9px] md:max-w-[522px] md:h-[369.9px] lg:max-w-[635.04px] lg:h-[450px] relative flex items-center justify-center"> <div id="Video" class="flex w-[321.61px] h-[227.9px] md:w-[522px] md:h-[369.9px] lg:w-[635.04px] lg:h-[450px] object-cover shrink-0 rounded-[20.26px] md:rounded-[32.88px] lg:rounded-[40px] overflow-hidden"> <div id="player" data-plyr-provider="youtube" data-plyr-embed-id="bTqVqk7FSmY"></div> </div> </div> Container bersifat responsif menyesuaikan ukuran layar.Elemen dengan id="player" adalah target untuk player Youtube dari PlyrKamu bisa mengganti data-plyr-embed-id dengan ID video Youtube yang lain. Inisialisasi Plyr di JavaScript Buat file videoPlay.js dan isi dengan : const player = new Plyr("#player", { controls: ["progress", "mute", "fullscreen", "play-large"], }); Ini mengatur kontrol yang ditampilkan : Progres bar, Tombol Mute, Fullscreen dan tombol play di tengah. Styling Custom dengan CSS Tambahkan CSS berikut agar tampilan lebih elegan dan sesuai dengan branding : /* Tombol play tengah */ .plyr__control--overlaid { background: none !important; border: none !important; box-shadow: none !important; } .plyr__control--overlaid::before { content: ""; display: block; width: 50px; height: 50px; background-image: url("assets/images/icons/play-button.svg"); background-size: contain; background-repeat: no-repeat; background-position: center; } @media (min-width: 834px) { .plyr__control--overlaid::before { width: 70px; height: 70px; } } /* Sembunyikan icon default */ .plyr button[data-plyr="play"] svg { display: none; } /* Hapus efek hover mute & fullscreen */ .plyr__controls button[data-plyr="mute"]:hover, .plyr__controls button[data-plyr="fullscreen"]:hover { background: transparent !important; box-shadow: none !important; filter: none !important; } /* Ganti poster video */ .plyr__poster { background-image: url("assets/images/thumbnails/thumbnail-video.png") !important; background-size: cover !important; background-position: center; } Menghilangkan background, border, dan bayangan dari tombol play bawaan yang muncul di tengah video saat belum diputar.Menambahkan ikon play custom di tengah video sebagai ::before dari tombol.Gambar ikon diambil dari assets/images/icons/play-button.svg.Ukuran ikon play jadi lebih besar di layar yang lebih lebar (desktop/tablet).Menyembunyikan ikon SVG play default dari Plyr biar nggak tumpang tindih sama ikon custom.Menghapus efek hover pada tombol mute dan fullscreenMengganti poster video (gambar thumbnail sebelum play) dengan gambar custom.Gambar diambil dari assets/images/thumbnails/thumbnail-video.png.Gambar diset untuk cover penuh area video dan posisi tengah. Sertakan Library Plyr Letakkan di <head> dan sebelum penutup </body> HTML : <-- Di tag Head --> <link rel="stylesheet" href="<https://cdn.plyr.io/3.7.8/plyr.css>" /> <-- Sebelum Penutup --> <script src="<https://cdn.plyr.io/3.7.8/plyr.js>"></script> <script src="js/videoPlay.js"></script> Penutup Kalau kamu ingin membuat pemutar video YouTube yang lebih menarik dan enak dipakai di website-mu, Plyr.io adalah pilihan yang tepat. Caranya mudah, fiturnya lengkap, dan hasilnya lebih profesional daripada pemutar YouTube biasa.

Kelas Slicing Desain “Empty State Airplane” dari Figma ke HTML, Tailwind CSS dan JavaScript di VSCode di BuildWithAngga

Slicing Desain “Empty State Airplane” dari Figma ke HTML, Tailwind CSS dan JavaScript di VSCode

Daftar Isi Latar BelakangTujuan ArtikelTarget PembacaSetelah MembacaDownload DesainMembuat Akun FigmaImport ke FigmaMembaca DesainDi Bagian ini Kamu Akan Bisa :Shortcut KeyboardMembaca IconMembaca GambarMembaca LayoutMemulai SlicingDi Bagian ini Kamu Akan Bisa :Buka Folder SebelumnyaStarterSlicing 1Slicing 2Slicing 3Slicing 4Slicing 5Slicing 6Slicing 7Slicing 8Slicing 9Slicing 10Slicing 11Slicing 12Penutup Latar Belakang Dalam era pengembangan mobile-first, desain antarmuka harus dioptimalkan untuk layar kecil (maksimal 640px) dengan presisi pixel-perfect. Figma memungkinkan desainer membuat mockup mobile yang akurat, sementara Tailwind CSS menawarkan fleksibilitas untuk menerjemahkan desain tersebut ke kode yang responsif. Namun, tantangan utama muncul ketika: Akurasi Visual: Menyamakan setiap elemen desain (spasi, ukuran, posisi) di Figma dengan implementasi kode hingga ke level piksel, termasuk penyesuaian konfigurasi Tailwind untuk hardcoded values (misal: w-[320px], gap-3.5).Responsivitas Terkontrol: Mempertahankan batas lebar 640px sebagai breakpoint utama sambil memastikan komponen tetap konsisten di semua perangkat mobile (misal: menggunakan max-w-[640px] mx-auto).Optimasi untuk Mobile: Menghindari over-engineering dengan memanfaatkan utility class Tailwind yang sesuai untuk viewport kecil (misal: padding, font-size, grid layout).Interaktivitas Mobile-First: Implementasi JavaScript untuk interaksi touch-friendly (seperti klik, swipe) yang tetap presisi sesuai desain Figma. Artikel ini menyajikan pendekatan sistematis untuk slicing desain Figma mobile-first ke kode HTML, Tailwind CSS, dan JavaScript di VSCode, dengan fokus pada ketelitian pixel-perfect dan optimasi performa mobile. Tujuan Artikel Artikel ini bertujuan untuk: Memberikan Panduan Praktis: Menunjukkan langkah demi langkah cara menerjemahkan desain Empty State Airplane dari Figma ke struktur HTML + Tailwind CSS dengan akurasi pixel-perfect.Mengoptimalkan untuk Mobile: Menyusun komponen dengan pendekatan mobile-first, menjaga konsistensi lebar, padding, margin, dan skala font sesuai dengan batas maksimal 640px.Menerapkan Tailwind CSS secara Efisien: Menggunakan utility classes Tailwind, termasuk pendekatan hardcoded values (seperti w-[320px], gap-3.5), untuk mencapai kesetiaan desain maksimal tanpa over-engineering.Meningkatkan Presisi Visual: Menggunakan teknik inspeksi dan pengukuran langsung di Figma untuk memastikan setiap elemen (ikon, ilustrasi, teks, spasi) direplikasi secara akurat.Mengintegrasikan Interaktivitas Ringan: Menambahkan fungsionalitas sederhana menggunakan JavaScript berbasis sentuhan (touch-friendly interaction), tanpa mengorbankan performa untuk perangkat mobile. Dengan mengikuti panduan ini, pembaca dapat memahami bagaimana mengubah desain Figma mobile menjadi kode nyata yang responsif, presisi, dan optimal untuk mobile device. Target Pembaca Artikel ini ditujukan bagi: Frontend Developer yang sering bekerja dengan desain Figma dan ingin meningkatkan presisi implementasi desain mobile.UI Engineer yang fokus pada pixel-perfect implementation dan ingin memahami praktik terbaik konversi desain ke Tailwind CSS.Desainer yang Belajar Coding dan ingin tahu bagaimana desain mereka diimplementasikan dalam kode dengan konsistensi visual di perangkat kecil.Mahasiswa / Pembelajar Web Development yang ingin menambah portofolio dengan praktik langsung slicing desain Figma mobile-first menggunakan Tailwind CSS di lingkungan kerja nyata (VSCode).Tim Pengembang Mobile Web yang ingin menyusun guideline konversi desain ke HTML+CSS yang efisien dan terstandarisasi. Dengan gaya penulisan yang teknis namun aplikatif, artikel ini cocok bagi mereka yang ingin meningkatkan workflow antara desain dan kode, terutama dalam konteks proyek berbasis Tailwind CSS dan pendekatan mobile-first. Setelah Membaca Setelah membaca artikel ini, pembaca diharapkan mampu: Melakukan Slicing Desain Mobile: Mengubah desain Figma untuk layar kecil (≤640px) menjadi struktur HTML + Tailwind CSS yang pixel-perfect.Menggunakan Tailwind dengan Presisi: Memanfaatkan utility class bawaan dan custom value (seperti w-[320px], gap-3.5) untuk meniru ukuran dan spasi desain secara akurat.Membangun Layout Mobile-First yang Konsisten: Membuat layout yang responsive namun tetap mempertahankan batas maksimal 640px, menggunakan prinsip mobile-first development.Mengoptimalkan Performa Mobile: Menulis kode HTML, CSS, dan JavaScript yang ringan, cepat dimuat, dan responsif terhadap interaksi berbasis sentuhan.Mengembangkan Keterampilan Inspeksi Desain: Membaca, mengukur, dan memahami elemen-elemen di Figma dengan lebih teliti untuk memastikan hasil implementasi visual 1:1. Dengan keterampilan ini, pembaca akan lebih percaya diri dalam mengerjakan proyek-proyek berbasis mobile dan dapat mempercepat alur kerja antara desain dan pengembangan. Download Desain Homepage Shaynakit Untuk mulai melakukan slicing desain Empty State Airplane, Kamu perlu mengunduh file desain Figma-nya terlebih dahulu. Desain ini tersedia secara gratis dalam mode Free Trial melalui situs ShaynaKit. Berikut adalah langkah-langkah lengkapnya: Buka situs utama ShaynaKit di https://shaynakit.com/landing.Klik menu atau tombol Register atau langsung buka https://shaynakit.com/register untuk membuat akun terlebih dahulu.Setelah berhasil mendaftar dan login, buka halaman desain yang akan digunakan di https://shaynakit.com/details/empty-state-airplane.Klik tombol Download, lalu pada opsi yang tersedia, pilih Free Trial.Klik tombol Start Today untuk memulai akses gratis.Setelah itu, kembali ke halaman yang sama: https://shaynakit.com/details/empty-state-airplane, dan klik tombol Download sekali lagi.File desain akan terunduh dalam format .fig, yaitu format asli file Figma.Simpan file .fig tersebut ke dalam folder lokal proyek Anda, misalnya ./figma/EmptyStateAirplane.fig. Membuat Akun Figma Homepage Figma Kunjungi Situs Figma : Buka browser lalu akses https://www.figma.com.Pilih “Sign up” atau “Get started for free” : Tombol ini biasanya ada di pojok kanan atas halaman utama.Masukkan Data RegistrasiEmail: Gunakan email aktif yang kamu miliki.Nama Lengkap: Nama ini akan tampil di kolaborasi.Password: Buat minimal 8 karakter, disarankan mencampur huruf dan angka.Verifikasi Email : Cek inbox email yang kamu daftarkan, klik link verifikasi dari Figma untuk mengaktifkan akun.Pilih Plan : Setelah verifikasi, Figma akan menawarkan beberapa plan (Free, Professional, Organization). Untuk memulai, cukup pilih Free.Selesai & Masuk ke Dashboards : Kamu akan diarahkan ke dashboard Figma, di mana kamu bisa membuat file baru, mengimpor file .fig, dan mengundang tim. Import ke Figma Working Folder Kunjungi Situs Figma. Buka browser lalu akses https://www.figma.com.Setelah masuk, kamu akan berada di tampilan utama Figma. Di sini kamu bisa melihat daftar file dan proyek sebelumnya.Klik tombol "Import File" (ikon ⬆️ di pojok kanan atas, atau menu File > Import).Arahkan ke lokasi file .fig yang telah kamu simpan sebelumnya (misalnya ./figma/EmptyStateAirplane.fig).Pilih file tersebut, lalu klik Open atau Import.Figma akan memproses file, dan setelah selesai, desain akan muncul sebagai proyek baru di dashboard Anda.Klik file tersebut untuk membukanya. Membaca Desain Di Bagian ini Kamu Akan Bisa : ✅ Figma Lebih Detail ✅ Sortcut Keyboard untuk Figma ✅ Membaca Icon ✅ Membaca Gambar ✅ Membaca Layout Shortcut Keyboard Copy Paste Berfungsi menggandakan desain. Bonus Saldo - Copy Paste Cara melakukannya : Pilih frame, grup, atau objek yang ingin digandakan. Bonus Saldo - Klik Tekan Ctrl + D (Windows) atau Cmd + D (Mac). Figma akan langsung membuat salinan tepat di bawah/kanan aslinya. Jika ingin membuat lebih dari satu, cukup tekan lagi Ctrl + D. Ctrl + Z Berfungsi untuk kembali 1 langkah sebelumnya. Bonus Saldo - Ctrl Z Cara melakukannya : Klik sekali di area canvas atau jendela file Figma supaya aplikasi menerima input keyboard.Windows/Linux: Tekan Ctrl + Z sekali untuk membatalkan (undo) satu perubahan terakhir.Mac: Tekan ⌘ Cmd + Z sekali untuk membatalkan satu perubahan terakhir. Ctrl + Shift + Z Berfungsi membatalkan “kembali 1 langkah sebelumnya”. Cara melakukannya : Klik sekali di area canvas atau jendela file Figma supaya aplikasi menerima input keyboard.Windows/Linux: Tekan Ctrl + Shift + Z untuk redo (maju kembali setelah undo).Mac: Tekan ⌘ Cmd + Shift + Z untuk redo (maju kembali setelah undo) Klik 2X Berfungsi untuk melihat size group yang kamu mau. Contoh ketika di “Deskripsi Judulnya” : Arahkan kursor ke group ( Title & Description ), hingga muncul garis biru seperti ini. Bonus Saldo - Teks Klik 2X pada “Deskripsinya” Bonus Saldo - Paragraf Perhatikan pada bilah kanan Figma terdapat konfigurasi teksnya. Bonus Saldo - Paragraf Sidebar Ulangi hal tersebut pada group desain apapun yang ingin kamu mau tau. Klik Beberapa Kali+ Hover + Alt Berfungsi melihat jarak antar konten desain, contohnya antar “Title dengan Paragraf” seperti : Bonus Saldo - Gap Teks Cara melakukannya : Arahkan kursor di atas “Paragrafnya”. Klik pada Deskripsi “We give you early credit so that you can buy a flight ticket” Beberapa Kali sampai seperti ini : Bonus Saldo - Paragraf Pindahkan cursor ke Title “Big Bonus”. Klik Alt. Maka akan muncul celah di antara keduanya yaitu ( 10 ) artinya 10px, hal ini berfungsi untuk development nanti. Bonus Saldo - Gap Teks Import Icon Menjadi SVG Berfungsi mengambil Icon lalu di letakkan di folder Icon VSCode lalu di tampilkan di browser. Cara Melakukannya : Klik beberapa kali di atas icon Figma hingga seperti ini ( 24 x 24 ) : Bonus Saldo - Airplane Icon Klik kanan. Bonus Saldo - Right of Click Kursor di atas “Copy/Paste as” dan klik “Copy as SVG”. Bonus Saldo - Import SVG Import Image menjadi PNG Klik di atas image Figma hingga seperti ini ( 299.96 x 150 ) : Success Checkout - Background Image Scroll ke bawah sampai seperti pada bilah kanan. Success Checkout - Import Background Image Klik dropdown “Export” nya bertulis “1x” : maka muncul : Pilih “3x” dan klik tombol “Export Basic Interview” Membaca Icon Icon Yang Mana? Bonus Saldo - Airplane Di atas adalah icon. Di dalam desain Figma, icon adalah elemen grafis kecil yang biasanya digunakan untuk mewakili aksi, fitur, atau objek tertentu dengan cara yang visual dan mudah dikenali. Di dalam desain Figma icon adalah : Gambar vektor kecil (SVG) atau bentuk (shapes) yang menggambarkan sesuatu, seperti 🔍 (search), ✏️ (edit), 🗑 (delete), dll.Sering digunakan dalam UI/UX design seperti di tombol, menu navigasi, tab, atau status indicator. Fungsi Icon adalah : Hemat ruang : Ikon menggantikan teks panjang agar antarmuka tetap ringkas.Estetika visual : Ikon bikin desain lebih menarik dan terasa hidup.Bahasa universal : Ikon mudah dipahami lintas bahasa misalnya ikon globe untuk "global".Representasi aksi : Misal ikon gerigi = pengaturan, amplop = pesan, dll. Cara Import? Berfungsi mengambil Icon lalu di letakkan di folder Icon VSCode lalu di tampilkan di browser. Cara Melakukannya : Klik beberapa kali di atas icon Figma hingga seperti ini ( 24 x 24 ) : Bonus Saldo - Airplane Klik kanan. Bonus Saldo - Airplane Click Kursor di atas “Copy/Paste as” dan klik “Copy as SVG”. Bonus Saldo - Airplane Click Import Buat folder proyek yaitu “Empty-State-Airplane” Folder Proyek Open folder tersebut di VSCode VS Code Proyek Buka VSCode.Klik File > Open Folder...Pilih folder project kamu, yaitu : Empty-State-Airplane.Setelah folder terbuka di sidebar kiri (Explorer), kamu bisa mulai membuat folder baru. Buat Folder src Src Folder Klik kanan pada folder utama Empty-State-Airplane di sidebar kiri.Pilih New Folder.Ketik nama folder: src, lalu tekan Enter. Buat Folder images di dalam src Images Folder Klik ikon > di samping src untuk membukanya.Klik kanan pada folder src > New Folder.Ketik nama folder: images, lalu tekan Enter. Buat Folder Tambahan di Dalam images Any Folder Klik ikon > di samping images untuk membukanya.Klik kanan pada folder images > New Folder.Buat folder berikut satu per satu:backgroundsicons Buat File airplane.svg di dalam folder icons untuk meletakkan iconnya Klik ikon > di samping icons untuk membukanya. Klik kanan pada folder icons > New File. Buat file bernama airplane.svg Klik link “Open file using VS Code’s standard text/binary editor?” Icon VSCode Ctrl + V disini Icon VSCode For Paste Hasil akhirnya akan seperti ini : Icon VSCode After Paste Membaca Gambar Gambar Yang Mana? Success Checkout - Background Image Image ini berfungsi : Menyampaikan Konten Nyata : Gambar background memberi gambaran visual “in‑context” tentang halaman yang hendak ditampilkan ke user.Membuat Prototipe Lebih Hidup : Daripada tanpa background image, menggunakan background image bikin stakeholder atau user test lebih paham feel UI. Cara Import? Berfungsi mengambil Icon lalu di letakkan di folder Icon VSCode lalu di tampilkan di browser. Cara Melakukannya : Klik di atas image Figma hingga seperti ini ( 299.96 x 150 ) : Success Checkout - Background Image Scroll ke bawah sampai seperti pada bilah kanan. Success Checkout - Sidebar Background Image Klik dropdown “Export” nya bertulis “1x” : maka muncul : Pilih “3x” dan klik tombol “Export Basic Interview” Letakkan ditempat yang kamu mau. Masuk ke proyek Empty-State-Airplane lalu masuk ke folder src/images/backgrounds. Drag image tersebut sampai begini. Success Checkout - After Import Background Image Membaca Layout Identifikasi Konten Desain Link Berpindah Halaman LInk berpindah halaman adalah bagian ketika user klik, user akan berpindah halaman satu ke halaman yang lain. Button Urutan A → B → C → dst Terbesar → besar → kecil → makin kecil → makin kecil -> dst Structure Basic Memulai Slicing Di Bagian ini Kamu Akan Bisa : ✅ Slicing dari Figma ke VSCode✅ Mahir Tailwind CSS✅ Pixel Perfect✅ Responsive max 640px Buka Folder Sebelumnya Folder Proyek Starter Jalankan perintah di terminal. npm install tailwindcss @tailwindcss/cli Penjelasan: PaketFungsitailwindcssMenginstal Tailwind CSS versi terbaru (saat ini versi 4), yaitu framework utility-first CSS.@tailwindcss/cliMenginstal CLI resmi dari Tailwind untuk membangun file CSS langsung dari terminal (tanpa perlu setup tambahan seperti PostCSS atau Webpack). Pada side bar VSCode di dalam folder src bikin file bernama input.css . Letakkan ini /* src/input.css */ @import "tailwindcss"; Lalu pada // package.json { "dependencies": { "@tailwindcss/cli": "^4.1.4", "tailwindcss": "^4.1.4" } } Beri kode seperti ini: // package.json { "scripts": { "dev": "npx @tailwindcss/cli -i ./src/input.css -o ./src/output.css --watch" }, "dependencies": { "@tailwindcss/cli": "^4.1.4", "tailwindcss": "^4.1.4" } } Penjelasan: BagianPenjelasan"scripts"Merupakan bagian dari package.json yang berisi perintah-perintah (alias) yang bisa kamu jalankan dengan npm run atau yarn."dev"Nama alias dari script ini. Kamu bisa menjalankannya dengan perintah npm run dev."npx @tailwindcss/cli"Menjalankan CLI Tailwind secara langsung tanpa perlu instal global.-i ./src/input.cssMengatur file input CSS. File ini harus berisi direktif seperti @tailwind base;, @tailwind components;, dan @tailwind utilities; tetapi tailwind 4 telah menuliskannya secara implisit.-o ./src/output.cssMengatur file output CSS yang akan dihasilkan oleh Tailwind (berisi semua utility class Tailwind yang digunakan di project).--watchMengaktifkan mode pemantauan. Tailwind akan terus memantau perubahan pada file HTML/JS/CSS yang kamu atur dan memperbarui output.css setiap kali ada perubahan. Buat file index.html di src/ . Letakkan html dasar di dalamnya. <!-- src/index.html --> <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="./output.css" rel="stylesheet"> </head> <body> <h1 class="text-2xl font-semibold"> Hello world! </h1> </body> </html> Penjelasan: Baris HTMLPenjelasan<!doctype html>Mendeklarasikan bahwa dokumen ini adalah dokumen HTML5. Wajib di bagian paling atas.<html>Elemen root dari seluruh dokumen HTML. Semua elemen HTML berada di dalam tag ini.<head>Bagian yang berisi informasi meta (bukan tampilan), seperti encoding, viewport, stylesheet, dll.<meta charset="UTF-8">Menentukan karakter encoding sebagai UTF-8, sehingga bisa menampilkan karakter dari berbagai bahasa dengan benar.<meta name="viewport" content="width=device-width, initial-scale=1.0">Mengatur agar layout responsive di perangkat mobile dengan menyesuaikan lebar viewport.<link href="./output.css" rel="stylesheet">Menyertakan file CSS (output.css) yang dihasilkan oleh Tailwind agar dapat digunakan di HTML.<body>Bagian utama halaman yang berisi konten yang ditampilkan di browser.<h1 class="text-2xl font-semibold">Heading tingkat 1. Class text-2xl dan font-semibold dari Tailwind digunakan untuk mengatur ukuran dan ketebalan font.Hello world!Isi teks yang ditampilkan di halaman.</body> dan </html>Menutup elemen body dan html. Tambahkan font Poppins pada tag head html nya <!-- src/index.html --> <link href="<https://fonts.googleapis.com/css2?family=Poppins:wght@100;200;300;400;500;600;700;800;900&display=swap>" rel="stylesheet" /> Lalu tambahkan konfigurasi body seperti ini /* src/input.css */ body { font-family: "Poppins"; background-color: #DAE1E9; } Penjelasan: Utility CSSNilaiPenjelasanfont-family"Poppins"Mengatur jenis huruf utama pada elemen <body> menjadi Poppins.background-color#DAE1E9Memberikan warna latar belakang pada elemen <body> dengan warna abu kebiruan terang (kode hex #DAE1E9). Definisikan warna yang di pakai dalam desain seperti berikut di dalam input.css. /* src/input.css */ @theme { --color-empty-bg: #FAFAFA; --color-empty-black: #1F1449; --color-empty-grey: #9698A9; --color-empty-blue-card: #5445E5; --color-empty-shadow-card: #3F32B2; --color-empty-shadow-rounded: #998EFD; --color-empty-blue: #5C40CC; } Penjelasan: Variabel CSSNilai WarnaPenjelasan--color-empty-bg#FAFAFAWarna latar belakang yang sangat terang, hampir putih.--color-empty-black#1F1449Warna hitam keunguan gelap, biasanya untuk teks utama atau judul.--color-empty-grey#9698A9Warna abu-abu netral, cocok untuk teks sekunder atau placeholder.--color-empty-blue-card#5445E5Warna biru keunguan terang untuk elemen kartu utama.--color-empty-shadow-card#3F32B2Warna lebih gelap dari blue-card, kemungkinan untuk bayangan kartu.--color-empty-shadow-rounded#998EFDWarna ungu muda, bisa digunakan untuk efek shadow dengan radius membulat.--color-empty-blue#5C40CCWarna biru keunguan, cocok untuk elemen primer seperti tombol atau ikon. Slicing 1 Bonus Saldo - Container Mobile Tujuan Mendesain elemen dengan pendekatan mobile-first agar responsif, dengan lebar maksimum 640px dan posisi terpusat di layar. Code <body> <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen py-[151px] px-[37.5px] bg-empty-bg"></main> </body> Penjelasan Atribut/Utility CSSFungsirelativeMengatur posisi elemen relatif terhadap dirinya sendiri (untuk posisi absolut anaknya).mx-autoMembuat margin kiri dan kanan otomatis → memusatkan secara horizontal.w-fullMengatur lebar elemen 100% dari kontainer induknya.max-w-[640px]Membatasi lebar maksimum ke 640px.overflow-hiddenMenyembunyikan isi yang meluap di luar kontainer.min-h-screenMenetapkan tinggi minimum sama dengan tinggi layar (100vh).py-[151px]Padding vertikal (atas dan bawah) sebesar 151px.px-[37.5px]Padding horizontal (kiri dan kanan) sebesar 37.5px.bg-empty-bgMenggunakan warna latar belakang dari variabel tema --color-empty-bg. Slicing 2 Bonus Saldo - Child Container Mobile Tujuan Tag <form> ini digunakan untuk mengirim data dari pengguna ke halaman lain, yaitu success-checkout.html, ketika form dikirim (biasanya saat tombol submit ditekan). Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen py-[151px] px-[37.5px] bg-empty-bg"> <!-- dari sini --> <form action="success-checkout.html"></form> <!-- sampai sini --> </main> Penjelasan AtributNilaiPenjelasan<form>-Elemen HTML yang digunakan untuk membungkus input dan tombol agar bisa dikirim.action"success-checkout.html"Menentukan URL tujuan saat form disubmit. Dalam hal ini, browser akan membuka halaman success-checkout.html setelah submit. Slicing 3 Bonus Saldo - Container Bank Tujuan Elemen <section> ini digunakan untuk menampilkan sebuah kartu konten yang terstruktur secara vertikal, dengan jarak antar elemen, padding yang cukup, pojok membulat, warna latar belakang khusus, dan teks berwarna putih, serta siap menampung konten tambahan di dalamnya. Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen py-[151px] px-[37.5px] bg-empty-bg"> <form action="success-checkout.html"> <!-- dari sini --> <section id="Card" class="flex flex-col gap-[41px] p-6 rounded-[34px] relative bg-empty-blue-card text-white overflow-hidden"></section> <!-- sampai sini --> </form> </main> Penjelasan Atribut/Utility CSSPenjelasan<section>Elemen semantik untuk membungkus bagian tertentu dari konten.id="Card"Memberikan identitas unik agar bisa diakses lewat JavaScript atau anchor.flexMenjadikan kontainer sebagai flexbox (untuk tata letak fleksibel).flex-colMengatur arah tata letak flex ke kolom (vertikal).gap-[41px]Jarak antar anak elemen sebesar 41px.p-6Padding ke seluruh sisi sebesar 1.5rem (24px).rounded-[34px]Membuat sudut elemen melengkung sebesar 34px.relativePosisi relatif untuk pengaturan posisi anak dengan absolute.bg-empty-blue-cardMemberi warna latar belakang dari variabel --color-empty-blue-card.text-whiteWarna teks diatur menjadi putih.overflow-hiddenMenyembunyikan konten yang meluap dari batas elemen. Slicing 4 Bonus Saldo - Child 1 Container Bank Tujuan Untuk menampilkan informasi identitas pengguna (nama) di sebelah kiri dan indikator status atau tombol aksi pembayaran ("Pay") dengan ikon pesawat di sebelah kanan, dalam satu baris yang rapi dan sejajar. Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen py-[151px] px-[37.5px] bg-empty-bg"> <form action="success-checkout.html"> <section id="Card" class="flex flex-col gap-[41px] p-6 rounded-[34px] relative bg-empty-blue-card text-white overflow-hidden"> <!-- dari sini --> <div class="flex items-center justify-between relative z-20"> <div> <h2 class="font-light text-sm leading-[21px]">Name</h2> <p><strong class="font-medium text-xl leading-[30px]">Kezia Rifqi</strong></p> </div> <div class="flex items-center gap-[6px] shrink-0"> <img src="assets/images/icons/airplane.svg" alt="" class="size-6 shrink-0" /> <p class="font-medium">Pay</p> </div> </div> <!-- sampai sini --> </section> </form> </main> Penjelasan Atribut/Utility CSSPenjelasanflex items-center justify-betweenMenyusun elemen secara horizontal, sejajar secara vertikal, dan diberi ruang di antara (kiri-kanan).relative z-20Elemen diberi posisi relatif (untuk layering), dan z-index 20 agar muncul di atas elemen lain.h2.font-light text-sm leading-[21px]Teks "Name" berukuran kecil, tipis, dan tinggi baris 21px.strong.font-medium text-xl leading-[30px]Nama "Kezia Rifqi" tampil menonjol dengan font medium dan ukuran 30px.div.flex.items-center.gap-[6px]Menyusun ikon dan teks "Pay" secara horizontal dengan jarak 6px di antaranya.img.size-6Ikon pesawat dengan ukuran 1.5rem (24px × 24px).shrink-0Mencegah elemen (ikon dan kontainer kanan) mengecil saat ruang terbatas. Slicing 5 Bonus Saldo - Child 2 Container Bank Tujuan Bagian ini bertujuan untuk menampilkan saldo (balance) pengguna, dengan label "Balance" di atas dan nominal saldo yang ditampilkan secara mencolok dan mudah dibaca. Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen py-[151px] px-[37.5px] bg-empty-bg"> <form action="success-checkout.html"> <section id="Card" class="flex flex-col gap-[41px] p-6 rounded-[34px] relative bg-empty-blue-card text-white overflow-hidden"> <div class="flex items-center justify-between relative z-20"> <div> <h2 class="font-light text-sm leading-[21px]">Name</h2> <p><strong class="font-medium text-xl leading-[30px]">Kezia Rifqi</strong></p> </div> <div class="flex items-center gap-[6px] shrink-0"> <img src="assets/images/icons/airplane.svg" alt="" class="size-6 shrink-0" /> <p class="font-medium">Pay</p> </div> </div> <!-- dari sini --> <div class="relative z-20"> <h2 class="font-light text-sm leading-[21px]">Balance</h2> <p> <strong class="font-medium text-[26px] leading-[39px] break-words">IDR <span id="formatted-price">280000000</span></strong> </p> </div> <!-- sampai sini --> </section> </form> </main> <!-- dari sini --> <script src="./js/format-idr.js"></script> <!-- sampai sini --> JavaScript // ./js/format-idr.js let priceElement = document.getElementById("formatted-price"); let priceValue = parseInt(priceElement.textContent, 10); priceElement.textContent = new Intl.NumberFormat("id-ID", {currency: "IDR", minimumFractionDigits: 0, maximumFractionDigits: 0 }).format(priceValue); Penjelasan Elemen/Utility CSSPenjelasandiv.relative z-20Posisi relatif dan z-index: 20, memastikan elemen ini berada di atas lapisan lainnya.h2.font-light text-sm leading-[21px]Menampilkan label "Balance" dengan ukuran kecil dan font tipis.strong.font-medium text-[26px] leading-[39px]Menonjolkan jumlah saldo dengan ukuran font 26px dan tinggi baris 39px.break-wordsMemastikan teks akan dipatahkan (wrap) jika terlalu panjang untuk satu baris.<span id="formatted-price">280000000</span>Elemen dinamis yang bisa diisi atau diformat menggunakan JavaScript, biasanya untuk menampilkan angka yang sudah diberi pemisah (misal: 280,000,000). JavaScript Baris KodePenjelasanlet priceElement = document.getElementById("formatted-price");Mengambil elemen dengan ID formatted-price dari DOM.let priceValue = parseInt(priceElement.textContent, 10);Mengambil teks dari elemen tersebut (misal: "280000000") dan mengubahnya menjadi angka (280000000).priceElement.textContent = ...Mengganti isi teks elemen dengan hasil format angka.new Intl.NumberFormat("id-ID", {...}).format(priceValue);Menggunakan Internationalization API untuk memformat angka sesuai dengan lokal Indonesia. Slicing 6 Bonus Saldo - Decoration Container Bank Tujuan Ketiga elemen <span> ini tidak berisi konten dan hanya digunakan sebagai elemen latar visual (dekoratif) Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen py-[151px] px-[37.5px] bg-empty-bg"> <form action="success-checkout.html"> <section id="Card" class="flex flex-col gap-[41px] p-6 rounded-[34px] relative bg-empty-blue-card text-white overflow-hidden"> <div class="flex items-center justify-between relative z-20"> <div> <h2 class="font-light text-sm leading-[21px]">Name</h2> <p><strong class="font-medium text-xl leading-[30px]">Kezia Rifqi</strong></p> </div> <div class="flex items-center gap-[6px] shrink-0"> <img src="assets/images/icons/airplane.svg" alt="" class="size-6 shrink-0" /> <p class="font-medium">Pay</p> </div> </div> <div class="relative z-20"> <h2 class="font-light text-sm leading-[21px]">Balance</h2> <p> <strong class="font-medium text-[26px] leading-[39px] break-words">IDR <span id="formatted-price">280000000</span></strong> </p> </div> <!-- dari sini --> <span class="absolute right-[-38px] top-[-45px] size-[107px] rounded-full bg-empty-shadow-rounded blur-[50px]"></span> <span class="absolute left-[-29px] bottom-[-30px] size-[107px] rounded-full bg-empty-shadow-rounded blur-[50px]"></span> <span class="absolute left-[35px] bottom-[-45px] bg-empty-shadow-card/50 rounded-[25px] right-[35px] h-[45px] blur-2xl"></span> <!-- sampai sini --> </section> </form> </main> Penjelasan ElemenKeterangan1right-[-38px] top-[-45px] → Bulatan blur muncul di pojok kanan atas. Ukuran 107px, full circle, blur 50px.2left-[-29px] bottom-[-30px] → Bulatan blur muncul di pojok kiri bawah. Sama ukuran dan blur seperti elemen pertama.3left-[35px] right-[35px] bottom-[-45px] → Persegi panjang blur horizontal di bagian bawah kontainer, dengan transparansi (/50) dan radius 25px. Slicing 7 Bonus Saldo - Teks Tujuan Bagian <header> ini adalah judul dan penjelasan singkat promosi yang dirancang untuk tampil di tengah layar secara estetis, konsisten dengan desain mobile-first dan tema UI yang modern. Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen py-[151px] px-[37.5px] bg-empty-bg"> <form action="success-checkout.html"> <section id="Card" class="flex flex-col gap-[41px] p-6 rounded-[34px] relative bg-empty-blue-card text-white overflow-hidden"> <div class="flex items-center justify-between relative z-20"> <div> <h2 class="font-light text-sm leading-[21px]">Name</h2> <p><strong class="font-medium text-xl leading-[30px]">Kezia Rifqi</strong></p> </div> <div class="flex items-center gap-[6px] shrink-0"> <img src="assets/images/icons/airplane.svg" alt="" class="size-6 shrink-0" /> <p class="font-medium">Pay</p> </div> </div> <div class="relative z-20"> <h2 class="font-light text-sm leading-[21px]">Balance</h2> <p> <strong class="font-medium text-[26px] leading-[39px] break-words">IDR <span id="formatted-price">280000000</span></strong> </p> </div> <span class="absolute right-[-38px] top-[-45px] size-[107px] rounded-full bg-empty-shadow-rounded blur-[50px]"></span> <span class="absolute left-[-29px] bottom-[-30px] size-[107px] rounded-full bg-empty-shadow-rounded blur-[50px]"></span> <span class="absolute left-[35px] bottom-[-45px] bg-empty-shadow-card/50 rounded-[25px] right-[35px] h-[45px] blur-2xl"></span> </section> <!-- dari sini --> <header class="mt-[91px] flex flex-col gap-[10px] w-[250px] mx-auto"> <h1 class="text-center font-semibold text-[32px] leading-[48px] text-empty-black">Big Bonus🎉</h1> <p class="text-center font-light leading-[28px] text-empty-grey">We give you early credit so that you can buy a flight ticket</p> </header> <!-- sampai sini --> </form> </main> Penjelasan Elemen/Utility CSSPenjelasan<header>Elemen header berfungsi sebagai bagian pembuka konten (heading + deskripsi).mt-[91px]Memberikan margin atas sejauh 91px untuk memberi ruang dari elemen sebelumnya.flex flex-col gap-[10px]Menyusun konten header secara vertikal dengan jarak 10px antar elemen.w-[250px] mx-autoLebar maksimum 250px dan posisi di tengah secara horizontal.<h1>Judul utama: "Big Bonus🎉", dengan ukuran besar (32px), tinggi baris 48px, font tebal.text-center text-empty-blackTeks di tengah dan warna teks menggunakan variabel tema hitam.<p>Paragraf deskripsi singkat, dengan font ringan dan warna abu-abu dari tema.leading-[28px]Menentukan tinggi baris agar teks paragraf nyaman dibaca. Slicing 8 Bonus Saldo - Button Tujuan Tombol ini berfungsi sebagai pemicu pengiriman form yang akan membawa pengguna ke halaman tujuan success-checkout.html . Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen py-[151px] px-[37.5px] bg-empty-bg"> <form action="success-checkout.html"> <section id="Card" class="flex flex-col gap-[41px] p-6 rounded-[34px] relative bg-empty-blue-card text-white overflow-hidden"> <div class="flex items-center justify-between relative z-20"> <div> <h2 class="font-light text-sm leading-[21px]">Name</h2> <p><strong class="font-medium text-xl leading-[30px]">Kezia Rifqi</strong></p> </div> <div class="flex items-center gap-[6px] shrink-0"> <img src="assets/images/icons/airplane.svg" alt="" class="size-6 shrink-0" /> <p class="font-medium">Pay</p> </div> </div> <div class="relative z-20"> <h2 class="font-light text-sm leading-[21px]">Balance</h2> <p> <strong class="font-medium text-[26px] leading-[39px] break-words">IDR <span id="formatted-price">280000000</span></strong> </p> </div> <span class="absolute right-[-38px] top-[-45px] size-[107px] rounded-full bg-empty-shadow-rounded blur-[50px]"></span> <span class="absolute left-[-29px] bottom-[-30px] size-[107px] rounded-full bg-empty-shadow-rounded blur-[50px]"></span> <span class="absolute left-[35px] bottom-[-45px] bg-empty-shadow-card/50 rounded-[25px] right-[35px] h-[45px] blur-2xl"></span> </section> <header class="mt-[91px] flex flex-col gap-[10px] w-[250px] mx-auto"> <h1 class="text-center font-semibold text-[32px] leading-[48px] text-empty-black">Big Bonus🎉</h1> <p class="text-center font-light leading-[28px] text-empty-grey">We give you early credit so that you can buy a flight ticket</p> </header> <!-- dari sini --> <button type="submit" class="mt-[50px] font-medium text-lg leading-[27px] text-white bg-empty-blue py-3.5 px-[50px] mx-auto rounded-[17px] flex hover:shadow-lg shadow-empty-blue/40 transition-all duration-300">Start Fly Now</button> <!-- sampai sini --> </form> </main> Penjelasan Elemen/Utility CSSPenjelasantype="submit"Tombol ini akan mengirimkan data dari form jika ditekan.mt-[50px]Memberi jarak 50px dari elemen di atasnya.font-medium text-lg leading-[27px]Teks sedang (medium), ukuran besar (lg = sekitar 18px), dan tinggi baris 27px.text-whiteWarna teks putih agar kontras dengan latar belakang.bg-empty-blueWarna latar belakang tombol sesuai variabel tema biru.py-3.5 px-[50px]Padding vertikal (atas-bawah) 3.5 unit (~14px), horizontal (kanan-kiri) 50px.mx-autoTombol diposisikan secara horizontal di tengah layar.rounded-[17px]Sudut tombol dibuat membulat (border-radius 17px) untuk nuansa modern.flexMengaktifkan flexbox untuk menyusun konten tombol (berguna jika ada ikon + teks).hover:shadow-lgSaat tombol disentuh/mouse hover, muncul efek bayangan besar.shadow-empty-blue/40Bayangan dasar dengan warna biru (dari tema) dan transparansi 40%.transition-all duration-300Efek transisi halus selama 300ms saat hover terjadi. Slicing 9 Success Checkout - Container Tujuan Elemen <main> ini adalah kerangka layout untuk halaman "success-checkout.html", didesain agar tampil rapi, modern, dan optimal di perangkat mobile. Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen pt-[212px] pb-[151px] px-[37.5px] bg-empty-bg"></main> Penjelasan Elemen/Utility CSSPenjelasanrelativeElemen menjadi konteks posisi untuk elemen absolute di dalamnya.mx-autoMenjadikan elemen ini berada di tengah horizontal.w-fullLebar elemen dibuat penuh dari parent-nya.max-w-[640px]Membatasi lebar maksimum hanya 640px (mobile-first design).overflow-hiddenMenyembunyikan elemen yang meluap dari batas area.min-h-screenTinggi minimum 100% dari tinggi layar perangkat.pt-[212px] pb-[151px]Padding atas 212px dan bawah 151px, memberi ruang konten di dalamnya.px-[37.5px]Padding kiri dan kanan sebesar 37.5px.bg-empty-bgBackground menggunakan warna tema dari variabel CSS. Slicing 10 Success Checkout - Background Image Tujuan Gambar ini adalah ikon sukses berformat .png yang ditampilkan di tengah halaman untuk memperkuat pesan keberhasilan pada halaman seperti success-checkout.html Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen pt-[212px] pb-[151px] px-[37.5px] bg-empty-bg"> <!-- dari sini --> <img src="assets/images/backgrounds/success-co.png" alt="image" class="h-[150px] shrink-0 mx-auto" /> <!-- sampai sini --> </main> Penjelasan Elemen/Utility CSSPenjelasansrc="assets/images/backgrounds/success-co.png"Menunjukkan sumber gambar berupa file .png, ilustrasi keberhasilan.alt="image"Deskripsi alternatif untuk pembaca layar atau jika gambar gagal dimuat.class="h-[150px]"Mengatur tinggi gambar tetap 150px.shrink-0Mencegah gambar mengecil jika berada dalam kontainer fleksibel (flex).mx-autoMembuat gambar berada di tengah secara horizontal. Slicing 11 Success Checkout - Teks Tujuan Elemen <header> ini adalah bagian dari tampilan halaman sukses yang memberikan ucapan selamat dengan desain ramah pengguna dan mengajak pengguna untuk bersemangat melanjutkan perjalanan mereka. Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen pt-[212px] pb-[151px] px-[37.5px] bg-empty-bg"> <img src="assets/images/backgrounds/success-co.png" alt="image" class="h-[150px] shrink-0 mx-auto" /> <!-- dari sini --> <header class="mt-[80px] flex flex-col gap-[10px] w-[261px] mx-auto"> <h1 class="text-center font-semibold text-[32px] leading-[48px] text-empty-black">Well Booked 😍</h1> <p class="text-center font-light leading-[28px] text-empty-grey">Are you ready to explore the new world of experiences?</p> </header> <!-- sampai sini --> </main> Penjelasan <header>: Elemen/Utility CSSPenjelasanmt-[80px]Memberi margin atas sebesar 80px dari elemen sebelumnya.flex flex-colMenyusun elemen di dalamnya secara kolom (vertikal).gap-[10px]Memberi jarak antar elemen sebesar 10px.w-[261px]Lebar maksimum header dibatasi 261px.mx-autoMembuat elemen terpusat secara horizontal. <h1>: Elemen/Utility CSSPenjelasantext-centerTeks diratakan ke tengah.font-semiboldMengatur ketebalan teks menjadi semi-bold.text-[32px]Ukuran huruf 32px.leading-[48px]Jarak antar baris 48px.text-empty-blackWarna teks menggunakan variabel tema --color-empty-black. <p>: Elemen/Utility CSSPenjelasantext-centerTeks diratakan ke tengah.font-lightMengatur ketebalan teks menjadi tipis.leading-[28px]Jarak antar baris 28px.text-empty-greyWarna teks menggunakan variabel tema --color-empty-grey. Slicing 12 Success Checkout - Button Tujuan Elemen ini berfungsi sebagai tombol ajakan yang dirancang responsif dan menarik untuk pengguna mengakses data pemesanan mereka dengan nyaman. Code <main class="relative mx-auto w-full max-w-[640px] overflow-hidden min-h-screen pt-[212px] pb-[151px] px-[37.5px] bg-empty-bg"> <img src="assets/images/backgrounds/success-co.png" alt="image" class="h-[150px] shrink-0 mx-auto" /> <header class="mt-[80px] flex flex-col gap-[10px] w-[261px] mx-auto"> <h1 class="text-center font-semibold text-[32px] leading-[48px] text-empty-black">Well Booked 😍</h1> <p class="text-center font-light leading-[28px] text-empty-grey">Are you ready to explore the new world of experiences?</p> </header> <!-- dari sini --> <a href="#" class="mt-[50px] font-medium w-fit text-lg leading-[27px] text-white text-center bg-empty-blue py-3.5 px-[50px] mx-auto rounded-[17px] flex hover:shadow-lg shadow-empty-blue/40 transition-all duration-300">My Bookings</a> <!-- sampai sini --> </main> Penjelasan Elemen/Utility CSSPenjelasanhref="#"Tautan dummy, biasanya nanti diisi ke halaman seperti bookings.html.mt-[50px]Memberi jarak ke atas sebesar 50px.font-mediumMengatur ketebalan teks menjadi medium.w-fitLebar tombol menyesuaikan isi teks.text-lgUkuran teks besar (sekitar 18px).leading-[27px]Jarak antar baris teks 27px.text-whiteWarna teks putih.text-centerMeratakan teks ke tengah.bg-empty-blueWarna latar menggunakan variabel tema --color-empty-blue.py-3.5 / px-[50px]Padding vertikal dan horizontal untuk ukuran tombol yang nyaman.mx-autoMenempatkan tombol di tengah secara horizontal.rounded-[17px]Membuat sudut tombol melengkung 17px.flexMenjadikan elemen sebagai flex container (berguna jika diisi ikon juga).hover:shadow-lgMenambahkan bayangan besar saat kursor diarahkan.shadow-empty-blue/40Bayangan dengan warna biru transparan (40%).transition-all duration-300Efek transisi halus selama 300ms saat hover. Penutup Semoga hasil slicing ini dapat memberikan manfaat dan wawasan baru. Memahami struktur serta alur slicing dengan baik akan sangat berguna ke depannya baik untuk pengembangan proyek, sebagai referensi desain, aset komersial, maupun untuk diintegrasikan dengan berbagai bahasa pemrograman secara lebih efisien. Jangan lupa kunjungi website resmi shaynakit.com untuk mendapatkan berbagai desain dan file HTML gratis yang dapat langsung digunakan dalam proyek Anda. Terima kasih!

Kelas Panduan Lengkap : Mengubah Desain Figma Menjadi HTML dengan Tailwind CSS dan JavaScript di BuildWithAngga

Panduan Lengkap : Mengubah Desain Figma Menjadi HTML dengan Tailwind CSS dan JavaScript

Daftar Isi Persiapan ProyekStruktur FolderSetupMembuat Bagian Header #1Membuat Section HeroMembuat Section Logo KlienMembuat Section KeunggulanMembuat Section TestimonialFinalisasi dan DeployPenutup Persiapan Proyek Sebelum memulai, pastikan kamu memiliki : Editor kode (VS Code direkomendasikan)Node.js terinstalBrowser modern (Chrome/Firefox)Link Google Drive untuk mengakses desain dan asset https://drive.google.com/drive/folders/1VzNs5JXJC8Y9To0gtMrv80Dda3nNbl9c?usp=sharing Buat Folder “BankMo”Buka Folder di Visual Studio CodeBuka Terminal di VscodeJalankan npm install tailwindcss @tailwindcss/clibuat folder srcBuat file input.css di dalam src dan tambahkan @import "tailwindcss";Jalankan npx @tailwindcss/cli -i ./src/input.css -o ./src/output.css --watch untuk membangun css Struktur Folder bankmo-project/ ├── node_modules/ ├── src/ │ ├── assets/ │ │ ├── images/ │ │ │ ├── icons/ │ │ │ ├── logos/ │ │ │ └── photos/ │ ├── fonts.css │ ├── styles.css │ ├── comment.js │ ├── navbar.js │ ├── index.html │ └── output.css | └── input.css ├── .gitignore ├── package-lock.json ├── package.json Setup Hal yang pertama kali dilakukan adalah membuka desain figma. BankMo - Landing Page Analisa font apa yang digunakan pada desain di atas, ternyata menggunakan Poppins dan Montserrat untuk font logo. Setelah mengetahui hal di atas, maka kita perlu membuka file src/fonts.css untuk menerapkan font yang akan dipakai. @import url('<https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap>'); .text-logo{ font-family: 'Montserrat'; } body{ font-family: 'Poppins'; } Ketika sudah selesai, maka langkah selanjutnya adalah : Membuat file index.html di dalam src dengan struktur awal sebagai berikut : src/index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="output.css"> <link rel="stylesheet" href="fonts.css"> <link rel="stylesheet" href="styles.css"> <title>BankMo | Home</title> </head> <body> <header> <-- Konten Navbar --> </header> <main> <-- Konten Utama --> </main> <script src="navbar.js"></script> <script src="comment.js"></script> </body> </html> Membuat Bagian Header #1 Sebelum mulai pada pembuatan bagian header, kita perlu set breakpoint untuk membuat batas tiap layar, berikut adalah daftar breakpoint yang saya gunakan : sm : min-width (≥640px)md : min-width (≥768px)lg : min-width (≥1024px)xl : min-width (≥1280px)2xl : min-width (≥1512px) Daftar breakpoint di atas sebagian besar adalah bawaan tailwind, tetapi pada 2xl menjadi pengecualian karena menyesuaikan screen dari desain yang akan diubah adalah 1512px maka dari itu kita perlu memberikan kustom tambahan pada TailwindCSS. berikut adalah langkah - langkahnya : Buka file src/input.cssTambahkan @theme{ --breakpoint-2xl: 94.5rem; } Jika sudah melakukan langkah di atas maka selanjutnya adalah membuat konten header yang berisi navbar pada layar desktop ≥1512px Ketik Kode ini di dalam Tag <header> <nav class="px-[100px] pt-[50px] flex items-center justify-between"> <div class="flex items-center gap-x-[70px]"> <div> <a href=""> <h6 class="text-[32px] font-bold text-[#13214A] text-logo"> Bank<span class="text-[#0E45FF]">Mo</span> </h6> </a> </div> <ul class="flex items-center gap-x-[40px] text-[16px] text-[#13214A]"> <li class="relative group hover:font-semibold transition-all duration-300"> <a href="" class="block">Features</a> <div class="absolute bottom-0 left-0 w-full h-[1px] bg-[#0E45FF] rounded-full opacity-0 group-hover:opacity-100 transition-all duration-300"></div> </li> <li class="relative group hover:font-semibold transition-all duration-300"> <a href="" class="block">Pricing</a> <div class="absolute bottom-0 left-0 w-full h-[1px] bg-[#0E45FF] rounded-full opacity-0 group-hover:opacity-100 transition-all duration-300"></div> </li> <li class="relative group hover:font-semibold transition-all duration-300"> <a href="" class="block">Showcase</a> <div class="absolute bottom-0 left-0 w-full h-[1px] bg-[#0E45FF] rounded-full opacity-0 group-hover:opacity-100 transition-all duration-300"></div> </li> <li class="relative group hover:font-semibold transition-all duration-300"> <a href="" class="block">Teams</a> <div class="absolute bottom-0 left-0 w-full h-[1px] bg-[#0E45FF] rounded-full opacity-0 group-hover:opacity-100 transition-all duration-300"></div> </li> </ul> </div> <div class="flex items-center gap-x-[16px]"> <div> <a href=""> <div class="border border-[#13214A] text-[#12204A] w-[159px] pt-[15px] pb-[16px] flex items-center justify-center rounded-[50px] hover:bg-[#13214A] hover:text-white transition-all duration-300 text-[16px]"> My Account </div> </a> </div> <div> <a href=""> <div class="bg-[#0E45FF] text-white font-semibold w-[159px] pt-[15px] pb-[16px] flex items-center justify-center rounded-[50px] hover:shadow-sm hover:shadow-[#0E45FF] transition-all duration-300 text-[16px]"> Sign Up </div> </a> </div> </div> </nav> Lalu akan menghasilkan seperti ini : Ketika sudah membuat versi desktop, maka selanjutnya adalah membuat versi mobile dan tablet dengan kode sebagai berikut : <nav class="px-[30px] md:px-[60px] lg:px-[100px] pt-[35px] md:pt-[50px] flex items-center justify-between"> <div class="flex items-center gap-x-[70px]"> <div> <a href=""> <h6 class="text-[32px] font-bold text-[#13214A] text-logo">Bank<span class="text-[#0E45FF]">Mo</span></h6> </a> </div> <ul class="hidden 2xl:flex items-center gap-x-[40px] text-[16px] text-[#13214A]"> <li class="relative group hover:font-semibold transition-all duration-300"> <a href="" class="block">Features</a> <div class="absolute bottom-0 left-0 w-full h-[1px] bg-[#0E45FF] rounded-full opacity-0 group-hover:opacity-100 transition-all duration-300"></div> </li> <li class="relative group hover:font-semibold transition-all duration-300"> <a href="" class="block">Pricing</a> <div class="absolute bottom-0 left-0 w-full h-[1px] bg-[#0E45FF] rounded-full opacity-0 group-hover:opacity-100 transition-all duration-300"></div> </li> <li class="relative group hover:font-semibold transition-all duration-300"> <a href="" class="block">Showcase</a> <div class="absolute bottom-0 left-0 w-full h-[1px] bg-[#0E45FF] rounded-full opacity-0 group-hover:opacity-100 transition-all duration-300"></div> </li> <li class="relative group hover:font-semibold transition-all duration-300"> <a href="" class="block">Teams</a> <div class="absolute bottom-0 left-0 w-full h-[1px] bg-[#0E45FF] rounded-full opacity-0 group-hover:opacity-100 transition-all duration-300"></div> </li> </ul> </div> <div class="hidden 2xl:flex items-center gap-x-[16px]"> <div> <a href=""> <div class="border border-[#13214A] text-[#12204A] w-[159px] pt-[15px] pb-[16px] flex items-center justify-center rounded-[50px] hover:bg-[#13214A] hover:text-white transition-all duration-300 text-[16px]">My Account</div> </a> </div> <div> <a href=""> <div class="bg-[#0E45FF] text-white font-semibold w-[159px] pt-[15px] pb-[16px] flex items-center justify-center rounded-[50px] hover:shadow-sm hover:shadow-[#0E45FF] transition-all duration-300 text-[16px]">Sign Up</div> </a> </div> </div> <div class="block 2xl:hidden"> <button onclick="toggleSidebar()"> <img src="assets/images/icons/hamburger.svg" alt="Menu" class="w-[28px] h-[28px]"> </button> </div> </nav> <div id="sidebarOverlay" class="fixed inset-0 bg-black bg-opacity-50 z-40 hidden 2xl:hidden" onclick="toggleSidebar()"></div> <div id="mobileSidebar" class="fixed top-0 right-0 w-[250px] h-full bg-white z-50 transform translate-x-full transition-transform duration-300 2xl:hidden shadow-lg overflow-y-auto"> <div class="p-6 flex flex-col gap-y-6 text-[#13214A] text-[16px]"> <button onclick="toggleSidebar()" class="self-end mt-6 me-2 sm:me-8 sm:mt-9 lg:me-2 lg:mt-6"> <img src="assets/images/icons/close.svg" alt="Close" class="w-[24px] h-[24px]"> </button> <a href="" class="hover:font-semibold transition-all duration-300">Features</a> <a href="" class="hover:font-semibold transition-all duration-300">Pricing</a> <a href="" class="hover:font-semibold transition-all duration-300">Showcase</a> <a href="" class="hover:font-semibold transition-all duration-300">Teams</a> <hr> <a href="" class="border border-[#13214A] text-center py-2 rounded-full hover:bg-[#13214A] hover:text-white transition-all duration-300">My Account</a> <a href="" class="bg-[#0E45FF] text-white text-center py-2 rounded-full font-semibold hover:shadow hover:shadow-[#0E45FF] transition-all duration-300">Sign Up</a> </div> </div> Struktur Navigasi Utama (<nav>) Wrapper <nav>Menggunakan padding horizontal (px) dan top padding (pt) yang responsif: 30px untuk default, 60px untuk md, dan 100px untuk lg.Menggunakan flex, items-center, dan justify-between untuk menyusun logo di kiri dan menu di kanan.Bagian Kiri: Logo & Menu Desktopdiv.flex.items-center.gap-x-[70px]:Logo "BankMo"Menggunakan text-[32px], font-bold, dan pewarnaan berbeda untuk kata "Bank" dan "Mo".Menu Navigasi (Hanya muncul di layar 2xl ke atas)Menggunakan ul.hidden.2xl:flex agar hanya muncul di layar besar.Tiap item li memiliki animasi hover berupa garis bawah tipis (h-[1px]) yang muncul dengan transisi lembut.Bagian Kanan: Tombol Akun & Sign Up (Desktop Only)Hanya muncul di resolusi 2xl ke atas.Tombol:My Account: Bordered, warna teks default, berubah jadi putih dengan latar navy saat hover.Sign Up: Background biru #0E45FF, font tebal, animasi shadow saat hover.Menu Hamburger (Mobile & Tablet)Muncul di layar < 2xl (block 2xl:hidden).Tombol memicu fungsi toggleSidebar() yang akan membuka/menutup sidebar. Overlay Sidebar Mobile #sidebarOverlayElemen semi-transparan hitam (bg-opacity-50) yang muncul di belakang sidebar.Menggunakan z-40 agar muncul di atas konten, tapi di bawah sidebar (z-50).Disembunyikan default (hidden) dan hanya muncul saat sidebar aktif.Klik overlay juga memanggil toggleSidebar() untuk menutup menu. Sidebar Mobile (#mobileSidebar) Wrapper Sidebarfixed top-0 right-0 agar muncul dari kanan atas layar.Lebar 250px, tinggi penuh (h-full), warna latar putih.Transisi translate-x-full secara default (tersembunyi), lalu diubah oleh toggleSidebar() agar muncul (translate-x-0).Scroll aktif jika isi overflow (overflow-y-auto).Isi SidebarPadding p-6, dengan spacing antar elemen gap-y-6.Tombol Close:Ikon "X" (gambar close.svg), berada di kanan atas sidebar.Link Navigasi:Sama seperti desktop: Features, Pricing, Showcase, Teams.Aksi Pengguna:My Account: Tombol border dengan efek hover.Sign Up: Tombol biru solid dengan shadow saat hover. Ketika sudah selesai membuat versi mobile dan desktop maka tampilannya akan menjadi seperti ini : BankMo - Nav Top Buka file src/navbar.js dan implementasikan fungsi toggle untuk menampilkan/menyembunyikan aside saat tombol hamburger diklik. function toggleSidebar() { const sidebar = document.getElementById('mobileSidebar'); const overlay = document.getElementById('sidebarOverlay'); const body = document.body; const isOpen = sidebar.classList.contains('translate-x-0'); if (isOpen) { sidebar.classList.add('translate-x-full'); sidebar.classList.remove('translate-x-0'); overlay.classList.add('hidden'); body.classList.remove('overflow-hidden'); } else { sidebar.classList.remove('translate-x-full'); sidebar.classList.add('translate-x-0'); overlay.classList.remove('hidden'); body.classList.add('overflow-hidden'); } } Menu navigasi dan tombol CTA akan tersembunyi, kemudian akan muncul panel samping (aside) ketika tombol hamburger di sebelah diklik. Berikut adalah contohnya : BankMo - Landing Page Membuat Section Hero Mari kita bahas pembuatan section hero mulai dari tampilan desktop hingga mobile. 1. Tampilan Desktop (>1512px) Untuk tampilan desktop, kita menggunakan layout side-by-side dengan konten di kiri dan gambar di kanan : <section class="mt-[70px]"> <div class="w-full max-w-[1512px] mx-auto px-[130px] flex items-center justify-between"> <!-- Konten kiri --> <div class="flex flex-col items-start text-start"> <h1 class="text-[46px] font-bold text-[#13214A] max-w-[462px] leading-[69px]"> Protect Your Money Securely With Us. </h1> <p class="text-[16px] text-[#78839E] leading-[32px] max-w-[393px] mt-[20px]"> Keep your company cashflow better and grow the business would be better integrated systems. </p> <div class="mt-[40px]"> <a href="#"> <div class="bg-[#0E45FF] text-white font-semibold w-[250px] py-[20px] flex items-center justify-center rounded-[50px] hover:shadow-sm hover:shadow-[#0E45FF] transition-all duration-300 text-[20px]"> Protect My Money </div> </a> </div> </div> <!-- Gambar kanan --> <div class="relative shrink-0"> <img src="assets/images/photos/hero-image.png" alt="" class="w-[680px] h-[520px] object-cover rounded-[40px] shrink-0"> <div class="absolute bg-white flex items-center justify-center px-[26px] py-[13px] rounded-[54px] bottom-[-25px] right-[118px] shadow__element"> <div class="flex items-center gap-x-[14px]"> <img src="assets/images/icons/checklist.svg" alt="" class="w-[24px] h-[24px] shrink-0"> <p class="text-[16px] font-semibold text-[#13214A]"> The most trusted system in the global world </p> </div> </div> </div> </div> </section> Section utama:mt-[70px]: Memberikan margin atas 70px dari elemen sebelumnya.Container utama:max-w-[1512px] mx-auto: Lebar maksimum 1512px dan posisi tengah secara horizontal.px-[130px]: Padding kiri dan kanan 130px.flex items-center justify-between: Mengatur isi menjadi 2 kolom sejajar (konten kiri dan gambar kanan), rata tengah secara vertikal dan tersebar rata secara horizontal. Konten Kiri flex flex-col items-start text-start:Mengatur isi dalam kolom (vertikal) dan teks rata kiri.Elemen Judul (<h1>):Ukuran teks 46px, font-bold, warna biru tua (#13214A).max-w-[462px]: Batas lebar maksimum agar teks tidak terlalu panjang.leading-[69px]: Jarak antar baris.Paragraf deskripsi:Ukuran teks 16px, warna abu #78839E, leading-[32px] untuk kenyamanan baca.max-w-[393px] dan mt-[20px]: Jarak atas dari judul.Tombol “Protect My Money”:mt-[40px]: Jarak atas dari paragraf.Tombol berwarna biru #0E45FF, teks putih, font-semibold.Lebar 250px, padding vertikal 20px, rounded-full.Ada efek hover shadow biru. Gambar Kanan Container gambar:relative shrink-0: Untuk memungkinkan penempatan elemen secara absolut di dalamnya.Gambar utama:Ukuran tetap: lebar 680px, tinggi 520px, sudut membulat 40px.object-cover: Gambar tetap proporsional tanpa distorsi.Elemen info tambahan (keterangan di bawah gambar):absolute: Diposisikan di pojok kanan bawah gambar.bottom-[-25px] right-[118px]: Posisinya diatur agar melayang sebagian ke luar gambar.bg-white, padding px-[26px] py-[13px], rounded-[54px], dan shadow__element: Membentuk kotak info dengan bayangan.Isi elemen info:flex items-center gap-x-[14px]: Ikon dan teks sejajar dengan jarak antar elemen.Teks: ukuran 16px, font-semibold, warna biru tua. 2. Tampilan Mobile & Tablet (320px - 1511px) <section class="mt-[70px]"> <div class="w-full max-w-[1512px] mx-auto px-[30px] lg:px-[130px] flex items-center justify-start sm:justify-center 2xl:justify-between"> <div class="flex flex-col sm:items-center sm:text-center 2xl:items-start 2xl:text-start"> <h1 class="text-[30px] sm:text-[46px] font-bold text-[#13214A] max-w-[462px] md:leading-[69px]">Protect Your Money Securely With Us.</h1> <p class="text-[14px] md:text-[16px] text-[#78839E] md:leading-[32px] max-w-[393px] mt-[20px]">Keep your company cashflow better and grow the business would be better integrated systems.</p> <div class="mt-[20px] md:mt-[30px] 2xl:mt-[40px]"> <a href=""> <div class="bg-[#0E45FF] text-white font-semibold w-[180px] md:w-[200px] 2xl:w-[250px] py-[14px] md:py-[16px] 2xl:py-[20px] flex items-center justify-center rounded-[50px] hover:shadow-sm hover:shadow-[#0E45FF] transition-all duration-300 text-[16px] md:text-[18px] 2xl:text-[20px]">Protect My Money</div> </a> </div> </div> <div class="relative shrink-0 hidden 2xl:block"> <img src="assets/images/photos/hero-image.png" alt="" class="w-[680px] h-[520px] object-cover rounded-[40px] shrink-0"> <div class="absolute bg-white flex items-center justify-center px-[26px] py-[13px] rounded-[54px] bottom-[-25px] right-[118px] shadow__element"> <div class="flex items-center gap-x-[14px]"> <img src="assets/images/icons/checklist.svg" alt="" class="w-[24px] h-[24px] shrink-0"> <p class="text-[16px] font-semibold text-[#13214A]">The most trusted system in the global world</p> </div> </div> </div> </div> </section> Struktur Section Hero (Responsif) <section class="mt-[70px]">Memberi margin atas 70px agar tidak terlalu menempel ke elemen sebelumnya. Container Utama <div class="w-full max-w-[1512px] mx-auto px-[30px] lg:px-[130px] flex items-center justify-start sm:justify-center 2xl:justify-between">Lebar penuh tapi dibatasi max-w-[1512px].Padding horizontal kecil di mobile (30px) dan lebih lebar di desktop (130px).Flex container untuk 2 elemen horizontal.Posisi isi:justify-start di mobile,justify-center di small screen (sm),justify-between di ultra-wide (2xl) agar teks kiri dan gambar kanan tersebar rata. Konten Kiri <div class="flex flex-col sm:items-center sm:text-center 2xl:items-start 2xl:text-start">Stack vertikal.Teks rata tengah di sm, dan rata kiri di 2xl.<h1>:Teks judul responsif:text-[30px] di mobile,text-[46px] di sm ke atas.Maksimal lebar 462px, font-bold, warna biru tua.Line height 69px di md.<p>:Ukuran teks 14px di mobile dan 16px di md.Warna abu muda, jarak antar baris 32px di md.Maksimal lebar 393px, mt-[20px].Tombol:Margin atas bertingkat:20px di mobile,30px di md,40px di 2xl.Lebar dan padding responsif:180px dan 14px di mobile,200px dan 16px di md,250px dan 20px di 2xl.Warna biru, teks putih, font-semibold.Hover ada efek bayangan ringan (shadow-sm). Gambar Kanan (Hanya di Layar Besar) <div class="relative shrink-0 hidden 2xl:block">Gambar hanya tampil di layar 2xl (tidak muncul di mobile).relative untuk posisi elemen anak yang absolut.<img>:Gambar dengan ukuran tetap 680x520px, object-cover agar tidak terdistorsi.Sudut membulat 40px.Elemen info tambahan (tooltip di bawah gambar):Posisi absolut bottom-[-25px] right-[118px].Warna putih, padding dalam px-[26px] py-[13px], membulat penuh (rounded-[54px]).Bayangan (shadow__element) agar tampak seperti melayang.Isi tooltip:Ikon checklist dan teks berdampingan, gap-x-[14px].Teks ukuran 16px, font-semibold, warna biru tua. Pada kode di atas, kita menambahkan class breakpoint seperti sm md lg dan 2xl untuk mendapatkan tampilan yang responsive di semua perangkat. Hasil akhir akan seperti ini: Versi Mobile : BankMo - Header Mobile Versi Tablet : BankMo - Header Tablet Versi Desktop : BankMo - Header Dekstop Membuat Section Logo Klien Selanjutnya, kita akan membuat section logo klien. Bagian ini biasanya dipakai untuk menunjukkan logo-logo brand atau perusahaan yang pernah kerja sama dengan kita. 1. Tampilan Desktop (>1512px) <section class="w-full flex items-center justify-center mt-[100px]"> <div class="flex items-center gap-x-[92.8px]"> <img src="assets/images/logos/logo-1.svg" alt="" class="w-[212.17px] h-[61px] shrink-0"> <img src="assets/images/logos/logo-2.svg" alt="" class="w-[177.7px] h-[45.09px] shrink-0"> <img src="assets/images/logos/logo-3.svg" alt="" class="w-[164.43px] h-[42.43px] shrink-0"> <img src="assets/images/logos/logo-4.svg" alt="" class="w-[201.57px] h-[25.2px] shrink-0"> </div> </section> Menggunakan flex horizontal agar logo sejajar.gap-x-[92.8px] memberi jarak antar logo.Ukuran logo disesuaikan agar terlihat proporsional. 2. Tampilan Mobile & Tablet (320px - 1511px) <section class="w-full flex flex-col items-center justify-center mt-[100px] px-[30px] sm:px-[40px] md:px-[60px] 2xl:px-0"> <div class="w-full grid grid-cols-1 sm:grid-cols-2 md:flex md:flex-row items-center justify-center gap-[40px] md:gap-x-[60px] lg:gap-x-[92.8px]"> <div class="flex justify-center"> <img src="assets/images/logos/logo-1.svg" alt="" class="w-[160px] h-[46px] sm:w-[180px] sm:h-[52px] md:w-[160px] md:h-[46px] lg:w-[212.17px] lg:h-[61px]"> </div> <div class="flex justify-center"> <img src="assets/images/logos/logo-2.svg" alt="" class="w-[140px] h-[35px] sm:w-[160px] sm:h-[40px] md:w-[130px] md:h-[33px] lg:w-[177.7px] lg:h-[45.09px]"> </div> <div class="flex justify-center"> <img src="assets/images/logos/logo-3.svg" alt="" class="w-[130px] h-[33px] sm:w-[150px] sm:h-[38px] md:w-[120px] md:h-[31px] lg:w-[164.43px] lg:h-[42.43px]"> </div> <div class="flex justify-center"> <img src="assets/images/logos/logo-4.svg" alt="" class="w-[150px] h-[19px] sm:w-[170px] sm:h-[22px] md:w-[150px] md:h-[19px] lg:w-[201.57px] lg:h-[25.2px]"> </div> </div> </section> Gunakan grid atau flex tergantung lebar layar.Logo dibungkus dalam <div class="flex justify-center"> agar selalu berada di tengah.Ukuran logo disesuaikan per breakpoint (sm, md, lg) agar tampil konsisten dan tidak terlalu besar/kecil. BankMo - Logos BankMo - Logos Membuat Section Keunggulan Setelah membuat Section Logo Klien, selanjutnya kita akan membuat Section Keunggulan yang menampilkan berbagai keunggulan utama dari website kita. Bagian ini bertujuan untuk meyakinkan pengunjung dengan menampilkan fitur-fitur unggulan yang dimiliki. Section ini dibagi menjadi 2 bagian utama : Judul dan deskripsi singkat di tengah halaman.Tiga kotak keunggulan berisi ikon, judul fitur, dan penjelasan singkat. 1. Tampilan Desktop (>1512px) <section class="mt-[100px]"> <div class="w-full bg-[#0B142F] flex items-center justify-center px-[318px] py-[100px]"> <div class="flex flex-col items-center text-center"> <h2 class="text-[32px] font-semibold text-white">Why Choose Us</h2> <p class="text-[16px] leading-[32px] text-[#77809D] px-[254px] mt-[20px]">Reasonable option for growing your company and working more automatically with us</p> <div class="mt-[70px] grid grid-cols-3 gap-[90px]"> <div class="flex flex-col items-start text-start"> <div class="bg-[#0E45FF] flex items-center justify-center w-[60px] h-[60px] rounded-full"> <img src="assets/images/icons/globe.svg" alt="" class="w-[24px] h-[24px] shrink-0"> </div> <div class="mt-[30px]"> <h6 class="text-[20px] font-medium text-white">Biggest Database</h6> <p class="text-[16px] leading-[24px] text-[#77809D] mt-[10px]">Access customer data to make business choice</p> </div> </div> <div class="flex flex-col items-start text-start"> <div class="bg-[#0E45FF] flex items-center justify-center w-[60px] h-[60px] rounded-full"> <img src="assets/images/icons/download.svg" alt="" class="w-[24px] h-[24px] shrink-0"> </div> <div class="mt-[30px]"> <h6 class="text-[20px] font-medium text-white">Offline Docs</h6> <p class="text-[16px] leading-[24px] text-[#77809D] mt-[10px]">No need Internet connection to get the latest report</p> </div> </div> <div class="flex flex-col items-start text-start"> <div class="bg-[#0E45FF] flex items-center justify-center w-[60px] h-[60px] rounded-full"> <img src="assets/images/icons/database.svg" alt="" class="w-[24px] h-[24px] shrink-0"> </div> <div class="mt-[30px]"> <h6 class="text-[20px] font-medium text-white">Most Secure</h6> <p class="text-[16px] leading-[24px] text-[#77809D] mt-[10px]">We ensure that every single database would be safe</p> </div> </div> </div> </div> </div> </section> Warna latar belakang gelap (bg-[#0B142F]) membuat konten terlihat menonjol.Menggunakan grid-cols-3 untuk menampilkan 3 keunggulan secara sejajar.Icon dibungkus bulat dengan bg-[#0E45FF] dan ukuran tetap (60px x 60px). BankMo - Why Choose Us Dekstop 2. Tampilan Mobile & Tablet (320px - 1511px) <section class="mt-[100px]"> <div class="w-full bg-[#0B142F] flex items-center justify-center px-[30px] sm:px-[60px] md:px-[100px] lg:px-[140px] 2xl:px-[318px] py-[60px] md:py-[100px]"> <div class="flex flex-col items-center text-center"> <h2 class="text-[24px] md:text-[32px] font-semibold text-white">Why Choose Us</h2> <p class="text-[14px] md:text-[16px] md:leading-[32px] text-[#77809D] sm:px-[100px] md:px-[160px] 2xl:px-[254px] mt-[10px] md:mt-[20px]">Reasonable option for growing your company and working more automatically with us</p> <div class="mt-[40px] md:mt-[70px] grid md:grid-cols-3 gap-[30px] md:gap-[90px]"> <div class="flex flex-col items-center md:items-start md:text-start"> <div class="bg-[#0E45FF] flex items-center justify-center w-[60px] h-[60px] rounded-full"> <img src="assets/images/icons/globe.svg" alt="" class="w-[24px] h-[24px] shrink-0"> </div> <div class="mt-[20px] md:mt-[30px]"> <h6 class="text-[18px] font-medium text-white">Biggest Database</h6> <p class="text-[14px] md:text-[16px] md:leading-[24px] text-[#77809D] mt-[10px]">Access customer data to make business choice</p> </div> </div> <div class="flex flex-col items-center md:items-start md:text-start"> <div class="bg-[#0E45FF] flex items-center justify-center w-[60px] h-[60px] rounded-full"> <img src="assets/images/icons/download.svg" alt="" class="w-[24px] h-[24px] shrink-0"> </div> <div class="mt-[20px] md:mt-[30px]"> <h6 class="text-[18px] font-medium text-white">Offline Docs</h6> <p class="text-[14px] md:text-[16px] md:leading-[24px] text-[#77809D] mt-[10px]">No need Internet connection to get the latest report</p> </div> </div> <div class="flex flex-col items-center md:items-start md:text-start"> <div class="bg-[#0E45FF] flex items-center justify-center w-[60px] h-[60px] rounded-full"> <img src="assets/images/icons/database.svg" alt="" class="w-[24px] h-[24px] shrink-0"> </div> <div class="mt-[20px] md:mt-[30px]"> <h6 class="text-[18px] font-medium text-white">Most Secure</h6> <p class="text-[14px] md:text-[16px] md:leading-[24px] text-[#77809D] mt-[10px]">We ensure that every single database would be safe</p> </div> </div> </div> </div> </div> </section> Gunakan padding dan font size yang berbeda-beda sesuai ukuran layar.Grid keunggulan otomatis menjadi satu kolom di mobile, tiga kolom di desktop.Posisi teks dan icon berubah dari center ke kiri saat masuk ke sm (medium screen ke atas). BankMo - Why Choose Us Tablet BankMo - Why Choose Us Mobile Membuat Section Testimonial Section Testimonial digunakan untuk menampilkan komentar atau ulasan dari pengguna yang telah mencoba layanan atau produk kita. Tujuannya adalah meningkatkan kepercayaan dan memberikan bukti sosial bahwa website atau bisnis kita memang terpercaya dan berkualitas. Section testimonial dibagi menjadi tiga bagian utama: Tombol NavigasiTombol kiri (sebelumnya) dan kanan (selanjutnya) untuk berpindah antar komentar.Diberi ikon panah dan dibungkus dalam elemen <button>.Kontainer TestimonialBagian tengah berisi komentar pengguna yang sedang ditampilkan.Komentar diletakkan dalam <div> dengan ID testimonialContainer.Tambahkan animasi transition agar perubahan komentar terasa halus.Dekorasi KutipanGambar ikon kutipan (quotation.svg) diletakkan di belakang komentar sebagai hiasan.Menggunakan absolute positioning agar tidak mengganggu teks. 1. Tampilan Desktop (>1512px) <section class="my-[100px]"> <div class="max-w-[1512px] mx-auto flex justify-between px-[130px]"> <button type="button" id="prevButton" class="mt-[133px] border border-[#78839E] rounded-full flex items-center justify-center w-[50px] h-[50px] flex-none cursor-pointer"> <img src="assets/images/icons/arrow.svg" alt="Previous" class="w-[24px] h-[24px] shrink-0"> </button> <div class="flex flex-col items-center overflow-hidden relative w-full"> <div id="testimonialContainer" class="flex items-center justify-center transition-all duration-300 ease-in-out min-h-[374px] z-50 text-[#13214A]"> <!-- Komentar Disini --> </div> <div class="absolute left-[180px] top-[75px] z-0"> <img src="assets/images/icons/quotation.svg" alt="" class="w-[112px] h-auto"> </div> </div> <button type="button" id="nextButton" class="mt-[133px] border border-[#78839E] rounded-full flex items-center justify-center w-[50px] h-[50px] flex-none cursor-pointer"> <img src="assets/images/icons/arrow.svg" alt="Next" class="w-[24px] h-[24px] rotate-180 shrink-0"> </button> </div> </section> Gunakan flex justify-between untuk menempatkan tombol navigasi di kiri dan kanan.Komentar berada di tengah dalam elemen #testimonialContainer.Gambar kutipan diletakkan di background menggunakan posisi absolute agar tampil estetik. BankMo - Testimonial Dekstop 2. Tampilan Mobile & Tablet (320px - 1511px) <section class="my-[30px] md:my-[100px] px-[30px]"> <div class="max-w-[1512px] mx-auto flex justify-between sm:px-[60px] xl:px-[120px] 2xl:px-[130px]"> <button type="button" id="prevButton" class="mt-[133px] border border-[#78839E] rounded-full flex items-center justify-center w-[40px] h-[40px] md:w-[50px] md:h-[50px] flex-none cursor-pointer"> <img src="assets/images/icons/arrow.svg" alt="Previous" class="w-[20px] h-[20px] md:w-[24px] md:h-[24px] shrink-0"> </button> <div class="flex flex-col items-center overflow-hidden relative w-full"> <div id="testimonialContainer" class="flex items-center justify-center transition-all duration-300 ease-in-out min-h-[374px] z-50 text-[#13214A]"> <!-- Komentar Disini --> </div> <div class="absolute left-[40px] top-[200px] md:top-[140px] 2xl:left-[180px] 2xl:top-[75px] z-0"> <img src="assets/images/icons/quotation.svg" alt="" class="w-[40px] sm:w-[60px] md:w-[80px] 2xl:w-[112px] h-auto"> </div> </div> <button type="button" id="nextButton" class="mt-[133px] border border-[#78839E] rounded-full flex items-center justify-center w-[40px] h-[40px] md:w-[50px] md:h-[50px] flex-none cursor-pointer"> <img src="assets/images/icons/arrow.svg" alt="Next" class="w-[20px] h-[20px] md:w-[24px] md:h-[24px] rotate-180 shrink-0"> </button> </div> </section> Tombol panah dan ikon kutipan menyesuaikan ukuran layar menggunakan breakpoint (sm, md, 2xl).Margin dan padding diatur agar tidak terlalu mepet di layar kecil.#testimonialContainer tetap berada di tengah dan punya animasi transition untuk navigasi antar komentar. BankMo - Testimonial Mobile BankMo - Testimonial Tablet Mengatur Animasi slide komentar Untuk membuat perpindahan antar testimonial lebih halus dan menarik secara visual, kita bisa menambahkan animasi sliding ketika tombol navigasi diklik. Animasi ini memberikan efek testimonial masuk dari kiri atau kanan. Buka file src/comment.js . Ketik kode berikut : document.addEventListener('DOMContentLoaded', () => { const testimonialContainer = document.getElementById('testimonialContainer'); const prevButton = document.getElementById('prevButton'); const nextButton = document.getElementById('nextButton'); let currentIndex = 0; // Data testimonial const testimonials = [ { stars: 5, comment: "It was such as a great choice <br>to invest in the reliable systems that BankMo has provide for me.", name: "Amanda", role: "Sr Credit Analyst", image: "assets/images/photos/profile-picture.png" }, { stars: 5, comment: "BankMo's reliable systems are truly exceptional and easy to use.", name: "John", role: "Financial Advisor", image: "assets/images/photos/profile-picture.png" }, { stars: 5, comment: "I am very satisfied with the reliable systems provided by BankMo.", name: "Sarah", role: "Investment Manager", image: "assets/images/photos/profile-picture.png" } ]; function renderTestimonial(index, direction) { const testimonial = testimonials[index]; testimonialContainer.innerHTML = ` <div class="flex flex-col items-center w-full flex-none ${direction === 'next' ? 'slide-in-right' : 'slide-in-left'}"> <div class="flex gap-x-[6px] md:gap-x-[14px]"> ${Array.from({ length: testimonial.stars }, () => `<img src="assets/images/icons/star.svg" alt="Star" class="w-[18px] h-[18px] md:w-[22px] md:h-[22px] shrink-0">`).join('')} </div> <div class="mt-[30px] px-[20px] 2xl:px-[211px]"> <p class="text-[14px] sm:text-[24px] 2xl:text-[40px] 2xl:leading-[70px] text-center">${testimonial.comment.replace( /reliable systems/g, '<span class="font-semibold">reliable systems</span>' )}</p> </div> <div class="mt-[20px] md:mt-[30px] flex items-center gap-[12px] md:gap-x-[24px]"> <div class="w-[50px] h-[50px] md:w-[80px] md:h-[80px] border border-[#78839E] rounded-full flex items-center justify-center"> <img src="${testimonial.image}" alt="${testimonial.name}" class="w-[40px] h-[40px] md:w-[70px] md:h-[70px] rounded-full object-cover object-center shrink-0"> </div> <div> <p class="text-[16px] md:text-[20px] font-medium text-[#13214A]">${testimonial.name}</p> <p class="text-[12px] md:text-[16px] text-[#77809D]">${testimonial.role}</p> </div> </div> </div> `; } function slide(direction) { testimonialContainer.classList.remove('slide-in-right', 'slide-in-left'); currentIndex = direction === 'next' ? (currentIndex + 1) % testimonials.length : (currentIndex - 1 + testimonials.length) % testimonials.length; renderTestimonial(currentIndex, direction); } prevButton.addEventListener('click', () => slide('prev')); nextButton.addEventListener('click', () => slide('next')); renderTestimonial(currentIndex, 'next'); }); Kode ini membuat komponen testimonial interaktif dengan navigasi kiri–kanan dan animasi transisi. Data Testimonial: Disimpan dalam array berisi nama, peran, komentar, bintang, dan foto.Navigasi: Dua tombol (prevButton dan nextButton) digunakan untuk berpindah testimonial.Fungsi Utama:renderTestimonial(index, direction): Menampilkan testimonial berdasarkan indeks dan menambahkan animasi (slide-in-left atau slide-in-right).slide(direction): Mengatur indeks aktif lalu memanggil renderTestimonial.Inisialisasi: Saat halaman dimuat, testimonial pertama langsung ditampilkan. Ketika sudah menambahkan fungsionalitas dengan menggunakan JavaScript, maka selanjutnya adalah membuat efek slide menggunakan CSS. /* Animasi fade */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* Animasi slide dari kanan */ @keyframes slideInRight { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } /* Animasi slide dari kiri */ @keyframes slideInLeft { from { transform: translateX(-100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } /* Class untuk animasi */ .fade-in { animation: fadeIn 0.5s ease-in-out; } .slide-in-right { animation: slideInRight 0.5s ease-in-out; } .slide-in-left { animation: slideInLeft 0.5s ease-in-out; } fadeIn: Mengubah opacity dari 0 (transparan) menjadi 1 (tidak transparan) dalam 0.5 detik.slideInRight: Membuat elemen bergeser dari luar layar kanan (menggunakan translateX(100%)) ke posisi normal sambil mengubah opacity dari 0 ke 1.slideInLeft: Membuat elemen bergeser dari luar layar kiri (menggunakan translateX(-100%)) ke posisi normal sambil mengubah opacity dari 0 ke 1..fade-in: Menerapkan animasi fade..slide-in-right: Menerapkan animasi slide dari kanan..slide-in-left: Menerapkan animasi slide dari kiri. Finalisasi dan Deploy Setelah selesai membuat semua section, maka hal terakhir yang kita lakukan adalah push ke repository github. Sebelum mengupload proyek ke GitHub, kita perlu melakukan setup terlebih dahulu agar file atau folder yang tidak penting, seperti node_modules, tidak ikut terupload. Langkah pertama adalah membuka atau membuat file .gitignore, lalu tambahkan nama file atau folder yang ingin dikecualikan dari proses upload ke GitHub. VSCode - Ignore Node Module 1. Membuat Repository Baru Langkah pertama yang kita lakukan adalah membuat repository baru untuk menampung seluruh kode yang sudah dibuat sebelumnya. Github - New repository 2. Menghubungkan Projek ke Repository Github - New repository Langkah-langkah Upload Project ke GitHub Buka terminal di folder project kamu.Jalankan perintah-perintah berikut secara berurutan:Inisialisasi Git: git initUbah nama branch default ke main: git branch -m mainTambahkan remote repository (ganti username dengan username GitHub kamu): git remote add origin <https://github.com/username/BankMo-Project.git>Tambahkan semua file ke staging: git add .Commit dengan pesan: git commit -m "Initial commit"Push ke GitHub: git push -u origin mainSetelah selesai, cek repository kamu di GitHub untuk memastikan file sudah terupload dengan benar. Github - Repository 3. Deploy Projek ke Vercel Langkah Terakhir adalah deploy projek agar projek bisa diakses secara online oleh semua orang. Hal yang perlu disiapkan : Login vercel.com dan hubungkan ke akun Github.Add New Project Vercel - Homepage Pilih Repository Vercel - For Import Setup nama dan Root Directory, arahkan ke folder src karena file index.html berada di dalamnnya. Vercel - New Proyek Jika selesai maka klik Deploy lalu akan diarahkan ke halaman Dashboard Projek. Vercel - Uploaded Projek siap diakses secara Online melalui link yang sudah tertera di Dashboard.bankmobwa.vercel.app Penutup Mengubah desain Figma menjadi HTML menggunakan Tailwind CSS dan JavaScript merupakan langkah penting dalam proses pengembangan web modern. Pendekatan ini tidak hanya memastikan konsistensi antara desain dan produk akhir, tetapi juga mempercepat proses pengembangan berkat utilitas Tailwind yang siap pakai serta fleksibilitas dari JavaScript. Melalui panduan ini, kita telah mempelajari bagaimana mentransformasikan desain dari Figma menjadi halaman web yang fungsional dengan bantuan Tailwind CSS dan JavaScript. Teruslah bereksperimen dengan komponen yang lebih kompleks dan optimalkan alur kerja (workflow) kamu. Selamat mencoba, semoga proses pengembanganmu menjadi lebih efisien dan menyenangkan!

Kelas Slicing Figma to HTML dengan Tailwind CSS - Login Page di BuildWithAngga

Slicing Figma to HTML dengan Tailwind CSS - Login Page

Slicing Figma to HTML dengan Tailwind CSS - Login Page Pernah lihat desain keren di Figma dan bingung mulai dari mana untuk nge-slice jadi HTML? Artikel ini bakal kasih contoh step-by-step nyusun layout login page modern pakai Tailwind CSS. Kita mulai dari satu kasus nyata: sebuah desain halaman login yang sudah siap di Figma dan tinggal dikonversi ke HTML fungsional. Nah, di sinilah proses slicing berperan penting—mengubah desain visual menjadi tampilan nyata menggunakan Tailwind CSS versi 4. Dengan pendekatan utility-first Tailwind, kita bisa membangun antarmuka yang cepat, konsisten, dan efisien. Dalam tutorial ini, kita akan pelajari langkah-langkah melakukan slicing Figma ke HTML untuk halaman login, dimulai dari persiapan file desain, penyusunan struktur HTML, hingga penerapan utility classes yang tepat. Panduan ini ditujukan untuk siapa saja yang ingin mengefisienkan proses konversi desain ke kode menggunakan Tailwind CSS V4. Yuk kita mulai! Menyiapkan desain figma dan instalasi tailwind Sebelum mulai proses slicing, pastikan semua bahan sudah siap. Kalian bisa membuka desain halaman login di Figma yang dapat di download melalui Shaynakit dan langsung mengekspor aset yang dibutuhkan, seperti logo atau ilustrasi, sesuai kebutuhan layout. Untuk icon disarankan export sebagai .svg dan untuk gambar bisa .png. Untuk Tailwind CSS, ada dua opsi: gunakan CDN untuk setup cepat, atau instal menggunakan Tailwind CLI dengan mengikuti dokumentasi resminya. Pilih metode yang paling sesuai dengan workflow kalian. Setelah aset diekspor, simpan ke dalam folder assets/images/ sesuai struktur proyek. Jika kalian menggunakan struktur folder sendiri, pastikan untuk menyesuaikan path file-nya agar tidak terjadi error saat implementasi di HTML. Contoh struktur folder yang digunakan. Slicing Figma to Html Setelah file dan setup Tailwind CSS siap, langkah berikutnya adalah memastikan semuanya berjalan dengan baik. Coba jalankan contoh template HTML dasar dari dokumentasi Tailwind di browser untuk memastikan Tailwind sudah terintegrasi dengan benar. Jika semuanya sudah berfungsi sebagaimana mestinya, saatnya kita mulai proses slicing. Kita akan mulai menyusun struktur HTML sesuai desain login page dari Figma. Layout dan style dasar Sebelum masuk ke layout, kita perlu mengatur tampilan dasar yang berlaku secara global—semacam style fondasi untuk seluruh halaman. Mulai dari font-family, warna latar belakang, warna teks, hingga pengaturan dasar pada elemen <body>. Ini penting supaya tampilan antarmuka tetap konsisten dengan desain Figma. body { font-family: "Lexend Deca", sans-serif; background-color: #F3F5F9; color: #292D32; } Style di atas disesuaikan langsung dari desain Figma—baik jenis font, warna latar, maupun warna teks utama. Selanjutnya, kita modifikasi file index.html agar tampak seperti berikut: <!doctype html> <html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link href="./output.css" rel="stylesheet" /> <!-- Load font Lexend Deca dari Google Fonts --> <link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link href="https://fonts.googleapis.com/css2?family=Lexend+Deca:[email protected]&display=swap" rel="stylesheet" /> </head> <body> <div class="flex"> <!-- Komponen login akan ditempatkan di sini --> </div> </body> </html> Di bagian <head>, kita menambahkan CDN untuk mengimpor font Lexend Deca dari Google Fonts. Sementara itu, <div class="flex"> akan menjadi wadah utama tempat semua komponen login disusun nantinya. Membuat halaman login Jika kita perhatikan desain di Figma, bagian kiri halaman login berisi elemen visual berupa teks dan gambar dekoratif. Elemen ini berfungsi sebagai pemanis dan pengisi ruang kosong, memberikan kesan profesional pada layout. Untuk membuatnya, kita akan membagi area tersebut menjadi dua bagian utama: Teks bagian atas — terdiri dari heading dan subheading.Container gambar — sebagai elemen visual di bagian bawah. Mulailah dengan struktur HTML dasar berikut: <div class="flex flex-col"> <p>— Manage Stock and Merchants</p> <p>Optimized Inventory,<br />Effortless Workflow 🎯</p> <div> <img src="" alt="image" /> </div> </div> Tampilan konten awal. Selanjutnya, kita akan menambahkan kelas Tailwind CSS sesuai dengan desain yang ada di Figma. Berikut tampilan akhir dari parent container-nya: <div class="flex flex-col h-screen overflow-hidden rounded-tr-[32px] pl-[30px] pt-[46px] w-[685px] shrink-0 bg-[linear-gradient(336.99deg,#0a3a89_0%,#1053d5_100%)]"> Tambahkan juga styling pada teks agar sesuai dengan desain: <p class="font-semibold text-lg text-[#deff6e]">— Manage Stock and Merchants</p> <p class="font-extrabold text-[42px] uppercase text-white mt-4 mb-[30px]"> Optimized Inventory,<br /> Effortless Workflow 🎯 </p> Jika diimplementasikan dengan benar, tampilannya akan menyerupai desain berikut: Tampilan bagian kiri setelah diberi style. Menambahkan gambar Selanjutnya, kita masuk kebagian gambar. Export gambar dengan settingan PNG dengan resolusi 3x agar kualitas gambar tetap terjaga dan tajam walau dilihat pada layar dengan resolusi lebih tinggi dari design figma, atau teman teman bisa mendownloadnya dari link asset yang sudah disedaikan sebelumnya. berikut contohnya. Untuk bagian gambar, ekspor langsung dari Figma dalam format PNG dengan resolusi 3x agar tampil tajam bahkan di layar beresolusi tinggi. Simpan gambar ke dalam folder assets/images/backgrounds/ agar lebih mudah dikelola. Gunakan gambar tersebut di HTML dengan struktur berikut: export gambar tersebut kedalam folder assets/iamges/backgrounds agar kita mudah menemukannya. pada index.html. Gunakan gambar tersebut kemudian berikan style pada container gambar itu seperti dibawah ini. <div class="flex flex-1 overflow-hidden rounded-tl-[20px]"> <img src="assets/images/backgrounds/bg-image-1.png" alt="image" /> </div> Namun, kamu mungkin akan mengalami masalah pada tampilan saat layar berbeda ukurannya dari desain Figma. Contohnya seperti ini: Tampilan setelah diberi gambar dan kondisi gambar tidak responsive. Kiri: Gambar terlalu kecil karena tinggi container disesuaikan.Kanan: Gambar tertarik secara vertikal hingga tampak distorted. Untuk mengatasi ini, tambahkan class Tailwind berikut pada elemen <img>: <img src="assets/images/backgrounds/bg-image-1.png" class="size-full object-cover object-left-top" alt="image"> Dengan object-cover, gambar akan selalu menutupi seluruh container tanpa distorsi, meskipun sebagian sisi gambar mungkin terpotong. Hasil akhirnya akan seperti ini: Tampilan gambar setelah diberikan style agar responsive. Walaupun sebagian gambar terpotong, tampilannya tetap bersih, proporsional, dan tidak terlihat pecah ataupun memanjang secara tidak wajar. Form login Sekarang kita akan masuk ke bagian yang lebih kompleks: form login. Jika kita lihat desain di Figma, ada perbedaan tampilan pada elemen input ketika sudah diisi dan ketika kosong. Selain itu, juga ada fitur untuk melihat password yang diketik. Jangan khawatir, kita akan bahas semuanya secara detail untuk membuat desain ini sesuai dengan yang ada di Figma. Yuk, kita mulai! Seperti pada bagian sebelumnya, kita akan menambahkan struktur elemen HTML. Namun kali ini, beberapa elemen sudah memiliki style default yang cukup sederhana agar tutorial ini tidak terlalu panjang atau membosankan. <div class="flex flex-1 items-center justify-center"> <form action="overview.html" class="flex flex-col w-[435px] shrink-0 rounded-3xl gap-10 p-6 bg-white"> <img src="assets/images/logos/logo.svg" class="w-[203px] mx-auto" alt="logo" /> <div class="flex flex-col gap-[30px]"> <div class="flex flex-col gap-3 text-center"> <p class="font-semibold text-2xl">Hey🙌🏻, Welcome Back!</p> <p class="font-medium text-[#6a7686]">Login to your account to continue!</p> </div> <div id="Input-Container" class="flex flex-col gap-4 w-full"> <!-- Input --> <p class="font-medium text-sm text-[#6a7686]"> Forget Password? <a href="#" class="font-semibold text-[#1053d5] hover:underline">Reset Password</a> </p> </div> <button type="submit" class="btn btn-primary w-full font-bold">Sign In</button> </div> </form> </div> Jika sudah mengikuti langkah ini, tampilan form login seharusnya terlihat seperti gambar berikut: Tampilan form login pada bagian kanan. Menambahkan input email Sekarang, mari kita fokus pada elemen input. Kita mulai dengan membuat input untuk email. Berikut struktur dasar HTML untuk input email: <label> <div> <img src="assets/images/icons/sms-grey.svg" class="flex size-6 shrink-0" alt="icon" /> </div> <p class="placeholder">Your email address</p> <input type="email" class="" placeholder="" /> </label> Penjelasan: Label: Semua elemen input dibungkus dalam elemen <label> agar saat area input diklik, kita bisa langsung fokus dan mulai mengetik.Icon: Kita letakkan ikon di dalam div terpisah dan posisikan secara absolute agar tetap konsisten di posisi kiri input.Placeholder: Di desain Figma, placeholder akan berpindah ke atas ketika input terisi, sehingga kita menggunakan elemen terpisah untuk placeholder ini agar lebih mudah di-styling. Sekarang, kita tambahkan style pada elemen input tersebut agar sesuai dengan desain Figma: <label class="relative"> <div class="flex items-center pr-4 absolute transform -translate-y-1/2 top-1/2 left-6 border-r-[1.5px] border-[#e8e8e8]"> <img src="assets/images/icons/sms-grey.svg" class="flex size-6 shrink-0" alt="icon" /> </div> <p class="placeholder font-medium text-[#6a7686] text-sm absolute -translate-y-1/2 left-[81px] top-1/2"> Your email address </p> <input type="email" class="appearance-none w-full h-[72px] font-semibold text-lg rounded-3xl border-[1.5px] border-[#e8e8e8] pl-20 pr-6 pb-[14.5px] pt-[14.5px]" placeholder="" /> </label> Penjelasan Styling: Label: Diberikan class .relative agar elemen-elemen di dalamnya bisa diposisikan relatif terhadap label.Icon: Gambar ikon diletakkan dengan menggunakan class absolute, diatur di sebelah kiri input dengan border separator.Placeholder: Diberikan class absolute untuk memindahkan posisi placeholder ke atas saat input terisi, menggunakan warna dan ukuran teks sesuai dengan desain.Input Field: Input email diberi styling agar sesuai dengan desain Figma, menggunakan border, padding, dan font yang konsisten. Dengan penerapan tersebut, tampilan input email akan seperti berikut: Tampilan input email tahap awal. Mengatasi Masalah Placeholder yang Tindih namun ada masalah ketika ada input dari user, placeholder dan input saling tindih tidak seperti pada design figma. berikut solusinya, pertama kita akan menggunakan fitur “group” dari tailwind css. Fitur ini memungkinkan kita untuk mengatur style berdasarkan kondisi atau state dari child dalam suatu group atau untuk group itu sendiri. Langkah pertama adalah tambahkan .group ke <label> seperti contoh berikut Sebelumnya kita sudah menambahkan elemen input untuk email, namun ada masalah saat pengguna mulai mengetik—placeholder dan teks input saling tumpang tindih, yang tidak sesuai dengan desain Figma. Untuk mengatasi masalah ini, kita akan menggunakan fitur “group” dari Tailwind CSS. Fitur ini memungkinkan kita untuk mengatur style berdasarkan kondisi atau state dari child dalam suatu group, atau untuk group itu sendiri. Langkah pertama adalah menambahkan class .group ke elemen <label> untuk membuat semua child element dari label tersebut menjadi satu group. <label class="group relative"> Dengan menggunakan class .group, kita bisa menerapkan style kondisional pada elemen di dalamnya berdasarkan state grup tersebut. Menambahkan Transisi untuk Placeholder Untuk memastikan placeholder bergerak dengan mulus saat pengguna mulai mengetik, kita perlu mengatur posisi top placeholder agar bisa berubah. Kita akan memanfaatkan fitur Tailwind placeholder-shown: untuk mendeteksi apakah elemen input sedang kosong atau sudah diisi. Namun, karena kita menggunakan elemen <p> untuk placeholder (bukan atribut placeholder pada <input>), kita akan menggabungkan group-has-placeholder-shown: untuk mendeteksi perubahan pada elemen input di dalam grup tersebut. Berikut solusinya untuk elemen placeholder: <p class="placeholder font-medium text-[#6a7686] text-sm absolute -translate-y-1/2 left-[81px] top-[25px] group-has-placeholder-shown:top-1/2 transition-all duration-300"> Your email address </p> Perubahan yang kita buat: Ganti class top-1/2 menjadi top-[25px] group-has-placeholder-shown:top-1/2, agar posisi default placeholder berada di 25px, yaitu posisi saat placeholder geser ke atas. Namun, selama input belum menerima inputan dari user, posisi top akan berada di 50% atau di tengah.Gunakan transition-all duration-300 untuk memberi efek transisi yang halus saat placeholder bergerak. Jika sudah sesuai, maka tampilan input saat user mulai mengetik akan terlihat seperti ini: Tampilan input email dengan placeholder yang sudah sesuai pada tempatnya. Menambahkan Transisi untuk Input Sekarang, mari kita atur padding pada elemen input agar teks input tidak bertabrakan dengan placeholder yang sudah dipindahkan. Kenapa padding? bukan top seperti elemen placeholder, hal ini dikarenakan elemen <input> memenuhi ruang <label> sehingga untuk menggeser text kebawah kita perlu mengubah paddingnya. Ubah elemen input menjadi seperti berikut: <input type="email" class="appearance-none w-full h-[72px] font-semibold text-lg rounded-3xl border-[1.5px] border-[#e8e8e8] pl-20 pr-6 pb-[14.5px] pt-[34.5px] placeholder-shown:pt-[14.5px] focus:border-[#292d32] transition-300" placeholder="" > Konsepnya masih sama dengan elemen .placeholder, namun disini yang kita ubah adalah padding untuk menggeser text inputan dari userke bawah. Tidak hanya itu, pada <input> kita juga tidak menggunakan group-has- karena cukup mendeteksi perbuhan dari elemen <input> itu sendiri dan tidak bergantung pada group. Jika sudah benar, maka tampilan input saat pengguna mengetik akan seperti berikut: Tampilan input email yang telah diberi style dan animasi sesuai figma. Menambahkan Input Password dan Fitur Menampilkan Password Sekarang kita akan menambahkan input password. Caranya hampir sama dengan input email, namun kita juga menambahkan tombol untuk melihat password yang diketik. Berikut adalah struktur HTML untuk input password: <label class="group relative"> <div class="flex items-center pr-4 absolute transform -translate-y-1/2 top-1/2 left-6 border-r-[1.5px] border-[#e8e8e8] "> <img src="assets/images/icons/lock-grey.svg" class="flex size-6 shrink-0" alt="icon"> </div> <p class="placeholder font-medium text-[#6a7686] text-sm absolute -translate-y-1/2 left-[81px] top-[25px] group-has-placeholder-shown:top-[36px] group-focus-within:top-[25px] transition-all duration-300"> Your password </p> <input id="passwordInput" type="password" class="appearance-none w-full h-[72px] font-semibold text-lg rounded-3xl border-[1.5px] border-[#e8e8e8] pl-20 pr-16 pb-[14.5px] pt-[34.5px] placeholder-shown:pt-[14.5px] focus:border-[#292d32] transition-300 tracking-[0.3em]" placeholder=""> <button id="togglePassword" type="button" class="absolute transform -translate-y-1/2 top-1/2 right-6"> <img src="assets/images/icons/eye-grey.svg" class="flex size-6 shrink-0" alt="icon"> </button> </label> Perubahan utama adalah penambahan tombol di sebelah kanan input untuk melihat password, serta padding tambahan pada input untuk memberi ruang bagi tombol tersebut. const passwordInput = document.getElementById('passwordInput'); const toggleBtn = document.getElementById('togglePassword'); toggleBtn.addEventListener('click', () => { const isPassword = passwordInput.type === 'password'; passwordInput.type = isPassword ? 'text' : 'password'; }); Simpan kode ini dalam file .js terpisah atau masukkan langsung di dalam tag <script> pada template HTML kita. Dengan komponen input yang sudah selesai, kita resmi menyelesaikan proses slicing form login sesuai desain di Figma—mulai dari struktur HTML, styling menggunakan Tailwind CSS, hingga interaksi dasar seperti placeholder dinamis dan toggle visibility pada password. Untuk saat ini, kita memang hanya fokus pada bagian frontend statis tanpa menyentuh responsif atau logika backend. Tapi dari sini, kamu sudah punya fondasi visual yang solid untuk melangkah lebih jauh jika dibutuhkan. Jangan ragu untuk eksplorasi atau sesuaikan lebih lanjut dengan kebutuhan project-mu. Tampilan akhir dari slicing figma to html halaman login. Penutup dan Saran Slicing desain Figma ke dalam bentuk HTML statis menggunakan Tailwind CSS memang terlihat sederhana, tapi sebenarnya mengajarkan banyak hal penting: mulai dari pemahaman struktur HTML yang rapi, teknik positioning yang presisi, hingga interaksi UI seperti placeholder dinamis dan fitur show/hide password. Dengan pendekatan ini, kamu sudah punya fondasi kuat untuk membangun antarmuka login yang profesional dan siap dikembangkan lebih lanjut, baik dari sisi responsif maupun backend-nya di kemudian hari. Namun, belajar secara mandiri tentu tidak selalu mudah—terkadang justru bikin frustrasi karena terlalu banyak hal teknis yang harus dikuasai sekaligus. Untuk itu, kami merekomendasikan kamu untuk belajar langsung bersama mentor expert di BuildWithAngga. Melalui program mentoring di BuildWithAngga, kamu bisa mendapatkan: ✅ Akses Materi Seumur Hidup – Belajar kapan pun tanpa batas waktu. ✅ Sertifikat Resmi – Validasi skill kamu di mata recruiter atau klien. ✅ Portfolio Nyata – Mengerjakan project dengan standar industri. ✅ Akses Komunitas dan Mentor – Diskusi langsung dengan praktisi yang berpengalaman. Jangan ragu untuk ambil langkah lebih jauh. Bangun fondasi yang kuat hari ini, dan siapkan dirimu untuk tantangan yang lebih besar di dunia web development. 🚀

Kelas Slicing Figma ke HTML: Halaman Pilih Kursi Pesawat Dengan Tailwind CSS di BuildWithAngga

Slicing Figma ke HTML: Halaman Pilih Kursi Pesawat Dengan Tailwind CSS

Slicing desain dari Figma ke HTML kelihatannya simpel — susun elemen, pasang teks, selesai. Tapi saat ketemu detail kecil seperti spasi antar elemen dan struktur grid, baru terasa semakin kompleks. Di artikel ini, kita bakal belajar bareng tentang slicing halaman pilih kursi pesawat dari Figma ke HTML menggunakan Tailwind CSS. Layout-nya unik: dua sisi kursi dengan jalan kosong di tengah, jadi tidak bisa asal pakai grid standar. Kita akan susun semua ini cukup dengan satu halaman sederhana, tanpa tambahan macam-macam. Sebelum mulai slicing, ada baiknya kita pahami dulu struktur layout dari desain yang mau kita buat. Kita bisa download desain figma-nya melalui Shaynakit. Kalau asal langsung masuk bikin HTML, biasanya bakal kebingungan di tengah jalan — entah karena grid yang salah, spasi yang tidak pas, atau alignment yang mulai berantakan. Dengan ngerti dulu pola layout-nya, kita bisa susun struktur dasar HTML dan CSS lebih tenang, tanpa harus bolak-balik revisi. Memahami Layout dari Figma Sebelum mulai slicing ke HTML, kita perlu pahami dulu pola layout yang ada di desain. Tampilan halaman pada design figma. Ini penting supaya struktur yang kita buat nanti tidak asal tumpuk dan gampang diatur. Kalau dilihat dari desain Figma-nya, layout halaman pilih kursi ini punya pola seperti ini: Ada dua sisi utama: sisi kiri dan sisi kanan pesawat.Masing-masing sisi punya dua kolom kursi.Di tengah-tengah ada spasi kosong yang berfungsi sebagai jalan antar kursi. Kalau dihitung, satu baris akan terdiri dari empat kursi, tapi tidak sejajar penuh karena ada ruang kosong di tengah. Artinya, kalau kita langsung pakai grid biasa (seperti grid-cols-4), jarak antar kursi akan terlalu rapat dan jalan di tengah tidak akan terlihat. Juga, kalau kita pakai grid-cols-5 maka setiap kolom akan punya lebar yang sama dan akan terlihat kurang proporsional jika dibandingkan dengan desain figma. Kita perlu bikin trik tambahan supaya ada "spacer" di antara dua sisi kursi ini. Menyusun Struktur HTML Dasar Setelah memahami pola layout dari desain, sekarang kita mulai susun struktur HTML dasarnya. Untuk setup awal, kita sudah siapkan file index.html sederhana dengan Tailwind CSS dan font Poppins dari Google Fonts. Berikut struktur dasarnya: <!doctype html> <html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script> <!-- font Poppins --> <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800;900&display=swap" rel="stylesheet" /> </head> <body class="font-['Poppins'] bg-[#dae1e9]"> <div id="Mobile-Layout-Container" class="w-full max-w-[640px] min-w-0 overflow-x-hidden mx-auto min-h-screen relative bg-[#FAFAFA]"> <!-- Content --> </div> </body> </html> Penjelasan singkat: Tailwind CSS kita load menggunakan CDN supaya lebih simple.Font Poppins langsung dipasang di <head>, dan dipakai lewat Tailwind font-['Poppins'].Background warna abu-abu muda (bg-[#dae1e9]) untuk area luar.Container utama (#Mobile-Layout-Container) dibuat responsif hanya di lebar tertentu, supaya desain tetap terpusat dan konsisten.Konten halaman nantinya akan kita taruh di dalam <div id="Mobile-Layout-Container">...</div> ini. Untuk saat ini, struktur ini cukup dan siap dipakai buat membangun layout kursi pesawat. Membuat Bagian Judul dan Keterangan Status Kursi Sebelum membangun layout kursi, kita tambahkan dulu elemen header di bagian atas. Header ini berfungsi untuk menampilkan judul halaman dan informasi status kursi yang tersedia. Berikut struktur HTML yang akan kita gunakan: <h1 class="font-semibold text-2xl text-[#1F1449] pt-[30px] mx-6">Select Your <br> Favorite Seat</h1> <div class="flex items-center gap-[10px] mt-[30px] mx-6"> <div class="flex items-center gap-[6px]"> <div class="flex shrink-0 size-4 rounded-[6px] border border-[#5C40CC] bg-[#E0D9FF]"></div> <span class="text-sm">Available</span> </div> <div class="flex items-center gap-[6px]"> <div class="flex shrink-0 size-4 rounded-[6px] border border-[#5C40CC] bg-[#5C40CC]"></div> <span class="text-sm">Selected</span> </div> <div class="flex items-center gap-[6px]"> <div class="flex shrink-0 size-4 rounded-[6px] bg-[#EBECF1]"></div> <span class="text-sm">Unavailable</span> </div> </div> Penjelasan singkat: Judul halaman ditampilkan menggunakan elemen <h1>.Keterangan status kursi menggunakan kombinasi flex untuk membuat item sejajar horizontal.Setiap status memiliki:Kotak kecil berwarna (untuk indikator visual)Label teks di sebelahnya Semua styling sudah menggunakan kelas bawaan Tailwind, jadi bisa langsung digunakan tanpa tambahan kustomisasi lagi. Jika semua sudah benar, maka tampilan kita akan terlihat seperti ini Tampilan hasil code HTML header. Membuat Seat Map (Tahap 1): Struktur Dasar dan Baris Pertama Setelah bagian header beres, sekarang kita mulai bangun seat map. Karena strukturnya unik (dua sisi dengan jalan di tengah), kita akan susun perlahan — dimulai dari container utama, label baris, dan satu baris kursi. 1. Container Seat Map Pertama, kita butuh sebuah container untuk membungkus seluruh bagian seat map ini. Kita akan pakai elemen <form> karena nanti seat ini bisa dikaitkan ke proses submit (meskipun sekarang belum ada backend-nya). <form action="" class="mt-[30px]"> <div class="flex flex-col mx-6 gap-[30px] w-auto h-fit rounded-[18px] bg-white py-[30px] px-[22px]"> <div class="flex flex-col gap-4"> <!-- Seat content di sini --> </div> <div class="flex flex-col gap-4"> <!-- Keterangan pilihan di sini --> </div> </div> <!-- Button submit --> </form> 2. Label Kolom Kursi (A, B, C, D) Di dalam form, kita mulai dengan baris label yang menunjukkan kolom kursi: A, B (sisi kiri), dan C, D (sisi kanan). Di tengah-tengah kita beri elemen kosong sebagai spacer, seolah-olah itu adalah lorong pesawat. <div id="Seat-Column" class="row flex flex-row justify-evenly"> <div class="grid grid-cols-2 gap-4"> <div class="flex items-center justify-center h-6 w-12 shrink-0"> <span class="text-[#9698A9]">A</span> </div> <div class="flex items-center justify-center h-6 w-12 shrink-0"> <span class="text-[#9698A9]">B</span> </div> </div> <div class="spacer w-12 flex shrink-0 text-[#9698A9] flex items-center justify-center"></div> <div class="grid grid-cols-2 gap-4"> <div class="flex items-center justify-center h-6 w-12 shrink-0"> <span class="text-[#9698A9]">C</span> </div> <div class="flex items-center justify-center h-6 w-12 shrink-0"> <span class="text-[#9698A9]">D</span> </div> </div> </div> Tampilan keterangan kolom kursi. 3. Satu Baris Kursi (Baris 1) Setelah label kolom, kita buat satu baris kursi. Strukturnya sama seperti sebelumnya — dua grid kiri dan kanan dengan spacer di tengah. <div class="row flex flex-row justify-evenly"> <div class="grid grid-cols-2 gap-4"> <!-- Kursi A1 dan B1 --> <label class="group relative flex items-center justify-center size-12 shrink-0 rounded-[15px] overflow-hidden bg-[#E0D9FF] border-2 border-[#5C40CC] has-[:checked]:border-0 has-[:checked]:bg-[#5C40CC] has-[:disabled]:border-0 has-[:disabled]:bg-[#EBECF1] transition-all duration-300"> <input type="checkbox" name="seat" class="absolute inset-0 opacity-0"> <span class="font-semibold text-sm text-white opacity-0 group-has-[:checked]:opacity-100 transition-all duration-300">YOU</span> </label> <label class="group relative flex items-center justify-center size-12 shrink-0 rounded-[15px] overflow-hidden bg-[#E0D9FF] border-2 border-[#5C40CC] has-[:checked]:border-0 has-[:checked]:bg-[#5C40CC] has-[:disabled]:border-0 has-[:disabled]:bg-[#EBECF1] transition-all duration-300"> <input type="checkbox" name="seat" class="absolute inset-0 opacity-0"> <span class="font-semibold text-sm text-white opacity-0 group-has-[:checked]:opacity-100 transition-all duration-300">YOU</span> </label> </div> <div class="spacer w-12 flex shrink-0 text-[#9698A9] flex items-center justify-center"> 1 </div> <div class="grid grid-cols-2 gap-4"> <!-- Kursi C1 dan D1 --> <label class="group relative flex items-center justify-center size-12 shrink-0 rounded-[15px] overflow-hidden bg-[#E0D9FF] border-2 border-[#5C40CC] has-[:checked]:border-0 has-[:checked]:bg-[#5C40CC] has-[:disabled]:border-0 has-[:disabled]:bg-[#EBECF1] transition-all duration-300"> <input type="checkbox" disabled name="seat" class="absolute inset-0 opacity-0"> <span class="font-semibold text-sm text-white opacity-0 group-has-[:checked]:opacity-100 transition-all duration-300">YOU</span> </label> <label class="group relative flex items-center justify-center size-12 shrink-0 rounded-[15px] overflow-hidden bg-[#E0D9FF] border-2 border-[#5C40CC] has-[:checked]:border-0 has-[:checked]:bg-[#5C40CC] has-[:disabled]:border-0 has-[:disabled]:bg-[#EBECF1] transition-all duration-300"> <input type="checkbox" name="seat" class="absolute inset-0 opacity-0"> <span class="font-semibold text-sm text-white opacity-0 group-has-[:checked]:opacity-100 transition-all duration-300">YOU</span> </label> </div> </div> 4. Kenapa Pakai <label> + input type="checkbox"? Setiap kursi dibuat dengan struktur <label> yang membungkus <input type="checkbox">. Kenapa? Karena: Dengan <label>, kita bisa klik elemen visual (kursi) dan otomatis aktifkan checkbox-nya.Checkbox ini kita sembunyikan (opacity-0), dan hanya dipakai untuk nyimpan status “selected” secara visual.Style akan berubah sesuai status :checked atau :disabled. 5. Styling Dinamis: has-[:checked] dan group-has-[] Tailwind punya fitur CSS parent selector yang powerful. Di sini kita pakai dua hal: ✅ has-[:checked] Digunakan langsung di elemen label.Artinya: kalau input di dalamnya checked, ubah style si label.Contoh: has-[:checked]:bg-[#5C40CC] ✅ group + group-has-[:checked] Kita pakai ini untuk ubah style anak elemen (span teks “YOU”) kalau input di dalam label checked.group ada di label, group-has-[] ada di dalamnya.Contoh: <span class="group-has-[:checked]:opacity-100">YOU</span> 6. Kursi Unavailable Kita juga tambahkan atribut disabled ke input untuk kursi yang tidak tersedia. Tailwind akan baca has-[:disabled] dan ubah warnanya jadi abu-abu (seperti di desain). 7. Menambah bagian keterangan pilihan Seat map sudah selesai kita buat, sekarang kita tambah bagian keterangan. bagian ini akan menunjukan nomor kursi yang dipilih dan juga total harga yang ahrus dibayar. <div class="flex items-center justify-between"> <p class="font-light text-sm text-[#9698A9]">Your seat</p> <p class="text-[#1F1449]">A1, D2</p> </div> <div class="flex items-center justify-between"> <p class="font-light text-sm text-[#9698A9]">Total</p> <p class="font-semibold text-[#5C40CC]">$50,250</p> </div> Preview Layout Tampilan komponen pilih kursi yang sudah jadi. Menambahkan Tombol Submit di Bawah Layar Setelah semua elemen kursi selesai ditampilkan, sekarang kita tambahkan tombol untuk mengonfirmasi pilihan kursi. Tapi bukan sembarang tombol — kita ingin tombol ini selalu terlihat di bagian bawah layar, tanpa harus scroll-scroll ke bawah lagi. Untuk itu, kita gunakan position: fixed dan menempatkan tombol dengan: <div class="relative w-full mt-[30px] h-[101px] px-6"> <div class="fixed bottom-[46px] max-w-[640px] w-full transform -translate-x-1/2 left-1/2 px-6"> <button type="submit" class="w-full rounded-full text-center h-[55px] bg-[#5C40CC] text-white align-middle font-medium text-lg">Select Payment</button> </div> </div> Cara ini bikin tombol selalu nempel di bagian bawah layar, pas di tengah, dan tetap berada di dalam lebar maksimal layout (640px). Tombolnya dibungkus dengan <div> yang punya relative layout agar tetap konsisten kalau suatu saat kamu mau tambahkan elemen lain di bawahnya. Dan jangan lupa: walau posisinya fixed, tombol ini masih di dalam tag <form> supaya tetap bisa submit data nantinya. Tampilan jika semua elemen sudah selesai di-slicing Membuat Kursi Secara Dinamis dengan JavaScript Setelah kita lihat struktur HTML awal untuk baris kursi, mungkin sudah mulai terasa satu hal: kalau kita harus tulis manual satu per satu, bakal makan waktu dan nyusahin banget. Makanya, di bagian ini kita akan mulai pakai JavaScript untuk bikin seat map-nya secara dinamis. Tapi supaya seat-nya bisa dirender lewat JS, kita perlu sediakan dulu tempat penampungnya di HTML. Kita hapus dulu elemen <div class="row ..."> yang sebelumnya kita hardcode, dan ganti dengan elemen kosong seperti ini: <div id="Seat-Wrapper" class="flex flex-col gap-4"></div> Elemen ini akan kita jadikan target untuk inject baris-baris kursi nantinya. Jadi alur kerjanya, JavaScript akan melakukan looping berdasarkan data kursi, lalu menyusun elemen HTML kursinya, dan akhirnya menampilkannya ke dalam #Seat-Wrapper. Dengan pendekatan ini, kita bisa kontrol seat map lebih fleksibel — entah itu buat nambah jumlah kursi, menandai yang unavailable, atau nunjukin kursi yang dipilih. Sekarang kita masuk ke tahap bikin looping untuk render kursi secara dinamis pakai JavaScript. Tujuannya jelas: biar kita tidak nulis <label> seat satu-satu secara manual — repot dan rawan typo. Dengan data sederhana berupa array nested, kita bisa buat struktur kursi otomatis, lengkap dengan spacer di tengah. Berikut paragraf penjelasan + contoh kodenya yang bisa kamu pakai: Supaya lebih fleksibel dan tidak perlu nulis elemen satu per satu, sekarang kita akan membuat seat map-nya dengan JavaScript. Caranya: kita buat dulu struktur data yang mewakili posisi kursi, lalu render ke DOM pakai loop. Sebagai contoh, kita bisa bikin array seperti ini: const seatRows = [ ['A1', 'B1', 'C1', 'D1'], ['A2', 'B2', 'C2', 'D2'], ['A3', 'B3', 'C3', 'D3'], // Tambah terus sesuai jumlah baris ]; Lalu kita looping setiap baris dan bagi jadi dua sisi (kiri dan kanan), dengan spacer di tengah: const seatContainer = document.querySelector('#Seat-Wrapper'); seatRows.forEach(row => { const rowDiv = document.createElement('div'); rowDiv.className = 'row flex flex-row justify-evenly'; const leftSide = document.createElement('div'); leftSide.className = 'grid grid-cols-2 gap-4'; row.slice(0, 2).forEach(seat => { leftSide.appendChild(createSeatElement(seat)); }); const spacer = document.createElement('div'); spacer.className = 'spacer w-12 flex shrink-0 text-[#9698A9] flex items-center justify-center'; spacer.textContent = row[0].replace(/\D/g, ''); // ambil angka baris dari seat (misal '1' dari 'A1') const rightSide = document.createElement('div'); rightSide.className = 'grid grid-cols-2 gap-4'; row.slice(2).forEach(seat => { rightSide.appendChild(createSeatElement(seat)); }); rowDiv.appendChild(leftSide); rowDiv.appendChild(spacer); rowDiv.appendChild(rightSide); seatContainer.appendChild(rowDiv); }); Fungsi createSeatElement ini bertugas bikin satu elemen <label> kursi sesuai style yang kita mau: function createSeatElement(label, disabled = false) { const wrapper = document.createElement('label'); wrapper.className = 'group relative flex items-center justify-center size-12 shrink-0 rounded-[15px] overflow-hidden bg-[#E0D9FF] border-2 border-[#5C40CC] has-[:checked]:border-0 has-[:checked]:bg-[#5C40CC] has-[:disabled]:border-0 has-[:disabled]:bg-[#EBECF1] transition-all duration-300'; const input = document.createElement('input'); input.type = 'checkbox'; input.name = 'seat'; input.className = 'absolute inset-0 opacity-0'; if (disabled) input.disabled = true; const span = document.createElement('span'); span.className = 'font-semibold text-sm text-white opacity-0 group-has-[:checked]:opacity-100 transition-all duration-300'; span.textContent = 'YOU'; wrapper.appendChild(input); wrapper.appendChild(span); return wrapper; } Dengan cara ini, kamu bisa dengan mudah nambah atau ubah barisan kursi cukup dari array-nya aja. Bahkan bisa diambil dari API nanti kalau memang perlu. Simpan kode JavaScript ini dalam file .js terpisah atau masukkan langsung di dalam tag <script> pada template HTML kita. Jika javascript sudah benar, maka tampilannya akan seperti ini. Tampilan hasil looping untuk membuat seat map. Dengan kode untuk looping kursi yang sudah selesai, kita hampir sampai pada bagian akhir proses slicing layout kursi pesawat sesuai desain Figma—dari struktur HTML, styling menggunakan Tailwind CSS, hingga interaksi dinamis menggunakan JavaScript. Untuk saat ini, kita memang hanya fokus pada bagian frontend statis, tanpa menyentuh responsif atau backend logic. Namun, dengan struktur ini, kita sudah punya dasar visual yang solid yang dapat dikembangkan lebih lanjut sesuai kebutuhan. Penutup dan Saran Proses slicing desain Figma ke dalam HTML menggunakan Tailwind CSS dan menambahkan interaksi dengan JavaScript ini memberikan kita banyak pelajaran penting. Mulai dari cara menyusun struktur HTML yang rapi, penggunaan Tailwind untuk styling secara efisien, hingga implementasi logika dinamis untuk memilih kursi—semua saling berinteraksi untuk membentuk tampilan yang lebih fungsional. Dengan pendekatan ini, kita telah membangun dasar yang kokoh untuk antarmuka pemilihan kursi yang siap dikembangkan lebih lanjut, baik untuk tambahan fitur interaktif maupun pengembangan backend di tahap berikutnya. Belajar membuat elemen dinamis ini memang menantang, dan mungkin ada saat-saat di mana kamu merasa stuck atau kesulitan. Tapi, jangan khawatir—setiap tantangan adalah kesempatan untuk mengasah kemampuan. Jika kamu merasa butuh bantuan lebih lanjut atau ingin memperdalam materi, jangan ragu untuk mencari mentor yang berpengalaman di BuildWithAngga. Program mentoring mereka menawarkan berbagai keuntungan: ✅ Akses Materi Seumur Hidup – Belajar kapan pun, tanpa batas waktu. ✅ Sertifikat Resmi – Validasi skill yang kamu kuasai. ✅ Portfolio Nyata – Kerjakan project dengan standar industri. ✅ Akses Komunitas dan Mentor – Diskusi langsung dengan praktisi yang sudah berpengalaman. Jangan takut untuk melangkah lebih jauh. Bangun fondasi yang kuat sekarang, dan siapkan dirimu menghadapi tantangan yang lebih besar di dunia web development. 🚀