beautify-event 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +382 -0
- package/dist/index.d.mts +217 -0
- package/dist/index.d.ts +217 -0
- package/dist/index.js +2165 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2130 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +111 -0
package/README.md
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
# Beautify Event
|
|
2
|
+
|
|
3
|
+
A beautiful, fully customizable React event calendar component with month, week, day, 2-day, and resource views. Built with Radix UI, Tailwind CSS, and date-fns.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Multiple Views**: Month, Week, Day, 2-Day, and Resource views
|
|
8
|
+
- **Responsive**: Mobile-optimized with collapsible month picker and horizontal-scrolling week view
|
|
9
|
+
- **Localization**: Built-in support for English, French, and Arabic (extensible)
|
|
10
|
+
- **Drag & Drop**: Create events by dragging on empty slots; move events by dragging
|
|
11
|
+
- **Current Time Line**: Optional horizontal line showing the current time in day/week views
|
|
12
|
+
- **Customizable**: Custom event renderers, headers, themes, and styling
|
|
13
|
+
- **TypeScript**: Full type definitions included
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install beautify-event
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Peer Dependencies
|
|
22
|
+
|
|
23
|
+
Beautify Event requires the following peer dependencies. Install them if not already present:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install react react-dom date-fns
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
For full styling and component support, you'll also need:
|
|
30
|
+
|
|
31
|
+
- **Tailwind CSS** (v3 or v4)
|
|
32
|
+
- **Radix UI** primitives (or shadcn/ui)
|
|
33
|
+
- **lucide-react** (or ensure icons are available)
|
|
34
|
+
|
|
35
|
+
## Quick Start
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import { EventCalendar } from "beautify-event"
|
|
39
|
+
import type { CalendarEvent } from "beautify-event"
|
|
40
|
+
|
|
41
|
+
const events: CalendarEvent[] = [
|
|
42
|
+
{
|
|
43
|
+
id: "1",
|
|
44
|
+
title: "Team Meeting",
|
|
45
|
+
start: new Date(2026, 2, 10, 9, 0),
|
|
46
|
+
end: new Date(2026, 2, 10, 10, 0),
|
|
47
|
+
color: "#3b82f6",
|
|
48
|
+
},
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
export default function App() {
|
|
52
|
+
return (
|
|
53
|
+
<div className="h-[600px]">
|
|
54
|
+
<EventCalendar events={events} />
|
|
55
|
+
</div>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Usage
|
|
61
|
+
|
|
62
|
+
### Basic Example
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
<EventCalendar
|
|
66
|
+
events={events}
|
|
67
|
+
defaultDate={new Date()}
|
|
68
|
+
defaultView="week"
|
|
69
|
+
views={["month", "week", "day"]}
|
|
70
|
+
/>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Controlled Mode
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
const [date, setDate] = useState(new Date())
|
|
77
|
+
const [view, setView] = useState<ViewType>("week")
|
|
78
|
+
|
|
79
|
+
<EventCalendar
|
|
80
|
+
events={events}
|
|
81
|
+
date={date}
|
|
82
|
+
view={view}
|
|
83
|
+
onDateChange={setDate}
|
|
84
|
+
onViewChange={setView}
|
|
85
|
+
/>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### With Resources (Rooms, etc.)
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
const resources: Resource[] = [
|
|
92
|
+
{ id: "room-1", name: "Conference Room A", color: "#3b82f6" },
|
|
93
|
+
{ id: "room-2", name: "Meeting Room B", color: "#10b981" },
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
<EventCalendar
|
|
97
|
+
events={events}
|
|
98
|
+
resources={resources}
|
|
99
|
+
views={["month", "week", "day", "resource"]}
|
|
100
|
+
/>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Event Handlers
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
<EventCalendar
|
|
107
|
+
events={events}
|
|
108
|
+
onEventClick={(event) => console.log("Clicked:", event)}
|
|
109
|
+
onEventDoubleClick={(event) => openEditModal(event)}
|
|
110
|
+
onSlotClick={(slot) => createEvent(slot)}
|
|
111
|
+
onSlotDoubleClick={(slot) => createEvent(slot)}
|
|
112
|
+
onDayClick={(date) => navigateToDay(date)}
|
|
113
|
+
onDateChange={(date) => setSelectedDate(date)}
|
|
114
|
+
onRangeChange={(range) => fetchEvents(range)}
|
|
115
|
+
/>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Drag & Drop
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
<EventCalendar
|
|
122
|
+
events={events}
|
|
123
|
+
enableDragToCreate
|
|
124
|
+
enableDragToMove
|
|
125
|
+
onEventCreate={(slotInfo) => {
|
|
126
|
+
const newEvent = { id: "new-1", title: "New Event", ...slotInfo }
|
|
127
|
+
setEvents((prev) => [...prev, newEvent])
|
|
128
|
+
}}
|
|
129
|
+
onEventMove={({ event, newStart, newEnd }) => {
|
|
130
|
+
setEvents((prev) =>
|
|
131
|
+
prev.map((e) =>
|
|
132
|
+
e.id === event.id ? { ...e, start: newStart, end: newEnd } : e
|
|
133
|
+
)
|
|
134
|
+
)
|
|
135
|
+
}}
|
|
136
|
+
/>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Calendar Options
|
|
140
|
+
|
|
141
|
+
Pass configuration via `calendarOptions`:
|
|
142
|
+
|
|
143
|
+
| Option | Type | Default | Description |
|
|
144
|
+
|--------|------|---------|-------------|
|
|
145
|
+
| `startHour` | `number` | `0` | Start hour for time series (0-23) |
|
|
146
|
+
| `endHour` | `number` | `24` | End hour (use 24 for full day) |
|
|
147
|
+
| `timeFormat` | `"12h" \| "24h"` | `"12h"` | Hour label format |
|
|
148
|
+
| `weekStartsOn` | `0-6` | `0` | First day of week (0 = Sunday) |
|
|
149
|
+
| `hourHeight` | `number` | `64` | Height of each hour slot in pixels |
|
|
150
|
+
| `timeSeriesMaxHeight` | `number \| string` | `400` | Max height for day/week grid; enables scrolling |
|
|
151
|
+
| `showCurrentTimeLine` | `boolean` | `true` | Show horizontal line at current time |
|
|
152
|
+
| `maxEventsPerDay` | `number` | `3` | Events to show before "+X more" in month view |
|
|
153
|
+
| `defaultEventColor` | `string` | `"#3b82f6"` | Default event color |
|
|
154
|
+
| `defaultResourceColor` | `string` | `"#6366f1"` | Default resource color |
|
|
155
|
+
| `locale` | `string` | `"en-US"` | Locale for formatting |
|
|
156
|
+
|
|
157
|
+
```tsx
|
|
158
|
+
<EventCalendar
|
|
159
|
+
events={events}
|
|
160
|
+
calendarOptions={{
|
|
161
|
+
startHour: 8,
|
|
162
|
+
endHour: 20,
|
|
163
|
+
timeFormat: "24h",
|
|
164
|
+
weekStartsOn: 1,
|
|
165
|
+
locale: "fr",
|
|
166
|
+
timeSeriesMaxHeight: 500,
|
|
167
|
+
showCurrentTimeLine: true,
|
|
168
|
+
}}
|
|
169
|
+
/>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Localization
|
|
173
|
+
|
|
174
|
+
Built-in locales: **English** (`en`, `en-US`), **French** (`fr`), **Arabic** (`ar`).
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
<EventCalendar
|
|
178
|
+
events={events}
|
|
179
|
+
calendarOptions={{ locale: "fr" }}
|
|
180
|
+
/>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
To integrate with your app's i18n:
|
|
184
|
+
|
|
185
|
+
```tsx
|
|
186
|
+
// With next-intl
|
|
187
|
+
const locale = useLocale()
|
|
188
|
+
|
|
189
|
+
// With react-i18next
|
|
190
|
+
const { i18n } = useTranslation()
|
|
191
|
+
|
|
192
|
+
<EventCalendar
|
|
193
|
+
events={events}
|
|
194
|
+
calendarOptions={{ locale: i18n.language }}
|
|
195
|
+
/>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Themes
|
|
199
|
+
|
|
200
|
+
```tsx
|
|
201
|
+
// Use system/app theme
|
|
202
|
+
<EventCalendar events={events} />
|
|
203
|
+
|
|
204
|
+
// Force light or dark
|
|
205
|
+
<EventCalendar events={events} theme="dark" />
|
|
206
|
+
|
|
207
|
+
// Custom theme variables
|
|
208
|
+
<EventCalendar
|
|
209
|
+
events={events}
|
|
210
|
+
themeVars={{
|
|
211
|
+
"--primary": "#6366f1",
|
|
212
|
+
"--background": "#0f172a",
|
|
213
|
+
"--foreground": "#f8fafc",
|
|
214
|
+
}}
|
|
215
|
+
/>
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Props Reference
|
|
219
|
+
|
|
220
|
+
### EventCalendar
|
|
221
|
+
|
|
222
|
+
| Prop | Type | Default | Description |
|
|
223
|
+
|------|------|---------|-------------|
|
|
224
|
+
| `events` | `CalendarEvent[]` | **required** | Events to display |
|
|
225
|
+
| `resources` | `Resource[]` | `[]` | Resources for resource view |
|
|
226
|
+
| `date` | `Date` | - | Controlled current date |
|
|
227
|
+
| `defaultDate` | `Date` | `new Date()` | Initial date (uncontrolled) |
|
|
228
|
+
| `view` | `ViewType` | - | Controlled view |
|
|
229
|
+
| `defaultView` | `ViewType` | `"month"` | Initial view (uncontrolled) |
|
|
230
|
+
| `views` | `ViewType[]` | `["month","week","day","resource"]` | Available views |
|
|
231
|
+
| `calendarOptions` | `CalendarOptions` | `{}` | Calendar configuration |
|
|
232
|
+
| `showNavigation` | `boolean` | `true` | Show prev/next buttons |
|
|
233
|
+
| `showViewSwitcher` | `boolean` | `true` | Show view toggle |
|
|
234
|
+
| `showTodayButton` | `boolean` | `true` | Show Today button |
|
|
235
|
+
| `className` | `string` | - | Container class name |
|
|
236
|
+
| `loading` | `boolean` | `false` | Loading state |
|
|
237
|
+
| `theme` | `"light" \| "dark" \| "system"` | `"system"` | Theme mode |
|
|
238
|
+
| `themeVars` | `Record<string, string>` | - | CSS variable overrides |
|
|
239
|
+
| `enableDragToCreate` | `boolean` | `false` | Allow drag to create events |
|
|
240
|
+
| `enableDragToMove` | `boolean` | `false` | Allow drag to move events |
|
|
241
|
+
| `mobileBreakpoint` | `"sm" \| "md" \| "lg"` | `"md"` | Breakpoint for mobile layout |
|
|
242
|
+
| `showMobileMonthPicker` | `boolean` | `true` | Show month picker on mobile |
|
|
243
|
+
|
|
244
|
+
### CalendarEvent
|
|
245
|
+
|
|
246
|
+
```ts
|
|
247
|
+
interface CalendarEvent {
|
|
248
|
+
id: string
|
|
249
|
+
title: string
|
|
250
|
+
start: Date
|
|
251
|
+
end: Date
|
|
252
|
+
color?: string
|
|
253
|
+
resourceId?: string
|
|
254
|
+
description?: string
|
|
255
|
+
allDay?: boolean
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Resource
|
|
260
|
+
|
|
261
|
+
```ts
|
|
262
|
+
interface Resource {
|
|
263
|
+
id: string
|
|
264
|
+
name: string
|
|
265
|
+
color?: string
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Custom Renderers
|
|
270
|
+
|
|
271
|
+
### Custom Event Content
|
|
272
|
+
|
|
273
|
+
```tsx
|
|
274
|
+
<EventCalendar
|
|
275
|
+
events={events}
|
|
276
|
+
renderEvent={(event, view) => (
|
|
277
|
+
<div className="custom-event">
|
|
278
|
+
<strong>{event.title}</strong>
|
|
279
|
+
{event.description && <p>{event.description}</p>}
|
|
280
|
+
</div>
|
|
281
|
+
)}
|
|
282
|
+
/>
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Custom Header
|
|
286
|
+
|
|
287
|
+
```tsx
|
|
288
|
+
<EventCalendar
|
|
289
|
+
events={events}
|
|
290
|
+
renderHeader={({ date, view, title, onNavigate, onToday }) => (
|
|
291
|
+
<div className="flex items-center justify-between">
|
|
292
|
+
<h1>{title}</h1>
|
|
293
|
+
<div>
|
|
294
|
+
<button onClick={() => onNavigate("prev")}>Prev</button>
|
|
295
|
+
<button onClick={onToday}>Today</button>
|
|
296
|
+
<button onClick={() => onNavigate("next")}>Next</button>
|
|
297
|
+
</div>
|
|
298
|
+
</div>
|
|
299
|
+
)}
|
|
300
|
+
/>
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Selected Event / Slot UI
|
|
304
|
+
|
|
305
|
+
```tsx
|
|
306
|
+
<EventCalendar
|
|
307
|
+
events={events}
|
|
308
|
+
renderSelectedEvent={({ event, onClose }) =>
|
|
309
|
+
event && (
|
|
310
|
+
<Sheet open={!!event} onOpenChange={(open) => !open && onClose()}>
|
|
311
|
+
<SheetContent>
|
|
312
|
+
<SheetHeader>
|
|
313
|
+
<SheetTitle>{event.title}</SheetTitle>
|
|
314
|
+
</SheetHeader>
|
|
315
|
+
<p>{event.description}</p>
|
|
316
|
+
</SheetContent>
|
|
317
|
+
</Sheet>
|
|
318
|
+
)
|
|
319
|
+
}
|
|
320
|
+
renderSelectedSlot={({ slot, onClose }) => (
|
|
321
|
+
// Your slot detail UI
|
|
322
|
+
)}
|
|
323
|
+
/>
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## Mobile Behavior
|
|
327
|
+
|
|
328
|
+
On viewports below the `mobileBreakpoint`:
|
|
329
|
+
|
|
330
|
+
- Simplified header with week strip
|
|
331
|
+
- Month title with expandable month picker (chevron toggle)
|
|
332
|
+
- Week view shows ~2 days at a time with horizontal scroll
|
|
333
|
+
- Sticky time labels column during horizontal scroll
|
|
334
|
+
- Touch-friendly day selection
|
|
335
|
+
|
|
336
|
+
## Exports
|
|
337
|
+
|
|
338
|
+
```ts
|
|
339
|
+
// Components
|
|
340
|
+
export { EventCalendar, EventCalendarThemeProvider, useCalendar }
|
|
341
|
+
|
|
342
|
+
// Types
|
|
343
|
+
export type {
|
|
344
|
+
ViewType,
|
|
345
|
+
TimeFormat,
|
|
346
|
+
CalendarOptions,
|
|
347
|
+
CalendarEvent,
|
|
348
|
+
Resource,
|
|
349
|
+
SlotInfo,
|
|
350
|
+
DateRange,
|
|
351
|
+
EventCalendarProps,
|
|
352
|
+
HeaderRenderProps,
|
|
353
|
+
CalendarConfig,
|
|
354
|
+
CalendarTheme,
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// Utilities
|
|
358
|
+
export {
|
|
359
|
+
getMonthDays,
|
|
360
|
+
getWeekDays,
|
|
361
|
+
getEventsForDay,
|
|
362
|
+
navigateDate,
|
|
363
|
+
getViewTitle,
|
|
364
|
+
getViewDateRange,
|
|
365
|
+
formatHour,
|
|
366
|
+
formatDate,
|
|
367
|
+
getDateFnsLocale,
|
|
368
|
+
getHoursArray,
|
|
369
|
+
createSlotDate,
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
## Requirements
|
|
374
|
+
|
|
375
|
+
- React 18+
|
|
376
|
+
- Tailwind CSS
|
|
377
|
+
- Radix UI (or shadcn/ui components)
|
|
378
|
+
- date-fns
|
|
379
|
+
|
|
380
|
+
## License
|
|
381
|
+
|
|
382
|
+
MIT
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React$1 from 'react';
|
|
3
|
+
import { Locale } from 'date-fns';
|
|
4
|
+
|
|
5
|
+
type ViewType = "month" | "week" | "day" | "2day" | "resource";
|
|
6
|
+
type TimeFormat = "12h" | "24h";
|
|
7
|
+
interface CalendarOptions {
|
|
8
|
+
/** Start hour for time series in day/week/resource views (0-23). Default: 0 (12:00 AM) */
|
|
9
|
+
startHour?: number;
|
|
10
|
+
/** End hour for time series (0-24). Use 24 for full day. Default: 24 (11:59 PM) */
|
|
11
|
+
endHour?: number;
|
|
12
|
+
/** Time format for hour labels: "12h" (12 AM/PM) or "24h" (00:00-23:00). Default: "12h" */
|
|
13
|
+
timeFormat?: TimeFormat;
|
|
14
|
+
/** First day of week (0 = Sunday, 1 = Monday, etc.) */
|
|
15
|
+
weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
16
|
+
/** Height of each hour slot in pixels */
|
|
17
|
+
hourHeight?: number;
|
|
18
|
+
/** Max height for the time series grid (day/week views). Enables scrolling. Default: "400px" */
|
|
19
|
+
timeSeriesMaxHeight?: number | string;
|
|
20
|
+
/** Show a horizontal line at the current time in day/week views. Default: true */
|
|
21
|
+
showCurrentTimeLine?: boolean;
|
|
22
|
+
/** Number of events to show before "+X more" in month view */
|
|
23
|
+
maxEventsPerDay?: number;
|
|
24
|
+
/** Default event color if not specified on event */
|
|
25
|
+
defaultEventColor?: string;
|
|
26
|
+
/** Default resource color if not specified on resource */
|
|
27
|
+
defaultResourceColor?: string;
|
|
28
|
+
/** Locale for date formatting. Built-in: "en", "en-US", "fr", "ar" */
|
|
29
|
+
locale?: string;
|
|
30
|
+
}
|
|
31
|
+
interface Resource {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
color?: string;
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
}
|
|
37
|
+
interface CalendarEvent {
|
|
38
|
+
id: string;
|
|
39
|
+
title: string;
|
|
40
|
+
start: Date;
|
|
41
|
+
end: Date;
|
|
42
|
+
color?: string;
|
|
43
|
+
resourceId?: string;
|
|
44
|
+
description?: string;
|
|
45
|
+
allDay?: boolean;
|
|
46
|
+
[key: string]: unknown;
|
|
47
|
+
}
|
|
48
|
+
interface DateRange {
|
|
49
|
+
start: Date;
|
|
50
|
+
end: Date;
|
|
51
|
+
}
|
|
52
|
+
interface SlotInfo {
|
|
53
|
+
start: Date;
|
|
54
|
+
end: Date;
|
|
55
|
+
resourceId?: string;
|
|
56
|
+
}
|
|
57
|
+
interface EventCalendarProps {
|
|
58
|
+
/** Array of events to display */
|
|
59
|
+
events: CalendarEvent[];
|
|
60
|
+
/** Array of resources for resource view */
|
|
61
|
+
resources?: Resource[];
|
|
62
|
+
/** Currently selected date (controlled) */
|
|
63
|
+
date?: Date;
|
|
64
|
+
/** Default date when uncontrolled */
|
|
65
|
+
defaultDate?: Date;
|
|
66
|
+
/** Current view type (controlled) */
|
|
67
|
+
view?: ViewType;
|
|
68
|
+
/** Default view when uncontrolled */
|
|
69
|
+
defaultView?: ViewType;
|
|
70
|
+
/** Available views to show in the header */
|
|
71
|
+
views?: ViewType[];
|
|
72
|
+
/** Calendar configuration options */
|
|
73
|
+
calendarOptions?: CalendarOptions;
|
|
74
|
+
/** Whether to show navigation controls */
|
|
75
|
+
showNavigation?: boolean;
|
|
76
|
+
/** Whether to show view switcher */
|
|
77
|
+
showViewSwitcher?: boolean;
|
|
78
|
+
/** Whether to show today button */
|
|
79
|
+
showTodayButton?: boolean;
|
|
80
|
+
/** Custom class name for the container */
|
|
81
|
+
className?: string;
|
|
82
|
+
/** Loading state */
|
|
83
|
+
loading?: boolean;
|
|
84
|
+
/** Theme: "light" | "dark" | "system". When set, calendar uses its own theme scope. Default: "system" */
|
|
85
|
+
theme?: "light" | "dark" | "system";
|
|
86
|
+
/** Custom theme variables. Override CSS vars: e.g. { "--background": "#fff", "--primary": "#3b82f6" } */
|
|
87
|
+
themeVars?: Record<string, string>;
|
|
88
|
+
/** Enable drag on empty slot to create event. Default: false */
|
|
89
|
+
enableDragToCreate?: boolean;
|
|
90
|
+
/** Enable drag event to move. Default: false */
|
|
91
|
+
enableDragToMove?: boolean;
|
|
92
|
+
/** Breakpoint for mobile layout: "sm" | "md" | "lg". Default: "md" (768px) */
|
|
93
|
+
mobileBreakpoint?: "sm" | "md" | "lg";
|
|
94
|
+
/** Whether to show mini month picker on mobile. Default: true */
|
|
95
|
+
showMobileMonthPicker?: boolean;
|
|
96
|
+
/** Called when an event is clicked */
|
|
97
|
+
onEventClick?: (event: CalendarEvent) => void;
|
|
98
|
+
/** Called when an event is double clicked */
|
|
99
|
+
onEventDoubleClick?: (event: CalendarEvent) => void;
|
|
100
|
+
/** Called when a slot is clicked (for creating new events) */
|
|
101
|
+
onSlotClick?: (slotInfo: SlotInfo) => void;
|
|
102
|
+
/** Called when a slot is double clicked */
|
|
103
|
+
onSlotDoubleClick?: (slotInfo: SlotInfo) => void;
|
|
104
|
+
/** Called when the date changes */
|
|
105
|
+
onDateChange?: (date: Date) => void;
|
|
106
|
+
/** Called when the view changes */
|
|
107
|
+
onViewChange?: (view: ViewType) => void;
|
|
108
|
+
/** Called when navigating (prev/next/today) */
|
|
109
|
+
onNavigate?: (date: Date, action: "prev" | "next" | "today") => void;
|
|
110
|
+
/** Called when visible date range changes */
|
|
111
|
+
onRangeChange?: (range: DateRange) => void;
|
|
112
|
+
/** Called when a day is clicked in month view */
|
|
113
|
+
onDayClick?: (date: Date) => void;
|
|
114
|
+
/** Called when event is created via drag (enableDragToCreate) */
|
|
115
|
+
onEventCreate?: (slotInfo: SlotInfo) => void;
|
|
116
|
+
/** Called when event is moved via drag (enableDragToMove) */
|
|
117
|
+
onEventMove?: (params: {
|
|
118
|
+
event: CalendarEvent;
|
|
119
|
+
newStart: Date;
|
|
120
|
+
newEnd: Date;
|
|
121
|
+
resourceId?: string;
|
|
122
|
+
}) => void;
|
|
123
|
+
/** Custom event renderer */
|
|
124
|
+
renderEvent?: (event: CalendarEvent, view: ViewType) => React.ReactNode;
|
|
125
|
+
/** Custom day cell renderer for month view */
|
|
126
|
+
renderDayCell?: (date: Date, events: CalendarEvent[]) => React.ReactNode;
|
|
127
|
+
/** Custom header renderer */
|
|
128
|
+
renderHeader?: (props: HeaderRenderProps) => React.ReactNode;
|
|
129
|
+
/** Custom resource header renderer */
|
|
130
|
+
renderResourceHeader?: (resource: Resource) => React.ReactNode;
|
|
131
|
+
/** Custom time slot label renderer */
|
|
132
|
+
renderTimeSlot?: (hour: number) => React.ReactNode;
|
|
133
|
+
/** Custom empty state renderer */
|
|
134
|
+
renderEmpty?: () => React.ReactNode;
|
|
135
|
+
/** Render selected event UI (drawer, popover, modal, etc.). Receives event (null when closed) and onClose. */
|
|
136
|
+
renderSelectedEvent?: (props: {
|
|
137
|
+
event: CalendarEvent | null;
|
|
138
|
+
onClose: () => void;
|
|
139
|
+
}) => React.ReactNode;
|
|
140
|
+
/** Render selected slot UI (drawer, popover, modal, etc.). Receives slot (null when closed) and onClose. */
|
|
141
|
+
renderSelectedSlot?: (props: {
|
|
142
|
+
slot: SlotInfo | null;
|
|
143
|
+
onClose: () => void;
|
|
144
|
+
}) => React.ReactNode;
|
|
145
|
+
}
|
|
146
|
+
interface HeaderRenderProps {
|
|
147
|
+
date: Date;
|
|
148
|
+
view: ViewType;
|
|
149
|
+
onNavigate: (direction: "prev" | "next") => void;
|
|
150
|
+
onViewChange: (view: ViewType) => void;
|
|
151
|
+
onToday: () => void;
|
|
152
|
+
title: string;
|
|
153
|
+
views: ViewType[];
|
|
154
|
+
}
|
|
155
|
+
interface CalendarContextValue {
|
|
156
|
+
currentDate: Date;
|
|
157
|
+
view: ViewType;
|
|
158
|
+
events: CalendarEvent[];
|
|
159
|
+
resources: Resource[];
|
|
160
|
+
config: CalendarConfig;
|
|
161
|
+
onEventClick?: (event: CalendarEvent) => void;
|
|
162
|
+
onEventDoubleClick?: (event: CalendarEvent) => void;
|
|
163
|
+
onSlotClick?: (slotInfo: SlotInfo) => void;
|
|
164
|
+
onSlotDoubleClick?: (slotInfo: SlotInfo) => void;
|
|
165
|
+
onDayClick?: (date: Date) => void;
|
|
166
|
+
renderEvent?: (event: CalendarEvent, view: ViewType) => React.ReactNode;
|
|
167
|
+
enableDragToCreate?: boolean;
|
|
168
|
+
enableDragToMove?: boolean;
|
|
169
|
+
onEventCreate?: (slotInfo: SlotInfo) => void;
|
|
170
|
+
onEventMove?: (params: {
|
|
171
|
+
event: CalendarEvent;
|
|
172
|
+
newStart: Date;
|
|
173
|
+
newEnd: Date;
|
|
174
|
+
resourceId?: string;
|
|
175
|
+
}) => void;
|
|
176
|
+
}
|
|
177
|
+
interface CalendarConfig {
|
|
178
|
+
weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
179
|
+
startHour: number;
|
|
180
|
+
endHour: number;
|
|
181
|
+
hourHeight: number;
|
|
182
|
+
maxEventsPerDay: number;
|
|
183
|
+
timeSeriesMaxHeight?: number | string;
|
|
184
|
+
showCurrentTimeLine?: boolean;
|
|
185
|
+
defaultEventColor: string;
|
|
186
|
+
defaultResourceColor: string;
|
|
187
|
+
locale: string;
|
|
188
|
+
timeFormat: TimeFormat;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
declare function EventCalendar({ events, resources, date, defaultDate, view, defaultView, views, calendarOptions, showNavigation, showViewSwitcher, showTodayButton, className, loading, theme, themeVars, enableDragToCreate, enableDragToMove, mobileBreakpoint, showMobileMonthPicker, onEventClick, onEventDoubleClick, onSlotClick, onSlotDoubleClick, onDateChange, onViewChange, onNavigate, onRangeChange, onDayClick, onEventCreate, onEventMove, renderEvent, renderDayCell, renderHeader, renderResourceHeader, renderTimeSlot, renderEmpty, renderSelectedEvent, renderSelectedSlot, }: EventCalendarProps): react_jsx_runtime.JSX.Element;
|
|
192
|
+
|
|
193
|
+
type CalendarTheme = "light" | "dark" | "system";
|
|
194
|
+
interface EventCalendarThemeProviderProps {
|
|
195
|
+
theme?: CalendarTheme;
|
|
196
|
+
/** Custom CSS variable overrides. Keys with or without -- prefix work. */
|
|
197
|
+
themeVars?: Record<string, string>;
|
|
198
|
+
children: React$1.ReactNode;
|
|
199
|
+
}
|
|
200
|
+
declare function EventCalendarThemeProvider({ theme, themeVars, children, }: EventCalendarThemeProviderProps): react_jsx_runtime.JSX.Element;
|
|
201
|
+
|
|
202
|
+
declare function useCalendar(): CalendarContextValue;
|
|
203
|
+
|
|
204
|
+
declare function getDateFnsLocale(localeCode: string): Locale;
|
|
205
|
+
/** Format date with locale support */
|
|
206
|
+
declare function formatDate(date: Date, formatStr: string, localeCode?: string): string;
|
|
207
|
+
declare function getMonthDays(date: Date, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6): Date[];
|
|
208
|
+
declare function getWeekDays(date: Date, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6): Date[];
|
|
209
|
+
declare function getEventsForDay(events: CalendarEvent[], day: Date): CalendarEvent[];
|
|
210
|
+
declare function navigateDate(date: Date, view: ViewType, direction: "prev" | "next"): Date;
|
|
211
|
+
declare function getViewTitle(date: Date, view: ViewType, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6, localeCode?: string): string;
|
|
212
|
+
declare function getViewDateRange(date: Date, view: ViewType, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6): DateRange;
|
|
213
|
+
declare function createSlotDate(day: Date, hour: number, minute?: number): Date;
|
|
214
|
+
declare function getHoursArray(startHour?: number, endHour?: number): number[];
|
|
215
|
+
declare function formatHour(hour: number, timeFormat?: TimeFormat, localeCode?: string): string;
|
|
216
|
+
|
|
217
|
+
export { type CalendarConfig, type CalendarEvent, type CalendarOptions, type CalendarTheme, type DateRange, EventCalendar, type EventCalendarProps, EventCalendarThemeProvider, type HeaderRenderProps, type Resource, type SlotInfo, type TimeFormat, type ViewType, createSlotDate, formatDate, formatHour, getDateFnsLocale, getEventsForDay, getHoursArray, getMonthDays, getViewDateRange, getViewTitle, getWeekDays, navigateDate, useCalendar };
|