Tasarım Bileşenleri (UI Library)
Proje genelinde kullanılan standart UI bileşenlerinin (Button, Input, Select, Checkbox, Radio, Card, Tabs, Alert, ConfirmModal) etkileşimli oyun alanı ve canlı form demosu.
1. Renk Skalası & Tasarım Sistemi (Colors & Design Tokens)
Nar WhatsApp Webhook kurumsal renk skalası, semantik durum kodları, SCSS değişkenleri ve Tailwind CSS entegrasyonu (SSOT: src/styles/_tokens.scss).
🍇 Nar Marka Paleti (Brand Scale: Rose & Crimson)
$nar-brand • --nar-brand-* • bg-brand-*⚡ Meta Cloud API & Tech Paleti (Tech Scale: Indigo)
$nar-tech • --nar-tech-* • bg-tech-*🛡️ Semantik Durum & Güvenlik Paleti (System Status & Safety)
Kuyruk işlendi, WABA mesajı teslim edildi, veritabanı sağlıklı.
Debounce tamponunda bekliyor, yüksek hız sınırı yaklaşımı.
Harcama sigortası devrede (Circuit Breaker Tripped), kara liste engeli.
Adli tutanak mühür bilgisi, WebSocket heartbeat ve sistem telemetrisi.
🌑 Yüzey & Zemin Hiyerarşisi (Surface & Background Hierarchy)
bg-surface-bodybg-surface-cardbg-surface-elevatedbg-white • #f8fafc@use '@/styles/tokens' as *;
.my-custom-box {
background: $surface-card;
color: $nar-brand;
border: 1px solid $surface-border;
}<div className="bg-brand-600 text-white rounded-xl p-4 shadow-md" /> <div className="bg-surface-card border border-surface-border" />
5. Çerçeve & Yuvarlatma Standartları (Border & Radius Hierarchy)
className="rounded-sm"className="rounded-md"className="rounded-lg"className="rounded-xl"className="rounded-full"2. Tipografi Standartları (<Typography /> & H1-H6, P)
Uygulama genelinde tutarlı font büyüklükleri, ağırlıkları (font-weight) ve satır yükseklikleri (line-height) sağlayan tipografi hiyerarşisi
H1 - Sayfa Ana Başlığı (Page Title)
H2 - Bölüm Başlığı (Section Header)
H3 - Kart & Modül Başlığı (Card Title)
H4 - Öğesi / Bileşen Başlığı (Item Title)
H5 - Alt Etiket Başlığı (Sub-label Header)
H6 - Mikro Etiket & Üst Başlık (Caption / Micro Label)
P - Paragraf Metni (Paragraph): Nar WhatsApp webhook modülünde mesajlar ve denetim logları için kullanılan standart okuma ve açıklama metni formatıdır.
Description - İkincil Kart / Form Alt Açıklama Metni (Card & Field Description)
Code - Kod Parametresi / Degisken (Code Snippet)Blockquote - Alıntı Metni / Vurgu Kutusu
import { Typography, H1, H2, H3, H4, H5, H6, Text } from '@/components/ui/Typography';
// Yöntem 1: Standart HTML Etiketleri (Küresel CSS ile Otomatik Stilli)
<h1>Sayfa Başlığı</h1>
<h2>Bölüm Başlığı</h2>
<p>Açıklama paragrafı</p>
// Yöntem 2: React Component (Bileşen) Şeklinde Kullanım
<H1>Sayfa Başlığı</H1>
<Typography variant="lead">Giriş Paragrafı</Typography>
<Typography variant="muted">İkincil açıklama</Typography>3. Butonlar (Button Variants & Sizes)
Tüm buton ihtiyaçları tekil <Button /> bileşeninde birleştirilmiştir (26px ikon aksiyonları, ghost hover ve renk varyantları dahil)
Dolu (Solid / Soft) Renk Skalası
Çerçeveli (Outline) Renk Skalası
Hayalet (Ghost) Renk Skalası
Boyutlar (Sizes) & Varyant Karşılaştırması (26px Standardı)
İkon Butonları (Ghost Hover Variants — 26px x 26px)
Devre Dışı (Disabled) Buton Örnekleri
4. Kart Bileşeni (<Card />) & Modüler Renk Mimarisi
Tüm kapsayıcılar, paneller ve modüller için esnek müstakil <Card /> bileşeni
İnteraktif Canlı Kart Oyun Alanı & Anlık Önizleme
Girdileri değiştirin, kart anında güncellensinKart Parametreleri:
Canlı Kart Görünümü:LIVE PREVIEW
Canlı Önizleme Kartı
Kullanıcı girdilerine göre anlık değişen kart örneği
Buradaki metin, sol taraftaki girdiler değiştikçe anında güncellenir.
<Card color="info" interactive>
<CardHeader>
<CardTitle>Canlı Önizleme Kartı</CardTitle>
<CardDescription>Kullanıcı girdilerine göre anlık değişen kart örneği</CardDescription>
</CardHeader>
<CardContent>
Buradaki metin, sol taraftaki girdiler değiştikçe anında güncellenir.
</CardContent>
</Card>2. Varsayılan Standart Kart (<Card variant="outline" /> — Sade Stil)
Sadece Sahibidefault
Yalnızca sen ve yöneticiniz
Etkileşimli Kartinteractive
Hover ile hafif yükselme efekti
interactive prop'u ile üzerine gelindiğinde 2px yukarı yükselir ve hover:border-slate-300 kazanır.Odaklanmış Kartfocused
Mavi odaklanma halkası (focus ring)
focused prop'u veya klavye odağı (focus-within) ile mavi halka kazanır.Şeffaf Zeminli Karttransparent
Saydam zemin (bg-transparent)
transparent prop'u ile zemin rengi saydamlaşır.3. Çerçeveli Renkli Kartlar (variant="outline")
WhatsApp Webhook Kartı
variant="outline" color="info"
Onaylı İşlem Kartı
variant="outline" color="success"
Kritik İlerleme Kartı
variant="outline" color="danger"
4. Dolu (Solid) Renkli Kartlar (variant="solid")
Mavi Dolu Kart XXX
variant="solid" color="info"
Dikkat Gereken Kart
variant="solid" color="warning"
Tehlike Kartı
variant="solid" color="danger"
5. Yapısal Bileşenler (CardHeader, CardContent, CardFooter)
Bölüm Hedefi Oluştur
Yıllık Q3 Stratejik Dönemi
Bu kart yapısında başlık, içerik gövdesi ve aksiyon butonlarının bulunduğu alt bilgi (footer) alanı ayrıştırılmıştır.
6. Devre Dışı Kart (disabled={true})
Devre Dışı Kart
disabled=
Devre Dışı Mavi Kart
variant="outline" color="info" disabled
Input & Select (Girdi & Seçim Kutu Bileşenleri)
Button bileşeni ile %100 eşleşen yükseklik breakpoint'leri (xs: 26px, sm: 28px, default: 32px, lg: 36px, xl: 40px)
Yazılan Değer: (Boş)
Seçili Değer: STRATEGIC
Arama kutulu, departman gruplamalı ve klavye destekli arama yapabilen gelişmiş açılır liste bileşeni.
Seçili ID: u-1
Checkbox & Radio (Akıllı Seçim Bileşenleri)
Dual-Mode: Hem yalın (standart) hem de kart modunda çalışabilir
Standart Checkbox (<Checkbox />)
Standart Radio (<Radio />)
BİLDİRİM & KANAL KART SEÇİCİ (<Checkbox title="..." description="..." /> Çoklu Seçim)
// Akıllı Kart Modlu <Checkbox /> Kullanımı
<Checkbox
checked={sendInApp}
onCheckedChange={setSendInApp}
title="Sistem Bildirimi"
description="Bildirim merkezi & onay banner'ına düşer"
/>GÖRÜNÜRLÜK KART SEÇİCİ (<Radio title="..." description="..." /> Tekli Seçim)
// Akıllı Kart Modlu <Radio /> Kullanımı
<Radio
name="visibility"
value="company"
checked={visibility === 'company'}
onChange={(e) => setVisibility(e.target.value)}
title="Kurum Geneli"
description="Tüm çalışanlar görebilir"
/>6. Rozetler & Durum Etiketleri (<Badge /> & <Pills />)
Uygulama genelinde kullanılan standart Badge varyantları ve sistem durum rozeti bileşenleri
1. Standart Çerçeveli Rozetler (<Badge variant="..." />)
2. Dolgun / Solid Rozetler (<Badge solid /> & <Badge solid pill />)
3. Sistem Durum Etiketleri (System Status Pills)
import { Badge } from '@/components/ui/Badge';
import { StatusPill, ObjectiveTypePill, HealthPill } from '@/components/ui/StatusPills';
// Standart Rozetler
<Badge variant="primary">Blue Badge</Badge>
// Sayaç & Kapsül (Pill) Rozeti (pill prop ile)
<Badge variant="primary" pill>1 Talep</Badge>
// System Domain Pills
<StatusPill status="ACTIVE" />
<ObjectiveTypePill type="STRATEGIC" />
<HealthPill health="ON_TRACK" />7. Örnek Form & Canlı Önizleme (Full Form Demo)
Tüm bileşenlerin (Button, Input, Select, Checkbox, Radio) bir arada kullanıldığı canlı form örneği
8. Sekmeler (Tabs)
Pills (Hap/Segmented), Underline (Çizgili) ve Button (Buton) stil seçenekleriyle dinamik içerik değişimi
1. Kapsül Modu (variant="pills" — Varsayılan Segmented)
Tüm Mesaj Paneli
Webhook üzerinden akan tüm gelen ve giden WhatsApp mesajları burada listelenir.
2. Çizgili Alt Çizge Modu (variant="underline")
3. Buton Grubu Modu (variant="button")
4. Modern Navigasyon Modu (variant="nav" veya variant="primary-pills")
Schedule & Takvim Paneli
Primary mavi aktif durum, kurumsal standart rounded-sm köşe radiusu ve sağ badge desteği.
import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/Tabs';
import { Badge } from '@/components/ui/Badge';
{/* Standart Kapsül Modu */}
<Tabs defaultValue="all" variant="pills">
<TabsList>
<TabsTrigger value="all">Tüm Mesajlar</TabsTrigger>
<TabsTrigger value="individual">Bireysel</TabsTrigger>
</TabsList>
</Tabs>
{/* Modern Navigasyon & Badge Desteği */}
<Tabs defaultValue="schedule" variant="nav">
<TabsList>
<TabsTrigger value="overview">Overview</TabsTrigger>
<TabsTrigger value="tasks" badge={3}>Tasks</TabsTrigger>
<TabsTrigger value="schedule" badge={<Badge size="xs" variant="warning">Canlı</Badge>}>Schedule</TabsTrigger>
<TabsTrigger value="objectives" icon={<Target size={14} />} badge={5}>Hedeflerim</TabsTrigger>
</TabsList>
</Tabs>9. Satıriçi Bildirim Panoları (<Alert />)
Uygulama genelinde standartlaştırılmış inline (satıriçi) durum, bilgilendirme ve kritik uyarı panoları
Bilgilendirme Panosu
İşlem Başarılı
Dikkat: Kapasite Sınırı
Kritik İhlal
import { Alert } from '@/components/ui/Alert';
// Bilgi Panosu (Blue)
<Alert
variant="primary"
title="Bilgilendirme Panosu"
description="KR ağırlığı opsiyoneldir. Boş bırakırsanız ağırlıksız eşit dağılım kabul edilir."
/>
// Kritik İhlal Uyarısı (Rose)
<Alert
variant="danger"
title="Kritik İhlal"
description="Ağırlıklar toplamı %100'ü geçemez."
/>11. Modallar & İletişim Pencereleri (<Modal /> & <ConfirmModal />)
Formlar, ayarlar, zengin içerikler için standart genel Modal bileşeni ve kritik işlem onayları için ConfirmModal
1. Standart Genel Modal (<Modal />)
Portal tabanlı, Esc ve arka plan tıklama dinlemeli, responsive boyutlandırma (sm, md, lg, xl, 2xl, 5xl, full).
import { Modal } from '@/components/ui/Modal';
import { Button } from '@/components/ui/Button';
<Modal
isOpen={isOpen}
onClose={() => setIsOpen(false)}
title="Yeni Hedef Oluştur"
subtitle="Dönemsel stratejik veya bireysel hedef tanımı yapın"
size="xl" // 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '5xl' | 'full'
footer={
<>
<Button variant="outline" size="sm" onClick={() => setIsOpen(false)}>
İptal
</Button>
<Button variant="primary" size="sm" onClick={handleSave}>
Kaydet
</Button>
</>
}
>
<div className="space-y-4">
{/* Form Alanları */}
</div>
</Modal>2. Onay ve Uyarı Modal Kutusu (<ConfirmModal />)
Kullanıcı eylemlerini doğrulama (silme, bağlantı koparma) ve tek butonlu uyarı/hata diyalogları.
import { ConfirmModal, type ConfirmModalData } from '@/components/ui/ConfirmModal';
const [confirmModalData, setConfirmModalData] = useState<ConfirmModalData | null>(null);
// 1. Tek Butonlu İhlal/Uyarı Diyaloğu (Single Button Alert)
setConfirmModalData({
title: 'Ağırlık Sınırı Aşıldı',
message: "Bir hedefe ait KR ağırlıklarının toplamı %100'ü geçemez.",
variant: 'danger',
hideCancel: true,
confirmText: 'Tamam',
});
// 2. İki Butonlu Silme/Onay Diyaloğu (Two Button Confirm)
setConfirmModalData({
title: 'Kilit Sonucu Sil',
message: 'Bu kilit sonucu silmek istediğinize emin misiniz?',
variant: 'danger',
confirmText: 'Evet, Sil',
cancelText: 'Vazgeç',
onConfirm: async () => {
await deleteKeyResult(id);
},
});
// JSX Çıktısı (Sayfa En Altında Tek Bir Kez Render Edilir)
<ConfirmModal
isOpen={Boolean(confirmModalData)}
data={confirmModalData}
/>12. Anlık Bildirim Mesajları (Sonner Toast)
Giriş ekranında, form kayıtlarında ve hızlı eylemlerde canlı bildirim sunan toast bildirim sistemi
import { toast, Toaster } from 'sonner';
// Sayfada Toaster konteynırı:
<Toaster position="top-center" richColors />
// Tetikleme Kodları:
toast.success('Giriş başarılı! Yönlendiriliyorsunuz…');
toast.error('Geçersiz kimlik bilgileri!');
toast.info('Finans Müdürü bilgileri otomatik dolduruldu');13. İkon Kütüphanesi & Standartlar (lucide-react)
Projemizde ham emoji kullanımı KESİNLİKLE YASAKTIR. Tüm ikonlar lucide-react kütüphanesinden tip-güvenli (type-safe) ve renkli SVG olarak kullanılır.
import { Target, Zap, Eye, CheckCircle, AlertTriangle, Sparkles, Plus, Trash2, Edit2, RotateCcw, Link as LinkIcon, Inbox } from 'lucide-react';<Target /><Zap className="fill-yellow-400" /><Eye /><Sparkles /><LinkIcon /><CheckCircle /><AlertTriangle /><Inbox /><Shield /><Plus /><Edit2 /><Trash2 /><RotateCcw />14. Veri Tablosu Bileşeni (DataTable)
Arama, sıralama, pagination, aksiyon butonları ve özelleştirilebilir sütun mimarisine sahip genel veri tablosu bileşeni
Örnek Personel Listesi
Sistemdeki kayıtlı birim yöneticileri ve uzmanlar
Personel Adı | Departman | Durum | KR Sayısı |
|---|---|---|---|
Ahmet Gündüz Kurum Başkanı | Kurum Başkanlığı | ACTIVE | 4 KR |
Fırat Demir BT Müdürü | Bilgi Teknolojileri | ACTIVE | 6 KR |
Mehmet Uygar Yazılım Uzmanı | Yazılım Geliştirme | ACTIVE | 3 KR |
Zeynep Kurt Süreç Uzmanı | Kalite ve Süreç | DRAFT | 2 KR |
Elif Şahin İnfra Uzmanı | Sistem ve Ağ | CLOSED | 5 KR |
15. Portal Tooltip (Body Embed)
Overflow-x-auto, overflow-hidden veya kart z-index sınırlarına takılmaksızın doğrudan document.body katmanına Portal olarak bind edilen yüksek performanslı Tooltip bileşeni.
16. Switch & Segmented Control (İkili / Çoklu Pill Toggle)
İki veya daha fazla seçenekli filtrelerde kullanılan toggle bileşenleri. Standart kutu (variant='default') ve Oval kapsül (variant='pill' - Bütçe Durumu stili) varyantları mevcuttur.
Default Boyut (32px) — variant="primary"
Oval Kapsül Varyantı — variant="pill" (Bütçe Durumu Stili)
Çoklu Seçenekli Kapsül — <SegmentedControl /> (Bütçe Kartı Tam Varyantı)
Small Boyut (26px) — Input & Button xs ile uyumlu
Input & Switch Yan Yana (26px hizalama)
17. Form Elemanları Boyut Standartları (Design System SSOT)
Tüm Button, Input, Select, Switch ve SegmentedControl bileşenlerinin bağlı olduğu merkezi UI_SIZE_CONFIGS (src/config/uiSizes.ts) boyut haritası ve canlı hizalama örnekleri.
18. Dropdown Menü (Açılır Menü)
Global kullanıma uygun, bildirimler veya kullanıcı ayarları için kullanılabilen portal tabanlı dropdown bileşeni.
Bu bileşen, içindeki children kısmını absolute pozisyonlanmış bir kutu olarak Portal (document.body) içerisinde render eder. Sağ veya sol hizalama destekler. Esc ile veya dışarı tıklanınca kapanır.
19. Sihirbaz & Stepper (Wizard)
Çok adımlı formlar, görüşme süreçleri ve iş akışları için standart, duyarlı ve adımlar arası ayırıcı (divider) çizgili stepper bileşeni.
Canlı İnteraktif Önizleme
Aktif Adım: Adım 1
1. Adım içeriği: Gündem maddeleri listesi ve soru seçimi.
Kullanım Örneği
import { Wizard, WizardStep, WizardDivider } from '@/components/ui/Wizard';
const [currentStep, setCurrentStep] = useState(1);
<Wizard value={currentStep} onValueChange={setCurrentStep}>
<WizardStep
step={1}
title="Gündem"
description="Bugün ne konuşacağız?"
/>
<WizardDivider />
<WizardStep
step={2}
title="Aksiyonlar"
description="Ne Kararlaştıracağız?"
disabled={!isStep1Completed}
disabledTitle="Önce 1. adımı tamamlayın"
/>
<WizardDivider />
<WizardStep
step={3}
title="Notlar"
description="Görüşme Tutanak Özeti"
disabled={!isStep1Completed}
/>
</Wizard>