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 recipeListDocListenersBound = false; let recipeSearchOpen = 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() { syncRecipeTopbarUI(); } function syncRecipeTopbarUI() { const searchWrap = document.getElementById('recipe-search-wrap'); const searchShell = document.getElementById('recipe-search-shell'); const rightWrap = document.getElementById('recipe-filter-wrap'); const rightBtn = document.getElementById('recipe-filter-btn'); const rightIcon = document.getElementById('recipe-right-btn-icon'); const filterCount = document.getElementById('recipe-filter-count'); const dot = document.getElementById('recipe-search-active-dot'); const isOpen = recipeSearchOpen; if (searchWrap) searchWrap.classList.toggle('hidden', isOpen); if (searchShell) { searchShell.style.opacity = isOpen ? '1' : '0'; searchShell.style.pointerEvents = isOpen ? 'auto' : 'none'; searchShell.style.transform = isOpen ? 'translateY(0) scale(1)' : 'translateY(0.45rem) scale(0.98)'; } if (rightIcon) { rightIcon.className = 'fas fa-xmark'; } if (rightBtn) { rightBtn.setAttribute('aria-label', 'Zamknij wyszukiwanie'); } if (rightWrap) { rightWrap.classList.toggle('hidden', !isOpen); } if (filterCount) { const showCount = false; filterCount.classList.toggle('hidden', !showCount); filterCount.classList.toggle('flex', showCount); } if (dot) { const hasQuery = Boolean(filterState.query); dot.classList.toggle('hidden', !hasQuery); } } function setSearchOpen(open, { clearQuery = false, focusInput = false } = {}) { const hadQuery = Boolean(filterState.query); recipeSearchOpen = open; document.documentElement.classList.toggle('is-inline-search-open', recipeSearchOpen); if (clearQuery) { filterState.query = ''; } const input = document.getElementById('recipe-search-input'); if (input) { if (open) { input.value = filterState.query; if (focusInput) { input.focus(); input.setSelectionRange(input.value.length, input.value.length); } } else { input.blur(); } } syncRecipeTopbarUI(); if (clearQuery && hadQuery) renderGrid(); } 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 recipe-catalog-card', }); syncRecipeTopbarUI(); requestAnimationFrame(syncRecipeScrollShadow); } export function getRecipeListHTML() { return `