kitunga-web 0.1.85 → 0.1.87
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/dist/features/inputs/components/Inputs/NumberInput.module.css +1 -1
- package/dist/features/inputs/components/Inputs/TextInput.module.css +6 -1
- package/dist/features/inputs/components/Inputs/TextareaInput.module.css +5 -0
- package/dist/features/overlays/components/dropdowns/DropdownMenu.d.ts +15 -2
- package/dist/features/overlays/components/dropdowns/DropdownMenu.d.ts.map +1 -1
- package/dist/features/overlays/components/dropdowns/DropdownMenu.js +181 -9
- package/dist/features/overlays/components/dropdowns/DropdownMenu.js.map +1 -1
- package/dist/features/overlays/components/dropdowns/DropdownMenu.module.css +99 -8
- package/package.json +1 -1
|
@@ -152,7 +152,12 @@
|
|
|
152
152
|
.lg .textInput {
|
|
153
153
|
height: 45px;
|
|
154
154
|
font-size: 1rem;
|
|
155
|
-
padding: var(--spacing-md);
|
|
155
|
+
padding: 0 var(--spacing-md);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* lg + leftIcon: preservar padding-left do hasLeftIcon */
|
|
159
|
+
.lg.hasLeftIcon .textInput {
|
|
160
|
+
padding-left: 2.8rem;
|
|
156
161
|
}
|
|
157
162
|
|
|
158
163
|
.lg .clearButton {
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
export interface DropdownMenuItem {
|
|
2
2
|
id: string;
|
|
3
|
-
label
|
|
3
|
+
label?: string;
|
|
4
4
|
icon?: React.ReactNode;
|
|
5
5
|
description?: string;
|
|
6
6
|
suffix?: string;
|
|
7
7
|
destructive?: boolean;
|
|
8
8
|
active?: boolean;
|
|
9
|
+
/** Border-divider personalizado por item. */
|
|
10
|
+
divider?: 'top' | 'bottom' | 'both' | 'none';
|
|
11
|
+
/** Item totalmente personalizado — substitui o conteúdo visual. */
|
|
12
|
+
customRender?: React.ReactNode;
|
|
9
13
|
}
|
|
10
14
|
export interface DropdownMenuProps {
|
|
11
15
|
isOpen: boolean;
|
|
@@ -13,6 +17,15 @@ export interface DropdownMenuProps {
|
|
|
13
17
|
triggerRef?: React.RefObject<HTMLElement | null>;
|
|
14
18
|
items: DropdownMenuItem[];
|
|
15
19
|
onSelect?: (itemId: string) => void;
|
|
20
|
+
size?: 'sm' | 'md' | 'lg';
|
|
21
|
+
width?: number;
|
|
22
|
+
placementVertical?: 'top' | 'bottom' | 'auto';
|
|
23
|
+
placementHorizontal?: 'left' | 'right' | 'auto';
|
|
24
|
+
bordered?: boolean;
|
|
25
|
+
placementOffset?: number;
|
|
26
|
+
/** Container dentro do qual o dropdown deve ficar. Se não definido, usa o viewport. */
|
|
27
|
+
boundaryRef?: React.RefObject<HTMLElement | null>;
|
|
28
|
+
className?: string;
|
|
16
29
|
}
|
|
17
|
-
export default function DropdownMenu({ isOpen, onClose, triggerRef, items, onSelect, }: DropdownMenuProps): import("react/jsx-runtime").JSX.Element | null;
|
|
30
|
+
export default function DropdownMenu({ isOpen, onClose, triggerRef, items, onSelect, size, width, placementVertical, placementHorizontal, bordered, placementOffset, boundaryRef, className, }: DropdownMenuProps): import("react/jsx-runtime").JSX.Element | null;
|
|
18
31
|
//# sourceMappingURL=DropdownMenu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../../../../src/features/overlays/components/dropdowns/DropdownMenu.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../../../../src/features/overlays/components/dropdowns/DropdownMenu.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7C,mEAAmE;IACnE,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACjD,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uFAAuF;IACvF,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,MAAM,EACN,OAAO,EACP,UAAU,EACV,KAAK,EACL,QAAQ,EACR,IAAW,EACX,KAAW,EACX,iBAA4B,EAC5B,mBAA6B,EAC7B,QAAe,EACf,eAAmB,EACnB,WAAW,EACX,SAAc,GACf,EAAE,iBAAiB,kDA0OnB"}
|
|
@@ -1,34 +1,206 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import { useEffect, useRef } from 'react';
|
|
3
|
+
import { useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
4
4
|
import styles from './DropdownMenu.module.css';
|
|
5
5
|
import SharedMenuItem from '../../../navigation/components/Menu/SharedMenuItem';
|
|
6
|
-
export default function DropdownMenu({ isOpen, onClose, triggerRef, items, onSelect, }) {
|
|
6
|
+
export default function DropdownMenu({ isOpen, onClose, triggerRef, items, onSelect, size = 'md', width = 220, placementVertical = 'bottom', placementHorizontal = 'right', bordered = true, placementOffset = 8, boundaryRef, className = '', }) {
|
|
7
7
|
const dropdownRef = useRef(null);
|
|
8
|
+
const [coords, setCoords] = useState(null);
|
|
9
|
+
// Se ainda não temos coords, o dropdown renderiza escondido para medir a altura.
|
|
10
|
+
const measuring = !coords;
|
|
11
|
+
// Boundary: se boundaryRef for definido, usa o rect do container.
|
|
12
|
+
// Senão procura o primeiro ancestral do trigger com overflow e usa esse.
|
|
13
|
+
// Senão usa o viewport.
|
|
14
|
+
const getBoundary = () => {
|
|
15
|
+
if (boundaryRef === null || boundaryRef === void 0 ? void 0 : boundaryRef.current) {
|
|
16
|
+
const b = boundaryRef.current.getBoundingClientRect();
|
|
17
|
+
return { top: b.top, bottom: b.bottom, left: b.left, right: b.right };
|
|
18
|
+
}
|
|
19
|
+
// Procurar ancestral do trigger com overflow.
|
|
20
|
+
if (triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current) {
|
|
21
|
+
let parent = triggerRef.current.parentElement;
|
|
22
|
+
while (parent) {
|
|
23
|
+
const style = window.getComputedStyle(parent);
|
|
24
|
+
const overflow = style.overflow + ' ' + style.overflowY + ' ' + style.overflowX;
|
|
25
|
+
if (/(auto|scroll|hidden|clip)/.test(overflow)) {
|
|
26
|
+
const b = parent.getBoundingClientRect();
|
|
27
|
+
return { top: b.top, bottom: b.bottom, left: b.left, right: b.right };
|
|
28
|
+
}
|
|
29
|
+
parent = parent.parentElement;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth };
|
|
33
|
+
};
|
|
34
|
+
// Resolver auto: decidir direção com base no espaço disponível dentro do boundary.
|
|
35
|
+
const resolveVertical = (rect) => {
|
|
36
|
+
var _a, _b;
|
|
37
|
+
if (placementVertical !== 'auto')
|
|
38
|
+
return placementVertical;
|
|
39
|
+
const boundary = getBoundary();
|
|
40
|
+
const dropdownHeight = (_b = (_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.offsetHeight) !== null && _b !== void 0 ? _b : 300;
|
|
41
|
+
const spaceBelow = boundary.bottom - rect.bottom;
|
|
42
|
+
const spaceAbove = rect.top - boundary.top;
|
|
43
|
+
if (spaceBelow >= dropdownHeight + placementOffset)
|
|
44
|
+
return 'bottom';
|
|
45
|
+
if (spaceAbove >= dropdownHeight + placementOffset)
|
|
46
|
+
return 'top';
|
|
47
|
+
return spaceBelow > spaceAbove ? 'bottom' : 'top';
|
|
48
|
+
};
|
|
49
|
+
const resolveHorizontal = (rect, dropdownWidth) => {
|
|
50
|
+
if (placementHorizontal !== 'auto')
|
|
51
|
+
return placementHorizontal;
|
|
52
|
+
const boundary = getBoundary();
|
|
53
|
+
const spaceRight = boundary.right - rect.right;
|
|
54
|
+
const spaceLeft = rect.left - boundary.left;
|
|
55
|
+
if (spaceRight >= dropdownWidth + placementOffset)
|
|
56
|
+
return 'left';
|
|
57
|
+
if (spaceLeft >= dropdownWidth + placementOffset)
|
|
58
|
+
return 'right';
|
|
59
|
+
return spaceRight > spaceLeft ? 'left' : 'right';
|
|
60
|
+
};
|
|
61
|
+
const calcCoords = () => {
|
|
62
|
+
if (!(triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current))
|
|
63
|
+
return null;
|
|
64
|
+
const rect = triggerRef.current.getBoundingClientRect();
|
|
65
|
+
const dropdownWidth = width;
|
|
66
|
+
const vDir = resolveVertical(rect);
|
|
67
|
+
const hDir = resolveHorizontal(rect, dropdownWidth);
|
|
68
|
+
let top = null;
|
|
69
|
+
let bottom = null;
|
|
70
|
+
if (vDir === 'top') {
|
|
71
|
+
bottom = window.innerHeight - rect.top + placementOffset;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
top = rect.bottom + placementOffset;
|
|
75
|
+
}
|
|
76
|
+
let left;
|
|
77
|
+
if (hDir === 'left') {
|
|
78
|
+
left = rect.left;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
left = rect.right - dropdownWidth;
|
|
82
|
+
}
|
|
83
|
+
// Garantir que não sai do viewport horizontal.
|
|
84
|
+
if (left < 8)
|
|
85
|
+
left = 8;
|
|
86
|
+
if (left + dropdownWidth > window.innerWidth - 8) {
|
|
87
|
+
left = window.innerWidth - dropdownWidth - 8;
|
|
88
|
+
}
|
|
89
|
+
return { top, bottom, left };
|
|
90
|
+
};
|
|
91
|
+
// Calcular posição a partir do trigger.
|
|
92
|
+
// Primeiro render: coords é null, dropdown renderiza escondido para medir altura.
|
|
93
|
+
// Segundo render: com a altura medida, calcula coords finais.
|
|
94
|
+
useLayoutEffect(() => {
|
|
95
|
+
if (!isOpen) {
|
|
96
|
+
setCoords(null);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
setCoords(calcCoords());
|
|
100
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
101
|
+
}, [isOpen, triggerRef, size, width, placementVertical, placementHorizontal, placementOffset, boundaryRef, measuring]);
|
|
102
|
+
// Fechar ao clicar fora.
|
|
8
103
|
useEffect(() => {
|
|
9
104
|
if (!isOpen)
|
|
10
105
|
return;
|
|
11
106
|
const handleClick = (event) => {
|
|
12
107
|
var _a, _b;
|
|
13
108
|
const target = event.target;
|
|
14
|
-
if ((_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.contains(target))
|
|
109
|
+
if ((_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.contains(target))
|
|
15
110
|
return;
|
|
16
|
-
|
|
17
|
-
if ((_b = triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current) === null || _b === void 0 ? void 0 : _b.contains(target)) {
|
|
111
|
+
if ((_b = triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current) === null || _b === void 0 ? void 0 : _b.contains(target))
|
|
18
112
|
return;
|
|
19
|
-
}
|
|
20
113
|
onClose();
|
|
21
114
|
};
|
|
22
115
|
document.addEventListener('mousedown', handleClick);
|
|
23
116
|
return () => document.removeEventListener('mousedown', handleClick);
|
|
24
117
|
}, [isOpen, onClose, triggerRef]);
|
|
25
|
-
|
|
118
|
+
// Reposicionar no scroll e resize — directamente via ref, sem re-render.
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
if (!isOpen)
|
|
121
|
+
return;
|
|
122
|
+
const updatePosition = () => {
|
|
123
|
+
if (!dropdownRef.current || !(triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current))
|
|
124
|
+
return;
|
|
125
|
+
const newCoords = calcCoords();
|
|
126
|
+
if (!newCoords)
|
|
127
|
+
return;
|
|
128
|
+
if (newCoords.top !== null) {
|
|
129
|
+
dropdownRef.current.style.top = `${newCoords.top}px`;
|
|
130
|
+
dropdownRef.current.style.bottom = 'auto';
|
|
131
|
+
}
|
|
132
|
+
else if (newCoords.bottom !== null) {
|
|
133
|
+
dropdownRef.current.style.bottom = `${newCoords.bottom}px`;
|
|
134
|
+
dropdownRef.current.style.top = 'auto';
|
|
135
|
+
}
|
|
136
|
+
dropdownRef.current.style.left = `${newCoords.left}px`;
|
|
137
|
+
};
|
|
138
|
+
// Usar requestAnimationFrame para suavizar sem lag.
|
|
139
|
+
let rafId = null;
|
|
140
|
+
const onScroll = () => {
|
|
141
|
+
if (rafId !== null)
|
|
142
|
+
cancelAnimationFrame(rafId);
|
|
143
|
+
rafId = requestAnimationFrame(updatePosition);
|
|
144
|
+
};
|
|
145
|
+
window.addEventListener('scroll', onScroll, true);
|
|
146
|
+
window.addEventListener('resize', updatePosition);
|
|
147
|
+
return () => {
|
|
148
|
+
if (rafId !== null)
|
|
149
|
+
cancelAnimationFrame(rafId);
|
|
150
|
+
window.removeEventListener('scroll', onScroll, true);
|
|
151
|
+
window.removeEventListener('resize', updatePosition);
|
|
152
|
+
};
|
|
153
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
154
|
+
}, [isOpen, triggerRef, size, width, placementVertical, placementHorizontal, placementOffset, boundaryRef]);
|
|
155
|
+
if (!isOpen)
|
|
26
156
|
return null;
|
|
27
|
-
}
|
|
28
157
|
const handleItemClick = (itemId) => {
|
|
29
158
|
onSelect === null || onSelect === void 0 ? void 0 : onSelect(itemId);
|
|
30
159
|
onClose();
|
|
31
160
|
};
|
|
32
|
-
|
|
161
|
+
const dropdownStyle = {
|
|
162
|
+
position: 'fixed',
|
|
163
|
+
width: `${width}px`,
|
|
164
|
+
};
|
|
165
|
+
if (measuring) {
|
|
166
|
+
// Renderizar fora do viewport para medir a altura sem ser visível.
|
|
167
|
+
dropdownStyle.left = -9999;
|
|
168
|
+
dropdownStyle.top = 0;
|
|
169
|
+
dropdownStyle.visibility = 'hidden';
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
dropdownStyle.left = coords.left;
|
|
173
|
+
if (coords.top !== null) {
|
|
174
|
+
dropdownStyle.top = coords.top;
|
|
175
|
+
dropdownStyle.bottom = 'auto';
|
|
176
|
+
}
|
|
177
|
+
else if (coords.bottom !== null) {
|
|
178
|
+
dropdownStyle.bottom = coords.bottom;
|
|
179
|
+
dropdownStyle.top = 'auto';
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const dropdownClasses = [
|
|
183
|
+
styles.dropdown,
|
|
184
|
+
styles[size],
|
|
185
|
+
!bordered ? styles.noBorder : '',
|
|
186
|
+
className,
|
|
187
|
+
]
|
|
188
|
+
.filter(Boolean)
|
|
189
|
+
.join(' ');
|
|
190
|
+
return (_jsx("div", { className: dropdownClasses, ref: dropdownRef, style: dropdownStyle, children: _jsx("div", { className: styles.menuList, children: items.map((item) => {
|
|
191
|
+
var _a;
|
|
192
|
+
const dividerClasses = [
|
|
193
|
+
item.divider === 'top' || item.divider === 'both' ? styles.dividerTop : '',
|
|
194
|
+
item.divider === 'bottom' || item.divider === 'both' ? styles.dividerBottom : '',
|
|
195
|
+
]
|
|
196
|
+
.filter(Boolean)
|
|
197
|
+
.join(' ');
|
|
198
|
+
// Item totalmente personalizado.
|
|
199
|
+
if (item.customRender) {
|
|
200
|
+
return (_jsx("div", { className: `${styles.customItem} ${dividerClasses}`.trim(), onClick: () => handleItemClick(item.id), children: _jsx("div", { className: styles.customContent, children: item.customRender }) }, item.id));
|
|
201
|
+
}
|
|
202
|
+
// Item normal com SharedMenuItem (já renderiza <li> internamente).
|
|
203
|
+
return (_jsx("div", { className: dividerClasses.trim() || undefined, children: _jsx(SharedMenuItem, { label: (_a = item.label) !== null && _a !== void 0 ? _a : '', leftIcon: item.icon, description: item.description, suffix: item.suffix, active: item.active, destructive: item.destructive, size: size, onClick: () => handleItemClick(item.id), isExpanded: true }) }, item.id));
|
|
204
|
+
}) }) }));
|
|
33
205
|
}
|
|
34
206
|
//# sourceMappingURL=DropdownMenu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.js","sourceRoot":"","sources":["../../../../../src/features/overlays/components/dropdowns/DropdownMenu.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DropdownMenu.js","sourceRoot":"","sources":["../../../../../src/features/overlays/components/dropdowns/DropdownMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,114 @@
|
|
|
1
1
|
.dropdown {
|
|
2
|
-
position:
|
|
3
|
-
width: 220px;
|
|
2
|
+
position: fixed;
|
|
4
3
|
background-color: var(--bg-primary);
|
|
5
4
|
border: 1px solid var(--border-divider);
|
|
6
5
|
border-radius: var(--radius-sm);
|
|
7
|
-
box-shadow: 0
|
|
6
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
|
|
8
7
|
z-index: 1500;
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
animation: dropdownFadeIn 0.2s ease-out;
|
|
9
|
+
overflow: hidden;
|
|
11
10
|
}
|
|
12
11
|
|
|
12
|
+
.noBorder {
|
|
13
|
+
border: none;
|
|
14
|
+
}
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
/* Tamanhos — width é controlado pela prop width, não pelo size.
|
|
17
|
+
Size afecta apenas padding, font e spacing dos items. */
|
|
15
18
|
.menuList {
|
|
16
19
|
display: flex;
|
|
17
20
|
flex-direction: column;
|
|
18
21
|
margin: 0;
|
|
19
22
|
padding: 0;
|
|
20
23
|
list-style: none;
|
|
21
|
-
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.sm .menuList {
|
|
27
|
+
padding: var(--spacing-sm);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.md .menuList {
|
|
22
31
|
padding: var(--spacing-sm-large);
|
|
23
|
-
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.lg .menuList {
|
|
35
|
+
padding: var(--spacing-md);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Dividers — vão de canto a canto, respeitando o radius via overflow:hidden. */
|
|
39
|
+
.sm .dividerTop,
|
|
40
|
+
.sm .dividerBottom {
|
|
41
|
+
margin-left: calc(-1 * var(--spacing-sm));
|
|
42
|
+
margin-right: calc(-1 * var(--spacing-sm));
|
|
43
|
+
padding-left: var(--spacing-sm);
|
|
44
|
+
padding-right: var(--spacing-sm);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.md .dividerTop,
|
|
48
|
+
.md .dividerBottom {
|
|
49
|
+
margin-left: calc(-1 * var(--spacing-sm-large));
|
|
50
|
+
margin-right: calc(-1 * var(--spacing-sm-large));
|
|
51
|
+
padding-left: var(--spacing-sm-large);
|
|
52
|
+
padding-right: var(--spacing-sm-large);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.lg .dividerTop,
|
|
56
|
+
.lg .dividerBottom {
|
|
57
|
+
margin-left: calc(-1 * var(--spacing-md));
|
|
58
|
+
margin-right: calc(-1 * var(--spacing-md));
|
|
59
|
+
padding-left: var(--spacing-md);
|
|
60
|
+
padding-right: var(--spacing-md);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.dividerTop {
|
|
64
|
+
border-top: 1px solid var(--border-divider);
|
|
65
|
+
padding-top: var(--spacing-sm);
|
|
66
|
+
margin-top: var(--spacing-sm);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.dividerBottom {
|
|
70
|
+
border-bottom: 1px solid var(--border-divider);
|
|
71
|
+
padding-bottom: var(--spacing-sm);
|
|
72
|
+
margin-bottom: var(--spacing-sm);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Item personalizado — o <li> não tem border-radius.
|
|
76
|
+
O border do divider pertence ao dropdown, não ao item.
|
|
77
|
+
O conteúdo interno tem o seu próprio radius para hover. */
|
|
78
|
+
.customItem {
|
|
79
|
+
cursor: pointer;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.customContent {
|
|
83
|
+
border-radius: var(--radius-sm);
|
|
84
|
+
transition: background-color 0.15s ease;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.customItem:hover .customContent {
|
|
88
|
+
background-color: var(--bg-secondary);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* Padding do customContent acompanha o size do SharedMenuItem */
|
|
92
|
+
.sm .customContent {
|
|
93
|
+
padding: var(--spacing-sm) var(--spacing-md);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.md .customContent {
|
|
97
|
+
padding: 0 12px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.lg .customContent {
|
|
101
|
+
padding: var(--spacing-md);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* Animação */
|
|
105
|
+
@keyframes dropdownFadeIn {
|
|
106
|
+
from {
|
|
107
|
+
opacity: 0;
|
|
108
|
+
transform: translateY(-4px);
|
|
109
|
+
}
|
|
110
|
+
to {
|
|
111
|
+
opacity: 1;
|
|
112
|
+
transform: translateY(0);
|
|
113
|
+
}
|
|
114
|
+
}
|