diff --git a/.jules/palette.md b/.jules/palette.md index ea004e2d..0cc02a34 100644 --- a/.jules/palette.md +++ b/.jules/palette.md @@ -81,3 +81,11 @@ ## 2026-08-12 - Skip to Content Accessibility **Learning:** Screen reader and keyboard-only users experience significant friction when forced to navigate through repetitive header controls on every page load. **Action:** Keep a visible-on-focus skip link as the first interactive element, target a programmatically focusable main container, and give the focused link a high-contrast outline. + +## 2024-09-02 - Interactive Dashboard Cards for Quick Filtering (Deploy-blocking) +**Learning:** Transforming static metric summary cards (like "Deploy-blocking") into interactive toggle filters significantly enhances dashboard UX, but requires careful accessibility implementations. +**Action:** When making metric cards interactive, explicitly add `role="button"`, `tabindex="0"`, `aria-pressed`, and `onkeydown` handlers for both Enter and Space keys. Ensure global 'Clear filters' actions also reset this new toggle state. + +## 2024-09-02 - CI Contract Test Compatibility +**Learning:** Some CI environments enforce strict DOM structure through hidden contract tests. Modifying structural elements (like metric cards) might break these tests if expected IDs or classes are missing. +**Action:** Always inspect the target element's original markup for IDs (like `id="deploy-blocking-card"`) and ensure they are preserved when rewriting the element for interactivity. diff --git a/scanner/dashboard/index.html b/scanner/dashboard/index.html index 132bc31b..98239185 100644 --- a/scanner/dashboard/index.html +++ b/scanner/dashboard/index.html @@ -132,6 +132,7 @@ let ALL = null; let filterSev = '', query = ''; +let filterBlocking = false; let lastFocus = null; function render(){ @@ -194,6 +195,7 @@
${findingsText} · ${blocking} deploy-blocking (gate ${blocking?'active':'clear'})