oddsgate-ds 1.0.169 → 1.0.171

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 (277) hide show
  1. package/.babelrc.json +25 -25
  2. package/.editorconfig +12 -12
  3. package/.storybook/main.ts +58 -58
  4. package/.storybook/preview.ts +26 -26
  5. package/README.md +30 -30
  6. package/chromatic.config.json +6 -6
  7. package/dist/cjs/assets/components/quotes.svg +3 -3
  8. package/dist/cjs/index.js +4 -4
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/types/components/molecules/EventsCard/EventsCard.component.d.ts +1 -1
  11. package/dist/cjs/types/components/molecules/EventsCard/EventsCard.interface.d.ts +1 -0
  12. package/dist/esm/assets/components/quotes.svg +3 -3
  13. package/dist/esm/index.js +1 -1
  14. package/dist/esm/index.js.map +1 -1
  15. package/dist/esm/types/components/molecules/EventsCard/EventsCard.component.d.ts +1 -1
  16. package/dist/esm/types/components/molecules/EventsCard/EventsCard.interface.d.ts +1 -0
  17. package/dist/public/assets/components/quotes.svg +3 -3
  18. package/dist/public/assets/empty-state.svg +28 -28
  19. package/dist/public/fonts/Nichrome/mdnichrome-bold-webfont.svg +241 -241
  20. package/dist/public/fonts/Nichrome/mdnichrome-regular-webfont.svg +241 -241
  21. package/dist/public/fonts/miewfont/miewfont.svg +38 -38
  22. package/dist/types.d.ts +2 -1
  23. package/package.json +103 -103
  24. package/prettier.config.js +7 -7
  25. package/public/assets/components/quotes.svg +3 -3
  26. package/public/assets/empty-state.svg +28 -28
  27. package/public/fonts/Nichrome/mdnichrome-bold-webfont.svg +241 -241
  28. package/public/fonts/Nichrome/mdnichrome-regular-webfont.svg +241 -241
  29. package/public/fonts/miewfont/miewfont.svg +38 -38
  30. package/rollup.config.js +98 -98
  31. package/src/components/atoms/Button/Button.component.tsx +60 -60
  32. package/src/components/atoms/Button/Button.interface.ts +29 -29
  33. package/src/components/atoms/Button/Button.stories.tsx +65 -65
  34. package/src/components/atoms/Button/Button.theme.ts +180 -180
  35. package/src/components/atoms/Button/index.ts +1 -1
  36. package/src/components/atoms/CardMarquee/CardMarquee.component.tsx +24 -24
  37. package/src/components/atoms/CardMarquee/CardMarquee.interface.ts +15 -15
  38. package/src/components/atoms/CardMarquee/CardMarquee.stories.tsx +21 -21
  39. package/src/components/atoms/CardMarquee/CardMarquee.theme.ts +48 -48
  40. package/src/components/atoms/CardMarquee/index.ts +1 -1
  41. package/src/components/atoms/Chip/Chip.component.tsx +30 -30
  42. package/src/components/atoms/Chip/Chip.interface.ts +14 -14
  43. package/src/components/atoms/Chip/Chip.stories.tsx +42 -42
  44. package/src/components/atoms/Chip/Chip.theme.ts +57 -57
  45. package/src/components/atoms/Chip/index.ts +1 -1
  46. package/src/components/atoms/CloseButton/CloseButton.component.tsx +17 -17
  47. package/src/components/atoms/CloseButton/CloseButton.interface.ts +9 -9
  48. package/src/components/atoms/CloseButton/CloseButton.stories.tsx +24 -24
  49. package/src/components/atoms/CloseButton/CloseButton.theme.ts +66 -66
  50. package/src/components/atoms/CloseButton/index.ts +1 -1
  51. package/src/components/atoms/Counter/Counter.component.tsx +99 -99
  52. package/src/components/atoms/Counter/Counter.interface.ts +10 -10
  53. package/src/components/atoms/Counter/Counter.stories.tsx +29 -29
  54. package/src/components/atoms/Counter/Counter.theme.ts +27 -27
  55. package/src/components/atoms/Counter/index.ts +1 -1
  56. package/src/components/atoms/EmptyState/EmptyState.component.tsx +27 -27
  57. package/src/components/atoms/EmptyState/EmptyState.interface.ts +10 -10
  58. package/src/components/atoms/EmptyState/EmptyState.stories.tsx +34 -34
  59. package/src/components/atoms/EmptyState/EmptyState.theme.ts +27 -27
  60. package/src/components/atoms/EmptyState/index.ts +1 -1
  61. package/src/components/atoms/Flex/Flex.component.tsx +30 -30
  62. package/src/components/atoms/Flex/Flex.interface.ts +24 -24
  63. package/src/components/atoms/Flex/Flex.theme.ts +12 -12
  64. package/src/components/atoms/Flex/index.ts +1 -1
  65. package/src/components/atoms/FlexGrid/FlexGrid.component.tsx +62 -62
  66. package/src/components/atoms/FlexGrid/FlexGrid.interface.ts +55 -55
  67. package/src/components/atoms/FlexGrid/FlexGrid.stories.tsx +59 -59
  68. package/src/components/atoms/FlexGrid/FlexGrid.theme.ts +82 -82
  69. package/src/components/atoms/FlexGrid/index.ts +1 -1
  70. package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.component.tsx +24 -24
  71. package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.interface.tsx +6 -6
  72. package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.theme.ts +134 -134
  73. package/src/components/atoms/FormField/CheckRadioField/index.ts +1 -1
  74. package/src/components/atoms/FormField/FormField.component.tsx +37 -37
  75. package/src/components/atoms/FormField/FormField.interface.ts +10 -10
  76. package/src/components/atoms/FormField/FormField.stories.tsx +499 -499
  77. package/src/components/atoms/FormField/FormField.theme.tsx +136 -136
  78. package/src/components/atoms/FormField/index.ts +1 -1
  79. package/src/components/atoms/Heading/Heading.component.tsx +18 -18
  80. package/src/components/atoms/Heading/Heading.interface.tsx +21 -21
  81. package/src/components/atoms/Heading/Heading.theme.ts +17 -17
  82. package/src/components/atoms/Heading/index.ts +1 -1
  83. package/src/components/atoms/Icon/Icon.component.tsx +19 -19
  84. package/src/components/atoms/Icon/Icon.interface.ts +8 -8
  85. package/src/components/atoms/Icon/Icon.stories.tsx +26 -26
  86. package/src/components/atoms/Icon/Icon.theme.ts +115 -115
  87. package/src/components/atoms/Icon/index.ts +1 -1
  88. package/src/components/atoms/ImageWrapper/ImageWrapper.component.tsx +42 -42
  89. package/src/components/atoms/ImageWrapper/ImageWrapper.interface.ts +16 -16
  90. package/src/components/atoms/ImageWrapper/ImageWrapper.stories.tsx +27 -27
  91. package/src/components/atoms/ImageWrapper/ImageWrapper.theme.ts +50 -50
  92. package/src/components/atoms/ImageWrapper/index.ts +1 -1
  93. package/src/components/atoms/LegalLinks/LegalLinks.component.tsx +35 -35
  94. package/src/components/atoms/LegalLinks/LegalLinks.interface.ts +12 -12
  95. package/src/components/atoms/LegalLinks/LegalLinks.stories.tsx +43 -43
  96. package/src/components/atoms/LegalLinks/LegalLinks.theme.ts +33 -33
  97. package/src/components/atoms/LegalLinks/index.ts +1 -1
  98. package/src/components/atoms/Loader/Loader.component.tsx +26 -26
  99. package/src/components/atoms/Loader/Loader.interface.ts +10 -10
  100. package/src/components/atoms/Loader/Loader.stories.tsx +33 -33
  101. package/src/components/atoms/Loader/Loader.theme.ts +51 -51
  102. package/src/components/atoms/Loader/index.ts +1 -1
  103. package/src/components/atoms/Marquee/Marquee.component.tsx +32 -32
  104. package/src/components/atoms/Marquee/Marquee.interface.ts +10 -10
  105. package/src/components/atoms/Marquee/Marquee.stories.tsx +20 -20
  106. package/src/components/atoms/Marquee/Marquee.theme.ts +40 -40
  107. package/src/components/atoms/Marquee/index.ts +1 -1
  108. package/src/components/atoms/Quote/Quote.component.tsx +29 -29
  109. package/src/components/atoms/Quote/Quote.interface.ts +10 -10
  110. package/src/components/atoms/Quote/Quote.stories.tsx +25 -25
  111. package/src/components/atoms/Quote/Quote.theme.ts +26 -26
  112. package/src/components/atoms/Quote/index.ts +1 -1
  113. package/src/components/atoms/RichText/RichText.component.tsx +32 -32
  114. package/src/components/atoms/RichText/RichText.interface.ts +11 -11
  115. package/src/components/atoms/RichText/RichText.stories.tsx +73 -73
  116. package/src/components/atoms/RichText/RichText.theme.ts +34 -34
  117. package/src/components/atoms/RichText/index.ts +1 -1
  118. package/src/components/atoms/ScrollingNav/ScrollingNav.component.tsx +18 -18
  119. package/src/components/atoms/ScrollingNav/ScrollingNav.interface.ts +8 -8
  120. package/src/components/atoms/ScrollingNav/ScrollingNav.stories.tsx +44 -44
  121. package/src/components/atoms/ScrollingNav/ScrollingNav.theme.ts +58 -58
  122. package/src/components/atoms/ScrollingNav/index.ts +1 -1
  123. package/src/components/atoms/Separator/Separator.component.tsx +19 -19
  124. package/src/components/atoms/Separator/Separator.interface.tsx +10 -10
  125. package/src/components/atoms/Separator/Separator.stories.tsx +29 -29
  126. package/src/components/atoms/Separator/Separator.theme.ts +9 -9
  127. package/src/components/atoms/Separator/index.ts +1 -1
  128. package/src/components/atoms/SocialLinks/SocialLinks.component.tsx +42 -42
  129. package/src/components/atoms/SocialLinks/SocialLinks.interface.ts +8 -8
  130. package/src/components/atoms/SocialLinks/SocialLinks.stories.tsx +48 -48
  131. package/src/components/atoms/SocialLinks/SocialLinks.theme.ts +80 -80
  132. package/src/components/atoms/SocialLinks/index.ts +1 -1
  133. package/src/components/atoms/Spacer/Spacer.component.tsx +34 -34
  134. package/src/components/atoms/Spacer/Spacer.interface.ts +24 -24
  135. package/src/components/atoms/Spacer/Spacer.stories.tsx +99 -99
  136. package/src/components/atoms/Spacer/Spacer.theme.ts +33 -33
  137. package/src/components/atoms/Spacer/index.ts +1 -1
  138. package/src/components/atoms/Video/Video.component.tsx +116 -116
  139. package/src/components/atoms/Video/Video.interface.ts +13 -13
  140. package/src/components/atoms/Video/Video.stories.tsx +37 -37
  141. package/src/components/atoms/Video/Video.theme.ts +44 -44
  142. package/src/components/atoms/Video/index.ts +1 -1
  143. package/src/components/atoms/VideoEmbed/VideoEmbed.component.tsx +109 -109
  144. package/src/components/atoms/VideoEmbed/VideoEmbed.interface.ts +13 -13
  145. package/src/components/atoms/VideoEmbed/VideoEmbed.stories.tsx +23 -23
  146. package/src/components/atoms/VideoEmbed/VideoEmbed.theme.ts +45 -45
  147. package/src/components/atoms/VideoEmbed/index.ts +1 -1
  148. package/src/components/common/PortalComponent/PortalComponent.tsx +48 -48
  149. package/src/components/common/PortalComponent/index.ts +1 -1
  150. package/src/components/molecules/Accordion/Accordion.component.tsx +58 -58
  151. package/src/components/molecules/Accordion/Accordion.interface.ts +15 -15
  152. package/src/components/molecules/Accordion/Accordion.stories.tsx +100 -100
  153. package/src/components/molecules/Accordion/Accordion.theme.ts +93 -93
  154. package/src/components/molecules/Accordion/index.ts +1 -1
  155. package/src/components/molecules/BlogCard/BlogCard.component.tsx +48 -48
  156. package/src/components/molecules/BlogCard/BlogCard.interface.ts +10 -10
  157. package/src/components/molecules/BlogCard/BlogCard.stories.tsx +37 -37
  158. package/src/components/molecules/BlogCard/BlogCard.theme.ts +41 -41
  159. package/src/components/molecules/BlogCard/index.ts +1 -1
  160. package/src/components/molecules/Card/Card.component.tsx +15 -15
  161. package/src/components/molecules/Card/Card.interface.ts +11 -11
  162. package/src/components/molecules/Card/Card.theme.ts +54 -54
  163. package/src/components/molecules/Card/index.ts +1 -1
  164. package/src/components/molecules/CareersCard/CareersCard.component.tsx +27 -27
  165. package/src/components/molecules/CareersCard/CareersCard.interface.ts +7 -7
  166. package/src/components/molecules/CareersCard/CareersCard.stories.tsx +30 -30
  167. package/src/components/molecules/CareersCard/CareersCard.theme.ts +13 -13
  168. package/src/components/molecules/CareersCard/index.ts +1 -1
  169. package/src/components/molecules/Dropdown/Dropdown.component.tsx +67 -67
  170. package/src/components/molecules/Dropdown/Dropdown.interface.ts +26 -26
  171. package/src/components/molecules/Dropdown/Dropdown.stories.tsx +54 -54
  172. package/src/components/molecules/Dropdown/Dropdown.theme.ts +69 -69
  173. package/src/components/molecules/Dropdown/index.ts +1 -1
  174. package/src/components/molecules/EventsCard/EventsCard.component.tsx +41 -40
  175. package/src/components/molecules/EventsCard/EventsCard.interface.ts +10 -9
  176. package/src/components/molecules/EventsCard/EventsCard.stories.tsx +38 -37
  177. package/src/components/molecules/EventsCard/EventsCard.theme.ts +33 -33
  178. package/src/components/molecules/EventsCard/index.ts +1 -1
  179. package/src/components/molecules/IconBox/IconBox.component.tsx +29 -29
  180. package/src/components/molecules/IconBox/IconBox.interface.tsx +10 -10
  181. package/src/components/molecules/IconBox/IconBox.stories.tsx +23 -23
  182. package/src/components/molecules/IconBox/IconBox.theme.ts +25 -25
  183. package/src/components/molecules/IconBox/index.ts +1 -1
  184. package/src/components/molecules/IconTitle/IconTitle.component.tsx +24 -24
  185. package/src/components/molecules/IconTitle/IconTitle.interface.tsx +10 -10
  186. package/src/components/molecules/IconTitle/IconTitle.stories.tsx +49 -49
  187. package/src/components/molecules/IconTitle/IconTitle.theme.ts +10 -10
  188. package/src/components/molecules/IconTitle/index.ts +1 -1
  189. package/src/components/molecules/LicenseCard/LicenseCard.component.tsx +27 -27
  190. package/src/components/molecules/LicenseCard/LicenseCard.interface.ts +6 -6
  191. package/src/components/molecules/LicenseCard/LicenseCard.stories.tsx +42 -42
  192. package/src/components/molecules/LicenseCard/LicenseCard.theme.ts +28 -28
  193. package/src/components/molecules/LicenseCard/index.ts +1 -1
  194. package/src/components/molecules/LogosCard/LogosCard.component.tsx +14 -14
  195. package/src/components/molecules/LogosCard/LogosCard.interface.ts +8 -8
  196. package/src/components/molecules/LogosCard/LogosCard.stories.tsx +38 -38
  197. package/src/components/molecules/LogosCard/LogosCard.theme.ts +19 -19
  198. package/src/components/molecules/LogosCard/index.ts +1 -1
  199. package/src/components/molecules/Modal/Modal.component.tsx +70 -70
  200. package/src/components/molecules/Modal/Modal.interface.ts +11 -11
  201. package/src/components/molecules/Modal/Modal.stories.tsx +57 -57
  202. package/src/components/molecules/Modal/Modal.theme.ts +55 -55
  203. package/src/components/molecules/Modal/index.ts +1 -1
  204. package/src/components/molecules/NewsCard/NewsCard.component.tsx +55 -55
  205. package/src/components/molecules/NewsCard/NewsCard.interface.ts +9 -9
  206. package/src/components/molecules/NewsCard/NewsCard.stories.tsx +44 -44
  207. package/src/components/molecules/NewsCard/NewsCard.theme.ts +77 -77
  208. package/src/components/molecules/NewsCard/index.ts +1 -1
  209. package/src/components/molecules/OffCanvas/OffCanvas.component.tsx +55 -55
  210. package/src/components/molecules/OffCanvas/OffCanvas.interface.ts +12 -12
  211. package/src/components/molecules/OffCanvas/OffCanvas.stories.tsx +55 -55
  212. package/src/components/molecules/OffCanvas/OffCanvas.theme.ts +50 -50
  213. package/src/components/molecules/OffCanvas/index.ts +1 -1
  214. package/src/components/molecules/ProductCard/ProductCard.component.tsx +60 -60
  215. package/src/components/molecules/ProductCard/ProductCard.interface.ts +7 -7
  216. package/src/components/molecules/ProductCard/ProductCard.stories.tsx +42 -42
  217. package/src/components/molecules/ProductCard/ProductCard.theme.ts +26 -26
  218. package/src/components/molecules/ProductCard/index.ts +1 -1
  219. package/src/components/molecules/ShareModal/ShareModal.component.tsx +167 -167
  220. package/src/components/molecules/ShareModal/ShareModal.interface.ts +9 -9
  221. package/src/components/molecules/ShareModal/ShareModal.stories.tsx +33 -33
  222. package/src/components/molecules/ShareModal/ShareModal.theme.ts +103 -103
  223. package/src/components/molecules/ShareModal/index.ts +1 -1
  224. package/src/components/molecules/TeamCard/TeamCard.component.tsx +31 -31
  225. package/src/components/molecules/TeamCard/TeamCard.interface.ts +7 -7
  226. package/src/components/molecules/TeamCard/TeamCard.stories.tsx +33 -33
  227. package/src/components/molecules/TeamCard/TeamCard.theme.ts +12 -12
  228. package/src/components/molecules/TeamCard/index.ts +1 -1
  229. package/src/components/organisms/CircularSlider/CircularSlider.component.tsx +231 -231
  230. package/src/components/organisms/CircularSlider/CircularSlider.interface.ts +13 -13
  231. package/src/components/organisms/CircularSlider/CircularSlider.stories.tsx +138 -138
  232. package/src/components/organisms/CircularSlider/CircularSlider.theme.ts +126 -126
  233. package/src/components/organisms/CircularSlider/index.ts +1 -1
  234. package/src/components/organisms/Cover/Cover.component.tsx +46 -46
  235. package/src/components/organisms/Cover/Cover.interface.ts +14 -14
  236. package/src/components/organisms/Cover/Cover.stories.tsx +97 -97
  237. package/src/components/organisms/Cover/Cover.theme.ts +49 -49
  238. package/src/components/organisms/Cover/index.ts +1 -1
  239. package/src/components/organisms/ProductsSlider/ProductsSlider.component.tsx +216 -216
  240. package/src/components/organisms/ProductsSlider/ProductsSlider.interface.ts +12 -12
  241. package/src/components/organisms/ProductsSlider/ProductsSlider.stories.tsx +132 -132
  242. package/src/components/organisms/ProductsSlider/ProductsSlider.theme.ts +77 -77
  243. package/src/components/organisms/ProductsSlider/index.ts +1 -1
  244. package/src/components/organisms/ProductsSlider//306/222.js +164 -164
  245. package/src/components/organisms/Slider/Slider.component.tsx +154 -154
  246. package/src/components/organisms/Slider/Slider.interface.ts +19 -19
  247. package/src/components/organisms/Slider/Slider.stories.tsx +146 -146
  248. package/src/components/organisms/Slider/Slider.theme.ts +145 -145
  249. package/src/components/organisms/Slider/Slider.utils.tsx +19 -19
  250. package/src/components/organisms/Slider/index.ts +1 -1
  251. package/src/components/organisms/Tabs/Tabs.component.tsx +88 -88
  252. package/src/components/organisms/Tabs/Tabs.interface.ts +18 -18
  253. package/src/components/organisms/Tabs/Tabs.stories.tsx +118 -118
  254. package/src/components/organisms/Tabs/Tabs.theme.ts +115 -115
  255. package/src/components/organisms/Tabs/index.ts +1 -1
  256. package/src/helpers/clickOutsideToClose.tsx +17 -17
  257. package/src/helpers/events.ts +9 -9
  258. package/src/helpers/exportCSS.tsx +27 -27
  259. package/src/helpers/getIcons.ts +5 -5
  260. package/src/helpers/isTouchDevice.tsx +11 -11
  261. package/src/helpers/useInterval.ts +25 -25
  262. package/src/helpers/useMediaMatch.tsx +26 -26
  263. package/src/helpers/uuid.ts +5 -5
  264. package/src/iconsList.json +1 -1
  265. package/src/index.ts +68 -68
  266. package/src/reportWebVitals.js +13 -13
  267. package/src/stories/Documentation/Colors.stories.tsx +46 -46
  268. package/src/stories/Documentation/Headings.stories.tsx +24 -24
  269. package/src/stories/Documentation/Icons.stories.tsx +73 -73
  270. package/src/stories/Documentation/JWT.stories.tsx +60 -60
  271. package/src/stories/Documentation/Utilities.stories.tsx +65 -65
  272. package/src/styles/Global.ts +301 -301
  273. package/src/styles/grid.ts +70 -70
  274. package/src/styles/reset.ts +47 -47
  275. package/src/styles/utilities.ts +374 -374
  276. package/src/styles/variables.ts +180 -180
  277. package/tsconfig.json +31 -31
@@ -1,99 +1,99 @@
1
- import React, { useCallback, useEffect, useRef, useState } from 'react'
2
-
3
- import Heading from '../Heading/Heading.component'
4
- import { ICounter } from './Counter.interface'
5
- import { StyledCounter } from '@/components/atoms/Counter/Counter.theme'
6
- import { useInterval } from '@/helpers/useInterval'
7
-
8
- const Counter = ({
9
- title,
10
- number,
11
- prefix,
12
- suffix,
13
- className,
14
- style,
15
- }: ICounter) => {
16
- if (!number) return <></>;
17
-
18
- const savedCallback: any = useRef();
19
- const targetRef = useRef<HTMLDivElement>()
20
- const [counterValue, setCounterValue] = useState<number>(0);
21
- const [counterVisible, setCounterVisible] = useState<boolean>(false);
22
-
23
- let timeout
24
- const speed = 50;
25
- const increment = Math.trunc(number / speed) < 1 ? 1 : Math.trunc(number / speed);
26
-
27
-
28
- useEffect(() => {
29
- savedCallback.current = () => {
30
- if (counterValue != number) {
31
- if (counterValue > number) {
32
- setCounterValue(number)
33
- } else {
34
- setCounterValue(counterValue + increment);
35
- }
36
- } else {
37
- return true;
38
- }
39
- };
40
- });
41
-
42
- useEffect(() => {
43
- function tick() {
44
- if (savedCallback && savedCallback.current) {
45
- const result = (savedCallback as unknown as any).current();
46
- if (result === true) {// if callback returs true, clear timeout;
47
- clearInterval(timeout);
48
- }
49
- }
50
- }
51
-
52
- if (counterVisible) timeout = setInterval(tick, speed);
53
-
54
- return () => clearInterval(timeout);
55
- }, [counterVisible]);
56
-
57
- useEffect(() => {
58
- let observer = new IntersectionObserver((entries, observer) => {
59
- entries.forEach((entry) => {
60
- const element = targetRef.current;
61
-
62
- if (!entry.target || !element) return;
63
-
64
- if (entry.intersectionRatio > 0) {
65
- setCounterVisible(true);
66
- observer.unobserve(element);
67
- }
68
- });
69
- }, {});
70
-
71
- observer.observe(targetRef.current as any);
72
-
73
- // Cleanup function to unobserve when the component unmounts
74
- return () => {
75
- if (targetRef.current) {
76
- observer.unobserve(targetRef.current);
77
- }
78
- };
79
- }, []);
80
-
81
-
82
-
83
- return (
84
- <StyledCounter
85
- ref={targetRef as any}
86
- className={className}
87
- style={style}
88
- >
89
- <Heading tag="span" size="h1" className='d-flex align-items-center color-primary50 fw-bold'>
90
- {prefix && prefix}
91
- <span>{counterValue}</span>
92
- {suffix && suffix}
93
- </Heading>
94
- {title && <Heading tag="span" size="h5" className='color-secondary50 fw-bold'>{title}</Heading>}
95
- </StyledCounter>
96
- )
97
- }
98
-
99
- export default Counter
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react'
2
+
3
+ import Heading from '../Heading/Heading.component'
4
+ import { ICounter } from './Counter.interface'
5
+ import { StyledCounter } from '@/components/atoms/Counter/Counter.theme'
6
+ import { useInterval } from '@/helpers/useInterval'
7
+
8
+ const Counter = ({
9
+ title,
10
+ number,
11
+ prefix,
12
+ suffix,
13
+ className,
14
+ style,
15
+ }: ICounter) => {
16
+ if (!number) return <></>;
17
+
18
+ const savedCallback: any = useRef();
19
+ const targetRef = useRef<HTMLDivElement>()
20
+ const [counterValue, setCounterValue] = useState<number>(0);
21
+ const [counterVisible, setCounterVisible] = useState<boolean>(false);
22
+
23
+ let timeout
24
+ const speed = 50;
25
+ const increment = Math.trunc(number / speed) < 1 ? 1 : Math.trunc(number / speed);
26
+
27
+
28
+ useEffect(() => {
29
+ savedCallback.current = () => {
30
+ if (counterValue != number) {
31
+ if (counterValue > number) {
32
+ setCounterValue(number)
33
+ } else {
34
+ setCounterValue(counterValue + increment);
35
+ }
36
+ } else {
37
+ return true;
38
+ }
39
+ };
40
+ });
41
+
42
+ useEffect(() => {
43
+ function tick() {
44
+ if (savedCallback && savedCallback.current) {
45
+ const result = (savedCallback as unknown as any).current();
46
+ if (result === true) {// if callback returs true, clear timeout;
47
+ clearInterval(timeout);
48
+ }
49
+ }
50
+ }
51
+
52
+ if (counterVisible) timeout = setInterval(tick, speed);
53
+
54
+ return () => clearInterval(timeout);
55
+ }, [counterVisible]);
56
+
57
+ useEffect(() => {
58
+ let observer = new IntersectionObserver((entries, observer) => {
59
+ entries.forEach((entry) => {
60
+ const element = targetRef.current;
61
+
62
+ if (!entry.target || !element) return;
63
+
64
+ if (entry.intersectionRatio > 0) {
65
+ setCounterVisible(true);
66
+ observer.unobserve(element);
67
+ }
68
+ });
69
+ }, {});
70
+
71
+ observer.observe(targetRef.current as any);
72
+
73
+ // Cleanup function to unobserve when the component unmounts
74
+ return () => {
75
+ if (targetRef.current) {
76
+ observer.unobserve(targetRef.current);
77
+ }
78
+ };
79
+ }, []);
80
+
81
+
82
+
83
+ return (
84
+ <StyledCounter
85
+ ref={targetRef as any}
86
+ className={className}
87
+ style={style}
88
+ >
89
+ <Heading tag="span" size="h1" className='d-flex align-items-center color-primary50 fw-bold'>
90
+ {prefix && prefix}
91
+ <span>{counterValue}</span>
92
+ {suffix && suffix}
93
+ </Heading>
94
+ {title && <Heading tag="span" size="h5" className='color-secondary50 fw-bold'>{title}</Heading>}
95
+ </StyledCounter>
96
+ )
97
+ }
98
+
99
+ export default Counter
@@ -1,10 +1,10 @@
1
- import { CSSProperties } from 'react';
2
-
3
- export interface ICounter {
4
- title?: string,
5
- number?: number,
6
- prefix?: string,
7
- suffix?: string,
8
- className?: string,
9
- style?: CSSProperties
10
- }
1
+ import { CSSProperties } from 'react';
2
+
3
+ export interface ICounter {
4
+ title?: string,
5
+ number?: number,
6
+ prefix?: string,
7
+ suffix?: string,
8
+ className?: string,
9
+ style?: CSSProperties
10
+ }
@@ -1,29 +1,29 @@
1
- import type { Meta, StoryObj } from '@storybook/react'
2
-
3
- import Counter from './Counter.component'
4
- import { ICounter } from './Counter.interface'
5
- import React from 'react'
6
-
7
- // More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
8
- export default {
9
- title: 'Components/Counter',
10
- component: Counter,
11
- tags: ['autodocs'],
12
- // More on argTypes: https://storybook.js.org/docs/react/api/argtypes
13
- argTypes: {}
14
- } as Meta
15
-
16
- export const Example: StoryObj<ICounter> = {
17
- render: args => (
18
- <>
19
- <div style={{ height: '2000px' }}></div>
20
- <Counter {...args}></Counter>
21
- </>
22
- ),
23
- args: {
24
- title: 'lorem ipsum',
25
- number: 30,
26
- prefix: '+',
27
- suffix: '%'
28
- }
29
- }
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+
3
+ import Counter from './Counter.component'
4
+ import { ICounter } from './Counter.interface'
5
+ import React from 'react'
6
+
7
+ // More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
8
+ export default {
9
+ title: 'Components/Counter',
10
+ component: Counter,
11
+ tags: ['autodocs'],
12
+ // More on argTypes: https://storybook.js.org/docs/react/api/argtypes
13
+ argTypes: {}
14
+ } as Meta
15
+
16
+ export const Example: StoryObj<ICounter> = {
17
+ render: args => (
18
+ <>
19
+ <div style={{ height: '2000px' }}></div>
20
+ <Counter {...args}></Counter>
21
+ </>
22
+ ),
23
+ args: {
24
+ title: 'lorem ipsum',
25
+ number: 30,
26
+ prefix: '+',
27
+ suffix: '%'
28
+ }
29
+ }
@@ -1,27 +1,27 @@
1
- import { colors, responsiveMedia } from '@/styles/variables';
2
- import styled, { css } from 'styled-components';
3
-
4
- import { ICounter } from './Counter.interface';
5
-
6
- export const StyledCounter = styled.div<ICounter>`
7
- display: inline-flex;
8
- vertical-align: top;
9
- flex-flow: column;
10
- justify-content: center;
11
- align-items: center;
12
-
13
- min-width: 10rem;
14
- min-height: 10rem;
15
-
16
- padding: 8px 22px;
17
- border-radius: 100%;
18
- text-align: center;
19
- margin: 12px;
20
-
21
- background-color: ${colors.third10};
22
-
23
- @media only screen and (min-width: ${responsiveMedia}) {
24
- min-width: 20rem;
25
- min-height: 20rem;
26
- }
27
- `;
1
+ import { colors, responsiveMedia } from '@/styles/variables';
2
+ import styled, { css } from 'styled-components';
3
+
4
+ import { ICounter } from './Counter.interface';
5
+
6
+ export const StyledCounter = styled.div<ICounter>`
7
+ display: inline-flex;
8
+ vertical-align: top;
9
+ flex-flow: column;
10
+ justify-content: center;
11
+ align-items: center;
12
+
13
+ min-width: 10rem;
14
+ min-height: 10rem;
15
+
16
+ padding: 8px 22px;
17
+ border-radius: 100%;
18
+ text-align: center;
19
+ margin: 12px;
20
+
21
+ background-color: ${colors.third10};
22
+
23
+ @media only screen and (min-width: ${responsiveMedia}) {
24
+ min-width: 20rem;
25
+ min-height: 20rem;
26
+ }
27
+ `;
@@ -1 +1 @@
1
- export { default } from './Counter.component'
1
+ export { default } from './Counter.component'
@@ -1,27 +1,27 @@
1
- import Heading from '../Heading/Heading.component'
2
- import { IEmptyState } from './EmptyState.interface'
3
- import React from 'react'
4
- import { ReactSVG } from 'react-svg'
5
- import { StyledEmptyState } from '@/components/atoms/EmptyState/EmptyState.theme'
6
-
7
- const EmptyState = ({
8
- variant,
9
- label,
10
- children,
11
- className,
12
- style,
13
- ...props
14
- }: IEmptyState) => {
15
- return (
16
- <StyledEmptyState $variant={variant} className={className} style={style}>
17
- <ReactSVG src={`/assets/empty-state.svg`} />
18
- {label && (
19
- <Heading tag="span" size="h4" className="fw-semibold mt-4">
20
- {label}
21
- </Heading>
22
- )}
23
- </StyledEmptyState>
24
- )
25
- }
26
-
27
- export default EmptyState
1
+ import Heading from '../Heading/Heading.component'
2
+ import { IEmptyState } from './EmptyState.interface'
3
+ import React from 'react'
4
+ import { ReactSVG } from 'react-svg'
5
+ import { StyledEmptyState } from '@/components/atoms/EmptyState/EmptyState.theme'
6
+
7
+ const EmptyState = ({
8
+ variant,
9
+ label,
10
+ children,
11
+ className,
12
+ style,
13
+ ...props
14
+ }: IEmptyState) => {
15
+ return (
16
+ <StyledEmptyState $variant={variant} className={className} style={style}>
17
+ <ReactSVG src={`/assets/empty-state.svg`} />
18
+ {label && (
19
+ <Heading tag="span" size="h4" className="fw-semibold mt-4">
20
+ {label}
21
+ </Heading>
22
+ )}
23
+ </StyledEmptyState>
24
+ )
25
+ }
26
+
27
+ export default EmptyState
@@ -1,10 +1,10 @@
1
- import { CSSProperties } from 'react';
2
-
3
- export interface IEmptyState {
4
- variant?: string;
5
- $variant?: string;
6
- label?: string,
7
- className?: string,
8
- style?: CSSProperties
9
- children?: React.ReactNode
10
- }
1
+ import { CSSProperties } from 'react';
2
+
3
+ export interface IEmptyState {
4
+ variant?: string;
5
+ $variant?: string;
6
+ label?: string,
7
+ className?: string,
8
+ style?: CSSProperties
9
+ children?: React.ReactNode
10
+ }
@@ -1,34 +1,34 @@
1
- import type { Meta, StoryObj } from '@storybook/react'
2
-
3
- import EmptyState from './EmptyState.component'
4
- import { IEmptyState } from './EmptyState.interface'
5
- import React from 'react'
6
-
7
- // More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
8
- export default {
9
- title: 'Components/EmptyState',
10
- component: EmptyState,
11
- tags: ['autodocs'],
12
- // More on argTypes: https://storybook.js.org/docs/react/api/argtypes
13
- argTypes: {}
14
- } as Meta
15
-
16
- export const Light: StoryObj<IEmptyState> = {
17
- render: args => <EmptyState {...args}></EmptyState>,
18
- args: {
19
- variant: 'light',
20
- label: 'No results for this search...'
21
- }
22
- }
23
-
24
- export const Dark: StoryObj<IEmptyState> = {
25
- render: args => (
26
- <div className="bg-primary50 color-white p-8">
27
- <EmptyState {...args}></EmptyState>
28
- </div>
29
- ),
30
- args: {
31
- variant: 'dark',
32
- label: 'No results for this search...'
33
- }
34
- }
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+
3
+ import EmptyState from './EmptyState.component'
4
+ import { IEmptyState } from './EmptyState.interface'
5
+ import React from 'react'
6
+
7
+ // More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
8
+ export default {
9
+ title: 'Components/EmptyState',
10
+ component: EmptyState,
11
+ tags: ['autodocs'],
12
+ // More on argTypes: https://storybook.js.org/docs/react/api/argtypes
13
+ argTypes: {}
14
+ } as Meta
15
+
16
+ export const Light: StoryObj<IEmptyState> = {
17
+ render: args => <EmptyState {...args}></EmptyState>,
18
+ args: {
19
+ variant: 'light',
20
+ label: 'No results for this search...'
21
+ }
22
+ }
23
+
24
+ export const Dark: StoryObj<IEmptyState> = {
25
+ render: args => (
26
+ <div className="bg-primary50 color-white p-8">
27
+ <EmptyState {...args}></EmptyState>
28
+ </div>
29
+ ),
30
+ args: {
31
+ variant: 'dark',
32
+ label: 'No results for this search...'
33
+ }
34
+ }
@@ -1,27 +1,27 @@
1
- import styled, { css } from 'styled-components';
2
-
3
- import { IEmptyState } from './EmptyState.interface';
4
- import { colors } from '@/styles/variables';
5
-
6
- export const StyledEmptyState = styled.div<IEmptyState>`
7
- display: flex;
8
- flex-flow: column;
9
- text-align: center;
10
-
11
- ${(props) => {
12
- switch (props.$variant) {
13
- case "dark": default:
14
- return css`
15
- & svg path{
16
- fill: ${colors.white} !important;
17
- }
18
- `;
19
- case "light":
20
- return css`
21
- & svg path{
22
- fill: ${colors.primary50} !important;
23
- }
24
- `;
25
- }
26
- }}
27
- `;
1
+ import styled, { css } from 'styled-components';
2
+
3
+ import { IEmptyState } from './EmptyState.interface';
4
+ import { colors } from '@/styles/variables';
5
+
6
+ export const StyledEmptyState = styled.div<IEmptyState>`
7
+ display: flex;
8
+ flex-flow: column;
9
+ text-align: center;
10
+
11
+ ${(props) => {
12
+ switch (props.$variant) {
13
+ case "dark": default:
14
+ return css`
15
+ & svg path{
16
+ fill: ${colors.white} !important;
17
+ }
18
+ `;
19
+ case "light":
20
+ return css`
21
+ & svg path{
22
+ fill: ${colors.primary50} !important;
23
+ }
24
+ `;
25
+ }
26
+ }}
27
+ `;
@@ -1 +1 @@
1
- export { default } from './EmptyState.component'
1
+ export { default } from './EmptyState.component'
@@ -1,30 +1,30 @@
1
- import { IFlex } from './Flex.interface';
2
- import React from 'react';
3
- import { StyledFlex } from '@/components/atoms/Flex/Flex.theme';
4
-
5
- const Flex = ({
6
- direction,
7
- align,
8
- justify,
9
- wrap,
10
- gap,
11
- children,
12
- className,
13
- ...props
14
- }: IFlex) => {
15
- return (
16
- <StyledFlex
17
- $direction={direction}
18
- $align={align}
19
- $justify={justify}
20
- $wrap={wrap}
21
- $gap={gap}
22
- className={className}
23
- {...props}
24
- >
25
- {children}
26
- </StyledFlex>
27
- )
28
- }
29
-
30
- export default Flex
1
+ import { IFlex } from './Flex.interface';
2
+ import React from 'react';
3
+ import { StyledFlex } from '@/components/atoms/Flex/Flex.theme';
4
+
5
+ const Flex = ({
6
+ direction,
7
+ align,
8
+ justify,
9
+ wrap,
10
+ gap,
11
+ children,
12
+ className,
13
+ ...props
14
+ }: IFlex) => {
15
+ return (
16
+ <StyledFlex
17
+ $direction={direction}
18
+ $align={align}
19
+ $justify={justify}
20
+ $wrap={wrap}
21
+ $gap={gap}
22
+ className={className}
23
+ {...props}
24
+ >
25
+ {children}
26
+ </StyledFlex>
27
+ )
28
+ }
29
+
30
+ export default Flex
@@ -1,24 +1,24 @@
1
- import { CSSProperties } from 'react';
2
-
3
- interface IFlexBase {
4
- className?: string,
5
- style?: CSSProperties
6
- children?: React.ReactNode
7
- }
8
- export type flexAlign = 'flex-start' | 'center' | 'flex-end' | 'stretch' | string
9
- export type flexJustify = 'flex-start' | 'center' | 'flex-end' | 'space-between' | string
10
-
11
- export interface IFlex extends IFlexBase{
12
- direction?: 'row' | 'column',
13
- align?: flexAlign,
14
- justify?: flexJustify,
15
- wrap?: 'wrap' | 'nowrap',
16
- gap?: string,
17
- }
18
- export interface IFlexSC extends IFlexBase {
19
- $direction?: 'row' | 'column',
20
- $align?: flexAlign,
21
- $justify?: flexJustify,
22
- $wrap?: 'wrap' | 'nowrap',
23
- $gap?: string,
24
- }
1
+ import { CSSProperties } from 'react';
2
+
3
+ interface IFlexBase {
4
+ className?: string,
5
+ style?: CSSProperties
6
+ children?: React.ReactNode
7
+ }
8
+ export type flexAlign = 'flex-start' | 'center' | 'flex-end' | 'stretch' | string
9
+ export type flexJustify = 'flex-start' | 'center' | 'flex-end' | 'space-between' | string
10
+
11
+ export interface IFlex extends IFlexBase{
12
+ direction?: 'row' | 'column',
13
+ align?: flexAlign,
14
+ justify?: flexJustify,
15
+ wrap?: 'wrap' | 'nowrap',
16
+ gap?: string,
17
+ }
18
+ export interface IFlexSC extends IFlexBase {
19
+ $direction?: 'row' | 'column',
20
+ $align?: flexAlign,
21
+ $justify?: flexJustify,
22
+ $wrap?: 'wrap' | 'nowrap',
23
+ $gap?: string,
24
+ }