Tercih yardımcıları

Çerçeve başına yedi küçük paket, her biri bir kullanıcı işini baştan sona üstlenir; ayrıca bunlardan beşini bir araya getiren bir çubuk. Şunu zaten tanıdınız: theme-picker; işte locale-picker, text-size-picker ve motion-picker (tercihler), share-picker ve search-picker (eylemler), date-time-picker (form değeri) ve picker-bar.

Ne oluşturacaksınız

Kullanıcıların dillerini ve metin boyutlarını seçtiği bir ayarlar paneli — tüm belgeye uygulanan, ziyaretler arasında kalıcı olan ve size iki bileşen ile birkaç satır CSS'e mal olan seçimler. Yaklaşık 15 dakika.

Başlamadan önce

Önce yığınınız için çerçeve eğitimini bitirin. Aşağıdaki örnekler Svelte'tir; React, Vue, Angular, HTML, Nunjucks ve Blazor yardımcıları sözleşme sözleşme eşleşir.

Paylaştıkları biçim

  • WAI-ARIA APG listbox'ını (ya da date-time-picker için bir tarih seçici iletişim kutusunu) açan başsız bir simge düğmesi — yerel <select>yok, böylece her çerçeve aynı klavye davranışını ve biçim kancalarını alır.
  • Paket başına bir sınıf kancası (.locale-picker, .text-size-picker, .share-picker, .date-time-picker), sıfır CSS gönderilir.
  • SSR güvenli: DOM yazımları yalnızca mount/effect yaşam döngüsünde olur.
  • i18n dostu: kullanıcıya görünen her dize bir prop'tur.
  • Svelte (asıl), React, Vue, Angular, HTML özel öğesi, Nunjucks ve Blazor için mevcut — her birinde aynı sözleşme.

theme-picker, locale-picker ve text-size-picker her biri bir kullanıcı tercihini baştan sona üstlenir (seçim, DOM'a uygulama, isteğe bağlı localStorage kalıcılık storageKey prop'u üzerinden). share-picker ve date-time-picker tür olarak farklıdır: share-picker bir eylemi üstlenir — belgeye hiçbir şey uygulamaz ve hiçbir şey kalıcı kılmaz — date-time-picker ise bir form değeriniüstlenir, çünkü bir formdaki tarih bir tercih değil, veridir.

locale-picker — dil ve yön

Kullanıcının bir yerel ayar seçmesini sağlar, ardından belge köküne lang ve dir yazar; böylece i18n kitaplığınız, CSS'iniz ve yardımcı teknolojiler hep onu izler. RTL; Arapça, İbranice ve diğer sağdan sola yazı sistemleri için otomatik algılanır. Yalnızca sinyal vermeye odaklanır — çeviriyi i18n kitaplığınız yapar.

<script>
  import LocalePicker from "@lilydesignsystem/svelte-locale-picker";

  let locale = $state("en-US");
</script>

<LocalePicker
  label="Language"
  locales={["en-US", "fr", "ar", "he", "ja"]}
  bind:value={locale}
  storageKey="my-app-locale"
/>

Seçenekler yerleşik bir yerel ayar adı tablosundan etiketlenir (şununla geçersiz kılınabilir: localeLabels), her seçenek kendi lang özniteliğini taşır, böylece ekran okuyucular "Français" sözcüğünü Fransızca okur ve şunun gibi alt çizgili kodlar en_US BCP 47'ye kayıpsız gidip gelir en-US. Şunu bağlayın: onChange (veya bağlı değer) i18next, Paraglide, vue-i18n veya kullandığınız herhangi bir şeye.

text-size-picker — okuyucunun denetlediği boyut

Dakikalar süren bir erişilebilirlik kazancı: yardımcı belge köküne data-text-size="{slug}" ayarlar ve CSS'iniz her değeri bir boyuta eşler.

<script>
  import TextSizePicker from "@lilydesignsystem/svelte-text-size-picker";
</script>

<TextSizePicker
  label="Text size"
  sizes={["small", "medium", "large", "x-large"]}
  storageKey="my-app-text-size"
/>
:root[data-text-size="small"]   { font-size: 87.5%; }
:root[data-text-size="medium"]  { font-size: 100%; }
:root[data-text-size="large"]   { font-size: 112.5%; }
:root[data-text-size="x-large"] { font-size: 125%; }

Düzeninizi şununla boyutlandırın: rem ve tüm uygulama kullanıcının seçimine göre ölçeklenir. Etiketler slug'lardan başlık biçiminde üretilir ("X Large") veya şununla geçersiz kılınır: sizeLabels.

Çalışmanızı kontrol edin: seçiciden "Large" seçin, sayfa metni büyür. Yeniden yükleyin — hâlâ büyük: seçim şuraya kalıcı yazıldı: localStorage. Dil seçicinizi Arapça'ya çevirin ve dir="rtl" belgeye otomatik olarak yerleşir.

share-picker — bu sayfayı gönder

Varsa cihazın yerel paylaşım sayfasını açan, yoksa sizin verdiğiniz hedefler listesine ve URL kopyalama eylemine geçen tek simgeli bir düğme. Hiçbir sosyal ağ URL'si göndermez — hangi ağların ürününüze uygun olduğu, tasarım sisteminin değil sizin kararınızdır.

<script>
  import SharePicker from "@lilydesignsystem/svelte-share-picker";

  const targets = [
    { id: "mastodon", label: "Mastodon",
      href: (url, title) => `https://mastodon.social/share?text=${encodeURIComponent(title)}%20${encodeURIComponent(url)}` },
    { id: "email", label: "Email",
      href: (url, title) => `mailto:?subject=${encodeURIComponent(title)}&body=${encodeURIComponent(url)}`, newTab: false },
  ];
</script>

<SharePicker
  label="Share this page"
  title="An article worth reading"
  {targets}
  copyLabel="Copy link"
  copiedLabel="Link copied"
/>

url varsayılanı location.hrefolduğundan yaygın durumda hiçbir bağlantı gerekmez. Test veya ekran görüntüleri için platformlar arasında tutarlı davranış gerektiğinde bir yolu şununla zorlayın: strategy="list" veya strategy="native" .

date-time-picker — bir tarih, bir saat veya ikisi

İçine yazabileceğiniz bir metin alanı ve bir WAI-ARIA APG tarih seçici iletişim kutusunu açan bir simge düğmesi. Yapı gereği yerel ayara uygundur — ay adları, gün adları, haftanın ilk günü ve 12 ya da 24 saatlik saat hepsi şuradan gelir: Intl — ve değer her zaman sıralanabilir, saat dilimsiz bir ISO dizesidir: "2026-03-15" için mode="date", "09:30" için mode="time", "2026-03-15T09:30" için mode="datetime".

<script>
  import DateTimePicker from "@lilydesignsystem/svelte-date-time-picker";

  let appointment = $state("");
</script>

<DateTimePicker
  inputId="appointment"
  name="appointment"
  label="Choose an appointment date"
  locale="en-GB"
  bind:value={appointment}
  labels={{
    previousYear: "Previous year",
    previousMonth: "Previous month",
    nextMonth: "Next month",
    nextYear: "Next year",
    confirm: "OK",
    cancel: "Cancel",
  }}
/>

ISO değeri şunun gönderdiğiyle aynıdır: <input type="date"> böylece arka uca dokunmadan yerel denetimi takıp çıkarabilirsiniz.

motion-picker — azaltılmış harekete saygı gösterin

Yardımcı belge köküne data-motion="{slug}" ayarlar. İlk değeri ziyaretçinin işletim sistemi prefers-reduced-motion ayarından gelir — her zaman, kabul bayrağı olmadan, çünkü hareket gerçek bir erişilebilirlik ihtiyacıdır (WCAG 2.3.3). Neyin bastırılacağına CSS'iniz ve betikleriniz karar verir.

<script>
  import MotionPicker from "@lilydesignsystem/svelte-motion-picker";
</script>

<MotionPicker
  label="Motion"
  motions={["no-preference", "reduce"]}
  storageKey="my-app-motion"
/>
:root[data-motion="reduce"] *,
:root[data-motion="reduce"] *::before,
:root[data-motion="reduce"] *::after {
  animation: none !important;
  transition: none !important;
  scroll-behavior: auto !important;
}

search-picker — yolda olmayan bir arama kutusu

Bir arama alanı açan simge düğmesi. Return'e veya alanın yanındaki ⏎ düğmesine basmak, şuraya düz bir GET isteğiyle gider: /?<text> (metin kırpılır ve URI kodlanır; boş sorgu hiçbir yere gitmez). Üç erişilebilir adı zorunludur, çünkü yardımcı İngilizce göndermez.

<script>
  import SearchPicker from "@lilydesignsystem/svelte-search-picker";
  import { goto } from "$app/navigation";
</script>

<SearchPicker
  label="Search this site"
  inputLabel="Search terms"
  submitLabel="Search"
  placeholder="Search…"
  action="/search"
  navigate={(href) => goto(href)}
/>

action yolu değiştirir (/search?foo) ve navigate gezintiyi uygulama içinde tutar; o olmadan yardımcı şunu çağırır: location.assign.

picker-bar — tüm üst bilgi satırı tek seferde

picker-bar arama, tema, yerel ayar, metin boyutu ve paylaşımı tek satırda işler; tam referans tema kümesi ve yedi adımlı metin ölçeği önceden bağlanmıştır. Her erişilebilir ad tek bir zorunlu labels nesnesiyle gelir.

<script>
  import PickerBar from "@lilydesignsystem/svelte-picker-bar";
</script>

<PickerBar
  labels={{
    search: "Search", searchInput: "Search terms", searchSubmit: "Search",
    theme: "Theme", locale: "Language", textSize: "Text size", share: "Share",
  }}
  themesUrl="/themes/"
  locales={["en", "fr", "es"]}
  shareTargets={targets}
/>

Sarılmış herhangi bir seçiciye şununla ulaşın: searchProps, themeProps, localeProps, textSizeProps ve shareProps.

İpuçları yerleşik gelir

Her seçici, işaretçi düğmenin üzerinde durduğunda veya düğmede klavye odağı olduğunda etiketini bir ipucunda gösterir. İpucu, işaretçi üzerine geçtiğinde kalır, odak nerede olursa olsun Escape onu kapatır ve seçicinin açılır penceresi açıkken asla görünmez. Düğmenin erişilebilir adıyla aynı metni taşır; yani yapılandırılacak ya da iki kez çevrilecek bir şey yoktur; referans temalar onu biçimlendirir.

Tek yerde bir ayarlar paneli

Dört tercih yardımcısı doğal olarak bir araya gelir:

<fieldset class="fieldset">
  <legend>Preferences</legend>
  <ThemePicker    label="Theme"     themesUrl="/themes/" themes={themes} storageKey="pref-theme" />
  <LocalePicker   label="Language"  locales={locales}    storageKey="pref-locale" />
  <TextSizePicker label="Text size" sizes={sizes}        storageKey="pref-text-size" />
  <MotionPicker   label="Motion"    motions={motions}    storageKey="pref-motion" />
</fieldset>

Doğrulandı: locale-picker, text-size-picker, share-picker, date-time-picker ve birleşik panel kod parçaları, yayımlanmış 0.1.1 paketlere karşı tek tek derlendi; şunun aracılığıyla: svelte/server (2026-08-29); motion-picker, search-picker ve picker-bar kod parçaları ise 2026-10-06'da paketlerin kendi bileşenlerine karşı işlendi.

Nereden edinilir

# one directory per package in the monorepo, e.g.
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-theme-picker
# or lily-design-system-react-theme-picker, -vue- / -angular- / -html- / -web-components- / -nunjucks- / -blazor-

Her paketin kendi spec'i, spec maddelerine eşlenmiş testleri, çalıştırılabilir örnekleri (SSR çerez kalıpları dahil) ve bir derleme + yayımlama hattı vardır. Svelte paketleri asıldır; şüphede, onların sözleşmeleri geçerlidir.

Sonraki adımlar

Yol boyunca sorunuz mu var? Yardım sayfası yanıtlarla dolu — ve bir adım daha açık olabilirse, bize söyleyin ve eğitimi memnuniyetle iyileştirelim.