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,117 @@
1
+ import {
2
+ useState,
3
+ forwardRef,
4
+ HTMLAttributes,
5
+ useContext,
6
+ createContext,
7
+ useMemo,
8
+ useRef,
9
+ } from 'react';
10
+
11
+ import { Button } from '../';
12
+ import { ButtonProps } from '@components/Button';
13
+ import { faChevronDown } from '@fortawesome/fontawesome-free-solid';
14
+
15
+ import { useClickOutside } from './utils';
16
+
17
+ export interface DropdownContextProps {
18
+ showDropdown?: boolean;
19
+ setShowDropdown?: (val: boolean) => void;
20
+ }
21
+
22
+ const DropdownContext = createContext<DropdownContextProps | null>(null);
23
+
24
+ const DropdownComponent = forwardRef<
25
+ HTMLDivElement,
26
+ HTMLAttributes<HTMLDivElement>
27
+ >(({ children }) => {
28
+ const [showDropdown, setShowDropdown] = useState(false);
29
+ const ref = useRef<HTMLDivElement>(null);
30
+
31
+ const state = useMemo(
32
+ () => ({
33
+ showDropdown,
34
+ setShowDropdown,
35
+ }),
36
+ [showDropdown, setShowDropdown],
37
+ );
38
+
39
+ useClickOutside(ref, () => {
40
+ setShowDropdown(false);
41
+ });
42
+
43
+ return (
44
+ <DropdownContext.Provider value={state}>
45
+ <div ref={ref} className="relative inline-block text-left">
46
+ {children}
47
+ </div>
48
+ </DropdownContext.Provider>
49
+ );
50
+ });
51
+
52
+ const DropdownLabel = forwardRef<
53
+ HTMLButtonElement,
54
+ HTMLAttributes<HTMLButtonElement> & ButtonProps
55
+ >(({ children }) => {
56
+ const { showDropdown, setShowDropdown } = useContext(DropdownContext) || {};
57
+ return (
58
+ <Button onClick={() => setShowDropdown?.(!showDropdown)}>
59
+ {children}
60
+ <Button.Icon icon={faChevronDown} />
61
+ </Button>
62
+ );
63
+ });
64
+
65
+ const DropdownList = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
66
+ ({ children }) => {
67
+ const { showDropdown } = useContext(DropdownContext) || {};
68
+ if (!showDropdown) return <div></div>;
69
+ return (
70
+ <div
71
+ className="z-50 mt-2 w-48 rounded-lg border-2 bg-primary text-white"
72
+ role="menu"
73
+ aria-orientation="vertical"
74
+ aria-labelledby="menu-button"
75
+ >
76
+ <ul className="py-1 text-sm">{children}</ul>
77
+ </div>
78
+ );
79
+ },
80
+ );
81
+
82
+ const DropdownItem = forwardRef<HTMLLIElement, HTMLAttributes<HTMLLIElement>>(
83
+ ({ children, onClick }) => {
84
+ const { showDropdown, setShowDropdown } = useContext(DropdownContext) || {};
85
+ return (
86
+ <li
87
+ className="px-4 py-2"
88
+ onClick={(e) => {
89
+ const target = e?.target as HTMLElement;
90
+ // onClick?.(target?.parentNode?.textContent ?? '');
91
+ setShowDropdown?.(false);
92
+ }}
93
+ onKeyDown={(e) => {
94
+ if (e.key === 'Enter') {
95
+ const target = e?.target as HTMLElement;
96
+ // onClick?.(target?.parentNode?.textContent ?? '');
97
+ }
98
+ }}
99
+ >
100
+ {children}
101
+ </li>
102
+ );
103
+ },
104
+ );
105
+
106
+ DropdownComponent.displayName = 'Dropdown';
107
+ DropdownLabel.displayName = 'Dropdown.Label';
108
+ DropdownList.displayName = 'Dropdown.List';
109
+ DropdownItem.displayName = 'Dropdown.Item';
110
+
111
+ const Dropdown = Object.assign(DropdownComponent, {
112
+ Label: DropdownLabel,
113
+ List: DropdownList,
114
+ Item: DropdownItem,
115
+ });
116
+
117
+ export { Dropdown };
@@ -0,0 +1,15 @@
1
+ import { useEffect } from 'react';
2
+
3
+ export function useClickOutside(ref: any, onClickOutside: () => void) {
4
+ useEffect(() => {
5
+ function handleClickOutside(event: MouseEvent) {
6
+ if (ref.current && !ref.current.contains(event.target)) {
7
+ onClickOutside();
8
+ }
9
+ }
10
+ document.addEventListener('mousedown', handleClickOutside);
11
+ return () => {
12
+ document.removeEventListener('mousedown', handleClickOutside);
13
+ };
14
+ }, [ref, onClickOutside]);
15
+ }
@@ -1,22 +1,18 @@
1
- import React from 'react';
2
-
3
1
  import classNames from 'classnames';
4
2
 
5
-
6
-
7
- interface Props {
3
+ interface FilePreviewProps {
8
4
  id?: string;
9
5
  className?: string;
10
6
  fileData?: any;
11
7
  onDismiss?: (e: any) => void;
12
8
  }
13
9
 
14
- const FileUploader: React.FC<Props> = ({
10
+ export const FilePreview = ({
15
11
  id,
16
12
  className,
17
13
  fileData,
18
14
  onDismiss,
19
- }) => {
15
+ }: FilePreviewProps) => {
20
16
  const handleDismiss = (fileName: string): void => {
21
17
  onDismiss?.(fileName);
22
18
  };
@@ -24,19 +20,22 @@ const FileUploader: React.FC<Props> = ({
24
20
  return (
25
21
  <ul
26
22
  id={id}
27
- className={classNames(className, style.fileList, 'theme-local')}
23
+ className={classNames(className, 'flex w-full flex-wrap px-8 pt-4')}
28
24
  >
29
25
  {fileData?.map((file: any) => {
30
26
  return (
31
- <li key={file.lastModified} className={classNames(style.file)}>
27
+ <li
28
+ key={file.lastModified}
29
+ className="mx-2 cursor-pointer rounded-2xl border bg-secondary text-white hover:bg-primary"
30
+ >
32
31
  <div
33
- className={style.nameWrapper}
32
+ className="flex w-full justify-between px-4 py-1"
34
33
  onClick={() => {
35
34
  handleDismiss(file.name);
36
35
  }}
37
36
  >
38
- <p className={style.name}>{file.name}</p>
39
- <p className={style.dismiss}>x</p>
37
+ <p>{file.name}</p>
38
+ <p className="ml-2 cursor-pointer">x</p>
40
39
  </div>
41
40
  </li>
42
41
  );
@@ -44,5 +43,3 @@ const FileUploader: React.FC<Props> = ({
44
43
  </ul>
45
44
  );
46
45
  };
47
-
48
- export default FileUploader;
@@ -0,0 +1,28 @@
1
+ import { FileUploader } from './';
2
+ import { action } from '@storybook/addon-actions';
3
+ import { Meta, StoryObj } from '@storybook/react';
4
+ import { idAndClassName } from '@utils/controls';
5
+
6
+ const meta = {
7
+ title: 'V2Components/FileUploader',
8
+ component: FileUploader,
9
+ argTypes: {
10
+ ...idAndClassName,
11
+ },
12
+ args: {
13
+ children: [
14
+ <FileUploader.Input>You can select multiple Files</FileUploader.Input>,
15
+ <FileUploader.Text>or drag & drop your files here</FileUploader.Text>,
16
+ <FileUploader.FilePreview />,
17
+ ],
18
+ onDrop: (files: any) => {
19
+ action('files:')(files[0].name);
20
+ },
21
+ },
22
+ } satisfies Meta<typeof FileUploader>;
23
+
24
+ export default meta;
25
+
26
+ type Story = StoryObj<typeof FileUploader>;
27
+
28
+ export const Default: Story = {};
@@ -0,0 +1,177 @@
1
+ import {
2
+ createContext,
3
+ forwardRef,
4
+ HTMLAttributes,
5
+ useContext,
6
+ useMemo,
7
+ useState,
8
+ } from 'react';
9
+
10
+ import { FilePreview } from './FilePreview';
11
+
12
+ export interface FileUploaderContextProps {
13
+ fileList?: any;
14
+ setFileList: (open: any) => void;
15
+ inDropZone?: boolean;
16
+ setInDropZone?: (val: boolean) => void;
17
+ onDrop: React.DragEventHandler<HTMLDivElement> | undefined;
18
+ }
19
+
20
+ const FileUploaderContext = createContext<FileUploaderContextProps | null>(
21
+ null,
22
+ );
23
+
24
+ const FileUploaderComponent = forwardRef<
25
+ HTMLDivElement,
26
+ HTMLAttributes<HTMLDivElement> & FileUploaderContextProps
27
+ >(({ children, onDrop }, ref) => {
28
+ const [inDropZone, setInDropZone] = useState(false);
29
+ const [fileList, setFileList] = useState<any>([]);
30
+
31
+ const state = useMemo(
32
+ () => ({
33
+ onDrop,
34
+ inDropZone,
35
+ setInDropZone,
36
+ fileList,
37
+ setFileList,
38
+ }),
39
+ [inDropZone, setInDropZone, fileList, setFileList, onDrop],
40
+ );
41
+
42
+ const handleDragEnter = (e: any): void => {
43
+ e.preventDefault();
44
+ e.stopPropagation();
45
+ setInDropZone(true);
46
+ };
47
+
48
+ const handleDragLeave = (e: any): void => {
49
+ e.preventDefault();
50
+ e.stopPropagation();
51
+ setInDropZone(false);
52
+ };
53
+
54
+ const handleDragOver = (e: any): void => {
55
+ e.preventDefault();
56
+ e.stopPropagation();
57
+ setInDropZone(true);
58
+ };
59
+
60
+ const handleDrop = (e: any): void => {
61
+ e.preventDefault();
62
+ e.stopPropagation();
63
+
64
+ let files = [...e.dataTransfer.files];
65
+
66
+ if (files?.length > 0) {
67
+ const existingFiles = fileList?.fileList?.map((f: any) => f.name);
68
+ files = files.filter((f) => !existingFiles?.includes(f.name));
69
+
70
+ setFileList(files);
71
+ setInDropZone(false);
72
+ }
73
+ onDrop?.(files[0]);
74
+ };
75
+
76
+ return (
77
+ <FileUploaderContext.Provider value={state}>
78
+ <div
79
+ ref={ref}
80
+ className="flex flex-col items-center justify-center rounded-2xl border-4 border-dashed border-primary py-8"
81
+ onDragEnter={(e) => {
82
+ handleDragEnter(e);
83
+ }}
84
+ onDragOver={(e) => {
85
+ handleDragOver(e);
86
+ }}
87
+ onDragLeave={(e) => {
88
+ handleDragLeave(e);
89
+ }}
90
+ onDrop={(e) => {
91
+ handleDrop(e);
92
+ }}
93
+ >
94
+ {children}
95
+ </div>
96
+ </FileUploaderContext.Provider>
97
+ );
98
+ });
99
+
100
+ const FileUploaderInput = forwardRef<
101
+ HTMLDivElement,
102
+ HTMLAttributes<HTMLDivElement>
103
+ >(({ children }, ref) => {
104
+ const { onDrop, fileList, setFileList } =
105
+ useContext(FileUploaderContext) || {};
106
+
107
+ const handleFileSelect = (e: any): void => {
108
+ let files = [...e.target.files];
109
+
110
+ if (files?.length > 0) {
111
+ const existingFiles = fileList?.fileList?.map((f: any) => f.name);
112
+ files = files.filter((f) => !existingFiles?.includes(f.name));
113
+ setFileList?.(files);
114
+ onDrop?.(files[0]);
115
+ }
116
+ };
117
+
118
+ return (
119
+ <div ref={ref}>
120
+ <input
121
+ id="fileSelect"
122
+ type="file"
123
+ multiple
124
+ className="absolute mb-2 mt-4 inline-block h-px w-px cursor-pointer overflow-hidden whitespace-nowrap border-none p-0 text-center"
125
+ onChange={(e) => {
126
+ handleFileSelect(e);
127
+ }}
128
+ />
129
+ <label
130
+ className="mb-2 mt-4 inline-block cursor-pointer text-center"
131
+ htmlFor="fileSelect"
132
+ >
133
+ {children}
134
+ </label>
135
+ </div>
136
+ );
137
+ });
138
+
139
+ const FileUploaderFilePreview = forwardRef<
140
+ HTMLDivElement,
141
+ HTMLAttributes<HTMLDivElement>
142
+ >(() => {
143
+ const { fileList, setFileList } = useContext(FileUploaderContext) || {};
144
+
145
+ const handleDismiss = (fileName: string): void => {
146
+ setFileList?.(fileList.filter((file: any) => file.name !== fileName));
147
+ };
148
+
149
+ return (
150
+ <FilePreview
151
+ fileData={fileList}
152
+ onDismiss={(e: any) => {
153
+ handleDismiss(e);
154
+ }}
155
+ />
156
+ );
157
+ });
158
+
159
+ const FileUploaderText = forwardRef<
160
+ HTMLParagraphElement,
161
+ HTMLAttributes<HTMLParagraphElement>
162
+ >(({ ...props }, ref) => (
163
+ <p className="md:text-md truncate text-sm" ref={ref} {...props} />
164
+ ));
165
+
166
+ FileUploaderComponent.displayName = 'FileUploader';
167
+ FileUploaderInput.displayName = 'FileUploader.Input';
168
+ FileUploaderText.displayName = 'FileUploader.Text';
169
+ FileUploaderFilePreview.displayName = 'FileUploader.FilePreview';
170
+
171
+ const FileUploader = Object.assign(FileUploaderComponent, {
172
+ Input: FileUploaderInput,
173
+ Text: FileUploaderText,
174
+ FilePreview: FileUploaderFilePreview,
175
+ });
176
+
177
+ export { FileUploader };
@@ -0,0 +1,47 @@
1
+ import { Footer } from './';
2
+ import { Meta, StoryObj } from '@storybook/react';
3
+
4
+ const meta = {
5
+ title: 'V2Components/Footer',
6
+ component: Footer,
7
+ args: {
8
+ children: [
9
+ <Footer.Section>
10
+ <Footer.Column>
11
+ <Footer.Title>Title</Footer.Title>
12
+ <Footer.Text>
13
+ Lorem ipsum dolor sit, amet consectetur adipisicing elit. Iure hic
14
+ itaque dolore doloribus ducimus iste qui totam. Adipisci recusandae
15
+ sed voluptatum odio consequuntur, amet sint totam libero quasi
16
+ tenetur expedita?
17
+ </Footer.Text>
18
+ </Footer.Column>
19
+ <Footer.Column>
20
+ <Footer.Title>Title</Footer.Title>
21
+ <Footer.Text>
22
+ Lorem ipsum dolor sit, amet consectetur adipisicing elit. Iure hic
23
+ itaque dolore doloribus ducimus iste qui totam. Adipisci recusandae
24
+ sed voluptatum odio consequuntur, amet sint totam libero quasi
25
+ tenetur expedita?
26
+ </Footer.Text>
27
+ </Footer.Column>
28
+ <Footer.Column>
29
+ <Footer.Title>Title</Footer.Title>
30
+ <Footer.Text>
31
+ Lorem ipsum dolor sit, amet consectetur adipisicing elit. Iure hic
32
+ itaque dolore doloribus ducimus iste qui totam. Adipisci recusandae
33
+ sed voluptatum odio consequuntur, amet sint totam libero quasi
34
+ tenetur expedita?
35
+ </Footer.Text>
36
+ </Footer.Column>
37
+ </Footer.Section>,
38
+ <Footer.Bar>All right reserved</Footer.Bar>,
39
+ ],
40
+ },
41
+ } satisfies Meta<typeof Footer>;
42
+
43
+ export default meta;
44
+
45
+ type Story = StoryObj<typeof Footer>;
46
+
47
+ export const Default: Story = {};
@@ -0,0 +1,96 @@
1
+ import { forwardRef, HTMLAttributes } from 'react';
2
+
3
+ import clsx from 'clsx';
4
+
5
+ export interface Props {
6
+ id?: string;
7
+ className?: string;
8
+ text?: string;
9
+ variant?: 'light' | 'dark';
10
+ }
11
+
12
+ const FooterComponent = forwardRef<
13
+ HTMLDivElement,
14
+ HTMLAttributes<HTMLDivElement>
15
+ >(({ children, className }, ref) => {
16
+ return (
17
+ <div
18
+ ref={ref}
19
+ className={clsx(
20
+ 'grid grid-cols-1 gap-y-12 bg-footer-bg p-8 text-footer-text',
21
+ className,
22
+ )}
23
+ >
24
+ {children}
25
+ </div>
26
+ );
27
+ });
28
+
29
+ const FooterBar = forwardRef<
30
+ HTMLParagraphElement,
31
+ HTMLAttributes<HTMLParagraphElement>
32
+ >(({ children, className }, ref) => {
33
+ return (
34
+ <p ref={ref} className={clsx('text-center', className)}>
35
+ {children}
36
+ </p>
37
+ );
38
+ });
39
+
40
+ const FooterSection = forwardRef<
41
+ HTMLDivElement,
42
+ HTMLAttributes<HTMLDivElement>
43
+ >(({ children, className }, ref) => {
44
+ return (
45
+ <div ref={ref} className={clsx('grid grid-cols-3 gap-12', className)}>
46
+ {children}
47
+ </div>
48
+ );
49
+ });
50
+
51
+ const FooterColumn = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
52
+ ({ children, className }, ref) => {
53
+ return (
54
+ <div ref={ref} className={className}>
55
+ {children}
56
+ </div>
57
+ );
58
+ },
59
+ );
60
+
61
+ const FooterTitle = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
62
+ ({ children, className }, ref) => {
63
+ return (
64
+ <div ref={ref} className={className}>
65
+ {children}
66
+ </div>
67
+ );
68
+ },
69
+ );
70
+
71
+ const FooterText = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
72
+ ({ children, className }, ref) => {
73
+ return (
74
+ <div ref={ref} className={className}>
75
+ {children}
76
+ </div>
77
+ );
78
+ },
79
+ );
80
+
81
+ FooterComponent.displayName = 'Footer';
82
+ FooterBar.displayName = 'Footer.Bar';
83
+ FooterSection.displayName = 'Footer.Section';
84
+ FooterColumn.displayName = 'Footer.Column';
85
+ FooterTitle.displayName = 'Footer.Title';
86
+ FooterText.displayName = 'Footer.Text';
87
+
88
+ const Footer = Object.assign(FooterComponent, {
89
+ Bar: FooterBar,
90
+ Section: FooterSection,
91
+ Column: FooterColumn,
92
+ Title: FooterTitle,
93
+ Text: FooterText,
94
+ });
95
+
96
+ export { Footer };
@@ -0,0 +1,32 @@
1
+ import { FooterNav } from './';
2
+ import {
3
+ faHeart,
4
+ faMoon,
5
+ faSnowflake,
6
+ faStar,
7
+ faSun,
8
+ } from '@fortawesome/fontawesome-free-solid';
9
+ import { action } from '@storybook/addon-actions';
10
+ import { Meta, StoryObj } from '@storybook/react';
11
+
12
+ const meta = {
13
+ title: 'V2Components/Footer Nav',
14
+ component: FooterNav,
15
+ args: {
16
+ children: [
17
+ <FooterNav.Item>
18
+ <FooterNav.Label>Item 1</FooterNav.Label>
19
+ <FooterNav.Icon icon={faHeart} />
20
+ </FooterNav.Item>,
21
+ <FooterNav.Item>
22
+ <FooterNav.Label>Item 2</FooterNav.Label>
23
+ <FooterNav.Icon icon={faMoon} />
24
+ </FooterNav.Item>,
25
+ ],
26
+ },
27
+ } satisfies Meta<typeof FooterNav>;
28
+ export default meta;
29
+
30
+ type Story = StoryObj<typeof FooterNav>;
31
+
32
+ export const Default: Story = {};
@@ -0,0 +1,75 @@
1
+ import { forwardRef, HTMLAttributes } from 'react';
2
+
3
+ import { IconDefinition } from '@fortawesome/fontawesome-free-solid';
4
+ import { IconProp } from '@fortawesome/fontawesome-svg-core';
5
+ import clsx from 'clsx';
6
+
7
+ import { Icon } from '..';
8
+
9
+ const FooterNavComponent = forwardRef<
10
+ HTMLDivElement,
11
+ HTMLAttributes<HTMLDivElement>
12
+ >(({ className, children, ...props }, ref) => {
13
+ return (
14
+ <div
15
+ className={clsx(
16
+ 'border-lightest-grey fixed bottom-0 flex w-full justify-between border-t px-4',
17
+ className,
18
+ )}
19
+ ref={ref}
20
+ {...props}
21
+ >
22
+ {children}
23
+ </div>
24
+ );
25
+ });
26
+
27
+ const FooterNavItem = forwardRef<
28
+ HTMLDivElement,
29
+ HTMLAttributes<HTMLDivElement> & { href?: string; onClick?: any }
30
+ >(({ className, children, href, onClick, ...props }) => {
31
+ return (
32
+ <div
33
+ className={clsx(
34
+ 'group w-full cursor-pointer py-2 text-center transition-all duration-500',
35
+ className,
36
+ )}
37
+ {...props}
38
+ >
39
+ <a href={href} onClick={onClick}>
40
+ {children}
41
+ </a>
42
+ </div>
43
+ );
44
+ });
45
+
46
+ const FooterNavLabel = forwardRef<
47
+ HTMLDivElement,
48
+ HTMLAttributes<HTMLDivElement>
49
+ >(({ className, children, ...props }, ref) => {
50
+ return (
51
+ <p className={(clsx('font-regular pt-0.5 text-xs'), className)} {...props}>
52
+ {children}
53
+ </p>
54
+ );
55
+ });
56
+
57
+ const FooterNavIcon = forwardRef<
58
+ HTMLDivElement,
59
+ HTMLAttributes<HTMLDivElement> & { icon: IconDefinition | IconProp }
60
+ >(({ className, icon, ...props }) => {
61
+ return <Icon icon={icon} {...props} />;
62
+ });
63
+
64
+ FooterNavComponent.displayName = 'FooterNav';
65
+ FooterNavItem.displayName = 'FooterNav.Item';
66
+ FooterNavIcon.displayName = 'FooterNav.Icon';
67
+ FooterNavLabel.displayName = 'FooterNav.Label';
68
+
69
+ const FooterNav = Object.assign(FooterNavComponent, {
70
+ Item: FooterNavItem,
71
+ Label: FooterNavLabel,
72
+ Icon: FooterNavIcon,
73
+ });
74
+
75
+ export { FooterNav };
@@ -1,7 +1,7 @@
1
1
  import { Meta, StoryObj } from '@storybook/react';
2
2
  import { idAndClassName } from '@utils/controls';
3
3
 
4
- import Form from '.';
4
+ import { Form } from '.';
5
5
 
6
6
  const meta = {
7
7
  title: 'Components/Form',
@@ -81,6 +81,6 @@ const meta = {
81
81
 
82
82
  export default meta;
83
83
 
84
- type Story = StoryObj<typeof meta>;
84
+ type Story = StoryObj<typeof Form>;
85
85
 
86
86
  export const Default: Story = {};