Görünüm

Bir yapay zeka ürününün ayarlarındaki Görünüm bölümü: tema, vurgu rengi, arka plan tonu, yoğunluk, sohbet yazı tipi, metin boyutları ve erişilebilirlik seçenekleri; kullanıcılar kaydedene kadar hepsi taslak olarak tutulur.

Appearance, uygulamanın görünümüyle ilgili her şeyi tek bir bölümde toplar. Tema kartları her temada, seçtiğiniz vurgu renginde çizilmiş küçük bir pencere gösterir; böylece seçim kaydetmeden önce nettir.

System cihazı izler ve şu anda hangisinin olduğunu söyler. High contrast kenarları ve metni güçlendirir, arka planları nötr tutar; bu yüzden seçiliyken ton kaydırıcısı devre dışı kalır.

Vurgu tonu, altında sekiz hızlı seçimi olan gerçek bir renk çubuğudur ve gösterge rengi Blue 250° gibi adlandırır. Background tint, vurguyu yüzeylere karıştırır. Yoğunluk ve sohbet yazı tipi kartları her seçeneğin bir örneğini gösterir; iki metin boyutu ise sınırları olan artırıp azaltma alanlarıdır.

Reduce motion ve Reduce transparency, cihaz zaten birini istiyorsa bunu belirtir.

Kaydedilene kadar her şey taslaktır. Settings'teki kaydetme çubuğu bir şey farklılaşır farklılaşmaz yükselir, Discard kaydedilmiş görünümü geri getirir ve Reset her seçeneği hâlâ vazgeçebileceğiniz bir taslak olarak varsayılana döndürür.

  1. Pro registry'yi components.json dosyasına ekleyin

    components.json
    {
      "registries": {
        "@hextaui-pro": {
          "url": "https://hextaui.com/r/pro/{name}.json",
          "headers": {
            "Authorization": "Bearer ${HEXTAUI_PRO_TOKEN}"
          }
        }
      }
    }
  2. Token'ınızı ekleyin

    Hesap sayfanızda bir token oluşturun ve .env.local dosyasına HEXTAUI_PRO_TOKEN olarak ekleyin.

  3. Bloğu ekleyin

    pnpm dlx shadcn@latest add @hextaui-pro/appearance

API'nize kaydedin

Kaydedilen değerleri ve asenkron bir onSave iletin. Biri çubukta Save'e basana kadar hiçbir şey gönderilmez. Mesajınızı çubukta göstermek ve seçimleri korumak için hata fırlatın.

"use client"

import { IconPalette } from "@tabler/icons-react"

import { SettingsSection, SettingsShell } from "../settings/settings"
import { AppearanceSettings, type AppearanceValues } from "@/components/blocks/appearance/appearance"

export function AppearancePage({ appearance }: { appearance: AppearanceValues }) {
  return (
    <SettingsShell
      sections={[{ id: "appearance", label: "Appearance", icon: <IconPalette /> }]}
      className="h-svh"
    >
      <SettingsSection id="appearance">
        <AppearanceSettings
          values={appearance}
          onSave={async (values) => {
            const response = await fetch("/api/appearance", {
              method: "PUT",
              body: JSON.stringify(values),
            })
            if (!response.ok) throw new Error("Check your connection and try again.")
          }}
        />
      </SettingsSection>
    </SettingsShell>
  )
}

Kaydedilen görünümü uygula

Kaydedildikten sonra değerleri uygulamanıza, kendi temalandırma yönteminizle uygulayın. normalizeAppearance eski bir sürümün sakladığı her şeyi onarır; böylece hatalı bir değer sayfayı asla bozmaz.

"use client"

import * as React from "react"

import { AppearanceSettings, normalizeAppearance, type AppearanceValues } from "@/components/blocks/appearance/appearance"

function applyAppearance(values: AppearanceValues) {
  const root = document.documentElement
  const systemDark = window.matchMedia("(prefers-color-scheme: dark)").matches
  const dark = values.theme === "dark" || values.theme === "contrast" || (values.theme === "system" && systemDark)
  root.classList.toggle("dark", dark)
  root.dataset.contrast = values.theme === "contrast" ? "more" : "normal"
  root.dataset.density = values.density
  root.dataset.chatFont = values.chatFont
  root.dataset.motion = values.reduceMotion ? "reduce" : "full"
  root.dataset.transparency = values.reduceTransparency ? "reduce" : "full"
  root.style.setProperty("--accent-hue", String(values.hue))
  root.style.setProperty("--accent-tint", `${values.intensity}%`)
  root.style.setProperty("--text-interface", `${values.interfaceSize}px`)
  root.style.setProperty("--text-code", `${values.codeSize}px`)
}

export function AppearanceForm({ stored }: { stored: Partial<AppearanceValues> | null }) {
  const [saved, setSaved] = React.useState(() => normalizeAppearance(stored))

  React.useEffect(() => applyAppearance(saved), [saved])

  return (
    <AppearanceSettings
      values={saved}
      onSave={async (values) => {
        const response = await fetch("/api/appearance", {
          method: "PUT",
          body: JSON.stringify(values),
        })
        if (!response.ok) throw new Error("Check your connection and try again.")
        setSaved(values)
      }}
    />
  )
}

Yapı

Dıştan içe doğru birleştirdiğiniz parçalar.

ParçaAçıklama
AppearanceSettingsBölümün içeriği: seçenek grupları, kabuğun kaydetme çubuğuna bağlı.
normalizeAppearanceSaklanmış ya da kısmi değerleri geçerli olanlara çevirir: boyutları sınırlar, tonu sarar ve bilinmeyen adlar için varsayılana döner.
appearanceDefaultsKendi değerlerinizi iletmediğinizde Reset'in döndüğü değerler.

AppearanceSettings

SettingsSection içinde kullanın. Ayrıca her div prop'unu kabul eder.

PropTürVarsayılan
valuesŞu an kayıtlı olanlar: { theme, hue, intensity, density, chatFont, interfaceSize, codeSize, reduceMotion, reduceTransparency }. Geçersiz değerler onarılır ve onarım kaydedilmemiş bir değişiklik sayılmaz.
AppearanceValues–
onSaveTaslağı kaydeder. Mesajı kaydetme çubuğunda göstermek ve taslağı korumak için hata fırlatın.
(values) => void | errors | Promise<void | errors>–
defaultsReset'in geri koyduğu değerler.
AppearanceValuesappearanceDefaults
PropTürVarsayılan
themeSystem, prefers-color-scheme değerini izler.
"system" | "light" | "dark" | "contrast""system"
hueVurgunun OKLCH tonu, 0 ile 359 arası.
number250
intensityVurgu renginin arka planlara ne kadar ton verdiği, 0 ile 100 arası.
number30
densityMesajlar arasındaki ve içindeki boşluk.
"compact" | "comfortable""comfortable"
chatFontMesajlar için yazı tipi.
"sans" | "serif" | "mono""sans"
interfaceSizePiksel cinsinden metin boyutu, 12 ile 18 arası.
number14
codeSizePiksel cinsinden kod boyutu, 11 ile 20 arası.
number13
reduceMotionSpinner'ları ve kayan panelleri durdurur.
booleanfalse
reduceTransparencyBulanık yerine düz arka planlar.
booleanfalse
TuşAction
←→Tema, yoğunluk ya da yazı tipi kartlarında önceki veya sonraki kartı seçer. Ton çubuğunda bir derece hareket eder.
Shift→Ton çubuğunda 15 derece hareket eder. Page Up ve Page Down aynısını yapar.
HomeEndTon çubuğunda iki uca da atlar.
↑↓Bir metin boyutu alanında boyutu bir piksel değiştirir.
⌘SKaydedilmemiş bir şey varken kaydeder. Windows ve Linux'ta Ctrl+S.
  • Her kart grubu, satırının adını taşıyan bir radio group'tur ve her kart kendi etiketiyle adlandırılır; böylece ekran okuyucular "Dark, radio, 3 of 4" duyar.
  • Ton çubuğu rengini "Blue, 250 degrees" gibi adıyla okur ve hızlı seçimler renge göre adlandırılmış toggle düğmeleridir.
  • Reset çalıştıktan sonra odağı korur ve varsayılanların geri geldiğini ve kaydedilmesi gerektiğini duyurur.

Şunlarla geliştirildi

Appearance bloğunun yapıldığı ücretsiz HextaUI bileşenleri. Her biri tek başına yüklenir.

Kod

2 dosya, components/blocks/appearance konumuna eklendi.