diff --git a/src/components/data/projectCard.astro b/src/components/data/projectCard.astro
index 66276e0..f0c6859 100644
--- a/src/components/data/projectCard.astro
+++ b/src/components/data/projectCard.astro
@@ -22,6 +22,7 @@ export interface Props {
size?: "small" | "medium" | "large";
showImage?: boolean;
maxTechStack?: number;
+ maxTags?: number;
}
const {
@@ -29,6 +30,7 @@ const {
size = "medium",
showImage = true,
maxTechStack = 4,
+ maxTags = 3,
} = Astro.props;
// 状态样式映射
@@ -163,12 +165,32 @@ const sizeClasses = getSizeClasses(size);
)}
{project.tags && project.tags.length > 0 && (
-
- {project.tags.map((tag) => (
+
+ {project.tags.slice(0, maxTags).map((tag) => (
#{tag}
))}
+ {project.tags.length > maxTags && (
+ <>
+ {project.tags.slice(maxTags).map((tag) => (
+
+ #{tag}
+
+ ))}
+
+ >
+ )}
)}
@@ -229,5 +251,36 @@ const sizeClasses = getSizeClasses(size);
}
});
});
+
+ // Раскрытие списка тегов при клике на "+"
+ const tagsToggleButtons = document.querySelectorAll('[data-tags-toggle]');
+
+ tagsToggleButtons.forEach(button => {
+ button.addEventListener('click', (e) => {
+ const container = button.closest('[data-tags-container]');
+ const hiddenElements = container?.querySelectorAll('[data-tag-hidden]');
+ const hiddenCount = parseInt(button.getAttribute('data-hidden-count') || '0');
+
+ if (hiddenElements && hiddenElements.length > 0) {
+ const isExpanded = !hiddenElements[0].classList.contains('hidden');
+
+ if (isExpanded) {
+ // Сворачиваем: скрываем все скрытые элементы
+ hiddenElements.forEach(el => {
+ el.classList.add('hidden');
+ });
+ button.textContent = `+${hiddenCount}`;
+ button.setAttribute('aria-expanded', 'false');
+ } else {
+ // Раскрываем: показываем все скрытые элементы
+ hiddenElements.forEach(el => {
+ el.classList.remove('hidden');
+ });
+ button.textContent = '−';
+ button.setAttribute('aria-expanded', 'true');
+ }
+ }
+ });
+ });
});