@companix/uikit 0.0.2 → 0.0.4

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 (222) hide show
  1. package/dist/Button/index.d.ts +20 -0
  2. package/dist/ButtonGroup/index.d.ts +7 -0
  3. package/dist/Checkbox/index.d.ts +10 -0
  4. package/dist/Countdown/index.d.ts +7 -0
  5. package/dist/DateInput/index.d.ts +13 -0
  6. package/dist/DatePicker/Calendar.d.ts +14 -0
  7. package/dist/DatePicker/CalendarHeader.d.ts +10 -0
  8. package/dist/DatePicker/index.d.ts +12 -0
  9. package/dist/Dialog/index.d.ts +12 -0
  10. package/dist/DialogAlert/Alert.d.ts +19 -0
  11. package/dist/DialogAlert/Viewport.d.ts +8 -0
  12. package/dist/DialogAlert/index.d.ts +11 -0
  13. package/dist/Drawer/index.d.ts +13 -0
  14. package/dist/File/index.d.ts +10 -0
  15. package/dist/Form/index.d.ts +17 -0
  16. package/dist/Icon/index.d.ts +7 -0
  17. package/dist/LoadButton/index.d.ts +5 -0
  18. package/dist/NumberInput/index.d.ts +6 -0
  19. package/dist/OptionItem/OptionItem.d.ts +7 -0
  20. package/dist/OptionItem/OptionsList.d.ts +8 -0
  21. package/dist/Popover/index.d.ts +26 -0
  22. package/dist/Radio/index.d.ts +20 -0
  23. package/dist/Scrollable/ImitateScroll.d.ts +10 -0
  24. package/dist/Scrollable/index.d.ts +33 -0
  25. package/dist/Select/SelectInput.d.ts +14 -0
  26. package/dist/Select/index.d.ts +15 -0
  27. package/dist/SelectTags/index.d.ts +15 -0
  28. package/dist/Spinner/index.d.ts +8 -0
  29. package/dist/Stepper/index.d.ts +8 -0
  30. package/dist/Switch/index.d.ts +10 -0
  31. package/dist/Tabs/index.d.ts +13 -0
  32. package/dist/TextArea/index.d.ts +7 -0
  33. package/dist/Toaster/RemoveListener.d.ts +3 -0
  34. package/dist/Toaster/Toast.d.ts +9 -0
  35. package/dist/Toaster/Viewport.d.ts +13 -0
  36. package/dist/Toaster/index.d.ts +15 -0
  37. package/dist/Tooltip/index.d.ts +8 -0
  38. package/dist/__hooks/use-frooze-closing.d.ts +5 -0
  39. package/dist/__hooks/use-loading.d.ts +8 -0
  40. package/dist/__hooks/use-local-storage.d.ts +1 -0
  41. package/dist/__hooks/use-popover-position.d.ts +8 -0
  42. package/dist/__hooks/use-previos.d.ts +2 -0
  43. package/dist/__hooks/use-resize.d.ts +3 -0
  44. package/dist/__hooks/use-scrollbox.d.ts +7 -0
  45. package/dist/__hooks/use-stepper-input.d.ts +13 -0
  46. package/dist/__hooks/use-update.d.ts +1 -0
  47. package/dist/__hooks/useCalendar.d.ts +17 -0
  48. package/dist/__hooks/useCalendarOptions-copy.d.ts +22 -0
  49. package/dist/__hooks/useCalendarOptions.d.ts +31 -0
  50. package/dist/__libs/calendar.d.ts +25 -0
  51. package/dist/__utils/utils.d.ts +25 -0
  52. package/dist/bundle.es.js +58 -0
  53. package/dist/bundle.es10.js +38 -0
  54. package/dist/bundle.es11.js +33 -0
  55. package/dist/bundle.es12.js +18 -0
  56. package/dist/bundle.es13.js +10 -0
  57. package/dist/bundle.es14.js +35 -0
  58. package/dist/bundle.es15.js +27 -0
  59. package/dist/bundle.es16.js +23 -0
  60. package/dist/bundle.es17.js +24 -0
  61. package/dist/bundle.es18.js +15 -0
  62. package/dist/bundle.es19.js +40 -0
  63. package/dist/bundle.es2.js +45 -0
  64. package/dist/bundle.es20.js +18 -0
  65. package/dist/bundle.es21.js +36 -0
  66. package/dist/bundle.es22.js +23 -0
  67. package/dist/bundle.es23.js +42 -0
  68. package/dist/bundle.es24.js +113 -0
  69. package/dist/bundle.es25.js +114 -0
  70. package/dist/bundle.es26.js +38 -0
  71. package/dist/bundle.es27.js +13 -0
  72. package/dist/bundle.es28.js +27 -0
  73. package/dist/bundle.es29.js +38 -0
  74. package/dist/bundle.es3.js +13 -0
  75. package/dist/bundle.es30.js +26 -0
  76. package/dist/bundle.es31.js +83 -0
  77. package/dist/bundle.es32.js +20 -0
  78. package/dist/bundle.es33.js +16 -0
  79. package/dist/bundle.es34.js +24 -0
  80. package/dist/bundle.es35.js +7 -0
  81. package/dist/bundle.es36.js +23 -0
  82. package/dist/bundle.es37.js +16 -0
  83. package/dist/bundle.es38.js +72 -0
  84. package/dist/bundle.es39.js +70 -0
  85. package/dist/bundle.es4.js +87 -0
  86. package/dist/bundle.es40.js +34 -0
  87. package/dist/bundle.es41.js +70 -0
  88. package/dist/bundle.es42.js +33 -0
  89. package/dist/bundle.es43.js +77 -0
  90. package/dist/bundle.es44.js +51 -0
  91. package/dist/bundle.es45.js +45 -0
  92. package/dist/bundle.es5.js +87 -0
  93. package/dist/bundle.es6.js +80 -0
  94. package/dist/bundle.es7.js +28 -0
  95. package/dist/bundle.es8.js +87 -0
  96. package/dist/bundle.es9.js +75 -0
  97. package/dist/index.d.ts +30 -0
  98. package/{src → dist}/index.scss +3 -0
  99. package/{src → dist}/mixins.scss +4 -3
  100. package/{src → dist}/theme.scss +0 -2
  101. package/dist/types.d.ts +13 -0
  102. package/package.json +10 -6
  103. package/.eslintrc +0 -54
  104. package/declaration.d.ts +0 -4
  105. package/index.html +0 -12
  106. package/playground/App.tsx +0 -166
  107. package/playground/Example.tsx +0 -14
  108. package/playground/Test.tsx +0 -44
  109. package/playground/animation-test-1/index.scss +0 -20
  110. package/playground/animation-test-1/index.tsx +0 -17
  111. package/playground/animation-test-2/index.scss +0 -62
  112. package/playground/animation-test-2/index.tsx +0 -32
  113. package/playground/bootstrap.tsx +0 -19
  114. package/playground/buttons/index.tsx +0 -132
  115. package/playground/checkbox/index.tsx +0 -64
  116. package/playground/date-input/index.tsx +0 -45
  117. package/playground/date-picker/index.tsx +0 -41
  118. package/playground/dialog/index.tsx +0 -92
  119. package/playground/dialog-alert/index.tsx +0 -47
  120. package/playground/drawer/index.tsx +0 -55
  121. package/playground/index.css +0 -33
  122. package/playground/index.scss +0 -270
  123. package/playground/input/index.tsx +0 -112
  124. package/playground/number-inputs/index.tsx +0 -50
  125. package/playground/popovers/index.tsx +0 -70
  126. package/playground/radio-group/index.tsx +0 -69
  127. package/playground/select/index.tsx +0 -72
  128. package/playground/select-tags/index.tsx +0 -36
  129. package/playground/styles.scss +0 -2
  130. package/playground/switch/index.tsx +0 -44
  131. package/playground/tabs/index.tsx +0 -16
  132. package/playground/test.scss +0 -0
  133. package/playground/text-area/index.tsx +0 -17
  134. package/playground/text-input/index.tsx +0 -12
  135. package/playground/toaster/index.tsx +0 -156
  136. package/playground/tooltip/index.tsx +0 -26
  137. package/src/Button/index.tsx +0 -72
  138. package/src/ButtonGroup/index.tsx +0 -20
  139. package/src/Checkbox/index.tsx +0 -46
  140. package/src/Countdown/index.tsx +0 -54
  141. package/src/DateInput/index.tsx +0 -96
  142. package/src/DatePicker/Calendar.tsx +0 -157
  143. package/src/DatePicker/CalendarHeader.tsx +0 -139
  144. package/src/DatePicker/index.tsx +0 -177
  145. package/src/Dialog/index.tsx +0 -31
  146. package/src/DialogAlert/Alert.tsx +0 -78
  147. package/src/DialogAlert/Viewport.tsx +0 -52
  148. package/src/DialogAlert/index.tsx +0 -37
  149. package/src/Drawer/index.tsx +0 -46
  150. package/src/File/index.tsx +0 -60
  151. package/src/Form/index.tsx +0 -131
  152. package/src/Icon/index.tsx +0 -43
  153. package/src/LoadButton/index.tsx +0 -17
  154. package/src/NumberInput/index.tsx +0 -74
  155. package/src/OptionItem/OptionItem.tsx +0 -49
  156. package/src/OptionItem/OptionsList.tsx +0 -26
  157. package/src/Popover/index.tsx +0 -117
  158. package/src/Radio/index.tsx +0 -68
  159. package/src/Scrollable/ImitateScroll.tsx +0 -141
  160. package/src/Scrollable/index.tsx +0 -141
  161. package/src/Select/SelectInput.tsx +0 -131
  162. package/src/Select/index.tsx +0 -134
  163. package/src/SelectTags/index.tsx +0 -192
  164. package/src/Spinner/index.tsx +0 -19
  165. package/src/Stepper/index.tsx +0 -76
  166. package/src/Switch/index.tsx +0 -49
  167. package/src/Tabs/index.tsx +0 -89
  168. package/src/TextArea/index.tsx +0 -51
  169. package/src/Toaster/RemoveListener.tsx +0 -11
  170. package/src/Toaster/Toast.tsx +0 -69
  171. package/src/Toaster/Viewport.tsx +0 -117
  172. package/src/Toaster/index.tsx +0 -52
  173. package/src/Tooltip/index.tsx +0 -33
  174. package/src/__hooks/use-frooze-closing.ts +0 -51
  175. package/src/__hooks/use-loading.ts +0 -34
  176. package/src/__hooks/use-local-storage.ts +0 -19
  177. package/src/__hooks/use-popover-position.ts +0 -24
  178. package/src/__hooks/use-previos.ts +0 -25
  179. package/src/__hooks/use-resize.ts +0 -41
  180. package/src/__hooks/use-scrollbox.ts +0 -45
  181. package/src/__hooks/use-stepper-input.ts +0 -82
  182. package/src/__hooks/use-update.ts +0 -19
  183. package/src/__hooks/useCalendar.ts +0 -104
  184. package/src/__hooks/useCalendarOptions-copy.ts +0 -87
  185. package/src/__hooks/useCalendarOptions.ts +0 -68
  186. package/src/__libs/calendar.ts +0 -175
  187. package/src/__utils/utils.ts +0 -137
  188. package/src/index.ts +0 -36
  189. package/src/types.ts +0 -14
  190. package/tailwind.config.js +0 -91
  191. package/themes/classic/animations.scss +0 -179
  192. package/themes/classic/classic.scss +0 -493
  193. package/tsconfig.json +0 -27
  194. package/vite.build.ts +0 -35
  195. package/vite.config.ts +0 -33
  196. /package/{src → dist}/Button/Button.scss +0 -0
  197. /package/{src → dist}/ButtonGroup/ButtonGroup.scss +0 -0
  198. /package/{src → dist}/Checkbox/Checkbox.scss +0 -0
  199. /package/{src → dist}/DateInput/DateInput.scss +0 -0
  200. /package/{src → dist}/DatePicker/Calendar.scss +0 -0
  201. /package/{src → dist}/DatePicker/DatePicker.scss +0 -0
  202. /package/{src → dist}/Dialog/Dialog.scss +0 -0
  203. /package/{src → dist}/Dialog/Popup.scss +0 -0
  204. /package/{src → dist}/DialogAlert/Alert.scss +0 -0
  205. /package/{src → dist}/Drawer/Drawer.scss +0 -0
  206. /package/{src → dist}/Form/Form.scss +0 -0
  207. /package/{src → dist}/Form/Input.scss +0 -0
  208. /package/{src → dist}/Icon/icon.scss +0 -0
  209. /package/{src → dist}/OptionItem/Option.scss +0 -0
  210. /package/{src → dist}/Popover/Popover.scss +0 -0
  211. /package/{src → dist}/Radio/Radio.scss +0 -0
  212. /package/{src → dist}/Scrollable/Scrollable.scss +0 -0
  213. /package/{src → dist}/Select/Select.scss +0 -0
  214. /package/{src → dist}/SelectTags/SelectTags.scss +0 -0
  215. /package/{src → dist}/Spinner/Spinner.scss +0 -0
  216. /package/{src → dist}/Stepper/StepperInput.scss +0 -0
  217. /package/{src → dist}/Switch/Switch.scss +0 -0
  218. /package/{src → dist}/Tabs/Tabs.scss +0 -0
  219. /package/{src → dist}/TextArea/TextArea.scss +0 -0
  220. /package/{src → dist}/Toaster/Toaster.scss +0 -0
  221. /package/{src → dist}/Tooltip/Tooltip.scss +0 -0
  222. /package/{src/css.scss → dist/css-properties.scss} +0 -0
@@ -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
- }
@@ -1,177 +0,0 @@
1
- import { Popover } from '..'
2
- import { Form, FormProps } from '../Form'
3
- import { faChevronDown, faClose } from '@fortawesome/free-solid-svg-icons'
4
- import { Icon } from '../Icon'
5
- import { useRef, useState } from 'react'
6
- import { Calendar, CalendarProps } from './Calendar'
7
- import { useDayDisableCheker } from '../__libs/calendar'
8
- import { formatTime, getNum } from '@companix/utils-js'
9
-
10
- interface DatePickerProps
11
- extends Omit<CalendarProps, 'onChange'>,
12
- Omit<FormProps, 'value' | 'onChange' | 'rightElement'> {
13
- onChange?: (value: Date | null) => void
14
- placeholder?: string
15
- clearButton?: boolean
16
- clearButtonIcon?: boolean
17
- children?: React.ReactNode
18
- minimalOptions?: boolean
19
- }
20
-
21
- const createInputValue = (value: Date | null, char: string = '-'): string => {
22
- if (value) {
23
- const day = formatTime(value.getDate())
24
- const month = formatTime(value.getMonth() + 1)
25
- const year = value.getFullYear()
26
-
27
- return [day, month, year].join(char)
28
- }
29
-
30
- return ''
31
- }
32
-
33
- const inputToDate = (input: string, char: string = '-'): Date | null => {
34
- const values = input.split(char)
35
-
36
- if (values.length === 3) {
37
- const [day, month, year] = [getNum(values[0]), getNum(values[1]), getNum(values[2])]
38
-
39
- if (day && month && year) {
40
- const date = new Date(year, month - 1, day)
41
-
42
- if (date.getFullYear() === year && date.getDate() === day && date.getMonth() === month - 1) {
43
- return date
44
- }
45
- }
46
- }
47
-
48
- return null
49
- }
50
-
51
- export const DatePicker = (props: DatePickerProps) => {
52
- const {
53
- minimalOptions,
54
- clearButton,
55
- clearButtonIcon,
56
- children,
57
- disabled,
58
- // calendar props
59
- value,
60
-
61
- enableTime,
62
- disablePickers,
63
- showNeighboringMonth,
64
- onChange,
65
- shouldDisableDate,
66
- viewDate,
67
- disablePast,
68
- disableFuture,
69
- minDateTime,
70
- maxDateTime,
71
- // input props
72
- ...inputProps
73
- } = props
74
-
75
- const [inputValue, setInputValue] = useState(() => {
76
- return createInputValue(value ?? null)
77
- })
78
-
79
- const popoverRef = useRef<HTMLDivElement>(null)
80
-
81
- const isDayDisabled = useDayDisableCheker({
82
- disableFuture,
83
- disablePast,
84
- shouldDisableDate,
85
- minDateTime,
86
- maxDateTime
87
- })
88
-
89
- const handleRootClick = (event: React.MouseEvent) => {
90
- if (disabled) return
91
-
92
- // Предотвращаем закрытие Popover при клике на форму
93
- if (popoverRef.current && popoverRef.current.getAttribute('data-state') === 'open') {
94
- event.preventDefault()
95
- }
96
- }
97
-
98
- const handleClear = (e: React.MouseEvent) => {
99
- e.stopPropagation()
100
-
101
- setInputValue('')
102
- onChange?.(null)
103
- }
104
-
105
- const handleInputChange = (value: string) => {
106
- setInputValue(value)
107
-
108
- const date = inputToDate(value)
109
-
110
- if (date && !isDayDisabled(date)) {
111
- onChange?.(date)
112
- }
113
- }
114
-
115
- const handleInputBlur = () => {
116
- const date = inputToDate(inputValue)
117
-
118
- if (!date || isDayDisabled(date)) {
119
- setInputValue(createInputValue(value ?? null))
120
- }
121
- }
122
-
123
- const handleCalendarChange = (value: Date) => {
124
- onChange?.(value)
125
- setInputValue(createInputValue(value))
126
- }
127
-
128
- return (
129
- <Popover
130
- minimal
131
- ref={popoverRef}
132
- sideOffset={0}
133
- onOpenAutoFocus={(e) => e.preventDefault()}
134
- onCloseAutoFocus={(e) => e.preventDefault()}
135
- disabled={disabled}
136
- content={() => (
137
- <Calendar
138
- value={value}
139
- disablePast={disablePast}
140
- disableFuture={disableFuture}
141
- enableTime={enableTime}
142
- disablePickers={disablePickers}
143
- showNeighboringMonth={showNeighboringMonth}
144
- onChange={handleCalendarChange}
145
- shouldDisableDate={shouldDisableDate}
146
- viewDate={viewDate}
147
- minDateTime={minDateTime}
148
- maxDateTime={maxDateTime}
149
- />
150
- )}
151
- >
152
- <Form
153
- {...inputProps}
154
- value={inputValue}
155
- disabled={disabled}
156
- onClick={handleRootClick}
157
- onValueChange={handleInputChange}
158
- onBlur={handleInputBlur}
159
- mask={'99-99-9999'}
160
- rightElement={
161
- <>
162
- {clearButton && isInputDefined(inputValue) && (
163
- <button className="select-close-button" onClick={handleClear}>
164
- {clearButtonIcon ?? <Icon className="select-close-icon" icon={faClose} size="xxxs" />}
165
- </button>
166
- )}
167
- <Icon className="expand-icon select-expand" icon={faChevronDown} size="xxxs" />
168
- </>
169
- }
170
- />
171
- </Popover>
172
- )
173
- }
174
-
175
- const isInputDefined = (value: string) => {
176
- return value.trim().replaceAll('-', '').replaceAll('_', '')
177
- }
@@ -1,31 +0,0 @@
1
- import cn from 'classnames'
2
- import * as DialogPrimitive from '@radix-ui/react-dialog'
3
- import { VisuallyHidden } from '@radix-ui/react-visually-hidden'
4
-
5
- export interface DialogProps {
6
- open: boolean
7
- onOpenChange: (value: boolean) => void
8
- children: React.ReactNode
9
- size?: 'xxs' | 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl' | 'full'
10
- className?: string
11
- }
12
-
13
- export const Dialog = ({ size = 's', open, onOpenChange, children, className }: DialogProps) => {
14
- return (
15
- <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>
16
- <DialogPrimitive.Portal>
17
- <DialogPrimitive.Overlay className="popup-overlay dialog-overlay" />
18
- <DialogPrimitive.Content className="popup-container dialog-container" data-size={size}>
19
- <div className={cn('popup dialog', className)}>
20
- <VisuallyHidden>
21
- <DialogPrimitive.Title />
22
- </VisuallyHidden>
23
- {children}
24
- </div>
25
- </DialogPrimitive.Content>
26
- </DialogPrimitive.Portal>
27
- </DialogPrimitive.Root>
28
- )
29
- }
30
-
31
- Dialog.Close = DialogPrimitive.Close
@@ -1,78 +0,0 @@
1
- import * as AlertPrimitive from '@radix-ui/react-alert-dialog'
2
- import { Button } from '..'
3
- import { InternButtonProps } from '../Button'
4
- import { RemoveListener } from '../Toaster/RemoveListener'
5
- import { VisuallyHidden } from '@radix-ui/react-visually-hidden'
6
-
7
- interface ActionProps extends Omit<InternButtonProps, 'children'> {
8
- onClick?: () => void
9
- }
10
-
11
- export interface AlertDialogProps {
12
- open?: boolean
13
- defaultOpen?: boolean
14
- onOpenChange?: (value: boolean) => void
15
- onUnMounted?: () => void
16
- icon?: React.ReactNode
17
- title?: string
18
- description?: string
19
- confirm?: ActionProps
20
- cancel?: ActionProps
21
- cancelDefaultText?: string
22
- disableCancel?: boolean
23
- }
24
-
25
- export const AlertDialog = ({
26
- open,
27
- defaultOpen,
28
- onOpenChange,
29
- onUnMounted,
30
- icon,
31
- title,
32
- description,
33
- cancelDefaultText,
34
- cancel,
35
- disableCancel,
36
- confirm
37
- }: AlertDialogProps) => {
38
- return (
39
- <AlertPrimitive.Root open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>
40
- <RemoveListener callback={onUnMounted} />
41
- <AlertPrimitive.Portal>
42
- <AlertPrimitive.Overlay className="popup-overlay dialog-overlay" />
43
- <AlertPrimitive.Content className="popup-container dialog-container">
44
- <div className="popup alert">
45
- <div className="alert-body">
46
- {icon && <span className="alert-icon">{icon}</span>}
47
- <div className="alert-content">
48
- {title && <AlertPrimitive.Title className="alert-title">{title}</AlertPrimitive.Title>}
49
- {!title && (
50
- <VisuallyHidden>
51
- <AlertPrimitive.Title />
52
- </VisuallyHidden>
53
- )}
54
- {description && (
55
- <AlertPrimitive.Description className="alert-description">
56
- {description}
57
- </AlertPrimitive.Description>
58
- )}
59
- </div>
60
- </div>
61
- <div className="alert-footer">
62
- {!disableCancel && (cancel?.text || cancelDefaultText) && (
63
- <AlertPrimitive.Cancel asChild>
64
- <Button appearance="neutral" {...cancel} text={cancel?.text ?? cancelDefaultText} />
65
- </AlertPrimitive.Cancel>
66
- )}
67
- {confirm?.text && (
68
- <AlertPrimitive.Action asChild>
69
- <Button appearance="negative" {...confirm} />
70
- </AlertPrimitive.Action>
71
- )}
72
- </div>
73
- </div>
74
- </AlertPrimitive.Content>
75
- </AlertPrimitive.Portal>
76
- </AlertPrimitive.Root>
77
- )
78
- }
@@ -1,52 +0,0 @@
1
- import { forwardRef, useImperativeHandle, useState } from 'react'
2
- import { InnerAlert } from '.'
3
- import { AlertDialog, AlertDialogProps } from './Alert'
4
-
5
- export interface ViewportRef {
6
- showAlert: (alert: InnerAlert) => void
7
- }
8
-
9
- export interface AlertBaseProps extends Pick<AlertDialogProps, 'cancelDefaultText'> {}
10
-
11
- export const Viewport = forwardRef<ViewportRef, AlertBaseProps>((props, ref) => {
12
- const [alerts, setAlerts] = useState<InnerAlert[]>([])
13
-
14
- useImperativeHandle(
15
- ref,
16
- () => {
17
- return {
18
- showAlert: (alert) => {
19
- setAlerts((state) => [...state, alert])
20
- }
21
- }
22
- },
23
- []
24
- )
25
-
26
- const handleClose = (id: string) => {
27
- setAlerts((state) => {
28
- const nextState = [...state]
29
- const index = nextState.findIndex((item) => item.id === id)
30
-
31
- if (index !== -1) {
32
- nextState.splice(index, 1)
33
- }
34
-
35
- return nextState
36
- })
37
- }
38
-
39
- return (
40
- <>
41
- {alerts.map(({ id, ...alert }) => (
42
- <AlertDialog
43
- defaultOpen
44
- onUnMounted={() => handleClose(id)}
45
- key={`alert-${id}`}
46
- {...props}
47
- {...alert}
48
- />
49
- ))}
50
- </>
51
- )
52
- })
@@ -1,37 +0,0 @@
1
- import { hash } from '@companix/utils-js'
2
- import { useMemo, useRef } from 'react'
3
- import { AlertDialogProps } from './Alert'
4
- import { AlertBaseProps, Viewport, ViewportRef } from './Viewport'
5
-
6
- export interface AlertOptions extends Omit<AlertDialogProps, 'open' | 'onOpenChange'> {}
7
-
8
- export interface InnerAlert extends AlertOptions {
9
- id: string
10
- }
11
-
12
- export const createAlertAgent = (options: AlertBaseProps = {}) => {
13
- const store = {
14
- emit: (alert: InnerAlert) => {
15
- console.error('uninitialized', alert)
16
- }
17
- }
18
-
19
- return {
20
- show: (value: Omit<InnerAlert, 'id'>) => {
21
- store.emit({ ...value, id: hash() })
22
- },
23
- Viewport: () => {
24
- const ref = useRef<ViewportRef>(null)
25
-
26
- useMemo(() => {
27
- store.emit = (value) => {
28
- if (ref.current) {
29
- ref.current.showAlert(value)
30
- }
31
- }
32
- }, [])
33
-
34
- return <Viewport ref={ref} {...options} />
35
- }
36
- }
37
- }