81 lines
3.8 KiB
PHP
81 lines
3.8 KiB
PHP
<?php
|
|
return [
|
|
'about' => 'Shared theme shell fragments rendered through the component system.',
|
|
|
|
'option' => function($prop) {
|
|
$key = (string)($prop['key'] ?? '');
|
|
$default = $prop['default'] ?? null;
|
|
$themes = cfg('theme/options');
|
|
$currentThemeKey = (string)cfg('theme/key');
|
|
$currentTheme = is_array($themes) && isset($themes[$currentThemeKey]) ? $themes[$currentThemeKey] : [];
|
|
if(is_array($currentTheme) && array_key_exists($key, $currentTheme)) return $currentTheme[$key];
|
|
$direct = cfg('theme/'.$key);
|
|
return $direct !== null ? $direct : $default;
|
|
},
|
|
|
|
'html_class' => function($prop) {
|
|
$classes = ['no-js'];
|
|
if(cfg('theme/mode') === 'dark') $classes[] = 'dark-theme';
|
|
$extra = trim((string)($prop['extra_class'] ?? ''));
|
|
if($extra !== '') $classes[] = $extra;
|
|
return trim(implode(' ', $classes));
|
|
},
|
|
|
|
'head' => function($prop, $component) {
|
|
$themePath = (string)cfg('theme/path');
|
|
$themePathCommon = 'themes/common/';
|
|
$description = first($prop['description'] ?? false, $component['option'](['key' => 'meta_description', 'default' => '']), 'Web App Starter theme');
|
|
$themeColor = first($prop['theme_color'] ?? false, $component['option'](['key' => 'theme_color', 'default' => '']), '#0f172a');
|
|
include_css($themePath.'css/style.css');
|
|
include_js('js/u-query.js');
|
|
include_js('js/morphdom.js');
|
|
include_js('js/site.js');
|
|
foreach((array)($prop['extra_css'] ?? []) as $extraCss) include_css($extraCss);
|
|
foreach((array)($prop['extra_js'] ?? []) as $extraJs) include_js($extraJs);
|
|
ob_start(); ?>
|
|
<meta charset="utf-8">
|
|
<title><?= first(URL::$route['page-title'] ?? false, cfg('site/default_page_title')).' | '.cfg('site/name') ?></title>
|
|
<meta name="description" content="<?= asafe((string)$description) ?>">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="theme-color" content="<?= asafe((string)$themeColor) ?>">
|
|
<?php return ob_get_clean();
|
|
},
|
|
|
|
'menu_href' => function($prop) {
|
|
$menuKey = (string)($prop['menu_key'] ?? '');
|
|
$menuItem = is_array($prop['menu_item'] ?? null) ? $prop['menu_item'] : [];
|
|
if(!empty($menuItem['external'])) return '/'.ltrim($menuKey, '/');
|
|
return URL::Link($menuKey);
|
|
},
|
|
|
|
'standard_nav' => function($prop, $component) {
|
|
$navClass = trim((string)($prop['nav_class'] ?? ''));
|
|
ob_start(); ?>
|
|
<nav<?= $navClass !== '' ? ' class="'.asafe($navClass).'"' : '' ?>>
|
|
<div class="nav-menu">
|
|
<a href="<?= asafe(URL::Link('')) ?>"><?= safe((string)cfg('site/name')) ?></a>
|
|
<?php foreach((array)cfg('menu') as $menuKey => $menuItem): if(empty($menuItem['hidden'])): ?>
|
|
<a href="<?= asafe($component['menu_href'](['menu_key' => $menuKey, 'menu_item' => $menuItem])) ?>"><?= safe($menuItem['title']) ?></a>
|
|
<?php endif; endforeach; ?>
|
|
</div>
|
|
</nav>
|
|
<?php return ob_get_clean();
|
|
},
|
|
|
|
|
|
'footer' => function($prop, $component) {
|
|
if(!empty($prop['embed_mode'])) return '';
|
|
$footerText = first($prop['text'] ?? false, $component['option'](['key' => 'footer_text', 'default' => false]), cfg('site/name'));
|
|
$innerClass = trim((string)($prop['inner_class'] ?? ''));
|
|
ob_start(); ?>
|
|
<footer>
|
|
<?php if($innerClass !== ''): ?>
|
|
<div class="<?= asafe($innerClass) ?>"><p><?= safe((string)$footerText) ?></p></div>
|
|
<?php else: ?>
|
|
<div style="max-width: 1200px; margin: 0 auto; padding: 0 1rem;"><p><?= safe((string)$footerText) ?></p></div>
|
|
<?php endif; ?>
|
|
</footer>
|
|
<?php return ob_get_clean();
|
|
},
|
|
];
|