@react-fabric/date 1.0.0-beta.8 → 1.0.1

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 (139) hide show
  1. package/README.md +2 -9
  2. package/{src/components/Date.module.css → css/_date.css} +5 -5
  3. package/{src/superdate/SuperDate.module.css → css/styles.css} +2 -8
  4. package/dist/cjs/components/DateCell.js +5 -7
  5. package/dist/cjs/components/DateHeader.js +27 -20
  6. package/dist/cjs/components/DatePage.js +10 -12
  7. package/dist/cjs/components/DecadePage.js +3 -3
  8. package/dist/cjs/components/MonthPage.js +3 -3
  9. package/dist/cjs/components/TimeSliders.js +36 -35
  10. package/dist/cjs/components/YearPage.js +3 -3
  11. package/dist/cjs/display/DateDisplay.js +25 -8
  12. package/dist/cjs/display/DateDuration.js +155 -0
  13. package/dist/cjs/hijri/DateConverter.js +154 -0
  14. package/dist/cjs/hijri/FormatDate.js +116 -0
  15. package/dist/cjs/hijri/HijriDate.js +531 -0
  16. package/dist/cjs/hijri/StringDateParser.js +74 -0
  17. package/dist/cjs/hijri/index.js +15 -1025
  18. package/dist/cjs/hijri/initializer.js +113 -0
  19. package/dist/cjs/hijri/locales.js +19 -0
  20. package/dist/cjs/hijri/safe.js +17 -0
  21. package/dist/cjs/i18n/ar/date.json.js +213 -0
  22. package/dist/cjs/i18n/en/date.json.js +83 -0
  23. package/dist/cjs/i18n/index.js +4 -10
  24. package/dist/cjs/index.js +41 -2
  25. package/dist/cjs/panels/BasePanel.js +6 -5
  26. package/dist/cjs/panels/DatePanel.js +45 -21
  27. package/dist/cjs/{superdate → panels}/EventPanel.js +28 -12
  28. package/dist/cjs/panels/RangePanel.js +49 -19
  29. package/dist/cjs/utils/dateUtil.js +3 -5
  30. package/dist/esm/components/DateCell.js +6 -8
  31. package/dist/esm/components/DateHeader.js +28 -21
  32. package/dist/esm/components/DatePage.js +11 -13
  33. package/dist/esm/components/DecadePage.js +3 -3
  34. package/dist/esm/components/MonthPage.js +3 -3
  35. package/dist/esm/components/TimeSliders.js +38 -37
  36. package/dist/esm/components/YearPage.js +3 -3
  37. package/dist/esm/display/DateDisplay.js +26 -9
  38. package/dist/esm/display/DateDuration.js +155 -0
  39. package/dist/esm/hijri/DateConverter.js +152 -0
  40. package/dist/esm/hijri/FormatDate.js +113 -0
  41. package/dist/esm/hijri/HijriDate.js +528 -0
  42. package/dist/esm/hijri/StringDateParser.js +74 -0
  43. package/dist/esm/hijri/index.js +15 -1025
  44. package/dist/esm/hijri/initializer.js +113 -0
  45. package/dist/esm/hijri/locales.js +18 -0
  46. package/dist/esm/hijri/safe.js +14 -0
  47. package/dist/esm/i18n/ar/date.json.js +209 -0
  48. package/dist/esm/i18n/en/date.json.js +79 -0
  49. package/dist/esm/i18n/index.js +2 -8
  50. package/dist/esm/index.js +36 -1
  51. package/dist/esm/panels/BasePanel.js +6 -5
  52. package/dist/esm/panels/DatePanel.js +48 -24
  53. package/dist/esm/{superdate → panels}/EventPanel.js +29 -13
  54. package/dist/esm/panels/RangePanel.js +52 -22
  55. package/dist/esm/utils/dateUtil.js +4 -6
  56. package/dist/types/components/DateCell.d.ts +1 -1
  57. package/dist/types/components/DateHeader.d.ts +1 -1
  58. package/dist/types/components/DatePage.d.ts +1 -1
  59. package/dist/types/components/DecadePage.d.ts +1 -1
  60. package/dist/types/components/MonthPage.d.ts +1 -1
  61. package/dist/types/components/TimeSliders.d.ts +1 -1
  62. package/dist/types/components/YearPage.d.ts +1 -1
  63. package/dist/types/display/DateDisplay.d.ts +17 -4
  64. package/dist/types/display/DateDuration.d.ts +25 -0
  65. package/dist/types/hijri/DateConverter.d.ts +13 -0
  66. package/dist/types/hijri/FormatDate.d.ts +19 -0
  67. package/dist/types/hijri/HijriDate.d.ts +214 -0
  68. package/dist/types/hijri/StringDateParser.d.ts +11 -0
  69. package/dist/types/hijri/index.d.ts +2 -2
  70. package/dist/types/hijri/initializer.d.ts +129 -0
  71. package/dist/types/hijri/locales.d.ts +19 -0
  72. package/dist/types/hijri/safe.d.ts +3 -0
  73. package/dist/types/index.d.ts +32 -1
  74. package/dist/types/panels/BasePanel.d.ts +1 -1
  75. package/dist/types/panels/DatePanel.d.ts +22 -1
  76. package/dist/types/panels/EventPanel.d.ts +17 -0
  77. package/dist/types/panels/RangePanel.d.ts +19 -1
  78. package/dist/types/types/index.d.ts +8 -40
  79. package/package.json +14 -21
  80. package/src/components/DateCell.tsx +20 -75
  81. package/src/components/DateHeader.tsx +27 -78
  82. package/src/components/DatePage.tsx +11 -36
  83. package/src/components/DecadePage.tsx +2 -2
  84. package/src/components/MonthPage.tsx +2 -2
  85. package/src/components/TimeSliders.tsx +20 -60
  86. package/src/components/YearPage.tsx +2 -2
  87. package/src/display/DateDisplay.tsx +26 -38
  88. package/src/display/DateDuration.tsx +170 -0
  89. package/src/hijri/DateConverter.js +175 -0
  90. package/src/hijri/FormatDate.js +134 -0
  91. package/src/hijri/HijriDate.js +477 -0
  92. package/src/hijri/StringDateParser.js +68 -0
  93. package/src/hijri/index.js +16 -1535
  94. package/src/hijri/initializer.js +96 -0
  95. package/src/hijri/locales.js +109 -0
  96. package/src/hijri/safe.js +16 -0
  97. package/src/i18n/ar/date.json +203 -0
  98. package/src/i18n/en/date.json +73 -0
  99. package/src/i18n/index.ts +2 -5
  100. package/src/index.ts +29 -18
  101. package/src/panels/BasePanel.tsx +7 -10
  102. package/src/panels/DatePanel.tsx +41 -33
  103. package/src/{superdate → panels}/EventPanel.tsx +52 -53
  104. package/src/panels/RangePanel.tsx +54 -60
  105. package/src/types/index.ts +8 -43
  106. package/src/utils/dateUtil.ts +26 -82
  107. package/dist/cjs/components/Date.module.css +0 -1
  108. package/dist/cjs/i18n/ar.json.js +0 -25
  109. package/dist/cjs/i18n/en.json.js +0 -21
  110. package/dist/cjs/i18n/superdate/ar.json.js +0 -86
  111. package/dist/cjs/i18n/superdate/en.json.js +0 -93
  112. package/dist/cjs/superdate/QuickSelect.js +0 -134
  113. package/dist/cjs/superdate/RelativeInput.js +0 -79
  114. package/dist/cjs/superdate/RelativePanel.js +0 -91
  115. package/dist/cjs/superdate/SuperDate.module.css +0 -1
  116. package/dist/cjs/superdate/Superdate.js +0 -177
  117. package/dist/esm/components/Date.module.css +0 -1
  118. package/dist/esm/i18n/ar.json.js +0 -21
  119. package/dist/esm/i18n/en.json.js +0 -18
  120. package/dist/esm/i18n/superdate/ar.json.js +0 -79
  121. package/dist/esm/i18n/superdate/en.json.js +0 -85
  122. package/dist/esm/superdate/QuickSelect.js +0 -134
  123. package/dist/esm/superdate/RelativeInput.js +0 -79
  124. package/dist/esm/superdate/RelativePanel.js +0 -91
  125. package/dist/esm/superdate/SuperDate.module.css +0 -1
  126. package/dist/esm/superdate/Superdate.js +0 -176
  127. package/dist/types/superdate/EventPanel.d.ts +0 -4
  128. package/dist/types/superdate/QuickSelect.d.ts +0 -1
  129. package/dist/types/superdate/RelativeInput.d.ts +0 -1
  130. package/dist/types/superdate/RelativePanel.d.ts +0 -1
  131. package/dist/types/superdate/Superdate.d.ts +0 -17
  132. package/src/i18n/ar.json +0 -14
  133. package/src/i18n/en.json +0 -13
  134. package/src/i18n/superdate/ar.json +0 -70
  135. package/src/i18n/superdate/en.json +0 -75
  136. package/src/superdate/QuickSelect.tsx +0 -121
  137. package/src/superdate/RelativeInput.tsx +0 -64
  138. package/src/superdate/RelativePanel.tsx +0 -103
  139. package/src/superdate/Superdate.tsx +0 -198
@@ -21,16 +21,8 @@
21
21
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  */
23
23
 
24
- import { isArray } from "@react-fabric/utilities";
25
- import classNames from "classnames";
26
- import {
27
- isAfter,
28
- isBefore,
29
- isSameDay,
30
- isSameMonth,
31
- isSameYear,
32
- startOfDecade,
33
- } from "date-fns";
24
+ import { cn, isArray } from "@react-fabric/utilities";
25
+ import { isAfter, isBefore, isSameDay, isSameMonth, isSameYear, startOfDecade } from "date-fns";
34
26
  import i18next from "i18next";
35
27
  import { useMemo } from "react";
36
28
  import { PageType } from "../types";
@@ -50,28 +42,11 @@ export interface DateCellProps {
50
42
  dateDisabled?: (date: Date) => boolean;
51
43
  }
52
44
 
53
- export const DateCell = ({
54
- date = new Date(),
55
- isMuted = false,
56
- ...props
57
- }: DateCellProps) => {
58
- const {
59
- page,
60
- selected,
61
- hilight,
62
- isHijri,
63
- className,
64
- selectDate,
65
- changePageDate,
66
- mouseOver,
67
- dateDisabled,
68
- } = props;
45
+ export function DateCell({ date, isMuted = false, ...props }: DateCellProps) {
46
+ const { page, selected, hilight, isHijri, className, selectDate, changePageDate, mouseOver, dateDisabled } = props;
69
47
 
70
48
  const isToday = useMemo(() => isSameDay(date, new Date()), [date]);
71
- const isSelected = useMemo(
72
- () => selected && !isArray(selected) && isSameDay(date, selected),
73
- [date, page, selected],
74
- );
49
+ const isSelected = useMemo(() => selected && !isArray(selected) && isSameDay(date, selected), [date, selected]);
75
50
 
76
51
  const isMarked = useMemo(() => {
77
52
  switch (page) {
@@ -80,11 +55,7 @@ export const DateCell = ({
80
55
  case PageType.YEAR:
81
56
  return selected && !isArray(selected) && isSameYear(date, selected);
82
57
  case PageType.DECADE:
83
- return (
84
- selected &&
85
- !isArray(selected) &&
86
- isSameYear(startOfDecade(date), startOfDecade(selected))
87
- );
58
+ return selected && !isArray(selected) && isSameYear(startOfDecade(date), startOfDecade(selected));
88
59
  }
89
60
  }, [date, page, selected]);
90
61
 
@@ -95,8 +66,7 @@ export const DateCell = ({
95
66
  } else if (Array.isArray(selected)) {
96
67
  const [start, end] = selected;
97
68
  let hilight: string | false = false;
98
- if (isSameDay(date, start) && isSameDay(date, end))
99
- hilight = "startend";
69
+ if (isSameDay(date, start) && isSameDay(date, end)) hilight = "startend";
100
70
  else if (isSameDay(date, start)) hilight = "start";
101
71
  else if (isSameDay(date, end)) hilight = "end";
102
72
  return hilight;
@@ -109,68 +79,43 @@ export const DateCell = ({
109
79
  if (hilight) {
110
80
  const [start, end] = hilight;
111
81
  if (isBefore(start, end)) {
112
- return (
113
- isAfter(date, start) &&
114
- isBefore(date, DateUtil.addDays(end, 1, isHijri))
115
- );
82
+ return isAfter(date, start) && isBefore(date, DateUtil.addDays(end, 1, isHijri));
116
83
  } else {
117
- return (
118
- isBefore(date, start) &&
119
- isAfter(date, DateUtil.addDays(end, -1, isHijri))
120
- );
84
+ return isBefore(date, start) && isAfter(date, DateUtil.addDays(end, -1, isHijri));
121
85
  }
122
86
  } else if (Array.isArray(selected)) {
123
87
  const [start, end] = selected;
124
- return (
125
- isAfter(date, DateUtil.startOfDay(start, isHijri)) &&
126
- isBefore(date, DateUtil.startOfDay(end, isHijri))
127
- );
88
+ return isAfter(date, DateUtil.startOfDay(start, isHijri)) && isBefore(date, DateUtil.startOfDay(end, isHijri));
128
89
  }
129
90
  }
130
91
  }, [isMuted, hilight, selected, date, isHijri]);
131
92
 
132
- const isDisabled = useMemo(
133
- () => !!isSelected || dateDisabled?.(date),
134
- [date, dateDisabled, isSelected],
135
- );
93
+ const isDisabled = useMemo(() => !!isSelected || dateDisabled?.(date), [date, dateDisabled, isSelected]);
136
94
 
137
95
  return (
138
96
  <div
139
97
  role="none"
140
- className={classNames(
98
+ className={cn(
141
99
  "p-1 m-px text-sm text-center rounded",
142
100
  className,
143
101
  !isDisabled && isMuted && "text-tint-500",
144
- (isToday || isMarked) &&
145
- "underline underline-offset-4 text-primary-700",
102
+ (isToday || isMarked) && "underline underline-offset-4 text-primary-700",
146
103
  (!!isSelected || isHilightEdge) && "bg-primary-400 text-white",
147
104
  isHilightEdge === "start" && "rounded-e-none",
148
105
  isHilightEdge === "end" && "rounded-s-none",
149
106
  isHilight && "bg-primary-50 rounded-none",
150
- !isDisabled &&
151
- "cursor-pointer hover:bg-primary-100 hover:text-primary-700",
107
+ !isDisabled && "cursor-pointer hover:bg-primary-100 hover:text-primary-700",
152
108
  isDisabled && "text-tint-100 cursor-not-allowed",
153
109
  )}
154
110
  onFocus={() => hilight && page === PageType.DATE && mouseOver?.(date)}
155
111
  onMouseOver={() => hilight && page === PageType.DATE && mouseOver?.(date)}
156
- onClick={() =>
157
- !isDisabled &&
158
- (page === PageType.DATE ? selectDate?.(date) : changePageDate?.(date))
159
- }
112
+ onClick={() => !isDisabled && (page === PageType.DATE ? selectDate?.(date) : changePageDate?.(date))}
160
113
  >
161
- {page === PageType.DATE &&
162
- DateUtil.format(date, "d", i18next.language, isHijri)}
163
- {page === PageType.MONTH &&
164
- DateUtil.format(date, "MMM", i18next.language, isHijri)}
165
- {page === PageType.YEAR &&
166
- DateUtil.format(date, "yyyy", i18next.language, isHijri)}
114
+ {page === PageType.DATE && DateUtil.format(date, "d", i18next.language, isHijri)}
115
+ {page === PageType.MONTH && DateUtil.format(date, "MMM", i18next.language, isHijri)}
116
+ {page === PageType.YEAR && DateUtil.format(date, "yyyy", i18next.language, isHijri)}
167
117
  {page === PageType.DECADE &&
168
- `${DateUtil.format(
169
- DateUtil.startOfDecade(date, isHijri),
170
- "yyyy",
171
- i18next.language,
172
- isHijri,
173
- )}-${DateUtil.format(
118
+ `${DateUtil.format(DateUtil.startOfDecade(date, isHijri), "yyyy", i18next.language, isHijri)}-${DateUtil.format(
174
119
  DateUtil.endOfDecade(date, isHijri),
175
120
  "yy",
176
121
  i18next.language,
@@ -178,4 +123,4 @@ export const DateCell = ({
178
123
  )}`}
179
124
  </div>
180
125
  );
181
- };
126
+ }
@@ -21,8 +21,8 @@
21
21
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  */
23
23
 
24
- import { Button, CoreIcons } from "@react-fabric/core";
25
- import classNames from "classnames";
24
+ import { Button } from "@react-fabric/core";
25
+ import { cn } from "@react-fabric/utilities";
26
26
  import { addDays, isAfter, isBefore } from "date-fns";
27
27
  import i18next from "i18next";
28
28
  import { useMemo } from "react";
@@ -41,18 +41,8 @@ interface Props {
41
41
  changePageDate: (date: Date) => void;
42
42
  }
43
43
 
44
- export const DateHeader = (props: Props) => {
45
- const {
46
- page,
47
- pageDate = new Date(),
48
- changePage,
49
- changePageDate,
50
- hideNext,
51
- hidePrevious,
52
- min,
53
- max,
54
- isHijri = false,
55
- } = props;
44
+ export function DateHeader(props: Props) {
45
+ const { page, pageDate, changePage, changePageDate, hideNext, hidePrevious, min, max, isHijri = false } = props;
56
46
 
57
47
  const headLabel = useMemo(() => {
58
48
  switch (page) {
@@ -66,57 +56,35 @@ export const DateHeader = (props: Props) => {
66
56
  "yyyy",
67
57
  i18next.language,
68
58
  isHijri,
69
- )} - ${DateUtil.format(
70
- DateUtil.endOfDecade(pageDate, isHijri),
71
- "yyyy",
72
- i18next.language,
73
- isHijri,
74
- )}`;
59
+ )} - ${DateUtil.format(DateUtil.endOfDecade(pageDate, isHijri), "yyyy", i18next.language, isHijri)}`;
75
60
  case PageType.DECADE:
76
61
  return `${DateUtil.format(
77
62
  DateUtil.startOfCentury(pageDate, isHijri),
78
63
  "yyyy",
79
64
  i18next.language,
80
65
  isHijri,
81
- )} - ${DateUtil.format(
82
- DateUtil.endOfCentury(pageDate, isHijri),
83
- "yyyy",
84
- i18next.language,
85
- isHijri,
86
- )}`;
66
+ )} - ${DateUtil.format(DateUtil.endOfCentury(pageDate, isHijri), "yyyy", i18next.language, isHijri)}`;
87
67
  }
88
- }, [i18next.language, isHijri, page, pageDate]);
68
+ }, [isHijri, page, pageDate]);
89
69
 
90
70
  const [startPage, endPage] = useMemo(() => {
91
71
  if (page === PageType.DATE) {
92
72
  const dateBefore = addDays(DateUtil.startOfYear(pageDate, isHijri), -1);
93
73
  const dateAfter = addDays(DateUtil.endOfYear(pageDate, isHijri), 1);
94
74
 
95
- return [
96
- min && isBefore(dateBefore, min) ? null : dateBefore,
97
- max && isAfter(dateAfter, max) ? null : dateAfter,
98
- ];
75
+ return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
99
76
  }
100
77
  if (page === PageType.MONTH) {
101
78
  const dateBefore = addDays(DateUtil.startOfDecade(pageDate, isHijri), -1);
102
79
  const dateAfter = addDays(DateUtil.endOfDecade(pageDate, isHijri), 1);
103
80
 
104
- return [
105
- min && isBefore(dateBefore, min) ? null : dateBefore,
106
- max && isAfter(dateAfter, max) ? null : dateAfter,
107
- ];
81
+ return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
108
82
  }
109
83
  if (page === PageType.YEAR) {
110
- const dateBefore = addDays(
111
- DateUtil.startOfCentury(pageDate, isHijri),
112
- -1,
113
- );
84
+ const dateBefore = addDays(DateUtil.startOfCentury(pageDate, isHijri), -1);
114
85
  const dateAfter = addDays(DateUtil.endOfCentury(pageDate, isHijri), 1);
115
86
 
116
- return [
117
- min && isBefore(dateBefore, min) ? null : dateBefore,
118
- max && isAfter(dateAfter, max) ? null : dateAfter,
119
- ];
87
+ return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
120
88
  }
121
89
  return [];
122
90
  }, [page, min, max, pageDate, isHijri]);
@@ -125,71 +93,54 @@ export const DateHeader = (props: Props) => {
125
93
  if (page === PageType.DATE) {
126
94
  const dateBefore = addDays(DateUtil.startOfMonth(pageDate, isHijri), -1);
127
95
  const dateAfter = addDays(DateUtil.endOfMonth(pageDate, isHijri), 1);
128
- return [
129
- min && isBefore(dateBefore, min) ? null : dateBefore,
130
- max && isAfter(dateAfter, max) ? null : dateAfter,
131
- ];
96
+ return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
132
97
  }
133
98
  if (page === PageType.MONTH) {
134
99
  const dateBefore = addDays(DateUtil.startOfYear(pageDate, isHijri), -1);
135
100
  const dateAfter = addDays(DateUtil.endOfYear(pageDate, isHijri), 1);
136
- return [
137
- min && isBefore(dateBefore, min) ? null : dateBefore,
138
- max && isAfter(dateAfter, max) ? null : dateAfter,
139
- ];
101
+ return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
140
102
  }
141
103
  if (page === PageType.YEAR) {
142
104
  const dateBefore = addDays(DateUtil.startOfDecade(pageDate, isHijri), -1);
143
105
  const dateAfter = addDays(DateUtil.endOfDecade(pageDate, isHijri), 1);
144
106
 
145
- return [
146
- min && isBefore(dateBefore, min) ? null : dateBefore,
147
- max && isAfter(dateAfter, max) ? null : dateAfter,
148
- ];
107
+ return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
149
108
  }
150
109
  if (page === PageType.DECADE) {
151
- const dateBefore = addDays(
152
- DateUtil.startOfCentury(pageDate, isHijri),
153
- -1,
154
- );
110
+ const dateBefore = addDays(DateUtil.startOfCentury(pageDate, isHijri), -1);
155
111
  const dateAfter = addDays(DateUtil.endOfCentury(pageDate, isHijri), 1);
156
112
 
157
- return [
158
- min && isBefore(dateBefore, min) ? null : dateBefore,
159
- max && isAfter(dateAfter, max) ? null : dateAfter,
160
- ];
113
+ return [min && isBefore(dateBefore, min) ? null : dateBefore, max && isAfter(dateAfter, max) ? null : dateAfter];
161
114
  }
162
115
  return [];
163
116
  }, [page, min, max, pageDate, isHijri]);
164
117
 
165
118
  return (
166
- <div className="flex flex-nowrap items-center area-head" data-page={page}>
119
+ <div className="flex flex-nowrap items-center area-header" data-page={page}>
167
120
  {startPage !== undefined && (
168
121
  <Button
169
- icon={CoreIcons.chevronsLeft}
170
- rtlFlip
122
+ icon={{ icon: "icon-[mdi--chevron-double-left]", rtlFlip: true }}
171
123
  size="sm"
172
124
  variant="link"
173
125
  aria-label="start"
174
126
  disabled={!startPage}
175
- className={classNames(hidePrevious && "invisible")}
127
+ className={cn(hidePrevious && "invisible")}
176
128
  onClick={() => startPage && changePageDate?.(startPage)}
177
129
  />
178
130
  )}
179
131
  <Button
180
- icon={CoreIcons.chevronLeft}
181
- rtlFlip
132
+ icon={{ icon: "icon-[mdi--chevron-left]", rtlFlip: true }}
182
133
  size="sm"
183
134
  variant="link"
184
135
  aria-label="prev"
185
136
  disabled={!previousPage}
186
- className={classNames(hidePrevious && "invisible")}
137
+ className={cn(hidePrevious && "invisible")}
187
138
  onClick={() => previousPage && changePageDate?.(previousPage)}
188
139
  />
189
140
  <div
190
141
  role="none"
191
142
  onClick={() => changePage(page + 1)}
192
- className={classNames(
143
+ className={cn(
193
144
  "flex-1 px-2 py-1 text-primary-600 text-center text-sm font-medium truncate",
194
145
  page === PageType.DECADE ? "pointer-events-none" : "cursor-pointer",
195
146
  )}
@@ -197,27 +148,25 @@ export const DateHeader = (props: Props) => {
197
148
  {headLabel}
198
149
  </div>
199
150
  <Button
200
- icon={CoreIcons.chevronRight}
201
- rtlFlip
151
+ icon={{ icon: "icon-[mdi--chevron-right]", rtlFlip: true }}
202
152
  size="sm"
203
153
  variant="link"
204
154
  aria-label="next"
205
155
  disabled={!nextPage}
206
- className={classNames(hideNext && "invisible")}
156
+ className={cn(hideNext && "invisible")}
207
157
  onClick={() => nextPage && changePageDate?.(nextPage)}
208
158
  />
209
159
  {endPage !== undefined && (
210
160
  <Button
211
- icon={CoreIcons.chevronsRight}
212
- rtlFlip
161
+ icon={{ icon: "icon-[mdi--chevron-double-right]", rtlFlip: true }}
213
162
  size="sm"
214
163
  variant="link"
215
164
  aria-label="end"
216
165
  disabled={!endPage}
217
- className={classNames(hideNext && "invisible")}
166
+ className={cn(hideNext && "invisible")}
218
167
  onClick={() => endPage && changePageDate?.(endPage)}
219
168
  />
220
169
  )}
221
170
  </div>
222
171
  );
223
- };
172
+ }
@@ -21,14 +21,13 @@
21
21
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  */
23
23
 
24
+ import { cn } from "@react-fabric/utilities";
24
25
  import { getDay } from "date-fns";
25
26
  import i18next from "i18next";
26
27
  import { Fragment, useMemo } from "react";
28
+ import { PageType } from "../types";
27
29
  import { DateUtil } from "../utils/dateUtil";
28
30
  import { DateCell, type DateCellProps } from "./DateCell";
29
- import classNames from "classnames";
30
- import { PageType } from "../types";
31
- import classes from "./Date.module.css";
32
31
 
33
32
  const rows = [0, 1, 2, 3, 4, 5];
34
33
  const cols = [0, 1, 2, 3, 4, 5, 6];
@@ -37,39 +36,22 @@ interface Props extends Omit<DateCellProps, "date"> {
37
36
  pageDate: Date;
38
37
  }
39
38
 
40
- export const DatePage = ({ pageDate, isHijri, ...props }: Props) => {
39
+ export function DatePage({ pageDate, isHijri, ...props }: Props) {
41
40
  const startDate = useMemo(() => {
42
41
  const first = DateUtil.startOfMonth(pageDate, isHijri);
43
42
  const current = getDay(first);
44
- return DateUtil.addDays(
45
- first,
46
- (current < 3 ? -7 : 0) + current * -1,
47
- isHijri,
48
- );
43
+ return DateUtil.addDays(first, (current < 3 ? -7 : 0) + current * -1, isHijri);
49
44
  }, [isHijri, pageDate]);
50
45
 
51
46
  return (
52
- <div
53
- className={classNames(
54
- "grid grid-cols-8 area-content",
55
- props.page !== PageType.DATE && "invisible",
56
- )}
57
- >
58
- <div
59
- className={classNames(
60
- classes.dateHeader,
61
- "px-1 text-center bg-tint-50 h-7",
62
- )}
63
- ></div>
47
+ <div className={cn("grid grid-cols-8 area-content", props.page !== PageType.DATE && "invisible")}>
48
+ <div className={cn("fabric-dateHeader", "px-1 text-center bg-tint-50 h-7")}></div>
64
49
  {cols.map((col) => {
65
50
  const dt = DateUtil.addDays(startDate, col, isHijri);
66
51
  return (
67
52
  <div
68
53
  key={dt.toISOString()}
69
- className={classNames(
70
- classes.dateHeader,
71
- "font-medium text-sm p-1 mx-px text-center text-muted bg-tint-50 h-7",
72
- )}
54
+ className={cn("fabric-dateHeader", "font-medium text-sm p-1 mx-px text-center text-muted bg-tint-50 h-7")}
73
55
  >
74
56
  {DateUtil.format(dt, "eeeeee", i18next.language, isHijri)}
75
57
  </div>
@@ -77,25 +59,18 @@ export const DatePage = ({ pageDate, isHijri, ...props }: Props) => {
77
59
  })}
78
60
  {rows.map((row) => (
79
61
  <Fragment key={row}>
80
- <div
81
- key={row}
82
- className="px-1 py-1.5 m-px text-xs text-center text-tint-300"
83
- >
84
- {DateUtil.getWeek(
85
- DateUtil.addDays(startDate, row * 7, isHijri),
86
- i18next.language,
87
- isHijri,
88
- )}
62
+ <div key={row} className="px-1 py-1.5 m-px text-xs text-center text-tint-300">
63
+ {DateUtil.getWeek(DateUtil.addDays(startDate, row * 7, isHijri), i18next.language, isHijri)}
89
64
  </div>
90
65
  {cols.map((col) => {
91
66
  const dt = DateUtil.addDays(startDate, row * 7 + col, isHijri);
92
67
  return (
93
68
  <DateCell
69
+ key={dt.toISOString()}
94
70
  {...props}
95
71
  date={dt}
96
72
  page={PageType.DATE}
97
73
  isHijri={isHijri}
98
- key={dt.toISOString()}
99
74
  isMuted={!DateUtil.isSameMonth(dt, pageDate, isHijri)}
100
75
  />
101
76
  );
@@ -104,4 +79,4 @@ export const DatePage = ({ pageDate, isHijri, ...props }: Props) => {
104
79
  ))}
105
80
  </div>
106
81
  );
107
- };
82
+ }
@@ -31,7 +31,7 @@ interface Props extends Omit<DateCellProps, "date"> {
31
31
  pageDate: Date;
32
32
  }
33
33
 
34
- export const DecadePage = ({ pageDate, isHijri, ...props }: Props) => {
34
+ export function DecadePage({ pageDate, isHijri, ...props }: Props) {
35
35
  const startDate = useMemo(() => {
36
36
  return DateUtil.startOfCentury(pageDate, isHijri);
37
37
  }, [isHijri, pageDate]);
@@ -50,4 +50,4 @@ export const DecadePage = ({ pageDate, isHijri, ...props }: Props) => {
50
50
  ))}
51
51
  </div>
52
52
  );
53
- };
53
+ }
@@ -31,7 +31,7 @@ interface Props extends Omit<DateCellProps, "date"> {
31
31
  pageDate: Date;
32
32
  }
33
33
 
34
- export const MonthPage = ({ pageDate, isHijri, ...props }: Props) => {
34
+ export function MonthPage({ pageDate, isHijri, ...props }: Props) {
35
35
  const startDate = useMemo(() => {
36
36
  return DateUtil.startOfYear(pageDate, isHijri);
37
37
  }, [isHijri, pageDate]);
@@ -49,4 +49,4 @@ export const MonthPage = ({ pageDate, isHijri, ...props }: Props) => {
49
49
  ))}
50
50
  </div>
51
51
  );
52
- };
52
+ }
@@ -21,10 +21,9 @@
21
21
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  */
23
23
 
24
- import { useDebounce } from "@react-fabric/core";
25
- import classNames from "classnames";
26
- import { useCallback, useEffect, useRef, useState } from "react";
27
- import classes from "./Date.module.css";
24
+ import { useDebounce, usePropState } from "@react-fabric/core";
25
+ import { cn } from "@react-fabric/utilities";
26
+ import { useCallback, useRef } from "react";
28
27
 
29
28
  interface Props {
30
29
  hour: number;
@@ -32,35 +31,20 @@ interface Props {
32
31
  onTimeChange: (time: { hour: number; minute: number }) => void;
33
32
  }
34
33
 
35
- export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
34
+ export function TimeSlider({ hour = 0, minute = 0, onTimeChange }: Props) {
36
35
  const hourRef = useRef<HTMLDivElement>(null);
37
36
  const minuteRef = useRef<HTMLDivElement>(null);
38
37
 
39
- const [h, setH] = useState(hour);
40
- const [m, setM] = useState(minute);
41
-
42
- useEffect(() => {
43
- setH(hour);
44
- hourRef.current?.children
45
- .item(hour + 1)
46
- ?.scrollIntoView({ block: "center" });
47
- }, [hour]);
48
- useEffect(() => {
49
- setM(minute);
50
- minuteRef.current?.children
51
- .item(minute + 1)
52
- ?.scrollIntoView({ block: "center" });
53
- }, [minute]);
38
+ const [h, setH] = usePropState(hour, (hr) => hourRef.current?.children.item(hr + 1)?.scrollIntoView({ block: "center" }));
39
+ const [m, setM] = usePropState(minute, (mn) => minuteRef.current?.children.item(mn + 1)?.scrollIntoView({ block: "center" }));
54
40
 
55
41
  const fireChange = useDebounce(onTimeChange, [onTimeChange]);
56
42
 
57
43
  const calculateTime = useCallback(() => {
58
44
  const hourTop = hourRef.current?.scrollTop ?? 0;
59
- const hourHeight =
60
- (hourRef.current?.children.item(1) as HTMLElement)?.offsetHeight ?? 0;
45
+ const hourHeight = (hourRef.current?.children.item(1) as HTMLElement)?.offsetHeight ?? 0;
61
46
  const minuteTop = minuteRef.current?.scrollTop ?? 0;
62
- const minuteHeight =
63
- (minuteRef.current?.children.item(1) as HTMLElement)?.offsetHeight ?? 0;
47
+ const minuteHeight = (minuteRef.current?.children.item(1) as HTMLElement)?.offsetHeight ?? 0;
64
48
 
65
49
  const hour = Math.round(hourTop / hourHeight);
66
50
  const minute = Math.round(minuteTop / minuteHeight);
@@ -69,38 +53,21 @@ export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
69
53
  setM(minute);
70
54
 
71
55
  fireChange({ hour, minute });
72
- }, [onTimeChange]);
56
+ }, [fireChange, setH, setM]);
73
57
 
74
58
  return (
75
- <div
76
- className={classNames(
77
- "area-[time] flex flex-col flex-nowrap border-s border-s-tint-50 overflow-hidden bg-base",
78
- )}
79
- >
59
+ <div className={cn("area-[time] flex flex-col flex-nowrap border-s border-s-tint-50 overflow-hidden bg-default")}>
80
60
  <div className="flex">
81
- <div
82
- className={classNames(
83
- classes.dateHeader,
84
- "flex-1 font-medium text-muted text-sm p-1 mx-px text-center bg-tint-50",
85
- )}
86
- >
61
+ <div className={cn("fabric-dateHeader", "flex-1 font-medium text-muted text-sm p-1 mx-px text-center bg-tint-50")}>
87
62
  H
88
63
  </div>
89
- <div
90
- className={classNames(
91
- classes.dateHeader,
92
- "flex-1 font-medium text-muted text-sm p-1 mx-px text-center bg-tint-50",
93
- )}
94
- >
64
+ <div className={cn("fabric-dateHeader", "flex-1 font-medium text-muted text-sm p-1 mx-px text-center bg-tint-50")}>
95
65
  M
96
66
  </div>
97
67
  </div>
98
- <div className="flex flex-1 flex-nowrap overflow-hidden relative">
68
+ <div className="flex flex-1 flex-nowrap items-stretch overflow-hidden relative">
99
69
  <div
100
- className={classNames(
101
- "flex-1 overflow-auto scroll-hide snap-y snap-mandatory",
102
- classes.timeSlider,
103
- )}
70
+ className={cn("flex-1 overflow-auto scroll-hide snap-y snap-mandatory", "fabric-date-timeSlider")}
104
71
  onScroll={calculateTime}
105
72
  ref={hourRef}
106
73
  >
@@ -110,10 +77,8 @@ export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
110
77
  .map((_, i) => (
111
78
  <div
112
79
  role="none"
113
- className={classNames(
114
- "ps-2 pe-1 snap-center outline outline-muted",
115
- i === h && "font-medium text-primary-600",
116
- )}
80
+ className={cn("ps-2 pe-1 snap-center outline outline-muted", i === h && "font-medium text-primary-600")}
81
+ // eslint-disable-next-line @eslint-react/no-array-index-key
117
82
  key={i}
118
83
  data-skew={
119
84
  i === h - 5 || i === h + 5
@@ -142,10 +107,7 @@ export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
142
107
  <div className="w-full" />
143
108
  </div>
144
109
  <div
145
- className={classNames(
146
- "flex-1 overflow-auto scroll-hide snap-y snap-mandatory",
147
- classes.timeSlider,
148
- )}
110
+ className={cn("flex-1 overflow-auto scroll-hide snap-y snap-mandatory", "fabric-date-timeSlider")}
149
111
  onScroll={calculateTime}
150
112
  ref={minuteRef}
151
113
  >
@@ -155,10 +117,8 @@ export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
155
117
  .map((_, i) => (
156
118
  <div
157
119
  role="none"
158
- className={classNames(
159
- "ps-1 pe-2 snap-center outline outline-muted",
160
- i === m && "font-medium text-primary-600",
161
- )}
120
+ className={cn("ps-1 pe-2 snap-center outline outline-muted", i === m && "font-medium text-primary-600")}
121
+ // eslint-disable-next-line @eslint-react/no-array-index-key
162
122
  key={i}
163
123
  data-skew={
164
124
  i === m - 5 || i === m + 5
@@ -193,4 +153,4 @@ export const TimeSlider = ({ hour = 0, minute = 0, onTimeChange }: Props) => {
193
153
  </div>
194
154
  </div>
195
155
  );
196
- };
156
+ }
@@ -31,7 +31,7 @@ interface Props extends Omit<DateCellProps, "date"> {
31
31
  pageDate: Date;
32
32
  }
33
33
 
34
- export const YearPage = ({ pageDate, isHijri, ...props }: Props) => {
34
+ export function YearPage({ pageDate, isHijri, ...props }: Props) {
35
35
  const startDate = useMemo(() => {
36
36
  return DateUtil.startOfDecade(pageDate, isHijri);
37
37
  }, [isHijri, pageDate]);
@@ -50,4 +50,4 @@ export const YearPage = ({ pageDate, isHijri, ...props }: Props) => {
50
50
  ))}
51
51
  </div>
52
52
  );
53
- };
53
+ }