-
- Day {cycleDay} • {phase}
+ {/* Cycle info header */}
+
+ Day {currentCycleDay} · {currentPhase}
-
- {currentDate.toLocaleDateString("en-US", {
- month: "long",
- year: "numeric",
+
+ {/* Navigation with month/year */}
+
+
+
+
+ {new Date(displayYear, displayMonth).toLocaleDateString("en-US", {
+ month: "long",
+ year: "numeric",
+ })}
+
+
+
+
+
+
+ {/* Compact day of week headers */}
+
+ {COMPACT_DAY_NAMES.map((dayName, index) => (
+
+ {dayName}
+
+ ))}
+
+
+ {/* Calendar grid */}
+
+ {days.map((date, index) => {
+ if (!date) {
+ // biome-ignore lint/suspicious/noArrayIndexKey: Empty cells are always at fixed positions at the start of the month
+ return
;
+ }
+
+ const cycleDay = getCycleDay(lastPeriodDate, cycleLength, date);
+ const phase = getPhase(cycleDay);
+ const isToday =
+ date.getFullYear() === today.getFullYear() &&
+ date.getMonth() === today.getMonth() &&
+ date.getDate() === today.getDate();
+
+ return (
+
+ );
})}
-
- {/* Full calendar grid will be implemented here */}
-
Calendar grid placeholder
+
+
+ {/* Compact phase legend */}
+
+ {PHASE_LEGEND.map((phase) => (
+
+ ))}
+
);
}