// Calendar — clean month view with range pills (inspired by user's screenshot) // Plus add/edit/delete calendar events. const { useState, useEffect } = React; // ───────────────────────────────────────────────────────────── // Date math helpers (Mon-first weeks) // ───────────────────────────────────────────────────────────── const firstDayCol = (y, m) => { // m: 0-11. Returns 0..6 with Mon=0 const jsDay = new Date(y, m, 1).getDay(); // Sun=0..Sat=6 return (jsDay + 6) % 7; }; const daysInMonth = (y, m) => new Date(y, m + 1, 0).getDate(); // Inclusive day-difference using ISO strings const dayDiff = (aISO, bISO) => Math.round((fromISO(bISO) - fromISO(aISO)) / 86400000); // ───────────────────────────────────────────────────────────── // Mini date-range picker — clean style from screenshot // Single tap = single day. Second tap on later date = range end. Tapping on/before start resets. // ───────────────────────────────────────────────────────────── function MiniRangePicker({ start, end, onChange, anchorISO }) { const t = useTheme(); const anchorDate = anchorISO ? fromISO(anchorISO) : fromISO(start || todayISO()); const [view, setView] = useState({ y: anchorDate.getFullYear(), m: anchorDate.getMonth() }); const startOffset = firstDayCol(view.y, view.m); const dim = daysInMonth(view.y, view.m); const totalCells = Math.ceil((startOffset + dim) / 7) * 7; const days = ['MO', 'DI', 'MI', 'DO', 'FR', 'SA', 'SO']; const cellISO = (d) => `${view.y}-${String(view.m + 1).padStart(2, '0')}-${String(d).padStart(2, '0')}`; const isInRange = (d) => start && end && cellISO(d) >= start && cellISO(d) <= end; const isStart = (d) => start && cellISO(d) === start; const isEnd = (d) => end && cellISO(d) === end; const isToday = (d) => cellISO(d) === todayISO(); const onDayTap = (d) => { const iso = cellISO(d); if (!start || start && end && start !== end) { onChange(iso, iso);return; } if (iso < start) {onChange(iso, iso);return;} if (iso === start) {onChange(iso, iso);return;} onChange(start, iso); }; const move = (delta) => { const d = new Date(view.y, view.m + delta, 1); setView({ y: d.getFullYear(), m: d.getMonth() }); }; return (