# UI_ACTION_SHORTCUTS_V1_DESIGN.md ## 1. Doel en scope Action shortcuts v1 maken de bestaande functiebalk sneller bruikbaar zonder de UI-semantiek te veranderen. Het doel is niet om nieuwe acties te ontwerpen, maar om de bestaande acties via toetsen te starten op exact dezelfde manier als via de functiebalk. Doel: - de huidige functiebalkacties sneller bereikbaar maken - de dual-pane workflow dichter bij een Midnight Commander-achtige bediening brengen - een bruikbare eerste set bieden die ook op Mac praktisch inzetbaar blijft In scope: - keyboard-start van bestaande functiebalkacties - centrale shortcut-dispatch op basis van `activePane` en huidige selectie - veilige focusguards zodat invoervelden en modals niet worden verstoord - voorbereiding op latere visuele hints in de functiebalk Out of scope: - geen backendwijzigingen - geen nieuwe acties buiten de bestaande functiebalk - geen globale override van agressieve browser- of OS-shortcuts - geen nieuwe dependencies - geen extra keyboardnavigatie buiten action-triggering --- ## 2. Acties in scope Deze ontwerpstap werkt uit voor: - `View` - `Edit` - `Copy` - `Move` - `Rename` - `MKdir` - `Delete` Semantisch uitgangspunt: - elke shortcut triggert exact dezelfde action-handler als de corresponderende knop in de functiebalk - enabled/disabled logica blijft centraal en wordt niet dubbel geïmplementeerd in aparte keyboardlogica - als een knop in de huidige context disabled zou zijn, doet de shortcut geen destructieve fallback en start geen alternatieve flow --- ## 3. Toetsmapping ### Primaire mapping: F3 t/m F8 Voorgestelde primaire mapping: - `F3` = `View` - `F4` = `Edit` - `F5` = `Copy` - `F6` = `Move` - `F7` = `MKdir` - `F8` = `Delete` Aanvullend: - `Rename` krijgt in v1 geen vaste F-toets, omdat de klassieke mapping al dicht bezet is en `Rename` functioneel dichter bij contextactie dan bij de vaste MC-kern ligt - `Rename` krijgt daarom een aparte, browser-veilige alternatieve shortcut ### Mac-vriendelijke alternatieven F-toetsen zijn op Mac-toetsenborden vaak verborgen achter systeemfuncties of alleen bruikbaar met extra modifiers. Daarom krijgt v1 ook expliciete alternatieven. Voorstel: - `Alt+3` = `View` - `Alt+4` = `Edit` - `Alt+5` = `Copy` - `Alt+6` = `Move` - `Alt+7` = `MKdir` - `Alt+8` = `Delete` - `Alt+R` = `Rename` Motivatie: - numerieke mapping blijft mentaal gekoppeld aan `F3`-`F8` - `Alt+R` is kort, semantisch duidelijk en minder conflictgevoelig dan veel andere browsercombinaties - deze combinaties zijn compacter en realistischer op Mac dan het afdwingen van functietoetsgebruik ### Veiligheid in browsercontext V1 kiest bewust geen mappings die sterk botsen met standaard browsergedrag, zoals: - `Cmd+L` - `Cmd+R` - `Cmd+W` - `Cmd+F` - `Cmd+S` - `Cmd+P` - `Cmd+Backspace` Ook geen pure lettershortcuts zonder modifier, omdat die te snel botsen met focus, tekstinvoer en toekomstige editorinteractie. Belangrijk: - `F3`-`F8` worden alleen gebruikt als extra shortcutlaag waar de browser/het OS dit toelaat - de `Alt+...` varianten vormen de praktische browservriendelijke fallback --- ## 4. Focusregels Shortcuts zijn alleen actief als de UI in browse-/paneelmodus zit en focus niet in een interactieve control staat. ### Shortcuts actief wanneer - focus op `body`, paneelcontainer of bestandslijst staat - geen modal met eigen invoer open is - geen wildcard-popup open is - geen editor-textarea focus heeft - geen inputcontrol focus heeft ### Shortcuts niet actief wanneer focus in - `input` - `textarea` - `select` - `button` - checkbox - elk element met `contenteditable` ### Extra modalregels - als `View` modal open is: geen action shortcuts voor onderliggende paneelacties - als `Edit` modal open is: geen action shortcuts voor onderliggende paneelacties - als wildcard popup open is: action shortcuts uitgeschakeld behalve popup-eigen `Enter`/`Escape` ### Browser/OS-collision mitigatie - alleen exact ondersteunde combinaties afvangen - geen brede `preventDefault()` voor andere toetsen - bij twijfel niet afvangen; browser/OS behoudt dan prioriteit --- ## 5. Relatie met functiebalk en selectie Kernregel: - keyboard shortcuts gebruiken exact dezelfde centrale action-functies als de functiebalkknoppen Dat betekent: - `View` shortcut roept dezelfde open-viewer flow aan als de `View` knop - `Edit` shortcut roept dezelfde open-editor flow aan als de `Edit` knop - `Copy`/`Move` shortcut gebruiken dezelfde batch-startlogica als de bestaande knoppen - `Rename`, `MKdir`, `Delete` shortcut gebruiken dezelfde validatie- en UI-flow als de bestaande knoppen ### Geen selectie - `View`: geen actie - `Edit`: geen actie - `Copy`: geen actie - `Move`: geen actie - `Rename`: geen actie - `MKdir`: wel toegestaan, op actief paneel - `Delete`: geen actie ### Exact 1 selectie - `View`: alleen voor ondersteunde file - `Edit`: alleen voor ondersteunde tekstfile - `Copy`: alleen als selectie backend-geldig is - `Move`: alleen als selectie backend-geldig is - `Rename`: toegestaan - `MKdir`: toegestaan - `Delete`: toegestaan ### Meerdere selecties - `View`: niet toegestaan - `Edit`: niet toegestaan - `Copy`: toegestaan als alle geselecteerde items voldoen aan huidige backend-scope - `Move`: toegestaan als alle geselecteerde items voldoen aan huidige backend-scope - `Rename`: niet toegestaan - `MKdir`: toegestaan - `Delete`: toegestaan ### Directory/file-selectie - zolang backend `copy/move` file-only is: - selectie die directories bevat blokkeert `Copy` - selectie die directories bevat blokkeert `Move` - `View` en `Edit` blokkeren directories - `Delete` volgt bestaande backendregels - `Rename` volgt bestaande single-selection regel ### Disabled gedrag bij toetsgebruik - geen verborgen fallback - geen half-uitgevoerde actie - optioneel compacte feedback via bestaande statusregel, maar v1 mag ook stil no-op blijven als dit consistenter is met huidige knopdisabled-semantiek Voorkeur v1: - als actie disabled is, shortcut doet niets en toont hooguit compacte statusfeedback als dat al in bestaande UI-patterns past --- ## 6. UX-regels ### Visuele hints in de functiebalk Voorstel v1: - subtiele shortcut-hints per knop toelaten, maar klein houden - voorbeeld later mogelijk: - `F3 View` - `F4 Edit` - `F5 Copy` - Mac-alternatieven hoeven niet permanent zichtbaar in de hoofdbalk om ruis te vermijden Voor deze ontwerpstap geldt: - de functiebalk moet voorbereid zijn op zulke hints - de daadwerkelijke implementatie kan starten zonder direct alle hints zichtbaar te maken ### Niet-beschikbare acties - als actie disabled is in de huidige context, mag de shortcut die actie niet forceren - gedrag moet gelijk zijn aan klikken op een disabled knop: er gebeurt functioneel niets ### Unsupported acties - `View` of `Edit` op niet-ondersteunde filetypes: - shortcut opent geen alternatieve flow - zelfde fout- of disabled-behandeling als via knop - `Copy`/`Move` op directoryselectie terwijl backend dit niet ondersteunt: - zelfde blokkade als via knop ### Consistentie-eis - shortcuts zijn geen tweede API-laag - de functiebalk blijft leidend; keyboard is alleen een alternatieve triggerroute --- ## 7. Impactanalyse Waarschijnlijk te wijzigen frontendbestanden: - `webui/html/app.js` - `webui/html/index.html` - `webui/html/style.css` - `webui/backend/tests/golden/test_ui_smoke_golden.py` ### Verwachte code-impact `app.js`: - uitbreiding van centrale keyboard dispatcher - mappingtabel voor action shortcuts - centrale guards voor modal/input/focusstatus - hergebruik van bestaande action handlers, niet dupliceren `index.html`: - mogelijk kleine markup-aanpassingen om shortcutlabels in functiebalk te kunnen tonen - geen structurele layoutwijziging nodig `style.css`: - eventueel compacte styling voor functietoetsbadges of hints - geen redesign nodig ### Regressierisico Belangrijkste risico's: - conflicten met bestaande keyboard navigation (`Tab`, `Arrow`, `Space`, `Escape`) - shortcuts vuren terwijl input of modal focus heeft - dubbele actie-aanroep als keyboard en knoplogica niet centraal gedeeld worden - browser/OS-shortcuts per platform gedragen zich anders Mitigatie: - centrale `shouldHandleActionShortcut(event)` guard - bestaande knophandlers of action-functions als single source of truth - alleen exacte combinaties afvangen - platform-onafhankelijke fallbacklogica beperkt en expliciet houden --- ## 8. Teststrategie ### Smoke/regressietests Geautomatiseerd uit te breiden waar passend: - UI smoke test blijft controleren dat functiebalk aanwezig is - optioneel extra check dat knoplabels of data-attributes voor actions stabiel aanwezig zijn - geen zware browser-E2E vereist voor deze stap ### Handmatige validatie Essentieel bij implementatie: - `F3`-`F8` triggeren de juiste acties waar ondersteund - `Alt+3`-`Alt+8` werken als Mac-vriendelijke fallback - `Alt+R` triggert `Rename` - shortcuts werken alleen op actief paneel - shortcuts respecteren disabled toestand bij: - geen selectie - meerdere selecties - directoryselectie - unsupported filetypes - editor modal, viewer modal en wildcard popup blokkeren onderliggende action shortcuts correct - bestaande keyboard navigation blijft intact ### Regressiechecks - klikgedrag in de bestandslijst blijft intact - current-row navigatie blijft intact - wildcard popup shortcuts blijven werken - functiebalkknoppen en keyboardtrigger geven identiek resultaat