Mendeskripsikan komponen UI secara manual kepada Claude Code untuk setiap fitur baru seperti menulis CSS tanpa kelas, berulang, tidak konsisten, dan tidak mungkin diskalakan di seluruh tim. Claude Code Skills untuk membangun UI mengubah sistem desain Anda menjadi alat yang dapat dieksekusi yang menghasilkan komponen, tata letak, dan gaya dengan parameter yang dapat diprediksi dan tanpa boilerplate.
Apa itu Claude Code Skills untuk Membangun UI?
Claude Code Skills mengemas logika pembuatan UI menjadi alat yang dapat digunakan kembali dan diberi versi yang dapat ditemukan dan dipanggil oleh Claude Code melalui Model Context Protocol (MCP). Alih-alih membuat prompt yang bertele-tele seperti “Buat komponen kartu responsif dengan Tailwind, gambar rata kiri, teks rata kanan, dan tombol utama,” Anda mendefinisikan keterampilan building-ui sekali dan memanggilnya dengan parameter ringkas: component: "card", layout: "image-left".
Setiap keterampilan terdiri dari file SKILL.md yang mendefinisikan:
- Nama dan deskripsi alat: Apa yang dilakukan keterampilan dan kapan Claude harus menggunakannya
- Skema parameter: Input yang aman tipe dengan validasi
- Contoh: Pola penggunaan konkret untuk melatih Claude
- Implementasi: Penangan sebenarnya yang menghasilkan kode
Keterampilan building-ui dari repositori resmi menyediakan pola untuk komponen, tata letak, tema, dan formulir. Ini mengubah pembuatan UI ad-hoc menjadi proses yang sistematis dan dapat diulang.

Keunggulan Utama Dibandingkan Prompting Mentah
- Konsistensi: Struktur komponen yang sama setiap saat
- Keamanan tipe: Claude memvalidasi parameter sebelum pembuatan
- Kontrol versi: Keterampilan ada di Git, dapat dilacak dan ditinjau
- Berbagi tim: Satu keterampilan melayani seluruh organisasi rekayasa
- Kinerja: Tidak perlu menjelaskan kembali token desain atau skala jarak
Ingin platform All-in-One terintegrasi agar Tim Developer Anda bekerja bersama dengan produktivitas maksimum?
Apidog memenuhi semua permintaan Anda, dan menggantikan Postman dengan harga yang jauh lebih terjangkau!
Menyiapkan Keterampilan building-ui
Langkah 1: Instal Claude Code dan Aktifkan MCP
Jika Anda belum menginstal CLI Claude Code:
npm install -g @anthropic-ai/claude-code
claude --version # Should be >= 2.0.70
Buat direktori dan file konfigurasi MCP:
# macOS/Linux
mkdir -p ~/.config/claude-code
touch ~/.config/claude-code/config.json
# Windows
mkdir %APPDATA%\claude-code
echo {} > %APPDATA%\claude-code\config.json

Langkah 2: Kloning dan Bangun Keterampilan building-ui
git clone https://github.com/anthropics/skills.git
cd skills/skills/building-ui
npm install
npm run build
Ini mengkompilasi penangan TypeScript ke dist/index.js.
Langkah 3: Konfigurasi MCP untuk Memuat Keterampilan
Edit ~/.config/claude-code/config.json:
{
"mcpServers": {
"building-ui": {
"command": "node",
"args": ["/absolute/path/to/skills/building-ui/dist/index.js"],
"env": {
"UI_LIBRARY": "react",
"STYLE_SYSTEM": "tailwind",
"THEME_CONFIG": "~/project/design-tokens.json"
}
}
}
}
Penting:
- Gunakan jalur absolut untuk
args. Jalur relatif akan gagal ketika Claude memunculkan proses - Atur variabel lingkungan untuk mengonfigurasi keterampilan secara global:
UI_LIBRARY:react,vue,svelteSTYLE_SYSTEM:tailwind,styled-components,css-modulesTHEME_CONFIG: Jalur ke file token desain Anda
Langkah 4: Verifikasi Instalasi
claude
Setelah dimuat, jalankan:
/list-tools
Anda akan melihat:
Available tools:
- building-ui:generate-component
- building-ui:create-layout
- building-ui:apply-theme
- building-ui:generate-form
Jika alat tidak muncul, periksa log:
# macOS/Linux
tail -f ~/.cache/claude-code/logs/mcp.log
# Windows
type %APPDATA%\claude-code\logs\mcp.log
Masalah umum:
- ENOENT: Jalur yang salah ke
dist/index.js - Variabel lingkungan hilang: Keterampilan gagal memuat konfigurasi tema
- Ketidakcocokan versi: Versi Claude Code tidak mendukung fitur MCP
Pola UI Utama dengan Keterampilan
Keterampilan building-ui mengekspor empat alat utama. Masing-masing menerima parameter terstruktur dan mengembalikan kode yang dihasilkan.
1. Alat Pembuat Komponen
Nama alat: building-ui:generate-component
Kasus penggunaan: Membuat komponen UI yang dapat digunakan kembali
Parameter:
component: Nama komponen (tombol, kartu, modal, input, pilih)variants: Array varian gaya (utama, sekunder, garis luar)size: kecil | sedang | besarcustomProps: Rekaman properti tambahanchildren: Boolean (apakah komponen menerima anak-anak)
Contoh: Membuat tombol dengan varian
Use the generate-component tool to create a button component with variants primary, secondary, and outline, size medium, and support for disabled state.
Output yang dihasilkan (React + Tailwind):
// Button.tsx
import React from 'react';
import clsx from 'clsx';
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant?: 'primary' | 'secondary' | 'outline';
size?: 'small' | 'medium' | 'large';
}
export const Button: React.FC<ButtonProps> = ({
variant = 'primary',
size = 'medium',
disabled,
children,
className,
...props
}) => {
const baseClasses = 'font-semibold rounded-lg transition-colors';
const variantClasses = {
primary: 'bg-blue-600 text-white hover:bg-blue-700',
secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300',
outline: 'border-2 border-blue-600 text-blue-600 hover:bg-blue-50'
};
const sizeClasses = {
small: 'px-3 py-1.5 text-sm',
medium: 'px-4 py-2 text-base',
large: 'px-6 py-3 text-lg'
};
return (
<button
disabled={disabled}
className={clsx(
baseClasses,
variantClasses[variant],
sizeClasses[size],
disabled && 'opacity-50 cursor-not-allowed',
className
)}
{...props}
>
{children}
</button>
);
};
Keterampilan ini menyimpulkan tipe TypeScript, atribut aksesibilitas, dan kelas gaya berdasarkan variabel lingkungan Anda.
2. Alat Pembuat Tata Letak
Nama alat: building-ui:create-layout
Kasus penggunaan: Menghasilkan tata letak halaman responsif
Parameter:
type: grid | flex | stack | sidebarcolumns: Jumlah kolom (untuk grid)gap: Skala jarak (0, 1, 2, 3, 4, 5, 6, 8, 10, 12)responsive: Objek dengan konfigurasi breakpointareas: Area grid bernama (misalnya, "header header", "sidebar main")
Contoh: Tata letak dasbor dengan bilah sisi responsif
Use create-layout to generate a responsive dashboard layout with a collapsible sidebar, header, main content area, and footer. Use gap-4 and make the sidebar 256px wide on desktop, full width on mobile.
Output yang dihasilkan:
// DashboardLayout.tsx
import React, { useState } from 'react';
import clsx from 'clsx';
interface DashboardLayoutProps {
header?: React.ReactNode;
sidebar?: React.ReactNode;
main: React.ReactNode;
footer?: React.ReactNode;
}
export const DashboardLayout: React.FC<DashboardLayoutProps> = ({
header,
sidebar,
main,
footer
}) => {
const [sidebarOpen, setSidebarOpen] = useState(false);
return (
<div className="min-h-screen flex flex-col">
{/* Header */}
<header className="bg-white shadow-sm border-b border-gray-200 z-10">
<div className="px-4 sm:px-6 lg:px-8 py-4">
{header}
</div>
</header>
<div className="flex flex-1">
{/* Mobile menu button */}
<button
className="lg:hidden fixed bottom-4 right-4 bg-blue-600 text-white p-3 rounded-full shadow-lg z-20"
onClick={() => setSidebarOpen(!sidebarOpen)}
>
☰
</button>
{/* Sidebar */}
<aside className={clsx(
'bg-gray-50 border-r border-gray-200',
'fixed lg:relative inset-y-0 left-0 z-30',
'w-64 transform transition-transform lg:translate-x-0',
sidebarOpen ? 'translate-x-0' : '-translate-x-full lg:translate-x-0'
)}>
<div className="p-4">
{sidebar}
</div>
</aside>
{/* Main content */}
<main className="flex-1 p-4 sm:p-6 lg:p-8">
{main}
</main>
</div>
{/* Footer */}
{footer && (
<footer className="bg-gray-50 border-t border-gray-200 mt-auto">
<div className="px-4 sm:px-6 lg:px-8 py-4">
{footer}
</div>
</footer>
)}
</div>
);
};
Keterampilan ini secara otomatis menambahkan logika menu seluler, kelas yang sadar breakpoint, dan atribut yang mudah diakses.
3. Alat Penerapan Tema
Nama alat: building-ui:apply-theme
Kasus penggunaan: Menerapkan token desain di seluruh komponen
Parameter:
component: Nama komponen targetcolorScheme: terang | gelap | sistemspacingScale: 0-12 (skala jarak Tailwind)typography: Objek dengan ukuran font, bobot, keluargacustomTokens: Rekaman properti kustom CSS
Contoh: Terapkan tema gelap ke komponen kartu
Use apply-theme to configure a Card component for dark mode with slate color palette, spacing scale 4, and Inter font family.
Output yang dihasilkan:
// card-theme.ts
export const cardTheme = {
light: {
background: 'bg-white',
border: 'border-gray-200',
text: 'text-gray-900',
subText: 'text-gray-600'
},
dark: {
background: 'bg-slate-800',
border: 'border-slate-700',
text: 'text-slate-100',
subText: 'text-slate-400'
}
};
// Usage in Card.tsx
import { cardTheme } from './card-theme';
interface CardProps {
variant?: 'light' | 'dark';
children: React.ReactNode;
}
export const Card: React.FC<CardProps> = ({ variant = 'light', children }) => {
const theme = cardTheme[variant];
return (
<div className={clsx(
'rounded-lg p-4 border',
theme.background,
theme.border
)}>
{children}
</div>
);
};
Keterampilan ini membaca file THEME_CONFIG Anda dan menghasilkan peta token khusus tema. Jika THEME_CONFIG menunjuk ke file JSON:
{
"colors": {
"primary": "#3B82F6",
"secondary": "#6B7280"
},
"fonts": {
"sans": "Inter",
"mono": "JetBrains Mono"
}
}
Kode yang dihasilkan menggunakan nilai-nilai ini persis alih-alih default Tailwind.
4. Alat Pembuat Formulir
Nama alat: building-ui:generate-form
Kasus penggunaan: Membuat formulir tervalidasi dari skema
Parameter:
fields: Array definisi bidang (nama, tipe, label, validasi)submitAction: Nama fungsi atau endpoint APIvalidationMode: onBlur | onChange | onSubmitlayout: vertikal | horizontal | grid
Contoh: Formulir pendaftaran pengguna dengan validasi
Use generate-form to create a user registration form with fields: name (text, required), email (email, required), password (password, min length 8), and acceptTerms (checkbox). Submit to /api/register with onBlur validation.
Output yang dihasilkan:
// UserRegistrationForm.tsx
import React, { useState } from 'react';
import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod';
import { useForm, SubmitHandler } from 'react-hook-form';
const schema = z.object({
name: z.string().min(1, 'Name is required'),
email: z.string().email('Invalid email address'),
password: z.string().min(8, 'Password must be at least 8 characters'),
acceptTerms: z.boolean().refine(val => val === true, {
message: 'You must accept the terms'
})
});
type FormData = z.infer<typeof schema>;
export const UserRegistrationForm: React.FC = () => {
const [isSubmitting, setIsSubmitting] = useState(false);
const {
register,
handleSubmit,
formState: { errors },
trigger
} = useForm<FormData>({
resolver: zodResolver(schema),
mode: 'onBlur'
});
const onSubmit: SubmitHandler<FormData> = async (data) => {
setIsSubmitting(true);
try {
const response = await fetch('/api/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (!response.ok) throw new Error('Registration failed');
// Handle success
console.log('User registered:', await response.json());
} catch (error) {
console.error('Registration error:', error);
} finally {
setIsSubmitting(false);
}
};
return (
<form onSubmit={handleSubmit(onSubmit)} className="space-y-4 max-w-md">
<div>
<label htmlFor="name" className="block text-sm font-medium text-gray-700">
Name
</label>
<input
id="name"
{...register('name')}
className={clsx(
'mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500',
errors.name && 'border-red-500'
)}
/>
{errors.name && (
<p className="mt-1 text-sm text-red-600">{errors.name.message}</p>
)}
</div>
<div>
<label htmlFor="email" className="block text-sm font-medium text-gray-700">
Email
</label>
<input
id="email"
type="email"
{...register('email')}
className={clsx(
'mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500',
errors.email && 'border-red-500'
)}
/>
{errors.email && (
<p className="mt-1 text-sm text-red-600">{errors.email.message}</p>
)}
</div>
<div>
<label htmlFor="password" className="block text-sm font-medium text-gray-700">
Password
</label>
<input
id="password"
type="password"
{...register('password')}
className={clsx(
'mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500',
errors.password && 'border-red-500'
)}
/>
{errors.password && (
<p className="mt-1 text-sm text-red-600">{errors.password.message}</p>
)}
</div>
<div className="flex items-center">
<input
id="acceptTerms"
type="checkbox"
{...register('acceptTerms')}
className="h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500"
/>
<label htmlFor="acceptTerms" className="ml-2 block text-sm text-gray-900">
I accept the terms and conditions
</label>
</div>
{errors.acceptTerms && (
<p className="text-sm text-red-600">{errors.acceptTerms.message}</p>
)}
<button
type="submit"
disabled={isSubmitting}
className="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50"
>
{isSubmitting ? 'Registering...' : 'Register'}
</button>
</form>
);
};
Keterampilan ini secara otomatis menghubungkan react-hook-form, validasi zod, atribut aksesibilitas, dan status pemuatan.
Pembuatan UI Dinamis Menggunakan Teknik Tingkat Lanjut
Logika Rendering Bersyarat
Beberapa UI membutuhkan bagian bersyarat berdasarkan parameter. Keterampilan ini mendukung conditions dalam definisi bidang:
Generate a user profile form where the "company" field only appears if "accountType" is "business".
Ini menghasilkan formulir dengan rendering bersyarat:
{accountType === 'business' && (
<div>
<label htmlFor="company">Company</label>
<input id="company" {...register('company')} />
</div>
)}
Komposisi Komponen
Bangun UI yang kompleks dengan merangkai panggilan keterampilan:
First, generate a DashboardLayout component with sidebar and header. Then, generate a StatCard component for metrics. Finally, apply dark theme to both.
Claude Code mengeksekusi ini secara berurutan, meneruskan konteks antar panggilan. Komponen tata letak tersedia saat menghasilkan kartu, memastikan integrasi yang tepat.
Pengalihan Tema Saat Runtime
Konfigurasi keterampilan untuk menghasilkan kode yang peka tema:
{
"building-ui": {
"command": "node",
"args": ["dist/index.js"],
"env": {
"UI_LIBRARY": "react",
"STYLE_SYSTEM": "tailwind",
"THEME_CONFIG": "~/project/themes.json",
"SUPPORT_THEME_TOGGLE": "true"
}
}
}
Sekarang komponen yang dihasilkan menyertakan wrapper ThemeProvider:
// App.tsx
import { ThemeProvider } from './ThemeProvider';
import { DashboardLayout } from './DashboardLayout';
function App() {
return (
<ThemeProvider defaultTheme="light" enableSystem>
<DashboardLayout />
</ThemeProvider>
);
}
Mendebug dan Mengulang Keterampilan Membangun UI
Lihat Kode yang Dihasilkan di .claude-cache
Claude Code menyimpan cache output keterampilan. Periksalah:
# macOS/Linux
cat ~/.cache/claude-code/last-skill-output.tsx
# Windows
type %APPDATA%\claude-code\last-skill-output.tsx
Jika kode yang dihasilkan tidak sesuai harapan, perbaiki parameter Anda. Tambahkan lebih banyak kekhususan:
Alih-alih: "Hasilkan kartu"
Gunakan: "Hasilkan kartu dengan padding 16px, radius border 8px, dan bayangan kotak yang lembut"
Mengganti Default Keterampilan Per Proyek
Buat .claude-ui-config.json di root proyek Anda:
{
"uiLibrary": "vue",
"styleSystem": "css-modules",
"themeConfig": "./design-tokens.json"
}
Ini mengganti pengaturan MCP global hanya untuk proyek tersebut.
Versi Keterampilan
Ketika Anda memperbarui keterampilan building-ui, beri tag versi:
cd skills/building-ui
npm version patch # Atau minor/major
git tag -a v1.1.0 -m "Added support for Vue 3.5"
Perbarui konfigurasi Claude Code untuk menyematkan versi:
{
"mcpServers": {
"building-ui": {
"command": "node",
"args": ["/path/to/skills/building-ui-v1.1.0/dist/index.js"]
}
}
}
Ini mencegah perubahan yang merusak memengaruhi alur kerja produksi.
Kesimpulan
Claude Code Skills untuk membangun UI mengubah bahasa alami menjadi komponen, tata letak, tema, dan formulir siap produksi dengan presisi bedah. Dengan menginvestasikan 15 menit dalam penyiapan, Anda mendapatkan toolkit yang dapat digunakan kembali yang menegakkan konsistensi desain, menghilangkan boilerplate, dan mempercepat pengembangan fitur. Mulailah dengan empat alat inti—generate-component, create-layout, apply-theme, dan generate-form—lalu perluas untuk sistem desain spesifik Anda.
Ketika keterampilan Anda menghasilkan UI yang mengonsumsi API, validasi endpoint tersebut dengan Apidog untuk memastikan antarmuka yang dibuat AI Anda berbicara dengan backend yang andal.
