From a723e56b4ce392d2b11d28f2745279aa825a2ee1 Mon Sep 17 00:00:00 2001 From: memdmp Date: Mon, 21 Jul 2025 22:53:11 +0200 Subject: feat: initial commit --- src/routes/(app)/fahrplan/+page.svelte | 524 +++++++++++++++++++++++++++++++++ 1 file changed, 524 insertions(+) create mode 100644 src/routes/(app)/fahrplan/+page.svelte (limited to 'src/routes/(app)/fahrplan/+page.svelte') diff --git a/src/routes/(app)/fahrplan/+page.svelte b/src/routes/(app)/fahrplan/+page.svelte new file mode 100644 index 0000000..6d36513 --- /dev/null +++ b/src/routes/(app)/fahrplan/+page.svelte @@ -0,0 +1,524 @@ + + + + + + + + +
+ +
+ (searchFieldFocused = true)} + onblur={() => { + searchFieldFocused = false; + if (renderedObjectIdName) searchQuery = renderedObjectIdName; + }} + onkeydown={(e) => { + const resultIdx = Math.max( + Math.min(searchSuggestionIdx, searchResults.length - 1), + 0 + ); + let dir = 1; + switch (e.key) { + case 'Enter': + case 'Return': { + const result = searchResults[resultIdx]; + if (result) { + objectId = result.id; + objectIdName = result.name; + searchQuery = result.name; + e.currentTarget.blur(); + pushHistory(); + setTimeout(() => refetchResultsLoop(true), 10); + } + break; + } + case 'ArrowUp': + dir = -1; + // fall through + case 'ArrowDown': { + if (searchResults.length !== 0) { + e.preventDefault(); + searchSuggestionIdx = + dir === -1 && resultIdx % 1 !== 0 + ? Math.floor(resultIdx) + : Math.floor(resultIdx + dir); + if (searchSuggestionIdx < 0) + searchSuggestionIdx = searchResults.length - 1; + else if (searchSuggestionIdx >= searchResults.length) + searchSuggestionIdx = 0; + } + break; + } + } + }} + /> +
+ {#if searchFieldFocused && searchResults.length !== 0} +
+ {#each searchResults as result, idx} + + +
{ + searchSuggestionIdx = idx; + }} + onmouseleave={() => { + searchSuggestionIdx = idx + 0.000001; + }} + onmousedown={(e) => { + e.preventDefault(); // prevent early unfocusing + }} + onclick={(e) => { + objectId = result.id; + objectIdName = result.name; + searchQuery = result.name; + pushHistory(); + if (searchField) { + setTimeout(() => { + searchField?.blur(); + }, 10); + searchField.value = result.name; + setTimeout(() => refetchResultsLoop(true), 10); + } + }} + > + {result.name} + {[ + result.areas.find((v) => v.default)?.name, + result.type.charAt(0).toUpperCase() + + result.type.substring(1).toLowerCase(), + ] + .filter((v) => v) + .join(', ')} +
+ {/each} +
+ {/if} +
+
+
+
+ {#if progressKind === 'fetch'} +
+ {:else if progressKind === 'waiting'} +
+ {/if} +
+
+
+ { + searchQuery = q; + searchField?.focus(); + }} + /> +
+
+
+
+ + + -- cgit v1.2.3