react-modular-datepicker 0.0.2-canary.18 → 0.0.2-canary.20

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 CHANGED
@@ -1,2 +1,223 @@
1
1
  # react-modular-datepicker
2
- A headless datepicker
2
+
3
+ A modular, lightweight, and type-safe React datepicker library. Whether you need a fully-featured calendar component or a headless hook to build your own UI, `react-modular-datepicker` has you covered.
4
+
5
+ ## Strengths
6
+
7
+ - đŸ—ī¸ **Headless & Modular**: Use the `useDates` hook for complete control over your UI, or the `Calendar` component for a beautiful, ready-to-use setup.
8
+ - đŸĒļ **Lightweight**: Small footprint with a pluggable adapter system (defaults to Day.js).
9
+ - đŸ›Ąī¸ **Type-safe**: Written in TypeScript for a great developer experience.
10
+ - 🎨 **Fully Customizable**: Style everything via Tailwind CSS or custom class names.
11
+ - 🌍 **Localized**: Easy internationalization support with `dayjs` or custom adapters.
12
+ - ⚡ **Feature-rich**: Single, multiple, and range selection modes, min/max dates, disabled dates, and more.
13
+
14
+ ---
15
+
16
+ ## API Reference
17
+
18
+ ### Imports
19
+
20
+ ```tsx
21
+ import {
22
+ Calendar,
23
+ useDates,
24
+ Dates,
25
+ Day,
26
+ DayjsAdapter,
27
+ defaultAdapter
28
+ } from 'react-modular-datepicker';
29
+ ```
30
+
31
+ ### `Calendar` Component
32
+
33
+ The primary component for a ready-to-use calendar.
34
+
35
+ | Prop | Type | Default | Description |
36
+ | :--- | :--- | :--- | :--- |
37
+ | `date` | `Date` | `new Date()` | The initial date/month to display. |
38
+ | `selected` | `Date \| Date[] \| Range` | `undefined` | The currently selected date(s). |
39
+ | `selectionMode` | `'single' \| 'range' \| 'multiple'` | `'single'` | The selection behavior. |
40
+ | `onChange` | `(selected: any) => void` | `undefined` | Callback triggered when the selection changes. |
41
+ | `minDate` | `Date` | `undefined` | The earliest selectable date. |
42
+ | `maxDate` | `Date` | `undefined` | The latest selectable date. |
43
+ | `disabledDates` | `Date[]` | `undefined` | An array of dates that should be disabled. |
44
+ | `monthsToDisplay` | `number` | `1` | Number of months to show simultaneously. |
45
+ | `firstDayOfWeek` | `number` | `0` | The first day of the week (0=Sun, 1=Mon, ...). |
46
+ | `showOutsideDays` | `boolean` | `false` | Whether to show days from the previous/next months. |
47
+ | `classNames` | `CalendarClassNames` | `undefined` | Custom classes for styling various parts of the UI. |
48
+ | `locale` | `string` | `undefined` | Locale for date formatting (e.g., 'fr', 'es'). |
49
+ | `translations` | `Partial<Translations>` | `undefined` | Custom translation strings for "Back" and "Forward". |
50
+ | `adapter` | `DateAdapter` | `defaultAdapter` | The date management adapter (e.g., DayjsAdapter). |
51
+
52
+ ### `useDates` Hook
53
+
54
+ The logic core of the library. It handles selection, navigation, and grid generation.
55
+
56
+ ```typescript
57
+ const {
58
+ calendars,
59
+ getDateProps,
60
+ getBackProps,
61
+ getForwardProps,
62
+ setOffset
63
+ } = useDates(props: UseDatesProps);
64
+ ```
65
+
66
+ **`UseDatesProps`** includes all props from `Calendar` (except `classNames`, `locale`, `translations`) plus:
67
+ - `onDateSelected`: `(dateObj: DateObj, event: any) => void`
68
+ - `onOffsetChanged`: `(newOffset: number) => void`
69
+ - `modifiers`: `Record<string, (date: Date) => boolean>`
70
+
71
+ ### Main Types
72
+
73
+ #### `DateObj`
74
+ Represents a single day in the calendar grid.
75
+ - `date`: `Date`
76
+ - `selected`: `boolean`
77
+ - `selectable`: `boolean`
78
+ - `today`: `boolean`
79
+ - `prevMonth`/`nextMonth`: `boolean` (if outside current month)
80
+ - `isRangeStart`/`isRangeEnd`/`isRangeBetween`/`isRangeHovering`: `boolean`
81
+ - `modifiers`: `string[]`
82
+
83
+ #### `Calendar`
84
+ Represents a month grid.
85
+ - `month`: `number` (0-11)
86
+ - `year`: `number`
87
+ - `weeks`: `(DateObj | null)[][]`
88
+
89
+ ---
90
+
91
+ ## Recipes
92
+
93
+ <details>
94
+ <summary><b>Basic Selection</b></summary>
95
+ A simple single-date selection calendar.
96
+
97
+ ```tsx
98
+ import { Calendar } from 'react-modular-datepicker';
99
+ import 'react-modular-datepicker/dist/index.css';
100
+
101
+ function BasicExample() {
102
+ return <Calendar onChange={(date) => console.log(date)} />;
103
+ }
104
+ ```
105
+
106
+ https://github.com/Dragate/react-modular-datepicker/tree/test/docs/videos/basic.webm
107
+ </details>
108
+
109
+ <details>
110
+ <summary><b>Range Selection</b></summary>
111
+ Select a start and end date with a beautiful hover preview.
112
+
113
+ ```tsx
114
+ <Calendar
115
+ selectionMode="range"
116
+ monthsToDisplay={2}
117
+ onChange={(range) => console.log(range)}
118
+ />
119
+ ```
120
+
121
+ https://github.com/Dragate/react-modular-datepicker/tree/test/docs/videos/range.webm
122
+ </details>
123
+
124
+ <details>
125
+ <summary><b>Multiple Selection</b></summary>
126
+ Select as many dates as you want.
127
+
128
+ ```tsx
129
+ <Calendar
130
+ selectionMode="multiple"
131
+ onChange={(dates) => console.log(dates)}
132
+ />
133
+ ```
134
+
135
+ https://github.com/Dragate/react-modular-datepicker/tree/test/docs/videos/multiple.webm
136
+ </details>
137
+
138
+ <details>
139
+ <summary><b>Headless Usage</b></summary>
140
+ Complete freedom over your UI using the `useDates` hook.
141
+
142
+ ```tsx
143
+ const { calendars, getDateProps } = useDates({ selectionMode: 'single' });
144
+
145
+ return (
146
+ <div className="grid grid-cols-7">
147
+ {calendars[0].weeks.flat().map((dateObj, i) => (
148
+ dateObj ? (
149
+ <button key={i} {...getDateProps({ dateObj })}>
150
+ {dateObj.date.getDate()}
151
+ </button>
152
+ ) : <div key={i} />
153
+ ))}
154
+ </div>
155
+ );
156
+ ```
157
+
158
+ https://github.com/Dragate/react-modular-datepicker/tree/test/docs/videos/headless.webm
159
+ </details>
160
+
161
+ <details>
162
+ <summary><b>Custom Styling</b></summary>
163
+ Easily customize the look and feel using the `classNames` prop.
164
+
165
+ ```tsx
166
+ <Calendar
167
+ classNames={{
168
+ root: 'bg-indigo-900 text-white',
169
+ day: {
170
+ selected: 'bg-pink-500 text-white',
171
+ today: 'border-pink-500 text-pink-500',
172
+ }
173
+ }}
174
+ />
175
+ ```
176
+
177
+ https://github.com/Dragate/react-modular-datepicker/tree/test/docs/videos/styling.webm
178
+ </details>
179
+
180
+ ---
181
+
182
+ ## Contributors
183
+
184
+ We welcome contributions! Here’s how you can get started:
185
+
186
+ ### Installation
187
+
188
+ 1. Clone the repository.
189
+ 2. Install dependencies:
190
+ ```bash
191
+ pnpm install
192
+ ```
193
+
194
+ ### Development
195
+
196
+ Start the development server with the example app:
197
+ ```bash
198
+ pnpm run dev
199
+ ```
200
+ This runs `bunchee` in watch mode for the library and starts the Next.js example app at `http://localhost:3000`.
201
+
202
+ ### Testing
203
+
204
+ Run end-to-end tests using Playwright:
205
+ ```bash
206
+ pnpm run test:e2e
207
+ ```
208
+
209
+ ### Documentation & Examples
210
+
211
+ - To update documentation, edit the `README.md`.
212
+ - To add or modify examples, check the `examples/` directory.
213
+
214
+ ### Building
215
+
216
+ Build the package for production:
217
+ ```bash
218
+ pnpm run build
219
+ ```
220
+
221
+ ---
222
+
223
+ License: MIT
@@ -0,0 +1,106 @@
1
+ import { UseDatesProps } from './useDates.js';
2
+ export { Dates, UseDatesProps, useDates } from './useDates.js';
3
+ export * from './utils.js';
4
+ import React from 'react';
5
+ import { Dayjs } from 'dayjs';
6
+
7
+ interface DateAdapter<T = any> {
8
+ date(value?: any): T;
9
+ add(date: T, amount: number, unit: 'day' | 'month' | 'year'): T;
10
+ subtract(date: T, amount: number, unit: 'day' | 'month' | 'year'): T;
11
+ startOf(date: T, unit: 'day' | 'month' | 'year'): T;
12
+ endOf(date: T, unit: 'day' | 'month' | 'year'): T;
13
+ isBefore(date: T, comparison: T, unit?: 'day' | 'month' | 'year'): boolean;
14
+ isAfter(date: T, comparison: T, unit?: 'day' | 'month' | 'year'): boolean;
15
+ isSame(date: T, comparison: T, unit?: 'day' | 'month' | 'year'): boolean;
16
+ set(date: T, unit: 'day' | 'month' | 'year', value: number): T;
17
+ get(date: T, unit: 'day' | 'month' | 'year'): number;
18
+ format(date: T, formatStr: string, locale?: string): string;
19
+ getDaysInMonth(date: T): number;
20
+ toDate(date: T): Date;
21
+ diff(date: T, comparison: T, unit: 'month' | 'year'): number;
22
+ getMonths(locale?: string): string[];
23
+ getWeekdays(locale?: string): string[];
24
+ }
25
+ type SelectionMode = 'single' | 'range' | 'multiple';
26
+ interface DateObj {
27
+ date: Date;
28
+ selected: boolean;
29
+ selectable: boolean;
30
+ today: boolean;
31
+ prevMonth: boolean;
32
+ nextMonth: boolean;
33
+ isRangeStart?: boolean;
34
+ isRangeEnd?: boolean;
35
+ isRangeBetween?: boolean;
36
+ isRangeHovering?: boolean;
37
+ modifiers?: string[];
38
+ }
39
+
40
+ interface Translations {
41
+ months: string[];
42
+ weekdays: string[];
43
+ back: string;
44
+ forward: string;
45
+ }
46
+ declare function getDefaults(adapter?: DateAdapter, locale?: string): Translations;
47
+ declare function getTranslations(adapter?: DateAdapter, locale?: string, custom?: Partial<Translations>): Translations;
48
+
49
+ interface CalendarProps extends UseDatesProps {
50
+ classNames?: {
51
+ root?: string;
52
+ header?: string;
53
+ monthName?: string;
54
+ weekday?: string;
55
+ grid?: string;
56
+ day?: any;
57
+ navButton?: string;
58
+ monthYearSelectors?: string;
59
+ };
60
+ locale?: string;
61
+ translations?: Partial<Translations>;
62
+ }
63
+ declare const Calendar: React.FC<CalendarProps>;
64
+
65
+ interface DayProps {
66
+ dateObj: DateObj | null;
67
+ getDateProps: (args: {
68
+ dateObj: DateObj;
69
+ [key: string]: any;
70
+ }) => any;
71
+ classNames?: {
72
+ day?: string;
73
+ today?: string;
74
+ selected?: string;
75
+ disabled?: string;
76
+ outside?: string;
77
+ rangeStart?: string;
78
+ rangeEnd?: string;
79
+ rangeBetween?: string;
80
+ rangeHovering?: string;
81
+ };
82
+ }
83
+ declare const Day: React.FC<DayProps>;
84
+
85
+ declare class DayjsAdapter implements DateAdapter<Dayjs> {
86
+ date(value?: any): Dayjs;
87
+ add(date: Dayjs, amount: number, unit: 'day' | 'month' | 'year'): Dayjs;
88
+ subtract(date: Dayjs, amount: number, unit: 'day' | 'month' | 'year'): Dayjs;
89
+ startOf(date: Dayjs, unit: 'day' | 'month' | 'year'): Dayjs;
90
+ endOf(date: Dayjs, unit: 'day' | 'month' | 'year'): Dayjs;
91
+ isBefore(date: Dayjs, comparison: Dayjs, unit?: 'day' | 'month' | 'year'): boolean;
92
+ isAfter(date: Dayjs, comparison: Dayjs, unit?: 'day' | 'month' | 'year'): boolean;
93
+ isSame(date: Dayjs, comparison: Dayjs, unit?: 'day' | 'month' | 'year'): boolean;
94
+ set(date: Dayjs, unit: 'day' | 'month' | 'year', value: number): Dayjs;
95
+ get(date: Dayjs, unit: 'day' | 'month' | 'year'): number;
96
+ format(date: Dayjs, formatStr: string, locale?: string): string;
97
+ getDaysInMonth(date: Dayjs): number;
98
+ toDate(date: Dayjs): Date;
99
+ diff(date: Dayjs, comparison: Dayjs, unit: 'month' | 'year'): number;
100
+ getMonths(locale?: string): string[];
101
+ getWeekdays(locale?: string): string[];
102
+ }
103
+ declare const defaultAdapter: DayjsAdapter;
104
+
105
+ export { Calendar, Day, DayjsAdapter, defaultAdapter, getDefaults, getTranslations };
106
+ export type { DateAdapter, DateObj, SelectionMode, Translations };
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./useDates.js"),t=require("./utils.js"),a=require("react"),r=require("dayjs"),l=require("dayjs/plugin/isBetween"),n=require("dayjs/plugin/customParseFormat"),o=require("dayjs/plugin/localeData");function d(e){return e&&e.__esModule?e:{default:e}}var s=d(a),u=d(r),i=d(l),c=d(n),f=d(o);let m=({dateObj:e,getDateProps:t,classNames:a})=>{if(!e)return s.default.createElement("div",{className:"aspect-square"});let{date:r,selected:l,selectable:n,today:o,prevMonth:d,nextMonth:u,isRangeStart:i,isRangeEnd:c,isRangeBetween:f,isRangeHovering:m}=e,g=d||u,p=["aspect-square flex items-center justify-center text-sm font-medium transition-all relative cursor-pointer",i&&c?"bg-brand-gold text-white rounded-full":i?"bg-brand-gold text-white rounded-l-full rounded-r-none":c?"bg-brand-gold text-white rounded-r-full rounded-l-none":f||m?"bg-brand-gray-light text-brand-text rounded-none":l?"bg-brand-gold text-white rounded-full":o?"text-brand-gold border border-brand-gold rounded-full":n?g?"text-gray-400 rounded-full":"hover:bg-brand-gray-light text-brand-text rounded-full":"text-gray-300 cursor-not-allowed",null==a?void 0:a.day,o&&(null==a?void 0:a.today),l&&(null==a?void 0:a.selected),!n&&(null==a?void 0:a.disabled),g&&(null==a?void 0:a.outside),i&&(null==a?void 0:a.rangeStart),c&&(null==a?void 0:a.rangeEnd),f&&(null==a?void 0:a.rangeBetween),m&&(null==a?void 0:a.rangeHovering),...(e.modifiers||[]).map(e=>(null==a?void 0:a[e])||e)].filter(Boolean).join(" ");return s.default.createElement("button",{...t({dateObj:e}),className:p},r.getDate())};u.default.extend(i.default),u.default.extend(c.default),u.default.extend(f.default);class g{date(e){return u.default(e)}add(e,t,a){return e.add(t,a)}subtract(e,t,a){return e.subtract(t,a)}startOf(e,t){return e.startOf(t)}endOf(e,t){return e.endOf(t)}isBefore(e,t,a){return e.isBefore(t,a)}isAfter(e,t,a){return e.isAfter(t,a)}isSame(e,t,a){return e.isSame(t,a)}set(e,t,a){return"day"===t?e.date(a):e.set(t,a)}get(e,t){return"day"===t?e.date():e.get(t)}format(e,t,a){return a?e.locale(a).format(t):e.format(t)}getDaysInMonth(e){return e.daysInMonth()}toDate(e){return e.toDate()}diff(e,t,a){return e.diff(t,a)}getMonths(e){return e?u.default().locale(e).localeData().months():u.default.localeData().months()}getWeekdays(e){return e?u.default().locale(e).localeData().weekdaysShort().map(e=>e.toUpperCase()):u.default.localeData().weekdaysShort().map(e=>e.toUpperCase())}}let p=new g;function y(e=p,t){return{months:e.getMonths(t),weekdays:e.getWeekdays(t),back:"Previous month",forward:"Next month"}}function b(e=p,t,a){return{...y(e,t),...a}}let h=()=>s.default.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},s.default.createElement("polyline",{points:"15 18 9 12 15 6"})),v=()=>s.default.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},s.default.createElement("polyline",{points:"9 18 15 12 9 6"}));!function(e){if(!e||"u"<typeof document)return;let t=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",t.appendChild(a),a.styleSheet?a.styleSheet.cssText=e:a.appendChild(document.createTextNode(e))}("@theme{--color-brand-gold:#c5a059;--color-brand-gray-light:#f1f3f5;--color-brand-gray-dark:#6c757d;--color-brand-text:#343a40}@layer base{button{@apply cursor-pointer;}}"),Object.defineProperty(exports,"Dates",{enumerable:!0,get:function(){return e.Dates}}),Object.defineProperty(exports,"useDates",{enumerable:!0,get:function(){return e.useDates}}),exports.Calendar=t=>{let{classNames:r,locale:l,translations:n,adapter:o=p,firstDayOfWeek:d=0,...u}=t,[i,c]=a.useState("days"),f=a.useRef(null),g=b(o,l,n),y=g.weekdays,x=g.months,{calendars:w,getBackProps:D,getForwardProps:E,getDateProps:N,setOffset:k}=e.useDates({...u,adapter:o,firstDayOfWeek:d}),j=[...y.slice(d),...y.slice(0,d)],{month:M,year:O}=w[0];switch(a.useEffect(()=>{if("years"===i&&f.current){let e=f.current.querySelector('[data-selected="true"]');e&&e.scrollIntoView({block:"center"})}},[i]),i){case"months":return s.default.createElement("div",{className:"w-fit p-4 bg-white rounded-lg shadow-lg min-w-[280px]"},s.default.createElement("div",{className:"flex items-center justify-between mb-4"},s.default.createElement("button",{onMouseDown:e=>e.preventDefault(),onClick:()=>c("days"),className:"p-2 hover:bg-gray-100 rounded-full"},s.default.createElement(h,null)),s.default.createElement("div",{className:"font-semibold"},O),s.default.createElement("div",{className:"w-9"})),s.default.createElement("div",{className:"grid grid-cols-3 gap-2"},x.map((e,a)=>s.default.createElement("button",{key:e,onMouseDown:e=>e.preventDefault(),onClick:()=>{let e,r,l;return e=o.set(o.set(o.date(t.date||new Date),"year",O),"month",M),r=o.set(e,"month",a),l=o.startOf(o.date(t.date||new Date),"month"),void(k(o.diff(r,l,"month")),c("days"))},className:`py-4 rounded-lg hover:bg-brand-gray-light transition-colors ${a===M?"bg-brand-gold text-white":"text-brand-text"}`},e))));case"years":let C=t.minDate?o.get(o.date(t.minDate),"year"):O-50,$=t.maxDate?o.get(o.date(t.maxDate),"year"):O+50,q=[];for(let e=C;e<=$;e++)q.push(e);return s.default.createElement("div",{className:"w-fit p-4 bg-white rounded-lg shadow-lg min-w-[280px]"},s.default.createElement("div",{className:"flex items-center justify-between mb-4"},s.default.createElement("button",{onMouseDown:e=>e.preventDefault(),onClick:()=>c("days"),className:"p-2 hover:bg-gray-100 rounded-full"},s.default.createElement(h,null)),s.default.createElement("div",{className:"font-semibold"},"Select Year"),s.default.createElement("div",{className:"w-9"})),s.default.createElement("div",{ref:f,className:"grid grid-cols-3 gap-2 max-h-[300px] overflow-y-auto pr-2"},q.map(e=>s.default.createElement("button",{key:e,"data-selected":e===O,onMouseDown:e=>e.preventDefault(),onClick:()=>{let a,r,l;return a=o.set(o.set(o.date(t.date||new Date),"year",O),"month",M),r=o.set(a,"year",e),l=o.startOf(o.date(t.date||new Date),"month"),void(k(o.diff(r,l,"month")),c("days"))},className:`py-3 rounded-lg hover:bg-brand-gray-light transition-colors ${e===O?"bg-brand-gold text-white":"text-brand-text"}`},e))));default:return s.default.createElement("div",{className:`w-fit flex flex-col md:flex-row gap-4 p-4 bg-white rounded-lg shadow-lg ${(null==r?void 0:r.root)||""}`},w.map((e,t)=>s.default.createElement("div",{key:`${e.month}-${e.year}`,className:"flex-1 min-w-[280px]"},s.default.createElement("div",{className:"flex items-center justify-between mb-6"},0===t?s.default.createElement("button",{...D({calendars:w}),onMouseDown:e=>e.preventDefault(),className:`p-2 hover:bg-gray-100 rounded-full transition-colors ${(null==r?void 0:r.navButton)||""}`,"aria-label":g.back},s.default.createElement(h,null)):s.default.createElement("div",{className:"w-9"}),s.default.createElement("div",{className:`flex gap-1 items-center font-semibold text-brand-text ${(null==r?void 0:r.monthName)||""}`},s.default.createElement("button",{onMouseDown:e=>e.preventDefault(),onClick:()=>c("months"),className:"hover:bg-gray-100 px-2 py-1 rounded"},x[e.month]),s.default.createElement("button",{onMouseDown:e=>e.preventDefault(),onClick:()=>c("years"),className:"hover:bg-gray-100 px-2 py-1 rounded"},e.year)),t===w.length-1?s.default.createElement("button",{...E({calendars:w}),onMouseDown:e=>e.preventDefault(),className:`p-2 hover:bg-gray-100 rounded-full transition-colors ${(null==r?void 0:r.navButton)||""}`,"aria-label":g.forward},s.default.createElement(v,null)):s.default.createElement("div",{className:"w-9"})),s.default.createElement("div",{className:"grid grid-cols-7 gap-1 mb-2"},j.map(e=>s.default.createElement("div",{key:e,className:`text-center text-xs font-bold text-gray-400 py-2 ${(null==r?void 0:r.weekday)||""}`},e))),s.default.createElement("div",{className:`grid grid-cols-7 gap-1 ${(null==r?void 0:r.grid)||""}`},e.weeks.map((e,t)=>e.map((e,a)=>s.default.createElement(m,{key:`${t}-${a}`,dateObj:e,getDateProps:N,classNames:null==r?void 0:r.day})))))))}},exports.Day=m,exports.DayjsAdapter=g,exports.defaultAdapter=p,exports.getDefaults=y,exports.getTranslations=b,Object.keys(t).forEach(function(e){"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:function(){return t[e]}})});
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ interface DateAdapter<T = any> {
2
+ date(value?: any): T;
3
+ add(date: T, amount: number, unit: 'day' | 'month' | 'year'): T;
4
+ subtract(date: T, amount: number, unit: 'day' | 'month' | 'year'): T;
5
+ startOf(date: T, unit: 'day' | 'month' | 'year'): T;
6
+ endOf(date: T, unit: 'day' | 'month' | 'year'): T;
7
+ isBefore(date: T, comparison: T, unit?: 'day' | 'month' | 'year'): boolean;
8
+ isAfter(date: T, comparison: T, unit?: 'day' | 'month' | 'year'): boolean;
9
+ isSame(date: T, comparison: T, unit?: 'day' | 'month' | 'year'): boolean;
10
+ set(date: T, unit: 'day' | 'month' | 'year', value: number): T;
11
+ get(date: T, unit: 'day' | 'month' | 'year'): number;
12
+ format(date: T, formatStr: string, locale?: string): string;
13
+ getDaysInMonth(date: T): number;
14
+ toDate(date: T): Date;
15
+ diff(date: T, comparison: T, unit: 'month' | 'year'): number;
16
+ getMonths(locale?: string): string[];
17
+ getWeekdays(locale?: string): string[];
18
+ }
19
+ type SelectionMode = 'single' | 'range' | 'multiple';
20
+ interface DateObj {
21
+ date: Date;
22
+ selected: boolean;
23
+ selectable: boolean;
24
+ today: boolean;
25
+ prevMonth: boolean;
26
+ nextMonth: boolean;
27
+ isRangeStart?: boolean;
28
+ isRangeEnd?: boolean;
29
+ isRangeBetween?: boolean;
30
+ isRangeHovering?: boolean;
31
+ modifiers?: string[];
32
+ }
33
+ interface Calendar {
34
+ firstDayOfMonth: Date;
35
+ lastDayOfMonth: Date;
36
+ month: number;
37
+ year: number;
38
+ weeks: (DateObj | null)[][];
39
+ }
40
+
41
+ interface UseDatesProps {
42
+ date?: Date;
43
+ maxDate?: Date;
44
+ minDate?: Date;
45
+ disabledDates?: Date[];
46
+ monthsToDisplay?: number;
47
+ firstDayOfWeek?: number;
48
+ showOutsideDays?: boolean;
49
+ offset?: number;
50
+ onDateSelected?: (dateObj: DateObj, event: any) => void;
51
+ onOffsetChanged?: (newOffset: number) => void;
52
+ selected?: Date | Date[] | {
53
+ start?: Date;
54
+ end?: Date;
55
+ };
56
+ modifiers?: Record<string, (date: Date) => boolean>;
57
+ selectionMode?: SelectionMode;
58
+ adapter?: DateAdapter;
59
+ onChange?: (selected: Date | Date[] | {
60
+ start?: Date;
61
+ end?: Date;
62
+ } | null) => void;
63
+ onMonthChange?: (date: Date) => void;
64
+ onYearChange?: (date: Date) => void;
65
+ }
66
+ declare function useDates({ date, maxDate, minDate, disabledDates, monthsToDisplay, firstDayOfWeek, showOutsideDays, offset, onDateSelected, onOffsetChanged, selected, modifiers, selectionMode, adapter, onChange, onMonthChange, onYearChange }: UseDatesProps): {
67
+ calendars: Calendar[];
68
+ getDateProps: (args: {
69
+ onClick?: (event: any) => void;
70
+ dateObj: DateObj;
71
+ [key: string]: any;
72
+ }) => {
73
+ onMouseEnter: (event: any, ...args: unknown[]) => boolean;
74
+ onMouseLeave: (event: any, ...args: unknown[]) => boolean;
75
+ onClick: (event: any, ...args: unknown[]) => boolean;
76
+ disabled: boolean;
77
+ 'aria-label': string;
78
+ 'aria-pressed': boolean;
79
+ role: string;
80
+ };
81
+ getBackProps: (args_0: {
82
+ [key: string]: any;
83
+ onClick?: (event: any) => void;
84
+ offset?: number;
85
+ calendars: Calendar[];
86
+ }) => {
87
+ onClick: (event: any, ...args: unknown[]) => boolean;
88
+ disabled: boolean;
89
+ 'aria-label': string;
90
+ };
91
+ getForwardProps: (args_0: {
92
+ [key: string]: any;
93
+ onClick?: (event: any) => void;
94
+ offset?: number;
95
+ calendars: Calendar[];
96
+ }) => {
97
+ onClick: (event: any, ...args: unknown[]) => boolean;
98
+ disabled: boolean;
99
+ 'aria-label': string;
100
+ };
101
+ setOffset: (newOffset: number) => void;
102
+ };
103
+ declare function Dates(props: UseDatesProps & {
104
+ render?: (props: any) => any;
105
+ children?: (props: any) => any;
106
+ }): any;
107
+
108
+ export { Dates, useDates };
109
+ export type { UseDatesProps };
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("dayjs"),a=require("dayjs/plugin/isBetween"),r=require("dayjs/plugin/customParseFormat"),n=require("dayjs/plugin/localeData"),d=require("./utils.js");function s(e){return e&&e.__esModule?e:{default:e}}var o=s(t),l=s(a),u=s(r),i=s(n);o.default.extend(l.default),o.default.extend(u.default),o.default.extend(i.default);let f=new class{date(e){return o.default(e)}add(e,t,a){return e.add(t,a)}subtract(e,t,a){return e.subtract(t,a)}startOf(e,t){return e.startOf(t)}endOf(e,t){return e.endOf(t)}isBefore(e,t,a){return e.isBefore(t,a)}isAfter(e,t,a){return e.isAfter(t,a)}isSame(e,t,a){return e.isSame(t,a)}set(e,t,a){return"day"===t?e.date(a):e.set(t,a)}get(e,t){return"day"===t?e.date():e.get(t)}format(e,t,a){return a?e.locale(a).format(t):e.format(t)}getDaysInMonth(e){return e.daysInMonth()}toDate(e){return e.toDate()}diff(e,t,a){return e.diff(t,a)}getMonths(e){return e?o.default().locale(e).localeData().months():o.default.localeData().months()}getWeekdays(e){return e?o.default().locale(e).localeData().weekdaysShort().map(e=>e.toUpperCase()):o.default.localeData().weekdaysShort().map(e=>e.toUpperCase())}};function c({minDate:e,offsetMonth:t,handleOffsetChanged:a,adapter:r},{onClick:n,offset:s=1,calendars:o,...l}){return{onClick:d.composeEventHandlers(n,()=>{a(t-d.subtractMonth({calendars:o,offset:s,minDate:e,adapter:r}))}),disabled:d.isBackDisabled({calendars:o,minDate:e,adapter:r}),"aria-label":`Go back ${s} month${1===s?"":"s"}`,...l}}function p({maxDate:e,offsetMonth:t,handleOffsetChanged:a,adapter:r},{onClick:n,offset:s=1,calendars:o,...l}){return{onClick:d.composeEventHandlers(n,()=>{a(t+d.addMonth({calendars:o,offset:s,maxDate:e,adapter:r}))}),disabled:d.isForwardDisabled({calendars:o,maxDate:e,adapter:r}),"aria-label":`Go forward ${s} month${1===s?"":"s"}`,...l}}function m({date:t=new Date,maxDate:a,minDate:r,disabledDates:n,monthsToDisplay:s=1,firstDayOfWeek:o=0,showOutsideDays:l=!1,offset:u,onDateSelected:i,onOffsetChanged:b=()=>{},selected:y,modifiers:v,selectionMode:g="single",adapter:D=f,onChange:h,onMonthChange:k,onYearChange:M}){let[w,C]=e.useState(0),[S,j]=e.useState(void 0),O=function(e,t=0){return void 0!==e?e:t}(u,w),E=e.useCallback(e=>{void 0===u&&C(e),b(e);let a=D.toDate(D.add(D.startOf(D.date(t),"month"),e,"month"));null==k||k(a),null==M||M(a)},[u,b,t,D,k,M]),q=e.useCallback((e,t)=>{if(null==i||i(e,t),h){if("single"===g)h(e.date);else if("multiple"===g){let t=Array.isArray(y)?y:y?[y]:[];t.some(t=>D.isSame(D.date(t),D.date(e.date),"day"))?h(t.filter(t=>!D.isSame(D.date(t),D.date(e.date),"day"))):h([...t,e.date])}else if("range"===g){let t=y&&"object"==typeof y&&!Array.isArray(y)?y:{start:void 0,end:void 0};!t.start||t.start&&t.end?h({start:e.date,end:void 0}):D.isBefore(D.date(e.date),D.date(t.start),"day")?h({start:e.date,end:t.start}):h({start:t.start,end:e.date})}}},[i,h,g,y,D]);return{calendars:d.getCalendars({date:t,selected:y,disabledDates:n,modifiers:v,monthsToDisplay:s,minDate:r,maxDate:a,offset:O,firstDayOfWeek:o,showOutsideDays:l,adapter:D,selectionMode:g,hoveredDate:S}),getDateProps:e=>({...function(e,{onClick:t,dateObj:a,...r}){return{onClick:d.composeEventHandlers(t,t=>{e(a,t)}),disabled:!a.selectable,"aria-label":a.date.toDateString(),"aria-pressed":a.selected,role:"button",...r}}(q,e),onMouseEnter:d.composeEventHandlers(e.onMouseEnter,()=>{j(e.dateObj.date)}),onMouseLeave:d.composeEventHandlers(e.onMouseLeave,()=>{j(void 0)})}),getBackProps:c.bind(null,{minDate:r,offsetMonth:O,handleOffsetChanged:E,adapter:D}),getForwardProps:p.bind(null,{maxDate:a,offsetMonth:O,handleOffsetChanged:E,adapter:D}),setOffset:E}}exports.Dates=function(e){let t=m(e);return d.unwrapChildrenForPreact(e.render||e.children)(t)},exports.useDates=m;
2
+ //# sourceMappingURL=useDates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDates.js","sources":["../../src/adapters/dayjs.ts","../../src/useDates.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport type { Dayjs } from 'dayjs';\nimport isBetween from 'dayjs/plugin/isBetween';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport localeData from 'dayjs/plugin/localeData';\nimport type { DateAdapter } from '../types';\n\ndayjs.extend(isBetween);\ndayjs.extend(customParseFormat);\ndayjs.extend(localeData);\n\nexport class DayjsAdapter implements DateAdapter<Dayjs> {\n date(value?: any): Dayjs {\n return dayjs(value);\n }\n\n add(date: Dayjs, amount: number, unit: 'day' | 'month' | 'year'): Dayjs {\n return date.add(amount, unit);\n }\n\n subtract(date: Dayjs, amount: number, unit: 'day' | 'month' | 'year'): Dayjs {\n return date.subtract(amount, unit);\n }\n\n startOf(date: Dayjs, unit: 'day' | 'month' | 'year'): Dayjs {\n return date.startOf(unit);\n }\n\n endOf(date: Dayjs, unit: 'day' | 'month' | 'year'): Dayjs {\n return date.endOf(unit);\n }\n\n isBefore(date: Dayjs, comparison: Dayjs, unit?: 'day' | 'month' | 'year'): boolean {\n return date.isBefore(comparison, unit);\n }\n\n isAfter(date: Dayjs, comparison: Dayjs, unit?: 'day' | 'month' | 'year'): boolean {\n return date.isAfter(comparison, unit);\n }\n\n isSame(date: Dayjs, comparison: Dayjs, unit?: 'day' | 'month' | 'year'): boolean {\n return date.isSame(comparison, unit);\n }\n\n set(date: Dayjs, unit: 'day' | 'month' | 'year', value: number): Dayjs {\n if (unit === 'day') return date.date(value);\n return date.set(unit, value);\n }\n\n get(date: Dayjs, unit: 'day' | 'month' | 'year'): number {\n if (unit === 'day') return date.date();\n return date.get(unit);\n }\n\n format(date: Dayjs, formatStr: string, locale?: string): string {\n if (locale) {\n return date.locale(locale).format(formatStr);\n }\n return date.format(formatStr);\n }\n\n getDaysInMonth(date: Dayjs): number {\n return date.daysInMonth();\n }\n\n toDate(date: Dayjs): Date {\n return date.toDate();\n }\n\n diff(date: Dayjs, comparison: Dayjs, unit: 'month' | 'year'): number {\n return date.diff(comparison, unit);\n }\n\n getMonths(locale?: string): string[] {\n return locale ? dayjs().locale(locale).localeData().months() : dayjs.localeData().months();\n }\n\n getWeekdays(locale?: string): string[] {\n return locale ? dayjs().locale(locale).localeData().weekdaysShort().map(d => d.toUpperCase()) : dayjs.localeData().weekdaysShort().map(d => d.toUpperCase());\n }\n}\n\nexport const defaultAdapter = new DayjsAdapter();\n","import { useState, useCallback } from 'react';\nimport type { DateAdapter, DateObj, SelectionMode, Calendar } from './types';\nimport { defaultAdapter } from './adapters/dayjs';\nimport {\n addMonth,\n composeEventHandlers,\n getCalendars,\n isBackDisabled,\n isForwardDisabled,\n subtractMonth,\n unwrapChildrenForPreact\n} from './utils';\n\nfunction isOffsetControlled(propOffset?: number) {\n return propOffset !== undefined;\n}\n\nfunction getOffset(prop?: number, state: number = 0): number {\n return isOffsetControlled(prop) ? prop! : state;\n}\n\nfunction getDateProps(\n onDateSelected: (dateObj: DateObj, event: any) => void,\n { onClick, dateObj, ...rest }: { onClick?: (event: any) => void, dateObj: DateObj, [key: string]: any }\n) {\n return {\n onClick: composeEventHandlers(onClick, (event: any) => {\n onDateSelected(dateObj, event);\n }),\n disabled: !dateObj.selectable,\n 'aria-label': dateObj.date.toDateString(),\n 'aria-pressed': dateObj.selected,\n role: 'button',\n ...rest\n };\n}\n\nfunction getBackProps(\n { minDate, offsetMonth, handleOffsetChanged, adapter }: { minDate?: Date, offsetMonth: number, handleOffsetChanged: (newOffset: number) => void, adapter: DateAdapter },\n {\n onClick,\n offset = 1,\n calendars,\n ...rest\n }: { onClick?: (event: any) => void, offset?: number, calendars: Calendar[], [key: string]: any }\n) {\n return {\n onClick: composeEventHandlers(onClick, () => {\n handleOffsetChanged(\n offsetMonth - subtractMonth({ calendars, offset, minDate, adapter })\n );\n }),\n disabled: isBackDisabled({ calendars, minDate, adapter }),\n 'aria-label': `Go back ${offset} month${offset === 1 ? '' : 's'}`,\n ...rest\n };\n}\n\nfunction getForwardProps(\n { maxDate, offsetMonth, handleOffsetChanged, adapter }: { maxDate?: Date, offsetMonth: number, handleOffsetChanged: (newOffset: number) => void, adapter: DateAdapter },\n {\n onClick,\n offset = 1,\n calendars,\n ...rest\n }: { onClick?: (event: any) => void, offset?: number, calendars: Calendar[], [key: string]: any }\n) {\n return {\n onClick: composeEventHandlers(onClick, () => {\n handleOffsetChanged(\n offsetMonth + addMonth({ calendars, offset, maxDate, adapter })\n );\n }),\n disabled: isForwardDisabled({ calendars, maxDate, adapter }),\n 'aria-label': `Go forward ${offset} month${offset === 1 ? '' : 's'}`,\n ...rest\n };\n}\n\nexport interface UseDatesProps {\n date?: Date;\n maxDate?: Date;\n minDate?: Date;\n disabledDates?: Date[];\n monthsToDisplay?: number;\n firstDayOfWeek?: number;\n showOutsideDays?: boolean;\n offset?: number;\n onDateSelected?: (dateObj: DateObj, event: any) => void;\n onOffsetChanged?: (newOffset: number) => void;\n selected?: Date | Date[] | { start?: Date, end?: Date };\n modifiers?: Record<string, (date: Date) => boolean>;\n selectionMode?: SelectionMode;\n adapter?: DateAdapter;\n onChange?: (selected: Date | Date[] | { start?: Date, end?: Date } | null) => void;\n onMonthChange?: (date: Date) => void;\n onYearChange?: (date: Date) => void;\n}\n\nexport function useDates({\n date = new Date(),\n maxDate,\n minDate,\n disabledDates,\n monthsToDisplay = 1,\n firstDayOfWeek = 0,\n showOutsideDays = false,\n offset,\n onDateSelected,\n onOffsetChanged = () => { },\n selected,\n modifiers,\n selectionMode = 'single',\n adapter = defaultAdapter,\n onChange,\n onMonthChange,\n onYearChange\n}: UseDatesProps) {\n const [stateOffset, setStateOffset] = useState(0);\n const [hoveredDate, setHoveredDate] = useState<Date | undefined>(undefined);\n const offsetMonth = getOffset(offset, stateOffset);\n\n const handleOffsetChanged = useCallback((newOffset: number) => {\n if (!isOffsetControlled(offset)) {\n setStateOffset(newOffset);\n }\n onOffsetChanged(newOffset);\n\n const newDate = adapter.toDate(adapter.add(adapter.startOf(adapter.date(date), 'month'), newOffset, 'month'));\n onMonthChange?.(newDate);\n onYearChange?.(newDate);\n }, [offset, onOffsetChanged, date, adapter, onMonthChange, onYearChange]);\n\n const handleDateSelected = useCallback((dateObj: DateObj, event: any) => {\n onDateSelected?.(dateObj, event);\n\n if (!onChange) return;\n\n if (selectionMode === 'single') {\n onChange(dateObj.date);\n } else if (selectionMode === 'multiple') {\n const currentSelected = Array.isArray(selected) ? selected : (selected ? [selected as Date] : []);\n const isAlreadySelected = currentSelected.some(d => adapter.isSame(adapter.date(d), adapter.date(dateObj.date), 'day'));\n if (isAlreadySelected) {\n onChange(currentSelected.filter(d => !adapter.isSame(adapter.date(d), adapter.date(dateObj.date), 'day')));\n } else {\n onChange([...currentSelected, dateObj.date]);\n }\n } else if (selectionMode === 'range') {\n const range = (selected && typeof selected === 'object' && !Array.isArray(selected)) ? selected : { start: undefined, end: undefined };\n if (!range.start || (range.start && range.end)) {\n onChange({ start: dateObj.date, end: undefined });\n } else {\n if (adapter.isBefore(adapter.date(dateObj.date), adapter.date(range.start), 'day')) {\n onChange({ start: dateObj.date, end: range.start });\n } else {\n onChange({ start: range.start, end: dateObj.date });\n }\n }\n }\n }, [onDateSelected, onChange, selectionMode, selected, adapter]);\n\n const calendars = getCalendars({\n date,\n selected,\n disabledDates,\n modifiers,\n monthsToDisplay,\n minDate,\n maxDate,\n offset: offsetMonth,\n firstDayOfWeek,\n showOutsideDays,\n adapter,\n selectionMode,\n hoveredDate\n });\n\n return {\n calendars,\n getDateProps: (args: { onClick?: (event: any) => void, dateObj: DateObj, [key: string]: any }) => {\n const props = getDateProps(handleDateSelected, args);\n return {\n ...props,\n onMouseEnter: composeEventHandlers(args.onMouseEnter, () => {\n setHoveredDate(args.dateObj.date);\n }),\n onMouseLeave: composeEventHandlers(args.onMouseLeave, () => {\n setHoveredDate(undefined);\n })\n };\n },\n getBackProps: getBackProps.bind(null, {\n minDate,\n offsetMonth,\n handleOffsetChanged,\n adapter\n }),\n getForwardProps: getForwardProps.bind(null, {\n maxDate,\n offsetMonth,\n handleOffsetChanged,\n adapter\n }),\n setOffset: handleOffsetChanged\n };\n}\n\nexport function Dates(props: UseDatesProps & { render?: (props: any) => any, children?: (props: any) => any }) {\n const ComponentCalendar = useDates(props);\n const children = unwrapChildrenForPreact(props.render || props.children);\n //@ts-ignore\n return children(ComponentCalendar);\n}\n"],"names":["dayjs","extend","isBetween","customParseFormat","localeData","defaultAdapter","date","value","add","amount","unit","subtract","startOf","endOf","isBefore","comparison","isAfter","isSame","set","get","format","formatStr","locale","getDaysInMonth","daysInMonth","toDate","diff","getMonths","months","getWeekdays","weekdaysShort","map","d","toUpperCase","getBackProps","minDate","offsetMonth","handleOffsetChanged","adapter","onClick","offset","calendars","rest","composeEventHandlers","subtractMonth","disabled","isBackDisabled","getForwardProps","maxDate","addMonth","isForwardDisabled","useDates","Date","disabledDates","monthsToDisplay","firstDayOfWeek","showOutsideDays","onDateSelected","onOffsetChanged","selected","modifiers","selectionMode","onChange","onMonthChange","onYearChange","stateOffset","setStateOffset","useState","hoveredDate","setHoveredDate","undefined","getOffset","prop","state","isOffsetControlled","propOffset","useCallback","newOffset","newDate","handleDateSelected","dateObj","event","currentSelected","Array","isArray","some","filter","range","start","end","getCalendars","getDateProps","args","selectable","toDateString","role","onMouseEnter","onMouseLeave","bind","setOffset","props","ComponentCalendar","children","unwrapChildrenForPreact","render"],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ interface DateAdapter<T = any> {
2
+ date(value?: any): T;
3
+ add(date: T, amount: number, unit: 'day' | 'month' | 'year'): T;
4
+ subtract(date: T, amount: number, unit: 'day' | 'month' | 'year'): T;
5
+ startOf(date: T, unit: 'day' | 'month' | 'year'): T;
6
+ endOf(date: T, unit: 'day' | 'month' | 'year'): T;
7
+ isBefore(date: T, comparison: T, unit?: 'day' | 'month' | 'year'): boolean;
8
+ isAfter(date: T, comparison: T, unit?: 'day' | 'month' | 'year'): boolean;
9
+ isSame(date: T, comparison: T, unit?: 'day' | 'month' | 'year'): boolean;
10
+ set(date: T, unit: 'day' | 'month' | 'year', value: number): T;
11
+ get(date: T, unit: 'day' | 'month' | 'year'): number;
12
+ format(date: T, formatStr: string, locale?: string): string;
13
+ getDaysInMonth(date: T): number;
14
+ toDate(date: T): Date;
15
+ diff(date: T, comparison: T, unit: 'month' | 'year'): number;
16
+ getMonths(locale?: string): string[];
17
+ getWeekdays(locale?: string): string[];
18
+ }
19
+ interface DateObj {
20
+ date: Date;
21
+ selected: boolean;
22
+ selectable: boolean;
23
+ today: boolean;
24
+ prevMonth: boolean;
25
+ nextMonth: boolean;
26
+ isRangeStart?: boolean;
27
+ isRangeEnd?: boolean;
28
+ isRangeBetween?: boolean;
29
+ isRangeHovering?: boolean;
30
+ modifiers?: string[];
31
+ }
32
+ interface Calendar {
33
+ firstDayOfMonth: Date;
34
+ lastDayOfMonth: Date;
35
+ month: number;
36
+ year: number;
37
+ weeks: (DateObj | null)[][];
38
+ }
39
+
40
+ declare function composeEventHandlers(...fns: Array<((event: any, ...args: unknown[]) => void) | undefined>): (event: any, ...args: unknown[]) => boolean;
41
+ declare function unwrapChildrenForPreact<T>(arg: T | T[]): T | typeof noop;
42
+ declare function noop(): void;
43
+ declare function subtractMonth({ calendars, offset, minDate, adapter }: {
44
+ calendars: Calendar[];
45
+ offset: number;
46
+ minDate?: Date;
47
+ adapter?: DateAdapter;
48
+ }): number;
49
+ declare function addMonth({ calendars, offset, maxDate, adapter }: {
50
+ calendars: Calendar[];
51
+ offset: number;
52
+ maxDate?: Date;
53
+ adapter?: DateAdapter;
54
+ }): number;
55
+ declare function isBackDisabled({ calendars, minDate, adapter }: {
56
+ calendars: Calendar[];
57
+ minDate?: Date;
58
+ adapter?: DateAdapter;
59
+ }): boolean;
60
+ declare function isForwardDisabled({ calendars, maxDate, adapter }: {
61
+ calendars: Calendar[];
62
+ maxDate?: Date;
63
+ adapter?: DateAdapter;
64
+ }): boolean;
65
+ declare function getCalendars({ date, selected, disabledDates, monthsToDisplay, offset, minDate, maxDate, firstDayOfWeek, showOutsideDays, adapter, selectionMode, modifiers, hoveredDate }: {
66
+ date: Date;
67
+ selected?: Date | Date[] | {
68
+ start?: Date;
69
+ end?: Date;
70
+ };
71
+ disabledDates?: Date[];
72
+ modifiers?: Record<string, (date: Date) => boolean>;
73
+ monthsToDisplay: number;
74
+ offset: number;
75
+ minDate?: Date;
76
+ maxDate?: Date;
77
+ firstDayOfWeek: number;
78
+ showOutsideDays: boolean;
79
+ adapter?: DateAdapter;
80
+ selectionMode?: 'single' | 'range' | 'multiple';
81
+ hoveredDate?: Date;
82
+ }): Calendar[];
83
+
84
+ export { addMonth, composeEventHandlers, getCalendars, isBackDisabled, isForwardDisabled, subtractMonth, unwrapChildrenForPreact };
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,"__esModule",{value:!0});var e=require("dayjs"),t=require("dayjs/plugin/isBetween"),a=require("dayjs/plugin/customParseFormat"),r=require("dayjs/plugin/localeData");function d(e){return e&&e.__esModule?e:{default:e}}var n=d(e),s=d(t),o=d(a),i=d(r);n.default.extend(s.default),n.default.extend(o.default),n.default.extend(i.default);let u=new class{date(e){return n.default(e)}add(e,t,a){return e.add(t,a)}subtract(e,t,a){return e.subtract(t,a)}startOf(e,t){return e.startOf(t)}endOf(e,t){return e.endOf(t)}isBefore(e,t,a){return e.isBefore(t,a)}isAfter(e,t,a){return e.isAfter(t,a)}isSame(e,t,a){return e.isSame(t,a)}set(e,t,a){return"day"===t?e.date(a):e.set(t,a)}get(e,t){return"day"===t?e.date():e.get(t)}format(e,t,a){return a?e.locale(a).format(t):e.format(t)}getDaysInMonth(e){return e.daysInMonth()}toDate(e){return e.toDate()}diff(e,t,a){return e.diff(t,a)}getMonths(e){return e?n.default().locale(e).localeData().months():n.default.localeData().months()}getWeekdays(e){return e?n.default().locale(e).localeData().weekdaysShort().map(e=>e.toUpperCase()):n.default.localeData().weekdaysShort().map(e=>e.toUpperCase())}};function f(){}function l(e,t,a,r,d,n,s,o,i=!1,u){var f,y,c,h,m;let p,g,D,S,{selected:A,isRangeStart:B,isRangeEnd:x,isRangeBetween:v,isRangeHovering:M}=function(e,t,a,r,d){if(!e&&!d)return{selected:!1};let n=a.date(t);if("single"===r&&e instanceof Date)return{selected:a.isSame(n,a.date(e),"day")};if("multiple"===r&&Array.isArray(e))return{selected:e.some(e=>a.isSame(n,a.date(e),"day"))};if("range"===r){let{start:t,end:r}=e&&"object"==typeof e&&!Array.isArray(e)?e:{start:void 0,end:void 0},s=!!t&&a.isSame(n,a.date(t),"day"),o=!!r&&a.isSame(n,a.date(r),"day"),i=!!t&&!!r&&a.isAfter(n,a.date(t),"day")&&a.isBefore(n,a.date(r),"day"),u=!1;if(t&&!r&&d){let e=a.date(d),r=a.date(t);a.isAfter(e,r,"day")?(u=a.isAfter(n,r,"day")&&a.isBefore(n,e,"day")||a.isSame(n,e,"day"),a.isSame(n,e,"day")&&(o=!0)):a.isBefore(e,r,"day")&&(u=a.isAfter(n,e,"day")&&a.isBefore(n,r,"day")||a.isSame(n,e,"day"),a.isSame(n,e,"day")&&(s=!0),a.isSame(n,r,"day")&&(s=!1,o=!0))}return{selected:s||o||i,isRangeStart:s,isRangeEnd:o,isRangeBetween:i,isRangeHovering:u}}return Array.isArray(e)&&1===e.length&&"single"===r?{selected:a.isSame(n,a.date(e[0]),"day")}:{selected:!1}}(t,e,s,o,u),O=s.isSame(s.date(e),s.date(),"day"),b=i&&s.isBefore(s.date(e),s.startOf(s.date(e),"month")),w=i&&s.isAfter(s.date(e),s.endOf(s.date(e),"month")),j=r?Object.keys(r).filter(t=>r[t](e)):[];return O&&j.push("today"),i&&j.push("outside"),b&&j.push("prev-month"),w&&j.push("next-month"),{date:e,selected:A,modifiers:j,selectable:(f=d,y=n,c=a,h=e,p=(m=s).date(h),g=f&&m.isBefore(p,m.date(f),"day"),D=y&&m.isAfter(p,m.date(y),"day"),S=null==c?void 0:c.some(e=>m.isSame(p,m.date(e),"day")),!g&&!D&&!S),today:O,prevMonth:b,nextMonth:w,isRangeStart:B,isRangeEnd:x,isRangeBetween:v,isRangeHovering:M}}exports.addMonth=function({calendars:e,offset:t,maxDate:a,adapter:r=u}){if(t>1&&a){let{lastDayOfMonth:d}=e[e.length-1],n=r.diff(r.date(a),r.date(d),"month");n<t&&(t=n)}return t},exports.composeEventHandlers=function(...e){return(t,...a)=>e.some(e=>(e&&e(t,...a),t.defaultPrevented))},exports.getCalendars=function({date:e,selected:t,disabledDates:a,monthsToDisplay:r,offset:d,minDate:n,maxDate:s,firstDayOfWeek:o,showOutsideDays:i,adapter:f=u,selectionMode:y="single",modifiers:c,hoveredDate:h}){let m=[],p=function(e,t,a,r=u){let d=r.startOf(r.date(e),"day");if(t){let e=r.startOf(r.date(t),"day");r.isBefore(d,e)&&(d=e)}if(a){let e=r.startOf(r.date(a),"day");r.isBefore(e,d)&&(d=e)}return d}(e,n,s,f);for(let e=0;e<r;e++){let r=function({month:e,year:t,selectedDates:a,disabledDates:r,modifiers:d,minDate:n,maxDate:s,firstDayOfWeek:o,showOutsideDays:i,adapter:u,selectionMode:f,hoveredDate:y}){let c=u.set(u.set(u.date(),"year",t),"month",e);e=u.get(c,"month"),t=u.get(c,"year");let h=u.getDaysInMonth(c),m=[];for(let e=1;e<=h;e++){let t=l(u.toDate(u.set(c,"day",e)),a,r,d,n,s,u,f,!1,y);m.push(t)}let p=u.toDate(u.startOf(c,"month")),g=u.toDate(u.endOf(c,"month")),D=function({firstDayOfMonth:e,minDate:t,maxDate:a,selectedDates:r,disabledDates:d,modifiers:n,firstDayOfWeek:s,showOutsideDays:o,adapter:i,selectionMode:u,hoveredDate:f}){let y=[],c=(i.toDate(i.date(e)).getDay()+7-s)%7;if(o){let s=i.subtract(i.date(e),1,"day");for(let e=0;e<c;e++){let e=l(i.toDate(s),r,d,n,t,a,i,u,!0,f);e.prevMonth=!0,y.unshift(e),s=i.subtract(s,1,"day")}}else for(;c>0;)y.unshift(null),c--;return y}({firstDayOfMonth:p,minDate:n,maxDate:s,selectedDates:a,disabledDates:r,modifiers:d,firstDayOfWeek:o,showOutsideDays:i,adapter:u,selectionMode:f,hoveredDate:y}),S=function({lastDayOfMonth:e,minDate:t,maxDate:a,selectedDates:r,disabledDates:d,modifiers:n,firstDayOfWeek:s,showOutsideDays:o,adapter:i,selectionMode:u,hoveredDate:f}){let y=[],c=(i.toDate(i.date(e)).getDay()+7-s)%7;if(o){let s=i.add(i.date(e),1,"day");for(let e=0;e<6-c;e++){let e=l(i.toDate(s),r,d,n,t,a,i,u,!0,f);e.nextMonth=!0,y.push(e),s=i.add(s,1,"day")}}else for(;c<6;)y.push(null),c++;return y}({lastDayOfMonth:g,minDate:n,maxDate:s,selectedDates:a,disabledDates:r,modifiers:d,firstDayOfWeek:o,showOutsideDays:i,adapter:u,selectionMode:f,hoveredDate:y});return m.unshift(...D),m.push(...S),{firstDayOfMonth:p,lastDayOfMonth:g,month:e,year:t,weeks:function(e){let t=Math.ceil(e.length/7),a=[];for(let r=0;r<t;r++){a[r]=[];for(let t=0;t<7;t++)a[r].push(e[7*r+t])}return a}(m)}}({month:f.get(p,"month")+e+d,year:f.get(p,"year"),selectedDates:t,disabledDates:a,modifiers:c,minDate:n,maxDate:s,firstDayOfWeek:o,showOutsideDays:i,adapter:f,selectionMode:y,hoveredDate:h});m.push(r)}return m},exports.isBackDisabled=function({calendars:e,minDate:t,adapter:a=u}){if(!t)return!1;let{firstDayOfMonth:r}=e[0],d=a.subtract(a.date(r),1,"day");return a.isBefore(d,a.date(t))},exports.isForwardDisabled=function({calendars:e,maxDate:t,adapter:a=u}){if(!t)return!1;let{lastDayOfMonth:r}=e[e.length-1],d=a.add(a.date(r),1,"day");return a.isBefore(a.date(t),d)},exports.subtractMonth=function({calendars:e,offset:t,minDate:a,adapter:r=u}){if(t>1&&a){let{firstDayOfMonth:d}=e[0],n=r.diff(r.date(d),r.date(a),"month");n<t&&(t=n)}return t},exports.unwrapChildrenForPreact=function(e){return(e=Array.isArray(e)?e[0]:e)||f};
2
+ //# sourceMappingURL=utils.js.map