AI-Generated UI: Dari Komponen Otomatis ke Design System yang Terkendali

Gelombang AI-Generated UI memudahkan tim menghasilkan antarmuka dari prompt, namun tanpa tata kelola desain yang kuat hasilnya mudah tidak konsisten. Artikel ini menunjukkan cara mengubah keluaran AI menjadi design system yang terkendali melalui design tokens, komponen token-aware, guardrail (lint a11y, token linter), dan pipeline “prompt-to-production”. Disertai kode siap salin: tokens.json, tailwind.config.js, CSS global, serta contoh komponen React/HTML.

Pengantar

Kemampuan AI-Generated UI mempercepat fase eksplorasi antarmuka: dari prompt → first draft layout/komponen dalam hitungan menit. Namun nilai terbaik tidak datang dari kecepatan semata, melainkan dari konsistensi visual, aksesibilitas, dan kemudahan pemeliharaan. Tanpa kontrol, AI cenderung menghasilkan variasi gaya yang sulit dikelola.
Solusinya adalah design system yang menjadi rambu: design tokens sebagai kontrak visual, komponen token-aware sebagai blok bangunan, serta guardrail (lint a11y, token linter, visual regression) pada pipeline CI/CD. Dengan begitu, UI yang dihasilkan AI tetap tunduk pada standar merek dan kualitas produksi.


Mengapa Design Tokens & Guardrail Penting

  • Interoperabilitas: token (warna, tipografi, radius, spacing) dapat dipertukarkan lintas alat—desain → kode.

  • Konsistensi: komponen membaca nilai dari token, bukan hard-coded; perubahan tema cukup menyasar token.

  • Skalabilitas: lint a11y & token linter mencegah “token liar” dan memastikan rasio kontras, fokus, serta ukuran target sentuh sesuai standar.


Arsitektur Sederhana “Prompt-to-Production”

  1. Generator (Figma AI/v0) menghasilkan draft layout & komponen.

  2. Normalisasi ke Token (format DTCG-like JSON).

  3. Binding ke Kode (Tailwind/Antd/shadcn.ui).

  4. Guardrail (lint a11y, token linter, visual regression).

  5. Telemetry (metrik UX seperti INP/CLS, serta design debt dari token liar).


Kode yang Sudah Ditata (Siap Salin)

A) Skema Design Tokens (DTCG-like JSON)

Simpan: tokens.json

				
					<figure class="code">
  <figcaption>tokens.json</figcaption>
  <pre><code class="language-json">{
  "color": {
    "brand": { "value": "#0ea5e9" },
    "text":  { "value": "#0f172a" },
    "muted": { "value": "#64748b" },
    "success": { "value": "#10b981" },
    "danger":  { "value": "#ef4444" }
  },
  "radius": {
    "sm": { "value": "8px" },
    "md": { "value": "12px" }
  },
  "space": {
    "xs": { "value": "0.5rem" },
    "md": { "value": "1rem" },
    "lg": { "value": "1.5rem" }
  },
  "font": {
    "body": { "value": "Inter, system-ui, sans-serif" },
    "mono": { "value": "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" }
  }
}</code></pre>
</figure>

				
			

B) Binding ke Tailwind (Konfigurasi Ringkas & Rapi)

Simpan: tailwind.config.js

				
					<figure class="code">
  <figcaption>tailwind.config.js</figcaption>
  <pre><code class="language-js">export default {
  darkMode: "class",
  content: [
    "./src/**/*.{js,jsx,ts,tsx,mdx}",
    "./public/index.html",
    "./**/*.php",
    "./wp-content/themes/**/*.{php,js}",
    "./wp-content/plugins/**/*.{php,js}",
    "./**/*.html"
  ],
  theme: {
    extend: {
      colors: {
        brand:   "#0ea5e9",
        text:    "#0f172a",
        muted:   "#64748b",
        success: "#10b981",
        danger:  "#ef4444"
      },
      borderRadius: { sm: "8px", md: "12px" },
      spacing:      { xs: "0.5rem", md: "1rem", lg: "1.5rem" },
      fontFamily: {
        body: ["Inter","system-ui","sans-serif"],
        mono: ["ui-monospace","SFMono-Regular","Menlo","Consolas","monospace"]
      }
    }
  },
  safelist: [
    "bg-brand","text-brand","ring-brand","hover:opacity-90",
    "focus-visible:outline-none","focus-visible:ring-2","focus-visible:ring-brand",
    "px-lg","py-xs","rounded-md"
  ],
  plugins: []
};</code></pre>
</figure>

				
			

C) Berkas CSS Input Tailwind (Opsional)

Simpan: src/styles/tailwind.css

				
					<pre><code class="language-css">/* src/styles/tailwind.css */ @tailwind base; @tailwind components; @tailwind utilities; /* Tipografi global (opsional) */ :root { --font-body: "Inter", "Source Sans 3", system-ui, -apple-system, "Segoe UI", Roboto, Arial, "Noto Sans", sans-serif; --font-code: ui-monospace, "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } body { font-family: var(--font-body); line-height: 1.75; } pre, code, kbd, samp { font-family: var(--font-code); font-size: .95em; } </code></pre>
				
			

D) Komponen React (shadcn/ui + token) — Versi Mudah Dibaca

Simpan: src/components/PrimaryCTA.tsx

				
					<pre><code class="language-tsx">import { Button } from "@/components/ui/button"; export function PrimaryCTA() { return ( &lt;Button className=" bg-brand text-white hover:opacity-90 rounded-md px-lg py-xs focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand " type="button" &gt; Mulai Sekarang &lt;/Button&gt; ); } </code></pre>
				
			

Praktik UI/UX & Aksesibilitas (Wajib)

  • Hierarki jelas (H1/H2/H3), paragraf singkat, bullet/numbered list untuk memudahkan skimming.

  • Kontras warna teruji (WCAG), indikator fokus jelas, dan label yang informatif.

  • Konsistensi: dilarang hard-coded nilai; semua nilai visual melalui token.

  • Feedback: loading/skeleton, empty state, dan pesan kesalahan yang ramah pengguna.

  • CTA terfokus: hindari terlalu banyak tombol primer dalam satu layar.


Guardrail Teknis (Ringkas)

  • Lint token: deteksi nilai di luar kamus token (mis. warna/spacing liar).

  • Lint a11y: cek kontras, fokus, ARIA.

  • Visual regression: bandingkan snapshot UI di setiap commit.

  • Safelist Tailwind: untuk kelas yang dihasilkan dari CMS/AI agar tidak ter-purge.


Catatan Implementasi di WordPress–Elementor

  1. Penempelan kode: gunakan blok Code (Gutenberg) atau HTML widget (Elementor).

  2. Keterbacaan <pre><code>: tambahkan CSS berikut di Appearance → Customize → Additional CSS atau Elementor → Site Settings → Custom CSS:

    <pre><code class=”language-css”>pre, code &#123;

font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, “Liberation Mono”, “Courier New”, monospace !important;
}
pre {
background: #0b1220; color: #e2e8f0;
padding: 16px 20px; border-radius: 12px;
line-height: 1.6; overflow: auto;
white-space: pre; tab-size: 2;
}
pre code { background: transparent; color: inherit; font-size: 0.95em; }</code></pre>
3. SVG fallback: jika unggahan ditolak, pakai inline SVG atau konversi ke PNG.


Checklist Implementasi

  • Tetapkan design tokens (brand/semantik/alias) sebagai source of truth.

  • Bind token ke Tailwind/komponen (Antd/shadcn.ui).

  • Siapkan prompt template (nama token + daftar komponen resmi) untuk generator AI.

  • Aktifkan lint a11y, token linter, dan visual regression di pipeline.

  • Awasi metrik UX (INP/CLS) & design debt (token liar).

  • Pastikan safelist Tailwind mencakup kelas dinamis dari CMS.


Kesimpulan

AI-Generated UI menjadi efektif ketika ditundukkan oleh design system. Design tokens menyediakan kontrak visual; komponen token-aware memastikan konsistensi; dan guardrail menjaga kualitas aksesibilitas serta kerapian kode. Dengan arsitektur “prompt-to-production” seperti di atas, tim memperoleh kecepatan eksplorasi dari AI sekaligus konsistensi merek, maintainability, dan kualitas produksi yang dapat diaudit.

Share the Post:

Related Posts