@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
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import { SkeletonProps, SkeletonTextProps, SkeletonAvatarProps, SkeletonButtonProps } from './types';
|
|
3
3
|
|
|
4
4
|
// Base Skeleton Component
|
|
5
|
-
const BaseSkeleton= ({
|
|
5
|
+
const BaseSkeleton: React.FC<SkeletonProps> = ({
|
|
6
6
|
width,
|
|
7
7
|
height,
|
|
8
8
|
variant = 'rectangular',
|
|
@@ -10,24 +10,31 @@ const BaseSkeleton= ({
|
|
|
10
10
|
className = '',
|
|
11
11
|
size = 'md'
|
|
12
12
|
}) => {
|
|
13
|
-
// Note
|
|
13
|
+
// Note: theme and colors not needed as we're using semantic CSS classes
|
|
14
|
+
|
|
15
|
+
const getDefaultDimensions = () => {
|
|
14
16
|
if (width && height) return { width, height };
|
|
15
17
|
|
|
16
18
|
switch (variant) {
|
|
17
|
-
case 'circular'
|
|
18
|
-
|
|
19
|
-
case '
|
|
20
|
-
|
|
19
|
+
case 'circular':
|
|
20
|
+
switch (size) {
|
|
21
|
+
case 'sm': return { width: '2rem', height: '2rem' };
|
|
22
|
+
case 'lg': return { width: '4rem', height: '4rem' };
|
|
23
|
+
default: return { width: '3rem', height: '3rem' };
|
|
21
24
|
}
|
|
22
|
-
case 'text'
|
|
23
|
-
|
|
24
|
-
case '
|
|
25
|
-
|
|
25
|
+
case 'text':
|
|
26
|
+
switch (size) {
|
|
27
|
+
case 'sm': return { width: '100%', height: '0.875rem' };
|
|
28
|
+
case 'lg': return { width: '100%', height: '1.25rem' };
|
|
29
|
+
default: return { width: '100%', height: '1rem' };
|
|
26
30
|
}
|
|
27
|
-
case 'rectangular'
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
case 'rectangular':
|
|
32
|
+
case 'rounded':
|
|
33
|
+
default:
|
|
34
|
+
switch (size) {
|
|
35
|
+
case 'sm': return { width: '100%', height: '2rem' };
|
|
36
|
+
case 'lg': return { width: '100%', height: '4rem' };
|
|
37
|
+
default: return { width: '100%', height: '3rem' };
|
|
31
38
|
}
|
|
32
39
|
}
|
|
33
40
|
};
|
|
@@ -38,8 +45,9 @@ const BaseSkeleton= ({
|
|
|
38
45
|
<div
|
|
39
46
|
className={`skeleton__base skeleton__base--${variant} skeleton__base--${animation} skeleton__base--${size} ${className}`}
|
|
40
47
|
style={{
|
|
41
|
-
width,
|
|
42
|
-
height
|
|
48
|
+
width: dimensions.width,
|
|
49
|
+
height: dimensions.height
|
|
50
|
+
}}
|
|
43
51
|
aria-busy="true"
|
|
44
52
|
role="progressbar"
|
|
45
53
|
aria-label="Loading content"
|
|
@@ -48,7 +56,7 @@ const BaseSkeleton= ({
|
|
|
48
56
|
};
|
|
49
57
|
|
|
50
58
|
// Skeleton Text Component
|
|
51
|
-
export const SkeletonText= ({
|
|
59
|
+
export const SkeletonText: React.FC<SkeletonTextProps> = ({
|
|
52
60
|
lines = 3,
|
|
53
61
|
lineHeight,
|
|
54
62
|
lastLineWidth,
|
|
@@ -59,9 +67,9 @@ export const SkeletonText= ({
|
|
|
59
67
|
const getLineHeight = () => {
|
|
60
68
|
if (lineHeight) return lineHeight;
|
|
61
69
|
switch (props.size) {
|
|
62
|
-
case 'sm';
|
|
63
|
-
case 'lg';
|
|
64
|
-
default;
|
|
70
|
+
case 'sm': return '0.875rem';
|
|
71
|
+
case 'lg': return '1.25rem';
|
|
72
|
+
default: return '1rem';
|
|
65
73
|
}
|
|
66
74
|
};
|
|
67
75
|
|
|
@@ -72,14 +80,15 @@ export const SkeletonText= ({
|
|
|
72
80
|
|
|
73
81
|
return (
|
|
74
82
|
<div className={`skeleton__text skeleton__text--spacing-${spacing} ${className}`}>
|
|
75
|
-
{Array.from({ length}).map((_, index) => (
|
|
83
|
+
{Array.from({ length: lines }).map((_, index) => (
|
|
76
84
|
<div
|
|
77
85
|
key={index}
|
|
78
86
|
className={`skeleton__text-line skeleton__text-line--${props.size || 'md'} skeleton__base--${props.animation || 'pulse'} ${
|
|
79
|
-
index === lines - 1 ? 'skeleton__text-line--last'
|
|
87
|
+
index === lines - 1 ? 'skeleton__text-line--last' : ''
|
|
88
|
+
}`}
|
|
80
89
|
style={{
|
|
81
|
-
width=== lines - 1 ? getLastLineWidth() ,
|
|
82
|
-
height)
|
|
90
|
+
width: index === lines - 1 ? getLastLineWidth() : '100%',
|
|
91
|
+
height: getLineHeight()
|
|
83
92
|
}}
|
|
84
93
|
aria-busy="true"
|
|
85
94
|
/>
|
|
@@ -89,7 +98,7 @@ export const SkeletonText= ({
|
|
|
89
98
|
};
|
|
90
99
|
|
|
91
100
|
// Skeleton Avatar Component
|
|
92
|
-
export const SkeletonAvatar= ({
|
|
101
|
+
export const SkeletonAvatar: React.FC<SkeletonAvatarProps> = ({
|
|
93
102
|
size = 'md',
|
|
94
103
|
shape = 'circular',
|
|
95
104
|
className = '',
|
|
@@ -106,7 +115,7 @@ export const SkeletonAvatar= ({
|
|
|
106
115
|
};
|
|
107
116
|
|
|
108
117
|
// Skeleton Button Component
|
|
109
|
-
export const SkeletonButton= ({
|
|
118
|
+
export const SkeletonButton: React.FC<SkeletonButtonProps> = ({
|
|
110
119
|
size = 'md',
|
|
111
120
|
variant = 'contained',
|
|
112
121
|
fullWidth = false,
|
|
@@ -116,7 +125,8 @@ export const SkeletonButton= ({
|
|
|
116
125
|
return (
|
|
117
126
|
<div
|
|
118
127
|
className={`skeleton__button skeleton__button--${size} skeleton__button--${variant} ${
|
|
119
|
-
fullWidth ? 'skeleton__button--full-width'
|
|
128
|
+
fullWidth ? 'skeleton__button--full-width' : ''
|
|
129
|
+
} skeleton__base--${props.animation || 'pulse'} ${className}`}
|
|
120
130
|
aria-busy="true"
|
|
121
131
|
role="progressbar"
|
|
122
132
|
aria-label="Loading button"
|
|
@@ -125,7 +135,7 @@ export const SkeletonButton= ({
|
|
|
125
135
|
};
|
|
126
136
|
|
|
127
137
|
// Main Skeleton Component
|
|
128
|
-
export const Skeleton= ({
|
|
138
|
+
export const Skeleton: React.FC<SkeletonProps> = ({
|
|
129
139
|
width,
|
|
130
140
|
height,
|
|
131
141
|
variant = 'rectangular',
|
|
@@ -144,7 +154,7 @@ export const Skeleton= ({
|
|
|
144
154
|
if (rows > 1) {
|
|
145
155
|
return (
|
|
146
156
|
<div className={`skeleton__container skeleton__container--spacing-${spacing} ${className}`}>
|
|
147
|
-
{Array.from({ length}).map((_, index) => (
|
|
157
|
+
{Array.from({ length: rows }).map((_, index) => (
|
|
148
158
|
<BaseSkeleton
|
|
149
159
|
key={index}
|
|
150
160
|
width={width}
|
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import { SkeletonProps, SkeletonTextProps, SkeletonAvatarProps, SkeletonButtonProps } from './types';
|
|
3
3
|
|
|
4
4
|
// Base Skeleton Component
|
|
5
|
-
const BaseSkeleton= ({
|
|
5
|
+
const BaseSkeleton: React.FC<SkeletonProps> = ({
|
|
6
6
|
width,
|
|
7
7
|
height,
|
|
8
8
|
variant = 'rectangular',
|
|
@@ -10,24 +10,31 @@ const BaseSkeleton= ({
|
|
|
10
10
|
className = '',
|
|
11
11
|
size = 'md'
|
|
12
12
|
}) => {
|
|
13
|
-
// Note
|
|
13
|
+
// Note: theme and colors not needed as we're using semantic CSS classes
|
|
14
|
+
|
|
15
|
+
const getDefaultDimensions = () => {
|
|
14
16
|
if (width && height) return { width, height };
|
|
15
17
|
|
|
16
18
|
switch (variant) {
|
|
17
|
-
case 'circular'
|
|
18
|
-
|
|
19
|
-
case '
|
|
20
|
-
|
|
19
|
+
case 'circular':
|
|
20
|
+
switch (size) {
|
|
21
|
+
case 'sm': return { width: '2rem', height: '2rem' };
|
|
22
|
+
case 'lg': return { width: '4rem', height: '4rem' };
|
|
23
|
+
default: return { width: '3rem', height: '3rem' };
|
|
21
24
|
}
|
|
22
|
-
case 'text'
|
|
23
|
-
|
|
24
|
-
case '
|
|
25
|
-
|
|
25
|
+
case 'text':
|
|
26
|
+
switch (size) {
|
|
27
|
+
case 'sm': return { width: '100%', height: '0.875rem' };
|
|
28
|
+
case 'lg': return { width: '100%', height: '1.25rem' };
|
|
29
|
+
default: return { width: '100%', height: '1rem' };
|
|
26
30
|
}
|
|
27
|
-
case 'rectangular'
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
case 'rectangular':
|
|
32
|
+
case 'rounded':
|
|
33
|
+
default:
|
|
34
|
+
switch (size) {
|
|
35
|
+
case 'sm': return { width: '100%', height: '2rem' };
|
|
36
|
+
case 'lg': return { width: '100%', height: '4rem' };
|
|
37
|
+
default: return { width: '100%', height: '3rem' };
|
|
31
38
|
}
|
|
32
39
|
}
|
|
33
40
|
};
|
|
@@ -38,8 +45,9 @@ const BaseSkeleton= ({
|
|
|
38
45
|
<div
|
|
39
46
|
className={`skeleton__base skeleton__base--${variant} skeleton__base--${animation} skeleton__base--${size} ${className}`}
|
|
40
47
|
style={{
|
|
41
|
-
width,
|
|
42
|
-
height
|
|
48
|
+
width: dimensions.width,
|
|
49
|
+
height: dimensions.height
|
|
50
|
+
}}
|
|
43
51
|
aria-busy="true"
|
|
44
52
|
role="progressbar"
|
|
45
53
|
aria-label="Loading content"
|
|
@@ -48,7 +56,7 @@ const BaseSkeleton= ({
|
|
|
48
56
|
};
|
|
49
57
|
|
|
50
58
|
// Skeleton Text Component
|
|
51
|
-
export const SkeletonText= ({
|
|
59
|
+
export const SkeletonText: React.FC<SkeletonTextProps> = ({
|
|
52
60
|
lines = 3,
|
|
53
61
|
lineHeight,
|
|
54
62
|
lastLineWidth,
|
|
@@ -59,9 +67,9 @@ export const SkeletonText= ({
|
|
|
59
67
|
const getLineHeight = () => {
|
|
60
68
|
if (lineHeight) return lineHeight;
|
|
61
69
|
switch (props.size) {
|
|
62
|
-
case 'sm';
|
|
63
|
-
case 'lg';
|
|
64
|
-
default;
|
|
70
|
+
case 'sm': return '0.875rem';
|
|
71
|
+
case 'lg': return '1.25rem';
|
|
72
|
+
default: return '1rem';
|
|
65
73
|
}
|
|
66
74
|
};
|
|
67
75
|
|
|
@@ -72,14 +80,15 @@ export const SkeletonText= ({
|
|
|
72
80
|
|
|
73
81
|
return (
|
|
74
82
|
<div className={`skeleton__text skeleton__text--spacing-${spacing} ${className}`}>
|
|
75
|
-
{Array.from({ length}).map((_, index) => (
|
|
83
|
+
{Array.from({ length: lines }).map((_, index) => (
|
|
76
84
|
<div
|
|
77
85
|
key={index}
|
|
78
86
|
className={`skeleton__text-line skeleton__text-line--${props.size || 'md'} skeleton__base--${props.animation || 'pulse'} ${
|
|
79
|
-
index === lines - 1 ? 'skeleton__text-line--last'
|
|
87
|
+
index === lines - 1 ? 'skeleton__text-line--last' : ''
|
|
88
|
+
}`}
|
|
80
89
|
style={{
|
|
81
|
-
width=== lines - 1 ? getLastLineWidth() ,
|
|
82
|
-
height)
|
|
90
|
+
width: index === lines - 1 ? getLastLineWidth() : '100%',
|
|
91
|
+
height: getLineHeight()
|
|
83
92
|
}}
|
|
84
93
|
aria-busy="true"
|
|
85
94
|
/>
|
|
@@ -89,7 +98,7 @@ export const SkeletonText= ({
|
|
|
89
98
|
};
|
|
90
99
|
|
|
91
100
|
// Skeleton Avatar Component
|
|
92
|
-
export const SkeletonAvatar= ({
|
|
101
|
+
export const SkeletonAvatar: React.FC<SkeletonAvatarProps> = ({
|
|
93
102
|
size = 'md',
|
|
94
103
|
shape = 'circular',
|
|
95
104
|
className = '',
|
|
@@ -106,7 +115,7 @@ export const SkeletonAvatar= ({
|
|
|
106
115
|
};
|
|
107
116
|
|
|
108
117
|
// Skeleton Button Component
|
|
109
|
-
export const SkeletonButton= ({
|
|
118
|
+
export const SkeletonButton: React.FC<SkeletonButtonProps> = ({
|
|
110
119
|
size = 'md',
|
|
111
120
|
variant = 'contained',
|
|
112
121
|
fullWidth = false,
|
|
@@ -116,7 +125,8 @@ export const SkeletonButton= ({
|
|
|
116
125
|
return (
|
|
117
126
|
<div
|
|
118
127
|
className={`skeleton__button skeleton__button--${size} skeleton__button--${variant} ${
|
|
119
|
-
fullWidth ? 'skeleton__button--full-width'
|
|
128
|
+
fullWidth ? 'skeleton__button--full-width' : ''
|
|
129
|
+
} skeleton__base--${props.animation || 'pulse'} ${className}`}
|
|
120
130
|
aria-busy="true"
|
|
121
131
|
role="progressbar"
|
|
122
132
|
aria-label="Loading button"
|
|
@@ -125,7 +135,7 @@ export const SkeletonButton= ({
|
|
|
125
135
|
};
|
|
126
136
|
|
|
127
137
|
// Main Skeleton Component
|
|
128
|
-
export const Skeleton= ({
|
|
138
|
+
export const Skeleton: React.FC<SkeletonProps> = ({
|
|
129
139
|
width,
|
|
130
140
|
height,
|
|
131
141
|
variant = 'rectangular',
|
|
@@ -144,7 +154,7 @@ export const Skeleton= ({
|
|
|
144
154
|
if (rows > 1) {
|
|
145
155
|
return (
|
|
146
156
|
<div className={`skeleton__container skeleton__container--spacing-${spacing} ${className}`}>
|
|
147
|
-
{Array.from({ length}).map((_, index) => (
|
|
157
|
+
{Array.from({ length: rows }).map((_, index) => (
|
|
148
158
|
<BaseSkeleton
|
|
149
159
|
key={index}
|
|
150
160
|
width={width}
|
|
@@ -2,75 +2,97 @@ import React, { useState, useEffect, useCallback, useRef } from 'react';
|
|
|
2
2
|
import { ToastProps, ToastAction, ToastContainerProps } from './types';
|
|
3
3
|
|
|
4
4
|
// Simple icon components
|
|
5
|
-
const CheckCircleIcon}> = ({ className = '' }) => (
|
|
5
|
+
const CheckCircleIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
6
6
|
<svg className={className} fill="currentColor" viewBox="0 0 20 20">
|
|
7
7
|
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
|
|
8
8
|
</svg>
|
|
9
9
|
);
|
|
10
10
|
|
|
11
|
-
const ExclamationTriangleIcon}> = ({ className = '' }) => (
|
|
11
|
+
const ExclamationTriangleIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
12
12
|
<svg className={className} fill="currentColor" viewBox="0 0 20 20">
|
|
13
13
|
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
|
|
14
14
|
</svg>
|
|
15
15
|
);
|
|
16
16
|
|
|
17
|
-
const XCircleIcon}> = ({ className = '' }) => (
|
|
17
|
+
const XCircleIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
18
18
|
<svg className={className} fill="currentColor" viewBox="0 0 20 20">
|
|
19
19
|
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" />
|
|
20
20
|
</svg>
|
|
21
21
|
);
|
|
22
22
|
|
|
23
|
-
const InformationCircleIcon}> = ({ className = '' }) => (
|
|
23
|
+
const InformationCircleIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
24
24
|
<svg className={className} fill="currentColor" viewBox="0 0 20 20">
|
|
25
25
|
<path fillRule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clipRule="evenodd" />
|
|
26
26
|
</svg>
|
|
27
27
|
);
|
|
28
28
|
|
|
29
|
-
const XMarkIcon}> = ({ className = '' }) => (
|
|
29
|
+
const XMarkIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
30
30
|
<svg className={className} fill="currentColor" viewBox="0 0 20 20">
|
|
31
31
|
<path fillRule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clipRule="evenodd" />
|
|
32
32
|
</svg>
|
|
33
33
|
);
|
|
34
34
|
|
|
35
35
|
// Get icon for toast type
|
|
36
|
-
const getToastIcon = (type], className) => {
|
|
36
|
+
const getToastIcon = (type: ToastProps['type'], className: string) => {
|
|
37
37
|
switch (type) {
|
|
38
|
-
case 'success'
|
|
39
|
-
|
|
40
|
-
case '
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
case 'success':
|
|
39
|
+
return <CheckCircleIcon className={className} />;
|
|
40
|
+
case 'warning':
|
|
41
|
+
return <ExclamationTriangleIcon className={className} />;
|
|
42
|
+
case 'error':
|
|
43
|
+
return <XCircleIcon className={className} />;
|
|
44
|
+
case 'info':
|
|
45
|
+
return <InformationCircleIcon className={className} />;
|
|
46
|
+
default:
|
|
47
|
+
return null;
|
|
43
48
|
}
|
|
44
49
|
};
|
|
45
50
|
|
|
46
|
-
// Note
|
|
51
|
+
// Note: getToastColors function removed as we're using semantic CSS classes
|
|
52
|
+
/*
|
|
53
|
+
const getToastColors = (type: ToastProps['type'], colors: any) => {
|
|
47
54
|
switch (type) {
|
|
48
|
-
case 'success'
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
border,
|
|
66
|
-
text,
|
|
67
|
-
icon
|
|
55
|
+
case 'success':
|
|
56
|
+
return {
|
|
57
|
+
background: colors.semantic.success + '10',
|
|
58
|
+
border: colors.semantic.success + '30',
|
|
59
|
+
text: colors.semantic.success,
|
|
60
|
+
icon: colors.semantic.success
|
|
61
|
+
};
|
|
62
|
+
case 'warning':
|
|
63
|
+
return {
|
|
64
|
+
background: colors.semantic.warning + '10',
|
|
65
|
+
border: colors.semantic.warning + '30',
|
|
66
|
+
text: colors.semantic.warning,
|
|
67
|
+
icon: colors.semantic.warning
|
|
68
|
+
};
|
|
69
|
+
case 'error':
|
|
70
|
+
return {
|
|
71
|
+
background: colors.semantic.error + '10',
|
|
72
|
+
border: colors.semantic.error + '30',
|
|
73
|
+
text: colors.semantic.error,
|
|
74
|
+
icon: colors.semantic.error
|
|
75
|
+
};
|
|
76
|
+
case 'info':
|
|
77
|
+
return {
|
|
78
|
+
background: colors.semantic.info + '10',
|
|
79
|
+
border: colors.semantic.info + '30',
|
|
80
|
+
text: colors.semantic.info,
|
|
81
|
+
icon: colors.semantic.info
|
|
82
|
+
};
|
|
83
|
+
default:
|
|
84
|
+
return {
|
|
85
|
+
background: colors.surface.surface,
|
|
86
|
+
border: colors.surface.border,
|
|
87
|
+
text: colors.text.primary,
|
|
88
|
+
icon: colors.text.secondary
|
|
89
|
+
};
|
|
68
90
|
}
|
|
69
91
|
};
|
|
70
92
|
*/
|
|
71
93
|
|
|
72
94
|
// Toast Action Button Component
|
|
73
|
-
const ToastActionButton= ({
|
|
95
|
+
const ToastActionButton: React.FC<ToastAction> = ({
|
|
74
96
|
label,
|
|
75
97
|
action,
|
|
76
98
|
variant = 'primary'
|
|
@@ -87,7 +109,7 @@ const ToastActionButton= ({
|
|
|
87
109
|
};
|
|
88
110
|
|
|
89
111
|
// Individual Toast Component
|
|
90
|
-
export const Toast= ({
|
|
112
|
+
export const Toast: React.FC<ToastProps> = ({
|
|
91
113
|
title,
|
|
92
114
|
message,
|
|
93
115
|
type = 'default',
|
|
@@ -104,7 +126,9 @@ export const Toast= ({
|
|
|
104
126
|
variant = 'default',
|
|
105
127
|
className = '',
|
|
106
128
|
}) => {
|
|
107
|
-
// Note
|
|
129
|
+
// Note: theme and colors not needed as we're using semantic CSS classes
|
|
130
|
+
|
|
131
|
+
const [isVisible, setIsVisible] = useState(true);
|
|
108
132
|
const [progressValue, setProgressValue] = useState(100);
|
|
109
133
|
const timeoutRef = useRef<NodeJS.Timeout | null>(null);
|
|
110
134
|
const progressRef = useRef<NodeJS.Timeout | null>(null);
|
|
@@ -190,7 +214,7 @@ export const Toast= ({
|
|
|
190
214
|
<div className="toast__progress">
|
|
191
215
|
<div
|
|
192
216
|
className={`toast__progress-bar toast__progress-bar--${type}`}
|
|
193
|
-
style={{ width}%` }}
|
|
217
|
+
style={{ width: `${progressValue}%` }}
|
|
194
218
|
/>
|
|
195
219
|
</div>
|
|
196
220
|
)}
|
|
@@ -208,7 +232,7 @@ export const Toast= ({
|
|
|
208
232
|
</h3>
|
|
209
233
|
)}
|
|
210
234
|
|
|
211
|
-
<div className={`toast__message ${!title ? 'toast__message--only' }`}>
|
|
235
|
+
<div className={`toast__message ${!title ? 'toast__message--only' : ''}`}>
|
|
212
236
|
{message}
|
|
213
237
|
</div>
|
|
214
238
|
|
|
@@ -239,7 +263,7 @@ export const Toast= ({
|
|
|
239
263
|
};
|
|
240
264
|
|
|
241
265
|
// Toast Container Component
|
|
242
|
-
export const ToastContainer}> = ({
|
|
266
|
+
export const ToastContainer: React.FC<ToastContainerProps & { children: React.ReactNode }> = ({
|
|
243
267
|
position = 'top-right',
|
|
244
268
|
className = '',
|
|
245
269
|
children
|
|
@@ -2,75 +2,97 @@ import React, { useState, useEffect, useCallback, useRef } from 'react';
|
|
|
2
2
|
import { ToastProps, ToastAction, ToastContainerProps } from './types';
|
|
3
3
|
|
|
4
4
|
// Simple icon components
|
|
5
|
-
const CheckCircleIcon}> = ({ className = '' }) => (
|
|
5
|
+
const CheckCircleIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
6
6
|
<svg className={className} fill="currentColor" viewBox="0 0 20 20">
|
|
7
7
|
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
|
|
8
8
|
</svg>
|
|
9
9
|
);
|
|
10
10
|
|
|
11
|
-
const ExclamationTriangleIcon}> = ({ className = '' }) => (
|
|
11
|
+
const ExclamationTriangleIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
12
12
|
<svg className={className} fill="currentColor" viewBox="0 0 20 20">
|
|
13
13
|
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
|
|
14
14
|
</svg>
|
|
15
15
|
);
|
|
16
16
|
|
|
17
|
-
const XCircleIcon}> = ({ className = '' }) => (
|
|
17
|
+
const XCircleIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
18
18
|
<svg className={className} fill="currentColor" viewBox="0 0 20 20">
|
|
19
19
|
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" />
|
|
20
20
|
</svg>
|
|
21
21
|
);
|
|
22
22
|
|
|
23
|
-
const InformationCircleIcon}> = ({ className = '' }) => (
|
|
23
|
+
const InformationCircleIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
24
24
|
<svg className={className} fill="currentColor" viewBox="0 0 20 20">
|
|
25
25
|
<path fillRule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clipRule="evenodd" />
|
|
26
26
|
</svg>
|
|
27
27
|
);
|
|
28
28
|
|
|
29
|
-
const XMarkIcon}> = ({ className = '' }) => (
|
|
29
|
+
const XMarkIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
30
30
|
<svg className={className} fill="currentColor" viewBox="0 0 20 20">
|
|
31
31
|
<path fillRule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clipRule="evenodd" />
|
|
32
32
|
</svg>
|
|
33
33
|
);
|
|
34
34
|
|
|
35
35
|
// Get icon for toast type
|
|
36
|
-
const getToastIcon = (type], className) => {
|
|
36
|
+
const getToastIcon = (type: ToastProps['type'], className: string) => {
|
|
37
37
|
switch (type) {
|
|
38
|
-
case 'success'
|
|
39
|
-
|
|
40
|
-
case '
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
case 'success':
|
|
39
|
+
return <CheckCircleIcon className={className} />;
|
|
40
|
+
case 'warning':
|
|
41
|
+
return <ExclamationTriangleIcon className={className} />;
|
|
42
|
+
case 'error':
|
|
43
|
+
return <XCircleIcon className={className} />;
|
|
44
|
+
case 'info':
|
|
45
|
+
return <InformationCircleIcon className={className} />;
|
|
46
|
+
default:
|
|
47
|
+
return null;
|
|
43
48
|
}
|
|
44
49
|
};
|
|
45
50
|
|
|
46
|
-
// Note
|
|
51
|
+
// Note: getToastColors function removed as we're using semantic CSS classes
|
|
52
|
+
/*
|
|
53
|
+
const getToastColors = (type: ToastProps['type'], colors: any) => {
|
|
47
54
|
switch (type) {
|
|
48
|
-
case 'success'
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
border,
|
|
66
|
-
text,
|
|
67
|
-
icon
|
|
55
|
+
case 'success':
|
|
56
|
+
return {
|
|
57
|
+
background: colors.semantic.success + '10',
|
|
58
|
+
border: colors.semantic.success + '30',
|
|
59
|
+
text: colors.semantic.success,
|
|
60
|
+
icon: colors.semantic.success
|
|
61
|
+
};
|
|
62
|
+
case 'warning':
|
|
63
|
+
return {
|
|
64
|
+
background: colors.semantic.warning + '10',
|
|
65
|
+
border: colors.semantic.warning + '30',
|
|
66
|
+
text: colors.semantic.warning,
|
|
67
|
+
icon: colors.semantic.warning
|
|
68
|
+
};
|
|
69
|
+
case 'error':
|
|
70
|
+
return {
|
|
71
|
+
background: colors.semantic.error + '10',
|
|
72
|
+
border: colors.semantic.error + '30',
|
|
73
|
+
text: colors.semantic.error,
|
|
74
|
+
icon: colors.semantic.error
|
|
75
|
+
};
|
|
76
|
+
case 'info':
|
|
77
|
+
return {
|
|
78
|
+
background: colors.semantic.info + '10',
|
|
79
|
+
border: colors.semantic.info + '30',
|
|
80
|
+
text: colors.semantic.info,
|
|
81
|
+
icon: colors.semantic.info
|
|
82
|
+
};
|
|
83
|
+
default:
|
|
84
|
+
return {
|
|
85
|
+
background: colors.surface.surface,
|
|
86
|
+
border: colors.surface.border,
|
|
87
|
+
text: colors.text.primary,
|
|
88
|
+
icon: colors.text.secondary
|
|
89
|
+
};
|
|
68
90
|
}
|
|
69
91
|
};
|
|
70
92
|
*/
|
|
71
93
|
|
|
72
94
|
// Toast Action Button Component
|
|
73
|
-
const ToastActionButton= ({
|
|
95
|
+
const ToastActionButton: React.FC<ToastAction> = ({
|
|
74
96
|
label,
|
|
75
97
|
action,
|
|
76
98
|
variant = 'primary'
|
|
@@ -87,7 +109,7 @@ const ToastActionButton= ({
|
|
|
87
109
|
};
|
|
88
110
|
|
|
89
111
|
// Individual Toast Component
|
|
90
|
-
export const Toast= ({
|
|
112
|
+
export const Toast: React.FC<ToastProps> = ({
|
|
91
113
|
title,
|
|
92
114
|
message,
|
|
93
115
|
type = 'default',
|
|
@@ -104,7 +126,9 @@ export const Toast= ({
|
|
|
104
126
|
variant = 'default',
|
|
105
127
|
className = '',
|
|
106
128
|
}) => {
|
|
107
|
-
// Note
|
|
129
|
+
// Note: theme and colors not needed as we're using semantic CSS classes
|
|
130
|
+
|
|
131
|
+
const [isVisible, setIsVisible] = useState(true);
|
|
108
132
|
const [progressValue, setProgressValue] = useState(100);
|
|
109
133
|
const timeoutRef = useRef<NodeJS.Timeout | null>(null);
|
|
110
134
|
const progressRef = useRef<NodeJS.Timeout | null>(null);
|
|
@@ -190,7 +214,7 @@ export const Toast= ({
|
|
|
190
214
|
<div className="toast__progress">
|
|
191
215
|
<div
|
|
192
216
|
className={`toast__progress-bar toast__progress-bar--${type}`}
|
|
193
|
-
style={{ width}%` }}
|
|
217
|
+
style={{ width: `${progressValue}%` }}
|
|
194
218
|
/>
|
|
195
219
|
</div>
|
|
196
220
|
)}
|
|
@@ -208,7 +232,7 @@ export const Toast= ({
|
|
|
208
232
|
</h3>
|
|
209
233
|
)}
|
|
210
234
|
|
|
211
|
-
<div className={`toast__message ${!title ? 'toast__message--only' }`}>
|
|
235
|
+
<div className={`toast__message ${!title ? 'toast__message--only' : ''}`}>
|
|
212
236
|
{message}
|
|
213
237
|
</div>
|
|
214
238
|
|
|
@@ -239,7 +263,7 @@ export const Toast= ({
|
|
|
239
263
|
};
|
|
240
264
|
|
|
241
265
|
// Toast Container Component
|
|
242
|
-
export const ToastContainer}> = ({
|
|
266
|
+
export const ToastContainer: React.FC<ToastContainerProps & { children: React.ReactNode }> = ({
|
|
243
267
|
position = 'top-right',
|
|
244
268
|
className = '',
|
|
245
269
|
children
|