summaryrefslogtreecommitdiffstats
path: root/app/templates/base.html
diff options
context:
space:
mode:
authorKen D'Ambrosio <ken@claude>2026-05-25 00:46:10 +0000
committerKen D'Ambrosio <ken@claude>2026-05-25 00:46:10 +0000
commit55bcec90c14db6f2956ed51cf4df1503c0767f81 (patch)
treef25bfb8c46366b5d3dc6b4f66e242c65094b4ada /app/templates/base.html
Initial commit — menu.jots.org Flask/SQLite meal planner
Full-featured weekly menu planner with: - Recipe library with ratings, comments, cuisine/nationality, added-by attribution - AI recipe assistant (Claude) with URL fetching and file upload - Weekly meal plan grid with shopping list generation - Sort by name, prep/cook time, or rating - Print and copy-link support - Deployed on LXC container (192.168.10.51) behind Apache reverse proxy Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'app/templates/base.html')
-rw-r--r--app/templates/base.html99
1 files changed, 99 insertions, 0 deletions
diff --git a/app/templates/base.html b/app/templates/base.html
new file mode 100644
index 0000000..b58ef64
--- /dev/null
+++ b/app/templates/base.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>{% block title %}Menu Planner{% endblock %}</title>
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
+ <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
+</head>
+<body>
+
+<nav class="navbar navbar-expand-lg navbar-dark sticky-top">
+ <div class="container-fluid px-4">
+ <a class="navbar-brand fw-bold" href="/">
+ <i class="bi bi-journal-richtext me-2"></i>Menu Planner
+ </a>
+ <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navMain">
+ <span class="navbar-toggler-icon"></span>
+ </button>
+ <div class="collapse navbar-collapse" id="navMain">
+ <ul class="navbar-nav me-auto gap-1">
+ <li class="nav-item">
+ <a class="nav-link {% if request.endpoint == 'index' %}active{% endif %}" href="/">
+ <i class="bi bi-house me-1"></i>Dashboard
+ </a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link {% if request.endpoint in ['recipes','recipe_detail','add_recipe'] %}active{% endif %}" href="/recipes">
+ <i class="bi bi-book me-1"></i>Recipes
+ </a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link {% if request.endpoint == 'meal_plan' %}active{% endif %}" href="/meal-plan">
+ <i class="bi bi-calendar-week me-1"></i>Meal Plan
+ </a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link {% if request.endpoint == 'shopping_list' %}active{% endif %}" href="/shopping-list">
+ <i class="bi bi-cart me-1"></i>Shopping List
+ </a>
+ </li>
+ </ul>
+
+ <ul class="navbar-nav ms-auto gap-1 align-items-center">
+ {% if current_user.is_authenticated %}
+ <li class="nav-item">
+ <a class="nav-link {% if request.endpoint == 'ai_chat_page' %}active{% endif %}" href="/ai">
+ <i class="bi bi-stars me-1"></i>AI Assistant
+ </a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link {% if request.endpoint == 'add_recipe' %}active{% endif %}" href="/recipes/add">
+ <i class="bi bi-plus-circle me-1"></i>Add Recipe
+ </a>
+ </li>
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown">
+ <i class="bi bi-person-circle me-1"></i>{{ current_user.username }}
+ </a>
+ <ul class="dropdown-menu dropdown-menu-end">
+ <li><a class="dropdown-item" href="/logout"><i class="bi bi-box-arrow-right me-2"></i>Log out</a></li>
+ </ul>
+ </li>
+ {% else %}
+ <li class="nav-item">
+ <a class="nav-link btn btn-sm btn-outline-light px-3 ms-1" href="/login">
+ <i class="bi bi-person me-1"></i>Log in
+ </a>
+ </li>
+ {% endif %}
+ </ul>
+ </div>
+ </div>
+</nav>
+
+<main class="container-fluid px-4 py-4">
+ {% with messages = get_flashed_messages(with_categories=true) %}
+ {% if messages %}
+ {% for category, message in messages %}
+ <div class="alert alert-{{ category }} alert-dismissible fade show mb-3" role="alert">
+ {{ message }}
+ <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
+ </div>
+ {% endfor %}
+ {% endif %}
+ {% endwith %}
+ {% block content %}{% endblock %}
+</main>
+
+<footer class="text-center py-3 mt-4 no-print">
+ <small class="text-muted">Menu Planner &mdash; Low-carb, big flavor</small>
+</footer>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
+<script src="{{ url_for('static', filename='js/main.js') }}"></script>
+{% block scripts %}{% endblock %}
+</body>
+</html>