İçeriğe geç

Tema

Bu sayfa İngilizceden çevrilmiştir. İngilizce sayfayı okuyun

Durum: crates/zeyn/assets/zeyn.css içinde uygulandı.

Varsayılan UI kit'i her rengi, yazı tipini, boyutu ve köşe yarıçapını :root üzerindeki CSS özel özelliklerinden (custom properties) okur. Bir kurum, bunlardan birkaçını geçersiz kılarak görünümü değiştirir. zeyn.css dosyasını düzenlemesi ya da seçici (selector) yazması gerekmez.

1. Bir tema nasıl uygulanır

Sunucu önce zeyn.css dosyasını, ardından uygulamada varsa token geçersiz kılmalarını içeren ek bir stil sayfasını sunar. Geçersiz kılma dosyası yalnızca :root blokları içerir:

:root {
  --z-brand: #7a2448;
  --z-font: "Source Sans 3", "Segoe UI", system-ui, sans-serif;
  --z-radius: 8px;
  --z-density: 0.75;
}

Geçersiz kılma dosyası için kurallar:

  • Uygulamanın kendi origin'inden sunulmalıdır. Content Security Policy style-src 'self' olduğundan satır içi <style> blokları ve üçüncü taraf stil sayfaları engellenir.
  • Yazı tipleri kullanıcıların makinelerinde önceden kurulu olmalı ya da uygulamanın origin'inden sunulmalıdır. Kit'in kendisi hiçbir web yazı tipi yüklemez.
  • zeyn.css dosyasından sonra yükleyin; böylece eşit seçiciler sıraya göre kazanır.
  • 2. bölümdeki temel token'ları ayarlayın. 3. bölümdeki türetilmiş token'lar otomatik olarak uyum sağlar. Türetilmiş bir token'ı yalnızca hesaplanan değer markanız için işe yaramıyorsa geçersiz kılın.

Açık, koyu ve uygulama temaları

Her uygulamanın menüde, dil seçicinin yanında bir tema seçicisi vardır. Sistem (prefers-color-scheme değerini izler), Açık, Koyu ve uygulamanın tanımladığı her temayı sunar:

App::new("Billing")
    .theme(Theme::new().brand("#7a2448").radius(6))
    .themes([
        Theme::light(),
        Theme::dark(),
        Theme::named("sand", [("--z-bg", "#f5f1ea"), ("--z-surface", "#fffdf8")]).label(t!("theme.sand")),
    ])
    .default_theme("system")
  • App::theme kurumun görünümüdür ve her temanın altında uygulanır.
  • App::themes kullanıcıların seçebileceklerini listeler. Verilmezse liste Açık ve Koyu'dur. Her ikisi de listedeyse Sistem sunulur. Theme::named(...) açık temanın üzerine kurulur; .dark_base() koyu temanın üzerine kurar.
  • App::default_theme, henüz seçim yapmamış kullanıcıların temasıdır. Ayarlanmazsa system.
  • App::theme_picker(false) seçiciyi gizler; herkes varsayılan temayı alır.
  • Tek bir tema uygulamayı kilitler: .themes([Theme::named("acme", tokens)]) ya da .theme(Theme::dark()).

Token'lar uygulama başlarken denetlenir. App::check (dolayısıyla router ve serve) bilinmeyen token adlarını, bildirimlerinden taşabilecek değerleri (;, süslü parantezler, \, <, >, url(), hatalı tema adlarını, bilinmeyen bir varsayılan temayı ve bir temanın WCAG 2.2 AA'nın altına ittiği 5. bölümdeki her renk çiftini raporlar. Kontrast yalnızca #rgb ve #rrggbb değerleri için denetlenebilir; diğer renk sözdizimine güvenilir.

Tüm temalar tek bir stil sayfasında, /_zeyn/theme.css içinde sunulur; bu sayfa başlangıçta bir kez oluşturulur ve kit'in stil sayfalarından sonra yüklenir. Seçim zeyn_theme cookie'sinde saklanır; görünüm deposu olan bir uygulamada (App::datagrid_views) oturum açmış kullanıcı için ayrıca bu depoda saklanır, böylece kullanıcıyı yeni bir cihaza kadar izler. Sunucu temayı <html> üzerinde işler; bu yüzden ilk boyama zaten doğrudur ve satır içi betiğe gerek kalmaz:

İşaretlemeSonuç
<html>Sistem: prefers-color-scheme değerini izler
<html data-theme="light">Her zaman açık
<html data-theme="dark">Her zaman koyu
<html data-theme="light" data-zeyn-theme="sand">Açık tema üzerinde sand uygulama teması

Seçicide temayı değiştirmek yalnızca bu öznitelikleri ve color-scheme meta etiketini değiştirir, sonra POST /_zeyn/theme çağrısını yapar. Hiçbir şey yeniden yüklenmez.

Koyu temaya elle yazılmış bir geçersiz kılma dosyasında kendi değerlerini vermek için kit'in kullandığı seçicileri tekrarlayın:

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) { --z-bg: #0e1012; }
}
:root[data-theme="dark"] { --z-bg: #0e1012; }

Yoğunluk

--z-density boşluk birimini ölçekler. 1 normal, 0.75 kompakttır. <html data-density="compact"> bir stil sayfası olmadan 0.75 ayarlar. Kontroller ve grid satırları hiçbir zaman 24 px'in altına inmez; bu yüzden kompakt kipte de WCAG 2.2 hedef boyutu karşılanır.

Sanal (virtual) bir grid'in satır yüksekliği sunucu tarafından sabitlenir (Paging::virtual_rows(px), varsayılan 32 px), çünkü çalışma zamanı kaydırma konumlarını bundan hesaplar. Yoğunluk bunu değiştirmez.

2. Temel token'lar

Bunlar, bir kurumun ayarlaması beklenen token'lardır.

TokenAmaçAçıkKoyu
--z-brandTek marka rengi. Birincil düğmeler, uygulama adı bandı, geçerli menü öğesi, odaklanmış satır, odak halkası#0f6674aynı değer; bkz. --z-accent
--z-on-brandDolu bir --z-brand yüzeyi üzerindeki metin#ffffff#ffffff
--z-fontArayüz yazı tipi yığını"Segoe UI Variable Text", "Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, "Noto Sans", sans-serifaynı
--z-font-monoKod, API örnekleriui-monospace, "Cascadia Mono", "SF Mono", "Segoe UI Mono", Menlo, Consolas, monospaceaynı
--z-font-sizeGövde metni0.875rem (14 px)aynı
--z-font-size-smGrid hücreleri, etiketler, filtreler0.8125rem (13 px)aynı
--z-font-size-xsSütun başlıkları, menü grup başlıkları, sayfa bilgisi0.75rem (12 px)aynı
--z-radiusTemel köşe yarıçapı, 0 ile 12 px arası. Her bileşen bundan ölçeklenir4pxaynı
--z-densityBoşluk çarpanı, 1 normal, 0.75 kompakt1aynı
--z-bgPanellerin arkasındaki sayfa arka planı#f4f5f6#121416
--z-surfacePaneller, grid'ler, pencereler, girdiler#ffffff#1a1d20
--z-surface-2Grid başlığı, zebra satırlar, pencere alt bilgisi, salt okunur girdiler#f7f8f9#202326
--z-hoverSatırlar, menü öğeleri ve düğmeler için üzerine gelme arka planı#eceef1#2a2e33
--z-borderAyırıcılar ve panel dış çizgileri#dcdfe3#33383e
--z-border-strongGirdi ve düğme dış çizgileri, başlık çizgisi. --z-surface karşısında 3:1'e ulaşmalıdır#7d848d#7a818a
--z-textGövde metni ve değerler#1a1d21#e4e6e9
--z-text-mutedEtiketler, başlıklar, ikincil metin. --z-surface-2 karşısında 4,5:1'e ulaşmalıdır#5b626b#a2a9b1
--z-dangerHatalar, zorunlu işaretleri, tehlike satırları#b3261e#f28b82
--z-warningUyarı satırları#8a5300#e6b45a
--z-successBaşarı satırları#1e6b3a#6fcf8f
--z-infoBilgi bildirimleri#2b5d8a#8ab8e6

3. Türetilmiş token'lar

Temel token'lardan color-mix() ve göreli renk sözdizimi (relative color syntax) ile hesaplanır. Bir temel token değiştiğinde kendiliğinden güncellenir.

TokenAmaçAçıkKoyu
--z-accentBir yüzey üzerinde metin ya da ince çizgi olarak kullanılan marka rengi: bağlantılar, geçerli menü öğesi, odaklanmış satır çubuğuvar(--z-brand)oklch(from var(--z-brand) 0.8 c h), sabit açık tonda marka tonu (hue). Göreli renk sözdizimi olmayan tarayıcılar color-mix(in oklab, var(--z-brand) 45%, #fff) alır
--z-primaryBirincil düğme dolgusuvar(--z-brand)var(--z-accent)
--z-on-primaryBirincil düğme metnivar(--z-on-brand)#121416
--z-primary-hoverBirincil düğme üzerine gelmemarka %86, siyahla karıştırılmışaccent %84, beyazla karıştırılmış
--z-primary-activeBirincil düğme basılımarka %74, siyahla karıştırılmışaccent %70, beyazla karıştırılmış
--z-brand-subtleGeçerli menü öğesinin ve odaklanmış grid satırının arkasındaki ton--z-surface üzerinde --z-tint oranında accentaynı formül
--z-focusOdak halkasıvar(--z-accent)var(--z-accent)
--z-danger-subtle, --z-warning-subtle, --z-success-subtle, --z-info-subtleSatır ve mesaj arka planları--z-surface üzerinde --z-tint oranında durum rengiaynı formül
--z-tintİnce tonların gücü9%20%
--z-spaceBoşluk birimicalc(4px * var(--z-density))aynı
--z-controlDüğme ve girdi yüksekliğimax(24px, 8 * --z-space) (32 px)aynı
--z-rowSayfalı ve sonsuz grid'ler için grid satır yüksekliğimax(24px, 8 * --z-space) (32 px)aynı
--z-gapScreen bölümleri arasındaki boşluk3 * --z-space (12 px)aynı
--z-radius-sm, --z-radius-lgKüçük parçalar (filtreler, kod), pencereler--z-radius değerinin 0.75x ve 1.5x katıaynı
--z-shadow-2Yalnızca pencereler ve bildirimler. Grid satırları asla gölge almazyumuşak iki katmanlı gölgedaha koyu
--z-backdropKipli (modal) pencerenin arkasırgb(20 24 28 / 40%)rgb(0 0 0 / 60%)
--z-dirOkuma yönünün işareti; mantıksal karşılığı olmayan kaymalar için (başlangıç ya da bitiş tarafını işaretleyen iç gölgeler, kaydırma dönüşümleri): calc(2px * var(--z-dir))1, dir="rtl" altında -1aynı

Sunucu işaretlemesinin ayarladığı öğe başına token'lar: --z-width (pencere genişliği), --z-flex (sütun payı), --z-row-height (sanal grid satır yüksekliği) ve bileşen kütüphanesi için --z-stack-gap, --z-split, --z-progress, --z-columns, --z-level ile --z-pop-x / --z-pop-y (açılır pencere konumu).

Grafik seri renkleri components.css içinde --z-chart-1 ile --z-chart-6 arasındadır; koyu temada daha açık değerler kullanılır. Her biri --z-surface karşısında 3:1'e ulaşır. Herhangi bir temel token gibi geçersiz kılın.

4. Marka rengi seçmek

  • --z-brand, açık temada beyaz metin taşır (düğmeler, uygulama adı bandı). --z-on-brand karşısında en az 4,5:1 olan bir renk seçin. Orta ile koyu arası çoğu marka rengi geçer. Sarı gibi açık bir marka rengi için --z-on-brand değerini de koyu bir renge ayarlayın.
  • Koyu temada kit, metin, halkalar ve birincil düğmeler için markayı açar, uygulama adı bandı için dolu markayı korur. Farklı bir marka, ikinci bir renk gerekmeden iki temada da bilinçli görünür.
  • Durum renklerini markadan ayrı tutun. Kırmızı hata satırlarının yanındaki kırmızı bir marka, hataları fark etmeyi zorlaştırır; bu durumda --z-danger değerini farklı bir kırmızıya kaydırın ya da --z-brand-subtle değerini geçersiz kılarak markayı grid'lerden uzak tutun.
  • Renklerinizi 5. bölümdeki tabloyu hedef alarak denetleyin. Eşiğin altındaki her çift WCAG 2.2 AA'yı karşılamaz.

5. Doğrulanmış kontrast

Çalışan örnek uygulamada Chromium'da ölçüldü: her token işlenmiş sRGB değerine çözüldü (color-mix() ve göreli renkler dahil), sonra WCAG 2.x kontrast oranı hesaplandı. Eşikler: metin için 4,5:1, UI bileşen dış çizgileri ve odak göstergeleri için 3:1.

ÇiftAçıkKoyuGereken
--z-text üzerinde --z-bg15.4914.774.5
--z-text üzerinde --z-surface16.9113.544.5
--z-text üzerinde --z-surface-215.9112.634.5
--z-text üzerinde --z-hover14.5510.934.5
--z-text üzerinde --z-brand-subtle (odaklanmış satır)14.799.274.5
--z-text üzerinde --z-danger-subtle14.739.764.5
--z-text üzerinde --z-warning-subtle14.829.314.5
--z-text üzerinde --z-success-subtle14.769.334.5
--z-text-muted üzerinde --z-bg5.657.784.5
--z-text-muted üzerinde --z-surface6.177.134.5
--z-text-muted üzerinde --z-surface-2 (başlıklar)5.806.654.5
--z-text-muted üzerinde --z-hover5.315.764.5
--z-text-muted üzerinde --z-danger-subtle (soluk satır)5.375.144.5
--z-text-muted üzerinde --z-warning-subtle5.414.904.5
--z-accent üzerinde --z-surface (bağlantılar)6.629.334.5
--z-accent üzerinde --z-bg6.0610.184.5
--z-accent üzerinde --z-brand-subtle (geçerli menü öğesi)5.796.394.5
--z-on-primary üzerinde --z-primary6.6210.184.5
--z-on-primary üzerinde --z-primary-hover8.8211.264.5
--z-on-primary üzerinde --z-primary-active11.1212.264.5
--z-on-brand üzerinde --z-brand (uygulama adı bandı)6.626.624.5
--z-danger üzerinde --z-surface (alan hataları)6.547.094.5
--z-danger üzerinde --z-danger-subtle5.695.114.5
--z-warning üzerinde --z-surface6.338.904.5
--z-warning üzerinde --z-warning-subtle5.556.124.5
--z-success üzerinde --z-surface6.528.874.5
--z-info üzerinde --z-surface6.928.134.5
--z-focus üzerinde --z-surface6.629.333
--z-focus üzerinde --z-bg6.0610.183
--z-focus üzerinde --z-brand-subtle5.796.393
--z-border-strong üzerinde --z-surface (girdi dış çizgisi)3.784.303
--z-border-strong üzerinde --z-surface-23.554.013

--z-border süslemedir (zaten metni olan öğeler arasındaki ayırıcılar) ve 3:1 şartına tabi tutulmaz.

6. Diğer erişilebilirlik davranışları

  • Her etkileşimli öğe, --z-focus renginde 2 px'lik bir :focus-visible halkası gösterir. Grid satırları halkayı satırın içine çizer; böylece kaydırma kapsayıcısı tarafından asla kesilmez.
  • Düğmeler, girdiler, sıralama başlıkları, filtre kutuları, sayfalama düğmeleri ve pencere kapatma düğmesi her yoğunlukta en az 24 x 24 px'tir.
  • prefers-reduced-motion: reduce, bildirim giriş animasyonunu ve tüm geçişleri kaldırır.
  • forced-colors kipinde simgeler CanvasText, birincil düğme ve odaklanmış satır Highlight kullanır; arka plan tonlarına dayanan durum (geçerli menü öğesi, satır durumu) bunun yerine bir dış çizgi ya da kenarlık alır.