Files
webmanager-mvp/project_docs/UI_KEYBOARD_V1_DESIGN.md
2026-03-11 11:59:53 +01:00

4.8 KiB

UI_KEYBOARD_V1_DESIGN.md

1) Doel

Keyboard navigation v1 maakt de huidige dual-pane UI efficiënter voor snelle bestandsnavigatie en selectie, in lijn met een Midnight Commander-achtige workflow: minder muisgebruik, voorspelbare focus, snelle pane-switching.

In scope (v1)

  • Tab wisselt actief paneel.
  • ArrowUp / ArrowDown verplaatst current row in actief paneel.
  • Enter opent de map van de current row als die row een directory is.
  • Space togglet selectie van current row.
  • Escape wist selectie in actief paneel.

Out of scope (v1)

  • Geen F3/F4 viewer/editor.
  • Geen F5/F6/F7/F8 keyboard-acties.
  • Geen shift/ctrl/insert multi-selectgedrag.
  • Geen globale override van onbetrouwbare browser-shortcuts.

2) Scope Keyboard v1 (klein en veilig)

Shortcutset

  • Tab:
    • als focus niet in een input/control zit: wissel activePane (left <-> right).
    • default browser tab-navigatie blokkeren in dit geval.
  • ArrowUp / ArrowDown:
    • beweeg currentRowIndex binnen zichtbare lijst van actief paneel.
    • clamp tussen 0 en items.length - 1.
    • geen wrap-around in v1.
  • Enter:
    • als current row directory is: navigeer naar die directory.
    • als current row file is: geen open; behoud selectiegedrag (geen viewer).
  • Space:
    • toggle selectie op current row item.
  • Escape:
    • clear alle geselecteerde items in actief paneel.

3) State model

Per paneel (left/right) expliciet onderscheid:

  • currentPath: huidige padcontext.
  • entries: gecombineerde zichtbare lijst (dirs/files) in rendervolgorde.
  • currentRowIndex: keyboard-cursorpositie binnen entries.
  • selectedItems: geselecteerde items (set/list op pad).

Globaal:

  • activePane: left of right.

Semantiek

  • current row is focus/cursor voor keyboardnavigatie.
  • selected items is actiedoel (rename/delete/copy/move-regels blijven gelden).
  • active pane bepaalt waar keyboardinput op werkt.

Bij navigatie

  • ArrowUp/Down verandert alleen currentRowIndex in actief paneel.
  • Geen wijziging in ander paneel.

Bij directory openen (Enter op directory)

  • Navigeer in actief paneel naar directory.
  • Wis selectie in actief paneel.
  • Reset currentRowIndex naar eerste item (of null bij lege lijst).
  • Inactief paneel blijft ongewijzigd.

Bij leeg paneel

  • currentRowIndex = null.
  • ArrowUp/Down/Enter/Space doen niets.
  • Escape blijft selectie-clear uitvoeren (idempotent).

4) UX-regels

Focusveiligheid

Shortcuts zijn alleen actief als event target geen interactieve invoercontrol is:

  • input, textarea, select, button, checkbox, of contenteditable.

Wanneer shortcuts actief zijn

  • Alleen op documentniveau handler als focus op lijst/paneelcontainer of body staat.
  • Als gebruiker expliciet in form/control werkt, geen keyboard-capturing.

Visualisatie

  • current row krijgt aparte, subtiele cursorstijl (is-current-row).
  • selected rows behouden bestaande selectiehighlight (is-selected).
  • Row kan beide states tegelijk hebben: current + selected.
  • activePane blijft via border/focusrand zichtbaar; geen sterke achtergrondwissel.

5) Impactanalyse

Waarschijnlijk te wijzigen:

  • webui/html/app.js
    • keyboard event handling
    • state uitbreiding met currentRowIndex
    • paneelgerichte row-navigation helpers
  • webui/html/style.css
    • styling voor is-current-row + gecombineerde state met is-selected
  • webui/html/index.html
    • alleen kleine aanpassingen indien nodig (bv. paneelcontainer attributes)
  • webui/backend/tests/golden/test_ui_smoke_golden.py
    • alleen bij structurele id/class wijzigingen

Regressierisico

  • Bestaande klik/selectieflow kan botsen met nieuwe current-row state.
  • Event bubbling kan dubbele selectie-updates geven.
  • Tab-handling kan browser-focusflow verstoren als te agressief.

Mitigatie:

  • Centrale shouldHandleShortcut(event) guard.
  • Centrale helpers voor setCurrentRow, toggleSelectionForCurrentRow, openCurrentRowDirectory.
  • Geen backendaanpassingen.

6) Teststrategie

Geautomatiseerd (klein)

  • Bestaande UI smoke tests behouden (/ui, panelen, assets).
  • Optioneel kleine regressietest op aanwezigheid van paneelcontainers en lijststructuur; geen zware browser-E2E in v1.

Handmatige validatie (primair voor v1)

  • Tab wisselt actief paneel betrouwbaar.
  • ArrowUp/Down beweegt current row alleen in actief paneel.
  • Enter opent alleen directory op current row.
  • Space togglet selectie op current row.
  • Escape wist selectie in actief paneel.
  • Shortcuts doen niets tijdens focus in input/checkbox/button.
  • Leeg paneel geeft geen errors bij keyboardinput.

Regressiechecks

  • Bestaand klikgedrag blijft intact:
    • checkbox toggle
    • rij-click selectie
    • directory-naam opent directory
  • Onderbalkacties blijven werken op selectedItems van actief paneel.