Skip to content

Commit 7e7e7f6

Browse files
committed
feat: add resizable month view with customizable display modes and themes
1 parent 0cc89e4 commit 7e7e7f6

27 files changed

Lines changed: 3439 additions & 11 deletions

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# [Unreleased - 11 May 2026]
22

3+
- Added `ResizableMonthView`, a new highly customizable month view with dynamic modes (Full, Compact, Minimal) and built-in event list.
4+
- Added `ResizableMonthViewThemeData` and related theme configurations for styling the new view.
35
- Fixed `MonthViewBuilder` to be generic for improved type safety in `MonthView`. [#524](https://github.com/SimformSolutionsPvtLtd/flutter_calendar_view/issues/524)
46
- Added `DividerSettings` to customize the dividers in `WeekView` and `MultiDayView`. [#374](https://github.com/SimformSolutionsPvtLtd/flutter_calendar_view/issues/374), [#430](https://github.com/SimformSolutionsPvtLtd/flutter_calendar_view/issues/430), [#498](https://github.com/SimformSolutionsPvtLtd/flutter_calendar_view/issues/498)
57
- Added `timeSlotColorBuilder` in `DayView` and `WeekView` to customize background color. [#470](https://github.com/SimformSolutionsPvtLtd/flutter_calendar_view/issues/470)

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ dependencies:
3333
3434
- Multiple calendar view options:
3535
- Month View
36+
- Resizable Month View
3637
- Day View
3738
- Week View
3839
- Highly customisable UI components

example/lib/enumerations.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
enum CalendarView { month, day, week }
1+
enum CalendarView { month, day, week, resizableMonth }

example/lib/extension.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,12 @@ extension StringExt on String {
125125
}
126126

127127
extension ViewNameExt on CalendarView {
128-
String get name => toString().split(".").last;
128+
String get name => switch (this) {
129+
CalendarView.month => 'month',
130+
CalendarView.day => 'day',
131+
CalendarView.week => 'week',
132+
CalendarView.resizableMonth => 'resizableMonth',
133+
};
129134
}
130135

131136
extension BuildContextExtension on BuildContext {

example/lib/l10n/app_ar.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"dayView": "عرض يومي",
77
"weekView": "عرض أسبوعي",
88
"multidayView": "عرض متعدد الأيام",
9+
"resizableMonthView": "عرض شهري قابل للتغيير",
910
"appTitle": "مثال صفحة تقويم فلاتر",
1011
"projectMeetingTitle": "اجتماع المشروع",
1112
"projectMeetingDesc": "اليوم هو اجتماع المشروع.",

example/lib/l10n/app_en.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"dayView": "Day View",
77
"weekView": "Week View",
88
"multidayView": "Multi-Day View",
9+
"resizableMonthView": "Resizable Month View",
910
"appTitle": "Flutter Calendar Page Demo",
1011
"projectMeetingTitle": "Project meeting",
1112
"projectMeetingDesc": "Today is project meeting.",

example/lib/l10n/app_es.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"dayView": "Vista Diaria",
77
"weekView": "Vista Semanal",
88
"multidayView": "Vista de Varios Días",
9+
"resizableMonthView": "Vista Mensual Redimensionable",
910
"appTitle": "Demo de Página de Calendario Flutter",
1011
"projectMeetingTitle": "Reunión del proyecto",
1112
"projectMeetingDesc": "Hoy hay reunión del proyecto.",

example/lib/main.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ class _MyAppState extends State<MyApp> {
5555
multiDayViewTheme: isDarkMode
5656
? MultiDayViewThemeData.dark()
5757
: MultiDayViewThemeData.light(),
58+
resizableMonthViewTheme: isDarkMode
59+
? ResizableMonthViewThemeData.dark()
60+
: ResizableMonthViewThemeData.light(),
5861
),
5962
child: CalendarControllerProvider(
6063
controller: EventController(),

example/lib/pages/mobile/mobile_home_page.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import '../../localization/locale_controller.dart';
55
import '../day_view_page.dart';
66
import '../month_view_page.dart';
77
import '../multi_day_view_page.dart';
8+
import '../resizable_month_view_page.dart';
89
import '../week_view_page.dart';
910

1011
class MobileHomePage extends StatefulWidget {
@@ -107,6 +108,11 @@ class _MobileHomePageState extends State<MobileHomePage> {
107108
child: Text(translate.monthView),
108109
),
109110
SizedBox(height: 20),
111+
ElevatedButton(
112+
onPressed: () => context.pushRoute(ResizableMonthViewPageDemo()),
113+
child: Text(translate.resizableMonthView),
114+
),
115+
SizedBox(height: 20),
110116
ElevatedButton(
111117
onPressed: () => context.pushRoute(DayViewPageDemo()),
112118
child: Text(translate.dayView),
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import 'package:flutter/material.dart';
2+
3+
import '../extension.dart';
4+
import '../widgets/resizable_month_view_widget.dart';
5+
import '../widgets/responsive_widget.dart';
6+
import 'create_event_page.dart';
7+
import 'web/web_home_page.dart';
8+
import '../enumerations.dart';
9+
10+
/// Full-screen demo page for [ResizableMonthViewWidget].
11+
///
12+
/// On mobile it renders a [Scaffold] with an AppBar and a FAB to create
13+
/// events. On web/desktop it delegates to [WebHomePage] with the
14+
/// [CalendarView.resizableMonth] view pre-selected.
15+
class ResizableMonthViewPageDemo extends StatefulWidget {
16+
const ResizableMonthViewPageDemo({super.key});
17+
18+
@override
19+
State<ResizableMonthViewPageDemo> createState() =>
20+
_ResizableMonthViewPageDemoState();
21+
}
22+
23+
class _ResizableMonthViewPageDemoState
24+
extends State<ResizableMonthViewPageDemo> {
25+
@override
26+
Widget build(BuildContext context) {
27+
final appColors = context.appColors;
28+
29+
return ResponsiveWidget(
30+
webWidget: WebHomePage(selectedView: CalendarView.resizableMonth),
31+
mobileWidget: Scaffold(
32+
primary: false,
33+
appBar: AppBar(leading: const SizedBox.shrink()),
34+
floatingActionButton: FloatingActionButton(
35+
heroTag: 'add_event_resizable_month_view',
36+
child: Icon(Icons.add, color: appColors.onPrimary),
37+
elevation: 8,
38+
onPressed: () => context.pushRoute(CreateEventPage()),
39+
),
40+
body: ResizableMonthViewWidget(),
41+
),
42+
);
43+
}
44+
}

0 commit comments

Comments
 (0)