Full-month event calendar with colored event badges per day.
Renders a 7-column month grid — like Google Calendar's month view — where
each day cell can contain multiple color-coded event badges. Navigation
between months is handled server-side via phx-click — no JavaScript needed.
Anatomy
| Element | Purpose |
|---|---|
| Header | Month + year label with prev/next navigation buttons |
| Column headers | Sun Mon Tue Wed Thu Fri Sat |
| Day cells | Padded grid of 35–42 cells; empty cells for padding |
| Event badge | Colored dot + truncated label per event |
Events format
Pass a plain list of maps with :date, :label, and optional :color:
events = [
%{date: ~D[2026-03-15], label: "Team standup", color: "blue"},
%{date: ~D[2026-03-20], label: "Deploy v2", color: "green"},
%{date: ~D[2026-03-25], label: "Deadline", color: "red"}
]Supported colors: "blue", "green", "red", "yellow", "purple",
"orange". Any other value falls back to bg-primary.
Navigation
Set on_navigate to a LiveView event name. Both prev and next buttons fire
that event with phx-value-month and phx-value-year so your LiveView
socket can update the assigns:
def handle_event("navigate_month", %{"month" => m, "year" => y}, socket) do
{:noreply, assign(socket, month: String.to_integer(m), year: String.to_integer(y))}
endExamples
<%!-- Basic (shows current month) --%>
<.event_calendar on_navigate="nav" events={@events} />
<%!-- Specific month --%>
<.event_calendar year={@year} month={@month} events={@events} on_navigate="nav" />
<%!-- Clickable days and events --%>
<.event_calendar
year={@year}
month={@month}
events={@events}
on_navigate="nav"
on_day_click="pick_day"
on_event_click="open_event"
/>
Summary
Functions
Renders a full-month event calendar.
Functions
Renders a full-month event calendar.
Example
<.event_calendar
year={2026}
month={3}
events={[%{date: ~D[2026-03-15], label: "Sprint review", color: "blue"}]}
on_navigate="nav"
/>Attributes
year(:integer) - Calendar year. Defaults to the current year. Defaults tonil.month(:integer) - Calendar month (1–12). Defaults to the current month. Defaults tonil.events(:list) - List of event maps. Each map must have:date(Date.t()),:label(string). Optional:color("blue"|"green"|"red"|"yellow"|"purple"|"orange"). Defaults to[].on_navigate(:string) - LiveView event name fired by prev/next buttons. Receivesphx-value-monthandphx-value-year. Defaults tonil.on_day_click(:string) - LiveView event name fired when a day cell is clicked. Receivesphx-value-date(ISO 8601). Defaults tonil.on_event_click(:string) - LiveView event name fired when an event badge is clicked. Receivesphx-value-dateandphx-value-label. Defaults tonil.class(:string) - Additional CSS classes for the root element. Defaults tonil.- Global attributes are accepted. HTML attributes forwarded to the root
<div>element.