--- export interface Props { items: any[]; showCount?: boolean; } const { items = [], showCount = false, } = Astro.props; // Функция для извлечения класса цвета из строки function extractColorClass(colorString: string): string { if (!colorString) return 'bg-blue'; // Если строка содержит "фон меню:" - извлекаем часть после двоеточия if (colorString.includes('фон меню:')) { const parts = colorString.split(':'); const color = parts[1]?.trim(); // Проверяем существование CSS класса const validColors = [ 'black', 'yellow', 'blue', 'green', 'red', 'orange', 'gray', 'indigo', 'purple', 'pink', 'teal', 'cyan', 'white', 'gray-dark', 'light', 'dark' ]; if (color && validColors.includes(color)) { return `bg-${color}`; } } // Если строка уже содержит "bg-" if (colorString.startsWith('bg-')) { return colorString; } // Если это просто название цвета без префикса const simpleColor = colorString.toLowerCase(); switch(simpleColor) { case 'black': case 'yellow': case 'blue': case 'green': case 'red': case 'orange': case 'gray': case 'indigo': case 'purple': case 'pink': case 'teal': case 'cyan': case 'white': case 'dark': case 'light': return `bg-${simpleColor}`; case 'gray-dark': return 'bg-gray-dark'; default: return 'bg-blue'; } } ---

{showCount && items.length > 0 && ( ({items.length}) )}

{items.map((item, index) => { const postUrl = item.uri || `/blog/${item.databaseId}`; const postDate = new Date(item.date); // Получаем цвет категории и преобразуем в CSS класс const rawColor = item.categories?.nodes?.[0]?.color || ''; const categoryBgClass = extractColorClass(rawColor); // Логика для больших плиток на десктопе let isLarge = false; let largePosition = ''; const rowNumber = Math.floor(index / 4) + 1; const positionInRow = index % 4; if (index >= 8) { const largeRowStart = (rowNumber - 3) % 3 === 0 && rowNumber >= 3; if (largeRowStart && positionInRow === 0) { isLarge = true; largePosition = 'first'; } } return (
{item.featuredImage?.node?.sourceUrl ? ( {item.featuredImage.node.altText ) : (
)} {/* Рубрика в верхнем правом углу с цветом */} {item.categories?.nodes?.[0]?.name && (
{item.categories.nodes[0].name}
)} {/* Оверлей с контентом */}

{item.title}

{item.author?.node?.name && ( )}
{/* Скринридеру и SEO */}

); })}