@lets-events/react 7.0.1 → 7.2.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.
@@ -1,148 +1,164 @@
1
- import React, { ComponentProps, ElementType } from 'react'
2
- import { styled } from '../styles'
1
+ import React, { ComponentProps, ElementType } from "react";
2
+ import { styled } from "../styles";
3
3
  import { Box, Tabs as StepRadix } from "@radix-ui/themes";
4
4
 
5
- export const StepStyled = styled('div', {
6
- fontFamily: '$default',
7
- color: '$gray100',
8
- letterSpacing: '0px',
9
-
10
- })
5
+ export const StepStyled = styled("div", {
6
+ fontFamily: "$default",
7
+ color: "$gray100",
8
+ letterSpacing: "0px",
9
+ });
11
10
 
12
11
  const StepTriggerStyled = styled(StepRadix.Trigger, {
13
- all: 'unset',
14
- position: 'relative',
15
- display: 'flex',
16
- alignItems: 'center',
17
- justifyContent: 'center',
18
- fontSize: '$16',
19
- fontWeight: '$medium',
20
-
21
-
22
- minWidth: '32px',
23
- minHeight: '32px',
24
- marginRight: '40px',
25
-
26
-
27
- '&:last-of-type': {
12
+ all: "unset",
13
+ position: "relative",
14
+ display: "flex",
15
+ alignItems: "center",
16
+ justifyContent: "center",
17
+ fontSize: "$16",
18
+ fontWeight: "$medium",
19
+
20
+ minWidth: "32px",
21
+ minHeight: "32px",
22
+ marginRight: "40px",
23
+
24
+ "&:last-of-type": {
28
25
  marginRight: 0,
29
26
  },
30
27
 
31
-
32
- '& > span:first-of-type': {
33
- width: '32px',
34
- height: '32px',
35
- borderRadius: '$full',
36
- backgroundColor: '$neutral50',
37
- border: '1px solid $neutral200',
38
- color: '$gray700',
39
- display: 'flex',
40
- alignItems: 'center',
41
- justifyContent: 'center',
28
+ "& > span:first-of-type": {
29
+ width: "32px",
30
+ height: "32px",
31
+ borderRadius: "$full",
32
+ backgroundColor: "$neutral50",
33
+ border: "1px solid $neutral200",
34
+ color: "$gray700",
35
+ display: "flex",
36
+ alignItems: "center",
37
+ justifyContent: "center",
42
38
  zIndex: 1,
43
- position: 'relative',
44
-
39
+ position: "relative",
45
40
  },
46
41
 
47
-
48
42
  '&[data-state="active"] > span:first-of-type': {
49
- backgroundColor: '$blue500',
50
- borderColor: '$blue500',
51
- color: 'white',
43
+ backgroundColor: "$blue500",
44
+ borderColor: "$blue500",
45
+ color: "white",
52
46
  },
53
47
 
54
-
55
- '& > span:last-of-type': {
56
- display: 'none',
48
+ "& > span:last-of-type": {
49
+ display: "none",
57
50
  },
58
51
 
59
-
60
- '&:not(:first-of-type)::before': {
52
+ "&:not(:first-of-type)::before": {
61
53
  content: '""',
62
- position: 'absolute',
63
- top: '50%',
64
- right: 'calc(100% + 4px)',
65
- transform: 'translateY(-50%)',
66
- width: '32px',
67
- height: '8px',
68
- borderRadius: '$sm',
69
- backgroundColor: '$neutral50',
54
+ position: "absolute",
55
+ top: "50%",
56
+ right: "calc(100% + 4px)",
57
+ transform: "translateY(-50%)",
58
+ width: "32px",
59
+ height: "8px",
60
+ borderRadius: "$sm",
61
+ backgroundColor: "$neutral50",
70
62
  zIndex: 0,
71
63
  },
72
64
 
73
-
74
65
  '&[data-state="active"]::before': {
75
- backgroundColor: '$blue500',
66
+ backgroundColor: "$blue500",
76
67
  },
77
68
 
78
69
  '&[data-filled="true"] > span:first-of-type': {
79
- backgroundColor: '$blue500',
80
- borderColor: '$blue500',
81
- color: 'white',
70
+ backgroundColor: "$blue500",
71
+ borderColor: "$blue500",
72
+ color: "white",
82
73
  },
83
74
 
84
75
  '&[data-filled="true"]::before': {
85
- backgroundColor: '$blue500',
76
+ backgroundColor: "$blue500",
86
77
  },
87
78
  });
88
79
 
89
80
  const StepListStyled = styled(StepRadix.List, {
90
- display: 'flex',
91
- alignItems: 'center',
92
- justifyContent: 'flex-start',
93
- gap: '$4',
94
-
81
+ display: "flex",
82
+ alignItems: "center",
83
+ justifyContent: "flex-start",
84
+ gap: "$4",
95
85
  });
96
86
 
97
87
  export type StepProps = ComponentProps<typeof StepStyled> & {
98
- children: React.ReactNode,
99
- defaultValue: number
100
-
101
- }
88
+ children: React.ReactNode;
89
+ defaultValue: number;
90
+ };
102
91
  export function Step({ children, defaultValue, ...props }: StepProps) {
103
92
  return (
104
93
  <StepRadix.Root defaultValue={String(defaultValue)}>
105
- <StepStyled {...props}>
106
- {children}
107
- </StepStyled>
94
+ <StepStyled {...props}>{children}</StepStyled>
108
95
  </StepRadix.Root>
109
-
110
- )
96
+ );
111
97
  }
112
98
 
113
- export function StepTrigger({ value, children, currentStep, ...props }: { value: number, children: React.ReactNode | string, currentStep?: number, onClick: () => void }) {
114
- const isActiveOrPrevious = currentStep !== undefined && value <= currentStep
115
- console.log(isActiveOrPrevious, 'isActiveOrPrevius', currentStep)
99
+ export function StepTrigger({
100
+ value,
101
+ children,
102
+ currentStep,
103
+ ...props
104
+ }: {
105
+ value: number;
106
+ children: React.ReactNode | string;
107
+ currentStep?: number;
108
+ onClick: () => void;
109
+ }) {
110
+ const isActiveOrPrevious = currentStep !== undefined && value <= currentStep;
116
111
  return (
117
- <StepTriggerStyled data-filled={isActiveOrPrevious} value={String(value)} {...props}>{children}</StepTriggerStyled>
118
- )
112
+ <StepTriggerStyled
113
+ data-filled={isActiveOrPrevious}
114
+ value={String(value)}
115
+ {...props}
116
+ >
117
+ {children}
118
+ </StepTriggerStyled>
119
+ );
119
120
  }
120
121
 
121
- export function StepContent({ value, children, ...props }: { value: number, children: React.ReactNode }) {
122
+ export function StepContent({
123
+ value,
124
+ children,
125
+ ...props
126
+ }: {
127
+ value: number;
128
+ children: React.ReactNode;
129
+ }) {
122
130
  return (
123
131
  <StepRadix.Content value={String(value)} {...props}>
124
132
  {children}
125
133
  </StepRadix.Content>
126
- )
134
+ );
127
135
  }
128
136
 
129
- export function StepList({ children, currentStep, ...props }: { children: React.ReactNode, currentStep: number }) {
137
+ export function StepList({
138
+ children,
139
+ currentStep,
140
+ ...props
141
+ }: {
142
+ children: React.ReactNode;
143
+ currentStep: number;
144
+ }) {
130
145
  return (
131
146
  <StepListStyled {...props}>
132
147
  {React.Children.map(children, (child) => {
133
148
  if (React.isValidElement(child) && child.type === StepTrigger) {
134
- return React.cloneElement(child, { currentStep } as any)
149
+ return React.cloneElement(child, { currentStep } as any);
135
150
  }
136
- return child
151
+ return child;
137
152
  })}
138
153
  </StepListStyled>
139
- )
154
+ );
140
155
  }
141
156
 
142
- export function StepWrapper({ children, ...props }: { children: React.ReactNode }) {
143
- return (
144
- <Box {...props}>
145
- {children}
146
- </Box>
147
- )
148
- }
157
+ export function StepWrapper({
158
+ children,
159
+ ...props
160
+ }: {
161
+ children: React.ReactNode;
162
+ }) {
163
+ return <Box {...props}>{children}</Box>;
164
+ }
@@ -15,18 +15,16 @@ export const TextStyle = styled(TextRadix, {
15
15
  medium: { fontWeight: '$medium' },
16
16
  semibold: { fontWeight: '$semibold' },
17
17
  bold: { fontWeight: '$bold' },
18
- }
19
- }
18
+ },
19
+ },
20
20
  })
21
21
 
22
22
  export type TextProps = ComponentProps<typeof TextStyle> & {
23
- as?: ElementType,
23
+ as?: ElementType
24
24
  asChild?: boolean
25
25
  css?: CSS
26
26
  }
27
27
 
28
28
  export function Text({ ...props }: TextProps) {
29
- return (
30
- <TextStyle {...props} />
31
- )
32
- }
29
+ return <TextStyle {...props} />
30
+ }
@@ -1,15 +1,15 @@
1
- import { ComponentProps } from 'react'
1
+ import { ComponentProps, ReactNode } from 'react'
2
2
  import { styled } from '../styles'
3
- import { TextField as TextFieldRadix } from "@radix-ui/themes";
4
- import Icon from './Icon';
5
- import { typographyValues } from '../types/typographyValues';
6
- import { TextStyle } from './Text';
7
- import { Flex } from './Flex';
3
+ import { TextField as TextFieldRadix } from '@radix-ui/themes'
4
+ import Icon from './Icon'
5
+ import { typographyValues } from '../types/typographyValues'
6
+ import { TextStyle } from './Text'
7
+ import { Flex } from './Flex'
8
+ import { format, MaskOptions, useMask, unformat } from '@react-input/mask'
8
9
 
9
10
  export const TextFieldStyled = styled(TextFieldRadix.Root, {
10
11
  height: '$40',
11
12
  fontFamily: '$default',
12
- padding: '0',
13
13
  borderRadius: '$sm',
14
14
  boxSizing: 'border-box',
15
15
  color: '$dark500',
@@ -18,8 +18,9 @@ export const TextFieldStyled = styled(TextFieldRadix.Root, {
18
18
  display: 'flex',
19
19
  width: '100%',
20
20
  alignItems: 'center',
21
-
22
- 'input': {
21
+ padding: '0 $14',
22
+ gap: '$14',
23
+ input: {
23
24
  order: 1,
24
25
  outline: 'none',
25
26
  border: 'none',
@@ -27,7 +28,6 @@ export const TextFieldStyled = styled(TextFieldRadix.Root, {
27
28
  width: '100%',
28
29
  font: 'inherit',
29
30
  textAlign: 'left',
30
- padding: '0 $14'
31
31
  },
32
32
 
33
33
  '&:has(input:focus)': {
@@ -70,7 +70,7 @@ export const TextFieldStyled = styled(TextFieldRadix.Root, {
70
70
  border: '1px solid $error100',
71
71
  cursor: 'not-allowed',
72
72
  },
73
- }
73
+ },
74
74
  },
75
75
 
76
76
  typography: typographyValues,
@@ -87,7 +87,7 @@ export const TextFieldStyled = styled(TextFieldRadix.Root, {
87
87
  },
88
88
  isValid: {
89
89
  true: {},
90
- false: {}
90
+ false: {},
91
91
  },
92
92
  },
93
93
 
@@ -98,7 +98,7 @@ export const TextFieldStyled = styled(TextFieldRadix.Root, {
98
98
  border: '1px solid $error400',
99
99
  color: '$error400',
100
100
  backgroundColor: '$error50',
101
- 'input': {
101
+ input: {
102
102
  '&::placeholder': {
103
103
  color: '$error400',
104
104
  },
@@ -108,7 +108,7 @@ export const TextFieldStyled = styled(TextFieldRadix.Root, {
108
108
  border: '2px solid $error400',
109
109
  },
110
110
  '&:has(input:disabled)': {
111
- 'input': {
111
+ input: {
112
112
  backgroundColor: '$error50',
113
113
  },
114
114
  backgroundColor: '$error50',
@@ -116,7 +116,7 @@ export const TextFieldStyled = styled(TextFieldRadix.Root, {
116
116
  border: '1px solid $error100',
117
117
  cursor: 'not-allowed',
118
118
  },
119
- }
119
+ },
120
120
  },
121
121
  {
122
122
  isValid: true,
@@ -130,8 +130,8 @@ export const TextFieldStyled = styled(TextFieldRadix.Root, {
130
130
  border: '1px solid $dark200',
131
131
  cursor: 'not-allowed',
132
132
  },
133
- }
134
- }
133
+ },
134
+ },
135
135
  ],
136
136
  })
137
137
 
@@ -139,6 +139,7 @@ export const TextFieldSlotStyled = styled(TextFieldRadix.Slot, {
139
139
  display: 'flex',
140
140
  alignItems: 'center',
141
141
  justifyContent: 'center',
142
+ padding: 4,
142
143
 
143
144
  variants: {
144
145
  typography: typographyValues,
@@ -152,12 +153,12 @@ export const TextFieldSlotStyled = styled(TextFieldRadix.Slot, {
152
153
  left: { textAlign: 'left' },
153
154
  right: { textAlign: 'right' },
154
155
  center: { textAlign: 'center' },
155
- }
156
- }
156
+ },
157
+ },
157
158
  })
158
159
 
159
160
  export type TextFieldProps = ComponentProps<typeof TextFieldStyled> & {
160
- addon?:string
161
+ addon?: ReactNode
161
162
  placeholder?: string
162
163
  children?: React.ReactNode
163
164
  isValid?: boolean
@@ -165,32 +166,41 @@ export type TextFieldProps = ComponentProps<typeof TextFieldStyled> & {
165
166
  typography?: string
166
167
  fontWeight?: 'regular' | 'medium' | 'semibold' | 'bold'
167
168
  textAlign?: 'left' | 'right' | 'center'
169
+ mask?: MaskOptions
168
170
  }
169
171
 
170
- export type TextFieldSlotProps = Omit<ComponentProps<typeof TextFieldStyled>, 'color'> & {
172
+ export type TextFieldSlotProps = Omit<
173
+ ComponentProps<typeof TextFieldStyled>,
174
+ 'color'
175
+ > & {
171
176
  placeholder?: string
172
177
  children?: React.ReactNode
173
178
  position?: 'flex-start' | 'flex-end'
174
179
  onClick?: () => void
175
- color?: "error" | "success" | undefined
180
+ color?: 'error' | 'success' | undefined
176
181
  typography?: string
177
182
  fontWeight?: 'regular' | 'medium' | 'semibold' | 'bold'
178
183
  textAlign?: 'left' | 'right' | 'center'
179
184
  }
180
185
 
181
-
182
186
  const InputAddon = styled(TextStyle, {
183
187
  boxSizing: 'border-box',
184
188
  border: '1px solid $dark300',
185
- height: '$40',
186
- padding: '0',
189
+ height: '$40',
190
+ padding: '0 $12',
191
+ margin: '0 auto',
192
+
187
193
  color: '$dark600',
194
+ whiteSpace: 'nowrap',
188
195
  borderRadius: '$sm 0px 0px $sm',
189
196
  borderRightWidth: '0px',
190
- margin: 'auto 0',
191
197
  display: 'flex',
192
- alignItems: 'center'
198
+ flexWrap: 'nowrap',
199
+ alignItems: 'center',
200
+ lineHeight: 1,
193
201
  })
202
+ export const maskFormat = format
203
+ export const maskUnformat = unformat
194
204
 
195
205
  export function TextField({
196
206
  children,
@@ -200,14 +210,16 @@ export function TextField({
200
210
  typography,
201
211
  fontWeight,
202
212
  addon,
203
- textAlign = 'right',
213
+ textAlign = 'left',
214
+ mask,
204
215
  ...props
205
216
  }: TextFieldProps) {
217
+ const maskRef = mask ? useMask(mask) : undefined
218
+
206
219
  return (
207
- <Flex gap={'0'} css={{width: '100%'}}>
208
- {!!addon && (
209
- <InputAddon typography="labelSmall">{addon}</InputAddon>
210
- )}
220
+ <Flex gap={'0'} css={{ width: '100%' }}>
221
+ {!!addon && <InputAddon typography="labelSmall">{addon}</InputAddon>}
222
+
211
223
  <TextFieldStyled
212
224
  color={color}
213
225
  isValid={isValid}
@@ -215,20 +227,25 @@ export function TextField({
215
227
  typography={typography}
216
228
  fontWeight={fontWeight}
217
229
  textAlign={textAlign}
218
- style={!!addon ? {borderTopLeftRadius:'0px', borderBottomLeftRadius: '0px'}: undefined}
230
+ ref={maskRef}
219
231
  {...props}
220
- >
232
+ style={
233
+ addon
234
+ ? { borderTopLeftRadius: '0px', borderBottomLeftRadius: '0px' }
235
+ : undefined
236
+ }
237
+ >
221
238
  {children}
222
239
  {isValid && (
223
240
  <TextFieldSlot
224
- position='flex-end'
225
- name={name}
226
- color={color as TextFieldSlotProps['color']}
227
- typography={typography}
228
- fontWeight={fontWeight}
229
- textAlign={textAlign}
241
+ position="flex-end"
242
+ name={name}
243
+ color={color as TextFieldSlotProps['color']}
244
+ typography={typography}
245
+ fontWeight={fontWeight}
246
+ textAlign={textAlign}
230
247
  >
231
- <Icon name='check' />
248
+ <Icon name="check" />
232
249
  </TextFieldSlot>
233
250
  )}
234
251
  </TextFieldStyled>
@@ -253,17 +270,14 @@ export function TextFieldSlot({
253
270
  color: undefined,
254
271
  }
255
272
 
256
- return !!onClick ? (
273
+ return onClick ? (
257
274
  <TextFieldSlotStyled
258
275
  {...sharedStyles}
259
276
  style={{
260
- position: 'absolute',
261
- left: position === 'flex-end' ? 'none' : 15,
262
- right: position === 'flex-start' ? 'none' : 15,
263
- textAlign: textAlign,
264
- padding: 13,
277
+ float: position === 'flex-start' ? 'left' : 'right',
278
+ order: position === 'flex-start' ? 0 : 2,
279
+ textAlign,
265
280
  zIndex: 2,
266
- top: 0,
267
281
  cursor: 'pointer',
268
282
  }}
269
283
  onClick={() => onClick()}
@@ -276,9 +290,7 @@ export function TextFieldSlot({
276
290
  style={{
277
291
  float: position === 'flex-start' ? 'left' : 'right',
278
292
  order: position === 'flex-start' ? 0 : 2,
279
- marginLeft: position === 'flex-start' ? 0 : 15,
280
- marginRight: position === 'flex-end' ? 0 : 15,
281
- textAlign: textAlign,
293
+ textAlign,
282
294
  }}
283
295
  >
284
296
  {children}
@@ -0,0 +1,101 @@
1
+ import { TextArea as TextAreaRadix } from '@radix-ui/themes'
2
+ import { styled } from '../styles'
3
+ import { ComponentProps, useRef } from 'react'
4
+ import { typographyValues } from '../types/typographyValues'
5
+ import { Text } from './Text'
6
+
7
+ export const TextareaFieldStyle = styled(TextAreaRadix, {
8
+ display: 'flex',
9
+ width: 'fit-content',
10
+ flex: 1,
11
+ textarea: {
12
+ width: '100%',
13
+ minHeight: '3.75rem',
14
+ border: 'none',
15
+ padding: '$12 $14',
16
+ fontFamily: '$default',
17
+ fontSize: '$16',
18
+ outline: 'none',
19
+ resize: 'vertical',
20
+ },
21
+ variants: {
22
+ typography: typographyValues,
23
+ },
24
+ defaultVariants: {
25
+ typography: 'bodyM',
26
+ },
27
+ })
28
+
29
+ export type TextareaFieldProps = ComponentProps<typeof TextareaFieldStyle> & {
30
+ limit: number
31
+ }
32
+
33
+ const TextareaContainer = styled('div', {
34
+ position: 'relative',
35
+ display: 'flex',
36
+ overflow: 'hidden',
37
+ // width: '100%',
38
+ border: '1px solid',
39
+ borderColor: '$dark300',
40
+ borderRadius: '$2xs',
41
+
42
+ '&:has(textarea:focus)': {
43
+ border: '1px solid $brand300',
44
+ },
45
+ '&:has(textarea:disabled)': {
46
+ backgroundColor: '$dark100',
47
+ color: '$dark400',
48
+ border: '1px solid $dark200',
49
+ cursor: 'not-allowed',
50
+ },
51
+ })
52
+
53
+ const TextareaLimitIndicator = styled('div', {
54
+ position: 'absolute',
55
+ bottom: 0,
56
+ left: 0,
57
+ padding: '$12 $16',
58
+ borderTop: '1px solid $neutral300',
59
+ width: '100%',
60
+ flex: 1,
61
+ display: 'flex',
62
+ span: {
63
+ backgroundColor: '$neutral200',
64
+ color: '$neutral700',
65
+ borderRadius: '$2xs',
66
+ padding: '$4',
67
+ },
68
+ })
69
+
70
+ export function TextareaField({ maxLength, ...props }: TextareaFieldProps) {
71
+ const inputRef = useRef<HTMLTextAreaElement>(null)
72
+ const badgeRef = useRef<HTMLSpanElement>(null)
73
+
74
+ if (!maxLength) {
75
+ return (
76
+ <TextareaContainer>
77
+ <TextareaFieldStyle {...props} ref={inputRef}></TextareaFieldStyle>
78
+ </TextareaContainer>
79
+ )
80
+ }
81
+ const handleInput = () => {
82
+ const remainingChars = maxLength - (inputRef?.current?.value.length || 0)
83
+ if (badgeRef.current) badgeRef.current.textContent = String(remainingChars)
84
+ }
85
+
86
+ return (
87
+ <TextareaContainer css={{ paddingBottom: '3.25rem' }}>
88
+ <TextareaFieldStyle
89
+ ref={inputRef}
90
+ onInput={handleInput}
91
+ maxLength={maxLength}
92
+ {...props}
93
+ ></TextareaFieldStyle>
94
+ <TextareaLimitIndicator>
95
+ <Text typography={'badgeMedium'} ref={badgeRef}>
96
+ {maxLength}
97
+ </Text>
98
+ </TextareaLimitIndicator>
99
+ </TextareaContainer>
100
+ )
101
+ }