From ad30fe9461e8f31b7258e877ae7771829f530eb3 Mon Sep 17 00:00:00 2001 From: Mathias Elle Date: Fri, 24 Apr 2026 19:53:09 +0200 Subject: [PATCH 1/8] feat: add additional audits for accessibility and usability checks Co-authored-by: Copilot --- src/view/frontend/web/css/toolbar.css | 28 +++++++-- src/view/frontend/web/js/toolbar/audits.js | 20 ++++++ .../js/toolbar/audits/buttons-without-type.js | 37 +++++++++++ .../web/js/toolbar/audits/duplicate-ids.js | 62 +++++++++++++++++++ .../js/toolbar/audits/empty-interactive.js | 52 ++++++++++++++++ .../frontend/web/js/toolbar/audits/index.js | 17 ++++- .../web/js/toolbar/audits/multiple-h1.js | 41 ++++++++++++ .../js/toolbar/audits/small-touch-targets.js | 55 ++++++++++++++++ .../js/toolbar/audits/unsafe-blank-target.js | 43 +++++++++++++ src/view/frontend/web/js/toolbar/ui.js | 7 ++- 10 files changed, 353 insertions(+), 9 deletions(-) create mode 100644 src/view/frontend/web/js/toolbar/audits/buttons-without-type.js create mode 100644 src/view/frontend/web/js/toolbar/audits/duplicate-ids.js create mode 100644 src/view/frontend/web/js/toolbar/audits/empty-interactive.js create mode 100644 src/view/frontend/web/js/toolbar/audits/multiple-h1.js create mode 100644 src/view/frontend/web/js/toolbar/audits/small-touch-targets.js create mode 100644 src/view/frontend/web/js/toolbar/audits/unsafe-blank-target.js diff --git a/src/view/frontend/web/css/toolbar.css b/src/view/frontend/web/css/toolbar.css index f6f4a38..0262a12 100644 --- a/src/view/frontend/web/css/toolbar.css +++ b/src/view/frontend/web/css/toolbar.css @@ -146,12 +146,14 @@ bottom: calc(100% + 8px); left: 0; background: linear-gradient(135deg, var(--mageforge-bg-dark) 0%, var(--mageforge-bg-dark-alt) 100%); - backdrop-filter: blur(12px); border: 1px solid var(--mageforge-border-color); border-radius: 10px; - box-shadow: 0 -8px 24px var(--mageforge-shadow-lg), 0 4px 8px var(--mageforge-shadow-sm); - padding: 6px; + box-shadow: 0 -8px 24px var(--mageforge-shadow-lg), 0 6px 10px var(--mageforge-shadow-sm); + padding: 0 6px 6px; min-width: 350px; + max-height: 90vh; + overflow-y: auto; + overflow-x: hidden; font-family: var(--mageforge-font-family); display: none; opacity: 0; @@ -177,11 +179,16 @@ .mageforge-toolbar-menu-title { display: flex; + flex-wrap: wrap; align-items: center; justify-content: space-between; - padding: 4px 8px 2px; + padding: 10px 8px 2px; border-bottom: 1px solid var(--mageforge-border-color); margin-bottom: 4px; + position: sticky; + top: 0; + z-index: 99999; + background: linear-gradient(135deg, var(--mageforge-bg-dark) 0%, var(--mageforge-bg-dark-alt) 100%); } .mageforge-toolbar-menu-title-text { @@ -194,11 +201,12 @@ background-image: var(--gradient-brand); background-clip: text; -webkit-background-clip: text; + display: block; } .mageforge-toolbar-menu-close { background: none; - border: none; + border: 1px solid var(--mageforge-border-color); cursor: pointer; color: var(--mageforge-color-slate-400); padding: 6px; @@ -309,9 +317,17 @@ } .mageforge-toolbar-menu-desc { - font-size: 10px; color: var(--mageforge-color-slate-400); + font-size: 11px; line-height: 1.3; + user-select: text; + cursor: text; +} + +.mageforge-toolbar-menu-desc.mageforge-active { + color: var(--mageforge-color-orange); + font-size: 12px; + user-select: text; } .mageforge-toolbar-menu-label-row { diff --git a/src/view/frontend/web/js/toolbar/audits.js b/src/view/frontend/web/js/toolbar/audits.js index 5422089..f2db32f 100644 --- a/src/view/frontend/web/js/toolbar/audits.js +++ b/src/view/frontend/web/js/toolbar/audits.js @@ -94,6 +94,26 @@ export const auditMethods = { } }, + /** + * Update the description text of an audit menu item. + * Useful for audits that want to surface detail (e.g. which IDs are duplicated). + * + * @param {string} key + * @param {string} text + */ + setAuditDescription(key, text) { + if (!this.menu) return; + const item = this.menu.querySelector(`[data-audit-key="${key}"]`); + if (!item) return; + const desc = item.querySelector('.mageforge-toolbar-menu-desc'); + if (!desc) return; + const originalText = desc.dataset.originalText ?? desc.textContent; + if (!desc.dataset.originalText) desc.dataset.originalText = originalText; + const isChanged = text !== originalText; + desc.textContent = text; + desc.classList.toggle('mageforge-active', isChanged); + }, + /** * Set the inline counter badge of an audit menu item. * diff --git a/src/view/frontend/web/js/toolbar/audits/buttons-without-type.js b/src/view/frontend/web/js/toolbar/audits/buttons-without-type.js new file mode 100644 index 0000000..ee2cdc4 --- /dev/null +++ b/src/view/frontend/web/js/toolbar/audits/buttons-without-type.js @@ -0,0 +1,37 @@ +/** + * MageForge Toolbar Audit – Buttons without type + * + * A