oddsgate-ds 1.0.2

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 (206) hide show
  1. package/. babelrc +3 -0
  2. package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-3920d97c51b8ad2521918fb1205babd22b0ed3d7 +1 -0
  3. package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-43fdebe5fc35e4e9fabee9a83c7faea931b05ea0 +1 -0
  4. package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-f086b87885981c04ce7a583ff90a49313de83de7 +1 -0
  5. package/.eslintrc.cjs +14 -0
  6. package/.storybook/main.ts +28 -0
  7. package/.storybook/preview.ts +22 -0
  8. package/README.md +30 -0
  9. package/package.json +63 -0
  10. package/public/assets/components/quotes.svg +3 -0
  11. package/public/assets/empty-state.svg +19 -0
  12. package/public/assets/placeholder.png +0 -0
  13. package/public/assets/video.mp4 +0 -0
  14. package/public/fonts/miewfont/miewfont.eot +0 -0
  15. package/public/fonts/miewfont/miewfont.svg +35 -0
  16. package/public/fonts/miewfont/miewfont.ttf +0 -0
  17. package/public/fonts/miewfont/miewfont.woff +0 -0
  18. package/src/components/atoms/Button/Button.component.tsx +48 -0
  19. package/src/components/atoms/Button/Button.interface.ts +29 -0
  20. package/src/components/atoms/Button/Button.stories.tsx +58 -0
  21. package/src/components/atoms/Button/Button.theme.ts +126 -0
  22. package/src/components/atoms/Button/index.ts +1 -0
  23. package/src/components/atoms/Chip/Chip.component.tsx +26 -0
  24. package/src/components/atoms/Chip/Chip.interface.ts +10 -0
  25. package/src/components/atoms/Chip/Chip.stories.tsx +34 -0
  26. package/src/components/atoms/Chip/Chip.theme.ts +47 -0
  27. package/src/components/atoms/Chip/index.ts +1 -0
  28. package/src/components/atoms/CloseButton/CloseButton.component.tsx +17 -0
  29. package/src/components/atoms/CloseButton/CloseButton.interface.ts +9 -0
  30. package/src/components/atoms/CloseButton/CloseButton.stories.tsx +24 -0
  31. package/src/components/atoms/CloseButton/CloseButton.theme.ts +66 -0
  32. package/src/components/atoms/CloseButton/index.ts +1 -0
  33. package/src/components/atoms/EmptyState/EmptyState.component.tsx +27 -0
  34. package/src/components/atoms/EmptyState/EmptyState.interface.ts +10 -0
  35. package/src/components/atoms/EmptyState/EmptyState.stories.tsx +34 -0
  36. package/src/components/atoms/EmptyState/EmptyState.theme.ts +27 -0
  37. package/src/components/atoms/EmptyState/index.ts +1 -0
  38. package/src/components/atoms/Flex/Flex.component.tsx +30 -0
  39. package/src/components/atoms/Flex/Flex.interface.ts +22 -0
  40. package/src/components/atoms/Flex/Flex.theme.ts +11 -0
  41. package/src/components/atoms/Flex/index.ts +1 -0
  42. package/src/components/atoms/FlexGrid/FlexGrid.component.tsx +61 -0
  43. package/src/components/atoms/FlexGrid/FlexGrid.interface.ts +55 -0
  44. package/src/components/atoms/FlexGrid/FlexGrid.stories.tsx +55 -0
  45. package/src/components/atoms/FlexGrid/FlexGrid.theme.ts +79 -0
  46. package/src/components/atoms/FlexGrid/index.ts +1 -0
  47. package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.component.tsx +22 -0
  48. package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.interface.tsx +6 -0
  49. package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.theme.ts +126 -0
  50. package/src/components/atoms/FormField/CheckRadioField/index.ts +1 -0
  51. package/src/components/atoms/FormField/FormField.component.tsx +37 -0
  52. package/src/components/atoms/FormField/FormField.interface.ts +9 -0
  53. package/src/components/atoms/FormField/FormField.stories.tsx +499 -0
  54. package/src/components/atoms/FormField/FormField.theme.tsx +122 -0
  55. package/src/components/atoms/FormField/index.ts +1 -0
  56. package/src/components/atoms/Heading/Heading.component.tsx +17 -0
  57. package/src/components/atoms/Heading/Heading.interface.tsx +21 -0
  58. package/src/components/atoms/Heading/Heading.theme.ts +17 -0
  59. package/src/components/atoms/Heading/index.ts +1 -0
  60. package/src/components/atoms/Icon/Icon.component.tsx +19 -0
  61. package/src/components/atoms/Icon/Icon.interface.ts +8 -0
  62. package/src/components/atoms/Icon/Icon.stories.tsx +26 -0
  63. package/src/components/atoms/Icon/Icon.theme.ts +102 -0
  64. package/src/components/atoms/Icon/index.ts +1 -0
  65. package/src/components/atoms/ImageWrapper/ImageWrapper.component.tsx +42 -0
  66. package/src/components/atoms/ImageWrapper/ImageWrapper.interface.ts +16 -0
  67. package/src/components/atoms/ImageWrapper/ImageWrapper.stories.tsx +27 -0
  68. package/src/components/atoms/ImageWrapper/ImageWrapper.theme.ts +51 -0
  69. package/src/components/atoms/ImageWrapper/index.ts +1 -0
  70. package/src/components/atoms/Loader/Loader.component.tsx +26 -0
  71. package/src/components/atoms/Loader/Loader.interface.ts +10 -0
  72. package/src/components/atoms/Loader/Loader.stories.tsx +33 -0
  73. package/src/components/atoms/Loader/Loader.theme.ts +92 -0
  74. package/src/components/atoms/Loader/index.ts +1 -0
  75. package/src/components/atoms/Marquee/Marquee.component.tsx +130 -0
  76. package/src/components/atoms/Marquee/Marquee.interface.ts +8 -0
  77. package/src/components/atoms/Marquee/Marquee.stories.tsx +20 -0
  78. package/src/components/atoms/Marquee/Marquee.theme.ts +42 -0
  79. package/src/components/atoms/Marquee/index.ts +1 -0
  80. package/src/components/atoms/Quote/Quote.component.tsx +29 -0
  81. package/src/components/atoms/Quote/Quote.interface.ts +10 -0
  82. package/src/components/atoms/Quote/Quote.stories.tsx +25 -0
  83. package/src/components/atoms/Quote/Quote.theme.ts +26 -0
  84. package/src/components/atoms/Quote/index.ts +1 -0
  85. package/src/components/atoms/RichText/RichText.component.tsx +31 -0
  86. package/src/components/atoms/RichText/RichText.interface.ts +11 -0
  87. package/src/components/atoms/RichText/RichText.stories.tsx +73 -0
  88. package/src/components/atoms/RichText/RichText.theme.ts +32 -0
  89. package/src/components/atoms/RichText/index.ts +1 -0
  90. package/src/components/atoms/ScrollingNav/ScrollingNav.component.tsx +18 -0
  91. package/src/components/atoms/ScrollingNav/ScrollingNav.interface.ts +8 -0
  92. package/src/components/atoms/ScrollingNav/ScrollingNav.stories.tsx +44 -0
  93. package/src/components/atoms/ScrollingNav/ScrollingNav.theme.ts +55 -0
  94. package/src/components/atoms/ScrollingNav/index.ts +1 -0
  95. package/src/components/atoms/Separator/Separator.component.tsx +19 -0
  96. package/src/components/atoms/Separator/Separator.interface.tsx +9 -0
  97. package/src/components/atoms/Separator/Separator.stories.tsx +28 -0
  98. package/src/components/atoms/Separator/Separator.theme.ts +12 -0
  99. package/src/components/atoms/Separator/index.ts +1 -0
  100. package/src/components/atoms/SocialLinks/SocialLinks.component.tsx +35 -0
  101. package/src/components/atoms/SocialLinks/SocialLinks.interface.ts +8 -0
  102. package/src/components/atoms/SocialLinks/SocialLinks.stories.tsx +36 -0
  103. package/src/components/atoms/SocialLinks/SocialLinks.theme.ts +52 -0
  104. package/src/components/atoms/SocialLinks/index.ts +1 -0
  105. package/src/components/atoms/Spacer/Spacer.component.tsx +27 -0
  106. package/src/components/atoms/Spacer/Spacer.interface.ts +11 -0
  107. package/src/components/atoms/Spacer/Spacer.stories.tsx +28 -0
  108. package/src/components/atoms/Spacer/Spacer.theme.ts +8 -0
  109. package/src/components/atoms/Spacer/index.ts +1 -0
  110. package/src/components/atoms/Video/Video.component.tsx +116 -0
  111. package/src/components/atoms/Video/Video.interface.ts +13 -0
  112. package/src/components/atoms/Video/Video.stories.tsx +37 -0
  113. package/src/components/atoms/Video/Video.theme.ts +44 -0
  114. package/src/components/atoms/Video/index.ts +1 -0
  115. package/src/components/atoms/VideoEmbed/VideoEmbed.component.tsx +109 -0
  116. package/src/components/atoms/VideoEmbed/VideoEmbed.interface.ts +13 -0
  117. package/src/components/atoms/VideoEmbed/VideoEmbed.stories.tsx +23 -0
  118. package/src/components/atoms/VideoEmbed/VideoEmbed.theme.ts +45 -0
  119. package/src/components/atoms/VideoEmbed/index.ts +1 -0
  120. package/src/components/common/PortalComponent/PortalComponent.tsx +48 -0
  121. package/src/components/common/PortalComponent/index.ts +1 -0
  122. package/src/components/molecules/Accordion/Accordion.component.tsx +58 -0
  123. package/src/components/molecules/Accordion/Accordion.interface.ts +15 -0
  124. package/src/components/molecules/Accordion/Accordion.stories.tsx +100 -0
  125. package/src/components/molecules/Accordion/Accordion.theme.ts +66 -0
  126. package/src/components/molecules/Accordion/index.ts +1 -0
  127. package/src/components/molecules/BlogCard/BlogCard.component.tsx +48 -0
  128. package/src/components/molecules/BlogCard/BlogCard.interface.ts +10 -0
  129. package/src/components/molecules/BlogCard/BlogCard.stories.tsx +37 -0
  130. package/src/components/molecules/BlogCard/BlogCard.theme.ts +63 -0
  131. package/src/components/molecules/BlogCard/index.ts +1 -0
  132. package/src/components/molecules/Card/Card.component.tsx +15 -0
  133. package/src/components/molecules/Card/Card.interface.ts +10 -0
  134. package/src/components/molecules/Card/Card.theme.ts +53 -0
  135. package/src/components/molecules/Card/index.ts +1 -0
  136. package/src/components/molecules/Dropdown/Dropdown.component.tsx +67 -0
  137. package/src/components/molecules/Dropdown/Dropdown.interface.ts +26 -0
  138. package/src/components/molecules/Dropdown/Dropdown.stories.tsx +54 -0
  139. package/src/components/molecules/Dropdown/Dropdown.theme.ts +50 -0
  140. package/src/components/molecules/Dropdown/index.ts +1 -0
  141. package/src/components/molecules/IconBox/IconBox.component.tsx +29 -0
  142. package/src/components/molecules/IconBox/IconBox.interface.tsx +10 -0
  143. package/src/components/molecules/IconBox/IconBox.stories.tsx +23 -0
  144. package/src/components/molecules/IconBox/IconBox.theme.ts +25 -0
  145. package/src/components/molecules/IconBox/index.ts +1 -0
  146. package/src/components/molecules/IconTitle/IconTitle.component.tsx +24 -0
  147. package/src/components/molecules/IconTitle/IconTitle.interface.tsx +10 -0
  148. package/src/components/molecules/IconTitle/IconTitle.stories.tsx +49 -0
  149. package/src/components/molecules/IconTitle/IconTitle.theme.ts +10 -0
  150. package/src/components/molecules/IconTitle/index.ts +1 -0
  151. package/src/components/molecules/Modal/Modal.component.tsx +70 -0
  152. package/src/components/molecules/Modal/Modal.interface.ts +11 -0
  153. package/src/components/molecules/Modal/Modal.stories.tsx +57 -0
  154. package/src/components/molecules/Modal/Modal.theme.ts +55 -0
  155. package/src/components/molecules/Modal/index.ts +1 -0
  156. package/src/components/molecules/OffCanvas/OffCanvas.component.tsx +55 -0
  157. package/src/components/molecules/OffCanvas/OffCanvas.interface.ts +12 -0
  158. package/src/components/molecules/OffCanvas/OffCanvas.stories.tsx +55 -0
  159. package/src/components/molecules/OffCanvas/OffCanvas.theme.ts +50 -0
  160. package/src/components/molecules/OffCanvas/index.ts +1 -0
  161. package/src/components/molecules/ProjectCard/ProjectCard.component.tsx +45 -0
  162. package/src/components/molecules/ProjectCard/ProjectCard.interface.ts +8 -0
  163. package/src/components/molecules/ProjectCard/ProjectCard.stories.tsx +72 -0
  164. package/src/components/molecules/ProjectCard/ProjectCard.theme.ts +61 -0
  165. package/src/components/molecules/ProjectCard/index.ts +1 -0
  166. package/src/components/molecules/ShareModal/ShareModal.component.tsx +166 -0
  167. package/src/components/molecules/ShareModal/ShareModal.interface.ts +9 -0
  168. package/src/components/molecules/ShareModal/ShareModal.stories.tsx +33 -0
  169. package/src/components/molecules/ShareModal/ShareModal.theme.ts +101 -0
  170. package/src/components/molecules/ShareModal/index.ts +1 -0
  171. package/src/components/molecules/TeamCard/TeamCard.component.tsx +31 -0
  172. package/src/components/molecules/TeamCard/TeamCard.interface.ts +7 -0
  173. package/src/components/molecules/TeamCard/TeamCard.stories.tsx +33 -0
  174. package/src/components/molecules/TeamCard/TeamCard.theme.ts +12 -0
  175. package/src/components/molecules/TeamCard/index.ts +1 -0
  176. package/src/components/organisms/Cover/Cover.component.tsx +46 -0
  177. package/src/components/organisms/Cover/Cover.interface.ts +14 -0
  178. package/src/components/organisms/Cover/Cover.stories.tsx +97 -0
  179. package/src/components/organisms/Cover/Cover.theme.ts +49 -0
  180. package/src/components/organisms/Cover/index.ts +1 -0
  181. package/src/components/organisms/Slider/Slider.component.tsx +145 -0
  182. package/src/components/organisms/Slider/Slider.interface.ts +17 -0
  183. package/src/components/organisms/Slider/Slider.stories.tsx +73 -0
  184. package/src/components/organisms/Slider/Slider.theme.ts +125 -0
  185. package/src/components/organisms/Slider/Slider.utils.tsx +19 -0
  186. package/src/components/organisms/Slider/index.ts +1 -0
  187. package/src/helpers/clickOutsideToClose.tsx +17 -0
  188. package/src/helpers/getIcons.ts +5 -0
  189. package/src/helpers/useMediaQuery.tsx +24 -0
  190. package/src/helpers/uuid.ts +5 -0
  191. package/src/iconsList.json +1 -0
  192. package/src/index.ts +53 -0
  193. package/src/reportWebVitals.js +13 -0
  194. package/src/stories/Documentation/Colors.stories.tsx +33 -0
  195. package/src/stories/Documentation/Headings.stories.tsx +24 -0
  196. package/src/stories/Documentation/Icons.stories.tsx +73 -0
  197. package/src/stories/Documentation/JWT.stories.tsx +60 -0
  198. package/src/stories/Documentation/Utilities.stories.tsx +65 -0
  199. package/src/styles/Global.ts +296 -0
  200. package/src/styles/grid.ts +70 -0
  201. package/src/styles/reset.ts +47 -0
  202. package/src/styles/utilities.ts +326 -0
  203. package/src/styles/variables.ts +168 -0
  204. package/tsconfig.json +29 -0
  205. package/tsconfig.node.json +11 -0
  206. package/vite.config.ts +87 -0
@@ -0,0 +1,50 @@
1
+ import { IDropdown, IDropdownContainer, IDropdownItem, IDropdownTitle } from './Dropdown.interface';
2
+ import { colors, responsiveMedia, shadows } from '@/styles/variables';
3
+ import styled, { css } from 'styled-components';
4
+
5
+ export const StyledDropdown = styled.div<IDropdown>`
6
+ position: relative;
7
+ display: inline-flex;
8
+ `;
9
+
10
+ export const StyledDropdownTitle = styled.div<IDropdownTitle>`
11
+ display: flex;
12
+ align-items: center;
13
+ transition: color 0.15s ease-in-out;
14
+ cursor: pointer;
15
+
16
+ ${({ open }) => open && `
17
+ color: ${colors.primary70} !important;
18
+ user-select: none
19
+ `}
20
+ `;
21
+
22
+
23
+ export const StyledDropdownContainer = styled.ul<IDropdownContainer>`
24
+ position: absolute;
25
+ top: 100%;
26
+ left: 0;
27
+
28
+ margin-top: 12px;
29
+ padding-bottom: 12px;
30
+ background: ${colors.white};
31
+ box-shadow: ${shadows.sm};
32
+
33
+ opacity: ${props => props.open ? 1 : 0};
34
+ pointer-events: ${props => props.open ? "auto" : "none"};
35
+
36
+ z-index: 1;
37
+ transition: opacity 0.15s ease-in-out;
38
+ `;
39
+ export const StyledDropdownItem = styled.li<IDropdownItem>`
40
+ display:flex;
41
+ justify-content: space-between;
42
+ align-items: center;
43
+ width: 100%;
44
+ padding: 8px 18px;
45
+ cursor: pointer;
46
+
47
+ &:hover {
48
+ color: ${colors.primary70}
49
+ }
50
+ `;
@@ -0,0 +1 @@
1
+ export { default, DropdownItem } from './Dropdown.component'
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+
3
+ import Heading from '@/components/atoms/Heading/Heading.component';
4
+ import RichText from '@/components/atoms/RichText/RichText.component';
5
+
6
+ import { IIconBox } from './IconBox.interface';
7
+ import { StyledIconBox } from './IconBox.theme';
8
+
9
+ const IconBox = ({
10
+ label,
11
+ icon,
12
+ description,
13
+ className,
14
+ ...props
15
+ }: IIconBox) => {
16
+ return (
17
+ <StyledIconBox className={className} {...props}>
18
+ {icon}
19
+ <div>
20
+ <Heading size="texts" tag="span" style={{ fontWeight: 600 }}>
21
+ {label}
22
+ </Heading>
23
+ <RichText tag='p'>{description}</RichText>
24
+ </div>
25
+ </StyledIconBox>
26
+ )
27
+ }
28
+
29
+ export default IconBox
@@ -0,0 +1,10 @@
1
+ import { CSSProperties } from 'react';
2
+
3
+ export type IIconBox = {
4
+ label?: string;
5
+ icon?: React.ReactElement;
6
+ description?: string;
7
+ className?: string;
8
+ style?: CSSProperties
9
+ children?: React.ReactNode;
10
+ }
@@ -0,0 +1,23 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+
3
+ import { IIconBox } from './IconBox.interface'
4
+ import Icon from '@/components/atoms/Icon'
5
+ import IconBox from './IconBox.component'
6
+ import React from 'react'
7
+
8
+ // More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
9
+ export default {
10
+ title: 'Components/IconBox',
11
+ component: IconBox,
12
+ tags: ['autodocs']
13
+ } as Meta
14
+
15
+ export const Simple: StoryObj<IIconBox> = {
16
+ render: args => <IconBox {...args}></IconBox>,
17
+ args: {
18
+ icon: <Icon icon="icon-right-chevron" />,
19
+ label: 'Lorem ipsum',
20
+ description:
21
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.'
22
+ }
23
+ }
@@ -0,0 +1,25 @@
1
+ import styled, { css } from 'styled-components';
2
+
3
+ import { IIconBox } from './IconBox.interface';
4
+ import { colors } from '@/styles/variables';
5
+
6
+ export const StyledIconBox = styled.div<IIconBox>`
7
+ display: flex;
8
+
9
+ & i{
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+
14
+ width: 32px;
15
+ height: 32px;
16
+
17
+ color: ${colors.primary70};
18
+ background: ${colors.primary10};
19
+ border-radius: 50px;
20
+
21
+ text-align:center;
22
+
23
+ margin-right:8px;
24
+ }
25
+ `;
@@ -0,0 +1 @@
1
+ export { default } from "./IconBox.component";
@@ -0,0 +1,24 @@
1
+ import Heading from '@/components/atoms/Heading/Heading.component'
2
+ import { IIconTitle } from './IconTitle.interface'
3
+ import React from 'react'
4
+ import { StyledIconTitle } from './IconTitle.theme'
5
+
6
+ const IconTitle = ({
7
+ label,
8
+ icon,
9
+ imageElement,
10
+ className,
11
+ style,
12
+ children,
13
+ ...props
14
+ }: IIconTitle) => {
15
+ return (
16
+ <StyledIconTitle className={className} style={style}>
17
+ {icon && icon}
18
+ {imageElement && imageElement}
19
+ {children}
20
+ </StyledIconTitle>
21
+ )
22
+ }
23
+
24
+ export default IconTitle
@@ -0,0 +1,10 @@
1
+ import { CSSProperties } from 'react';
2
+
3
+ export type IIconTitle = {
4
+ label?: string;
5
+ icon?: React.ReactElement;
6
+ imageElement?: React.ReactElement;
7
+ className?: string;
8
+ style?: CSSProperties
9
+ children?: React.ReactNode;
10
+ }
@@ -0,0 +1,49 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+
3
+ import Heading from '@/components/atoms/Heading'
4
+ import { IIconTitle } from './IconTitle.interface'
5
+ import Icon from '@/components/atoms/Icon'
6
+ import IconTitle from './IconTitle.component'
7
+ import React from 'react'
8
+
9
+ // More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
10
+ export default {
11
+ title: 'Components/IconTitle',
12
+ component: IconTitle,
13
+ tags: ['autodocs']
14
+ } as Meta
15
+
16
+ export const IconStory: StoryObj<IIconTitle> = {
17
+ render: args => (
18
+ <IconTitle {...args}>
19
+ <Heading size="texts" tag="h4">
20
+ Lorem ipsum
21
+ </Heading>
22
+ </IconTitle>
23
+ ),
24
+ args: {
25
+ icon: <Icon icon="icon-chevron-up" />
26
+ }
27
+ }
28
+
29
+ export const Image: StoryObj<IIconTitle> = {
30
+ render: args => (
31
+ <IconTitle {...args}>
32
+ <Heading size="texts" tag="h4">
33
+ Lorem ipsum
34
+ </Heading>
35
+ </IconTitle>
36
+ ),
37
+ args: {
38
+ imageElement: (
39
+ <img
40
+ width="100%"
41
+ height="100%"
42
+ sizes="100vw"
43
+ decoding="async"
44
+ src="/assets/placeholder.png"
45
+ alt="Empty state"
46
+ />
47
+ )
48
+ }
49
+ }
@@ -0,0 +1,10 @@
1
+ import styled, { css } from 'styled-components';
2
+
3
+ import { IIconTitle } from './IconTitle.interface';
4
+ import { colors } from '@/styles/variables';
5
+
6
+ export const StyledIconTitle = styled.div<IIconTitle>`
7
+ display:flex;
8
+ align-items: center;
9
+ gap:4px;
10
+ `;
@@ -0,0 +1 @@
1
+ export { default } from "./IconTitle.component";
@@ -0,0 +1,70 @@
1
+ import React, { useEffect, useMemo } from 'react'
2
+ import {
3
+ StyledContent,
4
+ StyledOverlay,
5
+ StyledTitle,
6
+ StyledWrapper
7
+ } from './Modal.theme'
8
+
9
+ import Heading from '../../atoms/Heading'
10
+ import { IModal } from './Modal.interface'
11
+ import Icon from '../../atoms/Icon'
12
+ import IconTitle from '../IconTitle/IconTitle.component'
13
+ import PortalComponent from '../../common/PortalComponent'
14
+ import { getId } from '@/helpers/uuid'
15
+
16
+ const Modal = ({
17
+ title,
18
+ open = false,
19
+ onClose,
20
+ hideCloseIcon = false,
21
+ children,
22
+ ...props
23
+ }: IModal) => {
24
+ const wrapperId = useMemo(() => getId(), [])
25
+
26
+ const handleCloseClick = (e: any) => {
27
+ e.preventDefault()
28
+
29
+ if (typeof onClose == 'function') onClose()
30
+ }
31
+
32
+ if (!open) return null
33
+
34
+ return (
35
+ <PortalComponent wrapperId={wrapperId}>
36
+ <StyledOverlay onClick={(e: any) => handleCloseClick(e)} />
37
+ <StyledWrapper {...props}>
38
+ <StyledTitle className="d-flex align-items-center">
39
+ {title && (
40
+ <div className="flex-grow-1">
41
+ <IconTitle
42
+ icon={
43
+ <Icon
44
+ icon="icon-product"
45
+ style={{ color: 'white', fontSize: '3.6rem' }}
46
+ />
47
+ }
48
+ className="color-white"
49
+ >
50
+ <Heading tag="span" size="texts" className="fw-semibold">
51
+ {title}
52
+ </Heading>
53
+ </IconTitle>
54
+ </div>
55
+ )}
56
+ {!hideCloseIcon && (
57
+ <Icon
58
+ icon="icon-close"
59
+ className="color-white flex-shrink-1"
60
+ onClick={() => onClose && onClose()}
61
+ />
62
+ )}
63
+ </StyledTitle>
64
+ <StyledContent>{children}</StyledContent>
65
+ </StyledWrapper>
66
+ </PortalComponent>
67
+ )
68
+ }
69
+
70
+ export default Modal
@@ -0,0 +1,11 @@
1
+ import { CSSProperties } from 'react';
2
+
3
+ export type IModal = {
4
+ title?: string
5
+ open?: boolean
6
+ onClose?: () => void
7
+ hideCloseIcon?: boolean
8
+ className?: string
9
+ style?: CSSProperties
10
+ children?: React.ReactNode;
11
+ }
@@ -0,0 +1,57 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import React, { useState } from 'react'
3
+
4
+ import Button from '../../atoms/Button'
5
+ import Flex from '../../atoms/Flex'
6
+ import { IModal } from './Modal.interface'
7
+ import Modal from './Modal.component'
8
+ import RichText from '../../atoms/RichText'
9
+
10
+ export default {
11
+ title: 'Components/Modal',
12
+ component: Modal,
13
+ tags: ['autodocs']
14
+ } as Meta
15
+
16
+ export const Simple: StoryObj<IModal> = {
17
+ render: args => {
18
+ const [isOpen, setIsOpen] = useState(false)
19
+ return (
20
+ <div
21
+ style={{
22
+ width: '600px',
23
+ minHeight: '400px',
24
+ margin: 'auto'
25
+ }}
26
+ >
27
+ <Button onClick={() => setIsOpen(true)}>Open</Button>
28
+ <Modal
29
+ title={'Ainda não está registado?'}
30
+ open={isOpen}
31
+ onClose={() => setIsOpen(false)}
32
+ style={{ width: '90vw' }}
33
+ {...args}
34
+ >
35
+ <RichText style={{ color: '$gray400' }}>
36
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
37
+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
38
+ ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
39
+ aliquip ex ea commodo consequat. Duis aute irure dolor in
40
+ reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
41
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
42
+ culpa qui officia deserunt mollit anim id est laborum.
43
+ </RichText>
44
+
45
+ <Flex style={{ marginTop: '$8' }} align={'center'}>
46
+ <Button variant={'primary'}>Lorem ipsum</Button>
47
+ <RichText style={{ fontWeight: '600' }}>ou</RichText>
48
+ <Button outlined={true} variant={'primary'}>
49
+ dolor sit amet
50
+ </Button>
51
+ </Flex>
52
+ </Modal>
53
+ </div>
54
+ )
55
+ },
56
+ args: {}
57
+ }
@@ -0,0 +1,55 @@
1
+ import { colors, radius, spaces, zIndexes } from '@/styles/variables';
2
+ import styled, { css } from 'styled-components';
3
+
4
+ import { IModal } from './Modal.interface';
5
+
6
+ export const StyledOverlay = styled.div<IModal>`
7
+ position: fixed;
8
+ top: 0;
9
+ right: 0;
10
+ bottom: 0;
11
+ left: 0;
12
+ background-color: rgba(0, 0, 0, .30);
13
+ z-index: 100;
14
+ `;
15
+
16
+ export const StyledWrapper = styled.div<IModal>`
17
+ position: fixed;
18
+ top: 50%;
19
+ left: 50%;
20
+
21
+ width: 30rem;
22
+ max-height: 85vh;
23
+ max-width: 90%;
24
+
25
+ margin-top: -5vh;
26
+
27
+ border-radius: ${radius.md};
28
+ background-color: ${colors.gray10};
29
+ box-shadow: 0px 4px 25px rgba(45, 46, 69, 0.1);
30
+ animation: all 0.3s cubic-bezier(0.22, 1, 0.36, 1);
31
+
32
+ // among other things, prevents text alignment inconsistencies when dialog cant be centered in the viewport evenly.
33
+ // affects animated and non-animated dialogs alike.
34
+ transform: translate(-50%, -50%);
35
+ will-change: transform;
36
+ overflow: hidden;
37
+ overflow-y: auto;
38
+ z-index: ${zIndexes['modal']};
39
+
40
+ &:focus {
41
+ outline: none
42
+ }
43
+ `;
44
+
45
+ export const StyledTitle = styled.div<IModal>`
46
+ color: ${colors.white};
47
+ background-color: ${colors.primary70};
48
+ padding: ${spaces[3]};
49
+ `;
50
+
51
+
52
+ export const StyledContent = styled.div<IModal>`
53
+ padding: ${spaces[5]};
54
+ contain: paint;
55
+ `;
@@ -0,0 +1 @@
1
+ export { default } from './Modal.component'
@@ -0,0 +1,55 @@
1
+ import React, { useMemo } from 'react'
2
+
3
+ import CloseButton from '@/components/atoms/CloseButton/CloseButton.component'
4
+ import { IOffCanvas } from './OffCanvas.interface'
5
+ import PortalComponent from '../../common/PortalComponent'
6
+ import { StyledOffCanvas } from './OffCanvas.theme'
7
+ import { getId } from '@/helpers/uuid'
8
+
9
+ const OffCanvas = ({
10
+ isOpen,
11
+ title,
12
+ actions,
13
+ children,
14
+ className,
15
+ onClose
16
+ }: IOffCanvas) => {
17
+ const wrapperId = useMemo(() => getId(), [])
18
+
19
+ return (
20
+ <PortalComponent wrapperId={wrapperId}>
21
+ <StyledOffCanvas
22
+ $isOpen={isOpen}
23
+ className={className}
24
+ data-lenis-prevent={true}
25
+ >
26
+ <div className="d-flex h-100">
27
+ <div className="w-100 align-self-start">
28
+ <div
29
+ className={
30
+ 'd-flex d-md-none w-100 align-items-center justify-content-between mb-3'
31
+ }
32
+ >
33
+ {title}
34
+ <CloseButton
35
+ variant="sm"
36
+ style={{ position: 'relative', top: 0, left: 0 }}
37
+ onClick={onClose}
38
+ ></CloseButton>
39
+ </div>
40
+ <div className={'w-100'}>{children}</div>
41
+ </div>
42
+ <div
43
+ className={
44
+ 'd-flex d-md-none w-100 align-self-end align-items-center justify-content-end mt-3'
45
+ }
46
+ >
47
+ {actions}
48
+ </div>
49
+ </div>
50
+ </StyledOffCanvas>
51
+ </PortalComponent>
52
+ )
53
+ }
54
+
55
+ export default OffCanvas
@@ -0,0 +1,12 @@
1
+ import { CSSProperties } from "react";
2
+
3
+ export interface IOffCanvas {
4
+ isOpen?: boolean;
5
+ $isOpen?: boolean;
6
+ actions?: React.ReactNode;
7
+ title?: React.ReactNode;
8
+ className?: string;
9
+ style?: CSSProperties
10
+ children?: React.ReactNode;
11
+ onClose?: () => void;
12
+ };
@@ -0,0 +1,55 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import React, { useState } from 'react'
3
+
4
+ import Button from '../../atoms/Button'
5
+ import Flex from '../../atoms/Flex'
6
+ import { IOffCanvas } from './OffCanvas.interface'
7
+ import OffCanvas from './OffCanvas.component'
8
+ import RichText from '../../atoms/RichText'
9
+
10
+ export default {
11
+ title: 'Components/OffCanvas',
12
+ component: OffCanvas,
13
+ tags: ['autodocs']
14
+ } as Meta
15
+
16
+ export const Simple: StoryObj<IOffCanvas> = {
17
+ render: args => {
18
+ const [isOpen, setIsOpen] = useState(false)
19
+ return (
20
+ <div
21
+ style={{
22
+ width: '600px',
23
+ minHeight: '400px',
24
+ margin: 'auto'
25
+ }}
26
+ >
27
+ <Button onClick={() => setIsOpen(true)}>Open</Button>
28
+ <OffCanvas
29
+ title={'Ainda não está registado?'}
30
+ isOpen={isOpen}
31
+ onClose={() => setIsOpen(false)}
32
+ >
33
+ <RichText style={{ color: '$gray400' }}>
34
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
35
+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
36
+ ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
37
+ aliquip ex ea commodo consequat. Duis aute irure dolor in
38
+ reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
39
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
40
+ culpa qui officia deserunt mollit anim id est laborum.
41
+ </RichText>
42
+
43
+ <Flex style={{ marginTop: '$8' }} align={'center'}>
44
+ <Button variant={'primary'}>Lorem ipsum</Button>
45
+ <RichText style={{ fontWeight: '600' }}>ou</RichText>
46
+ <Button outlined={true} variant={'primary'}>
47
+ dolor sit amet
48
+ </Button>
49
+ </Flex>
50
+ </OffCanvas>
51
+ </div>
52
+ )
53
+ },
54
+ args: {}
55
+ }
@@ -0,0 +1,50 @@
1
+ import { colors, responsiveMedia } from '@/styles/variables';
2
+ import styled, { css } from 'styled-components';
3
+
4
+ import { IOffCanvas } from './OffCanvas.interface';
5
+
6
+ export const StyledOffCanvas = styled.div<IOffCanvas>`
7
+ display: none;
8
+ @media only screen and (max-width: ${responsiveMedia}) {
9
+ display: block !important;
10
+ position: fixed;
11
+ top: 0px;
12
+ left: 0;
13
+
14
+ width: 100%;
15
+ height: 100vh;
16
+
17
+ opacity: 0;
18
+ visibility: hidden;
19
+ pointer-events: none;
20
+ background-color: rgba(0,0,0,0.6);
21
+ transition: all 0.3s linear;
22
+ z-index: 10;
23
+
24
+ & > div{
25
+ flex-flow: row wrap;
26
+ width: 100%;
27
+ max-width: 90%;
28
+ background: ${colors.white};
29
+ padding: 22px;
30
+ padding-top: 70px;
31
+
32
+ transform: translateX(-100%);
33
+ transition: transform 0.15s ease-in-out;
34
+ overflow: auto;
35
+ z-index: 1000;
36
+ }
37
+
38
+ ${({ $isOpen }) =>
39
+ $isOpen &&
40
+ css`
41
+ opacity:1;
42
+ visibility: visible;
43
+ pointer-events: all;
44
+
45
+ & > div{
46
+ transform: translateY(0%);
47
+ }
48
+ `}
49
+ }
50
+ `;
@@ -0,0 +1 @@
1
+ export { default } from './OffCanvas.component'
@@ -0,0 +1,45 @@
1
+ import Button from '@/components/atoms/Button/Button.component'
2
+ import Chip from '@/components/atoms/Chip/Chip.component'
3
+ import Heading from '@/components/atoms/Heading'
4
+ import { IProjectCard } from './ProjectCard.interface'
5
+ import Icon from '@/components/atoms/Icon/Icon.component'
6
+ import ImageWrapper from '@/components/atoms/ImageWrapper'
7
+ import React from 'react'
8
+ import Separator from '@/components/atoms/Separator/Separator.component'
9
+ import { StyledProjectCard } from './ProjectCard.theme'
10
+
11
+ const ProjectCard = ({
12
+ variant,
13
+ category,
14
+ title,
15
+ imageElement,
16
+ linkElement,
17
+ buttonLabel,
18
+ ...props
19
+ }: IProjectCard) => {
20
+ return (
21
+ <StyledProjectCard
22
+ variant={variant}
23
+ imageElement={
24
+ <ImageWrapper aspectRatioHeight={variant === 'featured' ? 40 : 82}>
25
+ {imageElement}
26
+ </ImageWrapper>
27
+ }
28
+ {...props}
29
+ >
30
+ <div className="w-100">
31
+ <div className="d-flex align-items-center justify-content-between mb-4">
32
+ <Heading tag={'h3'} size={'h5'} className={'textEllipsis'}>
33
+ {title}
34
+ </Heading>
35
+ <Icon icon="icon-forward-arrow"></Icon>
36
+ </div>
37
+
38
+ <Separator color="#fff" height="1px" />
39
+ {linkElement}
40
+ </div>
41
+ </StyledProjectCard>
42
+ )
43
+ }
44
+
45
+ export default ProjectCard
@@ -0,0 +1,8 @@
1
+ import { ICard } from '../Card/Card.interface';
2
+
3
+ export interface IProjectCard extends ICard {
4
+ category?: string
5
+ title?: string
6
+ buttonLabel?: string,
7
+ linkElement?: React.ReactElement
8
+ }