181 lines
8.8 KiB
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">← 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 →</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">← 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 →</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 %}
|