import { RECIPES } from '../data/catalog.js?v=9'; import { getRecipeGridSectionHTML, renderRecipeGrid } from '../ui/recipeGrid.js'; const DEFAULT_MIN_MINUTES = 5; const DEFAULT_MAX_MINUTES = 120; let filterState = { query: '', slots: [], tags: [], minMinutes: DEFAULT_MIN_MINUTES, maxMinutes: DEFAULT_MAX_MINUTES, }; let isSearchExpanded = false; let recipeListDocListenersBound = false; function matchesFilters(recipe) { const { query, slots, tags, minMinutes, maxMinutes } = filterState; if (query) { const q = query.toLowerCase(); const haystack = `${recipe.title} ${(recipe.tags || []).join(' ')}`.toLowerCase(); if (!haystack.includes(q)) return false; } if (slots.length > 0) { if (!recipe.allowedSlots.some((s) => slots.includes(s))) return false; } if (tags.length > 0) { const recipeTags = (recipe.tags || []).map((t) => t.toLowerCase()); if (!tags.some((t) => recipeTags.includes(t.toLowerCase()))) return false; } if (minMinutes > DEFAULT_MIN_MINUTES && recipe.minutes < minMinutes) return false; if (maxMinutes < DEFAULT_MAX_MINUTES && recipe.minutes > maxMinutes) return false; return true; } function getFilteredRecipes() { return Object.values(RECIPES).filter(matchesFilters); } function syncRecipeScrollShadow() { const searchShell = document.getElementById('recipe-search-shell'); if (searchShell) { searchShell.style.boxShadow = 'var(--shadow-shell)'; } } function syncRecipeTopbarUI() { const defaultRow = document.getElementById('recipe-default-row'); const searchShell = document.getElementById('recipe-search-shell'); const showSearch = isSearchExpanded; if (defaultRow) { defaultRow.style.opacity = showSearch ? '0' : '1'; defaultRow.style.transform = showSearch ? 'translateY(-2px) scale(0.98)' : 'translateY(0) scale(1)'; defaultRow.style.pointerEvents = showSearch ? 'none' : 'auto'; } if (searchShell) { searchShell.style.opacity = showSearch ? '1' : '0'; searchShell.style.transform = showSearch ? 'translateY(0) scale(1)' : 'translateY(-2px) scale(0.98)'; searchShell.style.pointerEvents = showSearch ? 'auto' : 'none'; searchShell.style.boxShadow = 'var(--shadow-shell)'; } } function closeSearch() { const input = document.getElementById('recipe-search-input'); const hadQuery = Boolean(input?.value); if (input) { input.value = ''; input.blur(); } filterState.query = ''; isSearchExpanded = false; syncRecipeTopbarUI(); if (hadQuery) renderGrid(); } function openSearch() { isSearchExpanded = true; window.closeFilters?.(); syncRecipeTopbarUI(); window.requestAnimationFrame(() => { document.getElementById('recipe-search-input')?.focus(); }); } function renderGrid() { const grid = document.getElementById('recipe-grid'); const emptyState = document.getElementById('recipe-empty-state'); if (!grid) return; renderRecipeGrid({ gridEl: grid, emptyStateEl: emptyState, recipes: getFilteredRecipes(), showSlotLabels: false, cardClassName: 'recipe-list-card', }); syncRecipeTopbarUI(); requestAnimationFrame(syncRecipeScrollShadow); } export function getRecipeListHTML() { return `

Katalog przepisów

${getRecipeGridSectionHTML({ scrollId: 'recipe-scroll', gridId: 'recipe-grid', emptyStateId: 'recipe-empty-state', scrollClassName: 'relative flex-1 overflow-y-auto px-4 pt-[5.35rem] pb-24 bg-[rgb(var(--app-bg-rgb))]', gridClassName: 'grid grid-cols-3 gap-2 bg-[rgb(var(--app-bg-rgb))]', emptyTitle: 'Brak wyników', emptyMessage: 'Zmień kryteria wyszukiwania lub filtry', })}
`; } export function getFilterState() { return filterState; } export function applyFilters(newState) { Object.assign(filterState, newState); renderGrid(); } export function getFilteredCount() { return getFilteredRecipes().length; } export function refreshRecipeList() { renderGrid(); } export function setupRecipeList() { renderGrid(); document.getElementById('recipe-search-input')?.addEventListener('input', (e) => { filterState.query = e.target.value.trim(); renderGrid(); }); document.getElementById('recipe-search-input')?.addEventListener('keydown', (e) => { if (e.key === 'Escape') closeSearch(); }); document.getElementById('recipe-search-toggle')?.addEventListener('click', () => openSearch()); document.getElementById('recipe-search-close')?.addEventListener('click', () => closeSearch()); document.getElementById('recipe-filter-btn')?.addEventListener('click', (e) => { e.stopPropagation(); if (isSearchExpanded) { isSearchExpanded = false; syncRecipeTopbarUI(); } window.openFilters?.('recipes'); }); document.getElementById('recipe-grid')?.addEventListener('click', (e) => { const card = e.target.closest('.recipe-browser-card'); if (!card) return; const recipeId = card.getAttribute('data-recipe-id'); if (recipeId) window.openRecipeDetail?.(recipeId); }); const recipeScroll = document.getElementById('recipe-scroll'); const recipeTopBar = document.getElementById('recipe-top-bar'); if (recipeScroll && recipeTopBar) { const shadow = document.createElement('div'); shadow.style.cssText = 'position:absolute;left:0;right:0;bottom:-8px;height:8px;background:linear-gradient(to bottom,rgba(var(--overlay-rgb),0.25),transparent);opacity:0;transition:opacity 0.2s;pointer-events:none;'; recipeTopBar.appendChild(shadow); recipeScroll.addEventListener('scroll', () => { shadow.style.opacity = recipeScroll.scrollTop > 2 ? '1' : '0'; }); } if (!recipeListDocListenersBound) { recipeListDocListenersBound = true; document.addEventListener('keydown', (e) => { if (e.key !== 'Escape' || !isSearchExpanded) return; if (!document.getElementById('main-view')?.classList.contains('hidden')) { closeSearch(); } }); } }