# DECK Frontend - Changelog ## v4.1 (2026-01-15) - Security & Accessibility Update ### 🔴 Critical Fix - **XSS Protection**: Added `Utils.escapeHtml()` function to sanitize all user-generated content before rendering to DOM - Applied in: DetailPanel, GridView, TreeView, GraphView sidebar - Prevents script injection from malicious tag names, descriptions, or refs ### 🟡 Important Fixes #### Responsive CSS Added 3 breakpoints for mobile compatibility: ```css @media (max-width: 1024px) - Tablet adjustments @media (max-width: 768px) - Mobile: hides left-panel, detail-panel fullwidth @media (max-width: 480px) - Small screens: hides graph-sidebar ``` #### Accessibility (WCAG 2.1) - `aria-label` on all interactive elements (inputs, selects, buttons) - `aria-pressed` on toggle buttons (SEL, base buttons, view tabs) - `aria-expanded` on tree headers - `role` attributes: button, group, dialog, navigation, complementary - `tabindex="0"` on clickable non-button elements - `aria-live="polite"` on dynamic content areas #### Focus Styles ```css .btn:focus-visible .base-btn:focus-visible .view-tab:focus-visible .group-btn:focus-visible .lang-select:focus-visible .lib-icon:focus-visible .card:focus-visible .tree-header:focus-visible .tree-item:focus-visible .tag-chip:focus-visible .detail-close:focus-visible .modal-close:focus-visible ``` #### Memory Leak Fix - `GraphView.unmount()` now properly cleans up: - Stops D3 force simulation - Removes SVG element from DOM - Nullifies references - Called at start of `render()` to prevent accumulation #### State Management - Changed `State.set()` from `Object.assign()` to spread operator for immutability - Prevents mutation bugs with nested Sets (graphFilters) --- ## v4.0 (2026-01-15) - Clean Modular Architecture ### Structure - Single HTML file with clear separation markers - CSS: lines 30-560 (CSS_START/CSS_END) - HTML: lines 560-680 (structure only) - JS: lines 680-1614 (JS_START/JS_END) ### Extraction Commands ```bash # Extract CSS (pure, without