feat: keyboard functionaliteit cmd/option up/down toegevoegd

This commit is contained in:
kodi
2026-03-11 12:35:47 +01:00
parent 212d55ae54
commit df47bd13b3
3 changed files with 422 additions and 24 deletions
@@ -0,0 +1,147 @@
# UI_KEYBOARD_V1_1_AND_WILDCARD_DESIGN.md
## Deel 1: Keyboard Navigation v1.1 (Mac-vriendelijk)
### Doel
Keyboard v1.1 bouwt voort op v1 en maakt navigatie sneller op Mac zonder de bestaande muisflow of backendcontracten te wijzigen.
### Shortcut scope (v1.1)
- `Tab`: wissel actief paneel (`left` <-> `right`)
- `ArrowUp` / `ArrowDown`: verplaats current row
- `Enter`: open directory op current row
- `Space`: toggle selectie op current row
- `Escape`: wis selectie in actief paneel
- `Cmd + ArrowUp`: ga naar eerste rij
- `Cmd + ArrowDown`: ga naar laatste rij
- `Alt + ArrowUp`: grotere stap omhoog
- `Alt + ArrowDown`: grotere stap omlaag
### State impact
Geen nieuw globaal model nodig; uitbreiding op bestaand model:
- per paneel blijft:
- `currentPath`
- `visibleItems`
- `selectedItems`
- `currentRowIndex`
- globaal blijft:
- `activePane`
Aanvullende constante voor stapgrootte:
- `PAGE_STEP` (voorstel: 10 rijen)
### Navigatie- en scrollgedrag
- `Cmd + ArrowUp`: `currentRowIndex = 0`
- `Cmd + ArrowDown`: `currentRowIndex = visibleItems.length - 1`
- `Alt + ArrowUp`: `currentRowIndex = max(0, currentRowIndex - PAGE_STEP)`
- `Alt + ArrowDown`: `currentRowIndex = min(last, currentRowIndex + PAGE_STEP)`
- na elke indexwijziging: `scrollIntoView({ block: "nearest" })`
- bij leeg paneel: alle row-shortcuts zijn no-op
### Focusregels
Shortcuts alleen actief als focus niet in interactieve controls zit:
- `input`, `textarea`, `select`, `button`, `checkbox`, `contenteditable`
Extra voor Mac-combinaties:
- alleen onderscheppen als de combinatie exact matcht met ondersteunde shortcuts
- geen brede override van browser/system shortcuts buiten scope
### Regressierisico
- Mac key-detectie kan verschillen (`metaKey`/`altKey` + `Arrow*` combinaties)
- Overcapturing van `Alt+Arrow` kan botsen met OS/browsergedrag op sommige layouts
- Onbedoelde interactie met bestaande klikselectie bij snelle keyboard/muis mix
Mitigatie:
- centrale keyboard dispatcher met expliciete guard
- alleen exacte combinaties afvangen
- bestaande click handlers ongewijzigd laten
### Teststrategie
Geautomatiseerd (beperkt):
- bestaande UI smoke tests behouden
- optioneel kleine statische regressiecheck op paneelstructuur ongewijzigd
Handmatig (primair):
- `Cmd+ArrowUp/Down` springt naar begin/eind van lijst
- `Alt+ArrowUp/Down` springt met grote stap en scrollt correct mee
- shortcuts werken alleen in actief paneel
- shortcuts doen niets in inputs/checkboxfocus
- bestaande v1 shortcuts blijven correct werken
---
## Deel 2: Wildcard selectie ontwerp
### Doel
Snelle bulkselectie op patroon in het actieve paneel, zonder backendaanpassing.
### Trigger shortcuts
- `Shift + +` (oftewel `Shift` + `=` op veel toetsenborden): selecteer items op patroon
- `Shift + -` : deselecteer items op patroon
### Scopekeuzes (v1)
- Werkt **alleen op actief paneel**
- Werkt **alleen op zichtbare items** (`visibleItems`), niet recursief
- Werkt op **files én directories** in v1 (consistent met zichtbare lijst)
- `..` parent-entry doet niet mee
### Patroonformaat
- Glob-achtig, minimaal:
- `*` = willekeurige reeks
- `?` = één karakter
- Voorbeelden:
- `*.mkv`
- `S??E??*`
- `Project*`
### Case sensitivity
- Voorstel v1: **case-insensitive matching**
- Reden: voorspelbaarder voor eindgebruikers en sluit aan op typische file-manager verwachtingen
### Gedrag met bestaande selectie
- `Shift + +`:
- additief: matchende items worden toegevoegd aan bestaande selectie
- niet-matchende selectie blijft behouden
- `Shift + -`:
- subtractief: alleen matchende items worden uit selectie verwijderd
### Minimale popup UX
Eenvoudige modal/prompt met:
- titel: `Select by pattern` of `Deselect by pattern`
- één inputveld: patroon
- knoppen: `Apply`, `Cancel`
- compacte feedbackregel na apply:
- `N items matched, M changed`
Paneelcontext:
- popup wordt gestart vanuit actief paneel en toont dat expliciet (`Active pane: left/right`)
### Wat expliciet nog niet in scope is
- Geen regex-modus
- Geen include/exclude in één dialoog
- Geen persistente pattern-history
- Geen backend batch-endpoints
- Geen recursieve mapmatching
- Geen geavanceerde filters op size/date/type
### Regressierisico
- Shortcut-conflict met keyboard-layouts (`+` op verschillende toetsen)
- Matchlogica kan onduidelijk zijn bij verborgen bestanden (afhankelijk van `show_hidden`)
- Onbedoelde selectie van directories als gebruiker file-only verwacht
Mitigatie:
- in popup korte hinttekst over scope (`visible items in active pane`)
- heldere result-feedback (`matched/changed`)
- parent-entry expliciet uitsluiten
### Teststrategie
Geautomatiseerd:
- basis smoke: UI laadt, paneelstructuur blijft intact
- (indien kleine JS-tests bestaan) unitniveau voor glob-matcher helper
Handmatig:
- `Shift + +` selecteert matchende zichtbare items in actief paneel
- `Shift + -` deselecteert matchende geselecteerde items
- inactief paneel blijft onaangeraakt
- behavior met gemixte selectie (file+dir) is consistent
- case-insensitive matching bevestigd