diff --git a/docs/docusaurus/src/pages/courses.js b/docs/docusaurus/src/pages/courses.js deleted file mode 100644 index 9e86b5cc94..0000000000 --- a/docs/docusaurus/src/pages/courses.js +++ /dev/null @@ -1,303 +0,0 @@ -import React, { useState, useMemo } from 'react'; -import Layout from '@theme/Layout'; -import Link from '@docusaurus/Link'; -import Heading from '@theme/Heading'; -import styles from './courses.module.css'; -import CustomFooter from '@site/src/components/CustomFooter'; -import coursesData from '../../data/courses.json'; - -const CoursesPage = () => { - const [searchQuery, setSearchQuery] = useState(''); - const [selectedCategory, setSelectedCategory] = useState('all'); - const [showSubscriptionModal, setShowSubscriptionModal] = useState(false); - const [showPurchaseModal, setShowPurchaseModal] = useState(false); - const [selectedCourse, setSelectedCourse] = useState(null); - - const { courses, categories, subscriptionInfo } = coursesData; - - const filteredCourses = useMemo(() => { - return courses.filter(course => { - const matchesSearch = course.title.toLowerCase().includes(searchQuery.toLowerCase()) || - course.description.toLowerCase().includes(searchQuery.toLowerCase()) || - course.tags.some(tag => tag.toLowerCase().includes(searchQuery.toLowerCase())); - - const matchesCategory = selectedCategory === 'all' || course.category === selectedCategory; - - return matchesSearch && matchesCategory; - }); - }, [searchQuery, selectedCategory]); - - const handlePurchaseClick = (course) => { - setSelectedCourse(course); - setShowPurchaseModal(true); - }; - - const SubscriptionModal = () => ( -
setShowSubscriptionModal(false)}> -
e.stopPropagation()}> -
-

{subscriptionInfo.title}

-
- -
-

{subscriptionInfo.description}

- -
- {subscriptionInfo.features.map((feature, index) => ( -
- - - - -

{feature.title}

-

{feature.description}

-
- ))} -
-
- -
- - - Перейти на Boosty - -
-
-
- ); - - const PurchaseModal = () => { - if (!selectedCourse) return null; - - return ( -
setShowPurchaseModal(false)}> -
e.stopPropagation()}> -
- {selectedCourse.title} { - e.target.src = '/img/Courses/default.png'; - }} - /> -
- -
-

{selectedCourse.title}

-
- -
-
- {selectedCourse.tags.map(tag => ( - #{tag} - ))} -
- -
-

О материале

-

{selectedCourse.descriptionExtended}

- -
-
- Формат: {selectedCourse.format} -
-
- Доступ: Бессрочный -
-
-
- -
-

Что вы получите:

-
    -
  • ✓ Полный доступ к текстовому материалу
  • -
  • ✓ Обновления контента бесплатно
  • -
-
- -
-

Как работает доступ:

-

- Доступ приобретается путем покупки поста на сервисе Boosty. Внутри этого поста находится ссылка для перехода к купленным материалам. Подобные ссылки обновляются в начале каждого месяца. Если ссылка была обновлена (перестала работать) или вы утратили свою старую ссылку еще до обновления, то всегда можете получить ее повторно в том же посте, что приобрели ранее. -

-
-

Если вы столкнулись с проблемой, то можете связаться со мной одним из следующих способов:

- -
-
- -
- - setShowPurchaseModal(false)} - > - Купить за {selectedCourse.price} ₽ - -
-
-
- ); - }; - - const CourseCard = ({ course }) => ( -
-
- {course.title} { - e.target.src = '/img/Courses/default.png'; - }} - /> -
- -
-
-

{course.title}

-
- {course.tags.map(tag => ( - #{tag} - ))} -
-
- -

{course.description}

- -
- {course.type === 'free' ? ( - - - - - Бесплатно - - ) : ( - <> - - - - )} -
-
-
- ); - - return ( - -
-
-
- - - -
- - Обучающие курсы и материалы - -

- Углубленное изучение аспектов и практик разработки с использованием Открытого пакета интеграций -

-
-
- -
- -
-
- - - - setSearchQuery(e.target.value)} - className={styles.searchInput} - /> -
- -
- {categories.map(category => ( - - ))} -
-
- -
- {filteredCourses.map(course => ( - - ))} -
- - {filteredCourses.length === 0 && ( -
-

Материалы по вашему запросу не найдены

-
- )} - - - -
- - -
-
- ); -}; - -export default CoursesPage; \ No newline at end of file diff --git a/docs/docusaurus/src/pages/courses.module.css b/docs/docusaurus/src/pages/courses.module.css deleted file mode 100644 index 0db99b467e..0000000000 --- a/docs/docusaurus/src/pages/courses.module.css +++ /dev/null @@ -1,532 +0,0 @@ -.layoutWrapper { - min-height: 100vh; - display: flex; - flex-direction: column; -} - -.pageContainer { - flex: 1; - display: flex; - flex-direction: column; -} - -.mainContent { - flex: 1; - padding-bottom: 2rem; /* Отступ перед футером */ -} - -/* Остальные ваши существующие стили остаются без изменений */ -.coursesHeader { - display: flex; - align-items: flex-start; - gap: 1rem; - margin-bottom: 0; -} - -.coursesIcon { - width: 4rem; - height: 4rem; - flex-shrink: 0; - color: #004943; - margin-top: 0.31rem; - margin-right: 10px; -} - -.coursesTitle { - margin: 0; - font-weight: 350; - color: inherit; -} - -.coursesSubtitle { - margin: 0.1rem 0 0; - font-weight: lighter; - color: #555; -} - -/* Фильтры */ -.filtersSection { - margin: 2rem 0; -} - -.searchBox { - position: relative; - max-width: 400px; - margin-bottom: 1.5rem; -} - -.searchIcon { - position: absolute; - left: 12px; - top: 50%; - transform: translateY(-50%); - width: 20px; - height: 20px; - color: #666; -} - -.searchInput { - width: 100%; - padding: 12px 12px 12px 40px; - border: 1px solid #ddd; - border-radius: 12px; - font-size: 1rem; - transition: border-color 0.2s; -} - -.searchInput:focus { - outline: none; - border-color: #004943; -} - -.categories { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; -} - -.categoryButton { - padding: 8px 16px; - border: 1px solid #ddd; - border-radius: 20px; - background: white; - color: #555; - cursor: pointer; - font-size: 0.9rem; - transition: all 0.2s; -} - -.categoryButton:hover { - border-color: #004943; - color: #004943; -} - -.categoryButtonActive { - background: #004943; - border-color: #004943; - color: white; -} - -.categoryButtonActive:hover { - color: white; - background: #025a53; -} - -/* Сетка курсов */ -.coursesGrid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); - gap: 2rem; - margin-top: 2rem; -} - -.courseCard { - background: white; - border: 1px solid #ddd; - border-radius: 16px; - overflow: hidden; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); - transition: all 0.3s ease; - display: flex; - flex-direction: column; -} - -.courseCard:hover { - transform: translateY(-4px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); -} - -.courseBanner { - width: 100%; - height: 160px; - overflow: hidden; -} - -.courseBanner img { - width: 100%; - height: 100%; - object-fit: cover; -} - -.courseContent { - padding: 1.5rem; - flex: 1; - display: flex; - flex-direction: column; -} - -.courseHeader { - margin-bottom: 1rem; -} - -.courseTitle { - margin: 0 0 0.5rem 0; - font-size: 1.25rem; - font-weight: 500; - line-height: 1.3; -} - -.tags { - display: flex; - flex-wrap: wrap; - gap: 0.3rem; -} - -.tag { - font-size: 0.75rem; - color: #666; - background: #f5f5f5; - padding: 2px 8px; - border-radius: 10px; -} - -.courseDescription { - flex: 1; - margin: 0 0 1.5rem 0; - color: #555; - line-height: 1.5; - font-size: 0.95rem; -} - -.courseActions { - display: flex; - gap: 0.8rem; -} - -/* Кнопки */ -.freeButton, -.buyButton, -.subscriptionButton { - flex: 1; - display: flex; - align-items: center; - justify-content: center; - gap: 0.5rem; - padding: 10px 16px; - border: none; - border-radius: 12px; - font-size: 0.95rem; - font-weight: 500; - cursor: pointer; - transition: all 0.2s; - text-decoration: none; -} - -.freeButton { - background: #e8f5e8; - color: #2e7d32; - border: 1px solid #c8e6c9; -} - -.freeButton:hover { - background: #d4edda; - color: #1b5e20; -} - -.buyButton { - background: #004943; - color: white; /* Вместо lightgray */ - font-weight: 500; /* Вместо 100 */ - font-size: 0.95rem; /* Вместо 1em */ - font-style: normal; - font-family: inherit; /* Добавьте это */ - text-rendering: optimizeLegibility; /* Улучшает четкость */ - -webkit-font-smoothing: antialiased; /* Для Mac */ - -moz-osx-font-smoothing: grayscale; /* Для Firefox */ -} - -.buyButton:hover { - background: #00302a; - text-decoration: none; - color: white; -} - -.subscriptionButton { - background: #e3f2fd; - color: #1565c0; - border: 1px solid #bbdefb; -} - -.subscriptionButton:hover { - background: #bbdefb; - color: #0d47a1; -} - -.buttonIcon { - width: 18px; - height: 18px; -} - -.noResults { - text-align: center; - padding: 3rem; - color: #666; -} - -/* Адаптивность */ -@media (max-width: 768px) { - .coursesGrid { - grid-template-columns: 1fr; - gap: 1.5rem; - } - - .courseActions { - flex-direction: column; - } - - .categories { - justify-content: center; - } -} - - -.modalOverlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; - opacity: 0; - pointer-events: none; - transition: opacity 0.3s ease; -} - -.modalOverlayVisible { - opacity: 1; - pointer-events: auto; -} - -.modalContent { - background: white; - border-radius: 16px; - padding: 0; - max-width: 670px; - width: 90%; - max-height: 90vh; - overflow: hidden; - display: flex; - flex-direction: column; -} - -.modalFeaturesContent { - background: white; - border-radius: 16px; - padding: 0; - max-width: 840px; - width: 90%; - max-height: 90vh; - overflow: hidden; - display: flex; - flex-direction: column; -} - -.modalHeader { - display: flex; - justify-content: between; - align-items: center; - padding: 1.5rem 1.5rem 0; - border-bottom: 1px solid #eee; -} - -.modalHeader h2 { - margin: 0; - flex: 1; -} - -.closeButton { - background: none; - border: none; - font-size: 2rem; - cursor: pointer; - color: #666; - line-height: 1; -} - -.modalBody { - padding: 1.5rem; - flex: 1; - overflow-y: auto; -} - -.subscriptionDescription { - text-align: center; - margin-bottom: 2rem; - color: #555; - line-height: 1.5; -} - -.featuresGrid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - gap: 1rem; - margin-bottom: 2rem; -} - -.featureCard { - text-align: center; - background: white; - border: 1px solid #ddd; - border-radius: 12px; - padding: 1.2rem; - box-shadow: - inset 0 1px 3px rgba(255, 255, 255, 0.7), - 0 4px 8px rgba(0, 0, 0, 0.1); - transition: all 0.3s ease; -} - -.featureCard:hover { - box-shadow: - inset 0 1px 3px rgba(255, 255, 255, 0.7), - 0 6px 12px rgba(0, 0, 0, 0.12); -} - -.featureIcon { - width: 4rem; - height: 4rem; - flex-shrink: 0; - margin-bottom: 1rem; - color: #004943; -} - -.featureTitle { - margin: 0 0 0.5rem 0; - font-size: 1.1rem; - font-weight: 600; -} - -.featureDescription { - margin: 0; - color: #666; - font-size: 0.9rem; - line-height: 1.4; -} - -.modalFooter { - display: flex; - gap: 1rem; - padding: 1rem 1.5rem; - border-top: 1px solid #eee; - background: #fafafa; -} - -.secondaryButton { - flex: 1; - padding: 12px 24px; - border: 1px solid #ddd; - border-radius: 8px; - background: white; - color: #666; - cursor: pointer; - font-size: 1rem; -} - -.primaryButton { - flex: 2; - padding: 12px 24px; - border: none; - border-radius: 8px; - background: #004943; - color: white; - text-decoration: none; - text-align: center; - font-size: 1rem; - cursor: pointer; -} - -.primaryButton:hover { - background: #00302a; - color: white; - text-decoration: none; -} - -/* Адаптивность */ -@media (max-width: 768px) { - .featuresGrid { - grid-template-columns: 1fr; - } - - .modalFooter { - flex-direction: column; - } - - .modalContent { - width: 95%; - margin: 1rem; - } -} - -/* Стили для модалки покупки */ -.courseBannerModal { - width: 100%; - height: 300px; - overflow: hidden; -} - -.courseBannerModal img { - width: 100%; - height: auto; -} - -.courseDescriptionModal h3 { - margin: 1rem 0 0.5rem 0; - color: #333; - font-size: 1.2rem; -} - -.courseDetails { - margin: 1rem 0; - padding: 1rem; - background: #f8f9fa; - border-radius: 8px; -} - -.detailItem { - margin: 0.5rem 0; - color: #555; -} - -.courseProgram { - margin: 1.5rem 0; -} - -.courseProgram h3 { - margin-bottom: 0.5rem; - color: #333; -} - -.programList { - list-style: none; - padding: 0; - margin: 0; -} - -.programList li { - padding: 0.3rem 0; - color: #555; -} - -.accessInfo { - margin: 1.5rem 0 0 0; - padding: 1rem; - background: #fff3cd; - border: 1px solid #ffeaa7; - border-radius: 8px; -} - -.accessInfo h4 { - margin: 0 0 0.5rem 0; - color: #856404; - font-size: 1rem; -} - -.accessInfo p { - margin: 0; - color: #856404; - font-size: 0.9rem; - line-height: 1.4; -} \ No newline at end of file