@sudobility/devops-components-rn 1.0.0 → 1.0.1

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.
Files changed (63) hide show
  1. package/dist/AlertDialog.d.ts.map +1 -1
  2. package/dist/ApiPlayground.d.ts.map +1 -1
  3. package/dist/ApiReference.d.ts.map +1 -1
  4. package/dist/AuditLog.d.ts +26 -4
  5. package/dist/AuditLog.d.ts.map +1 -1
  6. package/dist/BodyMetrics.d.ts.map +1 -1
  7. package/dist/BuildLog.d.ts +16 -5
  8. package/dist/BuildLog.d.ts.map +1 -1
  9. package/dist/ChangelogDisplay.d.ts.map +1 -1
  10. package/dist/CodePlayground.d.ts.map +1 -1
  11. package/dist/ConflictResolver.d.ts.map +1 -1
  12. package/dist/DealPipeline.d.ts.map +1 -1
  13. package/dist/DeploymentStatus.d.ts +11 -4
  14. package/dist/DeploymentStatus.d.ts.map +1 -1
  15. package/dist/DriverLog.d.ts.map +1 -1
  16. package/dist/MemoryUsage.d.ts.map +1 -1
  17. package/dist/MetricsGrid.d.ts +12 -19
  18. package/dist/MetricsGrid.d.ts.map +1 -1
  19. package/dist/PipelineView.d.ts +21 -5
  20. package/dist/PipelineView.d.ts.map +1 -1
  21. package/dist/RegressionTest.d.ts.map +1 -1
  22. package/dist/SystemStatusIndicator.d.ts +9 -8
  23. package/dist/SystemStatusIndicator.d.ts.map +1 -1
  24. package/dist/TestResult.d.ts.map +1 -1
  25. package/dist/TestRunner.d.ts.map +1 -1
  26. package/dist/WebhookLogger.d.ts.map +1 -1
  27. package/dist/WorkflowBuilder.d.ts.map +1 -1
  28. package/dist/WorkflowTemplate.d.ts.map +1 -1
  29. package/dist/XmlParser.d.ts.map +1 -1
  30. package/dist/{index.cjs.js → index.cjs} +634 -614
  31. package/dist/index.cjs.map +1 -0
  32. package/dist/index.d.ts +6 -27
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/{index.esm.js → index.mjs} +637 -617
  35. package/dist/index.mjs.map +1 -0
  36. package/package.json +8 -15
  37. package/src/AlertDialog.tsx +21 -16
  38. package/src/ApiPlayground.tsx +7 -3
  39. package/src/ApiReference.tsx +6 -2
  40. package/src/AuditLog.tsx +244 -21
  41. package/src/BodyMetrics.tsx +6 -2
  42. package/src/BuildLog.tsx +132 -26
  43. package/src/ChangelogDisplay.tsx +6 -2
  44. package/src/CodePlayground.tsx +7 -3
  45. package/src/ConflictResolver.tsx +7 -3
  46. package/src/DealPipeline.tsx +6 -2
  47. package/src/DeploymentStatus.tsx +159 -25
  48. package/src/DriverLog.tsx +4 -2
  49. package/src/MemoryUsage.tsx +6 -2
  50. package/src/MetricsGrid.tsx +99 -94
  51. package/src/PipelineView.tsx +225 -26
  52. package/src/RegressionTest.tsx +6 -2
  53. package/src/SystemStatusIndicator.tsx +70 -47
  54. package/src/TestResult.tsx +6 -2
  55. package/src/TestRunner.tsx +7 -3
  56. package/src/WebhookLogger.tsx +6 -2
  57. package/src/WorkflowBuilder.tsx +7 -3
  58. package/src/WorkflowTemplate.tsx +7 -3
  59. package/src/XmlParser.tsx +4 -2
  60. package/src/index.ts +41 -30
  61. package/src/nativewind.d.ts +3 -0
  62. package/dist/index.cjs.js.map +0 -1
  63. package/dist/index.esm.js.map +0 -1
@@ -1,32 +1,231 @@
1
1
  import React from 'react';
2
- import { Text, Pressable, type ViewProps } from 'react-native';
3
- import { cn } from '@sudobility/components-rn';
2
+ import { View, Text, ScrollView, Pressable } from 'react-native';
3
+ import { cn, Card } from '@sudobility/components-rn';
4
4
 
5
- export interface PipelineViewProps extends ViewProps {
6
- disabled?: boolean;
7
- onPress?: () => void;
8
- children?: React.ReactNode;
5
+ export type PipelineStageStatus =
6
+ | 'pending'
7
+ | 'running'
8
+ | 'success'
9
+ | 'failed'
10
+ | 'skipped'
11
+ | 'cancelled';
12
+
13
+ export interface PipelineStage {
14
+ id: string;
15
+ name: string;
16
+ status: PipelineStageStatus;
17
+ duration?: number;
18
+ startedAt?: Date;
19
+ finishedAt?: Date;
20
+ jobs?: {
21
+ id: string;
22
+ name: string;
23
+ status: PipelineStageStatus;
24
+ }[];
25
+ }
26
+
27
+ export interface PipelineViewProps {
28
+ stages: PipelineStage[];
29
+ pipelineName?: string;
30
+ pipelineId?: string;
31
+ onStagePress?: (stage: PipelineStage) => void;
32
+ className?: string;
9
33
  }
10
34
 
35
+ const statusConfig: Record<
36
+ PipelineStageStatus,
37
+ {
38
+ color: string;
39
+ bgColor: string;
40
+ darkBgColor: string;
41
+ borderColor: string;
42
+ icon: string;
43
+ }
44
+ > = {
45
+ pending: {
46
+ color: 'text-gray-600 dark:text-gray-400',
47
+ bgColor: 'bg-gray-100',
48
+ darkBgColor: 'dark:bg-gray-800',
49
+ borderColor: 'border-gray-300 dark:border-gray-600',
50
+ icon: '○',
51
+ },
52
+ running: {
53
+ color: 'text-blue-600 dark:text-blue-400',
54
+ bgColor: 'bg-blue-100',
55
+ darkBgColor: 'dark:bg-blue-900',
56
+ borderColor: 'border-blue-400 dark:border-blue-500',
57
+ icon: '◐',
58
+ },
59
+ success: {
60
+ color: 'text-green-600 dark:text-green-400',
61
+ bgColor: 'bg-green-100',
62
+ darkBgColor: 'dark:bg-green-900',
63
+ borderColor: 'border-green-400 dark:border-green-500',
64
+ icon: '●',
65
+ },
66
+ failed: {
67
+ color: 'text-red-600 dark:text-red-400',
68
+ bgColor: 'bg-red-100',
69
+ darkBgColor: 'dark:bg-red-900',
70
+ borderColor: 'border-red-400 dark:border-red-500',
71
+ icon: '✗',
72
+ },
73
+ skipped: {
74
+ color: 'text-gray-400 dark:text-gray-600',
75
+ bgColor: 'bg-gray-50',
76
+ darkBgColor: 'dark:bg-gray-900',
77
+ borderColor: 'border-gray-200 dark:border-gray-700',
78
+ icon: '◌',
79
+ },
80
+ cancelled: {
81
+ color: 'text-orange-600 dark:text-orange-400',
82
+ bgColor: 'bg-orange-100',
83
+ darkBgColor: 'dark:bg-orange-900',
84
+ borderColor: 'border-orange-400 dark:border-orange-500',
85
+ icon: '⊘',
86
+ },
87
+ };
88
+
89
+ const formatDuration = (seconds: number): string => {
90
+ if (seconds < 60) return `${seconds}s`;
91
+ const minutes = Math.floor(seconds / 60);
92
+ const remainingSeconds = seconds % 60;
93
+ return `${minutes}m ${remainingSeconds}s`;
94
+ };
95
+
11
96
  export const PipelineView: React.FC<PipelineViewProps> = ({
97
+ stages,
98
+ pipelineName,
99
+ pipelineId,
100
+ onStagePress,
12
101
  className,
13
- children,
14
- disabled = false,
15
- onPress,
16
- ...props
17
- }) => (
18
- <Pressable
19
- onPress={disabled ? undefined : onPress}
20
- disabled={disabled}
21
- accessibilityRole="button"
22
- accessibilityLabel="Pipeline View"
23
- className={cn(
24
- 'p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700',
25
- disabled && 'opacity-50',
26
- className
27
- )}
28
- {...props}
29
- >
30
- {children || <Text className="text-gray-900 dark:text-white">PipelineView Component</Text>}
31
- </Pressable>
32
- );
102
+ }) => {
103
+ const overallStatus = stages.some(s => s.status === 'failed')
104
+ ? 'failed'
105
+ : stages.some(s => s.status === 'running')
106
+ ? 'running'
107
+ : stages.every(s => s.status === 'success')
108
+ ? 'success'
109
+ : stages.every(s => s.status === 'pending')
110
+ ? 'pending'
111
+ : 'running';
112
+
113
+ const overallConfig = statusConfig[overallStatus];
114
+
115
+ return (
116
+ <Card className={cn('overflow-hidden', className)}>
117
+ {(pipelineName || pipelineId) && (
118
+ <View className='px-4 py-3 border-b border-gray-200 dark:border-gray-700'>
119
+ <View className='flex-row items-center justify-between'>
120
+ <View>
121
+ {pipelineName && (
122
+ <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>
123
+ {pipelineName}
124
+ </Text>
125
+ )}
126
+ {pipelineId && (
127
+ <Text className='text-xs font-mono text-gray-500 dark:text-gray-500'>
128
+ #{pipelineId}
129
+ </Text>
130
+ )}
131
+ </View>
132
+ <View
133
+ className={cn(
134
+ 'px-2 py-1 rounded-full',
135
+ overallConfig.bgColor,
136
+ overallConfig.darkBgColor
137
+ )}
138
+ >
139
+ <Text className={cn('text-xs font-medium', overallConfig.color)}>
140
+ {overallConfig.icon}{' '}
141
+ {overallStatus.charAt(0).toUpperCase() + overallStatus.slice(1)}
142
+ </Text>
143
+ </View>
144
+ </View>
145
+ </View>
146
+ )}
147
+ <ScrollView
148
+ horizontal
149
+ showsHorizontalScrollIndicator={true}
150
+ contentContainerStyle={{ padding: 16 }}
151
+ >
152
+ <View className='flex-row items-center'>
153
+ {stages.map((stage, index) => {
154
+ const config = statusConfig[stage.status];
155
+ const isLast = index === stages.length - 1;
156
+
157
+ const stageContent = (
158
+ <View className='items-center'>
159
+ <View
160
+ className={cn(
161
+ 'w-24 p-3 rounded-lg border-2',
162
+ config.bgColor,
163
+ config.darkBgColor,
164
+ config.borderColor
165
+ )}
166
+ >
167
+ <View className='items-center'>
168
+ <Text className={cn('text-lg', config.color)}>
169
+ {config.icon}
170
+ </Text>
171
+ <Text
172
+ className='text-xs font-medium text-gray-900 dark:text-gray-100 mt-1 text-center'
173
+ numberOfLines={2}
174
+ >
175
+ {stage.name}
176
+ </Text>
177
+ {stage.duration !== undefined && (
178
+ <Text className='text-xs text-gray-500 dark:text-gray-500 mt-1'>
179
+ {formatDuration(stage.duration)}
180
+ </Text>
181
+ )}
182
+ </View>
183
+ </View>
184
+ {stage.jobs && stage.jobs.length > 0 && (
185
+ <View className='mt-2'>
186
+ <Text className='text-xs text-gray-500 dark:text-gray-500'>
187
+ {stage.jobs.filter(j => j.status === 'success').length}/
188
+ {stage.jobs.length} jobs
189
+ </Text>
190
+ </View>
191
+ )}
192
+ </View>
193
+ );
194
+
195
+ return (
196
+ <View key={stage.id} className='flex-row items-center'>
197
+ {onStagePress ? (
198
+ <Pressable
199
+ onPress={() => onStagePress(stage)}
200
+ accessibilityRole='button'
201
+ accessibilityLabel={`${stage.name} - ${stage.status}`}
202
+ >
203
+ {stageContent}
204
+ </Pressable>
205
+ ) : (
206
+ stageContent
207
+ )}
208
+ {!isLast && (
209
+ <View className='mx-2'>
210
+ <View className='w-8 h-0.5 bg-gray-300 dark:bg-gray-600' />
211
+ <Text className='absolute -top-2 left-2 text-gray-400 dark:text-gray-600'>
212
+
213
+ </Text>
214
+ </View>
215
+ )}
216
+ </View>
217
+ );
218
+ })}
219
+ </View>
220
+ </ScrollView>
221
+ <View className='px-4 py-2 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700'>
222
+ <Text className='text-xs text-gray-500 dark:text-gray-500'>
223
+ {stages.length} stages |{' '}
224
+ {stages.filter(s => s.status === 'success').length} completed
225
+ </Text>
226
+ </View>
227
+ </Card>
228
+ );
229
+ };
230
+
231
+ export default PipelineView;
@@ -19,9 +19,13 @@ export const RegressionTest: React.FC<RegressionTestProps> = ({
19
19
  disabled && 'opacity-50',
20
20
  className
21
21
  )}
22
- accessibilityLabel="Regression Test"
22
+ accessibilityLabel='Regression Test'
23
23
  {...props}
24
24
  >
25
- {children || <Text className="text-gray-900 dark:text-white">RegressionTest Component</Text>}
25
+ {children || (
26
+ <Text className='text-gray-900 dark:text-white'>
27
+ RegressionTest Component
28
+ </Text>
29
+ )}
26
30
  </View>
27
31
  );
@@ -1,74 +1,97 @@
1
1
  import React from 'react';
2
- import { View, Text, type ViewProps } from 'react-native';
3
- import { cn } from '@sudobility/components-rn';
2
+ import { View, Text, Pressable } from 'react-native';
3
+ import { cn, Card } from '@sudobility/components-rn';
4
4
 
5
- export interface SystemStatusIndicatorProps extends ViewProps {
6
- status: 'operational' | 'degraded' | 'partial' | 'major' | 'maintenance';
7
- label?: string;
8
- showPulse?: boolean;
5
+ export type SystemStatus = 'operational' | 'degraded' | 'major-outage';
6
+
7
+ export interface SystemStatusIndicatorProps {
8
+ status: SystemStatus;
9
+ systemName: string;
10
+ description?: string;
11
+ lastChecked?: Date;
12
+ onPress?: () => void;
13
+ className?: string;
9
14
  }
10
15
 
11
- const statusConfig = {
16
+ const statusConfig: Record<
17
+ SystemStatus,
18
+ { color: string; darkColor: string; label: string }
19
+ > = {
12
20
  operational: {
13
21
  color: 'bg-green-500',
14
- textColor: 'text-green-700 dark:text-green-400',
22
+ darkColor: 'dark:bg-green-400',
15
23
  label: 'Operational',
16
24
  },
17
25
  degraded: {
18
26
  color: 'bg-yellow-500',
19
- textColor: 'text-yellow-700 dark:text-yellow-400',
20
- label: 'Degraded Performance',
21
- },
22
- partial: {
23
- color: 'bg-orange-500',
24
- textColor: 'text-orange-700 dark:text-orange-400',
25
- label: 'Partial Outage',
27
+ darkColor: 'dark:bg-yellow-400',
28
+ label: 'Degraded',
26
29
  },
27
- major: {
30
+ 'major-outage': {
28
31
  color: 'bg-red-500',
29
- textColor: 'text-red-700 dark:text-red-400',
32
+ darkColor: 'dark:bg-red-400',
30
33
  label: 'Major Outage',
31
34
  },
32
- maintenance: {
33
- color: 'bg-blue-500',
34
- textColor: 'text-blue-700 dark:text-blue-400',
35
- label: 'Under Maintenance',
36
- },
37
35
  };
38
36
 
39
- /**
40
- * System status indicator component for displaying service health
41
- */
42
37
  export const SystemStatusIndicator: React.FC<SystemStatusIndicatorProps> = ({
43
38
  status,
44
- label,
45
- showPulse = true,
39
+ systemName,
40
+ description,
41
+ lastChecked,
42
+ onPress,
46
43
  className,
47
- ...props
48
44
  }) => {
49
45
  const config = statusConfig[status];
50
46
 
51
- return (
52
- <View
53
- className={cn('flex-row items-center gap-2', className)}
54
- accessibilityRole="text"
55
- accessibilityLabel={`System status: ${label || config.label}`}
56
- {...props}
57
- >
58
- <View className="relative">
59
- <View className={cn('w-3 h-3 rounded-full', config.color)} />
60
- {showPulse && status === 'operational' && (
61
- <View
47
+ const content = (
48
+ <Card className={cn('p-4', className)}>
49
+ <View className='flex-row items-center'>
50
+ <View
51
+ className={cn(
52
+ 'w-3 h-3 rounded-full mr-3',
53
+ config.color,
54
+ config.darkColor
55
+ )}
56
+ />
57
+ <View className='flex-1'>
58
+ <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>
59
+ {systemName}
60
+ </Text>
61
+ <Text
62
62
  className={cn(
63
- 'absolute inset-0 rounded-full opacity-75',
64
- config.color
63
+ 'text-sm',
64
+ status === 'operational' && 'text-green-600 dark:text-green-400',
65
+ status === 'degraded' && 'text-yellow-600 dark:text-yellow-400',
66
+ status === 'major-outage' && 'text-red-600 dark:text-red-400'
65
67
  )}
66
- />
67
- )}
68
+ >
69
+ {config.label}
70
+ </Text>
71
+ </View>
68
72
  </View>
69
- <Text className={cn('text-sm font-medium', config.textColor)}>
70
- {label || config.label}
71
- </Text>
72
- </View>
73
+ {description && (
74
+ <Text className='mt-2 text-sm text-gray-600 dark:text-gray-400'>
75
+ {description}
76
+ </Text>
77
+ )}
78
+ {lastChecked && (
79
+ <Text className='mt-2 text-xs text-gray-500 dark:text-gray-500'>
80
+ Last checked: {lastChecked.toLocaleString()}
81
+ </Text>
82
+ )}
83
+ </Card>
73
84
  );
85
+
86
+ if (onPress) {
87
+ return (
88
+ <Pressable onPress={onPress} accessibilityRole='button'>
89
+ {content}
90
+ </Pressable>
91
+ );
92
+ }
93
+
94
+ return content;
74
95
  };
96
+
97
+ export default SystemStatusIndicator;
@@ -19,9 +19,13 @@ export const TestResult: React.FC<TestResultProps> = ({
19
19
  disabled && 'opacity-50',
20
20
  className
21
21
  )}
22
- accessibilityLabel="Test Result"
22
+ accessibilityLabel='Test Result'
23
23
  {...props}
24
24
  >
25
- {children || <Text className="text-gray-900 dark:text-white">TestResult Component</Text>}
25
+ {children || (
26
+ <Text className='text-gray-900 dark:text-white'>
27
+ TestResult Component
28
+ </Text>
29
+ )}
26
30
  </View>
27
31
  );
@@ -18,8 +18,8 @@ export const TestRunner: React.FC<TestRunnerProps> = ({
18
18
  <Pressable
19
19
  onPress={disabled ? undefined : onPress}
20
20
  disabled={disabled}
21
- accessibilityRole="button"
22
- accessibilityLabel="Test Runner"
21
+ accessibilityRole='button'
22
+ accessibilityLabel='Test Runner'
23
23
  className={cn(
24
24
  'p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700',
25
25
  disabled && 'opacity-50',
@@ -27,6 +27,10 @@ export const TestRunner: React.FC<TestRunnerProps> = ({
27
27
  )}
28
28
  {...props}
29
29
  >
30
- {children || <Text className="text-gray-900 dark:text-white">TestRunner Component</Text>}
30
+ {children || (
31
+ <Text className='text-gray-900 dark:text-white'>
32
+ TestRunner Component
33
+ </Text>
34
+ )}
31
35
  </Pressable>
32
36
  );
@@ -19,9 +19,13 @@ export const WebhookLogger: React.FC<WebhookLoggerProps> = ({
19
19
  disabled && 'opacity-50',
20
20
  className
21
21
  )}
22
- accessibilityLabel="Webhook Logger"
22
+ accessibilityLabel='Webhook Logger'
23
23
  {...props}
24
24
  >
25
- {children || <Text className="text-gray-900 dark:text-white">WebhookLogger Component</Text>}
25
+ {children || (
26
+ <Text className='text-gray-900 dark:text-white'>
27
+ WebhookLogger Component
28
+ </Text>
29
+ )}
26
30
  </View>
27
31
  );
@@ -18,8 +18,8 @@ export const WorkflowBuilder: React.FC<WorkflowBuilderProps> = ({
18
18
  <Pressable
19
19
  onPress={disabled ? undefined : onPress}
20
20
  disabled={disabled}
21
- accessibilityRole="button"
22
- accessibilityLabel="Workflow Builder"
21
+ accessibilityRole='button'
22
+ accessibilityLabel='Workflow Builder'
23
23
  className={cn(
24
24
  'p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700',
25
25
  disabled && 'opacity-50',
@@ -27,6 +27,10 @@ export const WorkflowBuilder: React.FC<WorkflowBuilderProps> = ({
27
27
  )}
28
28
  {...props}
29
29
  >
30
- {children || <Text className="text-gray-900 dark:text-white">WorkflowBuilder Component</Text>}
30
+ {children || (
31
+ <Text className='text-gray-900 dark:text-white'>
32
+ WorkflowBuilder Component
33
+ </Text>
34
+ )}
31
35
  </Pressable>
32
36
  );
@@ -18,8 +18,8 @@ export const WorkflowTemplate: React.FC<WorkflowTemplateProps> = ({
18
18
  <Pressable
19
19
  onPress={disabled ? undefined : onPress}
20
20
  disabled={disabled}
21
- accessibilityRole="button"
22
- accessibilityLabel="Workflow Template"
21
+ accessibilityRole='button'
22
+ accessibilityLabel='Workflow Template'
23
23
  className={cn(
24
24
  'p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700',
25
25
  disabled && 'opacity-50',
@@ -27,6 +27,10 @@ export const WorkflowTemplate: React.FC<WorkflowTemplateProps> = ({
27
27
  )}
28
28
  {...props}
29
29
  >
30
- {children || <Text className="text-gray-900 dark:text-white">WorkflowTemplate Component</Text>}
30
+ {children || (
31
+ <Text className='text-gray-900 dark:text-white'>
32
+ WorkflowTemplate Component
33
+ </Text>
34
+ )}
31
35
  </Pressable>
32
36
  );
package/src/XmlParser.tsx CHANGED
@@ -19,9 +19,11 @@ export const XmlParser: React.FC<XmlParserProps> = ({
19
19
  disabled && 'opacity-50',
20
20
  className
21
21
  )}
22
- accessibilityLabel="XML Parser"
22
+ accessibilityLabel='XML Parser'
23
23
  {...props}
24
24
  >
25
- {children || <Text className="text-gray-900 dark:text-white">XmlParser Component</Text>}
25
+ {children || (
26
+ <Text className='text-gray-900 dark:text-white'>XmlParser Component</Text>
27
+ )}
26
28
  </View>
27
29
  );
package/src/index.ts CHANGED
@@ -1,32 +1,43 @@
1
- /**
2
- * @sudobility/devops-components-rn
3
- * React Native DevOps components for Sudobility
4
- */
1
+ // DevOps Components for React Native
2
+ // @sudobility/devops-components-rn
5
3
 
6
- export { AlertDialog, type AlertDialogProps } from './AlertDialog';
7
- export { ApiPlayground, type ApiPlaygroundProps } from './ApiPlayground';
8
- export { ApiReference, type ApiReferenceProps } from './ApiReference';
9
- export { AuditLog, type AuditLogProps } from './AuditLog';
10
- export { BodyMetrics, type BodyMetricsProps } from './BodyMetrics';
11
- export { BuildLog, type BuildLogProps } from './BuildLog';
12
- export { ChangelogDisplay, type ChangelogDisplayProps } from './ChangelogDisplay';
13
- export { CodePlayground, type CodePlaygroundProps } from './CodePlayground';
14
- export { ConflictResolver, type ConflictResolverProps } from './ConflictResolver';
15
- export { DealPipeline, type DealPipelineProps } from './DealPipeline';
16
- export { DeploymentStatus, type DeploymentStatusProps } from './DeploymentStatus';
17
- export { DriverLog, type DriverLogProps } from './DriverLog';
18
- export { MemoryUsage, type MemoryUsageProps } from './MemoryUsage';
4
+ // SystemStatusIndicator
19
5
  export {
20
- MetricsGrid,
21
- type MetricsGridProps,
22
- type MetricItem,
23
- } from './MetricsGrid';
24
- export { PipelineView, type PipelineViewProps } from './PipelineView';
25
- export { RegressionTest, type RegressionTestProps } from './RegressionTest';
26
- export { SystemStatusIndicator, type SystemStatusIndicatorProps } from './SystemStatusIndicator';
27
- export { TestResult, type TestResultProps } from './TestResult';
28
- export { TestRunner, type TestRunnerProps } from './TestRunner';
29
- export { WebhookLogger, type WebhookLoggerProps } from './WebhookLogger';
30
- export { WorkflowBuilder, type WorkflowBuilderProps } from './WorkflowBuilder';
31
- export { WorkflowTemplate, type WorkflowTemplateProps } from './WorkflowTemplate';
32
- export { XmlParser, type XmlParserProps } from './XmlParser';
6
+ SystemStatusIndicator,
7
+ type SystemStatusIndicatorProps,
8
+ type SystemStatus,
9
+ } from './SystemStatusIndicator';
10
+
11
+ // DeploymentStatus
12
+ export {
13
+ DeploymentStatus,
14
+ type DeploymentStatusProps,
15
+ type DeploymentState,
16
+ } from './DeploymentStatus';
17
+
18
+ // BuildLog
19
+ export {
20
+ BuildLog,
21
+ type BuildLogProps,
22
+ type LogEntry,
23
+ type LogLevel,
24
+ } from './BuildLog';
25
+
26
+ // MetricsGrid
27
+ export { MetricsGrid, type MetricsGridProps, type Metric } from './MetricsGrid';
28
+
29
+ // AuditLog
30
+ export {
31
+ AuditLog,
32
+ type AuditLogProps,
33
+ type AuditEntry,
34
+ type AuditActionType,
35
+ } from './AuditLog';
36
+
37
+ // PipelineView
38
+ export {
39
+ PipelineView,
40
+ type PipelineViewProps,
41
+ type PipelineStage,
42
+ type PipelineStageStatus,
43
+ } from './PipelineView';
@@ -20,4 +20,7 @@ declare module 'react-native' {
20
20
  interface ScrollViewProps {
21
21
  className?: string;
22
22
  }
23
+ interface TextInputProps {
24
+ className?: string;
25
+ }
23
26
  }