Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Principal-level UI/UX design and implementation skill for modern professional web platforms. Covers design system architecture, Tailwind token usage, component patterns, aesthetic direction, accessibility, responsive design, animation, and UX writing. Use when designing, implementing, reviewing, or auditing any interface component, page, or user flow on the platform.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 104% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 280% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 186% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 143% | 0% |
| case-06 | ✓→✓ | = Same ✓ | 372% | 0% |
Bu skill, modern kurumsal yazılım platformlarının tüm frontend tasarım ve implementasyon kararlarını yöneten tek kaynak dokümandır.
Bu bir profesyonel hizmet platformu. Hedef kullanıcı iş arayan profesyoneller. Tasarım dili:
Kod yazmadan önce şu dört soruyu yanıtla:
Kural: Net bir yön seç, o yönü hassasiyetle uygula. Yoğunluk değil, kasıt önemli.
Primitive Tokens (raw) → --color-blue-500
Semantic Tokens (amaç) → --primary, --background
Component Tokens (özgül) → button-bg, card-bordercss:root { --primary: 220 83% 36%; --primary-foreground: 210 40% 98%; --background: 0 0% 100%; --foreground: 222 84% 5%; --muted: 210 40% 96%; --muted-foreground: 215 16% 47%; --border: 214 32% 91%; --ring: 220 83% 36%; --destructive: 0 84% 60%; --warning: 38 92% 50%; --success: 142 76% 36%; } .dark { --primary: 220 70% 60%; --background: 222 84% 5%; --foreground: 210 40% 98%; --muted: 217 33% 17%; --muted-foreground: 215 20% 65%; --border: 217 33% 17%; }
typescript// ✅ Semantic token kullan <div className='bg-background text-foreground border-border'> <button className='bg-primary text-primary-foreground hover:bg-primary/90'> <span className='text-muted-foreground'> // ❌ Ham primitive kullanma <div className='bg-white text-gray-900 border-gray-200'> <button className='bg-blue-600 text-white'>
Kuralllar:
text-blue-500, bg-gray-900)tailwind.config.mjs'teki token'ların dışına çıkmaw-[347px]) — yalnızca width ve height için kabul edilirclassName override'ı — yalnızca h-* ve w-*typescript// tailwind.config.mjs'te tanımlı — kullan, değiştirme animation: { 'fade-in': 'fade-in 0.3s ease-out', 'slide-in': 'slide-in 0.3s ease-out', 'slide-up': 'slide-up 0.3s ease-out', 'scale-in': 'scale-in 0.2s ease-out', shimmer: 'shimmer 2s infinite', 'pulse-subtle': 'pulse-subtle 2s cubic-bezier(0.4, 0, 0.6, 1) infinite', } boxShadow: { primary: '0 4px 6px -1px hsl(220 83% 36% / 0.12)...', 'primary-glow': '0 0 0 3px hsl(220 83% 36% / 0.2)', editorial: '0 1px 3px rgb(0 0 0 / 0.06)', }
typescriptfontFamily: { display: ['var(--font-body)', 'sans-serif'], heading: ['var(--font-heading)', 'serif'], body: ['var(--font-body)', 'sans-serif'], }
Kesinlikle kullanma: Arial, Inter, Roboto, system-ui, Space Grotesk — layout.tsx'te inject edilen font variable'larını kullan.
Tüm variant'lı component'ler CVA ile yazılmalı:
typescriptimport { cva, type VariantProps } from 'class-variance-authority' import { cn } from '@/lib/utils' const buttonVariants = cva( 'inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', { variants: { variant: { default: 'bg-primary text-primary-foreground hover:bg-primary/90', destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90', outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80', ghost: 'hover:bg-accent hover:text-accent-foreground', link: 'text-primary underline-offset-4 hover:underline', }, size: { sm: 'h-9 rounded-md px-3', default: 'h-10 px-4 py-2', lg: 'h-11 rounded-md px-8', icon: 'h-10 w-10', }, }, defaultVariants: { variant: 'default', size: 'default' }, }, )
typescriptconst Card = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>( ({ className, ...props }, ref) => ( <div ref={ref} className={cn('rounded-lg border bg-card text-card-foreground shadow-sm', className)} {...props} /> ) ) Card.displayName = 'Card'
typescript<Dialog.Trigger asChild> <Button variant='outline'>Aç</Button> </Dialog.Trigger>
asChild — nested button/link accessibility sorunlarını önler. Her zaman kullan.
Proje: dialog, dropdown-menu, select, tabs, tooltip, popover, checkbox, switch, slider, progress, scroll-area
Dialog.Title + Dialog.Description — screen reader zorunluluğuPortal — overflow container sorunlarını önlerforceMount + AnimatePresence — Framer Motion içintypescriptimport { motion, AnimatePresence } from 'framer-motion' import * as Dialog from '@radix-ui/react-dialog' <Dialog.Portal forceMount> <AnimatePresence> {open && ( <Dialog.Content asChild> <motion.div initial={{ opacity: 0, scale: 0.95 }} animate={{ opacity: 1, scale: 1 }} exit={{ opacity: 0, scale: 0.95 }} transition={{ duration: 0.2, ease: 'easeOut' }} > {children} </motion.div> </Dialog.Content> )} </AnimatePresence> </Dialog.Portal>
Base: < 640px — Mobil
sm: ≥ 640px — Küçük tablet
md: ≥ 768px — Tablet
lg: ≥ 1024px — Laptop
xl: ≥ 1280px — Desktop
2xl: ≥ 1400px — Geniş ekrancss.card-container { container-type: inline-size; } @container (min-width: 400px) { .card { display: grid; grid-template-columns: 200px 1fr; } }
css:root { --text-base: clamp(1rem, 0.9rem + 0.5vw, 1.125rem); --text-xl: clamp(1.25rem, 1rem + 1.25vw, 1.5rem); --text-4xl: clamp(2.25rem, 1.75rem + 2.5vw, 3.5rem); }
100vh yerine 100dvh — mobil browser UIaria-label<label>aria-invalid + aria-describedbyaria-busyprefers-reduced-motion desteğitypescriptexport const focusRing = cn( 'focus-visible:outline-none focus-visible:ring-2', 'focus-visible:ring-ring focus-visible:ring-offset-2', )
typescript// ✅ Renk + ikon + metin <span className='text-destructive flex items-center gap-1' role='alert'> <AlertCircle size={16} aria-hidden='true' /> Email adresi geçersiz </span>
transform + opacity animasyonu — layout-affecting property değilprefers-reduced-motion her animasyonda korunmalıcss@media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } }
[Fiil] [Nesne]
✅ CV Oluştur / Analizi Başlat / Hesabı Sil
❌ Tamam / Gönder / Tıkla[Ne başarısız oldu]. [Neden]. [Ne yapılmalı].
✅ "CV yüklenemedi. Dosya boyutu 5MB'ı aşıyor. Daha küçük bir dosya seçin."
❌ "Hata oluştu." / "Geçersiz giriş."[Neden boş]. [Sonraki adım CTA].
✅ "Henüz kayıtlı CV yok. İlk CV'ni oluşturmak için buraya tıkla."| Element | Hedef | | ------------- | ------------ | | Buton/CTA | 2–4 kelime | | Sayfa başlığı | 3–6 kelime | | Error mesajı | 12–18 kelime | | Yönerge | ≤ 20 kelime |
text-blue-500 yerine text-primary)asChild olmadan nested button/linkoverflow: hidden parent'ta Portal kullanmamacursor-pointer tüm tıklanabilir element'lere uygulandıprefers-reduced-motion destekleniyortailwind.config.mjs'teki token'lar kullanıldıh-*/w-* için kullanıldıProje şu an Tailwind CSS 3 kullanıyor. Tailwind v4'e geçildiğinde dikkat edilecekler:
typescript// ❌ v4'te kaldırıldı <div className='flex space-x-4'> // ✅ Her iki versiyonda çalışır <div className='flex gap-4'>
space-x-* ve space-y-* şu an v3'te çalışıyor. Yeni yazılan kodda gap-* kullan — migration kolaylaşır.
css/* v4'te tailwind.config.ts otomatik yüklenmez */ @import 'tailwindcss'; @config "../tailwind.config.ts";
v4'te custom * { margin: 0 } reset'i ekleme — mx-auto, my-* utility'lerini bozar. Tailwind'in preflight'ına bırak.
Kullanılabilecek karakterli fontlar (Google Fonts):
| Kategori | Fontlar | | -------------- | -------------------------------------------- | | Editorial | Playfair Display, Crimson Pro, Newsreader | | Technical | IBM Plex Mono, IBM Plex Sans, Source Sans 3 | | Modern | Bricolage Grotesque, Syne, Plus Jakarta Sans | | Code aesthetic | JetBrains Mono, Fira Code | | Premium | Cabinet Grotesk, Clash Display, Satoshi |
Kesinlikle kullanma: Inter, Roboto, Open Sans, Lato, Arial, Space Grotesk (artık aşırı kullanılıyor)
Light mode metin: #0F172A (slate-900) veya #1E293B (slate-800)
Muted metin: #475569 (slate-600) minimum
Glass card: bg-white/80 veya üzeri — bg-white/10 karanlık modda görünmez
Border light: border-gray-200 — border-white/10 görünmezKod yazmadan önce şu dört soruyu yanıtla:
| Bağlam | Ton | Örnek | | ----------- | -------------------- | ---------------------------------------- | | CV Builder | Editorial hassasiyet | Temiz beyaz space, typographic hierarchy | | ATS Analizi | Veri yoğun | Renk kodlu skorlar, compact card grid | | AI Chat | Konuşma sıcaklığı | Bubble layout, yumuşak köşeler | | Onboarding | Güven inşası | Büyük typography, progress indicator | | Admin | Utilitarian | Dense table, compact spacing |
typescript// Kompozisyon — unexpected layout yaratmak için // Asimetri, overlap, diagonal flow, grid-breaking // ❌ Generic — tam ortada, eşit padding, standard grid <div className='grid grid-cols-3 gap-4 p-4'> // ✅ Distinctive — editorial rhythm <div className='grid grid-cols-[2fr_1fr] gap-x-12 gap-y-6 py-16 px-8'> <section className='-mt-8'> {/* Vertical rhythm bozarak depth */}
typescript// ❌ Solid renk — flat, derinliksiz <div className='bg-background'> // ✅ Layered — gradient mesh veya subtle texture <div className='relative bg-background' style={{ backgroundImage: 'radial-gradient(at 40% 20%, hsl(220 83% 36% / 0.05) 0px, transparent 50%)', }} >
typescript// ❌ Her element ayrı ayrı dağınık animate // ✅ Tek iyi koreografeli page load — staggered reveal const stagger = { container: { hidden: { opacity: 0 }, show: { opacity: 1, transition: { staggerChildren: 0.08 }, }, }, item: { hidden: { opacity: 0, y: 16 }, show: { opacity: 1, y: 0, transition: { duration: 0.4, ease: 'easeOut' } }, }, } <motion.div variants={stagger.container} initial='hidden' animate='show'> {items.map(item => ( <motion.div key={item.id} variants={stagger.item}> <Card item={item} /> </motion.div> ))} </motion.div>
Her component veya sayfa başlamadan önce şu dört soruyu yanıtla:
Temel kural: Net bir yön seç ve hassasiyetle uygula. Kasıt yoğunluktan önemlidir.
❌ Inter, Roboto, Arial, Space Grotesk (fazla kullanıldı)
❌ Beyaz arka plan üzerine mor gradient
❌ Öngörülebilir card layout ve component pattern'ları
❌ Bağlamsız, jenerik renk şemaları
❌ Her nesilde aynı font ve renk tercihlerine yakınsamak✅ Karakterli font çiftleri:
- Editorial: Playfair Display + Crimson Pro
- Teknik: IBM Plex Mono + IBM Plex Sans
- Modern: Bricolage Grotesque + Syne
- Premium: Cabinet Grotesk + Clash Display
❌ Jenerik: Inter, Roboto, Open Sans, Latotypescript// ❌ Düz renk — derinliksiz <div className='bg-background'> // ✅ Layered atmosphere <div className='relative bg-background' style={{ backgroundImage: [ 'radial-gradient(at 40% 20%, hsl(220 83% 36% / 0.06) 0px, transparent 50%)', 'radial-gradient(at 80% 80%, hsl(220 60% 20% / 0.04) 0px, transparent 50%)', ].join(', '), }} >
typescript// ❌ Simetrik, öngörülebilir grid <div className='grid grid-cols-3 gap-4 p-8'> // ✅ Editorial ritim — asimetri, depth <div className='grid grid-cols-[2fr_1fr] gap-x-16 gap-y-4 py-20 px-10'> <section className='-mt-12'> {/* Vertical offset — depth hissi */} <aside className='pt-16'> {/* Staggered alignment */}
typescript// ❌ Dağınık micro-interaction'lar her yerde // ✅ Tek iyi koreografeli sayfa yüklemesi const staggerVariants = { container: { hidden: { opacity: 0 }, show: { opacity: 1, transition: { staggerChildren: 0.07, delayChildren: 0.1 }, }, }, item: { hidden: { opacity: 0, y: 20 }, show: { opacity: 1, y: 0, transition: { duration: 0.5, ease: [0.25, 0.1, 0.25, 1] } }, }, }
| Sayfa | Ton | Renk | Font Tercihi | | ----------- | ----------------------- | ----------------- | ------------------------- | | CV Builder | Editorial hassasiyet | Krem, koyu yeşil | Serif display + sans body | | ATS Analizi | Veri yoğun, profesyonel | Mavi, gri tonları | Monospace data + sans | | AI Chat | Sıcak, konuşma hissi | Yumuşak tonlar | Yuvarlak sans | | Onboarding | Güven inşası | Primary palette | Bold display + clean body | | Admin Panel | Utilitarian, dense | Muted, accent | Compact sans |
Other measured skills in the registry, with their headline benchmark lift.