refactor(web): streamline filter ui with simplified removal

This commit is contained in:
2026-01-31 14:54:03 -06:00
parent 96a8c13125
commit 44260422d6
3 changed files with 17 additions and 51 deletions
+7 -25
View File
@@ -1,36 +1,18 @@
<script lang="ts">
import { X } from "@lucide/svelte";
let {
label,
onRemove,
onclick,
}: {
label: string;
onRemove: () => void;
onclick?: () => void;
} = $props();
</script>
<span
class="inline-flex items-center gap-1 rounded-full border border-border bg-muted/40 px-2.5 py-0.5 text-xs text-foreground"
<button
type="button"
class="inline-flex items-center rounded-full border border-border bg-muted/40 px-2.5 py-0.5 text-xs text-foreground hover:bg-muted/60 transition-colors cursor-pointer"
onclick={onRemove}
aria-label="Remove {label} filter"
>
<button
type="button"
class="hover:text-foreground/80 transition-colors cursor-pointer"
onclick={onclick}
>
{label}
</button>
<button
type="button"
class="inline-flex items-center justify-center rounded-full hover:bg-muted transition-colors cursor-pointer"
onclick={(e) => {
e.stopPropagation();
onRemove();
}}
aria-label="Remove {label} filter"
>
<X class="size-3" />
</button>
</span>
{label}
</button>
+1 -14
View File
@@ -1,14 +1,10 @@
<script lang="ts">
import { X } from "@lucide/svelte";
let {
segments,
onRemoveSegment,
onRemoveAll,
}: {
segments: string[];
onRemoveSegment: (segment: string) => void;
onRemoveAll: () => void;
} = $props();
</script>
@@ -22,21 +18,12 @@ let {
{/if}
<button
type="button"
class="px-2 py-0.5 hover:bg-muted/60 transition-colors cursor-pointer first:rounded-l-full"
class="px-2 py-0.5 hover:bg-muted/60 transition-colors cursor-pointer first:rounded-l-full last:rounded-r-full"
onclick={() => onRemoveSegment(segment)}
aria-label="Remove {segment} filter"
>
{segment}
</button>
{/each}
<span class="w-px self-stretch bg-border"></span>
<button
type="button"
class="inline-flex items-center justify-center px-1.5 py-0.5 rounded-r-full hover:bg-muted/60 transition-colors cursor-pointer"
onclick={onRemoveAll}
aria-label="Remove all subject filters"
>
<X class="size-3" />
</button>
</span>
{/if}
+9 -12
View File
@@ -545,10 +545,6 @@ function removeSubject(code: string) {
selectedSubjects = selectedSubjects.filter((s) => s !== code);
}
function clearAllSubjects() {
selectedSubjects = [];
}
function clearAllFilters() {
selectedSubjects = [];
openOnly = false;
@@ -582,7 +578,6 @@ function clearAllFilters() {
<SegmentedChip
segments={selectedSubjects}
onRemoveSegment={removeSubject}
onRemoveAll={clearAllSubjects}
/>
{/if}
{#if openOnly}
@@ -690,13 +685,14 @@ function clearAllFilters() {
</div>
<!-- View columns dropdown (moved from CourseTable) -->
<DropdownMenu.Root>
<DropdownMenu.Trigger
class="inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-colors cursor-pointer shrink-0"
>
<Columns3 class="size-3.5" />
View
</DropdownMenu.Trigger>
<div class="pb-1.5">
<DropdownMenu.Root>
<DropdownMenu.Trigger
class="inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-colors cursor-pointer shrink-0"
>
<Columns3 class="size-3.5" />
View
</DropdownMenu.Trigger>
<DropdownMenu.Portal>
<DropdownMenu.Content
class="z-50 min-w-40 rounded-md border border-border bg-card p-1 text-card-foreground shadow-lg"
@@ -772,6 +768,7 @@ function clearAllFilters() {
</DropdownMenu.Content>
</DropdownMenu.Portal>
</DropdownMenu.Root>
</div>
</div>
<!-- Filter bar -->