chronova_picker 1.0.1
chronova_picker: ^1.0.1 copied to clipboard
A premium, highly customizable date & time picker system for Flutter with a shared selection engine across all picker modes.
chronova_picker #
A premium, highly customizable Date & Time Picker system for Flutter, built around a single shared selection engine reused across every picker mode and presentation surface.
Status: MVP (v1.0.1). See Whats included below for exact scope.
Screenshots #
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Features #
- Single date picker (calendar + wheel styles)
- Date range picker (calendar style, tap-tap range selection)
- Time picker (analog clock + wheel styles, 12-hour display)
- Dialog, bottom sheet, inline, and adaptive presentation
- Light / dark / seed-based (
ColorScheme.fromSeed) theming - Constraint engine: minimum/maximum date, disabled dates, custom selectable-date callback, minimum/maximum range duration
- Simple static API for common cases, full parameter set for advanced ones
- Zero third-party runtime dependencies
- Calendar, range, and time logic are pure Dart and unit tested independent of any widget harness
Installation #
Point at the local path while developing, or publish to pub.dev and use the usual version constraint:
dependencies:
chronova_picker:
path: ../chronova_picker # or a pub.dev version once published
Then:
import "package:chronova_picker/chronova_picker.dart";
Basic usage #
final date = await ChronovaPicker.pickDate(context: context);
final range = await ChronovaPicker.pickDateRange(context: context);
final time = await ChronovaPicker.pickTime(context: context);
Each method returns null if the user cancels.
Advanced usage #
final result = await ChronovaPicker.pickDateRange(
context: context,
initialStart: DateTime.now(),
minimumDate: DateTime.now(),
maximumDate: DateTime(2030),
minimumDuration: const Duration(days: 1),
maximumDuration: const Duration(days: 30),
presentation: ChronovaPresentation.adaptive,
theme: ChronovaThemeData.fromSeed(seedColor: Colors.blue),
);
Date picker styles #
ChronovaPicker.pickDate(
context: context,
style: ChronovaDatePickerStyle.wheel, // or .calendar
);
Time picker styles #
ChronovaPicker.pickTime(
context: context,
style: ChronovaTimePickerStyle.wheel, // or .clock
minuteInterval: 15,
);
Presentation modes #
ChronovaPresentation.dialog // modal dialog
ChronovaPresentation.bottomSheet // modal bottom sheet
ChronovaPresentation.adaptive // bottom sheet on narrow screens, dialog on wide screens
ChronovaPresentation.inline // no modal surface — embed the widget directly, see below
popover currently falls back to dialog (true desktop popover positioning
is planned post-MVP — see Known limitations).
Inline (embedded) usage #
For inline presentation, embed the picker widget directly instead of calling
the async pickX methods:
ChronovaTheme(
data: ChronovaThemeData.fromSeed(seedColor: Colors.blue),
child: ChronovaDatePicker(
showActions: false,
onChanged: (ChronovaDateResult result) {
// handle result.date
},
),
)
Themes #
ChronovaThemeData.light();
ChronovaThemeData.dark();
ChronovaThemeData.fromSeed(seedColor: Colors.blue, brightness: Brightness.dark);
Theming is grouped by concern rather than exposed as a flat list of
properties: colors, typography, calendar, time, button.
final theme = ChronovaThemeData.fromSeed(seedColor: Colors.teal).copyWith(
calendar: const ChronovaCalendarThemeData(dayCellSize: 44),
);
Constraints #
ChronovaPicker.pickDate(
context: context,
minimumDate: DateTime.now(),
maximumDate: DateTime(2030),
disabledDate: (date) => date.weekday == DateTime.saturday || date.weekday == DateTime.sunday,
);
Every constraint check flows through ChronovaConstraintValidator, which
returns a structured ChronovaValidationResult (not just a boolean) so UI
can explain why a date was rejected.
Accessibility #
- Every day cell, clock face, wheel item, and button carries an explicit
Semanticslabel. - Minimum tap target sizing on interactive calendar cells.
- Selected/disabled/today states are exposed as semantic properties, not just color.
Keyboard navigation (arrow keys, tab order, escape-to-close) and full reduced-motion support are on the roadmap — see below.
Platform support #
Built entirely on Flutter/Material primitives (CustomPainter,
ListWheelScrollView, Overlay-free dialogs/sheets) — no platform channels,
so it should run anywhere Flutter does: Android, iOS, Web, macOS, Windows,
Linux. Desktop-specific polish (hover states, two-month layouts, true
popover positioning) is still on the roadmap.
Whats included in this MVP #
- Picker modes:
date,dateRange,time dateTime,dateTimeRange, andtimeRangemodels exist (ChronovaDateTimeResult, etc.) but do not yet have dedicated composed picker widgets- Presentations:
dialog,bottomSheet,inline,adaptive(popoverfalls back todialog) - Date styles:
calendar,wheel(compactnot yet implemented) - Time styles:
clock,wheel(digitalnot yet implemented) - English only; localization abstraction is not yet built
- No haptics, no
ChronovaPickerController, no built-in presets yet
Known limitations #
- No
ChronovaPickerControlleryet — pickers are used directly viaonChanged/onConfirmcallbacks - No preset system yet (Today / Last 7 Days / etc.)
- No true desktop popover positioning (falls back to dialog)
- No RTL verification pass yet, though
Row/Paddingusage avoids most hardcoded directional assumptions - No keyboard navigation yet
- Golden/visual regression tests not yet set up
Contributing #
This is an early-stage package built incrementally. Please open an issue
before large PRs so the architecture (core -> engine -> theme ->
widgets -> pickers -> presentation -> public API, one-directional)
stays consistent. In particular: code under lib/src/engine/ must never
import Flutter UI classes.
License #
MIT — see LICENSE.







