diff --git a/package-lock.json b/package-lock.json
index a127535..9524ec0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,7 @@
"react": "^18.2.0",
"react-confetti": "^6.2.2",
"react-dom": "^18.2.0",
- "react-router-dom": "^7.4.0",
+ "react-router-dom": "^7.5.2",
"react-scripts": "5.0.1",
"react-transition-group": "^4.4.5",
"web-vitals": "^4.2.4"
@@ -3970,12 +3970,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
- "license": "MIT"
- },
"node_modules/@types/eslint": {
"version": "8.56.12",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
@@ -14309,12 +14303,11 @@
}
},
"node_modules/react-router": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.4.0.tgz",
- "integrity": "sha512-Y2g5ObjkvX3VFeVt+0CIPuYd9PpgqCslG7ASSIdN73LwA1nNWzcMLaoMRJfP3prZFI92svxFwbn7XkLJ+UPQ6A==",
+ "version": "7.5.2",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.2.tgz",
+ "integrity": "sha512-9Rw8r199klMnlGZ8VAsV/I8WrIF6IyJ90JQUdboupx1cdkgYqwnrYjH+I/nY/7cA1X5zia4mDJqH36npP7sxGQ==",
"license": "MIT",
"dependencies": {
- "@types/cookie": "^0.6.0",
"cookie": "^1.0.1",
"set-cookie-parser": "^2.6.0",
"turbo-stream": "2.4.0"
@@ -14333,12 +14326,12 @@
}
},
"node_modules/react-router-dom": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.0.tgz",
- "integrity": "sha512-VlksBPf3n2bijPvnA7nkTsXxMAKOj+bWp4R9c3i+bnwlSOFAGOkJkKhzy/OsRkWaBMICqcAl1JDzh9ZSOze9CA==",
+ "version": "7.5.2",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.2.tgz",
+ "integrity": "sha512-yk1XW8Fj7gK7flpYBXF3yzd2NbX6P7Kxjvs2b5nu1M04rb5pg/Zc4fGdBNTeT4eDYL2bvzWNyKaIMJX/RKHTTg==",
"license": "MIT",
"dependencies": {
- "react-router": "7.4.0"
+ "react-router": "7.5.2"
},
"engines": {
"node": ">=20.0.0"
diff --git a/package.json b/package.json
index 25cb4b0..a2fd093 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
"react": "^18.2.0",
"react-confetti": "^6.2.2",
"react-dom": "^18.2.0",
- "react-router-dom": "^7.4.0",
+ "react-router-dom": "^7.5.2",
"react-scripts": "5.0.1",
"react-transition-group": "^4.4.5",
"web-vitals": "^4.2.4"
diff --git a/src/App.css b/src/App.css
index 946f29a..bfaf462 100644
--- a/src/App.css
+++ b/src/App.css
@@ -1,3 +1,11 @@
-.h1 {
- align-items: center;
-}
\ No newline at end of file
+.App {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+ }
+
+ main {
+ flex: 1;
+ padding-bottom: 40px;
+ }
+
\ No newline at end of file
diff --git a/src/App.js b/src/App.js
index 00aa6ea..d2c4fe5 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,23 +1,40 @@
import React from 'react';
+import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Header from './components/Header/Header';
import SkinTypeQuiz from './components/SkinTypeQuiz/SkinTypeQuiz';
import PopularProducts from './components/PopularProducts/PopularProducts';
+import Reviews from './components/Reviews/Reviews';
+import Footer from './components/Footer/Footer';
+import Login from './pages/Login';
+import Register from './pages/Register';
import './App.css';
function App() {
return (
-
-
-
-
- Добро пожаловать в SkinCare Advisor!
-
-
-
-
-
+
+
+
+
+
+
+
+ Добро пожаловать в SkinCare Advisor!
+
+
+
+
+ >
+ } />
+ } />
+ } />
+
+
+
+
+
);
}
diff --git a/src/components/Footer/Footer.css b/src/components/Footer/Footer.css
new file mode 100644
index 0000000..5e312d2
--- /dev/null
+++ b/src/components/Footer/Footer.css
@@ -0,0 +1,108 @@
+.site-footer {
+ background-color: #2c3e50;
+ color: #ecf0f1;
+ padding: 40px 0 20px;
+ margin-top: 60px;
+ position: relative;
+ z-index: 10;
+ }
+
+ .footer-content {
+ max-width: 1200px;
+ margin: 0 auto;
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ padding: 0 20px;
+ gap: 30px;
+ }
+
+ .footer-section {
+ margin: 15px;
+ min-width: 200px;
+ flex: 1 1 250px;
+ }
+
+ .footer-section h3 {
+ font-size: 18px;
+ margin-bottom: 15px;
+ color: #ecf0f1;
+ position: relative;
+ padding-bottom: 10px;
+ }
+
+ .footer-section h3::after {
+ content: '';
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 50px;
+ height: 2px;
+ background: #6C63FF;
+ }
+
+ .footer-section p,
+ .footer-section a {
+ color: #bdc3c7;
+ margin: 8px 0;
+ display: block;
+ text-decoration: none;
+ transition: color 0.3s ease;
+ }
+
+ .footer-section a:hover {
+ color: #6C63FF;
+ }
+
+ .social-links {
+ display: flex;
+ gap: 15px;
+ margin-top: 15px;
+ }
+
+ .social-links a {
+ color: #ecf0f1;
+ font-size: 20px;
+ }
+
+ .copyright {
+ text-align: center;
+ margin-top: 40px;
+ padding-top: 20px;
+ border-top: 1px solid #34495e;
+ font-size: 14px;
+ color: #7f8c8d;
+ width: 100%;
+ }
+
+ /* Адаптивность */
+ @media (max-width: 768px) {
+ .footer-content {
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ }
+
+ .footer-section h3::after {
+ left: 50%;
+ transform: translateX(-50%);
+ }
+
+ .social-links {
+ justify-content: center;
+ }
+ }
+
+ /* Фиксированный футер (опционально) */
+ /*
+ .App {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+ }
+
+ .site-footer {
+ margin-top: auto;
+ }
+ */
+
\ No newline at end of file
diff --git a/src/components/Footer/Footer.js b/src/components/Footer/Footer.js
new file mode 100644
index 0000000..506aac9
--- /dev/null
+++ b/src/components/Footer/Footer.js
@@ -0,0 +1,31 @@
+import React from 'react';
+import './Footer.css';
+
+function Footer() {
+ return (
+
+ );
+}
+
+export default Footer;
diff --git a/src/components/Header/Header.css b/src/components/Header/Header.css
index 923518a..b6cfeb2 100644
--- a/src/components/Header/Header.css
+++ b/src/components/Header/Header.css
@@ -1,44 +1,111 @@
-.navigation ul {
- list-style: none;
- padding: 0;
- margin: 0;
- display: flex;
- }
-
- .navigation li {
- margin-right: 20px; /* Расстояние между элементами меню */
- }
-
- .navigation a {
- text-decoration: none;
- color: #333; /* Цвет ссылок */
- font-weight: bold;
- }
-
- .navigation a:hover {
- color: #515151; /* Цвет при наведении */
- }
+/* Основные стили шапки */
+.site-header {
+ background: white;
+ padding: 15px 0;
+ position: sticky;
+ top: 0;
+ z-index: 1000;
+ box-shadow: 0 2px 15px rgba(0,0,0,0.1);
+ border-bottom: 1px solid #f0f0f0;
+}
-
-.header {
- background-color: #f8f9fa; /* Светлый фон шапки */
- padding: 10px 20px;
- display: flex;
- align-items: center;
- justify-content: space-between; /* Распределяем элементы по краям */
- border-bottom: 1px solid #dee2e6; /* Тонкая линия снизу */
- }
+.header-content {
+ max-width: 1200px;
+ margin: 0 auto;
+ display: flex;
+ align-items: center;
+ padding: 0 20px;
+ gap: 30px;
+}
+/* Стили для логотипа */
+.logo-link {
+ text-decoration: none;
+ display: flex;
+ align-items: center;
+ transition: transform 0.3s ease;
+}
-.search-button {
- background-color: #121212;
- color: white;
- border: none;
- padding: 8px 16px;
- border-radius: 5px;
- cursor: pointer;
- }
-
- .search-button:hover {
- background-color: #2e2e2e;
- }
\ No newline at end of file
+.logo-link:hover {
+ transform: translateY(-2px);
+}
+
+/* Стили для поиска */
+.search-container {
+ display: flex;
+ flex-grow: 1;
+ max-width: 600px;
+ gap: 12px;
+}
+
+.search-input {
+ flex: 1;
+ padding: 12px 25px;
+ border: 1px solid #e0e0e0;
+ border-radius: 30px;
+ background: white;
+ color: #333;
+ font-size: 16px;
+ transition: all 0.3s;
+ box-shadow: 0 2px 5px rgba(0,0,0,0.05);
+}
+
+.search-input:focus {
+ border-color: #6C63FF;
+ box-shadow: 0 0 0 3px rgba(108, 99, 255, 0.1);
+ outline: none;
+}
+
+.search-input::placeholder {
+ color: #aaa;
+}
+
+.search-btn {
+ padding: 0 30px;
+ background: #ffffff;
+ color: rgb(0, 0, 0);
+ border: none;
+ border-radius: 30px;
+ cursor: pointer;
+ font-size: 16px;
+ font-weight: 600;
+ transition: all 0.3s;
+ box-shadow: 0 2px 10px rgba(108, 99, 255, 0.2);
+}
+
+.search-btn:hover {
+ background: #e2e2e2;
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(108, 99, 255, 0.3);
+}
+
+/* Стили для кнопок авторизации */
+.auth-buttons {
+ display: flex;
+ gap: 15px;
+}
+
+.auth-link {
+ color: #555;
+ text-decoration: none;
+ padding: 10px 20px;
+ border-radius: 8px;
+ transition: all 0.3s;
+ font-weight: 500;
+}
+
+.auth-link:hover {
+ color: #6C63FF;
+ background: rgba(108, 99, 255, 0.05);
+}
+
+.auth-link.register {
+ background: #6C63FF;
+ color: white;
+ box-shadow: 0 2px 10px rgba(108, 99, 255, 0.2);
+}
+
+.auth-link.register:hover {
+ background: #5a52d4;
+ box-shadow: 0 4px 12px rgba(108, 99, 255, 0.3);
+}
diff --git a/src/components/Header/Header.js b/src/components/Header/Header.js
index 9297f44..0f52593 100644
--- a/src/components/Header/Header.js
+++ b/src/components/Header/Header.js
@@ -1,17 +1,32 @@
import React from 'react';
-import Logo from './Logo';
-import Navigation from './Navigation';
-import SearchButton from './SearchButton';
+import { Link } from 'react-router-dom';
+import Logo from './Logo'; // Убедитесь в правильности пути
import './Header.css';
function Header() {
return (
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ Вход
+ Регистрация
+
+
);
}
-export default Header;
\ No newline at end of file
+export default Header;
diff --git a/src/components/Header/Logo.css b/src/components/Header/Logo.css
index 4dad799..b9685ce 100644
--- a/src/components/Header/Logo.css
+++ b/src/components/Header/Logo.css
@@ -1,14 +1,53 @@
.logo {
- display: flex; /* для гибкого распложения элементов */
- align-items: center; /* по центру и вертикали */
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ transition: all 0.3s ease;
+}
+
+.logo:hover {
+ transform: translateY(-2px);
}
.logo-image {
- height: 80px; /* высота */
- margin-right: 10px; /* отступ справа */
+ height: 40px;
+ width: auto;
+ transition: transform 0.3s ease;
+}
+
+.logo-image:hover {
+ transform: scale(1.05) rotate(-5deg);
}
.logo-text {
- font-weight: bold; /* шрифт жирн */
- font-size: 1.2em;
+ font-size: 22px;
+ color: #333; /* Изменили на тёмный цвет */
+ font-weight: 600;
+ margin: 0;
+ letter-spacing: 0.5px;
+ position: relative;
+}
+
+.logo-text::after {
+ content: "";
+ position: absolute;
+ bottom: -5px;
+ left: 0;
+ width: 0;
+ height: 2px;
+ background: #6C63FF;
+ transition: width 0.3s ease;
+}
+
+.logo:hover .logo-text::after {
+ width: 100%;
+}
+
+.logo-text span {
+ color: #6C63FF;
+ transition: color 0.3s ease;
+}
+
+.logo:hover .logo-text span {
+ color: #5a52d4;
}
diff --git a/src/components/Reviews/Reviews.css b/src/components/Reviews/Reviews.css
new file mode 100644
index 0000000..d76d031
--- /dev/null
+++ b/src/components/Reviews/Reviews.css
@@ -0,0 +1,48 @@
+.reviews-section {
+ max-width: 800px;
+ margin: 40px auto;
+ padding: 0 20px;
+ }
+
+ .reviews-section h2 {
+ text-align: center;
+ margin-bottom: 32px;
+ font-size: 26px;
+ }
+
+ .reviews-list {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+ }
+
+ .review-card {
+ border: 1px solid #eee;
+ border-radius: 10px;
+ background: #fafbfc;
+ padding: 20px 24px;
+ box-shadow: 0 2px 8px rgba(0,0,0,0.03);
+ }
+
+ .review-text {
+ font-size: 16px;
+ margin-bottom: 12px;
+ color: #222;
+ }
+
+ .review-meta {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ }
+
+ .review-author {
+ font-weight: bold;
+ color: #6C63FF;
+ }
+
+ .star-rating {
+ color: #FFD700;
+ font-size: 18px;
+ }
+
\ No newline at end of file
diff --git a/src/components/Reviews/Reviews.js b/src/components/Reviews/Reviews.js
new file mode 100644
index 0000000..55095ac
--- /dev/null
+++ b/src/components/Reviews/Reviews.js
@@ -0,0 +1,53 @@
+import React from 'react';
+import './Reviews.css';
+
+const reviews = [
+ {
+ id: 1,
+ text: "Очень довольна сервисом и качеством продукции! Кожа стала заметно лучше.",
+ author: "Анна Петрова",
+ rating: 5
+ },
+ {
+ id: 2,
+ text: "Быстрая доставка, приятные цены. Закажу ещё!",
+ author: "Ирина Сидорова",
+ rating: 4
+ },
+ {
+ id: 3,
+ text: "Пользуюсь кремом уже месяц – результат отличный!",
+ author: "Мария Иванова",
+ rating: 5
+ }
+];
+
+function StarRating({ rating }) {
+ return (
+
+ {'★'.repeat(rating)}
+ {'☆'.repeat(5 - rating)}
+
+ );
+}
+
+function Reviews() {
+ return (
+
+ Отзывы пользователей
+
+ {reviews.map(review => (
+
+
"{review.text}"
+
+ {review.author}
+
+
+
+ ))}
+
+
+ );
+}
+
+export default Reviews;
diff --git a/src/img/logo.svg b/src/img/logo.svg
index 7b2ba6a..9248696 100644
--- a/src/img/logo.svg
+++ b/src/img/logo.svg
@@ -1,190 +1,27 @@