kurdish_date_picker 1.2.0
kurdish_date_picker: ^1.2.0 copied to clipboard
A professional, highly customizable Kurdish-first Date Picker and Calendar widget for Flutter with full Kurdish Sorani support, RTL layout, Kurdish day/month names and Kurdish numerals. Supports singl [...]
🇮🇶 kurdish_date_picker
A professional, highly customizable Kurdish-first Date Picker and Calendar for Flutter.
Full Sorani Kurdish support · RTL · Kurdish numerals · Single / Range / Multiple selection · Material 3 · Light & Dark
kurdish_date_picker is a genuine, reusable Kurdish Date Picker built from scratch for
Flutter — not a wrapper around Flutter's default showDatePicker. It gives Kurdish
developers and Kurdish-language applications a first-class date-selection experience with
proper RTL layout, Kurdish Sorani day and month names, Kurdish numerals, and a
modern, customizable UI.
Screenshots (coming soon)
Light mode Dark mode TODO: add screenshot TODO: add screenshot
✨ Features #
- 🇮🇶 Kurdish Sorani first-class localization (RTL, weekday/month names)
- 🔢 Kurdish numerals (
٢٠٢٦), plus Latin - 📅 Single, range, and multiple date selection
- 🗓 Dialog APIs:
showKurdishDatePicker,showKurdishDateRangePicker,showKurdishDateMultiPicker - 🌗 Light and dark mode with seamless
ThemeDataintegration - 🎨 Full theming (
KurdishDatePickerTheme) - 📛 Date restricting:
firstDate,lastDate,disabledDates,selectableDayPredicate - 📌 Weekend configuration and styling
- 🗒 Today button
- 🗂 Month and Year pickers
- ⌨️ Date input field with localized parsing
- 📆 Calendar events with indicators, hover tooltips and "+N" overflow
- 🕐 Configurable week start (
weekStart) - 🎮
KurdishCalendarControllerfor programmatic navigation/selection - ☪️ Hijri (Islamic) date conversion (
KurdishHijriDate) - 📐 Responsive sizing that is proportional across all screens
- 📱 Responsive across phone/tablet/desktop/web
- ♿ Accessibility (Semantics, keyboard, focus)
- 🎞 Optional animations
- 🧱 Material 3 ready, no deprecated APIs
- 🔒 Offline-first, zero unnecessary dependencies
🚀 Installation #
Add the dependency to your pubspec.yaml:
dependencies:
kurdish_date_picker: ^1.2.0
Then run:
flutter pub get
📖 Basic Usage #
Drop a KurdishDatePicker anywhere in your widget tree:
import 'package:flutter/material.dart';
import 'package:kurdish_date_picker/kurdish_date_picker.dart';
class MyScreen extends StatelessWidget {
const MyScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: KurdishDatePicker(
initialDate: DateTime.now(),
firstDate: DateTime(1900),
lastDate: DateTime(2100),
locale: KurdishLocale.sorani, // Kurdish Sorani
numberSystem: NumberSystem.kurdish, // ٢٠٢٦ style numerals
selectionMode: DateSelectionMode.single,
showTodayButton: true, // ئەمڕۆ
onDateSelected: (date) {
print('Selected: $date');
},
),
),
);
}
}
📱 Dialog API #
Just like Flutter's showDatePicker, the package provides convenient dialog helpers:
Single date #
final date = await showKurdishDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(1900),
lastDate: DateTime(2100),
locale: KurdishLocale.sorani,
numberSystem: NumberSystem.kurdish,
);
Date range #
final range = await showKurdishDateRangePicker(
context: context,
initialDate: DateTime.now(),
);
if (range != null) {
print('Start: ${range.start}');
print('End: ${range.end}');
}
Multiple dates #
final dates = await showKurdishDateMultiPicker(
context: context,
initialDate: DateTime.now(),
);
if (dates != null) {
print('Selected ${dates.length} dates');
}
🗓 Range Picker (inline) #
KurdishDatePicker(
locale: KurdishLocale.sorani,
numberSystem: NumberSystem.kurdish,
selectionMode: DateSelectionMode.range,
onRangeSelected: (start, end) {
print('$start → $end');
},
)
🔢 Kurdish Numerals #
Convert any number or date string to Kurdish or Latin digits. The Kurdish UI
uses the Arabic-Indic digit set (٠١٢٣٤٥٦٧٨٩), matching Kurdish typographic
conventions.
import 'package:kurdish_date_picker/kurdish_date_picker.dart';
KurdishNumberFormatter.toKurdish(2026); // "٢٠٢٦"
KurdishNumberFormatter.toArabic(2026); // "٢٠٢٦"
KurdishNumberFormatter.toLatin(2026); // "2026"
KurdishNumberFormatter.toLatinString('٢١٢'); // "212"
// Pick the numeral system used in the UI:
KurdishDatePicker(
numberSystem: NumberSystem.kurdish,
// or numberSystem: NumberSystem.arabic,
// or numberSystem: NumberSystem.latin,
)
🗣 Localization #
The primary locale is Sorani Kurdish. Kurmanji, Arabic, and English are built in and share the same architecture.
KurdishDatePicker(
locale: KurdishLocale.sorani, // primary
// locale: KurdishLocale.kurmanji,
// locale: KurdishLocale.arabic,
// locale: KurdishLocale.english,
)
- All month/weekday names and UI strings come from a dedicated localization layer (never hard-coded in widgets).
- Kurdish locales are RTL by default; you can force direction with
textDirection.
KurdishDatePicker(
locale: KurdishLocale.sorani,
textDirection: TextDirection.rtl, // locked to RTL
)
Navigation arrows automatically flip in RTL.
🗒 "Today" Button #
KurdishDatePicker(
showTodayButton: true,
todayText: 'ئەمڕۆ', // optional custom text
)
🚫 Date Restrictions #
KurdishDatePicker(
firstDate: DateTime(2020),
lastDate: DateTime(2030),
disabledDates: [
DateTime(2026, 9, 10),
DateTime(2026, 9, 15),
],
selectableDayPredicate: (date) {
// Example: disable Fridays.
return date.weekday != DateTime.friday;
},
)
Weekend styling can be configured via weekendDays:
KurdishDatePicker(
weekendDays: { DateTime.friday },
)
📆 Calendar Events #
Display optional event indicators under dates (fully optional). Multiple events can share the same day; hovering (desktop) or long-pressing (touch) shows a tooltip listing every event title, and more than three events collapse into a compact "+N" indicator.
final events = [
KurdishCalendarEvent(
date: DateTime(2026, 9, 3),
title: 'چاوپێکەوتن', // "Meeting"
),
KurdishCalendarEvent(
date: DateTime(2026, 9, 3),
title: 'نانی نیوەڕۆ', // "Lunch"
),
];
KurdishDatePicker(
events: events,
onDateSelected: (date) {},
)
🕐 Week Start #
Choose which weekday begins each row. Accepts a DateTime.weekday value
(1 = Monday ... 7 = Sunday). Works on the widget, the calendar, and every dialog.
KurdishDatePicker(
weekStart: DateTime.saturday, // weekends-first Kurdish layout
onDateSelected: (date) {},
)
📐 Responsive Sizing #
The picker scales proportionally to the available screen: cells, header and
typography grow on tablets/desktops and shrink on small phones, so it fits every
display. Enable it on KurdishDatePicker, KurdishCalendar, the dialog show*
functions, or via the theme.
KurdishDatePicker(
responsive: true, // auto-scale to the screen
onDateSelected: (date) {},
)
// Optionally force a fixed multiplier (0.7 - 1.5).
KurdishDatePicker(
responsive: true,
scaleFactor: 1.1,
onDateSelected: (date) {},
)
// Or via the theme:
KurdishDatePicker(
themeData: const KurdishDatePickerTheme(
responsive: true,
),
onDateSelected: (date) {},
)
🎮 Calendar Controller #
Use KurdishCalendarController to drive the calendar programmatically, e.g. from
buttons outside the widget tree.
final controller = KurdishCalendarController();
KurdishDatePicker(
controller: controller,
onDateSelected: (date) {},
);
// Later, from anywhere:
controller.nextMonth();
controller.previousMonth();
controller.goToDate(DateTime(2027, 1, 1));
controller.goToToday();
controller.selectDate(DateTime(2026, 12, 25));
controller.clear();
The controller is a
ChangeNotifier. Callcontroller.dispose()when you are done with it (e.g. in aState.dispose).
☪️ Hijri (Islamic) Dates #
Convert between Gregorian and the arithmetic ("tabular") Hijri calendar:
final hijri = KurdishHijriDate.fromGregorian(DateTime(2026, 9, 3));
print(hijri.toGregorian()); // back to the original date
print(hijri.year); // Hijri year
print(hijri.month); // Hijri month (1-12)
print(hijri.day); // Hijri day (1-30)
// Localized, numeral-aware formatting:
final localization = KurdishDateFormatter.localization(KurdishLocale.sorani);
final text = hijri.format(
monthName: localization.hijriMonthNames[hijri.month - 1],
formatInt: (v) => KurdishNumberFormatter.toSystem(v, NumberSystem.kurdish),
);
// Or use the formatter directly:
KurdishDateFormatter.formatHijri(
DateTime(2026, 9, 3),
locale: KurdishLocale.sorani,
numberSystem: NumberSystem.kurdish,
);
🧸 Theme System #
Customize nearly everything with KurdishDatePickerTheme. Unspecified values fall back to
the ambient ThemeData so light/dark work automatically.
KurdishDatePicker(
themeData: const KurdishDatePickerTheme(
selectedColor: Colors.blue,
todayColor: Colors.green,
weekendColor: Colors.red,
borderRadius: BorderRadius.all(Radius.circular(16)),
headerColor: Colors.deepPurple,
headerTextColor: Colors.white,
),
)
Available theme fields:
| Field | Description |
|---|---|
selectedColor |
Selected day background |
todayColor |
Today highlight |
weekendColor |
Weekend labels |
disabledColor |
Disabled dates |
textColor |
Default text |
headerColor / headerTextColor |
Calendar header |
backgroundColor |
Calendar background |
borderRadius |
Corner radius |
textTheme |
Typography |
cellSize / headerHeight |
Sizing |
spacing |
Grid spacing |
elevation |
Dialog elevation |
eventColor |
Event indicator color |
responsive |
Scale proportionally to screen size |
scaleFactor |
Manual responsive scale multiplier |
rangeStartColor / rangeEndColor / rangeInBetweenColor |
Range band colors |
🌗 Light & Dark Mode #
The picker integrates with ThemeData directly — no extra work needed.
MaterialApp(
theme: ThemeData(useMaterial3: true, brightness: Brightness.light),
darkTheme: ThemeData(useMaterial3: true, brightness: Brightness.dark),
themeMode: ThemeMode.system,
)
📅 Date Formatting #
import 'package:kurdish_date_picker/kurdish_date_picker.dart';
KurdishDateFormatter.format(
DateTime(2026, 9, 3),
locale: KurdishLocale.sorani,
numberSystem: NumberSystem.kurdish,
);
// "٣ ئەیلوول ٢٠٢٦"
KurdishDateFormatter.formatNumeric(DateTime(2026, 6, 15));
// "١٥/٠٦/٢٠٢٦"
💬 Date Input Field #
An optional text field that accepts and formats Kurdish dates.
KurdishDateInput(
locale: KurdishLocale.sorani,
numberSystem: NumberSystem.kurdish,
initialDate: DateTime.now(),
onDateChanged: (date) {
// `date` is null whenever the input is invalid or incomplete.
},
onSubmitted: (date) {
print(date);
},
)
🗂 Month & Year Pickers #
// Month picker
KurdishMonthPicker(
locale: KurdishLocale.sorani,
year: 2026,
selectedMonth: 9,
onMonthSelected: (month) {},
)
// Year picker
KurdishYearPicker(
firstYear: 2000,
lastYear: 2030,
selectedYear: 2026,
onYearSelected: (year) {},
)
🧱 API Reference #
| Widget / Function | Description |
|---|---|
KurdishDatePicker |
Main embeddable picker widget |
KurdishCalendar |
Lower-level month calendar widget |
KurdishMonthPicker |
Standalone month grid picker |
KurdishYearPicker |
Standalone year grid picker |
KurdishDateInput |
Kurdish date text field |
showKurdishDatePicker |
Single date dialog |
showKurdishDateRangePicker |
Range dialog |
showKurdishDateMultiPicker |
Multiple date dialog |
KurdishDateFormatter |
Formatting helpers |
KurdishNumberFormatter |
Numeral conversion helpers |
KurdishDatePickerTheme |
Theme configuration |
KurdishCalendarEvent |
Event model |
KurdishHijriDate |
Hijri (Islamic) date conversion model |
KurdishCalendarController |
Programmatic navigation/selection controller |
KurdishDateRange |
Immutable date range model |
KurdishLocale |
Supported locales |
DateSelectionMode |
single | range | multiple |
NumberSystem |
latin | arabic | kurdish |
📦 Dependencies #
The package keeps runtime dependencies to an absolute minimum:
| Package | Reason |
|---|---|
intl |
Standard, offline pub.dev package used for robust locale-aware pattern formatting |
Everything else is implemented with pure Dart/Flutter.
🤝 Contributing #
Please read CONTRIBUTING.md to learn how to report bugs, submit translations, or open pull requests.
📜 License #
Proprietary License — Copyright © Nashwan Taha Nheli. All rights reserved.
This package is not open-source and is NOT distributed under the MIT License. See LICENSE for the full terms.
❓ FAQ #
Why not just translate Flutter's showDatePicker?
This package is a genuine calendar/date-picker UI system built from scratch with
Kurdish-first localization (RTL, numerals, names). It is not a wrapper.
Does it convert dates to a Kurdish calendar?
Internally it uses Gregorian DateTime. There is also a built-in Hijri
(Islamic) calendar converter (KurdishHijriDate and
KurdishDateFormatter.toHijri/formatHijri) for displaying lunar dates.
Does it require internet? No. It is fully offline-first.
What Flutter version do I need? Flutter 3.10+ and Dart 3.0+.
Developed with ❤️ for the Kurdish developer community.
Nashwan Taha Nheli