@namespace MidrandBooks.Components.Layout @using Microsoft.AspNetCore.Components @using MidrandBooks.Models @code { [Parameter] public string ActiveTab { get; set; } = "catalog"; [Parameter] public EventCallback OnActiveTabChanged { get; set; } [Parameter] public EventCallback OnOpenCart { get; set; } [Parameter] public EventCallback OnSelectBook { get; set; } [Parameter] public List Books { get; set; } = new(); [Parameter] public int CartCount { get; set; } [Parameter] public bool IsOfflineMode { get; set; } [Parameter] public EventCallback OnOfflineModeToggle { get; set; } private string SearchQuery { get; set; } = string.Empty; private bool ShowResults { get; set; } = false; private void SetTab(string tab) { OnActiveTabChanged.InvokeAsync(tab); } private void ToggleOfflineMode() { OnOfflineModeToggle.InvokeAsync(!IsOfflineMode); } private void HandleOpenCart() { OnOpenCart.InvokeAsync(); } private void HandleSearchInput(ChangeEventArgs e) { SearchQuery = e.Value?.ToString() ?? string.Empty; ShowResults = !string.IsNullOrWhiteSpace(SearchQuery); } private IEnumerable FilteredBooks() { if (string.IsNullOrWhiteSpace(SearchQuery)) return Enumerable.Empty(); var query = SearchQuery.Trim().ToLower(); return Books .Where(b => b.Status == "published" && (b.Title.ToLower().Contains(query) || b.Author.ToLower().Contains(query) || b.Category.ToLower().Contains(query))) .Take(5); } private void ClickSearchResult(BookModel book) { OnSelectBook.InvokeAsync(book); SearchQuery = string.Empty; ShowResults = false; } private async Task HandleFocusOut() { // Simple delay to allow click events on items to execute before drawer closes await Task.Delay(200); ShowResults = false; } }