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 +250 -0
- package/dist/index.css +1 -1
- package/dist/index.d.mts +40 -3
- package/dist/index.d.ts +40 -3
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
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:
|
|
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};
|