@jk-core/components 1.1.17 → 1.1.18

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 (83) hide show
  1. package/README.md +73 -73
  2. package/dist/index.js +42 -42
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.umd.cjs +2 -2
  5. package/dist/index.umd.cjs.map +1 -1
  6. package/package.json +99 -99
  7. package/src/Calendar/Calendar.module.scss +213 -213
  8. package/src/Calendar/RangeCalendar.tsx +125 -125
  9. package/src/Calendar/ScrollCalendar.module.scss +214 -214
  10. package/src/Calendar/ScrollCalendar.tsx +124 -124
  11. package/src/Calendar/SingleCalendar.tsx +121 -121
  12. package/src/Calendar/components/DateLabel/DateLabel.module.scss +89 -89
  13. package/src/Calendar/components/DateLabel/index.tsx +91 -91
  14. package/src/Calendar/components/DayTile/DayTile.module.scss +117 -117
  15. package/src/Calendar/components/DayTile/index.tsx +108 -108
  16. package/src/Calendar/components/MonthTile/MonthTile.module.scss +59 -59
  17. package/src/Calendar/components/MonthTile/index.tsx +50 -50
  18. package/src/Calendar/components/ViewSelector/ViewSelector.module.scss +48 -48
  19. package/src/Calendar/components/ViewSelector/index.tsx +49 -49
  20. package/src/Calendar/components/YearTile/YearTile.module.scss +85 -85
  21. package/src/Calendar/components/YearTile/index.tsx +65 -65
  22. package/src/Calendar/hooks/useCalendarNav.ts +83 -83
  23. package/src/Calendar/hooks/useDateSelect.ts +54 -54
  24. package/src/Calendar/index.scss +189 -189
  25. package/src/Calendar/index.tsx +66 -66
  26. package/src/Calendar/type.ts +3 -3
  27. package/src/Calendar/utils/getWeeksInMonth.ts +45 -45
  28. package/src/Calendar/utils/isInRange.ts +8 -8
  29. package/src/Calendar/utils/isSameDay.ts +21 -21
  30. package/src/assets/arrow.svg +11 -11
  31. package/src/assets/close.svg +15 -15
  32. package/src/assets/drop-arrow.svg +3 -3
  33. package/src/common/Accordion/Accordion.module.scss +53 -53
  34. package/src/common/Accordion/arrow-down.svg +3 -3
  35. package/src/common/Accordion/arrow-up.svg +3 -3
  36. package/src/common/Accordion/index.tsx +54 -54
  37. package/src/common/Breadcrumbs/Breadcrumbs.module.scss +46 -46
  38. package/src/common/Breadcrumbs/home.svg +5 -5
  39. package/src/common/Breadcrumbs/index.tsx +82 -82
  40. package/src/common/Button/Button.module.scss +127 -127
  41. package/src/common/Button/index.tsx +60 -60
  42. package/src/common/Card/Card.module.scss +28 -28
  43. package/src/common/Card/index.tsx +19 -19
  44. package/src/common/Divider/Divider.module.scss +101 -101
  45. package/src/common/Divider/index.tsx +24 -24
  46. package/src/common/DropDown/DropDown.module.scss +135 -135
  47. package/src/common/DropDown/List.tsx +156 -156
  48. package/src/common/DropDown/arrow-down.svg +3 -3
  49. package/src/common/DropDown/index.tsx +108 -108
  50. package/src/common/DropDown/search.svg +4 -4
  51. package/src/common/Pagination/Pagination.module.scss +210 -210
  52. package/src/common/Pagination/arrow-left.svg +11 -11
  53. package/src/common/Pagination/arrow-right.svg +11 -11
  54. package/src/common/Pagination/index.tsx +156 -156
  55. package/src/common/SegmentButton/SegmentButton.module.scss +46 -45
  56. package/src/common/SegmentButton/index.tsx +79 -79
  57. package/src/common/Skeleton/Skeleton.module.scss +80 -80
  58. package/src/common/Skeleton/index.tsx +47 -47
  59. package/src/common/SwitchButton/SwitchButton.module.scss +65 -65
  60. package/src/common/SwitchButton/index.tsx +57 -57
  61. package/src/common/Table/Table.module.scss +70 -70
  62. package/src/common/Table/index.tsx +128 -128
  63. package/src/index.scss +1 -1
  64. package/src/index.tsx +21 -21
  65. package/src/styles/color.scss +346 -346
  66. package/src/styles/font-face.scss +18 -18
  67. package/src/styles/font.scss +49 -49
  68. package/src/styles/mediaQuery.scss +22 -22
  69. package/src/styles/scrollbar.scss +71 -71
  70. package/src/svg.d.ts +6 -6
  71. package/src/utils/styles/mediaQuery.scss +22 -22
  72. package/src/utils/ts/allowDecimal.ts +4 -4
  73. package/src/utils/ts/autoHypen.ts +33 -33
  74. package/src/utils/ts/calculateMax.ts +24 -24
  75. package/src/utils/ts/checkIsMobilePlatform.ts +15 -15
  76. package/src/utils/ts/formatFileSize.ts +16 -16
  77. package/src/utils/ts/formatMoney.ts +16 -16
  78. package/src/utils/ts/gradientRatio.ts +61 -61
  79. package/src/utils/ts/kiloToMega.ts +30 -30
  80. package/src/utils/ts/maskingPhone.ts +8 -8
  81. package/src/utils/ts/toQueryString.ts +7 -7
  82. package/src/utils/ts/valueAsNumber.ts +15 -15
  83. package/src/vite-env.d.ts +2 -2
@@ -1,91 +1,91 @@
1
- import { cn } from '@jk-core/utils';
2
- import ArrowIcon from '@/assets/arrow.svg';
3
- import DropIcon from '@/assets/drop-arrow.svg';
4
- import { CalendarView } from '@/Calendar/type';
5
- import styles from './DateLabel.module.scss';
6
-
7
- interface DateLabelProps {
8
- viewDate: Date;
9
- onArrowClick: (direction: 'prev' | 'next') => void;
10
- disabled: (direction: 'prev' | 'next') => boolean;
11
- method: CalendarView;
12
- selectMode?: CalendarView;
13
- setSelectMode?: (mode: CalendarView) => void;
14
- hideArrow?: 'prev' | 'next' | 'all' | null;
15
- range?: boolean;
16
- }
17
-
18
- export default function DateLabel({
19
- viewDate, onArrowClick, disabled, method, selectMode = 'day', setSelectMode = () => { }, hideArrow = null, range = false,
20
- }: DateLabelProps) {
21
- return (
22
- <div className={cn({
23
- [styles.nav]: true,
24
- [styles['nav--range']]: range,
25
- [styles['nav--left']]: hideArrow === 'all',
26
- })}
27
- >
28
- {hideArrow !== 'all' && (
29
- <button
30
- className={styles.nav__button}
31
- type="button"
32
- onClick={() => onArrowClick('prev')}
33
- disabled={disabled('prev') || hideArrow === 'prev'}
34
- >
35
- {hideArrow !== 'prev' && <ArrowIcon />}
36
- </button>
37
- )}
38
- {range ? (
39
- <div className={cn({
40
- [styles.nav__label]: true,
41
- [styles['nav__label--left']]: hideArrow === 'all',
42
- })}
43
- >
44
- {`${viewDate.getFullYear()}년 ${viewDate.getMonth() + 1}월`}
45
- </div>
46
- ) : (
47
- <div className={cn({
48
- [styles.nav__label]: true,
49
- [styles['nav__label--left']]: hideArrow === 'all',
50
- })}
51
- >
52
- {method === 'year' && '연도 선택'}
53
- {method !== 'year' && (
54
- <button
55
- className={cn({
56
- [styles['nav__label--date']]: true,
57
- [styles['nav__label--date-selected']]: selectMode === 'year',
58
- })}
59
- type="button"
60
- onClick={() => setSelectMode('year')}
61
- >
62
- {`${viewDate.getFullYear()}년`}<DropIcon />
63
- </button>
64
- )}
65
- {method === 'day' && (
66
- <button
67
- className={cn({
68
- [styles['nav__label--date']]: true,
69
- [styles['nav__label--date-selected']]: selectMode === 'month',
70
- })}
71
- type="button"
72
- onClick={() => setSelectMode('month')}
73
- >
74
- {`${viewDate.getMonth() + 1}월`}<DropIcon />
75
- </button>
76
- )}
77
- </div>
78
- )}
79
- {hideArrow !== 'all' && (
80
- <button
81
- className={styles.nav__button}
82
- type="button"
83
- onClick={() => onArrowClick('next')}
84
- disabled={disabled('next') || hideArrow === 'next'}
85
- >
86
- {hideArrow !== 'next' && <ArrowIcon style={{ transform: 'rotate(180deg)' }} />}
87
- </button>
88
- )}
89
- </div>
90
- );
91
- }
1
+ import { cn } from '@jk-core/utils';
2
+ import ArrowIcon from '@/assets/arrow.svg';
3
+ import DropIcon from '@/assets/drop-arrow.svg';
4
+ import { CalendarView } from '@/Calendar/type';
5
+ import styles from './DateLabel.module.scss';
6
+
7
+ interface DateLabelProps {
8
+ viewDate: Date;
9
+ onArrowClick: (direction: 'prev' | 'next') => void;
10
+ disabled: (direction: 'prev' | 'next') => boolean;
11
+ method: CalendarView;
12
+ selectMode?: CalendarView;
13
+ setSelectMode?: (mode: CalendarView) => void;
14
+ hideArrow?: 'prev' | 'next' | 'all' | null;
15
+ range?: boolean;
16
+ }
17
+
18
+ export default function DateLabel({
19
+ viewDate, onArrowClick, disabled, method, selectMode = 'day', setSelectMode = () => { }, hideArrow = null, range = false,
20
+ }: DateLabelProps) {
21
+ return (
22
+ <div className={cn({
23
+ [styles.nav]: true,
24
+ [styles['nav--range']]: range,
25
+ [styles['nav--left']]: hideArrow === 'all',
26
+ })}
27
+ >
28
+ {hideArrow !== 'all' && (
29
+ <button
30
+ className={styles.nav__button}
31
+ type="button"
32
+ onClick={() => onArrowClick('prev')}
33
+ disabled={disabled('prev') || hideArrow === 'prev'}
34
+ >
35
+ {hideArrow !== 'prev' && <ArrowIcon />}
36
+ </button>
37
+ )}
38
+ {range ? (
39
+ <div className={cn({
40
+ [styles.nav__label]: true,
41
+ [styles['nav__label--left']]: hideArrow === 'all',
42
+ })}
43
+ >
44
+ {`${viewDate.getFullYear()}년 ${viewDate.getMonth() + 1}월`}
45
+ </div>
46
+ ) : (
47
+ <div className={cn({
48
+ [styles.nav__label]: true,
49
+ [styles['nav__label--left']]: hideArrow === 'all',
50
+ })}
51
+ >
52
+ {method === 'year' && '연도 선택'}
53
+ {method !== 'year' && (
54
+ <button
55
+ className={cn({
56
+ [styles['nav__label--date']]: true,
57
+ [styles['nav__label--date-selected']]: selectMode === 'year',
58
+ })}
59
+ type="button"
60
+ onClick={() => setSelectMode('year')}
61
+ >
62
+ {`${viewDate.getFullYear()}년`}<DropIcon />
63
+ </button>
64
+ )}
65
+ {method === 'day' && (
66
+ <button
67
+ className={cn({
68
+ [styles['nav__label--date']]: true,
69
+ [styles['nav__label--date-selected']]: selectMode === 'month',
70
+ })}
71
+ type="button"
72
+ onClick={() => setSelectMode('month')}
73
+ >
74
+ {`${viewDate.getMonth() + 1}월`}<DropIcon />
75
+ </button>
76
+ )}
77
+ </div>
78
+ )}
79
+ {hideArrow !== 'all' && (
80
+ <button
81
+ className={styles.nav__button}
82
+ type="button"
83
+ onClick={() => onArrowClick('next')}
84
+ disabled={disabled('next') || hideArrow === 'next'}
85
+ >
86
+ {hideArrow !== 'next' && <ArrowIcon style={{ transform: 'rotate(180deg)' }} />}
87
+ </button>
88
+ )}
89
+ </div>
90
+ );
91
+ }
@@ -1,117 +1,117 @@
1
- @use "../../../styles/mediaQuery.scss" as media;
2
-
3
- .day-tile {
4
- width: 100%;
5
- min-height: 310px;
6
- padding: 5px;
7
- box-sizing: border-box;
8
-
9
- &--content {
10
- display: flex;
11
- justify-content: center;
12
- align-items: center;
13
- flex-direction: column;
14
- border-radius: 40px;
15
- border: none;
16
- font-weight: 400;
17
- font-size: 1em;
18
- }
19
-
20
- &--selected {
21
- width: 100%;
22
- height: 100%;
23
- background-color: var(--calendar-P-50) !important;
24
- color: var(--calendar-white) !important;
25
- font-weight: 500;
26
- padding: 0;
27
- }
28
-
29
- &__range {
30
- flex: 1 0;
31
- display: flex;
32
- align-items: center;
33
- justify-content: center;
34
- gap: 10%;
35
- font-size: 1.1em;
36
- font-weight: 400;
37
- }
38
-
39
- &__tile {
40
- display: flex;
41
- flex-direction: column;
42
- justify-content: space-between;
43
- gap: 5px;
44
- }
45
-
46
- &__weeks {
47
- display: flex;
48
- justify-content: space-between;
49
- font-weight: 400;
50
- font-size: 1em;
51
-
52
- &--date {
53
- flex: 1 0;
54
- display: flex;
55
- justify-content: center;
56
- align-items: center;
57
- min-width: 40px;
58
- padding: 5px 0;
59
- }
60
- }
61
-
62
- &__week {
63
- display: flex;
64
- justify-content: space-between;
65
- }
66
-
67
- &__day {
68
- width: 100%;
69
- min-width: 40px;
70
- min-height: 40px;
71
- padding: 0;
72
- border: none;
73
- color: var(--calendar-G-80);
74
-
75
- &:disabled {
76
- color: var(--calendar-G-40) !important;
77
- background-color: transparent !important;
78
- cursor: default;
79
- }
80
-
81
- &--today {
82
- color: var(--calendar-P-50);
83
- font-weight: 500;
84
- }
85
-
86
- &--selected-first {
87
- border-radius: 40px 0 0 40px !important;
88
- background-color: var(--calendar-P-5);
89
- }
90
-
91
- &--selected-last {
92
- border-radius: 0 40px 40px 0 !important;
93
- background-color: var(--calendar-P-5);
94
- }
95
-
96
- &--before {
97
- color: var(--calendar-G-40) !important;
98
- background-color: transparent !important;
99
- }
100
-
101
- &--tile {
102
- border-radius: 10px;
103
- gap: 5px;
104
- }
105
-
106
- &--range {
107
- background-color: var(--calendar-P-5);
108
- border-radius: 0;
109
- }
110
-
111
- &--hide-before,
112
- &--hide-after {
113
- opacity: 0;
114
- pointer-events: none;
115
- }
116
- }
117
- }
1
+ @use "../../../styles/mediaQuery.scss" as media;
2
+
3
+ .day-tile {
4
+ width: 100%;
5
+ min-height: 310px;
6
+ padding: 5px;
7
+ box-sizing: border-box;
8
+
9
+ &--content {
10
+ display: flex;
11
+ justify-content: center;
12
+ align-items: center;
13
+ flex-direction: column;
14
+ border-radius: 40px;
15
+ border: none;
16
+ font-weight: 400;
17
+ font-size: 1em;
18
+ }
19
+
20
+ &--selected {
21
+ width: 100%;
22
+ height: 100%;
23
+ background-color: var(--calendar-P-50) !important;
24
+ color: var(--calendar-white) !important;
25
+ font-weight: 500;
26
+ padding: 0;
27
+ }
28
+
29
+ &__range {
30
+ flex: 1 0;
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ gap: 10%;
35
+ font-size: 1.1em;
36
+ font-weight: 400;
37
+ }
38
+
39
+ &__tile {
40
+ display: flex;
41
+ flex-direction: column;
42
+ justify-content: space-between;
43
+ gap: 5px;
44
+ }
45
+
46
+ &__weeks {
47
+ display: flex;
48
+ justify-content: space-between;
49
+ font-weight: 400;
50
+ font-size: 1em;
51
+
52
+ &--date {
53
+ flex: 1 0;
54
+ display: flex;
55
+ justify-content: center;
56
+ align-items: center;
57
+ min-width: 40px;
58
+ padding: 5px 0;
59
+ }
60
+ }
61
+
62
+ &__week {
63
+ display: flex;
64
+ justify-content: space-between;
65
+ }
66
+
67
+ &__day {
68
+ width: 100%;
69
+ min-width: 40px;
70
+ min-height: 40px;
71
+ padding: 0;
72
+ border: none;
73
+ color: var(--calendar-G-80);
74
+
75
+ &:disabled {
76
+ color: var(--calendar-G-40) !important;
77
+ background-color: transparent !important;
78
+ cursor: default;
79
+ }
80
+
81
+ &--today {
82
+ color: var(--calendar-P-50);
83
+ font-weight: 500;
84
+ }
85
+
86
+ &--selected-first {
87
+ border-radius: 40px 0 0 40px !important;
88
+ background-color: var(--calendar-P-5);
89
+ }
90
+
91
+ &--selected-last {
92
+ border-radius: 0 40px 40px 0 !important;
93
+ background-color: var(--calendar-P-5);
94
+ }
95
+
96
+ &--before {
97
+ color: var(--calendar-G-40) !important;
98
+ background-color: transparent !important;
99
+ }
100
+
101
+ &--tile {
102
+ border-radius: 10px;
103
+ gap: 5px;
104
+ }
105
+
106
+ &--range {
107
+ background-color: var(--calendar-P-5);
108
+ border-radius: 0;
109
+ }
110
+
111
+ &--hide-before,
112
+ &--hide-after {
113
+ opacity: 0;
114
+ pointer-events: none;
115
+ }
116
+ }
117
+ }
@@ -1,108 +1,108 @@
1
-
2
- import { cn } from '@jk-core/utils';
3
- import { CalendarRange } from '@/Calendar/type';
4
- import isInRange from '@/Calendar/utils/isInRange';
5
- import isSameDay from '@/Calendar/utils/isSameDay';
6
- import styles from './DayTile.module.scss';
7
-
8
- const WEEKS = ['일', '월', '화', '수', '목', '금', '토'];
9
-
10
- interface Props {
11
- hoverDate?:Date | null,
12
- setHoverDate?:(date:Date | null)=>void,
13
- selectedDate?: CalendarRange;
14
- weeksInMonth: {
15
- thisMonth: string;
16
- date: Date;
17
- }[][];
18
- tileContent?: () => React.ReactNode;
19
- handleDayClick: (day: Date) => void;
20
- max?: Date;
21
- min?: Date;
22
- hideBefore?: boolean;
23
- hideAfter?: boolean;
24
- range?: boolean;
25
- scroll?: boolean;
26
- style?: React.CSSProperties;
27
- }
28
- export default function DayTile({
29
- selectedDate, weeksInMonth, tileContent, handleDayClick, range = false,
30
- max, min, hideBefore = false, hideAfter = false, style, scroll,
31
- hoverDate, setHoverDate = () => { },
32
- }: Props) {
33
- const handleDisabled = (date: Date): boolean => {
34
- const compareDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
35
- const compareMin = min ? new Date(min.getFullYear(), min.getMonth(), min.getDate()) : null;
36
- const compareMax = max ? new Date(max.getFullYear(), max.getMonth(), max.getDate()) : null;
37
-
38
- return !!((compareMin && compareDate < compareMin) || (compareMax && compareDate > compareMax));
39
- };
40
-
41
- return (
42
- <div className={styles['day-tile']} style={style}>
43
- <div className={styles['day-tile__weeks']}>
44
- {WEEKS.map((week) => (<div className={styles['day-tile__weeks--date']} key={week}>{week}</div>))}
45
- </div>
46
-
47
- <div className={styles['day-tile__tile']}>
48
- {weeksInMonth.map((week, index) => (
49
- <div key={index} className={styles['day-tile__week']}>
50
- {week.map((day, idx) => (
51
- <button
52
- className={cn({
53
- [styles['day-tile__day']]: true,
54
- [styles['day-tile__day--today']]: isSameDay(day.date, new Date()),
55
- [styles['day-tile__day--selected-first']]: !!selectedDate && isSameDay(day.date, selectedDate[0] || null) && range
56
- && ((!!selectedDate[1]
57
- || ((!scroll && hoverDate != null && !!selectedDate[0])
58
- && hoverDate > selectedDate[0]))),
59
- [styles['day-tile__day--selected-last']]: (!!selectedDate && isSameDay(day.date, selectedDate[1] || null) && range)
60
- || (!scroll && !selectedDate?.[1] && isSameDay(day.date, hoverDate || null)),
61
- [styles['day-tile__day--before']]: day.thisMonth !== 'this',
62
- [styles['day-tile__day--hide-before']]: hideBefore && day.thisMonth === 'before',
63
- [styles['day-tile__day--hide-after']]: hideAfter && day.thisMonth === 'after',
64
- [styles['day-tile__day--tile']]: !!(tileContent && tileContent()),
65
- [styles['day-tile__day--range']]: isInRange(day.date, selectedDate) || (!!selectedDate?.[0] && (isInRange(day.date, [selectedDate[0], hoverDate]))),
66
- })}
67
- type="button"
68
- disabled={handleDisabled(day.date)}
69
- key={idx}
70
- onMouseOver={() => {
71
- if (!selectedDate?.[1] && !((min && day.date < min) || (max && day.date > max))) {
72
- setHoverDate(new Date(
73
- day.date.getFullYear(),
74
- day.date.getMonth(),
75
- day.date.getDate(),
76
- ));
77
- }
78
- }}
79
- onFocus={() => {
80
- if (!selectedDate?.[1] && !((min && day.date < min) || (max && day.date > max))) {
81
- setHoverDate(new Date(
82
- day.date.getFullYear(),
83
- day.date.getMonth(),
84
- day.date.getDate(),
85
- ));
86
- }
87
- }}
88
- onMouseLeave={() => {
89
- if (hoverDate) setHoverDate(null);
90
- }}
91
- onClick={() => handleDayClick(day.date)}
92
- >
93
- <div className={cn({
94
- [styles['day-tile--content']]: true,
95
- [styles['day-tile--selected']]: !!selectedDate && (isSameDay(day.date, selectedDate[0] || null) || isSameDay(day.date, selectedDate[1] || null) || isSameDay(day.date, hoverDate || null)),
96
- })}
97
- >
98
- {day.date.getDate()}
99
- {tileContent && tileContent()}
100
- </div>
101
- </button>
102
- ))}
103
- </div>
104
- ))}
105
- </div>
106
- </div>
107
- );
108
- }
1
+
2
+ import { cn } from '@jk-core/utils';
3
+ import { CalendarRange } from '@/Calendar/type';
4
+ import isInRange from '@/Calendar/utils/isInRange';
5
+ import isSameDay from '@/Calendar/utils/isSameDay';
6
+ import styles from './DayTile.module.scss';
7
+
8
+ const WEEKS = ['일', '월', '화', '수', '목', '금', '토'];
9
+
10
+ interface Props {
11
+ hoverDate?:Date | null,
12
+ setHoverDate?:(date:Date | null)=>void,
13
+ selectedDate?: CalendarRange;
14
+ weeksInMonth: {
15
+ thisMonth: string;
16
+ date: Date;
17
+ }[][];
18
+ tileContent?: () => React.ReactNode;
19
+ handleDayClick: (day: Date) => void;
20
+ max?: Date;
21
+ min?: Date;
22
+ hideBefore?: boolean;
23
+ hideAfter?: boolean;
24
+ range?: boolean;
25
+ scroll?: boolean;
26
+ style?: React.CSSProperties;
27
+ }
28
+ export default function DayTile({
29
+ selectedDate, weeksInMonth, tileContent, handleDayClick, range = false,
30
+ max, min, hideBefore = false, hideAfter = false, style, scroll,
31
+ hoverDate, setHoverDate = () => { },
32
+ }: Props) {
33
+ const handleDisabled = (date: Date): boolean => {
34
+ const compareDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
35
+ const compareMin = min ? new Date(min.getFullYear(), min.getMonth(), min.getDate()) : null;
36
+ const compareMax = max ? new Date(max.getFullYear(), max.getMonth(), max.getDate()) : null;
37
+
38
+ return !!((compareMin && compareDate < compareMin) || (compareMax && compareDate > compareMax));
39
+ };
40
+
41
+ return (
42
+ <div className={styles['day-tile']} style={style}>
43
+ <div className={styles['day-tile__weeks']}>
44
+ {WEEKS.map((week) => (<div className={styles['day-tile__weeks--date']} key={week}>{week}</div>))}
45
+ </div>
46
+
47
+ <div className={styles['day-tile__tile']}>
48
+ {weeksInMonth.map((week, index) => (
49
+ <div key={index} className={styles['day-tile__week']}>
50
+ {week.map((day, idx) => (
51
+ <button
52
+ className={cn({
53
+ [styles['day-tile__day']]: true,
54
+ [styles['day-tile__day--today']]: isSameDay(day.date, new Date()),
55
+ [styles['day-tile__day--selected-first']]: !!selectedDate && isSameDay(day.date, selectedDate[0] || null) && range
56
+ && ((!!selectedDate[1]
57
+ || ((!scroll && hoverDate != null && !!selectedDate[0])
58
+ && hoverDate > selectedDate[0]))),
59
+ [styles['day-tile__day--selected-last']]: (!!selectedDate && isSameDay(day.date, selectedDate[1] || null) && range)
60
+ || (!scroll && !selectedDate?.[1] && isSameDay(day.date, hoverDate || null)),
61
+ [styles['day-tile__day--before']]: day.thisMonth !== 'this',
62
+ [styles['day-tile__day--hide-before']]: hideBefore && day.thisMonth === 'before',
63
+ [styles['day-tile__day--hide-after']]: hideAfter && day.thisMonth === 'after',
64
+ [styles['day-tile__day--tile']]: !!(tileContent && tileContent()),
65
+ [styles['day-tile__day--range']]: isInRange(day.date, selectedDate) || (!!selectedDate?.[0] && (isInRange(day.date, [selectedDate[0], hoverDate]))),
66
+ })}
67
+ type="button"
68
+ disabled={handleDisabled(day.date)}
69
+ key={idx}
70
+ onMouseOver={() => {
71
+ if (!selectedDate?.[1] && !((min && day.date < min) || (max && day.date > max))) {
72
+ setHoverDate(new Date(
73
+ day.date.getFullYear(),
74
+ day.date.getMonth(),
75
+ day.date.getDate(),
76
+ ));
77
+ }
78
+ }}
79
+ onFocus={() => {
80
+ if (!selectedDate?.[1] && !((min && day.date < min) || (max && day.date > max))) {
81
+ setHoverDate(new Date(
82
+ day.date.getFullYear(),
83
+ day.date.getMonth(),
84
+ day.date.getDate(),
85
+ ));
86
+ }
87
+ }}
88
+ onMouseLeave={() => {
89
+ if (hoverDate) setHoverDate(null);
90
+ }}
91
+ onClick={() => handleDayClick(day.date)}
92
+ >
93
+ <div className={cn({
94
+ [styles['day-tile--content']]: true,
95
+ [styles['day-tile--selected']]: !!selectedDate && (isSameDay(day.date, selectedDate[0] || null) || isSameDay(day.date, selectedDate[1] || null) || isSameDay(day.date, hoverDate || null)),
96
+ })}
97
+ >
98
+ {day.date.getDate()}
99
+ {tileContent && tileContent()}
100
+ </div>
101
+ </button>
102
+ ))}
103
+ </div>
104
+ ))}
105
+ </div>
106
+ </div>
107
+ );
108
+ }