TR
Başlangıç
08 · Düzen

Head

<head> içeriği: meta etiketleri, sayfa başlığı, görünüm ayarları (veri olarak) ve tema ile menü durumunu ilk boyamadan önce uygulayan küçük script (acun-ui-boot.js). Alpine store'ları (appearance, brand, sidebar, navbar, customizer) Acun UI JavaScript'inden gelir: import '@acunsoft/acun-ui-core' ya da @acunUiScripts. Hazır düzenler bunu kendileri ekler; yalnızca kendi düzeninizi yazarken gerekir.

acun:layout.head
01

Kendi düzeninizde

<head> içine koyun; charset, viewport ve csrf-token meta etiketlerini, <title> etiketini ve @livewireStyles çıktısını kendisi yazar. Favicon ve @vite gibi varlıklarınızı slot'a ekleyin. @livewireScripts ise <body> sonunda sizde kalır. Tema script'i sayfa boyanmadan çalıştığı için wire:navigate geçişlerinde de tema parlaması olmaz.

BLADE
<!DOCTYPE html>
<html lang="tr">
<head>
    <acun:layout.head :title="$title ?? null">
        <link rel="icon" href="/favicon.svg" type="image/svg+xml">
        @vite(['resources/css/app.css', 'resources/js/app.js'])
    </acun:layout.head>
</head>
<body>
    {{ $slot }}

    @livewireScripts
</body>
</html>
PropDeğerler
titleSekme başlığı; verilmezse config('app.name')
02

Kayıtlı tercihler

Her tercihte aynı sıra geçerlidir: önce sunucudan verilen değer, o null ise tarayıcıda (localStorage) saklanan değer, o da yoksa config/acun-ui.php içindeki uygulama varsayılanı, o da yoksa paketin varsayılanı (navbar-mode için fixed). Tek bir sayfa Acun\Ui\Support\Layout::page() ile kendi değerini zorlayabilir. null "kaydedilmemiş" anlamına geldiği için kaydı olmayan kullanıcıya ayrıca varsayılan vermeyin. Değerler ilk karede <html> etiketine yazılır (dark sınıfı, data-brand-color, data-skin, data-sidebar-collapsed).

BLADE
<acun:layout.head
    :theme="auth()->user()?->tema_tercihi"
    :brand-color="auth()->user()?->marka_rengi"
    :sidebar-mode="auth()->user()?->sidebar_modu"
    :navbar-mode="auth()->user()?->navbar_modu"
    :skin="auth()->user()?->gorunum"
    :semi-dark="auth()->user()?->koyu_menu"
    :preference-url="route('arayuz-tercihi.guncelle')"
>
    @vite(['resources/css/app.css', 'resources/js/app.js'])
</acun:layout.head>
PropDeğerler
themelight | dark | system
brand-colordefault | green | red | yellow | blue | gray | dark | #rrggbb
sidebar-modeexpanded | collapsed
navbar-modefixed | static | hidden
skindefault | bordered
semi-darktrue | false
03

Tercihleri hesaba kaydetmek

preference-url verildiğinde kullanıcı görünümü değiştirdiği anda yeni değer bu adrese JSON olarak POST edilir; istekte X-CSRF-TOKEN başlığı bulunur. Her istekte yalnızca değişen anahtar gelir: theme, brand, sidebar, navbar, skin ya da semiDark. İstek arka planda gider, başarısız olsa da görünüm o oturumda korunur.

PHP
// routes/web.php
Route::post('arayuz-tercihi', ArayuzTercihiController::class)
    ->middleware('auth')
    ->name('arayuz-tercihi.guncelle');

// app/Http/Controllers/ArayuzTercihiController.php
public function __invoke(Request $request): Response
{
    $veri = $request->validate([
        'theme' => ['sometimes', 'in:light,dark,system'],
        'brand' => ['sometimes', 'regex:/^(#[0-9a-fA-F]{6}|default|green|red|yellow|blue|gray|dark)$/'],
        'sidebar' => ['sometimes', 'in:expanded,collapsed'],
        'navbar' => ['sometimes', 'in:fixed,static,hidden'],
        'skin' => ['sometimes', 'in:default,bordered'],
        'semiDark' => ['sometimes', 'boolean'],
    ]);

    $alanlar = [
        'theme' => 'tema_tercihi', 'brand' => 'marka_rengi', 'sidebar' => 'sidebar_modu',
        'navbar' => 'navbar_modu', 'skin' => 'gorunum', 'semiDark' => 'koyu_menu',
    ];

    $request->user()->update(
        collect($veri)->mapWithKeys(fn ($deger, $anahtar) => [$alanlar[$anahtar] => $deger])->all()
    );

    return response()->noContent();
}
PropDeğerler
preference-urlPOST adresi; null ise tercihler yalnızca tarayıcıda saklanır
04

Store'ları kullanmak

Store'lar Alpine başlarken kaydedilir ve her yerden $store ile erişilir. set ve toggle metotları değeri anında uygular, tarayıcıya yazar ve preference-url varsa hesaba kaydeder. Aşağıdaki düğmeler bu örneğin kendi çerçevesinde çalışır; ana renk seçimi tarayıcıda saklandığı için işiniz bitince "Varsayılan renk" ile geri alın.

CANLI ÖRNEK
<div x-data class="flex flex-wrap items-center gap-2">
    <acun:button variant="white" x-on:click="$store.appearance.toggle()">Temayı değiştir</acun:button>
    <acun:button variant="white" x-on:click="$store.brand.set('green')">Yeşil ana renk</acun:button>
    <acun:button variant="white" x-on:click="$store.brand.set('default')">Varsayılan renk</acun:button>
    <span class="text-sm text-gray-500 dark:text-zinc-400">
        Tema: <b x-text="$store.appearance.value"></b> · Renk: <b x-text="$store.brand.color"></b>
    </span>
</div>
PropDeğerler
$store.appearancevalue · set(light | dark | system) · toggle()
$store.brandcolor · set(ad | #rrggbb)
$store.sidebarcollapsed · toggle() · setCollapsed(true | false)
$store.navbarmode · set(fixed | static | hidden)
$store.customizerskin · semiDark · setSkin() · setSemiDark() · reset()
API

Prop'lar ve slot'lar

Bileşenin kabul ettiği değerler.

PropVarsayılanAçıklama
titlenullSekme başlığı; verilmezse config('app.name')
themenulllight · dark · system
brand-colornulldefault · green · red · yellow · blue · gray · dark · #rrggbb
sidebar-modenullexpanded · collapsed
navbar-modenullfixed · static · hidden; null ise tarayıcıdaki tercih, o da yoksa fixed
skinnulldefault · bordered
semi-darknulltrue · false; null ise tarayıcıdaki tercih
preference-urlnullTercihlerin POST edileceği adres; null ise yalnızca tarayıcıda saklanır
Slot'lar: varsayılan (uygulamanın head varlıkları: @vite, favicon, yazı tipleri)
Acun UI · HeadDetaylı kullanım ve örnekler