@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.8 → 0.2.10
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 +23 -1
- package/dist/components/ui/navigation/index.js +23 -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 +22 -2
- package/dist/components/ui/overlay/index.js +22 -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 +289 -280
- package/dist/index.js +289 -280
- 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/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 +15 -4
- package/dist/tokens/index.js +15 -4
- 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
|
@@ -9,47 +9,48 @@ import {
|
|
|
9
9
|
} from './types';
|
|
10
10
|
|
|
11
11
|
// Simple icon components
|
|
12
|
-
const ChevronUpIcon}> = ({ className = '' }) => (
|
|
12
|
+
const ChevronUpIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
13
13
|
<svg className={`table__icon ${className}`} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
14
14
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 15l7-7 7 7" />
|
|
15
15
|
</svg>
|
|
16
16
|
);
|
|
17
17
|
|
|
18
|
-
const ChevronDownIcon}> = ({ className = '' }) => (
|
|
18
|
+
const ChevronDownIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
19
19
|
<svg className={`table__icon ${className}`} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
20
20
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
|
|
21
21
|
</svg>
|
|
22
22
|
);
|
|
23
23
|
|
|
24
|
-
const ChevronRightIcon}> = ({ className = '' }) => (
|
|
24
|
+
const ChevronRightIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
25
25
|
<svg className={`table__icon ${className}`} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
26
26
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
|
|
27
27
|
</svg>
|
|
28
28
|
);
|
|
29
29
|
|
|
30
|
-
const SearchIcon}> = ({ className = '' }) => (
|
|
30
|
+
const SearchIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
31
31
|
<svg className={`table__icon ${className}`} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
32
32
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
|
|
33
33
|
</svg>
|
|
34
34
|
);
|
|
35
35
|
|
|
36
|
-
const FilterIcon}> = ({ className = '' }) => (
|
|
36
|
+
const FilterIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
37
37
|
<svg className={`table__icon ${className}`} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
38
38
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.207A1 1 0 013 6.5V4z" />
|
|
39
39
|
</svg>
|
|
40
40
|
);
|
|
41
41
|
|
|
42
42
|
// Table Header Component
|
|
43
|
-
const TableHeader
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
const TableHeader: React.FC<{
|
|
44
|
+
columns: SortableColumn[];
|
|
45
|
+
sortable?: boolean;
|
|
46
|
+
sortConfig?: SortConfig;
|
|
47
|
+
onSort?: (config: SortConfig) => void;
|
|
48
|
+
selectable?: boolean;
|
|
49
|
+
onSelectAll?: (checked: boolean) => void;
|
|
50
|
+
allSelected?: boolean;
|
|
51
|
+
theme: 'stan-design' | 'enterprise' | 'harvey';
|
|
52
|
+
size: 'sm' | 'md' | 'lg';
|
|
53
|
+
variant: 'default' | 'bordered' | 'striped' | 'compact';
|
|
53
54
|
}> = ({
|
|
54
55
|
columns,
|
|
55
56
|
sortable,
|
|
@@ -64,11 +65,11 @@ const TableHeader];
|
|
|
64
65
|
// const themeConfig = getTheme(theme);
|
|
65
66
|
// const colors = themeConfig?.colors || getDefaultColors();
|
|
66
67
|
|
|
67
|
-
const handleSort = useCallback((column) => {
|
|
68
|
+
const handleSort = useCallback((column: SortableColumn) => {
|
|
68
69
|
if (!sortable || !onSort || !column.sortable) return;
|
|
69
70
|
|
|
70
|
-
const newDirection = sortConfig?.key === column.key && sortConfig.direction === 'asc' ? 'desc' ;
|
|
71
|
-
onSort({ key, direction});
|
|
71
|
+
const newDirection = sortConfig?.key === column.key && sortConfig.direction === 'asc' ? 'desc' : 'asc';
|
|
72
|
+
onSort({ key: column.key, direction: newDirection });
|
|
72
73
|
}, [sortable, onSort, sortConfig]);
|
|
73
74
|
|
|
74
75
|
return (
|
|
@@ -87,8 +88,8 @@ const TableHeader];
|
|
|
87
88
|
{columns.map((column) => (
|
|
88
89
|
<th
|
|
89
90
|
key={column.key}
|
|
90
|
-
className={`table__header table__header--${size} table__header--${column.align || 'left'} ${sortable && column.sortable ? 'table__header--sortable' } ${sortConfig?.key === column.key ? 'table__header--sorted' }`}
|
|
91
|
-
style={{ width}}
|
|
91
|
+
className={`table__header table__header--${size} table__header--${column.align || 'left'} ${sortable && column.sortable ? 'table__header--sortable' : ''} ${sortConfig?.key === column.key ? 'table__header--sorted' : ''}`}
|
|
92
|
+
style={{ width: column.width }}
|
|
92
93
|
onClick={() => handleSort(column)}
|
|
93
94
|
>
|
|
94
95
|
<div className={`table__header-content table__header-content--${column.align || 'left'}`}>
|
|
@@ -96,7 +97,8 @@ const TableHeader];
|
|
|
96
97
|
{sortable && column.sortable && sortConfig?.key === column.key && (
|
|
97
98
|
sortConfig.direction === 'asc' ? (
|
|
98
99
|
<ChevronUpIcon className="table__sort-icon" />
|
|
99
|
-
)
|
|
100
|
+
) : (
|
|
101
|
+
<ChevronDownIcon className="table__sort-icon" />
|
|
100
102
|
)
|
|
101
103
|
)}
|
|
102
104
|
</div>
|
|
@@ -108,7 +110,7 @@ const TableHeader];
|
|
|
108
110
|
};
|
|
109
111
|
|
|
110
112
|
// Table Row Component
|
|
111
|
-
const TableRow= ({
|
|
113
|
+
const TableRow: React.FC<TableRowProps> = ({
|
|
112
114
|
row,
|
|
113
115
|
index,
|
|
114
116
|
columns,
|
|
@@ -126,7 +128,7 @@ const TableRow= ({
|
|
|
126
128
|
|
|
127
129
|
return (
|
|
128
130
|
<tr
|
|
129
|
-
className={`table__row table__row--${size} table__row--${variant} ${selected ? 'table__row--selected' } ${variant === 'striped' && index % 2 === 1 ? 'table__row--striped' }`}
|
|
131
|
+
className={`table__row table__row--${size} table__row--${variant} ${selected ? 'table__row--selected' : ''} ${variant === 'striped' && index % 2 === 1 ? 'table__row--striped' : ''}`}
|
|
130
132
|
onClick={onClick}
|
|
131
133
|
>
|
|
132
134
|
<td className={`table__cell table__cell--select table__cell--${size}`}>
|
|
@@ -142,7 +144,7 @@ const TableRow= ({
|
|
|
142
144
|
<td
|
|
143
145
|
key={column.key}
|
|
144
146
|
className={`table__cell table__cell--${size} table__cell--${column.align || 'left'}`}
|
|
145
|
-
style={{ width}}
|
|
147
|
+
style={{ width: column.width }}
|
|
146
148
|
>
|
|
147
149
|
{column.key === 'expand' ? (
|
|
148
150
|
<button
|
|
@@ -152,11 +154,12 @@ const TableRow= ({
|
|
|
152
154
|
}}
|
|
153
155
|
className="table__expand-button"
|
|
154
156
|
>
|
|
155
|
-
<div className={`table__expand-icon ${expanded ? 'table__expand-icon--expanded' }`}>
|
|
157
|
+
<div className={`table__expand-icon ${expanded ? 'table__expand-icon--expanded' : ''}`}>
|
|
156
158
|
<ChevronRightIcon className="table__expand-chevron" />
|
|
157
159
|
</div>
|
|
158
160
|
</button>
|
|
159
|
-
)
|
|
161
|
+
) : (
|
|
162
|
+
String(row[column.key] || '')
|
|
160
163
|
)}
|
|
161
164
|
</td>
|
|
162
165
|
))}
|
|
@@ -165,12 +168,13 @@ const TableRow= ({
|
|
|
165
168
|
};
|
|
166
169
|
|
|
167
170
|
// Search and Filter Bar Component
|
|
168
|
-
const SearchFilterBar
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
171
|
+
const SearchFilterBar: React.FC<{
|
|
172
|
+
searchable?: boolean;
|
|
173
|
+
searchValue?: string;
|
|
174
|
+
onSearchChange?: (value: string) => void;
|
|
175
|
+
filters?: FilterConfig[];
|
|
176
|
+
theme: 'stan-design' | 'enterprise' | 'harvey';
|
|
177
|
+
size: 'sm' | 'md' | 'lg';
|
|
174
178
|
}> = ({
|
|
175
179
|
searchable,
|
|
176
180
|
searchValue,
|
|
@@ -207,7 +211,7 @@ const SearchFilterBar;
|
|
|
207
211
|
<FilterIcon />
|
|
208
212
|
</div>
|
|
209
213
|
<span className={`table__filter-text table__filter-text--${size}`}>
|
|
210
|
-
Filters}
|
|
214
|
+
Filters: {filters.length}
|
|
211
215
|
</span>
|
|
212
216
|
</div>
|
|
213
217
|
)}
|
|
@@ -216,11 +220,12 @@ const SearchFilterBar;
|
|
|
216
220
|
};
|
|
217
221
|
|
|
218
222
|
// Pagination Component
|
|
219
|
-
const TablePagination
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
223
|
+
const TablePagination: React.FC<{
|
|
224
|
+
pagination?: PaginationConfig;
|
|
225
|
+
onPageChange?: (page: number) => void;
|
|
226
|
+
onPageSizeChange?: (pageSize: number) => void;
|
|
227
|
+
theme: 'stan-design' | 'enterprise' | 'harvey';
|
|
228
|
+
size: 'sm' | 'md' | 'lg';
|
|
224
229
|
}> = ({ pagination, onPageChange, onPageSizeChange, size }) => {
|
|
225
230
|
// const { getTheme } = useTheme();
|
|
226
231
|
// const themeConfig = getTheme(theme);
|
|
@@ -240,7 +245,9 @@ const TablePagination;
|
|
|
240
245
|
Showing {startItem}-{endItem} of {totalItems} items
|
|
241
246
|
</span>
|
|
242
247
|
<div className="table__pagination-size">
|
|
243
|
-
<span>Items per page
|
|
248
|
+
<span>Items per page:</span>
|
|
249
|
+
<select
|
|
250
|
+
value={pageSize}
|
|
244
251
|
onChange={(e) => onPageSizeChange?.(Number(e.target.value))}
|
|
245
252
|
className={`table__pagination-select table__pagination-select--${size}`}
|
|
246
253
|
>
|
|
@@ -255,14 +262,14 @@ const TablePagination;
|
|
|
255
262
|
<button
|
|
256
263
|
onClick={() => onPageChange?.(1)}
|
|
257
264
|
disabled={currentPage === 1}
|
|
258
|
-
className={`table__pagination-button table__pagination-button--${size} ${currentPage === 1 ? 'table__pagination-button--disabled' }`}
|
|
265
|
+
className={`table__pagination-button table__pagination-button--${size} ${currentPage === 1 ? 'table__pagination-button--disabled' : ''}`}
|
|
259
266
|
>
|
|
260
267
|
First
|
|
261
268
|
</button>
|
|
262
269
|
<button
|
|
263
270
|
onClick={() => onPageChange?.(currentPage - 1)}
|
|
264
271
|
disabled={currentPage === 1}
|
|
265
|
-
className={`table__pagination-button table__pagination-button--${size} ${currentPage === 1 ? 'table__pagination-button--disabled' }`}
|
|
272
|
+
className={`table__pagination-button table__pagination-button--${size} ${currentPage === 1 ? 'table__pagination-button--disabled' : ''}`}
|
|
266
273
|
>
|
|
267
274
|
Previous
|
|
268
275
|
</button>
|
|
@@ -274,14 +281,14 @@ const TablePagination;
|
|
|
274
281
|
<button
|
|
275
282
|
onClick={() => onPageChange?.(currentPage + 1)}
|
|
276
283
|
disabled={currentPage === totalPages}
|
|
277
|
-
className={`table__pagination-button table__pagination-button--${size} ${currentPage === totalPages ? 'table__pagination-button--disabled' }`}
|
|
284
|
+
className={`table__pagination-button table__pagination-button--${size} ${currentPage === totalPages ? 'table__pagination-button--disabled' : ''}`}
|
|
278
285
|
>
|
|
279
286
|
Next
|
|
280
287
|
</button>
|
|
281
288
|
<button
|
|
282
289
|
onClick={() => onPageChange?.(totalPages)}
|
|
283
290
|
disabled={currentPage === totalPages}
|
|
284
|
-
className={`table__pagination-button table__pagination-button--${size} ${currentPage === totalPages ? 'table__pagination-button--disabled' }`}
|
|
291
|
+
className={`table__pagination-button table__pagination-button--${size} ${currentPage === totalPages ? 'table__pagination-button--disabled' : ''}`}
|
|
285
292
|
>
|
|
286
293
|
Last
|
|
287
294
|
</button>
|
|
@@ -291,7 +298,7 @@ const TablePagination;
|
|
|
291
298
|
};
|
|
292
299
|
|
|
293
300
|
// Main Table Component
|
|
294
|
-
export const Table= ({
|
|
301
|
+
export const Table: React.FC<TableProps> = ({
|
|
295
302
|
columns,
|
|
296
303
|
data,
|
|
297
304
|
sortable = false,
|
|
@@ -307,7 +314,8 @@ export const Table= ({
|
|
|
307
314
|
onPageChange,
|
|
308
315
|
onPageSizeChange,
|
|
309
316
|
filters,
|
|
310
|
-
// onFiltersChange, // TODO
|
|
317
|
+
// onFiltersChange, // TODO: Implement filters change handler
|
|
318
|
+
searchable = false,
|
|
311
319
|
searchValue,
|
|
312
320
|
onSearchChange,
|
|
313
321
|
rowKey = 'id',
|
|
@@ -332,7 +340,7 @@ export const Table= ({
|
|
|
332
340
|
const currentExpandedKeys = expandedKeys || internalExpandedKeys;
|
|
333
341
|
|
|
334
342
|
// Get row key function
|
|
335
|
-
const getRowKey = useCallback((row, any>, index)=> {
|
|
343
|
+
const getRowKey = useCallback((row: Record<string, any>, index: number): string => {
|
|
336
344
|
if (typeof rowKey === 'function') {
|
|
337
345
|
return rowKey(row);
|
|
338
346
|
}
|
|
@@ -340,9 +348,9 @@ export const Table= ({
|
|
|
340
348
|
}, [rowKey]);
|
|
341
349
|
|
|
342
350
|
// Handle row selection
|
|
343
|
-
const handleRowSelect = useCallback((row, any>, checked) => {
|
|
351
|
+
const handleRowSelect = useCallback((row: Record<string, any>, checked: boolean) => {
|
|
344
352
|
const key = getRowKey(row, 0);
|
|
345
|
-
let newSelectedKeys];
|
|
353
|
+
let newSelectedKeys: string[];
|
|
346
354
|
|
|
347
355
|
if (checked) {
|
|
348
356
|
newSelectedKeys = [...currentSelectedKeys, key];
|
|
@@ -355,26 +363,26 @@ export const Table= ({
|
|
|
355
363
|
}, [currentSelectedKeys, onSelectionChange, getRowKey]);
|
|
356
364
|
|
|
357
365
|
// Handle select all
|
|
358
|
-
const handleSelectAll = useCallback((checked) => {
|
|
359
|
-
const newSelectedKeys = checked ? data.map((row, index) => getRowKey(row, index)) ];
|
|
366
|
+
const handleSelectAll = useCallback((checked: boolean) => {
|
|
367
|
+
const newSelectedKeys = checked ? data.map((row, index) => getRowKey(row, index)) : [];
|
|
360
368
|
setInternalSelectedKeys(newSelectedKeys);
|
|
361
369
|
onSelectionChange?.(newSelectedKeys);
|
|
362
370
|
}, [data, onSelectionChange, getRowKey]);
|
|
363
371
|
|
|
364
372
|
// Handle row expansion
|
|
365
|
-
const handleRowExpand = useCallback((row, any>) => {
|
|
373
|
+
const handleRowExpand = useCallback((row: Record<string, any>) => {
|
|
366
374
|
const key = getRowKey(row, 0);
|
|
367
375
|
const expanded = currentExpandedKeys.includes(key);
|
|
368
376
|
const newExpandedKeys = expanded
|
|
369
377
|
? currentExpandedKeys.filter(k => k !== key)
|
|
370
|
-
, key];
|
|
378
|
+
: [...currentExpandedKeys, key];
|
|
371
379
|
|
|
372
380
|
setInternalExpandedKeys(newExpandedKeys);
|
|
373
381
|
onRowExpand?.(row, !expanded);
|
|
374
382
|
}, [currentExpandedKeys, onRowExpand, getRowKey]);
|
|
375
383
|
|
|
376
384
|
// Handle row click
|
|
377
|
-
const handleRowClick = useCallback((row, any>, index) => {
|
|
385
|
+
const handleRowClick = useCallback((row: Record<string, any>, index: number) => {
|
|
378
386
|
onRowClick?.(row, index);
|
|
379
387
|
}, [onRowClick]);
|
|
380
388
|
|
|
@@ -397,7 +405,7 @@ export const Table= ({
|
|
|
397
405
|
return (
|
|
398
406
|
<div className="table__error">
|
|
399
407
|
<div className={`table__error-text table__error-text--${size}`}>
|
|
400
|
-
Error}
|
|
408
|
+
Error: {error}
|
|
401
409
|
</div>
|
|
402
410
|
</div>
|
|
403
411
|
);
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from './types';
|
|
8
8
|
|
|
9
9
|
// Simple icon components (inline SVG)
|
|
10
|
-
const CalendarIcon}> = ({ className = '' }) => (
|
|
10
|
+
const CalendarIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
11
11
|
<svg
|
|
12
12
|
className={`timeline__icon ${className}`}
|
|
13
13
|
fill="none"
|
|
@@ -18,7 +18,7 @@ const CalendarIcon}> = ({ className = '' }) => (
|
|
|
18
18
|
</svg>
|
|
19
19
|
);
|
|
20
20
|
|
|
21
|
-
const ClockIcon}> = ({ className = '' }) => (
|
|
21
|
+
const ClockIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
22
22
|
<svg
|
|
23
23
|
className={`timeline__icon ${className}`}
|
|
24
24
|
fill="none"
|
|
@@ -29,7 +29,7 @@ const ClockIcon}> = ({ className = '' }) => (
|
|
|
29
29
|
</svg>
|
|
30
30
|
);
|
|
31
31
|
|
|
32
|
-
const UserIcon}> = ({ className = '' }) => (
|
|
32
|
+
const UserIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
33
33
|
<svg
|
|
34
34
|
className={`timeline__icon ${className}`}
|
|
35
35
|
fill="none"
|
|
@@ -40,7 +40,7 @@ const UserIcon}> = ({ className = '' }) => (
|
|
|
40
40
|
</svg>
|
|
41
41
|
);
|
|
42
42
|
|
|
43
|
-
const BellIcon}> = ({ className = '' }) => (
|
|
43
|
+
const BellIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
44
44
|
<svg
|
|
45
45
|
className={`timeline__icon ${className}`}
|
|
46
46
|
fill="none"
|
|
@@ -51,7 +51,7 @@ const BellIcon}> = ({ className = '' }) => (
|
|
|
51
51
|
</svg>
|
|
52
52
|
);
|
|
53
53
|
|
|
54
|
-
const SearchIcon}> = ({ className = '' }) => (
|
|
54
|
+
const SearchIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
55
55
|
<svg
|
|
56
56
|
className={`timeline__icon ${className}`}
|
|
57
57
|
fill="none"
|
|
@@ -62,7 +62,7 @@ const SearchIcon}> = ({ className = '' }) => (
|
|
|
62
62
|
</svg>
|
|
63
63
|
);
|
|
64
64
|
|
|
65
|
-
const FilterIcon}> = ({ className = '' }) => (
|
|
65
|
+
const FilterIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
66
66
|
<svg
|
|
67
67
|
className={`timeline__icon ${className}`}
|
|
68
68
|
fill="none"
|
|
@@ -73,7 +73,7 @@ const FilterIcon}> = ({ className = '' }) => (
|
|
|
73
73
|
</svg>
|
|
74
74
|
);
|
|
75
75
|
|
|
76
|
-
const DotsIcon}> = ({ className = '' }) => (
|
|
76
|
+
const DotsIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
77
77
|
<svg
|
|
78
78
|
className={`timeline__icon ${className}`}
|
|
79
79
|
fill="none"
|
|
@@ -85,12 +85,13 @@ const DotsIcon}> = ({ className = '' }) => (
|
|
|
85
85
|
);
|
|
86
86
|
|
|
87
87
|
// Timeline Search and Filter Bar
|
|
88
|
-
const TimelineSearchFilterBar
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
88
|
+
const TimelineSearchFilterBar: React.FC<{
|
|
89
|
+
searchable: boolean;
|
|
90
|
+
searchValue: string;
|
|
91
|
+
onSearchChange: (value: string) => void;
|
|
92
|
+
filterable: boolean;
|
|
93
|
+
theme: string;
|
|
94
|
+
size: 'sm' | 'md' | 'lg';
|
|
94
95
|
}> = ({
|
|
95
96
|
searchable,
|
|
96
97
|
searchValue,
|
|
@@ -129,10 +130,11 @@ const TimelineSearchFilterBar;
|
|
|
129
130
|
};
|
|
130
131
|
|
|
131
132
|
// Timeline Item Actions Component
|
|
132
|
-
const TimelineItemActions
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
133
|
+
const TimelineItemActions: React.FC<{
|
|
134
|
+
actions: TimelineAction[];
|
|
135
|
+
item: TimelineItem;
|
|
136
|
+
theme: string;
|
|
137
|
+
size: 'sm' | 'md' | 'lg';
|
|
136
138
|
}> = ({ actions, item, size }) => {
|
|
137
139
|
const [showMenu, setShowMenu] = useState(false);
|
|
138
140
|
|
|
@@ -147,7 +149,7 @@ const TimelineItemActions];
|
|
|
147
149
|
e.stopPropagation();
|
|
148
150
|
action.onClick(item);
|
|
149
151
|
}}
|
|
150
|
-
className={`timeline__action-button timeline__action-button--${size} ${action.variant === 'danger' ? 'timeline__action-button--danger' }`}
|
|
152
|
+
className={`timeline__action-button timeline__action-button--${size} ${action.variant === 'danger' ? 'timeline__action-button--danger' : ''}`}
|
|
151
153
|
title={action.label}
|
|
152
154
|
>
|
|
153
155
|
{action.icon || <DotsIcon className="timeline__action-icon" />}
|
|
@@ -186,7 +188,7 @@ const TimelineItemActions];
|
|
|
186
188
|
action.onClick(item);
|
|
187
189
|
setShowMenu(false);
|
|
188
190
|
}}
|
|
189
|
-
className={`timeline__action-menu-item ${action.variant === 'danger' ? 'timeline__action-menu-item--danger' }`}
|
|
191
|
+
className={`timeline__action-menu-item ${action.variant === 'danger' ? 'timeline__action-menu-item--danger' : ''}`}
|
|
190
192
|
>
|
|
191
193
|
{action.icon && <span className="timeline__action-menu-icon">{action.icon}</span>}
|
|
192
194
|
{action.label}
|
|
@@ -200,7 +202,7 @@ const TimelineItemActions];
|
|
|
200
202
|
};
|
|
201
203
|
|
|
202
204
|
// Individual Timeline Item Component
|
|
203
|
-
const TimelineItemComponent= ({
|
|
205
|
+
const TimelineItemComponent: React.FC<TimelineItemProps> = ({
|
|
204
206
|
item,
|
|
205
207
|
position,
|
|
206
208
|
isLast,
|
|
@@ -224,15 +226,15 @@ const TimelineItemComponent= ({
|
|
|
224
226
|
}
|
|
225
227
|
|
|
226
228
|
switch (item.type) {
|
|
227
|
-
case 'event'="timeline__dot-icon" />;
|
|
228
|
-
case 'task'="timeline__dot-icon" />;
|
|
229
|
-
case 'user'="timeline__dot-icon" />;
|
|
230
|
-
case 'system'="timeline__dot-icon" />;
|
|
231
|
-
default;
|
|
229
|
+
case 'event': return <CalendarIcon className="timeline__dot-icon" />;
|
|
230
|
+
case 'task': return <ClockIcon className="timeline__dot-icon" />;
|
|
231
|
+
case 'user': return <UserIcon className="timeline__dot-icon" />;
|
|
232
|
+
case 'system': return <BellIcon className="timeline__dot-icon" />;
|
|
233
|
+
default: return null;
|
|
232
234
|
}
|
|
233
235
|
};
|
|
234
236
|
|
|
235
|
-
const formatTimestamp = (timestamp) => {
|
|
237
|
+
const formatTimestamp = (timestamp: string) => {
|
|
236
238
|
const date = new Date(timestamp);
|
|
237
239
|
return date.toLocaleString();
|
|
238
240
|
};
|
|
@@ -241,8 +243,8 @@ const TimelineItemComponent= ({
|
|
|
241
243
|
<div className={`timeline__item timeline__item--${mode} timeline__item--${position} timeline__item--${size}`}>
|
|
242
244
|
{/* Content */}
|
|
243
245
|
<div
|
|
244
|
-
className={`timeline__item-content timeline__item-content--${size} timeline__item-content--${variant} ${isClickable ? 'timeline__item-content--clickable' }`}
|
|
245
|
-
onClick={isClickable ? () => onClick(item) }
|
|
246
|
+
className={`timeline__item-content timeline__item-content--${size} timeline__item-content--${variant} ${isClickable ? 'timeline__item-content--clickable' : ''}`}
|
|
247
|
+
onClick={isClickable ? () => onClick(item) : undefined}
|
|
246
248
|
>
|
|
247
249
|
<div className={`timeline__item-content-wrapper timeline__item-content-wrapper--${position}`}>
|
|
248
250
|
{/* Header */}
|
|
@@ -325,7 +327,7 @@ const TimelineItemComponent= ({
|
|
|
325
327
|
};
|
|
326
328
|
|
|
327
329
|
// Main Timeline Component
|
|
328
|
-
export const Timeline= ({
|
|
330
|
+
export const Timeline: React.FC<TimelineProps> = ({
|
|
329
331
|
items,
|
|
330
332
|
mode = 'left',
|
|
331
333
|
reverse = false,
|
|
@@ -335,7 +337,9 @@ export const Timeline= ({
|
|
|
335
337
|
searchValue = '',
|
|
336
338
|
onSearchChange,
|
|
337
339
|
filterable = false,
|
|
338
|
-
// filters = [], // TODO
|
|
340
|
+
// filters = [], // TODO: Implement filter functionality
|
|
341
|
+
// onFiltersChange, // TODO: Implement filter functionality
|
|
342
|
+
showConnector = true,
|
|
339
343
|
loading = false,
|
|
340
344
|
error = null,
|
|
341
345
|
emptyMessage = 'No timeline items',
|
|
@@ -364,7 +368,7 @@ export const Timeline= ({
|
|
|
364
368
|
const sorted = [...filteredItems].sort((a, b) => {
|
|
365
369
|
const dateA = new Date(a.timestamp).getTime();
|
|
366
370
|
const dateB = new Date(b.timestamp).getTime();
|
|
367
|
-
return reverse ? dateB - dateA ;
|
|
371
|
+
return reverse ? dateB - dateA : dateA - dateB;
|
|
368
372
|
});
|
|
369
373
|
|
|
370
374
|
return sorted;
|
|
@@ -404,11 +408,12 @@ export const Timeline= ({
|
|
|
404
408
|
<div className="timeline__empty">
|
|
405
409
|
{emptyMessage}
|
|
406
410
|
</div>
|
|
407
|
-
)
|
|
411
|
+
) : (
|
|
412
|
+
<div className="timeline__items">
|
|
408
413
|
{sortedItems.map((item, index) => {
|
|
409
414
|
const position = mode === 'alternate'
|
|
410
|
-
? (index % 2 === 0 ? 'left' )
|
|
411
|
-
;
|
|
415
|
+
? (index % 2 === 0 ? 'left' : 'right')
|
|
416
|
+
: mode;
|
|
412
417
|
|
|
413
418
|
return (
|
|
414
419
|
<TimelineItemComponent
|