@@ -0,0 +1,5 @@
+
+
+
+
+
Binary files /dev/null and b/public/favicon.ico differ
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+ React App
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
@@ -0,0 +1,25 @@
+{
+ "short_name": "React App",
+ "name": "Create React App Sample",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "64x64 32x32 24x24 16x16",
+ "type": "image/x-icon"
+ },
+ {
+ "src": "logo192.png",
+ "type": "image/png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "logo512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ],
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#000000",
+ "background_color": "#ffffff"
+}
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
@@ -0,0 +1,263 @@
+import { useState, useEffect } from 'react';
+import { Link, useNavigate } from 'react-router-dom';
+import Header from "../Header/Header";
+import { useCart } from '../../hooks/UseCard.js';
+import styles from "./BasketMain.module.css";
+
+const CartItem = ({ item, onUpdateQuantity, onRemove }) => {
+
+
+
+
+ return (
+
+
+
{
+ e.target.src = 'https://via.placeholder.com/150x150?text=No+Image';
+ }}
+ />
+
+
+
+
{item.title}
+
{item.description}
+
Цена: ${item.price}
+
+
+
+
+
+ {item.quantity}
+
+
+
+
+ ${(item.price * item.quantity).toLocaleString()}
+
+
+
{
+ onRemove(item.id);
+ }}
+ aria-label="Удалить товар"
+ >
+ ✕
+
+
+
+ );
+};
+
+export default function BasketMain() {
+ const navigate = useNavigate();
+ const [agreements, setAgreements] = useState({
+ newsletter: false,
+ personalData: false,
+ privacyPolicy: false
+ });
+ const [user, setUser] = useState(null);
+
+ const {
+ cart,
+ removeFromCart,
+ clearCart,
+ calculateTotal,
+ calculateItemsCount
+ } = useCart();
+
+ useEffect(() => {
+ const savedUser = localStorage.getItem('currentUser');
+
+ if (savedUser) {
+ try {
+ setUser(JSON.parse(savedUser));
+ } catch (error) {
+ navigate('/login');
+ }
+ } else {
+ navigate('/login');
+ }
+ }, [navigate]);
+
+ const handleAgreementChange = (name) => {
+ setAgreements(prev => ({
+ ...prev,
+ [name]: !prev[name]
+ }));
+ };
+
+ const handleCheckout = () => {
+ if (!agreements.personalData || !agreements.privacyPolicy) {
+ alert('Пожалуйста, согласитесь с условиями обработки данных и политикой конфиденциальности');
+ return;
+ }
+
+ if (cart.length === 0) {
+ alert('Корзина пуста');
+ return;
+ }
+
+
+
+
+ alert(` Заказ оформлен успешно!\n\n Сумма: $${calculateTotal()}\n Товаров: ${calculateItemsCount()}\n Пользователь: ${user?.fullName || user?.email}`);
+
+ clearCart();
+ };
+
+ if (!user) {
+ return (
+
+ );
+ }
+
+ if (cart.length === 0) {
+ return (
+
+
+
+
Корзина пуста
+
+ Добавьте товары из каталога, чтобы сделать заказ
+
+
+ Продолжить покупки
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
Корзина
+
+
+ Покупатель: {user.fullName || user.email}
+ Email: {user.email}
+
+
+
+
+ Ваш заказ ({calculateItemsCount()} {calculateItemsCount() === 1 ? 'товар' : 'товаров'})
+
+ {
+ if (window.confirm('Вы уверены, что хотите очистить корзину?')) {
+ clearCart();
+ }
+ }}
+ >
+ Очистить корзину
+
+
+
+
+ {cart.map(item => (
+
+ ))}
+
+
+
+
+ Товары ({calculateItemsCount()} шт.)
+ ${calculateTotal().toLocaleString()}
+
+
+ Доставка
+ Бесплатно
+
+
+
+ Итого
+
+ ${calculateTotal().toLocaleString()}
+
+
+
+
+
+
Соглашения
+
+
+
+ handleAgreementChange('newsletter')}
+ className={styles.checkbox}
+ />
+ Получать рекламную информацию от prime
+
+
+
+
+
+ handleAgreementChange('personalData')}
+ className={styles.checkbox}
+ required
+ />
+ Я соглашаюсь с условиями на обработку персональных данных *
+
+
+
+
+
+ handleAgreementChange('privacyPolicy')}
+ className={styles.checkbox}
+ required
+ />
+ Я соглашаюсь с политикой конфиденциальности *
+
+
+
+
* Поля обязательны для оформления заказа
+
+
+
+
+ К оплате:
+
+ ${calculateTotal().toLocaleString()}
+
+
+
+
+ Оформить заказ
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
@@ -0,0 +1,446 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+.body {
+ min-height: 100vh;
+ background-color: #000000;
+}
+
+.container {
+ font-family: "Orbitron", sans-serif;
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+
+}
+
+.loading {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 300px;
+}
+
+.loadingSpinner {
+ width: 50px;
+ height: 50px;
+ border: 5px solid #f3f3f3;
+ border-top: 5px solid #3498db;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin-bottom: 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+.userInfo {
+ background: white;
+ padding: 15px 20px;
+ border-radius: 8px;
+ margin-bottom: 20px;
+ display: flex;
+ justify-content: space-between;
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+}
+
+.userInfo span {
+ font-size: 14px;
+ color: #666;
+}
+
+.userInfo strong {
+ color: #333;
+ margin-left: 5px;
+}
+
+.title {
+ font-size: 32px;
+ font-weight: bold;
+ text-align: center;
+ margin-bottom: 30px;
+ color: #333;
+}
+
+.cartHeader {
+ font-family: "Orbitron", sans-serif;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+ padding-bottom: 15px;
+ border-bottom: 2px solid #e0e0e0;
+}
+
+.cartTitle {
+
+ font-size: 20px;
+ font-weight: 600;
+ color: #333;
+ margin: 0;
+}
+
+.clearCartButton {
+ padding: 8px 16px;
+ background-color: #ff6b6b;
+ color: white;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 14px;
+ transition: background-color 0.3s;
+}
+
+.clearCartButton:hover {
+ background-color: #ff5252;
+}
+
+.cartItems {
+ font-family: "Orbitron", sans-serif;
+ background: white;
+ border-radius: 10px;
+ padding: 20px;
+ margin-bottom: 30px;
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+}
+
+.cartItem {
+ font-family: "Orbitron", sans-serif;
+ display: flex;
+ align-items: center;
+ padding: 15px 0;
+ border-bottom: 1px solid #f0f0f0;
+}
+
+.cartItem:last-child {
+ border-bottom: none;
+}
+
+.itemImage {
+ width: 100px;
+ height: 100px;
+ margin-right: 20px;
+ flex-shrink: 0;
+}
+
+.itemImage img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ border-radius: 8px;
+}
+
+.itemInfo {
+ flex: 1;
+}
+
+.itemTitle {
+ font-family: "Orbitron", sans-serif;
+ font-size: 18px;
+ font-weight: 600;
+ margin: 0 0 10px 0;
+ color: #333;
+}
+
+.itemDescription {
+ font-size: 14px;
+ color: #666;
+ margin: 0 0 10px 0;
+ line-height: 1.4;
+}
+
+.itemPrice {
+ font-size: 16px;
+ font-weight: 600;
+ color: #4c77af;
+}
+
+.itemControls {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+}
+
+.quantityControl {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+
+
+
+.quantity {
+ font-size: 18px;
+ font-weight: 600;
+ min-width: 30px;
+ text-align: center;
+}
+
+.itemTotal {
+ font-size: 20px;
+ font-weight: 700;
+ color: #333;
+ min-width: 80px;
+ text-align: right;
+}
+
+.removeButton {
+ width: 30px;
+ height: 30px;
+ background: #b0bce4;
+ color: white;
+ border: none;
+ border-radius: 50%;
+ cursor: pointer;
+ font-size: 18px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: background-color 0.3s;
+}
+
+.removeButton:hover {
+ background: #232c7e;
+}
+
+.orderSummary {
+ background: white;
+ border-radius: 10px;
+ padding: 25px;
+ margin-bottom: 30px;
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+}
+
+.summaryRow {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 10px 0;
+ font-size: 16px;
+ color: #666;
+}
+
+.summaryDivider {
+ height: 1px;
+ background: #e0e0e0;
+ margin: 15px 0;
+}
+
+
+.totalAmount {
+ font-size: 24px;
+ color: #0d1539;
+}
+
+.agreementsSection {
+ background: white;
+ border-radius: 10px;
+ padding: 25px;
+ margin-bottom: 30px;
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+}
+
+.agreementsTitle {
+ font-size: 20px;
+ font-weight: 600;
+ margin-bottom: 20px;
+ color: #333;
+}
+
+.agreementItem {
+ margin-bottom: 15px;
+}
+
+.checkboxLabel {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 16px;
+ color: #333;
+ cursor: pointer;
+}
+
+.checkbox {
+ width: 18px;
+ height: 18px;
+ cursor: pointer;
+ accent-color: #121f56;
+}
+
+.requiredNote {
+ font-size: 14px;
+ color: #666;
+ margin-top: 15px;
+ font-style: italic;
+}
+
+.checkoutSection {
+ background: white;
+ border-radius: 10px;
+ padding: 25px;
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20px;
+}
+
+.checkoutTotal {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ padding-bottom: 20px;
+ border-bottom: 2px solid #e0e0e0;
+}
+
+.checkoutTotalLabel {
+ font-size: 20px;
+ font-weight: 600;
+ color: #666;
+}
+
+.checkoutTotalAmount {
+ font-size: 32px;
+ font-weight: 800;
+ color: #2b239c;
+}
+
+.checkoutButton {
+ padding: 16px 40px;
+ background: #2b239c;
+ color: white;
+ border: none;
+ border-radius: 8px;
+ font-size: 18px;
+ font-weight: 700;
+ cursor: pointer;
+ width: 100%;
+ max-width: 400px;
+ transition: all 0.3s;
+}
+
+.checkoutButton:hover:not(:disabled) {
+ background: #2b239c;
+ transform: translateY(-2px);
+ box-shadow: 0 4px 15px #2b239c(76, 175, 80, 0.3);
+}
+
+.checkoutButton:disabled {
+ background: #cccccc;
+ cursor: not-allowed;
+ transform: none;
+}
+
+.continueShoppingLink {
+ color: #2196F3;
+ text-decoration: none;
+ font-size: 16px;
+ transition: color 0.2s;
+}
+
+.continueShoppingLink:hover {
+ color: #0b7dda;
+ text-decoration: underline;
+}
+
+.emptyCart {
+ font-family: "Orbitron", sans-serif;
+ text-align: center;
+ padding: 60px 20px;
+ max-width: 500px;
+ margin: 0 auto;
+ padding-top: 30rem;
+}
+
+.emptyCartIcon {
+ font-size: 80px;
+ margin-bottom: 20px;
+ opacity: 0.3;
+}
+
+.emptyCartTitle {
+ font-size: 28px;
+ font-weight: 600;
+ margin-bottom: 15px;
+ color: #333;
+}
+
+.emptyCartText {
+ font-size: 16px;
+ color: #666;
+ margin-bottom: 30px;
+}
+
+.continueShopping {
+ display: inline-block;
+ padding: 12px 30px;
+ background: #2196F3;
+ color: white;
+ text-decoration: none;
+ border-radius: 6px;
+ font-weight: 600;
+ transition: background 0.3s;
+}
+
+.continueShopping:hover {
+ background: #0b7dda;
+}
+
+/* Адаптивность */
+@media (max-width: 768px) {
+ .container {
+ padding: 15px;
+ }
+
+ .cartItem {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 15px;
+ }
+
+ .itemImage {
+ width: 100%;
+ height: 200px;
+ margin-right: 0;
+ }
+
+ .itemControls {
+ width: 100%;
+ justify-content: space-between;
+ }
+
+ .userInfo {
+ flex-direction: column;
+ gap: 10px;
+ }
+
+ .checkoutTotal {
+ flex-direction: column;
+ gap: 10px;
+ text-align: center;
+ }
+
+ .checkoutTotalAmount {
+ font-size: 28px;
+ }
+}
\ No newline at end of file
@@ -0,0 +1,217 @@
+import avatar from './avatar.svg';
+import fon from './fon.svg';
+import { useState, useEffect } from 'react';
+import { useNavigate } from 'react-router-dom';
+import Header from "../Header/Header";
+import styles from "./Profile.module.css";
+
+export default function DataProfile() {
+ const navigate = useNavigate();
+ const [user, setUser] = useState(null);
+ const [isLoading, setIsLoading] = useState(true);
+ const [isEditing, setIsEditing] = useState(false);
+ const [editForm, setEditForm] = useState({
+ fullName: '',
+ phone: '',
+ email: ''
+ });
+
+ useEffect(() => {
+ const loadUserData = () => {
+ setIsLoading(true);
+ try {
+ const savedUser = localStorage.getItem('currentUser');
+ if (savedUser) {
+ const userData = JSON.parse(savedUser);
+ setUser(userData);
+ setEditForm({
+ fullName: userData.fullName || '',
+ phone: userData.phone || '',
+ email: userData.email || ''
+ });
+ } else {
+ navigate('/login');
+ }
+ } catch (error) {
+ console.error('Ошибка загрузки данных пользователя:', error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ loadUserData();
+ }, [navigate]);
+
+ const handleEdit = () => {
+ setIsEditing(true);
+ };
+
+ const handleCancelEdit = () => {
+ setIsEditing(false);
+ setEditForm({
+ fullName: user.fullName || '',
+ phone: user.phone || '',
+ email: user.email || ''
+ });
+ };
+
+ const handleSave = () => {
+ if (!editForm.fullName.trim() || !editForm.phone.trim() || !editForm.email.trim()) {
+ alert('Все поля обязательны для заполнения');
+ return;
+ }
+
+ const updatedUser = {
+ ...user,
+ ...editForm
+ };
+
+ setUser(updatedUser);
+ localStorage.setItem('currentUser', JSON.stringify(updatedUser));
+
+ const users = JSON.parse(localStorage.getItem('registeredUsers') || '[]');
+ const updatedUsers = users.map(u =>
+ u.email === user.email ? updatedUser : u
+ );
+ localStorage.setItem('registeredUsers', JSON.stringify(updatedUsers));
+
+ setIsEditing(false);
+ alert('Данные успешно обновлены!');
+ };
+
+ const handleLogout = () => {
+ localStorage.removeItem('currentUser');
+ navigate('/login');
+ };
+
+ const handleInputChange = (e) => {
+ const { name, value } = e.target;
+ setEditForm(prev => ({
+ ...prev,
+ [name]: value
+ }));
+ };
+
+ if (isLoading) {
+ return (
+
+
+
Загрузка профиля...
+
+ );
+ }
+
+ if (!user) {
+ return null;
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
{user.fullName}
+
{user.email}
+
+
+
+
Личная информация
+
+ {isEditing ? (
+
+
+ ФИО
+
+
+
+
+ Email
+
+
+
+
+ Телефон
+
+
+
+
+
+ Сохранить
+
+
+ Отмена
+
+
+
+ ) : (
+ <>
+
+ ФИО:
+ {user.fullName}
+
+
+
+ Email:
+ {user.email}
+
+
+
+ Телефон:
+ {user.phone}
+
+
+
+ Дата регистрации:
+
+ {user.registeredAt ? new Date(user.registeredAt).toLocaleDateString('ru-RU') : 'Не указана'}
+
+
+
+
+
+ Редактировать профиль
+
+
+ Выйти
+
+
+ >
+ )}
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
@@ -0,0 +1,297 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+/* Profile.module.css */
+.body {
+ min-height: 100vh;
+ background-color: #000000;
+
+}
+
+.profileContainer {
+ margin-left: 43rem;
+ font-family: "Orbitron", sans-serif;
+ position: absolute;
+ margin-top: 10rem;
+ display: grid;
+}
+
+.profileTitle {
+ font-size: 2rem;
+ font-weight: bold;
+ text-align: center;
+ color: #333;
+}
+
+.profileInfo {
+ background: rgb(86, 89, 100);
+ border-radius: 12px;
+ padding: 1rem;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+}
+
+
+.avatarSection {
+ align-items: center;
+ text-align: center;
+ margin-bottom: 3rem;
+ padding-bottom: 2rem;
+ border-bottom: 1px solid #eee;
+}
+
+.avatar {
+ text-align: center;
+ width: 19rem;
+ height: auto;
+ margin-left: 8rem;
+}
+
+.userName {
+ font-size: 2rem;
+ font-weight: bold;
+ margin-bottom: 0.5rem;
+ color: #333;
+}
+
+.userEmail {
+ font-size: 1rem;
+ color: #666;
+ margin-bottom: 0;
+}
+
+
+.infoSection {
+ width: 35rem;
+}
+
+.sectionTitle {
+ font-size: 1.5rem;
+ font-weight: 600;
+ margin-bottom: 1.5rem;
+ color: #333;
+ padding-bottom: 1rem;
+ border-bottom: 2px solid #f0f0f0;
+}
+
+.infoRow {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 12px 0;
+ border-bottom: 1px solid #f5f5f5;
+}
+
+.infoRow:last-child {
+ border-bottom: none;
+}
+
+.infoLabel {
+ font-weight: 500;
+ color: #666;
+
+}
+
+.infoValue {
+ font-weight: 400;
+ color: #333;
+ text-align: right;
+ flex: 1;
+}
+
+/* Форма редактирования */
+.editForm {
+ background: #f9f9f9;
+ padding: 1.5rem;
+ border-radius: 8px;
+ border: 1px solid #e0e0e0;
+}
+
+
+
+.label {
+ display: block;
+ margin-bottom: 8px;
+ font-weight: 500;
+ color: #555;
+}
+
+.editInput {
+ width: 100%;
+ padding: 0.5rem 1rem;
+ border: 1px solid #ddd;
+ border-radius: 6px;
+ font-size: 1rem;
+ transition: border-color 0.3s;
+}
+
+.editInput:focus {
+ outline: none;
+ border-color: #667eea;
+ box-shadow: 0 0 0 3px rgba(188, 189, 197, 0.1);
+}
+
+.editButtons {
+ display: flex;
+ gap: 1rem;
+ margin-top: 1.5rem;
+}
+
+.saveButton {
+ padding: 12px ;
+ background: #667eea;;
+ color: white;
+ border: none;
+ border-radius: 6px;
+ font-size: 16px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: transform 0.2s;
+ flex: 1;
+}
+
+.saveButton:hover {
+ transform: translateY(-2px);
+}
+
+.cancelButton {
+ padding: 12px 30px;
+ background: #f0f0f0;
+ color: #666;
+ border: none;
+ border-radius: 6px;
+ font-size: 16px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: background-color 0.2s;
+ flex: 1;
+}
+
+.cancelButton:hover {
+ background: #e0e0e0;
+}
+
+/* Кнопки действий */
+.actionButtons {
+ display: flex;
+ gap: 15px;
+ margin-top: 30px;
+}
+
+.editButton {
+ padding: 12px 30px;
+ background: #667eea;
+ color: white;
+ border: none;
+ border-radius: 6px;
+ font-size: 16px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: background-color 0.2s;
+ flex: 1;
+}
+
+
+
+.logoutButton {
+ padding: 12px 30px;
+ background: #1f1a1a;
+ color: white;
+ border: none;
+ border-radius: 6px;
+ font-size: 16px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: background-color 0.2s;
+ flex: 1;
+}
+
+
+
+.fon{
+
+ margin-top: 10rem;
+ margin-left: 8rem;
+}
+/* Адаптивность */
+@media (max-width: 768px) {
+ .profileContainer {
+ padding: 10px;
+ }
+
+ .infoRow {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 5px;
+ }
+
+ .infoValue {
+ text-align: left;
+ }
+
+ .actionButtons,
+ .editButtons {
+ flex-direction: column;
+ }
+
+ .linksGrid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+@media (max-width: 480px) {
+ .linksGrid {
+ grid-template-columns: 1fr;
+ }
+
+ .profileTitle {
+ font-size: 24px;
+ }
+
+ .userName {
+ font-size: 20px;
+ }
+}
+
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
+
+
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -0,0 +1,29 @@
+import styles from './Footer.module.css'
+import { Link } from 'react-router-dom'
+
+export default function Footer(){
+ return(
+ <>
+
+ prime
+
+ О нас
+ Политика обработки персональных данных
+ Документы на веб-сайте
+
+
+ Вопросы и ответы
+ Заказы и доставка
+ Возврат товара
+
+
+ INSTAGRAM
+ VK
+ YOUTUBE
+ TELEGRAM
+
+
+ >
+ )
+
+}
\ No newline at end of file
@@ -0,0 +1,60 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+
+}
+
+
+.hrr{
+ border-top: 3px solid rgb(255, 255, 255);
+ padding-bottom: 3rem;
+}
+.logo {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+ font-size: 2.25rem;
+ color: #ffffff;
+ margin-top: 4.375rem;
+ margin-left: 8.0625rem;
+}
+.link{
+ display:grid;
+ width: auto;
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1rem;
+ color: #ffffff;
+ margin-top: 3.125rem;
+ margin-left: 18.31rem;
+ text-decoration: none;
+}
+.linkSocial{
+ display:flex;
+ gap: 4rem;
+ width: auto;
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1rem;
+ color: #ffffff;
+ margin-top: 3.125rem;
+ margin-left: 90rem;
+ text-decoration: none;
+}
+a{
+ text-decoration: none;
+}
\ No newline at end of file
@@ -0,0 +1,48 @@
+
+
+import { useState, useEffect } from 'react';
+import { useNavigate } from 'react-router-dom';
+
+
+export default function FunctionBasket() {
+
+
+const navigate = useNavigate();
+ const [user, setUser] = useState(null);
+ const [isLoading, setIsLoading] = useState(true);
+
+
+
+ useEffect(() => {
+ const loadUserData = () => {
+ setIsLoading(true);
+ try {
+ const savedUser = localStorage.getItem('currentUser');
+ if (savedUser) {
+ const userData = JSON.parse(savedUser);
+ setUser(userData);
+
+ } else {
+ navigate('/login');
+ }
+ } catch (error) {
+ console.error('Ошибка загрузки данных пользователя:', error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+ loadUserData();
+ }, [navigate]);
+ if (isLoading) {
+ return (
+
+
+
Загрузка профиля...
+
+ );
+ }
+
+ if (!user) {
+ return null;
+ }
+}
\ No newline at end of file
@@ -0,0 +1,81 @@
+import { Link } from 'react-router-dom';
+import logo from "./menu.svg";
+import styles from './Header.module.css'
+
+
+export default function Header() {
+ return (
+
+ prime
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
@@ -0,0 +1,159 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+.menuimg{
+ width: 5rem;
+ height: auto;
+}
+header {
+ display: flex;
+ position: absolute;
+ margin-top: 4.375rem;
+ margin-left: 8.0625rem;
+}
+.logo {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+ font-size: 2.25rem;
+ color: #ffffff;
+}
+
+.select {
+ width: fit-content;
+ cursor: pointer;
+ position: relative;
+ transition: 300ms;
+ color: rgb(218, 218, 218);
+ overflow: hidden;
+ margin-left: 92.8rem;
+ margin-top: 0.62rem;
+}
+
+.selected {
+ font-family: "Didact Gothic", sans-serif;
+ background-color: #000000;
+ padding: 5px;
+ margin-bottom: 3px;
+ border-radius: 5px;
+ position: relative;
+ z-index: 100000;
+ font-size: 15px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+}
+
+.arrow {
+ position: relative;
+ right: 0px;
+ height: 10px;
+ transform: rotate(-90deg);
+ width: 1rem;
+ fill: rgb(176, 176, 176);
+ z-index: 100000;
+ transition: 300ms;
+}
+
+.options {
+ display: flex;
+ flex-direction: column;
+ border-radius: 5px;
+ padding: 0.5rem;
+ background-color: #000000;
+ position: relative;
+ opacity: 0;
+ transition: 300ms;
+ font-family: "Orbitron", sans-serif;
+}
+
+.select:hover > .options {
+ opacity: 1;
+ top: 0;
+}
+
+.select:hover > .selected .arrow {
+ transform: rotate(0deg);
+}
+
+.option {
+ border-radius: 5px;
+ padding: 10px;
+ transition: 300ms;
+ background-color: #000000;
+ width: 10rem;
+ font-size: 1rem;
+ text-align: left;
+ cursor: pointer;
+ text-decoration: none;
+}
+.option:hover {
+ background-color: #323741;
+}
+
+.options input[type="radio"] {
+ display: none;
+}
+
+.options label {
+ display: inline-block;
+ cursor: pointer;
+ text-decoration: none;
+ color: #ffffffb3;
+}
+.options label::before {
+ content: attr(data-txt);
+ cursor: pointer;
+ text-decoration: none;
+}
+
+.options input[type="radio"]:checked + label {
+ display: none;
+}
+
+.options input[type="radio"]#all:checked + label {
+ display: none;
+}
+a {
+ cursor: pointer;
+ text-decoration: none;
+}
+
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -0,0 +1,26 @@
+import styles from './MainButton.module.css'
+import { Link } from 'react-router-dom';
+
+export default function MainButton() {
+ return (
+
+
+ Больше моделей
+
+
+
+ );
+}
@@ -0,0 +1,107 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+
+:global(.cssbuttons-io-button) {
+ font-family: "Orbitron", sans-serif;
+ background: #ebebeb;
+ color: rgb(0, 0, 0);
+ padding: 0.35em;
+ padding-left: 3.5rem;
+ font-size: 17px;
+ font-weight: 600;
+ border-radius: 0.25rem;
+ border: none;
+ letter-spacing: 0.05em;
+ display: flex;
+ align-items: center;
+ box-shadow: inset 0 0 1.6em -0.6em #ffffff;
+ overflow: hidden;
+ position: relative;
+ height: 2.8em;
+ padding-right: 8rem;
+ cursor: pointer;
+}
+
+:global(.cssbuttons-io-button) .icon{
+ background: #a2b8d9;
+ position: absolute;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 2.5em;
+ width: 2.5em;
+ border-radius: 0.25rem;
+ box-shadow: 0.1em 0.1em 0.6em 0.1em #ffffff;
+ right: 0.3em;
+ transition: all 0.3s;
+}
+
+
+:global(.cssbuttons-io-button:hover) .icon {
+ width: calc(100% - 0.6em);
+}
+
+:global(.cssbuttons-io-button) .icon svg {
+ width: 1.1em;
+ transition: transform 0.3s;
+ color: #ffffff;
+}
+
+:global(.cssbuttons-io-button:hover) .icon svg {
+ transform: translateX(0.1em);
+}
+
+:global(.cssbuttons-io-button:active) .icon {
+ transform: scale(0.95);
+}
+a {
+ cursor: pointer;
+ text-decoration: none;
+}
+
+a:visited {
+ color: inherit;
+}
+.a {
+ position: absolute;
+ margin-top: 15rem;
+ margin-left: 8.0625rem;
+}
+
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
\ No newline at end of file
@@ -0,0 +1,76 @@
+import { useState } from "react";
+import styles from './Slider.module.css'
+
+
+export default function FunctionSlide() {
+ const slides = [
+ {
+ id: 1,
+ img: "/images/rolex.svg",
+ nameSlide: "ROLEX",
+ text: "Коллекция Rolex представлена престижными и высокоточными часовыми моделями на любой вкус, от Профессиональных до Классических.",
+ calibr: "калибр 7135",
+ diametr: "диаметр 40мм",
+ },
+ {
+ id: 2,
+ img: "/images/longines.svg",
+ nameSlide: "Longines",
+ text: "Коллекция Longines представлена престижными и высокоточными часовыми моделями на любой вкус, от Профессиональных до Классических.",
+ calibr: "калибр 8175",
+ diametr: "диаметр 36мм",
+ },
+ {
+ id: 3,
+ img: "/images/marvin.svg",
+ nameSlide: "MARVIN",
+ text: "Коллекция MARVIN представлена престижными и высокоточными часовыми моделями на любой вкус, от Профессиональных до Классических.",
+ calibr: "калибр 3671",
+ diametr: "диаметр 36мм",
+ },
+ ];
+
+ const [currentSlide, setCurrentSlide] = useState(0);
+
+ const nextSlide = () => {
+ setCurrentSlide((prev) => (prev === slides.length - 1 ? 0 : prev + 1));
+ };
+
+ const prevSlide = () => {
+ setCurrentSlide((prev) => (prev === 0 ? slides.length - 1 : prev - 1));
+ };
+
+ if (!slides || slides.length === 0) {
+ return Нет слайдов для отображения
;
+ }
+
+ return (
+
+
+
+ ❮
+
+
+ ❯
+
+
+
+
+
+
+
{slides[currentSlide].nameSlide}
+ {slides[currentSlide].text}
+
+
+
+ {slides[currentSlide].calibr}
+ {slides[currentSlide].diametr}
+
+
+
+ );
+}
@@ -0,0 +1,142 @@
+:global(.slider-container) {
+ display: flex;
+ transition: transform 0.5s ease-in-out;
+ width: 2rem;
+}
+
+.prevbtn,
+.nextbtn {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ background: rgba(255, 255, 255, 0.5);
+ border-radius: 100px;
+ color: white;
+ border: none;
+ padding: 8px 16px 8px 16px;
+ cursor: pointer;
+ font-size: 18px;
+ font-weight: bold;
+ z-index: 2;
+}
+
+.prevbtn {
+ margin-left: 58.7rem;
+}
+
+.nextbtn {
+ margin-left: 90rem;
+}
+
+.slide {
+ transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;
+}
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+
+.slideContent {
+ text-align: justify;
+ color: #ffffff;
+ margin-left: 8rem;
+}
+h1 {
+ margin-top: 15rem;
+ font-family: "Orbitron", sans-serif;
+ font-size: 9.875rem;
+ padding-bottom: 3rem;
+}
+.slideText {
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1.125rem;
+ color: #ffffff;
+ position: absolute;
+ margin-left: 102rem;
+ gap: 1rem;
+ flex-direction: column;
+ display: flex;
+ margin-top: 15rem;
+ width: 13rem;
+ word-spacing: 5rem;
+}
+
+.description {
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1.125rem;
+ width: 100%;
+}
+.slideImage {
+ position: absolute;
+ padding-left: 63rem;
+ display: flex;
+ width: 72%;
+ padding-top: 12rem;
+ animation: 0.5s ease-in-out forwards;
+}
+
+.slide.next {
+ animation: slideInNext 0.5s ease-in-out forwards;
+}
+
+.slide.prev {
+ animation: slideInPrev 0.5s ease-in-out forwards;
+}
+
+@keyframes slideInNext {
+ 0% {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ 100% {
+ transform: translateX(0);
+ opacity: 1;
+ }
+}
+
+@keyframes slideInPrev {
+ 0% {
+ transform: translateX(-100%);
+ opacity: 0;
+ }
+ 100% {
+ transform: translateX(0);
+ opacity: 1;
+ }
+}
+
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
\ No newline at end of file
@@ -0,0 +1,135 @@
+import styles from './Cards.module.css'
+import { useState } from 'react';
+import { useCart } from '../../hooks/UseCard.js';
+const cardsData = [
+ {
+ id: 1,
+ title: "ROLEX",
+ photo:'/images/rolex.svg',
+ description: "Ролекс - роскошные часы с классическим дизайном, прочными корпусами и высокоточными механизмами.",
+ price: 10000,
+ },
+ {
+ id: 2,
+ title: "LONGINES",
+ photo:'/images/longines.svg',
+ description: "Longines - швейцарские часы с длинной истории и традициями. Известны своей элегантностью, точностью и качеством.",
+ price: 12000,
+ },
+ {
+ id: 3,
+ title: "MARVIN",
+ photo:'/images/marvin.svg',
+ description: "MARVIN известен своими точными механическими часами, которые пользуются популярностью.",
+ price: 19000,
+ },
+ {
+ id: 4,
+ title: "ZENITH",
+ photo:'/images/zenith.svg',
+ description: "Зенит известна своей инновационной технологией и высокой точностью. Одним из самых известных моделей Зенита является Эль-Примо.",
+ price: 11000,
+ },
+ {
+ id: 5,
+ title: "PAUL HEITT",
+ photo:'/images/paul.svg',
+ description: "Пол Хевитт известен своими стильными и функциональными часами, которые сочетают в себе современный дизайн и высокую точность.",
+ price: 22000,
+ },
+ {
+ id: 6,
+ title: "LONGINES",
+ photo:'/images/longines2.svg',
+ description: "Longines - швейцарские часы с длинной истории и традициями. Известны своей элегантностью, точностью и качеством.",
+ price: 10000,
+ },
+ {
+ id: 7,
+ title: "Hampden",
+ photo:'/images/hampden.svg',
+ description: "Хэмпден известен своими высокоточными часами и механизмами, которые производятся вручную в Шотландии",
+ price: 11000,
+ },
+ {
+ id: 8,
+ title: "ROLEX",
+ photo:'/images/rolex2.svg',
+ description: "Ролекс - роскошные часы с классическим дизайном, прочными корпусами и высокоточными механизмами.",
+ price: 22000,
+ },
+ {
+ id: 9,
+ title: "OMEGA",
+ photo:'/images/omega.svg',
+ description: "Omega - это швейцарская марка часов, известная своей высокой точностью, инновациями и историческими достижениями.",
+ price: 12000,
+ },
+];
+
+const Card = ({ id, title, description, photo, price }) => {
+ const { addToCart } = useCart();
+ const [isAdding, setIsAdding] = useState(false);
+
+ const handleAddToCart = () => {
+ setIsAdding(true);
+ addToCart({ id, title, description, photo, price });
+
+ setTimeout(() => {
+ setIsAdding(false);
+ }, 300);
+ };
+
+
+ return (
+
+
{title}
+
+
{description}
+
+ {price}$
+
+ {isAdding ? 'Добавлено!' : 'В корзину'}
+
+
+
+ );
+};
+
+export default function CardsGrid(){
+ const chunkArray = (array, chunkSize) => {
+ const result = [];
+ for (let i = 0; i < array.length; i += chunkSize) {
+ result.push(array.slice(i, i + chunkSize));
+ }
+ return result;
+ };
+
+ const cardGroups = chunkArray(cardsData, 3);
+
+ return (
+
+
+ {cardGroups.map((group, groupIndex) => (
+
+ {group.map((card) => (
+
+ ))}
+
+ ))}
+
+
+ );
+};
+
+
@@ -0,0 +1,131 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+
+
+.container {
+ margin-left: 3rem;
+
+ padding: 10px;
+ padding-top: 18rem;
+}
+.image{
+ width: 19.75rem;
+ height: auto;
+ padding-top: 2.3rem;
+ margin-bottom: 2.625rem;
+ max-height: 34rem;
+
+}
+.row {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 5rem;
+ margin-bottom: 10rem;
+ text-align: center;
+ background-image: url(fon.svg);
+}
+
+.card {
+ text-align: center;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 2px 4px rgb(255, 255, 255);
+ transition: transform 0.3s ease;
+}
+
+.card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 4px 8px rgb(255, 255, 255);
+}
+
+.title {
+ font-family: "Orbitron", sans-serif;
+ font-size: 3rem;
+ margin-bottom: 10px;
+ color: #000000;
+ text-align: center;
+
+}
+
+.description {
+ margin-left: 6.5rem;
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1.125rem;
+ line-height: 1.5;
+ color: #000000;
+ margin-bottom: 15px;
+ display: flex;
+ text-align: justify;
+ width: 20rem;
+}
+
+.footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.counter {
+ font-family: "Orbitron", sans-serif;
+ font-size: 1.25rem;
+ margin-left: 3.5625rem;
+ padding-top: 0.623rem;
+ font-weight: bold;
+ color: #000000;
+}
+.addToCartButton{
+ display: flex;
+ width: 11.625rem;
+ background-color: #000000;
+ height: 2.875rem;
+ display: flex;
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1.25rem;
+ color: #ffffff;
+ padding-left: 3rem;
+ padding-top: 0.623rem;
+}
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
+
+
@@ -0,0 +1,71 @@
+import { useState, useEffect } from 'react';
+
+export const useCart = () => {
+ const [cart, setCart] = useState(() => {
+ try {
+ const savedCart = localStorage.getItem('cart');
+ return savedCart ? JSON.parse(savedCart) : [];
+ } catch (error) {
+ return [];
+ }
+ });
+
+ useEffect(() => {
+ localStorage.setItem('cart', JSON.stringify(cart));
+ }, [cart]);
+
+ const addToCart = (product) => {
+ if (!product || !product.id) {
+ return;
+ }
+
+ setCart(prevCart => {
+ const existingItem = prevCart.find(item => item.id === product.id);
+
+ if (existingItem) {
+ return prevCart.map(item =>
+ item.id === product.id
+ ? { ...item, quantity: item.quantity + 1 }
+ : item
+ );
+ } else {
+ return [...prevCart, {
+ id: product.id,
+ title: product.title || product.name || 'Без названия',
+ description: product.description || '',
+ price: Number(product.price) || 0,
+ photo: product.photo || product.image || '',
+ quantity: 1
+ }];
+ }
+ });
+ };
+
+ const removeFromCart = (productId) => {
+ setCart(prevCart => prevCart.filter(item => item.id !== productId));
+ };
+
+
+
+ const clearCart = () => {
+ setCart([]);
+ };
+
+ const calculateTotal = () => {
+ return cart.reduce((total, item) => total + (item.price * item.quantity), 0);
+ };
+
+ const calculateItemsCount = () => {
+ return cart.reduce((total, item) => total + item.quantity, 0);
+ };
+
+ return {
+ cart,
+ addToCart,
+ removeFromCart,
+
+ clearCart,
+ calculateTotal,
+ calculateItemsCount
+ };
+};
\ No newline at end of file
@@ -0,0 +1,58 @@
+import Header from "../../components/Header/Header";
+import Footer from "../../components/Footer/Footer";
+import styles from './About.module.css'
+import video from './video.mp4'
+
+export default function Catalog(){
+ return(
+
+
+
+
+ prime
+ Prime — время стильных решений, которые подчеркивают вашу
+ индивидуальность и надежность.
+ Создаем будущее вместе с вами, воплощая инновации и качество в каждом
+ шаге.
+
+
+
+
+
+
+
+ Компания Prime — это ведущий онлайн-ритейлер в сфере продажи часов,
+ ставший выбором номер один для ценителей точности, стиля и надежности.
+ Мы предлагаем широкий ассортимент часов от мировых брендов, таких как
+ Rolex, Omega, Casio, Seiko и многие другие, чтобы удовлетворить любые
+ предпочтения и бюджеты. В Prime каждый клиент найдет идеальную модель
+ — будь то элегантные классические часы для деловых встреч, спортивные
+ модели для активного образа жизни или современные стильные аксессуары
+ для повседневного использования.
+
+ Наши преимущества:
+
+ - Официальная гарантия на все товары
+ - Гарантированная оригинальность продукции
+ - Консультации специалистов для выбора идеальной модели
+ - Быстрая и надежная доставка по всей стране и за рубеж
+ - Удобные способы оплаты и возврата
+
+
+
+ Мы ценим каждого клиента и стремимся сделать покупку максимально
+ комфортной и приятной. В Prime вас ждут не только качественные часы,
+ но и высокий уровень сервиса, индивидуальный подход и постоянное
+ обновление ассортимента. Независимо от того, ищете ли вы классический
+ аксессуар, современный дизайн или уникальную модель — в Prime вы
+ обязательно найдете то, что подчеркнет вашу индивидуальность и стиль.
+
+
+
+
+
+
+
+
)
+}
\ No newline at end of file
@@ -0,0 +1,112 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+.body{
+ background-color: black;
+
+}
+video{
+ width: 103.875rem;
+ margin-top: 14rem;
+ margin-left: 8rem;
+}
+main {
+ margin-left: 8rem;
+ margin-top: 9.75rem;
+ display: flex;
+ color: #000;
+
+}
+.aboutText {
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1.5rem;
+ width: 40rem;
+ position: absolute;
+ margin-top: 9.7rem;
+ margin-left: 8.18rem;
+ text-align: justify;
+}
+.aboutText2 {
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1.5rem;
+ width: 24rem;
+ position: absolute;
+ margin-top: 47.5rem;
+ margin-left: 73.125rem;
+ text-align: justify;
+
+}
+img {
+ width: 103.875rem;
+ height: auto;
+}
+.logo{
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+ font-size: 4rem;
+ color: #ffffff;
+ position: absolute;
+ margin-left: 8.125rem;
+ margin-top: 1.5rem;
+}
+.men {
+ width: 31.125rem;
+}
+.fon {
+ width: 66.9375rem;
+ margin-left: 5.6875rem;
+
+}
+.text {
+ color: #000000;
+ position: absolute;
+ width: 61.875rem;
+ text-align: justify;
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1.15rem;
+ margin-left: 39.4rem;
+ margin-top: 2rem;
+}
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
\ No newline at end of file
Binary files /dev/null and b/src/pages/About/video.mp4 differ
@@ -0,0 +1,162 @@
+import { useState } from 'react';
+import { Link, useNavigate } from 'react-router-dom';
+
+import styles from "./Login.module.css";
+import Header from '../../../components/Header/Header';
+
+export default function Login() {
+ const navigate = useNavigate();
+
+ const [formData, setFormData] = useState({
+ email: '',
+ password: ''
+ });
+
+ const [fieldErrors, setFieldErrors] = useState({});
+ const [isLoading, setIsLoading] = useState(false);
+ const [serverError, setServerError] = useState('');
+ const [showErrors, setShowErrors] = useState(false);
+
+ const handleInputChange = (e) => {
+ const { name, value } = e.target;
+ setFormData(prev => ({
+ ...prev,
+ [name]: value
+ }));
+
+ if (fieldErrors[name]) {
+ setFieldErrors(prev => ({
+ ...prev,
+ [name]: ''
+ }));
+ }
+
+ if (serverError) {
+ setServerError('');
+ }
+ };
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ setShowErrors(true);
+ setServerError('');
+
+ const newErrors = {};
+
+ if (!formData.email.trim()) newErrors.email = 'Заполните это поле.';
+ if (!formData.password) newErrors.password = 'Заполните это поле.';
+
+ if (Object.keys(newErrors).length > 0) {
+ setFieldErrors(newErrors);
+ return;
+ }
+
+ setIsLoading(true);
+
+ try {
+ await new Promise(resolve => setTimeout(resolve, 1000));
+
+ const users = JSON.parse(localStorage.getItem('registeredUsers') || '[]');
+ const user = users.find(u => u.email === formData.email);
+
+ if (!user) {
+ setServerError('Пользователь с таким email не найден');
+ setIsLoading(false);
+ return;
+ }
+
+ const userSessionData = {
+ email: user.email,
+ fullName: user.fullName || 'Пользователь',
+ phone: user.phone || '',
+ registeredAt: user.registeredAt || new Date().toISOString()
+ };
+
+ localStorage.setItem('currentUser', JSON.stringify(userSessionData));
+
+ console.log('Вход выполнен успешно:', userSessionData);
+
+ navigate('/profile');
+
+ } catch (error) {
+ console.error('Ошибка при входе:', error);
+ setServerError('Ошибка сервера. Попробуйте позже.');
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const getInputClass = (fieldName) => {
+ if (showErrors && fieldErrors[fieldName]) {
+ return `${styles.input} ${styles.inputError}`;
+ }
+ return styles.input;
+ };
+
+ const getPlaceholder = (fieldName, defaultPlaceholder) => {
+ if (showErrors && fieldErrors[fieldName]) {
+ return fieldErrors[fieldName];
+ }
+ return defaultPlaceholder;
+ };
+
+ return (
+
+
+
Вход
+
+
+
+
+
+
+
+ );
+}
@@ -0,0 +1,131 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+.body{
+ background-color: black;
+ padding-bottom: 9.5rem;
+}
+.fon {
+ width: 78.375rem;
+ height: auto;
+ padding-top: 13.125rem;
+ margin-left: 21.5rem;
+}
+.h1 {
+ font-family: "Orbitron", sans-serif;
+ font-size: 4rem;
+ color: #ffffff;
+ font-weight: 700;
+ margin-top: 15.1875rem;
+ margin-left: 53rem;
+ position: absolute;
+}
+.group{
+ position: absolute;
+ display: grid;
+ margin-left: 39.125rem;
+ margin-top: 30rem;
+ gap: 1rem;
+}
+.input {
+ width: 41.75rem;
+ height: 3.75rem;
+ padding-left: 1rem;
+ border-radius: 12px;
+ border: 1.5px solid rgb(255, 255, 255);
+ outline: none;
+ transition: all 0.3s cubic-bezier(0.19, 1, 0.22, 1);
+ box-shadow: 0px 0px 20px -18px;
+ background-color: #f4f4f4ae;
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1.1rem;
+ color: #ffffff;
+
+}
+.input:hover {
+ border: 2px solid rgb(255, 255, 255);
+ box-shadow: 0px 0px 20px -17px;
+}
+
+.input:active {
+ transform: scale(0.95);
+}
+
+.input:focus {
+ border: 2px solid rgb(255, 255, 255);
+}
+
+.button{
+ position: absolute;
+ width: 24.0625rem;
+ height: 3.75rem;
+ background-color: #ffffff;
+ border-radius: 0.625rem;
+ margin-top: 43.25rem;
+ margin-left: 47.9375rem;
+}
+.buttontext{
+ font-family: "Orbitron", sans-serif;
+ font-size: 1.25rem;
+ text-align: center;
+
+ display: block;
+}
+
+.buttom:hover{
+transform: scale(1.1);
+cursor: pointer;
+}
+.text{
+
+ font-family: "Orbitron", sans-serif;
+ font-size: 1rem;
+ color: #ffffff;
+ text-align: center;
+}
+.link{
+ font-family: "Orbitron", sans-serif;
+ font-size: 1rem;
+ color: #120fa0;
+}
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
\ No newline at end of file
@@ -0,0 +1,183 @@
+import { useState } from 'react';
+import { Link, useNavigate } from 'react-router-dom';
+import styles from "./Registration.module.css";
+import Header from '../../../components/Header/Header';
+
+export default function Registration() {
+ const navigate = useNavigate();
+
+ const [formData, setFormData] = useState({
+ email: '',
+ fullName: '',
+ phone: '',
+ password: '',
+ confirmPassword: ''
+ });
+
+ const [fieldErrors, setFieldErrors] = useState({});
+ const [isLoading, setIsLoading] = useState(false);
+ const [showErrors, setShowErrors] = useState(false);
+
+ const handleInputChange = (e) => {
+ const { name, value } = e.target;
+ setFormData(prev => ({
+ ...prev,
+ [name]: value
+ }));
+
+ if (fieldErrors[name]) {
+ setFieldErrors(prev => ({
+ ...prev,
+ [name]: ''
+ }));
+ }
+ };
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ setShowErrors(true);
+
+ const newErrors = {};
+
+ if (!formData.email.trim()) newErrors.email = 'Заполните это поле.';
+ if (!formData.fullName.trim()) newErrors.fullName = 'Заполните это поле.';
+ if (!formData.phone.trim()) newErrors.phone = 'Заполните это поле.';
+ if (!formData.password) newErrors.password = 'Заполните это поле.';
+ if (!formData.confirmPassword) newErrors.confirmPassword = 'Заполните это поле.';
+
+ if (Object.keys(newErrors).length > 0) {
+ setFieldErrors(newErrors);
+ return;
+ }
+
+ setIsLoading(true);
+
+ try {
+ await new Promise(resolve => setTimeout(resolve, 1000));
+ console.log('Данные для регистрации:', formData);
+
+ const userData = {
+ email: formData.email,
+ fullName: formData.fullName,
+ phone: formData.phone,
+ registeredAt: new Date().toISOString(),
+ };
+
+ localStorage.setItem('currentUser', JSON.stringify(userData));
+
+ const existingUsers = JSON.parse(localStorage.getItem('registeredUsers') || '[]');
+ localStorage.setItem('registeredUsers', JSON.stringify([...existingUsers, userData]));
+
+ console.log('Пользователь зарегистрирован:', userData);
+
+
+ setTimeout(() => {
+ navigate('/login');
+ }, 2000);
+
+ } catch (error) {
+ console.error('Ошибка регистрации:', error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+ const getInputClass = (fieldName) => {
+ if (showErrors && fieldErrors[fieldName]) {
+ return `${styles.input} ${styles.inputError}`;
+ }
+ return styles.input;
+ };
+
+ const getPlaceholder = (fieldName, defaultPlaceholder) => {
+ if (showErrors && fieldErrors[fieldName]) {
+ return fieldErrors[fieldName];
+ }
+ return defaultPlaceholder;
+ };
+
+ return (
+
+
+
Регистрация
+
+
+
+
+
+ );
+}
\ No newline at end of file
@@ -0,0 +1,131 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+.body{
+ background-color: black;
+ padding-bottom: 9.5rem;
+}
+.fon {
+ width: 78.375rem;
+ height: auto;
+ padding-top: 13.125rem;
+ margin-left: 21.5rem;
+}
+.h1 {
+ font-family: "Orbitron", sans-serif;
+ font-size: 4rem;
+ color: #ffffff;
+ font-weight: 700;
+ margin-top: 15.1875rem;
+ margin-left: 48rem;
+ position: absolute;
+}
+.group{
+ position: absolute;
+ display: grid;
+ margin-left: 39.125rem;
+ margin-top: 25rem;
+ gap: 1rem;
+}
+.input {
+ width: 41.75rem;
+ height: 3.75rem;
+ padding-left: 1rem;
+ border-radius: 12px;
+ border: 1.5px solid rgb(255, 255, 255);
+ outline: none;
+ transition: all 0.3s cubic-bezier(0.19, 1, 0.22, 1);
+ box-shadow: 0px 0px 20px -18px;
+ background-color: #f4f4f4ae;
+ font-family: "Didact Gothic", sans-serif;
+ font-size: 1.1rem;
+ color: #ffffff;
+
+}
+.input:hover {
+ border: 2px solid rgb(255, 255, 255);
+ box-shadow: 0px 0px 20px -17px;
+}
+
+.input:active {
+ transform: scale(0.95);
+}
+
+.input:focus {
+ border: 2px solid rgb(255, 255, 255);
+}
+
+.button{
+ position: absolute;
+ width: 24.0625rem;
+ height: 3.75rem;
+ background-color: #ffffff;
+ border-radius: 0.625rem;
+ margin-top: 51rem;
+ margin-left: 47.9375rem;
+}
+.buttontext{
+ font-family: "Orbitron", sans-serif;
+ font-size: 1.25rem;
+ text-align: center;
+
+ display: block;
+}
+
+.button:hover{
+transform: scale(1.1);
+cursor: pointer;
+}
+.text{
+
+ font-family: "Orbitron", sans-serif;
+ font-size: 1rem;
+ color: #ffffff;
+ text-align: center;
+}
+.link{
+ font-family: "Orbitron", sans-serif;
+ font-size: 1rem;
+ color: #120fa0;
+}
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
@@ -0,0 +1,15 @@
+import Footer from "../../components/Footer/Footer";
+import Header from "../../components/Header/Header";
+import styles from './Basket.module.css'
+import FunctionBasket from "../../components/FunctionBasket/FunctionBasket";
+import Cart from "../../components/BasketMain/BasketMain";
+
+export default function Basket(){
+
+ return(
+
+
+
+
+
)
+}
\ No newline at end of file
@@ -0,0 +1,49 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+.body{
+ background-color: black;
+
+}
+
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
\ No newline at end of file
@@ -0,0 +1,12 @@
+import Footer from "../../components/Footer/Footer";
+import Header from "../../components/Header/Header";
+import CardsGrid from "../../components/Сards/Cards";
+import styles from './Catalog.module.css'
+
+export default function Catalog(){
+ return(
+
+
+
+
)
+}
\ No newline at end of file
@@ -0,0 +1,49 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+.body{
+ background-color: black;
+
+}
+
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
\ No newline at end of file
@@ -0,0 +1,15 @@
+import styles from "./Error.module.css"
+import Header from "../../components/Header/Header";
+
+
+ export default function Home(){
+ return (
+
+
+
+
404
+ Страница не найдена
+
+
+ );
+ }
\ No newline at end of file
@@ -0,0 +1,61 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+
+}
+.body{
+ background-color: black;
+ width: 100vw;
+ height: 100vh;
+}
+.main{
+ padding-top: 10rem;
+ display:grid;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
+}
+
+.text{
+ font-size: 1.2rem;
+}
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
\ No newline at end of file
@@ -0,0 +1,14 @@
+import styles from './Home.module.css'
+import Header from "../../components/Header/Header";
+import MainButton from "../../components/MainButton/MainButton";
+import FunctionSlide from "../../components/Slider/FunctionSlide";
+
+ export default function Home(){
+ return (
+
+
+
+
+
+ );
+ }
\ No newline at end of file
@@ -0,0 +1,53 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+
+* {
+ margin: 0;
+ box-sizing: border-box;
+}
+.body {
+ font-size: 16px;
+ width: 100%;
+ height: 65rem;
+ background-size: 119rem;
+ background-image: url(/public/images/Group\ 172.svg);
+
+}
+
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
@@ -0,0 +1,12 @@
+import Footer from "../../components/Footer/Footer";
+import Header from "../../components/Header/Header";
+import DataProfile from "../../components/DataProfile/DataProfile"
+import styles from './Profile.module.css'
+
+export default function Profile(){
+ return(
+
+
+
+
)
+}
\ No newline at end of file
@@ -0,0 +1,49 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+.body{
+ background-color: black;
+
+}
+
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
\ No newline at end of file
@@ -0,0 +1,49 @@
+@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap");
+@import url("https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap");
+
+.orbitron {
+ font-family: "Orbitron", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: weight;
+ font-style: normal;
+}
+.didact-gothic-regular {
+ font-family: "Didact Gothic", sans-serif;
+ font-weight: 400;
+ font-style: normal;
+}
+
+* {
+ margin: 0;
+ box-sizing: border-box;
+}
+html {
+ font-size: 16px;
+ width: 100%;
+}
+
+@media (max-width: 1920px) {
+ html {
+ font-size: 16px;
+ }
+}
+@media (max-width: 1680px) {
+ html {
+ font-size: 12.38px;
+ }
+}
+@media (max-width: 1440px) {
+ html {
+ font-size: 10px;
+ }
+}
+@media (max-width: 1080px) {
+ html {
+ font-size: 8px;
+ }
+}
+@media (max-width: 720px) {
+ html {
+ font-size: 5px;
+ }
+}
@@ -0,0 +1,30 @@
+ import "./App.css";
+import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
+import Home from './pages/Home/Home';
+import Catalog from './pages/Catalog/Catalog';
+import Error from './pages/Error/Error';
+import Login from './pages/Auth/Login/Login'
+import Registration from './pages/Auth/Registration/Registration'
+import About from './pages/About/About'
+import Profile from "./pages/Profile/Profile";
+import Basket from "./pages/Basket/Basket";
+
+function App() {
+ return (
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
+
+
+ );
+}
+
+export default App;
@@ -0,0 +1,8 @@
+import { render, screen } from '@testing-library/react';
+import App from './App';
+
+test('renders learn react link', () => {
+ render( );
+ const linkElement = screen.getByText(/learn react/i);
+ expect(linkElement).toBeInTheDocument();
+});
@@ -0,0 +1,3 @@
+main{
+ color: black;
+}
\ No newline at end of file
@@ -0,0 +1,17 @@
+import React from 'react';
+import ReactDOM from 'react-dom/client';
+import './index.css';
+import App from './App';
+import reportWebVitals from './reportWebVitals';
+
+const root = ReactDOM.createRoot(document.getElementById('root'));
+root.render(
+
+
+
+);
+
+// If you want to start measuring performance in your app, pass a function
+// to log results (for example: reportWebVitals(console.log))
+// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
+reportWebVitals();
@@ -0,0 +1,13 @@
+const reportWebVitals = onPerfEntry => {
+ if (onPerfEntry && onPerfEntry instanceof Function) {
+ import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
+ getCLS(onPerfEntry);
+ getFID(onPerfEntry);
+ getFCP(onPerfEntry);
+ getLCP(onPerfEntry);
+ getTTFB(onPerfEntry);
+ });
+ }
+};
+
+export default reportWebVitals;
@@ -0,0 +1,5 @@
+// jest-dom adds custom jest matchers for asserting on DOM nodes.
+// allows you to do things like:
+// expect(element).toHaveTextContent(/react/i)
+// learn more: https://github.com/testing-library/jest-dom
+import '@testing-library/jest-dom';
@@ -0,0 +1,23 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# production
+/build
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
@@ -0,0 +1,70 @@
+# Getting Started with Create React App
+
+This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
+
+## Available Scripts
+
+In the project directory, you can run:
+
+### `npm start`
+
+Runs the app in the development mode.\
+Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
+
+The page will reload when you make changes.\
+You may also see any lint errors in the console.
+
+### `npm test`
+
+Launches the test runner in the interactive watch mode.\
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
+
+### `npm run build`
+
+Builds the app for production to the `build` folder.\
+It correctly bundles React in production mode and optimizes the build for the best performance.
+
+The build is minified and the filenames include the hashes.\
+Your app is ready to be deployed!
+
+See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
+
+### `npm run eject`
+
+**Note: this is a one-way operation. Once you `eject`, you can't go back!**
+
+If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
+
+Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
+
+You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
+
+## Learn More
+
+You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
+
+To learn React, check out the [React documentation](https://reactjs.org/).
+
+### Code Splitting
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
+
+### Analyzing the Bundle Size
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
+
+### Making a Progressive Web App
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
+
+### Advanced Configuration
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
+
+### Deployment
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
+
+### `npm run build` fails to minify
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
@@ -0,0 +1,43 @@
+{
+ "name": "my-app",
+ "version": "0.1.0",
+ "private": true,
+ "dependencies": {
+ "@emotion/react": "^11.14.0",
+ "@emotion/styled": "^11.14.1",
+ "@mui/material": "^7.3.6",
+ "@testing-library/dom": "^10.4.1",
+ "@testing-library/jest-dom": "^6.9.1",
+ "@testing-library/react": "^16.3.1",
+ "@testing-library/user-event": "^13.5.0",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-router-dom": "^7.11.0",
+ "react-scripts": "5.0.1",
+ "web-vitals": "^2.1.4"
+ },
+ "scripts": {
+ "start": "react-scripts start",
+ "build": "react-scripts build",
+ "test": "react-scripts test",
+ "eject": "react-scripts eject"
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app",
+ "react-app/jest"
+ ]
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ }
+}