Files
exoplasim/web/components/theme/shell.php
T

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();
},
];