CurseTechnique/templates/calendar.html

181 lines
8.8 KiB
HTML

{% extends "base.html" %}
{% block title %}{{ page.month_label }}{% endblock %}
{% block content %}
<header class="mb-6 rounded-3xl border border-slate-200/80 bg-white/80 p-6 shadow-sm backdrop-blur">
<div class="flex flex-col gap-4 md:flex-row md:items-start md:justify-between">
<div>
<p class="text-xs uppercase tracking-[0.22em] text-slate-500">Calorie Tracker</p>
<h1 class="mt-2 text-3xl font-bold tracking-tight sm:text-4xl">{{ page.month_label }}</h1>
<p class="mt-3 text-sm text-slate-600">Click any day to inspect all logged food entries.</p>
<p class="mt-2 text-xs text-slate-500">Shortcuts: `Space` opens today, `?` opens keyboard help.</p>
</div>
<div class="flex flex-col items-stretch gap-2 md:items-end">
<a href="/day/{{ page.today_date }}" class="inline-flex items-center justify-center rounded-lg bg-slate-900 px-4 py-2 text-sm font-semibold text-white transition hover:bg-slate-700">
Open Today
</a>
<div class="grid grid-cols-3 gap-2">
<a id="prev-month-link" href="{{ page.nav.prev_month_href }}" class="inline-flex items-center justify-center rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-semibold text-slate-700 hover:bg-slate-50">&larr; Month</a>
<a href="{{ page.nav.current_month_href }}" class="inline-flex items-center justify-center rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-semibold text-slate-700 hover:bg-slate-50">This Month</a>
<a id="next-month-link" href="{{ page.nav.next_month_href }}" class="inline-flex items-center justify-center rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-semibold text-slate-700 hover:bg-slate-50">Month &rarr;</a>
<a href="{{ page.nav.prev_year_href }}" class="inline-flex items-center justify-center rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-semibold text-slate-700 hover:bg-slate-50">&larr; Year</a>
<form id="month-picker-form" class="col-span-1">
<input id="month-picker" type="month" value="{{ page.focus_month_value }}" class="w-full rounded-lg border border-slate-300 bg-white px-2 py-2 text-xs font-semibold text-slate-700" />
</form>
<a href="{{ page.nav.next_year_href }}" class="inline-flex items-center justify-center rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-semibold text-slate-700 hover:bg-slate-50">Year &rarr;</a>
<div class="col-span-3">
{% if page.nav.show_current_month_link %}
<a href="{{ page.nav.current_month_href }}" class="inline-flex items-center justify-center rounded-lg border border-emerald-300 bg-emerald-50 px-3 py-2 text-xs font-semibold text-emerald-800 hover:bg-emerald-100">Today</a>
{% else %}
<span class="inline-flex items-center justify-center rounded-lg border border-slate-200 bg-slate-100 px-3 py-2 text-xs font-semibold text-slate-400">Viewing current month</span>
{% endif %}
</div>
</div>
</div>
</div>
</header>
<section class="rounded-3xl border border-slate-200/80 bg-white/80 p-4 shadow-sm backdrop-blur sm:p-6">
<div class="overflow-x-auto">
<div class="min-w-[720px]">
<div class="mb-4 grid grid-cols-7 gap-2">
<div class="text-center text-xs font-semibold uppercase tracking-wide text-slate-500">Sun</div>
<div class="text-center text-xs font-semibold uppercase tracking-wide text-slate-500">Mon</div>
<div class="text-center text-xs font-semibold uppercase tracking-wide text-slate-500">Tue</div>
<div class="text-center text-xs font-semibold uppercase tracking-wide text-slate-500">Wed</div>
<div class="text-center text-xs font-semibold uppercase tracking-wide text-slate-500">Thu</div>
<div class="text-center text-xs font-semibold uppercase tracking-wide text-slate-500">Fri</div>
<div class="text-center text-xs font-semibold uppercase tracking-wide text-slate-500">Sat</div>
</div>
<div class="grid grid-cols-7 gap-2">
{% for cell in page.cells %}
{% if cell.is_padding %}
<div class="h-32 rounded-2xl border border-dashed border-slate-300/80 bg-white/40" aria-hidden="true"></div>
{% else %}
{% if cell.is_future %}
<div class="h-32 rounded-2xl border border-slate-200 bg-slate-100/80 p-3 opacity-65">
<div class="flex items-start justify-between">
<span class="text-sm font-semibold text-slate-500">{{ cell.date_text }}</span>
<span class="rounded-full bg-slate-400 px-2 py-0.5 text-xs font-semibold text-white">{{ cell.day_num }}</span>
</div>
<div class="mt-6">
<p class="text-xl font-bold text-slate-500">{{ cell.total }} cal</p>
<p class="text-xs text-slate-500">{{ cell.entry_label }}</p>
<p class="text-xs text-slate-500">{{ cell.weight_label }}</p>
<p class="mt-1 text-[11px] uppercase tracking-wide text-slate-400">Future</p>
</div>
</div>
{% else %}
<a class="{{ cell.card_class }}" href="{{ cell.href }}">
<div class="flex items-start justify-between">
<span class="text-sm font-semibold text-slate-500">{{ cell.date_text }}</span>
<span class="{{ cell.badge_class }}">{{ cell.day_num }}</span>
</div>
<div class="mt-6">
<p class="{{ cell.total_class }}">{{ cell.total }} cal</p>
<p class="{{ cell.entry_class }}">{{ cell.entry_label }}</p>
<p class="{{ cell.entry_class }}">{{ cell.weight_label }}</p>
</div>
</a>
{% endif %}
{% endif %}
{% endfor %}
</div>
</div>
</div>
</section>
<div id="shortcut-help" class="hidden fixed inset-0 z-50 bg-slate-900/60 p-4">
<div class="mx-auto mt-12 max-w-md rounded-2xl bg-white p-5 shadow-xl">
<div class="flex items-center justify-between">
<h2 class="text-lg font-bold text-slate-900">Keyboard Shortcuts</h2>
<button id="shortcut-close" class="rounded-md border border-slate-300 px-2 py-1 text-xs font-semibold text-slate-700 hover:bg-slate-50">Close</button>
</div>
<ul class="mt-4 space-y-2 text-sm text-slate-700">
<li><span class="font-semibold">Space</span>: Open today's entry</li>
<li><span class="font-semibold">Left Arrow</span>: Previous month</li>
<li><span class="font-semibold">Right Arrow</span>: Next month</li>
<li><span class="font-semibold">?</span>: Open/close this help</li>
<li><span class="font-semibold">Esc</span>: Close this help</li>
</ul>
</div>
</div>
{% endblock %}
{% block scripts %}
<script>
const shortcutHelp = document.getElementById("shortcut-help");
const shortcutClose = document.getElementById("shortcut-close");
const monthPicker = document.getElementById("month-picker");
const prevMonthHref = "{{ page.nav.prev_month_href }}";
const nextMonthHref = "{{ page.nav.next_month_href }}";
function toggleShortcutHelp(forceOpen) {
const shouldOpen = typeof forceOpen === "boolean"
? forceOpen
: shortcutHelp.classList.contains("hidden");
shortcutHelp.classList.toggle("hidden", !shouldOpen);
}
function goToMonthFromPicker() {
if (!monthPicker.value) return;
const parts = monthPicker.value.split("-");
if (parts.length !== 2) return;
window.location.href = "/calendar/" + Number(parts[0]) + "/" + Number(parts[1]);
}
shortcutHelp.addEventListener("click", function (event) {
if (event.target === shortcutHelp) toggleShortcutHelp(false);
});
shortcutClose.addEventListener("click", function () {
toggleShortcutHelp(false);
});
monthPicker.addEventListener("change", goToMonthFromPicker);
document.getElementById("month-picker-form").addEventListener("submit", function (event) {
event.preventDefault();
goToMonthFromPicker();
});
document.addEventListener("keydown", function (event) {
const target = event.target;
if (target && (
target.tagName === "INPUT" ||
target.tagName === "TEXTAREA" ||
target.tagName === "SELECT" ||
target.isContentEditable
)) {
return;
}
if (event.key === "?") {
event.preventDefault();
toggleShortcutHelp();
return;
}
if (event.key === "Escape") {
toggleShortcutHelp(false);
return;
}
if (event.key === "ArrowLeft") {
event.preventDefault();
window.location.href = prevMonthHref;
return;
}
if (event.key === "ArrowRight") {
event.preventDefault();
window.location.href = nextMonthHref;
return;
}
if (event.code === "Space" && !event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey) {
event.preventDefault();
window.location.href = "/day/{{ page.today_date }}";
}
});
</script>
{% endblock %}