npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@fk6/react-datepicker

v2.1.23

Published

React date picker with Hijri & Gregorian support, theming, localization, and more.

Readme

React Date Picker

npm version npm downloads bundle size license

A modern, fully customizable React Date Picker component with support for both Gregorian and Hijri calendars. It provides multiple views (day, month, year), works in inline or popover mode, supports localization (i18n), and allows complete theming via SCSS variables or CSS custom properties.

Whether you’re building a simple form date field or a complex internationalized app, this library gives you full control over how dates are displayed, selected, highlighted, and styled.

Check out the Documentation or try it in the Live Demo


✨ Features

  • 🔥 Flexible & Customizable Components - Easily tailor every part of the UI using render props, overrides, and CSS variables. You control the logic, layout, and styling—no rigid patterns, just full flexibility.

  • 🕌 Dual Calendar Support - Built-in support for both Gregorian and Hijri (Islamic) calendars.

  • 🌍 Internationalization (i18n) - Localize month names, weekdays, and calendar layout using moment.js locales.
    Supports RTL (Right-to-Left) and LTR directions.

  • 🎨 Theming & Customization - Supporting light & dark modes. Customize colors customize using SCSS or CSS variables without modifying the source code.

  • 📐 Flexible Positioning - Choose from multiple popover positions (top, bottom, start, end, etc.) with automatic viewport adjustments.

  • 📅 Multiple Calendar Views - Switch easily between Day, Month, and Year views with a single prop.

  • 📌 Inline or Popover - modes (attach to an input field)

  • 🚀 Lightweight & Performant - Optimized with React hooks (useMemo, useEffect) and minimal dependencies.

  • 🕒 Date & Time Picker Support - Combine calendar and time picker for full datetime selection.

  • 🔒 Disable Dates - Provide a custom function or array of dates to disable specific days, months, or years.

  • 📆 First Day of Week - Configure which day your calendar starts on (Sunday, Monday, etc.).

  • 🔢 Week Numbers - Optionally display ISO week numbers for better planning.

  • 🖼 Inline or Popover Mode - Use the calendar embedded in your layout or as a dropdown attached to an input field.

  • ⚡ Simple API - Minimal props with sensible defaults, but flexible enough for advanced use cases.

  • 🛠️ Written in TypeScript with full typings


📦 Installation

You can install @fk6/react-datepicker using your favorite package manager:

# Using npm
npm install @fk6/react-datepicker moment moment-hijri

# Using yarn
yarn add @fk6/react-datepicker moment moment-hijri

# Using pnpm
pnpm add @fk6/react-datepicker moment moment-hijri

Peer Dependencies

This package relies on:

  • React +18
  • moment (for Gregorian calendar support)
  • moment-hijri (for Hijri calendar support)

Make sure these are installed in your project.


🚀 Usage

Basic Example

import React, { useState } from "react";
import { DatePicker, DateTimePicker } from "react-date-picker";
import "@fk6/react-datepicker/react-datepicker.css";

export default function App() {
  const [date, setDate] = useState<Date | Moment | null>(null);

  return (
    <div>
      <DatePicker value={date} onChange={setDate} />
      <DateTimePicker value={date} onChange={setDate} />
    </div>
  );
}

Hijri Calendar

Switch to Hijri mode using calendar prop:

<DatePicker calendar="hijri" />

Inline Mode

Render Calendar without field:

import React, { useRef, useState } from "react";
import { Calendar } from "@fk6/react-datepicker";
import moment from "moment";

export default function App() {
  const [value, setValue] = useState(moment());
  const inputRef = useRef<HTMLInputElement>(null);

  return (
    <div>
      <Calendar mode="inline" value={value} onChange={setValue} />
    </div>
  );
}

Localization

This example sets the Moment.js locale to Arabic ("ar") and renders a DatePicker with Arabic localization. It ensures that date formats, calendar labels, and UI elements appear in Arabic, providing a fully localized experience for Arabic-speaking users.

import { useState } from "react";
import { DatePicker } from "@fk6/react-datepicker";

import "@fk6/react-datepicker/react-datepicker.css";
import "moment/locale/ar";

const Example = () => {
  return <DatePicker locale="ar" />;
};

Render Custom Field

Render your own Custom Input:

This DatePicker allow you to render your own custom input component (MyCustomInput) to render the date field. The ref connects the input to the calendar popover, while onOpenRequest enables the calendar to open on click—providing seamless integration between the input field and date selection UI.

<DatePicker
  renderInput={(dateFieldProps) => (
    <MyCustomInput
      readOnly
      ref={dateFieldProps.ref}
      value={dateFieldProps.value}
      onClick={dateFieldProps.onOpenRequest}
    />
  )}
/>

Customize Cells

You can customize how individual cells are rendered in the date and time picker using render props like renderDay, renderMonth, renderYear or renderTimeItem and more. Each render function receives useful context including the formatted renderedValue, the associated date, a props object containing default HTML attributes like className, style, and event handlers, and a state object with metadata such as selected, disabled, focused, etc... This allows you to return custom JSX while preserving or extending the default behavior and styling—perfect for adding icons, conditional formatting, tooltips, or fully personalized UI elements, making it easy to tailor the picker to your design needs. There's an example for customizing days, months, years, time cells

<DateTimePicker
  calendarProps={{
    daysCalendarProps: {
      renderDay: (renderedValue, date, props, state) => (
        <div {...props}>
          {state.selected ? "#" : "*"}
          {renderedValue}
        </div>
      ),
    },
    monthsCalendarProps: {
      renderMonth: (renderedValue, date, props, state) => (
        <div {...props}>
          {state.selected ? "# " : "* "}
          {renderedValue}
          {state.selected ? " #" : " *"}
        </div>
      ),
    },
    yearsCalendarProps: {
      renderYear: (renderedValue, date, props, state) => (
        <div {...props}>
          {state.selected ? ". " : "- "}
          {renderedValue}
          {state.selected ? " ." : " -"}
        </div>
      ),
    },
    timePickerProps: {
      visibleColumns: ["hours"],
      renderTimeItem: (renderedValue, date, props, state) => (
        <div {...props}>{renderedValue}:00</div>
      ),
    },
  }}
/>

Theming

You can override CSS variables in your styles:

:root {
  --fkdp-primary: #4caf50;
  --fkdp-secondary: #977e7e;
  --fkdp-highlight: #5da064cd;
  --fkdp-text: #000000ff;
  --fkdp-light-text: #c6c6c6ff;

  // DateField
  --fkdp-field-bg: #c2e2d0ff;
  --fkdp-field-color: #222;
  --fkdp-field-icon-color: #222;

  // Calendar
  --fkdp-calendar-bg: #c2e2d0ff;
  --fkdp-calendar-highlighted-bg: #459588cd;
  --fkdp-calendar-holiday-bg: #5a3434ff;
}

⚙️ Props

Common Props (Date & Date-Time Picker)

| Prop | Type | Default | Description | | ----------------- | --------------------------------------------------------------- | -------------- | ---------------------------------------------------------------------------------------- | | value | Date \| Moment \| null | null | The currently selected date. | | defaultValue | Date \| Moment \| null | null | Uncontrolled selected date. | | onChange | (date: Date \| null) => void | — | Callback fired when a date is selected. | | minDate | Date \| Moment | "1937-03-14" | The earliest date a user can select. Dates before this are disabled. | | maxDate | Date \| Moment | "2077-10-17" | The latest date a user can select. Dates after this are disabled. | | disabledDates | (Date \| Moment)[] | — | Array of Date objects that should be disabled in the calendar. | | disabledDatesFn | (date: Date) => boolean | — | Function to disable dates dynamically. | | locale | string | "en" | Moment.js locale (e.g. "ar", "ar-sa", "en-gb"). | | format | string | "YYYY/MM/DD" | Specifies the format pattern used to display and interpret dates. | | calendar | gregorian | hijri | "gregorian" | Specifies the calendar system used for date calculations and display. | | anchorEl | HTMLElement \| null | null | When in popover mode, the element to anchor the calendar to. | | closeOnSelect | boolean | true | Determines whether the calendar should close immediately after a date is selected. | | readOnly | boolean | false | Prevents manual input/editing but still allows interaction (e.g. calendar popover). | | disabled | boolean | false | Fully disables the component—no input, no interaction, and typically styled as inactive. | | theme | light | dark | light | Sets the calendar's color scheme to either light or dark mode. | | renderInput | (props: DateFieldExtraProps) => ReactNode | — | A function that receives input props and returns a custom input component. | | renderCalendar | (props: CalendarProps) => ReactNode | — | A function that receives calendar props and returns a custom calendar layout. | | onOpenChange | (open: boolean) => void | — | Called with a boolean value whenever the calendar's visibility changes. | | calendarProps | CalendarProps | — | An object containing props that customize the rendering and behavior of the calendar. | | fieldProps | FieldProps | — | An object containing props that customize the rendering and behavior of the date field. |


Calendar Props

Common Props

| Prop | Type | Default | Description | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | open | boolean | false | Determines whether the calendar or picker is currently visible. | | value | Date \| Moment \| null | null | The currently selected date. | | initialDate | Date \| Moment \| null | null | The date the calendar initially focuses on when rendered. | | onSelect | (date: Date \| null) => void | — | Callback fired when a date is selected. | | disablePortal | boolean | false | If true, renders the calendar/popover inline instead of using a portal. | | enableGoToToday | boolean | — | If true, displays a button that navigates the calendar to today’s date. | | hideFooter | boolean | — | Toggles visibility of the component’s footer. | | disableLocaleDigits | boolean | — | Forces numeric display to use English digits, even in locales like Arabic that default to locale-specific numerals (e.g. Hindi or Arabic-Indic). | | renderGoToToday | (onClick: () => void) => ReactNode | — | A function that returns a custom element for the “Go to Today” button. Receives an onClick handler to trigger the default behavior. | | renderConfirmBtn | (onClick: () => void) => ReactNode | — | A function that returns a custom element for the “OK” button. Receives an onClick handler to trigger the default behavior. | | disabledDatesFn | (date: Date) => boolean | — | Function to disable dates dynamically. | | mode | popover | inline | "popover" | Controls the calendar's display style: as a popover or inline element. | | theme | light | dark | "light" | Sets the calendar's color scheme to either light or dark mode. | | initialView | "day" \| "month" \| "year" | "day" | Determines which view is shown when the calendar first loads. | | views | "day" \| "month" \| "year" | "day" | Specifies which views users can switch between. Must include initialView. | | anchorEl | HTMLElement \| null | null | The DOM element that serves as the anchor point for positioning the calendar. | | position | "top" \| "right" \| "bottom" \| "left" \| "start" \| "end" \| "top-right" \| "top-left" \| "top-start" \| "top-end" \| "bottom-right" \| "bottom-left" \| "bottom-start" \| "bottom-end" | "bottom" | Specifies the calendar's placement relative to the anchor element. | | locale | string | "en" | Moment.js locale (e.g. "ar", "ar-sa", "en-gb"). | | format | string | "YYYY/MM/DD" | Specifies the format pattern used to display and interpret dates. | | calendar | gregorian | hijri | "gregorian" | Specifies the calendar system used for date calculations and display. | | onClose | () => void | — | Callback invoked when the calendar is closed (e.g., clicking outside or selecting a date). | | daysCalendarProps | DaysCalendarProps | — | An object containing props that customize the rendering and behavior of the days calendar view. | | monthsCalendarProps | MonthsCalendarProps | — | An object containing props that customize the rendering and behavior of the months calendar view. | | yearsCalendarProps | YearsCalendarProps | — | An object containing props that customize the rendering and behavior of the years calendar view. | | timePickerProps | TimePickerProps | — | An object containing props that customize the rendering and behavior of the time picker. |


Days Calendar Props

| Prop | Type | Default | Description | | ------------------ | ---------------------------------------------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------- | | firstDayOfWeek | 0-6 | 0 (Sun) | Sets the first day of the week. | | hideOutsideDays | boolean | — | Controls whether days outside the current month are shown in the calendar grid. | | showWeeksNumber | boolean | — | Determines whether to show the week number for each row in the calendar grid. | | highlightDates | (Date \| Moment)[] | — | A list of dates to be visually highlighted in the calendar. | | disabledDates | (Date \| Moment)[] | — | Array of Date objects that should be disabled in the calendar. | | disabledMonths | (Date \| Moment)[] | — | Array of objects specifying which months to disable. | | disabledYears | (Date \| Moment)[] | — | Array of years to disable in the calendar. | | weekends | (Date \| Moment)[] | — | Controls the visibility, styling, or behavior of weekend days in the calendar. | | disableWeekends | boolean | — | Disables selection of weekend days in the calendar. | | renderDay | (renderedValue: string, date: Date, , props: HTMLAttributes<any>, state: DayCellState) => ReactNode | — | A function that returns a custom element for each day cell in the calendar. | | renderWeekNumber | (renderedValue: string, weekNumber: number) => ReactNode | — | A function that returns a custom element for each week number in the calendar. | | disabledDatesFn | (date: Date) => boolean | — | Function to disable dates dynamically. | | onSelect | (date: Date) => void | — | Called when a user clicks a day; receives the clicked date as a Date object. |


Months Calendar Props

| Prop | Type | Default | Description | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------ | | disabledMonths | (Date \| Moment)[] | — | Array of objects specifying which months to disable. | | disabledYears | (Date \| Moment)[] | — | Array of years to disable in the calendar. | | renderMonth | (renderedValue: string, date: Date, props: HTMLAttributes<any>, state: MonthCellState) => ReactNode | — | A function that returns a custom element for each month cell in the calendar. | | disabledDatesFn | (date: Date) => boolean | — | Function to disable dates dynamically. | | onSelect | (date: Date) => void | — | Called when a user clicks a month; receives the clicked date as a Date object. |


Years Calendar Props

| Prop | Type | Default | Description | | ----------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------- | | range | number | 16 | Specifies how many years should be shown in the year picker view. | | disabledYears | (Date \| Moment)[] | — | Array of years to disable in the calendar. | | renderYear | (renderedValue: string, date: Date, props: HTMLAttributes<any>, state: YearCellState) => ReactNode | — | A function that returns a custom element for each year cell in the calendar. | | disabledDatesFn | (date: Date) => boolean | — | Function to disable dates dynamically. | | onSelect | (date: Date) => void | — | Called when a user clicks a year; receives the clicked date as a Date object. |


Time Picker Props

| Prop | Type | Default | Description | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | is12h | boolean | — | Toggles between 12-hour (AM/PM) and 24-hour time formats; set to true for 12-hour display. | | showScrollbars | boolean | — | Determines visibility of scrollbars for hours, minutes, and second. | | selectOnScrolling | boolean | — | Automatically selects the middle value while scrolling hours, minutes, seconds, or meridiem for smoother interaction. | | visibleColumns | ('hours' \| 'minutes' \| 'seconds')[] | — | Specifies which time units to display in the picker; choose any combination of 'hours', 'minutes', and 'seconds'. | | disabledHours | number[] | — | An array of hour values (0–23) that are disabled in the picker, preventing selection of those times. | | disabledMinutes | number[] | — | An array of minutes values (0–59) that are disabled in the picker, preventing selection of those times. | | disabledSeconds | number[] | — | An array of seconds values (0–59) that are disabled in the picker, preventing selection of those times. | | disabledMeridiem | string[] | — | An array of meridiem values (AM - am - ص - PM - pm - م) that are disabled in the picker, preventing selection of those times. | | renderHeaderContent | (props: HTMLAttributes<any>, is12h?: boolean) => ReactNode | — | Custom content to render above the time picker panel (hours, minutes, seconds). Useful for adding titles, instructions, or additional controls. | | . | | renderTimeItem | (renderedValue: string, item: number \| string, props: HTMLAttributes<any>, state: { selected: boolean, disabled: boolean }) => ReactNode | — | A function that returns a custom element for each hour, minute, second and meridiem cell in the timepicker. | | onSelect | (date: Date) => void | — | Called when a user clicks an hour, minute, second, or meridiem; receives the clicked date as a Date object. |


Field Props

| Prop | Type | Default | Description | | ---------------- | --------------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------- | | ref | React.Ref | — | Provides direct access to the date input field, enabling actions like focusing or reading the selected date programmatically. | | value | Date \| Moment \| null | null | The currently selected date. | | defaultValue | Date \| Moment \| null | null | Uncontrolled selected date. | | format | string | "YYYY/MM/DD" | Specifies the format pattern used to display and interpret dates. | | clearable | boolean | true | Enables a UI control to clear the selected date, resetting the input. | | showIcon | boolean | true | Toggles visibility of the calendar icon in the calendar input. | | readOnly | boolean | — | Prevents manual input/editing but still allows interaction (e.g. calendar popover). | | disabled | boolean | — | Fully disables the component—no input, no interaction, and typically styled as inactive. | | htmlInputProps | InputHTMLAttributes<HTMLInputElement> | — | An object containing props that customize the rendering and behavior of the input element. | | renderIcon | (onClick: () => void) => ReactNode | — | A function that returns a custom calendar icon element, replacing the default icon. | | onChange | (date: Date \|null) => void | — | Called when the selected date changes. Receives the new value. | | onInputChange | (date: Date \|null) => void | — | Called whenever the input value changes. Receives the raw string entered. | | onOpenRequest | (e: HTMLElement \| boolean \| null) => void | — | Called when the calendar or popover requests to open. Useful for controlled components. |


🤝 Contributing

I welcome contributions to make this datepicker even better! Whether you're fixing bugs, adding features, improving documentation, or suggesting enhancements—your input matters.

How to Contribute

  1. Fork the repository
  2. Create a new branch

git checkout -b feature/your-feature-name

  1. Make your changes
  2. Test your code
    • Submit a pull request with a clear description of your changes

Guidelines

  • Follow the existing code style and structure
  • Write clear, concise commit messages
  • Include relevant tests for new features or bug fixes
  • Keep PRs focused—one feature or fix per PR

If you're unsure where to start, check out the issues tab for open tasks or feature requests.


License

MIT © Fadi Krdiyeh ↗️. Licensed under MIT license, see LICENSE for the full license.

Don't be shy to visit my Portfolio 😇🤍