A month grid, a chronological list and a single-day schedule, built from one set of events in the page editor. Repeating rules, events that run across several days, category filters, a keyboard-operable detail panel, and calendar files generated in the browser. No HubDB table and no external service.
Demo 1
A full month with categories, a filter row, the day the reader is on marked, a workshop that runs across four cells, and a repeating series generated from one rule. Days holding more than the per-day limit open the rest in a panel.
Demo 2
This is the calendar above with different field values. The list view, the ink background, the serif headings, the pill filters and the coloured category chips are all settings in the page editor. Clear them and the grey month grid comes back.
Demo 3
The same module again, this time on a warm paper ground with a humanist serif, a wide measure and a lot of air. The time column sits right-aligned against the entries, the rows carry no border, and three lines of summary show instead of two. Section padding, card padding, line height and the summary line count are all fields.
Demo 4
A fourth set of field values: cool greys, a grotesk over a mono, square corners and cells packed tight. Four repeat rules cover a whole term, the week starts on Sunday, times read as AM and PM, and the per-day limit is set low so the overflow panel is easy to see.
Event Calendar Pro turns a list of events in the page editor into a month grid, a chronological list and a single-day schedule. There is no HubDB table to build and no external service to connect. The reader switches views, filters by category, and opens any entry for the full detail and an add-to-calendar row.
Add your categories before your events. Each one carries a slug, a display name, a chip background and a chip text colour. The slug is what you type into an event's Category field, so keep it lower case and free of spaces.
Every event takes a title, a start date, and optionally a start and end time, an end date, a description, a location with its own link, an image, a button, and a featured flag. Leave the end date empty for a single-day event. Set it to a later date and the event draws as one bar across the cells it covers.
Switching an event to all day drops its times everywhere, including the calendar file it hands out, which then uses whole dates instead of moments.
Each event carries its own rule: daily, weekly with a weekday picker, monthly by date or by weekday, or yearly. An interval sets how often the rule fires, and the rule ends never, after a set number of times, or on a date. A comma-separated list of dates in YYYY-MM-DD form takes single occurrences back out again.
The rule travels with the event and is worked out in the reader's browser for the month on screen. That is why paging forward to a month years away still shows the series, and why a monthly rule on the 31st correctly skips the months that are too short. Monthly by weekday reads the start date: an event starting on the third Wednesday repeats on the third Wednesday, and an event starting on the last Friday repeats on the last Friday. A yearly rule set to 29 February only appears in leap years.
Every entry can offer a downloadable calendar file, a Google Calendar link and an Outlook link. Which of them appear is a setting. The file is built in the browser at the moment of the click, so there is nothing to host and no request leaves the page. Commas and semicolons in a title or a description are escaped the way the calendar format requires, and long lines are folded, so the file opens cleanly in the desktop clients as well as the web ones.
Times are written and read exactly as you type them. The module does not convert them to each reader's own zone — it shows the timezone label you set, and hands calendar clients a floating time that lands at the same clock reading wherever it is opened. For a single-location programme that is the behaviour you want.
Every visible string is a field: the view names, the Today button, the filter labels, the upcoming and past switch, the overflow link with its count token, the empty state heading and body, the add-to-calendar labels, and the screen-reader descriptions. Month names and weekday names come from the page's own language attribute, so a page set to another language gets that language's calendar without any typing.
Colours, sizes, radii, spacing and weights all live on the Style tab, grouped by the part of the calendar they affect: the grid and its lines, the day cells and their weekend and adjacent-month states, the chips, the list rows, the detail panel, the day panel and the empty state. Category colours sit with the categories themselves. The accent colour and the body font inherit from the host theme, so the module lands in a theme's palette before anyone touches a setting.
Typography carries a body font and a heading font. The heading font sets the section title, the period label, the month rules in the list, the entry titles, the detail panel title and the empty-state title. Nothing is locked to a light background either: set the section background dark and the key colours to match, and the grid lines, cells, cards, chips and panels follow. The second demo above is this module with those settings, and nothing else.