390 lines
25 KiB
PHP
390 lines
25 KiB
PHP
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
||
<!-- SEO & Meta Tags -->
|
||
<title>SmartRecipe — Умный помощник по рецептам и покупкам</title>
|
||
<meta name="description" content="Сохраняйте рецепты из Pinterest и Instagram, создавайте рецепты по фото с помощью ИИ, сравнивайте цены в магазинах и делите чеки с друзьями.">
|
||
<meta name="keywords" content="рецепты ИИ, список покупок, планировщик питания, распознавание блюд, сравнение цен, разделение чека">
|
||
|
||
<!-- Open Graph / Facebook -->
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:title" content="SmartRecipe — Умный помощник по рецептам и покупкам">
|
||
<meta property="og:description" content="ИИ-помощник для создания рецептов по фото, сравнения цен и организации совместных покупок.">
|
||
<meta property="og:image" content="">
|
||
|
||
<!-- Twitter -->
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta name="twitter:title" content="SmartRecipe — Умный помощник по рецептам и покупкам">
|
||
<meta name="twitter:description" content="ИИ-помощник для создания рецептов по фото, сравнения цен и организации совместных покупок.">
|
||
<meta name="twitter:image" content="">
|
||
|
||
<!-- Styles -->
|
||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&display=swap" rel="stylesheet">
|
||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
||
<link rel="stylesheet" href="assets/css/custom.css?v=<?php echo time(); ?>_v4">
|
||
|
||
</head>
|
||
<body>
|
||
|
||
<nav class="navbar navbar-expand-lg navbar-light bg-light shadow-sm sticky-top mb-4">
|
||
<div class="container">
|
||
<a class="navbar-brand d-flex align-items-center" href="/">
|
||
<i class="bi bi-book-half me-2" style="color: var(--accent-color);"></i>
|
||
<span class="fw-bold">СмартРецепт</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 align-items-center" id="auth-nav">
|
||
<!-- Auth elements will be injected here -->
|
||
<li class="nav-item">
|
||
<div class="spinner-border spinner-border-sm text-primary" role="status"></div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<div id="guest-view" class="d-none auth-screen">
|
||
<div class="container-fluid h-100 p-0">
|
||
<div class="row h-100 g-0">
|
||
<!-- Left Column: Image -->
|
||
<div class="col-lg-6 d-none d-lg-block auth-image-container">
|
||
<div class="auth-image-overlay d-flex align-items-center justify-content-center p-5 text-white">
|
||
<div class="auth-branding-content text-start">
|
||
<div class="text-center mb-4">
|
||
<i class="bi bi-book-half display-1" style="color: #FF7F50; filter: drop-shadow(0 0 10px rgba(255, 127, 80, 0.3));"></i>
|
||
<h1 class="display-3 fw-bold mt-2">СмартРецепт</h1>
|
||
</div>
|
||
<p class="lead fs-5 mb-4">Это не просто кулинарная книга. Это ваш интеллектуальный помощник на каждый день и для особых случаев:</p>
|
||
<ul class="list-unstyled fs-6 mb-4">
|
||
<li class="mb-3 d-flex align-items-start">
|
||
<i class="bi bi-magic text-primary me-3 mt-1"></i>
|
||
<span><strong>Рецепты по фото:</strong> Просто загрузите изображение блюда, и ИИ создаст точный рецепт, чтобы результат был как на картинке.</span>
|
||
</li>
|
||
<li class="mb-3 d-flex align-items-start">
|
||
<i class="bi bi-cart-check text-primary me-3 mt-1"></i>
|
||
<span><strong>Умные покупки:</strong> Составляйте списки продуктов, сравнивайте цены в магазинах и находите самые выгодные предложения.</span>
|
||
</li>
|
||
<li class="mb-3 d-flex align-items-start">
|
||
<i class="bi bi-people text-primary me-3 mt-1"></i>
|
||
<span><span><strong>Совместный доступ:</strong> Распределяйте списки продуктов между друзьями и близкими для организации праздников.</span>
|
||
</li>
|
||
<li class="mb-3 d-flex align-items-start">
|
||
<i class="bi bi-receipt text-primary me-3 mt-1"></i>
|
||
<span><strong>Разделение чека:</strong> Сфотографируйте чек после покупок, и приложение само разделит сумму между всеми участниками.</span>
|
||
</li>
|
||
<li class="mb-3 d-flex align-items-start">
|
||
<i class="bi bi-browser-chrome text-primary me-3 mt-1"></i>
|
||
<span><strong>Импорт отовсюду:</strong> Сохраняйте любимые идеи из Pinterest, Instagram и других соцсетей в один клик.</span>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<!-- Right Column: Forms -->
|
||
<div class="col-lg-6 d-flex align-items-center justify-content-center p-5 bg-white auth-form-container">
|
||
<div class="w-100" style="max-width: 450px;">
|
||
|
||
<!-- Login Form -->
|
||
<div id="login-container">
|
||
<div class="mb-5">
|
||
<h2 class="display-5 mb-2">С возвращением</h2>
|
||
<p class="text-muted">Введите свои данные для доступа к рецептам.</p>
|
||
</div>
|
||
<form id="login-form-landing">
|
||
<div class="mb-4">
|
||
<label class="form-label">Электронная почта</label>
|
||
<input type="email" class="form-control form-control-lg" name="email" placeholder="name@example.com" required>
|
||
</div>
|
||
<div class="mb-4">
|
||
<label class="form-label">Пароль</label>
|
||
<input type="password" class="form-control form-control-lg" name="password" placeholder="••••••••" required>
|
||
</div>
|
||
<div class="d-grid gap-2 mb-4">
|
||
<button type="submit" class="btn btn-primary btn-lg">Войти</button>
|
||
</div>
|
||
</form>
|
||
<p class="text-center text-muted">
|
||
Нет аккаунта? <a href="#" id="show-register" class="text-primary fw-bold text-decoration-none">Создать аккаунт</a>
|
||
</p>
|
||
</div>
|
||
|
||
<!-- Register Form -->
|
||
<div id="register-container" class="d-none">
|
||
<div class="mb-5">
|
||
<h2 class="display-5 mb-2">Регистрация</h2>
|
||
<p class="text-muted">Начните свой путь к умной кулинарии сегодня.</p>
|
||
</div>
|
||
<form id="register-form-landing">
|
||
<div class="mb-4">
|
||
<label class="form-label">Электронная почта</label>
|
||
<input type="email" class="form-control form-control-lg" name="email" placeholder="name@example.com" required>
|
||
</div>
|
||
<div class="mb-4">
|
||
<label class="form-label">Пароль</label>
|
||
<input type="password" class="form-control form-control-lg" name="password" placeholder="••••••••" required>
|
||
</div>
|
||
<div class="d-grid gap-2 mb-4">
|
||
<button type="submit" class="btn btn-primary btn-lg">Зарегистрироваться</button>
|
||
</div>
|
||
</form>
|
||
<p class="text-center text-muted">
|
||
Уже есть аккаунт? <a href="#" id="show-login" class="text-primary fw-bold text-decoration-none">Войти здесь</a>
|
||
</p>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="app-view" class="d-none">
|
||
<main class="container my-5">
|
||
<div class="text-center mb-5" style="padding-top: 20px;">
|
||
<h1 class="display-4 mt-4">Моя кулинарная книга</h1>
|
||
<p class="lead">Планируйте меню и управляйте списком покупок легко.</p>
|
||
</div>
|
||
|
||
<div class="row g-4">
|
||
<!-- Left Column: All Recipes -->
|
||
<div class="col-md-6">
|
||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||
<h2 class="text-center mb-0">Все рецепты</h2>
|
||
<button class="btn btn-primary" type="button" data-bs-toggle="modal" data-bs-target="#recipe-form-modal">
|
||
Добавить рецепт
|
||
</button>
|
||
</div>
|
||
<div class="mb-3 search-container">
|
||
<i class="bi bi-search"></i>
|
||
<input type="text" id="recipe-search" class="form-control" placeholder="Поиск рецептов...">
|
||
</div>
|
||
<div class="mb-3 d-flex flex-wrap gap-2" id="category-filters">
|
||
<button class="btn btn-secondary active" data-category="all">Все</button>
|
||
<button class="btn btn-outline-secondary" data-category="Drinks">Напитки</button>
|
||
<button class="btn btn-outline-secondary" data-category="Breakfast">Завтрак</button>
|
||
<button class="btn btn-outline-secondary" data-category="Dinner">Обед/Ужин</button>
|
||
<button class="btn btn-outline-secondary" data-category="Appetizers">Закуски</button>
|
||
<button class="btn btn-outline-secondary" data-category="No category">Без категории</button>
|
||
</div>
|
||
<div id="recipe-cards-container" class="row">
|
||
<div class="col-12">
|
||
<p class="text-center text-muted">Ваши сохраненные рецепты появятся здесь.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Right Column: Shopping List / Products -->
|
||
<div class="col-md-6">
|
||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||
<h2 class="text-center mb-0">Список покупок</h2>
|
||
<div>
|
||
<button id="add-product-btn" class="btn btn-primary me-2" data-bs-toggle="modal" data-bs-target="#add-product-modal">Добавить продукт</button>
|
||
<button id="print-shopping-list-btn" class="btn btn-outline-secondary"><i class="bi bi-printer"></i> Печать</button>
|
||
</div>
|
||
</div>
|
||
<div class="card shadow">
|
||
<div class="card-body" id="shopping-list-container">
|
||
<div class="text-center text-muted p-5">
|
||
<p>Ваш список покупок появится здесь после выбора рецептов.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
</div>
|
||
|
||
<!-- Modal Recipe Form -->
|
||
<div class="modal fade" id="recipe-form-modal" tabindex="-1" aria-labelledby="recipe-form-modal-label" aria-hidden="true">
|
||
<div class="modal-dialog modal-dialog-centered">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<h5 class="modal-title" id="recipe-form-modal-label">Добавить рецепт</h5>
|
||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="card p-4 shadow">
|
||
<form id="recipe-form">
|
||
<input type="hidden" id="recipeId">
|
||
<div class="mb-3">
|
||
<label for="recipeName" class="form-label">Название рецепта</label>
|
||
<input type="text" class="form-control" id="recipeName" placeholder="например, Авокадо тост">
|
||
</div>
|
||
<div class="mb-3">
|
||
<label for="recipeCategory" class="form-label">Категория</label>
|
||
<select class="form-control" id="recipeCategory">
|
||
<option value="" selected disabled>Выберите...</option>
|
||
<option value="Drinks">Напитки</option>
|
||
<option value="Breakfast">Завтрак</option>
|
||
<option value="Dinner">Обед/Ужин</option>
|
||
<option value="Appetizers">Закуски</option>
|
||
</select>
|
||
</div>
|
||
<div class="mb-3">
|
||
<label for="recipeImage" class="form-label d-flex justify-content-between">
|
||
Фото рецепта
|
||
<button type="button" id="ai-scan-btn" class="btn btn-outline-primary btn-sm">
|
||
<i class="bi bi-magic"></i> AI Сканер
|
||
</button>
|
||
</label>
|
||
<input type="file" class="form-control" id="recipeImage">
|
||
<div id="ai-scan-loading" class="text-primary mt-2 d-none">
|
||
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
|
||
ИИ определяет блюдо и создает рецепт...
|
||
</div>
|
||
</div>
|
||
|
||
<hr class="my-4 border-secondary">
|
||
|
||
<h3 class="h5 mb-3">Ингредиенты (на 1 человека)</h3>
|
||
<div id="ingredients-container">
|
||
<!-- Ingredient rows will be injected here by JS -->
|
||
</div>
|
||
<button type="button" id="add-ingredient" class="btn btn-secondary btn-sm mt-2">+ Добавить ингредиент</button>
|
||
|
||
<hr class="my-4 border-secondary">
|
||
|
||
<div class="row">
|
||
<div class="col">
|
||
<div class="mb-3">
|
||
<label for="guestCount" class="form-label">Сколько гостей?</label>
|
||
<input type="number" class="form-control" id="guestCount" placeholder="например, 8" min="1" value="1">
|
||
</div>
|
||
</div>
|
||
<div class="col">
|
||
<div class="mb-3">
|
||
<label for="portionsPerGuest" class="form-label">Порций на гостя</label>
|
||
<input type="number" class="form-control" id="portionsPerGuest" placeholder="например, 2" min="1" value="1">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="d-grid gap-2 mt-4">
|
||
<button type="button" id="new-recipe-btn" class="btn btn-primary">Сохранить рецепт</button>
|
||
<button type="button" id="cancel-edit-btn" class="btn btn-outline-secondary" data-bs-dismiss="modal">Отмена</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Modal Add Product -->
|
||
<div class="modal fade" id="add-product-modal" tabindex="-1" aria-labelledby="add-product-modal-label" aria-hidden="true">
|
||
<div class="modal-dialog modal-dialog-centered">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<h5 class="modal-title" id="add-product-modal-label">Добавить продукт</h5>
|
||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<form id="add-product-form">
|
||
<div class="mb-3">
|
||
<label for="productName" class="form-label">Название продукта</label>
|
||
<input type="text" class="form-control" id="productName" placeholder="например, Молоко">
|
||
</div>
|
||
<div class="row">
|
||
<div class="col">
|
||
<div class="mb-3">
|
||
<label for="productQuantity" class="form-label">Количество</label>
|
||
<input type="number" class="form-control" id="productQuantity" placeholder="например, 1" min="1" value="1">
|
||
</div>
|
||
</div>
|
||
<div class="col">
|
||
<div class="mb-3">
|
||
<label class="form-label">Единица</label>
|
||
<div class="btn-group unit-selector" role="group" aria-label="Unit selector">
|
||
<button type="button" class="btn btn-secondary unit-btn">г</button>
|
||
<button type="button" class="btn btn-outline-secondary unit-btn">кг</button>
|
||
<button type="button" class="btn btn-outline-secondary unit-btn">мл</button>
|
||
<button type="button" class="btn btn-outline-secondary unit-btn">л</button>
|
||
<button type="button" class="btn btn-outline-secondary unit-btn">шт</button>
|
||
<button type="button" class="btn btn-outline-secondary unit-btn">уп</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="mb-3" id="product-category-wrapper">
|
||
<label for="productCategory" class="form-label">Категория</label>
|
||
<select class="form-select" id="productCategory">
|
||
<option value="Food" selected>Еда</option>
|
||
<option value="Drinks">Напитки</option>
|
||
<option value="Cooking and serving">Приготовление и сервировка</option>
|
||
<option value="Tableware and consumables">Посуда и расходники</option>
|
||
</select>
|
||
</div>
|
||
<div class="d-grid gap-2 mt-4">
|
||
<button type="submit" class="btn btn-primary">Добавить продукт</button>
|
||
<button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Отмена</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Modal View Recipe -->
|
||
<div class="modal fade" id="view-recipe-modal" tabindex="-1" aria-labelledby="view-recipe-modal-label" aria-hidden="true">
|
||
<div class="modal-dialog modal-dialog-centered">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<h5 class="modal-title" id="view-recipe-modal-label">Просмотр рецепта</h5>
|
||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<h2 id="view-recipe-name"></h2>
|
||
<p><strong>Категория:</strong> <span id="view-recipe-category"></span></p>
|
||
<p><strong>Порций:</strong> <span id="view-recipe-guests"></span></p>
|
||
<hr>
|
||
<h3>Ингредиенты</h3>
|
||
<ul id="view-recipe-ingredients" class="list-group">
|
||
</ul>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<footer class="text-center py-4 mt-5">
|
||
<p class="mb-0">© <?php echo date("Y"); ?> СмартРецепт — Умный помощник по рецептам и покупкам.</p>
|
||
</footer>
|
||
|
||
<!-- Scripts -->
|
||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
|
||
<script src="assets/js/main.js?v=<?php echo time(); ?>"></script>
|
||
|
||
<!-- Confirmation Modal -->
|
||
<div class="modal fade" id="confirmRemoveModal" tabindex="-1" aria-labelledby="confirmRemoveModalLabel" aria-hidden="true">
|
||
<div class="modal-dialog">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<h5 class="modal-title" id="confirmRemoveModalLabel">Подтверждение удаления</h5>
|
||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<p>Вы собираетесь удалить ингредиент из рецепта. Это изменит сам рецепт. Вы уверены, что хотите продолжить?</p>
|
||
<p><strong>Рецепт:</strong> <span id="modal-recipe-name"></span></p>
|
||
<p><strong>Ингредиент:</strong> <span id="modal-ingredient-name"></span></p>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
|
||
<button type="button" class="btn btn-danger" id="confirm-remove-btn">Удалить</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</body>
|
||
</html>
|