@daryasidorovich/modsen-datepicker 1.0.0 → 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 (128) hide show
  1. package/.prettierrc +6 -6
  2. package/.storybook/main.js +93 -93
  3. package/.storybook/main.ts +16 -0
  4. package/.storybook/preview.js +26 -26
  5. package/.storybook/preview.tsx +18 -18
  6. package/README.md +5 -5
  7. package/commitlint.config.js +23 -23
  8. package/package.json +1 -1
  9. package/rollup.config.js +65 -65
  10. package/src/components/BaseCalendar/BaseCalendar.stories.tsx +77 -77
  11. package/src/components/BaseCalendar/index.tsx +63 -63
  12. package/src/components/BaseCalendar/styles.module.scss +15 -15
  13. package/src/components/Button/Button.stories.tsx +16 -0
  14. package/src/components/Button/Button.tsx +14 -0
  15. package/src/components/Button/index.ts +1 -0
  16. package/src/components/Button/styles.module.scss +3 -0
  17. package/src/components/CalendarGrid/CalendarGrid.stories.tsx +136 -136
  18. package/src/components/CalendarGrid/CalendarGridWithTasks/Tooltip/index.tsx +27 -27
  19. package/src/components/CalendarGrid/CalendarGridWithTasks/Tooltip/styles.module.scss +9 -9
  20. package/src/components/CalendarGrid/CalendarGridWithTasks/index.tsx +51 -51
  21. package/src/components/CalendarGrid/CalendarGridWithoutTasks/index.tsx +36 -36
  22. package/src/components/CalendarGrid/CalendarGridWithoutTasks/styles.module.scss +11 -11
  23. package/src/components/CalendarGrid/index.tsx +19 -19
  24. package/src/components/CalendarGrid/types.ts +26 -26
  25. package/src/components/Clear/Clear.stories.tsx +16 -16
  26. package/src/components/Clear/index.tsx +12 -12
  27. package/src/components/Clear/styles.module.scss +34 -34
  28. package/src/components/DatePicker/DatePicker.stories.tsx +127 -127
  29. package/src/components/DatePicker/index.tsx +72 -72
  30. package/src/components/DatePicker/styles.module.scss +10 -10
  31. package/src/components/Day/Day.stories.tsx +75 -75
  32. package/src/components/Day/index.tsx +95 -95
  33. package/src/components/Day/styles.module.scss +97 -97
  34. package/src/components/Input/Input.stories.tsx +37 -37
  35. package/src/components/Input/index.tsx +64 -64
  36. package/src/components/Input/styles.module.scss +79 -79
  37. package/src/components/Modal/CrudModal/index.tsx +43 -43
  38. package/src/components/Modal/CrudModal/styles.module.scss +44 -44
  39. package/src/components/Modal/index.tsx +66 -66
  40. package/src/components/Modal/styles.module.scss +40 -40
  41. package/src/components/Modal/types.ts +13 -13
  42. package/src/components/Month/Month.stories.tsx +19 -19
  43. package/src/components/Month/index.tsx +31 -31
  44. package/src/components/Month/styles.module.scss +30 -30
  45. package/src/components/RangePicker/RangePicker.stories.tsx +134 -134
  46. package/src/components/RangePicker/index.tsx +144 -144
  47. package/src/components/RangePicker/styles.module.scss +19 -19
  48. package/src/components/TasksManager/AddModal/index.tsx +62 -62
  49. package/src/components/TasksManager/DeleteModal/index.tsx +22 -22
  50. package/src/components/TasksManager/EditModal/index.tsx +96 -96
  51. package/src/components/TasksManager/index.tsx +112 -112
  52. package/src/components/TasksManager/styles.module.scss +62 -62
  53. package/src/components/Week/Week.stories.tsx +49 -49
  54. package/src/components/Week/index.tsx +68 -68
  55. package/src/components/Week/styles.module.scss +7 -7
  56. package/src/components/WeekDay/WeekDay.stories.tsx +38 -38
  57. package/src/components/WeekDay/index.tsx +35 -35
  58. package/src/components/WeekDay/styles.module.scss +19 -19
  59. package/src/constants/dateMask.ts +23 -23
  60. package/src/constants/firstDayOfWeek.ts +7 -7
  61. package/src/constants/holidays.ts +32 -32
  62. package/src/constants/modes.ts +6 -6
  63. package/src/constants/monthsNames.ts +14 -14
  64. package/src/constants/weekdaysNames.ts +1 -1
  65. package/src/hooks/useCalendar.ts +62 -62
  66. package/src/hooks/useLockBodyScroll.ts +19 -19
  67. package/src/hooks/useModal.ts +45 -45
  68. package/src/hooks/useTooltip.ts +41 -41
  69. package/src/hooks/useValidate.ts +80 -80
  70. package/src/index.ts +15 -15
  71. package/src/services/calendarService.ts +62 -62
  72. package/src/services/decorators/withHolidays.ts +12 -12
  73. package/src/services/decorators/withMinMax.test.ts +77 -77
  74. package/src/services/decorators/withMinMax.ts +19 -19
  75. package/src/services/holidayService.ts +56 -56
  76. package/src/store/localStorage.ts +33 -33
  77. package/src/store/tasksStore.tsx +146 -146
  78. package/src/store/types.ts +22 -22
  79. package/src/stories/Button.stories.ts +54 -0
  80. package/src/stories/Button.tsx +37 -0
  81. package/src/stories/Configure.mdx +388 -0
  82. package/src/stories/Header.stories.ts +34 -0
  83. package/src/stories/Header.tsx +56 -0
  84. package/src/stories/Page.stories.ts +33 -0
  85. package/src/stories/Page.tsx +73 -0
  86. package/src/stories/assets/accessibility.png +0 -0
  87. package/src/stories/assets/accessibility.svg +1 -0
  88. package/src/stories/assets/addon-library.png +0 -0
  89. package/src/stories/assets/assets.png +0 -0
  90. package/src/stories/assets/avif-test-image.avif +0 -0
  91. package/src/stories/assets/context.png +0 -0
  92. package/src/stories/assets/discord.svg +1 -0
  93. package/src/stories/assets/docs.png +0 -0
  94. package/src/stories/assets/figma-plugin.png +0 -0
  95. package/src/stories/assets/github.svg +1 -0
  96. package/src/stories/assets/share.png +0 -0
  97. package/src/stories/assets/styling.png +0 -0
  98. package/src/stories/assets/testing.png +0 -0
  99. package/src/stories/assets/theming.png +0 -0
  100. package/src/stories/assets/tutorials.svg +1 -0
  101. package/src/stories/assets/youtube.svg +1 -0
  102. package/src/stories/button.css +30 -0
  103. package/src/stories/header.css +32 -0
  104. package/src/stories/page.css +68 -0
  105. package/src/styles/_border.scss +9 -9
  106. package/src/styles/_colors.scss +53 -53
  107. package/src/styles/_gap.scss +4 -4
  108. package/src/styles/_globals.scss +61 -61
  109. package/src/styles/_grid.scss +9 -9
  110. package/src/styles/_mixins.scss +6 -6
  111. package/src/styles/_reset.scss +98 -98
  112. package/src/styles/_theme-mixins.scss +51 -51
  113. package/src/styles/_typography.scss +10 -10
  114. package/src/styles/_variables.scss +8 -8
  115. package/src/styles/main.scss +3 -3
  116. package/src/types/types.d.ts +15 -15
  117. package/src/utils/calendar.test.ts +154 -154
  118. package/src/utils/calendar.ts +82 -82
  119. package/src/utils/controlDate.ts +3 -3
  120. package/src/utils/dateChecks.test.ts +216 -216
  121. package/src/utils/dateChecks.ts +75 -75
  122. package/src/utils/formatDate.ts +27 -27
  123. package/src/utils/schema.test.ts +40 -40
  124. package/src/utils/schema.ts +8 -8
  125. package/src/utils/weekdayOrder.test.ts +11 -11
  126. package/src/utils/weekdayOrder.ts +7 -7
  127. package/vitest.config.ts +38 -38
  128. package/vitest.shims.d.ts +1 -1
@@ -1,79 +1,79 @@
1
- .wrapper {
2
- @include themify-modules($themes) {
3
- color: themed('text');
4
- background-color: themed('background');
5
- }
6
-
7
- display: flex;
8
- flex-direction: column;
9
- align-items: start;
10
- gap: 2px;
11
- width: 100%;
12
- }
13
-
14
- .label {
15
- font-size: $font-size-15;
16
- font-weight: $font-weight-semibold;
17
- margin-bottom: $gap-8;
18
- }
19
-
20
- .inputWrapper {
21
- @include themify-modules($themes) {
22
- color: themed('text');
23
- background-color: themed('background');
24
- border-color: themed('border');
25
- }
26
-
27
- @include border;
28
-
29
- padding: $gap-8 15px;
30
- border-radius: $radius-8;
31
- display: flex;
32
- gap: $gap-8;
33
- justify-content: space-between;
34
- align-items: center;
35
- width: 100%;
36
- }
37
-
38
- .errorWrapper {
39
- @include themify-modules($themes) {
40
- border-color: themed('accent');
41
- }
42
- }
43
-
44
- .input {
45
- border: none;
46
- outline: none;
47
- background-color: transparent;
48
- width: 100%;
49
-
50
- @include themify-modules($themes) {
51
- color: themed('text');
52
- }
53
-
54
- &::placeholder {
55
- @include themify-modules($themes) {
56
- color: themed('border');
57
- }
58
- }
59
- }
60
-
61
- .clear {
62
- border: none;
63
- background-color: transparent;
64
- width: max-content;
65
- padding: 0;
66
- }
67
-
68
- .icon {
69
- @include themify-modules($themes) {
70
- color: themed('disabled');
71
- }
72
- }
73
-
74
- .error {
75
- @include themify-modules($themes) {
76
- color: themed('accent');
77
- }
78
- height: 15px;
79
- }
1
+ .wrapper {
2
+ @include themify-modules($themes) {
3
+ color: themed('text');
4
+ background-color: themed('background');
5
+ }
6
+
7
+ display: flex;
8
+ flex-direction: column;
9
+ align-items: start;
10
+ gap: 2px;
11
+ width: 100%;
12
+ }
13
+
14
+ .label {
15
+ font-size: $font-size-15;
16
+ font-weight: $font-weight-semibold;
17
+ margin-bottom: $gap-8;
18
+ }
19
+
20
+ .inputWrapper {
21
+ @include themify-modules($themes) {
22
+ color: themed('text');
23
+ background-color: themed('background');
24
+ border-color: themed('border');
25
+ }
26
+
27
+ @include border;
28
+
29
+ padding: $gap-8 15px;
30
+ border-radius: $radius-8;
31
+ display: flex;
32
+ gap: $gap-8;
33
+ justify-content: space-between;
34
+ align-items: center;
35
+ width: 100%;
36
+ }
37
+
38
+ .errorWrapper {
39
+ @include themify-modules($themes) {
40
+ border-color: themed('accent');
41
+ }
42
+ }
43
+
44
+ .input {
45
+ border: none;
46
+ outline: none;
47
+ background-color: transparent;
48
+ width: 100%;
49
+
50
+ @include themify-modules($themes) {
51
+ color: themed('text');
52
+ }
53
+
54
+ &::placeholder {
55
+ @include themify-modules($themes) {
56
+ color: themed('border');
57
+ }
58
+ }
59
+ }
60
+
61
+ .clear {
62
+ border: none;
63
+ background-color: transparent;
64
+ width: max-content;
65
+ padding: 0;
66
+ }
67
+
68
+ .icon {
69
+ @include themify-modules($themes) {
70
+ color: themed('disabled');
71
+ }
72
+ }
73
+
74
+ .error {
75
+ @include themify-modules($themes) {
76
+ color: themed('accent');
77
+ }
78
+ height: 15px;
79
+ }
@@ -1,43 +1,43 @@
1
- import classNames from 'classnames';
2
-
3
- import { Modal } from '..';
4
- import { CrudModalProps } from '../types';
5
- import styles from './styles.module.scss';
6
-
7
- export const CrudModal = ({
8
- isOpen,
9
- onClose,
10
- onConfirm,
11
- title,
12
- cancelText = 'No',
13
- confirmText = 'Yes',
14
- isLoading = false,
15
- children,
16
- showCloseButton = false,
17
- }: CrudModalProps) => {
18
- return (
19
- <Modal isOpen={isOpen} onClose={onClose} showCloseButton={showCloseButton}>
20
- <div className={styles.header}>
21
- <h1 className={styles.title}>{title}</h1>
22
- </div>
23
-
24
- {children && <div className={styles.children}>{children}</div>}
25
-
26
- <div className={styles.footer}>
27
- <button
28
- className={styles.modalButtons}
29
- onClick={onClose}
30
- disabled={isLoading}
31
- >
32
- {cancelText}
33
- </button>
34
- <button
35
- className={classNames(styles.confirm, styles.modalButtons)}
36
- onClick={onConfirm}
37
- >
38
- {confirmText}
39
- </button>
40
- </div>
41
- </Modal>
42
- );
43
- };
1
+ import classNames from 'classnames';
2
+
3
+ import { Modal } from '..';
4
+ import { CrudModalProps } from '../types';
5
+ import styles from './styles.module.scss';
6
+
7
+ export const CrudModal = ({
8
+ isOpen,
9
+ onClose,
10
+ onConfirm,
11
+ title,
12
+ cancelText = 'No',
13
+ confirmText = 'Yes',
14
+ isLoading = false,
15
+ children,
16
+ showCloseButton = false,
17
+ }: CrudModalProps) => {
18
+ return (
19
+ <Modal isOpen={isOpen} onClose={onClose} showCloseButton={showCloseButton}>
20
+ <div className={styles.header}>
21
+ <h1 className={styles.title}>{title}</h1>
22
+ </div>
23
+
24
+ {children && <div className={styles.children}>{children}</div>}
25
+
26
+ <div className={styles.footer}>
27
+ <button
28
+ className={styles.modalButtons}
29
+ onClick={onClose}
30
+ disabled={isLoading}
31
+ >
32
+ {cancelText}
33
+ </button>
34
+ <button
35
+ className={classNames(styles.confirm, styles.modalButtons)}
36
+ onClick={onConfirm}
37
+ >
38
+ {confirmText}
39
+ </button>
40
+ </div>
41
+ </Modal>
42
+ );
43
+ };
@@ -1,44 +1,44 @@
1
- .header {
2
- margin-bottom: $gap-24;
3
- margin-top: $gap-8;
4
- }
5
-
6
- .title {
7
- font-size: $font-size-18;
8
- }
9
-
10
- .footer {
11
- display: flex;
12
- width: 100%;
13
- gap: $gap-10;
14
- justify-content: end;
15
- }
16
-
17
- .children {
18
- display: flex;
19
- gap: $gap-8;
20
- flex-direction: column;
21
- min-width: 300px;
22
- width: fit-content;
23
- margin-bottom: $gap-24;
24
- }
25
-
26
- .modalButtons {
27
- @include themify-modules($themes) {
28
- background-color: themed('light-blue');
29
- border-color: themed('border');
30
- color: themed('text');
31
- }
32
- @include border;
33
-
34
- padding: $gap-5 $gap-10;
35
- border-radius: $radius-8;
36
- }
37
-
38
- .confirm {
39
- @include themify-modules($themes) {
40
- background-color: themed('middle-blue');
41
- border-color: themed('border');
42
- color: themed('white-color');
43
- }
44
- }
1
+ .header {
2
+ margin-bottom: $gap-24;
3
+ margin-top: $gap-8;
4
+ }
5
+
6
+ .title {
7
+ font-size: $font-size-18;
8
+ }
9
+
10
+ .footer {
11
+ display: flex;
12
+ width: 100%;
13
+ gap: $gap-10;
14
+ justify-content: end;
15
+ }
16
+
17
+ .children {
18
+ display: flex;
19
+ gap: $gap-8;
20
+ flex-direction: column;
21
+ min-width: 300px;
22
+ width: fit-content;
23
+ margin-bottom: $gap-24;
24
+ }
25
+
26
+ .modalButtons {
27
+ @include themify-modules($themes) {
28
+ background-color: themed('light-blue');
29
+ border-color: themed('border');
30
+ color: themed('text');
31
+ }
32
+ @include border;
33
+
34
+ padding: $gap-5 $gap-10;
35
+ border-radius: $radius-8;
36
+ }
37
+
38
+ .confirm {
39
+ @include themify-modules($themes) {
40
+ background-color: themed('middle-blue');
41
+ border-color: themed('border');
42
+ color: themed('white-color');
43
+ }
44
+ }
@@ -1,66 +1,66 @@
1
- import classNames from 'classnames';
2
- import React, { ReactNode, useRef } from 'react';
3
- import { createPortal } from 'react-dom';
4
-
5
- import useLockBodyScroll from '@/hooks/useLockBodyScroll';
6
-
7
- import styles from './styles.module.scss';
8
-
9
- export interface ModalProps {
10
- isOpen: boolean;
11
- onClose: () => void;
12
- children: ReactNode;
13
- showCloseButton?: boolean;
14
- showOverlay?: boolean;
15
- className?: string;
16
- classNameOverlay?: string;
17
- style?: React.CSSProperties;
18
- }
19
-
20
- export const Modal = ({
21
- isOpen,
22
- onClose,
23
- children,
24
- showOverlay = true,
25
- showCloseButton = true,
26
- className = '',
27
- classNameOverlay = '',
28
- style = {},
29
- }: ModalProps) => {
30
- const modalRoot = document.body;
31
- const targetElement = modalRoot || document.body;
32
- const modalRef = useRef(null);
33
- useLockBodyScroll(isOpen);
34
-
35
- const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {
36
- if (e.target === e.currentTarget) {
37
- onClose();
38
- }
39
- };
40
-
41
- if (!isOpen) return null;
42
-
43
- const modalContent = (
44
- <div
45
- className={classNames(styles.overlay, classNameOverlay, {
46
- [styles.overlayColor]: showOverlay,
47
- })}
48
- onClick={handleClick}
49
- >
50
- <div
51
- ref={modalRef}
52
- className={classNames(styles.modal, className)}
53
- style={style}
54
- >
55
- {showCloseButton && (
56
- <button className={styles.closeButton} onClick={onClose}>
57
- <span>×</span>
58
- </button>
59
- )}
60
- {children}
61
- </div>
62
- </div>
63
- );
64
-
65
- return createPortal(modalContent, targetElement);
66
- };
1
+ import classNames from 'classnames';
2
+ import React, { ReactNode, useRef } from 'react';
3
+ import { createPortal } from 'react-dom';
4
+
5
+ import useLockBodyScroll from '@/hooks/useLockBodyScroll';
6
+
7
+ import styles from './styles.module.scss';
8
+
9
+ export interface ModalProps {
10
+ isOpen: boolean;
11
+ onClose: () => void;
12
+ children: ReactNode;
13
+ showCloseButton?: boolean;
14
+ showOverlay?: boolean;
15
+ className?: string;
16
+ classNameOverlay?: string;
17
+ style?: React.CSSProperties;
18
+ }
19
+
20
+ export const Modal = ({
21
+ isOpen,
22
+ onClose,
23
+ children,
24
+ showOverlay = true,
25
+ showCloseButton = true,
26
+ className = '',
27
+ classNameOverlay = '',
28
+ style = {},
29
+ }: ModalProps) => {
30
+ const modalRoot = document.body;
31
+ const targetElement = modalRoot || document.body;
32
+ const modalRef = useRef(null);
33
+ useLockBodyScroll(isOpen);
34
+
35
+ const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {
36
+ if (e.target === e.currentTarget) {
37
+ onClose();
38
+ }
39
+ };
40
+
41
+ if (!isOpen) return null;
42
+
43
+ const modalContent = (
44
+ <div
45
+ className={classNames(styles.overlay, classNameOverlay, {
46
+ [styles.overlayColor]: showOverlay,
47
+ })}
48
+ onClick={handleClick}
49
+ >
50
+ <div
51
+ ref={modalRef}
52
+ className={classNames(styles.modal, className)}
53
+ style={style}
54
+ >
55
+ {showCloseButton && (
56
+ <button className={styles.closeButton} onClick={onClose}>
57
+ <span>×</span>
58
+ </button>
59
+ )}
60
+ {children}
61
+ </div>
62
+ </div>
63
+ );
64
+
65
+ return createPortal(modalContent, targetElement);
66
+ };
@@ -1,40 +1,40 @@
1
- .overlay {
2
- position: fixed;
3
- inset: 0;
4
- display: flex;
5
- align-items: center;
6
- justify-content: center;
7
- z-index: $z-index-10;
8
- }
9
-
10
- .overlayColor {
11
- @include themify-modules($themes) {
12
- background-color: themed('overlay');
13
- }
14
- }
15
-
16
- .modal {
17
- position: relative;
18
- @include themify-modules($themes) {
19
- background-color: themed('background');
20
- border-color: themed('border');
21
- }
22
-
23
- @include border;
24
- border-radius: $radius-8;
25
- padding: $gap-24;
26
- }
27
-
28
- .closeButton {
29
- border: none;
30
- background-color: transparent;
31
- position: absolute;
32
- right: $gap-8;
33
- top: 0;
34
- font-size: 24px;
35
- line-height: normal;
36
-
37
- @include themify-modules($themes) {
38
- color: themed('text');
39
- }
40
- }
1
+ .overlay {
2
+ position: fixed;
3
+ inset: 0;
4
+ display: flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ z-index: $z-index-10;
8
+ }
9
+
10
+ .overlayColor {
11
+ @include themify-modules($themes) {
12
+ background-color: themed('overlay');
13
+ }
14
+ }
15
+
16
+ .modal {
17
+ position: relative;
18
+ @include themify-modules($themes) {
19
+ background-color: themed('background');
20
+ border-color: themed('border');
21
+ }
22
+
23
+ @include border;
24
+ border-radius: $radius-8;
25
+ padding: $gap-24;
26
+ }
27
+
28
+ .closeButton {
29
+ border: none;
30
+ background-color: transparent;
31
+ position: absolute;
32
+ right: $gap-8;
33
+ top: 0;
34
+ font-size: 24px;
35
+ line-height: normal;
36
+
37
+ @include themify-modules($themes) {
38
+ color: themed('text');
39
+ }
40
+ }
@@ -1,13 +1,13 @@
1
- import { ReactNode } from 'react';
2
-
3
- export interface CrudModalProps {
4
- isOpen: boolean;
5
- onClose: () => void;
6
- onConfirm: () => void;
7
- title: string;
8
- children?: ReactNode;
9
- cancelText?: string;
10
- confirmText?: string;
11
- isLoading?: boolean;
12
- showCloseButton?: boolean;
13
- }
1
+ import { ReactNode } from 'react';
2
+
3
+ export interface CrudModalProps {
4
+ isOpen: boolean;
5
+ onClose: () => void;
6
+ onConfirm: () => void;
7
+ title: string;
8
+ children?: ReactNode;
9
+ cancelText?: string;
10
+ confirmText?: string;
11
+ isLoading?: boolean;
12
+ showCloseButton?: boolean;
13
+ }
@@ -1,19 +1,19 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import { Month } from '.';
3
-
4
- const meta: Meta<typeof Month> = {
5
- component: Month,
6
- parameters: {
7
- layout: 'centered',
8
- },
9
- };
10
-
11
- export default meta;
12
-
13
- type Story = StoryObj<typeof Month>;
14
-
15
- export const Default: Story = {
16
- args: {
17
- date: new Date(),
18
- },
19
- };
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Month } from '.';
3
+
4
+ const meta: Meta<typeof Month> = {
5
+ component: Month,
6
+ parameters: {
7
+ layout: 'centered',
8
+ },
9
+ };
10
+
11
+ export default meta;
12
+
13
+ type Story = StoryObj<typeof Month>;
14
+
15
+ export const Default: Story = {
16
+ args: {
17
+ date: new Date(),
18
+ },
19
+ };
@@ -1,31 +1,31 @@
1
- import Next from '@assets/arrows/Next.svg?react';
2
- import Prev from '@assets/arrows/Prev.svg?react';
3
-
4
- import { MONTHS_NAMES } from '@/constants/monthsNames';
5
-
6
- import styles from './styles.module.scss';
7
-
8
- interface MonthProps {
9
- date: Date;
10
- onPrev: () => void;
11
- onNext: () => void;
12
- }
13
-
14
- export const Month = ({ date, onPrev, onNext }: MonthProps) => {
15
- const year = date.getFullYear();
16
- const month = MONTHS_NAMES[date.getMonth()];
17
-
18
- return (
19
- <div className={styles.month}>
20
- <button className={styles.arrow} onClick={onPrev} type="button">
21
- <Prev />
22
- </button>
23
- <p>
24
- {month} {year}
25
- </p>
26
- <button className={styles.arrow} onClick={onNext} type="button">
27
- <Next />
28
- </button>
29
- </div>
30
- );
31
- };
1
+ import Next from '@assets/arrows/Next.svg?react';
2
+ import Prev from '@assets/arrows/Prev.svg?react';
3
+
4
+ import { MONTHS_NAMES } from '@/constants/monthsNames';
5
+
6
+ import styles from './styles.module.scss';
7
+
8
+ interface MonthProps {
9
+ date: Date;
10
+ onPrev: () => void;
11
+ onNext: () => void;
12
+ }
13
+
14
+ export const Month = ({ date, onPrev, onNext }: MonthProps) => {
15
+ const year = date.getFullYear();
16
+ const month = MONTHS_NAMES[date.getMonth()];
17
+
18
+ return (
19
+ <div className={styles.month}>
20
+ <button className={styles.arrow} onClick={onPrev} type="button">
21
+ <Prev />
22
+ </button>
23
+ <p>
24
+ {month} {year}
25
+ </p>
26
+ <button className={styles.arrow} onClick={onNext} type="button">
27
+ <Next />
28
+ </button>
29
+ </div>
30
+ );
31
+ };