@liguelead/design-system 0.0.17 → 0.0.19
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/components/Alert/Alert.style.ts +23 -0
- package/components/Alert/Alert.tsx +55 -0
- package/components/Alert/Alert.types.ts +10 -0
- package/components/Alert/Alert.variants.ts +68 -0
- package/components/Alert/IconVariant.tsx +22 -0
- package/components/Alert/index.ts +1 -0
- package/components/Button/Button.appearance.ts +2 -2
- package/components/Button/Button.types.ts +1 -1
- package/components/DatePicker/DatePicker.tsx +6 -2
- package/components/Dialog/Dialog.style.ts +62 -0
- package/components/Dialog/Dialog.tsx +113 -0
- package/components/Dialog/Dialog.types.ts +17 -0
- package/components/Dialog/index.ts +1 -0
- package/components/InputOpt/InputOpt.tsx +3 -1
- package/components/PageWrapper/PageWrapper.tsx +1 -1
- package/components/SegmentedButton/SegmentedButton.types.ts +1 -1
- package/components/Text/Text.types.ts +2 -1
- package/components/index.ts +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import { parseColor } from '../../utils';
|
|
3
|
+
import {spacing, radius} from '@liguelead/foundation'
|
|
4
|
+
|
|
5
|
+
export const AlertContainer = styled.div<{ $variant: string }>`
|
|
6
|
+
padding: ${spacing.spacing8}px;
|
|
7
|
+
border: 1px solid ${({theme}) => parseColor(theme.colors.neutral200)};
|
|
8
|
+
background-color: ${({theme}) => parseColor(theme.colors.background)};
|
|
9
|
+
color: ${({theme}) => parseColor(theme.colors.text)};
|
|
10
|
+
border-radius: ${radius.radius4}px;
|
|
11
|
+
|
|
12
|
+
${({ $variant }) => $variant}
|
|
13
|
+
`;
|
|
14
|
+
|
|
15
|
+
export const AlertContent = styled.div`
|
|
16
|
+
display: flex;
|
|
17
|
+
gap: 8px;
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
export const AlertButtonContainer = styled.div`
|
|
21
|
+
display: flex;
|
|
22
|
+
justify-content: flex-end;
|
|
23
|
+
`;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import Text from '../Text'
|
|
2
|
+
import LinkButton from '../LinkButton'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
AlertButtonContainer,
|
|
6
|
+
AlertContainer,
|
|
7
|
+
AlertContent
|
|
8
|
+
} from './Alert.style'
|
|
9
|
+
import { AlertVariant } from './Alert.variants'
|
|
10
|
+
import { TAlertProps } from './Alert.types'
|
|
11
|
+
import { iconsByVariant } from './IconVariant'
|
|
12
|
+
|
|
13
|
+
const Alert = ({
|
|
14
|
+
variant = 'default',
|
|
15
|
+
buttonLabel,
|
|
16
|
+
className,
|
|
17
|
+
description,
|
|
18
|
+
href,
|
|
19
|
+
children,
|
|
20
|
+
title,
|
|
21
|
+
hasButton
|
|
22
|
+
}: TAlertProps) => {
|
|
23
|
+
const alertVariant = AlertVariant(variant)
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<AlertContainer $variant={alertVariant} className={className}>
|
|
27
|
+
<AlertContent>
|
|
28
|
+
{iconsByVariant(variant)}
|
|
29
|
+
<div>
|
|
30
|
+
<Text
|
|
31
|
+
size="body03"
|
|
32
|
+
color="textDark"
|
|
33
|
+
weight="fontWeight600"
|
|
34
|
+
className="mb-4">
|
|
35
|
+
{title}
|
|
36
|
+
</Text>
|
|
37
|
+
{description ? (
|
|
38
|
+
<Text size="body02" color="textMedium">
|
|
39
|
+
{description}
|
|
40
|
+
</Text>
|
|
41
|
+
) : (
|
|
42
|
+
children
|
|
43
|
+
)}
|
|
44
|
+
</div>
|
|
45
|
+
</AlertContent>
|
|
46
|
+
{hasButton && (
|
|
47
|
+
<AlertButtonContainer>
|
|
48
|
+
<LinkButton href={href || ''}>{buttonLabel}</LinkButton>
|
|
49
|
+
</AlertButtonContainer>
|
|
50
|
+
)}
|
|
51
|
+
</AlertContainer>
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export default Alert
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { parseColor } from '../../utils'
|
|
2
|
+
import { useTheme } from 'styled-components'
|
|
3
|
+
|
|
4
|
+
type TVariant = 'success' | 'danger' | 'warning' | 'info' | 'default'
|
|
5
|
+
|
|
6
|
+
export const AlertVariant = (variant: TVariant) => {
|
|
7
|
+
const theme = useTheme()
|
|
8
|
+
|
|
9
|
+
const variants = {
|
|
10
|
+
success: `
|
|
11
|
+
border-left: 8px solid ${parseColor(theme.colors.success100)};
|
|
12
|
+
& svg {
|
|
13
|
+
fill: ${parseColor(theme.colors.success100)};
|
|
14
|
+
width: 24px;
|
|
15
|
+
height: 24px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
& a {
|
|
19
|
+
color: ${parseColor(theme.colors.success100)};
|
|
20
|
+
}
|
|
21
|
+
`,
|
|
22
|
+
danger: `
|
|
23
|
+
border-left: 8px solid ${parseColor(theme.colors.danger200)};
|
|
24
|
+
& svg {
|
|
25
|
+
fill: ${parseColor(theme.colors.danger200)};
|
|
26
|
+
width: 24px;
|
|
27
|
+
height: 24px;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
& a {
|
|
31
|
+
color: ${parseColor(theme.colors.danger200)};
|
|
32
|
+
}
|
|
33
|
+
`,
|
|
34
|
+
warning: `
|
|
35
|
+
border-left: 8px solid ${parseColor(theme.colors.warning100)};
|
|
36
|
+
& svg {
|
|
37
|
+
fill: ${parseColor(theme.colors.warning100)};
|
|
38
|
+
width: 24px;
|
|
39
|
+
height: 24px;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
& a {
|
|
43
|
+
color: ${parseColor(theme.colors.warning100)};
|
|
44
|
+
}
|
|
45
|
+
`,
|
|
46
|
+
info: `
|
|
47
|
+
border-left: 8px solid ${parseColor(theme.colors.info100)};
|
|
48
|
+
& svg {
|
|
49
|
+
fill: ${parseColor(theme.colors.info100)};
|
|
50
|
+
width: 24px;
|
|
51
|
+
height: 24px;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
& a {
|
|
55
|
+
color: ${parseColor(theme.colors.info100)};
|
|
56
|
+
}
|
|
57
|
+
`,
|
|
58
|
+
default: `
|
|
59
|
+
border-left: 8px solid ${parseColor(theme.colors.primary)};
|
|
60
|
+
|
|
61
|
+
& a {
|
|
62
|
+
color: ${parseColor(theme.colors.primary)};
|
|
63
|
+
}
|
|
64
|
+
`
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return variants[variant]
|
|
68
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TAlertProps } from "./Alert.types"
|
|
2
|
+
import {
|
|
3
|
+
CheckCircleIcon,
|
|
4
|
+
WarningCircleIcon,
|
|
5
|
+
WarningIcon,
|
|
6
|
+
InfoIcon
|
|
7
|
+
} from '@phosphor-icons/react'
|
|
8
|
+
|
|
9
|
+
export const iconsByVariant = (variant: TAlertProps['variant']) => {
|
|
10
|
+
switch (variant) {
|
|
11
|
+
case 'success':
|
|
12
|
+
return <CheckCircleIcon />
|
|
13
|
+
case 'danger':
|
|
14
|
+
return <WarningCircleIcon />
|
|
15
|
+
case 'warning':
|
|
16
|
+
return <WarningIcon />
|
|
17
|
+
case 'info':
|
|
18
|
+
return <InfoIcon />
|
|
19
|
+
default:
|
|
20
|
+
return <></>
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./Alert"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ButtonVariantTypes} from './Button.types'
|
|
2
|
-
import {colorType} from 'types'
|
|
3
|
-
import {useTheme} from 'styled-components'
|
|
2
|
+
import { colorType } from '../../types'
|
|
3
|
+
import { useTheme } from 'styled-components'
|
|
4
4
|
import {darkenOrLighten, getTextColor, parseColor} from '../../utils'
|
|
5
5
|
|
|
6
6
|
export const ButtonVariant = (
|
|
@@ -6,8 +6,12 @@ import {
|
|
|
6
6
|
CaretDown
|
|
7
7
|
} from '@phosphor-icons/react'
|
|
8
8
|
import { getYear, getMonth } from 'date-fns'
|
|
9
|
-
import { range } from 'lodash'
|
|
10
9
|
import { ptBR } from 'date-fns/locale'
|
|
10
|
+
|
|
11
|
+
// Substituindo lodash.range por implementação simples
|
|
12
|
+
const range = (start: number, end: number, step: number = 1) => {
|
|
13
|
+
return Array.from({ length: Math.ceil((end - start) / step) }, (_, i) => start + i * step)
|
|
14
|
+
}
|
|
11
15
|
import { forwardRef, useState } from 'react'
|
|
12
16
|
import TextField from '../TextField'
|
|
13
17
|
import { DatePickerProps, Months } from './DatePicker.types'
|
|
@@ -70,7 +74,7 @@ const DatePickerCustom = forwardRef<HTMLInputElement, DatePickerProps>(
|
|
|
70
74
|
</ButtonDatePicker>
|
|
71
75
|
</DropdownMenu.Trigger>
|
|
72
76
|
<DropdownContent>
|
|
73
|
-
{years.map(option => (
|
|
77
|
+
{years.map((option: number) => (
|
|
74
78
|
<DropdownItem
|
|
75
79
|
key={option}
|
|
76
80
|
onSelect={() => {
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
2
|
+
import styled from 'styled-components';
|
|
3
|
+
import { spacing, shadow } from '@liguelead/foundation';
|
|
4
|
+
import { parseColor } from '../../utils';
|
|
5
|
+
|
|
6
|
+
export const Overlay = styled(DialogPrimitive.Overlay)`
|
|
7
|
+
background: rgba(0, 0, 0, 0.3);
|
|
8
|
+
position: fixed;
|
|
9
|
+
inset: 0;
|
|
10
|
+
`
|
|
11
|
+
|
|
12
|
+
export const Content = styled(DialogPrimitive.Content)<{$centerContent?: boolean}>`
|
|
13
|
+
background: #fff;
|
|
14
|
+
border: 1px solid ${({ theme }) => parseColor(theme.colors.neutral300)};
|
|
15
|
+
box-shadow: 0 4px 15px -3px rgba(0, 0, 0, 0.1);
|
|
16
|
+
border-radius: 8px;
|
|
17
|
+
padding: ${spacing.spacing24}px;
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
align-items: ${({ $centerContent }) => ($centerContent ? 'center' : 'flex-start')};
|
|
21
|
+
|
|
22
|
+
min-width: 425px;
|
|
23
|
+
max-width: 90vw;
|
|
24
|
+
position: fixed;
|
|
25
|
+
top: 50%;
|
|
26
|
+
left: 50%;
|
|
27
|
+
transform: translate(-50%, -50%);
|
|
28
|
+
`
|
|
29
|
+
export const CloseDialogIconButton = styled.button`
|
|
30
|
+
position: absolute;
|
|
31
|
+
top: 10px;
|
|
32
|
+
right: 10px;
|
|
33
|
+
background: none;
|
|
34
|
+
border: none;
|
|
35
|
+
border-radius: 8px;
|
|
36
|
+
padding: 0px 2px;
|
|
37
|
+
|
|
38
|
+
& svg {
|
|
39
|
+
color: ${({ theme }) => parseColor(theme.colors.neutral700)};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
&:hover svg {
|
|
43
|
+
color: ${({ theme }) => parseColor(theme.colors.neutral900)};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
&:focus {
|
|
47
|
+
box-shadow: ${shadow.focusShadow};
|
|
48
|
+
}
|
|
49
|
+
`
|
|
50
|
+
export const ChildrenContainer = styled.div`
|
|
51
|
+
margin-top: ${spacing.spacing24}px;
|
|
52
|
+
width: 100%;
|
|
53
|
+
`
|
|
54
|
+
|
|
55
|
+
export const ButtonContainer = styled.div<{$centerContent?: boolean}>`
|
|
56
|
+
width: 100%;
|
|
57
|
+
display: flex;
|
|
58
|
+
justify-content: ${({ $centerContent }) => ($centerContent ? 'center' : 'flex-end')};
|
|
59
|
+
flex-direction: ${({ $centerContent }) => ($centerContent ? 'column-reverse' : 'row')};
|
|
60
|
+
gap: ${spacing.spacing12}px;
|
|
61
|
+
margin-top: ${spacing.spacing24}px;
|
|
62
|
+
`;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog"
|
|
2
|
+
import { XIcon } from "@phosphor-icons/react"
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
ButtonContainer,
|
|
6
|
+
ChildrenContainer,
|
|
7
|
+
CloseDialogIconButton,
|
|
8
|
+
Content,
|
|
9
|
+
Overlay
|
|
10
|
+
} from "./Dialog.style"
|
|
11
|
+
import { TDialogProps } from "./Dialog.types"
|
|
12
|
+
|
|
13
|
+
import Button from "../Button"
|
|
14
|
+
import Text from "../Text"
|
|
15
|
+
|
|
16
|
+
export const Dialog: React.FC<TDialogProps> = ({
|
|
17
|
+
open,
|
|
18
|
+
onOpenChange,
|
|
19
|
+
title,
|
|
20
|
+
description,
|
|
21
|
+
trigger,
|
|
22
|
+
children,
|
|
23
|
+
onConfirm,
|
|
24
|
+
variant = 'default',
|
|
25
|
+
className,
|
|
26
|
+
confirmLabel = 'Confirmar',
|
|
27
|
+
cancelLabel = 'Cancelar',
|
|
28
|
+
centerContent = false,
|
|
29
|
+
}: TDialogProps) => {
|
|
30
|
+
return (
|
|
31
|
+
<DialogPrimitive.Root
|
|
32
|
+
open={open}
|
|
33
|
+
onOpenChange={onOpenChange}
|
|
34
|
+
>
|
|
35
|
+
{trigger
|
|
36
|
+
&& <DialogPrimitive.Trigger asChild className={className}>
|
|
37
|
+
{trigger}
|
|
38
|
+
</DialogPrimitive.Trigger>
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
<DialogPrimitive.Portal>
|
|
42
|
+
<Overlay />
|
|
43
|
+
|
|
44
|
+
<Content
|
|
45
|
+
className={className}
|
|
46
|
+
$centerContent={centerContent}
|
|
47
|
+
onInteractOutside={(event) => {
|
|
48
|
+
if (variant === 'danger') event.preventDefault()
|
|
49
|
+
}}
|
|
50
|
+
onEscapeKeyDown={(event) => {
|
|
51
|
+
if (variant === 'danger') event.preventDefault()
|
|
52
|
+
}}
|
|
53
|
+
>
|
|
54
|
+
{title && (
|
|
55
|
+
<DialogPrimitive.Title>
|
|
56
|
+
<Text
|
|
57
|
+
isTitle
|
|
58
|
+
tag='h1'
|
|
59
|
+
size="heading01"
|
|
60
|
+
weight="fontWeight500"
|
|
61
|
+
color='textDark'
|
|
62
|
+
>
|
|
63
|
+
{title}
|
|
64
|
+
</Text>
|
|
65
|
+
</DialogPrimitive.Title>
|
|
66
|
+
)}
|
|
67
|
+
|
|
68
|
+
{description && (
|
|
69
|
+
<DialogPrimitive.Description>
|
|
70
|
+
<Text
|
|
71
|
+
tag='p'
|
|
72
|
+
size="body02"
|
|
73
|
+
weight="fontWeight400"
|
|
74
|
+
color='textMedium'
|
|
75
|
+
>
|
|
76
|
+
{description}
|
|
77
|
+
</Text>
|
|
78
|
+
</DialogPrimitive.Description>
|
|
79
|
+
)}
|
|
80
|
+
|
|
81
|
+
<ChildrenContainer>
|
|
82
|
+
{children}
|
|
83
|
+
</ChildrenContainer>
|
|
84
|
+
|
|
85
|
+
<ButtonContainer $centerContent={centerContent}>
|
|
86
|
+
<DialogPrimitive.Close asChild>
|
|
87
|
+
<Button
|
|
88
|
+
variant="outline"
|
|
89
|
+
>
|
|
90
|
+
{cancelLabel}
|
|
91
|
+
</Button>
|
|
92
|
+
</DialogPrimitive.Close>
|
|
93
|
+
|
|
94
|
+
<Button
|
|
95
|
+
onClick={onConfirm}
|
|
96
|
+
>
|
|
97
|
+
{confirmLabel}
|
|
98
|
+
</Button>
|
|
99
|
+
</ButtonContainer>
|
|
100
|
+
{variant === 'danger' ? null : (
|
|
101
|
+
<DialogPrimitive.Close asChild>
|
|
102
|
+
<CloseDialogIconButton aria-label="Fechar">
|
|
103
|
+
<XIcon size={16} />
|
|
104
|
+
</CloseDialogIconButton>
|
|
105
|
+
</DialogPrimitive.Close>
|
|
106
|
+
)}
|
|
107
|
+
</Content>
|
|
108
|
+
</DialogPrimitive.Portal>
|
|
109
|
+
</DialogPrimitive.Root>
|
|
110
|
+
)
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export default Dialog;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReactNode } from "react"
|
|
2
|
+
|
|
3
|
+
export type TDialogProps = {
|
|
4
|
+
open?: boolean
|
|
5
|
+
onOpenChange?: (open: boolean) => void
|
|
6
|
+
title: string
|
|
7
|
+
description?: string
|
|
8
|
+
className?: string
|
|
9
|
+
trigger?: ReactNode
|
|
10
|
+
children: ReactNode
|
|
11
|
+
onConfirm?: () => void
|
|
12
|
+
confirmLabel?: string
|
|
13
|
+
cancelLabel?: string
|
|
14
|
+
disableClose?: boolean
|
|
15
|
+
centerContent?: boolean
|
|
16
|
+
variant?: 'default' | 'danger'
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./Dialog";
|
|
@@ -131,7 +131,9 @@ const InputOpt: React.FC<InputOptProps> = ({
|
|
|
131
131
|
{Array.from({ length }).map((_, i) => (
|
|
132
132
|
<React.Fragment key={i}>
|
|
133
133
|
<OptBox
|
|
134
|
-
ref={el =>
|
|
134
|
+
ref={(el) => {
|
|
135
|
+
refs.current[i] = el
|
|
136
|
+
}}
|
|
135
137
|
$disabled={disabled}
|
|
136
138
|
$error={!!error}
|
|
137
139
|
value={internal[i] || ''}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { colorType } from 'types'
|
|
1
|
+
import { colorType } from '../../types'
|
|
2
2
|
import { ReactNode } from 'react'
|
|
3
3
|
|
|
4
4
|
type AlignType = 'left' | 'center' | 'right' | 'justify'
|
|
@@ -7,6 +7,7 @@ type SizeType =
|
|
|
7
7
|
| 'span01'
|
|
8
8
|
| 'body01'
|
|
9
9
|
| 'body02'
|
|
10
|
+
| 'body03'
|
|
10
11
|
| 'heading01'
|
|
11
12
|
| 'heading02'
|
|
12
13
|
| 'heading03'
|
package/components/index.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { default as Alert } from './Alert'
|
|
1
2
|
export { default as Button } from './Button'
|
|
2
3
|
export { default as Checkbox } from './Checkbox'
|
|
3
4
|
export { default as DatePicker } from './DatePicker'
|
|
@@ -13,3 +14,4 @@ export { default as SegmentedButton } from './SegmentedButton'
|
|
|
13
14
|
export { default as LinkButton } from './LinkButton'
|
|
14
15
|
export { default as RadioButton } from './RadioButton'
|
|
15
16
|
export { ToastProvider, Toaster } from './Toaster'
|
|
17
|
+
export { default as Dialog } from './Dialog'
|