@lets-events/react 11.1.0 → 11.3.0

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 (56) hide show
  1. package/.eslintrc.json +2 -2
  2. package/.turbo/turbo-build.log +20 -18
  3. package/CHANGELOG.md +12 -0
  4. package/dist/index.d.mts +902 -137
  5. package/dist/index.d.ts +902 -137
  6. package/dist/index.js +294 -145
  7. package/dist/index.mjs +273 -124
  8. package/package.json +1 -1
  9. package/src/components/Alert.tsx +303 -303
  10. package/src/components/Avatar.tsx +55 -55
  11. package/src/components/Badge.tsx +128 -128
  12. package/src/components/Box.tsx +3 -3
  13. package/src/components/Button/index.tsx +16 -13
  14. package/src/components/Button/styledComponents.ts +287 -276
  15. package/src/components/ButtonGroup.tsx +484 -484
  16. package/src/components/Calendar/index.tsx +136 -136
  17. package/src/components/Calendar/styledComponents.ts +209 -209
  18. package/src/components/Card.tsx +48 -48
  19. package/src/components/CheckboxGroup.tsx +214 -214
  20. package/src/components/Container.tsx +39 -39
  21. package/src/components/Drawer/index.tsx +48 -0
  22. package/src/components/Drawer/styledComponents.ts +46 -0
  23. package/src/components/Dropdown.tsx +167 -167
  24. package/src/components/Filter.tsx +164 -164
  25. package/src/components/Flex.tsx +118 -118
  26. package/src/components/FormFields/ErrorFormMessage.tsx +36 -36
  27. package/src/components/FormFields/Form.tsx +25 -0
  28. package/src/components/FormFields/FormLabel.tsx +29 -29
  29. package/src/components/FormFields/TextAreaFormField.tsx +46 -46
  30. package/src/components/FormFields/TextFormField.tsx +46 -46
  31. package/src/components/Grid.tsx +137 -137
  32. package/src/components/Icon.tsx +47 -47
  33. package/src/components/MenuDropdown/index.tsx +30 -0
  34. package/src/components/MenuDropdown/styledComponents.ts +31 -0
  35. package/src/components/Modal.tsx +90 -90
  36. package/src/components/RadioGroup.tsx +210 -210
  37. package/src/components/Section.tsx +33 -33
  38. package/src/components/Step.tsx +164 -164
  39. package/src/components/Switch.tsx +108 -108
  40. package/src/components/Text.tsx +39 -39
  41. package/src/components/TextField.tsx +315 -315
  42. package/src/components/TextareaField.tsx +128 -128
  43. package/src/components/TimePicker.tsx +298 -298
  44. package/src/components/Toast/components/ToastItem.tsx +41 -41
  45. package/src/components/Toast/components/ToastProvider.tsx +63 -63
  46. package/src/components/Toast/hooks/useToast.ts +12 -12
  47. package/src/components/Toast/index.tsx +5 -5
  48. package/src/components/Toast/styles/index.ts +135 -135
  49. package/src/components/Toast/types/index.ts +46 -46
  50. package/src/components/Tooltip/index.tsx +66 -66
  51. package/src/components/Tooltip/styles.ts +77 -77
  52. package/src/hooks/useOnClickOutside.tsx +20 -20
  53. package/src/index.tsx +42 -40
  54. package/src/styles/index.ts +38 -38
  55. package/src/types/typographyValues.ts +178 -178
  56. package/tsconfig.json +3 -3
@@ -1,138 +1,138 @@
1
- import { ComponentProps, ElementType } from 'react';
2
- import { styled } from '../styles'
3
- import { Grid as GridRadix } from "@radix-ui/themes";
4
- export const GridStyled = styled(GridRadix, {
5
- display: 'grid',
6
- variants: {
7
- display: {
8
- 'grid': { display: 'grid' },
9
- 'inline-grid': { display: 'inline-grid' },
10
- },
11
- align: {
12
- start: { alignItems: 'start' },
13
- center: { alignItems: 'center' },
14
- end: { alignItems: 'end' },
15
- stretch: { alignItems: 'stretch' },
16
- },
17
- justify: {
18
- start: { justifyContent: 'start' },
19
- center: { justifyContent: 'center' },
20
- end: { justifyContent: 'end' },
21
- between: { justifyContent: 'space-between' },
22
- },
23
- flow: {
24
- row: { gridAutoFlow: 'row' },
25
- column: { gridAutoFlow: 'column' },
26
- 'row-dense': { gridAutoFlow: 'row dense' },
27
- 'column-dense': { gridAutoFlow: 'column dense' },
28
- },
29
- columns: {
30
- 1: { gridTemplateColumns: 'repeat(1, 1fr)' },
31
- 2: { gridTemplateColumns: 'repeat(2, 1fr)' },
32
- 3: { gridTemplateColumns: 'repeat(3, 1fr)' },
33
- 4: { gridTemplateColumns: 'repeat(4, 1fr)' },
34
- 6: { gridTemplateColumns: 'repeat(6, 1fr)' },
35
- 12: { gridTemplateColumns: 'repeat(12, 1fr)' },
36
- },
37
- rows: {
38
- 1: { gridTemplateRows: 'repeat(1, 1fr)' },
39
- 2: { gridTemplateRows: 'repeat(2, 1fr)' },
40
- 3: { gridTemplateRows: 'repeat(3, 1fr)' },
41
- 4: { gridTemplateRows: 'repeat(4, 1fr)' },
42
- 5: { gridTemplateRows: 'repeat(5, 1fr)' },
43
- 6: { gridTemplateRows: 'repeat(6, 1fr)' },
44
- 7: { gridTemplateRows: 'repeat(7, 1fr)' },
45
- 8: { gridTemplateRows: 'repeat(8, 1fr)' },
46
- 9: { gridTemplateRows: 'repeat(9, 1fr)' },
47
- 10: { gridTemplateRows: 'repeat(10, 1fr)' },
48
- 11: { gridTemplateRows: 'repeat(11, 1fr)' },
49
- 12: { gridTemplateRows: 'repeat(12, 1fr)' },
50
- auto: { gridTemplateRows: 'auto' },
51
- },
52
- gap: {
53
- 2: { gap: '$2' },
54
- 4: { gap: '$4' },
55
- 6: { gap: '$6' },
56
- 8: { gap: '$8' },
57
- 10: { gap: '$10' },
58
- 12: { gap: '$12' },
59
- 14: { gap: '$14' },
60
- 16: { gap: '$16' },
61
- 20: { gap: '$20' },
62
- 22: { gap: '$22' },
63
- 24: { gap: '$24' },
64
- 32: { gap: '$32' },
65
- 36: { gap: '$36' },
66
- 40: { gap: '$40' },
67
- 48: { gap: '$48' },
68
- 56: { gap: '$56' },
69
- 64: { gap: '$64' },
70
- 72: { gap: '$72' },
71
- 80: { gap: '$80' },
72
- full: { gap: '$full' },
73
- },
74
- gapX: {
75
- 2: { gap: '$2' },
76
- 4: { gap: '$4' },
77
- 6: { gap: '$6' },
78
- 8: { gap: '$8' },
79
- 10: { gap: '$10' },
80
- 12: { gap: '$12' },
81
- 14: { gap: '$14' },
82
- 16: { gap: '$16' },
83
- 20: { gap: '$20' },
84
- 22: { gap: '$22' },
85
- 24: { gap: '$24' },
86
- 32: { gap: '$32' },
87
- 36: { gap: '$36' },
88
- 40: { gap: '$40' },
89
- 48: { gap: '$48' },
90
- 56: { gap: '$56' },
91
- 64: { gap: '$64' },
92
- 72: { gap: '$72' },
93
- 80: { gap: '$80' },
94
- full: { gap: '$full' },
95
- },
96
- gapY: {
97
- 2: { gap: '$2' },
98
- 4: { gap: '$4' },
99
- 6: { gap: '$6' },
100
- 8: { gap: '$8' },
101
- 10: { gap: '$10' },
102
- 12: { gap: '$12' },
103
- 14: { gap: '$14' },
104
- 16: { gap: '$16' },
105
- 20: { gap: '$20' },
106
- 22: { gap: '$22' },
107
- 24: { gap: '$24' },
108
- 32: { gap: '$32' },
109
- 36: { gap: '$36' },
110
- 40: { gap: '$40' },
111
- 48: { gap: '$48' },
112
- 56: { gap: '$56' },
113
- 64: { gap: '$64' },
114
- 72: { gap: '$72' },
115
- 80: { gap: '$80' },
116
- full: { gap: '$full' },
117
- },
118
- },
119
- defaultVariants: {
120
- gap: 10,
121
- }
122
-
123
- })
124
-
125
- export type GridProps = ComponentProps<typeof GridStyled> & {
126
- as?: ElementType
127
- children: React.ReactNode,
128
- areas?: string
129
- }
130
-
131
-
132
- export function Grid({ children, ...props }: GridProps) {
133
- return (
134
- <GridStyled {...props}>
135
- {children}
136
- </GridStyled>
137
- )
1
+ import { ComponentProps, ElementType } from 'react';
2
+ import { styled } from '../styles'
3
+ import { Grid as GridRadix } from "@radix-ui/themes";
4
+ export const GridStyled = styled(GridRadix, {
5
+ display: 'grid',
6
+ variants: {
7
+ display: {
8
+ 'grid': { display: 'grid' },
9
+ 'inline-grid': { display: 'inline-grid' },
10
+ },
11
+ align: {
12
+ start: { alignItems: 'start' },
13
+ center: { alignItems: 'center' },
14
+ end: { alignItems: 'end' },
15
+ stretch: { alignItems: 'stretch' },
16
+ },
17
+ justify: {
18
+ start: { justifyContent: 'start' },
19
+ center: { justifyContent: 'center' },
20
+ end: { justifyContent: 'end' },
21
+ between: { justifyContent: 'space-between' },
22
+ },
23
+ flow: {
24
+ row: { gridAutoFlow: 'row' },
25
+ column: { gridAutoFlow: 'column' },
26
+ 'row-dense': { gridAutoFlow: 'row dense' },
27
+ 'column-dense': { gridAutoFlow: 'column dense' },
28
+ },
29
+ columns: {
30
+ 1: { gridTemplateColumns: 'repeat(1, 1fr)' },
31
+ 2: { gridTemplateColumns: 'repeat(2, 1fr)' },
32
+ 3: { gridTemplateColumns: 'repeat(3, 1fr)' },
33
+ 4: { gridTemplateColumns: 'repeat(4, 1fr)' },
34
+ 6: { gridTemplateColumns: 'repeat(6, 1fr)' },
35
+ 12: { gridTemplateColumns: 'repeat(12, 1fr)' },
36
+ },
37
+ rows: {
38
+ 1: { gridTemplateRows: 'repeat(1, 1fr)' },
39
+ 2: { gridTemplateRows: 'repeat(2, 1fr)' },
40
+ 3: { gridTemplateRows: 'repeat(3, 1fr)' },
41
+ 4: { gridTemplateRows: 'repeat(4, 1fr)' },
42
+ 5: { gridTemplateRows: 'repeat(5, 1fr)' },
43
+ 6: { gridTemplateRows: 'repeat(6, 1fr)' },
44
+ 7: { gridTemplateRows: 'repeat(7, 1fr)' },
45
+ 8: { gridTemplateRows: 'repeat(8, 1fr)' },
46
+ 9: { gridTemplateRows: 'repeat(9, 1fr)' },
47
+ 10: { gridTemplateRows: 'repeat(10, 1fr)' },
48
+ 11: { gridTemplateRows: 'repeat(11, 1fr)' },
49
+ 12: { gridTemplateRows: 'repeat(12, 1fr)' },
50
+ auto: { gridTemplateRows: 'auto' },
51
+ },
52
+ gap: {
53
+ 2: { gap: '$2' },
54
+ 4: { gap: '$4' },
55
+ 6: { gap: '$6' },
56
+ 8: { gap: '$8' },
57
+ 10: { gap: '$10' },
58
+ 12: { gap: '$12' },
59
+ 14: { gap: '$14' },
60
+ 16: { gap: '$16' },
61
+ 20: { gap: '$20' },
62
+ 22: { gap: '$22' },
63
+ 24: { gap: '$24' },
64
+ 32: { gap: '$32' },
65
+ 36: { gap: '$36' },
66
+ 40: { gap: '$40' },
67
+ 48: { gap: '$48' },
68
+ 56: { gap: '$56' },
69
+ 64: { gap: '$64' },
70
+ 72: { gap: '$72' },
71
+ 80: { gap: '$80' },
72
+ full: { gap: '$full' },
73
+ },
74
+ gapX: {
75
+ 2: { gap: '$2' },
76
+ 4: { gap: '$4' },
77
+ 6: { gap: '$6' },
78
+ 8: { gap: '$8' },
79
+ 10: { gap: '$10' },
80
+ 12: { gap: '$12' },
81
+ 14: { gap: '$14' },
82
+ 16: { gap: '$16' },
83
+ 20: { gap: '$20' },
84
+ 22: { gap: '$22' },
85
+ 24: { gap: '$24' },
86
+ 32: { gap: '$32' },
87
+ 36: { gap: '$36' },
88
+ 40: { gap: '$40' },
89
+ 48: { gap: '$48' },
90
+ 56: { gap: '$56' },
91
+ 64: { gap: '$64' },
92
+ 72: { gap: '$72' },
93
+ 80: { gap: '$80' },
94
+ full: { gap: '$full' },
95
+ },
96
+ gapY: {
97
+ 2: { gap: '$2' },
98
+ 4: { gap: '$4' },
99
+ 6: { gap: '$6' },
100
+ 8: { gap: '$8' },
101
+ 10: { gap: '$10' },
102
+ 12: { gap: '$12' },
103
+ 14: { gap: '$14' },
104
+ 16: { gap: '$16' },
105
+ 20: { gap: '$20' },
106
+ 22: { gap: '$22' },
107
+ 24: { gap: '$24' },
108
+ 32: { gap: '$32' },
109
+ 36: { gap: '$36' },
110
+ 40: { gap: '$40' },
111
+ 48: { gap: '$48' },
112
+ 56: { gap: '$56' },
113
+ 64: { gap: '$64' },
114
+ 72: { gap: '$72' },
115
+ 80: { gap: '$80' },
116
+ full: { gap: '$full' },
117
+ },
118
+ },
119
+ defaultVariants: {
120
+ gap: 10,
121
+ }
122
+
123
+ })
124
+
125
+ export type GridProps = ComponentProps<typeof GridStyled> & {
126
+ as?: ElementType
127
+ children: React.ReactNode,
128
+ areas?: string
129
+ }
130
+
131
+
132
+ export function Grid({ children, ...props }: GridProps) {
133
+ return (
134
+ <GridStyled {...props}>
135
+ {children}
136
+ </GridStyled>
137
+ )
138
138
  }
@@ -1,48 +1,48 @@
1
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
2
- import { library } from "@fortawesome/fontawesome-svg-core";
3
- import { fas } from "@fortawesome/free-solid-svg-icons";
4
- import { far } from "@fortawesome/free-regular-svg-icons";
5
- import { fab } from "@fortawesome/free-brands-svg-icons";
6
- import { IconName, IconPrefix } from "@fortawesome/fontawesome-svg-core";
7
- import { FontAwesomeIconProps } from "@fortawesome/react-fontawesome";
8
- import PropTypes from "prop-types";
9
-
10
- library.add(fas, far, fab);
11
-
12
- interface IconProps extends Omit<FontAwesomeIconProps, "icon" | "size"> {
13
- name: IconName;
14
- size?: 'xs' | 'sm' | 'md' | 'xl';
15
- prefix?: IconPrefix;
16
- }
17
-
18
- export const Icon = ({ name, prefix = "fas", size = "sm", color = "currentColor", className = "", ...props }: IconProps) => {
19
- const sizeMap = {
20
-
21
- 'xs': { width: '0.625rem', height: '0.625rem', fontSize: '0.625rem' },
22
- 'sm': { width: '0.625rem', height: '0.625rem', fontSize: '0.625rem' },
23
- 'md': { width: '0.75rem', height: '0.75rem', fontSize: '0.75rem' },
24
- 'xl': { width: '1rem', height: '1rem', fontSize: '1rem' },
25
- undefined: { width: '0.75rem', height: '0.75rem', fontSize: '0.75rem' },
26
- } as const;
27
-
28
- return (
29
- <FontAwesomeIcon
30
- icon={[prefix, name]}
31
- style={sizeMap[size]}
32
- color={color}
33
- className={className}
34
- {...props}
35
- width={sizeMap[size]?.width}
36
- height={sizeMap[size]?.height}
37
- />
38
- );
39
- };
40
- Icon.propTypes = {
41
- name: PropTypes.string.isRequired,
42
- prefix: PropTypes.string,
43
- size: PropTypes.string,
44
- color: PropTypes.string,
45
- className: PropTypes.string,
46
- };
47
-
1
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
2
+ import { library } from "@fortawesome/fontawesome-svg-core";
3
+ import { fas } from "@fortawesome/free-solid-svg-icons";
4
+ import { far } from "@fortawesome/free-regular-svg-icons";
5
+ import { fab } from "@fortawesome/free-brands-svg-icons";
6
+ import { IconName, IconPrefix } from "@fortawesome/fontawesome-svg-core";
7
+ import { FontAwesomeIconProps } from "@fortawesome/react-fontawesome";
8
+ import PropTypes from "prop-types";
9
+
10
+ library.add(fas, far, fab);
11
+
12
+ interface IconProps extends Omit<FontAwesomeIconProps, "icon" | "size"> {
13
+ name: IconName;
14
+ size?: 'xs' | 'sm' | 'md' | 'xl';
15
+ prefix?: IconPrefix;
16
+ }
17
+
18
+ export const Icon = ({ name, prefix = "fas", size = "sm", color = "currentColor", className = "", ...props }: IconProps) => {
19
+ const sizeMap = {
20
+
21
+ 'xs': { width: '0.625rem', height: '0.625rem', fontSize: '0.625rem' },
22
+ 'sm': { width: '0.625rem', height: '0.625rem', fontSize: '0.625rem' },
23
+ 'md': { width: '0.75rem', height: '0.75rem', fontSize: '0.75rem' },
24
+ 'xl': { width: '1rem', height: '1rem', fontSize: '1rem' },
25
+ undefined: { width: '0.75rem', height: '0.75rem', fontSize: '0.75rem' },
26
+ } as const;
27
+
28
+ return (
29
+ <FontAwesomeIcon
30
+ icon={[prefix, name]}
31
+ style={sizeMap[size]}
32
+ color={color}
33
+ className={className}
34
+ {...props}
35
+ width={sizeMap[size]?.width}
36
+ height={sizeMap[size]?.height}
37
+ />
38
+ );
39
+ };
40
+ Icon.propTypes = {
41
+ name: PropTypes.string.isRequired,
42
+ prefix: PropTypes.string,
43
+ size: PropTypes.string,
44
+ color: PropTypes.string,
45
+ className: PropTypes.string,
46
+ };
47
+
48
48
  export default Icon;
@@ -0,0 +1,30 @@
1
+ import { ComponentProps, ReactNode, useState } from "react";
2
+ import {
3
+ MenuDropdownContainerStyled,
4
+ TriggerButtonStyled,
5
+ MenuItemsContainerStyled,
6
+ } from "./styledComponents";
7
+ import Icon from "../Icon";
8
+
9
+ export type MenuDropdownProps = ComponentProps<
10
+ typeof MenuDropdownContainerStyled
11
+ > & {
12
+ children: ReactNode;
13
+ };
14
+
15
+ export function MenuDropdown({ children }: MenuDropdownProps) {
16
+ const [isOpen, setIsOpen] = useState(false);
17
+ function handleMenuDropdown() {
18
+ setIsOpen(!isOpen);
19
+ }
20
+ return (
21
+ <MenuDropdownContainerStyled>
22
+ <TriggerButtonStyled onClick={handleMenuDropdown}>
23
+ <Icon name="ellipsis" size="xl" color="#FFFFFF" />
24
+ </TriggerButtonStyled>
25
+ {isOpen && (
26
+ <MenuItemsContainerStyled>{children}</MenuItemsContainerStyled>
27
+ )}
28
+ </MenuDropdownContainerStyled>
29
+ );
30
+ }
@@ -0,0 +1,31 @@
1
+ import { styled } from "../../styles";
2
+
3
+ export const MenuDropdownContainerStyled = styled("div", {
4
+ position: "relative",
5
+ width: "fit-content",
6
+ });
7
+ export const TriggerButtonStyled = styled("button", {
8
+ backgroundColor: "$brand500",
9
+ boxShadow: "0px 4px 4px 0px #23354314",
10
+ borderRadius: "$full",
11
+ border: "none",
12
+ height: "1.875rem",
13
+ width: "1.875rem",
14
+ cursor: "pointer",
15
+ });
16
+ export const MenuItemsContainerStyled = styled("div", {
17
+ position: "absolute",
18
+ right: 0,
19
+ top: "2.125rem",
20
+ zIndex: "999",
21
+ width: "fit-content",
22
+ minWidth: "5rem",
23
+ background: "#fff",
24
+ maxWidth: "18.75rem",
25
+ margin: "auto",
26
+ boxShadow: "0px 4px 4px 0px rgba(35, 53, 67, 0.0784313725)",
27
+ border: "1px solid $dark300",
28
+ borderRadius: "0.5rem",
29
+ padding: "0.5rem 0",
30
+ height: "fit-content",
31
+ });
@@ -1,90 +1,90 @@
1
- import { ComponentProps } from "react";
2
- import { styled } from "../styles";
3
- import { Dialog as ModalRadix } from "radix-ui";
4
- import Icon from "./Icon";
5
- import { Box } from "./Box";
6
- import { Text } from "./Text";
7
-
8
- const ModalContentStyled = styled(ModalRadix.Content, {
9
- fontFamily: "$default",
10
- lineHeight: "$base",
11
- fontSize: "$13",
12
- maxWidth: "502px",
13
- width: "100%",
14
- border: "1px solid $neutral",
15
- borderRadius: "$2xl",
16
- boxShadow:
17
- "0px 4px 4px 0px rgba(35, 53, 67, 0.08), 0px 2px 4px 0px rgba(35, 53, 67, 0.16)",
18
- position: "fixed",
19
- top: "50%",
20
- left: "50%",
21
- transform: "translate(-50%, -50%)",
22
- backgroundColor: "$dark50",
23
- zIndex: '10001'
24
- });
25
-
26
- const ModalOverlay = styled(ModalRadix.Overlay, {
27
- position: "fixed",
28
- inset: 0,
29
- opacity: 1,
30
- backgroundColor: "rgba(0, 0, 0, .5)",
31
- zIndex: '10000'
32
- });
33
-
34
- const ModalHeaderStyled = styled("div", {
35
- borderBottom: "1px solid $neutral300",
36
- padding: "$18 $24",
37
- textAlign: "center",
38
- position: "relative",
39
- display: "flex",
40
- alignItems: "center",
41
- justifyContent: "center",
42
- });
43
-
44
- const ModalIconClose = styled(Icon, {
45
- position: "absolute",
46
- right: "$24",
47
- cursor: "pointer",
48
- });
49
-
50
- const ModalTitleStyled = styled(ModalRadix.Title, {
51
- fontFamily: "$default",
52
- lineHeight: "$base",
53
- fontSize: "$18",
54
- fontWeight: "medium",
55
- fontStyle: "normal",
56
- textTransform: "uppercase",
57
- });
58
-
59
- export type ModalProps = ComponentProps<typeof ModalRadix.Root> & {
60
- trigger?: React.ReactNode;
61
- title?: string;
62
- children: React.ReactNode;
63
- };
64
-
65
- export function Modal({ children, title, trigger, ...props }: ModalProps) {
66
- return (
67
- <ModalRadix.Root {...props}>
68
- {trigger && <ModalRadix.Trigger asChild>{trigger}</ModalRadix.Trigger>}
69
- <ModalRadix.Portal>
70
- <ModalOverlay>
71
- <ModalContentStyled>
72
- {title && (
73
- <ModalHeaderStyled>
74
- <ModalTitleStyled asChild>
75
- <Text typography={"headline6"} fontWeight={"medium"}>
76
- {title}
77
- </Text>
78
- </ModalTitleStyled>
79
- <ModalRadix.Close asChild>
80
- <ModalIconClose name="close" size="xl" />
81
- </ModalRadix.Close>
82
- </ModalHeaderStyled>
83
- )}
84
- <Box>{children}</Box>
85
- </ModalContentStyled>
86
- </ModalOverlay>
87
- </ModalRadix.Portal>
88
- </ModalRadix.Root>
89
- );
90
- }
1
+ import { ComponentProps } from "react";
2
+ import { styled } from "../styles";
3
+ import { Dialog as ModalRadix } from "radix-ui";
4
+ import Icon from "./Icon";
5
+ import { Box } from "./Box";
6
+ import { Text } from "./Text";
7
+
8
+ const ModalContentStyled = styled(ModalRadix.Content, {
9
+ fontFamily: "$default",
10
+ lineHeight: "$base",
11
+ fontSize: "$13",
12
+ maxWidth: "502px",
13
+ width: "100%",
14
+ border: "1px solid $neutral",
15
+ borderRadius: "$2xl",
16
+ boxShadow:
17
+ "0px 4px 4px 0px rgba(35, 53, 67, 0.08), 0px 2px 4px 0px rgba(35, 53, 67, 0.16)",
18
+ position: "fixed",
19
+ top: "50%",
20
+ left: "50%",
21
+ transform: "translate(-50%, -50%)",
22
+ backgroundColor: "$dark50",
23
+ zIndex: '10001'
24
+ });
25
+
26
+ const ModalOverlay = styled(ModalRadix.Overlay, {
27
+ position: "fixed",
28
+ inset: 0,
29
+ opacity: 1,
30
+ backgroundColor: "rgba(0, 0, 0, .5)",
31
+ zIndex: '10000'
32
+ });
33
+
34
+ const ModalHeaderStyled = styled("div", {
35
+ borderBottom: "1px solid $neutral300",
36
+ padding: "$18 $24",
37
+ textAlign: "center",
38
+ position: "relative",
39
+ display: "flex",
40
+ alignItems: "center",
41
+ justifyContent: "center",
42
+ });
43
+
44
+ const ModalIconClose = styled(Icon, {
45
+ position: "absolute",
46
+ right: "$24",
47
+ cursor: "pointer",
48
+ });
49
+
50
+ const ModalTitleStyled = styled(ModalRadix.Title, {
51
+ fontFamily: "$default",
52
+ lineHeight: "$base",
53
+ fontSize: "$18",
54
+ fontWeight: "medium",
55
+ fontStyle: "normal",
56
+ textTransform: "uppercase",
57
+ });
58
+
59
+ export type ModalProps = ComponentProps<typeof ModalRadix.Root> & {
60
+ trigger?: React.ReactNode;
61
+ title?: string;
62
+ children: React.ReactNode;
63
+ };
64
+
65
+ export function Modal({ children, title, trigger, ...props }: ModalProps) {
66
+ return (
67
+ <ModalRadix.Root {...props}>
68
+ {trigger && <ModalRadix.Trigger asChild>{trigger}</ModalRadix.Trigger>}
69
+ <ModalRadix.Portal>
70
+ <ModalOverlay>
71
+ <ModalContentStyled>
72
+ {title && (
73
+ <ModalHeaderStyled>
74
+ <ModalTitleStyled asChild>
75
+ <Text typography={"headline6"} fontWeight={"medium"}>
76
+ {title}
77
+ </Text>
78
+ </ModalTitleStyled>
79
+ <ModalRadix.Close asChild>
80
+ <ModalIconClose name="close" size="xl" />
81
+ </ModalRadix.Close>
82
+ </ModalHeaderStyled>
83
+ )}
84
+ <Box>{children}</Box>
85
+ </ModalContentStyled>
86
+ </ModalOverlay>
87
+ </ModalRadix.Portal>
88
+ </ModalRadix.Root>
89
+ );
90
+ }