@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,7 +8,7 @@ import { useState, useMemo } from 'react';
|
|
|
8
8
|
import { ChevronRightIcon, HomeIcon } from '@heroicons/react/24/outline';
|
|
9
9
|
import { BreadcrumbProps, BreadcrumbItem } from './types';
|
|
10
10
|
|
|
11
|
-
export const Breadcrumb= ({
|
|
11
|
+
export const Breadcrumb: React.FC<BreadcrumbProps> = ({
|
|
12
12
|
items,
|
|
13
13
|
separator = <ChevronRightIcon className="w-4 h-4" />,
|
|
14
14
|
maxItems = 5,
|
|
@@ -18,7 +18,7 @@ export const Breadcrumb= ({
|
|
|
18
18
|
truncate = true,
|
|
19
19
|
responsive = true,
|
|
20
20
|
className = '',
|
|
21
|
-
'data-testid'= 'breadcrumb',
|
|
21
|
+
'data-testid': testId = 'breadcrumb',
|
|
22
22
|
}) => {
|
|
23
23
|
const [isExpanded, setIsExpanded] = useState(false);
|
|
24
24
|
|
|
@@ -38,12 +38,12 @@ export const Breadcrumb= ({
|
|
|
38
38
|
|
|
39
39
|
return [
|
|
40
40
|
...firstItems,
|
|
41
|
-
{ id, label, disabled},
|
|
41
|
+
{ id: 'ellipsis', label: '...', disabled: true },
|
|
42
42
|
...lastItems,
|
|
43
43
|
];
|
|
44
44
|
}, [items, maxItems, truncate, isExpanded]);
|
|
45
45
|
|
|
46
|
-
const handleItemClick = (item) => {
|
|
46
|
+
const handleItemClick = (item: BreadcrumbItem) => {
|
|
47
47
|
if (item.disabled || item.id === 'ellipsis') return;
|
|
48
48
|
|
|
49
49
|
if (onItemClick) {
|
|
@@ -59,7 +59,7 @@ export const Breadcrumb= ({
|
|
|
59
59
|
return 'breadcrumb breadcrumb--stan-design';
|
|
60
60
|
};
|
|
61
61
|
|
|
62
|
-
const getItemClasses = (item, isLast) => {
|
|
62
|
+
const getItemClasses = (item: BreadcrumbItem, isLast: boolean) => {
|
|
63
63
|
const baseClasses = 'breadcrumb__item-button';
|
|
64
64
|
|
|
65
65
|
if (item.disabled) {
|
|
@@ -86,8 +86,8 @@ export const Breadcrumb= ({
|
|
|
86
86
|
{showHome && (
|
|
87
87
|
<>
|
|
88
88
|
<button
|
|
89
|
-
onClick={() => handleItemClick({ id, label, href})}
|
|
90
|
-
className={`breadcrumb__home-button ${getItemClasses({ id, label} as BreadcrumbItem, false)}`}
|
|
89
|
+
onClick={() => handleItemClick({ id: 'home', label: 'Home', href: '/' })}
|
|
90
|
+
className={`breadcrumb__home-button ${getItemClasses({ id: 'home', label: 'Home' } as BreadcrumbItem, false)}`}
|
|
91
91
|
aria-label="Go to home page"
|
|
92
92
|
>
|
|
93
93
|
<span className="breadcrumb__icon">{homeIcon}</span>
|
|
@@ -117,20 +117,23 @@ export const Breadcrumb= ({
|
|
|
117
117
|
<button
|
|
118
118
|
onClick={handleExpandToggle}
|
|
119
119
|
className="breadcrumb__ellipsis"
|
|
120
|
-
aria-label={isExpanded ? 'Collapse breadcrumbs' }
|
|
120
|
+
aria-label={isExpanded ? 'Collapse breadcrumbs' : 'Expand breadcrumbs'}
|
|
121
121
|
>
|
|
122
122
|
{item.label}
|
|
123
123
|
</button>
|
|
124
|
-
)
|
|
124
|
+
) : (
|
|
125
|
+
<button
|
|
126
|
+
onClick={() => handleItemClick(item)}
|
|
125
127
|
className={getItemClasses(item, isLast)}
|
|
126
128
|
disabled={item.disabled}
|
|
127
|
-
aria-current={isLast ? 'page' }
|
|
128
|
-
aria-label={item.href ? `Navigate to ${item.label}` }
|
|
129
|
+
aria-current={isLast ? 'page' : undefined}
|
|
130
|
+
aria-label={item.href ? `Navigate to ${item.label}` : item.label}
|
|
129
131
|
>
|
|
130
132
|
{item.icon && <span className="breadcrumb__icon">{item.icon}</span>}
|
|
131
133
|
{responsive && window.innerWidth < 640 ? (
|
|
132
134
|
<span className="breadcrumb__item-label">{item.label}</span>
|
|
133
|
-
)
|
|
135
|
+
) : (
|
|
136
|
+
<span className="breadcrumb__item-label">{item.label}</span>
|
|
134
137
|
)}
|
|
135
138
|
</button>
|
|
136
139
|
)}
|
|
@@ -143,9 +146,9 @@ export const Breadcrumb= ({
|
|
|
143
146
|
<button
|
|
144
147
|
onClick={handleExpandToggle}
|
|
145
148
|
className={`breadcrumb__expand-toggle breadcrumb__expand-toggle--semantic`}
|
|
146
|
-
aria-label={isExpanded ? 'Show fewer breadcrumbs' }
|
|
149
|
+
aria-label={isExpanded ? 'Show fewer breadcrumbs' : 'Show all breadcrumbs'}
|
|
147
150
|
>
|
|
148
|
-
{isExpanded ? 'Show Less' }
|
|
151
|
+
{isExpanded ? 'Show Less' : 'Show All'}
|
|
149
152
|
</button>
|
|
150
153
|
)}
|
|
151
154
|
</nav>
|
|
@@ -8,36 +8,36 @@ import { useState, useCallback, useMemo, useRef, useEffect } from 'react';
|
|
|
8
8
|
import { MenuProps, NavigationItem, NavigationGroup } from './types';
|
|
9
9
|
|
|
10
10
|
// Simple icon components
|
|
11
|
-
const ChevronDownIcon}> = ({ className = '' }) => (
|
|
11
|
+
const ChevronDownIcon: 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="M19 9l-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
|
-
const MagnifyingGlassIcon}> = ({ className = '' }) => (
|
|
23
|
+
const MagnifyingGlassIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
24
24
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
25
25
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
|
|
26
26
|
</svg>
|
|
27
27
|
);
|
|
28
28
|
|
|
29
|
-
const FunnelIcon}> = ({ className = '' }) => (
|
|
29
|
+
const FunnelIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
30
30
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
31
31
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z" />
|
|
32
32
|
</svg>
|
|
33
33
|
);
|
|
34
34
|
|
|
35
|
-
export const Menu= ({
|
|
35
|
+
export const Menu: React.FC<MenuProps> = ({
|
|
36
36
|
items = [],
|
|
37
37
|
groups,
|
|
38
38
|
variant = 'dropdown',
|
|
39
39
|
size = 'md',
|
|
40
|
-
// TODO, trigger, showArrow, and fullWidth in future version
|
|
40
|
+
// TODO: Implement orientation, trigger, showArrow, and fullWidth in future version
|
|
41
41
|
// orientation = 'horizontal',
|
|
42
42
|
// trigger = 'click',
|
|
43
43
|
placement = 'bottom',
|
|
@@ -55,23 +55,24 @@ export const Menu= ({
|
|
|
55
55
|
selectedItems = [],
|
|
56
56
|
onSelectionChange,
|
|
57
57
|
className = '',
|
|
58
|
-
'data-testid'= 'menu',
|
|
58
|
+
'data-testid': testId = 'menu',
|
|
59
59
|
}) => {
|
|
60
60
|
const [isOpen, setIsOpen] = useState(false);
|
|
61
61
|
const [searchQuery, setSearchQuery] = useState('');
|
|
62
62
|
const [filterValue, setFilterValue] = useState('');
|
|
63
63
|
const [internalSelectedItems, setInternalSelectedItems] = useState<string[]>(selectedItems || []);
|
|
64
|
-
// TODO
|
|
64
|
+
// TODO: Implement group expansion functionality in future version
|
|
65
|
+
// const [expandedGroups, setExpandedGroups] = useState<string[]>([]);
|
|
65
66
|
|
|
66
67
|
const menuRef = useRef<HTMLDivElement>(null);
|
|
67
68
|
const triggerRef = useRef<HTMLButtonElement>(null);
|
|
68
69
|
|
|
69
70
|
// Use controlled or uncontrolled selected items
|
|
70
|
-
const currentSelectedItems = selectedItems !== undefined ? selectedItems ;
|
|
71
|
+
const currentSelectedItems = selectedItems !== undefined ? selectedItems : internalSelectedItems;
|
|
71
72
|
|
|
72
73
|
// Handle click outside to close menu
|
|
73
74
|
useEffect(() => {
|
|
74
|
-
const handleClickOutside = (event) => {
|
|
75
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
75
76
|
if (menuRef.current && !menuRef.current.contains(event.target as Node) &&
|
|
76
77
|
triggerRef.current && !triggerRef.current.contains(event.target as Node)) {
|
|
77
78
|
setIsOpen(false);
|
|
@@ -89,7 +90,7 @@ export const Menu= ({
|
|
|
89
90
|
|
|
90
91
|
// Handle escape key to close menu
|
|
91
92
|
useEffect(() => {
|
|
92
|
-
const handleEscape = (event) => {
|
|
93
|
+
const handleEscape = (event: KeyboardEvent) => {
|
|
93
94
|
if (event.key === 'Escape') {
|
|
94
95
|
setIsOpen(false);
|
|
95
96
|
}
|
|
@@ -109,11 +110,11 @@ export const Menu= ({
|
|
|
109
110
|
setIsOpen(!isOpen);
|
|
110
111
|
}, [disabled, loading, isOpen]);
|
|
111
112
|
|
|
112
|
-
const handleItemClick = useCallback((item) => {
|
|
113
|
+
const handleItemClick = useCallback((item: NavigationItem) => {
|
|
113
114
|
if (item.disabled) return;
|
|
114
115
|
|
|
115
116
|
if (selectable) {
|
|
116
|
-
let newSelectedItems];
|
|
117
|
+
let newSelectedItems: string[];
|
|
117
118
|
|
|
118
119
|
if (multiSelect) {
|
|
119
120
|
if (currentSelectedItems.includes(item.id)) {
|
|
@@ -144,22 +145,23 @@ export const Menu= ({
|
|
|
144
145
|
}
|
|
145
146
|
}, [selectable, multiSelect, currentSelectedItems, selectedItems, onSelectionChange]);
|
|
146
147
|
|
|
147
|
-
// TODO
|
|
148
|
+
// TODO: Implement group toggle functionality in future version
|
|
149
|
+
// const handleGroupToggle = useCallback((groupId: string) => {
|
|
148
150
|
// setExpandedGroups(prev =>
|
|
149
151
|
// prev.includes(groupId)
|
|
150
152
|
// ? prev.filter(id => id !== groupId)
|
|
151
|
-
// , groupId]
|
|
153
|
+
// : [...prev, groupId]
|
|
152
154
|
// );
|
|
153
155
|
// }, []);
|
|
154
156
|
|
|
155
|
-
const handleSearch = useCallback((query) => {
|
|
157
|
+
const handleSearch = useCallback((query: string) => {
|
|
156
158
|
setSearchQuery(query);
|
|
157
159
|
if (onSearch) {
|
|
158
160
|
onSearch(query);
|
|
159
161
|
}
|
|
160
162
|
}, [onSearch]);
|
|
161
163
|
|
|
162
|
-
const handleFilter = useCallback((filter) => {
|
|
164
|
+
const handleFilter = useCallback((filter: string) => {
|
|
163
165
|
setFilterValue(filter);
|
|
164
166
|
if (onFilter) {
|
|
165
167
|
onFilter(filter);
|
|
@@ -188,18 +190,25 @@ export const Menu= ({
|
|
|
188
190
|
|
|
189
191
|
const getSizeClasses = () => {
|
|
190
192
|
switch (size) {
|
|
191
|
-
case 'sm'
|
|
192
|
-
|
|
193
|
-
|
|
193
|
+
case 'sm':
|
|
194
|
+
return 'menu__trigger--sm';
|
|
195
|
+
case 'lg':
|
|
196
|
+
return 'menu__trigger--lg';
|
|
197
|
+
default: // md
|
|
198
|
+
return 'menu__trigger--md';
|
|
194
199
|
}
|
|
195
200
|
};
|
|
196
201
|
|
|
197
202
|
const getVariantClasses = () => {
|
|
198
203
|
switch (variant) {
|
|
199
|
-
case 'dropdown'
|
|
200
|
-
|
|
201
|
-
case '
|
|
202
|
-
|
|
204
|
+
case 'dropdown':
|
|
205
|
+
return 'menu__content--dropdown';
|
|
206
|
+
case 'context':
|
|
207
|
+
return 'menu__content--context';
|
|
208
|
+
case 'command':
|
|
209
|
+
return 'menu__content--command';
|
|
210
|
+
default: // default
|
|
211
|
+
return 'menu__content--default';
|
|
203
212
|
}
|
|
204
213
|
};
|
|
205
214
|
|
|
@@ -207,7 +216,7 @@ export const Menu= ({
|
|
|
207
216
|
return 'menu menu--stan-design';
|
|
208
217
|
};
|
|
209
218
|
|
|
210
|
-
const getItemClasses = (item) => {
|
|
219
|
+
const getItemClasses = (item: NavigationItem) => {
|
|
211
220
|
let classes = `menu__item ${getSizeClasses()}`;
|
|
212
221
|
|
|
213
222
|
if (item.disabled) {
|
|
@@ -223,15 +232,20 @@ export const Menu= ({
|
|
|
223
232
|
|
|
224
233
|
const getPlacementClasses = () => {
|
|
225
234
|
switch (placement) {
|
|
226
|
-
case 'top'
|
|
227
|
-
|
|
228
|
-
case '
|
|
229
|
-
|
|
230
|
-
|
|
235
|
+
case 'top':
|
|
236
|
+
return 'menu__content--placement-top';
|
|
237
|
+
case 'bottom':
|
|
238
|
+
return 'menu__content--placement-bottom';
|
|
239
|
+
case 'left':
|
|
240
|
+
return 'menu__content--placement-left';
|
|
241
|
+
case 'right':
|
|
242
|
+
return 'menu__content--placement-right';
|
|
243
|
+
default:
|
|
244
|
+
return 'menu__content--placement-bottom';
|
|
231
245
|
}
|
|
232
246
|
};
|
|
233
247
|
|
|
234
|
-
const renderMenuItem = (item) => (
|
|
248
|
+
const renderMenuItem = (item: NavigationItem) => (
|
|
235
249
|
<button
|
|
236
250
|
key={item.id}
|
|
237
251
|
onClick={() => handleItemClick(item)}
|
|
@@ -254,7 +268,7 @@ export const Menu= ({
|
|
|
254
268
|
</button>
|
|
255
269
|
);
|
|
256
270
|
|
|
257
|
-
const renderMenuGroup = (group) => (
|
|
271
|
+
const renderMenuGroup = (group: NavigationGroup) => (
|
|
258
272
|
<div key={group.id} className="menu__group">
|
|
259
273
|
{group.title && (
|
|
260
274
|
<div className="menu__group-title">
|
|
@@ -286,7 +300,7 @@ export const Menu= ({
|
|
|
286
300
|
ref={menuRef}
|
|
287
301
|
role="menu"
|
|
288
302
|
className={`menu__content ${getVariantClasses()} ${getPlacementClasses()}`}
|
|
289
|
-
style={{ marginTop=== 'bottom' ? offset }}
|
|
303
|
+
style={{ marginTop: placement === 'bottom' ? offset : undefined }}
|
|
290
304
|
>
|
|
291
305
|
{/* Search Bar */}
|
|
292
306
|
{searchable && (
|
|
@@ -324,7 +338,7 @@ export const Menu= ({
|
|
|
324
338
|
|
|
325
339
|
{/* Menu Items */}
|
|
326
340
|
<div className="menu__items">
|
|
327
|
-
{groups ? groups.map(renderMenuGroup) )}
|
|
341
|
+
{groups ? groups.map(renderMenuGroup) : filteredItems.map(renderMenuItem)}
|
|
328
342
|
</div>
|
|
329
343
|
|
|
330
344
|
{/* Selection Actions */}
|
|
@@ -336,7 +350,7 @@ export const Menu= ({
|
|
|
336
350
|
</span>
|
|
337
351
|
<button
|
|
338
352
|
onClick={() => {
|
|
339
|
-
const newSelectedItems] = [];
|
|
353
|
+
const newSelectedItems: string[] = [];
|
|
340
354
|
if (selectedItems === undefined) {
|
|
341
355
|
setInternalSelectedItems(newSelectedItems);
|
|
342
356
|
}
|
|
@@ -8,36 +8,36 @@ import { useState, useCallback, useMemo, useRef, useEffect } from 'react';
|
|
|
8
8
|
import { MenuProps, NavigationItem, NavigationGroup } from './types';
|
|
9
9
|
|
|
10
10
|
// Simple icon components
|
|
11
|
-
const ChevronDownIcon}> = ({ className = '' }) => (
|
|
11
|
+
const ChevronDownIcon: 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="M19 9l-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
|
-
const MagnifyingGlassIcon}> = ({ className = '' }) => (
|
|
23
|
+
const MagnifyingGlassIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
24
24
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
25
25
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
|
|
26
26
|
</svg>
|
|
27
27
|
);
|
|
28
28
|
|
|
29
|
-
const FunnelIcon}> = ({ className = '' }) => (
|
|
29
|
+
const FunnelIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
30
30
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
31
31
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z" />
|
|
32
32
|
</svg>
|
|
33
33
|
);
|
|
34
34
|
|
|
35
|
-
export const Menu= ({
|
|
35
|
+
export const Menu: React.FC<MenuProps> = ({
|
|
36
36
|
items = [],
|
|
37
37
|
groups,
|
|
38
38
|
variant = 'dropdown',
|
|
39
39
|
size = 'md',
|
|
40
|
-
// TODO, trigger, showArrow, and fullWidth in future version
|
|
40
|
+
// TODO: Implement orientation, trigger, showArrow, and fullWidth in future version
|
|
41
41
|
// orientation = 'horizontal',
|
|
42
42
|
// trigger = 'click',
|
|
43
43
|
placement = 'bottom',
|
|
@@ -55,23 +55,24 @@ export const Menu= ({
|
|
|
55
55
|
selectedItems = [],
|
|
56
56
|
onSelectionChange,
|
|
57
57
|
className = '',
|
|
58
|
-
'data-testid'= 'menu',
|
|
58
|
+
'data-testid': testId = 'menu',
|
|
59
59
|
}) => {
|
|
60
60
|
const [isOpen, setIsOpen] = useState(false);
|
|
61
61
|
const [searchQuery, setSearchQuery] = useState('');
|
|
62
62
|
const [filterValue, setFilterValue] = useState('');
|
|
63
63
|
const [internalSelectedItems, setInternalSelectedItems] = useState<string[]>(selectedItems || []);
|
|
64
|
-
// TODO
|
|
64
|
+
// TODO: Implement group expansion functionality in future version
|
|
65
|
+
// const [expandedGroups, setExpandedGroups] = useState<string[]>([]);
|
|
65
66
|
|
|
66
67
|
const menuRef = useRef<HTMLDivElement>(null);
|
|
67
68
|
const triggerRef = useRef<HTMLButtonElement>(null);
|
|
68
69
|
|
|
69
70
|
// Use controlled or uncontrolled selected items
|
|
70
|
-
const currentSelectedItems = selectedItems !== undefined ? selectedItems ;
|
|
71
|
+
const currentSelectedItems = selectedItems !== undefined ? selectedItems : internalSelectedItems;
|
|
71
72
|
|
|
72
73
|
// Handle click outside to close menu
|
|
73
74
|
useEffect(() => {
|
|
74
|
-
const handleClickOutside = (event) => {
|
|
75
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
75
76
|
if (menuRef.current && !menuRef.current.contains(event.target as Node) &&
|
|
76
77
|
triggerRef.current && !triggerRef.current.contains(event.target as Node)) {
|
|
77
78
|
setIsOpen(false);
|
|
@@ -89,7 +90,7 @@ export const Menu= ({
|
|
|
89
90
|
|
|
90
91
|
// Handle escape key to close menu
|
|
91
92
|
useEffect(() => {
|
|
92
|
-
const handleEscape = (event) => {
|
|
93
|
+
const handleEscape = (event: KeyboardEvent) => {
|
|
93
94
|
if (event.key === 'Escape') {
|
|
94
95
|
setIsOpen(false);
|
|
95
96
|
}
|
|
@@ -109,11 +110,11 @@ export const Menu= ({
|
|
|
109
110
|
setIsOpen(!isOpen);
|
|
110
111
|
}, [disabled, loading, isOpen]);
|
|
111
112
|
|
|
112
|
-
const handleItemClick = useCallback((item) => {
|
|
113
|
+
const handleItemClick = useCallback((item: NavigationItem) => {
|
|
113
114
|
if (item.disabled) return;
|
|
114
115
|
|
|
115
116
|
if (selectable) {
|
|
116
|
-
let newSelectedItems];
|
|
117
|
+
let newSelectedItems: string[];
|
|
117
118
|
|
|
118
119
|
if (multiSelect) {
|
|
119
120
|
if (currentSelectedItems.includes(item.id)) {
|
|
@@ -144,22 +145,23 @@ export const Menu= ({
|
|
|
144
145
|
}
|
|
145
146
|
}, [selectable, multiSelect, currentSelectedItems, selectedItems, onSelectionChange]);
|
|
146
147
|
|
|
147
|
-
// TODO
|
|
148
|
+
// TODO: Implement group toggle functionality in future version
|
|
149
|
+
// const handleGroupToggle = useCallback((groupId: string) => {
|
|
148
150
|
// setExpandedGroups(prev =>
|
|
149
151
|
// prev.includes(groupId)
|
|
150
152
|
// ? prev.filter(id => id !== groupId)
|
|
151
|
-
// , groupId]
|
|
153
|
+
// : [...prev, groupId]
|
|
152
154
|
// );
|
|
153
155
|
// }, []);
|
|
154
156
|
|
|
155
|
-
const handleSearch = useCallback((query) => {
|
|
157
|
+
const handleSearch = useCallback((query: string) => {
|
|
156
158
|
setSearchQuery(query);
|
|
157
159
|
if (onSearch) {
|
|
158
160
|
onSearch(query);
|
|
159
161
|
}
|
|
160
162
|
}, [onSearch]);
|
|
161
163
|
|
|
162
|
-
const handleFilter = useCallback((filter) => {
|
|
164
|
+
const handleFilter = useCallback((filter: string) => {
|
|
163
165
|
setFilterValue(filter);
|
|
164
166
|
if (onFilter) {
|
|
165
167
|
onFilter(filter);
|
|
@@ -188,18 +190,25 @@ export const Menu= ({
|
|
|
188
190
|
|
|
189
191
|
const getSizeClasses = () => {
|
|
190
192
|
switch (size) {
|
|
191
|
-
case 'sm'
|
|
192
|
-
|
|
193
|
-
|
|
193
|
+
case 'sm':
|
|
194
|
+
return 'menu__trigger--sm';
|
|
195
|
+
case 'lg':
|
|
196
|
+
return 'menu__trigger--lg';
|
|
197
|
+
default: // md
|
|
198
|
+
return 'menu__trigger--md';
|
|
194
199
|
}
|
|
195
200
|
};
|
|
196
201
|
|
|
197
202
|
const getVariantClasses = () => {
|
|
198
203
|
switch (variant) {
|
|
199
|
-
case 'dropdown'
|
|
200
|
-
|
|
201
|
-
case '
|
|
202
|
-
|
|
204
|
+
case 'dropdown':
|
|
205
|
+
return 'menu__content--dropdown';
|
|
206
|
+
case 'context':
|
|
207
|
+
return 'menu__content--context';
|
|
208
|
+
case 'command':
|
|
209
|
+
return 'menu__content--command';
|
|
210
|
+
default: // default
|
|
211
|
+
return 'menu__content--default';
|
|
203
212
|
}
|
|
204
213
|
};
|
|
205
214
|
|
|
@@ -207,7 +216,7 @@ export const Menu= ({
|
|
|
207
216
|
return 'menu menu--stan-design';
|
|
208
217
|
};
|
|
209
218
|
|
|
210
|
-
const getItemClasses = (item) => {
|
|
219
|
+
const getItemClasses = (item: NavigationItem) => {
|
|
211
220
|
let classes = `menu__item ${getSizeClasses()}`;
|
|
212
221
|
|
|
213
222
|
if (item.disabled) {
|
|
@@ -223,15 +232,20 @@ export const Menu= ({
|
|
|
223
232
|
|
|
224
233
|
const getPlacementClasses = () => {
|
|
225
234
|
switch (placement) {
|
|
226
|
-
case 'top'
|
|
227
|
-
|
|
228
|
-
case '
|
|
229
|
-
|
|
230
|
-
|
|
235
|
+
case 'top':
|
|
236
|
+
return 'menu__content--placement-top';
|
|
237
|
+
case 'bottom':
|
|
238
|
+
return 'menu__content--placement-bottom';
|
|
239
|
+
case 'left':
|
|
240
|
+
return 'menu__content--placement-left';
|
|
241
|
+
case 'right':
|
|
242
|
+
return 'menu__content--placement-right';
|
|
243
|
+
default:
|
|
244
|
+
return 'menu__content--placement-bottom';
|
|
231
245
|
}
|
|
232
246
|
};
|
|
233
247
|
|
|
234
|
-
const renderMenuItem = (item) => (
|
|
248
|
+
const renderMenuItem = (item: NavigationItem) => (
|
|
235
249
|
<button
|
|
236
250
|
key={item.id}
|
|
237
251
|
onClick={() => handleItemClick(item)}
|
|
@@ -254,7 +268,7 @@ export const Menu= ({
|
|
|
254
268
|
</button>
|
|
255
269
|
);
|
|
256
270
|
|
|
257
|
-
const renderMenuGroup = (group) => (
|
|
271
|
+
const renderMenuGroup = (group: NavigationGroup) => (
|
|
258
272
|
<div key={group.id} className="menu__group">
|
|
259
273
|
{group.title && (
|
|
260
274
|
<div className="menu__group-title">
|
|
@@ -286,7 +300,7 @@ export const Menu= ({
|
|
|
286
300
|
ref={menuRef}
|
|
287
301
|
role="menu"
|
|
288
302
|
className={`menu__content ${getVariantClasses()} ${getPlacementClasses()}`}
|
|
289
|
-
style={{ marginTop=== 'bottom' ? offset }}
|
|
303
|
+
style={{ marginTop: placement === 'bottom' ? offset : undefined }}
|
|
290
304
|
>
|
|
291
305
|
{/* Search Bar */}
|
|
292
306
|
{searchable && (
|
|
@@ -324,7 +338,7 @@ export const Menu= ({
|
|
|
324
338
|
|
|
325
339
|
{/* Menu Items */}
|
|
326
340
|
<div className="menu__items">
|
|
327
|
-
{groups ? groups.map(renderMenuGroup) )}
|
|
341
|
+
{groups ? groups.map(renderMenuGroup) : filteredItems.map(renderMenuItem)}
|
|
328
342
|
</div>
|
|
329
343
|
|
|
330
344
|
{/* Selection Actions */}
|
|
@@ -336,7 +350,7 @@ export const Menu= ({
|
|
|
336
350
|
</span>
|
|
337
351
|
<button
|
|
338
352
|
onClick={() => {
|
|
339
|
-
const newSelectedItems] = [];
|
|
353
|
+
const newSelectedItems: string[] = [];
|
|
340
354
|
if (selectedItems === undefined) {
|
|
341
355
|
setInternalSelectedItems(newSelectedItems);
|
|
342
356
|
}
|