ARIA Web: Panduan Lengkap Aksesibilitas Digital

Di era digital ini, aksesibilitas bukanlah sekadar fitur tambahan, melainkan sebuah kebutuhan fundamental. Setiap individu memiliki hak untuk mengakses informasi dan fungsionalitas di web, terlepas dari kemampuan fisik atau kognitif mereka. Namun, seringkali, antarmuka pengguna yang kaya dan dinamis, yang dibangun dengan JavaScript dan CSS modern, dapat menghadirkan tantangan besar bagi teknologi bantu seperti pembaca layar (screen reader).

Di sinilah peran ARIA (Accessible Rich Internet Applications) menjadi krusial. ARIA adalah seperangkat atribut dan peran yang dapat ditambahkan ke elemen HTML untuk memberikan informasi semantik tambahan kepada teknologi bantu. Ini memungkinkan pengembang untuk membuat komponen UI yang kompleks dan interaktif menjadi lebih mudah diakses, mengisi celah yang tidak dapat ditangani oleh HTML saja. Artikel ini akan membawa Anda dalam perjalanan mendalam untuk memahami ARIA, mulai dari konsep dasar hingga praktik terbaik, memastikan bahwa aplikasi web Anda dapat dinikmati oleh semua orang.

Ilustrasi yang menggambarkan konsep aksesibilitas web dengan ARIA, menunjukkan ikon orang dan gelombang suara dalam konteks jendela browser.

Apa itu ARIA? Mengapa Penting?

ARIA, kependekan dari Accessible Rich Internet Applications, adalah spesifikasi teknis yang diterbitkan oleh World Wide Web Consortium (W3C). Tujuannya adalah untuk meningkatkan aksesibilitas konten web dinamis dan komponen antarmuka pengguna yang dikembangkan dengan AJAX, JavaScript, dan teknologi terkait. ARIA memberikan cara untuk menambahkan informasi semantik yang hilang dari HTML asli atau untuk mengkompensasi interaksi yang kompleks yang tidak dapat diungkapkan secara memadai oleh HTML biasa.

Sebelum ARIA, banyak komponen web interaktif, seperti tab, modal dialog, tree view, atau slider kustom, tidak dapat diakses sepenuhnya oleh pengguna teknologi bantu. Pembaca layar mungkin tidak dapat mengidentifikasi elemen-elemen ini sebagai apa adanya, mengkomunikasikan statusnya, atau menjelaskan cara berinteraksi dengannya. Hasilnya adalah pengalaman pengguna yang buruk dan tidak setara bagi individu dengan disabilitas.

Tiga Pilar Utama ARIA

ARIA bekerja dengan memperkenalkan tiga jenis atribut utama:

  1. Peran (Roles): Mendefinisikan jenis elemen UI. Misalnya, mengubah div menjadi sebuah button atau tablist secara semantik bagi teknologi bantu.
  2. Properti (Properties): Memberikan karakteristik atau deskripsi statis pada elemen, seperti label teks, deskripsi, atau hubungan dengan elemen lain. Misalnya, aria-label, aria-describedby, aria-controls.
  3. Status (States): Mendefinisikan kondisi dinamis dari suatu elemen yang dapat berubah, biasanya melalui interaksi pengguna. Misalnya, aria-checked untuk kotak centang, aria-expanded untuk elemen yang dapat diperluas/ciutkan.

ARIA bukan pengganti HTML semantik. Aturan pertama ARIA adalah: Jika elemen HTML asli sudah memiliki semantik dan perilaku yang Anda butuhkan, gunakanlah elemen HTML asli tersebut. Jangan gunakan ARIA.

Mendalami Konsep Dasar ARIA

1. Peran (Roles)

Peran ARIA adalah atribut yang memberi tahu teknologi bantu tentang tujuan atau fungsi sebuah elemen. Ini sangat berguna ketika Anda membuat komponen kustom yang tidak memiliki padanan HTML semantik yang tepat. Peran ARIA dibagi menjadi beberapa kategori:

Peran Landmark

Peran landmark membantu teknologi bantu dalam memahami struktur utama halaman web dan memungkinkan pengguna untuk menavigasi bagian-bagian penting dengan cepat. Ini sangat penting untuk navigasi yang efisien.

<header role="banner">...</header>
<main role="main">
    <h1>Judul Artikel</h1>
    <p>Konten utama halaman.</p>
</main>
<nav role="navigation">...</nav>
<aside role="complementary">...</aside>
<footer role="contentinfo">...</footer>

Meskipun ada peran landmark ARIA, banyak elemen HTML5 seperti <header>, <main>, <nav>, <aside>, dan <footer> secara implisit sudah memiliki semantik landmark. Penggunaan atribut role pada elemen-elemen ini seringkali tidak diperlukan (dan terkadang redundan) jika penggunaannya sudah benar. Namun, ada kasus di mana penggunaan peran landmark ARIA dapat memperjelas semantik, terutama pada versi HTML yang lebih lama atau ketika elemen generik seperti <div> digunakan untuk strukturisasi.

Peran Widget

Peran widget menjelaskan elemen UI interaktif yang biasanya dibuat dengan JavaScript, seperti tombol kustom, menu, slider, atau tab. Ini memberi tahu teknologi bantu bahwa elemen tersebut dapat dioperasikan dan bagaimana cara berinteraksi dengannya.

<span role="button" tabindex="0">Kirim Formulir</span>

<div role="tablist">
    <button role="tab" id="tab1" aria-controls="panel1" aria-selected="true">Tab 1</button>
    <button role="tab" id="tab2" aria-controls="panel2" aria-selected="false">Tab 2</button>
</div>
<div role="tabpanel" id="panel1" aria-labelledby="tab1">Konten Tab 1</div>
<div role="tabpanel" id="panel2" aria-labelledby="tab2" hidden>Konten Tab 2</div>

Peran Struktur Dokumen

Peran ini mendefinisikan struktur konten yang tidak interaktif, mirip dengan peran landmark tetapi untuk unit konten yang lebih kecil. Ini membantu dalam memahami organisasi dan jenis konten dalam sebuah halaman.

<div role="article">
    <h3>Judul Postingan</h3>
    <p>Isi postingan blog...</p>
</div>

<div role="list">
    <div role="listitem">Item pertama</div>
    <div role="listitem">Item kedua</div>
</div>

2. Properti (Properties) ARIA

Properti ARIA memberikan informasi tambahan tentang elemen yang bersifat statis atau tidak berubah dengan interaksi pengguna (atau setidaknya tidak sering berubah). Ini membantu dalam menjelaskan makna, tujuan, atau hubungan elemen.

aria-label

Memberikan label yang dapat diakses untuk sebuah elemen ketika teks yang terlihat tidak tersedia atau tidak cukup deskriptif. Ini sangat berguna untuk ikon tombol atau elemen dengan teks yang tidak jelas secara kontekstual.

<button aria-label="Tutup">X</button>
<input type="text" aria-label="Cari Produk" placeholder="Cari...">

Penting untuk dicatat bahwa aria-label akan menimpa label teks yang terlihat jika ada. Gunakan dengan hati-hati.

aria-labelledby

Mengidentifikasi elemen (atau beberapa elemen) yang berfungsi sebagai label untuk objek yang dilabeli. Ini sering digunakan ketika label sudah ada di tempat lain di halaman.

<h2 id="modalTitle">Judul Modal</h2>
<div role="dialog" aria-labelledby="modalTitle">
    <p>Isi modal dialog.</p>
</div>

aria-labelledby lebih kuat daripada aria-label karena memungkinkan Anda merujuk ke konten yang sudah ada di DOM.

aria-describedby

Mengidentifikasi elemen (atau beberapa elemen) yang berfungsi sebagai deskripsi untuk objek yang dijelaskan. Ini memberikan informasi tambahan yang mungkin tidak cocok sebagai label utama.

<label for="password">Kata Sandi:</label>
<input type="password" id="password" aria-describedby="passwordHelp">
<small id="passwordHelp">Kata sandi harus minimal 8 karakter.</small>

aria-describedby tidak menimpa label, melainkan menambahkan informasi deskriptif setelah label dibacakan oleh pembaca layar.

aria-hidden

Menunjukkan apakah elemen atau turunannya terlihat atau tidak terlihat oleh teknologi bantu. Nilai true menyembunyikan elemen dari Accessibility Tree, sementara false membuatnya terlihat. Ini sering digunakan untuk menyembunyikan konten dekoratif atau duplikat.

<div aria-hidden="true">
    <img src="dekorasi.png" alt="">
</div>
<div id="modal" role="dialog" aria-hidden="true">...</div>
<!-- Ketika modal dibuka, aria-hidden akan menjadi "false" -->

Hati-hati: aria-hidden="true" tidak menyembunyikan elemen secara visual. Anda tetap perlu menggunakan CSS (misalnya display: none; atau visibility: hidden;) untuk menyembunyikan elemen secara visual.

aria-controls

Mengidentifikasi elemen yang dikendalikan oleh elemen saat ini. Ini membantu teknologi bantu untuk memahami hubungan fungsional antara elemen-elemen yang berbeda.

<button aria-controls="sectionDetail">Tampilkan Detail</button>
<div id="sectionDetail" hidden>
    <p>Ini adalah detail yang ditampilkan/disembunyikan.</p>
</div>

aria-live

Menunjukkan bahwa bagian dari konten UI diperbarui secara dinamis dan harus dibaca oleh teknologi bantu. Ini sangat penting untuk notifikasi, pesan kesalahan, atau pembaruan real-time.

<div aria-live="polite" id="statusMessage"></div>
<!-- JavaScript akan memperbarui innerText dari #statusMessage -->

Properti terkait lainnya adalah aria-atomic (apakah seluruh elemen harus dibacakan atau hanya bagian yang berubah) dan aria-relevant (perubahan apa yang relevan).

aria-expanded

Menunjukkan apakah elemen yang dikendalikan oleh elemen saat ini (misalnya, menu drop-down, accordion panel) sedang dalam keadaan diperluas atau diciutkan.

<button aria-expanded="false" aria-controls="menuId">Menu</button>
<ul id="menuId" hidden>...</ul>

aria-haspopup

Menunjukkan bahwa elemen memiliki popup, seperti menu, submenu, dialog, atau grid. Nilai dapat berupa true (jika popup umum), menu, listbox, tree, grid, atau dialog.

<button aria-haspopup="true" aria-controls="dropdownMenu">Opsi</button>
<div id="dropdownMenu" role="menu" hidden>...</div>

3. Status (States) ARIA

Status ARIA mendefinisikan kondisi dinamis dari suatu elemen yang dapat berubah sebagai respons terhadap interaksi pengguna atau perubahan data. Pengembang bertanggung jawab untuk memperbarui status ini menggunakan JavaScript.

aria-checked

Menunjukkan status 'dicentang' dari elemen seperti kotak centang, item menu yang dapat dicentang, atau tombol radio.

<span role="checkbox" aria-checked="false" tabindex="0">
    Setuju dengan syarat & ketentuan
</span>

aria-selected

Menunjukkan bahwa elemen saat ini dipilih dari sekelompok elemen yang dapat dipilih.

<li role="option" aria-selected="true">Item 1</li>
<li role="option" aria-selected="false">Item 2</li>

aria-disabled

Menunjukkan bahwa elemen tidak dapat diedit atau dioperasikan. Mirip dengan atribut HTML disabled.

<button aria-disabled="true">Kirim</button>

Ketika aria-disabled="true", elemen harus tetap dapat di-fokus-kan agar pembaca layar dapat menginformasikan statusnya.

aria-required

Menunjukkan bahwa input pengguna diperlukan pada elemen sebelum formulir dapat dikirim.

<input type="text" aria-required="true">

Ini melengkapi atribut required HTML5, tetapi dapat digunakan pada elemen kustom yang tidak memiliki properti required asli.

aria-invalid

Menunjukkan bahwa nilai yang dimasukkan ke dalam elemen tidak valid atau tidak sesuai dengan format yang diharapkan.

<input type="email" aria-invalid="true" aria-describedby="emailError">
<p id="emailError">Format email tidak valid.</p>

Pola Desain ARIA (ARIA Design Patterns)

Memahami peran, properti, dan status ARIA sangat penting, tetapi menggunakannya secara efektif seringkali melibatkan penerapan pola desain tertentu. W3C menyediakan ARIA Authoring Practices Guide (APG) yang sangat direkomendasikan, yang mendokumentasikan pola desain umum dan cara mengimplementasikannya dengan ARIA dan keyboard.

1. Komponen Tab (Tab Component)

Salah satu pola paling umum adalah komponen tab, yang memungkinkan pengguna beralih antara beberapa panel konten. Ini memerlukan kombinasi peran dan status ARIA:

<div role="tablist" aria-label="Pengaturan Akun">
    <button role="tab" id="generalTab" aria-controls="generalPanel" aria-selected="true" tabindex="0">Umum</button>
    <button role="tab" id="securityTab" aria-controls="securityPanel" aria-selected="false" tabindex="-1">Keamanan</button>
    <button role="tab" id="privacyTab" aria-controls="privacyPanel" aria-selected="false" tabindex="-1">Privasi</button>
</div>
<div id="generalPanel" role="tabpanel" aria-labelledby="generalTab" tabindex="0">
    <h3>Pengaturan Umum</h3>
    <p>Di sini Anda dapat mengelola informasi dasar akun Anda.</p>
</div>
<div id="securityPanel" role="tabpanel" aria-labelledby="securityTab" hidden tabindex="0">
    <h3>Pengaturan Keamanan</h3>
    <p>Ubah kata sandi dan pengaturan keamanan lainnya.</p>
</div>
<div id="privacyPanel" role="tabpanel" aria-labelledby="privacyTab" hidden tabindex="0">
    <h3>Pengaturan Privasi</h3>
    <p>Kelola preferensi privasi Anda.</p>
</div>

Navigasi keyboard sangat penting. Saat pengguna menekan tombol panah kiri/kanan, fokus harus berpindah ke tab berikutnya/sebelumnya, aria-selected harus diperbarui, dan panel terkait harus ditampilkan/disembunyikan. Atribut tabindex="-1" pada tab yang tidak aktif memastikan bahwa hanya tab yang aktif yang dapat di-fokus-kan oleh tab key, sementara tab lain dapat dijangkau melalui tombol panah.

2. Modal Dialog

Modal dialog adalah elemen UI yang mengharuskan interaksi pengguna sebelum dapat kembali ke konten utama. Ini adalah salah satu pola yang paling menantang untuk diimplementasikan secara aksesibel.

<!-- Tombol pemicu modal -->
<button id="openModalBtn">Buka Modal</button>

<!-- Modal Dialog -->
<div id="myModal" role="dialog" aria-modal="true" aria-labelledby="modalTitle" style="display: none;">
    <h2 id="modalTitle">Konfirmasi Tindakan</h2>
    <p>Anda yakin ingin melanjutkan?</p>
    <button id="confirmBtn">Ya, Lanjutkan</button>
    <button id="cancelBtn">Batal</button>
</div>

<!-- JavaScript untuk menangani pembukaan/penutupan, fokus, dan aria-hidden -->

Manajemen fokus dan fokus trap adalah bagian tersulit dalam implementasi modal yang aksesibel. Ada banyak pustaka JavaScript yang sudah mengimplementasikan ini dengan benar, jadi seringkali lebih baik menggunakan solusi yang sudah teruji daripada membangun dari awal.

3. Accordion

Accordion adalah daftar item yang dapat diperluas atau diciutkan untuk menampilkan/menyembunyikan konten terkait.

<div class="accordion-item">
    <h3>
        <button aria-expanded="false" aria-controls="section1" id="accordion1Header">
            Bagian Pertama
        </button>
    </h3>
    <div id="section1" role="region" aria-labelledby="accordion1Header" hidden>
        <p>Konten untuk bagian pertama accordion.</p>
    </div>
</div>

Keyboard navigation untuk accordion biasanya melibatkan tombol panah atas/bawah untuk berpindah antar tombol accordion, dan Enter/Space untuk memperluas/menciutkan.

4. Live Regions (Pembaruan Dinamis)

Ketika bagian dari halaman web diperbarui secara dinamis tanpa memuat ulang halaman (misalnya, hasil pencarian yang difilter, pesan kesalahan formulir, notifikasi), pembaca layar mungkin tidak secara otomatis memberi tahu pengguna tentang perubahan tersebut. ARIA live regions memungkinkan Anda untuk mengkomunikasikan pembaruan ini.

<div id="notifications" aria-live="polite" aria-atomic="true">
    <!-- Pesan notifikasi akan muncul di sini via JavaScript -->
</div>

<form>
    <label for="username">Nama Pengguna</label>
    <input type="text" id="username" aria-describedby="username-error">
    <div id="username-error" aria-live="assertive" style="color: red;">
        <!-- Pesan error akan diinject di sini -->
    </div>
</form>

Penting untuk menempatkan aria-live pada elemen yang *tidak* berubah sendiri, tetapi berisi elemen-elemen yang akan berubah. Misalnya, elemen kontainer untuk notifikasi. Ketika JavaScript memperbarui konten di dalam kontainer tersebut, pembaca layar akan diberi tahu.

Implementasi ARIA: Praktik Terbaik dan Kesalahan Umum

1. Aturan Pertama ARIA

Seperti yang disebutkan sebelumnya, aturan pertama ARIA adalah: Jika elemen HTML asli sudah memiliki semantik dan perilaku yang Anda butuhkan, gunakanlah elemen HTML asli tersebut. Jangan gunakan ARIA.

Misalnya, jika Anda membutuhkan tombol, gunakan <button>, bukan <div role="button">. Elemen <button> secara otomatis dapat difokuskan, dapat diklik dengan Enter/Space, dan teknologi bantu akan mengidentifikasinya sebagai tombol tanpa ARIA tambahan.

<!-- BURUK: Membangun tombol dari div -->
<div role="button" tabindex="0" onclick="doSomething()" onkeypress="handleKey(event)">Klik Saya</div>

<!-- BAIK: Menggunakan elemen button asli -->
<button onclick="doSomething()">Klik Saya</button>

Mengabaikan aturan ini dapat menyebabkan beban kerja yang tidak perlu, potensi bug aksesibilitas, dan bahkan dapat merusak aksesibilitas jika implementasi ARIA Anda tidak sempurna.

2. Jangan Mengubah Semantik HTML Asli

Jangan pernah mengubah semantik elemen HTML yang sudah ada kecuali jika ada alasan yang sangat kuat dan Anda tahu persis apa yang Anda lakukan.

<!-- BURUK: Mengubah link menjadi button -->
<a href="#" role="button">Link yang terlihat seperti tombol</a>

<!-- BAIK: Menggunakan button untuk aksi, link untuk navigasi -->
<a href="/halaman-baru">Menuju Halaman Baru</a>
<button>Melakukan Aksi</button>

Ketika Anda menggunakan role="button" pada elemen <a>, Anda membingungkan teknologi bantu. Link diharapkan untuk menavigasi, sementara tombol diharapkan untuk melakukan suatu aksi. Mencampuradukkan peran ini merusak model mental pengguna teknologi bantu.

3. Pastikan Semua Konten Interaktif Dapat Diakses dengan Keyboard

Pengguna teknologi bantu dan pengguna keyboard saja mengandalkan navigasi keyboard. Semua elemen interaktif (tombol, link, input, kontrol kustom) harus dapat dijangkau dan dioperasikan sepenuhnya menggunakan keyboard.

4. Kelola Fokus dengan Hati-hati

Manajemen fokus adalah bagian integral dari pengalaman aksesibel. Pastikan:

5. Tes dengan Teknologi Bantu

Tidak ada pengganti untuk pengujian dengan pengguna teknologi bantu yang sebenarnya, atau setidaknya menggunakan pembaca layar. Beberapa pembaca layar populer antara lain:

Pengujian manual adalah kunci. Otomasi dapat menangkap banyak hal, tetapi nuansa interaksi pengguna hanya dapat diverifikasi secara manual. Selain itu, gunakan browser extension aksesibilitas seperti Axe DevTools, Lighthouse, atau WebHint.

6. ARIA Tidak Mempengaruhi Tampilan Visual

Penting untuk diingat bahwa ARIA hanya mempengaruhi Accessibility Tree, yang kemudian dibaca oleh teknologi bantu. ARIA sama sekali tidak mempengaruhi tampilan visual halaman. Anda masih memerlukan CSS untuk styling dan JavaScript untuk fungsionalitas.

7. Jaga Agar Atribut ARIA Tetap Dinamis

Jika status elemen berubah, Anda harus memperbarui atribut ARIA terkait dengan JavaScript. Misalnya, saat accordion diperluas, ubah aria-expanded="false" menjadi aria-expanded="true".

// Contoh JavaScript untuk toggle aria-expanded
const button = document.getElementById('accordionButton');
const panel = document.getElementById('accordionPanel');

button.addEventListener('click', () => {
    const isExpanded = button.getAttribute('aria-expanded') === 'true';
    button.setAttribute('aria-expanded', String(!isExpanded));
    panel.hidden = isExpanded; // Atau style.display = 'block' / 'none'
});

Hubungan ARIA dengan HTML Semantik dan Aksesibilitas Web

ARIA bukanlah solusi sihir yang akan membuat setiap situs web dapat diakses. Sebaliknya, ARIA adalah pelengkap dari HTML yang semantik. Pondasi aksesibilitas web yang kuat selalu dimulai dengan menggunakan HTML yang tepat untuk tujuan yang tepat. Ketika HTML saja tidak cukup untuk menyampaikan semantik yang kompleks atau interaksi dinamis, barulah ARIA masuk.

The Accessibility Tree

Ketika browser memparsing HTML, ia membangun dua pohon: Document Object Model (DOM) dan Accessibility Tree. DOM adalah representasi logis dari struktur halaman, sedangkan Accessibility Tree adalah representasi yang lebih disederhanakan yang digunakan oleh teknologi bantu. Accessibility Tree berisi informasi tentang peran (misalnya, tombol, link), nama (label teks, alt teks, aria-label), status (dicentang, diperluas), dan properti (diperlukan, tidak valid) dari elemen-elemen di halaman.

HTML semantik secara otomatis mengisi Accessibility Tree. Misalnya, elemen <button> akan memiliki peran "button" dan nama yang sama dengan teks di dalamnya. ARIA memungkinkan pengembang untuk memodifikasi atau menambah informasi di Accessibility Tree untuk elemen yang bukan HTML asli atau memiliki semantik yang lebih kompleks.

WAI-ARIA sebagai Standar

WAI-ARIA (Web Accessibility Initiative - Accessible Rich Internet Applications) adalah spesifikasi resmi W3C. Ini berarti bahwa atribut ARIA dikenal dan didukung oleh sebagian besar browser modern dan teknologi bantu. Namun, tingkat dukungan dapat bervariasi, jadi pengujian tetap penting.

Membuat Konten Lebih Inklusif

Dengan menerapkan ARIA dengan benar, kita dapat menciptakan pengalaman web yang lebih inklusif untuk beragam pengguna:

Masa Depan ARIA dan Web Aksesibel

Ekosistem web terus berkembang, dan begitu pula standar aksesibilitas. Ada dorongan berkelanjutan untuk memperkaya HTML itu sendiri sehingga lebih banyak pola antarmuka pengguna dapat ditangani secara native tanpa memerlukan ARIA. Contohnya adalah elemen <details> dan <summary> yang menyediakan perilaku accordion dasar secara native.

Meskipun demikian, ARIA akan tetap menjadi alat yang sangat berharga untuk waktu yang lama, terutama untuk komponen UI kustom yang sangat kompleks dan belum memiliki padanan HTML standar. Pengembang diharapkan untuk selalu mengikuti perkembangan standar HTML dan ARIA, serta praktik terbaik yang terus diperbarui oleh W3C.

Fokus harus selalu pada: "Bisakah saya mencapai ini dengan HTML saja?" Jika jawabannya adalah ya, lakukan itu. Jika tidak, maka ARIA adalah alat yang tepat untuk digunakan, asalkan digunakan dengan pemahaman dan pengujian yang cermat.

Kesimpulan

ARIA adalah jembatan penting menuju web yang lebih aksesibel, memungkinkan pengembang untuk mengisi kesenjangan semantik dan interaksi dalam aplikasi web yang kaya. Dengan memahami peran, properti, dan status ARIA, serta mengikuti praktik terbaik, kita dapat membangun pengalaman digital yang inklusif, yang dapat dinikmati oleh semua orang, terlepas dari kemampuan mereka.

Ingatlah untuk selalu memprioritaskan HTML semantik terlebih dahulu, menggunakan ARIA sebagai alat pelengkap ketika diperlukan. Lakukan pengujian menyeluruh dengan teknologi bantu dan berempati dengan pengguna Anda. Dengan demikian, kita bersama-sama dapat menciptakan web yang lebih terbuka dan merata untuk semua.

Aksesibilitas bukan hanya tentang kepatuhan terhadap standar, tetapi juga tentang etika dan menciptakan lingkungan digital yang adil. Mari kita terus berupaya membangun web yang benar-benar untuk semua.