@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.
Files changed (298) hide show
  1. package/README.md +568 -71
  2. package/{src/style/components/badge → dist/components}/badge.css +9 -25
  3. package/dist/components/badge.d.mts +12 -0
  4. package/dist/components/badge.d.ts +12 -0
  5. package/dist/components/badge.js +42 -0
  6. package/dist/components/badge.mjs +15 -0
  7. package/dist/components/banner.css +280 -0
  8. package/dist/components/banner.d.mts +12 -0
  9. package/dist/components/banner.d.ts +12 -0
  10. package/dist/components/banner.js +184 -0
  11. package/dist/components/banner.mjs +147 -0
  12. package/dist/components/button-group.css +289 -0
  13. package/dist/components/button-group.d.mts +81 -0
  14. package/dist/components/button-group.d.ts +81 -0
  15. package/dist/components/button-group.js +180 -0
  16. package/dist/components/button-group.mjs +143 -0
  17. package/{src/style/components/button → dist/components}/button.css +59 -62
  18. package/dist/components/button.d.mts +57 -0
  19. package/dist/components/button.d.ts +57 -0
  20. package/dist/components/button.js +129 -0
  21. package/dist/components/button.mjs +92 -0
  22. package/{src/style/components/card → dist/components}/card.css +9 -30
  23. package/dist/components/card.d.mts +31 -0
  24. package/dist/components/card.d.ts +31 -0
  25. package/dist/components/card.js +59 -0
  26. package/dist/components/card.mjs +32 -0
  27. package/{src/style → dist}/components/checkbox.css +51 -43
  28. package/dist/components/checkbox.d.mts +31 -0
  29. package/dist/components/checkbox.d.ts +31 -0
  30. package/dist/components/checkbox.js +130 -0
  31. package/dist/components/checkbox.mjs +93 -0
  32. package/{src/style/components/code-block → dist/components}/code-block.css +3 -7
  33. package/dist/components/code-block.d.mts +24 -0
  34. package/dist/components/code-block.d.ts +24 -0
  35. package/dist/components/code-block.js +43 -0
  36. package/dist/components/code-block.mjs +16 -0
  37. package/dist/components/color-control.css +285 -0
  38. package/dist/components/color-control.d.mts +5 -0
  39. package/dist/components/color-control.d.ts +5 -0
  40. package/dist/components/color-control.js +534 -0
  41. package/dist/components/color-control.mjs +497 -0
  42. package/dist/components/dialog.css +930 -0
  43. package/dist/components/dialog.d.mts +32 -0
  44. package/dist/components/dialog.d.ts +32 -0
  45. package/dist/components/dialog.js +1111 -0
  46. package/dist/components/dialog.mjs +1074 -0
  47. package/dist/components/divider.css +356 -0
  48. package/dist/components/divider.d.mts +32 -0
  49. package/dist/components/divider.d.ts +32 -0
  50. package/dist/components/divider.js +344 -0
  51. package/dist/components/divider.mjs +307 -0
  52. package/{src/style/components/drag-handle → dist/components}/drag-handle.css +3 -18
  53. package/dist/components/drag-handle.d.mts +11 -0
  54. package/dist/components/drag-handle.d.ts +11 -0
  55. package/dist/components/drag-handle.js +103 -0
  56. package/dist/components/drag-handle.mjs +66 -0
  57. package/dist/components/drawer.css +1027 -0
  58. package/dist/components/drawer.d.mts +14 -0
  59. package/dist/components/drawer.d.ts +14 -0
  60. package/dist/components/drawer.js +1072 -0
  61. package/dist/components/drawer.mjs +1035 -0
  62. package/dist/components/floating-bar.css +17 -0
  63. package/dist/components/floating-bar.d.mts +25 -0
  64. package/dist/components/floating-bar.d.ts +25 -0
  65. package/dist/components/floating-bar.js +52 -0
  66. package/dist/components/floating-bar.mjs +25 -0
  67. package/dist/components/footer.css +40 -0
  68. package/dist/components/footer.d.mts +8 -0
  69. package/dist/components/footer.d.ts +8 -0
  70. package/dist/components/footer.js +44 -0
  71. package/dist/components/footer.mjs +17 -0
  72. package/dist/components/grid.css +47 -0
  73. package/dist/components/grid.d.mts +27 -0
  74. package/dist/components/grid.d.ts +27 -0
  75. package/dist/components/grid.js +52 -0
  76. package/dist/components/grid.mjs +25 -0
  77. package/dist/components/header.css +1075 -0
  78. package/dist/components/header.d.mts +35 -0
  79. package/dist/components/header.d.ts +35 -0
  80. package/dist/components/header.js +1402 -0
  81. package/dist/components/header.mjs +1365 -0
  82. package/dist/components/hero.css +121 -0
  83. package/dist/components/hero.d.mts +111 -0
  84. package/dist/components/hero.d.ts +111 -0
  85. package/dist/components/hero.js +285 -0
  86. package/dist/components/hero.mjs +248 -0
  87. package/{src/style/components/icons → dist/components}/icons.css +14 -15
  88. package/dist/components/icons.d.mts +104 -0
  89. package/dist/components/icons.d.ts +104 -0
  90. package/dist/components/icons.js +239 -0
  91. package/dist/components/icons.mjs +203 -0
  92. package/{src/style/components/input → dist/components}/input.css +189 -102
  93. package/dist/components/input.d.mts +114 -0
  94. package/dist/components/input.d.ts +114 -0
  95. package/dist/components/input.js +926 -0
  96. package/dist/components/input.mjs +879 -0
  97. package/dist/components/layout.css +551 -0
  98. package/dist/components/layout.d.mts +16 -0
  99. package/dist/components/layout.d.ts +16 -0
  100. package/dist/components/layout.js +387 -0
  101. package/dist/components/layout.mjs +352 -0
  102. package/{src/style/components/list → dist/components}/list.css +47 -41
  103. package/dist/components/list.d.mts +46 -0
  104. package/dist/components/list.d.ts +46 -0
  105. package/dist/components/list.js +124 -0
  106. package/dist/components/list.mjs +96 -0
  107. package/dist/components/navbar.css +706 -0
  108. package/dist/components/navbar.d.mts +56 -0
  109. package/dist/components/navbar.d.ts +56 -0
  110. package/dist/components/navbar.js +994 -0
  111. package/dist/components/navbar.mjs +952 -0
  112. package/{src/style/components/page-index → dist/components}/page-index.css +2 -47
  113. package/dist/components/page-index.d.mts +25 -0
  114. package/dist/components/page-index.d.ts +25 -0
  115. package/dist/components/page-index.js +239 -0
  116. package/dist/components/page-index.mjs +202 -0
  117. package/{src/style/components/page → dist/components}/page.css +4 -15
  118. package/dist/components/page.d.mts +30 -0
  119. package/dist/components/page.d.ts +30 -0
  120. package/dist/components/page.js +40 -0
  121. package/dist/components/page.mjs +13 -0
  122. package/dist/components/popover.css +87 -0
  123. package/dist/components/popover.d.mts +22 -0
  124. package/dist/components/popover.d.ts +22 -0
  125. package/dist/components/popover.js +243 -0
  126. package/dist/components/popover.mjs +206 -0
  127. package/{src/style → dist}/components/radio.css +8 -51
  128. package/dist/components/radio.d.mts +59 -0
  129. package/dist/components/radio.d.ts +59 -0
  130. package/dist/components/radio.js +133 -0
  131. package/dist/components/radio.mjs +95 -0
  132. package/dist/components/section.css +993 -0
  133. package/dist/components/section.d.mts +33 -0
  134. package/dist/components/section.d.ts +33 -0
  135. package/dist/components/section.js +1401 -0
  136. package/dist/components/section.mjs +1364 -0
  137. package/dist/components/select.css +391 -0
  138. package/dist/components/select.d.mts +63 -0
  139. package/dist/components/select.d.ts +63 -0
  140. package/dist/components/select.js +452 -0
  141. package/dist/components/select.mjs +415 -0
  142. package/{src/style/components/slider → dist/components}/slider.css +55 -33
  143. package/dist/components/slider.d.mts +69 -0
  144. package/dist/components/slider.d.ts +69 -0
  145. package/dist/components/slider.js +254 -0
  146. package/dist/components/slider.mjs +217 -0
  147. package/dist/components/switch.css +1081 -0
  148. package/dist/components/switch.d.mts +33 -0
  149. package/dist/components/switch.d.ts +33 -0
  150. package/dist/components/switch.js +1092 -0
  151. package/dist/components/switch.mjs +1055 -0
  152. package/{src/style/components/table → dist/components}/table.css +3 -28
  153. package/dist/components/table.d.mts +42 -0
  154. package/dist/components/table.d.ts +42 -0
  155. package/dist/components/table.js +108 -0
  156. package/dist/components/table.mjs +76 -0
  157. package/dist/components/tag.css +97 -0
  158. package/dist/components/tag.d.mts +12 -0
  159. package/dist/components/tag.d.ts +12 -0
  160. package/dist/components/tag.js +42 -0
  161. package/dist/components/tag.mjs +15 -0
  162. package/dist/components/textarea.css +1359 -0
  163. package/dist/components/textarea.d.mts +84 -0
  164. package/dist/components/textarea.d.ts +84 -0
  165. package/dist/components/textarea.js +1962 -0
  166. package/dist/components/textarea.mjs +1924 -0
  167. package/{src/style/components/theme-control → dist/components}/theme-control.css +3 -7
  168. package/dist/components/theme-control.d.mts +9 -0
  169. package/dist/components/theme-control.d.ts +9 -0
  170. package/dist/components/theme-control.js +235 -0
  171. package/dist/components/theme-control.mjs +200 -0
  172. package/{src/style/components/tooltip → dist/components}/tooltip.css +5 -13
  173. package/dist/components/tooltip.d.mts +12 -0
  174. package/dist/components/tooltip.d.ts +12 -0
  175. package/dist/components/tooltip.js +200 -0
  176. package/dist/components/tooltip.mjs +163 -0
  177. package/dist/icons-Czahnf-r.d.mts +15 -0
  178. package/dist/icons-Czahnf-r.d.ts +15 -0
  179. package/dist/index.css +2915 -2068
  180. package/dist/index.d.mts +144 -721
  181. package/dist/index.d.ts +144 -721
  182. package/dist/index.js +4076 -2282
  183. package/dist/index.mjs +4132 -2366
  184. package/dist/theme.css +34 -34
  185. package/package.json +27 -8
  186. package/dist/index.css.map +0 -1
  187. package/dist/index.js.map +0 -1
  188. package/dist/index.mjs.map +0 -1
  189. package/hellboy-ds-0.1.2.tgz +0 -0
  190. package/src/components/badge/Badge.tsx +0 -29
  191. package/src/components/badge/index.ts +0 -1
  192. package/src/components/banner/Banner.tsx +0 -48
  193. package/src/components/banner/banner.css +0 -44
  194. package/src/components/banner/index.ts +0 -1
  195. package/src/components/button/button.tsx +0 -127
  196. package/src/components/button/index.ts +0 -1
  197. package/src/components/card/card.tsx +0 -57
  198. package/src/components/card/index.ts +0 -1
  199. package/src/components/checkbox/Checkbox.tsx +0 -98
  200. package/src/components/checkbox/index.ts +0 -1
  201. package/src/components/code-block/code-block.tsx +0 -44
  202. package/src/components/code-block/index.ts +0 -1
  203. package/src/components/color-control/color-control.tsx +0 -322
  204. package/src/components/color-control/index.ts +0 -1
  205. package/src/components/drag-handle/DragHandle.tsx +0 -78
  206. package/src/components/drag-handle/index.ts +0 -1
  207. package/src/components/drawer/drawer.tsx +0 -82
  208. package/src/components/drawer/index.ts +0 -1
  209. package/src/components/floating-bar/floating-bar.tsx +0 -52
  210. package/src/components/floating-bar/index.ts +0 -2
  211. package/src/components/footer/footer.tsx +0 -28
  212. package/src/components/footer/index.ts +0 -1
  213. package/src/components/grid/Grid.tsx +0 -53
  214. package/src/components/grid/index.ts +0 -1
  215. package/src/components/header/header.tsx +0 -57
  216. package/src/components/header/index.ts +0 -1
  217. package/src/components/icons/icons.tsx +0 -44
  218. package/src/components/icons/index.ts +0 -1
  219. package/src/components/index.ts +0 -29
  220. package/src/components/input/DatePicker.tsx +0 -133
  221. package/src/components/input/Input.tsx +0 -220
  222. package/src/components/input/InputDate.tsx +0 -10
  223. package/src/components/input/InputDateTime.tsx +0 -10
  224. package/src/components/input/InputEmail.tsx +0 -10
  225. package/src/components/input/InputField.tsx +0 -137
  226. package/src/components/input/InputNumber.tsx +0 -10
  227. package/src/components/input/InputPassword.tsx +0 -10
  228. package/src/components/input/InputSearch.tsx +0 -10
  229. package/src/components/input/InputTel.tsx +0 -10
  230. package/src/components/input/InputText.tsx +0 -10
  231. package/src/components/input/InputTime.tsx +0 -10
  232. package/src/components/input/InputUrl.tsx +0 -10
  233. package/src/components/input/TimePicker.tsx +0 -151
  234. package/src/components/input/index.ts +0 -11
  235. package/src/components/layout/Layout.tsx +0 -244
  236. package/src/components/layout/index.ts +0 -1
  237. package/src/components/list/List.tsx +0 -159
  238. package/src/components/list/index.ts +0 -1
  239. package/src/components/navbar/MenuCategory.tsx +0 -20
  240. package/src/components/navbar/MenuGroup.tsx +0 -288
  241. package/src/components/navbar/MenuItem.tsx +0 -65
  242. package/src/components/navbar/Navbar.tsx +0 -23
  243. package/src/components/navbar/index.ts +0 -4
  244. package/src/components/page/index.ts +0 -1
  245. package/src/components/page/page.tsx +0 -46
  246. package/src/components/page-index/PageIndex.tsx +0 -275
  247. package/src/components/page-index/index.ts +0 -1
  248. package/src/components/popover/index.ts +0 -1
  249. package/src/components/popover/popover.tsx +0 -199
  250. package/src/components/radio/Radio.tsx +0 -176
  251. package/src/components/radio/index.ts +0 -1
  252. package/src/components/section/index.ts +0 -1
  253. package/src/components/section/section.tsx +0 -66
  254. package/src/components/select/Select.tsx +0 -212
  255. package/src/components/select/index.ts +0 -1
  256. package/src/components/slider/Slider.tsx +0 -267
  257. package/src/components/slider/index.ts +0 -1
  258. package/src/components/switch/index.ts +0 -1
  259. package/src/components/switch/switch.tsx +0 -99
  260. package/src/components/table/Table.tsx +0 -147
  261. package/src/components/table/index.ts +0 -1
  262. package/src/components/theme-control/index.ts +0 -1
  263. package/src/components/theme-control/theme-control.tsx +0 -78
  264. package/src/components/tooltip/index.ts +0 -1
  265. package/src/components/tooltip/tooltip.tsx +0 -207
  266. package/src/contexts/NavbarTooltipContext.tsx +0 -48
  267. package/src/contexts/index.ts +0 -1
  268. package/src/foundations/motion.md +0 -136
  269. package/src/index.ts +0 -40
  270. package/src/style/_shared/field.css +0 -69
  271. package/src/style/components/color-control/color-control.css +0 -126
  272. package/src/style/components/drawer/drawer.css +0 -210
  273. package/src/style/components/floating-bar/floating-bar.css +0 -39
  274. package/src/style/components/footer/footer.css +0 -108
  275. package/src/style/components/grid/grid.css +0 -33
  276. package/src/style/components/header/header.css +0 -44
  277. package/src/style/components/layout/layout.css +0 -205
  278. package/src/style/components/navbar/navbar.css +0 -342
  279. package/src/style/components/popover/popover.css +0 -44
  280. package/src/style/components/section/section.css +0 -67
  281. package/src/style/components/select/select.css +0 -143
  282. package/src/style/components/switch/switch.css +0 -267
  283. package/src/style/foundations/global.css +0 -316
  284. package/src/style/foundations/motion.css +0 -164
  285. package/src/style/foundations/spacing.css +0 -51
  286. package/src/style/foundations/typography.css +0 -39
  287. package/src/style/foundations/z-index.css +0 -81
  288. package/src/style/modes/dark.css +0 -146
  289. package/src/style/modes/light.css +0 -147
  290. package/src/style/semantic.css +0 -52
  291. package/src/style/styles.css +0 -51
  292. package/src/style/themes/theme.json +0 -37
  293. package/src/utils/README.md +0 -305
  294. package/src/utils/USER_PREFERENCES.md +0 -558
  295. package/src/utils/theme.ts +0 -127
  296. package/src/utils/user-preferences.ts +0 -577
  297. package/tsconfig.json +0 -25
  298. 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,4 +0,0 @@
1
- export * from "./Navbar";
2
- export * from "./MenuItem";
3
- export * from "./MenuGroup";
4
- export * from "./MenuCategory";
@@ -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
- };