Files
PIbd-23_Baryshev_D.A._Inter…/catalog.html
2025-10-09 13:53:23 +04:00

753 lines
39 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>cyxaruk shop catalog</title>
<link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css">
<link rel="stylesheet" href="./styles.css" />
<style>
.card-actions {
position: absolute;
top: 10px;
right: 10px;
z-index: 10;
}
.card-actions .btn {
background-color: white !important;
border: 1px solid !important;
transition: all 0.2s ease;
}
.card-actions .btn:hover {
background-color: white !important;
transform: scale(1.1);
}
/* Стили для кнопки редактирования */
.card-actions .btn-outline-primary {
color: #0d6efd !important;
border-color: #0d6efd !important;
}
.card-actions .btn-outline-primary:hover {
color: #0d6efd !important;
border-color: #0d6efd !important;
background-color: white !important;
}
/* Стили для кнопки удаления */
.card-actions .btn-outline-danger {
color: #dc3545 !important;
border-color: #dc3545 !important;
}
.card-actions .btn-outline-danger:hover {
color: #dc3545 !important;
border-color: #dc3545 !important;
background-color: white !important;
}
/* Стили для лайков */
.like-btn.liked {
color: #000000 !important;
border-color: #dc3545 !important;
}
.like-btn.liked i {
color: #dc3545 !important;
}
.like-btn.liked:hover i {
text-shadow: 0 0 2px #000000,
0 0 2px #000000,
0 0 2px #000000;
}
.like-btn i {
transition: text-shadow 0.2s ease;
}
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark" style="background-color: #00264d;">
<div class="container">
<a class="navbar-brand d-flex align-items-center" href="main.html">
<img src="img/cyxaruk shop logo.jpg" alt="логотип" width="50" height="50" class="rounded-circle me-2">
<span class="fw-bold">cyxaruk shop</span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="catalog.html" id="navbarDropdown" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-list-ul me-1"></i>Каталог
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="catalog.html"><i class="bi bi-gender-male me-2"></i>Для мужчин</a></li>
<li><a class="dropdown-item" href="catalog.html"><i class="bi bi-gender-female me-2"></i>Для женщин</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="catalog.html"><i class="bi bi-globe me-2"></i>Заказ из-за границы</a></li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link" href="contacts.html"><i class="bi bi-telephone me-1"></i>Контакты</a>
</li>
<li class="nav-item">
<a class="nav-link" href="likes.html"><i class="bi bi-heart me-1"></i>Избранное</a>
</li>
<li class="nav-item">
<a class="nav-link" href="basket.html"><i class="bi bi-cart me-1"></i>Корзина</a>
</li>
</ul>
</div>
</div>
</nav>
<style>
@media (min-width: 992px) {
.navbar .dropdown:hover .dropdown-menu {
display: block;
}
.navbar .dropdown .dropdown-menu {
margin-top: 0;
}
}
</style>
<!-- Модальное окно редактирования товара -->
<div class="modal fade" id="editProductModal" tabindex="-1" aria-labelledby="editProductModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="editProductModalLabel">Редактировать товар</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="editProductForm" class="row g-3">
<input type="hidden" id="editProductIndex">
<div class="col-md-6">
<label for="editProductName" class="form-label">Название товара</label>
<input type="text" class="form-control" id="editProductName" required>
</div>
<div class="col-md-6">
<label for="editProductPrice" class="form-label">Цена</label>
<input type="text" class="form-control" id="editProductPrice" required>
</div>
<div class="col-md-6">
<label for="editProductCategory" class="form-label">Категория</label>
<select class="form-select" id="editProductCategory" required>
<option value="">Выберите категорию</option>
<option value="1">Для мужчин</option>
<option value="2">Для женщин</option>
<option value="3">Унисекс</option>
</select>
</div>
<div class="col-md-6">
<label for="editProductCondition" class="form-label">Состояние</label>
<select class="form-select" id="editProductCondition" required>
<option value="">Выберите состояние</option>
<option value="1">Новый</option>
<option value="2">Б/У</option>
</select>
</div>
<div class="col-12">
<label for="editProductDescription" class="form-label">Описание</label>
<textarea class="form-control" id="editProductDescription" rows="3" required></textarea>
</div>
<div class="col-12">
<label for="editProductImage" class="form-label">Ссылка на изображение</label>
<input type="text" class="form-control" id="editProductImage" required>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn" style="background-color: #00264d; color: white;" id="saveProductChanges">
<i class="bi bi-check-circle me-2"></i>Сохранить изменения
</button>
</div>
</div>
</div>
</div>
<main class="container my-4">
<div class="accordion" id="accordionExample">
<div class="accordion-item">
<h2 class="accordion-header" id="headingOne">
<button class="accordion-button" type="button" data-bs-toggle="collapse" style="background-color: #b0d8ff;" data-bs-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
Добавить товар
</button>
</h2>
<div id="collapseOne" class="accordion-collapse collapse show" aria-labelledby="headingOne" data-bs-parent="#accordionExample">
<div class="accordion-body">
<div class="card mb-4 border-0 shadow">
<div class="card-body">
<form id="addProductForm" class="row g-3">
<div class="col-md-6">
<label for="productName" class="form-label">Название товара</label>
<input type="text" class="form-control" id="productName" required>
</div>
<div class="col-md-6">
<label for="productPrice" class="form-label">Цена</label>
<input type="text" class="form-control" id="productPrice" required>
</div>
<div class="col-md-6">
<label for="productCategory" class="form-label">Категория</label>
<select class="form-select" id="productCategory" required>
<option value="">Выберите категорию</option>
<option value="1">Для мужчин</option>
<option value="2">Для женщин</option>
<option value="3">Унисекс</option>
</select>
</div>
<div class="col-md-6">
<label for="productCondition" class="form-label">Состояние</label>
<select class="form-select" id="productCondition" required>
<option value="">Выберите состояние</option>
<option value="1">Новый</option>
<option value="2">Б/У</option>
</select>
</div>
<div class="col-12">
<label for="productDescription" class="form-label">Описание</label>
<textarea class="form-control" id="productDescription" rows="3" required></textarea>
</div>
<div class="col-12">
<label for="productImage" class="form-label">Ссылка на изображение</label>
<input type="text" class="form-control" id="productImage" required>
</div>
<div class="col-12">
<button type="submit" class="btn" style="background-color: #00264d; color: white;">
<i class="bi bi-check-circle me-2"></i>Добавить товар
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<h1 class="text-center mb-4 mt-2">Каталог товаров</h1>
<!-- Карточки товаров -->
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4 mb-5" id="productsContainer">
<!-- Карточка товара 1 -->
<div class="col">
<div class="card h-100 border-0 shadow position-relative">
<div class="card-actions">
<button class="btn btn-sm btn-outline-primary edit-btn me-1" data-product-index="0">
<i class="bi bi-pencil"></i>
</button>
<button class="btn btn-sm btn-outline-danger delete-btn">
<i class="bi bi-trash"></i>
</button>
</div>
<img src="img/stonik.jpg" class="card-img-top" alt="Stone Island">
<div class="card-body">
<h4 class="card-title">Stone Island</h4>
<p class="card-text">super idol rovny pacan, groza rayona, mother's modnik, патч на месте</p>
<div class="row">
<div class="col-6">
<h5 class="card-text mb-1">Category:</h5>
<p class="card-text category-text">men</p>
</div>
<div class="col-6">
<h5 class="card-text mb-1">Condition:</h5>
<p class="card-text condition-text">new</p>
</div>
</div>
</div>
<div class="card-footer bg-transparent">
<div class="d-flex justify-content-between align-items-center">
<span class="text-muted price-text">$1999.99</span>
<button class="btn btn-sm" style="background-color: #00264d; color: white;">
<i class="bi bi-cart-plus me-1"></i>В корзину
</button>
</div>
<div class="mt-2 d-flex justify-content-between">
<button class="btn btn-sm btn-outline-secondary like-btn">
<i class="bi bi-heart"></i> В избранное
</button>
<button class="btn btn-sm btn-outline-secondary">
<i class="bi bi-share"></i> Поделиться
</button>
</div>
</div>
</div>
</div>
<!-- Карточка товара 2 -->
<div class="col">
<div class="card h-100 border-0 shadow position-relative">
<div class="card-actions">
<button class="btn btn-sm btn-outline-primary edit-btn me-1" data-product-index="1">
<i class="bi bi-pencil"></i>
</button>
<button class="btn btn-sm btn-outline-danger delete-btn">
<i class="bi bi-trash"></i>
</button>
</div>
<img src="img/adidas.jpg" class="card-img-top" alt="Adidas">
<div class="card-body">
<h5 class="card-title">Adidas</h5>
<p class="card-text">sportik, street, baskemtball, air, old school</p>
<div class="row">
<div class="col-6">
<h5 class="card-text mb-1">Category:</h5>
<p class="card-text category-text">men</p>
</div>
<div class="col-6">
<h5 class="card-text mb-1">Condition:</h5>
<p class="card-text condition-text">wu</p>
</div>
</div>
</div>
<div class="card-footer bg-transparent">
<div class="d-flex justify-content-between align-items-center">
<span class="text-muted price-text">$19.99</span>
<button class="btn btn-sm" style="background-color: #00264d; color: white;">
<i class="bi bi-cart-plus me-1"></i>В корзину
</button>
</div>
<div class="mt-2 d-flex justify-content-between">
<button class="btn btn-sm btn-outline-secondary like-btn">
<i class="bi bi-heart"></i> В избранное
</button>
<button class="btn btn-sm btn-outline-secondary">
<i class="bi bi-share"></i> Поделиться
</button>
</div>
</div>
</div>
</div>
<!-- Карточка товара 3 -->
<div class="col">
<div class="card h-100 border-0 shadow position-relative">
<div class="card-actions">
<button class="btn btn-sm btn-outline-primary edit-btn me-1" data-product-index="2">
<i class="bi bi-pencil"></i>
</button>
<button class="btn btn-sm btn-outline-danger delete-btn">
<i class="bi bi-trash"></i>
</button>
</div>
<img src="img/napapisaj.jpg" class="card-img-top" alt="Napapisaj">
<div class="card-body">
<h5 class="card-title">Napapisaj</h5>
<p class="card-text">super idol rovny pacan, groza rayona, mother's modnik, +rep from brothers</p>
<div class="row">
<div class="col-6">
<h5 class="card-text mb-1">Category:</h5>
<p class="card-text category-text">men</p>
</div>
<div class="col-6">
<h5 class="card-text mb-1">Condition:</h5>
<p class="card-text condition-text">wu</p>
</div>
</div>
</div>
<div class="card-footer bg-transparent">
<div class="d-flex justify-content-between align-items-center">
<span class="text-muted price-text">$1499.99</span>
<button class="btn btn-sm" style="background-color: #00264d; color: white;">
<i class="bi bi-cart-plus me-1"></i>В корзину
</button>
</div>
<div class="mt-2 d-flex justify-content-between">
<button class="btn btn-sm btn-outline-secondary like-btn">
<i class="bi bi-heart"></i> В избранное
</button>
<button class="btn btn-sm btn-outline-secondary">
<i class="bi bi-share"></i> Поделиться
</button>
</div>
</div>
</div>
</div>
<!-- Карточка товара 4 -->
<div class="col">
<div class="card h-100 border-0 shadow position-relative">
<div class="card-actions">
<button class="btn btn-sm btn-outline-primary edit-btn me-1" data-product-index="3">
<i class="bi bi-pencil"></i>
</button>
<button class="btn btn-sm btn-outline-danger delete-btn">
<i class="bi bi-trash"></i>
</button>
</div>
<img src="img/lacoste.png" class="card-img-top" alt="Lacoste">
<div class="card-body">
<h5 class="card-title">Lacoste</h5>
<p class="card-text">style, nice, mother's modnik, cotton, krokodil</p>
<div class="row">
<div class="col-6">
<h5 class="card-text mb-1">Category:</h5>
<p class="card-text category-text">uni</p>
</div>
<div class="col-6">
<h5 class="card-text mb-1">Condition:</h5>
<p class="card-text condition-text">wu</p>
</div>
</div>
</div>
<div class="card-footer bg-transparent">
<div class="d-flex justify-content-between align-items-center">
<span class="text-muted price-text">$399.99</span>
<button class="btn btn-sm" style="background-color: #00264d; color: white;">
<i class="bi bi-cart-plus me-1"></i>В корзину
</button>
</div>
<div class="mt-2 d-flex justify-content-between">
<button class="btn btn-sm btn-outline-secondary like-btn">
<i class="bi bi-heart"></i> В избранное
</button>
<button class="btn btn-sm btn-outline-secondary">
<i class="bi bi-share"></i> Поделиться
</button>
</div>
</div>
</div>
</div>
<!-- Карточка товара 5 -->
<div class="col">
<div class="card h-100 border-0 shadow position-relative">
<div class="card-actions">
<button class="btn btn-sm btn-outline-primary edit-btn me-1" data-product-index="4">
<i class="bi bi-pencil"></i>
</button>
<button class="btn btn-sm btn-outline-danger delete-btn">
<i class="bi bi-trash"></i>
</button>
</div>
<img src="img/samba.png" class="card-img-top" alt="Samba">
<div class="card-body">
<h5 class="card-title">Samba</h5>
<p class="card-text">super idol rovny pacan, groza rayona, mother's modnik, +rep from brothers</p>
<div class="row">
<div class="col-6">
<h5 class="card-text mb-1">Category:</h5>
<p class="card-text category-text">women</p>
</div>
<div class="col-6">
<h5 class="card-text mb-1">Condition:</h5>
<p class="card-text condition-text">new</p>
</div>
</div>
</div>
<div class="card-footer bg-transparent">
<div class="d-flex justify-content-between align-items-center">
<span class="text-muted price-text">$449.99</span>
<button class="btn btn-sm" style="background-color: #00264d; color: white;">
<i class="bi bi-cart-plus me-1"></i>В корзину
</button>
</div>
<div class="mt-2 d-flex justify-content-between">
<button class="btn btn-sm btn-outline-secondary like-btn">
<i class="bi bi-heart"></i> В избранное
</button>
<button class="btn btn-sm btn-outline-secondary">
<i class="bi bi-share"></i> Поделиться
</button>
</div>
</div>
</div>
</div>
</div>
</main>
<footer class="py-4 mt-5" style="background-color: #00264d; color: white;">
<div class="container">
<div class="row">
<div class="col-md-6 mb-3 mb-md-0">
<div class="d-flex align-items-center mb-3">
<a href="https://t.me/cyxarukShop" class="text-white me-3">
<i class="bi bi-telegram fs-2"></i>
</a>
<span>Подпишитесь на нас в Telegram</span>
</div>
<div class="d-flex align-items-center">
<a href="https://www.avito.ru/..." class="text-white me-3">
<i class="bi bi-shop-window fs-2"></i>
</a>
<span>Мы на Авито</span>
</div>
</div>
<div class="col-md-6 text-md-end">
<h5>Контакты</h5>
<p><i class="bi bi-telephone me-2"></i>89876320523</p>
<p><i class="bi bi-geo-alt me-2"></i>Ulyanovsk, Russia</p>
</div>
</div>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
// Функция для открытия модального окна редактирования
function openEditModal(productIndex) {
const card = document.querySelectorAll('#productsContainer .col')[productIndex];
// Получаем текущие данные карточки
const title = card.querySelector('.card-title').textContent;
const description = card.querySelector('.card-text').textContent;
const price = card.querySelector('.price-text').textContent;
const category = card.querySelector('.category-text').textContent;
const condition = card.querySelector('.condition-text').textContent;
const image = card.querySelector('.card-img-top').src;
// Заполняем форму редактирования
document.getElementById('editProductName').value = title;
document.getElementById('editProductDescription').value = description;
document.getElementById('editProductPrice').value = price;
document.getElementById('editProductImage').value = image;
// Устанавливаем выбранные значения для категории и состояния
setSelectValue('editProductCategory', getCategoryValue(category));
setSelectValue('editProductCondition', getConditionValue(condition));
// Сохраняем индекс редактируемого товара
document.getElementById('editProductIndex').value = productIndex;
// Показываем модальное окно
const editModal = new bootstrap.Modal(document.getElementById('editProductModal'));
editModal.show();
}
// Функция для установки значения в select
function setSelectValue(selectId, value) {
const select = document.getElementById(selectId);
for (let i = 0; i < select.options.length; i++) {
if (select.options[i].value === value) {
select.selectedIndex = i;
break;
}
}
}
// Функция для получения значения категории из текста
function getCategoryValue(categoryText) {
switch(categoryText.toLowerCase()) {
case 'men': return '1';
case 'women': return '2';
case 'uni': return '3';
default: return '1';
}
}
// Функция для получения текста категории из значения
function getCategoryText(categoryValue) {
switch(categoryValue) {
case '1': return 'men';
case '2': return 'women';
case '3': return 'uni';
default: return 'men';
}
}
// Функция для получения значения состояния из текста
function getConditionValue(conditionText) {
switch(conditionText.toLowerCase()) {
case 'new': return '1';
case 'wu': return '2';
default: return '1';
}
}
// Функция для получения текста состояния из значения
function getConditionText(conditionValue) {
switch(conditionValue) {
case '1': return 'new';
case '2': return 'wu';
default: return 'new';
}
}
// Обработчик сохранения изменений
document.getElementById('saveProductChanges').addEventListener('click', function() {
const productIndex = document.getElementById('editProductIndex').value;
const card = document.querySelectorAll('#productsContainer .col')[productIndex];
// Получаем новые значения из формы
const newTitle = document.getElementById('editProductName').value;
const newDescription = document.getElementById('editProductDescription').value;
const newPrice = document.getElementById('editProductPrice').value;
const newCategory = document.getElementById('editProductCategory').value;
const newCondition = document.getElementById('editProductCondition').value;
const newImage = document.getElementById('editProductImage').value;
// Обновляем карточку
card.querySelector('.card-title').textContent = newTitle;
card.querySelector('.card-text').textContent = newDescription;
card.querySelector('.price-text').textContent = newPrice;
card.querySelector('.category-text').textContent = getCategoryText(newCategory);
card.querySelector('.condition-text').textContent = getConditionText(newCondition);
card.querySelector('.card-img-top').src = newImage;
card.querySelector('.card-img-top').alt = newTitle;
// Закрываем модальное окно
const editModal = bootstrap.Modal.getInstance(document.getElementById('editProductModal'));
editModal.hide();
});
document.getElementById("addProductForm").addEventListener("submit", function (e) {
e.preventDefault();
const name = document.getElementById("productName").value;
const price = document.getElementById("productPrice").value;
const category = document.getElementById("productCategory").value;
const condition = document.getElementById("productCondition").value;
const description = document.getElementById("productDescription").value;
const image = document.getElementById("productImage").value;
// Получаем текстовые значения для отображения
const categoryText = getCategoryText(category);
const conditionText = getConditionText(condition);
const productCard = `
<div class="col">
<div class="card h-100 border-0 shadow position-relative">
<div class="card-actions">
<button class="btn btn-sm btn-outline-primary edit-btn me-1" data-product-index="${document.querySelectorAll('#productsContainer .col').length}">
<i class="bi bi-pencil"></i>
</button>
<button class="btn btn-sm btn-outline-danger delete-btn">
<i class="bi bi-trash"></i>
</button>
</div>
<img src="${image}" class="card-img-top" alt="${name}">
<div class="card-body">
<h5 class="card-title">${name}</h5>
<p class="card-text">${description}</p>
<div class="row">
<div class="col-6">
<h5 class="card-text mb-1">Category:</h5>
<p class="card-text category-text">${categoryText}</p>
</div>
<div class="col-6">
<h5 class="card-text mb-1">Condition:</h5>
<p class="card-text condition-text">${conditionText}</p>
</div>
</div>
</div>
<div class="card-footer bg-transparent">
<div class="d-flex justify-content-between align-items-center">
<span class="text-muted price-text">${price}</span>
<button class="btn btn-sm" style="background-color: #00264d; color: white;">
<i class="bi bi-cart-plus me-1"></i>В корзину
</button>
</div>
<div class="mt-2 d-flex justify-content-between">
<button class="btn btn-sm btn-outline-secondary like-btn">
<i class="bi bi-heart"></i> В избранное
</button>
<button class="btn btn-sm btn-outline-secondary">
<i class="bi bi-share"></i> Поделиться
</button>
</div>
</div>
</div>
</div>
`;
document.getElementById("productsContainer").insertAdjacentHTML("beforeend", productCard);
// Добавляем обработчики событий для новых кнопок
addEventListenersToNewCard();
this.reset();
});
// Функция для добавления обработчиков событий к новым карточкам
function addEventListenersToNewCard() {
const lastCard = document.querySelector('#productsContainer .col:last-child');
const editBtn = lastCard.querySelector('.edit-btn');
const deleteBtn = lastCard.querySelector('.delete-btn');
editBtn.addEventListener('click', function() {
const productIndex = this.getAttribute('data-product-index');
openEditModal(productIndex);
});
deleteBtn.addEventListener('click', function() {
const card = this.closest('.col');
const title = card.querySelector('.card-title').textContent;
if (confirm(`Вы уверены, что хотите удалить товар "${title}"?`)) {
card.remove();
}
});
}
// Добавляем обработчики событий для существующих карточек
document.addEventListener('DOMContentLoaded', function() {
const editButtons = document.querySelectorAll('.edit-btn');
const deleteButtons = document.querySelectorAll('.delete-btn');
editButtons.forEach(btn => {
btn.addEventListener('click', function() {
const productIndex = this.getAttribute('data-product-index');
openEditModal(productIndex);
});
});
deleteButtons.forEach(btn => {
btn.addEventListener('click', function() {
const card = this.closest('.col');
const title = card.querySelector('.card-title').textContent;
if (confirm(`Вы уверены, что хотите удалить товар "${title}"?`)) {
card.remove();
}
});
});
});
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script type="module">
import { LikesModel } from '/components/likes/model.js';
import { LikesView } from '/components/likes/view.js';
import { LikesController } from '/components/likes/controller.js';
document.addEventListener('DOMContentLoaded', function() {
if (document.getElementById('productsContainer')) {
const likesModel = new LikesModel();
const likesView = new LikesView();
new LikesController(likesModel, likesView);
}
});
</script>
<script type="module">
import { Model } from '/components/basket/model.js';
import { View } from '/components/basket/view.js';
import { Controller } from '/components/basket/controller.js';
document.addEventListener('DOMContentLoaded', function() {
if (document.getElementById('basketContainer') || document.getElementById('productsContainer')) {
const model = new Model();
const view = new View();
new Controller(model, view);
}
});
</script>
</body>
</html>