react-day-picker 9.13.1 → 9.14.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.
Files changed (115) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/DayPicker.js +1 -1
  3. package/dist/cjs/UI.d.ts +21 -14
  4. package/dist/cjs/UI.js +2 -2
  5. package/dist/cjs/hijri/index.d.ts +28 -0
  6. package/dist/cjs/hijri/index.js +98 -0
  7. package/dist/cjs/hijri/lib/addMonths.d.ts +1 -0
  8. package/dist/cjs/hijri/lib/addMonths.js +9 -0
  9. package/dist/cjs/hijri/lib/addYears.d.ts +1 -0
  10. package/dist/cjs/hijri/lib/addYears.js +9 -0
  11. package/dist/cjs/hijri/lib/differenceInCalendarMonths.d.ts +1 -0
  12. package/dist/cjs/hijri/lib/differenceInCalendarMonths.js +10 -0
  13. package/dist/cjs/hijri/lib/eachMonthOfInterval.d.ts +2 -0
  14. package/dist/cjs/hijri/lib/eachMonthOfInterval.js +29 -0
  15. package/dist/cjs/hijri/lib/eachYearOfInterval.d.ts +2 -0
  16. package/dist/cjs/hijri/lib/eachYearOfInterval.js +19 -0
  17. package/dist/cjs/hijri/lib/endOfMonth.d.ts +1 -0
  18. package/dist/cjs/hijri/lib/endOfMonth.js +14 -0
  19. package/dist/cjs/hijri/lib/endOfYear.d.ts +1 -0
  20. package/dist/cjs/hijri/lib/endOfYear.js +14 -0
  21. package/dist/cjs/hijri/lib/fallbackLocaleData.d.ts +5 -0
  22. package/dist/cjs/hijri/lib/fallbackLocaleData.js +111 -0
  23. package/dist/cjs/hijri/lib/format.d.ts +3 -0
  24. package/dist/cjs/hijri/lib/format.js +149 -0
  25. package/dist/cjs/hijri/lib/getMonth.d.ts +1 -0
  26. package/dist/cjs/hijri/lib/getMonth.js +7 -0
  27. package/dist/cjs/hijri/lib/getYear.d.ts +1 -0
  28. package/dist/cjs/hijri/lib/getYear.js +7 -0
  29. package/dist/cjs/hijri/lib/index.d.ts +17 -0
  30. package/dist/cjs/hijri/lib/index.js +33 -0
  31. package/dist/cjs/hijri/lib/isSameMonth.d.ts +1 -0
  32. package/dist/cjs/hijri/lib/isSameMonth.js +10 -0
  33. package/dist/cjs/hijri/lib/isSameYear.d.ts +1 -0
  34. package/dist/cjs/hijri/lib/isSameYear.js +9 -0
  35. package/dist/cjs/hijri/lib/newDate.d.ts +1 -0
  36. package/dist/cjs/hijri/lib/newDate.js +7 -0
  37. package/dist/cjs/hijri/lib/setMonth.d.ts +1 -0
  38. package/dist/cjs/hijri/lib/setMonth.js +27 -0
  39. package/dist/cjs/hijri/lib/setYear.d.ts +1 -0
  40. package/dist/cjs/hijri/lib/setYear.js +15 -0
  41. package/dist/cjs/hijri/lib/startOfMonth.d.ts +1 -0
  42. package/dist/cjs/hijri/lib/startOfMonth.js +12 -0
  43. package/dist/cjs/hijri/lib/startOfYear.d.ts +1 -0
  44. package/dist/cjs/hijri/lib/startOfYear.js +12 -0
  45. package/dist/cjs/hijri/utils/conversion.d.ts +5 -0
  46. package/dist/cjs/hijri/utils/conversion.js +40 -0
  47. package/dist/cjs/hijri/utils/daysInMonth.d.ts +1 -0
  48. package/dist/cjs/hijri/utils/daysInMonth.js +24 -0
  49. package/dist/cjs/hijri/utils/range.d.ts +21 -0
  50. package/dist/cjs/hijri/utils/range.js +104 -0
  51. package/dist/cjs/hijri/utils/types.d.ts +5 -0
  52. package/dist/cjs/hijri/utils/types.js +2 -0
  53. package/dist/cjs/locale/ja-Hira.js +1 -1
  54. package/dist/cjs/locale/se.js +2 -2
  55. package/dist/cjs/selection/useRange.js +22 -4
  56. package/dist/cjs/types/props.d.ts +27 -3
  57. package/dist/esm/DayPicker.js +1 -1
  58. package/dist/esm/UI.d.ts +21 -14
  59. package/dist/esm/UI.js +2 -2
  60. package/dist/esm/hijri/index.d.ts +28 -0
  61. package/dist/esm/hijri/index.js +55 -0
  62. package/dist/esm/hijri/lib/addMonths.d.ts +1 -0
  63. package/dist/esm/hijri/lib/addMonths.js +6 -0
  64. package/dist/esm/hijri/lib/addYears.d.ts +1 -0
  65. package/dist/esm/hijri/lib/addYears.js +6 -0
  66. package/dist/esm/hijri/lib/differenceInCalendarMonths.d.ts +1 -0
  67. package/dist/esm/hijri/lib/differenceInCalendarMonths.js +7 -0
  68. package/dist/esm/hijri/lib/eachMonthOfInterval.d.ts +2 -0
  69. package/dist/esm/hijri/lib/eachMonthOfInterval.js +26 -0
  70. package/dist/esm/hijri/lib/eachYearOfInterval.d.ts +2 -0
  71. package/dist/esm/hijri/lib/eachYearOfInterval.js +16 -0
  72. package/dist/esm/hijri/lib/endOfMonth.d.ts +1 -0
  73. package/dist/esm/hijri/lib/endOfMonth.js +11 -0
  74. package/dist/esm/hijri/lib/endOfYear.d.ts +1 -0
  75. package/dist/esm/hijri/lib/endOfYear.js +11 -0
  76. package/dist/esm/hijri/lib/fallbackLocaleData.d.ts +5 -0
  77. package/dist/esm/hijri/lib/fallbackLocaleData.js +105 -0
  78. package/dist/esm/hijri/lib/format.d.ts +3 -0
  79. package/dist/esm/hijri/lib/format.js +146 -0
  80. package/dist/esm/hijri/lib/getMonth.d.ts +1 -0
  81. package/dist/esm/hijri/lib/getMonth.js +4 -0
  82. package/dist/esm/hijri/lib/getYear.d.ts +1 -0
  83. package/dist/esm/hijri/lib/getYear.js +4 -0
  84. package/dist/esm/hijri/lib/index.d.ts +17 -0
  85. package/dist/esm/hijri/lib/index.js +17 -0
  86. package/dist/esm/hijri/lib/isSameMonth.d.ts +1 -0
  87. package/dist/esm/hijri/lib/isSameMonth.js +7 -0
  88. package/dist/esm/hijri/lib/isSameYear.d.ts +1 -0
  89. package/dist/esm/hijri/lib/isSameYear.js +6 -0
  90. package/dist/esm/hijri/lib/newDate.d.ts +1 -0
  91. package/dist/esm/hijri/lib/newDate.js +4 -0
  92. package/dist/esm/hijri/lib/setMonth.d.ts +1 -0
  93. package/dist/esm/hijri/lib/setMonth.js +24 -0
  94. package/dist/esm/hijri/lib/setYear.d.ts +1 -0
  95. package/dist/esm/hijri/lib/setYear.js +12 -0
  96. package/dist/esm/hijri/lib/startOfMonth.d.ts +1 -0
  97. package/dist/esm/hijri/lib/startOfMonth.js +9 -0
  98. package/dist/esm/hijri/lib/startOfYear.d.ts +1 -0
  99. package/dist/esm/hijri/lib/startOfYear.js +9 -0
  100. package/dist/esm/hijri/utils/conversion.d.ts +5 -0
  101. package/dist/esm/hijri/utils/conversion.js +36 -0
  102. package/dist/esm/hijri/utils/daysInMonth.d.ts +1 -0
  103. package/dist/esm/hijri/utils/daysInMonth.js +21 -0
  104. package/dist/esm/hijri/utils/range.d.ts +21 -0
  105. package/dist/esm/hijri/utils/range.js +96 -0
  106. package/dist/esm/hijri/utils/types.d.ts +5 -0
  107. package/dist/esm/hijri/utils/types.js +1 -0
  108. package/dist/esm/locale/ja-Hira.js +1 -1
  109. package/dist/esm/locale/se.js +2 -2
  110. package/dist/esm/selection/useRange.js +22 -4
  111. package/dist/esm/types/props.d.ts +27 -3
  112. package/hijri.d.ts +1 -0
  113. package/hijri.js +2 -0
  114. package/package.json +26 -13
  115. package/src/style.css.d.ts +3 -0
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.format = format;
4
+ const conversion_js_1 = require("../utils/conversion.js");
5
+ const range_js_1 = require("../utils/range.js");
6
+ const fallbackLocaleData_js_1 = require("./fallbackLocaleData.js");
7
+ const DEFAULT_LOCALE_CODE = "ar-SA";
8
+ const BASE_NUMBERING_SYSTEM = "latn";
9
+ const UMM_AL_QURA_CALENDAR = "islamic-umalqura";
10
+ const getLocaleCode = (options) => {
11
+ return options?.locale?.code ?? DEFAULT_LOCALE_CODE;
12
+ };
13
+ const formatWithUmmAlQura = (date, localeCode, options) => {
14
+ try {
15
+ return new Intl.DateTimeFormat(localeCode, {
16
+ ...options,
17
+ calendar: UMM_AL_QURA_CALENDAR,
18
+ numberingSystem: BASE_NUMBERING_SYSTEM,
19
+ }).format(date);
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ };
25
+ const formatNumber = (value) => {
26
+ return value.toString();
27
+ };
28
+ const formatPaddedNumber = (value) => {
29
+ return formatNumber(value).padStart(2, "0");
30
+ };
31
+ const formatMonthName = (date, localeCode, width) => {
32
+ const formatted = formatWithUmmAlQura(date, localeCode, {
33
+ month: width,
34
+ });
35
+ return formatted ?? (0, fallbackLocaleData_js_1.getFallbackMonthName)(date, localeCode, width);
36
+ };
37
+ const formatWeekdayName = (date, localeCode, width) => {
38
+ const formatted = formatWithUmmAlQura(date, localeCode, {
39
+ weekday: width,
40
+ });
41
+ return formatted ?? (0, fallbackLocaleData_js_1.getFallbackWeekdayName)(date, localeCode, width);
42
+ };
43
+ const formatDateStyle = (date, localeCode, style) => {
44
+ const formatted = formatWithUmmAlQura(date, localeCode, {
45
+ dateStyle: style,
46
+ });
47
+ if (formatted) {
48
+ return formatted;
49
+ }
50
+ const hijri = (0, conversion_js_1.toHijriDate)(date);
51
+ const monthName = (0, fallbackLocaleData_js_1.getFallbackMonthName)(date, localeCode, "long");
52
+ switch (style) {
53
+ case "full":
54
+ return `${(0, fallbackLocaleData_js_1.getFallbackWeekdayName)(date, localeCode, "long")}, ${monthName} ${hijri.day}, ${hijri.year}`;
55
+ case "long":
56
+ return `${monthName} ${hijri.day}, ${hijri.year}`;
57
+ case "medium":
58
+ return `${formatPaddedNumber(hijri.day)} ${monthName} ${hijri.year}`;
59
+ case "short":
60
+ return `${hijri.monthIndex + 1}/${hijri.day}/${hijri.year}`;
61
+ }
62
+ };
63
+ const buildTimeFormat = (date, localeCode, formatStr) => {
64
+ const hour12 = formatStr.includes("a");
65
+ const formatted = formatWithUmmAlQura(date, localeCode, {
66
+ hour: "numeric",
67
+ minute: "numeric",
68
+ hour12,
69
+ });
70
+ if (formatted) {
71
+ return formatted;
72
+ }
73
+ try {
74
+ return new Intl.DateTimeFormat(localeCode, {
75
+ hour: "numeric",
76
+ minute: "numeric",
77
+ hour12,
78
+ numberingSystem: BASE_NUMBERING_SYSTEM,
79
+ }).format(date);
80
+ }
81
+ catch {
82
+ const minutes = formatPaddedNumber(date.getMinutes());
83
+ if (hour12) {
84
+ const hour = date.getHours() % 12 || 12;
85
+ const period = date.getHours() >= 12 ? "PM" : "AM";
86
+ return `${hour}:${minutes} ${period}`;
87
+ }
88
+ return `${formatNumber(date.getHours())}:${minutes}`;
89
+ }
90
+ };
91
+ /** Hijri calendar formatting override. */
92
+ function format(date, formatStr, options) {
93
+ const extendedOptions = options;
94
+ const localeCode = getLocaleCode(extendedOptions);
95
+ const hijri = (0, conversion_js_1.toHijriDate)(date);
96
+ const gregorian = (0, range_js_1.getGregorianDateParts)(date);
97
+ const isOutOfRange = (0, range_js_1.clampGregorianDate)(date) !== date;
98
+ const numericDate = isOutOfRange
99
+ ? {
100
+ year: gregorian.year,
101
+ monthIndex: gregorian.month - 1,
102
+ day: gregorian.day,
103
+ }
104
+ : hijri;
105
+ switch (formatStr) {
106
+ case "LLLL y":
107
+ case "LLLL yyyy":
108
+ return `${formatMonthName(date, localeCode, "long")} ${formatNumber(numericDate.year)}`;
109
+ case "LLLL":
110
+ return formatMonthName(date, localeCode, "long");
111
+ case "LLL":
112
+ return formatMonthName(date, localeCode, "short");
113
+ case "PPP":
114
+ return formatDateStyle(date, localeCode, "long");
115
+ case "PPPP":
116
+ return formatDateStyle(date, localeCode, "full");
117
+ case "PP":
118
+ return formatDateStyle(date, localeCode, "medium");
119
+ case "P":
120
+ return formatDateStyle(date, localeCode, "short");
121
+ case "cccc":
122
+ return formatWeekdayName(date, localeCode, "long");
123
+ case "ccc":
124
+ return formatWeekdayName(date, localeCode, "short");
125
+ case "ccccc":
126
+ case "cccccc":
127
+ return formatWeekdayName(date, localeCode, "narrow");
128
+ case "yyyy":
129
+ case "y":
130
+ return formatNumber(numericDate.year);
131
+ case "yyyy-MM":
132
+ return `${formatNumber(numericDate.year)}-${formatPaddedNumber(numericDate.monthIndex + 1)}`;
133
+ case "yyyy-MM-dd":
134
+ return `${formatNumber(numericDate.year)}-${formatPaddedNumber(numericDate.monthIndex + 1)}-${formatPaddedNumber(numericDate.day)}`;
135
+ case "MM":
136
+ return formatPaddedNumber(numericDate.monthIndex + 1);
137
+ case "M":
138
+ return formatNumber(numericDate.monthIndex + 1);
139
+ case "dd":
140
+ return formatPaddedNumber(numericDate.day);
141
+ case "d":
142
+ return formatNumber(numericDate.day);
143
+ default:
144
+ if (/[Hh]/.test(formatStr) && /m/.test(formatStr)) {
145
+ return buildTimeFormat(date, localeCode, formatStr);
146
+ }
147
+ return formatDateStyle(date, localeCode, "medium");
148
+ }
149
+ }
@@ -0,0 +1 @@
1
+ export declare function getMonth(date: Date): number;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMonth = getMonth;
4
+ const conversion_js_1 = require("../utils/conversion.js");
5
+ function getMonth(date) {
6
+ return (0, conversion_js_1.toHijriDate)(date).monthIndex;
7
+ }
@@ -0,0 +1 @@
1
+ export declare function getYear(date: Date): number;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getYear = getYear;
4
+ const conversion_js_1 = require("../utils/conversion.js");
5
+ function getYear(date) {
6
+ return (0, conversion_js_1.toHijriDate)(date).year;
7
+ }
@@ -0,0 +1,17 @@
1
+ export * from "./addMonths.js";
2
+ export * from "./addYears.js";
3
+ export * from "./differenceInCalendarMonths.js";
4
+ export * from "./eachMonthOfInterval.js";
5
+ export * from "./eachYearOfInterval.js";
6
+ export * from "./endOfMonth.js";
7
+ export * from "./endOfYear.js";
8
+ export * from "./format.js";
9
+ export * from "./getMonth.js";
10
+ export * from "./getYear.js";
11
+ export * from "./isSameMonth.js";
12
+ export * from "./isSameYear.js";
13
+ export * from "./newDate.js";
14
+ export * from "./setMonth.js";
15
+ export * from "./setYear.js";
16
+ export * from "./startOfMonth.js";
17
+ export * from "./startOfYear.js";
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./addMonths.js"), exports);
18
+ __exportStar(require("./addYears.js"), exports);
19
+ __exportStar(require("./differenceInCalendarMonths.js"), exports);
20
+ __exportStar(require("./eachMonthOfInterval.js"), exports);
21
+ __exportStar(require("./eachYearOfInterval.js"), exports);
22
+ __exportStar(require("./endOfMonth.js"), exports);
23
+ __exportStar(require("./endOfYear.js"), exports);
24
+ __exportStar(require("./format.js"), exports);
25
+ __exportStar(require("./getMonth.js"), exports);
26
+ __exportStar(require("./getYear.js"), exports);
27
+ __exportStar(require("./isSameMonth.js"), exports);
28
+ __exportStar(require("./isSameYear.js"), exports);
29
+ __exportStar(require("./newDate.js"), exports);
30
+ __exportStar(require("./setMonth.js"), exports);
31
+ __exportStar(require("./setYear.js"), exports);
32
+ __exportStar(require("./startOfMonth.js"), exports);
33
+ __exportStar(require("./startOfYear.js"), exports);
@@ -0,0 +1 @@
1
+ export declare function isSameMonth(dateLeft: Date, dateRight: Date): boolean;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSameMonth = isSameMonth;
4
+ const conversion_js_1 = require("../utils/conversion.js");
5
+ function isSameMonth(dateLeft, dateRight) {
6
+ const hijriLeft = (0, conversion_js_1.toHijriDate)(dateLeft);
7
+ const hijriRight = (0, conversion_js_1.toHijriDate)(dateRight);
8
+ return (hijriLeft.year === hijriRight.year &&
9
+ hijriLeft.monthIndex === hijriRight.monthIndex);
10
+ }
@@ -0,0 +1 @@
1
+ export declare function isSameYear(dateLeft: Date, dateRight: Date): boolean;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSameYear = isSameYear;
4
+ const conversion_js_1 = require("../utils/conversion.js");
5
+ function isSameYear(dateLeft, dateRight) {
6
+ const hijriLeft = (0, conversion_js_1.toHijriDate)(dateLeft);
7
+ const hijriRight = (0, conversion_js_1.toHijriDate)(dateRight);
8
+ return hijriLeft.year === hijriRight.year;
9
+ }
@@ -0,0 +1 @@
1
+ export declare function newDate(year: number, monthIndex: number, day: number): Date;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.newDate = newDate;
4
+ const conversion_js_1 = require("../utils/conversion.js");
5
+ function newDate(year, monthIndex, day) {
6
+ return (0, conversion_js_1.toGregorianDate)({ year, monthIndex, day });
7
+ }
@@ -0,0 +1 @@
1
+ export declare function setMonth(date: Date, monthIndex: number): Date;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setMonth = setMonth;
4
+ const conversion_js_1 = require("../utils/conversion.js");
5
+ const daysInMonth_js_1 = require("../utils/daysInMonth.js");
6
+ function setMonth(date, monthIndex) {
7
+ const hijri = (0, conversion_js_1.toHijriDate)(date);
8
+ // Handle overflow/underflow of monthIndex
9
+ // Note: monthIndex argument is absolute month index for the year.
10
+ // E.g. setMonth(..., 13) sets to Safar next year.
11
+ let targetYear = hijri.year;
12
+ let targetMonth = monthIndex;
13
+ if (targetMonth > 11 || targetMonth < 0) {
14
+ targetYear += Math.floor(targetMonth / 12);
15
+ targetMonth = targetMonth % 12;
16
+ if (targetMonth < 0) {
17
+ targetMonth += 12;
18
+ }
19
+ }
20
+ const daysInTargetMonth = (0, daysInMonth_js_1.getDaysInMonth)(targetYear, targetMonth);
21
+ const day = Math.min(hijri.day, daysInTargetMonth);
22
+ return (0, conversion_js_1.toGregorianDate)({
23
+ year: targetYear,
24
+ monthIndex: targetMonth,
25
+ day,
26
+ });
27
+ }
@@ -0,0 +1 @@
1
+ export declare function setYear(date: Date, year: number): Date;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setYear = setYear;
4
+ const conversion_js_1 = require("../utils/conversion.js");
5
+ const daysInMonth_js_1 = require("../utils/daysInMonth.js");
6
+ function setYear(date, year) {
7
+ const hijri = (0, conversion_js_1.toHijriDate)(date);
8
+ const daysInTargetMonth = (0, daysInMonth_js_1.getDaysInMonth)(year, hijri.monthIndex);
9
+ const day = Math.min(hijri.day, daysInTargetMonth);
10
+ return (0, conversion_js_1.toGregorianDate)({
11
+ year,
12
+ monthIndex: hijri.monthIndex,
13
+ day,
14
+ });
15
+ }
@@ -0,0 +1 @@
1
+ export declare function startOfMonth(date: Date): Date;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startOfMonth = startOfMonth;
4
+ const conversion_js_1 = require("../utils/conversion.js");
5
+ function startOfMonth(date) {
6
+ const hijri = (0, conversion_js_1.toHijriDate)(date);
7
+ return (0, conversion_js_1.toGregorianDate)({
8
+ year: hijri.year,
9
+ monthIndex: hijri.monthIndex,
10
+ day: 1,
11
+ });
12
+ }
@@ -0,0 +1 @@
1
+ export declare function startOfYear(date: Date): Date;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startOfYear = startOfYear;
4
+ const conversion_js_1 = require("../utils/conversion.js");
5
+ function startOfYear(date) {
6
+ const hijri = (0, conversion_js_1.toHijriDate)(date);
7
+ return (0, conversion_js_1.toGregorianDate)({
8
+ year: hijri.year,
9
+ monthIndex: 0,
10
+ day: 1,
11
+ });
12
+ }
@@ -0,0 +1,5 @@
1
+ import type { HijriDate } from "./types.js";
2
+ /** Convert a Gregorian date to a Hijri date. */
3
+ export declare function toHijriDate(date: Date): HijriDate;
4
+ /** Convert a Hijri date back to the Gregorian calendar. */
5
+ export declare function toGregorianDate(hijri: HijriDate): Date;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toHijriDate = toHijriDate;
4
+ exports.toGregorianDate = toGregorianDate;
5
+ const hijri_converter_1 = require("@tabby_ai/hijri-converter");
6
+ const range_js_1 = require("./range.js");
7
+ /** Convert a Gregorian date to a Hijri date. */
8
+ function toHijriDate(date) {
9
+ const clamped = (0, range_js_1.clampGregorianDate)(date);
10
+ const { year, month, day } = (0, range_js_1.getGregorianDateParts)(clamped);
11
+ // gregorianToHijri uses 1-indexed months
12
+ const hijri = (0, hijri_converter_1.gregorianToHijri)({ year, month, day });
13
+ return {
14
+ year: hijri.year,
15
+ monthIndex: hijri.month - 1, // Convert to 0-indexed
16
+ day: hijri.day,
17
+ };
18
+ }
19
+ /** Convert a Hijri date back to the Gregorian calendar. */
20
+ function toGregorianDate(hijri) {
21
+ const clamped = (0, range_js_1.clampHijriDate)(hijri);
22
+ // hijriToGregorian expects 1-indexed months. Probe down from the candidate
23
+ // day to handle invalid month/day combinations without throwing.
24
+ for (let day = clamped.day; day >= 1; day -= 1) {
25
+ try {
26
+ const gregorian = (0, hijri_converter_1.hijriToGregorian)({
27
+ year: clamped.year,
28
+ month: clamped.monthIndex + 1,
29
+ day,
30
+ });
31
+ return (0, range_js_1.clampGregorianDate)(new Date(gregorian.year, gregorian.month - 1, gregorian.day));
32
+ }
33
+ catch {
34
+ // Try a lower day for months that only have 29 days.
35
+ }
36
+ }
37
+ // Fallback to the minimum supported Gregorian date if conversion probing
38
+ // somehow fails for all days.
39
+ return new Date(range_js_1.GREGORIAN_MIN_DATE);
40
+ }
@@ -0,0 +1 @@
1
+ export declare function getDaysInMonth(year: number, monthIndex: number): number;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDaysInMonth = getDaysInMonth;
4
+ const conversion_js_1 = require("./conversion.js");
5
+ const range_js_1 = require("./range.js");
6
+ const MAX_DAY_IN_HIJRI_MONTH = 30;
7
+ const MIN_DAY_IN_HIJRI_MONTH = 29;
8
+ function getDaysInMonth(year, monthIndex) {
9
+ const clamped = (0, range_js_1.clampHijriDate)({ year, monthIndex, day: 1 });
10
+ for (let day = MAX_DAY_IN_HIJRI_MONTH; day >= MIN_DAY_IN_HIJRI_MONTH; day -= 1) {
11
+ const candidateDate = (0, conversion_js_1.toGregorianDate)({
12
+ year: clamped.year,
13
+ monthIndex: clamped.monthIndex,
14
+ day,
15
+ });
16
+ const roundTrip = (0, conversion_js_1.toHijriDate)(candidateDate);
17
+ if (roundTrip.year === clamped.year &&
18
+ roundTrip.monthIndex === clamped.monthIndex &&
19
+ roundTrip.day === day) {
20
+ return day;
21
+ }
22
+ }
23
+ return MIN_DAY_IN_HIJRI_MONTH;
24
+ }
@@ -0,0 +1,21 @@
1
+ import type { HijriDate } from "./types.js";
2
+ type GregorianDateParts = {
3
+ year: number;
4
+ month: number;
5
+ day: number;
6
+ };
7
+ /** Returns Gregorian date parts while preserving years < 100. */
8
+ export declare function getGregorianDateParts(date: Date): GregorianDateParts;
9
+ /** Internal Gregorian lower bound supported by the Hijri converter. */
10
+ export declare const GREGORIAN_MIN_DATE: Date;
11
+ /** Internal Gregorian upper bound supported by the Hijri converter. */
12
+ export declare const GREGORIAN_MAX_DATE: Date;
13
+ /** Clamp a Gregorian date to the supported Hijri conversion range. */
14
+ export declare function clampGregorianDate(date: Date): Date;
15
+ /** Returns whether the provided Gregorian date was clamped. */
16
+ export declare function wasGregorianDateClamped(date: Date): boolean;
17
+ /** Clamp a Hijri date to the supported range and normalize month overflow. */
18
+ export declare function clampHijriDate(date: HijriDate): HijriDate;
19
+ /** Returns whether the provided Hijri date was clamped. */
20
+ export declare function wasHijriDateClamped(date: HijriDate): boolean;
21
+ export {};
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GREGORIAN_MAX_DATE = exports.GREGORIAN_MIN_DATE = void 0;
4
+ exports.getGregorianDateParts = getGregorianDateParts;
5
+ exports.clampGregorianDate = clampGregorianDate;
6
+ exports.wasGregorianDateClamped = wasGregorianDateClamped;
7
+ exports.clampHijriDate = clampHijriDate;
8
+ exports.wasHijriDateClamped = wasHijriDateClamped;
9
+ const MAX_HIJRI_DAY = 30;
10
+ const MONTHS_PER_YEAR = 12;
11
+ const HIJRI_MIN = { year: 1343, monthIndex: 0, day: 1 };
12
+ const HIJRI_MAX = { year: 1500, monthIndex: 11, day: 30 };
13
+ const GREGORIAN_MIN = { year: 1924, month: 8, day: 1 };
14
+ const GREGORIAN_MAX = { year: 2077, month: 11, day: 16 };
15
+ function compareGregorianDates(left, right) {
16
+ if (left.year !== right.year) {
17
+ return left.year - right.year;
18
+ }
19
+ if (left.month !== right.month) {
20
+ return left.month - right.month;
21
+ }
22
+ return left.day - right.day;
23
+ }
24
+ function createDate(parts) {
25
+ return new Date(parts.year, parts.month - 1, parts.day);
26
+ }
27
+ function normalizeHijriMonth(year, monthIndex) {
28
+ let normalizedYear = year + Math.trunc(monthIndex / MONTHS_PER_YEAR);
29
+ let normalizedMonth = monthIndex % MONTHS_PER_YEAR;
30
+ if (normalizedMonth < 0) {
31
+ normalizedMonth += MONTHS_PER_YEAR;
32
+ normalizedYear -= 1;
33
+ }
34
+ return { year: normalizedYear, monthIndex: normalizedMonth };
35
+ }
36
+ /** Returns Gregorian date parts while preserving years < 100. */
37
+ function getGregorianDateParts(date) {
38
+ const useUTC = date.getFullYear() < 100;
39
+ return {
40
+ year: useUTC ? date.getUTCFullYear() : date.getFullYear(),
41
+ month: (useUTC ? date.getUTCMonth() : date.getMonth()) + 1,
42
+ day: useUTC ? date.getUTCDate() : date.getDate(),
43
+ };
44
+ }
45
+ /** Internal Gregorian lower bound supported by the Hijri converter. */
46
+ exports.GREGORIAN_MIN_DATE = createDate(GREGORIAN_MIN);
47
+ /** Internal Gregorian upper bound supported by the Hijri converter. */
48
+ exports.GREGORIAN_MAX_DATE = createDate(GREGORIAN_MAX);
49
+ /** Clamp a Gregorian date to the supported Hijri conversion range. */
50
+ function clampGregorianDate(date) {
51
+ const parts = getGregorianDateParts(date);
52
+ if (compareGregorianDates(parts, GREGORIAN_MIN) < 0) {
53
+ return createDate(GREGORIAN_MIN);
54
+ }
55
+ if (compareGregorianDates(parts, GREGORIAN_MAX) > 0) {
56
+ return createDate(GREGORIAN_MAX);
57
+ }
58
+ return date;
59
+ }
60
+ /** Returns whether the provided Gregorian date was clamped. */
61
+ function wasGregorianDateClamped(date) {
62
+ return clampGregorianDate(date) !== date;
63
+ }
64
+ /** Clamp a Hijri date to the supported range and normalize month overflow. */
65
+ function clampHijriDate(date) {
66
+ const normalized = normalizeHijriMonth(date.year, date.monthIndex);
67
+ const candidate = {
68
+ year: normalized.year,
69
+ monthIndex: normalized.monthIndex,
70
+ day: Math.min(Math.max(date.day, 1), MAX_HIJRI_DAY),
71
+ };
72
+ if (candidate.year < HIJRI_MIN.year) {
73
+ return { ...HIJRI_MIN };
74
+ }
75
+ if (candidate.year > HIJRI_MAX.year) {
76
+ return { ...HIJRI_MAX };
77
+ }
78
+ if (candidate.year === HIJRI_MIN.year &&
79
+ candidate.monthIndex < HIJRI_MIN.monthIndex) {
80
+ return { ...HIJRI_MIN };
81
+ }
82
+ if (candidate.year === HIJRI_MAX.year &&
83
+ candidate.monthIndex > HIJRI_MAX.monthIndex) {
84
+ return { ...HIJRI_MAX };
85
+ }
86
+ if (candidate.year === HIJRI_MIN.year &&
87
+ candidate.monthIndex === HIJRI_MIN.monthIndex &&
88
+ candidate.day < HIJRI_MIN.day) {
89
+ return { ...HIJRI_MIN };
90
+ }
91
+ if (candidate.year === HIJRI_MAX.year &&
92
+ candidate.monthIndex === HIJRI_MAX.monthIndex &&
93
+ candidate.day > HIJRI_MAX.day) {
94
+ return { ...HIJRI_MAX };
95
+ }
96
+ return candidate;
97
+ }
98
+ /** Returns whether the provided Hijri date was clamped. */
99
+ function wasHijriDateClamped(date) {
100
+ const clamped = clampHijriDate(date);
101
+ return (clamped.year !== date.year ||
102
+ clamped.monthIndex !== date.monthIndex ||
103
+ clamped.day !== date.day);
104
+ }
@@ -0,0 +1,5 @@
1
+ export type HijriDate = {
2
+ year: number;
3
+ monthIndex: number;
4
+ day: number;
5
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -30,7 +30,7 @@ exports.jaHira = {
30
30
  }
31
31
  return label;
32
32
  },
33
- labelNav: "ナビゲーションバー",
33
+ labelNav: "なびげえしょんばあ",
34
34
  labelWeekNumberHeader: "しゅうばんごう",
35
35
  labelWeekday: (date, options, dateLib) => (dateLib ?? new DateLib_js_1.DateLib(options)).format(date, "cccc"),
36
36
  },
@@ -11,7 +11,7 @@ exports.se = {
11
11
  const lib = dateLib ?? new DateLib_js_1.DateLib(options);
12
12
  let label = lib.format(date, "PPPP");
13
13
  if (modifiers.today)
14
- label = `Ođđaid, ${label}`;
14
+ label = `Odne, ${label}`;
15
15
  if (modifiers.selected)
16
16
  label = `${label}, válljejuvvon`;
17
17
  return label;
@@ -26,7 +26,7 @@ exports.se = {
26
26
  const lib = dateLib ?? new DateLib_js_1.DateLib(options);
27
27
  let label = lib.format(date, "PPPP");
28
28
  if (modifiers?.today) {
29
- label = `Ođđaid, ${label}`;
29
+ label = `Odne, ${label}`;
30
30
  }
31
31
  return label;
32
32
  },
@@ -14,15 +14,33 @@ const rangeIncludesDate_js_1 = require("../utils/rangeIncludesDate.js");
14
14
  * range, and a function to check if a date is within the range.
15
15
  */
16
16
  function useRange(props, dateLib) {
17
- const { disabled, excludeDisabled, selected: initiallySelected, required, onSelect, } = props;
17
+ const { disabled, excludeDisabled, resetOnSelect, selected: initiallySelected, required, onSelect, } = props;
18
18
  const [internallySelected, setSelected] = (0, useControlledValue_js_1.useControlledValue)(initiallySelected, onSelect ? initiallySelected : undefined);
19
19
  const selected = !onSelect ? internallySelected : initiallySelected;
20
20
  const isSelected = (date) => selected && (0, rangeIncludesDate_js_1.rangeIncludesDate)(selected, date, false, dateLib);
21
21
  const select = (triggerDate, modifiers, e) => {
22
22
  const { min, max } = props;
23
- const newRange = triggerDate
24
- ? (0, index_js_1.addToRange)(triggerDate, selected, min, max, required, dateLib)
25
- : undefined;
23
+ let newRange;
24
+ if (triggerDate) {
25
+ const selectedFrom = selected?.from;
26
+ const selectedTo = selected?.to;
27
+ const hasFullRange = !!selectedFrom && !!selectedTo;
28
+ const isClickingSingleDayRange = !!selectedFrom &&
29
+ !!selectedTo &&
30
+ dateLib.isSameDay(selectedFrom, selectedTo) &&
31
+ dateLib.isSameDay(triggerDate, selectedFrom);
32
+ if (resetOnSelect && (hasFullRange || !selected?.from)) {
33
+ if (!required && isClickingSingleDayRange) {
34
+ newRange = undefined;
35
+ }
36
+ else {
37
+ newRange = { from: triggerDate, to: undefined };
38
+ }
39
+ }
40
+ else {
41
+ newRange = (0, index_js_1.addToRange)(triggerDate, selected, min, max, required, dateLib);
42
+ }
43
+ }
26
44
  if (excludeDisabled && disabled && newRange?.from && newRange.to) {
27
45
  if ((0, index_js_1.rangeContainsModifiers)({ from: newRange.from, to: newRange.to }, disabled, dateLib)) {
28
46
  // if a disabled days is found, the range is reset