@pipelinesolucoes/menu 1.0.3-beta.2 → 1.0.3-beta.3
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/README.md +3 -0
- package/dist/components/SideNav.d.ts +195 -16
- package/dist/components/SideNav.js +208 -21
- package/dist/components/SideNav.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,6 +29,9 @@ A biblioteca inclui os seguintes componentes:
|
|
|
29
29
|
Componente de menu vertical que renderiza uma lista de itens de menu empilhados em coluna utilizando `flexbox`.
|
|
30
30
|
|
|
31
31
|
- **SideNav**
|
|
32
|
+
Componente de navegação lateral com área de conteúdo associada.
|
|
33
|
+
Permite alternar entre diferentes seções de conteúdo através de um menu vertical.
|
|
34
|
+
Cada item do menu pode possuir um conteúdo associado que será exibido na área principal ao ser selecionado.
|
|
32
35
|
|
|
33
36
|
- **DrawerResponsive**
|
|
34
37
|
DrawerResponsive é um layout de navegação responsivo que:
|
|
@@ -3,6 +3,7 @@ import { TypographyVariant } from "@mui/material";
|
|
|
3
3
|
import { NavItem } from "../types/NavItem";
|
|
4
4
|
interface SideNavProps {
|
|
5
5
|
items: NavItem[];
|
|
6
|
+
indexItemSelecionado?: number;
|
|
6
7
|
menuWidth?: number;
|
|
7
8
|
itemMenuBackgroundColorSemContent?: string;
|
|
8
9
|
itemMenuColorSemContent?: string;
|
|
@@ -14,31 +15,209 @@ interface SideNavProps {
|
|
|
14
15
|
itemMenuColor?: string;
|
|
15
16
|
itemMenuColorSelected?: string;
|
|
16
17
|
itemMenuVariant?: TypographyVariant;
|
|
17
|
-
borderRadius?: string;
|
|
18
|
-
itemMenuBorderRadius?: string;
|
|
18
|
+
borderRadius?: string | number;
|
|
19
|
+
itemMenuBorderRadius?: string | number;
|
|
19
20
|
contentBackground?: string;
|
|
20
21
|
height?: string | number;
|
|
21
22
|
renderTopMenu?: ReactNode;
|
|
22
23
|
renderBottomMenu?: ReactNode;
|
|
23
|
-
contentGap?: number;
|
|
24
|
-
}
|
|
25
|
-
export declare const SideNavContent: import("@emotion/styled").StyledComponent<import("@mui/system").BoxOwnProps<import("@mui/material").Theme> & Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import("@mui/system").BoxOwnProps<import("@mui/material").Theme>> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme> & {
|
|
26
24
|
contentGap?: number | string;
|
|
27
|
-
|
|
28
|
-
borderRadius?: number | string;
|
|
29
|
-
height?: number | string;
|
|
30
|
-
}, {}, {}>;
|
|
25
|
+
}
|
|
31
26
|
/**
|
|
32
|
-
* Componente
|
|
27
|
+
* Componente de navegação lateral com área de conteúdo associada.
|
|
28
|
+
*
|
|
29
|
+
* Permite alternar entre diferentes seções de conteúdo através de um menu
|
|
30
|
+
* vertical. Cada item do menu pode possuir um conteúdo associado que será
|
|
31
|
+
* exibido na área principal ao ser selecionado.
|
|
32
|
+
*
|
|
33
|
+
* O componente também suporta:
|
|
34
|
+
* - Itens estáticos sem conteúdo
|
|
35
|
+
* - Divisores visuais no menu
|
|
36
|
+
* - Conteúdo customizado no topo e na base do menu
|
|
37
|
+
* - Animação de transição entre conteúdos com `framer-motion`
|
|
38
|
+
*
|
|
39
|
+
* ---
|
|
40
|
+
*
|
|
41
|
+
* Funcionalidades principais
|
|
42
|
+
*
|
|
43
|
+
* - Navegação lateral baseada em lista de itens (`items`)
|
|
44
|
+
* - Controle interno de item ativo
|
|
45
|
+
* - Suporte a itens sem conteúdo
|
|
46
|
+
* - Suporte a divisores no menu (`label === "DIVIDER"`)
|
|
47
|
+
* - Área de conteúdo com transição animada
|
|
48
|
+
* - Customização completa de cores, tipografia e layout
|
|
49
|
+
* - Suporte a conteúdo customizado no topo e rodapé do menu
|
|
50
|
+
*
|
|
51
|
+
* ---
|
|
52
|
+
*
|
|
53
|
+
* Tokens de estilo (ordem de prioridade)
|
|
54
|
+
*
|
|
55
|
+
* Menu lateral:
|
|
56
|
+
* `prop` → `theme.pipelinesolucoes.forms.field` → fallback interno
|
|
57
|
+
*
|
|
58
|
+
* - menuWidth → 180
|
|
59
|
+
* - menuBackground → transparent
|
|
60
|
+
* - borderRadius → 0
|
|
61
|
+
* - height → 500px
|
|
62
|
+
*
|
|
63
|
+
* Itens com conteúdo:
|
|
64
|
+
*
|
|
65
|
+
* - itemMenuBackgroundColor → transparent
|
|
66
|
+
* - itemMenuBackgroundColorHover → grey.300
|
|
67
|
+
* - itemMenuBackgroundColorSelected → primary.main
|
|
68
|
+
* - itemMenuColor → black
|
|
69
|
+
* - itemMenuColorSelected → black
|
|
70
|
+
* - itemMenuBorderRadius → 16px
|
|
71
|
+
*
|
|
72
|
+
* Itens sem conteúdo:
|
|
73
|
+
*
|
|
74
|
+
* - itemMenuBackgroundColorSemContent → transparent
|
|
75
|
+
* - itemMenuColorSemContent → black
|
|
76
|
+
*
|
|
77
|
+
* Área de conteúdo:
|
|
78
|
+
*
|
|
79
|
+
* - contentBackground → grey.50
|
|
80
|
+
* - contentGap → 2
|
|
81
|
+
* - borderRadius → 0
|
|
82
|
+
* - height → 500px
|
|
83
|
+
*
|
|
84
|
+
* ---
|
|
85
|
+
*
|
|
86
|
+
* Tipografia
|
|
87
|
+
*
|
|
88
|
+
* O componente utiliza variantes tipográficas do Material UI através das props:
|
|
89
|
+
*
|
|
90
|
+
* - `itemMenuVariant`
|
|
91
|
+
* - `itemMenuVariantSemContent`
|
|
92
|
+
*
|
|
93
|
+
* Ordem de prioridade:
|
|
94
|
+
*
|
|
95
|
+
* `prop` → `theme.typography[variant]` → `theme.typography.body1`
|
|
96
|
+
*
|
|
97
|
+
* Quando informada, a variante é aplicada diretamente utilizando os estilos
|
|
98
|
+
* definidos em `theme.typography`.
|
|
99
|
+
*
|
|
100
|
+
* ---
|
|
101
|
+
*
|
|
102
|
+
* @param {import("../types/NavItem").NavItem[]} items
|
|
103
|
+
* Lista de itens exibidos no menu lateral.
|
|
104
|
+
*
|
|
105
|
+
* Cada item pode conter:
|
|
106
|
+
*
|
|
107
|
+
* - `label` → texto exibido no menu
|
|
108
|
+
* - `content` → conteúdo renderizado na área principal
|
|
109
|
+
*
|
|
110
|
+
* Regras especiais:
|
|
111
|
+
*
|
|
112
|
+
* - Itens sem `content` são renderizados como rótulos estáticos
|
|
113
|
+
* - Quando `label === "DIVIDER"` será renderizado um divisor visual
|
|
114
|
+
*
|
|
115
|
+
* ---
|
|
116
|
+
*
|
|
117
|
+
* @param {number} [indexItemSelecionado=0]
|
|
118
|
+
* Índice do item inicialmente selecionado.
|
|
119
|
+
*
|
|
120
|
+
* Caso o valor informado esteja fora do intervalo válido da lista de `items`,
|
|
121
|
+
* o componente utiliza automaticamente o índice `0`.
|
|
122
|
+
*
|
|
123
|
+
* @param {number} [menuWidth=180]
|
|
124
|
+
* Largura do menu lateral.
|
|
125
|
+
*
|
|
126
|
+
* @param {string} [itemMenuBackgroundColorSemContent="transparent"]
|
|
127
|
+
* Cor de fundo aplicada aos itens do menu que não possuem conteúdo.
|
|
128
|
+
*
|
|
129
|
+
* @param {string} [itemMenuColorSemContent="black"]
|
|
130
|
+
* Cor de texto aplicada aos itens do menu que não possuem conteúdo.
|
|
131
|
+
*
|
|
132
|
+
* @param {import("@mui/material").TypographyVariant} [itemMenuVariantSemContent="body1"]
|
|
133
|
+
* Variante tipográfica aplicada aos itens do menu sem conteúdo.
|
|
134
|
+
*
|
|
135
|
+
* @param {string} [menuBackground="transparent"]
|
|
136
|
+
* Cor de fundo do container do menu lateral.
|
|
137
|
+
*
|
|
138
|
+
* @param {string} [itemMenuBackgroundColor="transparent"]
|
|
139
|
+
* Cor de fundo padrão dos itens do menu que possuem conteúdo.
|
|
140
|
+
*
|
|
141
|
+
* @param {string} [itemMenuBackgroundColorSelected="primary.main"]
|
|
142
|
+
* Cor de fundo aplicada ao item atualmente selecionado.
|
|
143
|
+
*
|
|
144
|
+
* @param {string} [itemMenuBackgroundColorHover="grey.300"]
|
|
145
|
+
* Cor de fundo aplicada ao passar o cursor sobre itens não selecionados.
|
|
146
|
+
*
|
|
147
|
+
* @param {string} [itemMenuColor="black"]
|
|
148
|
+
* Cor de texto padrão dos itens selecionáveis.
|
|
149
|
+
*
|
|
150
|
+
* @param {string} [itemMenuColorSelected="black"]
|
|
151
|
+
* Cor de texto aplicada ao item atualmente selecionado.
|
|
152
|
+
*
|
|
153
|
+
* @param {import("@mui/material").TypographyVariant} [itemMenuVariant="body1"]
|
|
154
|
+
* Variante tipográfica aplicada aos itens selecionáveis do menu.
|
|
155
|
+
*
|
|
156
|
+
* @param {string | number} [borderRadius="0"]
|
|
157
|
+
* Raio de borda aplicado ao menu lateral e à área de conteúdo.
|
|
158
|
+
*
|
|
159
|
+
* @param {string | number} [itemMenuBorderRadius="16px"]
|
|
160
|
+
* Raio de borda aplicado individualmente aos itens do menu.
|
|
161
|
+
*
|
|
162
|
+
* @param {string} [contentBackground="grey.50"]
|
|
163
|
+
* Cor de fundo da área onde o conteúdo do item selecionado é exibido.
|
|
164
|
+
*
|
|
165
|
+
* @param {string | number} [height="500px"]
|
|
166
|
+
* Altura do componente aplicada tanto ao menu quanto à área de conteúdo.
|
|
167
|
+
*
|
|
168
|
+
* @param {React.ReactNode} [renderTopMenu]
|
|
169
|
+
* Conteúdo opcional renderizado no topo do menu lateral.
|
|
170
|
+
*
|
|
171
|
+
* Pode ser utilizado para:
|
|
172
|
+
*
|
|
173
|
+
* - Títulos
|
|
174
|
+
* - Botões
|
|
175
|
+
* - Filtros
|
|
176
|
+
* - Informações adicionais
|
|
177
|
+
*
|
|
178
|
+
* @param {React.ReactNode} [renderBottomMenu]
|
|
179
|
+
* Conteúdo opcional renderizado no rodapé do menu lateral.
|
|
180
|
+
*
|
|
181
|
+
* Útil para:
|
|
182
|
+
*
|
|
183
|
+
* - Ações secundárias
|
|
184
|
+
* - Informações complementares
|
|
185
|
+
* - Links auxiliares
|
|
186
|
+
*
|
|
187
|
+
* @param {number | string} [contentGap=2]
|
|
188
|
+
* Espaçamento horizontal entre o menu lateral e a área de conteúdo.
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* Uso básico
|
|
192
|
+
*
|
|
193
|
+
* ```tsx
|
|
194
|
+
* const items = [
|
|
195
|
+
* { label: "Visão geral", content: <div>Conteúdo da visão geral</div> },
|
|
196
|
+
* { label: "Configurações", content: <div>Conteúdo de configurações</div> },
|
|
197
|
+
* { label: "DIVIDER" },
|
|
198
|
+
* { label: "Informações" },
|
|
199
|
+
* { label: "Usuários", content: <div>Conteúdo de usuários</div> }
|
|
200
|
+
* ]
|
|
201
|
+
*
|
|
202
|
+
* <SideNav
|
|
203
|
+
* items={items}
|
|
204
|
+
* menuWidth={220}
|
|
205
|
+
* contentBackground="white"
|
|
206
|
+
* itemMenuBackgroundColorSelected="primary.main"
|
|
207
|
+
* />
|
|
33
208
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
209
|
+
* @example
|
|
210
|
+
* Uso com conteúdo customizado no menu
|
|
36
211
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
212
|
+
* ```tsx
|
|
213
|
+
* <SideNav
|
|
214
|
+
* items={items}
|
|
215
|
+
* renderTopMenu={<Box p={2}>Menu</Box>}
|
|
216
|
+
* renderBottomMenu={<Box p={2}>Rodapé</Box>}
|
|
217
|
+
* />
|
|
218
|
+
* ```
|
|
40
219
|
*/
|
|
41
|
-
declare function SideNav({ items, menuWidth, itemMenuBackgroundColorSemContent, itemMenuColorSemContent, itemMenuVariantSemContent, menuBackground, borderRadius, itemMenuBorderRadius, itemMenuBackgroundColor, itemMenuBackgroundColorHover, itemMenuBackgroundColorSelected, itemMenuColor, itemMenuColorSelected, itemMenuVariant, contentBackground, renderTopMenu, renderBottomMenu, height, contentGap, }: SideNavProps): import("react/jsx-runtime").JSX.Element | null;
|
|
220
|
+
declare function SideNav({ items, indexItemSelecionado, menuWidth, itemMenuBackgroundColorSemContent, itemMenuColorSemContent, itemMenuVariantSemContent, menuBackground, borderRadius, itemMenuBorderRadius, itemMenuBackgroundColor, itemMenuBackgroundColorHover, itemMenuBackgroundColorSelected, itemMenuColor, itemMenuColorSelected, itemMenuVariant, contentBackground, renderTopMenu, renderBottomMenu, height, contentGap, }: SideNavProps): import("react/jsx-runtime").JSX.Element | null;
|
|
42
221
|
declare namespace SideNav {
|
|
43
222
|
var displayName: string;
|
|
44
223
|
}
|
|
@@ -33,16 +33,16 @@ const MenuItemBox = styled(Box, {
|
|
|
33
33
|
"itemMenuColorSelected",
|
|
34
34
|
"typographyVariant",
|
|
35
35
|
].includes(prop),
|
|
36
|
-
})(({ theme, active, itemMenuBorderRadius, itemMenuBackgroundColor, itemMenuBackgroundColorSelected, itemMenuBackgroundColorHover, itemMenuColor, itemMenuColorSelected, typographyVariant }) => (Object.assign(Object.assign({ cursor: "pointer", padding: "8px 16px", borderRadius: itemMenuBorderRadius, backgroundColor: active
|
|
36
|
+
})(({ theme, active, itemMenuBorderRadius, itemMenuBackgroundColor, itemMenuBackgroundColorSelected, itemMenuBackgroundColorHover, itemMenuColor, itemMenuColorSelected, typographyVariant, }) => (Object.assign(Object.assign({ cursor: "pointer", padding: "8px 16px", borderRadius: itemMenuBorderRadius, backgroundColor: active
|
|
37
37
|
? itemMenuBackgroundColorSelected
|
|
38
38
|
: itemMenuBackgroundColor, color: active ? itemMenuColorSelected : itemMenuColor, width: "100%", transition: "all 0.2s ease", userSelect: "none" }, (typographyVariant && theme.typography[typographyVariant])), { "&:hover": {
|
|
39
39
|
backgroundColor: active
|
|
40
40
|
? itemMenuBackgroundColorSelected
|
|
41
41
|
: itemMenuBackgroundColorHover,
|
|
42
42
|
} })));
|
|
43
|
-
|
|
43
|
+
const SideNavContent = styled(Box, {
|
|
44
44
|
shouldForwardProp: (prop) => !["contentGap", "contentBackground", "borderRadius", "height"].includes(prop),
|
|
45
|
-
})(({ contentGap = 2, contentBackground = "transparent", borderRadius = 2, height = "100%"
|
|
45
|
+
})(({ contentGap = 2, contentBackground = "transparent", borderRadius = 2, height = "100%" }) => ({
|
|
46
46
|
width: "auto",
|
|
47
47
|
flex: 1,
|
|
48
48
|
marginLeft: contentGap,
|
|
@@ -55,31 +55,218 @@ export const SideNavContent = styled(Box, {
|
|
|
55
55
|
overflowY: "auto",
|
|
56
56
|
}));
|
|
57
57
|
/**
|
|
58
|
-
* Componente
|
|
58
|
+
* Componente de navegação lateral com área de conteúdo associada.
|
|
59
59
|
*
|
|
60
|
-
*
|
|
61
|
-
* Cada item
|
|
60
|
+
* Permite alternar entre diferentes seções de conteúdo através de um menu
|
|
61
|
+
* vertical. Cada item do menu pode possuir um conteúdo associado que será
|
|
62
|
+
* exibido na área principal ao ser selecionado.
|
|
62
63
|
*
|
|
63
|
-
*
|
|
64
|
-
* -
|
|
65
|
-
* -
|
|
64
|
+
* O componente também suporta:
|
|
65
|
+
* - Itens estáticos sem conteúdo
|
|
66
|
+
* - Divisores visuais no menu
|
|
67
|
+
* - Conteúdo customizado no topo e na base do menu
|
|
68
|
+
* - Animação de transição entre conteúdos com `framer-motion`
|
|
69
|
+
*
|
|
70
|
+
* ---
|
|
71
|
+
*
|
|
72
|
+
* Funcionalidades principais
|
|
73
|
+
*
|
|
74
|
+
* - Navegação lateral baseada em lista de itens (`items`)
|
|
75
|
+
* - Controle interno de item ativo
|
|
76
|
+
* - Suporte a itens sem conteúdo
|
|
77
|
+
* - Suporte a divisores no menu (`label === "DIVIDER"`)
|
|
78
|
+
* - Área de conteúdo com transição animada
|
|
79
|
+
* - Customização completa de cores, tipografia e layout
|
|
80
|
+
* - Suporte a conteúdo customizado no topo e rodapé do menu
|
|
81
|
+
*
|
|
82
|
+
* ---
|
|
83
|
+
*
|
|
84
|
+
* Tokens de estilo (ordem de prioridade)
|
|
85
|
+
*
|
|
86
|
+
* Menu lateral:
|
|
87
|
+
* `prop` → `theme.pipelinesolucoes.forms.field` → fallback interno
|
|
88
|
+
*
|
|
89
|
+
* - menuWidth → 180
|
|
90
|
+
* - menuBackground → transparent
|
|
91
|
+
* - borderRadius → 0
|
|
92
|
+
* - height → 500px
|
|
93
|
+
*
|
|
94
|
+
* Itens com conteúdo:
|
|
95
|
+
*
|
|
96
|
+
* - itemMenuBackgroundColor → transparent
|
|
97
|
+
* - itemMenuBackgroundColorHover → grey.300
|
|
98
|
+
* - itemMenuBackgroundColorSelected → primary.main
|
|
99
|
+
* - itemMenuColor → black
|
|
100
|
+
* - itemMenuColorSelected → black
|
|
101
|
+
* - itemMenuBorderRadius → 16px
|
|
102
|
+
*
|
|
103
|
+
* Itens sem conteúdo:
|
|
104
|
+
*
|
|
105
|
+
* - itemMenuBackgroundColorSemContent → transparent
|
|
106
|
+
* - itemMenuColorSemContent → black
|
|
107
|
+
*
|
|
108
|
+
* Área de conteúdo:
|
|
109
|
+
*
|
|
110
|
+
* - contentBackground → grey.50
|
|
111
|
+
* - contentGap → 2
|
|
112
|
+
* - borderRadius → 0
|
|
113
|
+
* - height → 500px
|
|
114
|
+
*
|
|
115
|
+
* ---
|
|
116
|
+
*
|
|
117
|
+
* Tipografia
|
|
118
|
+
*
|
|
119
|
+
* O componente utiliza variantes tipográficas do Material UI através das props:
|
|
120
|
+
*
|
|
121
|
+
* - `itemMenuVariant`
|
|
122
|
+
* - `itemMenuVariantSemContent`
|
|
123
|
+
*
|
|
124
|
+
* Ordem de prioridade:
|
|
125
|
+
*
|
|
126
|
+
* `prop` → `theme.typography[variant]` → `theme.typography.body1`
|
|
127
|
+
*
|
|
128
|
+
* Quando informada, a variante é aplicada diretamente utilizando os estilos
|
|
129
|
+
* definidos em `theme.typography`.
|
|
130
|
+
*
|
|
131
|
+
* ---
|
|
132
|
+
*
|
|
133
|
+
* @param {import("../types/NavItem").NavItem[]} items
|
|
134
|
+
* Lista de itens exibidos no menu lateral.
|
|
135
|
+
*
|
|
136
|
+
* Cada item pode conter:
|
|
137
|
+
*
|
|
138
|
+
* - `label` → texto exibido no menu
|
|
139
|
+
* - `content` → conteúdo renderizado na área principal
|
|
140
|
+
*
|
|
141
|
+
* Regras especiais:
|
|
142
|
+
*
|
|
143
|
+
* - Itens sem `content` são renderizados como rótulos estáticos
|
|
144
|
+
* - Quando `label === "DIVIDER"` será renderizado um divisor visual
|
|
145
|
+
*
|
|
146
|
+
* ---
|
|
147
|
+
*
|
|
148
|
+
* @param {number} [indexItemSelecionado=0]
|
|
149
|
+
* Índice do item inicialmente selecionado.
|
|
150
|
+
*
|
|
151
|
+
* Caso o valor informado esteja fora do intervalo válido da lista de `items`,
|
|
152
|
+
* o componente utiliza automaticamente o índice `0`.
|
|
153
|
+
*
|
|
154
|
+
* @param {number} [menuWidth=180]
|
|
155
|
+
* Largura do menu lateral.
|
|
156
|
+
*
|
|
157
|
+
* @param {string} [itemMenuBackgroundColorSemContent="transparent"]
|
|
158
|
+
* Cor de fundo aplicada aos itens do menu que não possuem conteúdo.
|
|
159
|
+
*
|
|
160
|
+
* @param {string} [itemMenuColorSemContent="black"]
|
|
161
|
+
* Cor de texto aplicada aos itens do menu que não possuem conteúdo.
|
|
162
|
+
*
|
|
163
|
+
* @param {import("@mui/material").TypographyVariant} [itemMenuVariantSemContent="body1"]
|
|
164
|
+
* Variante tipográfica aplicada aos itens do menu sem conteúdo.
|
|
165
|
+
*
|
|
166
|
+
* @param {string} [menuBackground="transparent"]
|
|
167
|
+
* Cor de fundo do container do menu lateral.
|
|
168
|
+
*
|
|
169
|
+
* @param {string} [itemMenuBackgroundColor="transparent"]
|
|
170
|
+
* Cor de fundo padrão dos itens do menu que possuem conteúdo.
|
|
171
|
+
*
|
|
172
|
+
* @param {string} [itemMenuBackgroundColorSelected="primary.main"]
|
|
173
|
+
* Cor de fundo aplicada ao item atualmente selecionado.
|
|
174
|
+
*
|
|
175
|
+
* @param {string} [itemMenuBackgroundColorHover="grey.300"]
|
|
176
|
+
* Cor de fundo aplicada ao passar o cursor sobre itens não selecionados.
|
|
177
|
+
*
|
|
178
|
+
* @param {string} [itemMenuColor="black"]
|
|
179
|
+
* Cor de texto padrão dos itens selecionáveis.
|
|
180
|
+
*
|
|
181
|
+
* @param {string} [itemMenuColorSelected="black"]
|
|
182
|
+
* Cor de texto aplicada ao item atualmente selecionado.
|
|
183
|
+
*
|
|
184
|
+
* @param {import("@mui/material").TypographyVariant} [itemMenuVariant="body1"]
|
|
185
|
+
* Variante tipográfica aplicada aos itens selecionáveis do menu.
|
|
186
|
+
*
|
|
187
|
+
* @param {string | number} [borderRadius="0"]
|
|
188
|
+
* Raio de borda aplicado ao menu lateral e à área de conteúdo.
|
|
189
|
+
*
|
|
190
|
+
* @param {string | number} [itemMenuBorderRadius="16px"]
|
|
191
|
+
* Raio de borda aplicado individualmente aos itens do menu.
|
|
192
|
+
*
|
|
193
|
+
* @param {string} [contentBackground="grey.50"]
|
|
194
|
+
* Cor de fundo da área onde o conteúdo do item selecionado é exibido.
|
|
195
|
+
*
|
|
196
|
+
* @param {string | number} [height="500px"]
|
|
197
|
+
* Altura do componente aplicada tanto ao menu quanto à área de conteúdo.
|
|
198
|
+
*
|
|
199
|
+
* @param {React.ReactNode} [renderTopMenu]
|
|
200
|
+
* Conteúdo opcional renderizado no topo do menu lateral.
|
|
201
|
+
*
|
|
202
|
+
* Pode ser utilizado para:
|
|
203
|
+
*
|
|
204
|
+
* - Títulos
|
|
205
|
+
* - Botões
|
|
206
|
+
* - Filtros
|
|
207
|
+
* - Informações adicionais
|
|
208
|
+
*
|
|
209
|
+
* @param {React.ReactNode} [renderBottomMenu]
|
|
210
|
+
* Conteúdo opcional renderizado no rodapé do menu lateral.
|
|
211
|
+
*
|
|
212
|
+
* Útil para:
|
|
213
|
+
*
|
|
214
|
+
* - Ações secundárias
|
|
215
|
+
* - Informações complementares
|
|
216
|
+
* - Links auxiliares
|
|
217
|
+
*
|
|
218
|
+
* @param {number | string} [contentGap=2]
|
|
219
|
+
* Espaçamento horizontal entre o menu lateral e a área de conteúdo.
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* Uso básico
|
|
223
|
+
*
|
|
224
|
+
* ```tsx
|
|
225
|
+
* const items = [
|
|
226
|
+
* { label: "Visão geral", content: <div>Conteúdo da visão geral</div> },
|
|
227
|
+
* { label: "Configurações", content: <div>Conteúdo de configurações</div> },
|
|
228
|
+
* { label: "DIVIDER" },
|
|
229
|
+
* { label: "Informações" },
|
|
230
|
+
* { label: "Usuários", content: <div>Conteúdo de usuários</div> }
|
|
231
|
+
* ]
|
|
232
|
+
*
|
|
233
|
+
* <SideNav
|
|
234
|
+
* items={items}
|
|
235
|
+
* menuWidth={220}
|
|
236
|
+
* contentBackground="white"
|
|
237
|
+
* itemMenuBackgroundColorSelected="primary.main"
|
|
238
|
+
* />
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* Uso com conteúdo customizado no menu
|
|
242
|
+
*
|
|
243
|
+
* ```tsx
|
|
244
|
+
* <SideNav
|
|
245
|
+
* items={items}
|
|
246
|
+
* renderTopMenu={<Box p={2}>Menu</Box>}
|
|
247
|
+
* renderBottomMenu={<Box p={2}>Rodapé</Box>}
|
|
248
|
+
* />
|
|
249
|
+
* ```
|
|
66
250
|
*/
|
|
67
|
-
export default function SideNav({ items, menuWidth = 180, itemMenuBackgroundColorSemContent = "transparent", itemMenuColorSemContent = "black", itemMenuVariantSemContent = "body1", menuBackground = "transparent", borderRadius = "0", itemMenuBorderRadius = "16px", itemMenuBackgroundColor = "transparent", itemMenuBackgroundColorHover = "grey.300", itemMenuBackgroundColorSelected = "primary.main", itemMenuColor = "black", itemMenuColorSelected = "black", itemMenuVariant = "body1", contentBackground = "grey.50", renderTopMenu, renderBottomMenu, height = "500px", contentGap = 2, }) {
|
|
251
|
+
export default function SideNav({ items, indexItemSelecionado = 0, menuWidth = 180, itemMenuBackgroundColorSemContent = "transparent", itemMenuColorSemContent = "black", itemMenuVariantSemContent = "body1", menuBackground = "transparent", borderRadius = "0", itemMenuBorderRadius = "16px", itemMenuBackgroundColor = "transparent", itemMenuBackgroundColorHover = "grey.300", itemMenuBackgroundColorSelected = "primary.main", itemMenuColor = "black", itemMenuColorSelected = "black", itemMenuVariant = "body1", contentBackground = "grey.50", renderTopMenu, renderBottomMenu, height = "500px", contentGap = 2, }) {
|
|
68
252
|
var _a;
|
|
69
|
-
const [activeIndex, setActiveIndex] = useState(0);
|
|
70
253
|
if (!items || items.length === 0) {
|
|
71
254
|
return null;
|
|
72
255
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
256
|
+
const initialIndex = indexItemSelecionado >= 0 && indexItemSelecionado < items.length
|
|
257
|
+
? indexItemSelecionado
|
|
258
|
+
: 0;
|
|
259
|
+
const [activeIndex, setActiveIndex] = useState(initialIndex);
|
|
260
|
+
return (_jsxs(Container, { children: [_jsxs(SideNavContainer, { height: height, menuWidth: menuWidth, menuBackground: menuBackground, borderRadius: borderRadius, children: [_jsxs(Box, { children: [renderTopMenu && _jsx(Box, { children: renderTopMenu }), _jsx(Box, { sx: { display: "flex", flexDirection: "column", gap: 1 }, children: items.map((item, idx) => {
|
|
261
|
+
var _a;
|
|
262
|
+
if (!item.content) {
|
|
263
|
+
if (((_a = item.label) === null || _a === void 0 ? void 0 : _a.toUpperCase()) === "DIVIDER") {
|
|
264
|
+
return _jsx(Divider, {}, `divider-${idx}`);
|
|
265
|
+
}
|
|
266
|
+
return (_jsx(MenuItemBox, { typographyVariant: itemMenuVariantSemContent, itemMenuBorderRadius: itemMenuBorderRadius, itemMenuBackgroundColor: itemMenuBackgroundColorSemContent, itemMenuColor: itemMenuColorSemContent, sx: { cursor: "default" }, children: item.label }, `${item.label}-${idx}`));
|
|
267
|
+
}
|
|
268
|
+
return (_jsx(MenuItemBox, { active: activeIndex === idx, typographyVariant: itemMenuVariant, itemMenuBorderRadius: itemMenuBorderRadius, itemMenuBackgroundColor: itemMenuBackgroundColor, itemMenuBackgroundColorHover: itemMenuBackgroundColorHover, itemMenuBackgroundColorSelected: itemMenuBackgroundColorSelected, itemMenuColor: itemMenuColor, itemMenuColorSelected: itemMenuColorSelected, onClick: () => setActiveIndex(idx), children: item.label }, `${item.label}-${idx}`));
|
|
269
|
+
}) })] }), renderBottomMenu && (_jsx(Box, { sx: { mt: 2, pt: 2, flexShrink: 0 }, children: renderBottomMenu }))] }), _jsx(SideNavContent, { contentBackground: contentBackground, contentGap: contentGap, height: height, borderRadius: borderRadius, children: _jsx(AnimatePresence, { mode: "wait", children: _jsx(motion.div, { initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -10 }, transition: { duration: 0.2 }, style: { width: "100%" }, children: (_a = items[activeIndex]) === null || _a === void 0 ? void 0 : _a.content }, activeIndex) }) })] }));
|
|
83
270
|
}
|
|
84
271
|
SideNav.displayName = "SideNav";
|
|
85
272
|
//# sourceMappingURL=SideNav.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SideNav.js","sourceRoot":"","sources":["../../src/components/SideNav.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAa,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAqB,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"SideNav.js","sourceRoot":"","sources":["../../src/components/SideNav.tsx"],"names":[],"mappings":"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"}
|