<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abbas</title>
    <description>The latest articles on DEV Community by Abbas (@abbasr7).</description>
    <link>https://dev.to/abbasr7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F849233%2F63519ecc-c0b3-47b6-9281-4aba4e3903ab.jpeg</url>
      <title>DEV Community: Abbas</title>
      <link>https://dev.to/abbasr7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abbasr7"/>
    <language>en</language>
    <item>
      <title>Qeydar DatePicker: A Powerful, Extensible Date &amp; Time Picker for Angular</title>
      <dc:creator>Abbas</dc:creator>
      <pubDate>Thu, 10 Sep 2026 06:30:42 +0000</pubDate>
      <link>https://dev.to/abbasr7/qeydar-datepicker-a-powerful-extensible-date-time-picker-for-angular-4d4h</link>
      <guid>https://dev.to/abbasr7/qeydar-datepicker-a-powerful-extensible-date-time-picker-for-angular-4d4h</guid>
      <description>&lt;p&gt;A modern Angular DatePicker built for real-world applications — from Jalali and Gregorian calendars to completely custom calendar systems.&lt;/p&gt;

&lt;p&gt;Building a date picker sounds simple.&lt;/p&gt;

&lt;p&gt;Until your application needs to support multiple calendars, RTL layouts, date ranges, time selection, custom validation, disabled dates, mobile behavior, custom UI, and a design system that doesn't look anything like the default calendar.&lt;/p&gt;

&lt;p&gt;That is where things get complicated.&lt;/p&gt;

&lt;p&gt;I originally started building Qeydar Datepicker around two years ago to solve these kinds of real-world requirements. Since then, it has grown from a simple Angular date picker into a much more complete and extensible date and time picking solution.&lt;/p&gt;

&lt;p&gt;A few days ago, I released Qeydar Datepicker v3, with support for Angular 21+, bringing the project up to date with the latest Angular ecosystem.&lt;/p&gt;

&lt;p&gt;But the Angular upgrade is only part of the story.&lt;/p&gt;

&lt;p&gt;The real goal behind Qeydar is to build a date picker that doesn't force you to adapt your application to the component.&lt;/p&gt;

&lt;p&gt;Instead, the component adapts to your application.&lt;/p&gt;

&lt;p&gt;What is Qeydar Datepicker?&lt;/p&gt;

&lt;p&gt;Qeydar Datepicker is an Angular date and time picker designed with flexibility and extensibility in mind.&lt;/p&gt;

&lt;p&gt;It provides two main components:&lt;/p&gt;

&lt;p&gt;QeydarDatePicker&lt;br&gt;
QeydarTimePicker&lt;/p&gt;

&lt;p&gt;Out of the box, the DatePicker supports Gregorian and Jalali (Persian) calendars, single-date selection, range selection, date + time selection, RTL, localization, validation, disabled dates, keyboard navigation, responsive behavior, and more.&lt;/p&gt;

&lt;p&gt;But one of the most important design decisions in Qeydar is that the calendar system isn't tightly coupled to the UI.&lt;/p&gt;

&lt;p&gt;This is where Date Adapters come in.&lt;/p&gt;

&lt;p&gt;One DatePicker, Multiple Calendar Systems&lt;/p&gt;

&lt;p&gt;Different applications use different calendar systems.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Gregorian&lt;br&gt;
Jalali / Persian&lt;br&gt;
Hijri&lt;br&gt;
Chinese&lt;br&gt;
Indian calendars&lt;br&gt;
Other regional or domain-specific calendars&lt;/p&gt;

&lt;p&gt;Trying to implement every possible calendar directly inside a DatePicker quickly becomes difficult to maintain.&lt;/p&gt;

&lt;p&gt;Instead, Qeydar uses an adapter-based architecture.&lt;/p&gt;

&lt;p&gt;The DatePicker works with a DateAdapter, which is responsible for calendar-specific operations such as parsing, formatting, creating dates, navigating months and years, determining the number of days in a month, and comparing dates.&lt;/p&gt;

&lt;p&gt;The built-in implementation already provides Gregorian and Jalali support.&lt;/p&gt;

&lt;p&gt;But the architecture doesn't stop there.&lt;/p&gt;

&lt;p&gt;You can implement your own adapter and plug it into the same DatePicker without rewriting the picker itself. The project documentation even includes a complete example of a custom Hijri adapter.&lt;/p&gt;

&lt;p&gt;Conceptually, it looks like this:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            Qeydar DatePicker
                   │
                   ▼
              DateAdapter
             /     |      \
            /      |       \
    Gregorian    Jalali    Custom
                          /     \
                       Hijri   Chinese
                               Indian
                               ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This means the UI, range selection, validation, disabled dates, navigation and other picker features can remain the same while the underlying calendar system changes.&lt;/p&gt;

&lt;p&gt;That is a fundamentally different approach from building a separate DatePicker for every calendar.&lt;/p&gt;

&lt;p&gt;Want to support another calendar?&lt;/p&gt;

&lt;p&gt;Implement the adapter.&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;The rest of the DatePicker doesn't need to know how that calendar works internally.&lt;/p&gt;

&lt;p&gt;The UI Doesn't Have to Look Like a DatePicker&lt;/p&gt;

&lt;p&gt;This is probably one of my favorite parts of Qeydar.&lt;/p&gt;

&lt;p&gt;Most date picker libraries let you change colors, spacing and a few CSS variables.&lt;/p&gt;

&lt;p&gt;But eventually you hit a wall.&lt;/p&gt;

&lt;p&gt;What happens when your design requires a completely different calendar UI?&lt;/p&gt;

&lt;p&gt;What if you want:&lt;/p&gt;

&lt;p&gt;event indicators on dates&lt;br&gt;
special holiday styling&lt;br&gt;
custom day badges&lt;br&gt;
a completely different header&lt;br&gt;
custom navigation&lt;br&gt;
custom footer actions&lt;br&gt;
quick range buttons&lt;br&gt;
a wheel-style date picker&lt;br&gt;
a completely custom calendar body&lt;/p&gt;

&lt;p&gt;Qeydar was designed to handle that.&lt;/p&gt;

&lt;p&gt;Custom Templates&lt;/p&gt;

&lt;p&gt;The qeydarTemplate directive allows you to replace individual parts of the DatePicker while keeping its underlying functionality.&lt;/p&gt;

&lt;p&gt;You can customize:&lt;/p&gt;

&lt;p&gt;day&lt;br&gt;
month&lt;br&gt;
year&lt;br&gt;
toolbar&lt;br&gt;
header&lt;br&gt;
footer&lt;br&gt;
body&lt;/p&gt;

&lt;p&gt;The most important part is that you don't lose the DatePicker's behavior when doing this.&lt;/p&gt;

&lt;p&gt;You can replace the visual representation while keeping things such as:&lt;/p&gt;

&lt;p&gt;date selection&lt;br&gt;
range selection&lt;br&gt;
validation&lt;br&gt;
disabled dates&lt;br&gt;
form integration&lt;br&gt;
the DatePicker state&lt;br&gt;
navigation logic&lt;/p&gt;

&lt;p&gt;The project documentation exposes typed template contexts containing useful state such as isSelected, isInRange, isRangeStart, isRangeEnd, isToday, isDisabled, and more.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&amp;lt;qeydar-date-picker&lt;br&gt;
  [(ngModel)]="selectedDate"&lt;br&gt;
  [calendarType]="'jalali'"&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;lt;ng-template&lt;br&gt;
    qeydarTemplate="day"&lt;br&gt;
    let-day&lt;br&gt;
    let-isSelected="isSelected"&lt;br&gt;
    let-isToday="isToday"&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div
  class="my-day"
  [class.selected]="isSelected"
  [class.today]="isToday"
&amp;gt;
  {{ day.getDate() }}
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;/blockquote&gt;

&lt;p&gt;You are not limited to changing a day cell either.&lt;/p&gt;

&lt;p&gt;You can take control over an entire region:&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
  &amp;lt;button&lt;br&gt;
    type="button"&lt;br&gt;
    (click)="ctx.prev()"&lt;br&gt;
    [disabled]="ctx.prevDisabled"&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Previous
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;br&gt;
    {{ ctx.currentMonthName }} {{ ctx.currentYear }}&lt;br&gt;
  &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;lt;button&lt;br&gt;
    type="button"&lt;br&gt;
    (click)="ctx.next()"&lt;br&gt;
    [disabled]="ctx.nextDisabled"&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Next
&lt;/code&gt;&lt;/pre&gt;



&lt;/blockquote&gt;

&lt;p&gt;And there is an even more powerful option:&lt;/p&gt;

&lt;p&gt;Fully custom calendar bodies&lt;/p&gt;

&lt;p&gt;The body template acts as an escape hatch.&lt;/p&gt;

&lt;p&gt;You can completely replace the built-in day/month/year grids and render your own UI while still using Qeydar's state and actions.&lt;/p&gt;

&lt;p&gt;That opens the door to completely different experiences, such as wheel pickers, custom scheduling interfaces, booking calendars, event calendars, or highly specialized enterprise designs.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;Qeydar doesn't force you to use a specific calendar design.&lt;/p&gt;

&lt;p&gt;Single Date, Range, or Date + Time&lt;/p&gt;

&lt;p&gt;Real applications rarely need only a basic date input.&lt;/p&gt;

&lt;p&gt;Qeydar supports:&lt;/p&gt;

&lt;p&gt;Single-date selection&lt;br&gt;
&amp;lt;qeydar-date-picker&lt;br&gt;
  [(ngModel)]="selectedDate"&lt;br&gt;
  [calendarType]="'jalali'"&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;br&gt;
Date ranges&lt;br&gt;

  [(ngModel)]="dateRange"&lt;br&gt;
  [isRange]="true"&lt;br&gt;
  [calendarType]="'jalali'"&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;The range API is flexible enough to work with Date objects, strings, or mixed values.&lt;/p&gt;

&lt;p&gt;Date + Time&lt;/p&gt;

&lt;p&gt;You can also combine date and time selection:&lt;/p&gt;

&lt;p&gt;&amp;lt;qeydar-date-picker&lt;br&gt;
  [(ngModel)]="selectedDateTime"&lt;br&gt;
  [format]="'yyyy/MM/dd HH:mm:ss'"&lt;br&gt;
  [showTimePicker]="true"&lt;br&gt;
  [timeDisplayFormat]="'HH:mm'"&lt;/p&gt;

&lt;blockquote&gt;

&lt;/blockquote&gt;

&lt;p&gt;And when you only need time selection, there is a dedicated:&lt;/p&gt;



&lt;p&gt;The TimePicker supports both 12/24-hour formats, optional seconds, time restrictions, input masking, inline mode, disabled-time filtering and modal presentation.&lt;/p&gt;

&lt;p&gt;Built for Real Applications&lt;/p&gt;

&lt;p&gt;A date picker becomes useful when it solves the problems that appear around dates.&lt;/p&gt;

&lt;p&gt;Qeydar includes functionality such as:&lt;/p&gt;

&lt;p&gt;Gregorian and Jalali calendars&lt;br&gt;
single-date selection&lt;br&gt;
range selection&lt;br&gt;
date + time selection&lt;br&gt;
12/24-hour time selection&lt;br&gt;
min/max date restrictions&lt;br&gt;
disabled dates&lt;br&gt;
custom disabled-date filters&lt;br&gt;
disabled time filters&lt;br&gt;
RTL support&lt;br&gt;
English/Persian localization&lt;br&gt;
keyboard navigation&lt;br&gt;
Angular form integration&lt;br&gt;
customizable formatting&lt;br&gt;
multiple popup placements&lt;br&gt;
inline mode&lt;br&gt;
read-only modes&lt;br&gt;
responsive behavior&lt;br&gt;
custom templates&lt;br&gt;
modal presentation&lt;/p&gt;

&lt;p&gt;These features are all part of the current package rather than requiring a collection of separate plugins.&lt;/p&gt;

&lt;p&gt;Popover or Modal?&lt;/p&gt;

&lt;p&gt;Another feature that became important as Qeydar evolved was presentation mode.&lt;/p&gt;

&lt;p&gt;Sometimes a date picker should behave like a traditional dropdown.&lt;/p&gt;

&lt;p&gt;Sometimes, especially on mobile or in complex workflows, a modal experience makes much more sense.&lt;/p&gt;

&lt;p&gt;Qeydar supports both:&lt;/p&gt;

&lt;p&gt;&amp;lt;qeydar-date-picker&lt;br&gt;
  [(ngModel)]="value"&lt;br&gt;
  [presentation]="'modal'"&lt;/p&gt;

&lt;blockquote&gt;

&lt;/blockquote&gt;

&lt;p&gt;The modal implementation uses Angular CDK Overlay and supports features such as:&lt;/p&gt;

&lt;p&gt;backdrop&lt;br&gt;
focus trapping&lt;br&gt;
Escape-to-close&lt;br&gt;
backdrop-to-close&lt;br&gt;
focus restoration&lt;br&gt;
animations&lt;br&gt;
mobile bottom-sheet behavior&lt;/p&gt;

&lt;p&gt;And importantly, the modal mode doesn't create a completely different DatePicker implementation.&lt;/p&gt;

&lt;p&gt;It uses the same picker functionality, meaning features such as range selection, custom templates, validation and disabled dates continue to work.&lt;/p&gt;

&lt;p&gt;Customization Without Fighting the Library&lt;/p&gt;

&lt;p&gt;One of the main principles behind Qeydar is:&lt;/p&gt;

&lt;p&gt;Customization should be a first-class feature, not a hack.&lt;/p&gt;

&lt;p&gt;There is a big difference between:&lt;/p&gt;

&lt;p&gt;"Here are 10 CSS variables. Good luck."&lt;/p&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;p&gt;"Here is the component state. Build the UI you need."&lt;/p&gt;

&lt;p&gt;Qeydar tries to follow the second philosophy.&lt;/p&gt;

&lt;p&gt;The combination of:&lt;/p&gt;

&lt;p&gt;DateAdapter + Templates + Context + Picker State&lt;/p&gt;

&lt;p&gt;makes it possible to build experiences that would normally require forking a date picker library.&lt;/p&gt;

&lt;p&gt;A Small API, A Lot of Possibilities&lt;/p&gt;

&lt;p&gt;A basic integration can be extremely simple:&lt;/p&gt;

&lt;p&gt;npm install @qeydar/datepicker&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;import { QeydarDatePickerModule } from '@qeydar/datepicker';&lt;/p&gt;

&lt;p&gt;@NgModule({&lt;br&gt;
  imports: [&lt;br&gt;
    QeydarDatePickerModule&lt;br&gt;
  ]&lt;br&gt;
})&lt;br&gt;
export class AppModule {}&lt;/p&gt;

&lt;p&gt;And:&lt;/p&gt;

&lt;p&gt;&amp;lt;qeydar-date-picker&lt;br&gt;
  [(ngModel)]="selectedDate"&lt;br&gt;
  [calendarType]="'jalali'"&lt;/p&gt;

&lt;blockquote&gt;

&lt;/blockquote&gt;

&lt;p&gt;The current 3.x line targets Angular 21+. The package also maintains version lines for older Angular versions, with the repository documenting the compatibility history.&lt;/p&gt;

&lt;p&gt;[Screenshots / Demo Section]&lt;/p&gt;

&lt;p&gt;📸 Screenshot 1 — Gregorian DatePicker&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8nn0c5vrm0gguf9eswl7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8nn0c5vrm0gguf9eswl7.jpg" alt=" " width="800" height="728"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Show the basic Gregorian picker and its clean default UI here.&lt;/p&gt;

&lt;p&gt;📸 Screenshot 2 — Jalali / Persian DatePicker&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbz0p0pln3tk6ss9utfiq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbz0p0pln3tk6ss9utfiq.png" alt=" " width="681" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Show the Jalali calendar, preferably together with RTL mode.&lt;/p&gt;

&lt;p&gt;📸 Screenshot 3 — Range Picker&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F14khdeho3swffl86htes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F14khdeho3swffl86htes.png" alt=" " width="799" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Show start/end selection and an active date range.&lt;/p&gt;

&lt;p&gt;📸 Screenshot 4 — Date + Time Picker&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fakgateg9j0f8jgikuv24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fakgateg9j0f8jgikuv24.png" alt=" " width="762" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqhba86uewkv5xcp2soy0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqhba86uewkv5xcp2soy0.png" alt=" " width="378" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fizqh5n65wz3pa7f8lj3r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fizqh5n65wz3pa7f8lj3r.png" alt=" " width="515" height="698"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu5dhbvckylyyn0849hm5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu5dhbvckylyyn0849hm5.png" alt=" " width="746" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs4erwc7etuaarbt0i6bp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs4erwc7etuaarbt0i6bp.png" alt=" " width="605" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why I Built It This Way&lt;/p&gt;

&lt;p&gt;There are already many DatePicker libraries for Angular.&lt;/p&gt;

&lt;p&gt;So the goal was never to create "yet another date picker."&lt;/p&gt;

&lt;p&gt;The goal was to solve a different problem:&lt;/p&gt;

&lt;p&gt;What happens when your application's requirements don't fit the assumptions made by a DatePicker library?&lt;/p&gt;

&lt;p&gt;Maybe the application uses a non-Gregorian calendar.&lt;/p&gt;

&lt;p&gt;Maybe the designer wants a completely custom calendar.&lt;/p&gt;

&lt;p&gt;Maybe the product needs both desktop popovers and mobile sheets.&lt;/p&gt;

&lt;p&gt;Maybe dates have events, holidays, statuses or domain-specific metadata.&lt;/p&gt;

&lt;p&gt;Maybe the application needs a range picker with custom workflows.&lt;/p&gt;

&lt;p&gt;Instead of adding dozens of flags to support every possible use case, Qeydar tries to provide the building blocks needed to create those experiences.&lt;/p&gt;

&lt;p&gt;From a Two-Year-Old Project to Angular 21+&lt;/p&gt;

&lt;p&gt;Qeydar started roughly two years ago.&lt;/p&gt;

&lt;p&gt;Since then, it has evolved considerably.&lt;/p&gt;

&lt;p&gt;The latest major milestone is version 3.0.0, released with support for Angular 21+.&lt;/p&gt;

&lt;p&gt;For me, updating the package wasn't just about changing the Angular version.&lt;/p&gt;

&lt;p&gt;It was an opportunity to revisit the architecture, improve extensibility, document advanced features, and make the project much more useful for applications that need more than a basic date input.&lt;/p&gt;

&lt;p&gt;And this is only the beginning.&lt;/p&gt;

&lt;p&gt;Who Is Qeydar For?&lt;/p&gt;

&lt;p&gt;Qeydar can be useful for projects that need more than a simple calendar popup.&lt;/p&gt;

&lt;p&gt;Especially:&lt;/p&gt;

&lt;p&gt;Enterprise Angular applications&lt;/p&gt;

&lt;p&gt;where complex date workflows, forms, ranges and custom business rules are common.&lt;/p&gt;

&lt;p&gt;Persian / Middle Eastern applications&lt;/p&gt;

&lt;p&gt;where Jalali calendars, RTL and localized date handling are important.&lt;/p&gt;

&lt;p&gt;International applications&lt;/p&gt;

&lt;p&gt;that need flexibility around calendar systems.&lt;/p&gt;

&lt;p&gt;Design-heavy applications&lt;/p&gt;

&lt;p&gt;where the default look and behavior of a DatePicker isn't enough.&lt;/p&gt;

&lt;p&gt;Applications with domain-specific calendars&lt;/p&gt;

&lt;p&gt;where a custom DateAdapter can provide the required calendar logic without rewriting the entire picker.&lt;/p&gt;

&lt;p&gt;The Bigger Idea&lt;/p&gt;

&lt;p&gt;A DatePicker shouldn't own your application's calendar logic.&lt;/p&gt;

&lt;p&gt;It should provide an interface for interacting with dates.&lt;/p&gt;

&lt;p&gt;That's why Qeydar separates the problem into different layers:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Your Application
                   │
                   ▼
              Qeydar UI
                   │
        ┌──────────┴──────────┐
        ▼                     ▼
    Templates              State
        │                     │
        └──────────┬──────────┘
                   ▼
              DateAdapter
                   │
      ┌────────────┼────────────┐
      ▼            ▼            ▼
  Gregorian      Jalali       Custom
                              Calendar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This architecture makes the component much more adaptable than a calendar that assumes one specific date system or one specific UI.&lt;/p&gt;

&lt;p&gt;Try Qeydar&lt;/p&gt;

&lt;p&gt;The project is open source and available on GitHub and npm.&lt;/p&gt;

&lt;p&gt;GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Abbasr7/qeydar-datepicker" rel="noopener noreferrer"&gt;https://github.com/Abbasr7/qeydar-datepicker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;npm&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@qeydar/datepicker" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@qeydar/datepicker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live Demo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://qeydar-datepicker-git-master-abbasr7s-projects.vercel.app/" rel="noopener noreferrer"&gt;https://qeydar-datepicker-git-master-abbasr7s-projects.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install it with:&lt;/p&gt;

&lt;p&gt;npm install @qeydar/datepicker&lt;br&gt;
Final Thoughts&lt;/p&gt;

&lt;p&gt;I built Qeydar because dates are rarely as simple as they look.&lt;/p&gt;

&lt;p&gt;A production application may need a different calendar, a different UI, a different interaction model, or all of them at the same time.&lt;/p&gt;

&lt;p&gt;So instead of trying to build one perfect DatePicker UI for everyone, I wanted to build a DatePicker that can become whatever the application needs it to be.&lt;/p&gt;

&lt;p&gt;From a straightforward Gregorian date field to a Jalali range picker, from a date + time selector to a completely custom calendar interface — the same core component can handle all of them.&lt;/p&gt;

&lt;p&gt;And with the adapter architecture, supporting another calendar doesn't necessarily mean rebuilding the DatePicker.&lt;/p&gt;

&lt;p&gt;Build the adapter.&lt;br&gt;
Customize the UI.&lt;br&gt;
Keep the core functionality.&lt;/p&gt;

&lt;p&gt;That's the idea behind Qeydar.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>datepicker</category>
      <category>opensource</category>
      <category>persiancalendar</category>
    </item>
  </channel>
</rss>
