aryan-date-picker 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,250 @@
1
+ # Aryan Date Picker
2
+
3
+ A lightweight React date picker component library with calendar-aware localization adapters.
4
+
5
+ ## Installation
6
+
7
+ ```sh
8
+ pnpm add aryan-date-picker
9
+ ```
10
+
11
+ ## Basic usage
12
+
13
+ ```tsx
14
+ import { useState } from 'react';
15
+ import { DatePicker } from 'aryan-date-picker';
16
+ import 'aryan-date-picker/styles.css';
17
+
18
+ export function App() {
19
+ const [selectedDate, setSelectedDate] = useState<Date | null>(null);
20
+
21
+ return <DatePicker value={selectedDate} onChange={setSelectedDate} />;
22
+ }
23
+ ```
24
+
25
+
26
+ ## Controlled and uncontrolled values
27
+
28
+ `DatePicker` and `DateRangePicker` support the standard React controlled component pattern. Pass `value` and `onChange` when the selected value should be owned by your application state.
29
+
30
+ ```tsx
31
+ import { useState } from 'react';
32
+ import { DatePicker, DateRangePicker, type DateRangeValue } from 'aryan-date-picker';
33
+
34
+ export function ControlledExample() {
35
+ const [selectedDate, setSelectedDate] = useState<Date | null>(null);
36
+ const [selectedRange, setSelectedRange] = useState<DateRangeValue | null>(null);
37
+
38
+ return (
39
+ <>
40
+ <DatePicker value={selectedDate} onChange={setSelectedDate} />
41
+ <DateRangePicker value={selectedRange} onChange={setSelectedRange} />
42
+ </>
43
+ );
44
+ }
45
+ ```
46
+
47
+ For lightweight usage, omit `value` and optionally provide `defaultValue` to let the component manage its own selected value.
48
+
49
+ ```tsx
50
+ <DatePicker defaultValue={new Date()} />
51
+ <DateRangePicker defaultValue={{ startDate: new Date(), endDate: null }} />
52
+ ```
53
+
54
+ ## Date constraints
55
+
56
+ Use `minDate` and `maxDate` on either picker to limit selectable dates and calendar navigation. Dates outside the range are rendered as disabled, cannot be selected, and navigation arrows stop at the first/last month that can contain valid dates.
57
+
58
+ ```tsx
59
+ const minDate = new Date(2026, 6, 10);
60
+ const maxDate = new Date(2026, 8, 20);
61
+
62
+ <DatePicker minDate={minDate} maxDate={maxDate} />
63
+ <DateRangePicker minDate={minDate} maxDate={maxDate} />
64
+ ```
65
+
66
+ The constraint logic is adapter-driven, so custom calendar adapters decide whether a date is disabled and whether a month transition is allowed. If `minDate` or `maxDate` falls inside the visible month, only the out-of-range days in that month are disabled.
67
+
68
+ ## DateRangePicker view modes
69
+
70
+ `DateRangePicker` supports two mobile presentation strategies through `viewMode`:
71
+
72
+ - `"infinite"` (default) keeps the existing mobile behavior by rendering a continuous multi-month stack.
73
+ - `"single"` renders one mobile month at a time with previous/next arrow navigation.
74
+
75
+ Desktop keeps the two-calendar range layout in both modes.
76
+
77
+ ```tsx
78
+ <DateRangePicker viewMode="infinite" />
79
+ <DateRangePicker viewMode="single" minDate={minDate} maxDate={maxDate} />
80
+ ```
81
+
82
+ Both modes reuse the same adapter-based month generation and range selection logic, so `renderDay`, disabled days, and boundary-aware navigation behave consistently.
83
+
84
+ ## Custom day rendering
85
+
86
+ Use `renderDay` on either `DatePicker` or `DateRangePicker` to customize the visual contents of each calendar day. The picker still owns selection, range calculation, disabled state, focus behavior, and accessibility attributes; your renderer receives the already-computed state and returns only the content to display inside the safe day-cell container.
87
+
88
+ ```tsx
89
+ import { DatePicker, type CalendarRenderDayProps } from 'aryan-date-picker';
90
+
91
+ const prices: Record<string, number> = {
92
+ '2026-07-14': 129,
93
+ };
94
+
95
+ function BookingDay(day: CalendarRenderDayProps) {
96
+ const price = prices[day.date.toISOString().slice(0, 10)];
97
+
98
+ return (
99
+ <span className={day.isSelected ? 'selected-booking-day' : undefined}>
100
+ <span>{day.label}</span>
101
+ {price ? <small>${price}</small> : null}
102
+ </span>
103
+ );
104
+ }
105
+
106
+ export function BookingCalendar() {
107
+ return <DatePicker renderDay={BookingDay} />;
108
+ }
109
+ ```
110
+
111
+ The same prop is available on `DateRangePicker`, including both desktop calendars and the mobile multi-month layout.
112
+
113
+ ## Why the localization layer exists
114
+
115
+ Date pickers need more than translated labels. Different calendars can have different years, month boundaries, month lengths, leap-year rules, weekday ordering, formatting, navigation behavior, and layout direction. Aryan Date Picker keeps those responsibilities behind a `CalendarAdapter` so `DatePicker`, `DateRangePicker`, and `Calendar` can stay calendar-agnostic.
116
+
117
+ The public value model remains standard JavaScript `Date`. Adapters interpret and render those `Date` instances in a calendar system, but consumers continue passing and receiving `Date` objects without a breaking API change.
118
+
119
+ ## LocalizationProvider
120
+
121
+ `LocalizationProvider` places a calendar adapter in React context. Components below the provider use that adapter for formatting, month grids, navigation, comparisons, and direction.
122
+
123
+ ```tsx
124
+ import {
125
+ DatePicker,
126
+ LocalizationProvider,
127
+ createGregorianCalendarAdapter,
128
+ } from 'aryan-date-picker';
129
+
130
+ const gregorianAdapter = createGregorianCalendarAdapter({ locale: 'en-US' });
131
+
132
+ export function GregorianExample() {
133
+ return (
134
+ <LocalizationProvider adapter={gregorianAdapter}>
135
+ <DatePicker />
136
+ </LocalizationProvider>
137
+ );
138
+ }
139
+ ```
140
+
141
+ If no adapter is provided, the library uses the default Gregorian adapter.
142
+
143
+ ## Switching calendars
144
+
145
+ Switch calendars by swapping the adapter; the picker values remain JavaScript `Date` instances.
146
+
147
+ ```tsx
148
+ import {
149
+ DatePicker,
150
+ DateRangePicker,
151
+ LocalizationProvider,
152
+ createGregorianCalendarAdapter,
153
+ jalaliCalendarAdapter,
154
+ } from 'aryan-date-picker';
155
+
156
+ const gregorianAdapter = createGregorianCalendarAdapter({ locale: 'en-US' });
157
+
158
+ export function CalendarSwitchingExample() {
159
+ return (
160
+ <>
161
+ <LocalizationProvider adapter={gregorianAdapter}>
162
+ <DatePicker />
163
+ <DateRangePicker />
164
+ </LocalizationProvider>
165
+
166
+ <LocalizationProvider adapter={jalaliCalendarAdapter}>
167
+ <DatePicker />
168
+ <DateRangePicker />
169
+ </LocalizationProvider>
170
+ </>
171
+ );
172
+ }
173
+ ```
174
+
175
+ ## Jalali calendar
176
+
177
+ The Jalali adapter renders actual Jalali calendar structure: Persian month names, weekday labels, Jalali month grids, Jalali month arithmetic, start/end of month, formatting, and leap-year-aware Esfand length. It exposes `direction: 'rtl'`, so existing direction support is applied automatically.
178
+
179
+ ```tsx
180
+ import { DatePicker, LocalizationProvider, createJalaliCalendarAdapter } from 'aryan-date-picker';
181
+
182
+ const jalaliAdapter = createJalaliCalendarAdapter();
183
+
184
+ export function JalaliExample() {
185
+ return (
186
+ <LocalizationProvider adapter={jalaliAdapter}>
187
+ <DatePicker />
188
+ </LocalizationProvider>
189
+ );
190
+ }
191
+ ```
192
+
193
+ Parsing and labels use Jalali dates, but selected values are still JavaScript `Date` objects:
194
+
195
+ ```tsx
196
+ const adapter = createJalaliCalendarAdapter();
197
+ const date: Date | null = adapter.parseDate('1403-12-30');
198
+ ```
199
+
200
+ ## Building custom adapters
201
+
202
+ Implement the `CalendarAdapter` interface and pass it to `LocalizationProvider`.
203
+
204
+ A custom adapter owns:
205
+
206
+ - calendar interpretation of JavaScript `Date` values
207
+ - month names and weekday labels
208
+ - month grid generation
209
+ - `startOfMonth`, `endOfMonth`, and `addMonths`
210
+ - day/month comparisons
211
+ - date formatting and parsing
212
+ - min/max constraint helpers for disabled days and allowed month navigation
213
+ - layout direction (`'ltr'` or `'rtl'`)
214
+
215
+ ```tsx
216
+ import type { CalendarAdapter } from 'aryan-date-picker';
217
+ import { LocalizationProvider, DatePicker } from 'aryan-date-picker';
218
+
219
+ const customAdapter: CalendarAdapter = {
220
+ // Implement the full adapter contract for your calendar system.
221
+ };
222
+
223
+ export function CustomCalendarExample() {
224
+ return (
225
+ <LocalizationProvider adapter={customAdapter}>
226
+ <DatePicker />
227
+ </LocalizationProvider>
228
+ );
229
+ }
230
+ ```
231
+
232
+ ## Workspace
233
+
234
+ This repository is a minimal pnpm workspace:
235
+
236
+ - `packages/date-picker` contains the publishable library.
237
+ - `playground` contains a local Vite + React + TypeScript development app.
238
+
239
+ ## Development
240
+
241
+ ```sh
242
+ pnpm install
243
+ pnpm dev
244
+ ```
245
+
246
+ ## Build
247
+
248
+ ```sh
249
+ pnpm build
250
+ ```
package/dist/index.css CHANGED
@@ -1 +1 @@
1
- .adp-picker,.adp-date-picker,.adp-date-picker *{box-sizing:border-box}.adp-picker{display:inline-flex;flex-direction:column;gap:.75rem;font:inherit;color:#111827}.adp-date-picker{width:18rem;display:inline-flex;flex-direction:column;gap:.5rem;padding:.75rem;border:1px solid #d1d5db;border-radius:.75rem;background:#fff}.adp-calendar-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.adp-calendar-header-centered{justify-content:center}.adp-month-label{font-weight:600}.adp-nav-button,.adp-day{border:0;font:inherit;cursor:pointer}.adp-nav-button{width:2rem;height:2rem;border-radius:999px;background:#f3f4f6;color:#111827}.adp-range-calendars{display:flex;align-items:center;gap:.5rem}.adp-range-calendar-surface{display:flex;align-items:stretch}.adp-range-calendar-surface .adp-date-picker{border-radius:0}.adp-range-calendar-surface .adp-date-picker:first-child{border-start-start-radius:.75rem;border-end-start-radius:.75rem}.adp-range-calendar-surface .adp-date-picker:last-child{margin-inline-start:-1px;border-start-end-radius:.75rem;border-end-end-radius:.75rem}.adp-range-nav-button{flex:0 0 auto}.adp-nav-button:hover,.adp-day:not(.adp-day-placeholder):hover{background:#e5e7eb}.adp-calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:.25rem}.adp-weekdays{margin-top:.25rem}.adp-weekday{color:#6b7280;font-size:.75rem;font-weight:600;text-align:center}.adp-day{min-width:2rem;height:2rem;border-radius:999px;background:transparent;color:#111827}.adp-day-placeholder{cursor:default;pointer-events:none}.adp-day-in-range{border-radius:.25rem;background:#dbeafe}.adp-day-selected,.adp-day-range-start,.adp-day-range-end{background:#2563eb;color:#fff}.adp-day-selected:hover,.adp-day-range-start:hover,.adp-day-range-end:hover{background:#1d4ed8}.adp-selection-label{color:#4b5563;font-size:.875rem}.adp-range-calendars-mobile{display:none}@media(max-width:640px){.adp-picker{width:100%}.adp-date-picker{width:100%;padding:.5rem;border-radius:.5rem}.adp-day{width:100%;min-width:0;height:2.5rem}.adp-range-calendars-desktop{display:none}.adp-range-calendars-mobile{display:flex;width:100%;flex-direction:column;gap:0}.adp-range-calendars-mobile .adp-date-picker{border-radius:0}.adp-range-calendars-mobile .adp-date-picker+.adp-date-picker{margin-top:-1px}.adp-range-calendars-mobile .adp-date-picker:first-child{border-start-start-radius:.5rem;border-start-end-radius:.5rem}.adp-range-calendars-mobile .adp-date-picker:last-child{border-end-start-radius:.5rem;border-end-end-radius:.5rem}}
1
+ .adp-picker,.adp-date-picker,.adp-date-picker *{box-sizing:border-box}.adp-picker{display:inline-flex;flex-direction:column;gap:.75rem;font:inherit;color:#111827}.adp-date-picker{width:18rem;display:inline-flex;flex-direction:column;gap:.5rem;padding:.75rem;border:1px solid #d1d5db;border-radius:.75rem;background:#fff}.adp-calendar-header{display:grid;grid-template-columns:2rem minmax(0,1fr) 2rem;align-items:center;gap:.5rem}.adp-calendar-header-centered{display:flex;justify-content:center}.adp-calendar-header-spacer{width:2rem;height:2rem}.adp-month-label{min-width:0;font-weight:600;text-align:center}.adp-nav-button,.adp-day{border:0;font:inherit;cursor:pointer}.adp-nav-button{width:2rem;height:2rem;border-radius:999px;background:#f3f4f6;color:#111827}.adp-range-calendars{display:flex;align-items:center;gap:.5rem}.adp-range-calendar-surface{display:flex;align-items:stretch}.adp-range-calendar-surface .adp-date-picker{border-radius:0}.adp-range-calendar-surface .adp-date-picker:first-child{border-start-start-radius:.75rem;border-end-start-radius:.75rem}.adp-range-calendar-surface .adp-date-picker:last-child{margin-inline-start:-1px;border-start-end-radius:.75rem;border-end-end-radius:.75rem}.adp-range-nav-button{flex:0 0 auto}.adp-nav-button:not(:disabled):hover,.adp-day:not(.adp-day-placeholder):not(:disabled):hover{background:#e5e7eb}.adp-nav-button:disabled,.adp-day:disabled{cursor:not-allowed;opacity:.45}.adp-calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:.25rem}.adp-weekdays{margin-top:.25rem}.adp-weekday{color:#6b7280;font-size:.75rem;font-weight:600;text-align:center}.adp-day{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;height:auto;aspect-ratio:1;border-radius:999px;background:transparent;color:#111827}.adp-day-placeholder{cursor:default;pointer-events:none}.adp-day-disabled{color:#9ca3af}.adp-day-in-range{border-radius:.25rem;background:#dbeafe}.adp-day-selected,.adp-day-range-start,.adp-day-range-end{background:#2563eb;color:#fff}.adp-day-selected:hover,.adp-day-range-start:hover,.adp-day-range-end:hover{background:#1d4ed8}.adp-selection-label{color:#4b5563;font-size:.875rem}.adp-range-calendars-mobile{display:none}@media(max-width:640px){.adp-picker{width:100%}.adp-date-picker{width:100%;padding:.5rem;border-radius:.5rem}.adp-range-calendars-desktop{display:none}.adp-range-calendars-mobile{display:flex;width:100%;flex-direction:column;gap:0}.adp-range-calendars-mobile .adp-date-picker{border-radius:0}.adp-range-calendars-mobile .adp-date-picker+.adp-date-picker{margin-top:-1px}.adp-range-calendars-mobile .adp-date-picker:first-child{border-start-start-radius:.5rem;border-start-end-radius:.5rem}.adp-range-calendars-mobile .adp-date-picker:last-child{border-end-start-radius:.5rem;border-end-end-radius:.5rem}}
package/dist/index.d.mts CHANGED
@@ -1,12 +1,41 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
 
4
+ type CalendarDayState = {
5
+ selected?: boolean;
6
+ inRange?: boolean;
7
+ rangeStart?: boolean;
8
+ rangeEnd?: boolean;
9
+ };
10
+ type CalendarRenderDayProps = {
11
+ date: Date;
12
+ isToday: boolean;
13
+ isSelected: boolean;
14
+ isInRange: boolean;
15
+ isRangeStart: boolean;
16
+ isRangeEnd: boolean;
17
+ isOutsideMonth: boolean;
18
+ isDisabled: boolean;
19
+ label: string;
20
+ onClick: () => void;
21
+ onMouseEnter?: () => void;
22
+ onFocus?: () => void;
23
+ tabIndex: number;
24
+ role: 'gridcell';
25
+ 'aria-selected': boolean;
26
+ 'aria-disabled': boolean;
27
+ };
28
+ type RenderCalendarDay = (dayProps: CalendarRenderDayProps) => ReactNode;
29
+
4
30
  type DatePickerProps = {
5
31
  value?: Date | null;
6
32
  defaultValue?: Date | null;
7
33
  onChange?: (date: Date | null) => void;
34
+ renderDay?: RenderCalendarDay;
35
+ minDate?: Date;
36
+ maxDate?: Date;
8
37
  };
9
- declare function DatePicker({ value, defaultValue, onChange }?: DatePickerProps): react.JSX.Element;
38
+ declare function DatePicker({ value, defaultValue, onChange, renderDay, minDate, maxDate }?: DatePickerProps): react.JSX.Element;
10
39
 
11
40
  type LayoutDirection = 'ltr' | 'rtl';
12
41
  type CalendarDay = {
@@ -33,6 +62,10 @@ type CalendarAdapter = {
33
62
  getWeekdayLabels: () => string[];
34
63
  createCalendarMonth: (month: Date) => CalendarDay[];
35
64
  createMonthSequence: (startMonth: Date, count: number) => Date[];
65
+ isDateDisabled: (date: Date, minDate?: Date | null, maxDate?: Date | null) => boolean;
66
+ canNavigateToMonth: (month: Date, visibleMonthCount?: number, minDate?: Date | null, maxDate?: Date | null) => boolean;
67
+ canNavigateMonth: (month: Date, amount: number, visibleMonthCount?: number, minDate?: Date | null, maxDate?: Date | null) => boolean;
68
+ constrainMonth: (month: Date, visibleMonthCount?: number, minDate?: Date | null, maxDate?: Date | null) => Date;
36
69
  parseDate: (value: string) => Date | null;
37
70
  };
38
71
  type GregorianCalendarAdapterOptions = {
@@ -58,8 +91,12 @@ type DateRangePickerProps = {
58
91
  value?: DateRangeValue | null;
59
92
  defaultValue?: DateRangeValue | null;
60
93
  onChange?: (range: DateRangeValue | null) => void;
94
+ renderDay?: RenderCalendarDay;
95
+ minDate?: Date;
96
+ maxDate?: Date;
97
+ viewMode?: 'infinite' | 'single';
61
98
  };
62
- declare function DateRangePicker({ value, defaultValue, onChange }?: DateRangePickerProps): react.JSX.Element;
99
+ declare function DateRangePicker({ value, defaultValue, onChange, renderDay, minDate, maxDate, viewMode }?: DateRangePickerProps): react.JSX.Element;
63
100
 
64
101
  type JalaliCalendarAdapterOptions = {
65
102
  locale?: string | string[];
@@ -69,4 +106,4 @@ type JalaliCalendarAdapterOptions = {
69
106
  declare function createJalaliCalendarAdapter(options?: JalaliCalendarAdapterOptions): CalendarAdapter;
70
107
  declare const jalaliCalendarAdapter: CalendarAdapter;
71
108
 
72
- export { type CalendarAdapter, type CalendarDay, DatePicker, type DatePickerProps, DateRangePicker, type DateRangePickerProps, type DateRangeValue, type GregorianCalendarAdapterOptions, type JalaliCalendarAdapterOptions, type LayoutDirection, LocalizationProvider, type LocalizationProviderProps, createGregorianCalendarAdapter, createJalaliCalendarAdapter, defaultCalendarAdapter, jalaliCalendarAdapter, useCalendarAdapter };
109
+ export { type CalendarAdapter, type CalendarDay, type CalendarDayState, type CalendarRenderDayProps, DatePicker, type DatePickerProps, DateRangePicker, type DateRangePickerProps, type DateRangeValue, type GregorianCalendarAdapterOptions, type JalaliCalendarAdapterOptions, type LayoutDirection, LocalizationProvider, type LocalizationProviderProps, type RenderCalendarDay, createGregorianCalendarAdapter, createJalaliCalendarAdapter, defaultCalendarAdapter, jalaliCalendarAdapter, useCalendarAdapter };
package/dist/index.d.ts CHANGED
@@ -1,12 +1,41 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
 
4
+ type CalendarDayState = {
5
+ selected?: boolean;
6
+ inRange?: boolean;
7
+ rangeStart?: boolean;
8
+ rangeEnd?: boolean;
9
+ };
10
+ type CalendarRenderDayProps = {
11
+ date: Date;
12
+ isToday: boolean;
13
+ isSelected: boolean;
14
+ isInRange: boolean;
15
+ isRangeStart: boolean;
16
+ isRangeEnd: boolean;
17
+ isOutsideMonth: boolean;
18
+ isDisabled: boolean;
19
+ label: string;
20
+ onClick: () => void;
21
+ onMouseEnter?: () => void;
22
+ onFocus?: () => void;
23
+ tabIndex: number;
24
+ role: 'gridcell';
25
+ 'aria-selected': boolean;
26
+ 'aria-disabled': boolean;
27
+ };
28
+ type RenderCalendarDay = (dayProps: CalendarRenderDayProps) => ReactNode;
29
+
4
30
  type DatePickerProps = {
5
31
  value?: Date | null;
6
32
  defaultValue?: Date | null;
7
33
  onChange?: (date: Date | null) => void;
34
+ renderDay?: RenderCalendarDay;
35
+ minDate?: Date;
36
+ maxDate?: Date;
8
37
  };
9
- declare function DatePicker({ value, defaultValue, onChange }?: DatePickerProps): react.JSX.Element;
38
+ declare function DatePicker({ value, defaultValue, onChange, renderDay, minDate, maxDate }?: DatePickerProps): react.JSX.Element;
10
39
 
11
40
  type LayoutDirection = 'ltr' | 'rtl';
12
41
  type CalendarDay = {
@@ -33,6 +62,10 @@ type CalendarAdapter = {
33
62
  getWeekdayLabels: () => string[];
34
63
  createCalendarMonth: (month: Date) => CalendarDay[];
35
64
  createMonthSequence: (startMonth: Date, count: number) => Date[];
65
+ isDateDisabled: (date: Date, minDate?: Date | null, maxDate?: Date | null) => boolean;
66
+ canNavigateToMonth: (month: Date, visibleMonthCount?: number, minDate?: Date | null, maxDate?: Date | null) => boolean;
67
+ canNavigateMonth: (month: Date, amount: number, visibleMonthCount?: number, minDate?: Date | null, maxDate?: Date | null) => boolean;
68
+ constrainMonth: (month: Date, visibleMonthCount?: number, minDate?: Date | null, maxDate?: Date | null) => Date;
36
69
  parseDate: (value: string) => Date | null;
37
70
  };
38
71
  type GregorianCalendarAdapterOptions = {
@@ -58,8 +91,12 @@ type DateRangePickerProps = {
58
91
  value?: DateRangeValue | null;
59
92
  defaultValue?: DateRangeValue | null;
60
93
  onChange?: (range: DateRangeValue | null) => void;
94
+ renderDay?: RenderCalendarDay;
95
+ minDate?: Date;
96
+ maxDate?: Date;
97
+ viewMode?: 'infinite' | 'single';
61
98
  };
62
- declare function DateRangePicker({ value, defaultValue, onChange }?: DateRangePickerProps): react.JSX.Element;
99
+ declare function DateRangePicker({ value, defaultValue, onChange, renderDay, minDate, maxDate, viewMode }?: DateRangePickerProps): react.JSX.Element;
63
100
 
64
101
  type JalaliCalendarAdapterOptions = {
65
102
  locale?: string | string[];
@@ -69,4 +106,4 @@ type JalaliCalendarAdapterOptions = {
69
106
  declare function createJalaliCalendarAdapter(options?: JalaliCalendarAdapterOptions): CalendarAdapter;
70
107
  declare const jalaliCalendarAdapter: CalendarAdapter;
71
108
 
72
- export { type CalendarAdapter, type CalendarDay, DatePicker, type DatePickerProps, DateRangePicker, type DateRangePickerProps, type DateRangeValue, type GregorianCalendarAdapterOptions, type JalaliCalendarAdapterOptions, type LayoutDirection, LocalizationProvider, type LocalizationProviderProps, createGregorianCalendarAdapter, createJalaliCalendarAdapter, defaultCalendarAdapter, jalaliCalendarAdapter, useCalendarAdapter };
109
+ export { type CalendarAdapter, type CalendarDay, type CalendarDayState, type CalendarRenderDayProps, DatePicker, type DatePickerProps, DateRangePicker, type DateRangePickerProps, type DateRangeValue, type GregorianCalendarAdapterOptions, type JalaliCalendarAdapterOptions, type LayoutDirection, LocalizationProvider, type LocalizationProviderProps, type RenderCalendarDay, createGregorianCalendarAdapter, createJalaliCalendarAdapter, defaultCalendarAdapter, jalaliCalendarAdapter, useCalendarAdapter };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');var $=new Set(["ar","fa","he","ur"]);function B(t,r){if(r)return r;let n=(Array.isArray(t)?t[0]:t)?.split("-")[0]?.toLowerCase();return n&&$.has(n)?"rtl":"ltr"}function G(t=0){return (t%7+7)%7}function K(t){let r=Array.isArray(t)?t[0]:t;try{let s=Intl.Locale,n=s?new s(r):null,c=n?.weekInfo?.firstDay??n?.getWeekInfo?.().firstDay;if(typeof c=="number")return c%7}catch{}return 0}function A(t={}){let{locale:r,direction:s}=t,n=G(t.firstDayOfWeek??K(r)),c=B(r,s),d=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()),o={locale:r,direction:c,today:()=>new Date,startOfDay:d,startOfMonth:e=>new Date(e.getFullYear(),e.getMonth(),1),endOfMonth:e=>new Date(e.getFullYear(),e.getMonth()+1,0),addMonths:(e,a)=>new Date(e.getFullYear(),e.getMonth()+a,1),isBeforeDay:(e,a)=>d(e).getTime()<d(a).getTime(),isSameDay:(e,a)=>!e||!a?false:d(e).getTime()===d(a).getTime(),isSameMonth:(e,a)=>e.getFullYear()===a.getFullYear()&&e.getMonth()===a.getMonth(),isBetweenDays:(e,a,l)=>{if(!a||!l)return false;let i=d(e).getTime();return i>d(a).getTime()&&i<d(l).getTime()},formatInputDate:e=>{if(!e)return "";let a=e.getFullYear(),l=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0");return `${a}-${l}-${i}`},formatMonthLabel:e=>e.toLocaleDateString(r,{month:"long",year:"numeric"}),formatDayOfMonth:e=>String(e.getDate()),getDateKey:e=>o.formatInputDate(e),getWeekdayLabels:()=>Array.from({length:7},(e,a)=>{let l=(n+a)%7;return new Date(2024,0,7+l).toLocaleDateString(r,{weekday:"short"})}),createCalendarMonth:e=>{let a=o.startOfMonth(e),l=(a.getDay()-n+7)%7,i=new Date(a.getFullYear(),a.getMonth(),a.getDate()-l);return Array.from({length:42},(p,g)=>{let y=new Date(i.getFullYear(),i.getMonth(),i.getDate()+g);return {date:y,day:o.formatDayOfMonth(y),isCurrentMonth:o.isSameMonth(y,a)}})},createMonthSequence:(e,a)=>Array.from({length:a},(l,i)=>o.addMonths(e,i)),parseDate:e=>{let a=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!a)return null;let[,l,i,p]=a,g=new Date(Number(l),Number(i)-1,Number(p));return Number.isNaN(g.getTime())||g.getFullYear()!==Number(l)||g.getMonth()!==Number(i)-1||g.getDate()!==Number(p)?null:g}};return o}var M=A(),P=react.createContext(M);function q({adapter:t,children:r,locale:s,direction:n,firstDayOfWeek:c}){let d=react.useMemo(()=>t??A({locale:s,direction:n,firstDayOfWeek:c}),[t,n,c,s]);return jsxRuntime.jsx(P.Provider,{value:d,children:r})}function h(){return react.useContext(P)}function k({month:t,onMonthChange:r,onDateSelect:s,getDayState:n,showNavigation:c=true}){let d=h(),o=d.createCalendarMonth(t),e=d.getWeekdayLabels();return jsxRuntime.jsxs("div",{className:"adp-date-picker",dir:d.direction,children:[jsxRuntime.jsxs("div",{className:`adp-calendar-header${c?"":" adp-calendar-header-centered"}`,children:[c?jsxRuntime.jsx("button",{type:"button",className:"adp-nav-button",onClick:()=>r(d.addMonths(t,-1)),"aria-label":"Previous month",children:"\u2039"}):null,jsxRuntime.jsx("div",{className:"adp-month-label",children:d.formatMonthLabel(t)}),c?jsxRuntime.jsx("button",{type:"button",className:"adp-nav-button",onClick:()=>r(d.addMonths(t,1)),"aria-label":"Next month",children:"\u203A"}):null]}),jsxRuntime.jsx("div",{className:"adp-calendar-grid adp-weekdays",children:e.map(a=>jsxRuntime.jsx("div",{className:"adp-weekday",children:a},a))}),jsxRuntime.jsx("div",{className:"adp-calendar-grid",children:o.map(a=>{let l=!a.isCurrentMonth,i=l?{}:n(a.date),p=["adp-day",l?"adp-day-placeholder":"",i.selected?"adp-day-selected":"",i.inRange?"adp-day-in-range":"",i.rangeStart?"adp-day-range-start":"",i.rangeEnd?"adp-day-range-end":""].filter(Boolean).join(" ");return jsxRuntime.jsx("button",{type:"button",className:p,onClick:()=>s(a.date),disabled:l,"aria-hidden":l,tabIndex:l?-1:void 0,children:l?null:a.day},d.getDateKey(a.date))})})]})}function O(t,r,s=M){let{startDate:n,endDate:c}=t;return !n||c?{startDate:r,endDate:null}:s.isBeforeDay(r,n)?{startDate:r,endDate:n}:{startDate:n,endDate:r}}function H({value:t,defaultValue:r=null,onChange:s}={}){let n=h(),[c,d]=react.useState(()=>t??r??n.today()),[o,e]=react.useState(r),a=t!==void 0,l=a?t:o,i=p=>{let g=p;a||e(g),s?.(g);};return jsxRuntime.jsxs("div",{style:{direction:n.direction},className:"adp-picker",children:[jsxRuntime.jsx(k,{month:c,onMonthChange:d,onDateSelect:i,getDayState:p=>({selected:n.isSameDay(p,l)})}),jsxRuntime.jsxs("div",{className:"adp-selection-label",children:["Selected date: ",n.formatInputDate(l)||"None"]})]})}var X={startDate:null,endDate:null};function F(t){return t??X}function Z({value:t,defaultValue:r=null,onChange:s}={}){let n=h(),c=F(t??r),[d,o]=react.useState(()=>c.startDate??n.today()),[e,a]=react.useState(c),l=t!==void 0,i=l?F(t):e,p=n.createMonthSequence(d,2),g=n.createMonthSequence(d,9),y=m=>({selected:n.isSameDay(m,i.startDate)||n.isSameDay(m,i.endDate),inRange:n.isBetweenDays(m,i.startDate,i.endDate),rangeStart:n.isSameDay(m,i.startDate),rangeEnd:n.isSameDay(m,i.endDate)}),x=m=>{let j=O(i,m,n);l||a(j),s?.(j);};return jsxRuntime.jsxs("div",{style:{direction:n.direction},className:"adp-picker",children:[jsxRuntime.jsxs("div",{className:"adp-range-calendars adp-range-calendars-desktop",children:[jsxRuntime.jsx("button",{type:"button",className:"adp-nav-button adp-range-nav-button",onClick:()=>o(m=>n.addMonths(m,-1)),"aria-label":"Previous month",children:"\u2039"}),jsxRuntime.jsxs("div",{className:"adp-range-calendar-surface",children:[jsxRuntime.jsx(k,{month:p[0],onMonthChange:o,onDateSelect:x,getDayState:y,showNavigation:false}),jsxRuntime.jsx(k,{month:p[1],onMonthChange:o,onDateSelect:x,getDayState:y,showNavigation:false})]}),jsxRuntime.jsx("button",{type:"button",className:"adp-nav-button adp-range-nav-button",onClick:()=>o(m=>n.addMonths(m,1)),"aria-label":"Next month",children:"\u203A"})]}),jsxRuntime.jsx("div",{className:"adp-range-calendars-mobile",children:g.map(m=>jsxRuntime.jsx(k,{month:m,onMonthChange:o,onDateSelect:x,getDayState:y,showNavigation:false},n.getDateKey(m)))}),jsxRuntime.jsxs("div",{className:"adp-selection-label",children:["Selected range: ",n.formatInputDate(i.startDate)||"Start"," \u2192 ",n.formatInputDate(i.endDate)||"End"]})]})}var ee=["\u0641\u0631\u0648\u0631\u062F\u06CC\u0646","\u0627\u0631\u062F\u06CC\u0628\u0647\u0634\u062A","\u062E\u0631\u062F\u0627\u062F","\u062A\u06CC\u0631","\u0645\u0631\u062F\u0627\u062F","\u0634\u0647\u0631\u06CC\u0648\u0631","\u0645\u0647\u0631","\u0622\u0628\u0627\u0646","\u0622\u0630\u0631","\u062F\u06CC","\u0628\u0647\u0645\u0646","\u0627\u0633\u0641\u0646\u062F"],te=["\u0634","\u06CC","\u062F","\u0633","\u0686","\u067E","\u062C"],ae=["\u06F0","\u06F1","\u06F2","\u06F3","\u06F4","\u06F5","\u06F6","\u06F7","\u06F8","\u06F9"],u=(t,r)=>~~(t/r),D=(t,r)=>t-~~(t/r)*r;function N(t,r,s){let n=u((t+u(r-8,6)+100100)*1461,4)+u(153*D(r+9,12)+2,5)+s-34840408;return n=n-u(u(t+100100+u(r-8,6),100)*3,4)+752,n}function J(t){let r=4*t+139361631;r=r+u(u(4*t+183187720,146097)*3,4)*4-3908;let s=u(D(r,1461),4)*5+308,n=u(D(s,153),5)+1,c=D(u(s,153),12)+1;return {gy:u(r,1461)-100100+u(8-c,6),gm:c,gd:n}}function L(t){let r=[-61,9,38,199,426,686,756,818,1111,1181,1210,1635,2060,2097,2192,2262,2324,2394,2456,3178],s=r.length,n=t+621,c=-14,d=r[0],o=0,e=0;if(t<d||t>=r[s-1])throw new Error(`Invalid Jalali year ${t}`);for(let g=1;g<s&&(o=r[g],e=o-d,!(t<o));g+=1)c+=u(e,33)*8+u(D(e,33),4),d=o;let a=t-d;c+=u(a,33)*8+u(D(a,33)+3,4),D(e,33)===4&&e-a===4&&(c+=1);let l=u(n,4)-u((u(n,100)+1)*3,4)-150,i=20+c-l;e-a<6&&(a=a-e+u(e+4,33)*33);let p=D(D(a+1,33)-1,4);return p===-1&&(p=4),{leap:p,gy:n,march:i}}function ne(t,r,s){let n=L(t);return N(n.gy,3,n.march)+(r-1)*31-u(r,7)*(r-7)+s-1}function re(t){let r=J(t).gy,s=r-621,n=L(s),c=N(r,3,n.march),d=t-c;if(d>=0){if(d<=185)return {jy:s,jm:1+u(d,31),jd:D(d,31)+1};d-=186;}else s-=1,d+=179,n.leap===1&&(d+=1);return {jy:s,jm:7+u(d,30),jd:D(d,30)+1}}function f(t){return re(N(t.getFullYear(),t.getMonth()+1,t.getDate()))}function v(t,r,s){let n=J(ne(t,r,s));return new Date(n.gy,n.gm-1,n.gd)}function oe(t){return L(t).leap===0}function w(t,r){return r<=6?31:r<=11||oe(t)?30:29}function Y(t,r){let s=String(t);return r?s:s.replace(/\d/g,n=>ae[Number(n)])}function W(t={}){let r=t.locale??"fa-IR",s=((t.firstDayOfWeek??6)%7+7)%7,n=t.latinDigits??false,c=o=>new Date(o.getFullYear(),o.getMonth(),o.getDate()),d={locale:r,direction:"rtl",today:()=>new Date,startOfDay:c,startOfMonth:o=>{let e=f(o);return v(e.jy,e.jm,1)},endOfMonth:o=>{let e=f(o);return v(e.jy,e.jm,w(e.jy,e.jm))},addMonths:(o,e)=>{let a=f(o),l=a.jy*12+(a.jm-1)+e,i=Math.floor(l/12),p=(l%12+12)%12+1;return v(i,p,Math.min(a.jd,w(i,p)))},isBeforeDay:(o,e)=>c(o).getTime()<c(e).getTime(),isSameDay:(o,e)=>!!o&&!!e&&c(o).getTime()===c(e).getTime(),isSameMonth:(o,e)=>{let a=f(o),l=f(e);return a.jy===l.jy&&a.jm===l.jm},isBetweenDays:(o,e,a)=>!!e&&!!a&&c(o).getTime()>c(e).getTime()&&c(o).getTime()<c(a).getTime(),formatInputDate:o=>{if(!o)return "";let e=f(o);return `${String(e.jy).padStart(4,"0")}-${String(e.jm).padStart(2,"0")}-${String(e.jd).padStart(2,"0")}`},formatMonthLabel:o=>{let e=f(o);return `${ee[e.jm-1]} ${Y(e.jy,n)}`},formatDayOfMonth:o=>Y(f(o).jd,n),getDateKey:o=>o.toISOString().slice(0,10),getWeekdayLabels:()=>Array.from({length:7},(o,e)=>te[(s+e-6+7)%7]),createCalendarMonth:o=>{let e=d.startOfMonth(o),a=(e.getDay()-s+7)%7,l=new Date(e.getFullYear(),e.getMonth(),e.getDate()-a);return Array.from({length:42},(i,p)=>{let g=new Date(l.getFullYear(),l.getMonth(),l.getDate()+p);return {date:g,day:d.formatDayOfMonth(g),isCurrentMonth:d.isSameMonth(g,e)}})},createMonthSequence:(o,e)=>Array.from({length:e},(a,l)=>d.addMonths(o,l)),parseDate:o=>{let e=/^(\d{4})-(\d{2})-(\d{2})$/.exec(o);if(!e)return null;let a=Number(e[1]),l=Number(e[2]),i=Number(e[3]);return l<1||l>12||i<1||i>w(a,l)?null:v(a,l,i)}};return d}var de=W();exports.DatePicker=H;exports.DateRangePicker=Z;exports.LocalizationProvider=q;exports.createGregorianCalendarAdapter=A;exports.createJalaliCalendarAdapter=W;exports.defaultCalendarAdapter=M;exports.jalaliCalendarAdapter=de;exports.useCalendarAdapter=h;
1
+ 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');var ae=new Set(["ar","fa","he","ur"]);function te(r,n){if(n)return n;let l=(Array.isArray(r)?r[0]:r)?.split("-")[0]?.toLowerCase();return l&&ae.has(l)?"rtl":"ltr"}function ne(r=0){return (r%7+7)%7}function re(r){let n=Array.isArray(r)?r[0]:r;try{let c=Intl.Locale,l=c?new c(n):null,i=l?.weekInfo?.firstDay??l?.getWeekInfo?.().firstDay;if(typeof i=="number")return i%7}catch{}return 0}function B(r={}){let{locale:n,direction:c}=r,l=ne(r.firstDayOfWeek??re(n)),i=te(n,c),o=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()),a={locale:n,direction:i,today:()=>new Date,startOfDay:o,startOfMonth:e=>new Date(e.getFullYear(),e.getMonth(),1),endOfMonth:e=>new Date(e.getFullYear(),e.getMonth()+1,0),addMonths:(e,t)=>new Date(e.getFullYear(),e.getMonth()+t,1),isBeforeDay:(e,t)=>o(e).getTime()<o(t).getTime(),isSameDay:(e,t)=>!e||!t?false:o(e).getTime()===o(t).getTime(),isSameMonth:(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth(),isBetweenDays:(e,t,d)=>{if(!t||!d)return false;let s=o(e).getTime();return s>o(t).getTime()&&s<o(d).getTime()},formatInputDate:e=>{if(!e)return "";let t=e.getFullYear(),d=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0");return `${t}-${d}-${s}`},formatMonthLabel:e=>e.toLocaleDateString(n,{month:"long",year:"numeric"}),formatDayOfMonth:e=>String(e.getDate()),getDateKey:e=>a.formatInputDate(e),getWeekdayLabels:()=>Array.from({length:7},(e,t)=>{let d=(l+t)%7;return new Date(2024,0,7+d).toLocaleDateString(n,{weekday:"short"})}),createCalendarMonth:e=>{let t=a.startOfMonth(e),d=(t.getDay()-l+7)%7,s=new Date(t.getFullYear(),t.getMonth(),t.getDate()-d);return Array.from({length:42},(u,D)=>{let y=new Date(s.getFullYear(),s.getMonth(),s.getDate()+D);return {date:y,day:a.formatDayOfMonth(y),isCurrentMonth:a.isSameMonth(y,t)}})},createMonthSequence:(e,t)=>Array.from({length:t},(d,s)=>a.addMonths(e,s)),isDateDisabled:(e,t,d)=>{let s=a.startOfDay(e);return !!(t&&a.isBeforeDay(s,t)||d&&a.isBeforeDay(d,s))},canNavigateToMonth:(e,t=1,d,s)=>{let u=a.startOfMonth(e),D=a.endOfMonth(a.addMonths(u,Math.max(t-1,0)));return (!d||!a.isBeforeDay(D,d))&&(!s||!a.isBeforeDay(s,u))},canNavigateMonth:(e,t,d=1,s,u)=>a.canNavigateToMonth(a.addMonths(e,t),d,s,u),constrainMonth:(e,t=1,d,s)=>a.canNavigateToMonth(e,t,d,s)?e:d&&a.isBeforeDay(a.endOfMonth(a.addMonths(e,Math.max(t-1,0))),d)?a.startOfMonth(d):s&&a.isBeforeDay(s,a.startOfMonth(e))?a.startOfMonth(s):e,parseDate:e=>{let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!t)return null;let[,d,s,u]=t,D=new Date(Number(d),Number(s)-1,Number(u));return Number.isNaN(D.getTime())||D.getFullYear()!==Number(d)||D.getMonth()!==Number(s)-1||D.getDate()!==Number(u)?null:D}};return a}var w=B(),E=react.createContext(w);function oe({adapter:r,children:n,locale:c,direction:l,firstDayOfWeek:i}){let o=react.useMemo(()=>r??B({locale:c,direction:l,firstDayOfWeek:i}),[r,l,i,c]);return jsxRuntime.jsx(E.Provider,{value:o,children:n})}function R(){return react.useContext(E)}var le=react.memo(function({dayProps:n,className:c,renderDay:l}){let i=l?l(n):n.isOutsideMonth?null:n.label;return jsxRuntime.jsx("button",{type:"button",className:c,onClick:n.onClick,onMouseEnter:n.onMouseEnter,onFocus:n.onFocus,disabled:n.isDisabled,"aria-hidden":n.isOutsideMonth,tabIndex:n.tabIndex,role:n.role,"aria-selected":n["aria-selected"],"aria-disabled":n["aria-disabled"],children:i})});function A({month:r,onMonthChange:n,onDateSelect:c,getDayState:l,showNavigation:i=true,isDateDisabled:o,canNavigatePrev:a=true,canNavigateNext:e=true,renderDay:t,headerStart:d,headerEnd:s}){let u=R(),D=u.createCalendarMonth(r),y=u.getWeekdayLabels(),h=u.today();return jsxRuntime.jsxs("div",{className:"adp-date-picker",dir:u.direction,children:[jsxRuntime.jsxs("div",{className:`adp-calendar-header${i||d||s?"":" adp-calendar-header-centered"}`,children:[i?jsxRuntime.jsx("button",{type:"button",className:"adp-nav-button",onClick:()=>a&&n(u.addMonths(r,-1)),disabled:!a,"aria-label":"Previous month",children:"\u2039"}):d??jsxRuntime.jsx("span",{className:"adp-calendar-header-spacer","aria-hidden":"true"}),jsxRuntime.jsx("div",{className:"adp-month-label",children:u.formatMonthLabel(r)}),i?jsxRuntime.jsx("button",{type:"button",className:"adp-nav-button",onClick:()=>e&&n(u.addMonths(r,1)),disabled:!e,"aria-label":"Next month",children:"\u203A"}):s??jsxRuntime.jsx("span",{className:"adp-calendar-header-spacer","aria-hidden":"true"})]}),jsxRuntime.jsx("div",{className:"adp-calendar-grid adp-weekdays",children:y.map(p=>jsxRuntime.jsx("div",{className:"adp-weekday",children:p},p))}),jsxRuntime.jsx("div",{className:"adp-calendar-grid",role:"grid",children:D.map(p=>{let b=!p.isCurrentMonth,m=b?{}:l(p.date),k=b||!!o?.(p.date),N=["adp-day",b?"adp-day-placeholder":"",k&&!b?"adp-day-disabled":"",m.selected?"adp-day-selected":"",m.inRange?"adp-day-in-range":"",m.rangeStart?"adp-day-range-start":"",m.rangeEnd?"adp-day-range-end":"",t?"adp-day-custom":""].filter(Boolean).join(" "),O={date:p.date,isToday:u.isSameDay(p.date,h),isSelected:!!m.selected,isInRange:!!m.inRange,isRangeStart:!!m.rangeStart,isRangeEnd:!!m.rangeEnd,isOutsideMonth:b,isDisabled:k,label:p.day,onClick:()=>{k||c(p.date);},tabIndex:k?-1:0,role:"gridcell","aria-selected":!!m.selected,"aria-disabled":k};return jsxRuntime.jsx(le,{dayProps:O,className:N,renderDay:t},u.getDateKey(p.date))})})]})}function J(r,n,c=w){let{startDate:l,endDate:i}=r;return !l||i?{startDate:n,endDate:null}:c.isBeforeDay(n,l)?{startDate:n,endDate:l}:{startDate:l,endDate:n}}function se({value:r,defaultValue:n=null,onChange:c,renderDay:l,minDate:i,maxDate:o}={}){let a=R(),[e,t]=react.useState(()=>r??n??a.today()),[d,s]=react.useState(n),u=r!==void 0,D=u?r:d,y=a.constrainMonth(e,1,i,o),h=p=>{if(a.isDateDisabled(p,i,o))return;let b=p;u||s(b),c?.(b);};return jsxRuntime.jsx("div",{style:{direction:a.direction},className:"adp-picker",children:jsxRuntime.jsx(A,{month:y,onMonthChange:p=>t(a.constrainMonth(p,1,i,o)),onDateSelect:h,getDayState:p=>({selected:a.isSameDay(p,D)}),isDateDisabled:p=>a.isDateDisabled(p,i,o),canNavigatePrev:a.canNavigateMonth(y,-1,1,i,o),canNavigateNext:a.canNavigateMonth(y,1,1,i,o),renderDay:l})})}var ce={startDate:null,endDate:null};function $(r){return r??ce}function ue({value:r,defaultValue:n=null,onChange:c,renderDay:l,minDate:i,maxDate:o,viewMode:a="infinite"}={}){let e=R(),t=$(r??n),[d,s]=react.useState(()=>t.startDate??e.today()),[u,D]=react.useState(t),y=r!==void 0,h=y?$(r):u,p=e.constrainMonth(d,1,i,o),b=e.createMonthSequence(p,2),m=a==="infinite"?9:1,k=e.createMonthSequence(p,m),N=(f,v=1)=>{s(e.constrainMonth(f,v,i,o));},O=e.canNavigateMonth(p,-1,2,i,o),F=e.canNavigateMonth(p,1,2,i,o),H=e.canNavigateMonth(p,-1,m,i,o),Q=e.canNavigateMonth(p,1,m,i,o),L=f=>({selected:e.isSameDay(f,h.startDate)||e.isSameDay(f,h.endDate),inRange:e.isBetweenDays(f,h.startDate,h.endDate),rangeStart:e.isSameDay(f,h.startDate),rangeEnd:e.isSameDay(f,h.endDate)}),j=f=>{if(e.isDateDisabled(f,i,o))return;let v=J(h,f,e);y||D(v),c?.(v);};return jsxRuntime.jsxs("div",{style:{direction:e.direction},className:"adp-picker",children:[jsxRuntime.jsx("div",{className:"adp-range-calendars adp-range-calendars-desktop",children:jsxRuntime.jsxs("div",{className:"adp-range-calendar-surface",children:[jsxRuntime.jsx(A,{month:b[0],onMonthChange:f=>N(f,2),onDateSelect:j,getDayState:L,showNavigation:false,isDateDisabled:f=>e.isDateDisabled(f,i,o),renderDay:l,headerStart:jsxRuntime.jsx("button",{type:"button",className:"adp-nav-button adp-range-nav-button",onClick:()=>O&&N(e.addMonths(p,-1),2),disabled:!O,"aria-label":"Previous month",children:"\u2039"})}),jsxRuntime.jsx(A,{month:b[1],onMonthChange:f=>N(f,2),onDateSelect:j,getDayState:L,showNavigation:false,isDateDisabled:f=>e.isDateDisabled(f,i,o),renderDay:l,headerEnd:jsxRuntime.jsx("button",{type:"button",className:"adp-nav-button adp-range-nav-button",onClick:()=>F&&N(e.addMonths(p,1),2),disabled:!F,"aria-label":"Next month",children:"\u203A"})})]})}),jsxRuntime.jsx("div",{className:"adp-range-calendars-mobile",children:k.map(f=>jsxRuntime.jsx(A,{month:f,onMonthChange:v=>N(v,m),onDateSelect:j,getDayState:L,showNavigation:a==="single",isDateDisabled:v=>e.isDateDisabled(v,i,o),canNavigatePrev:H,canNavigateNext:Q,renderDay:l},e.getDateKey(f)))})]})}var pe=["\u0641\u0631\u0648\u0631\u062F\u06CC\u0646","\u0627\u0631\u062F\u06CC\u0628\u0647\u0634\u062A","\u062E\u0631\u062F\u0627\u062F","\u062A\u06CC\u0631","\u0645\u0631\u062F\u0627\u062F","\u0634\u0647\u0631\u06CC\u0648\u0631","\u0645\u0647\u0631","\u0622\u0628\u0627\u0646","\u0622\u0630\u0631","\u062F\u06CC","\u0628\u0647\u0645\u0646","\u0627\u0633\u0641\u0646\u062F"],ge=["\u0634","\u06CC","\u062F","\u0633","\u0686","\u067E","\u062C"],De=["\u06F0","\u06F1","\u06F2","\u06F3","\u06F4","\u06F5","\u06F6","\u06F7","\u06F8","\u06F9"],g=(r,n)=>~~(r/n),M=(r,n)=>r-~~(r/n)*n;function I(r,n,c){let l=g((r+g(n-8,6)+100100)*1461,4)+g(153*M(n+9,12)+2,5)+c-34840408;return l=l-g(g(r+100100+g(n-8,6),100)*3,4)+752,l}function q(r){let n=4*r+139361631;n=n+g(g(4*r+183187720,146097)*3,4)*4-3908;let c=g(M(n,1461),4)*5+308,l=g(M(c,153),5)+1,i=M(g(c,153),12)+1;return {gy:g(n,1461)-100100+g(8-i,6),gm:i,gd:l}}function V(r){let n=[-61,9,38,199,426,686,756,818,1111,1181,1210,1635,2060,2097,2192,2262,2324,2394,2456,3178],c=n.length,l=r+621,i=-14,o=n[0],a=0,e=0;if(r<o||r>=n[c-1])throw new Error(`Invalid Jalali year ${r}`);for(let D=1;D<c&&(a=n[D],e=a-o,!(r<a));D+=1)i+=g(e,33)*8+g(M(e,33),4),o=a;let t=r-o;i+=g(t,33)*8+g(M(t,33)+3,4),M(e,33)===4&&e-t===4&&(i+=1);let d=g(l,4)-g((g(l,100)+1)*3,4)-150,s=20+i-d;e-t<6&&(t=t-e+g(e+4,33)*33);let u=M(M(t+1,33)-1,4);return u===-1&&(u=4),{leap:u,gy:l,march:s}}function fe(r,n,c){let l=V(r);return I(l.gy,3,l.march)+(n-1)*31-g(n,7)*(n-7)+c-1}function me(r){let n=q(r).gy,c=n-621,l=V(c),i=I(n,3,l.march),o=r-i;if(o>=0){if(o<=185)return {jy:c,jm:1+g(o,31),jd:M(o,31)+1};o-=186;}else c-=1,o+=179,l.leap===1&&(o+=1);return {jy:c,jm:7+g(o,30),jd:M(o,30)+1}}function S(r){return me(I(r.getFullYear(),r.getMonth()+1,r.getDate()))}function P(r,n,c){let l=q(fe(r,n,c));return new Date(l.gy,l.gm-1,l.gd)}function ye(r){return V(r).leap===0}function T(r,n){return n<=6?31:n<=11||ye(r)?30:29}function K(r,n){let c=String(r);return n?c:c.replace(/\d/g,l=>De[Number(l)])}function U(r={}){let n=r.locale??"fa-IR",c=((r.firstDayOfWeek??6)%7+7)%7,l=r.latinDigits??false,i=a=>new Date(a.getFullYear(),a.getMonth(),a.getDate()),o={locale:n,direction:"rtl",today:()=>new Date,startOfDay:i,startOfMonth:a=>{let e=S(a);return P(e.jy,e.jm,1)},endOfMonth:a=>{let e=S(a);return P(e.jy,e.jm,T(e.jy,e.jm))},addMonths:(a,e)=>{let t=S(a),d=t.jy*12+(t.jm-1)+e,s=Math.floor(d/12),u=(d%12+12)%12+1;return P(s,u,Math.min(t.jd,T(s,u)))},isBeforeDay:(a,e)=>i(a).getTime()<i(e).getTime(),isSameDay:(a,e)=>!!a&&!!e&&i(a).getTime()===i(e).getTime(),isSameMonth:(a,e)=>{let t=S(a),d=S(e);return t.jy===d.jy&&t.jm===d.jm},isBetweenDays:(a,e,t)=>!!e&&!!t&&i(a).getTime()>i(e).getTime()&&i(a).getTime()<i(t).getTime(),formatInputDate:a=>{if(!a)return "";let e=S(a);return `${String(e.jy).padStart(4,"0")}-${String(e.jm).padStart(2,"0")}-${String(e.jd).padStart(2,"0")}`},formatMonthLabel:a=>{let e=S(a);return `${pe[e.jm-1]} ${K(e.jy,l)}`},formatDayOfMonth:a=>K(S(a).jd,l),getDateKey:a=>a.toISOString().slice(0,10),getWeekdayLabels:()=>Array.from({length:7},(a,e)=>ge[(c+e-6+7)%7]),createCalendarMonth:a=>{let e=o.startOfMonth(a),t=(e.getDay()-c+7)%7,d=new Date(e.getFullYear(),e.getMonth(),e.getDate()-t);return Array.from({length:42},(s,u)=>{let D=new Date(d.getFullYear(),d.getMonth(),d.getDate()+u);return {date:D,day:o.formatDayOfMonth(D),isCurrentMonth:o.isSameMonth(D,e)}})},createMonthSequence:(a,e)=>Array.from({length:e},(t,d)=>o.addMonths(a,d)),isDateDisabled:(a,e,t)=>{let d=o.startOfDay(a);return !!(e&&o.isBeforeDay(d,e)||t&&o.isBeforeDay(t,d))},canNavigateToMonth:(a,e=1,t,d)=>{let s=o.startOfMonth(a),u=o.endOfMonth(o.addMonths(s,Math.max(e-1,0)));return (!t||!o.isBeforeDay(u,t))&&(!d||!o.isBeforeDay(d,s))},canNavigateMonth:(a,e,t=1,d,s)=>o.canNavigateToMonth(o.addMonths(a,e),t,d,s),constrainMonth:(a,e=1,t,d)=>o.canNavigateToMonth(a,e,t,d)?a:t&&o.isBeforeDay(o.endOfMonth(o.addMonths(a,Math.max(e-1,0))),t)?o.startOfMonth(t):d&&o.isBeforeDay(d,o.startOfMonth(a))?o.startOfMonth(d):a,parseDate:a=>{let e=/^(\d{4})-(\d{2})-(\d{2})$/.exec(a);if(!e)return null;let t=Number(e[1]),d=Number(e[2]),s=Number(e[3]);return d<1||d>12||s<1||s>T(t,d)?null:P(t,d,s)}};return o}var he=U();exports.DatePicker=se;exports.DateRangePicker=ue;exports.LocalizationProvider=oe;exports.createGregorianCalendarAdapter=B;exports.createJalaliCalendarAdapter=U;exports.defaultCalendarAdapter=w;exports.jalaliCalendarAdapter=he;exports.useCalendarAdapter=R;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import {createContext,useMemo,useContext,useState}from'react';import {jsx,jsxs}from'react/jsx-runtime';var $=new Set(["ar","fa","he","ur"]);function B(t,r){if(r)return r;let n=(Array.isArray(t)?t[0]:t)?.split("-")[0]?.toLowerCase();return n&&$.has(n)?"rtl":"ltr"}function G(t=0){return (t%7+7)%7}function K(t){let r=Array.isArray(t)?t[0]:t;try{let s=Intl.Locale,n=s?new s(r):null,c=n?.weekInfo?.firstDay??n?.getWeekInfo?.().firstDay;if(typeof c=="number")return c%7}catch{}return 0}function A(t={}){let{locale:r,direction:s}=t,n=G(t.firstDayOfWeek??K(r)),c=B(r,s),d=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()),o={locale:r,direction:c,today:()=>new Date,startOfDay:d,startOfMonth:e=>new Date(e.getFullYear(),e.getMonth(),1),endOfMonth:e=>new Date(e.getFullYear(),e.getMonth()+1,0),addMonths:(e,a)=>new Date(e.getFullYear(),e.getMonth()+a,1),isBeforeDay:(e,a)=>d(e).getTime()<d(a).getTime(),isSameDay:(e,a)=>!e||!a?false:d(e).getTime()===d(a).getTime(),isSameMonth:(e,a)=>e.getFullYear()===a.getFullYear()&&e.getMonth()===a.getMonth(),isBetweenDays:(e,a,l)=>{if(!a||!l)return false;let i=d(e).getTime();return i>d(a).getTime()&&i<d(l).getTime()},formatInputDate:e=>{if(!e)return "";let a=e.getFullYear(),l=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0");return `${a}-${l}-${i}`},formatMonthLabel:e=>e.toLocaleDateString(r,{month:"long",year:"numeric"}),formatDayOfMonth:e=>String(e.getDate()),getDateKey:e=>o.formatInputDate(e),getWeekdayLabels:()=>Array.from({length:7},(e,a)=>{let l=(n+a)%7;return new Date(2024,0,7+l).toLocaleDateString(r,{weekday:"short"})}),createCalendarMonth:e=>{let a=o.startOfMonth(e),l=(a.getDay()-n+7)%7,i=new Date(a.getFullYear(),a.getMonth(),a.getDate()-l);return Array.from({length:42},(p,g)=>{let y=new Date(i.getFullYear(),i.getMonth(),i.getDate()+g);return {date:y,day:o.formatDayOfMonth(y),isCurrentMonth:o.isSameMonth(y,a)}})},createMonthSequence:(e,a)=>Array.from({length:a},(l,i)=>o.addMonths(e,i)),parseDate:e=>{let a=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!a)return null;let[,l,i,p]=a,g=new Date(Number(l),Number(i)-1,Number(p));return Number.isNaN(g.getTime())||g.getFullYear()!==Number(l)||g.getMonth()!==Number(i)-1||g.getDate()!==Number(p)?null:g}};return o}var M=A(),P=createContext(M);function q({adapter:t,children:r,locale:s,direction:n,firstDayOfWeek:c}){let d=useMemo(()=>t??A({locale:s,direction:n,firstDayOfWeek:c}),[t,n,c,s]);return jsx(P.Provider,{value:d,children:r})}function h(){return useContext(P)}function k({month:t,onMonthChange:r,onDateSelect:s,getDayState:n,showNavigation:c=true}){let d=h(),o=d.createCalendarMonth(t),e=d.getWeekdayLabels();return jsxs("div",{className:"adp-date-picker",dir:d.direction,children:[jsxs("div",{className:`adp-calendar-header${c?"":" adp-calendar-header-centered"}`,children:[c?jsx("button",{type:"button",className:"adp-nav-button",onClick:()=>r(d.addMonths(t,-1)),"aria-label":"Previous month",children:"\u2039"}):null,jsx("div",{className:"adp-month-label",children:d.formatMonthLabel(t)}),c?jsx("button",{type:"button",className:"adp-nav-button",onClick:()=>r(d.addMonths(t,1)),"aria-label":"Next month",children:"\u203A"}):null]}),jsx("div",{className:"adp-calendar-grid adp-weekdays",children:e.map(a=>jsx("div",{className:"adp-weekday",children:a},a))}),jsx("div",{className:"adp-calendar-grid",children:o.map(a=>{let l=!a.isCurrentMonth,i=l?{}:n(a.date),p=["adp-day",l?"adp-day-placeholder":"",i.selected?"adp-day-selected":"",i.inRange?"adp-day-in-range":"",i.rangeStart?"adp-day-range-start":"",i.rangeEnd?"adp-day-range-end":""].filter(Boolean).join(" ");return jsx("button",{type:"button",className:p,onClick:()=>s(a.date),disabled:l,"aria-hidden":l,tabIndex:l?-1:void 0,children:l?null:a.day},d.getDateKey(a.date))})})]})}function O(t,r,s=M){let{startDate:n,endDate:c}=t;return !n||c?{startDate:r,endDate:null}:s.isBeforeDay(r,n)?{startDate:r,endDate:n}:{startDate:n,endDate:r}}function H({value:t,defaultValue:r=null,onChange:s}={}){let n=h(),[c,d]=useState(()=>t??r??n.today()),[o,e]=useState(r),a=t!==void 0,l=a?t:o,i=p=>{let g=p;a||e(g),s?.(g);};return jsxs("div",{style:{direction:n.direction},className:"adp-picker",children:[jsx(k,{month:c,onMonthChange:d,onDateSelect:i,getDayState:p=>({selected:n.isSameDay(p,l)})}),jsxs("div",{className:"adp-selection-label",children:["Selected date: ",n.formatInputDate(l)||"None"]})]})}var X={startDate:null,endDate:null};function F(t){return t??X}function Z({value:t,defaultValue:r=null,onChange:s}={}){let n=h(),c=F(t??r),[d,o]=useState(()=>c.startDate??n.today()),[e,a]=useState(c),l=t!==void 0,i=l?F(t):e,p=n.createMonthSequence(d,2),g=n.createMonthSequence(d,9),y=m=>({selected:n.isSameDay(m,i.startDate)||n.isSameDay(m,i.endDate),inRange:n.isBetweenDays(m,i.startDate,i.endDate),rangeStart:n.isSameDay(m,i.startDate),rangeEnd:n.isSameDay(m,i.endDate)}),x=m=>{let j=O(i,m,n);l||a(j),s?.(j);};return jsxs("div",{style:{direction:n.direction},className:"adp-picker",children:[jsxs("div",{className:"adp-range-calendars adp-range-calendars-desktop",children:[jsx("button",{type:"button",className:"adp-nav-button adp-range-nav-button",onClick:()=>o(m=>n.addMonths(m,-1)),"aria-label":"Previous month",children:"\u2039"}),jsxs("div",{className:"adp-range-calendar-surface",children:[jsx(k,{month:p[0],onMonthChange:o,onDateSelect:x,getDayState:y,showNavigation:false}),jsx(k,{month:p[1],onMonthChange:o,onDateSelect:x,getDayState:y,showNavigation:false})]}),jsx("button",{type:"button",className:"adp-nav-button adp-range-nav-button",onClick:()=>o(m=>n.addMonths(m,1)),"aria-label":"Next month",children:"\u203A"})]}),jsx("div",{className:"adp-range-calendars-mobile",children:g.map(m=>jsx(k,{month:m,onMonthChange:o,onDateSelect:x,getDayState:y,showNavigation:false},n.getDateKey(m)))}),jsxs("div",{className:"adp-selection-label",children:["Selected range: ",n.formatInputDate(i.startDate)||"Start"," \u2192 ",n.formatInputDate(i.endDate)||"End"]})]})}var ee=["\u0641\u0631\u0648\u0631\u062F\u06CC\u0646","\u0627\u0631\u062F\u06CC\u0628\u0647\u0634\u062A","\u062E\u0631\u062F\u0627\u062F","\u062A\u06CC\u0631","\u0645\u0631\u062F\u0627\u062F","\u0634\u0647\u0631\u06CC\u0648\u0631","\u0645\u0647\u0631","\u0622\u0628\u0627\u0646","\u0622\u0630\u0631","\u062F\u06CC","\u0628\u0647\u0645\u0646","\u0627\u0633\u0641\u0646\u062F"],te=["\u0634","\u06CC","\u062F","\u0633","\u0686","\u067E","\u062C"],ae=["\u06F0","\u06F1","\u06F2","\u06F3","\u06F4","\u06F5","\u06F6","\u06F7","\u06F8","\u06F9"],u=(t,r)=>~~(t/r),D=(t,r)=>t-~~(t/r)*r;function N(t,r,s){let n=u((t+u(r-8,6)+100100)*1461,4)+u(153*D(r+9,12)+2,5)+s-34840408;return n=n-u(u(t+100100+u(r-8,6),100)*3,4)+752,n}function J(t){let r=4*t+139361631;r=r+u(u(4*t+183187720,146097)*3,4)*4-3908;let s=u(D(r,1461),4)*5+308,n=u(D(s,153),5)+1,c=D(u(s,153),12)+1;return {gy:u(r,1461)-100100+u(8-c,6),gm:c,gd:n}}function L(t){let r=[-61,9,38,199,426,686,756,818,1111,1181,1210,1635,2060,2097,2192,2262,2324,2394,2456,3178],s=r.length,n=t+621,c=-14,d=r[0],o=0,e=0;if(t<d||t>=r[s-1])throw new Error(`Invalid Jalali year ${t}`);for(let g=1;g<s&&(o=r[g],e=o-d,!(t<o));g+=1)c+=u(e,33)*8+u(D(e,33),4),d=o;let a=t-d;c+=u(a,33)*8+u(D(a,33)+3,4),D(e,33)===4&&e-a===4&&(c+=1);let l=u(n,4)-u((u(n,100)+1)*3,4)-150,i=20+c-l;e-a<6&&(a=a-e+u(e+4,33)*33);let p=D(D(a+1,33)-1,4);return p===-1&&(p=4),{leap:p,gy:n,march:i}}function ne(t,r,s){let n=L(t);return N(n.gy,3,n.march)+(r-1)*31-u(r,7)*(r-7)+s-1}function re(t){let r=J(t).gy,s=r-621,n=L(s),c=N(r,3,n.march),d=t-c;if(d>=0){if(d<=185)return {jy:s,jm:1+u(d,31),jd:D(d,31)+1};d-=186;}else s-=1,d+=179,n.leap===1&&(d+=1);return {jy:s,jm:7+u(d,30),jd:D(d,30)+1}}function f(t){return re(N(t.getFullYear(),t.getMonth()+1,t.getDate()))}function v(t,r,s){let n=J(ne(t,r,s));return new Date(n.gy,n.gm-1,n.gd)}function oe(t){return L(t).leap===0}function w(t,r){return r<=6?31:r<=11||oe(t)?30:29}function Y(t,r){let s=String(t);return r?s:s.replace(/\d/g,n=>ae[Number(n)])}function W(t={}){let r=t.locale??"fa-IR",s=((t.firstDayOfWeek??6)%7+7)%7,n=t.latinDigits??false,c=o=>new Date(o.getFullYear(),o.getMonth(),o.getDate()),d={locale:r,direction:"rtl",today:()=>new Date,startOfDay:c,startOfMonth:o=>{let e=f(o);return v(e.jy,e.jm,1)},endOfMonth:o=>{let e=f(o);return v(e.jy,e.jm,w(e.jy,e.jm))},addMonths:(o,e)=>{let a=f(o),l=a.jy*12+(a.jm-1)+e,i=Math.floor(l/12),p=(l%12+12)%12+1;return v(i,p,Math.min(a.jd,w(i,p)))},isBeforeDay:(o,e)=>c(o).getTime()<c(e).getTime(),isSameDay:(o,e)=>!!o&&!!e&&c(o).getTime()===c(e).getTime(),isSameMonth:(o,e)=>{let a=f(o),l=f(e);return a.jy===l.jy&&a.jm===l.jm},isBetweenDays:(o,e,a)=>!!e&&!!a&&c(o).getTime()>c(e).getTime()&&c(o).getTime()<c(a).getTime(),formatInputDate:o=>{if(!o)return "";let e=f(o);return `${String(e.jy).padStart(4,"0")}-${String(e.jm).padStart(2,"0")}-${String(e.jd).padStart(2,"0")}`},formatMonthLabel:o=>{let e=f(o);return `${ee[e.jm-1]} ${Y(e.jy,n)}`},formatDayOfMonth:o=>Y(f(o).jd,n),getDateKey:o=>o.toISOString().slice(0,10),getWeekdayLabels:()=>Array.from({length:7},(o,e)=>te[(s+e-6+7)%7]),createCalendarMonth:o=>{let e=d.startOfMonth(o),a=(e.getDay()-s+7)%7,l=new Date(e.getFullYear(),e.getMonth(),e.getDate()-a);return Array.from({length:42},(i,p)=>{let g=new Date(l.getFullYear(),l.getMonth(),l.getDate()+p);return {date:g,day:d.formatDayOfMonth(g),isCurrentMonth:d.isSameMonth(g,e)}})},createMonthSequence:(o,e)=>Array.from({length:e},(a,l)=>d.addMonths(o,l)),parseDate:o=>{let e=/^(\d{4})-(\d{2})-(\d{2})$/.exec(o);if(!e)return null;let a=Number(e[1]),l=Number(e[2]),i=Number(e[3]);return l<1||l>12||i<1||i>w(a,l)?null:v(a,l,i)}};return d}var de=W();export{H as DatePicker,Z as DateRangePicker,q as LocalizationProvider,A as createGregorianCalendarAdapter,W as createJalaliCalendarAdapter,M as defaultCalendarAdapter,de as jalaliCalendarAdapter,h as useCalendarAdapter};
1
+ import {createContext,memo,useMemo,useContext,useState}from'react';import {jsx,jsxs}from'react/jsx-runtime';var ae=new Set(["ar","fa","he","ur"]);function te(r,n){if(n)return n;let l=(Array.isArray(r)?r[0]:r)?.split("-")[0]?.toLowerCase();return l&&ae.has(l)?"rtl":"ltr"}function ne(r=0){return (r%7+7)%7}function re(r){let n=Array.isArray(r)?r[0]:r;try{let c=Intl.Locale,l=c?new c(n):null,i=l?.weekInfo?.firstDay??l?.getWeekInfo?.().firstDay;if(typeof i=="number")return i%7}catch{}return 0}function B(r={}){let{locale:n,direction:c}=r,l=ne(r.firstDayOfWeek??re(n)),i=te(n,c),o=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()),a={locale:n,direction:i,today:()=>new Date,startOfDay:o,startOfMonth:e=>new Date(e.getFullYear(),e.getMonth(),1),endOfMonth:e=>new Date(e.getFullYear(),e.getMonth()+1,0),addMonths:(e,t)=>new Date(e.getFullYear(),e.getMonth()+t,1),isBeforeDay:(e,t)=>o(e).getTime()<o(t).getTime(),isSameDay:(e,t)=>!e||!t?false:o(e).getTime()===o(t).getTime(),isSameMonth:(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth(),isBetweenDays:(e,t,d)=>{if(!t||!d)return false;let s=o(e).getTime();return s>o(t).getTime()&&s<o(d).getTime()},formatInputDate:e=>{if(!e)return "";let t=e.getFullYear(),d=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0");return `${t}-${d}-${s}`},formatMonthLabel:e=>e.toLocaleDateString(n,{month:"long",year:"numeric"}),formatDayOfMonth:e=>String(e.getDate()),getDateKey:e=>a.formatInputDate(e),getWeekdayLabels:()=>Array.from({length:7},(e,t)=>{let d=(l+t)%7;return new Date(2024,0,7+d).toLocaleDateString(n,{weekday:"short"})}),createCalendarMonth:e=>{let t=a.startOfMonth(e),d=(t.getDay()-l+7)%7,s=new Date(t.getFullYear(),t.getMonth(),t.getDate()-d);return Array.from({length:42},(u,D)=>{let y=new Date(s.getFullYear(),s.getMonth(),s.getDate()+D);return {date:y,day:a.formatDayOfMonth(y),isCurrentMonth:a.isSameMonth(y,t)}})},createMonthSequence:(e,t)=>Array.from({length:t},(d,s)=>a.addMonths(e,s)),isDateDisabled:(e,t,d)=>{let s=a.startOfDay(e);return !!(t&&a.isBeforeDay(s,t)||d&&a.isBeforeDay(d,s))},canNavigateToMonth:(e,t=1,d,s)=>{let u=a.startOfMonth(e),D=a.endOfMonth(a.addMonths(u,Math.max(t-1,0)));return (!d||!a.isBeforeDay(D,d))&&(!s||!a.isBeforeDay(s,u))},canNavigateMonth:(e,t,d=1,s,u)=>a.canNavigateToMonth(a.addMonths(e,t),d,s,u),constrainMonth:(e,t=1,d,s)=>a.canNavigateToMonth(e,t,d,s)?e:d&&a.isBeforeDay(a.endOfMonth(a.addMonths(e,Math.max(t-1,0))),d)?a.startOfMonth(d):s&&a.isBeforeDay(s,a.startOfMonth(e))?a.startOfMonth(s):e,parseDate:e=>{let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!t)return null;let[,d,s,u]=t,D=new Date(Number(d),Number(s)-1,Number(u));return Number.isNaN(D.getTime())||D.getFullYear()!==Number(d)||D.getMonth()!==Number(s)-1||D.getDate()!==Number(u)?null:D}};return a}var w=B(),E=createContext(w);function oe({adapter:r,children:n,locale:c,direction:l,firstDayOfWeek:i}){let o=useMemo(()=>r??B({locale:c,direction:l,firstDayOfWeek:i}),[r,l,i,c]);return jsx(E.Provider,{value:o,children:n})}function R(){return useContext(E)}var le=memo(function({dayProps:n,className:c,renderDay:l}){let i=l?l(n):n.isOutsideMonth?null:n.label;return jsx("button",{type:"button",className:c,onClick:n.onClick,onMouseEnter:n.onMouseEnter,onFocus:n.onFocus,disabled:n.isDisabled,"aria-hidden":n.isOutsideMonth,tabIndex:n.tabIndex,role:n.role,"aria-selected":n["aria-selected"],"aria-disabled":n["aria-disabled"],children:i})});function A({month:r,onMonthChange:n,onDateSelect:c,getDayState:l,showNavigation:i=true,isDateDisabled:o,canNavigatePrev:a=true,canNavigateNext:e=true,renderDay:t,headerStart:d,headerEnd:s}){let u=R(),D=u.createCalendarMonth(r),y=u.getWeekdayLabels(),h=u.today();return jsxs("div",{className:"adp-date-picker",dir:u.direction,children:[jsxs("div",{className:`adp-calendar-header${i||d||s?"":" adp-calendar-header-centered"}`,children:[i?jsx("button",{type:"button",className:"adp-nav-button",onClick:()=>a&&n(u.addMonths(r,-1)),disabled:!a,"aria-label":"Previous month",children:"\u2039"}):d??jsx("span",{className:"adp-calendar-header-spacer","aria-hidden":"true"}),jsx("div",{className:"adp-month-label",children:u.formatMonthLabel(r)}),i?jsx("button",{type:"button",className:"adp-nav-button",onClick:()=>e&&n(u.addMonths(r,1)),disabled:!e,"aria-label":"Next month",children:"\u203A"}):s??jsx("span",{className:"adp-calendar-header-spacer","aria-hidden":"true"})]}),jsx("div",{className:"adp-calendar-grid adp-weekdays",children:y.map(p=>jsx("div",{className:"adp-weekday",children:p},p))}),jsx("div",{className:"adp-calendar-grid",role:"grid",children:D.map(p=>{let b=!p.isCurrentMonth,m=b?{}:l(p.date),k=b||!!o?.(p.date),N=["adp-day",b?"adp-day-placeholder":"",k&&!b?"adp-day-disabled":"",m.selected?"adp-day-selected":"",m.inRange?"adp-day-in-range":"",m.rangeStart?"adp-day-range-start":"",m.rangeEnd?"adp-day-range-end":"",t?"adp-day-custom":""].filter(Boolean).join(" "),O={date:p.date,isToday:u.isSameDay(p.date,h),isSelected:!!m.selected,isInRange:!!m.inRange,isRangeStart:!!m.rangeStart,isRangeEnd:!!m.rangeEnd,isOutsideMonth:b,isDisabled:k,label:p.day,onClick:()=>{k||c(p.date);},tabIndex:k?-1:0,role:"gridcell","aria-selected":!!m.selected,"aria-disabled":k};return jsx(le,{dayProps:O,className:N,renderDay:t},u.getDateKey(p.date))})})]})}function J(r,n,c=w){let{startDate:l,endDate:i}=r;return !l||i?{startDate:n,endDate:null}:c.isBeforeDay(n,l)?{startDate:n,endDate:l}:{startDate:l,endDate:n}}function se({value:r,defaultValue:n=null,onChange:c,renderDay:l,minDate:i,maxDate:o}={}){let a=R(),[e,t]=useState(()=>r??n??a.today()),[d,s]=useState(n),u=r!==void 0,D=u?r:d,y=a.constrainMonth(e,1,i,o),h=p=>{if(a.isDateDisabled(p,i,o))return;let b=p;u||s(b),c?.(b);};return jsx("div",{style:{direction:a.direction},className:"adp-picker",children:jsx(A,{month:y,onMonthChange:p=>t(a.constrainMonth(p,1,i,o)),onDateSelect:h,getDayState:p=>({selected:a.isSameDay(p,D)}),isDateDisabled:p=>a.isDateDisabled(p,i,o),canNavigatePrev:a.canNavigateMonth(y,-1,1,i,o),canNavigateNext:a.canNavigateMonth(y,1,1,i,o),renderDay:l})})}var ce={startDate:null,endDate:null};function $(r){return r??ce}function ue({value:r,defaultValue:n=null,onChange:c,renderDay:l,minDate:i,maxDate:o,viewMode:a="infinite"}={}){let e=R(),t=$(r??n),[d,s]=useState(()=>t.startDate??e.today()),[u,D]=useState(t),y=r!==void 0,h=y?$(r):u,p=e.constrainMonth(d,1,i,o),b=e.createMonthSequence(p,2),m=a==="infinite"?9:1,k=e.createMonthSequence(p,m),N=(f,v=1)=>{s(e.constrainMonth(f,v,i,o));},O=e.canNavigateMonth(p,-1,2,i,o),F=e.canNavigateMonth(p,1,2,i,o),H=e.canNavigateMonth(p,-1,m,i,o),Q=e.canNavigateMonth(p,1,m,i,o),L=f=>({selected:e.isSameDay(f,h.startDate)||e.isSameDay(f,h.endDate),inRange:e.isBetweenDays(f,h.startDate,h.endDate),rangeStart:e.isSameDay(f,h.startDate),rangeEnd:e.isSameDay(f,h.endDate)}),j=f=>{if(e.isDateDisabled(f,i,o))return;let v=J(h,f,e);y||D(v),c?.(v);};return jsxs("div",{style:{direction:e.direction},className:"adp-picker",children:[jsx("div",{className:"adp-range-calendars adp-range-calendars-desktop",children:jsxs("div",{className:"adp-range-calendar-surface",children:[jsx(A,{month:b[0],onMonthChange:f=>N(f,2),onDateSelect:j,getDayState:L,showNavigation:false,isDateDisabled:f=>e.isDateDisabled(f,i,o),renderDay:l,headerStart:jsx("button",{type:"button",className:"adp-nav-button adp-range-nav-button",onClick:()=>O&&N(e.addMonths(p,-1),2),disabled:!O,"aria-label":"Previous month",children:"\u2039"})}),jsx(A,{month:b[1],onMonthChange:f=>N(f,2),onDateSelect:j,getDayState:L,showNavigation:false,isDateDisabled:f=>e.isDateDisabled(f,i,o),renderDay:l,headerEnd:jsx("button",{type:"button",className:"adp-nav-button adp-range-nav-button",onClick:()=>F&&N(e.addMonths(p,1),2),disabled:!F,"aria-label":"Next month",children:"\u203A"})})]})}),jsx("div",{className:"adp-range-calendars-mobile",children:k.map(f=>jsx(A,{month:f,onMonthChange:v=>N(v,m),onDateSelect:j,getDayState:L,showNavigation:a==="single",isDateDisabled:v=>e.isDateDisabled(v,i,o),canNavigatePrev:H,canNavigateNext:Q,renderDay:l},e.getDateKey(f)))})]})}var pe=["\u0641\u0631\u0648\u0631\u062F\u06CC\u0646","\u0627\u0631\u062F\u06CC\u0628\u0647\u0634\u062A","\u062E\u0631\u062F\u0627\u062F","\u062A\u06CC\u0631","\u0645\u0631\u062F\u0627\u062F","\u0634\u0647\u0631\u06CC\u0648\u0631","\u0645\u0647\u0631","\u0622\u0628\u0627\u0646","\u0622\u0630\u0631","\u062F\u06CC","\u0628\u0647\u0645\u0646","\u0627\u0633\u0641\u0646\u062F"],ge=["\u0634","\u06CC","\u062F","\u0633","\u0686","\u067E","\u062C"],De=["\u06F0","\u06F1","\u06F2","\u06F3","\u06F4","\u06F5","\u06F6","\u06F7","\u06F8","\u06F9"],g=(r,n)=>~~(r/n),M=(r,n)=>r-~~(r/n)*n;function I(r,n,c){let l=g((r+g(n-8,6)+100100)*1461,4)+g(153*M(n+9,12)+2,5)+c-34840408;return l=l-g(g(r+100100+g(n-8,6),100)*3,4)+752,l}function q(r){let n=4*r+139361631;n=n+g(g(4*r+183187720,146097)*3,4)*4-3908;let c=g(M(n,1461),4)*5+308,l=g(M(c,153),5)+1,i=M(g(c,153),12)+1;return {gy:g(n,1461)-100100+g(8-i,6),gm:i,gd:l}}function V(r){let n=[-61,9,38,199,426,686,756,818,1111,1181,1210,1635,2060,2097,2192,2262,2324,2394,2456,3178],c=n.length,l=r+621,i=-14,o=n[0],a=0,e=0;if(r<o||r>=n[c-1])throw new Error(`Invalid Jalali year ${r}`);for(let D=1;D<c&&(a=n[D],e=a-o,!(r<a));D+=1)i+=g(e,33)*8+g(M(e,33),4),o=a;let t=r-o;i+=g(t,33)*8+g(M(t,33)+3,4),M(e,33)===4&&e-t===4&&(i+=1);let d=g(l,4)-g((g(l,100)+1)*3,4)-150,s=20+i-d;e-t<6&&(t=t-e+g(e+4,33)*33);let u=M(M(t+1,33)-1,4);return u===-1&&(u=4),{leap:u,gy:l,march:s}}function fe(r,n,c){let l=V(r);return I(l.gy,3,l.march)+(n-1)*31-g(n,7)*(n-7)+c-1}function me(r){let n=q(r).gy,c=n-621,l=V(c),i=I(n,3,l.march),o=r-i;if(o>=0){if(o<=185)return {jy:c,jm:1+g(o,31),jd:M(o,31)+1};o-=186;}else c-=1,o+=179,l.leap===1&&(o+=1);return {jy:c,jm:7+g(o,30),jd:M(o,30)+1}}function S(r){return me(I(r.getFullYear(),r.getMonth()+1,r.getDate()))}function P(r,n,c){let l=q(fe(r,n,c));return new Date(l.gy,l.gm-1,l.gd)}function ye(r){return V(r).leap===0}function T(r,n){return n<=6?31:n<=11||ye(r)?30:29}function K(r,n){let c=String(r);return n?c:c.replace(/\d/g,l=>De[Number(l)])}function U(r={}){let n=r.locale??"fa-IR",c=((r.firstDayOfWeek??6)%7+7)%7,l=r.latinDigits??false,i=a=>new Date(a.getFullYear(),a.getMonth(),a.getDate()),o={locale:n,direction:"rtl",today:()=>new Date,startOfDay:i,startOfMonth:a=>{let e=S(a);return P(e.jy,e.jm,1)},endOfMonth:a=>{let e=S(a);return P(e.jy,e.jm,T(e.jy,e.jm))},addMonths:(a,e)=>{let t=S(a),d=t.jy*12+(t.jm-1)+e,s=Math.floor(d/12),u=(d%12+12)%12+1;return P(s,u,Math.min(t.jd,T(s,u)))},isBeforeDay:(a,e)=>i(a).getTime()<i(e).getTime(),isSameDay:(a,e)=>!!a&&!!e&&i(a).getTime()===i(e).getTime(),isSameMonth:(a,e)=>{let t=S(a),d=S(e);return t.jy===d.jy&&t.jm===d.jm},isBetweenDays:(a,e,t)=>!!e&&!!t&&i(a).getTime()>i(e).getTime()&&i(a).getTime()<i(t).getTime(),formatInputDate:a=>{if(!a)return "";let e=S(a);return `${String(e.jy).padStart(4,"0")}-${String(e.jm).padStart(2,"0")}-${String(e.jd).padStart(2,"0")}`},formatMonthLabel:a=>{let e=S(a);return `${pe[e.jm-1]} ${K(e.jy,l)}`},formatDayOfMonth:a=>K(S(a).jd,l),getDateKey:a=>a.toISOString().slice(0,10),getWeekdayLabels:()=>Array.from({length:7},(a,e)=>ge[(c+e-6+7)%7]),createCalendarMonth:a=>{let e=o.startOfMonth(a),t=(e.getDay()-c+7)%7,d=new Date(e.getFullYear(),e.getMonth(),e.getDate()-t);return Array.from({length:42},(s,u)=>{let D=new Date(d.getFullYear(),d.getMonth(),d.getDate()+u);return {date:D,day:o.formatDayOfMonth(D),isCurrentMonth:o.isSameMonth(D,e)}})},createMonthSequence:(a,e)=>Array.from({length:e},(t,d)=>o.addMonths(a,d)),isDateDisabled:(a,e,t)=>{let d=o.startOfDay(a);return !!(e&&o.isBeforeDay(d,e)||t&&o.isBeforeDay(t,d))},canNavigateToMonth:(a,e=1,t,d)=>{let s=o.startOfMonth(a),u=o.endOfMonth(o.addMonths(s,Math.max(e-1,0)));return (!t||!o.isBeforeDay(u,t))&&(!d||!o.isBeforeDay(d,s))},canNavigateMonth:(a,e,t=1,d,s)=>o.canNavigateToMonth(o.addMonths(a,e),t,d,s),constrainMonth:(a,e=1,t,d)=>o.canNavigateToMonth(a,e,t,d)?a:t&&o.isBeforeDay(o.endOfMonth(o.addMonths(a,Math.max(e-1,0))),t)?o.startOfMonth(t):d&&o.isBeforeDay(d,o.startOfMonth(a))?o.startOfMonth(d):a,parseDate:a=>{let e=/^(\d{4})-(\d{2})-(\d{2})$/.exec(a);if(!e)return null;let t=Number(e[1]),d=Number(e[2]),s=Number(e[3]);return d<1||d>12||s<1||s>T(t,d)?null:P(t,d,s)}};return o}var he=U();export{se as DatePicker,ue as DateRangePicker,oe as LocalizationProvider,B as createGregorianCalendarAdapter,U as createJalaliCalendarAdapter,w as defaultCalendarAdapter,he as jalaliCalendarAdapter,R as useCalendarAdapter};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aryan-date-picker",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "A lightweight React date picker component library.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",