The month view rendered each event's text (and its little leading dot)
in the calendar's own color, on a very lightly tinted (~13% opacity)
background of that same color. For a light color like white or pale
yellow, the text ended up effectively invisible against its own
near-white background.
internal/web/templates/calendar.templ: add eventTextColor(hex), which
darkens colors above a perceived-luminance threshold (keeping the hue,
e.g. white -> a mid gray, pale yellow -> olive) while leaving already-
legible colors untouched; used for both the event text and its leading
dot. Also add a subtle ring to the event dot and to the calendar legend's
color swatch so a white/near-white swatch stays visible against the
page's white background, independent of the text-color fix.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The combined month view now always includes a read-only "Birthdays"
calendar (ref "@birthdays"), generated on the fly from every contact's
BDAY field across the user's address books — no calendar objects are
stored for it. Each birthday appears as an all-day event titled
"🎂 Name (Age)" (age omitted if BDAY has no year, e.g. "--MM-DD"), colored
pink, and links to the contact's edit page instead of an event editor.
Handles both "YYYY-MM-DD"/"YYYYMMDD" and year-less vCard BDAY formats,
and skips Feb 29 birthdays in non-leap years.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Combine own and shared calendars into a single /web/calendar month
view, each event colored per its source calendar.
- New event creation now uses a calendar <select> (only writable
calendars offered); editing keeps the event's original calendar fixed.
- Shared calendars use an "owner~name" reference in URLs, resolved via
resolveCalRef which also enforces read/write permissions from
calendar_shares (read-only shares can view/export but not edit/delete).
- Add per-calendar ICS export (single event and export-all) and import,
splitting multi-VEVENT uploads into individual stored objects while
preserving VTIMEZONE definitions and source VERSION/PRODID.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- List of the user's own calendars (web/calendar)
- Month view per calendar with a Monday-first 6-week grid, showing
all-day and timed events, colored dot matching the calendar's color
- Navigation between months (prev/next/today) via query params
- Create/edit/delete events: title, description, location, all-day
toggle, start/end date+time
- Clicking a day cell prefills a new all-day event on that date; the
"New event" button defaults to a one-hour slot starting next full hour
- Deleting an event or invalid time ranges (end before/equal start) are
validated with inline error messages
- Verified round-trip with the real CalDAV protocol handler (events
created via the web UI are correctly visible to a REPORT query)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>