Implement highlight effect on the day navigated to.

This commit is contained in:
2025-09-25 03:48:25 +00:00
parent 2f7d34e67b
commit 8b89327442
2 changed files with 43 additions and 32 deletions
+22 -20
View File
@@ -197,11 +197,24 @@ function measureFromProbe() {
const {
getWeekIndex,
getFirstDayForVirtualWeek,
goToToday,
handleHeaderYearChange,
scrollToWeekCentered,
} = vwm
function showDay(input) {
const dateStr = input instanceof Date ? toLocalString(input, DEFAULT_TZ) : String(input)
const weekIndex = getWeekIndex(fromLocalString(dateStr, DEFAULT_TZ))
scrollToWeekCentered(weekIndex, 'nav', true)
const diff = Math.abs(weekIndex - centerVisibleWeek.value)
const delay = Math.min(800, diff * 40)
setTimeout(() => {
const el = document.querySelector(`[data-date="${dateStr}"]`)
if (!el) return
el.classList.add('search-highlight-flash')
setTimeout(() => el.classList.remove('search-highlight-flash'), 1500)
}, delay)
}
// Reference date for search: center of the current viewport (virtual week at vertical midpoint)
const centerVisibleWeek = computed(() => {
const midRow = (scrollTop.value + viewportHeight.value / 2) / rowHeight.value
@@ -457,26 +470,15 @@ const handleEventClick = (payload) => {
openEditEventDialog(payload)
}
function scrollToEventStart(startDate, smooth = true) {
try {
const dateObj = fromLocalString(startDate, DEFAULT_TZ)
const weekIndex = getWeekIndex(dateObj)
scrollToWeekCentered(weekIndex, 'search-jump', smooth)
} catch {
/* noop */
function handleHeaderSearchPreview(r) { if (r) showDay(r.startDate) }
function handleHeaderSearchActivate(r) {
if (!r) return
showDay(r.startDate)
if (!r._goto && !r._holiday) {
const ev = calendarStore.getEventById(r.id)
if (ev) openEditEventDialog({ id: ev.id, event: ev })
}
}
function handleHeaderSearchPreview(result) {
if (!result) return
scrollToEventStart(result.startDate, true)
}
function handleHeaderSearchActivate(result) {
if (!result) return
scrollToEventStart(result.startDate, true)
// Open edit dialog for the event
const ev = calendarStore.getEventById(result.id)
if (ev) openEditEventDialog({ id: ev.id, event: ev })
}
// Heuristic: rotate month label (180deg) only for predominantly Latin text.
// We explicitly avoid locale detection; rely solely on characters present.
@@ -543,7 +545,7 @@ window.addEventListener('resize', () => {
<div class="wrap">
<HeaderControls
:reference-date="centerVisibleDateStr"
@go-to-today="goToToday"
@go-to-today="() => showDay(calendarStore.today)"
@search-preview="handleHeaderSearchPreview"
@search-activate="handleHeaderSearchActivate"
/>