@lets-events/react 12.10.16 → 12.11.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 (97) hide show
  1. package/.eslintrc.json +2 -2
  2. package/.turbo/turbo-build.log +21 -19
  3. package/CHANGELOG.md +12 -0
  4. package/dist/index.d.mts +70 -52
  5. package/dist/index.d.ts +70 -52
  6. package/dist/index.js +358 -263
  7. package/dist/index.mjs +335 -240
  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 +132 -132
  12. package/src/components/Box.tsx +3 -3
  13. package/src/components/Button/index.tsx +85 -85
  14. package/src/components/Button/styledComponents.ts +361 -361
  15. package/src/components/ButtonGroup.tsx +484 -484
  16. package/src/components/Calendar/index.tsx +168 -168
  17. package/src/components/Calendar/styledComponents.ts +480 -480
  18. package/src/components/Card.tsx +74 -67
  19. package/src/components/CheckboxGroup.tsx +176 -176
  20. package/src/components/Container.tsx +39 -39
  21. package/src/components/Divider.tsx +7 -7
  22. package/src/components/DoubleCalendar/index.tsx +204 -204
  23. package/src/components/Drawer/index.tsx +113 -113
  24. package/src/components/Drawer/styledComponents.ts +97 -97
  25. package/src/components/Dropdown.tsx +302 -302
  26. package/src/components/Filter.tsx +164 -164
  27. package/src/components/Flex.tsx +130 -130
  28. package/src/components/FormFields/AddressFormFields/CityFormField.tsx +111 -111
  29. package/src/components/FormFields/AddressFormFields/CountryFormField.tsx +33 -33
  30. package/src/components/FormFields/AddressFormFields/PostalCodeFormField.tsx +39 -39
  31. package/src/components/FormFields/AddressFormFields/StateFormField.tsx +32 -32
  32. package/src/components/FormFields/AddressFormFields/index.tsx +141 -141
  33. package/src/components/FormFields/BirthDateFormField.tsx +84 -84
  34. package/src/components/FormFields/CNPJFormField.tsx +87 -87
  35. package/src/components/FormFields/CPFFormField.tsx +78 -78
  36. package/src/components/FormFields/CalendarFormField.tsx +98 -98
  37. package/src/components/FormFields/CheckboxGroupFormField.tsx +91 -91
  38. package/src/components/FormFields/DateAndTimeFormField.tsx +217 -217
  39. package/src/components/FormFields/DoubleCalendarFormField.tsx +96 -96
  40. package/src/components/FormFields/EmailFormField.tsx +27 -27
  41. package/src/components/FormFields/Form.tsx +39 -39
  42. package/src/components/FormFields/IdentityDocumentNumberFormField.tsx +32 -32
  43. package/src/components/FormFields/MultiSelectFormField.tsx +64 -64
  44. package/src/components/FormFields/PhoneFormField.tsx +40 -40
  45. package/src/components/FormFields/RadioGroupFormField.tsx +88 -88
  46. package/src/components/FormFields/RichEditorFormField.tsx +128 -128
  47. package/src/components/FormFields/SelectFormField.tsx +113 -113
  48. package/src/components/FormFields/SwitchFormField.tsx +46 -46
  49. package/src/components/FormFields/TextAreaFormField.tsx +61 -61
  50. package/src/components/FormFields/TextFormField.tsx +112 -112
  51. package/src/components/FormFields/TimePickerFormField.tsx +88 -88
  52. package/src/components/FormFields/subComponents/ErrorFormMessage.tsx +36 -36
  53. package/src/components/FormFields/subComponents/FormLabel.tsx +36 -36
  54. package/src/components/FormFields/utils/validation.ts +23 -23
  55. package/src/components/Grid.tsx +137 -137
  56. package/src/components/Icon.tsx +47 -47
  57. package/src/components/MenuDropdown/index.tsx +38 -38
  58. package/src/components/MenuDropdown/styledComponents.ts +31 -31
  59. package/src/components/Modal.tsx +130 -114
  60. package/src/components/MultiSelect/index.tsx +417 -305
  61. package/src/components/MultiSelect/styledComponents.ts +176 -160
  62. package/src/components/RadioGroup.tsx +210 -210
  63. package/src/components/RichEditor/QuillComponent.tsx +419 -419
  64. package/src/components/RichEditor/RichEditor.tsx +53 -53
  65. package/src/components/RichEditor/RichTextPresenter.tsx +18 -18
  66. package/src/components/RichEditor/editorConfig.ts +149 -149
  67. package/src/components/RichEditor/index.ts +3 -3
  68. package/src/components/RichEditor/styledComponents.ts +1175 -1175
  69. package/src/components/RichEditor/types.ts +12 -12
  70. package/src/components/Section.tsx +33 -33
  71. package/src/components/Step.tsx +164 -164
  72. package/src/components/Switch.tsx +108 -108
  73. package/src/components/Text.tsx +54 -54
  74. package/src/components/TextField.tsx +423 -423
  75. package/src/components/TextareaField.tsx +116 -116
  76. package/src/components/TimePicker.tsx +357 -357
  77. package/src/components/Toast/components/ToastItem.tsx +41 -41
  78. package/src/components/Toast/components/ToastProvider.tsx +63 -63
  79. package/src/components/Toast/hooks/useToast.ts +12 -12
  80. package/src/components/Toast/index.tsx +5 -5
  81. package/src/components/Toast/styles/index.ts +135 -135
  82. package/src/components/Toast/types/index.ts +46 -46
  83. package/src/components/ToggleElement/index.tsx +58 -58
  84. package/src/components/Tooltip/index.tsx +73 -73
  85. package/src/components/Tooltip/styles.ts +77 -77
  86. package/src/hooks/useCountries.ts +41 -41
  87. package/src/hooks/useImageUpload.ts +139 -139
  88. package/src/hooks/useMediaQuery.ts +19 -0
  89. package/src/hooks/useOnClickOutside.tsx +42 -42
  90. package/src/index.tsx +72 -72
  91. package/src/styles/index.ts +41 -41
  92. package/src/types/typographyValues.ts +178 -178
  93. package/src/utils/getNestedValue.ts +3 -3
  94. package/src/utils/states.ts +29 -29
  95. package/src/utils/uploadService.ts +180 -180
  96. package/tsconfig.json +3 -3
  97. package/tsup.config.ts +38 -38
@@ -1,204 +1,204 @@
1
- import React, { ComponentProps, useRef, useEffect, useState } from "react";
2
- import { useOnClickOutside } from "../../hooks/useOnClickOutside";
3
- import { DayPicker, Matcher } from "react-day-picker";
4
- import { ptBR } from "date-fns/locale";
5
- import { format, addYears } from "date-fns";
6
- import { Button } from "../Button";
7
- import { Box } from "../Box";
8
- import { TextField, TextFieldSlot } from "../TextField";
9
- import Icon from "../Icon";
10
- import {
11
- CalendarContentStyled,
12
- CalendarFooterStyled,
13
- CalendarStyled,
14
- DayPickerWrapperStyledToDoubleCalendar,
15
- CalendarButtonStyled,
16
- } from "../Calendar/styledComponents";
17
-
18
- export type DateRange = { from?: Date; to?: Date } | undefined;
19
-
20
- export type DoubleCalendarProps = ComponentProps<typeof CalendarStyled> & {
21
- calendarLayout?: "label" | "dropdown" | "dropdown-months" | "dropdown-years";
22
- selected: DateRange;
23
- setSelected: React.Dispatch<React.SetStateAction<DateRange>>;
24
- position?: "top" | "bottom" | "top-right" | "bottom-right";
25
- action?: boolean;
26
- simpleAction?: boolean;
27
- actionText?: string;
28
- hasError?: boolean;
29
- expand?: boolean;
30
- allowPastDates?: boolean;
31
- maxYearsFromNow?: number;
32
- maxDate?: Date;
33
- disabled?: boolean;
34
- };
35
-
36
- export function DoubleCalendar({
37
- action,
38
- actionText,
39
- simpleAction,
40
- calendarLayout,
41
- selected,
42
- setSelected,
43
- position = "bottom",
44
- hasError,
45
- expand,
46
- allowPastDates = false,
47
- maxYearsFromNow = 20,
48
- maxDate,
49
- disabled = false,
50
- ...props
51
- }: DoubleCalendarProps) {
52
- const [startValue, setStartValue] = useState("");
53
- const [endValue, setEndValue] = useState("");
54
- const [showContainer, setShowCalendar] = useState(false);
55
- const initialSelectedRef = useRef<DateRange | undefined>(undefined);
56
-
57
- const dropdownRef = useRef<HTMLDivElement>(null);
58
-
59
- useOnClickOutside(dropdownRef, () => {
60
- setShowCalendar(false);
61
- });
62
- const today = new Date();
63
- const resolvedMaxDate =
64
- maxDate ??
65
- (typeof maxYearsFromNow === "number" ? addYears(today, maxYearsFromNow) : undefined);
66
- const disabledDays: Matcher[] = [];
67
-
68
- if (!allowPastDates) {
69
- disabledDays.push({ before: today });
70
- }
71
- if (resolvedMaxDate) {
72
- disabledDays.push({ after: resolvedMaxDate });
73
- }
74
-
75
- useEffect(() => {
76
- if (selected && selected.from) {
77
- setStartValue(format(selected.from, "dd/MM/yyyy"));
78
- } else {
79
- setStartValue("");
80
- }
81
-
82
- if (selected && selected.to) {
83
- setEndValue(format(selected.to, "dd/MM/yyyy"));
84
- } else {
85
- setEndValue("");
86
- }
87
- }, [selected]);
88
-
89
- return (
90
- <div>
91
- <CalendarStyled {...props} expand={expand} ref={dropdownRef}>
92
- <CalendarButtonStyled
93
- expand={expand}
94
- type="button"
95
- onClick={() =>
96
- setShowCalendar((prev) => {
97
- const next = !prev;
98
- if (!prev) initialSelectedRef.current = selected;
99
- return next;
100
- })
101
- }
102
- disabled={disabled}
103
- >
104
- <div style={{ display: "flex", gap: "8px", width: "100%" }}>
105
- <TextField
106
- placeholder="00/00/0000 - 00/00/0000"
107
- type="text"
108
- value={`${startValue || "00/00/0000"} - ${endValue || "00/00/0000"}`}
109
- readOnly
110
- inputMode="numeric"
111
- textAlign={"right"}
112
- color={hasError ? "error" : "default"}
113
- disabled={disabled}
114
- >
115
- <TextFieldSlot>
116
- <Icon name="calendar" size={"xl"} color="#4C4F54"/>
117
- </TextFieldSlot>
118
- </TextField>
119
- </div>
120
- </CalendarButtonStyled>
121
-
122
- {showContainer && (
123
- <CalendarContentStyled position={position}>
124
- <Box>
125
- <DayPickerWrapperStyledToDoubleCalendar>
126
- <DayPicker
127
- mode="range"
128
- numberOfMonths={2}
129
- captionLayout={calendarLayout}
130
- selected={selected as any}
131
- onSelect={setSelected}
132
- required
133
- locale={ptBR}
134
- disabled={disabledDays.length > 0 ? disabledDays : undefined}
135
- fromMonth={allowPastDates ? undefined : today}
136
- toMonth={resolvedMaxDate}
137
- />
138
- </DayPickerWrapperStyledToDoubleCalendar>
139
- </Box>
140
-
141
- {action && (
142
- <CalendarFooterStyled>
143
- <div style={{ textAlign: "center", padding: "1rem" }}>
144
- <span>
145
- {`${selected?.from ? format(selected.from, "dd/MM/yyyy") : "00/00/0000"} — ${selected?.to ? format(selected.to, "dd/MM/yyyy") : "00/00/0000"}`}
146
- </span>
147
- </div>
148
- <Button
149
- style={{ margin: "0 0.5rem" }}
150
- variant="text"
151
- color="neutral"
152
- type="button"
153
- onClick={() => {
154
- setSelected(initialSelectedRef.current);
155
- setShowCalendar(false);
156
- }}
157
- size={"medium"}
158
- fontWeight="regular"
159
- >
160
- Cancelar
161
- </Button>
162
- <Button
163
- style={{ margin: "0 0.5rem" }}
164
- variant="text"
165
- color="brand"
166
- type="button"
167
- onClick={() => {
168
- setShowCalendar(false);
169
- }}
170
- size={"medium"}
171
- fontWeight="medium"
172
- >
173
- {actionText ?? "Aplicar"}
174
- </Button>
175
- </CalendarFooterStyled>
176
- )}
177
- {simpleAction && (
178
- <CalendarFooterStyled>
179
- <div
180
- style={{ display: "flex", justifyContent: "center", padding: "1rem", width: "100%" }}>
181
- <Button
182
- style={{ margin: "0 0.5rem" }}
183
- variant="text"
184
- color="brand"
185
- type="button"
186
- onClick={() => {
187
- setShowCalendar(false);
188
- }}
189
- size={"medium"}
190
- fontWeight="medium"
191
- >
192
- {actionText ?? "Aplicar"}
193
- </Button>
194
- </div>
195
- </CalendarFooterStyled>
196
- )}
197
- </CalendarContentStyled>
198
- )}
199
- </CalendarStyled>
200
- </div>
201
- );
202
- }
203
-
204
- export default DoubleCalendar;
1
+ import React, { ComponentProps, useRef, useEffect, useState } from "react";
2
+ import { useOnClickOutside } from "../../hooks/useOnClickOutside";
3
+ import { DayPicker, Matcher } from "react-day-picker";
4
+ import { ptBR } from "date-fns/locale";
5
+ import { format, addYears } from "date-fns";
6
+ import { Button } from "../Button";
7
+ import { Box } from "../Box";
8
+ import { TextField, TextFieldSlot } from "../TextField";
9
+ import Icon from "../Icon";
10
+ import {
11
+ CalendarContentStyled,
12
+ CalendarFooterStyled,
13
+ CalendarStyled,
14
+ DayPickerWrapperStyledToDoubleCalendar,
15
+ CalendarButtonStyled,
16
+ } from "../Calendar/styledComponents";
17
+
18
+ export type DateRange = { from?: Date; to?: Date } | undefined;
19
+
20
+ export type DoubleCalendarProps = ComponentProps<typeof CalendarStyled> & {
21
+ calendarLayout?: "label" | "dropdown" | "dropdown-months" | "dropdown-years";
22
+ selected: DateRange;
23
+ setSelected: React.Dispatch<React.SetStateAction<DateRange>>;
24
+ position?: "top" | "bottom" | "top-right" | "bottom-right";
25
+ action?: boolean;
26
+ simpleAction?: boolean;
27
+ actionText?: string;
28
+ hasError?: boolean;
29
+ expand?: boolean;
30
+ allowPastDates?: boolean;
31
+ maxYearsFromNow?: number;
32
+ maxDate?: Date;
33
+ disabled?: boolean;
34
+ };
35
+
36
+ export function DoubleCalendar({
37
+ action,
38
+ actionText,
39
+ simpleAction,
40
+ calendarLayout,
41
+ selected,
42
+ setSelected,
43
+ position = "bottom",
44
+ hasError,
45
+ expand,
46
+ allowPastDates = false,
47
+ maxYearsFromNow = 20,
48
+ maxDate,
49
+ disabled = false,
50
+ ...props
51
+ }: DoubleCalendarProps) {
52
+ const [startValue, setStartValue] = useState("");
53
+ const [endValue, setEndValue] = useState("");
54
+ const [showContainer, setShowCalendar] = useState(false);
55
+ const initialSelectedRef = useRef<DateRange | undefined>(undefined);
56
+
57
+ const dropdownRef = useRef<HTMLDivElement>(null);
58
+
59
+ useOnClickOutside(dropdownRef, () => {
60
+ setShowCalendar(false);
61
+ });
62
+ const today = new Date();
63
+ const resolvedMaxDate =
64
+ maxDate ??
65
+ (typeof maxYearsFromNow === "number" ? addYears(today, maxYearsFromNow) : undefined);
66
+ const disabledDays: Matcher[] = [];
67
+
68
+ if (!allowPastDates) {
69
+ disabledDays.push({ before: today });
70
+ }
71
+ if (resolvedMaxDate) {
72
+ disabledDays.push({ after: resolvedMaxDate });
73
+ }
74
+
75
+ useEffect(() => {
76
+ if (selected && selected.from) {
77
+ setStartValue(format(selected.from, "dd/MM/yyyy"));
78
+ } else {
79
+ setStartValue("");
80
+ }
81
+
82
+ if (selected && selected.to) {
83
+ setEndValue(format(selected.to, "dd/MM/yyyy"));
84
+ } else {
85
+ setEndValue("");
86
+ }
87
+ }, [selected]);
88
+
89
+ return (
90
+ <div>
91
+ <CalendarStyled {...props} expand={expand} ref={dropdownRef}>
92
+ <CalendarButtonStyled
93
+ expand={expand}
94
+ type="button"
95
+ onClick={() =>
96
+ setShowCalendar((prev) => {
97
+ const next = !prev;
98
+ if (!prev) initialSelectedRef.current = selected;
99
+ return next;
100
+ })
101
+ }
102
+ disabled={disabled}
103
+ >
104
+ <div style={{ display: "flex", gap: "8px", width: "100%" }}>
105
+ <TextField
106
+ placeholder="00/00/0000 - 00/00/0000"
107
+ type="text"
108
+ value={`${startValue || "00/00/0000"} - ${endValue || "00/00/0000"}`}
109
+ readOnly
110
+ inputMode="numeric"
111
+ textAlign={"right"}
112
+ color={hasError ? "error" : "default"}
113
+ disabled={disabled}
114
+ >
115
+ <TextFieldSlot>
116
+ <Icon name="calendar" size={"xl"} color="#4C4F54"/>
117
+ </TextFieldSlot>
118
+ </TextField>
119
+ </div>
120
+ </CalendarButtonStyled>
121
+
122
+ {showContainer && (
123
+ <CalendarContentStyled position={position}>
124
+ <Box>
125
+ <DayPickerWrapperStyledToDoubleCalendar>
126
+ <DayPicker
127
+ mode="range"
128
+ numberOfMonths={2}
129
+ captionLayout={calendarLayout}
130
+ selected={selected as any}
131
+ onSelect={setSelected}
132
+ required
133
+ locale={ptBR}
134
+ disabled={disabledDays.length > 0 ? disabledDays : undefined}
135
+ fromMonth={allowPastDates ? undefined : today}
136
+ toMonth={resolvedMaxDate}
137
+ />
138
+ </DayPickerWrapperStyledToDoubleCalendar>
139
+ </Box>
140
+
141
+ {action && (
142
+ <CalendarFooterStyled>
143
+ <div style={{ textAlign: "center", padding: "1rem" }}>
144
+ <span>
145
+ {`${selected?.from ? format(selected.from, "dd/MM/yyyy") : "00/00/0000"} — ${selected?.to ? format(selected.to, "dd/MM/yyyy") : "00/00/0000"}`}
146
+ </span>
147
+ </div>
148
+ <Button
149
+ style={{ margin: "0 0.5rem" }}
150
+ variant="text"
151
+ color="neutral"
152
+ type="button"
153
+ onClick={() => {
154
+ setSelected(initialSelectedRef.current);
155
+ setShowCalendar(false);
156
+ }}
157
+ size={"medium"}
158
+ fontWeight="regular"
159
+ >
160
+ Cancelar
161
+ </Button>
162
+ <Button
163
+ style={{ margin: "0 0.5rem" }}
164
+ variant="text"
165
+ color="brand"
166
+ type="button"
167
+ onClick={() => {
168
+ setShowCalendar(false);
169
+ }}
170
+ size={"medium"}
171
+ fontWeight="medium"
172
+ >
173
+ {actionText ?? "Aplicar"}
174
+ </Button>
175
+ </CalendarFooterStyled>
176
+ )}
177
+ {simpleAction && (
178
+ <CalendarFooterStyled>
179
+ <div
180
+ style={{ display: "flex", justifyContent: "center", padding: "1rem", width: "100%" }}>
181
+ <Button
182
+ style={{ margin: "0 0.5rem" }}
183
+ variant="text"
184
+ color="brand"
185
+ type="button"
186
+ onClick={() => {
187
+ setShowCalendar(false);
188
+ }}
189
+ size={"medium"}
190
+ fontWeight="medium"
191
+ >
192
+ {actionText ?? "Aplicar"}
193
+ </Button>
194
+ </div>
195
+ </CalendarFooterStyled>
196
+ )}
197
+ </CalendarContentStyled>
198
+ )}
199
+ </CalendarStyled>
200
+ </div>
201
+ );
202
+ }
203
+
204
+ export default DoubleCalendar;
@@ -1,113 +1,113 @@
1
- import { ComponentProps, ReactNode, useEffect, useRef } from "react";
2
- import { colors, Colors } from "@lets-events/tokens";
3
- import Icon from "../Icon";
4
- import {
5
- DrawerOverlayStyled,
6
- DrawerContainerStyled,
7
- DrawerHeaderDiv,
8
- DrawerHeaderTitle,
9
- DrawerHeaderCloseButton,
10
- GoBackButtonStyled,
11
- DrawerWrapper,
12
- } from "./styledComponents";
13
- import { Flex } from "../Flex";
14
-
15
- export type DrawerProps = ComponentProps<typeof DrawerOverlayStyled> & {
16
- isOpen: boolean;
17
- onClose: () => void;
18
- closeAriaLabel?: string;
19
- width?: string;
20
- backgroundColor?: keyof Colors;
21
- title: string;
22
- children?: ReactNode;
23
- goBackIcon?: ReactNode;
24
- goBackAction?: () => void;
25
- zIndex?: number;
26
- clickOutsideAvailable?: boolean;
27
- actionButton?: ReactNode;
28
- goBackAriaLabel?: string;
29
- };
30
-
31
- export function Drawer({
32
- isOpen,
33
- onClose,
34
- closeAriaLabel = "Fechar",
35
- width,
36
- backgroundColor,
37
- title,
38
- children,
39
- goBackIcon,
40
- goBackAction,
41
- zIndex = 1000,
42
- clickOutsideAvailable = true,
43
- actionButton = null,
44
- goBackAriaLabel = "Voltar",
45
- }: DrawerProps) {
46
- useEffect(() => {
47
- if (isOpen) {
48
- const scrollbarWidth =
49
- window.innerWidth - document.documentElement.clientWidth;
50
-
51
- document.body.style.overflow = "hidden";
52
- document.body.style.paddingRight = `${scrollbarWidth}px`;
53
- } else {
54
- document.body.style.overflow = "";
55
- document.body.style.paddingRight = "";
56
- }
57
-
58
- return () => {
59
- document.body.style.overflow = "";
60
- document.body.style.paddingRight = "";
61
- };
62
- }, [isOpen]);
63
-
64
- return (
65
- <>
66
- <DrawerOverlayStyled
67
- css={{
68
- zIndex,
69
- }}
70
- onClick={clickOutsideAvailable ? onClose : undefined}
71
- open={isOpen}
72
- />
73
- <DrawerWrapper
74
- css={{
75
- zIndex: zIndex + 1,
76
- width: width ?? "34.25rem",
77
- maxWidth: "100%",
78
- "@md": {
79
- width: "100%",
80
- }
81
- }}
82
- open={isOpen}
83
- >
84
- <DrawerContainerStyled
85
- open={isOpen}
86
- css={{
87
- backgroundColor: colors[backgroundColor ?? "neutral50"],
88
- }}
89
- >
90
- <DrawerHeaderDiv>
91
- <Flex gap={8} align="center">
92
- {goBackIcon && (
93
- <GoBackButtonStyled type="button" onClick={goBackAction} aria-label={goBackAriaLabel}>
94
- {goBackIcon}
95
- <span style={{ display: "none" }}>{goBackAriaLabel}</span>
96
- </GoBackButtonStyled>
97
- )}
98
- <DrawerHeaderTitle>{title}</DrawerHeaderTitle>
99
- </Flex>
100
- <Flex gap={8}>
101
- {actionButton && actionButton}
102
- <DrawerHeaderCloseButton onClick={onClose} aria-label={closeAriaLabel}>
103
- <Icon size={"xl"} color="$dark600" name="xmark" />
104
- <span style={{ display: "none" }}>{closeAriaLabel}</span>
105
- </DrawerHeaderCloseButton>
106
- </Flex>
107
- </DrawerHeaderDiv>
108
- {isOpen ? children : null}
109
- </DrawerContainerStyled>
110
- </DrawerWrapper>
111
- </>
112
- );
113
- }
1
+ import { ComponentProps, ReactNode, useEffect, useRef } from "react";
2
+ import { colors, Colors } from "@lets-events/tokens";
3
+ import Icon from "../Icon";
4
+ import {
5
+ DrawerOverlayStyled,
6
+ DrawerContainerStyled,
7
+ DrawerHeaderDiv,
8
+ DrawerHeaderTitle,
9
+ DrawerHeaderCloseButton,
10
+ GoBackButtonStyled,
11
+ DrawerWrapper,
12
+ } from "./styledComponents";
13
+ import { Flex } from "../Flex";
14
+
15
+ export type DrawerProps = ComponentProps<typeof DrawerOverlayStyled> & {
16
+ isOpen: boolean;
17
+ onClose: () => void;
18
+ closeAriaLabel?: string;
19
+ width?: string;
20
+ backgroundColor?: keyof Colors;
21
+ title: string;
22
+ children?: ReactNode;
23
+ goBackIcon?: ReactNode;
24
+ goBackAction?: () => void;
25
+ zIndex?: number;
26
+ clickOutsideAvailable?: boolean;
27
+ actionButton?: ReactNode;
28
+ goBackAriaLabel?: string;
29
+ };
30
+
31
+ export function Drawer({
32
+ isOpen,
33
+ onClose,
34
+ closeAriaLabel = "Fechar",
35
+ width,
36
+ backgroundColor,
37
+ title,
38
+ children,
39
+ goBackIcon,
40
+ goBackAction,
41
+ zIndex = 1000,
42
+ clickOutsideAvailable = true,
43
+ actionButton = null,
44
+ goBackAriaLabel = "Voltar",
45
+ }: DrawerProps) {
46
+ useEffect(() => {
47
+ if (isOpen) {
48
+ const scrollbarWidth =
49
+ window.innerWidth - document.documentElement.clientWidth;
50
+
51
+ document.body.style.overflow = "hidden";
52
+ document.body.style.paddingRight = `${scrollbarWidth}px`;
53
+ } else {
54
+ document.body.style.overflow = "";
55
+ document.body.style.paddingRight = "";
56
+ }
57
+
58
+ return () => {
59
+ document.body.style.overflow = "";
60
+ document.body.style.paddingRight = "";
61
+ };
62
+ }, [isOpen]);
63
+
64
+ return (
65
+ <>
66
+ <DrawerOverlayStyled
67
+ css={{
68
+ zIndex,
69
+ }}
70
+ onClick={clickOutsideAvailable ? onClose : undefined}
71
+ open={isOpen}
72
+ />
73
+ <DrawerWrapper
74
+ css={{
75
+ zIndex: zIndex + 1,
76
+ width: width ?? "34.25rem",
77
+ maxWidth: "100%",
78
+ "@md": {
79
+ width: "100%",
80
+ }
81
+ }}
82
+ open={isOpen}
83
+ >
84
+ <DrawerContainerStyled
85
+ open={isOpen}
86
+ css={{
87
+ backgroundColor: colors[backgroundColor ?? "neutral50"],
88
+ }}
89
+ >
90
+ <DrawerHeaderDiv>
91
+ <Flex gap={8} align="center">
92
+ {goBackIcon && (
93
+ <GoBackButtonStyled type="button" onClick={goBackAction} aria-label={goBackAriaLabel}>
94
+ {goBackIcon}
95
+ <span style={{ display: "none" }}>{goBackAriaLabel}</span>
96
+ </GoBackButtonStyled>
97
+ )}
98
+ <DrawerHeaderTitle>{title}</DrawerHeaderTitle>
99
+ </Flex>
100
+ <Flex gap={8}>
101
+ {actionButton && actionButton}
102
+ <DrawerHeaderCloseButton onClick={onClose} aria-label={closeAriaLabel}>
103
+ <Icon size={"xl"} color="$dark600" name="xmark" />
104
+ <span style={{ display: "none" }}>{closeAriaLabel}</span>
105
+ </DrawerHeaderCloseButton>
106
+ </Flex>
107
+ </DrawerHeaderDiv>
108
+ {isOpen ? children : null}
109
+ </DrawerContainerStyled>
110
+ </DrawerWrapper>
111
+ </>
112
+ );
113
+ }