trepur_components 2.3.7 → 2.3.9

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 (335) hide show
  1. package/.eslintrc.cjs +33 -4
  2. package/.prettierignore +10 -0
  3. package/README.md +1 -1
  4. package/package.json +9 -5
  5. package/src/components/Accordion/Accordion.stories.tsx +21 -98
  6. package/src/components/Accordion/const.tsx +34 -0
  7. package/src/components/Accordion/index.tsx +19 -25
  8. package/src/components/AlertBar/AlertBar.stories.tsx +78 -84
  9. package/src/components/AlertBar/index.tsx +69 -100
  10. package/src/components/Avatar/Avatar.stories.tsx +2 -7
  11. package/src/components/Avatar/index.tsx +4 -7
  12. package/src/components/Breadcrumbs/Breadcrumbs.stories.tsx +29 -0
  13. package/src/components/Breadcrumbs/index.tsx +89 -0
  14. package/src/components/Button/Button.stories.tsx +24 -0
  15. package/src/components/Button/index.tsx +59 -0
  16. package/src/components/Calendar/Calendar.stories.tsx +21 -0
  17. package/src/components/Calendar/index.tsx +92 -0
  18. package/src/components/Card/Card.stories.tsx +14 -0
  19. package/src/components/Card/index.tsx +39 -0
  20. package/src/components/Carousel/Carousel.stories.tsx +44 -0
  21. package/src/components/Carousel/index.tsx +301 -0
  22. package/src/components/Carousel/utils.ts +53 -0
  23. package/src/components/CarouselThumbnail/CarouselThumbnail.stories.tsx +29 -0
  24. package/src/components/CarouselThumbnail/const.ts +17 -0
  25. package/src/components/CarouselThumbnail/index.tsx +169 -0
  26. package/src/components/CarouselThumbnail/utils.ts +87 -0
  27. package/src/components/Checkbox/Checkbox.stories.tsx +27 -0
  28. package/src/components/Checkbox/index.tsx +44 -0
  29. package/src/components/Collapsible/Collapsible.stories.tsx +67 -0
  30. package/src/components/Collapsible/index.tsx +169 -0
  31. package/src/components/Counter/Counter.stories.tsx +20 -0
  32. package/src/components/Counter/index.tsx +98 -0
  33. package/src/components/DetailUpdater/DetailUpdater.stories.tsx +37 -0
  34. package/{archive → src/components}/DetailUpdater/index.tsx +20 -25
  35. package/src/components/Dialog/Dialog.stories.tsx +65 -0
  36. package/src/components/Dialog/index.tsx +29 -0
  37. package/src/components/Dropdown/Dropdown.stories.tsx +22 -0
  38. package/src/components/Dropdown/index.tsx +117 -0
  39. package/src/components/Dropdown/utils.ts +15 -0
  40. package/{archive → src/components}/FileUploader/FilePreview.tsx +11 -14
  41. package/src/components/FileUploader/FileUploader.stories.tsx +28 -0
  42. package/src/components/FileUploader/index.tsx +177 -0
  43. package/src/components/Footer/Footer.stories.tsx +47 -0
  44. package/src/components/Footer/index.tsx +96 -0
  45. package/src/components/FooterNav/FooterNav.stories.tsx +32 -0
  46. package/src/components/FooterNav/index.tsx +75 -0
  47. package/{archive → src/components}/Form/Form.stories.tsx +2 -2
  48. package/src/components/Form/index.tsx +41 -0
  49. package/src/components/Gallery/Gallery.stories.tsx +39 -0
  50. package/src/components/Gallery/index.tsx +31 -0
  51. package/src/components/Greeting/Greeting.stories.tsx +16 -0
  52. package/src/components/Greeting/index.tsx +49 -0
  53. package/src/components/HamburgerIcon/HamburgerIcon.stories.tsx +14 -0
  54. package/src/components/HamburgerIcon/index.tsx +75 -0
  55. package/src/components/Icon/Icon.stories.tsx +41 -0
  56. package/src/components/Icon/index.tsx +33 -0
  57. package/src/components/Image/Image.stories.tsx +17 -0
  58. package/src/components/Image/index.tsx +25 -0
  59. package/src/components/ImageCard/ImageCard.stories.tsx +29 -0
  60. package/src/components/ImageCard/index.tsx +75 -0
  61. package/src/components/Input/Input.stories.tsx +25 -0
  62. package/src/components/Input/index.tsx +139 -0
  63. package/{archive → src/components}/MenuButton/MenuButton.stories.tsx +2 -2
  64. package/src/components/MenuButton/index.tsx +66 -0
  65. package/{archive → src/components}/Modal/Modal.stories.tsx +4 -8
  66. package/{archive → src/components}/Modal/index.tsx +9 -12
  67. package/src/components/Nav/Nav.stories.tsx +80 -0
  68. package/src/components/Nav/index.tsx +171 -0
  69. package/src/components/NavItem/NavItem.stories.tsx +17 -0
  70. package/src/components/NavItem/index.tsx +39 -0
  71. package/src/components/Pill/Pill.stories.tsx +51 -0
  72. package/src/components/Pill/index.tsx +69 -0
  73. package/{archive → src/components}/Search/Search.stories.tsx +2 -2
  74. package/{archive → src/components}/Search/index.tsx +12 -16
  75. package/{archive → src/components}/Select/Select.stories.tsx +2 -3
  76. package/{archive → src/components}/Select/index.tsx +21 -30
  77. package/{archive → src/components}/Showcase/Showcase.stories.tsx +4 -3
  78. package/src/components/Showcase/index.tsx +62 -0
  79. package/{archive → src/components}/SideNav/SideNav.stories.tsx +2 -2
  80. package/{archive → src/components}/SideNav/index.tsx +8 -15
  81. package/{archive → src/components}/SocialButton/SocialButton.stories.tsx +2 -2
  82. package/{archive → src/components}/SocialButton/index.tsx +14 -22
  83. package/src/components/SplitCard/SplitCard.stories.tsx +34 -0
  84. package/src/components/SplitCard/index.tsx +132 -0
  85. package/src/components/Stars/Star.stories.tsx +18 -0
  86. package/src/components/Stars/index.tsx +38 -0
  87. package/src/components/Testimonial/Testimonial.stories.tsx +37 -0
  88. package/src/components/Testimonial/index.tsx +123 -0
  89. package/src/components/TextArea/TextArea.stories.tsx +24 -0
  90. package/src/components/TextArea/index.tsx +133 -0
  91. package/src/components/Timeline/Timeline.stories.tsx +45 -0
  92. package/src/components/Timeline/index.tsx +65 -0
  93. package/src/components/Tubestops/Tubestops.stories.tsx +22 -0
  94. package/src/components/Tubestops/index.tsx +132 -0
  95. package/src/components/Video/Video.stories.tsx +58 -0
  96. package/src/components/Video/assets/example.mp4 +0 -0
  97. package/src/components/Video/assets/example.ogv +0 -0
  98. package/src/components/Video/assets/example.webm +0 -0
  99. package/src/components/Video/index.tsx +92 -0
  100. package/src/components/index.ts +66 -112
  101. package/src/custom.d.ts +14 -0
  102. package/src/documentation/Colours.mdx +34 -34
  103. package/src/documentation/Introduction.mdx +9 -5
  104. package/src/documentation/assets/index.ts +3 -0
  105. package/src/documentation/assets/trepurComponentsLogo.svg +32 -0
  106. package/src/documentation/typography/Fonts/Fonts.stories.tsx +14 -0
  107. package/src/documentation/typography/Fonts/Fonts.tsx +73 -0
  108. package/src/styles/global.css +1 -1
  109. package/src/styles/themes/local.css +91 -39
  110. package/src/styles/themes/test.css +28 -0
  111. package/src/utils/screens.ts +1 -1
  112. package/tailwind/colors.ts +53 -385
  113. package/tailwind/preset.ts +4 -0
  114. package/tailwind.config.ts +12 -80
  115. package/tsconfig.json +8 -2
  116. package/archive/Breadcrumbs/Breadcrumbs.stories.tsx +0 -46
  117. package/archive/Breadcrumbs/index.tsx +0 -42
  118. package/archive/BreadcrumbsBordered/BreadcrumbsBordered.stories.tsx +0 -52
  119. package/archive/BreadcrumbsBordered/index.tsx +0 -44
  120. package/archive/BreadcrumbsItem/BreadcrumbsItem.stories.tsx +0 -40
  121. package/archive/BreadcrumbsItem/index.tsx +0 -149
  122. package/archive/Button/Button.stories.tsx +0 -150
  123. package/archive/Button/index.tsx +0 -111
  124. package/archive/Button/style.module.css +0 -76
  125. package/archive/Calendar/Calendar.stories.tsx +0 -82
  126. package/archive/Calendar/index.tsx +0 -76
  127. package/archive/Card/Card.stories.tsx +0 -75
  128. package/archive/Card/index.tsx +0 -102
  129. package/archive/Card/style.module.css +0 -75
  130. package/archive/CardWithTopImage/CardWithTopImage.stories.tsx +0 -50
  131. package/archive/CardWithTopImage/index.tsx +0 -39
  132. package/archive/CardWithTopImage/style.module.css +0 -11
  133. package/archive/Carousel/Carousel.stories.tsx +0 -451
  134. package/archive/Carousel/index.tsx +0 -388
  135. package/archive/Carousel/style.module.css +0 -99
  136. package/archive/CarouselThumbnail/CarouselThumbnail.stories.tsx +0 -350
  137. package/archive/CarouselThumbnail/index.tsx +0 -302
  138. package/archive/CarouselThumbnail/style.module.css +0 -67
  139. package/archive/Checkbox/Checkbox.stories.tsx +0 -34
  140. package/archive/Checkbox/index.tsx +0 -51
  141. package/archive/Checkbox/style.module.css +0 -15
  142. package/archive/Collapsible/Collapsible.stories.tsx +0 -67
  143. package/archive/Collapsible/index.tsx +0 -116
  144. package/archive/Collapsible/style.module.css +0 -47
  145. package/archive/Column/Column.stories.tsx +0 -89
  146. package/archive/Column/index.tsx +0 -119
  147. package/archive/Column/style.module.css +0 -151
  148. package/archive/ComponentWrapper/ComponentWrapper.stories.tsx +0 -40
  149. package/archive/ComponentWrapper/index.tsx +0 -55
  150. package/archive/ComponentWrapper/style.module.css +0 -40
  151. package/archive/Container/Container.stories.tsx +0 -40
  152. package/archive/Container/index.tsx +0 -24
  153. package/archive/Container/style.module.css +0 -4
  154. package/archive/Counter/Counter.stories.tsx +0 -19
  155. package/archive/Counter/index.tsx +0 -66
  156. package/archive/Counter/style.module.css +0 -19
  157. package/archive/DetailUpdater/DetailUpdater.stories.tsx +0 -96
  158. package/archive/DetailUpdater/style.module.css +0 -31
  159. package/archive/Dialog/Dialog.stories.tsx +0 -131
  160. package/archive/Dialog/index.tsx +0 -91
  161. package/archive/Dialog/style.module.css +0 -44
  162. package/archive/DropdownMenu/DropdownMenu.stories.tsx +0 -59
  163. package/archive/DropdownMenu/index.tsx +0 -51
  164. package/archive/DropdownMenu/style.module.css +0 -38
  165. package/archive/DynamicTextSection/DynamicTextSection.stories.tsx +0 -74
  166. package/archive/DynamicTextSection/index.tsx +0 -36
  167. package/archive/DynamicTextSection/style.module.css +0 -0
  168. package/archive/FileUploader/FileUploader.stories.tsx +0 -28
  169. package/archive/FileUploader/index.tsx +0 -135
  170. package/archive/FileUploader/style.module.css +0 -54
  171. package/archive/FilterItem/FilterItem.stories.tsx +0 -33
  172. package/archive/FilterItem/index.tsx +0 -101
  173. package/archive/FilterItem/style.module.css +0 -27
  174. package/archive/Footer/Footer.stories.tsx +0 -59
  175. package/archive/Footer/index.tsx +0 -50
  176. package/archive/Footer/style.module.css +0 -19
  177. package/archive/FooterNav/FooterNav.stories.tsx +0 -125
  178. package/archive/FooterNav/index.tsx +0 -57
  179. package/archive/FooterNav/style.module.css +0 -32
  180. package/archive/FooterNavItem/FooterNavItem.stories.tsx +0 -53
  181. package/archive/FooterNavItem/index.tsx +0 -80
  182. package/archive/FooterNavItem/style.module.css +0 -139
  183. package/archive/Form/index.tsx +0 -61
  184. package/archive/Form/style.module.css +0 -0
  185. package/archive/FyreCard/FyreCard.stories.tsx +0 -31
  186. package/archive/FyreCard/index.tsx +0 -52
  187. package/archive/FyreCard/style.module.css +0 -19
  188. package/archive/Greeting/Greeting.stories.tsx +0 -41
  189. package/archive/Greeting/index.tsx +0 -32
  190. package/archive/HamburgerIcon/HamburgerIcon.stories.tsx +0 -32
  191. package/archive/HamburgerIcon/index.tsx +0 -103
  192. package/archive/HamburgerIcon/style.module.css +0 -85
  193. package/archive/HorizontalLine/HorizontalLine.stories.tsx +0 -54
  194. package/archive/HorizontalLine/index.tsx +0 -40
  195. package/archive/HorizontalLine/style.module.css +0 -55
  196. package/archive/Icon/Icon.stories.tsx +0 -164
  197. package/archive/Icon/index.tsx +0 -115
  198. package/archive/Icon/style.module.css +0 -253
  199. package/archive/IconCard/IconCard.stories.tsx +0 -46
  200. package/archive/IconCard/index.tsx +0 -57
  201. package/archive/IconCard/style.module.css +0 -18
  202. package/archive/Image/Image.stories.tsx +0 -87
  203. package/archive/Image/index.tsx +0 -132
  204. package/archive/Image/style.module.css +0 -109
  205. package/archive/ImageInfo/ImageInfo.stories.tsx +0 -39
  206. package/archive/ImageInfo/index.tsx +0 -95
  207. package/archive/ImageInfo/style.module.css +0 -47
  208. package/archive/ImageLink/ImageLink.stories.tsx +0 -37
  209. package/archive/ImageLink/index.tsx +0 -49
  210. package/archive/ImageLink/style.module.css +0 -23
  211. package/archive/ImageLinkList/ImageLinkList.stories.tsx +0 -34
  212. package/archive/ImageLinkList/index.tsx +0 -33
  213. package/archive/ImageLinkList/style.module.css +0 -3
  214. package/archive/InformationIcon/InformationIcon.stories.tsx +0 -83
  215. package/archive/InformationIcon/index.tsx +0 -128
  216. package/archive/InformationIcon/style.module.css +0 -71
  217. package/archive/InformationIconBlock/InformationIconBlock.stories.tsx +0 -32
  218. package/archive/InformationIconBlock/index.tsx +0 -63
  219. package/archive/InformationIconBlock/style.module.css +0 -7
  220. package/archive/Input/Input.stories.tsx +0 -84
  221. package/archive/Input/index.tsx +0 -131
  222. package/archive/Input/style.module.css +0 -60
  223. package/archive/Jumbotron/Jumbotron.stories.tsx +0 -21
  224. package/archive/Jumbotron/index.tsx +0 -31
  225. package/archive/Jumbotron/style.module.css +0 -8
  226. package/archive/MenuButton/index.tsx +0 -82
  227. package/archive/MenuButton/style.module.css +0 -45
  228. package/archive/Modal/style.module.css +0 -35
  229. package/archive/NavItem/NavItem.stories.tsx +0 -90
  230. package/archive/NavItem/index.tsx +0 -65
  231. package/archive/NavItem/style.module.css +0 -71
  232. package/archive/NavOld/NavOld.stories.tsx +0 -193
  233. package/archive/NavOld/StickyNav.tsx +0 -191
  234. package/archive/NavOld/index.tsx +0 -273
  235. package/archive/NavOld/style.module.css +0 -156
  236. package/archive/NavTwo/Dropdown.tsx +0 -35
  237. package/archive/NavTwo/Nav.stories.tsx +0 -38
  238. package/archive/NavTwo/Sidebar.tsx +0 -34
  239. package/archive/NavTwo/StickyNav.tsx +0 -34
  240. package/archive/NavTwo/index.tsx +0 -45
  241. package/archive/NavTwo/style.module.css +0 -35
  242. package/archive/NewsCard/NewsCard.stories.tsx +0 -72
  243. package/archive/NewsCard/index.tsx +0 -57
  244. package/archive/NewsCard/style.module.css +0 -15
  245. package/archive/Pill/Pill.stories.tsx +0 -44
  246. package/archive/Pill/index.tsx +0 -64
  247. package/archive/Pill/style.module.css +0 -32
  248. package/archive/ProductCard/ProductCard.stories.tsx +0 -61
  249. package/archive/ProductCard/index.tsx +0 -111
  250. package/archive/ProductCard/style.module.css +0 -53
  251. package/archive/ProductCardV2/ProductCardV2.stories.tsx +0 -50
  252. package/archive/ProductCardV2/index.tsx +0 -119
  253. package/archive/ProductCardV2/style.module.css +0 -59
  254. package/archive/Proficiencies/Proficiencies.stories.tsx +0 -50
  255. package/archive/Proficiencies/index.tsx +0 -63
  256. package/archive/Proficiencies/style.module.css +0 -31
  257. package/archive/Profile/Profile.stories.tsx +0 -49
  258. package/archive/Profile/index.tsx +0 -103
  259. package/archive/Profile/style.module.css +0 -47
  260. package/archive/Row/Row.stories.tsx +0 -53
  261. package/archive/Row/index.tsx +0 -23
  262. package/archive/Row/style.module.css +0 -3
  263. package/archive/Search/style.module.css +0 -23
  264. package/archive/Select/style.module.css +0 -52
  265. package/archive/Showcase/index.tsx +0 -75
  266. package/archive/Showcase/style.module.css +0 -47
  267. package/archive/SideNav/style.module.css +0 -43
  268. package/archive/SocialBlock/SocialBlock.stories.tsx +0 -58
  269. package/archive/SocialBlock/index.tsx +0 -63
  270. package/archive/SocialButton/style.module.css +0 -77
  271. package/archive/StarRating/StarRating.stories.tsx +0 -23
  272. package/archive/StarRating/index.tsx +0 -71
  273. package/archive/Testimonial/Testimonial.stories.tsx +0 -110
  274. package/archive/Testimonial/index.tsx +0 -61
  275. package/archive/Testimonial/style.module.css +0 -27
  276. package/archive/TextAndTitle/TextAndTitle.stories.tsx +0 -70
  277. package/archive/TextAndTitle/index.tsx +0 -123
  278. package/archive/TextAndTitle/style.module.css +0 -75
  279. package/archive/TextArea/TextArea.stories.tsx +0 -55
  280. package/archive/TextArea/index.tsx +0 -125
  281. package/archive/TextArea/style.module.css +0 -60
  282. package/archive/Timeline/Timeline.stories.tsx +0 -92
  283. package/archive/Timeline/index.tsx +0 -254
  284. package/archive/Timeline/style.module.css +0 -134
  285. package/archive/TimelineV2/TimelineV2.stories.tsx +0 -95
  286. package/archive/TimelineV2/index.tsx +0 -70
  287. package/archive/TimelineV2/style.module.css +0 -28
  288. package/archive/Tubestops/Tubestops.stories.tsx +0 -42
  289. package/archive/Tubestops/index.tsx +0 -58
  290. package/archive/Tubestops/style.module.css +0 -54
  291. package/archive/UserIcon/UserIcon.stories.tsx +0 -52
  292. package/archive/UserIcon/index.tsx +0 -46
  293. package/archive/UserIcon/style.module.css +0 -19
  294. package/archive/Video/Video.stories.tsx +0 -23
  295. package/archive/Video/index.tsx +0 -47
  296. package/archive/theme.ts +0 -39
  297. package/archive/typography/Fonts/Fonts.stories.tsx +0 -14
  298. package/archive/typography/Fonts/Fonts.tsx +0 -181
  299. package/lib/components/Accordion/Accordion.stories.d.ts +0 -94
  300. package/lib/components/Accordion/index.d.ts +0 -8
  301. package/lib/components/Accordion/index.js +0 -15
  302. package/lib/components/AlertBar/AlertBar.stories.d.ts +0 -162
  303. package/lib/components/AlertBar/index.d.ts +0 -12
  304. package/lib/components/AlertBar/index.js +0 -49
  305. package/lib/components/Avatar/Avatar.stories.d.ts +0 -44
  306. package/lib/components/Avatar/index.d.ts +0 -4
  307. package/lib/components/index.d.ts +0 -4
  308. package/lib/index.d.ts +0 -1
  309. package/lib/index.js +0 -6
  310. package/lib/styles/global.css +0 -75
  311. package/lib/styles/themes/local.css +0 -40
  312. package/lib/styles/themes/palette.css +0 -131
  313. package/lib/tailwind/boxShadow.ts +0 -9
  314. package/lib/tailwind/colors.ts +0 -410
  315. package/lib/tailwind/container.ts +0 -11
  316. package/lib/tailwind/preset.ts +0 -88
  317. package/lib/tailwind/spacing.ts +0 -14
  318. package/lib/utils/controls.d.ts +0 -36
  319. package/lib/utils/matchMedia.d.ts +0 -2
  320. package/lib/utils/screens.d.ts +0 -7
  321. package/src/styles/themes/palette.css +0 -131
  322. package/svg.d.ts +0 -4
  323. /package/{archive → src/components}/Calendar/style.css +0 -0
  324. /package/{archive → src/components}/Checkbox/Checkbox.mdx +0 -0
  325. /package/{archive → src}/fonts/Sora/OFL.txt +0 -0
  326. /package/{archive → src}/fonts/Sora/README.txt +0 -0
  327. /package/{archive → src}/fonts/Sora/Sora-VariableFont_wght.ttf +0 -0
  328. /package/{archive → src}/fonts/Sora/static/Sora-Bold.ttf +0 -0
  329. /package/{archive → src}/fonts/Sora/static/Sora-ExtraBold.ttf +0 -0
  330. /package/{archive → src}/fonts/Sora/static/Sora-ExtraLight.ttf +0 -0
  331. /package/{archive → src}/fonts/Sora/static/Sora-Light.ttf +0 -0
  332. /package/{archive → src}/fonts/Sora/static/Sora-Medium.ttf +0 -0
  333. /package/{archive → src}/fonts/Sora/static/Sora-Regular.ttf +0 -0
  334. /package/{archive → src}/fonts/Sora/static/Sora-SemiBold.ttf +0 -0
  335. /package/{archive → src}/fonts/Sora/static/Sora-Thin.ttf +0 -0
@@ -0,0 +1,301 @@
1
+ import {
2
+ createContext,
3
+ forwardRef,
4
+ HTMLAttributes,
5
+ useContext,
6
+ useMemo,
7
+ useState,
8
+ } from 'react';
9
+
10
+ import { Icon } from '@components/Icon';
11
+ import {
12
+ faChevronLeft,
13
+ faChevronRight,
14
+ faCircle,
15
+ } from '@fortawesome/fontawesome-free-solid';
16
+ import { Colours } from '@utils/controls';
17
+ import clsx from 'clsx';
18
+ import 'keen-slider/keen-slider.min.css';
19
+ import {
20
+ useKeenSlider,
21
+ KeenSliderInstance,
22
+ KeenSliderHooks,
23
+ KeenSliderOptions,
24
+ } from 'keen-slider/react';
25
+
26
+ import { WheelControls } from './utils';
27
+
28
+ export interface ArrowProps {
29
+ rightArrow?: boolean;
30
+ visible?: boolean;
31
+ disabled?: boolean;
32
+ onClick?: any;
33
+ }
34
+
35
+ export interface DotProps {
36
+ isActive?: boolean;
37
+ visible?: boolean;
38
+ onClick?: any;
39
+ }
40
+
41
+ export interface CarouselContextProps {
42
+ sliderRef?: any;
43
+ instanceRef?: any;
44
+ currentSlide?: number;
45
+ slideWrapperClassName?: string;
46
+ breakpoints?: Record<
47
+ string,
48
+ Omit<KeenSliderOptions<{}, {}, KeenSliderHooks>, 'breakpoints'>
49
+ >;
50
+ defaultAnimation?: { duration?: number; easing?: (t: number) => number };
51
+ disabled: boolean;
52
+ drag?: boolean;
53
+ dragSpeed?: number;
54
+ initial?: number;
55
+ loop?: boolean;
56
+ mode?: 'snap' | 'free' | 'free-snap';
57
+ range?: { align?: boolean; min?: number; max?: number };
58
+ renderMode?: 'precision' | 'performance' | 'custom';
59
+ rtl?: boolean;
60
+ rubberband?: boolean;
61
+ slides?: any[];
62
+ vertical?: boolean;
63
+ animationStarted?: (
64
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
65
+ ) => void;
66
+ animationStopped?: (
67
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
68
+ ) => void;
69
+ animationEnded?: (
70
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
71
+ ) => void;
72
+ created?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
73
+ destroyed?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
74
+ detailsChanged?: (
75
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
76
+ ) => void;
77
+ dragged?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
78
+ dragStarted?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
79
+ dragChecked?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
80
+ dragEnded?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
81
+ beforeOptionsChanged?: (
82
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
83
+ ) => void;
84
+ optionsChanged?: (
85
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
86
+ ) => void;
87
+ slideChanged?: boolean;
88
+ updated?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
89
+ perView?: number;
90
+ spacing?: number;
91
+ number?: number;
92
+ origin?: number | 'auto' | 'center';
93
+ arrows?: ArrowProps;
94
+ dots?: DotProps;
95
+ }
96
+
97
+ const CarouselContext = createContext<CarouselContextProps | null>(null);
98
+
99
+ const CarouselComponent = forwardRef<
100
+ HTMLDivElement,
101
+ HTMLAttributes<HTMLDivElement> & CarouselContextProps
102
+ >(
103
+ (
104
+ {
105
+ breakpoints,
106
+ children,
107
+ className,
108
+ loop,
109
+ perView,
110
+ rubberband,
111
+ spacing,
112
+ ...props
113
+ },
114
+ ref,
115
+ ) => {
116
+ const [currentSlide, setCurrentSlide] = useState(1);
117
+ const [loaded, setLoaded] = useState(false);
118
+ const [sliderRef, instanceRef] = useKeenSlider<HTMLDivElement>(
119
+ {
120
+ breakpoints,
121
+ loop,
122
+ rubberband,
123
+ slideChanged(slider) {
124
+ setCurrentSlide(slider.track.details.rel);
125
+ },
126
+ created() {
127
+ setLoaded(true);
128
+ },
129
+ slides: {
130
+ spacing,
131
+ perView,
132
+ },
133
+ },
134
+ [WheelControls],
135
+ );
136
+
137
+ const state = useMemo(
138
+ () => ({
139
+ sliderRef,
140
+ instanceRef,
141
+ currentSlide,
142
+ setCurrentSlide,
143
+ perView,
144
+ ...props,
145
+ }),
146
+ [
147
+ props,
148
+ sliderRef,
149
+ instanceRef.current,
150
+ currentSlide,
151
+ setCurrentSlide,
152
+ perView,
153
+ loaded,
154
+ ],
155
+ );
156
+
157
+ const onKeyDown = (e: any): void => {
158
+ if (e.key === 'Tab') {
159
+ instanceRef.current?.next();
160
+ }
161
+ };
162
+
163
+ return (
164
+ <CarouselContext.Provider value={state}>
165
+ <div
166
+ onKeyDown={onKeyDown}
167
+ className={clsx('navigation-wrapper w-full', className)}
168
+ ref={ref}
169
+ {...props}
170
+ >
171
+ {children}
172
+ </div>
173
+ </CarouselContext.Provider>
174
+ );
175
+ },
176
+ );
177
+
178
+ const CarouselContent = forwardRef<
179
+ HTMLDivElement,
180
+ HTMLAttributes<HTMLDivElement>
181
+ >(({ children, className, ...props }, ref) => {
182
+ return (
183
+ <div
184
+ ref={ref}
185
+ className={clsx(
186
+ 'navigation-wrapper flex w-full justify-between gap-4',
187
+ className,
188
+ )}
189
+ {...props}
190
+ >
191
+ {children}
192
+ </div>
193
+ );
194
+ });
195
+
196
+ const CarouselSlides = forwardRef<
197
+ HTMLDivElement,
198
+ HTMLAttributes<HTMLDivElement> & { rightArrow?: boolean }
199
+ >(({ className, children, rightArrow = false, ...props }) => {
200
+ const { sliderRef } = useContext(CarouselContext) || {};
201
+ return (
202
+ <div
203
+ ref={sliderRef}
204
+ className={clsx('keen-slider w-full pb-4', className)}
205
+ {...props}
206
+ >
207
+ {children}
208
+ </div>
209
+ );
210
+ });
211
+
212
+ const CarouselArrow = forwardRef<
213
+ HTMLDivElement,
214
+ HTMLAttributes<HTMLDivElement> & ArrowProps
215
+ >(({ className, children, rightArrow = false, ...props }, ref) => {
216
+ const { instanceRef } = useContext(CarouselContext) || {};
217
+ return (
218
+ <div
219
+ ref={ref}
220
+ className={clsx(
221
+ 'my-auto text-carousel-arrow-default hover:cursor-pointer hover:text-carousel-arrow-hover',
222
+ className,
223
+ )}
224
+ onClick={(e: any) => {
225
+ rightArrow
226
+ ? e.stopPropagation() !== undefined || instanceRef.current?.next()
227
+ : e.stopPropagation() !== undefined || instanceRef.current?.prev();
228
+ }}
229
+ {...props}
230
+ >
231
+ <a>
232
+ <Icon icon={rightArrow ? faChevronRight : faChevronLeft} size="3x" />
233
+ </a>
234
+ </div>
235
+ );
236
+ });
237
+
238
+ const CarouselDots = forwardRef<
239
+ HTMLButtonElement,
240
+ HTMLAttributes<HTMLButtonElement> & DotProps
241
+ >(({ className, children, onClick, ...props }, ref) => {
242
+ const {
243
+ instanceRef,
244
+ loop,
245
+ currentSlide = 1,
246
+ perView = 1,
247
+ } = useContext(CarouselContext) || {};
248
+ const length = instanceRef?.current?.track?.details?.slides?.length;
249
+ return (
250
+ <div className="flex justify-center">
251
+ {[...Array(length).keys()].map((idx) => {
252
+ const numberOfSlides =
253
+ instanceRef?.current?.track?.details?.slides?.length ?? 1;
254
+
255
+ const isActive = !loop
256
+ ? currentSlide === idx
257
+ : currentSlide + perView <= numberOfSlides
258
+ ? idx >= currentSlide && idx < currentSlide + perView
259
+ : idx >= currentSlide ||
260
+ currentSlide + perView - numberOfSlides - 1 >= idx;
261
+
262
+ return (
263
+ <button
264
+ ref={ref}
265
+ type="button"
266
+ onClick={() => {
267
+ instanceRef.current?.moveToIdx(idx);
268
+ }}
269
+ aria-label={`carousel-button${props.id ? `-${props.id}` : ''}`}
270
+ >
271
+ <Icon
272
+ className={clsx(
273
+ 'hover:text-carousel-dots-hover',
274
+ isActive
275
+ ? 'text-carousel-dots-active'
276
+ : 'text-carousel-dots-default',
277
+ )}
278
+ icon={faCircle}
279
+ size="2x"
280
+ />
281
+ </button>
282
+ );
283
+ })}
284
+ </div>
285
+ );
286
+ });
287
+
288
+ CarouselComponent.displayName = 'Carousel';
289
+ CarouselContent.displayName = 'Carousel.Content';
290
+ CarouselArrow.displayName = 'Carousel.Arrow';
291
+ CarouselDots.displayName = 'Carousel.Dots';
292
+ CarouselSlides.displayName = 'Carousel.Slides';
293
+
294
+ const Carousel = Object.assign(CarouselComponent, {
295
+ Content: CarouselContent,
296
+ Arrow: CarouselArrow,
297
+ Dots: CarouselDots,
298
+ Slides: CarouselSlides,
299
+ });
300
+
301
+ export { Carousel };
@@ -0,0 +1,53 @@
1
+ export function WheelControls(slider: any): void {
2
+ let touchTimeout: any;
3
+ let position: any;
4
+ let wheelActive: boolean;
5
+
6
+ function dispatch(e: any, name: string): void {
7
+ position.x -= e.deltaX;
8
+ position.y -= e.deltaY;
9
+ slider.container.dispatchEvent(
10
+ new CustomEvent(name, {
11
+ detail: {
12
+ x: position.x,
13
+ y: position.y,
14
+ },
15
+ }),
16
+ );
17
+ }
18
+
19
+ function wheelStart(e: any): void {
20
+ position = {
21
+ x: e.pageX,
22
+ y: e.pageY,
23
+ };
24
+ dispatch(e, 'ksDragStart');
25
+ }
26
+
27
+ function wheel(e: any): void {
28
+ dispatch(e, 'ksDrag');
29
+ }
30
+
31
+ function wheelEnd(e: any): void {
32
+ dispatch(e, 'ksDragEnd');
33
+ }
34
+
35
+ function eventWheel(e: any): void {
36
+ if (!wheelActive) {
37
+ wheelStart(e);
38
+ wheelActive = true;
39
+ }
40
+ wheel(e);
41
+ clearTimeout(touchTimeout);
42
+ touchTimeout = setTimeout(() => {
43
+ wheelActive = false;
44
+ wheelEnd(e);
45
+ }, 50);
46
+ }
47
+
48
+ slider.on('created', () => {
49
+ slider.container.addEventListener('wheel', eventWheel, {
50
+ passive: true,
51
+ });
52
+ });
53
+ }
@@ -0,0 +1,29 @@
1
+ import { CarouselThumbnail } from './';
2
+ import { Meta, StoryObj } from '@storybook/react';
3
+
4
+ const meta = {
5
+ title: 'V2Components/CarouselThumbnail',
6
+ component: CarouselThumbnail,
7
+ args: {
8
+ children: [
9
+ <CarouselThumbnail.Slides>
10
+ <CarouselThumbnail.Slide src="https://picsum.photos/500/500" />
11
+ <CarouselThumbnail.Slide src="https://picsum.photos/501/500" />
12
+ <CarouselThumbnail.Slide src="https://picsum.photos/502/500" />
13
+ <CarouselThumbnail.Slide src="https://picsum.photos/503/500" />
14
+ <CarouselThumbnail.Slide src="https://picsum.photos/504/500" />
15
+ <CarouselThumbnail.Slide src="https://picsum.photos/505/500" />
16
+ </CarouselThumbnail.Slides>,
17
+ ],
18
+ loop: true,
19
+ drag: true,
20
+ rubberband: true,
21
+ spacing: 16,
22
+ },
23
+ } satisfies Meta<typeof CarouselThumbnail>;
24
+
25
+ export default meta;
26
+
27
+ type Story = StoryObj<typeof CarouselThumbnail>;
28
+
29
+ export const Default: Story = {};
@@ -0,0 +1,17 @@
1
+ export const breakpointsToRender: any = {
2
+ '(min-width: 320px)': {
3
+ slides: { perView: 1, spacing: 25 },
4
+ },
5
+ '(max-width: 500px)': {
6
+ slides: { perView: 1, spacing: 25 },
7
+ },
8
+ '(min-width: 768px)': {
9
+ slides: { perView: 1, spacing: 25 },
10
+ },
11
+ '(min-width: 1024px)': {
12
+ slides: { perView: 2, spacing: 20 },
13
+ },
14
+ '(min-width: 1280px)': {
15
+ slides: { perView: 2, spacing: 10 },
16
+ },
17
+ };
@@ -0,0 +1,169 @@
1
+ import {
2
+ createContext,
3
+ forwardRef,
4
+ HTMLAttributes,
5
+ useContext,
6
+ useMemo,
7
+ } from 'react';
8
+
9
+ import clsx from 'clsx';
10
+ import 'keen-slider/keen-slider.min.css';
11
+ import {
12
+ useKeenSlider,
13
+ KeenSliderInstance,
14
+ KeenSliderHooks,
15
+ KeenSliderOptions,
16
+ } from 'keen-slider/react';
17
+
18
+ import { breakpointsToRender } from './const';
19
+ import { ThumbnailPlugin, WheelControls } from './utils';
20
+
21
+ export interface CarouselThumbnailContextProps {
22
+ slideWrapperClassName?: string;
23
+ breakpoints?: Record<
24
+ string,
25
+ Omit<KeenSliderOptions<{}, {}, KeenSliderHooks>, 'breakpoints'>
26
+ >;
27
+ defaultAnimation?: { duration?: number; easing?: (t: number) => number };
28
+ disabled?: boolean;
29
+ drag?: boolean;
30
+ dragSpeed?: number;
31
+ initial?: number;
32
+ loop?: boolean;
33
+ mode?: 'snap' | 'free' | 'free-snap';
34
+ range?: { align?: boolean; min?: number; max?: number };
35
+ renderMode?: 'precision' | 'performance' | 'custom';
36
+ rtl?: boolean;
37
+ rubberband?: boolean;
38
+ slides?: any[];
39
+ vertical?: boolean;
40
+ animationStarted?: (
41
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
42
+ ) => void;
43
+ animationStopped?: (
44
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
45
+ ) => void;
46
+ animationEnded?: (
47
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
48
+ ) => void;
49
+ created?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
50
+ destroyed?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
51
+ detailsChanged?: (
52
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
53
+ ) => void;
54
+ dragged?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
55
+ dragStarted?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
56
+ dragChecked?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
57
+ dragEnded?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
58
+ beforeOptionsChanged?: (
59
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
60
+ ) => void;
61
+ optionsChanged?: (
62
+ slider: KeenSliderInstance<{}, {}, KeenSliderHooks>,
63
+ ) => void;
64
+ slideChanged?: boolean;
65
+ updated?: (slider: KeenSliderInstance<{}, {}, KeenSliderHooks>) => void;
66
+ spacing?: number;
67
+ number?: number;
68
+ origin?: number | 'auto' | 'center';
69
+ }
70
+
71
+ const CarouselThumbnailContext =
72
+ createContext<CarouselThumbnailContextProps | null>(null);
73
+
74
+ const CarouselThumbnailComponent = forwardRef<
75
+ HTMLDivElement,
76
+ HTMLAttributes<HTMLDivElement> & CarouselThumbnailContextProps
77
+ >(({ children, className, ...props }, ref) => {
78
+ const state = useMemo(
79
+ () => ({
80
+ ...props,
81
+ }),
82
+ [props],
83
+ );
84
+
85
+ return (
86
+ <CarouselThumbnailContext.Provider value={state}>
87
+ <div
88
+ ref={ref}
89
+ className={clsx('navigation-wrapper w-full', className)}
90
+ {...props}
91
+ >
92
+ {children}
93
+ </div>
94
+ </CarouselThumbnailContext.Provider>
95
+ );
96
+ });
97
+
98
+ const CarouselThumbnailSlides = forwardRef<
99
+ HTMLDivElement,
100
+ HTMLAttributes<HTMLDivElement>
101
+ >(({ className, children }) => {
102
+ const { rubberband, loop, ...props } =
103
+ useContext(CarouselThumbnailContext) || {};
104
+
105
+ const [sliderRef, instanceRef] = useKeenSlider<HTMLDivElement>(
106
+ {
107
+ breakpoints: breakpointsToRender,
108
+ loop,
109
+ rubberband,
110
+ },
111
+ [WheelControls],
112
+ );
113
+
114
+ const [thumbnailRef] = useKeenSlider(
115
+ {
116
+ initial: 0,
117
+ slides: {
118
+ perView: 4,
119
+ spacing: 10,
120
+ },
121
+ },
122
+ [ThumbnailPlugin(instanceRef)],
123
+ );
124
+
125
+ return (
126
+ <>
127
+ <div
128
+ ref={sliderRef}
129
+ className={clsx(
130
+ 'keen-slider h-96 w-full rounded-t-2xl pb-4',
131
+ className,
132
+ )}
133
+ {...props}
134
+ >
135
+ {children}
136
+ </div>
137
+ <div>
138
+ <div ref={thumbnailRef} className={'keen-slider thumbnail h-24 w-16'}>
139
+ {children}
140
+ </div>
141
+ </div>
142
+ </>
143
+ );
144
+ });
145
+
146
+ const CarouselThumbnailSlide = forwardRef<
147
+ HTMLImageElement,
148
+ HTMLAttributes<HTMLImageElement> & { src: string }
149
+ >(({ src, ...props }) => {
150
+ return (
151
+ <img
152
+ className={`keen-slider__slide rounded-t-2xl object-cover`}
153
+ src={src}
154
+ {...props}
155
+ />
156
+ );
157
+ });
158
+
159
+ CarouselThumbnailComponent.displayName = 'CarouselThumbnail';
160
+ CarouselThumbnailSlides.displayName = 'CarouselThumbnail.Slides';
161
+
162
+ CarouselThumbnailSlide.displayName = 'CarouselThumbnail.Slide';
163
+
164
+ const CarouselThumbnail = Object.assign(CarouselThumbnailComponent, {
165
+ Slides: CarouselThumbnailSlides,
166
+ Slide: CarouselThumbnailSlide,
167
+ });
168
+
169
+ export { CarouselThumbnail };
@@ -0,0 +1,87 @@
1
+ export function WheelControls(slider: any): void {
2
+ let touchTimeout: any;
3
+ let position: any;
4
+ let wheelActive: boolean;
5
+
6
+ function dispatch(e: any, name: string): void {
7
+ position.x -= e.deltaX;
8
+ position.y -= e.deltaY;
9
+ slider.container.dispatchEvent(
10
+ new CustomEvent(name, {
11
+ detail: {
12
+ x: position.x,
13
+ y: position.y,
14
+ },
15
+ }),
16
+ );
17
+ }
18
+
19
+ function wheelStart(e: any): void {
20
+ position = {
21
+ x: e.pageX,
22
+ y: e.pageY,
23
+ };
24
+ dispatch(e, 'ksDragStart');
25
+ }
26
+
27
+ function wheel(e: any): void {
28
+ dispatch(e, 'ksDrag');
29
+ }
30
+
31
+ function wheelEnd(e: any): void {
32
+ dispatch(e, 'ksDragEnd');
33
+ }
34
+
35
+ function eventWheel(e: any): void {
36
+ if (!wheelActive) {
37
+ wheelStart(e);
38
+ wheelActive = true;
39
+ }
40
+ wheel(e);
41
+ clearTimeout(touchTimeout);
42
+ touchTimeout = setTimeout(() => {
43
+ wheelActive = false;
44
+ wheelEnd(e);
45
+ }, 50);
46
+ }
47
+
48
+ slider.on('created', () => {
49
+ slider.container.addEventListener('wheel', eventWheel, {
50
+ passive: true,
51
+ });
52
+ });
53
+ }
54
+
55
+ export function ThumbnailPlugin(mainRef: any) {
56
+ return (slider: any) => {
57
+ function removeActive(): void {
58
+ slider.slides.forEach((slide: any) => {
59
+ slide.classList.remove('active');
60
+ });
61
+ }
62
+
63
+ function addActive(idx: number): void {
64
+ slider.slides[idx].classList.add('active');
65
+ }
66
+
67
+ function addClickEvents(): void {
68
+ slider.slides.forEach((slide: any, idx: number) => {
69
+ slide.addEventListener('click', () => {
70
+ if (mainRef.current) mainRef.current.moveToIdx(idx);
71
+ });
72
+ });
73
+ }
74
+
75
+ slider.on('created', () => {
76
+ if (!mainRef.current) return;
77
+ addActive(slider.track.details.rel);
78
+ addClickEvents();
79
+ mainRef.current.on('animationStarted', (main: any) => {
80
+ removeActive();
81
+ const next = main.animator.targetIdx || 0;
82
+ addActive(main.track.absToRel(next));
83
+ slider.moveToIdx(Math.min(slider.track.details.maxIdx, next));
84
+ });
85
+ });
86
+ };
87
+ }
@@ -0,0 +1,27 @@
1
+ import { Checkbox } from './';
2
+ import { action } from '@storybook/addon-actions';
3
+ import { StoryObj, Meta } from '@storybook/react';
4
+
5
+ const meta = {
6
+ title: 'V2Components/Checkbox',
7
+ component: Checkbox,
8
+ args: {
9
+ onClick: action('clicked'),
10
+ children: [<Checkbox.Label>Label</Checkbox.Label>],
11
+ },
12
+ } satisfies Meta<typeof Checkbox>;
13
+
14
+ export default meta;
15
+ type Story = StoryObj<typeof Checkbox>;
16
+
17
+ export const Checked: Story = {
18
+ args: {
19
+ checked: true,
20
+ },
21
+ };
22
+
23
+ export const Unchecked: Story = {
24
+ args: {
25
+ checked: false,
26
+ },
27
+ };