103 lines
3.9 KiB
PHP
103 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers\View;
|
|
|
|
use CodeIgniter\Controller;
|
|
use App\Models\PreferencesModel;
|
|
|
|
class UiController extends Controller
|
|
{
|
|
public function style()
|
|
{
|
|
$styleCfg = config('Style');
|
|
$accent = (string) $this->request->getGet('accent');
|
|
$menu = (string) $this->request->getGet('menu');
|
|
$menuBg = (string) $this->request->getGet('menu_bg');
|
|
$menuTx = (string) $this->request->getGet('menu_text');
|
|
$menuMd = (string) $this->request->getGet('menu_mode'); // optional: 'light'|'dark'|'auto'
|
|
|
|
$updates = [];
|
|
if ($accent && isset(($styleCfg->stylePalettes ?? [])[$accent])) {
|
|
session()->set('style_color', $accent);
|
|
$updates['style_color'] = $accent;
|
|
}
|
|
if ($menu && isset(($styleCfg->menuPalettes ?? [])[$menu])) {
|
|
session()->set('menu_color', $menu);
|
|
$updates['menu_color'] = $menu;
|
|
$updates['menu_custom_bg'] = null;
|
|
$updates['menu_custom_text'] = null;
|
|
$updates['menu_custom_mode'] = null;
|
|
} elseif (strtolower($menu) === 'custom' || ($menuBg !== '' || $menuTx !== '')) {
|
|
// Allow custom menu colors via GET: menu=custom&menu_bg=#hex&menu_text=#hex&menu_mode=dark|light|auto
|
|
$bg = $this->normalizeHex($menuBg);
|
|
$tx = $this->normalizeHex($menuTx);
|
|
if ($bg === '' && $tx === '') {
|
|
// no valid values; ignore
|
|
} else {
|
|
if ($bg === '') $bg = '#0f172a';
|
|
if ($tx === '') $tx = '#ffffff';
|
|
$mode = in_array($menuMd, ['light','dark','auto'], true) ? $menuMd : 'auto';
|
|
session()->set('menu_color', 'custom');
|
|
session()->set('menu_custom_bg', $bg);
|
|
session()->set('menu_custom_text', $tx);
|
|
session()->set('menu_custom_mode', $mode);
|
|
$updates['menu_color'] = 'custom';
|
|
$updates['menu_custom_bg'] = $bg;
|
|
$updates['menu_custom_text'] = $tx;
|
|
$updates['menu_custom_mode'] = $mode;
|
|
}
|
|
}
|
|
|
|
$userId = (int) session()->get('user_id');
|
|
if ($userId && !empty($updates)) {
|
|
$prefsModel = new PreferencesModel();
|
|
$existing = $prefsModel->where('user_id', $userId)->first();
|
|
if ($existing) {
|
|
$prefsModel->update($existing['id'], $updates);
|
|
} else {
|
|
$updates['user_id'] = $userId;
|
|
$prefsModel->insert($updates);
|
|
}
|
|
}
|
|
|
|
// Redirect back to referrer or home
|
|
$back = (string) $this->request->getGet('back');
|
|
if ($back) return redirect()->to($back);
|
|
$ref = $this->request->getServer('HTTP_REFERER');
|
|
if ($ref) return redirect()->to($ref);
|
|
return redirect()->to(site_url('/'));
|
|
}
|
|
|
|
/**
|
|
* Normalize a CSS hex color (#RGB or #RRGGBB). Returns '' on failure.
|
|
*/
|
|
private function normalizeHex(string $hex): string
|
|
{
|
|
$h = trim($hex);
|
|
if ($h === '') return '';
|
|
if ($h[0] !== '#') $h = '#' . $h;
|
|
if (preg_match('/^#([0-9a-fA-F]{3})$/', $h, $m)) {
|
|
// Expand #RGB to #RRGGBB
|
|
$r = $m[1][0]; $g = $m[1][1]; $b = $m[1][2];
|
|
return '#' . $r . $r . $g . $g . $b . $b;
|
|
}
|
|
if (preg_match('/^#([0-9a-fA-F]{6})$/', $h)) return strtoupper($h);
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Choose navbar mode based on background luminance: 'dark' for dark BG, else 'light'.
|
|
*/
|
|
private function autoModeForBg(string $hexBg): string
|
|
{
|
|
$hex = ltrim($hexBg, '#');
|
|
if (strlen($hex) !== 6) return 'dark';
|
|
$r = hexdec(substr($hex,0,2));
|
|
$g = hexdec(substr($hex,2,2));
|
|
$b = hexdec(substr($hex,4,2));
|
|
// Relative luminance approximation
|
|
$lum = (0.2126*$r + 0.7152*$g + 0.0722*$b) / 255.0;
|
|
return ($lum < 0.5) ? 'dark' : 'light';
|
|
}
|
|
}
|