DECK Frontend v4.1 - Security & Accessibility Update
Changes: - XSS protection with escapeHtml() utility - Responsive CSS (3 mobile breakpoints) - Full accessibility: aria-labels, roles, focus-visible - GraphView memory leak fix - Immutable state management Files: - deck-v4.1.html: Production-ready monolith - CHANGELOG.md: Version history and documentation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
109
deck-frontend/CHANGELOG.md
Normal file
109
deck-frontend/CHANGELOG.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# 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 <style> tags)
|
||||
sed -n '/CSS_START/,/CSS_END/{//d;p}' deck.html > styles.css
|
||||
|
||||
# Extract JS (pure, without <script> tags)
|
||||
sed -n '/JS_START/,/JS_END/{//d;p}' deck.html > app.js
|
||||
```
|
||||
|
||||
### JavaScript Architecture
|
||||
```
|
||||
CONFIG (constants) → API endpoints, schemas, colors
|
||||
STATE (reactive) → Application state management
|
||||
UTILS (pure functions) → DOM helpers, escapeHtml, debounce
|
||||
API (client) → PostgREST communication
|
||||
FILTER (declarative) → Search, group, library filtering
|
||||
COMPONENTS → GroupsBar, LibrariesPanel, DetailPanel
|
||||
VIEWS → GridView, TreeView, GraphView
|
||||
APP (controller) → Main application logic
|
||||
```
|
||||
|
||||
### CSS Architecture
|
||||
- BEM naming convention (.card__name, .btn--active)
|
||||
- CSS custom properties for theming
|
||||
- 6 organized sections: Variables, Reset, Layout, Components, Views, Utilities
|
||||
|
||||
---
|
||||
|
||||
## v3.1 (2026-01-15)
|
||||
|
||||
### Fixes
|
||||
- Added `flex-shrink: 0` to `.lib-icon` to prevent compression
|
||||
- Fixed duplicate `$` function names (querySelector vs querySelectorAll)
|
||||
- Fixed `i` typo (should be `if`) in GroupsBar.render
|
||||
|
||||
---
|
||||
|
||||
## v3.0 (2026-01-15)
|
||||
|
||||
### Initial Modular Version
|
||||
- Reorganized from legacy code
|
||||
- Added section markers for extraction
|
||||
- Implemented all 9 bases (HST, FLG, ITM, LOC, PLY, MTH, ATC, MAIL, CHAT)
|
||||
- D3.js lazy loading for graph view
|
||||
- PostgREST API integration with schema headers
|
||||
1584
deck-frontend/deck-v4.1.html
Normal file
1584
deck-frontend/deck-v4.1.html
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user