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,39 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { idAndClassName } from '@utils/controls';
3
+
4
+ import ImageInfo from '.';
5
+
6
+ const meta = {
7
+ title: 'Components/Image Info',
8
+ component: ImageInfo,
9
+ argTypes: {
10
+ ...idAndClassName,
11
+
12
+ bgColour: {
13
+ type: { name: 'string', required: false },
14
+ options: ['primary', 'secondary', 'white', 'black', 'gold'],
15
+ description: 'The background colour of the component',
16
+ table: {
17
+ type: { summary: 'string' },
18
+ },
19
+ defaultValue: 'primary',
20
+ control: 'select',
21
+ },
22
+ },
23
+ args: {
24
+ // title: 'This is a title',
25
+ // description: 'what do you recon to this?',
26
+ contentTitle: 'This is a title',
27
+ text: 'Lorem ipsum dolor sit, amet consectetur adipisicing elit. Esse quia ducimus dolores exercitationem officia repudiandae maiores voluptatum iusto cum. Quae tenetur veniam quam nihil cupiditate fugiat, ratione minima illo! Cum.',
28
+ image: 'https://picsum.photos/400/200',
29
+ swapDesktop: true,
30
+ swapMobile: true,
31
+ bgColour: '#31A3DD',
32
+ },
33
+ };
34
+
35
+ export default meta;
36
+
37
+ type Story = StoryObj<typeof meta>;
38
+
39
+ export const Default: Story = {};
@@ -0,0 +1,95 @@
1
+ import React from 'react';
2
+
3
+ import Container from '@components/Container';
4
+ import { type Colours } from '@utils/controls';
5
+ import MatchMedia from '@utils/matchMedia';
6
+ import { Screens } from '@utils/screens';
7
+ import classNames from 'classnames';
8
+
9
+
10
+
11
+ export interface Props {
12
+ id: string;
13
+ className?: string;
14
+ bgColour?: Colours;
15
+ textColour?: string;
16
+ contentTitle?: string;
17
+ text?: string;
18
+ image: string;
19
+ swapDesktop?: boolean;
20
+ swapMobile?: boolean;
21
+ }
22
+
23
+ const ImageInfo: React.FC<Props> = ({
24
+ id,
25
+ className,
26
+ bgColour,
27
+ textColour = 'white',
28
+ contentTitle,
29
+ text,
30
+ image,
31
+ swapDesktop = false,
32
+ swapMobile = false,
33
+ }: Props): JSX.Element => {
34
+ const classList = className;
35
+ const mediumScreen: string = Screens.md;
36
+ const lgScreenSize: string = `(min-width: ${mediumScreen})`;
37
+ const smScreenSize: string = `(max-width: ${mediumScreen})`;
38
+ const isLg: boolean = MatchMedia(lgScreenSize);
39
+ const isSm: boolean = MatchMedia(smScreenSize);
40
+
41
+ const wrapperClassList = classNames(
42
+ {
43
+ [style.wrapper]: !swapDesktop,
44
+ [style.reverseWrapper]: swapDesktop,
45
+ [style.reverseMobileWrapper]: !isLg && swapMobile,
46
+ },
47
+ style.wrapperClasses,
48
+ 'theme-local',
49
+ );
50
+
51
+ const imageWrapperClasses = classNames(
52
+ {
53
+ [style.smallImageWrapper]: isSm,
54
+ },
55
+ style.imageWrapper,
56
+ );
57
+
58
+ const imageClasses = classNames(
59
+ {
60
+ [style.smallImageHeight]: isSm,
61
+ },
62
+ style.image,
63
+ );
64
+
65
+ return (
66
+ <div
67
+ id={id}
68
+ style={{ backgroundColor: bgColour, color: textColour }}
69
+ className={classList}
70
+ >
71
+ <Container withPadding={isLg}>
72
+ <div className={wrapperClassList}>
73
+ <div className={imageWrapperClasses}>
74
+ <img
75
+ src={image}
76
+ className={imageClasses}
77
+ alt={contentTitle}
78
+ title={contentTitle}
79
+ />
80
+ </div>
81
+ <div className={style.contentWrapper}>
82
+ <div className={style.content}>
83
+ <div>
84
+ <p className={style.title}>{contentTitle}</p>
85
+ <p className={style.text}>{text}</p>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </Container>
91
+ </div>
92
+ );
93
+ };
94
+
95
+ export default ImageInfo;
@@ -0,0 +1,47 @@
1
+ .wrapperClasses {
2
+ @apply md:flex;
3
+ }
4
+
5
+ .wrapper {
6
+ @apply md:flex-row;
7
+ }
8
+
9
+ .reverseWrapper {
10
+ @apply md:flex-row-reverse;
11
+ }
12
+
13
+ .reverseMobileWrapper {
14
+ @apply flex flex-col-reverse;
15
+ }
16
+
17
+ .imageWrapper {
18
+ @apply md:w-1/2;
19
+ }
20
+
21
+ .smallImageWrapper {
22
+ height: 100vw;
23
+ }
24
+
25
+ .smallImageHeight {
26
+ height: 100vw;
27
+ }
28
+
29
+ .image {
30
+ @apply h-full w-full object-cover;
31
+ }
32
+
33
+ .contentWrapper {
34
+ @apply md:w-1/2;
35
+ }
36
+
37
+ .content {
38
+ @apply flex h-full items-center justify-center p-8 text-center;
39
+ }
40
+
41
+ .title {
42
+ @apply text-lg font-regular;
43
+ }
44
+
45
+ .text {
46
+ @apply text-md font-light;
47
+ }
@@ -0,0 +1,37 @@
1
+ import Column from '@components/Column';
2
+ import { Meta, StoryObj } from '@storybook/react';
3
+ import { idAndClassName } from '@utils/controls';
4
+
5
+ import ImageLink from '.';
6
+
7
+ const meta = {
8
+ title: 'Components/Image Link',
9
+ component: ImageLink,
10
+ parameters: {},
11
+ argTypes: {
12
+ ...idAndClassName,
13
+ title: {
14
+ description: '',
15
+ control: 'text',
16
+ table: {
17
+ category: '',
18
+ },
19
+ },
20
+ image: {
21
+ description: '',
22
+ control: 'text',
23
+ table: {
24
+ category: '',
25
+ },
26
+ },
27
+ },
28
+ args: {
29
+ image: 'https://picsum.photos/400/400',
30
+ link: '/',
31
+ },
32
+ };
33
+ export default meta;
34
+
35
+ type Story = StoryObj<typeof meta>;
36
+
37
+ export const Default: Story = {};
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+
3
+ import Button, { type Props as buttonProps } from '@components/Button';
4
+ import classNames from 'classnames';
5
+
6
+
7
+
8
+ export interface Props {
9
+ id?: string;
10
+ className?: string;
11
+ image?: string;
12
+ altText?: string;
13
+ title?: string;
14
+ link?: string;
15
+ rounded?: boolean;
16
+ openInNewTab?: boolean;
17
+ buttonProps?: buttonProps;
18
+ }
19
+ const ImageLink = ({
20
+ id,
21
+ className,
22
+ image,
23
+ altText,
24
+ title,
25
+ link,
26
+ rounded,
27
+ openInNewTab,
28
+ buttonProps,
29
+ }: Props): JSX.Element => {
30
+ const classList = classNames(className, style.classList, 'theme-local');
31
+
32
+ const roundedClass = classNames({
33
+ [style.rounded]: rounded,
34
+ });
35
+
36
+ return (
37
+ <a id={id} href={link} {...(openInNewTab && { target: 'blank' })}>
38
+ <div className={classNames(roundedClass, classList, style.wrapper)}>
39
+ <img src={image} alt={altText} className={style.image} />
40
+ {title !== undefined && <h1 className={style.title}>{title}</h1>}
41
+ {buttonProps?.children !== undefined && (
42
+ <Button className={style.button}>{buttonProps.children}</Button>
43
+ )}
44
+ </div>
45
+ </a>
46
+ );
47
+ };
48
+
49
+ export default ImageLink;
@@ -0,0 +1,23 @@
1
+ .classList {
2
+ @apply mx-1 mb-2 cursor-pointer overflow-hidden text-center hover:opacity-50 md:mx-1 md:mb-2 lg:mx-3 lg:mb-5;
3
+ }
4
+
5
+ .rounded {
6
+ @apply rounded-full;
7
+ }
8
+
9
+ .title {
10
+ @apply absolute inset-x-0 top-0 mt-4 bg-black py-2 text-center text-white;
11
+ }
12
+
13
+ .button {
14
+ @apply absolute inset-x-0 bottom-0 mx-8 mb-4 text-center;
15
+ }
16
+
17
+ .image {
18
+ @apply h-full w-full object-cover;
19
+ }
20
+
21
+ .wrapper {
22
+ @apply relative overflow-hidden;
23
+ }
@@ -0,0 +1,34 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { idAndClassName } from '@utils/controls';
3
+
4
+ import ImageLinkList from '.';
5
+
6
+ const getLinks = (): any => {
7
+ return new Array(16).fill(null).map(() => {
8
+ return {
9
+ image: 'https://picsum.photos/400/400',
10
+ title: 'Hi',
11
+ buttonProps: {
12
+ children: <p>button</p>,
13
+ },
14
+ };
15
+ });
16
+ };
17
+
18
+ const meta = {
19
+ title: 'Components/Image Link List',
20
+ component: ImageLinkList,
21
+ parameters: {},
22
+ argTypes: {
23
+ ...idAndClassName,
24
+ },
25
+ args: {
26
+ items: getLinks(),
27
+ },
28
+ };
29
+
30
+ export default meta;
31
+
32
+ type Story = StoryObj<typeof meta>;
33
+
34
+ export const Default: Story = {};
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+
3
+ import classNames from 'classnames';
4
+
5
+ import ImageLink, { type Props as imageLinkProps } from '../ImageLink';
6
+
7
+
8
+ export interface Props {
9
+ id?: string;
10
+ className?: string;
11
+ items?: imageLinkProps[];
12
+ }
13
+
14
+ const ImageLinkList = ({ id, className, items }: Props): JSX.Element => {
15
+ const classList = classNames(className, style.classList, 'theme-local');
16
+
17
+ return (
18
+ <div id={id} className={classList}>
19
+ {items?.map((item, i: number) => {
20
+ return (
21
+ <ImageLink
22
+ key={`image_link_${i + 0}`}
23
+ altText={item.altText}
24
+ image={item.image}
25
+ title={item.title}
26
+ />
27
+ );
28
+ })}
29
+ </div>
30
+ );
31
+ };
32
+
33
+ export default ImageLinkList;
@@ -0,0 +1,3 @@
1
+ .classList {
2
+ @apply grid sm:grid-cols-2 md:grid-cols-4;
3
+ }
@@ -0,0 +1,83 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { idAndClassName } from '@utils/controls';
3
+
4
+ import InformationIcon from '.';
5
+
6
+ const meta = {
7
+ title: 'Components/Information Icon',
8
+ component: InformationIcon,
9
+ argTypes: {
10
+ ...idAndClassName,
11
+ title: {
12
+ type: { name: 'string', required: true },
13
+ description: 'The title to display on the component',
14
+ table: {
15
+ type: { summary: 'string' },
16
+ },
17
+ },
18
+ subtitle: {
19
+ type: { name: 'string', value: 'string | number' },
20
+ description: 'The subtitle to display on the component',
21
+ table: {
22
+ type: {
23
+ summary: 'string',
24
+ },
25
+ defaultValue: { summary: 'undefined' },
26
+ },
27
+ },
28
+ withAnimation: {
29
+ type: { name: 'boolean', required: false },
30
+ description: 'Enabled the counter animation on the component',
31
+ table: {
32
+ type: { summary: 'boolean' },
33
+ },
34
+ defaultValue: 'false',
35
+ },
36
+ withHoverEffect: {
37
+ type: { name: 'boolean', required: false },
38
+ description: 'Enabled the hover effect on the component',
39
+ table: {
40
+ type: { summary: 'boolean' },
41
+ },
42
+ defaultValue: 'true',
43
+ },
44
+ iconProps: {
45
+ type: { name: 'iconProps', required: false },
46
+ description: 'The props to pass to the icon to display on the component',
47
+ table: {
48
+ type: { summary: 'iconProps' },
49
+ },
50
+ },
51
+
52
+ large: {
53
+ description: 'Defines the top and bottom padding size',
54
+ control: 'boolean',
55
+ table: {
56
+ type: { summary: 'boolean' },
57
+ defaultValue: { summary: 'true' },
58
+ },
59
+ defaultValue: 'true',
60
+ },
61
+ },
62
+ args: {
63
+ title: 'Self check-in',
64
+ subtitle: 'Check yourself in with the smartlock.',
65
+ withAnimation: true,
66
+ backgroundColour: 'white',
67
+ iconProps: {
68
+ type: 'heart',
69
+ size: 2,
70
+ colour: 'black',
71
+ hollow: true,
72
+ bgColour: 'secondary',
73
+ hoverColour: 'black',
74
+ hoverBgColour: 'white',
75
+ },
76
+ },
77
+ };
78
+
79
+ export default meta;
80
+
81
+ type Story = StoryObj<typeof meta>;
82
+
83
+ export const Default: Story = {};
@@ -0,0 +1,128 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+
3
+ import Icon, { type Props as iconProps } from '@components/Icon';
4
+ import { type Colours } from '@utils/controls';
5
+ import MatchMedia from '@utils/matchMedia';
6
+ import classNames from 'classnames';
7
+
8
+
9
+
10
+ export interface Props {
11
+ id: string;
12
+ className?: string;
13
+ title: string;
14
+ subtitle?: string | number;
15
+ withAnimation?: boolean;
16
+ withHoverEffect?: boolean;
17
+ iconProps: iconProps;
18
+ backgroundColour?: Colours;
19
+
20
+ large?: boolean;
21
+ }
22
+
23
+ const InformationIcon = ({
24
+ id,
25
+ className,
26
+ title,
27
+ subtitle,
28
+ withAnimation = false,
29
+ withHoverEffect = true,
30
+ iconProps,
31
+ backgroundColour = 'white',
32
+
33
+ large = true,
34
+ }: Props): JSX.Element => {
35
+ const loaded = useRef(false);
36
+ const smScreenSize = 'max-width: 768px';
37
+ const isSm: boolean = MatchMedia(smScreenSize);
38
+ const classList = classNames(
39
+ {
40
+ [style.hoverable]: withHoverEffect,
41
+ [style.large]: large,
42
+ [style.small]: !large,
43
+ 'pt-4': !large,
44
+ },
45
+ className,
46
+ style.classList,
47
+ style[backgroundColour],
48
+ 'theme-local',
49
+ );
50
+
51
+ const titleClassList = classNames({
52
+ [style.centerText]: subtitle === undefined,
53
+ [style.title]: subtitle !== undefined,
54
+ });
55
+
56
+ const subtitleClassList = classNames(
57
+ {
58
+ [style.centerText]: title === undefined,
59
+ },
60
+ style.subtitle,
61
+ );
62
+
63
+ useEffect(() => {
64
+ if (typeof subtitle === 'number') {
65
+ const element = document.getElementById(`${id}_number`);
66
+ const observer = new IntersectionObserver(
67
+ (entries, observer) => {
68
+ entries.forEach((entry) => {
69
+ if (entry.intersectionRatio >= 0.1 && !loaded.current) {
70
+ loaded.current = true;
71
+ counterAnimation(
72
+ document.getElementById(`${id}_number`),
73
+ 0,
74
+ subtitle,
75
+ 3000,
76
+ );
77
+ }
78
+ });
79
+ },
80
+ { threshold: 1 },
81
+ );
82
+ element != null && withAnimation && observer.observe(element);
83
+ }
84
+ }, []);
85
+
86
+ const counterAnimation = (
87
+ obj: any,
88
+ start: number,
89
+ end: number,
90
+ duration: number,
91
+ ): void => {
92
+ let startTimestamp: number;
93
+ const step = (timestamp: number): void => {
94
+ startTimestamp = timestamp;
95
+ const progress = Math.min((timestamp - startTimestamp) / duration, 1);
96
+ obj.innerHTML = Math.floor(progress * (end - start) + start);
97
+ if (progress < 1) {
98
+ window.requestAnimationFrame(step);
99
+ }
100
+ };
101
+ window.requestAnimationFrame(step);
102
+ };
103
+
104
+ return (
105
+ <div id={id} className={classList}>
106
+ <div className={style.icon}>
107
+ {iconProps !== undefined && (
108
+ <Icon
109
+ {...iconProps}
110
+ className="mx-auto"
111
+ size={isSm ? 3 : 2}
112
+ bgColour={backgroundColour}
113
+ />
114
+ )}
115
+ </div>
116
+ <div className={style.text}>
117
+ {title !== undefined && title !== '' && (
118
+ <p className={titleClassList}>{title}</p>
119
+ )}
120
+ {subtitle !== undefined && subtitle !== '' && (
121
+ <p className={subtitleClassList}>{subtitle}</p>
122
+ )}
123
+ </div>
124
+ </div>
125
+ );
126
+ };
127
+
128
+ export default InformationIcon;
@@ -0,0 +1,71 @@
1
+ .classList {
2
+ @apply rounded-2xl text-center sm:flex sm:text-left;
3
+ }
4
+
5
+ .large {
6
+ @apply py-8;
7
+ }
8
+
9
+ .small {
10
+ @apply pb-4;
11
+ }
12
+
13
+ .icon {
14
+ @apply sm:h-full;
15
+ }
16
+
17
+ .large .icon {
18
+ @apply px-4 md:px-8;
19
+ }
20
+
21
+ .small .icon {
22
+ @apply pr-2 md:pr-4;
23
+ }
24
+
25
+ .text {
26
+ @apply mt-8 flex flex-col-reverse sm:mt-0 sm:block sm:pr-4 md:pr-8;
27
+ }
28
+
29
+ .title {
30
+ @apply font-light sm:font-semiBold;
31
+ }
32
+
33
+ .subtitle {
34
+ @apply text-xxl font-medium sm:text-xs sm:font-regular;
35
+ }
36
+
37
+ .primary {
38
+ @apply bg-primary text-white;
39
+ }
40
+
41
+ .secondary {
42
+ @apply bg-secondary text-white;
43
+ }
44
+
45
+ .white {
46
+ @apply bg-white text-black;
47
+ }
48
+
49
+ .grey {
50
+ @apply bg-lightest-grey text-black;
51
+ }
52
+
53
+ .black {
54
+ @apply bg-black text-white;
55
+ }
56
+
57
+ .success {
58
+ @apply bg-success text-white;
59
+ }
60
+
61
+ .error {
62
+ @apply bg-error text-white;
63
+ }
64
+
65
+ .facebook {
66
+ @apply bg-facebook text-white;
67
+ }
68
+
69
+ .gold {
70
+ @apply bg-gold text-white;
71
+ }
@@ -0,0 +1,32 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { idAndClassName } from '@utils/controls';
3
+
4
+ import InformationIconBlock from '.';
5
+
6
+ const icons = [
7
+ { name: 'Current Age', value: '27', type: 'calendar' },
8
+ { name: 'Countries Visited', value: '20', type: 'globe' },
9
+ { name: 'Projects', value: '27', type: 'list' },
10
+ { name: 'Years in industry', value: '4', type: 'university' },
11
+ ];
12
+
13
+ const meta = {
14
+ title: 'Components/Information Icon Block',
15
+ component: InformationIconBlock,
16
+ parameters: {},
17
+ argTypes: {
18
+ ...idAndClassName,
19
+ },
20
+ args: {
21
+ title: 'Information Icon Block',
22
+ description: 'What do you recon to this? Prob needs a refurb right?',
23
+ icons,
24
+ bgColour: 'primary',
25
+ },
26
+ };
27
+
28
+ export default meta;
29
+
30
+ type Story = StoryObj<typeof meta>;
31
+
32
+ export const Default: Story = {};