DuckUI Kit · v0.1

Tek dosya CSS + JS bileşen kiti

Vanilla. Framework yok. data-ui-* attribute API'si veya programmatic DuckUI.confirm() çağrısı. Tüm renkler, fontlar ve spacing CSS değişkenleri ile temalanabilir.

Tipografi

Display: Oswald, Body: Inter, Mono: JetBrains Mono. Heading'ler için .ui-h1....ui-h4, eyebrow için .ui-eyebrow.

Bölüm Başlığı

Şehir bir hikayedir.

Başlık seviye 2

Başlık seviye 3

Caps Letter — Etiket Tarzı

Bu bir gövde paragrafıdır. Inter, modern, geniş çaplı, web için optimize edilmiş bir font. Türkçe karakterler (ç, ş, ğ, ü, ö, ı, İ) çok temiz görünür.

// Bu mono. JetBrains Mono — kod ve sayısal veri için.

Soluk metin — yardımcı bilgiler için.

Butonlar

5 variant + outline + ghost + 3 boyut. data-icon ile FA ikonu, data-ui-ajax ile otomatik loading state.

Variants

HTML
<button class="ui-btn ui-btn-confirm" data-icon="fa-solid fa-check"> Onayla</button>
<button class="ui-btn ui-btn-error" data-icon="fa-solid fa-trash"> Error</button>

Outline

Ghost & Sizes

AjaxButton — otomatik loading state

Tıkla → 1.5sn'lik sahte istek. Buton disable + spinner + text "Kaydediliyor..." olur, finally orijinaline döner.

JS — manuel kontrol
const btn = document.getElementById('fakeAjaxBtn');
btn.addEventListener('click', () => {
    DuckUI.Button.withLoading(btn, async () => {
        await new Promise(r => setTimeout(r, 1500));
    });
});

Modals

Promise tabanlı API. DuckUI.confirm({...}).then(yes => ...) şeklinde kullan. Backdrop tıkla / Esc → false döner.

5 Variant

JS — Promise API
// confirm — true/false döner
const yes = await DuckUI.confirm({
    title: 'Silmek istediğine emin misin?',
    body: 'Bu işlem geri alınamaz.',
    okText: 'Evet, sil', cancelText: 'Vazgeç',
    variant: 'error'
});
if (yes) { /* ... */ }

// alert/info/success/error — sadece OK
await DuckUI.success({ title: 'Başarılı', body: 'Kaydedildi.' });

Custom modal — kendi içeriğin

Cards

Hover'da translate + shadow. .ui-card-hover veya <a class="ui-card"> ile etkileşimli.

Basic

Sade Kartv1.0
Basit, statik kart. Hover efekti yok.
Hover Kart
Üstüne gel — ofset + gölge ile yukarı kalkar.
Accent KartYENI
Aksent renginde border + hover gölgesi.

Alerts

Sayfa içinde inline mesaj. Toast değil — kalıcı.

Info: Bu bir bilgilendirme alert'ü.
Success: İşlem başarıyla tamamlandı.
Warning: Dikkat — bu işlem geri alınamaz.
Error: Bağlantı kurulamadı.

Masked Inputs

data-ui-mask="date | currency | km | plate-tr | custom". Custom için data-ui-pattern="^[A-Z]{3}\d{4}$" regex verebilirsin.

5 mask tipi

₺
km
Pattern: ^TR\d{0,24}$
HTML
<input class="ui-input" data-ui-mask="date" />
<input class="ui-input" data-ui-mask="currency" />
<input class="ui-input" data-ui-mask="plate-tr" />
<input class="ui-input" data-ui-mask="km" />
<input class="ui-input" data-ui-mask="custom" data-ui-pattern="^TR\d{0,24}$" />

Select (single + multi)

Native <select data-ui-select> üzerinden enhance. Search, keyboard nav (↑↓ Enter Esc), tag chips, programmatic erişim — hepsi dahil. Form submit'inde native select aynı şekilde çalışır.

Single

Multi (chip / tag rendering)

Backspace → son tag'ı silar. ↑↓ → seçenek gez. Enter → seç.
HTML
<select data-ui-select multiple data-ui-placeholder="Etiket ekle…">
    <option value="urgent">Acil</option>
    <option value="dev" selected>Geliştirme</option>
    ...
</select>

File Upload

data-ui-upload + data-ui-preview="thumbnail | iframe | row". Drag-drop alanı, çoklu dosya, X ile sil, image için thumbnail, PDF için iframe.

Image upload (thumbnail grid)

File upload (satır listesi)

PDF preview (iframe — sadece son seçilen)

PDF seçildiğinde alt kısımda 480px iframe önizlemesi görünür.

Tables (CRUD)

.ui-table + sortable header + search + pagination + inline edit + row actions. Cell tıkla → input olur, Enter/blur kaydet, Esc vazgeç.

Sortable + Search + Pagination

Ad SoyadEmailŞehirBakiyeDurum
Ali Veliali@example.comİstanbul1.250,50 ₺aktif
Ayşe Yılmazayse@example.comAnkara3.450,00 ₺aktif
Mehmet Demirmehmet@example.comİzmir0,00 ₺beklemede
Fatma Şahinfatma@example.comBursa780,25 ₺aktif
Hasan Kayahasan@example.comAntalya-420,00 ₺borçlu
Zeynep Akınzeynep@example.comAdana9.200,00 ₺aktif
Murat Polatmurat@example.comKonya150,75 ₺beklemede
Selin Çetinselin@example.comEskişehir2.100,00 ₺aktif
Emre Aydınemre@example.comTrabzon500,00 ₺aktif
Burcu Erginburcu@example.comDiyarbakır0,00 ₺pasif
Onur Yıldızonur@example.comMersin3.300,00 ₺aktif
Deniz Sezerdeniz@example.comGaziantep640,00 ₺aktif

Inline Edit (cell tıkla → düzenle, Enter kaydet)

data-ui-save="/api/url" ile sunucuya POST eder. Bu demo URL'siz — sadece görsel commit + flash.

ÜrünStokBirim FiyatAçıklama
Vidalı Cıvata M824512,50 ₺Galvanizli, paket: 100 adet
Somun M84103,20 ₺Standart altı köşe
Pul M88200,80 ₺Düz pul, çelik

Row Actions (edit / delete)

IDAdTarihDurumEylem
#1001Sipariş #A0012026-04-22hazırlanıyor
#1002Sipariş #A0022026-04-23tamamlandı
#1003Sipariş #A0032026-04-24beklemede
JS — silme butonuna confirm modal bağlama
document.querySelectorAll('[data-row-action="delete"]').forEach(btn => {
    btn.addEventListener('click', async () => {
        const yes = await DuckUI.confirm({
            title: 'Silmek istediğine emin misin?',
            variant: 'error', okText: 'Sil', okVariant: 'error'
        });
        if (yes) btn.closest('tr').remove();
    });
});

Toggle Buttons

Switch (boolean), button group (single/multi state). ui:toggle ve ui:switch custom event'leriyle dinleyebilirsin.

Switch (boolean)

Button group — single state (radyo gibi)

Aktif: grid

Button group — multi state (checkbox gibi)

Seçili izinler: read, write

Pill variant

Tooltip

Herhangi bir element'e data-ui-title="..." ekle — hover'da popup görünür. Mobile'da tap. Position auto-flip (ekranda yer yoksa otomatik diğer tarafa).

Hover / focus'ta göster

UYARI
HTML
<button data-ui-title="Bu kayıt arşive taşınır.">Arşivle</button>
<button data-ui-title="Yardım metni." data-ui-title-pos="bottom">Bilgi</button>

Rich content (HTML body)

data-ui-title-html ile HTML içerik gösterebilirsin — başlık, kod, link.

Date Picker

data-ui-date ile takvim popup. TR formatı (gg.aa.yyyy), ay/yıl navigation, "Bugün" + "Temizle" kısayolları, min/max destekli.

3 örnek

HTML + Event
<input data-ui-date placeholder="gg.aa.yyyy" />
<input data-ui-date data-ui-min="2026-01-01" data-ui-max="2026-12-31" />

input.addEventListener('ui:date-change', e => {
    console.log(e.detail.date, e.detail.iso);
});

Draggable Panel

.ui-panel + data-ui-panel="id" = sürüklenebilir, daraltılabilir, konumu localStorage'da saklı (sayfayı yenile, panel aynı yerde).

2 panel — head'i tut sürükle

Sayfayı kaydır + paneli sürükle + bırak. F5 → konum hatırlanır. Sıfırlamak için panel head sağındaki ↻ butonuna tıkla.

Tools

Bu panel sürüklenebilir.

Filtreler
HTML
<div class="ui-panel" data-ui-panel="my-tools">
    <div class="ui-panel-head">
        <span class="ui-panel-title">Tools</span>
    </div>
    <div class="ui-panel-body">
        ...
    </div>
</div>

Layout Şablonları

Sık kullanılan sayfa iskeletleri tek-kullanımlık CSS class'ları olarak. Hepsi composable; istediğin gibi nest edebilirsin.

Stat cards (KPI tile)

Aktif Kullanıcı
12.4K
+18% bu ay
Aylık Gelir
₺ 84.250
+6%
Bekleyen İş
23
-3 bugün

Toolbar

Section card (titled card)

Gelir Grafiği Son 30 gün

Henüz veri yok

İlk işlemini yaptığında grafikler burada belirir.

Wizard (step indicator + content)

1

Adım 1

Hesap bilgileri

2

Adım 2

Profil tercihleri

3

Adım 3

Ödeme yöntemi

4

Adım 4

Onay

Adım 3 / 4

Ödeme yöntemini seç

Aboneliğin için varsayılan ödeme aracı.

Split (iki kolon)

Listele

  • Madde A
  • Madde B (seçili)
  • Madde C
  • Madde D

Detay panel

Sol listeden bir madde seçince burada detay görünür. .ui-split-3070 sol %30, sağ %70 verir; .ui-split %50/%50, .ui-split-7030 tam tersi.

Shell (sidebar + topbar + main) — mini önizleme

DashboardSYNCED14:32

Ana içerik burada — dashboard, formlar, tablolar...

PWA (Progressive Web App)

Tek satır DuckUI.PWA.register() → service worker + manifest + install prompt. Bu demo sayfası şu anda installable (Chrome/Edge → adres çubuğu sağında install ikonu).

Install butonu (otomatik gösterilir)

Buton sadece tarayıcı beforeinstallprompt event'i verince görünür hale gelir. iOS Safari API'yi desteklemediği için manuel "Add to Home Screen" gerekir.

Bağımsız mod (standalone) tespiti

Service worker

Strateji: /uikit/* → cache-first, /UiKit HTML → network-first. Kapatınca / offline'a geçince son ziyaret edilen sürüm açılır.

Tabs

Yatay veya dikey. data-ui-tabs attribute auto-init eder. Klavye: ←/→ · Home/End. ARIA full.

Yatay tabs

Bu sekme genel bakışı içerir. Yapı, kapsam, hedef kullanıcı.
Özellikler listesi: Sürükle-bırak, klavye desteği, ARIA tablist.
Fiyatlandırma planları ve sınırlamalar burada görünür.

Dikey tabs

Profil ayarları: ad, e-posta, avatar.
Fatura geçmişi ve abonelik.
Takım üyeleri ve roller.
API anahtarı oluştur ve iptal et.

Accordion

Tek seferde tek panel (default) veya çoklu (data-multi="1"). ARIA aria-expanded + aria-controls otomatik.

Single (radio)

data-ui-* attribute API'si. Sayfa yüklenince auto-init eder, ek konfig gerekmez.
Var. html[data-theme="dark"] ile dark mode aktif olur. Tüm renkler CSS değişkeni.
Klavye + ARIA: tab, accordion, modal, menu, select hepsi standart pattern'i takip eder.

Multi (checkbox)

İçerik 1.
İçerik 2 — birden fazla aynı anda açık olabilir.

Skeleton Loader

Veri yüklenmeden önce boyut sabitleyici placeholder. Shimmer animasyonu otomatik; prefers-reduced-motion ile durur.

Kart placeholder

Progress Bar

Determinate (style="width: X%") veya indeterminate (.is-indeterminate).

Yükleniyor…42%
Tamamlandı100%
İnce
Belirsiz (indeterminate)
Hata30% durdu

Avatar

İmaj veya initials. 5 boyut (xs/sm/md/lg/xl), 6 otomatik renk.

Boyutlar

ABCDEFGHİK

Avatar group

ABCDEFGH+12

Kare varyant + image

PG

Form Validation States

.is-valid / .is-invalid input ve field'a uygulanır. Field-level invalid help-text'i otomatik gizler, hata mesajı gösterir.

Format doğru

Eposta adresi girin (yardım metni).

Geçerli bir e-posta adresi değil

Form kayıtlanana kadar nötr kalır.

Dark Mode

html[data-theme="dark"] ile aktif. localStorage persist + sistem prefers-color-scheme default. Sağ üstteki ile değiştir.

Aktif tema: …

Sortable (Drag & Drop)

Native HTML5 DnD. data-ui-sortable attribute ile aktif olur. Reorder sonrası ui-sort:change event ile yeni sırayı dinleyebilirsin. data-handle="selector" ile sadece belirli bir handle'dan sürüklenmeyi sınırla.

Tüm satırı sürükle

  • Veritabanı seçimiDB
  • Frontend frameworkUI
  • Backend frameworkAPI
  • Hosting platformuOPS

Sıra: a · b · c · d

Yalnız handle'dan sürükle (data-handle="i.ui-drag-handle")

  • 📋 Görev: README yaz
  • ⚙️ Görev: CI/CD kur
  • 🐛 Görev: Auth bug'ı çöz

Buton tıklanabilir kalır — yalnızca handle ikonu sürüklenir.

WYSIWYG Editor

Minimal contenteditable editör. Bold/İtalik/Underline/Strike, H2/H3/P/Quote, ul/ol, link, inline code, undo/redo, biçimi temizle. data-ui-editor auto-init.
Ctrl+B/I/U tarayıcı default'u; Ctrl+Z/Y undo.

Boş editör (placeholder)

İçerikli editör + canlı HTML çıktı

Mini bir blog yazısı

Bu editör vanilla JS ile yazıldı, execCommand kullanır ama gelecekte Selection API'a geçiş kolay.

  • Native browser undo
  • Klavye: Bold/İtalik/Underline shortcut'ları
  • Toolbar buton state'i seçime göre güncellenir
Sadelik en sofistike sofistikasyondur. — Da Vinci
Canlı HTML çıktısı (yaz/sil → otomatik güncellenir)
 

HTML Inspector

Herhangi bir bileşene data-ui-inspect attribute ekle — sağ üst köşesinde butonu çıkar. Tıklayınca o bileşenin biçimlenmiş HTML'i modal'da açılır + panoya kopyalama. Layout şablonlarına otomatik eklenmiş; üzerlerine hover ederek dene.

Programmatik kullanım

// Tek bir element
DuckUI.HtmlInspector.attach(document.querySelector('.my-component'));

// Selector ile çoklu
DuckUI.HtmlInspector.attachAll('.demo-block');

// Modal'ı manuel aç
DuckUI.HtmlInspector.show(document.querySelector('.ui-card'));

Örnek — bu blok'un üzerine gel, sağ üst köşede görünecek

Çağrımı bul

Sağ üstteki ikona tıkla → modal'da formatlanmış HTML kodu çıkar.

İpucu: Layout demo'larındaki Stat / Toolbar / Section card / Wizard / Split / Shell blokları üzerinde gez — hepsinde <> butonu görünür ve HTML'i kopyalanabilir.

Badges

Etiket / status göstergesi.

DEFAULTSUCCESSWARNINGERRORINFOACCENT

Toast Notifications

DuckUI.toast({ variant, title, message, duration }) — sağ üstte stack, otomatik kapanır, ARIA live region.

Pagination

Standalone sayfa navigasyonu — table dışı listeler için. Pencere boyutu, ellipsis, ARIA destekli.

Mevcut sayfa: 3

Drawer (Off-canvas)

Side panel — mobile menu, filtre paneli için. right / left / top / bottom varyantları.

Command Palette (Ctrl+K)

Fuzzy arama, klavye nav (↑↓), Enter'la tetikle. Ctrl/Cmd + K kısayolu otomatik bağlı.

Örnek 12 komut: navigasyon, hızlı eylem, kullanıcı, dokümantasyon.

Tag Input (Combobox)

Enter / virgül ile yeni tag ekle, Backspace'le sonu sil. data-tags="..." ile preset.

Mevcut: postgresql, redis

Markdown Viewer

Inline parser — heading/list/quote/code/table/link/bold/italic. CDN gerektirmez.

## Markdown destekli içerik Bu blok **lightweight** bir Markdown parser ile render edilir. - Liste öğesi 1 - Liste öğesi 2 ile `inline kod` - [Link örneği](https://example.com) > Alıntı bloğu — sade görünüm. ```js // kod bloğu const x = 42; ``` | Sütun A | Sütun B | |---|---| | 1 | bir | | 2 | iki |

Tree View

Klasör/hiyerarşi görüntüleyici. Tıkla = aç/kapa, seçimi ui-tree:select event'i ile dinle.

Seçili: —

Code Block

Pretty-formatted kod, dil etiketi, tek-tık panoya kopyala.

const recommend = await engine.score({ domain: 'backend', experience: 'senior', constraints: ['low-latency', 'gdpr'] }); console.log(recommend.top(5));

Time Picker

HH:MM scrollable popup — saat/dk kolonları.

Slider & Number Step

Range input görselleştirilmiş + qty +/- input.

Stepper (Status flow)

Sipariş takip / progress timeline — yatay veya dikey.

  1. Sipariş
    2 gün önce
  2. Hazırlık
    1 gün önce
  3. Kargoda
    Bugün
  4. Teslim
    Yarın

Segment Control

Pill segmented buttons — view mode, sort, kompakt seçici.

Aktif: day

Bulk Action Bar

Tabloda multi-select sticky-bottom toolbar — N seçili görünür.

AdEmail
Ali Veliali@x.com
Ayşe Y.ayse@x.com
Mehmet K.mehmet@x.com
0 seçili

Form Error Summary

Submit'te tüm .is-invalid alanlarını liste olarak yukarı taşır, link'le focus.

Ad zorunlu.
Geçerli email gir.

Empty State Presets

Anlamlı varyantlar: no-results / error / no-perm / first-run.

Sonuç yok
Filtreleri sıfırla.
Yüklenemedi
Bağlantıyı kontrol et.
Yetki yok
Yöneticiyle iletişime geç.
İlk projen!
Wizard ile başla.

Font Type Selector

10 hazır preset, localStorage'da persist. Seçim CSS variable'ları override eder.

★ Darkwing Pastel Palette

Royal purple cape, golden DW emblem, pastel night-sky cyan. Tüm token'lar `--ui-*` üzerinden çalışır; mevcut sayfaları otomatik etkiler.

accent · #7c5cff
gold · #fcd34d
info · #06b6d4
pink · #f9a8d4
mint · #86efac
success · #16a34a
error · #e11d48
fg · #1e1b4b

Sticker Badges

Rotate -2°, dashed border, chunky shadow. Hover'da küçük wiggle. .ui-sticker + variant.

Default★ Önerim✓ Uyumlu~ Orta⚠ Düşükⓘ BilgiYeniFeaturedFlat (no rotate)Büyük Boy

Comic Speech Bubbles

Tooltip benzeri ama karakterli. Tail yön: bottom (varsayılan), top, left, right. .ui-bubble.

Önceki seçimlerinle uyumlu:
✓ Next.js (10/10)
✓ React (10/10)
Skor ortalaması 9.2
Yukarıdan kuyruklu (is-top variant).
Sağdan baloncuk.
Soldan baloncuk.
Accent variant · vurgulu çerçeve + mor pop shadow.

POW! Stickers

Comic-book celebration sticker. Rotate -6°, chunky border + shadow, gold halo, pop-in animation. .ui-pop.

POW!BOOM!YES!OOPS!YAY!

Cape Cards

Asimetrik dramatic shadow — kart sanki cape giymiş gibi. Hover'da kart 2px yukarı kalkar, cape büyür. .ui-cape-card.

Sıradan Cape Card

Cape-style asymmetric shadow + thick border + soft radius.

Pop variant

Border ve shadow accent (mor) renginde. Vurgu için kullan.

Halftone + Cape

Comic-book noktalı pattern overlay'i ile.

Top-Pick + Halo

Wizard'da ★ ÖNERİM kartı için: altın halka pulse + sticker badge köşede. .ui-top-pick veya `.ui-halo` (sadece halka).

minimal-flat

Düz, sade modern stil.

✓ Çok Uyumlu · 9.8/10

dark-mode-first

Karanlık zemin önceliği.

✓ Uyumlu · 9.0/10

glassmorphism

Cam efekti, modern UI.

~ Orta · 7.8/10

Halftone Overlay

Comic-book noktalı pattern. Hero, banner veya kartlara dramatic comic-vibe katar. .ui-halftone.

Default Halftone

Gri noktalı pattern, %60 opacity.

is-accent variant

Mor renkli noktalar.

is-gold variant

Altın halftone (yıldız patlaması).

Stack Score Bar (Wizard alt-cep)

Anlık yığın uyumluluğu + faz mini-barlar + what-if alternatifler. Wizard sayfasının altında sticky duracak. .ui-stack-bar.

Yığın Uyumluluk
82%▲ +5
F1 95F2 82F3 65F4 ─
★ minimal-flat 85% ▲+3dark-mode-first 84% ▲+2glassmorphism 79% ▼-3⚠ webflow 61% ▼-21

★ Cartoon Animation Pack

Disney 12 prensibinden ilham: squash-stretch, anticipation, exaggeration. CSS-only, prefers-reduced-motion uyumlu.

Hover-trigger flavors

Üzerine gel, hayata gelsinler.

Jiggle hoverSwing hoverPink jiggle

Entrance animations (sayfa yüklenince doğal)

bounce-in

overshoot + settle

zoom-bounce

küçükten büyüye + zıplama

flip-in

3D Y ekseninde dönüş

Idle/state animations

★ float
⚠ wobble
⚡ tilt-shake
●● eyes-blink

Top-pick + Sparkle (Wizard's "★ ÖNERİM")

Altın halka pulse + 4 köşe sparkle pırıltısı + sticker badge — hepsi auto.

minimal-flat

Sade modern — 9.8/10

sparkles ekstra

.ui-sparkles ile pulse'a iki yıldız daha

sıradan kart

karşılaştırma için