@super-calendar/solid provides Solid components over the same calendar logic as
the React renderers. It uses @super-calendar/core/vanilla and requires no React
runtime. Solid 1 is not supported.
Solid 2 support is experimental. This package targets
solid-js@2.0.0-rc.20 and
@solidjs/web@2.0.0-rc.20. Keep both peers on these exact versions.Install the package
jsx: "preserve" and jsxImportSource: "@solidjs/web" in your TypeScript
configuration. The package is ESM and supports date-fns 3 and 4.
Render a controlled calendar
Calendar supports month, week, day, 3-day, custom, schedule, and year modes.
Use MonthList for a virtualized scrolling picker and ResourceTimeline for
horizontal or vertical resource lanes. DatePicker and DateRangePicker wrap
the month list in a popover. See the Solid API reference.
The Solid and React DOM components share prop names. Their render callbacks
return their framework’s JSX. In Solid, read callback props inside JSX instead
of destructuring them into nonreactive values.
A drag stays owned by the contact that starts it. Other contacts cannot move,
finish, or cancel an active drag. An additional contact cancels a touch hold
that has not started dragging yet. Cancellation discards pending event creation
and moves. onSelectDrag reports selection changes live; cancellation does not
undo selection updates your callback has already applied.
ResourceTimeline retains the grabbed event when other events are inserted or
reordered. Removing or replacing that event cancels its drag. Events with
draggable: false remain clickable and keyboard accessible in both orientations.
Removing a resource cancels creation in its lane. Losing pointer capture cancels
the active interaction.
Add range selection
createDateRange when constraints change. Read the returned
range() accessor in JSX. createMonthGrid and createNow also accept accessors;
create them inside a Solid component or root so their work is disposed with it.
The React hooks remain available from the existing React packages.
Add date pickers
Keep picker values in signals.DateRangePicker reports a start-only range with
end: null until you choose the second day. Clearing a range reports null.
minDate, maxDate, isDateDisabled, and theme. Changing
disabled to true closes an open popover. Re-enabling it leaves it closed.
See date and range pickers for the shared behavior.
Schedule resources
Use a custom field to assign each event to a resource. Apply the proposed dates inonDragEvent to commit a move or resize. Return false to reject it.
orientation="vertical" to place resources in columns. See
resource timelines for paging, business hours, and
custom headers. Direct views expect already expanded events; use
expandRecurringEvents when your bookings recur.
Render custom events
Calendar uses renderTimeEvent, renderMonthEvent, and renderScheduleEvent
for the corresponding views. Direct views such as TimeGrid use renderEvent.
Define the renderer once and read its props inside JSX to keep updates reactive.
boxHeight reports the available timed-event height. A custom
renderer replaces the default event content and its themed appearance. Use the
shared styling options when you only need different colors or spacing.
Load an event feed
Create the source inside a component. Pass accessors for the URL or async loader and its options so changing them reloads the feed.events(), loading(), and error() are accessors. The previous events remain
visible during a refresh or an error. A source or options change cancels the
previous URL request. Disposal stops polling and cancels pending requests;
later refetch() calls do nothing. Async function sources cannot be aborted,
but their stale results are ignored. Fetching starts on the client, including
after hydration; server rendering does not fetch.
Use createEventSource(() => loadEvents) for your own async function. URL feeds
support JSON and iCalendar through the shared event-source options.
The example’s feed view demonstrates loading and manual refresh.
Customize the appearance
Passtheme={darkSolidTheme} for the built-in dark theme, or pass a partial
SolidCalendarTheme. mergeSolidTheme fills omitted tokens with the defaults.
Use className and style on the root, or classNames and styles for named
slots. Slot classes replace themed styles and preserve layout, matching the
web styling contract. Numeric lengths use pixels. No stylesheet
import is needed.
Render on a server
The package’ssolid export lets the Vite plugin compile the library with your
app. Use solid({ ssr: true }) for hydration. Precompiled hydratable browser and
server entries are also available through the browser and default export
conditions. Server rendering does not access the DOM or start timers.
Keep the initial dates, events, locale, and time zone equal on server and client.
Pass a fixed now to make the current-time indicator deterministic. Construct
anchor dates in the same local zone on both sides, as described in
time zones.
The repository’s examples/solid app includes / and /ssr routes. Start it
with pnpm --filter @super-calendar/example-solid dev after pnpm build.
Troubleshoot an integration
JSX compilation or missing exports
Check thatsolid-js and @solidjs/web both resolve to 2.0.0-rc.20.
Use @solidjs/vite-plugin@3.0.0-next.55, jsx: "preserve", and
jsxImportSource: "@solidjs/web". Remove React JSX transforms from the Solid app.
Import calendar components from @super-calendar/solid; use
@super-calendar/core/vanilla for shared logic without React.
Changes do not appear
Read accessors in JSX, such asevents={events()}. Reading events() once in
the component body captures a snapshot. Keep reactive props as props.event
inside custom renderers instead of destructuring them. Update event arrays with
a signal setter, and replace the edited event object. For helpers such as
createDateRange and createEventSource, pass accessors for changing options.
Hydration reports mismatches
Enablesolid({ ssr: true }). Insert generateHydrationScript() from
@solidjs/web in the server document before the client entry, and use hydrate
for the container that already holds server-rendered HTML. Use render for an
empty client-only container. The repository example shows both paths.
Compare the initial date, events, locale, time zone, and now on both sides.
JSON serializes dates as strings, so restore each date field before passing
events to the calendar. Keep browser-only values out of the initial server render.