# Plan: Template Settings Admin Screen (Keen 3.5)

## Context
The admin panel uses the Keen 3.5 template (Bootstrap 5.3, RTL/LTR, dark/light themes). Currently there is no way for admins to customize the template appearance from the UI. This feature adds a dedicated settings screen that lets admins configure layout variants, color themes, images (login/register/default fallback), and font — all saved to the database and applied dynamically across the admin panel.

---

## Files to Create or Modify

| Action | File |
|--------|------|
| **Create** | `database/migrations/2026_05_16_000001_create_template_settings_table.php` |
| **Create** | `app/Models/TemplateSettings.php` |
| **Create** | `app/Http/Controllers/Admin/TemplateSettingsController.php` |
| **Create** | `resources/views/dashbord/admin/TemplateSettings/index.blade.php` |
| **Modify** | `routes/admin.php` |
| **Modify** | `resources/views/dashbord/layouts/master.blade.php` |
| **Modify** | `resources/views/dashbord/layouts/head.blade.php` |
| **Modify** | `app/Providers/AppServiceProvider.php` |
| **Modify** | `app/Helpers/main_helper.php` |

---

## Keen 3.5 Layout Builder Options (confirmed from https://preview.keenthemes.com/keen/demo1/?page=layout-builder)

| Category | Options |
|----------|---------|
| **Theme Mode** | light / dark |
| **RTL Mode** | toggle |
| **Width Mode** | default / fluid / fixed |
| **KeenIcons Style** | duotone / outline / solid |
| **Page Loader** | none / default / message / logo |
| **Layout Variant** | dark-sidebar / light-sidebar / dark-header / light-header |
| **Sidebar Fixed** | toggle |
| **Sidebar Minimize Mode** | toggle / hoverable / minimized |
| **Header Content Type** | menu / page-title |
| **Header Title Layout** | column / row |
| **Toolbar Display** | toggle |
| **Toolbar Fixed Desktop** | toggle |
| **Toolbar Fixed Mobile** | toggle |

---

## Step 1 — Migration

Table `template_settings` — always a single row, managed via `firstOrCreate`.

```php
Schema::create('template_settings', function (Blueprint $table) {
    $table->id();
    $table->string('app_layout')->default('dark-sidebar');
    $table->string('theme_mode')->default('light');
    $table->boolean('rtl_mode')->default(false);
    $table->string('width_mode')->default('default');
    $table->string('icon_style')->default('duotone');
    $table->string('page_loader')->default('none');
    $table->boolean('sidebar_fixed')->default(true);
    $table->string('sidebar_minimize_mode')->default('hoverable');
    $table->boolean('toolbar_enabled')->default(true);
    $table->boolean('toolbar_fixed_desktop')->default(false);
    $table->boolean('toolbar_fixed_mobile')->default(false);
    $table->string('header_content_type')->default('menu');
    $table->string('header_title_layout')->default('column');
    $table->string('color_primary')->default('#3E97FF');
    $table->string('color_success')->default('#50CD89');
    $table->string('color_info')->default('#7239EA');
    $table->string('color_warning')->default('#FFC700');
    $table->string('color_danger')->default('#F1416C');
    $table->string('color_dark')->default('#181C32');
    $table->string('login_image')->nullable();
    $table->string('register_image')->nullable();
    $table->string('default_image')->nullable();
    $table->string('font_family')->default('Inter');
    $table->timestamps();
});
```

---

## Step 2 — Model

`app/Models/TemplateSettings.php` — singleton model with boolean casts.

---

## Step 3 — Controller

`app/Http/Controllers/Admin/TemplateSettingsController.php`
- Uses `ImageProcessing` trait (`app/Traits/ImageProcessing.php`)
- `index()` — loads or creates the single settings row
- `update()` — saves all fields, handles image upload/delete for login_image, register_image, default_image

---

## Step 4 — Routes

Added inside the existing `admin.` route group in `routes/admin.php`:
```php
Route::group(['prefix' => 'template-settings', 'as' => 'template-settings.'], function () {
    Route::get('/', [TemplateSettingsController::class, 'index'])->name('index');
    Route::post('/', [TemplateSettingsController::class, 'update'])->name('update');
});
```

---

## Step 5 — View

`resources/views/dashbord/admin/TemplateSettings/index.blade.php`

7 Bootstrap tabs mirroring Keen Layout Builder:
1. **Layout** — Theme mode, RTL, Width, Icon style, Page loader, Layout variant
2. **Sidebar** — Fixed toggle, Minimize mode
3. **Header** — Content type, Title layout
4. **Toolbar** — Display, Fixed desktop/mobile
5. **Colors** — Color pickers (primary/success/info/warning/danger/dark) + reset defaults
6. **Images** — Login image, Register image, Default fallback image
7. **Font** — Font family selector with live preview

---

## Step 6 — Apply Settings Globally

### AppServiceProvider
```php
View::composer('dashbord.layouts.*', function ($view) {
    $view->with('templateSettings', \App\Models\TemplateSettings::firstOrCreate([]));
});
```

### master.blade.php body attributes → dynamic from `$templateSettings`
### head.blade.php → inject CSS variable overrides + dynamic Google font link
### main_helper.php → add `default_image_url()` helper

---

## Verification

1. `php artisan migrate` → `template_settings` table created
2. `/admin/template-settings` → form renders with defaults
3. Change layout + save → body attributes change on next page load
4. Change a color + save → CSS variable overrides applied
5. Upload login image → visible on login page
6. Upload default image → shown when record has no image
7. Change font → font changes across admin panel
