` / MCP: `vibes_skill_dispatch`, `vibes_visual_audit`, `vibes_ast_query`, `vibes_verify_gate` |
| **NFR & Anti-Slop Invariants** | LCP < 1.8s, INP < 100ms, CLS < 0.05, 1px crisp borders, 3-tier radius (6px/8px/12px), `tabular-nums`, 5-state interactive contract; 100% complete zero-placeholder output verified via `node scripts/check-anti-slop.js --strict` |
---
---
## Bahasa Indonesia
### Integrasi Orkestrasi
- **`modern-web-guidance`**: Mengevaluasi pedoman aksesibilitas platform web, spesifikasi ARIA, dan pola form aksesibel.
- **`visual-ui-auditor`**: Verifikasi vision multimodal untuk rasio kontras warna, cincin fokus terlihat, dan integritas tata letak visual.
- **`global-a11y-i18n-expert`**: Pedoman standar WCAG, pola ARIA, dan aksesibilitas internasional.
- **`e2e-testing-expert`**: Integrasi pengujian aksesibilitas otomatis ke pipeline Playwright CI.
- **`design-system-architect, senior-frontend`**: Validasi aksesibilitas komponen headless dan desain UI.
- **`anti-slop`**: Menegakkan aturan aksesibilitas tanpa kompromi (mencegah penghapusan outline fokus, div-soup tombol, dan pelanggaran kontras warna).
### Deskripsi
Panduan produksi untuk pengujian aksesibilitas web (a11y) otomatis dan manual. Memastikan kepatuhan terhadap standar WCAG 2.2 Level AA/AAA menggunakan `@axe-core/playwright`, Pa11y, Lighthouse CI, pengujian screen reader, navigasi keyboard, dan kontras warna.
### Kondisi Pemicu
- Menjalankan audit aksesibilitas otomatis di pipeline CI/CD.
- Memverifikasi kepatuhan hukum aksesibilitas (WCAG 2.2, ADA, EAA).
- Menguji alur keyboard dan pembaca layar (screen reader) pada komponen kompleks seperti modal dan dropdown.
---
### Alur Pengujian Otomatis
#### 1. Pengujian Aksesibilitas Otomatis dengan Playwright & Axe-Core
```typescript
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';
test.describe('Audit Otomatis Aksesibilitas Web', () => {
test('beranda bebas dari pelanggaran a11y kritis atau serius', async ({ page }) => {
await page.goto('/');
const hasilAudit = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa', 'wcag22aa'])
.analyze();
expect(hasilAudit.violations).toEqual([]);
});
test('dialog modal mengunci fokus keyboard dan lolos audit a11y', async ({ page }) => {
await page.goto('/dashboard');
await page.click('button#buka-modal');
const modal = page.locator('[role="dialog"]');
await expect(modal).toBeVisible();
const auditModal = await new AxeBuilder({ page })
.include('[role="dialog"]')
.analyze();
expect(auditModal.violations).toEqual([]);
// Verifikasi tombol Escape menutup modal
await page.keyboard.press('Escape');
await expect(modal).toBeHidden();
});
});
```
#### 2. Konfigurasi CI Otomatis Pa11y (`.pa11yci.json`)
```json
{
"defaults": {
"standard": "WCAG2AA",
"timeout": 15000,
"runners": ["axe", "htmlcs"]
},
"urls": [
"http://localhost:3000/",
"http://localhost:3000/masuk",
"http://localhost:3000/harga",
"http://localhost:3000/dokumentasi"
]
}
```
#### 3. Standar State Layer & Target Sentuh Material Design 3 (M3)
- **Matriks State Layer**:
- Hover: Opacity 8% (`0.08`)
- Focus: Opacity 10% (`0.10`) dengan ring kontras tinggi
- Pressed: Opacity 10% (`0.10`)
- Dragged: Opacity 16% (`0.16`)
- Disabled: Opacity kontainer dan konten 38% (`0.38`)
- **Target Sentuh Minimum 48×48dp**: Meskipun aset visual hanya berukuran 24×24px, area sentuh interaktif wajib diperluas menjadi minimal 48×48dp menggunakan padding atau pseudo-elemen `::after`.
#### 4. Gerbang Verifikasi Aksesibilitas Anti-Slop
- **Dilarang Menghapus Outline Fokus**: Standar nol toleransi untuk `outline: none` atau `focus:outline-none` tanpa pengganti ring berlatar kontras tinggi (`focus-visible:ring-2 focus-visible:ring-offset-2`).
- **Wajib Elemen Semantik**: Larangan keras membuat div/span non-semantik yang dapat diklik (``). Setiap target klik harus merupakan `