WebOrbiton
v1.0.0.0

StocketBase

135 lines · 7.2 KB
  1. <?php
  2. ​
  3. declare(strict_types=1);
  4. ​
  5. require_once __DIR__ . '/footer-links.php';
  6. require_once __DIR__ . '/social-icons.php';
  7. ​
  8. $footerColumns = Languages::footerColumns(FooterLinks::decodeColumns($settings['footer_columns'] ?? '[]'));
  9. $footerSocialLinks = FooterLinks::decodeSocialLinks($settings['footer_social_links'] ?? '[]');
  10. ​
  11. ?>
  12. </main>
  13. ​
  14. </div>
  15. ​
  16. <?php foreach (SiteFront::activeAds('footer') as $footerAd): ?>
  17. <?= SiteFront::renderAd($footerAd) ?>
  18. <?php endforeach; ?>
  19. ​
  20. <footer class="site-footer">
  21. ​
  22. <?php if (!empty($footerColumns)): ?>
  23. <div class="site-footer-columns">
  24. <?php foreach ($footerColumns as $column): ?>
  25. <div>
  26. <h3 class="site-footer-column-title"><?= htmlspecialchars($column['title'] ?? '') ?></h3>
  27. <div class="site-footer-column-links">
  28. <?php foreach ($column['links'] ?? [] as $link): ?>
  29. <a href="<?= htmlspecialchars($link['url'] ?? '') ?>"><?= htmlspecialchars($link['label'] ?? '') ?></a>
  30. <?php endforeach; ?>
  31. </div>
  32. </div>
  33. <?php endforeach; ?>
  34. </div>
  35. <?php endif; ?>
  36. ​
  37. <div class="site-footer-bottom">
  38. <div class="site-footer-row">
  39. <span>&copy; <?= date('Y') ?> <?= htmlspecialchars($settings['site_name'] ?? '') ?>. <?= htmlspecialchars(Language::get('footer_rights', 'All rights reserved.')) ?></span>
  40. ​
  41. <div class="site-footer-links">
  42. <?php if ($settings['sitemap_rss_enabled'] === '1'): ?>
  43. <a href="sitemap.php"><?= htmlspecialchars(Language::get('footer_sitemap', 'Sitemap')) ?></a>
  44. <a href="rss.php"><?= htmlspecialchars(Language::get('footer_rss', 'RSS')) ?></a>
  45. <?php endif; ?>
  46. <?= SiteFront::renderSearchControl('footer') ?>
  47. <?php if (($settings['consent_manager_enabled'] ?? '0') === '1' && ($settings['consent_footer_icon_enabled'] ?? '0') === '1'): ?>
  48. <button type="button" id="consent-reopen-btn" aria-label="<?= htmlspecialchars(Language::get('consent_manage', 'Manage preferences')) ?>" title="<?= htmlspecialchars(Language::get('consent_manage', 'Manage preferences')) ?>">
  49. <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>
  50. </button>
  51. <?php endif; ?>
  52. <?= Languages::renderSwitcher() ?>
  53. <button type="button" id="theme-toggle-btn" aria-label="<?= htmlspecialchars(Language::get('theme_toggle_label', 'Toggle theme')) ?>">
  54. <?= Icons::icon('sun', 'icon icon-sm icon-sun') ?>
  55. <?= Icons::icon('moon', 'icon icon-sm icon-moon') ?>
  56. </button>
  57. </div>
  58. ​
  59. <?php if (!empty($footerSocialLinks)): ?>
  60. <div class="site-footer-social">
  61. <?php foreach ($footerSocialLinks as $social): ?>
  62. <a href="<?= htmlspecialchars($social['url'] ?? '') ?>" target="_blank" rel="noopener noreferrer" aria-label="<?= htmlspecialchars($social['label'] ?? '') ?>">
  63. <?php if (($social['key'] ?? '') === 'custom'): ?>
  64. <?= $social['svg'] ?? '' ?>
  65. <?php else: ?>
  66. <?= SocialIcons::builtinSvg((string) ($social['key'] ?? '')) ?>
  67. <?php endif; ?>
  68. </a>
  69. <?php endforeach; ?>
  70. </div>
  71. <?php endif; ?>
  72. </div>
  73. </div>
  74. ​
  75. </footer>
  76. ​
  77. <?php
  78. $appBannerAndroidUrl = trim((string) ($settings['app_android_url'] ?? ''));
  79. $appBannerIosUrl = trim((string) ($settings['app_ios_url'] ?? ''));
  80. $appBannerEnabled = ($settings['app_banner_enabled'] ?? '0') === '1' && ($appBannerAndroidUrl !== '' || $appBannerIosUrl !== '');
  81. ?>
  82. <?php if ($appBannerEnabled): ?>
  83. <?php $appBannerIcon = !empty($settings['pwa_icon_url']) ? $settings['pwa_icon_url'] : ($settings['site_logo_url'] ?? ''); ?>
  84. <div class="app-banner" id="app-banner" data-android-url="<?= htmlspecialchars($appBannerAndroidUrl, ENT_QUOTES) ?>" data-ios-url="<?= htmlspecialchars($appBannerIosUrl, ENT_QUOTES) ?>">
  85. <?php if (!empty($appBannerIcon)): ?>
  86. <img src="<?= htmlspecialchars($appBannerIcon) ?>" alt="" class="app-banner-icon">
  87. <?php endif; ?>
  88. <span class="app-banner-text"><?= htmlspecialchars(Language::get('app_available_text', 'Also available as an app')) ?></span>
  89. <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>
  90. <button type="button" class="app-banner-close" id="app-banner-close" aria-label="<?= htmlspecialchars(Language::get('app_dismiss', 'Dismiss')) ?>">&times;</button>
  91. </div>
  92. <?php endif; ?>
  93. ​
  94. <?php if (($settings['pwa_enabled'] ?? '0') === '1'): ?>
  95. <script>
  96. if ('serviceWorker' in navigator) {
  97. window.addEventListener('load', function () {
  98. navigator.serviceWorker.register('<?= htmlspecialchars(rtrim(Config::get('APP_BASE_PATH', ''), '/')) ?>/sw.js');
  99. });
  100. }
  101. </script>
  102. <?php endif; ?>
  103. ​
  104. <?php if (($settings['back_to_top_enabled'] ?? '0') === '1'): ?>
  105. <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) ?>">
  106. <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>
  107. <span class="back-to-top-progress" hidden></span>
  108. </button>
  109. <?php endif; ?>
  110. ​
  111. <?php if (($settings['consent_manager_enabled'] ?? '0') === '1'): ?>
  112. <div class="consent-banner" id="consent-banner">
  113. <p><?= htmlspecialchars(Language::get('consent_text', 'We use cookies and similar technologies to improve your experience.')) ?></p>
  114. <div class="consent-banner-actions">
  115. <button type="button" id="consent-decline"><?= htmlspecialchars(Language::get('consent_decline', 'Decline')) ?></button>
  116. <button type="button" id="consent-accept"><?= htmlspecialchars(Language::get('consent_accept', 'Accept')) ?></button>
  117. </div>
  118. </div>
  119. <?php endif; ?>
  120. ​
  121. <?= Asset::js('assets/site.js') ?>
  122. <?= Asset::js('assets/code-block.js') ?>
  123. ​
  124. <?php if (!empty($settings['custom_js'])): ?>
  125. <script>
  126. <?= $settings['custom_js'] ?>
  127. </script>
  128. <?php endif; ?>
  129. ​
  130. <?= SiteFront::renderCustomBodyHtml($pageType ?? null) ?>
  131. <?= SiteFront::renderAnalyticsScripts('body_end') ?>
  132. ​
  133. </body>
  134. ​
  135. </html>