@hellboy/ds 0.1.2 → 0.2.7
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 +568 -71
- package/{src/style/components/badge → dist/components}/badge.css +9 -25
- package/dist/components/badge.d.mts +12 -0
- package/dist/components/badge.d.ts +12 -0
- package/dist/components/badge.js +42 -0
- package/dist/components/badge.mjs +15 -0
- package/dist/components/banner.css +280 -0
- package/dist/components/banner.d.mts +12 -0
- package/dist/components/banner.d.ts +12 -0
- package/dist/components/banner.js +184 -0
- package/dist/components/banner.mjs +147 -0
- package/dist/components/button-group.css +289 -0
- package/dist/components/button-group.d.mts +81 -0
- package/dist/components/button-group.d.ts +81 -0
- package/dist/components/button-group.js +180 -0
- package/dist/components/button-group.mjs +143 -0
- package/{src/style/components/button → dist/components}/button.css +59 -62
- package/dist/components/button.d.mts +57 -0
- package/dist/components/button.d.ts +57 -0
- package/dist/components/button.js +129 -0
- package/dist/components/button.mjs +92 -0
- package/{src/style/components/card → dist/components}/card.css +9 -30
- package/dist/components/card.d.mts +31 -0
- package/dist/components/card.d.ts +31 -0
- package/dist/components/card.js +59 -0
- package/dist/components/card.mjs +32 -0
- package/{src/style → dist}/components/checkbox.css +51 -43
- package/dist/components/checkbox.d.mts +31 -0
- package/dist/components/checkbox.d.ts +31 -0
- package/dist/components/checkbox.js +130 -0
- package/dist/components/checkbox.mjs +93 -0
- package/{src/style/components/code-block → dist/components}/code-block.css +3 -7
- package/dist/components/code-block.d.mts +24 -0
- package/dist/components/code-block.d.ts +24 -0
- package/dist/components/code-block.js +43 -0
- package/dist/components/code-block.mjs +16 -0
- package/dist/components/color-control.css +285 -0
- package/dist/components/color-control.d.mts +5 -0
- package/dist/components/color-control.d.ts +5 -0
- package/dist/components/color-control.js +534 -0
- package/dist/components/color-control.mjs +497 -0
- package/dist/components/dialog.css +930 -0
- package/dist/components/dialog.d.mts +32 -0
- package/dist/components/dialog.d.ts +32 -0
- package/dist/components/dialog.js +1111 -0
- package/dist/components/dialog.mjs +1074 -0
- package/dist/components/divider.css +356 -0
- package/dist/components/divider.d.mts +32 -0
- package/dist/components/divider.d.ts +32 -0
- package/dist/components/divider.js +344 -0
- package/dist/components/divider.mjs +307 -0
- package/{src/style/components/drag-handle → dist/components}/drag-handle.css +3 -18
- package/dist/components/drag-handle.d.mts +11 -0
- package/dist/components/drag-handle.d.ts +11 -0
- package/dist/components/drag-handle.js +103 -0
- package/dist/components/drag-handle.mjs +66 -0
- package/dist/components/drawer.css +1027 -0
- package/dist/components/drawer.d.mts +14 -0
- package/dist/components/drawer.d.ts +14 -0
- package/dist/components/drawer.js +1072 -0
- package/dist/components/drawer.mjs +1035 -0
- package/dist/components/floating-bar.css +17 -0
- package/dist/components/floating-bar.d.mts +25 -0
- package/dist/components/floating-bar.d.ts +25 -0
- package/dist/components/floating-bar.js +52 -0
- package/dist/components/floating-bar.mjs +25 -0
- package/dist/components/footer.css +40 -0
- package/dist/components/footer.d.mts +8 -0
- package/dist/components/footer.d.ts +8 -0
- package/dist/components/footer.js +44 -0
- package/dist/components/footer.mjs +17 -0
- package/dist/components/grid.css +47 -0
- package/dist/components/grid.d.mts +27 -0
- package/dist/components/grid.d.ts +27 -0
- package/dist/components/grid.js +52 -0
- package/dist/components/grid.mjs +25 -0
- package/dist/components/header.css +1075 -0
- package/dist/components/header.d.mts +35 -0
- package/dist/components/header.d.ts +35 -0
- package/dist/components/header.js +1402 -0
- package/dist/components/header.mjs +1365 -0
- package/dist/components/hero.css +121 -0
- package/dist/components/hero.d.mts +111 -0
- package/dist/components/hero.d.ts +111 -0
- package/dist/components/hero.js +285 -0
- package/dist/components/hero.mjs +248 -0
- package/{src/style/components/icons → dist/components}/icons.css +14 -15
- package/dist/components/icons.d.mts +104 -0
- package/dist/components/icons.d.ts +104 -0
- package/dist/components/icons.js +239 -0
- package/dist/components/icons.mjs +203 -0
- package/{src/style/components/input → dist/components}/input.css +189 -102
- package/dist/components/input.d.mts +114 -0
- package/dist/components/input.d.ts +114 -0
- package/dist/components/input.js +926 -0
- package/dist/components/input.mjs +879 -0
- package/dist/components/layout.css +551 -0
- package/dist/components/layout.d.mts +16 -0
- package/dist/components/layout.d.ts +16 -0
- package/dist/components/layout.js +387 -0
- package/dist/components/layout.mjs +352 -0
- package/{src/style/components/list → dist/components}/list.css +47 -41
- package/dist/components/list.d.mts +46 -0
- package/dist/components/list.d.ts +46 -0
- package/dist/components/list.js +124 -0
- package/dist/components/list.mjs +96 -0
- package/dist/components/navbar.css +706 -0
- package/dist/components/navbar.d.mts +56 -0
- package/dist/components/navbar.d.ts +56 -0
- package/dist/components/navbar.js +994 -0
- package/dist/components/navbar.mjs +952 -0
- package/{src/style/components/page-index → dist/components}/page-index.css +2 -47
- package/dist/components/page-index.d.mts +25 -0
- package/dist/components/page-index.d.ts +25 -0
- package/dist/components/page-index.js +239 -0
- package/dist/components/page-index.mjs +202 -0
- package/{src/style/components/page → dist/components}/page.css +4 -15
- package/dist/components/page.d.mts +30 -0
- package/dist/components/page.d.ts +30 -0
- package/dist/components/page.js +40 -0
- package/dist/components/page.mjs +13 -0
- package/dist/components/popover.css +87 -0
- package/dist/components/popover.d.mts +22 -0
- package/dist/components/popover.d.ts +22 -0
- package/dist/components/popover.js +243 -0
- package/dist/components/popover.mjs +206 -0
- package/{src/style → dist}/components/radio.css +8 -51
- package/dist/components/radio.d.mts +59 -0
- package/dist/components/radio.d.ts +59 -0
- package/dist/components/radio.js +133 -0
- package/dist/components/radio.mjs +95 -0
- package/dist/components/section.css +993 -0
- package/dist/components/section.d.mts +33 -0
- package/dist/components/section.d.ts +33 -0
- package/dist/components/section.js +1401 -0
- package/dist/components/section.mjs +1364 -0
- package/dist/components/select.css +391 -0
- package/dist/components/select.d.mts +63 -0
- package/dist/components/select.d.ts +63 -0
- package/dist/components/select.js +452 -0
- package/dist/components/select.mjs +415 -0
- package/{src/style/components/slider → dist/components}/slider.css +55 -33
- package/dist/components/slider.d.mts +69 -0
- package/dist/components/slider.d.ts +69 -0
- package/dist/components/slider.js +254 -0
- package/dist/components/slider.mjs +217 -0
- package/dist/components/switch.css +1081 -0
- package/dist/components/switch.d.mts +33 -0
- package/dist/components/switch.d.ts +33 -0
- package/dist/components/switch.js +1092 -0
- package/dist/components/switch.mjs +1055 -0
- package/{src/style/components/table → dist/components}/table.css +3 -28
- package/dist/components/table.d.mts +42 -0
- package/dist/components/table.d.ts +42 -0
- package/dist/components/table.js +108 -0
- package/dist/components/table.mjs +76 -0
- package/dist/components/tag.css +97 -0
- package/dist/components/tag.d.mts +12 -0
- package/dist/components/tag.d.ts +12 -0
- package/dist/components/tag.js +42 -0
- package/dist/components/tag.mjs +15 -0
- package/dist/components/textarea.css +1359 -0
- package/dist/components/textarea.d.mts +84 -0
- package/dist/components/textarea.d.ts +84 -0
- package/dist/components/textarea.js +1962 -0
- package/dist/components/textarea.mjs +1924 -0
- package/{src/style/components/theme-control → dist/components}/theme-control.css +3 -7
- package/dist/components/theme-control.d.mts +9 -0
- package/dist/components/theme-control.d.ts +9 -0
- package/dist/components/theme-control.js +235 -0
- package/dist/components/theme-control.mjs +200 -0
- package/{src/style/components/tooltip → dist/components}/tooltip.css +5 -13
- package/dist/components/tooltip.d.mts +12 -0
- package/dist/components/tooltip.d.ts +12 -0
- package/dist/components/tooltip.js +200 -0
- package/dist/components/tooltip.mjs +163 -0
- package/dist/icons-Czahnf-r.d.mts +15 -0
- package/dist/icons-Czahnf-r.d.ts +15 -0
- package/dist/index.css +2915 -2068
- package/dist/index.d.mts +144 -721
- package/dist/index.d.ts +144 -721
- package/dist/index.js +4076 -2282
- package/dist/index.mjs +4132 -2366
- package/dist/theme.css +34 -34
- package/package.json +27 -8
- package/dist/index.css.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/hellboy-ds-0.1.2.tgz +0 -0
- package/src/components/badge/Badge.tsx +0 -29
- package/src/components/badge/index.ts +0 -1
- package/src/components/banner/Banner.tsx +0 -48
- package/src/components/banner/banner.css +0 -44
- package/src/components/banner/index.ts +0 -1
- package/src/components/button/button.tsx +0 -127
- package/src/components/button/index.ts +0 -1
- package/src/components/card/card.tsx +0 -57
- package/src/components/card/index.ts +0 -1
- package/src/components/checkbox/Checkbox.tsx +0 -98
- package/src/components/checkbox/index.ts +0 -1
- package/src/components/code-block/code-block.tsx +0 -44
- package/src/components/code-block/index.ts +0 -1
- package/src/components/color-control/color-control.tsx +0 -322
- package/src/components/color-control/index.ts +0 -1
- package/src/components/drag-handle/DragHandle.tsx +0 -78
- package/src/components/drag-handle/index.ts +0 -1
- package/src/components/drawer/drawer.tsx +0 -82
- package/src/components/drawer/index.ts +0 -1
- package/src/components/floating-bar/floating-bar.tsx +0 -52
- package/src/components/floating-bar/index.ts +0 -2
- package/src/components/footer/footer.tsx +0 -28
- package/src/components/footer/index.ts +0 -1
- package/src/components/grid/Grid.tsx +0 -53
- package/src/components/grid/index.ts +0 -1
- package/src/components/header/header.tsx +0 -57
- package/src/components/header/index.ts +0 -1
- package/src/components/icons/icons.tsx +0 -44
- package/src/components/icons/index.ts +0 -1
- package/src/components/index.ts +0 -29
- package/src/components/input/DatePicker.tsx +0 -133
- package/src/components/input/Input.tsx +0 -220
- package/src/components/input/InputDate.tsx +0 -10
- package/src/components/input/InputDateTime.tsx +0 -10
- package/src/components/input/InputEmail.tsx +0 -10
- package/src/components/input/InputField.tsx +0 -137
- package/src/components/input/InputNumber.tsx +0 -10
- package/src/components/input/InputPassword.tsx +0 -10
- package/src/components/input/InputSearch.tsx +0 -10
- package/src/components/input/InputTel.tsx +0 -10
- package/src/components/input/InputText.tsx +0 -10
- package/src/components/input/InputTime.tsx +0 -10
- package/src/components/input/InputUrl.tsx +0 -10
- package/src/components/input/TimePicker.tsx +0 -151
- package/src/components/input/index.ts +0 -11
- package/src/components/layout/Layout.tsx +0 -244
- package/src/components/layout/index.ts +0 -1
- package/src/components/list/List.tsx +0 -159
- package/src/components/list/index.ts +0 -1
- package/src/components/navbar/MenuCategory.tsx +0 -20
- package/src/components/navbar/MenuGroup.tsx +0 -288
- package/src/components/navbar/MenuItem.tsx +0 -65
- package/src/components/navbar/Navbar.tsx +0 -23
- package/src/components/navbar/index.ts +0 -4
- package/src/components/page/index.ts +0 -1
- package/src/components/page/page.tsx +0 -46
- package/src/components/page-index/PageIndex.tsx +0 -275
- package/src/components/page-index/index.ts +0 -1
- package/src/components/popover/index.ts +0 -1
- package/src/components/popover/popover.tsx +0 -199
- package/src/components/radio/Radio.tsx +0 -176
- package/src/components/radio/index.ts +0 -1
- package/src/components/section/index.ts +0 -1
- package/src/components/section/section.tsx +0 -66
- package/src/components/select/Select.tsx +0 -212
- package/src/components/select/index.ts +0 -1
- package/src/components/slider/Slider.tsx +0 -267
- package/src/components/slider/index.ts +0 -1
- package/src/components/switch/index.ts +0 -1
- package/src/components/switch/switch.tsx +0 -99
- package/src/components/table/Table.tsx +0 -147
- package/src/components/table/index.ts +0 -1
- package/src/components/theme-control/index.ts +0 -1
- package/src/components/theme-control/theme-control.tsx +0 -78
- package/src/components/tooltip/index.ts +0 -1
- package/src/components/tooltip/tooltip.tsx +0 -207
- package/src/contexts/NavbarTooltipContext.tsx +0 -48
- package/src/contexts/index.ts +0 -1
- package/src/foundations/motion.md +0 -136
- package/src/index.ts +0 -40
- package/src/style/_shared/field.css +0 -69
- package/src/style/components/color-control/color-control.css +0 -126
- package/src/style/components/drawer/drawer.css +0 -210
- package/src/style/components/floating-bar/floating-bar.css +0 -39
- package/src/style/components/footer/footer.css +0 -108
- package/src/style/components/grid/grid.css +0 -33
- package/src/style/components/header/header.css +0 -44
- package/src/style/components/layout/layout.css +0 -205
- package/src/style/components/navbar/navbar.css +0 -342
- package/src/style/components/popover/popover.css +0 -44
- package/src/style/components/section/section.css +0 -67
- package/src/style/components/select/select.css +0 -143
- package/src/style/components/switch/switch.css +0 -267
- package/src/style/foundations/global.css +0 -316
- package/src/style/foundations/motion.css +0 -164
- package/src/style/foundations/spacing.css +0 -51
- package/src/style/foundations/typography.css +0 -39
- package/src/style/foundations/z-index.css +0 -81
- package/src/style/modes/dark.css +0 -146
- package/src/style/modes/light.css +0 -147
- package/src/style/semantic.css +0 -52
- package/src/style/styles.css +0 -51
- package/src/style/themes/theme.json +0 -37
- package/src/utils/README.md +0 -305
- package/src/utils/USER_PREFERENCES.md +0 -558
- package/src/utils/theme.ts +0 -127
- package/src/utils/user-preferences.ts +0 -577
- package/tsconfig.json +0 -25
- package/tsup.config.ts +0 -52
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import { Icon } from "../icons";
|
|
3
|
-
import { Popover } from "../popover";
|
|
4
|
-
import { Tooltip } from "../tooltip";
|
|
5
|
-
import { Button } from "../button";
|
|
6
|
-
import { useNavbarTooltip } from "../../contexts/NavbarTooltipContext";
|
|
7
|
-
|
|
8
|
-
export interface MenuGroupProps {
|
|
9
|
-
title: string;
|
|
10
|
-
icon?: string;
|
|
11
|
-
children: React.ReactNode;
|
|
12
|
-
defaultExpanded?: boolean;
|
|
13
|
-
autoExpand?: boolean;
|
|
14
|
-
expandable?: boolean;
|
|
15
|
-
isCollapsed?: boolean; // Nova prop para saber se o navbar está colapsado
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export const MenuGroup: React.FC<MenuGroupProps> = ({
|
|
19
|
-
title,
|
|
20
|
-
icon,
|
|
21
|
-
children,
|
|
22
|
-
defaultExpanded = false,
|
|
23
|
-
autoExpand = false,
|
|
24
|
-
expandable = true,
|
|
25
|
-
isCollapsed = false
|
|
26
|
-
}) => {
|
|
27
|
-
const [expanded, setExpanded] = React.useState(defaultExpanded);
|
|
28
|
-
const [userInteracted, setUserInteracted] = React.useState(false);
|
|
29
|
-
const { openPopover, closePopover, activePopoverId } = useNavbarTooltip();
|
|
30
|
-
|
|
31
|
-
// Gerar um ID único para este grupo
|
|
32
|
-
const groupId = React.useMemo(() => `menu-group-${title.replace(/\s+/g, '-').toLowerCase()}`, [title]);
|
|
33
|
-
|
|
34
|
-
// Estado local do popover baseado no contexto global
|
|
35
|
-
const popoverOpen = activePopoverId === groupId;
|
|
36
|
-
|
|
37
|
-
// Refs para gerenciar foco
|
|
38
|
-
const triggerRef = React.useRef<HTMLButtonElement>(null);
|
|
39
|
-
const popoverContentRef = React.useRef<HTMLDivElement>(null);
|
|
40
|
-
|
|
41
|
-
// Efeito para focar o primeiro filho quando o popover abre
|
|
42
|
-
React.useEffect(() => {
|
|
43
|
-
if (popoverOpen && popoverContentRef.current) {
|
|
44
|
-
// Pequeno delay para garantir que o popover foi renderizado
|
|
45
|
-
setTimeout(() => {
|
|
46
|
-
const firstFocusable = popoverContentRef.current?.querySelector(
|
|
47
|
-
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
|
48
|
-
) as HTMLElement;
|
|
49
|
-
firstFocusable?.focus();
|
|
50
|
-
}, 10);
|
|
51
|
-
}
|
|
52
|
-
}, [popoverOpen]);
|
|
53
|
-
|
|
54
|
-
// Função para encontrar o próximo elemento focável na raiz do navbar
|
|
55
|
-
const findNextFocusableElement = React.useCallback((currentElement: HTMLElement): HTMLElement | null => {
|
|
56
|
-
const navbar = currentElement.closest('.navbar');
|
|
57
|
-
if (!navbar) return null;
|
|
58
|
-
|
|
59
|
-
// Exclui elementos que estão dentro de popovers/popups
|
|
60
|
-
const focusableElements = navbar.querySelectorAll(
|
|
61
|
-
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
// Filtra elementos que não estão dentro de popover
|
|
65
|
-
const rootFocusableElements = Array.from(focusableElements).filter(el => {
|
|
66
|
-
return !el.closest('.popover');
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
const currentIndex = rootFocusableElements.indexOf(currentElement);
|
|
70
|
-
|
|
71
|
-
if (currentIndex >= 0 && currentIndex < rootFocusableElements.length - 1) {
|
|
72
|
-
return rootFocusableElements[currentIndex + 1] as HTMLElement;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return null;
|
|
76
|
-
}, []);
|
|
77
|
-
|
|
78
|
-
// Handler para navegação por tab
|
|
79
|
-
const handleKeyDown = React.useCallback((event: React.KeyboardEvent) => {
|
|
80
|
-
if (event.key === 'Tab' && !event.shiftKey) {
|
|
81
|
-
// Tab para frente
|
|
82
|
-
if (popoverContentRef.current) {
|
|
83
|
-
const focusableElements = popoverContentRef.current.querySelectorAll(
|
|
84
|
-
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
|
85
|
-
);
|
|
86
|
-
const currentElement = event.target as HTMLElement;
|
|
87
|
-
const currentIndex = Array.from(focusableElements).indexOf(currentElement);
|
|
88
|
-
|
|
89
|
-
if (currentIndex >= 0 && currentIndex === focusableElements.length - 1) {
|
|
90
|
-
// Estamos no último elemento focável do popover
|
|
91
|
-
event.preventDefault();
|
|
92
|
-
const nextElement = findNextFocusableElement(currentElement);
|
|
93
|
-
if (nextElement) {
|
|
94
|
-
nextElement.focus();
|
|
95
|
-
} else {
|
|
96
|
-
// Se não há próximo elemento, fecha o popover e volta para o trigger
|
|
97
|
-
closePopover(groupId);
|
|
98
|
-
triggerRef.current?.focus();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
} else if (event.key === 'Tab' && event.shiftKey) {
|
|
103
|
-
// Shift+Tab para trás
|
|
104
|
-
if (popoverContentRef.current) {
|
|
105
|
-
const focusableElements = popoverContentRef.current.querySelectorAll(
|
|
106
|
-
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
|
107
|
-
);
|
|
108
|
-
const currentElement = event.target as HTMLElement;
|
|
109
|
-
const currentIndex = Array.from(focusableElements).indexOf(currentElement);
|
|
110
|
-
|
|
111
|
-
if (currentIndex === 0) {
|
|
112
|
-
// Estamos no primeiro elemento focável do popover, volta para o trigger
|
|
113
|
-
event.preventDefault();
|
|
114
|
-
triggerRef.current?.focus();
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
} else if (event.key === 'Escape') {
|
|
118
|
-
// Escape fecha o popover e retorna foco para o trigger
|
|
119
|
-
closePopover(groupId);
|
|
120
|
-
// Pequeno delay para garantir que o popover fechou antes de focar
|
|
121
|
-
setTimeout(() => {
|
|
122
|
-
triggerRef.current?.focus();
|
|
123
|
-
}, 10);
|
|
124
|
-
}
|
|
125
|
-
}, [closePopover, groupId, findNextFocusableElement]);
|
|
126
|
-
|
|
127
|
-
// Função para detectar se há itens ativos dentro do grupo
|
|
128
|
-
const hasActiveItem = React.useMemo(() => {
|
|
129
|
-
const checkForActiveItems = (children: React.ReactNode): boolean => {
|
|
130
|
-
return React.Children.toArray(children).some((child) => {
|
|
131
|
-
if (React.isValidElement(child)) {
|
|
132
|
-
if (child.props && child.props.active === true) {
|
|
133
|
-
return true;
|
|
134
|
-
}
|
|
135
|
-
if (child.props && child.props.children) {
|
|
136
|
-
return checkForActiveItems(child.props.children);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return false;
|
|
140
|
-
});
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
return checkForActiveItems(children);
|
|
144
|
-
}, [children]);
|
|
145
|
-
|
|
146
|
-
// Efeito para expansão automática quando há itens ativos
|
|
147
|
-
React.useEffect(() => {
|
|
148
|
-
if (autoExpand && hasActiveItem && !userInteracted) {
|
|
149
|
-
setExpanded(true);
|
|
150
|
-
}
|
|
151
|
-
}, [autoExpand, hasActiveItem, userInteracted]);
|
|
152
|
-
|
|
153
|
-
const toggleExpanded = () => {
|
|
154
|
-
setUserInteracted(true);
|
|
155
|
-
setExpanded(!expanded);
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
// Conteúdo do popover quando colapsado
|
|
159
|
-
const popoverContent = (
|
|
160
|
-
<div className="navbar__menu-group-popover">
|
|
161
|
-
<div className="navbar__menu-group-popover-title">{title}</div>
|
|
162
|
-
<div
|
|
163
|
-
className="navbar__menu-group-popover-content"
|
|
164
|
-
ref={popoverContentRef}
|
|
165
|
-
onKeyDown={handleKeyDown}
|
|
166
|
-
onClick={() => {
|
|
167
|
-
// Fecha o popover quando qualquer item filho é clicado
|
|
168
|
-
// Pequeno delay para garantir que a ação do item seja executada primeiro
|
|
169
|
-
setTimeout(() => {
|
|
170
|
-
closePopover(groupId);
|
|
171
|
-
}, 0);
|
|
172
|
-
}}
|
|
173
|
-
>
|
|
174
|
-
{React.Children.map(children, (child) => {
|
|
175
|
-
if (React.isValidElement(child)) {
|
|
176
|
-
return React.cloneElement(child, {
|
|
177
|
-
onKeyDown: (e: React.KeyboardEvent) => {
|
|
178
|
-
// Chama o onKeyDown original se existir
|
|
179
|
-
child.props.onKeyDown?.(e);
|
|
180
|
-
// E depois o nosso handler
|
|
181
|
-
handleKeyDown(e);
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
return child;
|
|
186
|
-
})}
|
|
187
|
-
</div>
|
|
188
|
-
</div>
|
|
189
|
-
);
|
|
190
|
-
|
|
191
|
-
// Comportamento quando expandido: clique expande/collapsa
|
|
192
|
-
const expandedHeader = !expandable ? (
|
|
193
|
-
<div className="navbar__menu-group-header navbar__menu-group-header--static">
|
|
194
|
-
{icon && (
|
|
195
|
-
<span className="navbar__menu-group-icon">
|
|
196
|
-
<Icon name={icon as any} size={16} />
|
|
197
|
-
</span>
|
|
198
|
-
)}
|
|
199
|
-
<span className="navbar__menu-group-title">{title}</span>
|
|
200
|
-
</div>
|
|
201
|
-
) : (
|
|
202
|
-
<button
|
|
203
|
-
className={`navbar__menu-group-header ${!expanded && hasActiveItem ? 'navbar__menu-group-header--active' : ''}`}
|
|
204
|
-
onClick={toggleExpanded}
|
|
205
|
-
aria-expanded={expanded}
|
|
206
|
-
aria-controls={`menu-group-${title.replace(/\s+/g, '-').toLowerCase()}`}
|
|
207
|
-
type="button"
|
|
208
|
-
>
|
|
209
|
-
{icon && (
|
|
210
|
-
<span className="navbar__menu-group-icon">
|
|
211
|
-
<Icon name={icon as any} size={16} />
|
|
212
|
-
</span>
|
|
213
|
-
)}
|
|
214
|
-
<span className="navbar__menu-group-title">{title}</span>
|
|
215
|
-
<span className={`navbar__menu-group-chevron ${expanded ? 'navbar__menu-group-chevron--expanded' : ''}`}>
|
|
216
|
-
<Icon name="chevron-down" size={12} />
|
|
217
|
-
</span>
|
|
218
|
-
</button>
|
|
219
|
-
);
|
|
220
|
-
|
|
221
|
-
// Comportamento quando colapsado: clique abre popover
|
|
222
|
-
const collapsedHeader = (
|
|
223
|
-
<div>
|
|
224
|
-
<Popover
|
|
225
|
-
trigger={
|
|
226
|
-
<Tooltip content={title} placement="right" disabled={popoverOpen}>
|
|
227
|
-
<Button
|
|
228
|
-
ref={triggerRef}
|
|
229
|
-
variant={popoverOpen ? "secondary" : hasActiveItem ? "primary" : "ghost"}
|
|
230
|
-
iconOnly={true}
|
|
231
|
-
startIcon={icon as any}
|
|
232
|
-
aria-label={title}
|
|
233
|
-
aria-haspopup="menu"
|
|
234
|
-
aria-expanded={popoverOpen}
|
|
235
|
-
onKeyDown={(event: React.KeyboardEvent) => {
|
|
236
|
-
if (event.key === 'Tab' && !event.shiftKey && popoverOpen) {
|
|
237
|
-
// Se o popover está aberto e estamos no trigger, Tab vai para o primeiro filho
|
|
238
|
-
event.preventDefault();
|
|
239
|
-
const firstFocusable = popoverContentRef.current?.querySelector(
|
|
240
|
-
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
|
241
|
-
) as HTMLElement;
|
|
242
|
-
firstFocusable?.focus();
|
|
243
|
-
}
|
|
244
|
-
}}
|
|
245
|
-
onClick={() => {
|
|
246
|
-
if (popoverOpen) {
|
|
247
|
-
closePopover(groupId);
|
|
248
|
-
} else {
|
|
249
|
-
openPopover(groupId);
|
|
250
|
-
}
|
|
251
|
-
}}
|
|
252
|
-
/>
|
|
253
|
-
</Tooltip>
|
|
254
|
-
}
|
|
255
|
-
isOpen={popoverOpen}
|
|
256
|
-
onToggle={() => {
|
|
257
|
-
if (popoverOpen) {
|
|
258
|
-
closePopover(groupId);
|
|
259
|
-
} else {
|
|
260
|
-
openPopover(groupId);
|
|
261
|
-
}
|
|
262
|
-
}}
|
|
263
|
-
placement="right"
|
|
264
|
-
>
|
|
265
|
-
{popoverContent}
|
|
266
|
-
</Popover>
|
|
267
|
-
</div>
|
|
268
|
-
);
|
|
269
|
-
|
|
270
|
-
return (
|
|
271
|
-
<div className="navbar__menu-group">
|
|
272
|
-
{/* Header - comportamento depende se está colapsado ou não */}
|
|
273
|
-
{isCollapsed ? collapsedHeader : expandedHeader}
|
|
274
|
-
|
|
275
|
-
{/* Conteúdo (só visível quando expandido e navbar expandido) */}
|
|
276
|
-
{!isCollapsed && (
|
|
277
|
-
<div
|
|
278
|
-
className="navbar__menu-group-content"
|
|
279
|
-
id={`menu-group-${title.replace(/\s+/g, '-').toLowerCase()}`}
|
|
280
|
-
aria-hidden={!expandable || !expanded}
|
|
281
|
-
style={{ display: expandable ? (expanded ? 'block' : 'none') : 'block' }}
|
|
282
|
-
>
|
|
283
|
-
{children}
|
|
284
|
-
</div>
|
|
285
|
-
)}
|
|
286
|
-
</div>
|
|
287
|
-
);
|
|
288
|
-
};
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import { Icon } from "../icons";
|
|
3
|
-
import { Tooltip } from "../tooltip";
|
|
4
|
-
import { Button } from "../button";
|
|
5
|
-
import { useNavbarTooltip } from "../../contexts/NavbarTooltipContext";
|
|
6
|
-
|
|
7
|
-
export interface MenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
8
|
-
icon?: string;
|
|
9
|
-
active?: boolean;
|
|
10
|
-
children: React.ReactNode;
|
|
11
|
-
as?: React.ElementType<any>;
|
|
12
|
-
isCollapsed?: boolean;
|
|
13
|
-
showTooltipWhenCollapsed?: boolean;
|
|
14
|
-
[key: string]: any;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export const MenuItem: React.FC<MenuItemProps> = ({
|
|
18
|
-
icon,
|
|
19
|
-
active = false,
|
|
20
|
-
children,
|
|
21
|
-
className = "",
|
|
22
|
-
as: Component = "button",
|
|
23
|
-
isCollapsed = false,
|
|
24
|
-
showTooltipWhenCollapsed = false,
|
|
25
|
-
...props
|
|
26
|
-
}) => {
|
|
27
|
-
const { hasOpenPopover } = useNavbarTooltip();
|
|
28
|
-
const classes = [
|
|
29
|
-
"navbar__menu-item",
|
|
30
|
-
active && "navbar__menu-item--active",
|
|
31
|
-
className
|
|
32
|
-
].filter(Boolean).join(" ");
|
|
33
|
-
|
|
34
|
-
const menuItem = isCollapsed ? (
|
|
35
|
-
<Button
|
|
36
|
-
variant={active ? "primary" : "ghost"}
|
|
37
|
-
iconOnly={true}
|
|
38
|
-
startIcon={icon as any}
|
|
39
|
-
{...props}
|
|
40
|
-
/>
|
|
41
|
-
) : (
|
|
42
|
-
<Component
|
|
43
|
-
className={classes}
|
|
44
|
-
type={Component === "button" ? "button" : undefined}
|
|
45
|
-
{...props}
|
|
46
|
-
>
|
|
47
|
-
{icon && (
|
|
48
|
-
<span className="navbar__menu-item-icon">
|
|
49
|
-
<Icon name={icon as any} size={16} />
|
|
50
|
-
</span>
|
|
51
|
-
)}
|
|
52
|
-
{!isCollapsed && <span className="navbar__menu-item-label">{children}</span>}
|
|
53
|
-
</Component>
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
if (showTooltipWhenCollapsed && isCollapsed) {
|
|
57
|
-
return (
|
|
58
|
-
<Tooltip content={typeof children === 'string' ? children : ''} placement="right" disabled={hasOpenPopover}>
|
|
59
|
-
{menuItem}
|
|
60
|
-
</Tooltip>
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return menuItem;
|
|
65
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
|
|
3
|
-
export interface NavbarProps {
|
|
4
|
-
children: React.ReactNode;
|
|
5
|
-
className?: string;
|
|
6
|
-
/** Default width (px) the navbar should assume when expanded and no user preference exists */
|
|
7
|
-
defaultExpandedWidth?: number;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export const Navbar: React.FC<NavbarProps> = ({
|
|
11
|
-
children,
|
|
12
|
-
className = ""
|
|
13
|
-
}) => {
|
|
14
|
-
const classes = ["navbar", className].filter(Boolean).join(" ");
|
|
15
|
-
|
|
16
|
-
return (
|
|
17
|
-
<nav className={classes} role="navigation" aria-label="Main navigation">
|
|
18
|
-
<div className="navbar__content">
|
|
19
|
-
{children}
|
|
20
|
-
</div>
|
|
21
|
-
</nav>
|
|
22
|
-
);
|
|
23
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { Page, type PageProps, type PageWidth } from './page';
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import React, { ReactNode } from 'react';
|
|
2
|
-
|
|
3
|
-
export type PageWidth = 'full' | 'wide' | 'medium' | 'narrow';
|
|
4
|
-
|
|
5
|
-
export interface PageProps {
|
|
6
|
-
/**
|
|
7
|
-
* Page content width
|
|
8
|
-
* - full: 100% width
|
|
9
|
-
* - wide: 1400px max
|
|
10
|
-
* - medium: 1200px max (default)
|
|
11
|
-
* - narrow: 800px max
|
|
12
|
-
* @default 'medium'
|
|
13
|
-
*/
|
|
14
|
-
width?: PageWidth;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Page content
|
|
18
|
-
*/
|
|
19
|
-
children: ReactNode;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Custom class name
|
|
23
|
-
*/
|
|
24
|
-
className?: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Page Component
|
|
29
|
-
* Main content container with responsive width control
|
|
30
|
-
* Use inside Layout's children for consistent content sizing
|
|
31
|
-
*/
|
|
32
|
-
export const Page: React.FC<PageProps> = ({ width = 'medium', children, className }) => {
|
|
33
|
-
const pageClasses = [
|
|
34
|
-
'page',
|
|
35
|
-
`page--${width}`,
|
|
36
|
-
className,
|
|
37
|
-
]
|
|
38
|
-
.filter(Boolean)
|
|
39
|
-
.join(' ');
|
|
40
|
-
|
|
41
|
-
return (
|
|
42
|
-
<main className={pageClasses}>
|
|
43
|
-
{children}
|
|
44
|
-
</main>
|
|
45
|
-
);
|
|
46
|
-
};
|