@companix/uikit 0.0.1 → 0.0.3

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 (254) hide show
  1. package/dist/bundle.es.js +61 -0
  2. package/dist/bundle.es10.js +87 -0
  3. package/dist/bundle.es11.js +75 -0
  4. package/dist/bundle.es12.js +38 -0
  5. package/dist/bundle.es13.js +33 -0
  6. package/dist/bundle.es14.js +18 -0
  7. package/dist/bundle.es15.js +11 -0
  8. package/dist/bundle.es16.js +35 -0
  9. package/dist/bundle.es17.js +27 -0
  10. package/dist/bundle.es18.js +23 -0
  11. package/dist/bundle.es19.js +24 -0
  12. package/dist/bundle.es20.js +15 -0
  13. package/dist/bundle.es21.js +41 -0
  14. package/dist/bundle.es22.js +18 -0
  15. package/dist/bundle.es23.js +36 -0
  16. package/dist/bundle.es24.js +23 -0
  17. package/dist/bundle.es25.js +42 -0
  18. package/dist/bundle.es26.js +114 -0
  19. package/dist/bundle.es27.js +115 -0
  20. package/dist/bundle.es28.js +38 -0
  21. package/dist/bundle.es29.js +13 -0
  22. package/dist/bundle.es3.js +45 -0
  23. package/dist/bundle.es30.js +27 -0
  24. package/dist/bundle.es31.js +38 -0
  25. package/dist/bundle.es35.js +43 -0
  26. package/dist/bundle.es36.js +442 -0
  27. package/dist/bundle.es37.js +24 -0
  28. package/dist/bundle.es38.js +26 -0
  29. package/dist/bundle.es39.js +83 -0
  30. package/dist/bundle.es4.js +14 -0
  31. package/dist/bundle.es40.js +20 -0
  32. package/dist/bundle.es41.js +16 -0
  33. package/dist/bundle.es43.js +7 -0
  34. package/dist/bundle.es44.js +23 -0
  35. package/dist/bundle.es45.js +16 -0
  36. package/dist/bundle.es46.js +72 -0
  37. package/dist/bundle.es47.js +70 -0
  38. package/dist/bundle.es48.js +34 -0
  39. package/dist/bundle.es49.js +70 -0
  40. package/dist/bundle.es5.js +88 -0
  41. package/dist/bundle.es50.js +33 -0
  42. package/dist/bundle.es51.js +78 -0
  43. package/dist/bundle.es52.js +51 -0
  44. package/dist/bundle.es53.js +45 -0
  45. package/dist/bundle.es54.js +40 -0
  46. package/dist/bundle.es55.js +36 -0
  47. package/dist/bundle.es56.js +9 -0
  48. package/dist/bundle.es57.js +9 -0
  49. package/dist/bundle.es58.js +7 -0
  50. package/dist/bundle.es59.js +9 -0
  51. package/dist/bundle.es6.js +87 -0
  52. package/dist/bundle.es60.js +8 -0
  53. package/dist/bundle.es61.js +19 -0
  54. package/dist/bundle.es62.js +15 -0
  55. package/dist/bundle.es63.js +22 -0
  56. package/dist/bundle.es64.js +45 -0
  57. package/dist/bundle.es65.js +28 -0
  58. package/dist/bundle.es66.js +34 -0
  59. package/dist/bundle.es67.js +6 -0
  60. package/dist/bundle.es68.js +12 -0
  61. package/dist/bundle.es69.js +47 -0
  62. package/dist/bundle.es7.js +80 -0
  63. package/dist/bundle.es70.js +11 -0
  64. package/dist/bundle.es71.js +18 -0
  65. package/dist/bundle.es72.js +32 -0
  66. package/dist/bundle.es73.js +35 -0
  67. package/dist/bundle.es74.js +6 -0
  68. package/dist/bundle.es75.js +7 -0
  69. package/dist/bundle.es76.js +7 -0
  70. package/dist/bundle.es77.js +11 -0
  71. package/dist/bundle.es78.js +17 -0
  72. package/dist/bundle.es79.js +7 -0
  73. package/dist/bundle.es8.js +29 -0
  74. package/dist/bundle.es80.js +17 -0
  75. package/dist/bundle.es81.js +25 -0
  76. package/dist/bundle.es9.js +47 -0
  77. package/dist/types/Button/index.d.ts +20 -0
  78. package/dist/types/ButtonGroup/index.d.ts +7 -0
  79. package/dist/types/Checkbox/index.d.ts +10 -0
  80. package/dist/types/Countdown/index.d.ts +7 -0
  81. package/dist/types/DateInput/index.d.ts +13 -0
  82. package/dist/types/DatePicker/Calendar.d.ts +14 -0
  83. package/dist/types/DatePicker/CalendarHeader.d.ts +10 -0
  84. package/dist/types/DatePicker/index.d.ts +12 -0
  85. package/dist/types/Dialog/index.d.ts +12 -0
  86. package/dist/types/DialogAlert/Alert.d.ts +19 -0
  87. package/dist/types/DialogAlert/Viewport.d.ts +8 -0
  88. package/dist/types/DialogAlert/index.d.ts +11 -0
  89. package/dist/types/Drawer/index.d.ts +13 -0
  90. package/dist/types/File/index.d.ts +10 -0
  91. package/dist/types/Form/index.d.ts +17 -0
  92. package/dist/types/Icon/index.d.ts +7 -0
  93. package/dist/types/LoadButton/index.d.ts +5 -0
  94. package/dist/types/NumberInput/index.d.ts +6 -0
  95. package/dist/types/OptionItem/OptionItem.d.ts +7 -0
  96. package/dist/types/OptionItem/OptionsList.d.ts +8 -0
  97. package/dist/types/Popover/index.d.ts +26 -0
  98. package/dist/types/Radio/index.d.ts +20 -0
  99. package/dist/types/Scrollable/ImitateScroll.d.ts +10 -0
  100. package/dist/types/Scrollable/index.d.ts +33 -0
  101. package/dist/types/Select/SelectInput.d.ts +14 -0
  102. package/dist/types/Select/index.d.ts +15 -0
  103. package/dist/types/SelectTags/index.d.ts +15 -0
  104. package/dist/types/Spinner/index.d.ts +8 -0
  105. package/dist/types/Stepper/index.d.ts +8 -0
  106. package/dist/types/Switch/index.d.ts +10 -0
  107. package/dist/types/Tabs/index.d.ts +13 -0
  108. package/dist/types/TextArea/index.d.ts +7 -0
  109. package/dist/types/Toaster/RemoveListener.d.ts +3 -0
  110. package/dist/types/Toaster/Toast.d.ts +9 -0
  111. package/dist/types/Toaster/Viewport.d.ts +13 -0
  112. package/dist/types/Toaster/index.d.ts +15 -0
  113. package/dist/types/Tooltip/index.d.ts +8 -0
  114. package/dist/types/__hooks/use-frooze-closing.d.ts +5 -0
  115. package/dist/types/__hooks/use-loading.d.ts +8 -0
  116. package/dist/types/__hooks/use-local-storage.d.ts +1 -0
  117. package/dist/types/__hooks/use-popover-position.d.ts +8 -0
  118. package/dist/types/__hooks/use-previos.d.ts +2 -0
  119. package/dist/types/__hooks/use-resize.d.ts +3 -0
  120. package/dist/types/__hooks/use-scrollbox.d.ts +7 -0
  121. package/dist/types/__hooks/use-stepper-input.d.ts +13 -0
  122. package/dist/types/__hooks/use-update.d.ts +1 -0
  123. package/dist/types/__hooks/useCalendar.d.ts +17 -0
  124. package/dist/types/__hooks/useCalendarOptions-copy.d.ts +22 -0
  125. package/dist/types/__hooks/useCalendarOptions.d.ts +31 -0
  126. package/dist/types/__libs/calendar.d.ts +25 -0
  127. package/dist/types/__utils/utils.d.ts +25 -0
  128. package/dist/types/index.d.ts +31 -0
  129. package/dist/types/types.d.ts +13 -0
  130. package/dist/uikit.css +1 -0
  131. package/package.json +10 -6
  132. package/.eslintrc +0 -54
  133. package/declaration.d.ts +0 -4
  134. package/index.html +0 -12
  135. package/playground/App.tsx +0 -166
  136. package/playground/Example.tsx +0 -14
  137. package/playground/Test.tsx +0 -44
  138. package/playground/animation-test-1/index.scss +0 -20
  139. package/playground/animation-test-1/index.tsx +0 -17
  140. package/playground/animation-test-2/index.scss +0 -62
  141. package/playground/animation-test-2/index.tsx +0 -32
  142. package/playground/bootstrap.tsx +0 -19
  143. package/playground/buttons/index.tsx +0 -132
  144. package/playground/checkbox/index.tsx +0 -64
  145. package/playground/date-input/index.tsx +0 -45
  146. package/playground/date-picker/index.tsx +0 -41
  147. package/playground/dialog/index.tsx +0 -92
  148. package/playground/dialog-alert/index.tsx +0 -47
  149. package/playground/drawer/index.tsx +0 -55
  150. package/playground/index.css +0 -33
  151. package/playground/index.scss +0 -270
  152. package/playground/input/index.tsx +0 -112
  153. package/playground/number-inputs/index.tsx +0 -50
  154. package/playground/popovers/index.tsx +0 -70
  155. package/playground/radio-group/index.tsx +0 -69
  156. package/playground/select/index.tsx +0 -72
  157. package/playground/select-tags/index.tsx +0 -36
  158. package/playground/styles.scss +0 -2
  159. package/playground/switch/index.tsx +0 -44
  160. package/playground/tabs/index.tsx +0 -16
  161. package/playground/test.scss +0 -0
  162. package/playground/text-area/index.tsx +0 -17
  163. package/playground/text-input/index.tsx +0 -12
  164. package/playground/toaster/index.tsx +0 -156
  165. package/playground/tooltip/index.tsx +0 -26
  166. package/src/Button/Button.scss +0 -128
  167. package/src/Button/index.tsx +0 -72
  168. package/src/ButtonGroup/ButtonGroup.scss +0 -18
  169. package/src/ButtonGroup/index.tsx +0 -20
  170. package/src/Checkbox/Checkbox.scss +0 -115
  171. package/src/Checkbox/index.tsx +0 -46
  172. package/src/Countdown/index.tsx +0 -54
  173. package/src/DateInput/DateInput.scss +0 -11
  174. package/src/DateInput/index.tsx +0 -96
  175. package/src/DatePicker/Calendar.scss +0 -125
  176. package/src/DatePicker/Calendar.tsx +0 -157
  177. package/src/DatePicker/CalendarHeader.tsx +0 -139
  178. package/src/DatePicker/DatePicker.scss +0 -0
  179. package/src/DatePicker/index.tsx +0 -177
  180. package/src/Dialog/Dialog.scss +0 -25
  181. package/src/Dialog/Popup.scss +0 -55
  182. package/src/Dialog/index.tsx +0 -31
  183. package/src/DialogAlert/Alert.scss +0 -52
  184. package/src/DialogAlert/Alert.tsx +0 -78
  185. package/src/DialogAlert/Viewport.tsx +0 -52
  186. package/src/DialogAlert/index.tsx +0 -37
  187. package/src/Drawer/Drawer.scss +0 -112
  188. package/src/Drawer/index.tsx +0 -46
  189. package/src/File/index.tsx +0 -60
  190. package/src/Form/Form.scss +0 -70
  191. package/src/Form/Input.scss +0 -24
  192. package/src/Form/index.tsx +0 -131
  193. package/src/Icon/icon.scss +0 -18
  194. package/src/Icon/index.tsx +0 -43
  195. package/src/LoadButton/index.tsx +0 -17
  196. package/src/NumberInput/index.tsx +0 -74
  197. package/src/OptionItem/Option.scss +0 -89
  198. package/src/OptionItem/OptionItem.tsx +0 -49
  199. package/src/OptionItem/OptionsList.tsx +0 -26
  200. package/src/Popover/Popover.scss +0 -80
  201. package/src/Popover/index.tsx +0 -117
  202. package/src/Radio/Radio.scss +0 -148
  203. package/src/Radio/index.tsx +0 -68
  204. package/src/Scrollable/ImitateScroll.tsx +0 -141
  205. package/src/Scrollable/Scrollable.scss +0 -50
  206. package/src/Scrollable/index.tsx +0 -141
  207. package/src/Select/Select.scss +0 -80
  208. package/src/Select/SelectInput.tsx +0 -131
  209. package/src/Select/index.tsx +0 -134
  210. package/src/SelectTags/SelectTags.scss +0 -66
  211. package/src/SelectTags/index.tsx +0 -192
  212. package/src/Spinner/Spinner.scss +0 -14
  213. package/src/Spinner/index.tsx +0 -19
  214. package/src/Stepper/StepperInput.scss +0 -35
  215. package/src/Stepper/index.tsx +0 -76
  216. package/src/Switch/Switch.scss +0 -102
  217. package/src/Switch/index.tsx +0 -49
  218. package/src/Tabs/Tabs.scss +0 -58
  219. package/src/Tabs/index.tsx +0 -89
  220. package/src/TextArea/TextArea.scss +0 -34
  221. package/src/TextArea/index.tsx +0 -51
  222. package/src/Toaster/RemoveListener.tsx +0 -11
  223. package/src/Toaster/Toast.tsx +0 -69
  224. package/src/Toaster/Toaster.scss +0 -151
  225. package/src/Toaster/Viewport.tsx +0 -117
  226. package/src/Toaster/index.tsx +0 -52
  227. package/src/Tooltip/Tooltip.scss +0 -28
  228. package/src/Tooltip/index.tsx +0 -33
  229. package/src/__hooks/use-frooze-closing.ts +0 -51
  230. package/src/__hooks/use-loading.ts +0 -34
  231. package/src/__hooks/use-local-storage.ts +0 -19
  232. package/src/__hooks/use-popover-position.ts +0 -24
  233. package/src/__hooks/use-previos.ts +0 -25
  234. package/src/__hooks/use-resize.ts +0 -41
  235. package/src/__hooks/use-scrollbox.ts +0 -45
  236. package/src/__hooks/use-stepper-input.ts +0 -82
  237. package/src/__hooks/use-update.ts +0 -19
  238. package/src/__hooks/useCalendar.ts +0 -104
  239. package/src/__hooks/useCalendarOptions-copy.ts +0 -87
  240. package/src/__hooks/useCalendarOptions.ts +0 -68
  241. package/src/__libs/calendar.ts +0 -175
  242. package/src/__utils/utils.ts +0 -137
  243. package/src/css.scss +0 -120
  244. package/src/index.scss +0 -22
  245. package/src/index.ts +0 -36
  246. package/src/mixins.scss +0 -99
  247. package/src/theme.scss +0 -103
  248. package/src/types.ts +0 -14
  249. package/tailwind.config.js +0 -91
  250. package/themes/classic/animations.scss +0 -179
  251. package/themes/classic/classic.scss +0 -493
  252. package/tsconfig.json +0 -27
  253. package/vite.build.ts +0 -35
  254. package/vite.config.ts +0 -33
@@ -1,54 +0,0 @@
1
- import { getNextCandleTime, getTimes, sleep } from '@companix/utils-js'
2
- import { useState, useEffect, useRef } from 'react'
3
-
4
- const formatTime = (num: number) => String(num).padStart(2, '0')
5
-
6
- interface CountDownProps {
7
- expiration: number
8
- separator?: string
9
- onExpired?: VoidFunction
10
- }
11
-
12
- export const Countdown = ({ expiration, separator = ':', onExpired }: CountDownProps) => {
13
- const ref = useRef<null | NodeJS.Timeout>(null)
14
- const [, rerender] = useState([])
15
-
16
- useEffect(() => {
17
- const currentTime = Date.now()
18
- const closestNextSecondTimestamp = getNextCandleTime(currentTime, '1s')
19
- const waitToNextSecond = closestNextSecondTimestamp - currentTime
20
-
21
- if (ref.current) {
22
- clearInterval(ref.current)
23
- }
24
-
25
- sleep(waitToNextSecond).then(() => {
26
- rerender([])
27
-
28
- ref.current = setInterval(() => {
29
- rerender([])
30
- }, 1000)
31
- })
32
-
33
- return () => {
34
- if (ref.current) {
35
- clearInterval(ref.current)
36
- }
37
- }
38
- }, [expiration])
39
-
40
- const time = expiration - Date.now()
41
- const { hours, minutes, seconds } = getTimes(time)
42
-
43
- useEffect(() => {
44
- if (time <= 0) {
45
- onExpired?.()
46
-
47
- if (ref.current) {
48
- clearInterval(ref.current)
49
- }
50
- }
51
- }, [time <= 0])
52
-
53
- return <>{[formatTime(hours), formatTime(minutes), formatTime(seconds)].join(separator)}</>
54
- }
@@ -1,11 +0,0 @@
1
- .data-input {
2
- display: flex;
3
- gap: 8px;
4
- width: 100%;
5
-
6
- .form {
7
- input {
8
- width: 100%;
9
- }
10
- }
11
- }
@@ -1,96 +0,0 @@
1
- import { useMemo, useEffect } from 'react'
2
- import { DateFormat, Select } from '..'
3
- import { createDateValidation, getMonthMaxDay } from '../__utils/utils'
4
- import { defaultMax, defaultMin, useCalendarOptions } from '../__hooks/useCalendarOptions'
5
-
6
- export interface DatePickerProps {
7
- min?: DateFormat
8
- max?: DateFormat
9
- noDaySelect?: boolean
10
- noYearSelect?: boolean
11
- disabled?: boolean
12
- required?: boolean
13
- size?: 'sm' | 'md' | 'lg'
14
- value: DateFormat
15
- onChange: (e: DateFormat) => void
16
- }
17
-
18
- export const DateInput = ({
19
- min = defaultMin,
20
- max = defaultMax,
21
- disabled,
22
- value,
23
- noDaySelect,
24
- noYearSelect,
25
- onChange,
26
- required,
27
- size
28
- }: DatePickerProps) => {
29
- const validateDate = useMemo(() => {
30
- return createDateValidation({ min, max })
31
- }, [min, max])
32
-
33
- useEffect(() => {
34
- const changed = validateDate(value)
35
-
36
- if (changed) {
37
- onChange(changed)
38
- }
39
- }, [validateDate, value])
40
-
41
- const { years, months, days } = useCalendarOptions({ min, max, now: value })
42
-
43
- const handleDateChange = (source: 'year' | 'month' | 'day', val: number) => {
44
- const nextValue = { ...value }
45
-
46
- nextValue[source] = val
47
-
48
- const max = getMonthMaxDay(nextValue.month, nextValue.year)
49
- nextValue.day = nextValue.day > max ? max : nextValue.day
50
-
51
- onChange(nextValue)
52
- }
53
-
54
- return (
55
- <div className="data-input">
56
- {!noYearSelect && years.length > 0 && (
57
- <Select
58
- placeholder="Год"
59
- options={years}
60
- onChange={(e) => handleDateChange('year', e || 0)}
61
- value={value.year}
62
- required={required}
63
- disabled={disabled}
64
- size={size}
65
- minimalOptions
66
- matchTarget="min-width"
67
- />
68
- )}
69
- <Select
70
- placeholder="Месяц"
71
- className="w-full"
72
- options={months}
73
- onChange={(e) => handleDateChange('month', e || 0)}
74
- value={value.month}
75
- disabled={disabled}
76
- required={required}
77
- size={size}
78
- minimalOptions
79
- matchTarget="min-width"
80
- />
81
- {!noDaySelect && (
82
- <Select
83
- placeholder="День"
84
- options={days}
85
- disabled={disabled || days.length === 0}
86
- onChange={(e) => handleDateChange('day', e || 0)}
87
- value={value.day}
88
- required={required}
89
- size={size}
90
- minimalOptions
91
- matchTarget="min-width"
92
- />
93
- )}
94
- </div>
95
- )
96
- }
@@ -1,125 +0,0 @@
1
- @use '../mixins.scss';
2
-
3
- .calendar {
4
- @include mixins.use-styles(calendar);
5
-
6
- &-header {
7
- position: relative;
8
- display: flex;
9
- align-items: center;
10
- justify-content: center;
11
-
12
- @include mixins.use-styles(calendar, header);
13
- }
14
-
15
- &-navigation {
16
- display: flex;
17
- align-items: center;
18
- justify-content: center;
19
- position: absolute;
20
- outline: none;
21
- cursor: pointer;
22
-
23
- @include mixins.use-styles(calendar, navigation);
24
- @include mixins.use-size(calendar, navigation, size);
25
-
26
- &[data-side='left'] {
27
- left: 0;
28
- }
29
-
30
- &[data-side='right'] {
31
- right: 0;
32
- }
33
-
34
- &:hover {
35
- @include mixins.use-styles(calendar, navigation, hover);
36
- }
37
-
38
- &:active {
39
- @include mixins.use-styles(calendar, navigation, active);
40
- }
41
-
42
- svg {
43
- @include mixins.use-size(calendar, navigation, icon, size);
44
- }
45
- }
46
-
47
- &-pickers {
48
- display: flex;
49
- align-items: center;
50
- gap: 4px;
51
- }
52
-
53
- &-names {
54
- display: flex;
55
- }
56
-
57
- &-name {
58
- display: flex;
59
- align-items: center;
60
- justify-content: center;
61
-
62
- @include mixins.use-styles(calendar, name);
63
- }
64
-
65
- &-days {
66
- display: grid;
67
- grid-template-columns: repeat(7, 1fr);
68
- }
69
-
70
- &-day {
71
- display: flex;
72
- align-items: center;
73
- justify-content: center;
74
- position: relative;
75
-
76
- @include mixins.use-styles(calendar, day);
77
-
78
- &:not([data-disabled]) {
79
- cursor: pointer;
80
-
81
- &:hover {
82
- @include mixins.use-styles(calendar, day, hover);
83
- }
84
-
85
- &[data-active] {
86
- @include mixins.use-styles(calendar, day, active);
87
- }
88
-
89
- &[data-selected] {
90
- @include mixins.use-styles(calendar, day, selected);
91
-
92
- .calendar-day-number::after {
93
- background-color: #ffffff;
94
- }
95
- }
96
-
97
- &[data-void] {
98
- background-color: unset;
99
- cursor: default;
100
- }
101
- }
102
-
103
- &[data-disabled] {
104
- @include mixins.use-styles(calendar, day, disabled);
105
- }
106
-
107
- &[data-today] {
108
- .calendar-day-number {
109
- position: relative;
110
-
111
- &::after {
112
- position: absolute;
113
- height: 2px;
114
- border-radius: 10px;
115
- content: '';
116
- display: block;
117
- width: 100%;
118
- bottom: 0px;
119
- right: 0;
120
- background-color: #529ef4;
121
- }
122
- }
123
- }
124
- }
125
- }
@@ -1,157 +0,0 @@
1
- import {
2
- createVoids,
3
- dateToFormat,
4
- getDayIndex,
5
- getFirstDay,
6
- getMonthMaxDay,
7
- weeks
8
- } from '../__utils/utils'
9
- import { CalendarHeader } from './CalendarHeader'
10
- import { useCalendar } from '../__hooks/useCalendar'
11
- import { attr } from '@companix/utils-browser'
12
- import { isSameDate } from '../__libs/calendar'
13
- import { useLayoutEffect } from 'react'
14
-
15
- export interface CalendarProps {
16
- /**
17
- * Текущая выбранная дата.
18
- */
19
- value?: Date | null
20
- /**
21
- * Запрещает выбор даты в прошлом.
22
- * Применяется, если не заданы `shouldDisableDate` и `disableFuture`.
23
- */
24
- disablePast?: boolean
25
- /**
26
- * Запрещает выбор даты в будущем.
27
- * Применяется, если не задано `shouldDisableDate`.
28
- */
29
- disableFuture?: boolean
30
- /**
31
- * Включает выбор времени.
32
- */
33
- enableTime?: boolean
34
- /**
35
- * Отключает селекторы выбора месяца/года.
36
- */
37
- disablePickers?: boolean
38
- /**
39
- * Показывать дни соседних месяцев.
40
- */
41
- showNeighboringMonth?: boolean
42
- /**
43
- * Обработчик изменения выбранной даты.
44
- */
45
- onChange?: (value: Date) => void
46
- /**
47
- * Функция для проверки запрета выбора даты.
48
- */
49
- shouldDisableDate?: (value: Date) => boolean
50
- /**
51
- * Дата отображаемого месяца.
52
- * При использовании обновление даты должно происходить вне компонента.
53
- */
54
- viewDate?: Date
55
- /**
56
- * Минимальные дата и время, которые можно выбрать.
57
- * Применяется, если не заданы `shouldDisableDate` и `disablePast`/`disableFuture`.
58
- */
59
- minDateTime?: Date
60
- /**
61
- * Максимальные дата и время, которые можно выбрать.
62
- * Применяется, если не заданы `shouldDisableDate` и `disablePast`/`disableFuture`.
63
- */
64
- maxDateTime?: Date
65
- }
66
-
67
- export const Calendar = ({ disablePickers, value, onChange, ...props }: CalendarProps) => {
68
- const {
69
- viewDate,
70
- setViewDate,
71
- setNextMonth,
72
- setPrevMonth,
73
- isMonthDisabled,
74
- isYearDisabled,
75
- isDayDisabled
76
- } = useCalendar(props)
77
-
78
- useLayoutEffect(() => {
79
- if (value) {
80
- setViewDate(value)
81
- }
82
- }, [value])
83
-
84
- const date = dateToFormat(viewDate)
85
-
86
- const monthIndex = viewDate.getMonth()
87
- const year = viewDate.getFullYear()
88
- const now = new Date()
89
-
90
- return (
91
- <div className="calendar">
92
- <CalendarHeader
93
- viewDate={viewDate}
94
- onChange={setViewDate}
95
- onNextMonth={setNextMonth}
96
- onPrevMonth={setPrevMonth}
97
- disablePickers={disablePickers}
98
- isMonthDisabled={isMonthDisabled}
99
- isYearDisabled={isYearDisabled}
100
- />
101
- <div className="calendar-names">
102
- {weeks.map((name, i) => (
103
- <div className="calendar-name" key={`week-name-${i}`}>
104
- {name}
105
- </div>
106
- ))}
107
- </div>
108
- <div className="calendar-days">
109
- {createVoids(getDayIndex(getFirstDay(date.month, date.year))).map((n, i) => (
110
- <div className="calendar-day" data-void key={`void-${n}-${i}`} />
111
- ))}
112
- {createVoids(getMonthMaxDay(date.month, date.year)).map((n, i) => {
113
- const date = new Date(year, monthIndex, i + 1)
114
-
115
- return (
116
- <CalendarDay
117
- day={i + 1}
118
- key={`date-${n}-${year}-${monthIndex}-${i}`}
119
- disabled={isDayDisabled(date)}
120
- selected={Boolean(value && isSameDate(value, date))}
121
- today={isSameDate(date, now)}
122
- onSelect={() => onChange?.(date)}
123
- />
124
- )
125
- })}
126
- </div>
127
- </div>
128
- )
129
- }
130
-
131
- interface CalendarDayProps {
132
- day: number
133
- disabled?: boolean
134
- selected?: boolean
135
- today?: boolean
136
- onSelect?: () => void
137
- }
138
-
139
- const CalendarDay = ({ day, disabled, selected, today, onSelect }: CalendarDayProps) => {
140
- const handleClick = () => {
141
- if (!disabled) {
142
- onSelect?.()
143
- }
144
- }
145
-
146
- return (
147
- <div
148
- className="calendar-day"
149
- data-disabled={attr(disabled)}
150
- data-selected={attr(selected)}
151
- data-today={attr(today)}
152
- onClick={handleClick}
153
- >
154
- <span className="calendar-day-number">{day}</span>
155
- </div>
156
- )
157
- }
@@ -1,139 +0,0 @@
1
- import { useCallback, useMemo } from 'react'
2
- import { Option, Select } from '..'
3
- import { DEFAULT_MAX_YEAR, DEFAULT_MIN_YEAR, getMonths, getYears } from '../__utils/utils'
4
- import { Icon } from '../Icon'
5
- import { faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons'
6
- import { setMonth, setYear } from '../__libs/calendar'
7
-
8
- export interface CalendarHeaderProps {
9
- /**
10
- * Отображаемая дата.
11
- */
12
- viewDate: Date
13
- /**
14
- * Отключает селекторы выбора месяца/года.
15
- */
16
- disablePickers?: boolean
17
- /**
18
- * Функция для проверки блокировки месяца.
19
- */
20
- isMonthDisabled?: (monthNumber: number, year?: number) => boolean
21
- /**
22
- * Функция для проверки блокировки года.
23
- */
24
- isYearDisabled?: (yearNumber: number) => boolean
25
- /**
26
- * Обработчик изменения отображаемой даты.
27
- */
28
- onChange: (viewDate: Date) => void
29
- /**
30
- * Нажатие на кнопку переключения на следующий месяц.
31
- */
32
- onNextMonth?: () => void
33
- /**
34
- * Нажатие на кнопку переключения на предыдущий месяц.
35
- */
36
- onPrevMonth?: () => void
37
- }
38
-
39
- export const CalendarHeader = ({
40
- viewDate,
41
- onChange,
42
- isMonthDisabled,
43
- isYearDisabled,
44
- onNextMonth,
45
- onPrevMonth
46
- }: CalendarHeaderProps) => {
47
- const currentYear = viewDate.getFullYear()
48
- const currentMonth = viewDate.getMonth()
49
- const locale = 'ru'
50
-
51
- // handlers
52
-
53
- const onMonthsChange = useCallback(
54
- (newValue: number) => {
55
- onChange(setMonth(viewDate, newValue))
56
- },
57
- [onChange, viewDate]
58
- )
59
-
60
- const onYearChange = useCallback(
61
- (newValue: number) => {
62
- onChange(setYear(viewDate, newValue))
63
- },
64
- [onChange, viewDate]
65
- )
66
-
67
- // options
68
-
69
- const months = useMemo((): Option<number>[] => {
70
- return getMonths(locale).map((option) => ({
71
- ...option,
72
- className: 'capitalize',
73
- disabled: isMonthDisabled && isMonthDisabled(option.value)
74
- }))
75
- }, [locale, isMonthDisabled])
76
-
77
- const years = useMemo((): Option<number>[] => {
78
- return getYears(currentYear, 100).map((option) => ({
79
- ...option,
80
- disabled: isYearDisabled && isYearDisabled(option.value)
81
- }))
82
- }, [currentYear, isYearDisabled])
83
-
84
- // disable
85
-
86
- let nextMonthHidden = currentMonth === 11 && currentYear === DEFAULT_MAX_YEAR
87
-
88
- if (isMonthDisabled && !nextMonthHidden) {
89
- nextMonthHidden = isMonthDisabled(
90
- currentMonth === 11 ? 0 : currentMonth + 1,
91
- currentMonth === 11 ? Math.min(currentYear + 1, DEFAULT_MAX_YEAR) : currentYear
92
- )
93
- }
94
-
95
- let prevMonthHidden = currentMonth === 0 && currentYear === DEFAULT_MIN_YEAR
96
-
97
- if (isMonthDisabled && !prevMonthHidden) {
98
- prevMonthHidden = isMonthDisabled(
99
- currentMonth === 0 ? 11 : currentMonth - 1,
100
- currentMonth === 0 ? Math.max(currentYear - 1, DEFAULT_MIN_YEAR) : currentYear
101
- )
102
- }
103
-
104
- return (
105
- <div className="calendar-header">
106
- {!prevMonthHidden && (
107
- <button className="calendar-navigation" data-side="left" onClick={onPrevMonth}>
108
- <Icon icon={faChevronLeft} />
109
- </button>
110
- )}
111
- <div className="calendar-pickers">
112
- <Select
113
- fill
114
- options={years}
115
- size="sm"
116
- value={currentYear}
117
- minimalOptions
118
- matchTarget="min-width"
119
- onChange={(value) => onYearChange(value || 0)}
120
- />
121
- <Select
122
- fill
123
- options={months}
124
- size="sm"
125
- className="capitalize"
126
- value={currentMonth}
127
- minimalOptions
128
- matchTarget="min-width"
129
- onChange={(value) => onMonthsChange(value || 0)}
130
- />
131
- </div>
132
- {!nextMonthHidden && (
133
- <button className="calendar-navigation" data-side="right" onClick={onNextMonth}>
134
- <Icon icon={faChevronRight} />
135
- </button>
136
- )}
137
- </div>
138
- )
139
- }
File without changes