46 lines
1.7 KiB
JavaScript
46 lines
1.7 KiB
JavaScript
(function () {
|
|
var cal = document.querySelector(".diary-cal");
|
|
if (!cal) return;
|
|
cal.querySelectorAll(".dropdown > button").forEach(wireDropdown);
|
|
|
|
var displayMonth = parseInt(cal.dataset.displayMonth, 10);
|
|
var months = {};
|
|
cal.querySelectorAll("[data-cal-month]").forEach(function (t) {
|
|
months[parseInt(t.dataset.calMonth, 10)] = t;
|
|
});
|
|
|
|
// Centering only applies inside the persistent desktop rail (.sidebar). On
|
|
// mobile the widget is re-parented into .overlay-body, where we leave the
|
|
// grids stacked from January and do not scroll (design decision).
|
|
function railContainer() {
|
|
var el = cal.parentElement;
|
|
while (el) {
|
|
if (el.classList) {
|
|
if (el.classList.contains("overlay-body")) return null;
|
|
if (el.classList.contains("sidebar")) return el;
|
|
}
|
|
el = el.parentElement;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// Scroll only the rail so the given month grid sits in its vertical center;
|
|
// the main document/window position is untouched (priority: don't disturb
|
|
// the reading position).
|
|
function centerMonth(m) {
|
|
var grid = months[m];
|
|
if (!grid) return;
|
|
var container = railContainer();
|
|
if (!container) return;
|
|
var offset = grid.getBoundingClientRect().top -
|
|
container.getBoundingClientRect().top + container.scrollTop;
|
|
container.scrollTop = offset - (container.clientHeight - grid.clientHeight) / 2;
|
|
}
|
|
|
|
// Center the current month once, on initial render. Anchor navigation
|
|
// (#YYYY-MM / #YYYY-MM-DD) deliberately does NOT re-center the rail —
|
|
// re-scrolling on every hop is disorienting; the today/current cell
|
|
// highlighting is enough to keep bearings.
|
|
centerMonth(displayMonth);
|
|
})();
|