aryan-date-picker 0.1.0

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/dist/index.css ADDED
@@ -0,0 +1 @@
1
+ .adp-picker,.adp-date-picker,.adp-date-picker *{box-sizing:border-box}.adp-picker{display:inline-flex;flex-direction:column;gap:.75rem;font:inherit;color:#111827}.adp-date-picker{width:18rem;display:inline-flex;flex-direction:column;gap:.5rem;padding:.75rem;border:1px solid #d1d5db;border-radius:.75rem;background:#fff}.adp-calendar-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.adp-calendar-header-centered{justify-content:center}.adp-month-label{font-weight:600}.adp-nav-button,.adp-day{border:0;font:inherit;cursor:pointer}.adp-nav-button{width:2rem;height:2rem;border-radius:999px;background:#f3f4f6;color:#111827}.adp-range-calendars{display:flex;align-items:center;gap:.5rem}.adp-range-calendar-surface{display:flex;align-items:stretch}.adp-range-calendar-surface .adp-date-picker{border-radius:0}.adp-range-calendar-surface .adp-date-picker:first-child{border-start-start-radius:.75rem;border-end-start-radius:.75rem}.adp-range-calendar-surface .adp-date-picker:last-child{margin-inline-start:-1px;border-start-end-radius:.75rem;border-end-end-radius:.75rem}.adp-range-nav-button{flex:0 0 auto}.adp-nav-button:hover,.adp-day:not(.adp-day-placeholder):hover{background:#e5e7eb}.adp-calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:.25rem}.adp-weekdays{margin-top:.25rem}.adp-weekday{color:#6b7280;font-size:.75rem;font-weight:600;text-align:center}.adp-day{min-width:2rem;height:2rem;border-radius:999px;background:transparent;color:#111827}.adp-day-placeholder{cursor:default;pointer-events:none}.adp-day-in-range{border-radius:.25rem;background:#dbeafe}.adp-day-selected,.adp-day-range-start,.adp-day-range-end{background:#2563eb;color:#fff}.adp-day-selected:hover,.adp-day-range-start:hover,.adp-day-range-end:hover{background:#1d4ed8}.adp-selection-label{color:#4b5563;font-size:.875rem}.adp-range-calendars-mobile{display:none}@media(max-width:640px){.adp-picker{width:100%}.adp-date-picker{width:100%;padding:.5rem;border-radius:.5rem}.adp-day{width:100%;min-width:0;height:2.5rem}.adp-range-calendars-desktop{display:none}.adp-range-calendars-mobile{display:flex;width:100%;flex-direction:column;gap:0}.adp-range-calendars-mobile .adp-date-picker{border-radius:0}.adp-range-calendars-mobile .adp-date-picker+.adp-date-picker{margin-top:-1px}.adp-range-calendars-mobile .adp-date-picker:first-child{border-start-start-radius:.5rem;border-start-end-radius:.5rem}.adp-range-calendars-mobile .adp-date-picker:last-child{border-end-start-radius:.5rem;border-end-end-radius:.5rem}}
@@ -0,0 +1,72 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+
4
+ type DatePickerProps = {
5
+ value?: Date | null;
6
+ defaultValue?: Date | null;
7
+ onChange?: (date: Date | null) => void;
8
+ };
9
+ declare function DatePicker({ value, defaultValue, onChange }?: DatePickerProps): react.JSX.Element;
10
+
11
+ type LayoutDirection = 'ltr' | 'rtl';
12
+ type CalendarDay = {
13
+ date: Date;
14
+ day: string;
15
+ isCurrentMonth: boolean;
16
+ };
17
+ type CalendarAdapter = {
18
+ locale: string | string[] | undefined;
19
+ direction: LayoutDirection;
20
+ today: () => Date;
21
+ startOfDay: (date: Date) => Date;
22
+ startOfMonth: (date: Date) => Date;
23
+ endOfMonth: (date: Date) => Date;
24
+ addMonths: (date: Date, amount: number) => Date;
25
+ isBeforeDay: (first: Date, second: Date) => boolean;
26
+ isSameDay: (first: Date | null, second: Date | null) => boolean;
27
+ isSameMonth: (first: Date, second: Date) => boolean;
28
+ isBetweenDays: (date: Date, start: Date | null, end: Date | null) => boolean;
29
+ formatInputDate: (date: Date | null) => string;
30
+ formatMonthLabel: (month: Date) => string;
31
+ formatDayOfMonth: (date: Date) => string;
32
+ getDateKey: (date: Date) => string;
33
+ getWeekdayLabels: () => string[];
34
+ createCalendarMonth: (month: Date) => CalendarDay[];
35
+ createMonthSequence: (startMonth: Date, count: number) => Date[];
36
+ parseDate: (value: string) => Date | null;
37
+ };
38
+ type GregorianCalendarAdapterOptions = {
39
+ locale?: string | string[];
40
+ direction?: LayoutDirection;
41
+ firstDayOfWeek?: number;
42
+ };
43
+ declare function createGregorianCalendarAdapter(options?: GregorianCalendarAdapterOptions): CalendarAdapter;
44
+ declare const defaultCalendarAdapter: CalendarAdapter;
45
+ type LocalizationProviderProps = GregorianCalendarAdapterOptions & {
46
+ adapter?: CalendarAdapter;
47
+ children: ReactNode;
48
+ };
49
+ declare function LocalizationProvider({ adapter, children, locale, direction, firstDayOfWeek }: LocalizationProviderProps): react.JSX.Element;
50
+ declare function useCalendarAdapter(): CalendarAdapter;
51
+
52
+ type DateRangeValue = {
53
+ startDate: Date | null;
54
+ endDate: Date | null;
55
+ };
56
+
57
+ type DateRangePickerProps = {
58
+ value?: DateRangeValue | null;
59
+ defaultValue?: DateRangeValue | null;
60
+ onChange?: (range: DateRangeValue | null) => void;
61
+ };
62
+ declare function DateRangePicker({ value, defaultValue, onChange }?: DateRangePickerProps): react.JSX.Element;
63
+
64
+ type JalaliCalendarAdapterOptions = {
65
+ locale?: string | string[];
66
+ firstDayOfWeek?: number;
67
+ latinDigits?: boolean;
68
+ };
69
+ declare function createJalaliCalendarAdapter(options?: JalaliCalendarAdapterOptions): CalendarAdapter;
70
+ declare const jalaliCalendarAdapter: CalendarAdapter;
71
+
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 };
@@ -0,0 +1,72 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+
4
+ type DatePickerProps = {
5
+ value?: Date | null;
6
+ defaultValue?: Date | null;
7
+ onChange?: (date: Date | null) => void;
8
+ };
9
+ declare function DatePicker({ value, defaultValue, onChange }?: DatePickerProps): react.JSX.Element;
10
+
11
+ type LayoutDirection = 'ltr' | 'rtl';
12
+ type CalendarDay = {
13
+ date: Date;
14
+ day: string;
15
+ isCurrentMonth: boolean;
16
+ };
17
+ type CalendarAdapter = {
18
+ locale: string | string[] | undefined;
19
+ direction: LayoutDirection;
20
+ today: () => Date;
21
+ startOfDay: (date: Date) => Date;
22
+ startOfMonth: (date: Date) => Date;
23
+ endOfMonth: (date: Date) => Date;
24
+ addMonths: (date: Date, amount: number) => Date;
25
+ isBeforeDay: (first: Date, second: Date) => boolean;
26
+ isSameDay: (first: Date | null, second: Date | null) => boolean;
27
+ isSameMonth: (first: Date, second: Date) => boolean;
28
+ isBetweenDays: (date: Date, start: Date | null, end: Date | null) => boolean;
29
+ formatInputDate: (date: Date | null) => string;
30
+ formatMonthLabel: (month: Date) => string;
31
+ formatDayOfMonth: (date: Date) => string;
32
+ getDateKey: (date: Date) => string;
33
+ getWeekdayLabels: () => string[];
34
+ createCalendarMonth: (month: Date) => CalendarDay[];
35
+ createMonthSequence: (startMonth: Date, count: number) => Date[];
36
+ parseDate: (value: string) => Date | null;
37
+ };
38
+ type GregorianCalendarAdapterOptions = {
39
+ locale?: string | string[];
40
+ direction?: LayoutDirection;
41
+ firstDayOfWeek?: number;
42
+ };
43
+ declare function createGregorianCalendarAdapter(options?: GregorianCalendarAdapterOptions): CalendarAdapter;
44
+ declare const defaultCalendarAdapter: CalendarAdapter;
45
+ type LocalizationProviderProps = GregorianCalendarAdapterOptions & {
46
+ adapter?: CalendarAdapter;
47
+ children: ReactNode;
48
+ };
49
+ declare function LocalizationProvider({ adapter, children, locale, direction, firstDayOfWeek }: LocalizationProviderProps): react.JSX.Element;
50
+ declare function useCalendarAdapter(): CalendarAdapter;
51
+
52
+ type DateRangeValue = {
53
+ startDate: Date | null;
54
+ endDate: Date | null;
55
+ };
56
+
57
+ type DateRangePickerProps = {
58
+ value?: DateRangeValue | null;
59
+ defaultValue?: DateRangeValue | null;
60
+ onChange?: (range: DateRangeValue | null) => void;
61
+ };
62
+ declare function DateRangePicker({ value, defaultValue, onChange }?: DateRangePickerProps): react.JSX.Element;
63
+
64
+ type JalaliCalendarAdapterOptions = {
65
+ locale?: string | string[];
66
+ firstDayOfWeek?: number;
67
+ latinDigits?: boolean;
68
+ };
69
+ declare function createJalaliCalendarAdapter(options?: JalaliCalendarAdapterOptions): CalendarAdapter;
70
+ declare const jalaliCalendarAdapter: CalendarAdapter;
71
+
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 };
package/dist/index.js ADDED
@@ -0,0 +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;
package/dist/index.mjs ADDED
@@ -0,0 +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};
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "aryan-date-picker",
3
+ "version": "0.1.0",
4
+ "description": "A lightweight React date picker component library.",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ },
14
+ "./styles.css": "./dist/index.css"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/srbadni/aryan-date-picker.git"
19
+ },
20
+ "homepage": "https://github.com/srbadni/aryan-date-picker#readme",
21
+ "bugs": {
22
+ "url": "https://github.com/srbadni/aryan-date-picker/issues"
23
+ },
24
+ "keywords": [
25
+ "react",
26
+ "datepicker",
27
+ "date-picker",
28
+ "calendar",
29
+ "jalali",
30
+ "persian"
31
+ ],
32
+ "license": "MIT",
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "files": [
37
+ "dist"
38
+ ],
39
+ "sideEffects": [
40
+ "*.css"
41
+ ],
42
+ "scripts": {
43
+ "dev": "tsup --watch",
44
+ "build": "tsup",
45
+ "clean": "rm -rf dist"
46
+ },
47
+ "peerDependencies": {
48
+ "react": ">=18",
49
+ "react-dom": ">=18"
50
+ },
51
+ "devDependencies": {
52
+ "@types/react": "^18.3.23",
53
+ "@types/react-dom": "^18.3.7",
54
+ "tsup": "^8.5.0",
55
+ "typescript": "^5.8.3"
56
+ }
57
+ }