# Search v1 ## 1. Doel Search voegt nu waarde toe omdat de app inmiddels bruikbaar is als dual-pane file manager, maar nog volledig afhankelijk is van handmatige navigatie. Bij grotere directory trees kost dat te veel stappen. Search moet passen binnen de bestaande dual-pane workflow: - zoeken gebeurt vanuit het actieve paneel - resultaten helpen navigatie versnellen - de browse-workspace blijft het primaire werkvlak - search is ondersteunend, geen nieuw hoofdscherm ## 2. Scope Search v1 ondersteunt: - zoeken op bestandsnaam - zoeken op mapnaam - case-insensitive substring matching Search v1 ondersteunt niet: - full-text content search - indexer of achtergrondindexering - regex - geavanceerde querytaal - saved searches - fuzzy ranking Aanbevolen zoekmodel voor v1: - eenvoudige naamzoeking met substring match - optioneel later uit te breiden naar glob of prefix filters, maar niet in deze slice ## 3. Zoekbereik Mogelijke richtingen: - zoeken vanaf `current path` - zoeken vanaf de root van het actieve paneel Aanbeveling voor v1: - standaard zoeken vanaf `current path` van het actieve paneel Reden: - laag regressierisico - voorspelbaar voor de gebruiker - technisch goedkoper - minder kans op trage scans van volledige opslagvolumes - sluit goed aan op de huidige paneel-context Gedrag: - `activePane` bepaalt de zoekcontext - de query zoekt recursief onder `currentPath` van dat paneel - resultaten horen dus altijd bij de context van het actieve paneel op het moment van starten Later uitbreidbaar: - een simpele scope-toggle `Current folder tree` versus `Current root` ## 4. UI-richting Aanbevolen v1-richting: - aparte compacte search-modal - geen verstoring van de dual-pane layout Startmechanisme: - alleen keyboard shortcut - geen zichtbare knop in topbar - geen zichtbare knop in functiebalk Aanbevolen shortcut voor v1: - Mac: `Cmd+Shift+F` - Windows/Linux: `Ctrl+Shift+F` Reden: - sluit goed aan op bestaande zoekverwachtingen - vermijdt extra visuele drukte in de UI - vermijdt conflict met bestaande F1-F8 functiebalklogica Modal-inhoud: - titel `Search` - actieve paneelcontext tonen - zoekveld - korte contextregel: `Searching under: ` - resultatenlijst onder het invoerveld Gedrag bij resultaatklik: - klik op resultaat opent de parentlocatie in het actieve paneel - en selecteert het gevonden item Voor directories: - resultaatklik navigeert naar die directory in het actieve paneel Voor files: - resultaatklik navigeert naar de parent directory in het actieve paneel - en selecteert de file Dit sluit aan op de bestaande browse- en selectieflow zonder extra viewer/open-semantiek. ## 5. Resultaatsemantiek Minimale velden per resultaat: - `name` - `path` - `type` (`file` of `directory`) - `parent_path` - `root` of equivalent contextveld Weergave in v1: - primaire regel: naam - secundaire regel: parent path of volledig path - compacte type-indicatie (`file` / `dir`) Aanbevolen presentatie: - naam prominent - parent path als muted secundaire regel - type als kleine badge of label ## 6. Backend-impact Aanbevolen endpoint: - `GET /api/search?path=...&query=...` Waarom een nieuw endpoint nodig is: - browse-endpoint is contractueel directory listing - search vereist recursieve traversal en resultaatlimieten - aparte fout- en limietsemantiek is logisch Securitymodel: - `path` moet via bestaande `path_guard` - zoekroot moet binnen whitelist vallen - traversal en invalid root alias blijven via bestaande validatie lopen - geen vrije scan buiten geconfigureerde roots Implementatierichting: - backend scant recursief vanaf gevalideerde startdirectory - vergelijkt naam case-insensitive met query - retourneert gemaximeerde lijst van matches ## 7. Performance en risico Grootste risico: - diepe directory trees op grote volumes Aanbevolen v1-beheersing: - result limit, bijvoorbeeld `100` - optionele harde scan limit op aantal bezochte entries - geen parallelle scanner - geen indexer Aanbevolen gedrag bij limiet: - response bevat `truncated: true/false` - als limiet bereikt is, toon alleen eerste resultaten Timeouts: - geen aparte timeoutsemantiek nodig in eerste slice als result-limiet en current-path scope klein blijven ## 8. Regressierisico Belangrijkste risico’s: - browse-flow mag niet veranderen - selectieflow mag niet onverwacht resetten buiten het actieve paneel - keyboardflow mag niet botsen met bestaande shortcuts - modal focus moet bestaande paneelnavigatie blokkeren zolang search open is Beperkende keuzes die risico laag houden: - aparte modal - zoeken alleen op naam - starten vanuit actief paneel - resultaten openen in bestaand paneelgedrag ## 9. Teststrategie Backend golden tests: - lege resultaatlijst - simpele file match - simpele directory match - search onder current path - traversal geblokkeerd - path not found - invalid root alias - result limit / truncated gedrag UI smoke/regressietests: - search-modal container aanwezig - zoekveld aanwezig - resultaatlijst container aanwezig - keyboard wiring voor `Cmd/Ctrl+Shift+F` Handmatige validatie: - zoeken vanuit links paneel raakt alleen linkse context - zoeken vanuit rechts paneel raakt alleen rechtse context - resultaatklik navigeert correct - resultaatklik op directory opent directory - resultaatklik op file opent parent + selecteert file - `Escape` sluit modal ## 10. Aanbeveling Aanbevolen v1-richting met laag regressierisico: - nieuw backend-endpoint `GET /api/search` - recursieve naamzoeking - scope = `currentPath` van actief paneel - case-insensitive substring match - harde result limit, bijvoorbeeld `100` - aparte compacte search-modal - resultaatklik hergebruikt bestaande paneelnavigatie en selectie Niet aanbevelen voor v1: - root-brede zoeking als default - content search - indexer - regex - aparte zoekpagina Dit levert een bruikbare eerste search op zonder de huidige dual-pane file manager semantiek te verstoren.