trepur_components 2.3.3 → 2.3.5

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 (254) hide show
  1. package/.eslintrc.cjs +43 -0
  2. package/.husky/pre-commit +4 -0
  3. package/.prettierrc.json +22 -0
  4. package/archive/Breadcrumbs/Breadcrumbs.stories.tsx +46 -0
  5. package/archive/Breadcrumbs/index.tsx +42 -0
  6. package/archive/BreadcrumbsBordered/BreadcrumbsBordered.stories.tsx +52 -0
  7. package/archive/BreadcrumbsBordered/index.tsx +44 -0
  8. package/archive/BreadcrumbsItem/BreadcrumbsItem.stories.tsx +40 -0
  9. package/archive/BreadcrumbsItem/index.tsx +149 -0
  10. package/archive/Button/Button.stories.tsx +150 -0
  11. package/archive/Button/index.tsx +111 -0
  12. package/archive/Button/style.module.css +76 -0
  13. package/archive/Calendar/Calendar.stories.tsx +82 -0
  14. package/archive/Calendar/index.tsx +76 -0
  15. package/archive/Calendar/style.css +233 -0
  16. package/archive/Card/Card.stories.tsx +75 -0
  17. package/archive/Card/index.tsx +102 -0
  18. package/archive/Card/style.module.css +75 -0
  19. package/archive/CardWithTopImage/CardWithTopImage.stories.tsx +50 -0
  20. package/archive/CardWithTopImage/index.tsx +39 -0
  21. package/archive/CardWithTopImage/style.module.css +11 -0
  22. package/archive/Carousel/Carousel.stories.tsx +451 -0
  23. package/archive/Carousel/index.tsx +388 -0
  24. package/archive/Carousel/style.module.css +99 -0
  25. package/archive/CarouselThumbnail/CarouselThumbnail.stories.tsx +350 -0
  26. package/archive/CarouselThumbnail/index.tsx +302 -0
  27. package/archive/CarouselThumbnail/style.module.css +67 -0
  28. package/archive/Checkbox/Checkbox.mdx +33 -0
  29. package/archive/Checkbox/Checkbox.stories.tsx +34 -0
  30. package/archive/Checkbox/index.tsx +51 -0
  31. package/archive/Checkbox/style.module.css +15 -0
  32. package/archive/Collapsible/Collapsible.stories.tsx +67 -0
  33. package/archive/Collapsible/index.tsx +116 -0
  34. package/archive/Collapsible/style.module.css +47 -0
  35. package/archive/Column/Column.stories.tsx +89 -0
  36. package/archive/Column/index.tsx +119 -0
  37. package/archive/Column/style.module.css +151 -0
  38. package/archive/ComponentWrapper/ComponentWrapper.stories.tsx +40 -0
  39. package/archive/ComponentWrapper/index.tsx +55 -0
  40. package/archive/ComponentWrapper/style.module.css +40 -0
  41. package/archive/Container/Container.stories.tsx +40 -0
  42. package/archive/Container/index.tsx +24 -0
  43. package/archive/Container/style.module.css +4 -0
  44. package/archive/Counter/Counter.stories.tsx +19 -0
  45. package/archive/Counter/index.tsx +66 -0
  46. package/archive/Counter/style.module.css +19 -0
  47. package/archive/DetailUpdater/DetailUpdater.stories.tsx +96 -0
  48. package/archive/DetailUpdater/index.tsx +112 -0
  49. package/archive/DetailUpdater/style.module.css +31 -0
  50. package/archive/Dialog/Dialog.stories.tsx +131 -0
  51. package/archive/Dialog/index.tsx +91 -0
  52. package/archive/Dialog/style.module.css +44 -0
  53. package/archive/DropdownMenu/DropdownMenu.stories.tsx +59 -0
  54. package/archive/DropdownMenu/index.tsx +51 -0
  55. package/archive/DropdownMenu/style.module.css +38 -0
  56. package/archive/DynamicTextSection/DynamicTextSection.stories.tsx +74 -0
  57. package/archive/DynamicTextSection/index.tsx +36 -0
  58. package/archive/DynamicTextSection/style.module.css +0 -0
  59. package/archive/FileUploader/FilePreview.tsx +48 -0
  60. package/archive/FileUploader/FileUploader.stories.tsx +28 -0
  61. package/archive/FileUploader/index.tsx +135 -0
  62. package/archive/FileUploader/style.module.css +54 -0
  63. package/archive/FilterItem/FilterItem.stories.tsx +33 -0
  64. package/archive/FilterItem/index.tsx +101 -0
  65. package/archive/FilterItem/style.module.css +27 -0
  66. package/archive/Footer/Footer.stories.tsx +59 -0
  67. package/archive/Footer/index.tsx +50 -0
  68. package/archive/Footer/style.module.css +19 -0
  69. package/archive/FooterNav/FooterNav.stories.tsx +125 -0
  70. package/archive/FooterNav/index.tsx +57 -0
  71. package/archive/FooterNav/style.module.css +32 -0
  72. package/archive/FooterNavItem/FooterNavItem.stories.tsx +53 -0
  73. package/archive/FooterNavItem/index.tsx +80 -0
  74. package/archive/FooterNavItem/style.module.css +139 -0
  75. package/archive/Form/Form.stories.tsx +86 -0
  76. package/archive/Form/index.tsx +61 -0
  77. package/archive/Form/style.module.css +0 -0
  78. package/archive/FyreCard/FyreCard.stories.tsx +31 -0
  79. package/archive/FyreCard/index.tsx +52 -0
  80. package/archive/FyreCard/style.module.css +19 -0
  81. package/archive/Greeting/Greeting.stories.tsx +41 -0
  82. package/archive/Greeting/index.tsx +32 -0
  83. package/archive/HamburgerIcon/HamburgerIcon.stories.tsx +32 -0
  84. package/archive/HamburgerIcon/index.tsx +103 -0
  85. package/archive/HamburgerIcon/style.module.css +85 -0
  86. package/archive/HorizontalLine/HorizontalLine.stories.tsx +54 -0
  87. package/archive/HorizontalLine/index.tsx +40 -0
  88. package/archive/HorizontalLine/style.module.css +55 -0
  89. package/archive/Icon/Icon.stories.tsx +164 -0
  90. package/archive/Icon/index.tsx +115 -0
  91. package/archive/Icon/style.module.css +253 -0
  92. package/archive/IconCard/IconCard.stories.tsx +46 -0
  93. package/archive/IconCard/index.tsx +57 -0
  94. package/archive/IconCard/style.module.css +18 -0
  95. package/archive/Image/Image.stories.tsx +87 -0
  96. package/archive/Image/index.tsx +132 -0
  97. package/archive/Image/style.module.css +109 -0
  98. package/archive/ImageInfo/ImageInfo.stories.tsx +39 -0
  99. package/archive/ImageInfo/index.tsx +95 -0
  100. package/archive/ImageInfo/style.module.css +47 -0
  101. package/archive/ImageLink/ImageLink.stories.tsx +37 -0
  102. package/archive/ImageLink/index.tsx +49 -0
  103. package/archive/ImageLink/style.module.css +23 -0
  104. package/archive/ImageLinkList/ImageLinkList.stories.tsx +34 -0
  105. package/archive/ImageLinkList/index.tsx +33 -0
  106. package/archive/ImageLinkList/style.module.css +3 -0
  107. package/archive/InformationIcon/InformationIcon.stories.tsx +83 -0
  108. package/archive/InformationIcon/index.tsx +128 -0
  109. package/archive/InformationIcon/style.module.css +71 -0
  110. package/archive/InformationIconBlock/InformationIconBlock.stories.tsx +32 -0
  111. package/archive/InformationIconBlock/index.tsx +63 -0
  112. package/archive/InformationIconBlock/style.module.css +7 -0
  113. package/archive/Input/Input.stories.tsx +84 -0
  114. package/archive/Input/index.tsx +131 -0
  115. package/archive/Input/style.module.css +60 -0
  116. package/archive/Jumbotron/Jumbotron.stories.tsx +21 -0
  117. package/archive/Jumbotron/index.tsx +31 -0
  118. package/archive/Jumbotron/style.module.css +8 -0
  119. package/archive/MenuButton/MenuButton.stories.tsx +46 -0
  120. package/archive/MenuButton/index.tsx +82 -0
  121. package/archive/MenuButton/style.module.css +45 -0
  122. package/archive/Modal/Modal.stories.tsx +86 -0
  123. package/archive/Modal/index.tsx +74 -0
  124. package/archive/Modal/style.module.css +35 -0
  125. package/archive/NavItem/NavItem.stories.tsx +90 -0
  126. package/archive/NavItem/index.tsx +65 -0
  127. package/archive/NavItem/style.module.css +71 -0
  128. package/archive/NavOld/NavOld.stories.tsx +193 -0
  129. package/archive/NavOld/StickyNav.tsx +191 -0
  130. package/archive/NavOld/index.tsx +273 -0
  131. package/archive/NavOld/style.module.css +156 -0
  132. package/archive/NavTwo/Dropdown.tsx +35 -0
  133. package/archive/NavTwo/Nav.stories.tsx +38 -0
  134. package/archive/NavTwo/Sidebar.tsx +34 -0
  135. package/archive/NavTwo/StickyNav.tsx +34 -0
  136. package/archive/NavTwo/index.tsx +45 -0
  137. package/archive/NavTwo/style.module.css +35 -0
  138. package/archive/NewsCard/NewsCard.stories.tsx +72 -0
  139. package/archive/NewsCard/index.tsx +57 -0
  140. package/archive/NewsCard/style.module.css +15 -0
  141. package/archive/Pill/Pill.stories.tsx +44 -0
  142. package/archive/Pill/index.tsx +64 -0
  143. package/archive/Pill/style.module.css +32 -0
  144. package/archive/ProductCard/ProductCard.stories.tsx +61 -0
  145. package/archive/ProductCard/index.tsx +111 -0
  146. package/archive/ProductCard/style.module.css +53 -0
  147. package/archive/ProductCardV2/ProductCardV2.stories.tsx +50 -0
  148. package/archive/ProductCardV2/index.tsx +119 -0
  149. package/archive/ProductCardV2/style.module.css +59 -0
  150. package/archive/Proficiencies/Proficiencies.stories.tsx +50 -0
  151. package/archive/Proficiencies/index.tsx +63 -0
  152. package/archive/Proficiencies/style.module.css +31 -0
  153. package/archive/Profile/Profile.stories.tsx +49 -0
  154. package/archive/Profile/index.tsx +103 -0
  155. package/archive/Profile/style.module.css +47 -0
  156. package/archive/Row/Row.stories.tsx +53 -0
  157. package/archive/Row/index.tsx +23 -0
  158. package/archive/Row/style.module.css +3 -0
  159. package/archive/Search/Search.stories.tsx +63 -0
  160. package/archive/Search/index.tsx +68 -0
  161. package/archive/Search/style.module.css +23 -0
  162. package/archive/Select/Select.stories.tsx +56 -0
  163. package/archive/Select/index.tsx +106 -0
  164. package/archive/Select/style.module.css +52 -0
  165. package/archive/Showcase/Showcase.stories.tsx +30 -0
  166. package/archive/Showcase/index.tsx +75 -0
  167. package/archive/Showcase/style.module.css +47 -0
  168. package/archive/SideNav/SideNav.stories.tsx +50 -0
  169. package/archive/SideNav/index.tsx +46 -0
  170. package/archive/SideNav/style.module.css +43 -0
  171. package/archive/SocialBlock/SocialBlock.stories.tsx +58 -0
  172. package/archive/SocialBlock/index.tsx +63 -0
  173. package/archive/SocialButton/SocialButton.stories.tsx +88 -0
  174. package/archive/SocialButton/index.tsx +71 -0
  175. package/archive/SocialButton/style.module.css +77 -0
  176. package/archive/StarRating/StarRating.stories.tsx +23 -0
  177. package/archive/StarRating/index.tsx +71 -0
  178. package/archive/Testimonial/Testimonial.stories.tsx +110 -0
  179. package/archive/Testimonial/index.tsx +61 -0
  180. package/archive/Testimonial/style.module.css +27 -0
  181. package/archive/TextAndTitle/TextAndTitle.stories.tsx +70 -0
  182. package/archive/TextAndTitle/index.tsx +123 -0
  183. package/archive/TextAndTitle/style.module.css +75 -0
  184. package/archive/TextArea/TextArea.stories.tsx +55 -0
  185. package/archive/TextArea/index.tsx +125 -0
  186. package/archive/TextArea/style.module.css +60 -0
  187. package/archive/Timeline/Timeline.stories.tsx +92 -0
  188. package/archive/Timeline/index.tsx +254 -0
  189. package/archive/Timeline/style.module.css +134 -0
  190. package/archive/TimelineV2/TimelineV2.stories.tsx +95 -0
  191. package/archive/TimelineV2/index.tsx +70 -0
  192. package/archive/TimelineV2/style.module.css +28 -0
  193. package/archive/Tubestops/Tubestops.stories.tsx +42 -0
  194. package/archive/Tubestops/index.tsx +58 -0
  195. package/archive/Tubestops/style.module.css +54 -0
  196. package/archive/UserIcon/UserIcon.stories.tsx +52 -0
  197. package/archive/UserIcon/index.tsx +46 -0
  198. package/archive/UserIcon/style.module.css +19 -0
  199. package/archive/Video/Video.stories.tsx +23 -0
  200. package/archive/Video/index.tsx +47 -0
  201. package/archive/fonts/Sora/OFL.txt +93 -0
  202. package/archive/fonts/Sora/README.txt +70 -0
  203. package/archive/fonts/Sora/Sora-VariableFont_wght.ttf +0 -0
  204. package/archive/fonts/Sora/static/Sora-Bold.ttf +0 -0
  205. package/archive/fonts/Sora/static/Sora-ExtraBold.ttf +0 -0
  206. package/archive/fonts/Sora/static/Sora-ExtraLight.ttf +0 -0
  207. package/archive/fonts/Sora/static/Sora-Light.ttf +0 -0
  208. package/archive/fonts/Sora/static/Sora-Medium.ttf +0 -0
  209. package/archive/fonts/Sora/static/Sora-Regular.ttf +0 -0
  210. package/archive/fonts/Sora/static/Sora-SemiBold.ttf +0 -0
  211. package/archive/fonts/Sora/static/Sora-Thin.ttf +0 -0
  212. package/archive/theme.ts +39 -0
  213. package/archive/typography/Fonts/Fonts.stories.tsx +14 -0
  214. package/archive/typography/Fonts/Fonts.tsx +181 -0
  215. package/lib/components/Accordion/index.js +10 -10
  216. package/lib/components/AlertBar/index.js +10 -10
  217. package/lib/components/index.d.ts +4 -0
  218. package/lib/index.js +1 -7
  219. package/lib/styles/base.css +1 -0
  220. package/package.json +6 -8
  221. package/postcss.config.js +8 -0
  222. package/src/components/Accordion/Accordion.stories.tsx +116 -0
  223. package/src/components/Accordion/index.tsx +30 -0
  224. package/src/components/AlertBar/AlertBar.stories.tsx +95 -0
  225. package/src/components/AlertBar/index.tsx +115 -0
  226. package/src/components/Avatar/Avatar.stories.tsx +19 -0
  227. package/src/components/Avatar/index.tsx +495 -0
  228. package/src/components/index.ts +119 -0
  229. package/src/documentation/Colours.mdx +192 -0
  230. package/src/documentation/Introduction.mdx +9 -0
  231. package/src/index.ts +1 -0
  232. package/src/styles/base.css +117 -0
  233. package/src/utils/controls.ts +44 -0
  234. package/src/utils/matchMedia.ts +9 -0
  235. package/src/utils/screens.ts +7 -0
  236. package/svg.d.ts +4 -0
  237. package/tailwind.config.ts +81 -0
  238. package/tsconfig.json +43 -0
  239. package/tsconfig.node.json +12 -0
  240. package/vite.config.mjs +64 -0
  241. package/lib/archive/Breadcrumbs/index.js +0 -12
  242. package/lib/archive/BreadcrumbsBordered/index.js +0 -25
  243. package/lib/archive/BreadcrumbsItem/index.js +0 -117
  244. package/lib/src/components/index.d.ts +0 -7
  245. /package/lib/{src/components → components}/Accordion/Accordion.stories.d.ts +0 -0
  246. /package/lib/{src/components → components}/Accordion/index.d.ts +0 -0
  247. /package/lib/{src/components → components}/AlertBar/AlertBar.stories.d.ts +0 -0
  248. /package/lib/{src/components → components}/AlertBar/index.d.ts +0 -0
  249. /package/lib/{src/components → components}/Avatar/Avatar.stories.d.ts +0 -0
  250. /package/lib/{src/components → components}/Avatar/index.d.ts +0 -0
  251. /package/lib/{src/index.d.ts → index.d.ts} +0 -0
  252. /package/lib/{src/utils → utils}/controls.d.ts +0 -0
  253. /package/lib/{src/utils → utils}/matchMedia.d.ts +0 -0
  254. /package/lib/{src/utils → utils}/screens.d.ts +0 -0
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+
3
+ import classNames from 'classnames';
4
+
5
+
6
+
7
+ export interface Props {
8
+ id?: string;
9
+ className?: string;
10
+ children: any;
11
+ visible?: boolean;
12
+ }
13
+
14
+ export const Sidebar = ({
15
+ id,
16
+ className,
17
+ children,
18
+ visible = false,
19
+ }: Props): JSX.Element => {
20
+ const sideNavClasses = classNames(
21
+ {
22
+ [style.sideBarCollapsed]: !visible,
23
+ [style.sideBarExpanded]: visible,
24
+ },
25
+ style.sideNavClassList,
26
+ className,
27
+ );
28
+
29
+ return (
30
+ <div id={id} className={sideNavClasses}>
31
+ {children}
32
+ </div>
33
+ );
34
+ };
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+
3
+ import classNames from 'classnames';
4
+
5
+
6
+
7
+ export interface Props {
8
+ id?: string;
9
+ className?: string;
10
+ children: any;
11
+ visible?: boolean;
12
+ }
13
+
14
+ export const StickyNav = ({
15
+ id,
16
+ className,
17
+ children,
18
+ visible = false,
19
+ }: Props): JSX.Element => {
20
+ const classList = classNames(
21
+ {
22
+ [style.showStickyNav]: visible,
23
+ },
24
+ className,
25
+ style.stickyNav,
26
+ 'theme-local',
27
+ );
28
+
29
+ return (
30
+ <div id={`sticky_${id ?? 'nav'}`} className={classList}>
31
+ {children}
32
+ </div>
33
+ );
34
+ };
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+
3
+ import classNames from 'classnames';
4
+
5
+ import { Dropdown } from './Dropdown';
6
+ import { Sidebar } from './Sidebar';
7
+ import { StickyNav } from './StickyNav';
8
+
9
+
10
+ export interface Props {
11
+ id?: string;
12
+ className?: string;
13
+ children: any;
14
+ mobileNavExpanded?: boolean;
15
+ }
16
+
17
+ const Nav = ({
18
+ id,
19
+ className,
20
+ children,
21
+ mobileNavExpanded,
22
+ }: Props): JSX.Element => {
23
+ const classList = classNames(className, style.nav, 'theme-local');
24
+
25
+ return (
26
+ <div>
27
+ <div
28
+ className={classNames(
29
+ style.defaultNavClasses,
30
+ [mobileNavExpanded] && style.navOpen,
31
+ [!mobileNavExpanded] && style.navClosed,
32
+ )}
33
+ />
34
+ <header id={id} className={classList}>
35
+ {children}
36
+ </header>
37
+ </div>
38
+ );
39
+ };
40
+
41
+ export default Nav;
42
+
43
+ Nav.Dropdown = Dropdown;
44
+ Nav.Sidebar = Sidebar;
45
+ Nav.Sticky = StickyNav;
@@ -0,0 +1,35 @@
1
+ .defaultNavClasses {
2
+ @apply fixed bottom-0 left-0 right-0 top-0 z-50 h-full w-full bg-primary transition-opacity duration-700;
3
+ }
4
+
5
+ .navOpen {
6
+ @apply visible opacity-100;
7
+ }
8
+
9
+ .navClosed {
10
+ @apply invisible opacity-0;
11
+ }
12
+
13
+ .stickyNav {
14
+ @apply fixed top-0 z-40 w-full overflow-hidden opacity-0 transition-all duration-500;
15
+ }
16
+
17
+ .showStickyNav {
18
+ @apply opacity-100 transition-all duration-1000;
19
+ }
20
+
21
+ .dropDownCollapsed {
22
+ @apply hidden h-0;
23
+ }
24
+
25
+ .sideNavClassList {
26
+ @apply fixed z-50 h-full overflow-hidden duration-700 md:hidden;
27
+ }
28
+
29
+ .sideBarCollapsed {
30
+ @apply w-0;
31
+ }
32
+
33
+ .sideBarExpanded {
34
+ @apply h-screen w-full sm:w-1/3;
35
+ }
@@ -0,0 +1,72 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { idAndClassName } from '@utils/controls';
3
+
4
+ import NewsCard from '.';
5
+
6
+ const meta = {
7
+ title: 'Components/News Card',
8
+ component: NewsCard,
9
+ parameters: {},
10
+ argTypes: {
11
+ ...idAndClassName,
12
+ title: {
13
+ description: '',
14
+ control: 'text',
15
+ table: {
16
+ category: '',
17
+ },
18
+ },
19
+ content: {
20
+ description: '',
21
+ control: 'text',
22
+ table: {
23
+ category: '',
24
+ },
25
+ },
26
+ imageProps: {
27
+ type: { name: 'other', value: 'object' },
28
+ description: 'The props to pass to the image to display on the component',
29
+ table: {
30
+ type: {
31
+ summary: 'object',
32
+ },
33
+ defaultValue: { summary: 'undefined' },
34
+ },
35
+ },
36
+ buttonProps: {
37
+ description: '',
38
+ control: 'text',
39
+ table: {
40
+ category: '',
41
+ },
42
+ },
43
+ rounded: {
44
+ description: '',
45
+ control: 'text',
46
+ table: {
47
+ category: '',
48
+ },
49
+ },
50
+ },
51
+ args: {
52
+ title: 'This is a title',
53
+ content:
54
+ 'This is some content that will only be displayed if the collapsible item is expanded and will dissappear when the collapsible item is collapsed.',
55
+ rounded: true,
56
+ imageProps: {
57
+ src: 'https://picsum.photos/400/200',
58
+ rounded: true,
59
+ },
60
+ buttonProps: {
61
+ children: 'Button',
62
+ className: 'w-full',
63
+ href: '/',
64
+ },
65
+ },
66
+ };
67
+
68
+ export default meta;
69
+
70
+ type Story = StoryObj<typeof meta>;
71
+
72
+ export const Default: Story = {};
@@ -0,0 +1,57 @@
1
+ import React from 'react';
2
+
3
+ import Button, { type Props as buttonProps } from '@components/Button';
4
+ import Image, { type Props as imageProps } from '@components/Image';
5
+ import classNames from 'classnames';
6
+
7
+
8
+
9
+ export interface Props {
10
+ id?: string;
11
+ className?: string;
12
+ title?: string;
13
+ content?: string;
14
+ imageProps?: imageProps;
15
+ buttonProps?: buttonProps;
16
+ rounded?: boolean;
17
+ }
18
+
19
+ const NewsCard = ({
20
+ id,
21
+ className,
22
+ title,
23
+ content,
24
+ imageProps,
25
+ buttonProps,
26
+ rounded,
27
+ }: Props): JSX.Element => {
28
+ const classList = classNames(
29
+ {
30
+ [style.rounded]: rounded,
31
+ },
32
+ className,
33
+ style.classList,
34
+ 'theme-local',
35
+ );
36
+
37
+ const src = imageProps?.src !== undefined ? imageProps.src : '';
38
+
39
+ return (
40
+ <div id={id} className={classList}>
41
+ <div>
42
+ <Image src={src} {...imageProps} />
43
+ </div>
44
+ <div className={classNames(style.contentWrapper, 'expandable')}>
45
+ <p>{title}</p>
46
+ <p>{content}</p>
47
+ {buttonProps !== undefined && (
48
+ <div className={style.buttonWrapper}>
49
+ <Button {...buttonProps}>{buttonProps.children}</Button>
50
+ </div>
51
+ )}
52
+ </div>
53
+ </div>
54
+ );
55
+ };
56
+
57
+ export default NewsCard;
@@ -0,0 +1,15 @@
1
+ .rounded {
2
+ @apply rounded-lg;
3
+ }
4
+
5
+ .classList {
6
+ @apply flex border p-2;
7
+ }
8
+
9
+ .contentWrapper {
10
+ @apply flex w-auto flex-col justify-between text-center;
11
+ }
12
+
13
+ .buttonWrapper {
14
+ @apply px-8;
15
+ }
@@ -0,0 +1,44 @@
1
+ import { action } from '@storybook/addon-actions';
2
+ import { Meta, StoryObj } from '@storybook/react';
3
+ import { idAndClassName } from '@utils/controls';
4
+
5
+ import Pill from '.';
6
+
7
+ const meta = {
8
+ title: 'Components/Pill',
9
+ component: Pill,
10
+ argTypes: {
11
+ ...idAndClassName,
12
+ text: {
13
+ type: { name: 'string', required: false },
14
+ description: 'The text to display in the component',
15
+ table: {
16
+ type: { summary: 'string' },
17
+ },
18
+ },
19
+ onClick: {
20
+ type: { name: 'function', required: false },
21
+ description:
22
+ 'An on click handle to execute when clicking on the component',
23
+ table: {
24
+ type: { summary: 'function' },
25
+ },
26
+ },
27
+ dismissOnClick: {
28
+ type: { name: 'boolean', required: false },
29
+ description: 'To toggle the disappearance of the component on click',
30
+ table: {
31
+ type: { summary: 'boolean' },
32
+ },
33
+ },
34
+ },
35
+ args: {
36
+ text: 'This is a pill',
37
+ onClick: action('pill clicked'),
38
+ },
39
+ };
40
+ export default meta;
41
+
42
+ type Story = StoryObj<typeof meta>;
43
+
44
+ export const Default: Story = {};
@@ -0,0 +1,64 @@
1
+ import React, { useState } from 'react';
2
+
3
+ import Icon from '@components/Icon';
4
+ import classNames from 'classnames';
5
+
6
+
7
+
8
+ export interface Props {
9
+ id?: string;
10
+ className?: string;
11
+ text: string;
12
+ onClick?: () => void;
13
+ dismissOnClick?: boolean;
14
+ }
15
+
16
+ const Pill = ({
17
+ id,
18
+ className,
19
+ text,
20
+ onClick,
21
+ dismissOnClick = false,
22
+ }: Props): JSX.Element => {
23
+ const [shouldDisplay, setShouldDisplay] = useState(true);
24
+
25
+ const classList = classNames(
26
+ {
27
+ [style.hidden]: !shouldDisplay,
28
+ [style.wrapperPadding]: !dismissOnClick,
29
+ [style.wrapperPaddingDismiss]: dismissOnClick,
30
+ },
31
+ className,
32
+ [style.wrapperClasses],
33
+ 'theme-local',
34
+ );
35
+
36
+ const handleOnClick = (): void => {
37
+ if (dismissOnClick) {
38
+ setShouldDisplay(false);
39
+ }
40
+ onClick?.();
41
+ };
42
+
43
+ return shouldDisplay ? (
44
+ <button id={id} className={classList} onClick={handleOnClick}>
45
+ <div className={style.classes}>
46
+ <p>{text}</p>
47
+ {dismissOnClick && (
48
+ <Icon
49
+ className={style.icon}
50
+ type="multiply"
51
+ bgColour="white"
52
+ hoverBgColour="white"
53
+ colour="primary"
54
+ hoverColour="primary"
55
+ />
56
+ )}
57
+ </div>
58
+ </button>
59
+ ) : (
60
+ <></>
61
+ );
62
+ };
63
+
64
+ export default Pill;
@@ -0,0 +1,32 @@
1
+ .wrapperClasses {
2
+ @apply rounded-full border-2 py-1;
3
+ @apply inline-block border-primary text-primary;
4
+ }
5
+
6
+ .wrapperPadding {
7
+ @apply px-4;
8
+ }
9
+
10
+ .wrapperPaddingDismiss {
11
+ @apply pl-4 pr-1;
12
+ }
13
+
14
+ .classes {
15
+ @apply flex;
16
+ }
17
+
18
+ .icon {
19
+ @apply ml-2 rounded-full;
20
+ }
21
+
22
+ .visible {
23
+ @apply opacity-100;
24
+ }
25
+
26
+ .invisible {
27
+ @apply opacity-0;
28
+ }
29
+
30
+ .hidden {
31
+ @apply invisible;
32
+ }
@@ -0,0 +1,61 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { idAndClassName } from '@utils/controls';
3
+
4
+ import ProductCard from '.';
5
+
6
+ const meta = {
7
+ title: 'Components/ProductCard',
8
+ component: ProductCard,
9
+ argTypes: {
10
+ ...idAndClassName,
11
+ imageProps: {
12
+ description: '',
13
+ table: {},
14
+ },
15
+ videoProps: {
16
+ description: '',
17
+ table: {},
18
+ },
19
+ title: {
20
+ description: 'The title to display on the component',
21
+ table: {},
22
+ },
23
+ subTitle: {
24
+ description: 'The subtitle to display on the component',
25
+ table: {},
26
+ },
27
+ description: {
28
+ description: 'The description to display on the component',
29
+ table: {},
30
+ },
31
+ href: {
32
+ description:
33
+ 'The link to send the user to when clicking on the component',
34
+ table: {},
35
+ },
36
+ target: {
37
+ description: '',
38
+ table: {},
39
+ },
40
+ buttonProps: {
41
+ description: '',
42
+ table: {},
43
+ },
44
+ },
45
+ args: {
46
+ imageProps: {
47
+ src: 'https://picsum.photos/500/300',
48
+ },
49
+ title: 'This is a title',
50
+ textLineOne: 'Text line 1',
51
+ textLineTwo: 'Text Line 2',
52
+ textLineThree: 'Text line 3',
53
+ ctaText: 'Add to bag',
54
+ },
55
+ };
56
+
57
+ export default meta;
58
+
59
+ type Story = StoryObj<typeof meta>;
60
+
61
+ export const Default: Story = {};
@@ -0,0 +1,111 @@
1
+ import React, { useState } from 'react';
2
+
3
+ import Button from '@components/Button';
4
+ import Icon from '@components/Icon';
5
+ import { type Props as imageProps } from '@components/Image';
6
+ import classNames from 'classnames';
7
+
8
+ import Counter from '../Counter';
9
+
10
+
11
+ export interface Props {
12
+ id?: string;
13
+ className?: string;
14
+ title?: string;
15
+ imageProps?: imageProps;
16
+ textLineOne?: string;
17
+ textLineTwo?: string;
18
+ textLineThree?: string;
19
+ count?: number;
20
+ ctaText: string;
21
+ isEditable?: boolean;
22
+ ctaOnClick?: () => void;
23
+ onEditClick?: () => void;
24
+ onCounterClick?: (count: number) => void;
25
+ }
26
+
27
+ const ProductCard: React.FC<Props> = ({
28
+ id,
29
+ className,
30
+ imageProps,
31
+ title,
32
+ textLineOne,
33
+ textLineTwo,
34
+ textLineThree,
35
+ count,
36
+ ctaText,
37
+ isEditable = false,
38
+ ctaOnClick,
39
+ onEditClick,
40
+ onCounterClick,
41
+ }: Props): JSX.Element => {
42
+ const [isHovering, setIsHovering] = useState(false);
43
+ const ProductCardTitleClasses = classNames(style.title);
44
+ const ProductCardSubTitleClassList = classNames(style.subtitle);
45
+ const classList = classNames(
46
+ className,
47
+ style.classList,
48
+ 'absolute theme-local',
49
+ );
50
+ const imageClassList = classNames(style.imageClassList);
51
+
52
+ return (
53
+ <div
54
+ id={id}
55
+ className={classList}
56
+ onMouseOver={() => {
57
+ setIsHovering(true);
58
+ }}
59
+ onMouseOut={() => {
60
+ setIsHovering(false);
61
+ }}
62
+ >
63
+ <div className="relative">
64
+ <img className={imageClassList} {...imageProps} />
65
+ {isEditable && (
66
+ <div className={style.editButton}>
67
+ <Button type="icon" variant="secondary" onClick={onEditClick}>
68
+ <Icon type="pencil" />
69
+ </Button>
70
+ </div>
71
+ )}
72
+ </div>
73
+
74
+ <div className={style.content}>
75
+ {!isHovering && (
76
+ <div className={style.contentWrapper}>
77
+ {title !== undefined && (
78
+ <h3 className={ProductCardTitleClasses}>{title}</h3>
79
+ )}
80
+ {textLineOne !== undefined && (
81
+ <h4 className={ProductCardSubTitleClassList}>{textLineOne}</h4>
82
+ )}
83
+ {textLineTwo !== undefined && (
84
+ <h4 className={ProductCardSubTitleClassList}>{textLineTwo}</h4>
85
+ )}
86
+ {textLineThree !== undefined && (
87
+ <h4 className={ProductCardSubTitleClassList}>{textLineThree}</h4>
88
+ )}
89
+ </div>
90
+ )}
91
+ {isHovering && (
92
+ <div className={style.hoverContentWrapper}>
93
+ <div className={style.buttonWrapper}>
94
+ <Button onClick={ctaOnClick}>{ctaText}</Button>
95
+ {count !== undefined && (
96
+ <Counter
97
+ count={count}
98
+ onClick={(newCount: number) => {
99
+ onCounterClick?.(newCount);
100
+ }}
101
+ />
102
+ )}
103
+ </div>
104
+ </div>
105
+ )}
106
+ </div>
107
+ </div>
108
+ );
109
+ };
110
+
111
+ export default ProductCard;
@@ -0,0 +1,53 @@
1
+ .classList {
2
+ @apply flex flex-col;
3
+ @apply rounded-lg;
4
+ @apply shadow-xl;
5
+ max-width: 380px;
6
+ }
7
+
8
+ .imageClassList {
9
+ @apply h-full w-full object-cover;
10
+ @apply h-96 overflow-hidden;
11
+ @apply rounded-t-lg;
12
+ }
13
+
14
+ .content {
15
+ height: 150px;
16
+ @apply overflow-hidden;
17
+ }
18
+
19
+ .contentWrapper {
20
+ @apply h-full;
21
+ @apply bg-white;
22
+ @apply mt-0 p-6;
23
+ @apply rounded-b-lg;
24
+ @apply transition-all duration-300;
25
+ }
26
+
27
+ .title {
28
+ @apply text-md font-medium;
29
+ }
30
+
31
+ .subtitle {
32
+ @apply text-sm font-regular;
33
+ }
34
+
35
+ .description {
36
+ @apply pb-6 text-sm font-light;
37
+ }
38
+
39
+ .hoverContentWrapper {
40
+ @apply flex h-full text-center;
41
+ @apply bg-white;
42
+ @apply mt-0 p-6;
43
+ @apply rounded-b-lg;
44
+ @apply transition-all duration-300;
45
+ }
46
+
47
+ .buttonWrapper {
48
+ @apply mx-auto my-auto;
49
+ }
50
+
51
+ .editButton {
52
+ @apply absolute right-2 top-2;
53
+ }