All checks were successful
Build and Push Madplaner / build (push) Successful in 25s
109 lines
4.9 KiB
HTML
109 lines
4.9 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Madplaner</title>
|
|
<script src="https://cdn.tailwindcss.com"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
|
<link rel="manifest" href="{{ url_for('static', filename='manifest.json') }}">
|
|
<meta name="theme-color" content="#2c3e50">
|
|
<link rel="apple-touch-icon" href="/static/icons/192.png">
|
|
<link rel="icon" href="https://fav.farm/%F0%9F%8D%B4">
|
|
<!-- cache busting for serivce worker -->
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}?v=1.1">
|
|
</head>
|
|
|
|
<script
|
|
defer
|
|
src="/stats/script.js"
|
|
data-website-id="4909e1da-6d66-4035-a401-f2acbaebdd3b"
|
|
data-host-url="/stats">
|
|
</script>
|
|
|
|
|
|
<script>
|
|
if ('serviceWorker' in navigator) {
|
|
navigator.serviceWorker.register('/sw.js')
|
|
.then(() => console.log("Service Worker Registered"));
|
|
}
|
|
</script>
|
|
<body class="bg-gray-50 text-gray-900 font-sans">
|
|
|
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
|
{% if messages %}
|
|
{% for category, message in messages %}
|
|
<div class="max-w-5xl mx-auto mt-4 p-4 rounded-xl {% if category == 'error' %}bg-red-100 text-red-700 border border-red-200{% else %}bg-green-100 text-green-700 border border-green-200{% endif %}">
|
|
{{ message }}
|
|
</div>
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% endwith %}
|
|
<nav class="sticky top-0 z-50 bg-white/80 backdrop-blur-md border-b border-stone-100 no-print">
|
|
<div class="max-w-6xl mx-auto px-6 h-20 flex items-center justify-between">
|
|
<a href="/" class="flex items-center gap-2 group">
|
|
<div class="w-8 h-8 bg-emerald-800 rounded-lg flex items-center justify-center transition-transform group-hover:rotate-3">
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253" />
|
|
</svg>
|
|
</div>
|
|
<span class="text-xl text-emerald-800 italic font-serif">Madplaner</span>
|
|
</a>
|
|
|
|
<div class="hidden md:flex items-center gap-8">
|
|
{% if current_user.is_authenticated %}
|
|
<a href="/dashboard" class="text-sm font-medium text-stone-600 hover:text-emerald-800 transition-colors">Dashboard</a>
|
|
<div class="h-4 w-px bg-stone-200"></div>
|
|
<div class="flex items-center gap-4">
|
|
<span class="text-sm text-stone-400 font-light">Hej, {{ current_user.username }}</span>
|
|
<a href="/logout" class="text-sm font-medium bg-stone-100 text-stone-900 px-4 py-2 rounded-full hover:bg-stone-200 transition-all">Sign Out</a>
|
|
</div>
|
|
{% else %}
|
|
<a href="/login" class="text-sm font-medium text-stone-600 hover:text-stone-900">Login</a>
|
|
<a href="/register" class="text-sm font-medium bg-emerald-800 text-white px-6 py-2.5 rounded-full hover:bg-emerald-900 shadow-sm transition-all">Join Free</a>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<div class="md:hidden text-stone-900">
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 6h16M4 12h16m-7 6h7" />
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
<main class="container mx-auto p-6">
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
</body>
|
|
<script>
|
|
function showToast(message, type = 'success') {
|
|
const container = document.getElementById('toast-container');
|
|
const toast = document.createElement('div');
|
|
|
|
// Nordic Palette for Toasts
|
|
const styles = type === 'success'
|
|
? 'bg-white border-emerald-500 text-stone-800'
|
|
: 'bg-white border-rose-500 text-stone-800';
|
|
|
|
const icon = type === 'success'
|
|
? '<span class="text-emerald-500 text-lg">✓</span>'
|
|
: '<span class="text-rose-500 text-lg">✕</span>';
|
|
|
|
toast.className = `toast-animate-in pointer-events-auto flex items-center gap-4 px-6 py-4 rounded-2xl shadow-xl border-l-4 ${styles} min-w-[300px]`;
|
|
|
|
toast.innerHTML = `
|
|
${icon}
|
|
<p class="text-sm font-medium tracking-tight">${message}</p>
|
|
`;
|
|
|
|
container.appendChild(toast);
|
|
|
|
// Auto-remove after 4 seconds
|
|
setTimeout(() => {
|
|
toast.classList.replace('toast-animate-in', 'toast-animate-out');
|
|
setTimeout(() => toast.remove(), 300);
|
|
}, 4000);
|
|
}
|
|
</script>
|
|
</html>
|