calendar-simple 1.3.0-beta.1 → 2.0.0-beta.1

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.
Files changed (100) hide show
  1. package/README.md +298 -74
  2. package/dist/calendar-simple.css +1 -1
  3. package/dist/index.cjs.js +1 -1
  4. package/dist/index.cjs.js.map +1 -1
  5. package/dist/index.es.js +7431 -1464
  6. package/dist/index.es.js.map +1 -1
  7. package/dist/index.iife.js +1 -1
  8. package/dist/index.iife.js.map +1 -1
  9. package/dist/src/Calendar.d.ts +19 -0
  10. package/dist/src/Calendar.test.d.ts +1 -0
  11. package/dist/src/assets/LeftArrow.d.ts +3 -0
  12. package/dist/src/assets/RightArrow.d.ts +3 -0
  13. package/dist/src/components/core/all_day_banner/AllDayBanner.d.ts +9 -0
  14. package/dist/src/components/core/all_day_banner/AllDayBanner.test.d.ts +1 -0
  15. package/dist/src/components/core/current_time_line/CurrentTimeLine.d.ts +7 -0
  16. package/dist/src/components/core/current_time_line/CurrentTimeLine.test.d.ts +1 -0
  17. package/dist/src/components/core/day_column/DayColumn.d.ts +11 -0
  18. package/dist/src/components/core/day_column/DayColumn.test.d.ts +1 -0
  19. package/dist/src/components/core/day_event_item/DayWeekEventItem.d.ts +8 -0
  20. package/dist/src/components/core/day_event_item/DayWeekEventItem.test.d.ts +1 -0
  21. package/dist/src/components/core/month_event_item/MonthEventItem.d.ts +21 -0
  22. package/dist/src/components/core/month_event_item/MonthEventItem.test.d.ts +1 -0
  23. package/dist/src/components/core/time_column/TimeColumn.d.ts +6 -0
  24. package/dist/src/components/core/time_column/TimeColumn.test.d.ts +1 -0
  25. package/dist/src/components/layout/Header.d.ts +7 -0
  26. package/dist/src/components/layout/Header.test.d.ts +1 -0
  27. package/dist/src/components/ui/CalendarErrorBoundary.d.ts +14 -0
  28. package/dist/src/components/ui/popover/Popover.d.ts +11 -0
  29. package/dist/src/components/ui/popover/Popover.test.d.ts +1 -0
  30. package/dist/src/components/ui/skeleton/MonthSkeleton.d.ts +2 -0
  31. package/dist/src/components/ui/skeleton/MonthSkeleton.test.d.ts +1 -0
  32. package/dist/src/components/ui/skeleton/ScheduleSkeleton.d.ts +2 -0
  33. package/dist/src/components/ui/skeleton/ScheduleSkeleton.test.d.ts +1 -0
  34. package/dist/src/components/ui/skeleton/TimeGridSkeleton.d.ts +2 -0
  35. package/dist/src/components/ui/skeleton/TimeGridSkeleton.test.d.ts +1 -0
  36. package/dist/src/components/views/View.d.ts +4 -0
  37. package/dist/src/components/views/View.test.d.ts +1 -0
  38. package/dist/src/components/views/custom_days_view/CustomDaysView.d.ts +5 -0
  39. package/dist/src/components/views/custom_days_view/CustomDaysView.test.d.ts +1 -0
  40. package/dist/src/components/views/day_view/DayView.d.ts +5 -0
  41. package/dist/src/components/views/day_view/DayView.test.d.ts +1 -0
  42. package/dist/src/components/views/month_view/MonthView.d.ts +5 -0
  43. package/dist/src/components/views/month_view/MonthView.test.d.ts +1 -0
  44. package/dist/src/components/views/schedule_view/ScheduleView.d.ts +4 -0
  45. package/dist/src/components/views/schedule_view/ScheduleView.test.d.ts +1 -0
  46. package/dist/src/components/views/week_view/WeekView.d.ts +5 -0
  47. package/dist/src/components/views/week_view/WeekView.test.d.ts +1 -0
  48. package/dist/src/constants/calendar.d.ts +96 -0
  49. package/dist/src/constants/index.d.ts +2 -0
  50. package/dist/src/constants/theme.d.ts +38 -0
  51. package/dist/src/context/CalendarContext.d.ts +83 -0
  52. package/dist/src/context/CalendarContext.test.d.ts +1 -0
  53. package/dist/src/hooks/useAllDayBanner.d.ts +48 -0
  54. package/dist/src/hooks/useAllDayBanner.test.d.ts +1 -0
  55. package/dist/src/hooks/useCalendarProps.d.ts +10 -0
  56. package/dist/src/hooks/useColorScheme.d.ts +2 -0
  57. package/dist/src/hooks/useColorScheme.test.d.ts +1 -0
  58. package/dist/src/hooks/useDayEventLayout.d.ts +27 -0
  59. package/dist/src/hooks/useDayEventLayout.test.d.ts +1 -0
  60. package/dist/src/hooks/useEvents.d.ts +16 -0
  61. package/dist/src/hooks/useEvents.test.d.ts +1 -0
  62. package/dist/src/hooks/useMonthGrid.d.ts +44 -0
  63. package/dist/src/hooks/useMonthGrid.test.d.ts +1 -0
  64. package/dist/src/hooks/useResizeObserver.d.ts +13 -0
  65. package/dist/src/hooks/useResizeObserver.test.d.ts +1 -0
  66. package/dist/src/hooks/useScheduleView.d.ts +24 -0
  67. package/dist/src/hooks/useScheduleView.test.d.ts +1 -0
  68. package/dist/src/index.d.ts +13 -0
  69. package/dist/src/setupTests.d.ts +0 -0
  70. package/dist/src/stories/Accessibility.stories.d.ts +10 -0
  71. package/dist/src/stories/CustomDayView.stories.d.ts +10 -0
  72. package/dist/src/stories/Customization.stories.d.ts +29 -0
  73. package/dist/src/stories/DayView.stories.d.ts +11 -0
  74. package/dist/src/stories/Features.stories.d.ts +25 -0
  75. package/dist/src/stories/Localization.stories.d.ts +22 -0
  76. package/dist/src/stories/MonthView.stories.d.ts +13 -0
  77. package/dist/src/stories/QA/EdgeCases.stories.d.ts +12 -0
  78. package/dist/src/stories/QA/Interactions.stories.d.ts +8 -0
  79. package/dist/src/stories/QA/LayoutLimits.stories.d.ts +11 -0
  80. package/dist/src/stories/QA/Performance.stories.d.ts +9 -0
  81. package/dist/src/stories/QA/TimeFormatting.stories.d.ts +11 -0
  82. package/dist/src/stories/QA/Views.stories.d.ts +10 -0
  83. package/dist/src/stories/ScheduleView.stories.d.ts +10 -0
  84. package/dist/src/stories/WeekView.stories.d.ts +14 -0
  85. package/dist/src/types/calendar.d.ts +213 -0
  86. package/dist/src/types/events.d.ts +34 -0
  87. package/dist/src/types/index.d.ts +3 -0
  88. package/dist/src/types/theme.d.ts +81 -0
  89. package/dist/src/utils/common.d.ts +48 -0
  90. package/dist/src/utils/common.test.d.ts +1 -0
  91. package/dist/src/utils/contrast.d.ts +18 -0
  92. package/dist/src/utils/contrast.test.d.ts +1 -0
  93. package/dist/src/utils/date.d.ts +55 -0
  94. package/dist/src/utils/date.test.d.ts +1 -0
  95. package/dist/src/utils/formatting.d.ts +21 -0
  96. package/dist/src/utils/formatting.test.d.ts +1 -0
  97. package/dist/src/utils/index.d.ts +9 -0
  98. package/dist/stats.html +4950 -0
  99. package/package.json +56 -16
  100. package/dist/index.d.ts +0 -89
package/README.md CHANGED
@@ -1,29 +1,42 @@
1
1
  # Calendar Simple
2
2
 
3
- ![npm](https://img.shields.io/npm/v/calendar-simple)
4
- ![npm unpacked size](https://img.shields.io/npm/unpacked-size/calendar-simple)
5
- ![npm downloads](https://img.shields.io/npm/dm/calendar-simple)
6
- ![license](https://img.shields.io/npm/l/calendar-simple)
3
+ [![npm version](https://img.shields.io/npm/v/calendar-simple)](https://www.npmjs.com/package/calendar-simple)
4
+ [![bundle size](https://img.shields.io/npm/unpacked-size/calendar-simple)](https://www.npmjs.com/package/calendar-simple)
5
+ [![npm downloads](https://img.shields.io/npm/dm/calendar-simple)](https://www.npmjs.com/package/calendar-simple)
6
+ [![license](https://img.shields.io/npm/l/calendar-simple)](https://github.com/Jaganath-MSJ/CalendarSimple/blob/main/LICENSE)
7
7
 
8
- A lightweight, customizable, and responsive calendar component for React applications. Built with TypeScript and Day.js, `calendar-simple` provides a flexible solution for date selection and event management in your React projects.
8
+ A lightweight, customizable, and accessible calendar component for React. Built with TypeScript and Luxon.
9
9
 
10
- **[Live Demo](http://calendarsimple.netlify.app)**
10
+ **[Live Demo](https://calendarsimple.netlify.app)**
11
11
 
12
12
  ## Features
13
13
 
14
- - **🗓️ Multiple Views**: Support for Month, Week, Day, and Schedule views, giving users different perspectives of their events.
15
- - **✨ Event Handling**: Built-in support for displaying and managing events with custom colors.
16
- - **📱 Responsive**: Automatically adjusts layout based on container dimensions.
17
- - **🎨 Theming & Customization**: Fully customizable colors via the `theme` prop and individual element styling via `classNames`.
18
- - **🕒 Time Formatting**: Options for 12-hour (AM/PM) and 24-hour time formats.
19
- - **👆 Interactive**: Granular control with click handlers for dates, specific events, view changes, and "more" indicators.
20
- - **🕒 Current Time & Timezone**: Display a real-time indicator with automatic local timezone GMT offset, and optionally auto-scroll to the current time on load.
21
- - **🛡️ TypeScript**: Written in TypeScript for robust type safety and developer experience.
14
+ - **🗓️ Multiple Views** Month, Week, Day, Schedule, and Custom Days views.
15
+ - **✨ Event Handling** Display and manage events with custom styling and arbitrary metadata.
16
+ - **📱 Responsive** Built-in CSS breakpoints at 768px (tablet) and 480px (phone).
17
+ - **🎨 Theming & Customization** Override colors via `theme` and inject CSS classes via `classNames`.
18
+ - **🌙 Dark Mode & Color Schemes** — Built-in light/dark palettes with OS auto-detection.
19
+ - **🌐 RTL Support** Full right-to-left layout with auto-detection for Arabic, Hebrew, Farsi, and more.
20
+ - **🧩 Custom Renderers** Replace events, headers, and grid cells with your own React components.
21
+ - **⌨️ Keyboard Navigation** Enter/Space activation, Tab focus trap in popovers, Escape to close.
22
+ - **♿ Accessibility** — Semantic HTML, ARIA roles, labels, and screen reader support throughout.
23
+ - **🕒 Time Formatting** — 12-hour (AM/PM) and 24-hour formats with a live current-time indicator.
24
+ - **👆 Interactive** — Click handlers for dates, events, "+more" indicators, and empty slot creation.
25
+ - **🌍 Localization** — Full i18n via Luxon locale codes and custom UI message translations.
26
+ - **🛡️ TypeScript** — Fully typed props, callbacks, and interfaces — all exported.
27
+
28
+ ## Requirements
29
+
30
+ | Dependency | Version |
31
+ | ---------- | ------------------------- |
32
+ | React | ≥ 19.0 |
33
+ | React DOM | ≥ 19.0 |
34
+ | Node.js | ≥ 18 LTS (build/dev only) |
35
+
36
+ Luxon is bundled as a direct dependency — no separate install needed.
22
37
 
23
38
  ## Installation
24
39
 
25
- Install using your preferred package manager:
26
-
27
40
  ```bash
28
41
  npm install calendar-simple
29
42
  # or
@@ -36,8 +49,6 @@ pnpm add calendar-simple
36
49
 
37
50
  ### Basic Example
38
51
 
39
- Import the component and its styles to get started:
40
-
41
52
  ```tsx
42
53
  import React, { useState } from "react";
43
54
  import Calendar from "calendar-simple";
@@ -46,6 +57,7 @@ import "calendar-simple/dist/styles.css";
46
57
  const App = () => {
47
58
  const [selectedDate, setSelectedDate] = useState(new Date());
48
59
 
60
+ // Calendar fills its container — give the parent an explicit height
49
61
  return (
50
62
  <div style={{ height: "600px", padding: "20px" }}>
51
63
  <Calendar
@@ -74,21 +86,21 @@ const MyCalendar = () => {
74
86
  id: "1",
75
87
  startDate: "2024-02-14",
76
88
  title: "Valentine's Day",
77
- color: "#ffcccc",
89
+ style: { backgroundColor: "#ffcccc" },
78
90
  },
79
91
  {
80
92
  id: "2",
81
93
  startDate: "2024-02-20",
82
94
  endDate: "2024-02-22",
83
95
  title: "Tech Conference",
84
- color: "#e6f7ff",
96
+ style: { backgroundColor: "#e6f7ff" },
85
97
  },
86
98
  {
87
99
  id: "3",
88
100
  startDate: "2024-02-21T10:00:00",
89
101
  endDate: "2024-02-21T12:00:00",
90
102
  title: "Team Meeting",
91
- color: "#cce5ff",
103
+ style: { backgroundColor: "#cce5ff" },
92
104
  },
93
105
  ];
94
106
 
@@ -113,49 +125,131 @@ const MyCalendar = () => {
113
125
  };
114
126
  ```
115
127
 
116
- ### Schedule View Example
117
-
118
- The Schedule view displays a continuous scrollable list of events, grouped by date.
128
+ ### 🧩 Custom Renderers
119
129
 
120
130
  ```tsx
121
- import React from "react";
122
- import Calendar, { CalendarEvent } from "calendar-simple";
131
+ <Calendar
132
+ renderEvent={(event) => (
133
+ <div
134
+ style={{
135
+ padding: "2px",
136
+ backgroundColor: "#e0f2fe",
137
+ borderRadius: "4px",
138
+ }}
139
+ >
140
+ <strong>🚀 {event.title}</strong>
141
+ </div>
142
+ )}
143
+ renderHeader={({ currentDate, onNavigate }) => (
144
+ <div
145
+ style={{
146
+ display: "flex",
147
+ justifyContent: "space-between",
148
+ padding: "10px",
149
+ }}
150
+ >
151
+ <button
152
+ onClick={() => {
153
+ const d = new Date(currentDate);
154
+ d.setMonth(d.getMonth() - 1);
155
+ onNavigate(d);
156
+ }}
157
+ >
158
+ Prev
159
+ </button>
160
+ <h2>
161
+ {currentDate.toLocaleDateString("default", {
162
+ month: "long",
163
+ year: "numeric",
164
+ })}
165
+ </h2>
166
+ <button
167
+ onClick={() => {
168
+ const d = new Date(currentDate);
169
+ d.setMonth(d.getMonth() + 1);
170
+ onNavigate(d);
171
+ }}
172
+ >
173
+ Next
174
+ </button>
175
+ </div>
176
+ )}
177
+ />
178
+ ```
123
179
 
124
- const upcomingEvents: CalendarEvent[] = [
125
- // ... your events ...
126
- ];
180
+ ### 🌍 Localization
127
181
 
128
- const ScheduleApp = () => (
129
- <Calendar events={upcomingEvents} view="schedule" is12Hour={true} />
130
- );
182
+ ```tsx
183
+ <Calendar
184
+ locale="fr"
185
+ localeMessages={{
186
+ today: "Aujourd'hui",
187
+ day: "Jour",
188
+ week: "Semaine",
189
+ month: "Mois",
190
+ schedule: "Planning",
191
+ days: "Jours",
192
+ }}
193
+ />
131
194
  ```
132
195
 
133
196
  ## API Reference
134
197
 
198
+ > For full prop descriptions and usage examples, see [FEATURES.md](./FEATURES.md).
199
+
135
200
  ### Props
136
201
 
137
- | Prop | Type | Description | Default |
138
- | ------------------------- | ------------------------------------------------------ | --------------------------------------------------------------------------------- | ----------------- |
139
- | `events` | `CalendarEvent[]` | Array of event data objects to display. | `[]` |
140
- | `selectedDate` | `Date` | The currently selected date object. | `undefined` |
141
- | `view` | `ECalendarViewType` | The current view: `"month"`, `"week"`, `"day"`, or `"schedule"`. | `"month"` |
142
- | `selectable` | `boolean` | Enables visual selection state. | `false` |
143
- | `is12Hour` | `boolean` | Display time in 12-hour AM/PM format instead of 24-hour format. | `false` |
144
- | `onDateClick` | `(date: Date) => void` | Callback function fired when a date is clicked. | `undefined` |
145
- | `onEventClick` | `(event: CalendarEvent) => void` | Callback function fired when an event is clicked. | `undefined` |
146
- | `onMoreClick` | `(date: Date, hiddenEvents?: CalendarEvent[]) => void` | Callback fired when the "+X more" indicator is clicked. | `undefined` |
147
- | `onNavigate` | `(date: Date) => void` | Callback fired when the calendar date range is changed (e.g. next month). | `undefined` |
148
- | `onViewChange` | `(view: ECalendarViewType) => void` | Callback fired when the calendar view is changed via header buttons. | `undefined` |
149
- | `width` | `number \| string` | Width of the calendar container. | `auto-calculated` |
150
- | `height` | `number \| string` | Height of the calendar container. | `auto-calculated` |
151
- | `theme` | `CalendarTheme` | Configuration object for custom colors. | `{}` |
152
- | `classNames` | `CalendarClassNames` | Custom CSS classes for various internal elements. | `{}` |
153
- | `dayType` | `EDayType` | Format for day names: `"full"` (Monday) or `"half"` (Mon). | `"half"` |
154
- | `pastYearLength` | `number` | Number of past years to show in the year dropdown. | `5` |
155
- | `futureYearLength` | `number` | Number of future years to show in the year dropdown. | `5` |
156
- | `maxEvents` | `number` | Maximum events to show per day cell before collapsing. | Auto-calc |
157
- | `showCurrentTime` | `boolean` | Displays a line indicating the current time in day and week views. | `false` |
158
- | `autoScrollToCurrentTime` | `boolean` | Automatically scrolls to the current time line when the view is initially loaded. | `false` |
202
+ | Prop | Type | Default |
203
+ | ------------------------- | ------------------------------------------------------------- | ------------------- |
204
+ | `events` | `CalendarEvent[]` | `[]` |
205
+ | `selectedDate` | `Date` | `undefined` |
206
+ | `view` | `ECalendarViewType` | `"month"` |
207
+ | `testId` | `string` | `undefined` |
208
+ | `isLoading` | `boolean` | `undefined` |
209
+ | `renderLoading` | `() => ReactNode` | `undefined` |
210
+ | `selectable` | `boolean` | `false` |
211
+ | `creatable` | `boolean` | `false` |
212
+ | `is12Hour` | `boolean` | `false` |
213
+ | `colorScheme` | `'light' \| 'dark' \| 'auto'` | `'auto'` |
214
+ | `direction` | `'ltr' \| 'rtl'` | `` `auto-detect` `` |
215
+ | `locale` | `string` | `'en'` |
216
+ | `localeMessages` | `object` | `{}` |
217
+ | `theme` | `CalendarTheme` | `{}` |
218
+ | `classNames` | `CalendarClassNames` | `{}` |
219
+ | `width` | `number \| string` | `` `auto` `` |
220
+ | `height` | `number \| string` | `` `auto` `` |
221
+ | `dayType` | `EDayType` | `"half"` |
222
+ | `weekStartsOn` | `number` | `0` |
223
+ | `weekEndsOn` | `number` | `6` |
224
+ | `customDays` | `number` | `3` |
225
+ | `showAdjacentMonths` | `boolean` | `true` |
226
+ | `showWeekNumbers` | `boolean` | `false` |
227
+ | `showAllDayRow` | `boolean` | `true` |
228
+ | `maxEvents` | `number` | `` `auto` `` |
229
+ | `minHour` | `number` | `0` |
230
+ | `maxHour` | `number` | `24` |
231
+ | `eventOverlapOffset` | `number` | `0` |
232
+ | `showCurrentTime` | `boolean` | `false` |
233
+ | `autoScrollToCurrentTime` | `boolean` | `false` |
234
+ | `resetDateOnViewChange` | `boolean` | `false` |
235
+ | `pastYearLength` | `number` | `5` |
236
+ | `futureYearLength` | `number` | `5` |
237
+ | `onDateClick` | `(date: Date) => void` | `undefined` |
238
+ | `onEventClick` | `(event: CalendarEvent) => void` | `undefined` |
239
+ | `onMoreClick` | `(date: Date, hiddenEvents?: CalendarEvent[]) => void` | `undefined` |
240
+ | `onNavigate` | `(date: Date) => void` | `undefined` |
241
+ | `onViewChange` | `(view: ECalendarViewType) => void` | `undefined` |
242
+ | `onSlotClick` | `(startDate: Date, endDate: Date) => void` | `undefined` |
243
+ | `renderEvent` | `(event: CalendarEvent) => ReactNode` | `undefined` |
244
+ | `renderHeader` | `(props: RenderHeaderProps) => ReactNode` | `undefined` |
245
+ | `renderHourCell` | `(date: Date) => ReactNode` | `undefined` |
246
+ | `renderDateCell` | `(props: RenderDateCellProps) => ReactNode` | `undefined` |
247
+ | `renderScheduleSeparator` | `(date: Date) => ReactNode` | `undefined` |
248
+ | `enableEnrichedEvents` | `boolean` | `false` |
249
+ | `enrichedEventsByDate` | `Record<string, CalendarEvent[]>` | `undefined` |
250
+ | `eventsAreSorted` | `boolean` | `false` |
251
+ | `isEventOrderingEnabled` | `boolean` | `true` |
252
+ | `sortedMonthView` | `boolean \| ((a: CalendarEvent, b: CalendarEvent) => number)` | `true` |
159
253
 
160
254
  ### Types
161
255
 
@@ -164,37 +258,60 @@ const ScheduleApp = () => (
164
258
  ```typescript
165
259
  interface CalendarEvent {
166
260
  id?: string;
167
- startDate: string; // Format: YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss
168
- endDate?: string; // Format: YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss
169
- title: string; // Event title or description
170
- color?: string; // CSS color string for event background
171
- [key: string]: unknown; // Allow any custom metadata fields
261
+ startDate: string; // YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss
262
+ endDate?: string;
263
+ title: string;
264
+ style?: CSSProperties;
265
+ [key: string]: unknown; // custom metadata fields
172
266
  }
173
267
  ```
174
268
 
175
269
  #### `ECalendarViewType` & `EDayType`
176
270
 
177
271
  ```typescript
178
- type ECalendarViewType = "month" | "week" | "day" | "schedule";
272
+ type ECalendarViewType = "month" | "week" | "day" | "schedule" | "customDays";
179
273
  type EDayType = "full" | "half";
180
274
  ```
181
275
 
182
276
  #### `CalendarTheme`
183
277
 
184
278
  ```typescript
185
- interface CalendarTheme {
186
- default?: {
187
- color?: string;
188
- bgColor?: string;
189
- };
190
- selected?: {
191
- color?: string;
192
- bgColor?: string;
193
- };
194
- today?: {
195
- color?: string;
196
- bgColor?: string;
197
- };
279
+ interface ThemeStyle {
280
+ color?: string; // Text / foreground color
281
+ bgColor?: string; // Background color
282
+ }
283
+
284
+ interface ThemeScheme {
285
+ default?: ThemeStyle;
286
+ selected?: ThemeStyle;
287
+ today?: ThemeStyle;
288
+ }
289
+
290
+ interface CalendarTheme extends ThemeScheme {
291
+ dark?: ThemeScheme; // Overrides applied only when resolved scheme is "dark"
292
+ light?: ThemeScheme; // Overrides applied only when resolved scheme is "light"
293
+ }
294
+ ```
295
+
296
+ #### `RenderHeaderProps`
297
+
298
+ ```typescript
299
+ interface RenderHeaderProps {
300
+ currentDate: Date;
301
+ view: ECalendarViewType;
302
+ onNavigate: (date: Date) => void;
303
+ onViewChange: (view: ECalendarViewType) => void;
304
+ }
305
+ ```
306
+
307
+ #### `RenderDateCellProps`
308
+
309
+ ```typescript
310
+ interface RenderDateCellProps {
311
+ date: Date;
312
+ isToday: boolean;
313
+ isSelected?: boolean;
314
+ isCurrentMonth?: boolean;
198
315
  }
199
316
  ```
200
317
 
@@ -209,6 +326,7 @@ interface CalendarClassNames {
209
326
  table?: string;
210
327
  tableHeader?: string;
211
328
  tableDate?: string;
329
+ weekNumber?: string;
212
330
 
213
331
  // Shared events
214
332
  event?: string;
@@ -232,9 +350,115 @@ interface CalendarClassNames {
232
350
  }
233
351
  ```
234
352
 
353
+ ## Configuration
354
+
355
+ ### Color Scheme
356
+
357
+ ```tsx
358
+ // Follow OS preference (default)
359
+ <Calendar colorScheme="auto" />
360
+
361
+ // Force dark mode
362
+ <Calendar colorScheme="dark" />
363
+
364
+ // Force light mode
365
+ <Calendar colorScheme="light" />
366
+ ```
367
+
368
+ Override individual CSS custom properties for fine-grained control:
369
+
370
+ ```css
371
+ [data-color-scheme="dark"] {
372
+ --primary-bg: #1a1a1a;
373
+ --primary-text: #ffffff;
374
+ --accent-color: #818cf8;
375
+ }
376
+ ```
377
+
378
+ ### Theme Colors
379
+
380
+ ```tsx
381
+ <Calendar
382
+ theme={{
383
+ today: { color: "#007bff", bgColor: "#e6f2ff" },
384
+ selected: { color: "#fff", bgColor: "#007bff" },
385
+ }}
386
+ />
387
+ ```
388
+
389
+ ### RTL Layout
390
+
391
+ ```tsx
392
+ // Auto-detected for Arabic, Hebrew, Farsi, Urdu, and more
393
+ <Calendar locale="ar" />
394
+
395
+ // Manual override
396
+ <Calendar direction="rtl" />
397
+ ```
398
+
399
+ ### Custom CSS Classes
400
+
401
+ ```tsx
402
+ <Calendar
403
+ classNames={{
404
+ root: "my-calendar",
405
+ event: "my-event-chip",
406
+ header: "my-header",
407
+ }}
408
+ />
409
+ ```
410
+
411
+ > See [FEATURES.md](./FEATURES.md) for the full `classNames` key list and Props Reference.
412
+
413
+ ## Responsive & Mobile
414
+
415
+ Built-in CSS breakpoints adapt the layout at **768px** (tablet) and **480px** (phone) with no extra configuration. Drop the `width` prop and let the parent container control sizing for breakpoints to activate naturally.
416
+
417
+ See [FEATURES.md — Responsive Layout](./FEATURES.md#responsive-layout) for the full breakpoint table.
418
+
419
+ ## Changelog
420
+
421
+ All notable changes are tracked via [GitHub Releases](https://github.com/Jaganath-MSJ/CalendarSimple/releases).
422
+
423
+ ## FAQ
424
+
425
+ **Why aren't my breakpoints activating?**
426
+ CSS breakpoints fire based on _viewport_ width when an explicit `width` prop is passed. Drop the `width` prop and let the parent container control sizing for container-relative behaviour.
427
+
428
+ **How do I show only work hours (e.g. 9–17)?**
429
+ Use `minHour={9}` and `maxHour={17}` to hide hours outside that range in Day and Week views.
430
+
431
+ **Do I need to install Luxon separately?**
432
+ No — Luxon is a direct dependency bundled inside `calendar-simple`.
433
+
434
+ **How do I pre-populate the selected date?**
435
+ Pass a JavaScript `Date` object to the `selectedDate` prop and update it via `onDateClick`.
436
+
437
+ **Why does RTL not activate when I set `locale="ar"`?**
438
+ If you also pass `direction="ltr"` explicitly, that overrides auto-detection. Remove the `direction` prop to allow auto-detection to work.
439
+
235
440
  ## Contributing
236
441
 
237
- Contributions are welcome! Please feel free to submit a Pull Request.
442
+ Contributions are welcome! Here's how to get started:
443
+
444
+ 1. **Fork** the repository and create a branch from `dev`:
445
+ ```bash
446
+ git checkout -b feat/your-feature-name dev
447
+ ```
448
+ 2. **Install dependencies:**
449
+ ```bash
450
+ npm install
451
+ ```
452
+ 3. **Run the dev environment:**
453
+ ```bash
454
+ npm run storybook # Component explorer on http://localhost:6006
455
+ npm run test:watch # Tests in watch mode
456
+ ```
457
+ 4. **Make your changes** — follow the existing TypeScript and CSS Module patterns.
458
+ 5. **Add or update tests** — new behaviour must be covered.
459
+ 6. **Submit a Pull Request** to the `dev` branch with a clear description of the change.
460
+
461
+ Please follow [Conventional Commits](https://www.conventionalcommits.org/) for commit messages (`feat:`, `fix:`, `docs:`, etc.).
238
462
 
239
463
  ## License
240
464
 
@@ -1,2 +1,2 @@
1
- ._calendar_1250h_1{--calendar-width:0px;--calendar-height:0px;width:100%;height:100%;color:var(--text-primary);background-color:var(--bg-color);border:1px solid var(--border-color);border-radius:var(--radius-lg);box-shadow:var(--shadow-md);box-sizing:border-box;flex-direction:column;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,Arial,sans-serif;display:flex;overflow:hidden}._calendar_1250h_1 *{box-sizing:border-box;margin:0;padding:0}._header_oyk7l_1{box-sizing:border-box;background-color:#0000;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1rem;width:100%;padding:1rem;display:flex}._navigation_oyk7l_13{align-items:center;gap:1rem;display:flex}._todayButton_oyk7l_19{border:1px solid var(--border-color);border-radius:var(--radius-md);color:var(--text-primary);cursor:pointer;background-color:#0000;padding:.5rem 1rem;font-family:inherit;font-size:.875rem;font-weight:500;transition:all .2s}._todayButton_oyk7l_19:hover{background-color:var(--bg-hover);border-color:var(--text-secondary)}._arrows_oyk7l_37{align-items:center;gap:.5rem;display:flex}._iconButton_oyk7l_43{border-radius:var(--radius-md);color:var(--text-secondary);cursor:pointer;background:0 0;border:1px solid #0000;outline:none;justify-content:center;align-items:center;width:2rem;height:2rem;transition:all .2s;display:flex}._iconButton_oyk7l_43:hover{background-color:var(--bg-hover);color:var(--text-primary)}._dateTitle_oyk7l_63{color:var(--text-primary);white-space:nowrap;margin:0;font-family:inherit;font-size:1.25rem;font-weight:600}._controls_oyk7l_72{align-items:center;gap:.75rem;display:flex}._select_oyk7l_78{-webkit-appearance:none;appearance:none;background-color:var(--bg-color);border:1px solid var(--border-color);border-radius:var(--radius-md);color:var(--text-primary);cursor:pointer;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;outline:none;padding:.5rem 2.5rem .5rem 1rem;font-family:inherit;font-size:.875rem;transition:border-color .2s}._select_oyk7l_78:hover{border-color:var(--text-secondary)}._select_oyk7l_78:focus{border-color:var(--primary-color);box-shadow:0 0 0 2px #3b82f633}._dayView_lnx60_1{border:1px solid #e0e0e0;border-radius:8px;flex-direction:column;height:calc(100% - 68px);display:flex;overflow:auto}._stickyTopContainer_lnx60_11{z-index:20;background-color:var(--bg-color,#fff);flex-direction:column;display:flex;position:sticky;top:0;box-shadow:0 4px 6px -4px #0000001a}._dayHeaderContainer_lnx60_21{background-color:#f9f9f9;border-bottom:1px solid #e0e0e0;display:flex}._timeHeaderSpacer_lnx60_27{z-index:15;background-color:#f9f9f9;border-right:1px solid #e0e0e0;flex-shrink:0;width:60px;position:sticky;left:0}._dayHeader_lnx60_21{text-align:center;flex:1;padding:10px 0}._dayName_lnx60_43{color:#666;text-transform:uppercase;font-size:12px}._dayNumber_lnx60_49{margin-top:4px;font-size:20px;font-weight:500}._dayNumber_lnx60_49._today_lnx60_55{color:#3b82f6;font-weight:700}._timeGrid_lnx60_60{flex:1;grid-template-columns:60px 1fr;display:grid}._eventsColumn_lnx60_67{position:relative}._timeColumn_1hfuf_1{z-index:5;background-color:var(--bg-color,#fff);border-right:1px solid #e0e0e0;flex-shrink:0;width:60px;position:sticky;left:0}._timeSlot_1hfuf_11{color:#666;border-bottom:1px solid #f0f0f0;justify-content:center;align-items:center;height:60px;font-size:12px;display:flex}._eventItem_10oji_1{color:#fff;cursor:pointer;box-sizing:border-box;width:calc(var(--event-width) - 2px);background-color:#3b82f6;border-radius:4px;flex-direction:column;padding:4px 5px;font-size:12px;line-height:1.2;display:flex;position:absolute;left:5px;right:5px;overflow:hidden}._eventItemSmall_10oji_19{flex-direction:row;align-items:center;gap:4px;padding:2px 5px}._eventItemTiny_10oji_26{flex-direction:row;align-items:center;gap:4px;padding:1px 4px;font-size:10px;line-height:1}._eventTitle_10oji_35{white-space:nowrap;text-overflow:ellipsis;font-weight:500;overflow:hidden}._eventTime_10oji_42{white-space:nowrap;text-overflow:ellipsis;opacity:.9;overflow:hidden}._currentTimeLine_1gaip_1{z-index:10;pointer-events:none;align-items:center;height:2px;display:flex;position:absolute;left:0;right:0}._circle_1gaip_12{background-color:#ea4335;border-radius:50%;width:12px;height:12px;position:absolute;left:-6px}._line_1gaip_21{background-color:#ea4335;width:100%;height:2px}._eventSlot_mjgbu_1{border-bottom:1px solid #f0f0f0;height:60px}._bannerWrapper_19c6j_1{border-bottom:1px solid #e0e0e0;width:100%;display:flex}._timeHeaderSpacer_19c6j_7{z-index:15;background-color:var(--bg-color,#fff);border-right:1px solid #e0e0e0;flex-direction:column;flex-shrink:0;justify-content:space-between;align-items:center;width:60px;padding:4px 0 2px;display:flex;position:sticky;left:0}._timezoneLabel_19c6j_22{color:#70757a;text-align:center;margin-top:4px;font-size:10px;font-weight:500}._expandIcon_19c6j_30{cursor:pointer;color:#5f6368;border-radius:50%;justify-content:center;align-items:center;width:24px;height:24px;transition:background-color .2s,transform .2s;display:flex}._expandIcon_19c6j_30:hover{background-color:#f1f3f4}._expandIcon_19c6j_30._expanded_19c6j_48{transform:rotate(180deg)}._bannerContainer_19c6j_52{box-sizing:border-box;flex-direction:column;flex:1 0;min-height:28px;padding-bottom:4px;display:flex;position:relative;overflow:hidden}._bannerGridBg_19c6j_64{pointer-events:none;width:100%;height:100%;display:flex;position:absolute;top:0;left:0}._bannerGridCell_19c6j_74{border-right:1px solid #e0e0e0;flex:1}._bannerGridCell_19c6j_74:last-child{border-right:none}._bannerRow_19c6j_83{width:100%;height:22px;margin-top:2px;position:relative}._bannerChip_19c6j_90{color:#fff;box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;z-index:10;background-color:#1a73e8;border-radius:4px;align-items:center;height:20px;padding:0 4px;font-size:11px;font-weight:500;display:flex;position:absolute;top:1px;overflow:hidden}._bannerChip_19c6j_90._clippedLeft_19c6j_110{clip-path:polygon(10px 0,100% 0,100% 100%,10px 100%,0 50%);border-top-left-radius:0;border-bottom-left-radius:0;padding-left:14px}._bannerChip_19c6j_90._clippedRight_19c6j_117{clip-path:polygon(0 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,0 100%);border-top-right-radius:0;border-bottom-right-radius:0;padding-right:14px}._bannerChip_19c6j_90._clippedLeft_19c6j_110._clippedRight_19c6j_117{clip-path:polygon(10px 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,10px 100%,0 50%);border-radius:0;padding-left:14px;padding-right:14px}._title_19c6j_144{text-overflow:ellipsis;white-space:nowrap;flex-grow:1;overflow:hidden}._moreChip_19c6j_151{color:var(--text-secondary);box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;z-index:10;background:0 0;border-radius:4px;align-items:center;padding:.15rem .5rem;font-size:.75rem;font-weight:600;transition:background-color .2s;display:flex;position:absolute;overflow:hidden}._moreChip_19c6j_151:hover{background-color:var(--bg-hover);color:var(--text-primary)}._weekView_1wzka_1{border:1px solid #e0e0e0;border-radius:8px;flex-direction:column;height:calc(100% - 68px);display:flex;overflow:auto}._stickyTopContainer_1wzka_11{z-index:20;background-color:var(--bg-color,#fff);flex-direction:column;display:flex;position:sticky;top:0;box-shadow:0 4px 6px -4px #0000001a}._weekHeader_1wzka_21{background-color:#f9f9f9;border-bottom:1px solid #e0e0e0;display:flex}._timeHeaderSpacer_1wzka_27{z-index:15;background-color:#f9f9f9;border-right:1px solid #e0e0e0;flex-shrink:0;width:60px;position:sticky;left:0}._dayHeader_1wzka_37{text-align:center;border-right:1px solid #e0e0e0;flex:1;padding:10px 0}._dayHeader_1wzka_37:last-child{border-right:none}._dayName_1wzka_48{color:#666;text-transform:uppercase;font-size:12px}._dayNumber_1wzka_54{margin-top:4px;font-size:20px;font-weight:500}._dayNumber_1wzka_54._today_1wzka_60{color:#3b82f6;font-weight:700}._timeGrid_1wzka_65,._eventsGrid_1wzka_71{flex:1;display:flex}._dayColumn_1wzka_76{border-right:1px solid #e0e0e0;flex:1;position:relative}._dayColumn_1wzka_76:last-child{border-right:none}._dateData_ed04n_1{cursor:pointer;vertical-align:top;height:calc(var(--calendar-height) / var(--calendar-rows,6));min-width:calc(var(--calendar-width) / 7);max-width:calc(var(--calendar-width) / 7);padding:.25rem;transition:background-color .15s;position:relative}._dateData_ed04n_1:hover{background-color:#fafafa}._currentMonth_ed04n_18{color:#9ca3af;background-color:#f9fafb}._cellContent_ed04n_23{flex-direction:column;justify-content:flex-start;gap:.25rem;width:100%;height:100%;display:flex}._dateLabel_ed04n_32{width:1.75rem;height:1.75rem;color:var(--text-primary);border-radius:50%;justify-content:center;align-items:center;margin-bottom:.25rem;padding:.25rem;font-size:.875rem;font-weight:500;display:flex}._selected_ed04n_46 ._dateLabel_ed04n_32,._today_ed04n_51 ._dateLabel_ed04n_32{background-color:var(--primary-color);color:#fff}._dataContainer_ed04n_56{flex-direction:column;flex:1;gap:2px;display:flex;overflow:visible}._spacer_ed04n_64{height:1.5rem;margin-bottom:2px}._eventItem_ed04n_69{background-color:var(--primary-color);z-index:2;white-space:nowrap;text-overflow:ellipsis;color:#fff;box-sizing:border-box;cursor:pointer;border-radius:4px;height:1.5rem;padding:.15rem .5rem;font-size:.75rem;font-weight:500;line-height:1.2rem;transition:transform .1s,box-shadow .1s;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000001a}._eventItem_ed04n_69:hover{filter:brightness(1.05);transform:translateY(-1px);box-shadow:0 2px 4px #00000026}._moreEventsContainer_ed04n_97{margin-top:2px;position:relative}._moreEvents_ed04n_97{color:var(--text-secondary);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:4px;width:100%;padding:.15rem .5rem;font-size:.75rem;font-weight:600;transition:background-color .2s}._moreEvents_ed04n_97:hover{background-color:var(--bg-hover);color:var(--text-primary)}._popover_5fy95_1{z-index:100;border:1px solid var(--border-color);border-radius:var(--radius-lg);box-shadow:var(--shadow-md);opacity:0;background-color:#fff;flex-direction:column;gap:2px;min-width:200px;max-width:300px;max-height:300px;padding:.5rem;animation:.2s forwards _fadeIn_5fy95_1;display:flex;position:fixed;top:calc(100% + 4px);left:0;overflow-y:auto}@keyframes _fadeIn_5fy95_1{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}._popoverHeader_5fy95_34{color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--border-color);margin-bottom:.5rem;padding-bottom:.25rem;font-size:.75rem;font-weight:600}._popoverContent_5fy95_45{overflow-y:auto}._popoverItem_5fy95_49{background-color:var(--primary-color);color:#fff;border-radius:var(--radius-md);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;flex-shrink:0;margin-bottom:2px;padding:.25rem .5rem;font-size:.75rem;transition:opacity .2s;overflow:hidden}._popoverItem_5fy95_49:hover{opacity:.9}._popoverItem_5fy95_49._startBefore_5fy95_68{clip-path:polygon(10px 0,100% 0,100% 100%,10px 100%,0 50%);border-top-left-radius:0;border-bottom-left-radius:0;padding-left:14px}._popoverItem_5fy95_49._endAfter_5fy95_75{clip-path:polygon(0 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,0 100%);border-top-right-radius:0;border-bottom-right-radius:0;padding-right:14px}._popoverItem_5fy95_49._startBefore_5fy95_68._endAfter_5fy95_75{clip-path:polygon(10px 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,10px 100%,0 50%);border-radius:0;padding-left:14px;padding-right:14px}._monthView_1v108_1{flex-direction:column;flex:1;display:flex;position:relative;overflow:hidden}._table_1v108_9{border-collapse:collapse;box-sizing:border-box;flex:1;width:100%;height:100%}._tableHeader_1v108_18,._tableCell_1v108_19{border-right:1px solid var(--border-color);border-bottom:1px solid var(--border-color);box-sizing:border-box}._tableHeader_1v108_18:last-child,._tableCell_1v108_19:last-child{border-right:none}._table_1v108_9 tr:last-child ._tableCell_1v108_19{border-bottom:none}._tableHeader_1v108_18{z-index:10;height:40px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em;text-align:center;vertical-align:middle;background-color:#f9fafb;font-size:.875rem;font-weight:600;position:sticky;top:0}._tableCell_1v108_19{vertical-align:top;height:calc(100% / var(--calendar-rows));width:14.2857%;padding:4px}._scheduleView_18p9o_1{background-color:var(--calendar-bg,#fff);color:#3c4043;flex-direction:column;flex:1;padding:0 16px;display:flex;overflow-y:auto}._emptyState_18p9o_11{color:#70757a;justify-content:center;align-items:center;height:100%;font-size:14px;display:flex}._dateGroup_18p9o_20{border-bottom:1px solid #dadce0;flex-direction:column;display:flex}._dateGroup_18p9o_20:last-child{border-bottom:none}._eventItemContainer_18p9o_30{align-items:center;gap:16px;padding:6px 0;display:flex;position:relative}._dateInfoColumn_18p9o_38{flex-shrink:0;align-self:flex-start;align-items:flex-start;gap:8px;width:70px;padding-top:4px;display:flex}._dateNumber_18p9o_48{color:#202124;text-align:right;border-radius:50%;justify-content:center;align-items:center;width:28px;min-width:28px;height:28px;padding-bottom:2px;padding-left:1px;font-size:20px;font-weight:500;display:flex}._dateNumber_18p9o_48._today_18p9o_64{color:#fff;background-color:#1a73e8}._dateSubInfo_18p9o_69{color:#70757a;text-transform:uppercase;letter-spacing:.5px;padding-top:5px;font-size:11px}._dotTimeColumn_18p9o_77{flex-shrink:0;align-items:center;gap:12px;width:140px;display:flex}._eventDot_18p9o_85{background-color:#1a73e8;border-radius:50%;flex-shrink:0;width:10px;height:10px}._eventTime_18p9o_93{color:#3c4043;font-size:13px}._eventTitleColumn_18p9o_98{color:#202124;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;flex:1;font-size:14px;font-weight:500;overflow:hidden}:root{--primary-color:#3b82f6;--primary-hover:#2563eb;--text-primary:#1f2937;--text-secondary:#6b7280;--bg-color:#fff;--bg-hover:#f3f4f6;--border-color:#e5e7eb;--shadow-sm:0 1px 2px 0 #0000000d;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -1px #0000000f;--radius-md:.375rem;--radius-lg:.5rem}
1
+ ._calendar_1250h_1{--calendar-width:0px;--calendar-height:0px;width:100%;height:100%;color:var(--text-primary);background-color:var(--bg-color);border:1px solid var(--border-color);border-radius:var(--radius-lg);box-shadow:var(--shadow-md);box-sizing:border-box;flex-direction:column;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,Arial,sans-serif;display:flex;overflow:hidden}._calendar_1250h_1 *{box-sizing:border-box;margin:0;padding:0}._header_1fovk_1{box-sizing:border-box;background-color:#0000;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1rem;width:100%;padding:1rem;display:flex}@media (max-width:768px){._header_1fovk_1{flex-direction:column;align-items:flex-start;gap:.5rem;padding:.75rem}._navigation_1fovk_21{justify-content:space-between;width:100%}._controls_1fovk_26{flex-wrap:wrap;justify-content:flex-start;gap:.5rem;width:100%}._dateTitle_1fovk_33{font-size:1rem}._select_1fovk_37{padding-block-start:.375rem;padding-block-end:.375rem;padding-inline-start:.75rem;padding-inline-end:2rem;font-size:.8125rem}._todayButton_1fovk_43{padding:.375rem .75rem;font-size:.8125rem}}._navigation_1fovk_21{align-items:center;gap:1rem;display:flex}._todayButton_1fovk_43{border:1px solid var(--border-color);border-radius:var(--radius-md);color:var(--text-primary);cursor:pointer;background-color:#0000;padding:.5rem 1rem;font-family:inherit;font-size:.875rem;font-weight:500;transition:all .2s}._todayButton_1fovk_43:hover{background-color:var(--bg-hover);border-color:var(--text-secondary)}._arrows_1fovk_73{align-items:center;gap:.5rem;display:flex}._iconButton_1fovk_79{border-radius:var(--radius-md);color:var(--text-secondary);cursor:pointer;background:0 0;border:1px solid #0000;outline:none;justify-content:center;align-items:center;width:2rem;height:2rem;transition:all .2s;display:flex}._iconButton_1fovk_79:hover{background-color:var(--bg-hover);color:var(--text-primary)}._dateTitle_1fovk_33{color:var(--text-primary);white-space:nowrap;margin:0;font-family:inherit;font-size:1.25rem;font-weight:600}._controls_1fovk_26{align-items:center;gap:.75rem;display:flex}._select_1fovk_37{-webkit-appearance:none;appearance:none;background-color:var(--bg-color);border:1px solid var(--border-color);border-radius:var(--radius-md);color:var(--text-primary);cursor:pointer;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;outline:none;padding-block-start:.5rem;padding-block-end:.5rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-family:inherit;font-size:.875rem;transition:border-color .2s}._select_1fovk_37:hover{border-color:var(--text-secondary)}._select_1fovk_37:focus{border-color:var(--primary-color);box-shadow:0 0 0 2px #3b82f633}[dir=rtl] ._select_1fovk_37{background-position:.5rem}._iconButtonIcon_1fovk_146{justify-content:center;align-items:center;display:inline-flex}[dir=rtl] ._iconButtonIcon_1fovk_146{transform:scaleX(-1)}._dayView_1jv91_1{border:1px solid var(--border-color);border-radius:8px;flex-direction:column;height:100%;display:flex;overflow:auto}._stickyTopContainer_1jv91_11{z-index:20;background-color:var(--bg-color);flex-direction:column;display:flex;position:sticky;top:0;box-shadow:0 4px 6px -4px #0000001a}._dayHeaderContainer_1jv91_21{border-bottom:1px solid var(--border-color);background-color:var(--bg-hover);display:flex}._timeHeaderSpacer_1jv91_27{border-inline-end:1px solid var(--border-color);z-index:15;background-color:var(--bg-hover);flex-shrink:0;width:60px;position:sticky}._timeHeaderSpacer_1jv91_27:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}._timeHeaderSpacer_1jv91_27:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}._timeHeaderSpacer_1jv91_27:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}._timeHeaderSpacer_1jv91_27:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}._dayHeader_1jv91_21{text-align:center;flex:1;padding:10px 0}._dayName_1jv91_43{color:var(--text-secondary);text-transform:uppercase;font-size:12px}._dayNumber_1jv91_49{margin-top:4px;font-size:20px;font-weight:500}._dayNumber_1jv91_49._today_1jv91_55{color:var(--primary-color);font-weight:700}._timeGrid_1jv91_60{flex:1;grid-template-columns:60px 1fr;display:grid}._eventsColumn_1jv91_67{position:relative}@media (max-width:768px){._dayNumber_1jv91_49{margin-top:2px;font-size:16px}._dayHeader_1jv91_21{padding:6px 0}}._timeColumn_4fa67_1{border-inline-end:1px solid var(--border-color);z-index:5;background-color:var(--bg-color);flex-shrink:0;width:60px;position:sticky}._timeColumn_4fa67_1:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}._timeColumn_4fa67_1:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}._timeColumn_4fa67_1:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}._timeColumn_4fa67_1:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}._timeSlot_4fa67_11{border-bottom:1px solid var(--border-color);height:60px;color:var(--text-secondary);justify-content:center;align-items:center;font-size:12px;display:flex}._eventItem_16dg8_1{color:#fff;cursor:pointer;box-sizing:border-box;width:calc(var(--event-width) - 2px);background-color:#3b82f6;border-radius:4px;flex-direction:column;padding:4px 5px;font-size:12px;line-height:1.2;display:flex;position:absolute;left:5px;right:5px;overflow:hidden}._eventItemSmall_16dg8_19{flex-direction:row;align-items:center;gap:4px;padding:2px 5px}._eventItemTiny_16dg8_26{flex-direction:row;align-items:center;gap:4px;padding:1px 4px;font-size:10px;line-height:1}._eventTitle_16dg8_35{white-space:nowrap;text-overflow:ellipsis;font-weight:500;overflow:hidden}._eventTime_16dg8_42{white-space:nowrap;text-overflow:ellipsis;opacity:.9;overflow:hidden}._currentTimeLine_1e39r_1{z-index:10;pointer-events:none;align-items:center;height:2px;display:flex;position:absolute;left:0;right:0}._circle_1e39r_11{background-color:#ea4335;border-radius:50%;width:12px;height:12px;position:absolute}._circle_1e39r_11:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:-6px}._circle_1e39r_11:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:-6px}._circle_1e39r_11:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:-6px}._circle_1e39r_11:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:-6px}._line_1e39r_20{background-color:#ea4335;width:100%;height:2px}._eventSlot_sn2kl_1{border-bottom:1px solid var(--border-color);height:60px}._creatable_sn2kl_6{cursor:pointer}._bannerWrapper_kxvmv_1{border-bottom:1px solid var(--border-color);width:100%;display:flex}._timeHeaderSpacer_kxvmv_7{border-inline-end:1px solid var(--border-color);z-index:15;background-color:var(--bg-color);flex-direction:column;flex-shrink:0;justify-content:space-between;align-items:center;width:60px;padding:4px 0 2px;display:flex;position:sticky}._timeHeaderSpacer_kxvmv_7:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}._timeHeaderSpacer_kxvmv_7:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}._timeHeaderSpacer_kxvmv_7:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}._timeHeaderSpacer_kxvmv_7:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}._timezoneLabel_kxvmv_22{color:var(--text-secondary);text-align:center;margin-top:4px;font-size:10px;font-weight:500}._expandIcon_kxvmv_30{cursor:pointer;width:24px;height:24px;color:var(--text-secondary);border-radius:50%;justify-content:center;align-items:center;transition:background-color .2s,transform .2s;display:flex}._expandIcon_kxvmv_30:hover{background-color:var(--bg-hover)}._expandIcon_kxvmv_30._expanded_kxvmv_48{transform:rotate(180deg)}._bannerContainer_kxvmv_52{box-sizing:border-box;flex-direction:column;flex:1 0;min-height:28px;padding-bottom:4px;display:flex;position:relative;overflow:hidden}._bannerGridBg_kxvmv_64{pointer-events:none;width:100%;height:100%;display:flex;position:absolute;top:0;left:0}._bannerGridCell_kxvmv_74{border-inline-end:1px solid var(--border-color);flex:1}._bannerGridCell_kxvmv_74:last-child{border-inline-end:none}._bannerRow_kxvmv_83{width:100%;height:22px;margin-top:2px;position:relative}._bannerChip_kxvmv_90{color:#fff;box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;z-index:10;background-color:#1a73e8;border-radius:4px;align-items:center;height:20px;padding:0 4px;font-size:11px;font-weight:500;display:flex;position:absolute;top:1px;overflow:hidden}._bannerChip_kxvmv_90._clippedLeft_kxvmv_110{clip-path:polygon(10px 0,100% 0,100% 100%,10px 100%,0 50%);padding-inline-start:14px}._bannerChip_kxvmv_90._clippedLeft_kxvmv_110:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-top-left-radius:0;border-bottom-left-radius:0}._bannerChip_kxvmv_90._clippedLeft_kxvmv_110:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-top-left-radius:0;border-bottom-left-radius:0}._bannerChip_kxvmv_90._clippedLeft_kxvmv_110:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-top-right-radius:0;border-bottom-right-radius:0}._bannerChip_kxvmv_90._clippedLeft_kxvmv_110:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-top-right-radius:0;border-bottom-right-radius:0}._bannerChip_kxvmv_90._clippedRight_kxvmv_117{clip-path:polygon(0 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,0 100%);padding-inline-end:14px}._bannerChip_kxvmv_90._clippedRight_kxvmv_117:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-top-right-radius:0;border-bottom-right-radius:0}._bannerChip_kxvmv_90._clippedRight_kxvmv_117:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-top-right-radius:0;border-bottom-right-radius:0}._bannerChip_kxvmv_90._clippedRight_kxvmv_117:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-top-left-radius:0;border-bottom-left-radius:0}._bannerChip_kxvmv_90._clippedRight_kxvmv_117:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-top-left-radius:0;border-bottom-left-radius:0}._bannerChip_kxvmv_90._clippedLeft_kxvmv_110._clippedRight_kxvmv_117{clip-path:polygon(10px 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,10px 100%,0 50%);border-radius:0;padding-inline-start:14px;padding-inline-end:14px}[dir=rtl] ._bannerChip_kxvmv_90._clippedLeft_kxvmv_110{clip-path:polygon(0 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,0 100%)}[dir=rtl] ._bannerChip_kxvmv_90._clippedRight_kxvmv_117{clip-path:polygon(10px 0,100% 0,100% 100%,10px 100%,0 50%)}._title_kxvmv_157{text-overflow:ellipsis;white-space:nowrap;flex-grow:1;overflow:hidden}._moreChip_kxvmv_164{color:var(--text-secondary);box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;z-index:10;background:0 0;border-radius:4px;align-items:center;padding:.15rem .5rem;font-size:.75rem;font-weight:600;transition:background-color .2s;display:flex;position:absolute;overflow:hidden}._moreChip_kxvmv_164:hover{background-color:var(--bg-hover);color:var(--text-primary)}._weekView_17rc6_1{border:1px solid var(--border-color);border-radius:8px;flex-direction:column;height:100%;display:flex;overflow:auto}._stickyTopContainer_17rc6_11{z-index:20;background-color:var(--bg-color);flex-direction:column;display:flex;position:sticky;top:0;box-shadow:0 4px 6px -4px #0000001a}._weekHeader_17rc6_21{border-bottom:1px solid var(--border-color);background-color:var(--bg-hover);display:flex}._timeHeaderSpacer_17rc6_27{border-inline-end:1px solid var(--border-color);z-index:15;background-color:var(--bg-hover);flex-shrink:0;width:60px;position:sticky}._timeHeaderSpacer_17rc6_27:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}._timeHeaderSpacer_17rc6_27:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}._timeHeaderSpacer_17rc6_27:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}._timeHeaderSpacer_17rc6_27:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}._dayHeader_17rc6_37{text-align:center;border-inline-end:1px solid var(--border-color);flex:1;padding:10px 0}._dayHeader_17rc6_37:last-child{border-inline-end:none}._dayName_17rc6_48{color:var(--text-secondary);text-transform:uppercase;font-size:12px}._dayNumber_17rc6_54{margin-top:4px;font-size:20px;font-weight:500}._dayNumber_17rc6_54._today_17rc6_60{color:var(--primary-color);font-weight:700}._timeGrid_17rc6_65,._eventsGrid_17rc6_71{flex:1;display:flex}._dayColumn_17rc6_76{border-inline-end:1px solid var(--border-color);flex:1;position:relative}._dayColumn_17rc6_76:last-child{border-inline-end:none}@media (max-width:768px){._dayHeader_17rc6_37,._dayColumn_17rc6_76{flex:0 0 100px;min-width:100px}._dayName_17rc6_48{font-size:10px}._dayNumber_17rc6_54{font-size:15px}}@media (max-width:480px){._dayHeader_17rc6_37,._dayColumn_17rc6_76{flex:0 0 calc(100vw - 90px);min-width:calc(100vw - 90px)}}._dateData_a2d26_1{cursor:pointer;vertical-align:top;height:calc(var(--calendar-height) / var(--calendar-rows,6));min-width:calc(var(--calendar-width) / 7);max-width:calc(var(--calendar-width) / 7);padding:.25rem;transition:background-color .15s;position:relative}._dateData_a2d26_1:hover{background-color:var(--bg-hover)}._currentMonth_a2d26_18{color:var(--text-secondary);background-color:var(--bg-hover)}._cellContent_a2d26_23{flex-direction:column;justify-content:flex-start;gap:.25rem;width:100%;height:100%;display:flex}._dateLabel_a2d26_32{width:24px;height:24px;color:var(--text-primary);border-radius:50%;justify-content:center;align-items:center;margin-block-start:2px;margin-block-end:4px;margin-inline-start:auto;margin-inline-end:2px;font-size:.8125rem;font-weight:500;transition:background-color .2s,color .2s;display:flex}._selected_a2d26_49 ._dateLabel_a2d26_32{background-color:var(--primary-color);color:#fff}._today_a2d26_54 ._dateLabel_a2d26_32{background-color:var(--primary-color);color:#fff;box-shadow:0 0 0 2px white, 0 0 0 4px var(--primary-color)}._dataContainer_a2d26_62{flex-direction:column;flex:1;gap:2px;display:flex;overflow:visible}._spacer_a2d26_70{height:1.5rem;margin-bottom:2px}._eventItem_a2d26_75{background-color:var(--primary-color);z-index:2;white-space:nowrap;text-overflow:ellipsis;color:#fff;box-sizing:border-box;cursor:pointer;border-radius:4px;height:1.5rem;padding:.15rem .5rem;font-size:.75rem;font-weight:500;line-height:1.2rem;transition:transform .1s,box-shadow .1s;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000001a}._eventItem_a2d26_75:hover{filter:brightness(1.05);transform:translateY(-1px);box-shadow:0 2px 4px #00000026}._moreEventsContainer_a2d26_103{margin-top:2px;position:relative}._moreEvents_a2d26_103{color:var(--text-secondary);cursor:pointer;text-align:start;background:0 0;border:none;border-radius:4px;width:100%;padding:.15rem .5rem;font-size:.75rem;font-weight:600;transition:background-color .2s}._moreEvents_a2d26_103:hover{background-color:var(--bg-hover);color:var(--text-primary)}@media (max-width:768px){._dateLabel_a2d26_32{width:20px;height:20px;font-size:.6875rem}._eventItem_a2d26_75{height:1.25rem;padding:.1rem .25rem;font-size:.6875rem;line-height:1rem}._moreEvents_a2d26_103{padding:.1rem .25rem;font-size:.6875rem}}@media (max-width:480px){._dateLabel_a2d26_32{width:16px;height:16px;margin-block-start:1px;margin-block-end:2px;margin-inline-start:auto;margin-inline-end:1px;font-size:.625rem}._eventItem_a2d26_75{border-radius:3px;height:6px;padding:0 2px;font-size:0;line-height:0}._moreEvents_a2d26_103{display:none}._spacer_a2d26_70{height:8px}}._popover_bnbml_1{top:calc(100% + 4px);z-index:100;background-color:var(--bg-color);opacity:0;border:1px solid #0000001a;border-radius:12px;flex-direction:column;min-width:220px;max-width:320px;padding:0;animation:.2s forwards _fadeIn_bnbml_1;display:flex;position:fixed;overflow:hidden;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d}._popover_bnbml_1:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}._popover_bnbml_1:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){left:0}._popover_bnbml_1:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}._popover_bnbml_1:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}@keyframes _fadeIn_bnbml_1{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}._popoverHeader_bnbml_33{color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em;background-color:var(--bg-hover);border-bottom:1px solid var(--border-color);padding:10px 12px;font-size:.75rem;font-weight:600}._popoverContent_bnbml_44{scrollbar-width:thin;scrollbar-color:var(--border-color) transparent;max-height:250px;padding:8px;overflow-y:auto}._popoverItem_bnbml_52{background-color:var(--primary-color);color:#fff;border-radius:var(--radius-md);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;flex-shrink:0;margin-bottom:2px;padding:.25rem .5rem;font-size:.75rem;transition:opacity .2s;overflow:hidden}._popoverItem_bnbml_52:hover{opacity:.9}._popoverItem_bnbml_52._startBefore_bnbml_71{clip-path:polygon(10px 0,100% 0,100% 100%,10px 100%,0 50%);padding-inline-start:14px}._popoverItem_bnbml_52._startBefore_bnbml_71:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-top-left-radius:0;border-bottom-left-radius:0}._popoverItem_bnbml_52._startBefore_bnbml_71:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-top-left-radius:0;border-bottom-left-radius:0}._popoverItem_bnbml_52._startBefore_bnbml_71:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-top-right-radius:0;border-bottom-right-radius:0}._popoverItem_bnbml_52._startBefore_bnbml_71:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-top-right-radius:0;border-bottom-right-radius:0}._popoverItem_bnbml_52._endAfter_bnbml_78{clip-path:polygon(0 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,0 100%);padding-inline-end:14px}._popoverItem_bnbml_52._endAfter_bnbml_78:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-top-right-radius:0;border-bottom-right-radius:0}._popoverItem_bnbml_52._endAfter_bnbml_78:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-top-right-radius:0;border-bottom-right-radius:0}._popoverItem_bnbml_52._endAfter_bnbml_78:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-top-left-radius:0;border-bottom-left-radius:0}._popoverItem_bnbml_52._endAfter_bnbml_78:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-top-left-radius:0;border-bottom-left-radius:0}._popoverItem_bnbml_52._startBefore_bnbml_71._endAfter_bnbml_78{clip-path:polygon(10px 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,10px 100%,0 50%);border-radius:0;padding-inline-start:14px;padding-inline-end:14px}[dir=rtl] ._popoverItem_bnbml_52._startBefore_bnbml_71{clip-path:polygon(0 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,0 100%)}[dir=rtl] ._popoverItem_bnbml_52._endAfter_bnbml_78{clip-path:polygon(10px 0,100% 0,100% 100%,10px 100%,0 50%)}._monthView_13hor_1{flex-direction:column;flex:1;height:100%;display:flex;position:relative;overflow:hidden}._table_13hor_10{border-collapse:collapse;box-sizing:border-box;flex:1;width:100%;height:100%}._tableHeader_13hor_19,._tableCell_13hor_20{border-inline-end:1px solid var(--border-color);border-bottom:1px solid var(--border-color);box-sizing:border-box}._tableHeader_13hor_19:last-child,._tableCell_13hor_20:last-child{border-inline-end:none}._table_13hor_10 tr:last-child ._tableCell_13hor_20{border-bottom:none}._tableHeader_13hor_19{background-color:var(--bg-hover);z-index:10;height:40px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em;text-align:center;vertical-align:middle;font-size:.875rem;font-weight:600;position:sticky;top:0}._tableCell_13hor_20{vertical-align:top;height:calc(100% / var(--calendar-rows));width:calc((100% - var(--week-number-width,0px)) / 7);padding:4px}._weekNumberHeader_13hor_61{width:var(--week-number-width,36px);z-index:10;background-color:var(--bg-hover);position:sticky;top:0}._weekNumberCell_13hor_69{vertical-align:middle;text-align:center;color:var(--text-secondary);background-color:var(--bg-hover);border-inline-end:1px solid var(--border-color);border-bottom:1px solid var(--border-color);font-size:.875rem;font-weight:500}@media (max-width:768px){._tableHeader_13hor_19{letter-spacing:0;height:30px;font-size:.75rem}._tableCell_13hor_20{padding:2px}}._scheduleView_156gf_1{background-color:var(--bg-color);color:var(--text-primary);flex-direction:column;flex:1;height:100%;padding:0 16px 16px;display:flex;overflow-y:auto}._emptyState_156gf_12{height:100%;color:var(--text-secondary);justify-content:center;align-items:center;font-size:14px;display:flex}._dateGroup_156gf_21{border-bottom:1px solid var(--border-color);flex-direction:column;display:flex}._dateGroup_156gf_21:last-child,._dateGroup_156gf_21._noBorder_156gf_31{border-bottom:none}._eventItemContainer_156gf_35{align-items:center;gap:16px;padding:6px 0;display:flex;position:relative}._dateInfoColumn_156gf_43{flex-shrink:0;align-self:flex-start;align-items:flex-start;gap:8px;width:70px;padding-top:4px;display:flex}._dateNumber_156gf_53{color:var(--text-primary);text-align:end;padding-bottom:2px;border-radius:50%;justify-content:center;align-items:center;width:28px;min-width:28px;height:28px;padding-inline-start:1px;font-size:20px;font-weight:500;display:flex}._dateNumber_156gf_53._today_156gf_69{background-color:var(--primary-color);color:#fff}._dateSubInfo_156gf_74{color:var(--text-secondary);text-transform:uppercase;letter-spacing:.5px;padding-top:5px;font-size:11px}._dotTimeColumn_156gf_82{flex-shrink:0;align-items:center;gap:12px;width:140px;display:flex}._eventDot_156gf_90{background-color:var(--primary-color);border-radius:50%;flex-shrink:0;width:10px;height:10px}._eventTime_156gf_98{color:var(--text-primary);font-size:13px}._eventTitleColumn_156gf_103{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;flex:1;font-size:14px;font-weight:500;overflow:hidden}@media (max-width:480px){._scheduleView_156gf_1{padding:0 8px}._dotTimeColumn_156gf_82{gap:8px;width:100px}._dateNumber_156gf_53{width:24px;height:24px;font-size:16px}._eventTime_156gf_98{font-size:11px}._eventTitleColumn_156gf_103{font-size:13px}}._customView_1tmwe_1{background-color:var(--bg-color);flex-direction:column;height:100%;display:flex;position:relative;overflow:auto}._stickyTopContainer_1tmwe_11{z-index:10;background-color:var(--bg-color);border-bottom:1px solid var(--border-color);position:sticky;top:0}._customHeader_1tmwe_19{border-bottom:1px solid var(--border-color);display:flex}._timeHeaderSpacer_1tmwe_24{border-inline-end:1px solid var(--border-color);flex-shrink:0;width:60px}._dayHeader_1tmwe_30{text-align:center;border-inline-end:1px solid var(--border-color);flex:1;min-width:0;padding:10px 5px}._dayHeader_1tmwe_30:last-child{border-inline-end:none}._dayName_1tmwe_42{color:var(--text-secondary);text-transform:uppercase;margin-bottom:4px;font-size:12px}._dayNumber_1tmwe_49{border-radius:50%;width:32px;height:32px;margin:0 auto;font-size:18px;line-height:32px}._today_1tmwe_58{background-color:var(--primary-color);color:#fff}._timeGrid_1tmwe_63{flex:1;display:flex}._eventsGrid_1tmwe_68{flex:1;display:flex;position:relative}._dayColumn_1tmwe_74{border-inline-end:1px solid var(--border-color);flex:1;min-width:0;position:relative}._dayColumn_1tmwe_74:last-child{border-inline-end:none}@media (max-width:768px){._dayHeader_1tmwe_30{flex:0 0 100px;min-width:100px;padding:8px 4px}._dayColumn_1tmwe_74{flex:0 0 100px;min-width:100px}._dayName_1tmwe_42{font-size:10px}._dayNumber_1tmwe_49{width:26px;height:26px;font-size:15px;line-height:26px}}@media (max-width:480px){._dayHeader_1tmwe_30,._dayColumn_1tmwe_74{flex:0 0 calc(100vw - 90px);min-width:calc(100vw - 90px)}}@keyframes _shimmer_8g8rd_11{0%{background-position:-468px 0}to{background-position:468px 0}}._shimmer_8g8rd_11{background:linear-gradient(90deg,#f0f0f0 8%,#e0e0e0 18%,#f0f0f0 33%) 0 0/800px 104px;border-radius:4px;animation:1.5s linear infinite _shimmer_8g8rd_11;display:block}._monthSkeleton_8g8rd_20{flex-direction:column;flex:1;display:flex;overflow:hidden}._table_8g8rd_27{border-collapse:collapse;flex:1;width:100%;height:100%}._headerCell_8g8rd_34{background-color:var(--bg-hover);border-inline-end:1px solid var(--border-color);border-bottom:1px solid var(--border-color);vertical-align:middle;height:40px;padding:4px 8px}._headerCell_8g8rd_34:last-child{border-inline-end:none}._cell_8g8rd_47{vertical-align:top;border-inline-end:1px solid var(--border-color);border-bottom:1px solid var(--border-color);height:100px;padding:4px}._cell_8g8rd_47:last-child{border-inline-end:none}._timeGridSkeleton_8g8rd_60{border:1px solid var(--border-color);border-radius:8px;flex:1;display:flex;overflow:hidden}._timeColumn_8g8rd_68{border-inline-end:1px solid var(--border-color);flex-direction:column;flex-shrink:0;gap:16px;width:60px;padding:8px 4px;display:flex}._timeSlot_8g8rd_78{justify-content:center;display:flex}._eventsArea_8g8rd_83{flex:1;position:relative}._scheduleSkeleton_8g8rd_89{flex-direction:column;flex:1;gap:16px;padding:16px;display:flex;overflow-y:auto}._scheduleRow_8g8rd_98{border-bottom:1px solid var(--border-color);align-items:center;gap:16px;padding:8px 0;display:flex}._scheduleLines_8g8rd_106{flex-direction:column;flex:1;gap:6px;display:flex}[data-color-scheme=dark] ._shimmer_8g8rd_11{background:linear-gradient(90deg,#ffffff0a 0%,#ffffff1a 50%,#ffffff0a 100%)}[data-color-scheme=dark] ._headerCell_8g8rd_34,[data-color-scheme=dark] ._cell_8g8rd_47{border-inline-end-color:var(--border-color);border-bottom-color:var(--border-color)}@keyframes _fadeIn_cb5bq_11{0%{opacity:0}to{opacity:1}}._fadeIn_cb5bq_11{animation:.15s _fadeIn_cb5bq_11}._loadingOverlay_cb5bq_16{pointer-events:none}._viewBody_cb5bq_21{flex-direction:column;flex:1;display:flex;overflow:hidden}._views_cb5bq_28{flex:1;min-height:0}:root{--primary-color:#3b82f6;--primary-hover:#2563eb;--text-primary:#1f2937;--text-secondary:#6b7280;--bg-color:#fff;--bg-hover:#f3f4f6;--border-color:#e5e7eb;--shadow-sm:0 1px 2px 0 #0000000d;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -1px #0000000f;--radius-md:.375rem;--radius-lg:.5rem;--cal-focus-color:#005fcc}[data-color-scheme=dark]{--primary-color:#60a5fa;--primary-hover:#3b82f6;--text-primary:#f9fafb;--text-secondary:#9ca3af;--bg-color:#1f2937;--bg-hover:#374151;--border-color:#374151;--cal-focus-color:#93c5fd}[role=button]:focus-visible{outline:2px solid var(--cal-focus-color,#005fcc);outline-offset:2px;border-radius:2px}button:focus-visible{outline:2px solid var(--cal-focus-color,#005fcc);outline-offset:2px;border-radius:2px}select:focus-visible{outline:2px solid var(--cal-focus-color,#005fcc);outline-offset:2px;border-radius:2px}[tabindex="0"]:focus-visible{outline:2px solid var(--cal-focus-color,#005fcc);outline-offset:2px;border-radius:2px}
2
2
  /*$vite$:1*/