oddsgate-ds 1.0.169 → 1.0.174

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 (268) 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/esm/assets/components/quotes.svg +3 -3
  9. package/dist/public/assets/components/quotes.svg +3 -3
  10. package/dist/public/assets/empty-state.svg +28 -28
  11. package/dist/public/fonts/Nichrome/mdnichrome-bold-webfont.svg +241 -241
  12. package/dist/public/fonts/Nichrome/mdnichrome-regular-webfont.svg +241 -241
  13. package/dist/public/fonts/miewfont/miewfont.svg +38 -38
  14. package/package.json +103 -103
  15. package/prettier.config.js +7 -7
  16. package/public/assets/components/quotes.svg +3 -3
  17. package/public/assets/empty-state.svg +28 -28
  18. package/public/fonts/Nichrome/mdnichrome-bold-webfont.svg +241 -241
  19. package/public/fonts/Nichrome/mdnichrome-regular-webfont.svg +241 -241
  20. package/public/fonts/miewfont/miewfont.svg +38 -38
  21. package/rollup.config.js +98 -98
  22. package/src/components/atoms/Button/Button.component.tsx +60 -60
  23. package/src/components/atoms/Button/Button.interface.ts +29 -29
  24. package/src/components/atoms/Button/Button.stories.tsx +65 -65
  25. package/src/components/atoms/Button/Button.theme.ts +180 -180
  26. package/src/components/atoms/Button/index.ts +1 -1
  27. package/src/components/atoms/CardMarquee/CardMarquee.component.tsx +24 -24
  28. package/src/components/atoms/CardMarquee/CardMarquee.interface.ts +15 -15
  29. package/src/components/atoms/CardMarquee/CardMarquee.stories.tsx +21 -21
  30. package/src/components/atoms/CardMarquee/CardMarquee.theme.ts +48 -48
  31. package/src/components/atoms/CardMarquee/index.ts +1 -1
  32. package/src/components/atoms/Chip/Chip.component.tsx +30 -30
  33. package/src/components/atoms/Chip/Chip.interface.ts +14 -14
  34. package/src/components/atoms/Chip/Chip.stories.tsx +42 -42
  35. package/src/components/atoms/Chip/Chip.theme.ts +57 -57
  36. package/src/components/atoms/Chip/index.ts +1 -1
  37. package/src/components/atoms/CloseButton/CloseButton.component.tsx +17 -17
  38. package/src/components/atoms/CloseButton/CloseButton.interface.ts +9 -9
  39. package/src/components/atoms/CloseButton/CloseButton.stories.tsx +24 -24
  40. package/src/components/atoms/CloseButton/CloseButton.theme.ts +66 -66
  41. package/src/components/atoms/CloseButton/index.ts +1 -1
  42. package/src/components/atoms/Counter/Counter.component.tsx +99 -99
  43. package/src/components/atoms/Counter/Counter.interface.ts +10 -10
  44. package/src/components/atoms/Counter/Counter.stories.tsx +29 -29
  45. package/src/components/atoms/Counter/Counter.theme.ts +27 -27
  46. package/src/components/atoms/Counter/index.ts +1 -1
  47. package/src/components/atoms/EmptyState/EmptyState.component.tsx +27 -27
  48. package/src/components/atoms/EmptyState/EmptyState.interface.ts +10 -10
  49. package/src/components/atoms/EmptyState/EmptyState.stories.tsx +34 -34
  50. package/src/components/atoms/EmptyState/EmptyState.theme.ts +27 -27
  51. package/src/components/atoms/EmptyState/index.ts +1 -1
  52. package/src/components/atoms/Flex/Flex.component.tsx +30 -30
  53. package/src/components/atoms/Flex/Flex.interface.ts +24 -24
  54. package/src/components/atoms/Flex/Flex.theme.ts +12 -12
  55. package/src/components/atoms/Flex/index.ts +1 -1
  56. package/src/components/atoms/FlexGrid/FlexGrid.component.tsx +62 -62
  57. package/src/components/atoms/FlexGrid/FlexGrid.interface.ts +55 -55
  58. package/src/components/atoms/FlexGrid/FlexGrid.stories.tsx +59 -59
  59. package/src/components/atoms/FlexGrid/FlexGrid.theme.ts +82 -82
  60. package/src/components/atoms/FlexGrid/index.ts +1 -1
  61. package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.component.tsx +24 -24
  62. package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.interface.tsx +6 -6
  63. package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.theme.ts +134 -134
  64. package/src/components/atoms/FormField/CheckRadioField/index.ts +1 -1
  65. package/src/components/atoms/FormField/FormField.component.tsx +37 -37
  66. package/src/components/atoms/FormField/FormField.interface.ts +10 -10
  67. package/src/components/atoms/FormField/FormField.stories.tsx +499 -499
  68. package/src/components/atoms/FormField/FormField.theme.tsx +136 -136
  69. package/src/components/atoms/FormField/index.ts +1 -1
  70. package/src/components/atoms/Heading/Heading.component.tsx +18 -18
  71. package/src/components/atoms/Heading/Heading.interface.tsx +21 -21
  72. package/src/components/atoms/Heading/Heading.theme.ts +17 -17
  73. package/src/components/atoms/Heading/index.ts +1 -1
  74. package/src/components/atoms/Icon/Icon.component.tsx +19 -19
  75. package/src/components/atoms/Icon/Icon.interface.ts +8 -8
  76. package/src/components/atoms/Icon/Icon.stories.tsx +26 -26
  77. package/src/components/atoms/Icon/Icon.theme.ts +115 -115
  78. package/src/components/atoms/Icon/index.ts +1 -1
  79. package/src/components/atoms/ImageWrapper/ImageWrapper.component.tsx +42 -42
  80. package/src/components/atoms/ImageWrapper/ImageWrapper.interface.ts +16 -16
  81. package/src/components/atoms/ImageWrapper/ImageWrapper.stories.tsx +27 -27
  82. package/src/components/atoms/ImageWrapper/ImageWrapper.theme.ts +50 -50
  83. package/src/components/atoms/ImageWrapper/index.ts +1 -1
  84. package/src/components/atoms/LegalLinks/LegalLinks.component.tsx +35 -35
  85. package/src/components/atoms/LegalLinks/LegalLinks.interface.ts +12 -12
  86. package/src/components/atoms/LegalLinks/LegalLinks.stories.tsx +43 -43
  87. package/src/components/atoms/LegalLinks/LegalLinks.theme.ts +33 -33
  88. package/src/components/atoms/LegalLinks/index.ts +1 -1
  89. package/src/components/atoms/Loader/Loader.component.tsx +26 -26
  90. package/src/components/atoms/Loader/Loader.interface.ts +10 -10
  91. package/src/components/atoms/Loader/Loader.stories.tsx +33 -33
  92. package/src/components/atoms/Loader/Loader.theme.ts +51 -51
  93. package/src/components/atoms/Loader/index.ts +1 -1
  94. package/src/components/atoms/Marquee/Marquee.component.tsx +32 -32
  95. package/src/components/atoms/Marquee/Marquee.interface.ts +10 -10
  96. package/src/components/atoms/Marquee/Marquee.stories.tsx +20 -20
  97. package/src/components/atoms/Marquee/Marquee.theme.ts +40 -40
  98. package/src/components/atoms/Marquee/index.ts +1 -1
  99. package/src/components/atoms/Quote/Quote.component.tsx +29 -29
  100. package/src/components/atoms/Quote/Quote.interface.ts +10 -10
  101. package/src/components/atoms/Quote/Quote.stories.tsx +25 -25
  102. package/src/components/atoms/Quote/Quote.theme.ts +26 -26
  103. package/src/components/atoms/Quote/index.ts +1 -1
  104. package/src/components/atoms/RichText/RichText.component.tsx +32 -32
  105. package/src/components/atoms/RichText/RichText.interface.ts +11 -11
  106. package/src/components/atoms/RichText/RichText.stories.tsx +73 -73
  107. package/src/components/atoms/RichText/RichText.theme.ts +34 -34
  108. package/src/components/atoms/RichText/index.ts +1 -1
  109. package/src/components/atoms/ScrollingNav/ScrollingNav.component.tsx +18 -18
  110. package/src/components/atoms/ScrollingNav/ScrollingNav.interface.ts +8 -8
  111. package/src/components/atoms/ScrollingNav/ScrollingNav.stories.tsx +44 -44
  112. package/src/components/atoms/ScrollingNav/ScrollingNav.theme.ts +58 -58
  113. package/src/components/atoms/ScrollingNav/index.ts +1 -1
  114. package/src/components/atoms/Separator/Separator.component.tsx +19 -19
  115. package/src/components/atoms/Separator/Separator.interface.tsx +10 -10
  116. package/src/components/atoms/Separator/Separator.stories.tsx +29 -29
  117. package/src/components/atoms/Separator/Separator.theme.ts +9 -9
  118. package/src/components/atoms/Separator/index.ts +1 -1
  119. package/src/components/atoms/SocialLinks/SocialLinks.component.tsx +42 -42
  120. package/src/components/atoms/SocialLinks/SocialLinks.interface.ts +8 -8
  121. package/src/components/atoms/SocialLinks/SocialLinks.stories.tsx +48 -48
  122. package/src/components/atoms/SocialLinks/SocialLinks.theme.ts +80 -80
  123. package/src/components/atoms/SocialLinks/index.ts +1 -1
  124. package/src/components/atoms/Spacer/Spacer.component.tsx +34 -34
  125. package/src/components/atoms/Spacer/Spacer.interface.ts +24 -24
  126. package/src/components/atoms/Spacer/Spacer.stories.tsx +99 -99
  127. package/src/components/atoms/Spacer/Spacer.theme.ts +33 -33
  128. package/src/components/atoms/Spacer/index.ts +1 -1
  129. package/src/components/atoms/Video/Video.component.tsx +116 -116
  130. package/src/components/atoms/Video/Video.interface.ts +13 -13
  131. package/src/components/atoms/Video/Video.stories.tsx +37 -37
  132. package/src/components/atoms/Video/Video.theme.ts +44 -44
  133. package/src/components/atoms/Video/index.ts +1 -1
  134. package/src/components/atoms/VideoEmbed/VideoEmbed.component.tsx +109 -109
  135. package/src/components/atoms/VideoEmbed/VideoEmbed.interface.ts +13 -13
  136. package/src/components/atoms/VideoEmbed/VideoEmbed.stories.tsx +23 -23
  137. package/src/components/atoms/VideoEmbed/VideoEmbed.theme.ts +45 -45
  138. package/src/components/atoms/VideoEmbed/index.ts +1 -1
  139. package/src/components/common/PortalComponent/PortalComponent.tsx +48 -48
  140. package/src/components/common/PortalComponent/index.ts +1 -1
  141. package/src/components/molecules/Accordion/Accordion.component.tsx +58 -58
  142. package/src/components/molecules/Accordion/Accordion.interface.ts +15 -15
  143. package/src/components/molecules/Accordion/Accordion.stories.tsx +100 -100
  144. package/src/components/molecules/Accordion/Accordion.theme.ts +93 -93
  145. package/src/components/molecules/Accordion/index.ts +1 -1
  146. package/src/components/molecules/BlogCard/BlogCard.component.tsx +48 -48
  147. package/src/components/molecules/BlogCard/BlogCard.interface.ts +10 -10
  148. package/src/components/molecules/BlogCard/BlogCard.stories.tsx +37 -37
  149. package/src/components/molecules/BlogCard/BlogCard.theme.ts +41 -41
  150. package/src/components/molecules/BlogCard/index.ts +1 -1
  151. package/src/components/molecules/Card/Card.component.tsx +15 -15
  152. package/src/components/molecules/Card/Card.interface.ts +11 -11
  153. package/src/components/molecules/Card/Card.theme.ts +54 -54
  154. package/src/components/molecules/Card/index.ts +1 -1
  155. package/src/components/molecules/CareersCard/CareersCard.component.tsx +27 -27
  156. package/src/components/molecules/CareersCard/CareersCard.interface.ts +7 -7
  157. package/src/components/molecules/CareersCard/CareersCard.stories.tsx +30 -30
  158. package/src/components/molecules/CareersCard/CareersCard.theme.ts +13 -13
  159. package/src/components/molecules/CareersCard/index.ts +1 -1
  160. package/src/components/molecules/Dropdown/Dropdown.component.tsx +67 -67
  161. package/src/components/molecules/Dropdown/Dropdown.interface.ts +26 -26
  162. package/src/components/molecules/Dropdown/Dropdown.stories.tsx +54 -54
  163. package/src/components/molecules/Dropdown/Dropdown.theme.ts +69 -69
  164. package/src/components/molecules/Dropdown/index.ts +1 -1
  165. package/src/components/molecules/EventsCard/EventsCard.component.tsx +40 -40
  166. package/src/components/molecules/EventsCard/EventsCard.interface.ts +9 -9
  167. package/src/components/molecules/EventsCard/EventsCard.stories.tsx +37 -37
  168. package/src/components/molecules/EventsCard/EventsCard.theme.ts +33 -33
  169. package/src/components/molecules/EventsCard/index.ts +1 -1
  170. package/src/components/molecules/IconBox/IconBox.component.tsx +29 -29
  171. package/src/components/molecules/IconBox/IconBox.interface.tsx +10 -10
  172. package/src/components/molecules/IconBox/IconBox.stories.tsx +23 -23
  173. package/src/components/molecules/IconBox/IconBox.theme.ts +25 -25
  174. package/src/components/molecules/IconBox/index.ts +1 -1
  175. package/src/components/molecules/IconTitle/IconTitle.component.tsx +24 -24
  176. package/src/components/molecules/IconTitle/IconTitle.interface.tsx +10 -10
  177. package/src/components/molecules/IconTitle/IconTitle.stories.tsx +49 -49
  178. package/src/components/molecules/IconTitle/IconTitle.theme.ts +10 -10
  179. package/src/components/molecules/IconTitle/index.ts +1 -1
  180. package/src/components/molecules/LicenseCard/LicenseCard.component.tsx +27 -27
  181. package/src/components/molecules/LicenseCard/LicenseCard.interface.ts +6 -6
  182. package/src/components/molecules/LicenseCard/LicenseCard.stories.tsx +42 -42
  183. package/src/components/molecules/LicenseCard/LicenseCard.theme.ts +28 -28
  184. package/src/components/molecules/LicenseCard/index.ts +1 -1
  185. package/src/components/molecules/LogosCard/LogosCard.component.tsx +14 -14
  186. package/src/components/molecules/LogosCard/LogosCard.interface.ts +8 -8
  187. package/src/components/molecules/LogosCard/LogosCard.stories.tsx +38 -38
  188. package/src/components/molecules/LogosCard/LogosCard.theme.ts +19 -19
  189. package/src/components/molecules/LogosCard/index.ts +1 -1
  190. package/src/components/molecules/Modal/Modal.component.tsx +70 -70
  191. package/src/components/molecules/Modal/Modal.interface.ts +11 -11
  192. package/src/components/molecules/Modal/Modal.stories.tsx +57 -57
  193. package/src/components/molecules/Modal/Modal.theme.ts +55 -55
  194. package/src/components/molecules/Modal/index.ts +1 -1
  195. package/src/components/molecules/NewsCard/NewsCard.component.tsx +55 -55
  196. package/src/components/molecules/NewsCard/NewsCard.interface.ts +9 -9
  197. package/src/components/molecules/NewsCard/NewsCard.stories.tsx +44 -44
  198. package/src/components/molecules/NewsCard/NewsCard.theme.ts +77 -77
  199. package/src/components/molecules/NewsCard/index.ts +1 -1
  200. package/src/components/molecules/OffCanvas/OffCanvas.component.tsx +55 -55
  201. package/src/components/molecules/OffCanvas/OffCanvas.interface.ts +12 -12
  202. package/src/components/molecules/OffCanvas/OffCanvas.stories.tsx +55 -55
  203. package/src/components/molecules/OffCanvas/OffCanvas.theme.ts +50 -50
  204. package/src/components/molecules/OffCanvas/index.ts +1 -1
  205. package/src/components/molecules/ProductCard/ProductCard.component.tsx +60 -60
  206. package/src/components/molecules/ProductCard/ProductCard.interface.ts +7 -7
  207. package/src/components/molecules/ProductCard/ProductCard.stories.tsx +42 -42
  208. package/src/components/molecules/ProductCard/ProductCard.theme.ts +26 -26
  209. package/src/components/molecules/ProductCard/index.ts +1 -1
  210. package/src/components/molecules/ShareModal/ShareModal.component.tsx +167 -167
  211. package/src/components/molecules/ShareModal/ShareModal.interface.ts +9 -9
  212. package/src/components/molecules/ShareModal/ShareModal.stories.tsx +33 -33
  213. package/src/components/molecules/ShareModal/ShareModal.theme.ts +103 -103
  214. package/src/components/molecules/ShareModal/index.ts +1 -1
  215. package/src/components/molecules/TeamCard/TeamCard.component.tsx +31 -31
  216. package/src/components/molecules/TeamCard/TeamCard.interface.ts +7 -7
  217. package/src/components/molecules/TeamCard/TeamCard.stories.tsx +33 -33
  218. package/src/components/molecules/TeamCard/TeamCard.theme.ts +12 -12
  219. package/src/components/molecules/TeamCard/index.ts +1 -1
  220. package/src/components/organisms/CircularSlider/CircularSlider.component.tsx +231 -231
  221. package/src/components/organisms/CircularSlider/CircularSlider.interface.ts +13 -13
  222. package/src/components/organisms/CircularSlider/CircularSlider.stories.tsx +138 -138
  223. package/src/components/organisms/CircularSlider/CircularSlider.theme.ts +126 -126
  224. package/src/components/organisms/CircularSlider/index.ts +1 -1
  225. package/src/components/organisms/Cover/Cover.component.tsx +46 -46
  226. package/src/components/organisms/Cover/Cover.interface.ts +14 -14
  227. package/src/components/organisms/Cover/Cover.stories.tsx +97 -97
  228. package/src/components/organisms/Cover/Cover.theme.ts +49 -49
  229. package/src/components/organisms/Cover/index.ts +1 -1
  230. package/src/components/organisms/ProductsSlider/ProductsSlider.component.tsx +216 -216
  231. package/src/components/organisms/ProductsSlider/ProductsSlider.interface.ts +12 -12
  232. package/src/components/organisms/ProductsSlider/ProductsSlider.stories.tsx +132 -132
  233. package/src/components/organisms/ProductsSlider/ProductsSlider.theme.ts +77 -77
  234. package/src/components/organisms/ProductsSlider/index.ts +1 -1
  235. package/src/components/organisms/ProductsSlider//306/222.js +164 -164
  236. package/src/components/organisms/Slider/Slider.component.tsx +154 -154
  237. package/src/components/organisms/Slider/Slider.interface.ts +19 -19
  238. package/src/components/organisms/Slider/Slider.stories.tsx +146 -146
  239. package/src/components/organisms/Slider/Slider.theme.ts +145 -145
  240. package/src/components/organisms/Slider/Slider.utils.tsx +19 -19
  241. package/src/components/organisms/Slider/index.ts +1 -1
  242. package/src/components/organisms/Tabs/Tabs.component.tsx +88 -88
  243. package/src/components/organisms/Tabs/Tabs.interface.ts +18 -18
  244. package/src/components/organisms/Tabs/Tabs.stories.tsx +118 -118
  245. package/src/components/organisms/Tabs/Tabs.theme.ts +115 -115
  246. package/src/components/organisms/Tabs/index.ts +1 -1
  247. package/src/helpers/clickOutsideToClose.tsx +17 -17
  248. package/src/helpers/events.ts +9 -9
  249. package/src/helpers/exportCSS.tsx +27 -27
  250. package/src/helpers/getIcons.ts +5 -5
  251. package/src/helpers/isTouchDevice.tsx +11 -11
  252. package/src/helpers/useInterval.ts +25 -25
  253. package/src/helpers/useMediaMatch.tsx +26 -26
  254. package/src/helpers/uuid.ts +5 -5
  255. package/src/iconsList.json +1 -1
  256. package/src/index.ts +68 -68
  257. package/src/reportWebVitals.js +13 -13
  258. package/src/stories/Documentation/Colors.stories.tsx +46 -46
  259. package/src/stories/Documentation/Headings.stories.tsx +24 -24
  260. package/src/stories/Documentation/Icons.stories.tsx +73 -73
  261. package/src/stories/Documentation/JWT.stories.tsx +60 -60
  262. package/src/stories/Documentation/Utilities.stories.tsx +65 -65
  263. package/src/styles/Global.ts +301 -301
  264. package/src/styles/grid.ts +70 -70
  265. package/src/styles/reset.ts +47 -47
  266. package/src/styles/utilities.ts +374 -374
  267. package/src/styles/variables.ts +180 -180
  268. 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
+ }