diff --git a/src/components/BoardSelector.svelte b/src/components/BoardSelector.svelte index 64fd5e0..622ae29 100644 --- a/src/components/BoardSelector.svelte +++ b/src/components/BoardSelector.svelte @@ -9,10 +9,7 @@ let { selected, onselect }: Props = $props(); - const esp32Boards = boards.filter((b) => b.family === "esp32"); - const espBoards = boards.filter((b) => b.family === "esp32s3"); - const rpBoards = boards.filter((b) => b.family === "rp2040"); - const nrfBoards = boards.filter((b) => b.family === "nrf52840"); + let query = $state(""); function badgeText(board: BoardDef): string { switch (board.flashMethod) { @@ -35,76 +32,142 @@ return "text-warn"; } } + + function matches(board: BoardDef, q: string): boolean { + const needle = q.trim().toLowerCase(); + if (!needle) return true; + const haystack = [ + board.name, + board.mcu, + board.radio, + board.family, + badgeText(board), + board.notes ?? "", + ] + .join(" ") + .toLowerCase(); + return haystack.includes(needle); + } + + const esp32Boards = $derived(boards.filter((b) => b.family === "esp32" && matches(b, query))); + const espBoards = $derived(boards.filter((b) => b.family === "esp32s3" && matches(b, query))); + const nrfBoards = $derived(boards.filter((b) => b.family === "nrf52840" && matches(b, query))); + const rpBoards = $derived(boards.filter((b) => b.family === "rp2040" && matches(b, query))); + + const totalVisible = $derived( + esp32Boards.length + espBoards.length + nrfBoards.length + rpBoards.length, + ); + const isFiltering = $derived(query.trim().length > 0); + + function handleKeydown(e: KeyboardEvent) { + if (e.key === "Escape" && query !== "") { + query = ""; + e.preventDefault(); + } + } +{#snippet boardCard(board: BoardDef)} + +{/snippet} + +{#snippet familySection(label: string, list: BoardDef[], gridCols: string)} + {#if list.length > 0} +
{label}
+ESP32
-+ {totalVisible} of {boards.length} +
+ {/if}ESP32-S3
-nRF52840
-+ No boards match "{query}" +
- {/each} -RP2040
-