2 import { KeyboardShortcutInfo } from '$lib/components/app';
3 import { Button } from '$lib/components/ui/button';
4 import type { Component } from 'svelte';
5 import { SearchInput } from '$lib/components/app';
6 import { page } from '$app/state';
7 import { SIDEBAR_ACTIONS_ITEMS } from '$lib/constants/ui';
10 handleMobileSidebarItemClick: () => void;
11 isSearchModeActive: boolean;
13 isCancelAlwaysVisible?: boolean;
14 onSearchDeactivated?: () => void;
18 handleMobileSidebarItemClick,
19 isSearchModeActive = $bindable(),
20 searchQuery = $bindable(),
21 isCancelAlwaysVisible = false,
25 let searchInputRef = $state<HTMLInputElement | null>(null);
27 function handleSearchModeDeactivate() {
28 isSearchModeActive = false;
30 onSearchDeactivated?.();
33 export function activateSearch() {
34 isSearchModeActive = true;
35 // Focus after Svelte renders the input
36 queueMicrotask(() => searchInputRef?.focus());
40 {#snippet itemIcon(IconComponent: Component)}
41 <IconComponent class="h-4 w-4" />
44 <div class="my-1 space-y-1">
45 {#if isSearchModeActive}
47 bind:value={searchQuery}
48 bind:ref={searchInputRef}
49 onClose={handleSearchModeDeactivate}
50 onKeyDown={(e) => e.key === 'Escape' && handleSearchModeDeactivate()}
51 placeholder="Search conversations..."
52 {isCancelAlwaysVisible}
55 {#each SIDEBAR_ACTIONS_ITEMS as item (item.route)}
58 class="w-full justify-between px-2 backdrop-blur-none! hover:[&>kbd]:opacity-100"
59 onclick={activateSearch}
62 <div class="flex items-center gap-2">
63 {@render itemIcon(item.icon)}
69 <KeyboardShortcutInfo keys={item.keys} />
74 class="w-full justify-between px-2 backdrop-blur-none! hover:[&>kbd]:opacity-100 {(item.activeRouteId &&
75 page.route.id === item.activeRouteId) ||
76 (item.activeRoutePrefix && page.route.id?.startsWith(item.activeRoutePrefix))
77 ? 'bg-accent text-accent-foreground'
80 onclick={handleMobileSidebarItemClick}
83 <div class="flex items-center gap-2">
84 {@render itemIcon(item.icon)}
90 <KeyboardShortcutInfo keys={item.keys} />