docs(14-01): complete CSS containment & GPU scroll promotion plan
- SUMMARY.md with 2 tasks, 7 files, 3 min duration - STATE.md updated with plan position, metrics, decisions - ROADMAP.md updated with plan progress (2/4)
This commit is contained in:
@@ -120,7 +120,7 @@ Plans:
|
|||||||
3. Render hot paths (renderTrackRow, renderTrackItem) create zero new closures per frame — all event handling uses delegation
|
3. Render hot paths (renderTrackRow, renderTrackItem) create zero new closures per frame — all event handling uses delegation
|
||||||
4. Store notifications are batched (queueMicrotask) and components only re-render when their relevant data changes
|
4. Store notifications are batched (queueMicrotask) and components only re-render when their relevant data changes
|
||||||
5. A profiling guide documents how to diagnose performance issues using pprof (backend) and DevTools (frontend)
|
5. A profiling guide documents how to diagnose performance issues using pprof (backend) and DevTools (frontend)
|
||||||
**Plans:** 1/4 plans executed
|
**Plans:** 2/4 plans executed
|
||||||
Plans:
|
Plans:
|
||||||
- [ ] 14-01-PLAN.md — CSS containment + GPU layer promotion on all scroll containers
|
- [ ] 14-01-PLAN.md — CSS containment + GPU layer promotion on all scroll containers
|
||||||
- [ ] 14-02-PLAN.md — View caching navigation system (replace innerHTML destruction)
|
- [ ] 14-02-PLAN.md — View caching navigation system (replace innerHTML destruction)
|
||||||
@@ -144,7 +144,7 @@ Plans:
|
|||||||
| 11. Per-Library Scan Pipeline | 3/3 | Complete | 2026-03-09 | - |
|
| 11. Per-Library Scan Pipeline | 3/3 | Complete | 2026-03-09 | - |
|
||||||
| 12. Library CRUD & Data Integrity | v1.1 | 1/2 | In Progress | - |
|
| 12. Library CRUD & Data Integrity | v1.1 | 1/2 | In Progress | - |
|
||||||
| 13. Library Views & Phantom Tracks | v1.1 | 0/? | Not started | - |
|
| 13. Library Views & Phantom Tracks | v1.1 | 0/? | Not started | - |
|
||||||
| 14. Performance Optimization | 1/4 | In Progress| | - |
|
| 14. Performance Optimization | 2/4 | In Progress| | - |
|
||||||
|
|
||||||
---
|
---
|
||||||
*Roadmap created: 2026-02-27*
|
*Roadmap created: 2026-02-27*
|
||||||
|
|||||||
+13
-9
@@ -23,10 +23,10 @@ See: .planning/PROJECT.md (updated 2026-03-08)
|
|||||||
## Current Position
|
## Current Position
|
||||||
|
|
||||||
Phase: 14 — Performance Optimization
|
Phase: 14 — Performance Optimization
|
||||||
Plan: 1 of 4 in Phase (Plan 02 complete)
|
Plan: 2 of 4 in Phase (Plans 01, 02 complete)
|
||||||
Status: Plan 14-02 complete — view caching navigation system
|
Status: Plan 14-01 complete — CSS containment & GPU scroll promotion
|
||||||
Progress: ████████████████░░░░ Phase 14 in progress (1/4 plans)
|
Progress: ████████████████░░░░ Phase 14 in progress (2/4 plans)
|
||||||
Last activity: 2026-03-14 — Completed 14-02 view caching navigation
|
Last activity: 2026-03-14 — Completed 14-01 CSS containment & GPU scroll promotion
|
||||||
|
|
||||||
### Phase Overview
|
### Phase Overview
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ Last activity: 2026-03-14 — Completed 14-02 view caching navigation
|
|||||||
| 11. Per-Library Scan Pipeline | Complete (3/3 plans) ✅ |
|
| 11. Per-Library Scan Pipeline | Complete (3/3 plans) ✅ |
|
||||||
| 12. Library CRUD & Data Integrity | In progress (1/2 plans) |
|
| 12. Library CRUD & Data Integrity | In progress (1/2 plans) |
|
||||||
| 13. Library Views & Phantom Tracks | Not started |
|
| 13. Library Views & Phantom Tracks | Not started |
|
||||||
| 14. Performance Optimization | In progress (1/4 plans) |
|
| 14. Performance Optimization | In progress (2/4 plans) |
|
||||||
|
|
||||||
## Performance Metrics
|
## Performance Metrics
|
||||||
|
|
||||||
@@ -58,6 +58,7 @@ Last activity: 2026-03-14 — Completed 14-02 view caching navigation
|
|||||||
| Phase 11-02 P02 | 4 min | 2 tasks | 2 files |
|
| Phase 11-02 P02 | 4 min | 2 tasks | 2 files |
|
||||||
| Phase 12-01 P01 | 6 min | 2 tasks | 6 files |
|
| Phase 12-01 P01 | 6 min | 2 tasks | 6 files |
|
||||||
| Phase 14-02 P02 | 1 min | 1 task | 1 file |
|
| Phase 14-02 P02 | 1 min | 1 task | 1 file |
|
||||||
|
| Phase 14-01 P01 | 3 min | 2 tasks | 7 files |
|
||||||
|
|
||||||
## Accumulated Context
|
## Accumulated Context
|
||||||
|
|
||||||
@@ -128,6 +129,9 @@ Decisions from v1.0 are archived in PROJECT.md Key Decisions table. Key patterns
|
|||||||
| Primary views cached, detail views ephemeral | Detail views depend on entity IDs that change; caching would show stale content |
|
| Primary views cached, detail views ephemeral | Detail views depend on entity IDs that change; caching would show stale content |
|
||||||
| Inline style.display toggle over CSS class | Simpler, no specificity issues, empty string restores natural display value |
|
| Inline style.display toggle over CSS class | Simpler, no specificity issues, empty string restores natural display value |
|
||||||
| viewCache bounded at 6 entries | One per primary view — negligible memory since data is already in store caches |
|
| viewCache bounded at 6 entries | One per primary view — negligible memory since data is already in store caches |
|
||||||
|
| contain: strict only on .main-panel | Has explicit dimensions (flex: 1, overflow: hidden); elsewhere use layout style to not break flex |
|
||||||
|
| will-change: transform only on scroll containers | Not on :host — avoids wasting GPU memory on non-scrolling elements |
|
||||||
|
| content-visibility: auto on album cards with contain-intrinsic-size | Prevents layout shift during scroll while skipping off-screen rendering |
|
||||||
|
|
||||||
### Warnings (carry forward)
|
### Warnings (carry forward)
|
||||||
|
|
||||||
@@ -155,9 +159,9 @@ Decisions from v1.0 are archived in PROJECT.md Key Decisions table. Key patterns
|
|||||||
### Last Session
|
### Last Session
|
||||||
|
|
||||||
**Date:** 2026-03-14
|
**Date:** 2026-03-14
|
||||||
**What happened:** Executed Phase 14, Plan 02 — replaced innerHTML navigation with view caching system. Primary views (tracks, albums, artists, genres, playlists, settings) are now created once and kept in DOM with display toggle instead of destruction/recreation.
|
**What happened:** Executed Phase 14, Plan 01 — added CSS containment to app shell layout boundaries and GPU-composited scrolling to all 6 scroll-heavy components with content-visibility on album cards.
|
||||||
**Where we stopped:** Completed 14-02-PLAN.md — Plan 02 of Phase 14 complete
|
**Where we stopped:** Completed 14-01-PLAN.md — Plan 01 of Phase 14 complete (Plans 01, 02 done)
|
||||||
**Next action:** Execute remaining Phase 14 plans (14-01 CSS containment, 14-03 store optimizations, 14-04 rendering optimizations)
|
**Next action:** Execute remaining Phase 14 plans (14-03 store optimizations, 14-04 rendering optimizations)
|
||||||
|
|
||||||
---
|
---
|
||||||
*State initialized: 2026-02-27*
|
*State initialized: 2026-02-27*
|
||||||
@@ -170,4 +174,4 @@ Decisions from v1.0 are archived in PROJECT.md Key Decisions table. Key patterns
|
|||||||
| 18 | add multi-column metadata display to playlist-details | 2026-03-08 | ce23177 | [18-add-multi-column-metadata-display-to-pla](./quick/18-add-multi-column-metadata-display-to-pla/) |
|
| 18 | add multi-column metadata display to playlist-details | 2026-03-08 | ce23177 | [18-add-multi-column-metadata-display-to-pla](./quick/18-add-multi-column-metadata-display-to-pla/) |
|
||||||
|
|
||||||
Last activity: 2026-03-08 - Completed quick task 18: add multi-column metadata display to playlist-details
|
Last activity: 2026-03-08 - Completed quick task 18: add multi-column metadata display to playlist-details
|
||||||
*Last updated: 2026-03-14 — Completed 14-02-PLAN.md (Phase 14 Plan 02 complete)*
|
*Last updated: 2026-03-14 — Completed 14-01-PLAN.md (Phase 14 Plan 01 complete)*
|
||||||
|
|||||||
@@ -0,0 +1,103 @@
|
|||||||
|
---
|
||||||
|
phase: 14-performance-optimization
|
||||||
|
plan: 01
|
||||||
|
subsystem: ui
|
||||||
|
tags: [css-containment, gpu-compositing, will-change, content-visibility, scroll-performance]
|
||||||
|
|
||||||
|
# Dependency graph
|
||||||
|
requires: []
|
||||||
|
provides:
|
||||||
|
- CSS containment on all app shell layout boundaries
|
||||||
|
- GPU-composited scrolling on all 6 scroll-heavy components
|
||||||
|
- content-visibility auto on album cards for off-screen rendering skip
|
||||||
|
affects: [14-performance-optimization]
|
||||||
|
|
||||||
|
# Tech tracking
|
||||||
|
tech-stack:
|
||||||
|
added: []
|
||||||
|
patterns: [CSS contain for layout isolation, will-change transform for GPU scroll promotion, content-visibility auto for off-screen rendering skip]
|
||||||
|
|
||||||
|
key-files:
|
||||||
|
created: []
|
||||||
|
modified:
|
||||||
|
- frontend/index.css
|
||||||
|
- frontend/src/components/cover-grid/cover-grid-styles.ts
|
||||||
|
- frontend/src/components/track-list/track-list.ts
|
||||||
|
- frontend/src/components/queue-panel/queue-panel.ts
|
||||||
|
- frontend/src/components/artists-view/artists-view.ts
|
||||||
|
- frontend/src/components/genres-view/genres-view.ts
|
||||||
|
- frontend/src/components/playlist-view/playlist-view.ts
|
||||||
|
|
||||||
|
key-decisions:
|
||||||
|
- "contain: strict on .main-panel (has explicit dimensions), layout style elsewhere (avoids breaking flex)"
|
||||||
|
- "will-change: transform only on scroll containers (not :host) to avoid wasting GPU memory"
|
||||||
|
- "content-visibility: auto on album cards with contain-intrinsic-size hint to prevent layout shift"
|
||||||
|
|
||||||
|
patterns-established:
|
||||||
|
- "CSS containment pattern: :host gets contain: layout style; scroll container gets contain: paint + will-change: transform"
|
||||||
|
- "content-visibility: auto with contain-intrinsic-size for cards in virtualized grids"
|
||||||
|
|
||||||
|
requirements-completed: [PERF-SCROLL-01, PERF-SCROLL-02]
|
||||||
|
|
||||||
|
# Metrics
|
||||||
|
duration: 3min
|
||||||
|
completed: 2026-03-14
|
||||||
|
---
|
||||||
|
|
||||||
|
# Phase 14 Plan 01: CSS Containment & GPU Scroll Promotion Summary
|
||||||
|
|
||||||
|
**CSS containment on app shell boundaries + GPU-composited scrolling on all 6 scroll-heavy components with content-visibility on album cards**
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
|
||||||
|
- **Duration:** 3 min
|
||||||
|
- **Started:** 2026-03-14T17:43:01Z
|
||||||
|
- **Completed:** 2026-03-14T17:46:24Z
|
||||||
|
- **Tasks:** 2
|
||||||
|
- **Files modified:** 7
|
||||||
|
|
||||||
|
## Accomplishments
|
||||||
|
- App shell layout boundaries (content-area, main-panel, sidebar, bottom-bar) isolated with CSS containment to prevent cross-boundary layout recalculation
|
||||||
|
- All 6 scroll-heavy components (cover-grid, track-list, queue-panel, artists-view, genres-view, playlist-view) now have CSS containment on :host and GPU layer promotion on scroll containers
|
||||||
|
- Album cards skip rendering when off-screen via content-visibility: auto with intrinsic size hints
|
||||||
|
|
||||||
|
## Task Commits
|
||||||
|
|
||||||
|
Each task was committed atomically:
|
||||||
|
|
||||||
|
1. **Task 1: Add CSS containment to app shell layout boundaries** - `efa06f7` (perf)
|
||||||
|
2. **Task 2: Add GPU promotion and containment to all scroll containers** - `ac8a52e` (perf)
|
||||||
|
|
||||||
|
## Files Created/Modified
|
||||||
|
- `frontend/index.css` - CSS containment on .content-area, .main-panel, .main-panel > *, sidebar, .bottom-bar
|
||||||
|
- `frontend/src/components/cover-grid/cover-grid-styles.ts` - contain + will-change on scroll container, content-visibility on album cards
|
||||||
|
- `frontend/src/components/track-list/track-list.ts` - contain on :host, contain + will-change on lit-virtualizer
|
||||||
|
- `frontend/src/components/queue-panel/queue-panel.ts` - contain on :host, contain + will-change on lit-virtualizer
|
||||||
|
- `frontend/src/components/artists-view/artists-view.ts` - contain on :host, contain + will-change on grid scroll container
|
||||||
|
- `frontend/src/components/genres-view/genres-view.ts` - contain on :host, contain + will-change on grid scroll container
|
||||||
|
- `frontend/src/components/playlist-view/playlist-view.ts` - contain on :host, contain + will-change on playlist-list
|
||||||
|
|
||||||
|
## Decisions Made
|
||||||
|
- Used `contain: strict` only on `.main-panel` (has explicit flex: 1 + overflow: hidden), used `contain: layout style` elsewhere to avoid breaking flex layouts
|
||||||
|
- Applied `will-change: transform` only to actual scroll containers (not :host elements) to avoid wasting GPU memory on non-scrolling elements
|
||||||
|
- Added `content-visibility: auto` with `contain-intrinsic-size` hints on album cards to prevent layout shift during scroll
|
||||||
|
|
||||||
|
## Deviations from Plan
|
||||||
|
|
||||||
|
None - plan executed exactly as written.
|
||||||
|
|
||||||
|
## Issues Encountered
|
||||||
|
None
|
||||||
|
|
||||||
|
## User Setup Required
|
||||||
|
None - no external service configuration required.
|
||||||
|
|
||||||
|
## Next Phase Readiness
|
||||||
|
- CSS containment foundation in place for all components
|
||||||
|
- Ready for Plan 02 (next performance optimization plan in phase 14)
|
||||||
|
|
||||||
|
---
|
||||||
|
*Phase: 14-performance-optimization*
|
||||||
|
*Completed: 2026-03-14*
|
||||||
|
|
||||||
|
## Self-Check: PASSED
|
||||||
Reference in New Issue
Block a user