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
The same module set to open on the chronological list. White ground, one indigo accent, hairline cards with a soft shadow, and a wide measure. The view, the card radius, the shadow, the accent and every label are field values in the page editor.
Demo 3
The single-day schedule, set for a lot of air. Grey ground, white cards with no border, large light headings, small grey captions and a blue accent. Section padding, card radius, heading weight, the time column width and the summary line count are all fields.
Demo 4
No colour of its own. The week starts on Sunday, the cells are shorter, the type is smaller and the per-day limit is set low so the overflow panel is easy to see. Four repeat rules cover a whole term and the bar running across three days is one entry.
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.
A phone column is about five characters wide, which is not enough for a title. Below a width you set, the month view stops drawing cells and reads out as a list instead: one heading per day, then the title, the time, the place and the summary of everything on it. The month buttons, the period label and the filters stay where they were, so paging back and forward still moves a month at a time.
If the shape of the month matters more than the titles, a setting keeps the grid and puts a count on each day, or a bar for each entry. In every one of those the day number becomes a button that opens the day in a panel, so nothing on the calendar is more than one tap away. Above that width the grid is drawn as it is here, and a title too long for its cell is cut with an ellipsis.
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 one palette either: set the section background, the surface, the border and the text colours and the grid lines, cells, cards, chips and panels all follow. The three demos above the last one are this module with nothing changed but field values.