The problem
If you’re on Svelte 5, calendar UIs often mean wrapping a React-era library, accepting a heavy dependency tree, or rolling month grids yourself and stopping short of week time-grids, recurrence, and drag-resize. You want one component that feels like Google / Apple / Outlook — without dragging half of npm into the client.
What it is
svelte5plus-calendar is a full-featured, zero-runtime-dependency calendar component for Svelte 5: month, week, day, year, and agenda views, drag & drop editing, recurring events, multiple calendars, i18n, and dark mode. TypeScript-first; styles import automatically.
Docs with live examples: blackman99.github.io/svelte5plus-calendar
Source: github.com/Blackman99/svelte5plus-calendar (MIT)
npm: svelte5plus-calendar
What you get
Six views
Month (spanning multi-day bars, +N more popovers), week & day time grids, year overview, agenda list, and a resources view (rooms/people columns) for booking-style UIs.
Drag & drop
Move events across days/slots, drag all-day bars, resize from the bottom edge, drag empty space to select/create. Touch: long-press to drag, swipe to scroll.
Built-in popovers
Click an event for details (with delete); click/drag empty space for quick-create — zero config. Your callbacks replace them when provided.
Recurring events
Practical RRULE subset (FREQ, INTERVAL, COUNT, UNTIL, BYDAY incl. 2TU/-1FR, BYMONTHDAY) as strings or typed objects, plus exdates. This event and this and following edits; occurrence/series deletion.
Theming & i18n
Light / dark / auto; every color, radius, and font is a CSS custom property; 10-color event palette that adapts to dark mode. Any BCP-47 locale via Intl (no bundles); UI strings for 10 languages; locale-aware week start and clock; timeZone prop with edits converted back.
More
Multiple calendar sources with visibility and edit permissions; current-time indicator and business hours; validRange + eventOverlap={false}; ICS parseICS / toICS; custom eventContent snippets; headless exports (layoutDay, expandRecurrence, …); keyboard navigation and aria-live.
Quick start
npm install svelte5plus-calendar
Requires Svelte 5. Styles are imported automatically.
<script lang="ts">
import type { CalendarEvent } from 'svelte5plus-calendar';
import { Calendar } from 'svelte5plus-calendar';
let events = $state<CalendarEvent[]>([
{
id: '1',
title: 'Kickoff meeting',
start: new Date(2026, 7, 13, 10, 0),
end: new Date(2026, 7, 13, 11, 0),
color: 'teal'
},
{
id: '3',
title: 'Standup',
start: new Date(2026, 7, 10, 9, 30),
end: new Date(2026, 7, 10, 9, 45),
recurrence: 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR'
}
]);
</script>
<div style="height: 640px">
<Calendar bind:events view="week" locale="en" editable selectable />
</div>
Handle edits with rollback:
<Calendar
bind:events
editable
onEventChange={async ({ event, start, end, revert }) => {
try {
await api.update(event.id, { start, end });
} catch {
revert();
}
}}
/>
Who it’s for
- Svelte 5 apps that need a real calendar, not only a date picker
- Teams that want DnD + recurrence + i18n without a React interop layer
- Authors who prefer CSS-variable theming and headless layout utils
Who it’s not (yet) for
- Projects stuck on Svelte 4 (this package requires Svelte 5)
- Apps that need a full RFC5545 / CalDAV server stack (client component + practical RRULE subset)
- Teams standardized on FullCalendar’s plugin ecosystem with sunk cost already paid
Light comparison (not a roast)
| Need | Typical pick | svelte5plus-calendar angle |
|---|---|---|
| Battle-tested React calendar | FullCalendar | Svelte 5-native, zero runtime deps |
| Month-only picker | Lightweight date libs | Full views + DnD + RRULE + resources |
| Stay in Svelte | DIY grids | One component + docs site examples |
Try it / tell us what’s wrong
We’re especially hungry for feedback on:
- First-hour DX (npm install → editable week view)
- RRULE edit/split edges in real product data
- Gaps vs FullCalendar for your booking / scheduling use case
Comment with your current Svelte calendar approach and the one feature that would make you switch — we’ll prioritize from real replies.
Top comments (0)