v1.0.0.1
StocketBase
- <?php
-
- declare(strict_types=1);
-
- require_once __DIR__ . '/footer-links.php';
- require_once __DIR__ . '/social-icons.php';
-
- $footerColumns = Languages::footerColumns(FooterLinks::decodeColumns($settings['footer_columns'] ?? '[]'));
- $footerSocialLinks = FooterLinks::decodeSocialLinks($settings['footer_social_links'] ?? '[]');
-
- ?>
- </main>
-
- </div>
-
- <?php foreach (SiteFront::activeAds('footer') as $footerAd): ?>
- <?= SiteFront::renderAd($footerAd) ?>
- <?php endforeach; ?>
-
- <footer class="site-footer">
-
- <?php if (!empty($footerColumns)): ?>
- <div class="site-footer-columns">
- <?php foreach ($footerColumns as $column): ?>
- <div>
- <h3 class="site-footer-column-title"><?= htmlspecialchars($column['title'] ?? '') ?></h3>
- <div class="site-footer-column-links">
- <?php foreach ($column['links'] ?? [] as $link): ?>
- <a href="<?= htmlspecialchars($link['url'] ?? '') ?>"><?= htmlspecialchars($link['label'] ?? '') ?></a>
- <?php endforeach; ?>
- </div>
- </div>
- <?php endforeach; ?>
- </div>
- <?php endif; ?>
-
- <div class="site-footer-bottom">
- <div class="site-footer-row">
- <span>© <?= date('Y') ?> <?= htmlspecialchars($settings['site_name'] ?? '') ?>. <?= htmlspecialchars(Language::get('footer_rights', 'All rights reserved.')) ?></span>
-
- <div class="site-footer-links">
- <?php if ($settings['sitemap_rss_enabled'] === '1'): ?>
- <a href="sitemap.php"><?= htmlspecialchars(Language::get('footer_sitemap', 'Sitemap')) ?></a>
- <a href="rss.php"><?= htmlspecialchars(Language::get('footer_rss', 'RSS')) ?></a>
- <?php endif; ?>
- <?= SiteFront::renderSearchControl('footer') ?>
- <?php if (($settings['consent_manager_enabled'] ?? '0') === '1' && ($settings['consent_footer_icon_enabled'] ?? '0') === '1'): ?>
- <button type="button" id="consent-reopen-btn" aria-label="<?= htmlspecialchars(Language::get('consent_manage', 'Manage preferences')) ?>" title="<?= htmlspecialchars(Language::get('consent_manage', 'Manage preferences')) ?>">
- <svg class="icon icon-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2a10 10 0 1 0 10 10 4 4 0 0 1-5-5 4 4 0 0 1-5-5"/><path d="M8.5 8.5v.01"/><path d="M16 15.5v.01"/><path d="M12 12v.01"/><path d="M11 17v.01"/><path d="M7 14v.01"/></svg>
- </button>
- <?php endif; ?>
- <?= Languages::renderSwitcher() ?>
- <button type="button" id="theme-toggle-btn" aria-label="<?= htmlspecialchars(Language::get('theme_toggle_label', 'Toggle theme')) ?>">
- <?= Icons::icon('sun', 'icon icon-sm icon-sun') ?>
- <?= Icons::icon('moon', 'icon icon-sm icon-moon') ?>
- </button>
- </div>
-
- <?php if (!empty($footerSocialLinks)): ?>
- <div class="site-footer-social">
- <?php foreach ($footerSocialLinks as $social): ?>
- <a href="<?= htmlspecialchars($social['url'] ?? '') ?>" target="_blank" rel="noopener noreferrer" aria-label="<?= htmlspecialchars($social['label'] ?? '') ?>">
- <?php if (($social['key'] ?? '') === 'custom'): ?>
- <?= $social['svg'] ?? '' ?>
- <?php else: ?>
- <?= SocialIcons::builtinSvg((string) ($social['key'] ?? '')) ?>
- <?php endif; ?>
- </a>
- <?php endforeach; ?>
- </div>
- <?php endif; ?>
- </div>
- </div>
-
- </footer>
-
- <?php
- $appBannerAndroidUrl = trim((string) ($settings['app_android_url'] ?? ''));
- $appBannerIosUrl = trim((string) ($settings['app_ios_url'] ?? ''));
- $appBannerEnabled = ($settings['app_banner_enabled'] ?? '0') === '1' && ($appBannerAndroidUrl !== '' || $appBannerIosUrl !== '');
- ?>
- <?php if ($appBannerEnabled): ?>
- <?php $appBannerIcon = !empty($settings['pwa_icon_url']) ? $settings['pwa_icon_url'] : ($settings['site_logo_url'] ?? ''); ?>
- <div class="app-banner" id="app-banner" data-android-url="<?= htmlspecialchars($appBannerAndroidUrl, ENT_QUOTES) ?>" data-ios-url="<?= htmlspecialchars($appBannerIosUrl, ENT_QUOTES) ?>">
- <?php if (!empty($appBannerIcon)): ?>
- <img src="<?= htmlspecialchars($appBannerIcon) ?>" alt="" class="app-banner-icon">
- <?php endif; ?>
- <span class="app-banner-text"><?= htmlspecialchars(Language::get('app_available_text', 'Also available as an app')) ?></span>
- <a href="#" class="app-banner-link" id="app-banner-link" target="_blank" rel="noopener noreferrer"><?= htmlspecialchars(Language::get('app_get_button', 'Get the app')) ?></a>
- <button type="button" class="app-banner-close" id="app-banner-close" aria-label="<?= htmlspecialchars(Language::get('app_dismiss', 'Dismiss')) ?>">×</button>
- </div>
- <?php endif; ?>
-
- <?php if (($settings['pwa_enabled'] ?? '0') === '1'): ?>
- <script>
- if ('serviceWorker' in navigator) {
- window.addEventListener('load', function () {
- navigator.serviceWorker.register('<?= htmlspecialchars(rtrim(Config::get('APP_BASE_PATH', ''), '/')) ?>/sw.js');
- });
- }
- </script>
- <?php endif; ?>
-
- <?php if (($settings['back_to_top_enabled'] ?? '0') === '1'): ?>
- <button type="button" class="back-to-top" id="back-to-top" aria-label="<?= htmlspecialchars(Language::get('back_to_top', 'Back to top')) ?>" title="<?= htmlspecialchars(Language::get('back_to_top', 'Back to top')) ?>" tabindex="-1" data-progress="<?= ($settings['back_to_top_progress_enabled'] ?? '0') === '1' ? '1' : '0' ?>" data-left-text="<?= htmlspecialchars(Language::get('reading_progress_left', '{percent}% left'), ENT_QUOTES) ?>">
- <svg class="icon icon-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 19V5"/><path d="M5 12l7-7 7 7"/></svg>
- <span class="back-to-top-progress" hidden></span>
- </button>
- <?php endif; ?>
-
- <?php if (($settings['consent_manager_enabled'] ?? '0') === '1'): ?>
- <div class="consent-banner" id="consent-banner">
- <p><?= htmlspecialchars(Language::get('consent_text', 'We use cookies and similar technologies to improve your experience.')) ?></p>
- <div class="consent-banner-actions">
- <button type="button" id="consent-decline"><?= htmlspecialchars(Language::get('consent_decline', 'Decline')) ?></button>
- <button type="button" id="consent-accept"><?= htmlspecialchars(Language::get('consent_accept', 'Accept')) ?></button>
- </div>
- </div>
- <?php endif; ?>
-
- <?= Asset::js('assets/site.js') ?>
- <?= Asset::js('assets/code-block.js') ?>
-
- <?php if (!empty($settings['custom_js'])): ?>
- <script>
- <?= $settings['custom_js'] ?>
- </script>
- <?php endif; ?>
-
- <?= SiteFront::renderCustomBodyHtml($pageType ?? null) ?>
- <?= SiteFront::renderAnalyticsScripts('body_end') ?>
-
- </body>
-
- </html>