11import 'package:flutter/material.dart' ;
2+ import 'package:smart_date_formatter/smart_date_formatter.dart' ;
23import 'package:smart_date_formatter/src/calendar/views/agenda_view.dart' ;
3- import 'calendar_event.dart' ;
4- import 'calendar_controller.dart' ;
54import 'views/month_view.dart' ;
65import 'views/week_view.dart' ;
76import 'views/day_view.dart' ;
@@ -96,6 +95,12 @@ class SmartCalendar extends StatefulWidget {
9695 /// Theme mode for calendar
9796 final ThemeMode themeMode;
9897
98+ /// Enable range selection mode
99+ final bool rangeSelectionMode;
100+
101+ /// Called when range is selected in calendar
102+ final void Function (DateTime start, DateTime end)? onRangeSelected;
103+
99104 /// Custom cell builder for month view dates.
100105 ///
101106 /// ```dart
@@ -155,6 +160,8 @@ class SmartCalendar extends StatefulWidget {
155160 this .showWeekNumbers = false ,
156161 this .themeMode = ThemeMode .light,
157162 this .cellBuilder,
163+ this .rangeSelectionMode = false ,
164+ this .onRangeSelected,
158165 });
159166
160167 @override
@@ -165,6 +172,9 @@ class _SmartCalendarState extends State<SmartCalendar> {
165172 late SmartCalendarController _controller;
166173 late CalendarView _currentView;
167174 bool _ownsController = false ;
175+ DateTime ? _rangeStart;
176+ DateTime ? _rangeEnd;
177+ // bool _selectingRangeStart = true;
168178
169179 @override
170180 void initState () {
@@ -204,6 +214,26 @@ class _SmartCalendarState extends State<SmartCalendar> {
204214 Color get _subtleTextColor =>
205215 _isDark ? Colors .grey.shade400 : Colors .grey.shade600;
206216
217+ // void _handleRangeTap(DateTime date) {
218+ // setState(() {
219+ // if (_selectingRangeStart || _rangeEnd != null) {
220+ // _rangeStart = date;
221+ // _rangeEnd = null;
222+ // _selectingRangeStart = false;
223+ // } else {
224+ // if (date.isBefore(_rangeStart!)) {
225+ // _rangeEnd = _rangeStart;
226+ // _rangeStart = date;
227+ // } else {
228+ // _rangeEnd = date;
229+ // }
230+ // _selectingRangeStart = true;
231+ // widget.onRangeSelected?.call(_rangeStart!, _rangeEnd!);
232+ // }
233+ // _controller.selectDate(date);
234+ // });
235+ // }
236+
207237 @override
208238 void dispose () {
209239 if (_ownsController) _controller.dispose ();
@@ -240,6 +270,40 @@ class _SmartCalendarState extends State<SmartCalendar> {
240270 ),
241271 ],
242272 ),
273+ // After view switcher row
274+ if (widget.rangeSelectionMode) ...[
275+ Container (
276+ margin: const EdgeInsets .only (bottom: 8 ),
277+ padding:
278+ const EdgeInsets .symmetric (horizontal: 12 , vertical: 6 ),
279+ decoration: BoxDecoration (
280+ color: widget.selectedColor.withValues (alpha: 0.08 ),
281+ borderRadius: BorderRadius .circular (8 ),
282+ ),
283+ child: Row (
284+ mainAxisAlignment: MainAxisAlignment .center,
285+ children: [
286+ Icon (Icons .date_range,
287+ size: 14 , color: widget.selectedColor),
288+ const SizedBox (width: 6 ),
289+ Text (
290+ _rangeStart == null
291+ ? 'Tap to select start date'
292+ : _rangeEnd == null
293+ ? 'Tap to select end date'
294+ : '${_rangeStart !.format ('dd MMM' )} → '
295+ '${_rangeEnd !.format ('dd MMM' )} '
296+ '(${_rangeEnd !.daysUntil (_rangeStart !) * -1 + 1 } days)' ,
297+ style: TextStyle (
298+ fontSize: 12 ,
299+ color: widget.selectedColor,
300+ fontWeight: FontWeight .w500,
301+ ),
302+ ),
303+ ],
304+ ),
305+ ),
306+ ],
243307
244308 // Calendar view
245309 _buildCurrentView (),
@@ -343,6 +407,8 @@ class _SmartCalendarState extends State<SmartCalendar> {
343407 showWeekNumbers: widget.showWeekNumbers,
344408 isDark: _isDark,
345409 cellBuilder: widget.cellBuilder,
410+ rangeStart: widget.rangeSelectionMode ? _rangeStart : null , // 👈 new
411+ rangeEnd: widget.rangeSelectionMode ? _rangeEnd : null ,
346412 );
347413 case CalendarView .week:
348414 return WeekView (
0 commit comments