calendar-simple 1.2.0 → 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 (101) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +371 -62
  3. package/dist/calendar-simple.css +1 -1
  4. package/dist/index.cjs.js +1 -1
  5. package/dist/index.cjs.js.map +1 -1
  6. package/dist/index.es.js +7588 -978
  7. package/dist/index.es.js.map +1 -1
  8. package/dist/index.iife.js +1 -1
  9. package/dist/index.iife.js.map +1 -1
  10. package/dist/src/Calendar.d.ts +19 -0
  11. package/dist/src/Calendar.test.d.ts +1 -0
  12. package/dist/src/assets/LeftArrow.d.ts +3 -0
  13. package/dist/src/assets/RightArrow.d.ts +3 -0
  14. package/dist/src/components/core/all_day_banner/AllDayBanner.d.ts +9 -0
  15. package/dist/src/components/core/all_day_banner/AllDayBanner.test.d.ts +1 -0
  16. package/dist/src/components/core/current_time_line/CurrentTimeLine.d.ts +7 -0
  17. package/dist/src/components/core/current_time_line/CurrentTimeLine.test.d.ts +1 -0
  18. package/dist/src/components/core/day_column/DayColumn.d.ts +11 -0
  19. package/dist/src/components/core/day_column/DayColumn.test.d.ts +1 -0
  20. package/dist/src/components/core/day_event_item/DayWeekEventItem.d.ts +8 -0
  21. package/dist/src/components/core/day_event_item/DayWeekEventItem.test.d.ts +1 -0
  22. package/dist/src/components/core/month_event_item/MonthEventItem.d.ts +21 -0
  23. package/dist/src/components/core/month_event_item/MonthEventItem.test.d.ts +1 -0
  24. package/dist/src/components/core/time_column/TimeColumn.d.ts +6 -0
  25. package/dist/src/components/core/time_column/TimeColumn.test.d.ts +1 -0
  26. package/dist/src/components/layout/Header.d.ts +7 -0
  27. package/dist/src/components/layout/Header.test.d.ts +1 -0
  28. package/dist/src/components/ui/CalendarErrorBoundary.d.ts +14 -0
  29. package/dist/src/components/ui/popover/Popover.d.ts +11 -0
  30. package/dist/src/components/ui/popover/Popover.test.d.ts +1 -0
  31. package/dist/src/components/ui/skeleton/MonthSkeleton.d.ts +2 -0
  32. package/dist/src/components/ui/skeleton/MonthSkeleton.test.d.ts +1 -0
  33. package/dist/src/components/ui/skeleton/ScheduleSkeleton.d.ts +2 -0
  34. package/dist/src/components/ui/skeleton/ScheduleSkeleton.test.d.ts +1 -0
  35. package/dist/src/components/ui/skeleton/TimeGridSkeleton.d.ts +2 -0
  36. package/dist/src/components/ui/skeleton/TimeGridSkeleton.test.d.ts +1 -0
  37. package/dist/src/components/views/View.d.ts +4 -0
  38. package/dist/src/components/views/View.test.d.ts +1 -0
  39. package/dist/src/components/views/custom_days_view/CustomDaysView.d.ts +5 -0
  40. package/dist/src/components/views/custom_days_view/CustomDaysView.test.d.ts +1 -0
  41. package/dist/src/components/views/day_view/DayView.d.ts +5 -0
  42. package/dist/src/components/views/day_view/DayView.test.d.ts +1 -0
  43. package/dist/src/components/views/month_view/MonthView.d.ts +5 -0
  44. package/dist/src/components/views/month_view/MonthView.test.d.ts +1 -0
  45. package/dist/src/components/views/schedule_view/ScheduleView.d.ts +4 -0
  46. package/dist/src/components/views/schedule_view/ScheduleView.test.d.ts +1 -0
  47. package/dist/src/components/views/week_view/WeekView.d.ts +5 -0
  48. package/dist/src/components/views/week_view/WeekView.test.d.ts +1 -0
  49. package/dist/src/constants/calendar.d.ts +96 -0
  50. package/dist/src/constants/index.d.ts +2 -0
  51. package/dist/src/constants/theme.d.ts +38 -0
  52. package/dist/src/context/CalendarContext.d.ts +83 -0
  53. package/dist/src/context/CalendarContext.test.d.ts +1 -0
  54. package/dist/src/hooks/useAllDayBanner.d.ts +48 -0
  55. package/dist/src/hooks/useAllDayBanner.test.d.ts +1 -0
  56. package/dist/src/hooks/useCalendarProps.d.ts +10 -0
  57. package/dist/src/hooks/useColorScheme.d.ts +2 -0
  58. package/dist/src/hooks/useColorScheme.test.d.ts +1 -0
  59. package/dist/src/hooks/useDayEventLayout.d.ts +27 -0
  60. package/dist/src/hooks/useDayEventLayout.test.d.ts +1 -0
  61. package/dist/src/hooks/useEvents.d.ts +16 -0
  62. package/dist/src/hooks/useEvents.test.d.ts +1 -0
  63. package/dist/src/hooks/useMonthGrid.d.ts +44 -0
  64. package/dist/src/hooks/useMonthGrid.test.d.ts +1 -0
  65. package/dist/src/hooks/useResizeObserver.d.ts +13 -0
  66. package/dist/src/hooks/useResizeObserver.test.d.ts +1 -0
  67. package/dist/src/hooks/useScheduleView.d.ts +24 -0
  68. package/dist/src/hooks/useScheduleView.test.d.ts +1 -0
  69. package/dist/src/index.d.ts +13 -0
  70. package/dist/src/setupTests.d.ts +0 -0
  71. package/dist/src/stories/Accessibility.stories.d.ts +10 -0
  72. package/dist/src/stories/CustomDayView.stories.d.ts +10 -0
  73. package/dist/src/stories/Customization.stories.d.ts +29 -0
  74. package/dist/src/stories/DayView.stories.d.ts +11 -0
  75. package/dist/src/stories/Features.stories.d.ts +25 -0
  76. package/dist/src/stories/Localization.stories.d.ts +22 -0
  77. package/dist/src/stories/MonthView.stories.d.ts +13 -0
  78. package/dist/src/stories/QA/EdgeCases.stories.d.ts +12 -0
  79. package/dist/src/stories/QA/Interactions.stories.d.ts +8 -0
  80. package/dist/src/stories/QA/LayoutLimits.stories.d.ts +11 -0
  81. package/dist/src/stories/QA/Performance.stories.d.ts +9 -0
  82. package/dist/src/stories/QA/TimeFormatting.stories.d.ts +11 -0
  83. package/dist/src/stories/QA/Views.stories.d.ts +10 -0
  84. package/dist/src/stories/ScheduleView.stories.d.ts +10 -0
  85. package/dist/src/stories/WeekView.stories.d.ts +14 -0
  86. package/dist/src/types/calendar.d.ts +213 -0
  87. package/dist/src/types/events.d.ts +34 -0
  88. package/dist/src/types/index.d.ts +3 -0
  89. package/dist/src/types/theme.d.ts +81 -0
  90. package/dist/src/utils/common.d.ts +48 -0
  91. package/dist/src/utils/common.test.d.ts +1 -0
  92. package/dist/src/utils/contrast.d.ts +18 -0
  93. package/dist/src/utils/contrast.test.d.ts +1 -0
  94. package/dist/src/utils/date.d.ts +55 -0
  95. package/dist/src/utils/date.test.d.ts +1 -0
  96. package/dist/src/utils/formatting.d.ts +21 -0
  97. package/dist/src/utils/formatting.test.d.ts +1 -0
  98. package/dist/src/utils/index.d.ts +9 -0
  99. package/dist/stats.html +4950 -0
  100. package/package.json +56 -16
  101. package/dist/index.d.ts +0 -60
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 jaganath-m-s
3
+ Copyright (c) 2024-2026 jaganath-m-s
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,26 +1,41 @@
1
1
  # Calendar Simple
2
2
 
3
- ![npm](https://img.shields.io/npm/v/calendar-simple)
4
- ![npm bundle size](https://img.shields.io/bundlephobia/minzip/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
- - **📅 Month View**: Intuitive navigation through monthly views.
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**: Fully customizable colors for selected dates, current day, and general theme.
18
- - **👆 Interactive**: granular control with click handlers for dates, specific events, and "more" indicators.
19
- - **🛡️ 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.
20
27
 
21
- ## Installation
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
- Install using your preferred package manager:
38
+ ## Installation
24
39
 
25
40
  ```bash
26
41
  npm install calendar-simple
@@ -34,122 +49,416 @@ pnpm add calendar-simple
34
49
 
35
50
  ### Basic Example
36
51
 
37
- Import the component and its styles to get started:
38
-
39
52
  ```tsx
40
53
  import React, { useState } from "react";
41
- import Calendar, { CalendarType } from "calendar-simple";
54
+ import Calendar from "calendar-simple";
42
55
  import "calendar-simple/dist/styles.css";
43
56
 
44
57
  const App = () => {
45
58
  const [selectedDate, setSelectedDate] = useState(new Date());
46
59
 
60
+ // Calendar fills its container — give the parent an explicit height
47
61
  return (
48
62
  <div style={{ height: "600px", padding: "20px" }}>
49
63
  <Calendar
50
64
  selectedDate={selectedDate}
51
65
  onDateClick={setSelectedDate}
52
- isSelectDate
66
+ selectable
53
67
  />
54
68
  </div>
55
69
  );
56
70
  };
57
71
  ```
58
72
 
59
- ### Advanced Usage with Events & Theme
73
+ ### Advanced Usage with Events & Views
60
74
 
61
75
  ```tsx
62
76
  import React, { useState } from "react";
63
- import Calendar, { DataType } from "calendar-simple";
77
+ import Calendar, { CalendarEvent, ECalendarViewType } from "calendar-simple";
64
78
  import "calendar-simple/dist/styles.css";
65
79
 
66
80
  const MyCalendar = () => {
67
81
  const [selectedDate, setSelectedDate] = useState(new Date());
82
+ const [view, setView] = useState<ECalendarViewType>("month");
68
83
 
69
- const events: DataType[] = [
84
+ const events: CalendarEvent[] = [
70
85
  {
86
+ id: "1",
71
87
  startDate: "2024-02-14",
72
- value: "Valentine's Day",
73
- color: "#ffcccc",
88
+ title: "Valentine's Day",
89
+ style: { backgroundColor: "#ffcccc" },
74
90
  },
75
91
  {
92
+ id: "2",
76
93
  startDate: "2024-02-20",
77
94
  endDate: "2024-02-22",
78
- value: "Tech Conference",
79
- color: "#e6f7ff",
95
+ title: "Tech Conference",
96
+ style: { backgroundColor: "#e6f7ff" },
97
+ },
98
+ {
99
+ id: "3",
100
+ startDate: "2024-02-21T10:00:00",
101
+ endDate: "2024-02-21T12:00:00",
102
+ title: "Team Meeting",
103
+ style: { backgroundColor: "#cce5ff" },
80
104
  },
81
105
  ];
82
106
 
83
107
  return (
84
108
  <Calendar
109
+ events={events}
85
110
  selectedDate={selectedDate}
111
+ view={view}
86
112
  onDateClick={setSelectedDate}
87
- isSelectDate
88
- data={events}
89
- width={800}
90
- height={600}
113
+ onViewChange={setView}
114
+ selectable
115
+ is12Hour
116
+ showCurrentTime
117
+ autoScrollToCurrentTime
91
118
  theme={{
92
119
  selected: { color: "#fff", bgColor: "#007bff" },
93
120
  today: { color: "#007bff", bgColor: "#e6f2ff" },
94
121
  }}
95
- onEventClick={(event) => alert(`Clicked: ${event.value}`)}
122
+ onEventClick={(event) => alert(`Clicked: ${event.title}`)}
96
123
  />
97
124
  );
98
125
  };
99
126
  ```
100
127
 
128
+ ### 🧩 Custom Renderers
129
+
130
+ ```tsx
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
+ ```
179
+
180
+ ### 🌍 Localization
181
+
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
+ />
194
+ ```
195
+
101
196
  ## API Reference
102
197
 
198
+ > For full prop descriptions and usage examples, see [FEATURES.md](./FEATURES.md).
199
+
103
200
  ### Props
104
201
 
105
- | Prop | Type | Description | Default |
106
- | ------------------ | --------------------------- | ---------------------------------------------------------- | --------------- |
107
- | `data` | `DataType[]` | Array of event data objects to display. | `[]` |
108
- | `selectedDate` | `Date` | The currently selected date object. | `undefined` |
109
- | `onDateClick` | `(date: Date) => void` | Callback function fired when a date is clicked. | `undefined` |
110
- | `onEventClick` | `(event: DataType) => void` | Callback function fired when an event is clicked. | `undefined` |
111
- | `onMoreClick` | `(date: Date) => void` | Callback fired when the "+X more" indicator is clicked. | `undefined` |
112
- | `onMonthChange` | `(date: Date) => void` | Callback fired when the visible month is changed. | `undefined` |
113
- | `width` | `number` | Width of the calendar container in pixels. | `400` |
114
- | `height` | `number` | Height of the calendar container in pixels. | `400` |
115
- | `theme` | `CalendarTheme` | Configuration object for custom colors. | `Default Theme` |
116
- | `dayType` | `EDayType` | Format for day names: `"FULL"` (Monday) or `"HALF"` (Mon). | `HALF` |
117
- | `isSelectDate` | `boolean` | Enables visual selection state. | `false` |
118
- | `pastYearLength` | `number` | Number of past years to show in the year dropdown. | `5` |
119
- | `futureYearLength` | `number` | Number of future years to show in the year dropdown. | `5` |
120
- | `maxEvents` | `number` | Maximum events to show per day cell before collapsing. | Auto-calc |
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` |
121
253
 
122
254
  ### Types
123
255
 
124
- #### `DataType`
256
+ #### `CalendarEvent`
125
257
 
126
258
  ```typescript
127
- interface DataType {
128
- startDate: string; // Format: YYYY-MM-DD
129
- endDate?: string; // Format: YYYY-MM-DD
130
- value: string; // Event title or description
131
- color?: string; // CSS color string for event background
259
+ interface CalendarEvent {
260
+ id?: string;
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
132
266
  }
133
267
  ```
134
268
 
269
+ #### `ECalendarViewType` & `EDayType`
270
+
271
+ ```typescript
272
+ type ECalendarViewType = "month" | "week" | "day" | "schedule" | "customDays";
273
+ type EDayType = "full" | "half";
274
+ ```
275
+
135
276
  #### `CalendarTheme`
136
277
 
137
278
  ```typescript
138
- interface CalendarTheme {
139
- selected?: {
140
- color?: string; // Text color for selected date
141
- bgColor?: string; // Background color for selected date
142
- };
143
- today?: {
144
- color?: string; // Text color for today's date
145
- bgColor?: string; // Background color for today's date
146
- };
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;
147
304
  }
148
305
  ```
149
306
 
307
+ #### `RenderDateCellProps`
308
+
309
+ ```typescript
310
+ interface RenderDateCellProps {
311
+ date: Date;
312
+ isToday: boolean;
313
+ isSelected?: boolean;
314
+ isCurrentMonth?: boolean;
315
+ }
316
+ ```
317
+
318
+ #### `CalendarClassNames`
319
+
320
+ ```typescript
321
+ interface CalendarClassNames {
322
+ root?: string;
323
+ header?: string;
324
+
325
+ // Month view
326
+ table?: string;
327
+ tableHeader?: string;
328
+ tableDate?: string;
329
+ weekNumber?: string;
330
+
331
+ // Shared events
332
+ event?: string;
333
+ selected?: string;
334
+ today?: string;
335
+
336
+ // Week & Day view
337
+ dayHeader?: string;
338
+ dayName?: string;
339
+ dayNumber?: string;
340
+ timeColumn?: string;
341
+ timeSlot?: string;
342
+ dayColumn?: string;
343
+
344
+ // Schedule view
345
+ scheduleDateGroup?: string;
346
+ scheduleDateNumber?: string;
347
+ scheduleDateSubInfo?: string;
348
+ scheduleTime?: string;
349
+ scheduleTitle?: string;
350
+ }
351
+ ```
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
+
150
440
  ## Contributing
151
441
 
152
- 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.).
153
462
 
154
463
  ## License
155
464
 
@@ -1,2 +1,2 @@
1
- ._calendarContainer_q5rnf_1{justify-content:center;align-items:center;width:100%;height:100%;display:flex}._calendar_q5rnf_1{--calendar-width:0px;--calendar-height:0px;--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;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;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,Arial,sans-serif;overflow:hidden auto}._calendar_q5rnf_1 *{box-sizing:border-box;margin:0;padding:0}._table_q5rnf_56{border-collapse:separate;border-spacing:0}._tableHeader_q5rnf_61,._tableCell_q5rnf_62{border-right:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}._tableHeader_q5rnf_61:last-child,._tableCell_q5rnf_62:last-child{border-right:none}._table_q5rnf_56 tr:last-child ._tableCell_q5rnf_62{border-bottom:none}._tableHeader_q5rnf_61{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}._tableBody_q5rnf_88{height:var(--calendar-height)}._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}._header_7f1ps_1{box-sizing:border-box;background-color:#0000;justify-content:space-between;align-items:center;width:100%;padding:1rem;display:flex}._navigation_7f1ps_11{align-items:center;gap:1rem;display:flex}._todayButton_7f1ps_17{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_7f1ps_17:hover{background-color:var(--bg-hover);border-color:var(--text-secondary)}._arrows_7f1ps_35{align-items:center;gap:.5rem;display:flex}._iconButton_7f1ps_41{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_7f1ps_41:hover{background-color:var(--bg-hover);color:var(--text-primary)}._dateTitle_7f1ps_61{color:var(--text-primary);white-space:nowrap;margin:0;font-family:inherit;font-size:1.25rem;font-weight:600}._controls_7f1ps_70{align-items:center;gap:.75rem;display:flex}._select_7f1ps_76{-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_7f1ps_76:hover{border-color:var(--text-secondary)}._select_7f1ps_76:focus{border-color:var(--primary-color);box-shadow:0 0 0 2px #3b82f633}
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*/