agentleFS
dekozadekoza/oh-my-slop/skills/reference/full-calendar/SKILL.md

full-calendar

Skill4 starsChanged 8 months agoUnlicenseView on GitHub

Use when building, configuring, or debugging a FullCalendar instance — views, event sources, callbacks, drag-and-drop, or render hooks. Triggers on: "FullCalendar", "event calendar", "dayGrid"/"timeGrid", "events show on the wrong day" (exclusive end dates), "calendar not rendering", "dateClick or drag-drop not working" (missing interaction plugin), a JSON event feed, or wiring a calendar into an HTMX-driven app.

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 0 are distinctive, and 3 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Use the vanilla JS API — FullCalendar's Calendar class, not framework wrappers — unless the project explicitly uses React/Vue/Angular …

    line 20
  2. Very specific:

    allDay inference: If allDay is not explicitly set, FullCalendar infers it from start/end formats.

    line 31
  3. Very specific:

    Event data: use a JSON feed URL that your backend serves.

    line 50

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

FullCalendar Skill

Comprehensive reference for FullCalendar v6 — a full-sized, drag-and-drop event calendar rendered entirely in JavaScript. FullCalendar is plugin-based, framework-agnostic (with optional React/Vue/Angular connectors), and works naturally with server-rendered backends via JSON feeds.

Quick Start

  1. Identify what you need: initialization, event data, user interaction, or display customization.
  2. Open the matching reference file (see Reference Map below).
  3. Use the vanilla JS API — FullCalendar's Calendar class, not framework wrappers — unless the project explicitly uses React/Vue/Angular connectors.
  4. For HTMX-driven apps, prefer the JSON feed event source and server-rendered content patterns described in htmx-patterns.md.

Critical Rules

  1. end dates are exclusive. An event ending 2024-09-03 spans through 2024-09-02 and stops before 2024-09-03. This matches iCalendar RFC 5545 and Google Calendar API semantics. Agents and backend code producing event JSON must respect this — off-by-one end dates are the most common FullCalendar bug.
  2. interaction plugin is required for dateClick, selectable, and drag/resize. It is NOT required for eventClick or eventMouseEnter/eventMouseLeave. The standard CDN bundle includes it, but ES6 users must import @fullcalendar/interaction and add it to plugins: [].
  3. JSON feed dates must be ISO8601 strings or millisecond timestamps. Native JS Date objects cannot be serialized to JSON. Do not send new Date(...) strings.
  4. Dynamic option changes use setOption() / getOption(). But events and eventSources cannot be dynamically set — use addEventSource() / refetchEvents() instead. initialDate and initialView cannot be set either — use gotoDate() and changeView().
  5. Non-standard event properties go to extendedProps. During parsing, any property not in the standard set is moved into event.extendedProps. Access them there, not on the event root.
  6. Content injection varies by environment. In vanilla JS, eventContent returns text, { html }, or { domNodes }. React/Vue/Angular connectors have their own content injection patterns — do not mix them.
  7. allDay inference. If allDay is not explicitly set, FullCalendar infers it from start/end formats. ISO strings without time parts (e.g., 2024-09-01) are treated as all-day; strings with time parts are not.
  8. Toolbar values are space/comma separated. Space = gap between groups. Comma = adjacent buttons. Example: 'prev,next today' puts prev/next together, then a gap, then today.
  9. Timezone shifts come from timeZone mismatches. FullCalendar defaults to the browser's local timezone. ISO date strings with UTC offsets are converted into the calendar's zone; strings without offsets are taken as-is. Named timezones (anything beyond local/UTC) require a timezone plugin — without one they silently degrade to UTC — and JSON feeds receive the active zone via timeZoneParam so the backend can respond consistently.

Core Concepts

FullCalendar has a small set of concepts that recur everywhere:

  • Calendar instance: created with new FullCalendar.Calendar(el, options) (global bundle) or new Calendar(el, { plugins: [...], ...options }) (ES6). Call .render() to mount.
  • Plugins: each view type and feature is a separate package. The standard CDN bundle (fullcalendar/index.global.min.js) includes core, interaction, daygrid, timegrid, list, and multimonth.
  • Event sources: where events come from — an array, a JSON feed URL, or a function. FullCalendar auto-fetches when the visible date range changes.
  • Callbacks (handlers): functions you pass as options that fire on user interaction or lifecycle events (e.g., eventClick, dateClick, datesSet).
  • Render hooks: four-hook pattern (*ClassNames, *Content, *DidMount, *WillUnmount) for customizing the DOM of events, day cells, headers, etc.
  • Content injection: render hooks that accept *Content can return plain text, { html: '...' }, { domNodes: [...] }, or a function returning any of these.

HTMX Integration Context

FullCalendar and HTMX serve complementary roles. FullCalendar handles the calendar grid, date math, and client-side interactions. The backend provides event data via JSON. The key integration points:

  • Event data: use a JSON feed URL that your backend serves. FullCalendar sends start and end query params automatically.
  • Event interactions: on eventClick or dateClick, trigger HTMX requests to load modals/panels with server-rendered HTML, rather than building client-side forms.
  • Navigation: FullCalendar handles its own month/week navigation. If you need the navigation to also update other page elements, use datesSet callback to trigger HTMX requests.
  • Alternative approach: for simpler calendars, skip FullCalendar entirely and render the grid server-side with HTMX-powered navigation (see htmx-patterns.md for this pattern).

Reference Map

FileCovers
references/initialization.mdCDN setup, ES6 imports, Calendar constructor, plugin system, destroy/re-render
references/events.mdEvent model, parsing rules, sources (array, JSON feed, function), Event Object API, event methods
references/views.mdAvailable views, view plugins, toolbar, navigation, date display, sizing
references/callbacks.mdAll callbacks: dateClick, eventClick, select, eventDrop, eventResize, datesSet, loading, lifecycle
references/display.mdEvent display options, render hooks, content injection, CSS customization, colors
references/htmx-patterns.mdHTMX+FullCalendar integration, server-side calendar grid alternative, modal patterns
references/REFERENCE.mdCross-file index and quick lookup table

Task Routing

TaskStart here
Add a calendar to a pageinitialization.md
Load events from backend APIevents.md
Handle clicks, selections, drag-dropcallbacks.md
Customize event appearancedisplay.md
Configure toolbar, switch viewsviews.md
Integrate with HTMX backendhtmx-patterns.md
Look up a specific option/methodREFERENCE.md

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.