@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.9 → 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,19 +9,19 @@ import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/24/outline';
|
|
|
9
9
|
import { PaginationProps, PaginationItem } from './types';
|
|
10
10
|
|
|
11
11
|
// Simple icon components
|
|
12
|
-
const ChevronDoubleLeftIcon}> = ({ className = '' }) => (
|
|
12
|
+
const ChevronDoubleLeftIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
13
13
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
14
14
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M11 19l-7-7 7-7m8 14l-7-7 7-7" />
|
|
15
15
|
</svg>
|
|
16
16
|
);
|
|
17
17
|
|
|
18
|
-
const ChevronDoubleRightIcon}> = ({ className = '' }) => (
|
|
18
|
+
const ChevronDoubleRightIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
19
19
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
20
20
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 5l7 7-7 7m-8-14l7 7-7 7" />
|
|
21
21
|
</svg>
|
|
22
22
|
);
|
|
23
23
|
|
|
24
|
-
export const Pagination= ({
|
|
24
|
+
export const Pagination: React.FC<PaginationProps> = ({
|
|
25
25
|
currentPage = 1,
|
|
26
26
|
totalPages = 1,
|
|
27
27
|
totalItems,
|
|
@@ -41,29 +41,29 @@ export const Pagination= ({
|
|
|
41
41
|
disabled = false,
|
|
42
42
|
loading = false,
|
|
43
43
|
className = '',
|
|
44
|
-
'data-testid'= 'pagination',
|
|
44
|
+
'data-testid': testId = 'pagination',
|
|
45
45
|
}) => {
|
|
46
46
|
// Memoize pagination items to avoid unnecessary recalculations
|
|
47
|
-
const paginationItems = useMemo(()] => {
|
|
48
|
-
const items] = [];
|
|
47
|
+
const paginationItems = useMemo((): PaginationItem[] => {
|
|
48
|
+
const items: PaginationItem[] = [];
|
|
49
49
|
|
|
50
50
|
if (showFirstLast) {
|
|
51
51
|
items.push({
|
|
52
|
-
type,
|
|
53
|
-
page,
|
|
54
|
-
disabled=== 1 || disabled,
|
|
55
|
-
label,
|
|
56
|
-
onClick) => onPageChange(1),
|
|
52
|
+
type: 'first',
|
|
53
|
+
page: 1,
|
|
54
|
+
disabled: currentPage === 1 || disabled,
|
|
55
|
+
label: 'First',
|
|
56
|
+
onClick: () => onPageChange(1),
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
if (showPrevNext) {
|
|
61
61
|
items.push({
|
|
62
|
-
type,
|
|
63
|
-
page,
|
|
64
|
-
disabled=== 1 || disabled,
|
|
65
|
-
label,
|
|
66
|
-
onClick) => onPageChange(currentPage - 1),
|
|
62
|
+
type: 'previous',
|
|
63
|
+
page: currentPage - 1,
|
|
64
|
+
disabled: currentPage === 1 || disabled,
|
|
65
|
+
label: 'Previous',
|
|
66
|
+
onClick: () => onPageChange(currentPage - 1),
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -73,18 +73,18 @@ export const Pagination= ({
|
|
|
73
73
|
pageNumbers.forEach((pageNum) => {
|
|
74
74
|
if (pageNum === 'ellipsis') {
|
|
75
75
|
items.push({
|
|
76
|
-
type,
|
|
77
|
-
label,
|
|
78
|
-
disabled,
|
|
76
|
+
type: 'ellipsis',
|
|
77
|
+
label: '...',
|
|
78
|
+
disabled: true,
|
|
79
79
|
});
|
|
80
80
|
} else {
|
|
81
81
|
items.push({
|
|
82
|
-
type,
|
|
83
|
-
page,
|
|
84
|
-
active=== currentPage,
|
|
85
|
-
disabled,
|
|
86
|
-
label),
|
|
87
|
-
onClick) => onPageChange(pageNum as number),
|
|
82
|
+
type: 'page',
|
|
83
|
+
page: pageNum as number,
|
|
84
|
+
active: pageNum === currentPage,
|
|
85
|
+
disabled: disabled,
|
|
86
|
+
label: pageNum.toString(),
|
|
87
|
+
onClick: () => onPageChange(pageNum as number),
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
90
|
});
|
|
@@ -92,21 +92,21 @@ export const Pagination= ({
|
|
|
92
92
|
|
|
93
93
|
if (showPrevNext) {
|
|
94
94
|
items.push({
|
|
95
|
-
type,
|
|
96
|
-
page,
|
|
97
|
-
disabled=== totalPages || disabled,
|
|
98
|
-
label,
|
|
99
|
-
onClick) => onPageChange(currentPage + 1),
|
|
95
|
+
type: 'next',
|
|
96
|
+
page: currentPage + 1,
|
|
97
|
+
disabled: currentPage === totalPages || disabled,
|
|
98
|
+
label: 'Next',
|
|
99
|
+
onClick: () => onPageChange(currentPage + 1),
|
|
100
100
|
});
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
if (showFirstLast) {
|
|
104
104
|
items.push({
|
|
105
|
-
type,
|
|
106
|
-
page,
|
|
107
|
-
disabled=== totalPages || disabled,
|
|
108
|
-
label,
|
|
109
|
-
onClick) => onPageChange(totalPages),
|
|
105
|
+
type: 'last',
|
|
106
|
+
page: totalPages,
|
|
107
|
+
disabled: currentPage === totalPages || disabled,
|
|
108
|
+
label: 'Last',
|
|
109
|
+
onClick: () => onPageChange(totalPages),
|
|
110
110
|
});
|
|
111
111
|
}
|
|
112
112
|
|
|
@@ -115,16 +115,16 @@ export const Pagination= ({
|
|
|
115
115
|
|
|
116
116
|
|
|
117
117
|
|
|
118
|
-
function generatePageNumbers(current, total, max))[] {
|
|
118
|
+
function generatePageNumbers(current: number, total: number, max: number): (number | 'ellipsis')[] {
|
|
119
119
|
if (total <= max) {
|
|
120
|
-
return Array.from({ length}, (_, i) => i + 1);
|
|
120
|
+
return Array.from({ length: total }, (_, i) => i + 1);
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
const half = Math.floor(max / 2);
|
|
124
124
|
const start = Math.max(1, current - half);
|
|
125
125
|
const end = Math.min(total, start + max - 1);
|
|
126
126
|
|
|
127
|
-
const numbers)[] = [];
|
|
127
|
+
const numbers: (number | 'ellipsis')[] = [];
|
|
128
128
|
|
|
129
129
|
if (start > 1) {
|
|
130
130
|
numbers.push(1);
|
|
@@ -145,17 +145,23 @@ export const Pagination= ({
|
|
|
145
145
|
|
|
146
146
|
const getSizeClasses = () => {
|
|
147
147
|
switch (size) {
|
|
148
|
-
case 'sm'
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
case 'sm':
|
|
149
|
+
return 'pagination__button--sm';
|
|
150
|
+
case 'lg':
|
|
151
|
+
return 'pagination__button--lg';
|
|
152
|
+
default: // md
|
|
153
|
+
return 'pagination__button--md';
|
|
151
154
|
}
|
|
152
155
|
};
|
|
153
156
|
|
|
154
157
|
const getVariantClasses = () => {
|
|
155
158
|
switch (variant) {
|
|
156
|
-
case 'outlined'
|
|
157
|
-
|
|
158
|
-
|
|
159
|
+
case 'outlined':
|
|
160
|
+
return 'pagination__button--outlined';
|
|
161
|
+
case 'minimal':
|
|
162
|
+
return 'pagination__button--minimal';
|
|
163
|
+
default: // default
|
|
164
|
+
return 'pagination__button--default';
|
|
159
165
|
}
|
|
160
166
|
};
|
|
161
167
|
|
|
@@ -163,7 +169,7 @@ export const Pagination= ({
|
|
|
163
169
|
return 'pagination pagination--stan-design';
|
|
164
170
|
};
|
|
165
171
|
|
|
166
|
-
const getButtonClasses = (item) => {
|
|
172
|
+
const getButtonClasses = (item: PaginationItem) => {
|
|
167
173
|
let classes = `pagination__button ${getSizeClasses()} ${getVariantClasses()}`;
|
|
168
174
|
|
|
169
175
|
if (item.disabled) {
|
|
@@ -177,7 +183,7 @@ export const Pagination= ({
|
|
|
177
183
|
return classes;
|
|
178
184
|
};
|
|
179
185
|
|
|
180
|
-
const handleItemsPerPageChange = (event) => {
|
|
186
|
+
const handleItemsPerPageChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
|
|
181
187
|
const newItemsPerPage = parseInt(event.target.value, 10);
|
|
182
188
|
if (onItemsPerPageChange) {
|
|
183
189
|
onItemsPerPageChange(newItemsPerPage);
|
|
@@ -195,7 +201,10 @@ export const Pagination= ({
|
|
|
195
201
|
{showItemsPerPage && (
|
|
196
202
|
<div className="pagination__items-per-page">
|
|
197
203
|
<label htmlFor="items-per-page" className="pagination__label">
|
|
198
|
-
Items per page
|
|
204
|
+
Items per page:
|
|
205
|
+
</label>
|
|
206
|
+
<select
|
|
207
|
+
id="items-per-page"
|
|
199
208
|
value={itemsPerPage}
|
|
200
209
|
onChange={handleItemsPerPageChange}
|
|
201
210
|
disabled={disabled || loading}
|
|
@@ -212,7 +221,7 @@ export const Pagination= ({
|
|
|
212
221
|
|
|
213
222
|
{showTotal && totalItems !== undefined && (
|
|
214
223
|
<div className="pagination__total">
|
|
215
|
-
{totalLabel}="pagination__total-count">{totalItems.toLocaleString()}</span>
|
|
224
|
+
{totalLabel}: <span className="pagination__total-count">{totalItems.toLocaleString()}</span>
|
|
216
225
|
</div>
|
|
217
226
|
)}
|
|
218
227
|
</div>
|
|
@@ -232,7 +241,10 @@ export const Pagination= ({
|
|
|
232
241
|
);
|
|
233
242
|
}
|
|
234
243
|
|
|
235
|
-
const icon = item.type === 'first' ? <ChevronDoubleLeftIcon className="pagination__button-icon" />
|
|
244
|
+
const icon = item.type === 'first' ? <ChevronDoubleLeftIcon className="pagination__button-icon" /> :
|
|
245
|
+
item.type === 'previous' ? <ChevronLeftIcon className="pagination__button-icon" /> :
|
|
246
|
+
item.type === 'next' ? <ChevronRightIcon className="pagination__button-icon" /> :
|
|
247
|
+
item.type === 'last' ? <ChevronDoubleRightIcon className="pagination__button-icon" /> : null;
|
|
236
248
|
|
|
237
249
|
return (
|
|
238
250
|
<button
|
|
@@ -241,7 +253,7 @@ export const Pagination= ({
|
|
|
241
253
|
disabled={item.disabled}
|
|
242
254
|
className={getButtonClasses(item)}
|
|
243
255
|
aria-label={item.label}
|
|
244
|
-
aria-current={item.active ? 'page' }
|
|
256
|
+
aria-current={item.active ? 'page' : undefined}
|
|
245
257
|
>
|
|
246
258
|
{icon || item.label}
|
|
247
259
|
</button>
|
|
@@ -9,19 +9,19 @@ import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/24/outline';
|
|
|
9
9
|
import { PaginationProps, PaginationItem } from './types';
|
|
10
10
|
|
|
11
11
|
// Simple icon components
|
|
12
|
-
const ChevronDoubleLeftIcon}> = ({ className = '' }) => (
|
|
12
|
+
const ChevronDoubleLeftIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
13
13
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
14
14
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M11 19l-7-7 7-7m8 14l-7-7 7-7" />
|
|
15
15
|
</svg>
|
|
16
16
|
);
|
|
17
17
|
|
|
18
|
-
const ChevronDoubleRightIcon}> = ({ className = '' }) => (
|
|
18
|
+
const ChevronDoubleRightIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
19
19
|
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
20
20
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 5l7 7-7 7m-8-14l7 7-7 7" />
|
|
21
21
|
</svg>
|
|
22
22
|
);
|
|
23
23
|
|
|
24
|
-
export const Pagination= ({
|
|
24
|
+
export const Pagination: React.FC<PaginationProps> = ({
|
|
25
25
|
currentPage = 1,
|
|
26
26
|
totalPages = 1,
|
|
27
27
|
totalItems,
|
|
@@ -41,29 +41,29 @@ export const Pagination= ({
|
|
|
41
41
|
disabled = false,
|
|
42
42
|
loading = false,
|
|
43
43
|
className = '',
|
|
44
|
-
'data-testid'= 'pagination',
|
|
44
|
+
'data-testid': testId = 'pagination',
|
|
45
45
|
}) => {
|
|
46
46
|
// Memoize pagination items to avoid unnecessary recalculations
|
|
47
|
-
const paginationItems = useMemo(()] => {
|
|
48
|
-
const items] = [];
|
|
47
|
+
const paginationItems = useMemo((): PaginationItem[] => {
|
|
48
|
+
const items: PaginationItem[] = [];
|
|
49
49
|
|
|
50
50
|
if (showFirstLast) {
|
|
51
51
|
items.push({
|
|
52
|
-
type,
|
|
53
|
-
page,
|
|
54
|
-
disabled=== 1 || disabled,
|
|
55
|
-
label,
|
|
56
|
-
onClick) => onPageChange(1),
|
|
52
|
+
type: 'first',
|
|
53
|
+
page: 1,
|
|
54
|
+
disabled: currentPage === 1 || disabled,
|
|
55
|
+
label: 'First',
|
|
56
|
+
onClick: () => onPageChange(1),
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
if (showPrevNext) {
|
|
61
61
|
items.push({
|
|
62
|
-
type,
|
|
63
|
-
page,
|
|
64
|
-
disabled=== 1 || disabled,
|
|
65
|
-
label,
|
|
66
|
-
onClick) => onPageChange(currentPage - 1),
|
|
62
|
+
type: 'previous',
|
|
63
|
+
page: currentPage - 1,
|
|
64
|
+
disabled: currentPage === 1 || disabled,
|
|
65
|
+
label: 'Previous',
|
|
66
|
+
onClick: () => onPageChange(currentPage - 1),
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -73,18 +73,18 @@ export const Pagination= ({
|
|
|
73
73
|
pageNumbers.forEach((pageNum) => {
|
|
74
74
|
if (pageNum === 'ellipsis') {
|
|
75
75
|
items.push({
|
|
76
|
-
type,
|
|
77
|
-
label,
|
|
78
|
-
disabled,
|
|
76
|
+
type: 'ellipsis',
|
|
77
|
+
label: '...',
|
|
78
|
+
disabled: true,
|
|
79
79
|
});
|
|
80
80
|
} else {
|
|
81
81
|
items.push({
|
|
82
|
-
type,
|
|
83
|
-
page,
|
|
84
|
-
active=== currentPage,
|
|
85
|
-
disabled,
|
|
86
|
-
label),
|
|
87
|
-
onClick) => onPageChange(pageNum as number),
|
|
82
|
+
type: 'page',
|
|
83
|
+
page: pageNum as number,
|
|
84
|
+
active: pageNum === currentPage,
|
|
85
|
+
disabled: disabled,
|
|
86
|
+
label: pageNum.toString(),
|
|
87
|
+
onClick: () => onPageChange(pageNum as number),
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
90
|
});
|
|
@@ -92,21 +92,21 @@ export const Pagination= ({
|
|
|
92
92
|
|
|
93
93
|
if (showPrevNext) {
|
|
94
94
|
items.push({
|
|
95
|
-
type,
|
|
96
|
-
page,
|
|
97
|
-
disabled=== totalPages || disabled,
|
|
98
|
-
label,
|
|
99
|
-
onClick) => onPageChange(currentPage + 1),
|
|
95
|
+
type: 'next',
|
|
96
|
+
page: currentPage + 1,
|
|
97
|
+
disabled: currentPage === totalPages || disabled,
|
|
98
|
+
label: 'Next',
|
|
99
|
+
onClick: () => onPageChange(currentPage + 1),
|
|
100
100
|
});
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
if (showFirstLast) {
|
|
104
104
|
items.push({
|
|
105
|
-
type,
|
|
106
|
-
page,
|
|
107
|
-
disabled=== totalPages || disabled,
|
|
108
|
-
label,
|
|
109
|
-
onClick) => onPageChange(totalPages),
|
|
105
|
+
type: 'last',
|
|
106
|
+
page: totalPages,
|
|
107
|
+
disabled: currentPage === totalPages || disabled,
|
|
108
|
+
label: 'Last',
|
|
109
|
+
onClick: () => onPageChange(totalPages),
|
|
110
110
|
});
|
|
111
111
|
}
|
|
112
112
|
|
|
@@ -115,16 +115,16 @@ export const Pagination= ({
|
|
|
115
115
|
|
|
116
116
|
|
|
117
117
|
|
|
118
|
-
function generatePageNumbers(current, total, max))[] {
|
|
118
|
+
function generatePageNumbers(current: number, total: number, max: number): (number | 'ellipsis')[] {
|
|
119
119
|
if (total <= max) {
|
|
120
|
-
return Array.from({ length}, (_, i) => i + 1);
|
|
120
|
+
return Array.from({ length: total }, (_, i) => i + 1);
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
const half = Math.floor(max / 2);
|
|
124
124
|
const start = Math.max(1, current - half);
|
|
125
125
|
const end = Math.min(total, start + max - 1);
|
|
126
126
|
|
|
127
|
-
const numbers)[] = [];
|
|
127
|
+
const numbers: (number | 'ellipsis')[] = [];
|
|
128
128
|
|
|
129
129
|
if (start > 1) {
|
|
130
130
|
numbers.push(1);
|
|
@@ -145,17 +145,23 @@ export const Pagination= ({
|
|
|
145
145
|
|
|
146
146
|
const getSizeClasses = () => {
|
|
147
147
|
switch (size) {
|
|
148
|
-
case 'sm'
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
case 'sm':
|
|
149
|
+
return 'pagination__button--sm';
|
|
150
|
+
case 'lg':
|
|
151
|
+
return 'pagination__button--lg';
|
|
152
|
+
default: // md
|
|
153
|
+
return 'pagination__button--md';
|
|
151
154
|
}
|
|
152
155
|
};
|
|
153
156
|
|
|
154
157
|
const getVariantClasses = () => {
|
|
155
158
|
switch (variant) {
|
|
156
|
-
case 'outlined'
|
|
157
|
-
|
|
158
|
-
|
|
159
|
+
case 'outlined':
|
|
160
|
+
return 'pagination__button--outlined';
|
|
161
|
+
case 'minimal':
|
|
162
|
+
return 'pagination__button--minimal';
|
|
163
|
+
default: // default
|
|
164
|
+
return 'pagination__button--default';
|
|
159
165
|
}
|
|
160
166
|
};
|
|
161
167
|
|
|
@@ -163,7 +169,7 @@ export const Pagination= ({
|
|
|
163
169
|
return 'pagination pagination--stan-design';
|
|
164
170
|
};
|
|
165
171
|
|
|
166
|
-
const getButtonClasses = (item) => {
|
|
172
|
+
const getButtonClasses = (item: PaginationItem) => {
|
|
167
173
|
let classes = `pagination__button ${getSizeClasses()} ${getVariantClasses()}`;
|
|
168
174
|
|
|
169
175
|
if (item.disabled) {
|
|
@@ -177,7 +183,7 @@ export const Pagination= ({
|
|
|
177
183
|
return classes;
|
|
178
184
|
};
|
|
179
185
|
|
|
180
|
-
const handleItemsPerPageChange = (event) => {
|
|
186
|
+
const handleItemsPerPageChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
|
|
181
187
|
const newItemsPerPage = parseInt(event.target.value, 10);
|
|
182
188
|
if (onItemsPerPageChange) {
|
|
183
189
|
onItemsPerPageChange(newItemsPerPage);
|
|
@@ -195,7 +201,10 @@ export const Pagination= ({
|
|
|
195
201
|
{showItemsPerPage && (
|
|
196
202
|
<div className="pagination__items-per-page">
|
|
197
203
|
<label htmlFor="items-per-page" className="pagination__label">
|
|
198
|
-
Items per page
|
|
204
|
+
Items per page:
|
|
205
|
+
</label>
|
|
206
|
+
<select
|
|
207
|
+
id="items-per-page"
|
|
199
208
|
value={itemsPerPage}
|
|
200
209
|
onChange={handleItemsPerPageChange}
|
|
201
210
|
disabled={disabled || loading}
|
|
@@ -212,7 +221,7 @@ export const Pagination= ({
|
|
|
212
221
|
|
|
213
222
|
{showTotal && totalItems !== undefined && (
|
|
214
223
|
<div className="pagination__total">
|
|
215
|
-
{totalLabel}="pagination__total-count">{totalItems.toLocaleString()}</span>
|
|
224
|
+
{totalLabel}: <span className="pagination__total-count">{totalItems.toLocaleString()}</span>
|
|
216
225
|
</div>
|
|
217
226
|
)}
|
|
218
227
|
</div>
|
|
@@ -232,7 +241,10 @@ export const Pagination= ({
|
|
|
232
241
|
);
|
|
233
242
|
}
|
|
234
243
|
|
|
235
|
-
const icon = item.type === 'first' ? <ChevronDoubleLeftIcon className="pagination__button-icon" />
|
|
244
|
+
const icon = item.type === 'first' ? <ChevronDoubleLeftIcon className="pagination__button-icon" /> :
|
|
245
|
+
item.type === 'previous' ? <ChevronLeftIcon className="pagination__button-icon" /> :
|
|
246
|
+
item.type === 'next' ? <ChevronRightIcon className="pagination__button-icon" /> :
|
|
247
|
+
item.type === 'last' ? <ChevronDoubleRightIcon className="pagination__button-icon" /> : null;
|
|
236
248
|
|
|
237
249
|
return (
|
|
238
250
|
<button
|
|
@@ -241,7 +253,7 @@ export const Pagination= ({
|
|
|
241
253
|
disabled={item.disabled}
|
|
242
254
|
className={getButtonClasses(item)}
|
|
243
255
|
aria-label={item.label}
|
|
244
|
-
aria-current={item.active ? 'page' }
|
|
256
|
+
aria-current={item.active ? 'page' : undefined}
|
|
245
257
|
>
|
|
246
258
|
{icon || item.label}
|
|
247
259
|
</button>
|