Skip to content

Replace TOAST UI Calendar with FullCalendar in the calendar app - #12

Draft
arisoik wants to merge 34 commits into
Peergos:mainfrom
arisoik:calendar-app-scaffold
Draft

Replace TOAST UI Calendar with FullCalendar in the calendar app#12
arisoik wants to merge 34 commits into
Peergos:mainfrom
arisoik:calendar-app-scaffold

Conversation

@arisoik

@arisoik arisoik commented Jul 23, 2026

Copy link
Copy Markdown

No description provided.

arisoik and others added 12 commits July 19, 2026 10:19
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Search is a command-palette-style modal (click-only, no keyboard
shortcut) that matches title/location/description across all loaded
events, including recurring series and months not currently in view,
and opens the matched event's popover on selection.

Also: double-click an event to edit directly; popover click-through
behavior (switches to a different event in one click, only swallows
day-grid select); fixed an all-day create/duplicate off-by-one day;
fixed popover positioning to reliably avoid covering its own anchor.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sidebar with per-calendar show/hide, create/rename/recolor/delete
(primary calendar protected from deletion, real confirm dialog instead
of the browser's native one), a calendar picker in the event form, and
per-event coloring. Collapsible on desktop, off-canvas drawer on mobile.

Also fixes two click-handling bugs found via live testing: a calendar
menu overlapping the row below it could swallow clicks meant for that
row, and stopPropagation() calls elsewhere were silently blocking the
event popover's and calendar menu's own bubble-phase outside-click
listeners - both switched to capture phase.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replace the click-to-open command-palette search with an always-visible
search bar centered in the toolbar (hamburger left, search center, "..."
overflow menu right holding Import and the FullCalendar version), and
start the sidebar closed by default on both desktop and mobile.

Fixes two real layout bugs found testing at actual mobile widths: #search-bar
needed min-width:0 to shrink below its content size (a flex-item default
that was pushing the overflow menu off-screen), and the desktop-only
.collapsed sidebar class needed to be scoped to a min-width media query so
it stopped clipping the mobile drawer's content once opened. Also fixes a
click on the overflow menu's version line incorrectly closing the menu.
Switch the vendored FullCalendar theme from Classic to Breezy (indigo
palette) for a more modern look, then wire up Peergos's ?theme= URL
param to the data-color-scheme attribute Breezy's own CSS already
watches for. Rather than hand-rolling a separate dark palette, rewrite
calendar.css to reference Breezy's own --fc-breezy-* custom properties
throughout, so one attribute flip re-themes FullCalendar's grid and
this app's own sidebar/modals/popover/toolbar consistently at once.

Two refinements after seeing it live: override the background/popover
surfaces to Peergos web-ui's own dark-mode colors (#2c3e50/#283744)
instead of Breezy's stock near-black, so the app doesn't look visually
mismatched against its host; and add a brighter, index-matched
CALENDAR_COLORS_DARK palette (via a displayColor() lookup used only for
rendering, never for the stored cal.color identity) since the light-mode
calendar colors read as muddy against a dark background.

Also inlines the last few <img>-based icons as <svg> (they couldn't
pick up currentColor and would've stayed solid black in dark mode),
adds ISO week numbers and navLinks (day/week numbers now jump to
Day/Week view, matching Google Calendar/Outlook), and moves the Today
button between the prev/next arrows as one grouped control.

Verified live across all five views, the native "+N more" day popover,
and every custom modal/popover/dropdown, in both light and dark mode.
Export: add "Export calendar" (one calendar's full event list as a
single multi-VEVENT .ics file) to the sidebar menu, matching Google/
Outlook/Apple's own whole-calendar-first export convention - available
read-only, same as Search. Only ids this app minted get a Peergos UID
(<id>@peergos.org) on export; a re-exported imported event keeps its
original foreign UID untouched, so re-importing that file back into its
source app is still recognized as the same event rather than a new
duplicate. Fixes a real crash along the way: exporting a recurring
series with no occurrence in the currently rendered view had ev.start
=== null, so duration couldn't be computed from start/end - now falls
back to the duration already stored on the event's internal def.

Import: add duplicate detection (skip events whose id, derived from the
file's own UID, already exists), a "not a valid calendar file" check,
and a post-import summary modal instead of importing silently with no
feedback.

Two Breezy theme fixes, both in fixDayGridEventLayout(): Month/Year
event rows had no per-event color indicator at all (unlike Week/Day/List
which all work correctly) and right-aligned the time label instead of
reading flush-left like Classic - fixed with a small dot plus explicit
ordering, space-based (not a fixed breakpoint) so the time reappears
when there's actually room, e.g. rotating a phone to landscape. Applied
on every resize, not just at mount, since Breezy's own responsive logic
rebuilds this content on resize without re-invoking eventDidMount, which
otherwise left the ordering scrambled after a couple of rotations.

Also enables nowIndicator (the current-time line in Week/Day view was
never turned on) and swaps the last calendar color from gray to a
bright red for better dark-mode visibility.
arisoik and others added 17 commits July 23, 2026 21:23
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…isons

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…loat

Popover now scrolls instead of clamping (close button and actions stay
reachable via corner overlay/sticky footer), double-click-to-edit is
desktop-only, and comments/README trimmed for brevity throughout.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant