ຕົວຊ່ວຍການຕັ້ງຄ່າ

ເຈັດແພັກເກັດນ້ອຍຕໍ່ເຟຣມເວີກ, ແຕ່ລະອັນເປັນເຈົ້າຂອງວຽກຜູ້ໃຊ້ໜຶ່ງຢ່າງແຕ່ຕົ້ນຈົນຈົບ, ບວກແຖບທີ່ປະກອບຫ້າອັນໃນນັ້ນ. ທ່ານໄດ້ພົບ theme-pickerແລ້ວ; ນີ້ແມ່ນ locale-picker, text-size-picker ແລະ motion-picker (ການຕັ້ງຄ່າ), share-picker ແລະ search-picker (ການກະທຳ), date-time-picker (ຄ່າແບບຟອມ) ແລະ picker-bar.

ສິ່ງທີ່ທ່ານຈະສ້າງ

ແຜງການຕັ້ງຄ່າທີ່ຜູ້ໃຊ້ເລືອກພາສາ ແລະຂະໜາດຕົວອັກສອນຂອງເຂົາເຈົ້າ — ການເລືອກທີ່ນຳໃຊ້ກັບທັງເອກະສານ, ຄົງຢູ່ລະຫວ່າງການເຂົ້າຊົມ ແລະເສຍທ່ານພຽງສອງອົງປະກອບ ແລະ CSS ບໍ່ເທົ່າໃດແຖວ. ປະມານ 15 ນາທີ.

ກ່ອນທ່ານເລີ່ມ

ເຮັດໃຫ້ສຳເລັດ ບົດສອນເຟຣມເວີກ ສຳລັບສະແຕັກຂອງທ່ານກ່ອນ. ຕົວຢ່າງຂ້າງລຸ່ມເປັນ Svelte; ຕົວຊ່ວຍ React, Vue, Angular, HTML, Nunjucks ແລະ Blazor ກົງກັນສັນຍາຕໍ່ສັນຍາ.

ຮູບຮ່າງທີ່ພວກມັນແບ່ງປັນ

  • ປຸ່ມໄອຄອນແບບບໍ່ມີຫົວທີ່ເປີດ WAI-ARIA APG listbox (ຫຼື, ສຳລັບ date-time-picker, ກ່ອງໂຕ້ຕອບເລືອກວັນທີ) — ບໍ່ມີພື້ນເມືອງ <select>, ເພື່ອໃຫ້ທຸກເຟຣມເວີກໄດ້ພຶດຕິກຳແປ້ນພິມ ແລະ styling hook ທີ່ຄືກັນ.
  • class hook ໜຶ່ງອັນຕໍ່ແພັກເກັດ (.locale-picker, .text-size-picker, .share-picker, .date-time-picker), CSS ສູນຖືກສົ່ງ.
  • ປອດໄພສຳລັບ SSR: ການຂຽນ DOM ເກີດຂຶ້ນໃນວົງຈອນຊີວິດ mount/effect ເທົ່ານັ້ນ.
  • ສະອາດສຳລັບ i18n: ທຸກສາຍອັກສອນທີ່ຜູ້ໃຊ້ເຫັນແມ່ນຄຸນສົມບັດ.
  • ມີສຳລັບ Svelte (ມາດຕະຖານ), React, Vue, Angular, ອົງປະກອບກຳນົດເອງ HTML, Nunjucks ແລະ Blazor — ສັນຍາດຽວກັນໃນແຕ່ລະອັນ.

theme-picker, locale-picker ແລະ text-size-picker ແຕ່ລະອັນເປັນເຈົ້າຂອງ ການຕັ້ງຄ່າ ຂອງຜູ້ໃຊ້ໜຶ່ງຢ່າງແຕ່ຕົ້ນຈົນຈົບ (ການເລືອກ, ການນຳໃຊ້ກັບ DOM, localStorage ຄວາມຄົງຢູ່ storageKey ທາງເລືອກຜ່ານຄຸນສົມບັດ). share-picker ແລະ date-time-picker ຕ່າງກັນທາງຊະນິດ: share-picker ເປັນເຈົ້າຂອງ ການກະທຳ — ມັນບໍ່ນຳໃຊ້ຫຍັງກັບເອກະສານ ແລະບໍ່ເກັບຫຍັງ — ແລະ date-time-picker ເປັນເຈົ້າຂອງ ຄ່າແບບຟອມ, ເພາະວັນທີໃນແບບຟອມແມ່ນຂໍ້ມູນ, ບໍ່ແມ່ນການຕັ້ງຄ່າ.

locale-picker — ພາສາ ແລະທິດທາງ

ໃຫ້ຜູ້ໃຊ້ເລືອກໂລແຄລ, ຈາກນັ້ນຂຽນ lang ແລະ dir ໄປຍັງຮາກເອກະສານ ເພື່ອໃຫ້ໄລບຣາຣີ i18n, CSS ແລະເຕັກໂນໂລຢີຊ່ວຍເຫຼືອຂອງທ່ານທັງໝົດຕາມ. RTL ຖືກກວດພົບອັດຕະໂນມັດສຳລັບອາຣັບ, ຮີບຣູ ແລະອັກສອນຂວາ-ໄປ-ຊ້າຍອື່ນໆ. ມັນເນັ້ນສະເພາະການສົ່ງສັນຍານ — ໄລບຣາຣີ i18n ຂອງທ່ານຈັດການການແປ.

<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"
/>

ຕົວເລືອກມີປ້າຍຈາກຕາຕະລາງໃນຕົວຂອງຊື່ໂລແຄລ (ແທນທີ່ໄດ້ຜ່ານ localeLabels), ແຕ່ລະຕົວເລືອກມີຄຸນລັກສະນະ lang ຂອງຕົນເອງ ເພື່ອໃຫ້ໂປຣແກຣມອ່ານໜ້າຈໍອອກສຽງ “Français” ເປັນພາສາຝຣັ່ງ, ແລະລະຫັດທີ່ມີຂີດກ້ອງເຊັ່ນ en_US ໄປ-ກັບໄດ້ໂດຍບໍ່ສູນເສຍກັບ BCP 47 en-US. ເຊື່ອມຕໍ່ onChange (ຫຼືຄ່າທີ່ຜູກ) ເຂົ້າກັບ i18next, Paraglide, vue-i18n ຫຼືອັນໃດທີ່ທ່ານໃຊ້.

text-size-picker — ຂະໜາດທີ່ຜູ້ອ່ານຄວບຄຸມ

ໄຊຊະນະດ້ານການເຂົ້າເຖິງໄດ້ງ່າຍທີ່ໃຊ້ເວລາບໍ່ເທົ່າໃດນາທີ: ຕົວຊ່ວຍຕັ້ງ data-text-size="{slug}" ທີ່ຮາກເອກະສານ ແລະ CSS ຂອງທ່ານແມັບແຕ່ລະຄ່າໄປຫາຂະໜາດ.

<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%; }

ກຳນົດຂະໜາດໂຄງຮ່າງຂອງທ່ານໃນ rem ແລະທັງແອັບຈະປັບຂະໜາດຕາມທາງເລືອກຂອງຜູ້ໃຊ້. ປ້າຍຖືກຂຽນອັກສອນຕົ້ນໃຫຍ່ຈາກ slug (“X Large”) ຫຼືແທນທີ່ດ້ວຍ sizeLabels.

ກວດງານຂອງທ່ານ: ເລືອກ “Large” ຈາກຕົວເລືອກ, ແລະຂໍ້ຄວາມໜ້າຈະໃຫຍ່ຂຶ້ນ. ໂຫຼດຄືນ — ຍັງໃຫຍ່ຢູ່: ທາງເລືອກຖືກເກັບໄວ້ໃນ localStorage. ສະຫຼັບຕົວເລືອກພາສາຂອງທ່ານເປັນອາຣັບ ແລະ dir="rtl" ຈະໄປຢູ່ໃນເອກະສານອັດຕະໂນມັດ.

share-picker — ສົ່ງໜ້ານີ້

ປຸ່ມສັນຍາລັກດຽວທີ່ເປີດແຜ່ນແບ່ງປັນພື້ນເມືອງຂອງອຸປະກອນບ່ອນທີ່ມີ, ແລະຖ້າບໍ່ມີກໍກັບໄປຫາລາຍການປາຍທາງທີ່ທ່ານສະໜອງ, ບວກການກະທຳສຳເນົາ URL. ມັນບໍ່ສົ່ງ URL ເຄືອຂ່າຍສັງຄົມ — ເຄືອຂ່າຍໃດເປັນຂອງຜະລິດຕະພັນຂອງທ່ານແມ່ນການຕັດສິນໃຈຂອງທ່ານ, ບໍ່ແມ່ນຂອງລະບົບການອອກແບບ.

<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 ຄ່າເລີ່ມຕົ້ນເປັນ location.hrefດັ່ງນັ້ນກໍລະນີທົ່ວໄປບໍ່ຕ້ອງການສາຍເຊື່ອມ. ບັງຄັບເສັ້ນທາງດ້ວຍ strategy="list" ຫຼື strategy="native" ເມື່ອທ່ານຕ້ອງການພຶດຕິກຳທີ່ສອດຄ່ອງຂ້າມແພລດຟອມສຳລັບການທົດສອບ ຫຼືພາບໜ້າຈໍ.

date-time-picker — ວັນທີ, ເວລາ, ຫຼືທັງສອງ

ຊ່ອງຂໍ້ຄວາມທີ່ທ່ານພິມໄດ້, ບວກປຸ່ມໄອຄອນທີ່ເປີດກ່ອງໂຕ້ຕອບເລືອກວັນທີ WAI-ARIA APG. ຖືກຕ້ອງຕາມໂລແຄລໂດຍການອອກແບບ — ຊື່ເດືອນ, ຊື່ມື້ໃນອາທິດ, ມື້ທຳອິດຂອງອາທິດ ແລະໂມງ 12 ຫຼື 24 ຊົ່ວໂມງ ທັງໝົດມາຈາກ Intl — ແລະຄ່າແມ່ນສາຍ ISO ທີ່ຈັດລຽງໄດ້ ແລະບໍ່ມີເຂດເວລາສະເໝີ: "2026-03-15" ສຳລັບ mode="date", "09:30" ສຳລັບ mode="time", "2026-03-15T09:30" ສຳລັບ 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 ຄືກັນກັບສິ່ງທີ່ <input type="date"> ສົ່ງ, ດັ່ງນັ້ນທ່ານສາມາດສະຫຼັບການຄວບຄຸມພື້ນເມືອງເຂົ້າ ຫຼືອອກໂດຍບໍ່ແຕະ backend ຂອງທ່ານ.

motion-picker — ເຄົາລົບການເຄື່ອນໄຫວທີ່ຫຼຸດລົງ

ຕົວຊ່ວຍຕັ້ງ data-motion="{slug}" ທີ່ຮາກເອກະສານ. ຄ່າທຳອິດຂອງມັນມາຈາກການຕັ້ງຄ່າລະບົບປະຕິບັດການຂອງຜູ້ເຂົ້າຊົມ prefers-reduced-motion — ສະເໝີ, ໂດຍບໍ່ມີທຸງເລືອກເຂົ້າ, ເພາະການເຄື່ອນໄຫວແມ່ນຄວາມຕ້ອງການດ້ານການເຂົ້າເຖິງໄດ້ງ່າຍຈິງ (WCAG 2.3.3). CSS ແລະສະຄຣິບຂອງທ່ານຕັດສິນວ່າຈະສະກັດອັນໃດ.

<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 — ກ່ອງຄົ້ນຫາທີ່ຫຼີກທາງ

ປຸ່ມໄອຄອນທີ່ເປີດຊ່ອງຄົ້ນຫາ. ການກົດ Return, ຫຼືປຸ່ມ ⏎ ຂ້າງຊ່ອງ, ນຳທາງດ້ວຍຄຳຮ້ອງຂໍ GET ທຳມະດາໄປຫາ /?<text> (ຂໍ້ຄວາມຖືກຕັດ ແລະເຂົ້າລະຫັດ URI; ຄຳຖາມຫວ່າງບໍ່ໄປໃສ). ຊື່ທີ່ເຂົ້າເຖິງໄດ້ທັງສາມຂອງມັນຈຳເປັນ, ເພາະຕົວຊ່ວຍບໍ່ສົ່ງພາສາອັງກິດ.

<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 ປ່ຽນເສັ້ນທາງ (/search?foo), ແລະ navigate ຮັກສາການນຳທາງໃນແອັບ; ຖ້າບໍ່ມີມັນ ຕົວຊ່ວຍເອີ້ນ location.assign.

picker-bar — ທັງແຖວສ່ວນຫົວໃນຄັ້ງດຽວ

picker-bar ສະແດງການຄົ້ນຫາ, ຮູບແບບສີສັນ, ໂລແຄລ, ຂະໜາດຕົວອັກສອນ ແລະການແບ່ງປັນໃນແຖວດຽວ, ພ້ອມຊຸດເຕັມຂອງຮູບແບບສີສັນອ້າງອີງ ແລະມາດຕາສ່ວນຂໍ້ຄວາມເຈັດຂັ້ນທີ່ເຊື່ອມຕໍ່ໄວ້ກ່ອນ. ທຸກຊື່ທີ່ເຂົ້າເຖິງໄດ້ມາໃນອອບເຈັກຈຳເປັນດຽວ labels .

<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}
/>

ເຂົ້າເຖິງຕົວເລືອກທີ່ຫໍ່ໃດໆດ້ວຍ searchProps, themeProps, localeProps, textSizeProps ແລະ shareProps.

Tooltip ມາພ້ອມໃນຕົວ

ທຸກຕົວເລືອກສະແດງປ້າຍຂອງມັນໃນ tooltip ເມື່ອຕົວຊີ້ພັກຢູ່ເທິງປຸ່ມຂອງມັນ ຫຼືປຸ່ມມີຈຸດສຸມແປ້ນພິມ. Tooltip ຢູ່ຕໍ່ໄປໃນຂະນະທີ່ຕົວຊີ້ເຄື່ອນໄປຫາມັນ, Escape ປິດມັນບ່ອນໃດກໍຕາມທີ່ຈຸດສຸມຢູ່, ແລະມັນບໍ່ເຄີຍສະແດງໃນຂະນະທີ່ປັອບອັບຂອງຕົວເລືອກເປີດຢູ່. ມັນມີຂໍ້ຄວາມຄືກັນກັບຊື່ທີ່ເຂົ້າເຖິງໄດ້ຂອງປຸ່ມ, ດັ່ງນັ້ນບໍ່ມີຫຍັງຕ້ອງຕັ້ງຄ່າ ແລະບໍ່ມີຫຍັງຕ້ອງແປສອງຄັ້ງ; ຮູບແບບສີສັນອ້າງອີງໃສ່ຮູບແບບໃຫ້ມັນ.

ແຜງການຕັ້ງຄ່າໃນບ່ອນດຽວ

ຕົວຊ່ວຍການຕັ້ງຄ່າທັງສີ່ປະກອບກັນຢ່າງເປັນທຳມະຊາດ:

<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>

ກວດສອບແລ້ວ: ສ່ວນຂອງ locale-picker, text-size-picker, share-picker, date-time-picker ແລະແຜງປະສົມຖືກຄອມໄພລ໌ແຍກກັນຕໍ່ແພັກເກັດທີ່ເຜີຍແຜ່ 0.1.1 ຜ່ານ svelte/server (2026-08-29); ສ່ວນຂອງ motion-picker, search-picker ແລະ picker-bar ຖືກສະແດງຕໍ່ອົງປະກອບຂອງແພັກເກັດເອງ 2026-10-06.

ຈະເອົາມັນໄດ້ຈາກໃສ

# 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-

ແຕ່ລະແພັກເກັດມີ spec ຂອງຕົນເອງ, ການທົດສອບທີ່ແມັບກັບຂໍ້ spec, ຕົວຢ່າງທີ່ແລ່ນໄດ້ (ລວມທັງຮູບແບບ cookie SSR) ແລະທໍ່ສ້າງ + ເຜີຍແຜ່. ແພັກເກັດ Svelte ແມ່ນມາດຕະຖານ; ເມື່ອສົງໄສ, ສັນຍາຂອງພວກມັນຊະນະ.

ຂັ້ນຕອນຕໍ່ໄປ

ມີຄຳຖາມລະຫວ່າງທາງບໍ? ໜ້າຊ່ວຍເຫຼືອ ເຕັມໄປດ້ວຍຄຳຕອບ — ແລະຖ້າຂັ້ນຕອນໃດຊັດເຈນຂຶ້ນໄດ້, ບອກພວກເຮົາ ແລະພວກເຮົາຍິນດີປັບປຸງບົດສອນ.