From 0f961acf8a3a8c30f2f72470cda8471d2b925842 Mon Sep 17 00:00:00 2001 From: Markus Reinhold Date: Mon, 2 Dec 2024 23:23:24 +0100 Subject: [PATCH] Remove tabler.io JS (#254) Only dropdowns and dismiss buttons were used, which are now replicated with pure CSS or minimal JavaScript. This eliminates the need for a heavy library. An added benefit is that dropdowns can function without JavaScript, however, a drawback is the loss of automatic dropdown placement. --- assets/css/app.css | 22 +++++++++++++++ assets/js/Common/NotificationList.js | 2 +- assets/js/app.js | 23 +++++++++++----- config/importmap.php | 3 +-- .../Http/View/layout/condensed.html.twig | 27 +++++++++---------- 5 files changed, 52 insertions(+), 25 deletions(-) diff --git a/assets/css/app.css b/assets/css/app.css index de5b47f4..38d9a734 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -31,6 +31,28 @@ html:has(.layout-fluid) { border-radius: var(--tblr-border-radius); } +.gp-dropdown-toggle { + clip: rect(0 0 0 0); + position: absolute; +} + +.gp-dropdown-toggle:focus-visible + label.nav-link { + outline: 0; + box-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25); +} + +.gp-dropdown-toggle:focus-visible + label.btn { + color: var(--tblr-btn-hover-color); + background-color: var(--tblr-btn-hover-bg); + border-color: var(--tblr-btn-hover-border-color); + outline: 0; + box-shadow: var(--tblr-btn-box-shadow),var(--tblr-btn-focus-box-shadow); +} + +.gp-dropdown-toggle:checked + label + .dropdown-menu { + display: block; +} + .gp-page-progress { z-index: 10000; top: 0; diff --git a/assets/js/Common/NotificationList.js b/assets/js/Common/NotificationList.js index a94e766a..d9512936 100644 --- a/assets/js/Common/NotificationList.js +++ b/assets/js/Common/NotificationList.js @@ -22,7 +22,7 @@ customElements.define('notification-list', class extends HTMLElement {
${message}
- + `; diff --git a/assets/js/app.js b/assets/js/app.js index 90492e69..f699716b 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -1,7 +1,6 @@ import {client} from './Common/HttpClient.js' import './Common/NotificationList.js' import '@tabler/core/dist/css/tabler.min.css' -import '@tabler/core/dist/js/tabler.min.js' import '../css/app.css' window.fetch = (fetch => async (resource, options = {}) => { @@ -36,12 +35,7 @@ window.app = { client.onError = response => window.app.notifyUser(response.message, 'warning'); window.app.peInit(); -window.addEventListener('pe:click', e => { - ( - e.detail.a.hasAttribute('data-bs-toggle') || - e.detail.a.closest('[data-no-turbolink]') - ) && e.preventDefault() -}); +window.addEventListener('pe:click', e => e.detail.a.closest('[data-no-turbolink]') && e.preventDefault()); window.addEventListener('pe:navigate', e => { e.detail.parsed.push(dom => window.app.loadElements(dom.body)); e.detail.succeed.push(() => window.dispatchEvent(new CustomEvent('app:load'))); @@ -60,4 +54,19 @@ window.matchMedia("(prefers-color-scheme:dark)").addEventListener( await window.app.loadElements(document.body).finally(window.app.showProgress()); +document.addEventListener('change', e => { + if (!e.target.matches('.gp-dropdown-toggle[type="checkbox"]')) return; + + const onClick = eClick => { + if (eClick.target === e.target) return; + if (eClick.target.closest(`label[for="${e.target.id}"]`)) return; + + e.target.checked = e.target.parentElement.contains(eClick.target); + + if (e.target.checked) document.addEventListener('click', onClick, {once: true}); + } + + if (e.target.checked) setTimeout(() => document.addEventListener('click', onClick, {once: true}), 0); +}) + window.dispatchEvent(new CustomEvent('app:load')); diff --git a/config/importmap.php b/config/importmap.php index 78ddee6f..6f9c73e1 100644 --- a/config/importmap.php +++ b/config/importmap.php @@ -22,8 +22,7 @@ 'event-source-status' => ['path' => 'js/Common/EventSourceStatus.js'], 'confirmation-button' => ['path' => 'js/Common/ConfirmationButton.js'], 'uhtml/node.js' => ['version' => '4.5.8'], - '@tabler/core/dist/css/tabler.min.css' => ['version' => '1.0.0-beta20', 'type' => 'css'], - '@tabler/core/dist/js/tabler.min.js' => ['version' => '1.0.0-beta20'] + '@tabler/core/dist/css/tabler.min.css' => ['version' => '1.0.0-beta20', 'type' => 'css'] ]; foreach ($finder as $file) { diff --git a/src/WebInterface/Presentation/Http/View/layout/condensed.html.twig b/src/WebInterface/Presentation/Http/View/layout/condensed.html.twig index 8c38b95e..239edf68 100644 --- a/src/WebInterface/Presentation/Http/View/layout/condensed.html.twig +++ b/src/WebInterface/Presentation/Http/View/layout/condensed.html.twig @@ -18,24 +18,21 @@ - {% if app.user ? app.user.isSignedUp %} -