@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.9 → 0.2.11
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/CHANGELOG.md +1 -1
- package/dist/components/ui/accessibility-demo.esm.js +30 -24
- package/dist/components/ui/accessibility-demo.js +30 -24
- package/dist/components/ui/advanced-component-architecture-demo.esm.js +235 -179
- package/dist/components/ui/advanced-component-architecture-demo.js +235 -179
- package/dist/components/ui/advanced-transition-system-demo.esm.js +110 -64
- package/dist/components/ui/advanced-transition-system-demo.js +110 -64
- package/dist/components/ui/advanced-transition-system.esm.js +166 -122
- package/dist/components/ui/advanced-transition-system.js +166 -122
- package/dist/components/ui/animation/animated-container.esm.js +52 -29
- package/dist/components/ui/animation/animated-container.js +52 -29
- package/dist/components/ui/animation/staggered-container.esm.js +18 -9
- package/dist/components/ui/animation/staggered-container.js +18 -9
- package/dist/components/ui/animation-demo.esm.js +67 -35
- package/dist/components/ui/animation-demo.js +67 -35
- package/dist/components/ui/badge.esm.js +9 -6
- package/dist/components/ui/badge.js +9 -6
- package/dist/components/ui/battery-conscious-animation-demo.esm.js +122 -87
- package/dist/components/ui/battery-conscious-animation-demo.js +122 -87
- package/dist/components/ui/border-radius-shadow-demo.esm.js +23 -12
- package/dist/components/ui/border-radius-shadow-demo.js +23 -12
- package/dist/components/ui/button.esm.js +8 -2
- package/dist/components/ui/button.js +8 -2
- package/dist/components/ui/card.esm.js +33 -8
- package/dist/components/ui/card.js +33 -8
- package/dist/components/ui/checkbox.esm.js +3 -3
- package/dist/components/ui/checkbox.js +3 -3
- package/dist/components/ui/color-preview.esm.js +68 -45
- package/dist/components/ui/color-preview.js +68 -45
- package/dist/components/ui/data-display/chart.esm.js +112 -84
- package/dist/components/ui/data-display/chart.js +112 -84
- package/dist/components/ui/data-display/data-grid-simple.esm.js +1 -1
- package/dist/components/ui/data-display/data-grid-simple.js +1 -1
- package/dist/components/ui/data-display/data-grid.esm.js +80 -67
- package/dist/components/ui/data-display/data-grid.js +80 -67
- package/dist/components/ui/data-display/list.esm.js +53 -45
- package/dist/components/ui/data-display/list.js +53 -45
- package/dist/components/ui/data-display/table.esm.js +62 -54
- package/dist/components/ui/data-display/table.js +62 -54
- package/dist/components/ui/data-display/timeline.esm.js +39 -34
- package/dist/components/ui/data-display/timeline.js +39 -34
- package/dist/components/ui/data-display/tree.esm.js +116 -84
- package/dist/components/ui/data-display/tree.js +116 -84
- package/dist/components/ui/data-display/types.esm.js +389 -364
- package/dist/components/ui/data-display/types.js +389 -364
- package/dist/components/ui/enterprise-mobile-experience-demo.esm.js +120 -70
- package/dist/components/ui/enterprise-mobile-experience-demo.js +120 -70
- package/dist/components/ui/enterprise-mobile-experience.esm.js +124 -73
- package/dist/components/ui/enterprise-mobile-experience.js +124 -73
- package/dist/components/ui/feedback/alert.esm.js +22 -15
- package/dist/components/ui/feedback/alert.js +22 -15
- package/dist/components/ui/feedback/progress.esm.js +47 -24
- package/dist/components/ui/feedback/progress.js +47 -24
- package/dist/components/ui/feedback/skeleton.esm.js +39 -29
- package/dist/components/ui/feedback/skeleton.js +39 -29
- package/dist/components/ui/feedback/toast.esm.js +62 -38
- package/dist/components/ui/feedback/toast.js +62 -38
- package/dist/components/ui/feedback/types.esm.js +83 -83
- package/dist/components/ui/feedback/types.js +83 -83
- package/dist/components/ui/font-preview.esm.js +41 -39
- package/dist/components/ui/font-preview.js +41 -39
- package/dist/components/ui/form-demo.esm.js +150 -113
- package/dist/components/ui/form-demo.js +150 -113
- package/dist/components/ui/hardware-acceleration-demo.esm.js +137 -87
- package/dist/components/ui/hardware-acceleration-demo.js +137 -87
- package/dist/components/ui/input.esm.js +4 -1
- package/dist/components/ui/input.js +4 -1
- package/dist/components/ui/layout-demo.esm.js +81 -56
- package/dist/components/ui/layout-demo.js +81 -56
- package/dist/components/ui/layouts/adaptive-layout.esm.js +27 -8
- package/dist/components/ui/layouts/adaptive-layout.js +27 -8
- package/dist/components/ui/layouts/desktop-layout.esm.js +39 -19
- package/dist/components/ui/layouts/desktop-layout.js +39 -19
- package/dist/components/ui/layouts/mobile-layout.esm.js +19 -9
- package/dist/components/ui/layouts/mobile-layout.js +19 -9
- package/dist/components/ui/layouts/tablet-layout.esm.js +28 -14
- package/dist/components/ui/layouts/tablet-layout.js +28 -14
- package/dist/components/ui/mobile-form-validation.esm.js +120 -87
- package/dist/components/ui/mobile-form-validation.js +120 -87
- package/dist/components/ui/mobile-input-demo.esm.js +19 -13
- package/dist/components/ui/mobile-input-demo.js +19 -13
- package/dist/components/ui/mobile-input.esm.js +185 -120
- package/dist/components/ui/mobile-input.js +185 -120
- package/dist/components/ui/mobile-skeleton-loading-demo.esm.js +128 -111
- package/dist/components/ui/mobile-skeleton-loading-demo.js +128 -111
- package/dist/components/ui/navigation/breadcrumb.esm.js +17 -14
- package/dist/components/ui/navigation/breadcrumb.js +17 -14
- package/dist/components/ui/navigation/index.esm.js +0 -1
- package/dist/components/ui/navigation/index.js +0 -1
- package/dist/components/ui/navigation/menu.esm.js +49 -35
- package/dist/components/ui/navigation/menu.js +49 -35
- package/dist/components/ui/navigation/navigation-demo.esm.js +81 -74
- package/dist/components/ui/navigation/navigation-demo.js +81 -74
- package/dist/components/ui/navigation/pagination.esm.js +62 -50
- package/dist/components/ui/navigation/pagination.js +62 -50
- package/dist/components/ui/navigation/sidebar.esm.js +56 -42
- package/dist/components/ui/navigation/sidebar.js +56 -42
- package/dist/components/ui/navigation/stepper.esm.js +34 -23
- package/dist/components/ui/navigation/stepper.js +34 -23
- package/dist/components/ui/navigation/tabs.esm.js +32 -21
- package/dist/components/ui/navigation/tabs.js +32 -21
- package/dist/components/ui/navigation/types.esm.js +196 -195
- package/dist/components/ui/navigation/types.js +196 -195
- package/dist/components/ui/overlay/backdrop.esm.js +17 -16
- package/dist/components/ui/overlay/backdrop.js +17 -16
- package/dist/components/ui/overlay/focus-manager.esm.js +21 -19
- package/dist/components/ui/overlay/focus-manager.js +21 -19
- package/dist/components/ui/overlay/index.esm.js +0 -2
- package/dist/components/ui/overlay/index.js +0 -2
- package/dist/components/ui/overlay/modal.esm.js +38 -34
- package/dist/components/ui/overlay/modal.js +38 -34
- package/dist/components/ui/overlay/overlay-manager.esm.js +25 -20
- package/dist/components/ui/overlay/overlay-manager.js +25 -20
- package/dist/components/ui/overlay/popover.esm.js +74 -58
- package/dist/components/ui/overlay/popover.js +74 -58
- package/dist/components/ui/overlay/portal.esm.js +7 -7
- package/dist/components/ui/overlay/portal.js +7 -7
- package/dist/components/ui/overlay/tooltip.esm.js +54 -39
- package/dist/components/ui/overlay/tooltip.js +54 -39
- package/dist/components/ui/overlay/types.esm.js +132 -131
- package/dist/components/ui/overlay/types.js +132 -131
- package/dist/components/ui/performance-demo.esm.js +135 -88
- package/dist/components/ui/performance-demo.js +135 -88
- package/dist/components/ui/semantic-input-system-demo.esm.js +117 -80
- package/dist/components/ui/semantic-input-system-demo.js +117 -80
- package/dist/components/ui/theme-customizer.esm.js +84 -52
- package/dist/components/ui/theme-customizer.js +84 -52
- package/dist/components/ui/theme-preview.esm.js +95 -43
- package/dist/components/ui/theme-preview.js +95 -43
- package/dist/components/ui/theme-switcher.esm.js +70 -44
- package/dist/components/ui/theme-switcher.js +70 -44
- package/dist/components/ui/theme-toggle.esm.js +3 -3
- package/dist/components/ui/theme-toggle.js +3 -3
- package/dist/components/ui/token-demo.esm.js +33 -21
- package/dist/components/ui/token-demo.js +33 -21
- package/dist/components/ui/touch-demo.esm.js +102 -73
- package/dist/components/ui/touch-demo.js +102 -73
- package/dist/components/ui/touch-friendly-interface-demo.esm.js +102 -64
- package/dist/components/ui/touch-friendly-interface-demo.js +102 -64
- package/dist/components/ui/touch-friendly-interface.esm.js +85 -61
- package/dist/components/ui/touch-friendly-interface.js +85 -61
- package/dist/hooks/use-accessibility-support.esm.js +115 -85
- package/dist/hooks/use-accessibility-support.js +115 -85
- package/dist/hooks/use-adaptive-layout.esm.js +56 -33
- package/dist/hooks/use-adaptive-layout.js +56 -33
- package/dist/hooks/use-advanced-patterns.esm.js +57 -42
- package/dist/hooks/use-advanced-patterns.js +57 -42
- package/dist/hooks/use-advanced-transition-system.esm.js +112 -71
- package/dist/hooks/use-advanced-transition-system.js +112 -71
- package/dist/hooks/use-animation-profile.esm.js +63 -34
- package/dist/hooks/use-animation-profile.js +63 -34
- package/dist/hooks/use-battery-animations.esm.js +80 -55
- package/dist/hooks/use-battery-animations.js +80 -55
- package/dist/hooks/use-battery-conscious-loading.esm.js +166 -123
- package/dist/hooks/use-battery-conscious-loading.js +166 -123
- package/dist/hooks/use-battery-optimization.esm.js +78 -55
- package/dist/hooks/use-battery-optimization.js +78 -55
- package/dist/hooks/use-battery-status.esm.js +73 -51
- package/dist/hooks/use-battery-status.js +73 -51
- package/dist/hooks/use-component-performance.esm.js +62 -47
- package/dist/hooks/use-component-performance.js +62 -47
- package/dist/hooks/use-device-loading-states.esm.js +152 -109
- package/dist/hooks/use-device-loading-states.js +152 -109
- package/dist/hooks/use-device.esm.js +25 -14
- package/dist/hooks/use-device.js +25 -14
- package/dist/hooks/use-enterprise-mobile-experience.esm.js +137 -88
- package/dist/hooks/use-enterprise-mobile-experience.js +137 -88
- package/dist/hooks/use-form-feedback.esm.js +124 -81
- package/dist/hooks/use-form-feedback.js +124 -81
- package/dist/hooks/use-form-performance.esm.js +127 -92
- package/dist/hooks/use-form-performance.js +127 -92
- package/dist/hooks/use-frame-rate.esm.js +56 -37
- package/dist/hooks/use-frame-rate.js +56 -37
- package/dist/hooks/use-gestures.esm.js +96 -72
- package/dist/hooks/use-gestures.js +96 -72
- package/dist/hooks/use-hardware-acceleration.esm.js +65 -37
- package/dist/hooks/use-hardware-acceleration.js +65 -37
- package/dist/hooks/use-input-accessibility.esm.js +157 -119
- package/dist/hooks/use-input-accessibility.js +157 -119
- package/dist/hooks/use-input-performance.esm.js +139 -104
- package/dist/hooks/use-input-performance.js +139 -104
- package/dist/hooks/use-layout-performance.esm.js +50 -29
- package/dist/hooks/use-layout-performance.js +50 -29
- package/dist/hooks/use-loading-accessibility.esm.js +209 -169
- package/dist/hooks/use-loading-accessibility.js +209 -169
- package/dist/hooks/use-loading-performance.esm.js +117 -93
- package/dist/hooks/use-loading-performance.js +117 -93
- package/dist/hooks/use-memory-usage.esm.js +57 -38
- package/dist/hooks/use-memory-usage.js +57 -38
- package/dist/hooks/use-mobile-form-layout.esm.js +111 -74
- package/dist/hooks/use-mobile-form-layout.js +111 -74
- package/dist/hooks/use-mobile-form-validation.esm.js +211 -144
- package/dist/hooks/use-mobile-form-validation.js +211 -144
- package/dist/hooks/use-mobile-keyboard-optimization.esm.js +154 -113
- package/dist/hooks/use-mobile-keyboard-optimization.js +154 -113
- package/dist/hooks/use-mobile-layout.esm.js +73 -51
- package/dist/hooks/use-mobile-layout.js +73 -51
- package/dist/hooks/use-mobile-optimization.esm.js +72 -44
- package/dist/hooks/use-mobile-optimization.js +72 -44
- package/dist/hooks/use-mobile-skeleton.esm.js +97 -64
- package/dist/hooks/use-mobile-skeleton.js +97 -64
- package/dist/hooks/use-mobile-touch.esm.js +128 -93
- package/dist/hooks/use-mobile-touch.js +128 -93
- package/dist/hooks/use-performance-throttling.esm.js +72 -48
- package/dist/hooks/use-performance-throttling.js +72 -48
- package/dist/hooks/use-performance.esm.js +90 -52
- package/dist/hooks/use-performance.js +90 -52
- package/dist/hooks/use-reusable-architecture.esm.js +94 -65
- package/dist/hooks/use-reusable-architecture.js +94 -65
- package/dist/hooks/use-semantic-input-types.esm.js +166 -124
- package/dist/hooks/use-semantic-input-types.js +166 -124
- package/dist/hooks/use-semantic-input.esm.js +178 -126
- package/dist/hooks/use-semantic-input.js +178 -126
- package/dist/hooks/use-tablet-layout.esm.js +67 -38
- package/dist/hooks/use-tablet-layout.js +67 -38
- package/dist/hooks/use-touch-friendly-input.esm.js +193 -149
- package/dist/hooks/use-touch-friendly-input.js +193 -149
- package/dist/hooks/use-touch-friendly-interface.esm.js +99 -67
- package/dist/hooks/use-touch-friendly-interface.js +99 -67
- package/dist/hooks/use-touch-optimization.esm.js +99 -72
- package/dist/hooks/use-touch-optimization.js +99 -72
- package/dist/index.esm.js +157 -281
- package/dist/index.js +157 -281
- package/dist/lib/utils.esm.js +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/plugins/theme-css-generator.esm.js +104 -55
- package/dist/plugins/theme-css-generator.js +104 -55
- package/dist/provider.esm.js +4 -4
- package/dist/provider.js +4 -4
- package/dist/styles.css +1 -1
- package/dist/theme.esm.js +633 -468
- package/dist/theme.js +633 -468
- package/dist/themes/ThemeContext.esm.js +15 -15
- package/dist/themes/ThemeContext.js +15 -15
- package/dist/themes/ThemeProvider.esm.js +25 -22
- package/dist/themes/ThemeProvider.js +25 -22
- package/dist/themes/accessibility.esm.js +147 -108
- package/dist/themes/accessibility.js +147 -108
- package/dist/themes/aria-patterns.esm.js +198 -162
- package/dist/themes/aria-patterns.js +198 -162
- package/dist/themes/base-themes.esm.js +14 -11
- package/dist/themes/base-themes.js +14 -11
- package/dist/themes/colorManager.esm.js +101 -83
- package/dist/themes/colorManager.js +101 -83
- package/dist/themes/examples/dark-theme.esm.js +133 -103
- package/dist/themes/examples/dark-theme.js +133 -103
- package/dist/themes/examples/minimal-theme.esm.js +83 -61
- package/dist/themes/examples/minimal-theme.js +83 -61
- package/dist/themes/focus-management.esm.js +202 -143
- package/dist/themes/focus-management.js +202 -143
- package/dist/themes/fontLoader.esm.js +28 -19
- package/dist/themes/fontLoader.js +28 -19
- package/dist/themes/high-contrast.esm.js +152 -104
- package/dist/themes/high-contrast.js +152 -104
- package/dist/themes/index.esm.js +1 -1
- package/dist/themes/index.js +1 -1
- package/dist/themes/inheritance.esm.js +35 -27
- package/dist/themes/inheritance.js +35 -27
- package/dist/themes/keyboard-navigation.esm.js +152 -123
- package/dist/themes/keyboard-navigation.js +152 -123
- package/dist/themes/motion-reduction.esm.js +193 -133
- package/dist/themes/motion-reduction.js +193 -133
- package/dist/themes/navigation.esm.js +146 -146
- package/dist/themes/navigation.js +146 -146
- package/dist/themes/screen-reader.esm.js +159 -94
- package/dist/themes/screen-reader.js +159 -94
- package/dist/themes/systemThemeDetector.esm.js +42 -34
- package/dist/themes/systemThemeDetector.js +42 -34
- package/dist/themes/themeCSSUpdater.esm.js +21 -9
- package/dist/themes/themeCSSUpdater.js +21 -9
- package/dist/themes/themePersistence.esm.js +68 -47
- package/dist/themes/themePersistence.js +68 -47
- package/dist/themes/themes/stan-design.esm.js +633 -468
- package/dist/themes/themes/stan-design.js +633 -468
- package/dist/themes/types.esm.js +301 -287
- package/dist/themes/types.js +301 -287
- package/dist/themes/useSystemTheme.esm.js +4 -4
- package/dist/themes/useSystemTheme.js +4 -4
- package/dist/themes/useTheme.esm.js +4 -4
- package/dist/themes/useTheme.js +4 -4
- package/dist/themes/validation.esm.js +128 -77
- package/dist/themes/validation.js +128 -77
- package/dist/tokens/index.esm.js +1 -2
- package/dist/tokens/index.js +1 -2
- package/dist/tokens/tokenExporter.esm.js +87 -61
- package/dist/tokens/tokenExporter.js +87 -61
- package/dist/tokens/tokenGenerator.esm.js +86 -77
- package/dist/tokens/tokenGenerator.js +86 -77
- package/dist/tokens/tokenManager.esm.js +64 -51
- package/dist/tokens/tokenManager.js +64 -51
- package/dist/tokens/tokenValidator.esm.js +193 -147
- package/dist/tokens/tokenValidator.js +193 -147
- package/dist/tokens/types.esm.js +49 -35
- package/dist/tokens/types.js +49 -35
- package/dist/utils/bundle-analyzer.esm.js +83 -65
- package/dist/utils/bundle-analyzer.js +83 -65
- package/dist/utils/bundle-splitting.esm.js +142 -117
- package/dist/utils/bundle-splitting.js +142 -117
- package/dist/utils/lazy-loading.esm.js +132 -106
- package/dist/utils/lazy-loading.js +132 -106
- package/dist/utils/performance-monitor.esm.js +170 -129
- package/dist/utils/performance-monitor.js +170 -129
- package/dist/utils/tree-shaking.esm.js +69 -61
- package/dist/utils/tree-shaking.js +69 -61
- package/package.json +1 -1
- package/src/index.ts +146 -146
|
@@ -8,25 +8,26 @@ import { useState, useCallback, useRef, useEffect } from 'react';
|
|
|
8
8
|
import { SidebarProps, NavigationItem, NavigationGroup } from './types';
|
|
9
9
|
|
|
10
10
|
// Simple icon components
|
|
11
|
-
const ChevronLeftIcon}> = ({ className = '' }) => (
|
|
11
|
+
const ChevronLeftIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
12
12
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
13
13
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
|
|
14
14
|
</svg>
|
|
15
15
|
);
|
|
16
16
|
|
|
17
|
-
const ChevronRightIcon}> = ({ className = '' }) => (
|
|
17
|
+
const ChevronRightIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
18
18
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
19
19
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
|
|
20
20
|
</svg>
|
|
21
21
|
);
|
|
22
22
|
|
|
23
|
-
// TODO
|
|
23
|
+
// TODO: Implement close icon functionality in future version
|
|
24
|
+
// const XMarkIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
24
25
|
// <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
25
26
|
// <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
|
|
26
27
|
// </svg>
|
|
27
28
|
// );
|
|
28
29
|
|
|
29
|
-
export const Sidebar= ({
|
|
30
|
+
export const Sidebar: React.FC<SidebarProps> = ({
|
|
30
31
|
items = [],
|
|
31
32
|
groups = [],
|
|
32
33
|
variant = 'default',
|
|
@@ -50,32 +51,35 @@ export const Sidebar= ({
|
|
|
50
51
|
onGroupToggle,
|
|
51
52
|
expandedGroups = [],
|
|
52
53
|
defaultExpandedGroups = [],
|
|
53
|
-
// TODO
|
|
54
|
+
// TODO: Implement group icons in future version
|
|
55
|
+
// showGroupIcons = true,
|
|
54
56
|
showItemIcons = true,
|
|
55
57
|
showItemBadges = true,
|
|
56
58
|
showItemDescriptions = true,
|
|
57
59
|
sticky = false,
|
|
58
60
|
zIndex = 1000,
|
|
59
61
|
className = '',
|
|
60
|
-
'data-testid'= 'sidebar',
|
|
62
|
+
'data-testid': testId = 'sidebar',
|
|
61
63
|
}) => {
|
|
62
64
|
const [internalCollapsed, setInternalCollapsed] = useState<boolean>(
|
|
63
|
-
collapsed !== undefined ? collapsed
|
|
65
|
+
collapsed !== undefined ? collapsed : defaultCollapsed
|
|
66
|
+
);
|
|
64
67
|
const [internalExpandedGroups, setInternalExpandedGroups] = useState<string[]>(
|
|
65
|
-
expandedGroups !== undefined ? expandedGroups
|
|
68
|
+
expandedGroups !== undefined ? expandedGroups : defaultExpandedGroups
|
|
69
|
+
);
|
|
66
70
|
const [isOverlayOpen, setIsOverlayOpen] = useState(false);
|
|
67
71
|
const [isMobile, setIsMobile] = useState(false);
|
|
68
72
|
|
|
69
73
|
const sidebarRef = useRef<HTMLDivElement>(null);
|
|
70
74
|
|
|
71
75
|
// Use controlled or uncontrolled collapsed state
|
|
72
|
-
const currentCollapsed = collapsed !== undefined ? collapsed ;
|
|
73
|
-
const currentExpandedGroups = expandedGroups !== undefined ? expandedGroups ;
|
|
76
|
+
const currentCollapsed = collapsed !== undefined ? collapsed : internalCollapsed;
|
|
77
|
+
const currentExpandedGroups = expandedGroups !== undefined ? expandedGroups : internalExpandedGroups;
|
|
74
78
|
|
|
75
79
|
// Handle responsive behavior
|
|
76
80
|
useEffect(() => {
|
|
77
81
|
const handleResize = () => {
|
|
78
|
-
const breakpointWidth = breakpoint === 'sm' ? 640 === 'md' ? 768 === 'lg' ? 1024 ;
|
|
82
|
+
const breakpointWidth = breakpoint === 'sm' ? 640 : breakpoint === 'md' ? 768 : breakpoint === 'lg' ? 1024 : 1280;
|
|
79
83
|
setIsMobile(window.innerWidth < breakpointWidth);
|
|
80
84
|
};
|
|
81
85
|
|
|
@@ -93,7 +97,7 @@ export const Sidebar= ({
|
|
|
93
97
|
|
|
94
98
|
// Handle escape key for overlay
|
|
95
99
|
useEffect(() => {
|
|
96
|
-
const handleEscape = (event) => {
|
|
100
|
+
const handleEscape = (event: KeyboardEvent) => {
|
|
97
101
|
if (event.key === 'Escape' && isOverlayOpen && overlayCloseOnEscape) {
|
|
98
102
|
setIsOverlayOpen(false);
|
|
99
103
|
}
|
|
@@ -122,10 +126,10 @@ export const Sidebar= ({
|
|
|
122
126
|
}
|
|
123
127
|
}, [collapsed, currentCollapsed, collapsible, onCollapseChange]);
|
|
124
128
|
|
|
125
|
-
const handleGroupToggle = useCallback((groupId) => {
|
|
129
|
+
const handleGroupToggle = useCallback((groupId: string) => {
|
|
126
130
|
const newExpandedGroups = currentExpandedGroups.includes(groupId)
|
|
127
131
|
? currentExpandedGroups.filter(id => id !== groupId)
|
|
128
|
-
, groupId];
|
|
132
|
+
: [...currentExpandedGroups, groupId];
|
|
129
133
|
|
|
130
134
|
if (expandedGroups === undefined) {
|
|
131
135
|
setInternalExpandedGroups(newExpandedGroups);
|
|
@@ -136,7 +140,7 @@ export const Sidebar= ({
|
|
|
136
140
|
}
|
|
137
141
|
}, [currentExpandedGroups, expandedGroups, onGroupToggle]);
|
|
138
142
|
|
|
139
|
-
const handleItemClick = useCallback((item) => {
|
|
143
|
+
const handleItemClick = useCallback((item: NavigationItem) => {
|
|
140
144
|
if (item.disabled) return;
|
|
141
145
|
|
|
142
146
|
if (onItemClick) {
|
|
@@ -161,19 +165,27 @@ export const Sidebar= ({
|
|
|
161
165
|
if (currentCollapsed) return 'sidebar--collapsed';
|
|
162
166
|
|
|
163
167
|
switch (size) {
|
|
164
|
-
case 'sm'
|
|
165
|
-
|
|
166
|
-
case '
|
|
167
|
-
|
|
168
|
+
case 'sm':
|
|
169
|
+
return 'sidebar--size-sm';
|
|
170
|
+
case 'lg':
|
|
171
|
+
return 'sidebar--size-lg';
|
|
172
|
+
case 'xl':
|
|
173
|
+
return 'sidebar--size-xl';
|
|
174
|
+
default: // md
|
|
175
|
+
return 'sidebar--size-md';
|
|
168
176
|
}
|
|
169
177
|
};
|
|
170
178
|
|
|
171
179
|
const getVariantClasses = () => {
|
|
172
180
|
switch (variant) {
|
|
173
|
-
case 'collapsible'
|
|
174
|
-
|
|
175
|
-
case '
|
|
176
|
-
|
|
181
|
+
case 'collapsible':
|
|
182
|
+
return 'sidebar--collapsible';
|
|
183
|
+
case 'overlay':
|
|
184
|
+
return 'sidebar--overlay';
|
|
185
|
+
case 'drawer':
|
|
186
|
+
return 'sidebar--drawer';
|
|
187
|
+
default: // default
|
|
188
|
+
return 'sidebar--default';
|
|
177
189
|
}
|
|
178
190
|
};
|
|
179
191
|
|
|
@@ -183,7 +195,7 @@ export const Sidebar= ({
|
|
|
183
195
|
|
|
184
196
|
const getPositionClasses = () => {
|
|
185
197
|
if (variant === 'overlay' || variant === 'drawer') {
|
|
186
|
-
return position === 'right' ? 'sidebar--position-right' ;
|
|
198
|
+
return position === 'right' ? 'sidebar--position-right' : 'sidebar--position-left';
|
|
187
199
|
}
|
|
188
200
|
return '';
|
|
189
201
|
};
|
|
@@ -191,16 +203,17 @@ export const Sidebar= ({
|
|
|
191
203
|
const getTransformClasses = () => {
|
|
192
204
|
if (variant === 'overlay' || variant === 'drawer' || (isMobile && overlay)) {
|
|
193
205
|
if (position === 'right') {
|
|
194
|
-
return isOverlayOpen ? 'sidebar--open' ;
|
|
206
|
+
return isOverlayOpen ? 'sidebar--open' : 'sidebar--closed-right';
|
|
195
207
|
}
|
|
196
|
-
return isOverlayOpen ? 'sidebar--open' ;
|
|
208
|
+
return isOverlayOpen ? 'sidebar--open' : 'sidebar--closed-left';
|
|
197
209
|
}
|
|
198
210
|
return '';
|
|
199
211
|
};
|
|
200
212
|
|
|
201
|
-
const getItemClasses = (item) => {
|
|
213
|
+
const getItemClasses = (item: NavigationItem) => {
|
|
202
214
|
let classes = `sidebar__item ${
|
|
203
|
-
currentCollapsed ? 'sidebar__item--collapsed'
|
|
215
|
+
currentCollapsed ? 'sidebar__item--collapsed' : 'sidebar__item--expanded'
|
|
216
|
+
}`;
|
|
204
217
|
|
|
205
218
|
if (item.disabled) {
|
|
206
219
|
classes += ' sidebar__item--disabled';
|
|
@@ -213,7 +226,7 @@ export const Sidebar= ({
|
|
|
213
226
|
return classes;
|
|
214
227
|
};
|
|
215
228
|
|
|
216
|
-
const getGroupClasses = (groupId) => {
|
|
229
|
+
const getGroupClasses = (groupId: string) => {
|
|
217
230
|
const isExpanded = currentExpandedGroups.includes(groupId);
|
|
218
231
|
let classes = 'sidebar__group';
|
|
219
232
|
|
|
@@ -226,16 +239,16 @@ export const Sidebar= ({
|
|
|
226
239
|
return classes;
|
|
227
240
|
};
|
|
228
241
|
|
|
229
|
-
const renderMenuItem = (item) => (
|
|
242
|
+
const renderMenuItem = (item: NavigationItem) => (
|
|
230
243
|
<button
|
|
231
244
|
key={item.id}
|
|
232
245
|
onClick={() => handleItemClick(item)}
|
|
233
246
|
disabled={item.disabled}
|
|
234
247
|
className={getItemClasses(item)}
|
|
235
|
-
title={currentCollapsed ? item.label }
|
|
248
|
+
title={currentCollapsed ? item.label : undefined}
|
|
236
249
|
>
|
|
237
250
|
{showItemIcons && item.icon && (
|
|
238
|
-
<span className={`sidebar__item-icon ${currentCollapsed ? 'sidebar__item-icon--collapsed' }`}>
|
|
251
|
+
<span className={`sidebar__item-icon ${currentCollapsed ? 'sidebar__item-icon--collapsed' : 'sidebar__item-icon--expanded'}`}>
|
|
239
252
|
{item.icon}
|
|
240
253
|
</span>
|
|
241
254
|
)}
|
|
@@ -255,16 +268,16 @@ export const Sidebar= ({
|
|
|
255
268
|
</button>
|
|
256
269
|
);
|
|
257
270
|
|
|
258
|
-
const renderMenuGroup = (group) => (
|
|
271
|
+
const renderMenuGroup = (group: NavigationGroup) => (
|
|
259
272
|
<div key={group.id}>
|
|
260
273
|
<button
|
|
261
274
|
onClick={() => handleGroupToggle(group.id)}
|
|
262
275
|
className={getGroupClasses(group.id)}
|
|
263
|
-
title={currentCollapsed ? group.title }
|
|
276
|
+
title={currentCollapsed ? group.title : undefined}
|
|
264
277
|
>
|
|
265
|
-
{/* TODO}
|
|
278
|
+
{/* TODO: Add icon support to NavigationGroup in future version */}
|
|
266
279
|
{/* {showGroupIcons && group.icon && (
|
|
267
|
-
<span className={currentCollapsed ? '' }>
|
|
280
|
+
<span className={currentCollapsed ? '' : 'mr-3'}>
|
|
268
281
|
{group.icon}
|
|
269
282
|
</span>
|
|
270
283
|
)} */}
|
|
@@ -274,7 +287,8 @@ export const Sidebar= ({
|
|
|
274
287
|
<div className="sidebar__group-title">{group.title}</div>
|
|
275
288
|
<ChevronRightIcon
|
|
276
289
|
className={`sidebar__group-arrow ${
|
|
277
|
-
currentExpandedGroups.includes(group.id) ? 'sidebar__group-arrow--expanded'
|
|
290
|
+
currentExpandedGroups.includes(group.id) ? 'sidebar__group-arrow--expanded' : ''
|
|
291
|
+
}`}
|
|
278
292
|
/>
|
|
279
293
|
</>
|
|
280
294
|
)}
|
|
@@ -308,16 +322,16 @@ export const Sidebar= ({
|
|
|
308
322
|
<button
|
|
309
323
|
onClick={handleCollapseToggle}
|
|
310
324
|
className="sidebar__toggle-button"
|
|
311
|
-
aria-label={currentCollapsed ? 'Expand sidebar' }
|
|
325
|
+
aria-label={currentCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}
|
|
312
326
|
>
|
|
313
|
-
{toggleIcon || (currentCollapsed ? <ChevronRightIcon className="sidebar__toggle-icon" /> ="sidebar__toggle-icon" />)}
|
|
327
|
+
{toggleIcon || (currentCollapsed ? <ChevronRightIcon className="sidebar__toggle-icon" /> : <ChevronLeftIcon className="sidebar__toggle-icon" />)}
|
|
314
328
|
</button>
|
|
315
329
|
</div>
|
|
316
330
|
)}
|
|
317
331
|
|
|
318
332
|
{/* Navigation Items */}
|
|
319
333
|
<nav className="sidebar__navigation">
|
|
320
|
-
{groups && groups.length > 0 ? groups.map(renderMenuGroup) )}
|
|
334
|
+
{groups && groups.length > 0 ? groups.map(renderMenuGroup) : items.map(renderMenuItem)}
|
|
321
335
|
</nav>
|
|
322
336
|
|
|
323
337
|
{/* Footer */}
|
|
@@ -337,7 +351,7 @@ export const Sidebar= ({
|
|
|
337
351
|
{isOverlayOpen && (
|
|
338
352
|
<div
|
|
339
353
|
className="sidebar__overlay-backdrop"
|
|
340
|
-
onClick={overlayCloseOnOutsideClick ? handleOverlayClose }
|
|
354
|
+
onClick={overlayCloseOnOutsideClick ? handleOverlayClose : undefined}
|
|
341
355
|
/>
|
|
342
356
|
)}
|
|
343
357
|
|
|
@@ -360,7 +374,7 @@ export const Sidebar= ({
|
|
|
360
374
|
|
|
361
375
|
// Desktop sidebar
|
|
362
376
|
return (
|
|
363
|
-
<div className={`sidebar__wrapper ${sticky ? 'sidebar__wrapper--sticky' }`}>
|
|
377
|
+
<div className={`sidebar__wrapper ${sticky ? 'sidebar__wrapper--sticky' : ''}`}>
|
|
364
378
|
{sidebarContent}
|
|
365
379
|
</div>
|
|
366
380
|
);
|
|
@@ -8,25 +8,26 @@ import { useState, useCallback, useRef, useEffect } from 'react';
|
|
|
8
8
|
import { SidebarProps, NavigationItem, NavigationGroup } from './types';
|
|
9
9
|
|
|
10
10
|
// Simple icon components
|
|
11
|
-
const ChevronLeftIcon}> = ({ className = '' }) => (
|
|
11
|
+
const ChevronLeftIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
12
12
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
13
13
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
|
|
14
14
|
</svg>
|
|
15
15
|
);
|
|
16
16
|
|
|
17
|
-
const ChevronRightIcon}> = ({ className = '' }) => (
|
|
17
|
+
const ChevronRightIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
18
18
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
19
19
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
|
|
20
20
|
</svg>
|
|
21
21
|
);
|
|
22
22
|
|
|
23
|
-
// TODO
|
|
23
|
+
// TODO: Implement close icon functionality in future version
|
|
24
|
+
// const XMarkIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
24
25
|
// <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
25
26
|
// <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
|
|
26
27
|
// </svg>
|
|
27
28
|
// );
|
|
28
29
|
|
|
29
|
-
export const Sidebar= ({
|
|
30
|
+
export const Sidebar: React.FC<SidebarProps> = ({
|
|
30
31
|
items = [],
|
|
31
32
|
groups = [],
|
|
32
33
|
variant = 'default',
|
|
@@ -50,32 +51,35 @@ export const Sidebar= ({
|
|
|
50
51
|
onGroupToggle,
|
|
51
52
|
expandedGroups = [],
|
|
52
53
|
defaultExpandedGroups = [],
|
|
53
|
-
// TODO
|
|
54
|
+
// TODO: Implement group icons in future version
|
|
55
|
+
// showGroupIcons = true,
|
|
54
56
|
showItemIcons = true,
|
|
55
57
|
showItemBadges = true,
|
|
56
58
|
showItemDescriptions = true,
|
|
57
59
|
sticky = false,
|
|
58
60
|
zIndex = 1000,
|
|
59
61
|
className = '',
|
|
60
|
-
'data-testid'= 'sidebar',
|
|
62
|
+
'data-testid': testId = 'sidebar',
|
|
61
63
|
}) => {
|
|
62
64
|
const [internalCollapsed, setInternalCollapsed] = useState<boolean>(
|
|
63
|
-
collapsed !== undefined ? collapsed
|
|
65
|
+
collapsed !== undefined ? collapsed : defaultCollapsed
|
|
66
|
+
);
|
|
64
67
|
const [internalExpandedGroups, setInternalExpandedGroups] = useState<string[]>(
|
|
65
|
-
expandedGroups !== undefined ? expandedGroups
|
|
68
|
+
expandedGroups !== undefined ? expandedGroups : defaultExpandedGroups
|
|
69
|
+
);
|
|
66
70
|
const [isOverlayOpen, setIsOverlayOpen] = useState(false);
|
|
67
71
|
const [isMobile, setIsMobile] = useState(false);
|
|
68
72
|
|
|
69
73
|
const sidebarRef = useRef<HTMLDivElement>(null);
|
|
70
74
|
|
|
71
75
|
// Use controlled or uncontrolled collapsed state
|
|
72
|
-
const currentCollapsed = collapsed !== undefined ? collapsed ;
|
|
73
|
-
const currentExpandedGroups = expandedGroups !== undefined ? expandedGroups ;
|
|
76
|
+
const currentCollapsed = collapsed !== undefined ? collapsed : internalCollapsed;
|
|
77
|
+
const currentExpandedGroups = expandedGroups !== undefined ? expandedGroups : internalExpandedGroups;
|
|
74
78
|
|
|
75
79
|
// Handle responsive behavior
|
|
76
80
|
useEffect(() => {
|
|
77
81
|
const handleResize = () => {
|
|
78
|
-
const breakpointWidth = breakpoint === 'sm' ? 640 === 'md' ? 768 === 'lg' ? 1024 ;
|
|
82
|
+
const breakpointWidth = breakpoint === 'sm' ? 640 : breakpoint === 'md' ? 768 : breakpoint === 'lg' ? 1024 : 1280;
|
|
79
83
|
setIsMobile(window.innerWidth < breakpointWidth);
|
|
80
84
|
};
|
|
81
85
|
|
|
@@ -93,7 +97,7 @@ export const Sidebar= ({
|
|
|
93
97
|
|
|
94
98
|
// Handle escape key for overlay
|
|
95
99
|
useEffect(() => {
|
|
96
|
-
const handleEscape = (event) => {
|
|
100
|
+
const handleEscape = (event: KeyboardEvent) => {
|
|
97
101
|
if (event.key === 'Escape' && isOverlayOpen && overlayCloseOnEscape) {
|
|
98
102
|
setIsOverlayOpen(false);
|
|
99
103
|
}
|
|
@@ -122,10 +126,10 @@ export const Sidebar= ({
|
|
|
122
126
|
}
|
|
123
127
|
}, [collapsed, currentCollapsed, collapsible, onCollapseChange]);
|
|
124
128
|
|
|
125
|
-
const handleGroupToggle = useCallback((groupId) => {
|
|
129
|
+
const handleGroupToggle = useCallback((groupId: string) => {
|
|
126
130
|
const newExpandedGroups = currentExpandedGroups.includes(groupId)
|
|
127
131
|
? currentExpandedGroups.filter(id => id !== groupId)
|
|
128
|
-
, groupId];
|
|
132
|
+
: [...currentExpandedGroups, groupId];
|
|
129
133
|
|
|
130
134
|
if (expandedGroups === undefined) {
|
|
131
135
|
setInternalExpandedGroups(newExpandedGroups);
|
|
@@ -136,7 +140,7 @@ export const Sidebar= ({
|
|
|
136
140
|
}
|
|
137
141
|
}, [currentExpandedGroups, expandedGroups, onGroupToggle]);
|
|
138
142
|
|
|
139
|
-
const handleItemClick = useCallback((item) => {
|
|
143
|
+
const handleItemClick = useCallback((item: NavigationItem) => {
|
|
140
144
|
if (item.disabled) return;
|
|
141
145
|
|
|
142
146
|
if (onItemClick) {
|
|
@@ -161,19 +165,27 @@ export const Sidebar= ({
|
|
|
161
165
|
if (currentCollapsed) return 'sidebar--collapsed';
|
|
162
166
|
|
|
163
167
|
switch (size) {
|
|
164
|
-
case 'sm'
|
|
165
|
-
|
|
166
|
-
case '
|
|
167
|
-
|
|
168
|
+
case 'sm':
|
|
169
|
+
return 'sidebar--size-sm';
|
|
170
|
+
case 'lg':
|
|
171
|
+
return 'sidebar--size-lg';
|
|
172
|
+
case 'xl':
|
|
173
|
+
return 'sidebar--size-xl';
|
|
174
|
+
default: // md
|
|
175
|
+
return 'sidebar--size-md';
|
|
168
176
|
}
|
|
169
177
|
};
|
|
170
178
|
|
|
171
179
|
const getVariantClasses = () => {
|
|
172
180
|
switch (variant) {
|
|
173
|
-
case 'collapsible'
|
|
174
|
-
|
|
175
|
-
case '
|
|
176
|
-
|
|
181
|
+
case 'collapsible':
|
|
182
|
+
return 'sidebar--collapsible';
|
|
183
|
+
case 'overlay':
|
|
184
|
+
return 'sidebar--overlay';
|
|
185
|
+
case 'drawer':
|
|
186
|
+
return 'sidebar--drawer';
|
|
187
|
+
default: // default
|
|
188
|
+
return 'sidebar--default';
|
|
177
189
|
}
|
|
178
190
|
};
|
|
179
191
|
|
|
@@ -183,7 +195,7 @@ export const Sidebar= ({
|
|
|
183
195
|
|
|
184
196
|
const getPositionClasses = () => {
|
|
185
197
|
if (variant === 'overlay' || variant === 'drawer') {
|
|
186
|
-
return position === 'right' ? 'sidebar--position-right' ;
|
|
198
|
+
return position === 'right' ? 'sidebar--position-right' : 'sidebar--position-left';
|
|
187
199
|
}
|
|
188
200
|
return '';
|
|
189
201
|
};
|
|
@@ -191,16 +203,17 @@ export const Sidebar= ({
|
|
|
191
203
|
const getTransformClasses = () => {
|
|
192
204
|
if (variant === 'overlay' || variant === 'drawer' || (isMobile && overlay)) {
|
|
193
205
|
if (position === 'right') {
|
|
194
|
-
return isOverlayOpen ? 'sidebar--open' ;
|
|
206
|
+
return isOverlayOpen ? 'sidebar--open' : 'sidebar--closed-right';
|
|
195
207
|
}
|
|
196
|
-
return isOverlayOpen ? 'sidebar--open' ;
|
|
208
|
+
return isOverlayOpen ? 'sidebar--open' : 'sidebar--closed-left';
|
|
197
209
|
}
|
|
198
210
|
return '';
|
|
199
211
|
};
|
|
200
212
|
|
|
201
|
-
const getItemClasses = (item) => {
|
|
213
|
+
const getItemClasses = (item: NavigationItem) => {
|
|
202
214
|
let classes = `sidebar__item ${
|
|
203
|
-
currentCollapsed ? 'sidebar__item--collapsed'
|
|
215
|
+
currentCollapsed ? 'sidebar__item--collapsed' : 'sidebar__item--expanded'
|
|
216
|
+
}`;
|
|
204
217
|
|
|
205
218
|
if (item.disabled) {
|
|
206
219
|
classes += ' sidebar__item--disabled';
|
|
@@ -213,7 +226,7 @@ export const Sidebar= ({
|
|
|
213
226
|
return classes;
|
|
214
227
|
};
|
|
215
228
|
|
|
216
|
-
const getGroupClasses = (groupId) => {
|
|
229
|
+
const getGroupClasses = (groupId: string) => {
|
|
217
230
|
const isExpanded = currentExpandedGroups.includes(groupId);
|
|
218
231
|
let classes = 'sidebar__group';
|
|
219
232
|
|
|
@@ -226,16 +239,16 @@ export const Sidebar= ({
|
|
|
226
239
|
return classes;
|
|
227
240
|
};
|
|
228
241
|
|
|
229
|
-
const renderMenuItem = (item) => (
|
|
242
|
+
const renderMenuItem = (item: NavigationItem) => (
|
|
230
243
|
<button
|
|
231
244
|
key={item.id}
|
|
232
245
|
onClick={() => handleItemClick(item)}
|
|
233
246
|
disabled={item.disabled}
|
|
234
247
|
className={getItemClasses(item)}
|
|
235
|
-
title={currentCollapsed ? item.label }
|
|
248
|
+
title={currentCollapsed ? item.label : undefined}
|
|
236
249
|
>
|
|
237
250
|
{showItemIcons && item.icon && (
|
|
238
|
-
<span className={`sidebar__item-icon ${currentCollapsed ? 'sidebar__item-icon--collapsed' }`}>
|
|
251
|
+
<span className={`sidebar__item-icon ${currentCollapsed ? 'sidebar__item-icon--collapsed' : 'sidebar__item-icon--expanded'}`}>
|
|
239
252
|
{item.icon}
|
|
240
253
|
</span>
|
|
241
254
|
)}
|
|
@@ -255,16 +268,16 @@ export const Sidebar= ({
|
|
|
255
268
|
</button>
|
|
256
269
|
);
|
|
257
270
|
|
|
258
|
-
const renderMenuGroup = (group) => (
|
|
271
|
+
const renderMenuGroup = (group: NavigationGroup) => (
|
|
259
272
|
<div key={group.id}>
|
|
260
273
|
<button
|
|
261
274
|
onClick={() => handleGroupToggle(group.id)}
|
|
262
275
|
className={getGroupClasses(group.id)}
|
|
263
|
-
title={currentCollapsed ? group.title }
|
|
276
|
+
title={currentCollapsed ? group.title : undefined}
|
|
264
277
|
>
|
|
265
|
-
{/* TODO}
|
|
278
|
+
{/* TODO: Add icon support to NavigationGroup in future version */}
|
|
266
279
|
{/* {showGroupIcons && group.icon && (
|
|
267
|
-
<span className={currentCollapsed ? '' }>
|
|
280
|
+
<span className={currentCollapsed ? '' : 'mr-3'}>
|
|
268
281
|
{group.icon}
|
|
269
282
|
</span>
|
|
270
283
|
)} */}
|
|
@@ -274,7 +287,8 @@ export const Sidebar= ({
|
|
|
274
287
|
<div className="sidebar__group-title">{group.title}</div>
|
|
275
288
|
<ChevronRightIcon
|
|
276
289
|
className={`sidebar__group-arrow ${
|
|
277
|
-
currentExpandedGroups.includes(group.id) ? 'sidebar__group-arrow--expanded'
|
|
290
|
+
currentExpandedGroups.includes(group.id) ? 'sidebar__group-arrow--expanded' : ''
|
|
291
|
+
}`}
|
|
278
292
|
/>
|
|
279
293
|
</>
|
|
280
294
|
)}
|
|
@@ -308,16 +322,16 @@ export const Sidebar= ({
|
|
|
308
322
|
<button
|
|
309
323
|
onClick={handleCollapseToggle}
|
|
310
324
|
className="sidebar__toggle-button"
|
|
311
|
-
aria-label={currentCollapsed ? 'Expand sidebar' }
|
|
325
|
+
aria-label={currentCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}
|
|
312
326
|
>
|
|
313
|
-
{toggleIcon || (currentCollapsed ? <ChevronRightIcon className="sidebar__toggle-icon" /> ="sidebar__toggle-icon" />)}
|
|
327
|
+
{toggleIcon || (currentCollapsed ? <ChevronRightIcon className="sidebar__toggle-icon" /> : <ChevronLeftIcon className="sidebar__toggle-icon" />)}
|
|
314
328
|
</button>
|
|
315
329
|
</div>
|
|
316
330
|
)}
|
|
317
331
|
|
|
318
332
|
{/* Navigation Items */}
|
|
319
333
|
<nav className="sidebar__navigation">
|
|
320
|
-
{groups && groups.length > 0 ? groups.map(renderMenuGroup) )}
|
|
334
|
+
{groups && groups.length > 0 ? groups.map(renderMenuGroup) : items.map(renderMenuItem)}
|
|
321
335
|
</nav>
|
|
322
336
|
|
|
323
337
|
{/* Footer */}
|
|
@@ -337,7 +351,7 @@ export const Sidebar= ({
|
|
|
337
351
|
{isOverlayOpen && (
|
|
338
352
|
<div
|
|
339
353
|
className="sidebar__overlay-backdrop"
|
|
340
|
-
onClick={overlayCloseOnOutsideClick ? handleOverlayClose }
|
|
354
|
+
onClick={overlayCloseOnOutsideClick ? handleOverlayClose : undefined}
|
|
341
355
|
/>
|
|
342
356
|
)}
|
|
343
357
|
|
|
@@ -360,7 +374,7 @@ export const Sidebar= ({
|
|
|
360
374
|
|
|
361
375
|
// Desktop sidebar
|
|
362
376
|
return (
|
|
363
|
-
<div className={`sidebar__wrapper ${sticky ? 'sidebar__wrapper--sticky' }`}>
|
|
377
|
+
<div className={`sidebar__wrapper ${sticky ? 'sidebar__wrapper--sticky' : ''}`}>
|
|
364
378
|
{sidebarContent}
|
|
365
379
|
</div>
|
|
366
380
|
);
|