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.
@@ -129,7 +129,7 @@
129
129
  .lg .textInput {
130
130
  height: 45px;
131
131
  font-size: 1rem;
132
- padding: var(--spacing-md);
132
+ padding: 0 var(--spacing-md);
133
133
  }
134
134
 
135
135
  .lg .leadingGroup {
@@ -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 {
@@ -120,6 +120,11 @@
120
120
  min-height: 120px;
121
121
  }
122
122
 
123
+ /* lg + leftIcon: preservar padding-left do hasLeftIcon */
124
+ .lg.hasLeftIcon .textArea {
125
+ padding-left: 2.5rem;
126
+ }
127
+
123
128
  .lg .clearButton {
124
129
  width: 28px;
125
130
  height: 28px;
@@ -1,11 +1,15 @@
1
1
  export interface DropdownMenuItem {
2
2
  id: string;
3
- label: string;
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;IACd,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;CAClB;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;CACrC;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,MAAM,EACN,OAAO,EACP,UAAU,EACV,KAAK,EACL,QAAQ,GACT,EAAE,iBAAiB,kDAgDnB"}
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
- if (!isOpen) {
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
- return (_jsx("div", { className: styles.dropdown, ref: dropdownRef, children: _jsx("ul", { className: styles.menuList, children: items.map((item) => (_jsx(SharedMenuItem, { label: item.label, leftIcon: item.icon, description: item.description, suffix: item.suffix, active: item.active, destructive: item.destructive, onClick: () => handleItemClick(item.id) }, item.id))) }) }));
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;AAC1C,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,OAAO,cAAc,MAAM,sDAAsD,CAAC;AAoBlF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,MAAM,EACN,OAAO,EACP,UAAU,EACV,KAAK,EACL,QAAQ,GACU;IAClB,MAAM,WAAW,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEjD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAE,EAAE;;YACxC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAc,CAAC;YACpC,IAAI,MAAA,WAAW,CAAC,OAAO,0CAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,IAAI,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,0CAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACpD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAElC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,EAAE;QACzC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,MAAM,CAAC,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,WAAW,YAC/C,aAAI,SAAS,EAAE,MAAM,CAAC,QAAQ,YAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,cAAc,IAEb,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,QAAQ,EAAE,IAAI,CAAC,IAAI,EACnB,WAAW,EAAE,IAAI,CAAC,WAAW,EAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,WAAW,EAAE,IAAI,CAAC,WAAW,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,IAPlC,IAAI,CAAC,EAAE,CAQZ,CACH,CAAC,GACC,GACD,CACP,CAAC;AACJ,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: absolute;
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 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
6
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
8
7
  z-index: 1500;
9
- top: calc(100% + var(--spacing-sm));
10
- right: 0;
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
- gap: 6px;
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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kitunga-web",
3
- "version": "0.1.85",
3
+ "version": "0.1.87",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "repository": {