7 languages, 3 pages (What/How/Start), 80-line router, 98KB total.
Features:
- No database, no Composer, no build step — just files on disk
- nginx PHP isolation: only index.php executes
- Bot detection with browser heuristic bypass
- Rate limiting, structured weekly logs, geo-location, Telegram alerts
- Multi-language: Accept-Language auto-detect, nav dropdown
- Article sub-page routing via /start/{slug}
- Apache + Caddy config alternatives documented in Start page
- Sample config — no real keys or secrets
46 lines
1.8 KiB
PHTML
46 lines
1.8 KiB
PHTML
<?php
|
|
# _footer.phtml
|
|
?>
|
|
</div>
|
|
<footer class="footer">
|
|
<div class="footer-content">
|
|
<div class="footer-info"><p>Powered by <strong>bare-site</strong></p></div>
|
|
<div class="footer-copyright">
|
|
<p>A zero-dependency PHP micro-framework. No database required.</p>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
<?php if (DEBUG): ?>
|
|
<div class="Debug"><!-- <?php echo json_encode($_SESSION, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); ?> --></div>
|
|
<?php endif; ?>
|
|
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
const hamburger = document.querySelector(".hamburger");
|
|
const navMenu = document.querySelector(".nav-menu");
|
|
if (hamburger && navMenu) {
|
|
hamburger.addEventListener("click", () => {
|
|
hamburger.classList.toggle("active");
|
|
navMenu.classList.toggle("active");
|
|
document.body.style.overflow = navMenu.classList.contains('active') ? 'hidden' : '';
|
|
});
|
|
document.querySelectorAll(".nav-menu a").forEach(n => n.addEventListener("click", () => {
|
|
hamburger.classList.remove("active");
|
|
navMenu.classList.remove("active");
|
|
document.body.style.overflow = '';
|
|
}));
|
|
}
|
|
document.querySelectorAll('.dropdown').forEach(function(dropdown) {
|
|
const button = dropdown.querySelector('.dropbtn');
|
|
const content = dropdown.querySelector('.dropdown-content');
|
|
content.style.display = 'none';
|
|
button.addEventListener('click', function() {
|
|
content.style.display = content.style.display === 'block' ? 'none' : 'block';
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
|
|
</body>
|
|
</html>
|