summaryrefslogtreecommitdiff
path: root/views
diff options
context:
space:
mode:
authorRoger Rehnelt <noreply@maennchen1.de>2026-10-03 15:23:59 +0200
committerRoger Rehnelt <noreply@maennchen1.de>2026-10-03 15:23:59 +0200
commit6b03b7e7a5b47b52ea5d5b6aae2efb945f4dd686 (patch)
tree09be466f7d00258aa5072cd844d5ff3bfd76de3f /views
parent24481a9557d656cc69c75eda9f598f993db5b728 (diff)
GARAN: Label per Tipp und Tastatur aufklappbar
Der erste Tipp oder der Tastaturfokus zeigt das Label, ein zweiter Tipp folgt dem Link zur EU-Seite; Escape oder ein Tipp daneben schließt es. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'views')
-rw-r--r--views/css/frontend.css5
-rw-r--r--views/css/wpsg-theme.css3
-rw-r--r--views/js/frontend.js45
3 files changed, 52 insertions, 1 deletions
diff --git a/views/css/frontend.css b/views/css/frontend.css
index 35a7605..3013aec 100644
--- a/views/css/frontend.css
+++ b/views/css/frontend.css
@@ -64,7 +64,10 @@ input.wpsg_error { border-color:red !important; border:1px solid red; }
}
}
}
- &:hover > .tooltip { opacity:1; pointer-events:all; z-index:1; }
+ &:hover > .tooltip { opacity:1; pointer-events:all; z-index:1; }
+ /* Auch per Tastaturfokus und nach dem ersten Tipp (K69, frontend.js); Escape blendet aus */
+ &:focus-visible > .tooltip, &.is-open > .tooltip { opacity:1; pointer-events:all; z-index:1; }
+ &.is-dismissed > .tooltip { opacity:0; pointer-events:none; }
}
}
diff --git a/views/css/wpsg-theme.css b/views/css/wpsg-theme.css
index 5966cde..e5d6727 100644
--- a/views/css/wpsg-theme.css
+++ b/views/css/wpsg-theme.css
@@ -615,6 +615,9 @@ html body #wpsg_revocation_dialog .inner { background-color:var(--wpsg-color-bac
}
}
&:hover > .tooltip { opacity:1; pointer-events:all; z-index:1; }
+ /* Auch per Tastaturfokus und nach dem ersten Tipp (K69, frontend.js); Escape blendet aus */
+ &:focus-visible > .tooltip, &.is-open > .tooltip { opacity:1; pointer-events:all; z-index:1; }
+ &.is-dismissed > .tooltip { opacity:0; pointer-events:none; }
}
}
html body .wpsg_product_garan_wrap,
diff --git a/views/js/frontend.js b/views/js/frontend.js
index d622596..6663ea5 100644
--- a/views/js/frontend.js
+++ b/views/js/frontend.js
@@ -309,3 +309,48 @@
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', wpsg_garanTooltipPosition); else wpsg_garanTooltipPosition();
window.addEventListener('resize', wpsg_garanTooltipPosition);
jQuery(document).ajaxComplete(wpsg_garanTooltipPosition);
+
+ /**
+ * GARAN-Label per Tipp und Tastatur (K69)
+ *
+ * Der erste Tipp klappt das Label auf, der zweite folgt dem Link zur EU-Seite. Maus: Darüberfahren zeigt es,
+ * Klick folgt dem Link. Tastatur: Der Fokus zeigt es (CSS :focus-visible), Enter folgt dem Link.
+ * Escape oder ein Tipp daneben schließt es.
+ */
+ var wpsg_garanPointer = '';
+
+ function wpsg_garanSet(label, open, dismissed) {
+
+ label.classList.toggle('is-open', open);
+ label.classList.toggle('is-dismissed', !!dismissed);
+ label.setAttribute('aria-expanded', ((open)?'true':'false'));
+
+ } // function wpsg_garanSet(label, open, dismissed)
+
+ document.addEventListener('pointerdown', function(event) { wpsg_garanPointer = event.pointerType; }, true);
+ document.addEventListener('keydown', function(event) {
+
+ wpsg_garanPointer = '';
+
+ if (event.key === 'Escape') document.querySelectorAll('a.wpsg_product_garan').forEach(function(label) { if (label.classList.contains('is-open') || label === document.activeElement) wpsg_garanSet(label, false, true); } );
+
+ }, true);
+
+ document.addEventListener('click', function(event) {
+
+ var label = event.target.closest('a.wpsg_product_garan');
+
+ document.querySelectorAll('a.wpsg_product_garan.is-open').forEach(function(open) { if (open !== label) wpsg_garanSet(open, false); } );
+
+ if (!label || (wpsg_garanPointer !== 'touch' && wpsg_garanPointer !== 'pen')) return;
+
+ if (!label.classList.contains('is-open')) {
+
+ event.preventDefault();
+ wpsg_garanSet(label, true);
+
+ }
+
+ } );
+
+ document.addEventListener('focusout', function(event) { if (event.target.matches && event.target.matches('a.wpsg_product_garan')) event.target.classList.remove('is-dismissed'); } );