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.
- package/. babelrc +3 -0
- package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-3920d97c51b8ad2521918fb1205babd22b0ed3d7 +1 -0
- package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-43fdebe5fc35e4e9fabee9a83c7faea931b05ea0 +1 -0
- package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-f086b87885981c04ce7a583ff90a49313de83de7 +1 -0
- package/.eslintrc.cjs +14 -0
- package/.storybook/main.ts +28 -0
- package/.storybook/preview.ts +22 -0
- package/README.md +30 -0
- package/package.json +63 -0
- package/public/assets/components/quotes.svg +3 -0
- package/public/assets/empty-state.svg +19 -0
- package/public/assets/placeholder.png +0 -0
- package/public/assets/video.mp4 +0 -0
- package/public/fonts/miewfont/miewfont.eot +0 -0
- package/public/fonts/miewfont/miewfont.svg +35 -0
- package/public/fonts/miewfont/miewfont.ttf +0 -0
- package/public/fonts/miewfont/miewfont.woff +0 -0
- package/src/components/atoms/Button/Button.component.tsx +48 -0
- package/src/components/atoms/Button/Button.interface.ts +29 -0
- package/src/components/atoms/Button/Button.stories.tsx +58 -0
- package/src/components/atoms/Button/Button.theme.ts +126 -0
- package/src/components/atoms/Button/index.ts +1 -0
- package/src/components/atoms/Chip/Chip.component.tsx +26 -0
- package/src/components/atoms/Chip/Chip.interface.ts +10 -0
- package/src/components/atoms/Chip/Chip.stories.tsx +34 -0
- package/src/components/atoms/Chip/Chip.theme.ts +47 -0
- package/src/components/atoms/Chip/index.ts +1 -0
- package/src/components/atoms/CloseButton/CloseButton.component.tsx +17 -0
- package/src/components/atoms/CloseButton/CloseButton.interface.ts +9 -0
- package/src/components/atoms/CloseButton/CloseButton.stories.tsx +24 -0
- package/src/components/atoms/CloseButton/CloseButton.theme.ts +66 -0
- package/src/components/atoms/CloseButton/index.ts +1 -0
- package/src/components/atoms/EmptyState/EmptyState.component.tsx +27 -0
- package/src/components/atoms/EmptyState/EmptyState.interface.ts +10 -0
- package/src/components/atoms/EmptyState/EmptyState.stories.tsx +34 -0
- package/src/components/atoms/EmptyState/EmptyState.theme.ts +27 -0
- package/src/components/atoms/EmptyState/index.ts +1 -0
- package/src/components/atoms/Flex/Flex.component.tsx +30 -0
- package/src/components/atoms/Flex/Flex.interface.ts +22 -0
- package/src/components/atoms/Flex/Flex.theme.ts +11 -0
- package/src/components/atoms/Flex/index.ts +1 -0
- package/src/components/atoms/FlexGrid/FlexGrid.component.tsx +61 -0
- package/src/components/atoms/FlexGrid/FlexGrid.interface.ts +55 -0
- package/src/components/atoms/FlexGrid/FlexGrid.stories.tsx +55 -0
- package/src/components/atoms/FlexGrid/FlexGrid.theme.ts +79 -0
- package/src/components/atoms/FlexGrid/index.ts +1 -0
- package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.component.tsx +22 -0
- package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.interface.tsx +6 -0
- package/src/components/atoms/FormField/CheckRadioField/CheckRadioField.theme.ts +126 -0
- package/src/components/atoms/FormField/CheckRadioField/index.ts +1 -0
- package/src/components/atoms/FormField/FormField.component.tsx +37 -0
- package/src/components/atoms/FormField/FormField.interface.ts +9 -0
- package/src/components/atoms/FormField/FormField.stories.tsx +499 -0
- package/src/components/atoms/FormField/FormField.theme.tsx +122 -0
- package/src/components/atoms/FormField/index.ts +1 -0
- package/src/components/atoms/Heading/Heading.component.tsx +17 -0
- package/src/components/atoms/Heading/Heading.interface.tsx +21 -0
- package/src/components/atoms/Heading/Heading.theme.ts +17 -0
- package/src/components/atoms/Heading/index.ts +1 -0
- package/src/components/atoms/Icon/Icon.component.tsx +19 -0
- package/src/components/atoms/Icon/Icon.interface.ts +8 -0
- package/src/components/atoms/Icon/Icon.stories.tsx +26 -0
- package/src/components/atoms/Icon/Icon.theme.ts +102 -0
- package/src/components/atoms/Icon/index.ts +1 -0
- package/src/components/atoms/ImageWrapper/ImageWrapper.component.tsx +42 -0
- package/src/components/atoms/ImageWrapper/ImageWrapper.interface.ts +16 -0
- package/src/components/atoms/ImageWrapper/ImageWrapper.stories.tsx +27 -0
- package/src/components/atoms/ImageWrapper/ImageWrapper.theme.ts +51 -0
- package/src/components/atoms/ImageWrapper/index.ts +1 -0
- package/src/components/atoms/Loader/Loader.component.tsx +26 -0
- package/src/components/atoms/Loader/Loader.interface.ts +10 -0
- package/src/components/atoms/Loader/Loader.stories.tsx +33 -0
- package/src/components/atoms/Loader/Loader.theme.ts +92 -0
- package/src/components/atoms/Loader/index.ts +1 -0
- package/src/components/atoms/Marquee/Marquee.component.tsx +130 -0
- package/src/components/atoms/Marquee/Marquee.interface.ts +8 -0
- package/src/components/atoms/Marquee/Marquee.stories.tsx +20 -0
- package/src/components/atoms/Marquee/Marquee.theme.ts +42 -0
- package/src/components/atoms/Marquee/index.ts +1 -0
- package/src/components/atoms/Quote/Quote.component.tsx +29 -0
- package/src/components/atoms/Quote/Quote.interface.ts +10 -0
- package/src/components/atoms/Quote/Quote.stories.tsx +25 -0
- package/src/components/atoms/Quote/Quote.theme.ts +26 -0
- package/src/components/atoms/Quote/index.ts +1 -0
- package/src/components/atoms/RichText/RichText.component.tsx +31 -0
- package/src/components/atoms/RichText/RichText.interface.ts +11 -0
- package/src/components/atoms/RichText/RichText.stories.tsx +73 -0
- package/src/components/atoms/RichText/RichText.theme.ts +32 -0
- package/src/components/atoms/RichText/index.ts +1 -0
- package/src/components/atoms/ScrollingNav/ScrollingNav.component.tsx +18 -0
- package/src/components/atoms/ScrollingNav/ScrollingNav.interface.ts +8 -0
- package/src/components/atoms/ScrollingNav/ScrollingNav.stories.tsx +44 -0
- package/src/components/atoms/ScrollingNav/ScrollingNav.theme.ts +55 -0
- package/src/components/atoms/ScrollingNav/index.ts +1 -0
- package/src/components/atoms/Separator/Separator.component.tsx +19 -0
- package/src/components/atoms/Separator/Separator.interface.tsx +9 -0
- package/src/components/atoms/Separator/Separator.stories.tsx +28 -0
- package/src/components/atoms/Separator/Separator.theme.ts +12 -0
- package/src/components/atoms/Separator/index.ts +1 -0
- package/src/components/atoms/SocialLinks/SocialLinks.component.tsx +35 -0
- package/src/components/atoms/SocialLinks/SocialLinks.interface.ts +8 -0
- package/src/components/atoms/SocialLinks/SocialLinks.stories.tsx +36 -0
- package/src/components/atoms/SocialLinks/SocialLinks.theme.ts +52 -0
- package/src/components/atoms/SocialLinks/index.ts +1 -0
- package/src/components/atoms/Spacer/Spacer.component.tsx +27 -0
- package/src/components/atoms/Spacer/Spacer.interface.ts +11 -0
- package/src/components/atoms/Spacer/Spacer.stories.tsx +28 -0
- package/src/components/atoms/Spacer/Spacer.theme.ts +8 -0
- package/src/components/atoms/Spacer/index.ts +1 -0
- package/src/components/atoms/Video/Video.component.tsx +116 -0
- package/src/components/atoms/Video/Video.interface.ts +13 -0
- package/src/components/atoms/Video/Video.stories.tsx +37 -0
- package/src/components/atoms/Video/Video.theme.ts +44 -0
- package/src/components/atoms/Video/index.ts +1 -0
- package/src/components/atoms/VideoEmbed/VideoEmbed.component.tsx +109 -0
- package/src/components/atoms/VideoEmbed/VideoEmbed.interface.ts +13 -0
- package/src/components/atoms/VideoEmbed/VideoEmbed.stories.tsx +23 -0
- package/src/components/atoms/VideoEmbed/VideoEmbed.theme.ts +45 -0
- package/src/components/atoms/VideoEmbed/index.ts +1 -0
- package/src/components/common/PortalComponent/PortalComponent.tsx +48 -0
- package/src/components/common/PortalComponent/index.ts +1 -0
- package/src/components/molecules/Accordion/Accordion.component.tsx +58 -0
- package/src/components/molecules/Accordion/Accordion.interface.ts +15 -0
- package/src/components/molecules/Accordion/Accordion.stories.tsx +100 -0
- package/src/components/molecules/Accordion/Accordion.theme.ts +66 -0
- package/src/components/molecules/Accordion/index.ts +1 -0
- package/src/components/molecules/BlogCard/BlogCard.component.tsx +48 -0
- package/src/components/molecules/BlogCard/BlogCard.interface.ts +10 -0
- package/src/components/molecules/BlogCard/BlogCard.stories.tsx +37 -0
- package/src/components/molecules/BlogCard/BlogCard.theme.ts +63 -0
- package/src/components/molecules/BlogCard/index.ts +1 -0
- package/src/components/molecules/Card/Card.component.tsx +15 -0
- package/src/components/molecules/Card/Card.interface.ts +10 -0
- package/src/components/molecules/Card/Card.theme.ts +53 -0
- package/src/components/molecules/Card/index.ts +1 -0
- package/src/components/molecules/Dropdown/Dropdown.component.tsx +67 -0
- package/src/components/molecules/Dropdown/Dropdown.interface.ts +26 -0
- package/src/components/molecules/Dropdown/Dropdown.stories.tsx +54 -0
- package/src/components/molecules/Dropdown/Dropdown.theme.ts +50 -0
- package/src/components/molecules/Dropdown/index.ts +1 -0
- package/src/components/molecules/IconBox/IconBox.component.tsx +29 -0
- package/src/components/molecules/IconBox/IconBox.interface.tsx +10 -0
- package/src/components/molecules/IconBox/IconBox.stories.tsx +23 -0
- package/src/components/molecules/IconBox/IconBox.theme.ts +25 -0
- package/src/components/molecules/IconBox/index.ts +1 -0
- package/src/components/molecules/IconTitle/IconTitle.component.tsx +24 -0
- package/src/components/molecules/IconTitle/IconTitle.interface.tsx +10 -0
- package/src/components/molecules/IconTitle/IconTitle.stories.tsx +49 -0
- package/src/components/molecules/IconTitle/IconTitle.theme.ts +10 -0
- package/src/components/molecules/IconTitle/index.ts +1 -0
- package/src/components/molecules/Modal/Modal.component.tsx +70 -0
- package/src/components/molecules/Modal/Modal.interface.ts +11 -0
- package/src/components/molecules/Modal/Modal.stories.tsx +57 -0
- package/src/components/molecules/Modal/Modal.theme.ts +55 -0
- package/src/components/molecules/Modal/index.ts +1 -0
- package/src/components/molecules/OffCanvas/OffCanvas.component.tsx +55 -0
- package/src/components/molecules/OffCanvas/OffCanvas.interface.ts +12 -0
- package/src/components/molecules/OffCanvas/OffCanvas.stories.tsx +55 -0
- package/src/components/molecules/OffCanvas/OffCanvas.theme.ts +50 -0
- package/src/components/molecules/OffCanvas/index.ts +1 -0
- package/src/components/molecules/ProjectCard/ProjectCard.component.tsx +45 -0
- package/src/components/molecules/ProjectCard/ProjectCard.interface.ts +8 -0
- package/src/components/molecules/ProjectCard/ProjectCard.stories.tsx +72 -0
- package/src/components/molecules/ProjectCard/ProjectCard.theme.ts +61 -0
- package/src/components/molecules/ProjectCard/index.ts +1 -0
- package/src/components/molecules/ShareModal/ShareModal.component.tsx +166 -0
- package/src/components/molecules/ShareModal/ShareModal.interface.ts +9 -0
- package/src/components/molecules/ShareModal/ShareModal.stories.tsx +33 -0
- package/src/components/molecules/ShareModal/ShareModal.theme.ts +101 -0
- package/src/components/molecules/ShareModal/index.ts +1 -0
- package/src/components/molecules/TeamCard/TeamCard.component.tsx +31 -0
- package/src/components/molecules/TeamCard/TeamCard.interface.ts +7 -0
- package/src/components/molecules/TeamCard/TeamCard.stories.tsx +33 -0
- package/src/components/molecules/TeamCard/TeamCard.theme.ts +12 -0
- package/src/components/molecules/TeamCard/index.ts +1 -0
- package/src/components/organisms/Cover/Cover.component.tsx +46 -0
- package/src/components/organisms/Cover/Cover.interface.ts +14 -0
- package/src/components/organisms/Cover/Cover.stories.tsx +97 -0
- package/src/components/organisms/Cover/Cover.theme.ts +49 -0
- package/src/components/organisms/Cover/index.ts +1 -0
- package/src/components/organisms/Slider/Slider.component.tsx +145 -0
- package/src/components/organisms/Slider/Slider.interface.ts +17 -0
- package/src/components/organisms/Slider/Slider.stories.tsx +73 -0
- package/src/components/organisms/Slider/Slider.theme.ts +125 -0
- package/src/components/organisms/Slider/Slider.utils.tsx +19 -0
- package/src/components/organisms/Slider/index.ts +1 -0
- package/src/helpers/clickOutsideToClose.tsx +17 -0
- package/src/helpers/getIcons.ts +5 -0
- package/src/helpers/useMediaQuery.tsx +24 -0
- package/src/helpers/uuid.ts +5 -0
- package/src/iconsList.json +1 -0
- package/src/index.ts +53 -0
- package/src/reportWebVitals.js +13 -0
- package/src/stories/Documentation/Colors.stories.tsx +33 -0
- package/src/stories/Documentation/Headings.stories.tsx +24 -0
- package/src/stories/Documentation/Icons.stories.tsx +73 -0
- package/src/stories/Documentation/JWT.stories.tsx +60 -0
- package/src/stories/Documentation/Utilities.stories.tsx +65 -0
- package/src/styles/Global.ts +296 -0
- package/src/styles/grid.ts +70 -0
- package/src/styles/reset.ts +47 -0
- package/src/styles/utilities.ts +326 -0
- package/src/styles/variables.ts +168 -0
- package/tsconfig.json +29 -0
- package/tsconfig.node.json +11 -0
- 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,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,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,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
|