Implements advanced event stacking and grid layout

Introduces a 3-phase algorithm in `EventStackManager` for dynamic event positioning. Groups events by start time proximity to determine optimal layout.

Optimizes horizontal space by using side-by-side grid columns for simultaneous events and allowing non-overlapping events to share stack levels. Supports nested stacking for late-arriving events within grid columns.

Includes comprehensive documentation (`STACKING_CONCEPT.md`) and a visual demonstration (`stacking-visualization.html`) to explain the new layout logic. Updates event rendering to utilize the new manager and adds extensive test coverage.
This commit is contained in:
Janus C. H. Knudsen 2025-10-05 23:54:50 +02:00
parent 57bf122675
commit 2f58ceccd4
8 changed files with 4509 additions and 14 deletions

View file

@ -1962,6 +1962,58 @@
"color": "#2196f3"
}
},
{
"id": "1511",
"title": "Eftermiddags Kodning",
"start": "2025-10-01T10:30:00Z",
"end": "2025-10-01T11:00:00Z",
"type": "milestone",
"allDay": false,
"syncStatus": "synced",
"metadata": {
"duration": 180,
"color": "#2196f3"
}
},
{
"id": "1512",
"title": "Eftermiddags Kodning",
"start": "2025-10-01T11:30:00Z",
"end": "2025-10-01T12:30:00Z",
"type": "milestone",
"allDay": false,
"syncStatus": "synced",
"metadata": {
"duration": 180,
"color": "#2196f3"
}
},
{
"id": "1513",
"title": "Eftermiddags Kodning",
"start": "2025-10-01T12:00:00Z",
"end": "2025-10-01T13:00:00Z",
"type": "work",
"allDay": false,
"syncStatus": "synced",
"metadata": {
"duration": 180,
"color": "#2196f3"
}
},
{
"id": "1514",
"title": "Eftermiddags Kodning 2",
"start": "2025-10-01T12:00:00Z",
"end": "2025-10-01T13:00:00Z",
"type": "work",
"allDay": false,
"syncStatus": "synced",
"metadata": {
"duration": 180,
"color": "#2196f3"
}
},
{
"id": "152",
"title": "Team Standup",
@ -1991,8 +2043,8 @@
{
"id": "154",
"title": "Bug Fixing Session",
"start": "2025-10-02T11:00:00Z",
"end": "2025-10-02T13:00:00Z",
"start": "2025-10-02T07:00:00Z",
"end": "2025-10-02T09:00:00Z",
"type": "work",
"allDay": false,
"syncStatus": "synced",