- assets/js/password-toggle.js, carregado nos dois layouts: liga os botões
existentes e cria um para cada campo de password que não o tenha (eram 3
em 12). aria-pressed, aria-label que muda, fora da ordem de tabulação, e
volta a ocultar ao submeter.
- Removidas 23 bibliotecas/folhas sem nenhuma referência (193 ficheiros),
incluindo o jQuery 3.2.1 (CVE-2020-11022/11023) que se servia por URL, o
Splide (a galeria passou a masonry própria em d70f13a), owl, mixitup,
masonry, magnific-popup, slicknav, jquery.lazy, fullpage, TweenMax,
circle-progress, progressbar, o template polo e cópias antigas do
Bootstrap/FontAwesome em site/assets.
- .table-responsive nas listagens de eventos e galerias.
- .gitignore: sem os 5 padrões herdados do fotografia; *.sql/*.dump
ignorados (exceto migrações e o esquema); .trash/ das imagens; nota sobre
vendor/ versionado de propósito. database/andmore_fitme3070_dev.sql passa a
database/schema.sql (só estrutura, 0 INSERT).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
66 lines
3.0 KiB
PHP
66 lines
3.0 KiB
PHP
<?php
|
|
// Shared admin shell — close. Closes the main/content containers opened by header.php.
|
|
?>
|
|
</div><!-- /.p-3 / .p-md-4 -->
|
|
</main>
|
|
<?= script_tag('assets/vendor/jquery/jquery-3.7.1.min.js') ?>
|
|
<?= script_tag('assets/vendor/bootstrap5/js/bootstrap.bundle.min.js') ?>
|
|
<?= script_tag('assets/js/password-toggle.js') ?>
|
|
<?= script_tag('assets/vendor/summernote/summernote-bs5.min.js') ?>
|
|
<?= script_tag('assets/vendor/summernote/lang/summernote-pt-PT.min.js') ?>
|
|
<script>
|
|
// Attach Summernote to any <textarea class="js-wysiwyg">. The editor keeps the
|
|
// underlying textarea in sync, so normal form POSTs submit the generated HTML.
|
|
// Inline image upload is intentionally omitted (base64 would bloat the row) —
|
|
// modules that need images use their own file-upload fields.
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
if (!window.jQuery || !jQuery.fn || !jQuery.fn.summernote) return;
|
|
jQuery('textarea.js-wysiwyg').each(function () {
|
|
var $ta = jQuery(this);
|
|
$ta.summernote({
|
|
lang: 'pt-PT',
|
|
height: parseInt($ta.data('wysiwyg-height'), 10) || 240,
|
|
disableDragAndDrop: true,
|
|
toolbar: [
|
|
['style', ['style']],
|
|
['font', ['bold', 'italic', 'underline', 'clear']],
|
|
['para', ['ul', 'ol', 'paragraph']],
|
|
['insert', ['link']],
|
|
['view', ['codeview', 'fullscreen']]
|
|
],
|
|
styleTags: ['p', 'h2', 'h3', 'h4', 'blockquote'],
|
|
popover: { image: [], air: [] }
|
|
});
|
|
});
|
|
});
|
|
|
|
// Mobile off-canvas sidebar: hamburger toggles .sidebar.open + the backdrop;
|
|
// tapping the backdrop, a nav link, Escape, or resizing to desktop closes it.
|
|
(function () {
|
|
var sb = document.getElementById('sidebar');
|
|
var tg = document.getElementById('menuToggle');
|
|
var bd = document.getElementById('sidebarBackdrop');
|
|
if (!sb || !tg) return;
|
|
var mq = window.matchMedia('(max-width: 991.98px)');
|
|
function open() { sb.classList.add('open'); if (bd) bd.classList.add('show'); document.body.style.overflow = 'hidden'; tg.setAttribute('aria-expanded', 'true'); }
|
|
function close() { sb.classList.remove('open'); if (bd) bd.classList.remove('show'); document.body.style.overflow = ''; tg.setAttribute('aria-expanded', 'false'); }
|
|
tg.addEventListener('click', function () { sb.classList.contains('open') ? close() : open(); });
|
|
if (bd) bd.addEventListener('click', close);
|
|
sb.querySelectorAll('.nav-link').forEach(function (a) {
|
|
a.addEventListener('click', function () { if (mq.matches) close(); });
|
|
});
|
|
document.addEventListener('keydown', function (e) { if (e.key === 'Escape') close(); });
|
|
window.addEventListener('resize', function () { if (!mq.matches) close(); });
|
|
})();
|
|
</script>
|
|
<style>
|
|
/* Console footer — subtle brand bar */
|
|
main:after {
|
|
content: ''; display: block; height: 4px;
|
|
background: linear-gradient(90deg, var(--bo-accent, #C2D500), transparent);
|
|
margin-top: 2rem;
|
|
}
|
|
</style>
|
|
</body>
|
|
</html>
|