@utilitywarehouse/hearth-react-native 0.3.0 → 0.4.0

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 (313) hide show
  1. package/.storybook/preview.tsx +3 -0
  2. package/.turbo/turbo-build.log +1 -1
  3. package/.turbo/turbo-lint.log +3 -1
  4. package/CHANGELOG.md +22 -0
  5. package/build/components/Alert/AlertCloseButton.js +25 -3
  6. package/build/components/Alert/AlertIcon.js +17 -1
  7. package/build/components/Alert/AlertIconButton.js +27 -1
  8. package/build/components/Alert/AlertLink.js +47 -1
  9. package/build/components/Alert/AlertText.d.ts +1 -1
  10. package/build/components/Alert/AlertText.js +26 -2
  11. package/build/components/Alert/AlertTitle.d.ts +1 -1
  12. package/build/components/Alert/AlertTitle.js +26 -2
  13. package/build/components/Badge/BadgeIcon.js +72 -0
  14. package/build/components/Badge/BadgeText.js +72 -0
  15. package/build/components/Button/ButtonRoot.js +1 -0
  16. package/build/components/Checkbox/Checkbox.d.ts +2 -2
  17. package/build/components/Checkbox/Checkbox.js +11 -10
  18. package/build/components/Checkbox/Checkbox.props.d.ts +3 -1
  19. package/build/components/Checkbox/CheckboxIcon.js +1 -1
  20. package/build/components/Checkbox/CheckboxImage.d.ts +6 -0
  21. package/build/components/Checkbox/CheckboxImage.js +5 -0
  22. package/build/components/Checkbox/CheckboxTileRoot.js +1 -1
  23. package/build/components/Checkbox/index.d.ts +3 -2
  24. package/build/components/Checkbox/index.js +2 -1
  25. package/build/components/CurrencyInput/CurrencyInput.js +1 -1
  26. package/build/components/DatePicker/DatePicker.context.d.ts +19 -0
  27. package/build/components/DatePicker/DatePicker.context.js +3 -0
  28. package/build/components/DatePicker/DatePicker.d.ts +19 -0
  29. package/build/components/DatePicker/DatePicker.js +479 -0
  30. package/build/components/DatePicker/DatePicker.props.d.ts +125 -0
  31. package/build/components/DatePicker/DatePicker.props.js +1 -0
  32. package/build/components/DatePicker/DatePickerCalendar.d.ts +2 -0
  33. package/build/components/DatePicker/DatePickerCalendar.js +28 -0
  34. package/build/components/DatePicker/DatePickerDay.d.ts +11 -0
  35. package/build/components/DatePicker/DatePickerDay.js +242 -0
  36. package/build/components/DatePicker/DatePickerDays.d.ts +2 -0
  37. package/build/components/DatePicker/DatePickerDays.js +157 -0
  38. package/build/components/DatePicker/DatePickerFooter.d.ts +2 -0
  39. package/build/components/DatePicker/DatePickerFooter.js +23 -0
  40. package/build/components/DatePicker/DatePickerHeader/DatePickerHeader.props.d.ts +8 -0
  41. package/build/components/DatePicker/DatePickerHeader/DatePickerHeader.props.js +1 -0
  42. package/build/components/DatePicker/DatePickerHeader/DatePickerMonthButton.d.ts +2 -0
  43. package/build/components/DatePicker/DatePickerHeader/DatePickerMonthButton.js +14 -0
  44. package/build/components/DatePicker/DatePickerHeader/DatePickerNextButton.d.ts +2 -0
  45. package/build/components/DatePicker/DatePickerHeader/DatePickerNextButton.js +32 -0
  46. package/build/components/DatePicker/DatePickerHeader/DatePickerPrevButton.d.ts +2 -0
  47. package/build/components/DatePicker/DatePickerHeader/DatePickerPrevButton.js +32 -0
  48. package/build/components/DatePicker/DatePickerHeader/DatePickerSelectors.d.ts +6 -0
  49. package/build/components/DatePicker/DatePickerHeader/DatePickerSelectors.js +64 -0
  50. package/build/components/DatePicker/DatePickerHeader/DatePickerTimeButton.d.ts +1 -0
  51. package/build/components/DatePicker/DatePickerHeader/DatePickerTimeButton.js +22 -0
  52. package/build/components/DatePicker/DatePickerHeader/DatePickerYearButton.d.ts +2 -0
  53. package/build/components/DatePicker/DatePickerHeader/DatePickerYearButton.js +25 -0
  54. package/build/components/DatePicker/DatePickerHeader/index.d.ts +3 -0
  55. package/build/components/DatePicker/DatePickerHeader/index.js +30 -0
  56. package/build/components/DatePicker/DatePickerMonths.d.ts +2 -0
  57. package/build/components/DatePicker/DatePickerMonths.js +69 -0
  58. package/build/components/DatePicker/DatePickerWeekdays.d.ts +8 -0
  59. package/build/components/DatePicker/DatePickerWeekdays.js +26 -0
  60. package/build/components/DatePicker/DatePickerYears.d.ts +2 -0
  61. package/build/components/DatePicker/DatePickerYears.js +83 -0
  62. package/build/components/DatePicker/TimePicker.d.ts +3 -0
  63. package/build/components/DatePicker/TimePicker.js +84 -0
  64. package/build/components/DatePicker/enums.d.ts +12 -0
  65. package/build/components/DatePicker/enums.js +12 -0
  66. package/build/components/DatePicker/index.d.ts +4 -0
  67. package/build/components/DatePicker/index.js +3 -0
  68. package/build/components/DatePicker/polyfill.d.ts +0 -0
  69. package/build/components/DatePicker/polyfill.js +22 -0
  70. package/build/components/DatePicker/time-picker/animated-math.d.ts +4 -0
  71. package/build/components/DatePicker/time-picker/animated-math.js +19 -0
  72. package/build/components/DatePicker/time-picker/period-native.d.ts +6 -0
  73. package/build/components/DatePicker/time-picker/period-native.js +17 -0
  74. package/build/components/DatePicker/time-picker/period-picker.d.ts +6 -0
  75. package/build/components/DatePicker/time-picker/period-picker.js +10 -0
  76. package/build/components/DatePicker/time-picker/period-web.d.ts +6 -0
  77. package/build/components/DatePicker/time-picker/period-web.js +21 -0
  78. package/build/components/DatePicker/time-picker/wheel-native.d.ts +8 -0
  79. package/build/components/DatePicker/time-picker/wheel-native.js +19 -0
  80. package/build/components/DatePicker/time-picker/wheel-picker/index.d.ts +2 -0
  81. package/build/components/DatePicker/time-picker/wheel-picker/index.js +2 -0
  82. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.d.ts +16 -0
  83. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.js +97 -0
  84. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.d.ts +21 -0
  85. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.js +88 -0
  86. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.d.ts +23 -0
  87. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.js +21 -0
  88. package/build/components/DatePicker/time-picker/wheel-web.d.ts +8 -0
  89. package/build/components/DatePicker/time-picker/wheel-web.js +148 -0
  90. package/build/components/DatePicker/time-picker/wheel.d.ts +8 -0
  91. package/build/components/DatePicker/time-picker/wheel.js +10 -0
  92. package/build/components/DatePicker/utils.d.ts +212 -0
  93. package/build/components/DatePicker/utils.js +391 -0
  94. package/build/components/DatePickerInput/DatePickerInput.d.ts +6 -0
  95. package/build/components/DatePickerInput/DatePickerInput.js +126 -0
  96. package/build/components/DatePickerInput/DatePickerInput.props.d.ts +47 -0
  97. package/build/components/DatePickerInput/DatePickerInput.props.js +1 -0
  98. package/build/components/DatePickerInput/DatePickerInputDoneButton.d.ts +8 -0
  99. package/build/components/DatePickerInput/DatePickerInputDoneButton.js +19 -0
  100. package/build/components/DatePickerInput/DatePickerInputDoneButton.web.d.ts +5 -0
  101. package/build/components/DatePickerInput/DatePickerInputDoneButton.web.js +5 -0
  102. package/build/components/DatePickerInput/index.d.ts +2 -0
  103. package/build/components/DatePickerInput/index.js +1 -0
  104. package/build/components/Input/InputField.d.ts +1 -1
  105. package/build/components/Input/InputField.js +1 -1
  106. package/build/components/Input/InputSlot.d.ts +1 -1
  107. package/build/components/Input/InputSlot.js +3 -3
  108. package/build/components/Link/Link.d.ts +1 -1
  109. package/build/components/Link/Link.js +4 -4
  110. package/build/components/Link/Link.props.d.ts +3 -0
  111. package/build/components/Radio/Radio.d.ts +2 -2
  112. package/build/components/Radio/Radio.js +9 -8
  113. package/build/components/Radio/Radio.props.d.ts +3 -1
  114. package/build/components/Radio/RadioImage.d.ts +6 -0
  115. package/build/components/Radio/RadioImage.js +5 -0
  116. package/build/components/Radio/RadioTileRoot.js +1 -1
  117. package/build/components/Radio/index.d.ts +3 -2
  118. package/build/components/Radio/index.js +2 -1
  119. package/build/components/Select/SelectOption.js +1 -7
  120. package/build/components/UnstyledIconButton/UnstyledIconButton.d.ts +1 -1
  121. package/build/components/UnstyledIconButton/UnstyledIconButton.js +5 -5
  122. package/build/components/UnstyledIconButton/UnstyledIconButton.props.d.ts +2 -1
  123. package/build/components/UnstyledIconButton/UnstyledIconButtonRoot.js +1 -1
  124. package/build/components/index.d.ts +2 -0
  125. package/build/components/index.js +2 -0
  126. package/build/core/themes.d.ts +12 -12
  127. package/build/hooks/index.d.ts +4 -3
  128. package/build/hooks/index.js +4 -3
  129. package/build/hooks/usePrevious.d.ts +1 -0
  130. package/build/hooks/usePrevious.js +8 -0
  131. package/build/hooks/useTheme.d.ts +2 -1
  132. package/build/hooks/useTheme.js +2 -2
  133. package/build/tokens/color.d.ts +12 -12
  134. package/build/tokens/color.js +6 -6
  135. package/build/tokens/components/dark/alert.d.ts +13 -0
  136. package/build/tokens/components/dark/alert.js +13 -0
  137. package/build/tokens/components/dark/checkbox.d.ts +3 -0
  138. package/build/tokens/components/dark/checkbox.js +3 -0
  139. package/build/tokens/components/dark/date-picker.d.ts +1 -0
  140. package/build/tokens/components/dark/date-picker.js +1 -0
  141. package/build/tokens/components/dark/icon-button.d.ts +7 -0
  142. package/build/tokens/components/dark/icon-button.js +7 -0
  143. package/build/tokens/components/dark/illustrations.d.ts +7 -0
  144. package/build/tokens/components/dark/illustrations.js +6 -0
  145. package/build/tokens/components/dark/index.d.ts +2 -0
  146. package/build/tokens/components/dark/index.js +2 -0
  147. package/build/tokens/components/dark/link.d.ts +5 -0
  148. package/build/tokens/components/dark/link.js +5 -0
  149. package/build/tokens/components/dark/progress-bar.d.ts +41 -0
  150. package/build/tokens/components/dark/progress-bar.js +40 -0
  151. package/build/tokens/components/dark/segmented-control.d.ts +2 -2
  152. package/build/tokens/components/dark/segmented-control.js +2 -2
  153. package/build/tokens/components/dark/table.d.ts +3 -0
  154. package/build/tokens/components/dark/table.js +3 -0
  155. package/build/tokens/components/light/alert.d.ts +13 -0
  156. package/build/tokens/components/light/alert.js +13 -0
  157. package/build/tokens/components/light/checkbox.d.ts +3 -0
  158. package/build/tokens/components/light/checkbox.js +3 -0
  159. package/build/tokens/components/light/date-picker.d.ts +1 -0
  160. package/build/tokens/components/light/date-picker.js +1 -0
  161. package/build/tokens/components/light/icon-button.d.ts +7 -0
  162. package/build/tokens/components/light/icon-button.js +7 -0
  163. package/build/tokens/components/light/illustrations.d.ts +7 -0
  164. package/build/tokens/components/light/illustrations.js +6 -0
  165. package/build/tokens/components/light/index.d.ts +2 -0
  166. package/build/tokens/components/light/index.js +2 -0
  167. package/build/tokens/components/light/link.d.ts +5 -0
  168. package/build/tokens/components/light/link.js +5 -0
  169. package/build/tokens/components/light/progress-bar.d.ts +41 -0
  170. package/build/tokens/components/light/progress-bar.js +40 -0
  171. package/build/tokens/components/light/segmented-control.d.ts +2 -2
  172. package/build/tokens/components/light/segmented-control.js +2 -2
  173. package/build/tokens/components/light/table.d.ts +3 -0
  174. package/build/tokens/components/light/table.js +3 -0
  175. package/build/tokens/index.d.ts +1 -0
  176. package/build/tokens/index.js +1 -0
  177. package/build/tokens/motion.d.ts +23 -0
  178. package/build/tokens/motion.js +22 -0
  179. package/build/tokens/primitive.d.ts +19 -0
  180. package/build/tokens/primitive.js +19 -0
  181. package/build/tokens/semantic-dark.d.ts +5 -5
  182. package/build/tokens/semantic-dark.js +5 -5
  183. package/build/tokens/semantic-light.d.ts +1 -1
  184. package/build/tokens/semantic-light.js +1 -1
  185. package/build/utils/index.d.ts +1 -0
  186. package/build/utils/index.js +1 -0
  187. package/build/utils/isEqual.d.ts +2 -0
  188. package/build/utils/isEqual.js +29 -0
  189. package/chromatic.config.json +6 -0
  190. package/docs/assets/bank-logo.png +0 -0
  191. package/docs/assets/bank-logo1.png +0 -0
  192. package/docs/components/AllComponents.web.tsx +43 -1
  193. package/docs/components/ViewWrap.tsx +32 -0
  194. package/docs/components/index.ts +7 -7
  195. package/docs/getting-started.mdx +6 -6
  196. package/docs/introduction.mdx +3 -3
  197. package/package.json +16 -12
  198. package/src/components/Alert/AlertCloseButton.tsx +33 -5
  199. package/src/components/Alert/AlertIcon.tsx +17 -1
  200. package/src/components/Alert/AlertIconButton.tsx +37 -4
  201. package/src/components/Alert/AlertLink.tsx +52 -1
  202. package/src/components/Alert/AlertText.tsx +28 -3
  203. package/src/components/Alert/AlertTitle.tsx +28 -3
  204. package/src/components/Badge/BadgeIcon.tsx +72 -0
  205. package/src/components/Badge/BadgeText.tsx +72 -0
  206. package/src/components/Button/ButtonRoot.tsx +1 -0
  207. package/src/components/Checkbox/Checkbox.docs.mdx +45 -7
  208. package/src/components/Checkbox/Checkbox.props.ts +3 -1
  209. package/src/components/Checkbox/Checkbox.stories.tsx +37 -1
  210. package/src/components/Checkbox/Checkbox.tsx +12 -9
  211. package/src/components/Checkbox/CheckboxIcon.tsx +1 -1
  212. package/src/components/Checkbox/CheckboxImage.tsx +9 -0
  213. package/src/components/Checkbox/CheckboxTileRoot.tsx +1 -1
  214. package/src/components/Checkbox/index.ts +3 -2
  215. package/src/components/CurrencyInput/CurrencyInput.tsx +2 -1
  216. package/src/components/DatePicker/DatePicker.context.ts +23 -0
  217. package/src/components/DatePicker/DatePicker.docs.mdx +239 -0
  218. package/src/components/DatePicker/DatePicker.props.ts +139 -0
  219. package/src/components/DatePicker/DatePicker.stories.tsx +98 -0
  220. package/src/components/DatePicker/DatePicker.tsx +669 -0
  221. package/src/components/DatePicker/DatePickerCalendar.tsx +41 -0
  222. package/src/components/DatePicker/DatePickerDay.tsx +302 -0
  223. package/src/components/DatePicker/DatePickerDays.tsx +241 -0
  224. package/src/components/DatePicker/DatePickerFooter.tsx +35 -0
  225. package/src/components/DatePicker/DatePickerHeader/DatePickerHeader.props.ts +10 -0
  226. package/src/components/DatePicker/DatePickerHeader/DatePickerMonthButton.tsx +29 -0
  227. package/src/components/DatePicker/DatePickerHeader/DatePickerNextButton.tsx +46 -0
  228. package/src/components/DatePicker/DatePickerHeader/DatePickerPrevButton.tsx +46 -0
  229. package/src/components/DatePicker/DatePickerHeader/DatePickerSelectors.tsx +96 -0
  230. package/src/components/DatePicker/DatePickerHeader/DatePickerTimeButton.tsx +48 -0
  231. package/src/components/DatePicker/DatePickerHeader/DatePickerYearButton.tsx +50 -0
  232. package/src/components/DatePicker/DatePickerHeader/index.tsx +64 -0
  233. package/src/components/DatePicker/DatePickerMonths.tsx +101 -0
  234. package/src/components/DatePicker/DatePickerWeekdays.tsx +49 -0
  235. package/src/components/DatePicker/DatePickerYears.tsx +119 -0
  236. package/src/components/DatePicker/TimePicker.tsx +141 -0
  237. package/src/components/DatePicker/enums.ts +14 -0
  238. package/src/components/DatePicker/index.ts +13 -0
  239. package/src/components/DatePicker/polyfill.ts +21 -0
  240. package/src/components/DatePicker/time-picker/animated-math.ts +33 -0
  241. package/src/components/DatePicker/time-picker/period-native.tsx +34 -0
  242. package/src/components/DatePicker/time-picker/period-picker.tsx +16 -0
  243. package/src/components/DatePicker/time-picker/period-web.tsx +36 -0
  244. package/src/components/DatePicker/time-picker/wheel-native.tsx +37 -0
  245. package/src/components/DatePicker/time-picker/wheel-picker/index.ts +3 -0
  246. package/src/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.tsx +132 -0
  247. package/src/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.ts +22 -0
  248. package/src/components/DatePicker/time-picker/wheel-picker/wheel-picker.tsx +200 -0
  249. package/src/components/DatePicker/time-picker/wheel-web.tsx +181 -0
  250. package/src/components/DatePicker/time-picker/wheel.tsx +18 -0
  251. package/src/components/DatePicker/utils.ts +549 -0
  252. package/src/components/DatePickerInput/DatePickerInput.docs.mdx +237 -0
  253. package/src/components/DatePickerInput/DatePickerInput.props.ts +50 -0
  254. package/src/components/DatePickerInput/DatePickerInput.stories.tsx +178 -0
  255. package/src/components/DatePickerInput/DatePickerInput.tsx +265 -0
  256. package/src/components/DatePickerInput/DatePickerInputDoneButton.tsx +42 -0
  257. package/src/components/DatePickerInput/DatePickerInputDoneButton.web.tsx +7 -0
  258. package/src/components/DatePickerInput/index.ts +2 -0
  259. package/src/components/Icon/Icon.stories.tsx +4 -3
  260. package/src/components/IconContainer/IconContainer.docs.mdx +4 -4
  261. package/src/components/Input/InputField.tsx +0 -2
  262. package/src/components/Input/InputSlot.tsx +14 -3
  263. package/src/components/Link/Link.props.ts +3 -0
  264. package/src/components/Link/Link.tsx +12 -6
  265. package/src/components/List/List.docs.mdx +24 -23
  266. package/src/components/Modal/Modal.stories.tsx +2 -30
  267. package/src/components/Radio/Radio.docs.mdx +96 -124
  268. package/src/components/Radio/Radio.props.ts +3 -1
  269. package/src/components/Radio/Radio.stories.tsx +47 -0
  270. package/src/components/Radio/Radio.tsx +10 -7
  271. package/src/components/Radio/RadioImage.tsx +9 -0
  272. package/src/components/Radio/RadioTileRoot.tsx +1 -1
  273. package/src/components/Radio/index.ts +3 -2
  274. package/src/components/Select/Select.docs.mdx +6 -6
  275. package/src/components/Select/Select.stories.tsx +7 -7
  276. package/src/components/Select/SelectOption.tsx +4 -10
  277. package/src/components/UnstyledIconButton/UnstyledIconButton.props.ts +2 -1
  278. package/src/components/UnstyledIconButton/UnstyledIconButton.tsx +23 -5
  279. package/src/components/UnstyledIconButton/UnstyledIconButtonRoot.tsx +7 -3
  280. package/src/components/index.ts +2 -0
  281. package/src/hooks/index.ts +4 -3
  282. package/src/hooks/usePrevious.ts +9 -0
  283. package/src/hooks/useTheme.ts +4 -3
  284. package/src/tokens/color.ts +6 -6
  285. package/src/tokens/components/dark/alert.ts +13 -0
  286. package/src/tokens/components/dark/checkbox.ts +3 -0
  287. package/src/tokens/components/dark/date-picker.ts +1 -0
  288. package/src/tokens/components/dark/icon-button.ts +7 -0
  289. package/src/tokens/components/dark/illustrations.ts +7 -0
  290. package/src/tokens/components/dark/index.ts +2 -0
  291. package/src/tokens/components/dark/link.ts +5 -0
  292. package/src/tokens/components/dark/progress-bar.ts +41 -0
  293. package/src/tokens/components/dark/segmented-control.ts +2 -2
  294. package/src/tokens/components/dark/table.ts +3 -0
  295. package/src/tokens/components/light/alert.ts +13 -0
  296. package/src/tokens/components/light/checkbox.ts +3 -0
  297. package/src/tokens/components/light/date-picker.ts +1 -0
  298. package/src/tokens/components/light/icon-button.ts +7 -0
  299. package/src/tokens/components/light/illustrations.ts +7 -0
  300. package/src/tokens/components/light/index.ts +2 -0
  301. package/src/tokens/components/light/link.ts +5 -0
  302. package/src/tokens/components/light/progress-bar.ts +41 -0
  303. package/src/tokens/components/light/segmented-control.ts +2 -2
  304. package/src/tokens/components/light/table.ts +3 -0
  305. package/src/tokens/index.ts +1 -0
  306. package/src/tokens/motion.ts +23 -0
  307. package/src/tokens/primitive.ts +19 -0
  308. package/src/tokens/semantic-dark.ts +5 -5
  309. package/src/tokens/semantic-light.ts +1 -1
  310. package/src/utils/index.ts +1 -0
  311. package/src/utils/isEqual.ts +30 -0
  312. package/docs/assets/react-native-pig.png +0 -0
  313. package/docs/components/AdvancedRadioExample.tsx +0 -126
@@ -0,0 +1,549 @@
1
+ import dayjs from 'dayjs';
2
+ import { useRef } from 'react';
3
+ import { isEqual } from '../../utils';
4
+ import type {
5
+ CalendarDay,
6
+ CalendarMonth,
7
+ CalendarWeek,
8
+ DateType,
9
+ Numerals,
10
+ } from './DatePicker.props';
11
+
12
+ export const CALENDAR_FORMAT = 'YYYY-MM-DD HH:mm';
13
+ export const DATE_FORMAT = 'YYYY-MM-DD';
14
+ export const YEAR_PAGE_SIZE = 12;
15
+
16
+ export const getMonths = () => dayjs.months();
17
+
18
+ export const getMonthName = (month: number) => dayjs.months()[month];
19
+
20
+ /**
21
+ * Get months array
22
+ *
23
+ * @returns months array
24
+ */
25
+ export const getMonthsArray = (): CalendarMonth[] => {
26
+ const monthNames = dayjs.months();
27
+ const monthShortNames = dayjs.monthsShort();
28
+
29
+ return monthNames.map((name, index) => ({
30
+ index,
31
+ name: {
32
+ full: name,
33
+ short: monthShortNames[index] || '',
34
+ },
35
+ isSelected: false,
36
+ }));
37
+ };
38
+
39
+ /**
40
+ * Get weekdays
41
+ *
42
+ * @param locale - locale
43
+ * @param firstDayOfWeek - first day of week
44
+ * @param format - format short, min or full
45
+ *
46
+ * @returns weekdays
47
+ */
48
+ export const getWeekdays = (firstDayOfWeek: number): CalendarWeek[] => {
49
+ dayjs.locale('en');
50
+
51
+ const weekdayNames = dayjs.weekdays();
52
+ const weekdayShortNames = dayjs.weekdaysShort();
53
+ const weekdayMinNames = dayjs.weekdaysMin();
54
+
55
+ let weekdays: CalendarWeek[] = weekdayNames.map((name, index) => ({
56
+ index,
57
+ name: {
58
+ full: name,
59
+ short: weekdayShortNames[index] || '',
60
+ min: weekdayMinNames[index][0] || '',
61
+ },
62
+ }));
63
+
64
+ if (firstDayOfWeek > 0) {
65
+ weekdays = [
66
+ ...weekdays.slice(firstDayOfWeek, weekdays.length),
67
+ ...weekdays.slice(0, firstDayOfWeek),
68
+ ] as CalendarWeek[];
69
+ }
70
+ return weekdays;
71
+ };
72
+
73
+ export const getFormated = (date: DateType) => dayjs(date).format(CALENDAR_FORMAT);
74
+
75
+ export const getDateMonth = (date: DateType) => dayjs(date).month();
76
+
77
+ export const getDateYear = (date: DateType) => dayjs(date).year();
78
+
79
+ /**
80
+ * Check if two dates are on the same day
81
+ *
82
+ * @param a - date to check
83
+ * @param b - date to check
84
+ *
85
+ * @returns true if dates are on the same day, false otherwise
86
+ */
87
+ export function areDatesOnSameDay(a: DateType, b: DateType) {
88
+ if (!a || !b) {
89
+ return false;
90
+ }
91
+
92
+ const date_a = dayjs(a).format(DATE_FORMAT);
93
+ const date_b = dayjs(b).format(DATE_FORMAT);
94
+
95
+ return date_a === date_b;
96
+ }
97
+
98
+ /**
99
+ * Check if date is between two dates
100
+ *
101
+ * @param date - date to check
102
+ * @param options - options
103
+ *
104
+ * @returns true if date is between two dates, false otherwise
105
+ */
106
+ export function isDateBetween(
107
+ date: DateType,
108
+ {
109
+ startDate,
110
+ endDate,
111
+ }: {
112
+ startDate?: DateType;
113
+ endDate?: DateType;
114
+ }
115
+ ): boolean {
116
+ if (!startDate || !endDate) {
117
+ return false;
118
+ }
119
+
120
+ return dayjs(date) <= endDate && dayjs(date) >= startDate;
121
+ }
122
+
123
+ /**
124
+ * Check if date is disabled
125
+ *
126
+ * @param date - date to check
127
+ * @param options - options
128
+ *
129
+ * @returns true if date is disabled, false otherwise
130
+ */
131
+ export function isDateDisabled(
132
+ date: dayjs.Dayjs,
133
+ {
134
+ minDate,
135
+ maxDate,
136
+ enabledDates,
137
+ disabledDates,
138
+ }: {
139
+ minDate?: DateType;
140
+ maxDate?: DateType;
141
+ enabledDates?: DateType[] | ((date: DateType) => boolean) | undefined;
142
+ disabledDates?: DateType[] | ((date: DateType) => boolean) | undefined;
143
+ }
144
+ ): boolean {
145
+ if (minDate && date.isBefore(dayjs(minDate).startOf('day'))) {
146
+ return true;
147
+ }
148
+ if (maxDate && date.isAfter(dayjs(maxDate).endOf('day'))) {
149
+ return true;
150
+ }
151
+
152
+ if (enabledDates) {
153
+ if (Array.isArray(enabledDates)) {
154
+ const isEnabled = enabledDates.some(enabledDate => areDatesOnSameDay(date, enabledDate));
155
+ return !isEnabled;
156
+ } else if (enabledDates instanceof Function) {
157
+ return !enabledDates(date);
158
+ }
159
+ } else if (disabledDates) {
160
+ if (Array.isArray(disabledDates)) {
161
+ const isDisabled = disabledDates.some(disabledDate => areDatesOnSameDay(date, disabledDate));
162
+ return isDisabled;
163
+ } else if (disabledDates instanceof Function) {
164
+ return disabledDates(date);
165
+ }
166
+ }
167
+
168
+ return false;
169
+ }
170
+
171
+ /**
172
+ * Check if year is disabled
173
+ *
174
+ * @param year - year to check
175
+ * @param options - options
176
+ *
177
+ * @returns true if year is disabled, false otherwise
178
+ */
179
+ export function isYearDisabled(
180
+ year: number,
181
+ {
182
+ minDate,
183
+ maxDate,
184
+ }: {
185
+ minDate?: DateType;
186
+ maxDate?: DateType;
187
+ }
188
+ ): boolean {
189
+ if (minDate && year < getDateYear(minDate)) return true;
190
+ if (maxDate && year > getDateYear(maxDate)) return true;
191
+
192
+ return false;
193
+ }
194
+
195
+ /**
196
+ * Check if month is disabled
197
+ *
198
+ * @param month - month to check
199
+ * @param date - date to check
200
+ * @param options - options
201
+ *
202
+ * @returns true if month is disabled, false otherwise
203
+ */
204
+ export function isMonthDisabled(
205
+ month: number,
206
+ date: DateType,
207
+ {
208
+ minDate,
209
+ maxDate,
210
+ }: {
211
+ minDate?: DateType;
212
+ maxDate?: DateType;
213
+ }
214
+ ): boolean {
215
+ if (minDate && month < getDateMonth(minDate) && getDateYear(date) === getDateYear(minDate))
216
+ return true;
217
+ if (maxDate && month > getDateMonth(maxDate) && getDateYear(date) === getDateYear(maxDate))
218
+ return true;
219
+
220
+ return false;
221
+ }
222
+
223
+ /**
224
+ * Get formated date
225
+ *
226
+ * @param date - date to get formated date from
227
+ * @param format - format to get formated date from
228
+ *
229
+ * @returns formated date
230
+ */
231
+ export const getFormatedDate = (date: DateType, format: string) => dayjs(date).format(format);
232
+
233
+ /**
234
+ * Get date
235
+ *
236
+ * @param date - date to get
237
+ *
238
+ * @returns date
239
+ */
240
+ export const getDate = (date: DateType) => dayjs(date);
241
+
242
+ /**
243
+ * Get year range
244
+ *
245
+ * @param year - year to get year range from
246
+ *
247
+ * @returns year range
248
+ */
249
+ export const getYearRange = (year: number) => {
250
+ const endYear = YEAR_PAGE_SIZE * Math.ceil(year / YEAR_PAGE_SIZE);
251
+ let startYear = endYear === year ? endYear : endYear - YEAR_PAGE_SIZE;
252
+
253
+ if (startYear < 0) {
254
+ startYear = 0;
255
+ }
256
+ return Array.from({ length: YEAR_PAGE_SIZE }, (_, i) => startYear + i);
257
+ };
258
+
259
+ /**
260
+ * Get days in month
261
+ *
262
+ * @param date - date to get days in month from
263
+ * @param showOutsideDays - whether to show outside days
264
+ * @param firstDayOfWeek - first day of week, number 0-6, 0 – Sunday, 6 – Saturday
265
+ *
266
+ * @returns days in month
267
+ */
268
+ export function getDaysInMonth(
269
+ date: DateType,
270
+ showOutsideDays: boolean | undefined,
271
+ firstDayOfWeek: number
272
+ ) {
273
+ const daysInCurrentMonth = dayjs(date).daysInMonth();
274
+
275
+ const prevMonthDays = dayjs(date).add(-1, 'month').daysInMonth();
276
+ const firstDay = dayjs(date).date(1 - firstDayOfWeek);
277
+ const prevMonthOffset = firstDay.day() % 7;
278
+ const daysInPrevMonth = showOutsideDays ? prevMonthOffset : 0;
279
+ const monthDaysOffset = prevMonthOffset + daysInCurrentMonth;
280
+ const daysInNextMonth = showOutsideDays
281
+ ? monthDaysOffset > 35
282
+ ? 42 - monthDaysOffset
283
+ : 35 - monthDaysOffset
284
+ : 0;
285
+
286
+ const fullDaysInMonth = daysInPrevMonth + daysInCurrentMonth + daysInNextMonth;
287
+
288
+ return {
289
+ prevMonthDays,
290
+ prevMonthOffset,
291
+ daysInCurrentMonth,
292
+ daysInNextMonth,
293
+ fullDaysInMonth,
294
+ };
295
+ }
296
+
297
+ /**
298
+ * Get first day of month
299
+ *
300
+ * @param date - date to get first day of month from
301
+ * @param firstDayOfWeek - first day of week, number 0-6, 0 – Sunday, 6 – Saturday
302
+ *
303
+ * @returns first day of month
304
+ */
305
+ export function getFirstDayOfMonth(date: DateType, firstDayOfWeek: number): number {
306
+ const d = getDate(date);
307
+ return d.date(1 - firstDayOfWeek).day();
308
+ }
309
+
310
+ /**
311
+ * Get start of day
312
+ *
313
+ * @param date - date to get start of day from
314
+ *
315
+ * @returns start of day
316
+ */
317
+ export function getStartOfDay(date: DateType): DateType {
318
+ return dayjs(date).startOf('day');
319
+ }
320
+
321
+ /**
322
+ * Get end of day
323
+ *
324
+ * @param date - date to get end of day from
325
+ *
326
+ * @returns end of day
327
+ */
328
+ export function getEndOfDay(date: DateType): DateType {
329
+ return dayjs(date).endOf('day');
330
+ }
331
+
332
+ /**
333
+ * Convert date to unix timestamp
334
+ *
335
+ * @param date - date to convert
336
+ *
337
+ * @returns unix timestamp
338
+ */
339
+ export function dateToUnix(date: DateType): number {
340
+ return dayjs(date).unix();
341
+ }
342
+
343
+ /**
344
+ * Remove time from date
345
+ *
346
+ * @param date - date to remove time from
347
+ *
348
+ * @returns date with time removed
349
+ */
350
+ export function removeTime(date: DateType, timeZone: string | undefined): DateType {
351
+ return date ? dayjs.tz(date, timeZone).startOf('day') : undefined;
352
+ }
353
+
354
+ /**
355
+ * Get detailed date object
356
+ *
357
+ * @param date Get detailed date object
358
+ *
359
+ * @returns parsed date object
360
+ */
361
+ export const getParsedDate = (date: DateType) => {
362
+ return {
363
+ year: dayjs(date).year(),
364
+ month: dayjs(date).month(),
365
+ hour: dayjs(date).hour(),
366
+ hour12: parseInt(dayjs(date).format('hh')),
367
+ minute: dayjs(date).minute(),
368
+ period: dayjs(date).format('A'),
369
+ };
370
+ };
371
+
372
+ /**
373
+ * Calculate month days array based on current date
374
+ *
375
+ * @param datetime - The current date that selected
376
+ * @param showOutsideDays
377
+ * @param minDate - min selectable date
378
+ * @param maxDate - max selectable date
379
+ * @param firstDayOfWeek - first day of week, number 0-6, 0 – Sunday, 6 – Saturday
380
+ * @param enabledDates - array of enabled dates, or a function that returns true for a given date (takes precedence over disabledDates)
381
+ * @param disabledDates - array of disabled dates, or a function that returns true for a given date
382
+ * @param prevMonthDays - number of days in the previous month
383
+ * @param prevMonthOffset - number of days to offset the previous month
384
+ * @param daysInCurrentMonth - number of days in the current month
385
+ * @param daysInNextMonth - number of days in the next month
386
+ *
387
+ * @returns days array based on current date
388
+ */
389
+ export const getMonthDays = (
390
+ datetime: DateType,
391
+ showOutsideDays: boolean,
392
+ minDate: DateType,
393
+ maxDate: DateType,
394
+ firstDayOfWeek: number,
395
+ enabledDates: DateType[] | ((date: DateType) => boolean) | undefined,
396
+ disabledDates: DateType[] | ((date: DateType) => boolean) | undefined,
397
+ prevMonthDays: number,
398
+ prevMonthOffset: number,
399
+ daysInCurrentMonth: number,
400
+ daysInNextMonth: number,
401
+ numerals: Numerals
402
+ ): CalendarDay[] => {
403
+ const date = dayjs(datetime);
404
+
405
+ const prevDays = showOutsideDays
406
+ ? Array.from({ length: prevMonthOffset }, (_, index) => {
407
+ const number = index + (prevMonthDays - prevMonthOffset + 1);
408
+ const thisDay = date.add(-1, 'month').date(number);
409
+ return generateCalendarDay(
410
+ number,
411
+ thisDay,
412
+ minDate,
413
+ maxDate,
414
+ enabledDates,
415
+ disabledDates,
416
+ false,
417
+ index + 1,
418
+ firstDayOfWeek,
419
+ numerals
420
+ );
421
+ })
422
+ : Array(prevMonthOffset).fill(null);
423
+
424
+ const currentDays = Array.from({ length: daysInCurrentMonth }, (_, index) => {
425
+ const day = index + 1;
426
+ const thisDay = date.date(day);
427
+ return generateCalendarDay(
428
+ day,
429
+ thisDay,
430
+ minDate,
431
+ maxDate,
432
+ enabledDates,
433
+ disabledDates,
434
+ true,
435
+ prevMonthOffset + day,
436
+ firstDayOfWeek,
437
+ numerals
438
+ );
439
+ });
440
+
441
+ const nextDays = Array.from({ length: daysInNextMonth }, (_, index) => {
442
+ const day = index + 1;
443
+ const thisDay = date.add(1, 'month').date(day);
444
+ return generateCalendarDay(
445
+ day,
446
+ thisDay,
447
+ minDate,
448
+ maxDate,
449
+ enabledDates,
450
+ disabledDates,
451
+ false,
452
+ daysInCurrentMonth + prevMonthOffset + day,
453
+ firstDayOfWeek,
454
+ numerals
455
+ );
456
+ });
457
+
458
+ return [...prevDays, ...currentDays, ...nextDays];
459
+ };
460
+
461
+ /**
462
+ * Generate day object for displaying inside day cell
463
+ *
464
+ * @param number - number of day
465
+ * @param date - calculated date based on day, month, and year
466
+ * @param minDate - min selectable date
467
+ * @param maxDate - max selectable date
468
+ * @param enabledDates - array of enabled dates, or a function that returns true for a given date (takes precedence over disabledDates)
469
+ * @param disabledDates - array of disabled dates, or a function that returns true for a given date
470
+ * @param isCurrentMonth - define the day is in the current month
471
+ * @param dayOfMonth - number the day in the current month
472
+ * @param firstDayOfWeek - first day of week, number 0-6, 0 – Sunday, 6 – Saturday
473
+ *
474
+ * @returns days object based on current date
475
+ */
476
+ const generateCalendarDay = (
477
+ number: number,
478
+ date: dayjs.Dayjs,
479
+ minDate: DateType,
480
+ maxDate: DateType,
481
+ enabledDates: DateType[] | ((date: DateType) => boolean) | undefined,
482
+ disabledDates: DateType[] | ((date: DateType) => boolean) | undefined,
483
+ isCurrentMonth: boolean,
484
+ dayOfMonth: number,
485
+ firstDayOfWeek: number,
486
+ numerals: Numerals
487
+ ) => {
488
+ const startOfWeek = dayjs(date).startOf('week').add(firstDayOfWeek, 'day');
489
+
490
+ return {
491
+ text: formatNumber(number, numerals),
492
+ number,
493
+ date: date,
494
+ isDisabled: isDateDisabled(date, {
495
+ minDate,
496
+ maxDate,
497
+ enabledDates,
498
+ disabledDates,
499
+ }),
500
+ isCurrentMonth,
501
+ dayOfMonth,
502
+ isStartOfWeek: date.isSame(startOfWeek, 'day'),
503
+ isEndOfWeek: date.day() === (firstDayOfWeek + 6) % 7,
504
+ };
505
+ };
506
+
507
+ /**
508
+ * Deep compare memo
509
+ *
510
+ * @param value - value to compare
511
+ * @param deps - dependencies
512
+ *
513
+ * @returns memoized value
514
+ */
515
+ export function useDeepCompareMemo<T>(value: T, deps: any[]): T {
516
+ const ref = useRef<T>(null);
517
+ const depsRef = useRef<any[]>(null);
518
+
519
+ if (!depsRef.current || !deps.every((dep, i) => isEqual(dep, depsRef.current![i]))) {
520
+ ref.current = value;
521
+ depsRef.current = deps;
522
+ }
523
+
524
+ return ref.current as T;
525
+ }
526
+
527
+ export const numeralSystems: Record<Numerals, readonly string[]> = {
528
+ latn: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
529
+ } as const;
530
+
531
+ function getDigitMap(numerals: Numerals): Record<string, string> {
532
+ const digitMap: Record<string, string> = {};
533
+ const numeralDigits = numeralSystems[numerals];
534
+
535
+ for (let i = 0; i < 10; i++) {
536
+ digitMap[i.toString()] = numeralDigits[i]!;
537
+ }
538
+
539
+ return digitMap;
540
+ }
541
+
542
+ function replaceDigits(input: string, numerals: Numerals): string {
543
+ const digitMap = getDigitMap(numerals);
544
+ return input.replace(/\d/g, digit => digitMap[digit] || digit);
545
+ }
546
+
547
+ export function formatNumber(value: number, numerals: Numerals): string {
548
+ return replaceDigits(value.toString(), numerals);
549
+ }