@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,6 +1,6 @@
1
1
  import require$$0 from "react";
2
- import { Modal, View, Text, Pressable, ActivityIndicator, FlatList } from "react-native";
3
- import { cn } from "@sudobility/components-rn";
2
+ import { View, Text, Pressable, ScrollView } from "react-native";
3
+ import { Card, cn } from "@sudobility/components-rn";
4
4
  var jsxRuntime = { exports: {} };
5
5
  var reactJsxRuntime_production_min = {};
6
6
  /**
@@ -929,665 +929,685 @@ function requireJsxRuntime() {
929
929
  return jsxRuntime.exports;
930
930
  }
931
931
  var jsxRuntimeExports = requireJsxRuntime();
932
- const variantClasses = {
933
- default: {
934
- iconBg: "bg-blue-100 dark:bg-blue-900/30",
935
- icon: "text-blue-600 dark:text-blue-400",
936
- button: "bg-blue-600 active:bg-blue-700"
937
- },
938
- danger: {
939
- iconBg: "bg-red-100 dark:bg-red-900/30",
940
- icon: "text-red-600 dark:text-red-400",
941
- button: "bg-red-600 active:bg-red-700"
932
+ const statusConfig$1 = {
933
+ operational: {
934
+ color: "bg-green-500",
935
+ darkColor: "dark:bg-green-400",
936
+ label: "Operational"
942
937
  },
943
- warning: {
944
- iconBg: "bg-yellow-100 dark:bg-yellow-900/30",
945
- icon: "text-yellow-600 dark:text-yellow-400",
946
- button: "bg-yellow-600 active:bg-yellow-700"
938
+ degraded: {
939
+ color: "bg-yellow-500",
940
+ darkColor: "dark:bg-yellow-400",
941
+ label: "Degraded"
947
942
  },
948
- success: {
949
- iconBg: "bg-green-100 dark:bg-green-900/30",
950
- icon: "text-green-600 dark:text-green-400",
951
- button: "bg-green-600 active:bg-green-700"
943
+ "major-outage": {
944
+ color: "bg-red-500",
945
+ darkColor: "dark:bg-red-400",
946
+ label: "Major Outage"
952
947
  }
953
948
  };
954
- const variantIcons = {
955
- default: "ℹ️",
956
- danger: "⚠️",
957
- warning: "⚠️",
958
- success: "✓"
959
- };
960
- const AlertDialog = ({
961
- isOpen,
962
- onClose,
963
- title,
949
+ const SystemStatusIndicator = ({
950
+ status,
951
+ systemName,
964
952
  description,
965
- confirmLabel = "Confirm",
966
- cancelLabel = "Cancel",
967
- onConfirm,
968
- variant = "default",
969
- showCancel = true,
970
- confirmDisabled = false,
971
- loading = false,
972
- className,
973
- ...props
953
+ lastChecked,
954
+ onPress,
955
+ className
974
956
  }) => {
975
- const handleConfirm = () => {
976
- if (!confirmDisabled && !loading) {
977
- onConfirm();
978
- }
979
- };
980
- const styles = variantClasses[variant];
981
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
982
- Modal,
983
- {
984
- visible: isOpen,
985
- transparent: true,
986
- animationType: "fade",
987
- onRequestClose: onClose,
988
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "flex-1 justify-center items-center bg-black/50 p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
957
+ const config = statusConfig$1[status];
958
+ const content = /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: cn("p-4", className), children: [
959
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-center", children: [
960
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
989
961
  View,
990
962
  {
991
963
  className: cn(
992
- "w-full max-w-md bg-white dark:bg-gray-900 rounded-lg shadow-xl",
993
- className
994
- ),
995
- ...props,
996
- children: [
997
- /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "p-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-start gap-4", children: [
998
- /* @__PURE__ */ jsxRuntimeExports.jsx(
999
- View,
1000
- {
1001
- className: cn(
1002
- "w-12 h-12 rounded-full items-center justify-center",
1003
- styles.iconBg
1004
- ),
1005
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: cn("text-xl", styles.icon), children: variantIcons[variant] })
1006
- }
1007
- ),
1008
- /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-1", children: [
1009
- /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-lg font-semibold text-gray-900 dark:text-white mb-2", children: typeof title === "string" ? title : null }),
1010
- typeof title !== "string" && title,
1011
- description && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-sm text-gray-600 dark:text-gray-400", children: typeof description === "string" ? description : null }),
1012
- typeof description !== "string" && description
1013
- ] })
1014
- ] }) }),
1015
- /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row gap-3 px-6 py-4 bg-gray-50 dark:bg-gray-800/50 rounded-b-lg", children: [
1016
- showCancel && /* @__PURE__ */ jsxRuntimeExports.jsx(
1017
- Pressable,
1018
- {
1019
- onPress: onClose,
1020
- disabled: loading,
1021
- accessibilityRole: "button",
1022
- className: cn(
1023
- "flex-1 px-4 py-2 rounded-md border",
1024
- "bg-white dark:bg-gray-700",
1025
- "border-gray-300 dark:border-gray-600",
1026
- loading && "opacity-50"
1027
- ),
1028
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-sm font-medium text-center text-gray-700 dark:text-gray-300", children: cancelLabel })
1029
- }
1030
- ),
1031
- /* @__PURE__ */ jsxRuntimeExports.jsx(
1032
- Pressable,
1033
- {
1034
- onPress: handleConfirm,
1035
- disabled: confirmDisabled || loading,
1036
- accessibilityRole: "button",
1037
- className: cn(
1038
- "flex-1 px-4 py-2 rounded-md",
1039
- styles.button,
1040
- (confirmDisabled || loading) && "opacity-50"
1041
- ),
1042
- children: loading ? /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-center justify-center gap-2", children: [
1043
- /* @__PURE__ */ jsxRuntimeExports.jsx(ActivityIndicator, { size: "small", color: "white" }),
1044
- /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-sm font-medium text-white", children: "Loading..." })
1045
- ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-sm font-medium text-center text-white", children: confirmLabel })
1046
- }
1047
- )
1048
- ] })
1049
- ]
964
+ "w-3 h-3 rounded-full mr-3",
965
+ config.color,
966
+ config.darkColor
967
+ )
1050
968
  }
1051
- ) })
1052
- }
1053
- );
1054
- };
1055
- const ApiPlayground = ({
1056
- className,
1057
- children,
1058
- disabled = false,
1059
- onPress,
1060
- ...props
1061
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1062
- Pressable,
1063
- {
1064
- onPress: disabled ? void 0 : onPress,
1065
- disabled,
1066
- accessibilityRole: "button",
1067
- accessibilityLabel: "API Playground",
1068
- className: cn(
1069
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1070
- disabled && "opacity-50",
1071
- className
1072
- ),
1073
- ...props,
1074
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "ApiPlayground Component" })
1075
- }
1076
- );
1077
- const ApiReference = ({
1078
- className,
1079
- children,
1080
- disabled,
1081
- ...props
1082
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1083
- View,
1084
- {
1085
- className: cn(
1086
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1087
- disabled && "opacity-50",
1088
- className
1089
- ),
1090
- accessibilityLabel: "API Reference",
1091
- ...props,
1092
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "ApiReference Component" })
1093
- }
1094
- );
1095
- const AuditLog = ({
1096
- className,
1097
- children,
1098
- disabled,
1099
- ...props
1100
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1101
- View,
1102
- {
1103
- className: cn(
1104
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1105
- disabled && "opacity-50",
1106
- className
1107
- ),
1108
- accessibilityLabel: "Audit Log",
1109
- ...props,
1110
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "AuditLog Component" })
1111
- }
1112
- );
1113
- const BodyMetrics = ({
1114
- className,
1115
- children,
1116
- disabled,
1117
- ...props
1118
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1119
- View,
1120
- {
1121
- className: cn(
1122
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1123
- disabled && "opacity-50",
1124
- className
1125
- ),
1126
- accessibilityLabel: "Body Metrics",
1127
- ...props,
1128
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "BodyMetrics Component" })
1129
- }
1130
- );
1131
- const BuildLog = ({
1132
- className,
1133
- children,
1134
- disabled = false,
1135
- onPress,
1136
- ...props
1137
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1138
- Pressable,
1139
- {
1140
- onPress: disabled ? void 0 : onPress,
1141
- disabled,
1142
- accessibilityRole: "button",
1143
- accessibilityLabel: "Build Log",
1144
- className: cn(
1145
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1146
- disabled && "opacity-50",
1147
- className
1148
- ),
1149
- ...props,
1150
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "BuildLog Component" })
1151
- }
1152
- );
1153
- const ChangelogDisplay = ({
1154
- className,
1155
- children,
1156
- disabled,
1157
- ...props
1158
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1159
- View,
1160
- {
1161
- className: cn(
1162
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1163
- disabled && "opacity-50",
1164
- className
1165
- ),
1166
- accessibilityLabel: "Changelog Display",
1167
- ...props,
1168
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "ChangelogDisplay Component" })
1169
- }
1170
- );
1171
- const CodePlayground = ({
1172
- className,
1173
- children,
1174
- disabled = false,
1175
- onPress,
1176
- ...props
1177
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1178
- Pressable,
1179
- {
1180
- onPress: disabled ? void 0 : onPress,
1181
- disabled,
1182
- accessibilityRole: "button",
1183
- accessibilityLabel: "Code Playground",
1184
- className: cn(
1185
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1186
- disabled && "opacity-50",
1187
- className
1188
- ),
1189
- ...props,
1190
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "CodePlayground Component" })
1191
- }
1192
- );
1193
- const ConflictResolver = ({
1194
- className,
1195
- children,
1196
- disabled = false,
1197
- onPress,
1198
- ...props
1199
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1200
- Pressable,
1201
- {
1202
- onPress: disabled ? void 0 : onPress,
1203
- disabled,
1204
- accessibilityRole: "button",
1205
- accessibilityLabel: "Conflict Resolver",
1206
- className: cn(
1207
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1208
- disabled && "opacity-50",
1209
- className
1210
- ),
1211
- ...props,
1212
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "ConflictResolver Component" })
969
+ ),
970
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-1", children: [
971
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-base font-semibold text-gray-900 dark:text-gray-100", children: systemName }),
972
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
973
+ Text,
974
+ {
975
+ className: cn(
976
+ "text-sm",
977
+ status === "operational" && "text-green-600 dark:text-green-400",
978
+ status === "degraded" && "text-yellow-600 dark:text-yellow-400",
979
+ status === "major-outage" && "text-red-600 dark:text-red-400"
980
+ ),
981
+ children: config.label
982
+ }
983
+ )
984
+ ] })
985
+ ] }),
986
+ description && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "mt-2 text-sm text-gray-600 dark:text-gray-400", children: description }),
987
+ lastChecked && /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "mt-2 text-xs text-gray-500 dark:text-gray-500", children: [
988
+ "Last checked: ",
989
+ lastChecked.toLocaleString()
990
+ ] })
991
+ ] });
992
+ if (onPress) {
993
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Pressable, { onPress, accessibilityRole: "button", children: content });
1213
994
  }
1214
- );
1215
- const DealPipeline = ({
1216
- className,
1217
- children,
1218
- disabled,
1219
- ...props
1220
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1221
- View,
1222
- {
1223
- className: cn(
1224
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1225
- disabled && "opacity-50",
1226
- className
1227
- ),
1228
- accessibilityLabel: "Deal Pipeline",
1229
- ...props,
1230
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "DealPipeline Component" })
995
+ return content;
996
+ };
997
+ const stateConfig = {
998
+ pending: {
999
+ color: "text-gray-600 dark:text-gray-400",
1000
+ bgColor: "bg-gray-100",
1001
+ darkBgColor: "dark:bg-gray-800",
1002
+ label: "Pending",
1003
+ icon: "⏳"
1004
+ },
1005
+ building: {
1006
+ color: "text-blue-600 dark:text-blue-400",
1007
+ bgColor: "bg-blue-100",
1008
+ darkBgColor: "dark:bg-blue-900",
1009
+ label: "Building",
1010
+ icon: "🔨"
1011
+ },
1012
+ deploying: {
1013
+ color: "text-purple-600 dark:text-purple-400",
1014
+ bgColor: "bg-purple-100",
1015
+ darkBgColor: "dark:bg-purple-900",
1016
+ label: "Deploying",
1017
+ icon: "🚀"
1018
+ },
1019
+ success: {
1020
+ color: "text-green-600 dark:text-green-400",
1021
+ bgColor: "bg-green-100",
1022
+ darkBgColor: "dark:bg-green-900",
1023
+ label: "Success",
1024
+ icon: "✓"
1025
+ },
1026
+ failed: {
1027
+ color: "text-red-600 dark:text-red-400",
1028
+ bgColor: "bg-red-100",
1029
+ darkBgColor: "dark:bg-red-900",
1030
+ label: "Failed",
1031
+ icon: "✗"
1032
+ },
1033
+ cancelled: {
1034
+ color: "text-orange-600 dark:text-orange-400",
1035
+ bgColor: "bg-orange-100",
1036
+ darkBgColor: "dark:bg-orange-900",
1037
+ label: "Cancelled",
1038
+ icon: "⊘"
1231
1039
  }
1232
- );
1040
+ };
1041
+ const formatDuration$1 = (seconds) => {
1042
+ if (seconds < 60) return `${seconds}s`;
1043
+ const minutes = Math.floor(seconds / 60);
1044
+ const remainingSeconds = seconds % 60;
1045
+ if (minutes < 60) return `${minutes}m ${remainingSeconds}s`;
1046
+ const hours = Math.floor(minutes / 60);
1047
+ const remainingMinutes = minutes % 60;
1048
+ return `${hours}h ${remainingMinutes}m`;
1049
+ };
1233
1050
  const DeploymentStatus = ({
1234
- className,
1235
- children,
1236
- disabled = false,
1051
+ state,
1052
+ environment,
1053
+ version,
1054
+ timestamp,
1055
+ commitHash,
1056
+ commitMessage,
1057
+ duration,
1237
1058
  onPress,
1238
- ...props
1239
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1240
- Pressable,
1241
- {
1242
- onPress: disabled ? void 0 : onPress,
1243
- disabled,
1244
- accessibilityRole: "button",
1245
- accessibilityLabel: "Deployment Status",
1246
- className: cn(
1247
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1248
- disabled && "opacity-50",
1249
- className
1250
- ),
1251
- ...props,
1252
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "DeploymentStatus Component" })
1253
- }
1254
- );
1255
- const DriverLog = ({
1256
- className,
1257
- children,
1258
- disabled,
1259
- ...props
1260
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1261
- View,
1262
- {
1263
- className: cn(
1264
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1265
- disabled && "opacity-50",
1266
- className
1267
- ),
1268
- accessibilityLabel: "Driver Log",
1269
- ...props,
1270
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "DriverLog Component" })
1271
- }
1272
- );
1273
- const MemoryUsage = ({
1274
- className,
1275
- children,
1276
- disabled,
1277
- ...props
1278
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1279
- View,
1280
- {
1281
- className: cn(
1282
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1283
- disabled && "opacity-50",
1284
- className
1285
- ),
1286
- accessibilityLabel: "Memory Usage",
1287
- ...props,
1288
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "MemoryUsage Component" })
1289
- }
1290
- );
1291
- const colorClasses = {
1292
- blue: "text-blue-600 dark:text-blue-400",
1293
- green: "text-green-600 dark:text-green-400",
1294
- purple: "text-purple-600 dark:text-purple-400",
1295
- orange: "text-orange-600 dark:text-orange-400",
1296
- pink: "text-pink-600 dark:text-pink-400",
1297
- gray: "text-gray-600 dark:text-gray-400"
1298
- };
1299
- const MetricCard = ({ metric }) => {
1300
- const colorClass = metric.color ? colorClasses[metric.color] : colorClasses.blue;
1301
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "bg-white dark:bg-gray-800 rounded-xl p-6 border border-gray-200 dark:border-gray-700 items-center mb-4 mx-2", children: [
1302
- metric.icon && /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: cn("mb-4", colorClass), children: metric.icon }),
1303
- /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "gap-2 items-center", children: [
1304
- /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: cn("text-3xl font-bold", colorClass), children: metric.value }),
1305
- /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-600 dark:text-gray-400 font-medium", children: metric.label }),
1306
- metric.trend && /* @__PURE__ */ jsxRuntimeExports.jsxs(
1059
+ className
1060
+ }) => {
1061
+ const config = stateConfig[state];
1062
+ const content = /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: cn("p-4", className), children: [
1063
+ /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "flex-row items-start justify-between", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-1", children: [
1064
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-center", children: [
1065
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1066
+ View,
1067
+ {
1068
+ className: cn(
1069
+ "px-2 py-1 rounded-md mr-2",
1070
+ config.bgColor,
1071
+ config.darkBgColor
1072
+ ),
1073
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: cn("text-xs font-medium", config.color), children: [
1074
+ config.icon,
1075
+ " ",
1076
+ config.label
1077
+ ] })
1078
+ }
1079
+ ),
1080
+ /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded-md", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-xs font-medium text-gray-700 dark:text-gray-300", children: environment }) })
1081
+ ] }),
1082
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "mt-2 text-base font-semibold text-gray-900 dark:text-gray-100", children: version }),
1083
+ commitHash && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "mt-1 text-sm font-mono text-gray-600 dark:text-gray-400", children: commitHash.substring(0, 7) }),
1084
+ commitMessage && /* @__PURE__ */ jsxRuntimeExports.jsx(
1307
1085
  Text,
1308
1086
  {
1309
- className: cn(
1310
- "text-sm font-semibold",
1311
- metric.trend.direction === "up" ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"
1312
- ),
1313
- children: [
1314
- metric.trend.direction === "up" ? "↑" : "↓",
1315
- " ",
1316
- metric.trend.value
1317
- ]
1087
+ className: "mt-1 text-sm text-gray-600 dark:text-gray-400",
1088
+ numberOfLines: 2,
1089
+ children: commitMessage
1318
1090
  }
1319
1091
  )
1092
+ ] }) }),
1093
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-center justify-between mt-3 pt-3 border-t border-gray-200 dark:border-gray-700", children: [
1094
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-xs text-gray-500 dark:text-gray-500", children: timestamp.toLocaleString() }),
1095
+ duration !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "text-xs text-gray-500 dark:text-gray-500", children: [
1096
+ "Duration: ",
1097
+ formatDuration$1(duration)
1098
+ ] })
1320
1099
  ] })
1321
1100
  ] });
1101
+ if (onPress) {
1102
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Pressable, { onPress, accessibilityRole: "button", children: content });
1103
+ }
1104
+ return content;
1322
1105
  };
1323
- const MetricsGrid = ({
1106
+ const levelConfig = {
1107
+ info: {
1108
+ color: "text-blue-600 dark:text-blue-400",
1109
+ bgColor: "bg-blue-50",
1110
+ darkBgColor: "dark:bg-blue-950",
1111
+ prefix: "INFO"
1112
+ },
1113
+ warn: {
1114
+ color: "text-yellow-600 dark:text-yellow-400",
1115
+ bgColor: "bg-yellow-50",
1116
+ darkBgColor: "dark:bg-yellow-950",
1117
+ prefix: "WARN"
1118
+ },
1119
+ error: {
1120
+ color: "text-red-600 dark:text-red-400",
1121
+ bgColor: "bg-red-50",
1122
+ darkBgColor: "dark:bg-red-950",
1123
+ prefix: "ERROR"
1124
+ },
1125
+ debug: {
1126
+ color: "text-gray-600 dark:text-gray-400",
1127
+ bgColor: "bg-gray-50",
1128
+ darkBgColor: "dark:bg-gray-900",
1129
+ prefix: "DEBUG"
1130
+ },
1131
+ success: {
1132
+ color: "text-green-600 dark:text-green-400",
1133
+ bgColor: "bg-green-50",
1134
+ darkBgColor: "dark:bg-green-950",
1135
+ prefix: "SUCCESS"
1136
+ }
1137
+ };
1138
+ const formatTime = (date) => {
1139
+ return date.toLocaleTimeString("en-US", {
1140
+ hour12: false,
1141
+ hour: "2-digit",
1142
+ minute: "2-digit",
1143
+ second: "2-digit"
1144
+ });
1145
+ };
1146
+ const BuildLog = ({
1147
+ entries,
1324
1148
  title,
1325
- description,
1326
- metrics,
1327
- columns = 2,
1328
- className,
1329
- ...props
1149
+ maxHeight = 400,
1150
+ showTimestamp = true,
1151
+ showSource = false,
1152
+ className
1330
1153
  }) => {
1331
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: cn("py-8 px-4", className), ...props, children: [
1332
- (title || description) && /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "items-center mb-8", children: [
1333
- title && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-2xl font-bold text-gray-900 dark:text-white mb-4 text-center", children: title }),
1334
- description && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-lg text-gray-600 dark:text-gray-300 text-center max-w-lg", children: description })
1335
- ] }),
1154
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: cn("overflow-hidden", className), children: [
1155
+ title && /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "px-4 py-3 border-b border-gray-200 dark:border-gray-700", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-base font-semibold text-gray-900 dark:text-gray-100", children: title }) }),
1336
1156
  /* @__PURE__ */ jsxRuntimeExports.jsx(
1337
- FlatList,
1157
+ ScrollView,
1338
1158
  {
1339
- data: metrics,
1340
- keyExtractor: (_, index) => index.toString(),
1341
- numColumns: columns > 2 ? 2 : columns,
1342
- renderItem: ({ item }) => /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx(MetricCard, { metric: item }) }),
1343
- scrollEnabled: false
1159
+ style: { maxHeight },
1160
+ className: "bg-gray-900 dark:bg-black",
1161
+ showsVerticalScrollIndicator: true,
1162
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "p-3", children: entries.map((entry) => {
1163
+ const config = levelConfig[entry.level];
1164
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
1165
+ View,
1166
+ {
1167
+ className: cn(
1168
+ "flex-row flex-wrap py-1 px-2 mb-1 rounded",
1169
+ config.bgColor,
1170
+ config.darkBgColor
1171
+ ),
1172
+ children: [
1173
+ showTimestamp && /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "font-mono text-xs text-gray-500 dark:text-gray-500 mr-2", children: [
1174
+ "[",
1175
+ formatTime(entry.timestamp),
1176
+ "]"
1177
+ ] }),
1178
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
1179
+ Text,
1180
+ {
1181
+ className: cn(
1182
+ "font-mono text-xs font-bold mr-2",
1183
+ config.color
1184
+ ),
1185
+ children: [
1186
+ "[",
1187
+ config.prefix,
1188
+ "]"
1189
+ ]
1190
+ }
1191
+ ),
1192
+ showSource && entry.source && /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "font-mono text-xs text-gray-400 dark:text-gray-600 mr-2", children: [
1193
+ "[",
1194
+ entry.source,
1195
+ "]"
1196
+ ] }),
1197
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "font-mono text-xs text-gray-200 dark:text-gray-300 flex-1", children: entry.message })
1198
+ ]
1199
+ },
1200
+ entry.id
1201
+ );
1202
+ }) })
1344
1203
  }
1345
- )
1204
+ ),
1205
+ /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "px-4 py-2 bg-gray-800 dark:bg-gray-950 border-t border-gray-700", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "text-xs text-gray-400 dark:text-gray-500", children: [
1206
+ entries.length,
1207
+ " log entries"
1208
+ ] }) })
1346
1209
  ] });
1347
1210
  };
1348
- const PipelineView = ({
1349
- className,
1350
- children,
1351
- disabled = false,
1352
- onPress,
1353
- ...props
1354
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1355
- Pressable,
1356
- {
1357
- onPress: disabled ? void 0 : onPress,
1358
- disabled,
1359
- accessibilityRole: "button",
1360
- accessibilityLabel: "Pipeline View",
1361
- className: cn(
1362
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1363
- disabled && "opacity-50",
1364
- className
1365
- ),
1366
- ...props,
1367
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "PipelineView Component" })
1368
- }
1369
- );
1370
- const RegressionTest = ({
1371
- className,
1372
- children,
1373
- disabled,
1374
- ...props
1375
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1376
- View,
1377
- {
1378
- className: cn(
1379
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1380
- disabled && "opacity-50",
1381
- className
1382
- ),
1383
- accessibilityLabel: "Regression Test",
1384
- ...props,
1385
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "RegressionTest Component" })
1386
- }
1387
- );
1388
- const statusConfig = {
1389
- operational: {
1390
- color: "bg-green-500",
1391
- textColor: "text-green-700 dark:text-green-400",
1392
- label: "Operational"
1393
- },
1394
- degraded: {
1395
- color: "bg-yellow-500",
1396
- textColor: "text-yellow-700 dark:text-yellow-400",
1397
- label: "Degraded Performance"
1398
- },
1399
- partial: {
1400
- color: "bg-orange-500",
1401
- textColor: "text-orange-700 dark:text-orange-400",
1402
- label: "Partial Outage"
1403
- },
1404
- major: {
1405
- color: "bg-red-500",
1406
- textColor: "text-red-700 dark:text-red-400",
1407
- label: "Major Outage"
1408
- },
1409
- maintenance: {
1410
- color: "bg-blue-500",
1411
- textColor: "text-blue-700 dark:text-blue-400",
1412
- label: "Under Maintenance"
1413
- }
1211
+ const formatChange = (change) => {
1212
+ const sign = change >= 0 ? "+" : "";
1213
+ return sign + change.toFixed(1) + "%";
1414
1214
  };
1415
- const SystemStatusIndicator = ({
1416
- status,
1417
- label,
1418
- showPulse = true,
1419
- className,
1420
- ...props
1215
+ const MetricsGrid = ({
1216
+ metrics,
1217
+ columns = 2,
1218
+ onMetricPress,
1219
+ className
1421
1220
  }) => {
1422
- const config = statusConfig[status];
1423
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
1424
- View,
1425
- {
1426
- className: cn("flex-row items-center gap-2", className),
1427
- accessibilityRole: "text",
1428
- accessibilityLabel: `System status: ${label || config.label}`,
1429
- ...props,
1430
- children: [
1431
- /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "relative", children: [
1432
- /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: cn("w-3 h-3 rounded-full", config.color) }),
1433
- showPulse && status === "operational" && /* @__PURE__ */ jsxRuntimeExports.jsx(
1221
+ const columnWidthClass = {
1222
+ 1: "w-full",
1223
+ 2: "w-1/2",
1224
+ 3: "w-1/3",
1225
+ 4: "w-1/4"
1226
+ }[columns];
1227
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: cn("flex-row flex-wrap -m-1", className), children: metrics.map((metric) => {
1228
+ const content = /* @__PURE__ */ jsxRuntimeExports.jsx(Card, { className: "p-4 m-1 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-start justify-between", children: [
1229
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-1", children: [
1230
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-sm text-gray-600 dark:text-gray-400 mb-1", children: metric.label }),
1231
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-baseline", children: [
1232
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-2xl font-bold text-gray-900 dark:text-gray-100", children: metric.value }),
1233
+ metric.unit && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-sm text-gray-500 dark:text-gray-500 ml-1", children: metric.unit })
1234
+ ] }),
1235
+ metric.change !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-center mt-2", children: [
1236
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1434
1237
  View,
1435
1238
  {
1436
1239
  className: cn(
1437
- "absolute inset-0 rounded-full opacity-75",
1438
- config.color
1240
+ "px-1.5 py-0.5 rounded",
1241
+ metric.change >= 0 ? "bg-green-100 dark:bg-green-900" : "bg-red-100 dark:bg-red-900"
1242
+ ),
1243
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
1244
+ Text,
1245
+ {
1246
+ className: cn(
1247
+ "text-xs font-medium",
1248
+ metric.change >= 0 ? "text-green-700 dark:text-green-300" : "text-red-700 dark:text-red-300"
1249
+ ),
1250
+ children: formatChange(metric.change)
1251
+ }
1439
1252
  )
1440
1253
  }
1441
- )
1442
- ] }),
1443
- /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: cn("text-sm font-medium", config.textColor), children: label || config.label })
1444
- ]
1254
+ ),
1255
+ metric.changeLabel && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-xs text-gray-500 dark:text-gray-500 ml-2", children: metric.changeLabel })
1256
+ ] })
1257
+ ] }),
1258
+ metric.icon && /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "ml-2", children: metric.icon })
1259
+ ] }) });
1260
+ if (onMetricPress) {
1261
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: columnWidthClass, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
1262
+ Pressable,
1263
+ {
1264
+ onPress: () => onMetricPress(metric),
1265
+ accessibilityRole: "button",
1266
+ accessibilityLabel: metric.label + ": " + metric.value + (metric.unit || ""),
1267
+ children: content
1268
+ }
1269
+ ) }, metric.id);
1445
1270
  }
1446
- );
1271
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: columnWidthClass, children: content }, metric.id);
1272
+ }) });
1447
1273
  };
1448
- const TestResult = ({
1449
- className,
1450
- children,
1451
- disabled,
1452
- ...props
1453
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1454
- View,
1455
- {
1456
- className: cn(
1457
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1458
- disabled && "opacity-50",
1459
- className
1460
- ),
1461
- accessibilityLabel: "Test Result",
1462
- ...props,
1463
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "TestResult Component" })
1464
- }
1465
- );
1466
- const TestRunner = ({
1467
- className,
1468
- children,
1469
- disabled = false,
1470
- onPress,
1471
- ...props
1472
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1473
- Pressable,
1474
- {
1475
- onPress: disabled ? void 0 : onPress,
1476
- disabled,
1477
- accessibilityRole: "button",
1478
- accessibilityLabel: "Test Runner",
1479
- className: cn(
1480
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1481
- disabled && "opacity-50",
1482
- className
1483
- ),
1484
- ...props,
1485
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "TestRunner Component" })
1486
- }
1487
- );
1488
- const WebhookLogger = ({
1489
- className,
1490
- children,
1491
- disabled,
1492
- ...props
1493
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1494
- View,
1495
- {
1496
- className: cn(
1497
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1498
- disabled && "opacity-50",
1499
- className
1500
- ),
1501
- accessibilityLabel: "Webhook Logger",
1502
- ...props,
1503
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "WebhookLogger Component" })
1504
- }
1505
- );
1506
- const WorkflowBuilder = ({
1507
- className,
1508
- children,
1509
- disabled = false,
1510
- onPress,
1511
- ...props
1512
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1513
- Pressable,
1514
- {
1515
- onPress: disabled ? void 0 : onPress,
1516
- disabled,
1517
- accessibilityRole: "button",
1518
- accessibilityLabel: "Workflow Builder",
1519
- className: cn(
1520
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1521
- disabled && "opacity-50",
1522
- className
1523
- ),
1524
- ...props,
1525
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "WorkflowBuilder Component" })
1274
+ const actionConfig = {
1275
+ create: {
1276
+ color: "text-green-700 dark:text-green-300",
1277
+ bgColor: "bg-green-100",
1278
+ darkBgColor: "dark:bg-green-900",
1279
+ icon: "+"
1280
+ },
1281
+ update: {
1282
+ color: "text-blue-700 dark:text-blue-300",
1283
+ bgColor: "bg-blue-100",
1284
+ darkBgColor: "dark:bg-blue-900",
1285
+ icon: "~"
1286
+ },
1287
+ delete: {
1288
+ color: "text-red-700 dark:text-red-300",
1289
+ bgColor: "bg-red-100",
1290
+ darkBgColor: "dark:bg-red-900",
1291
+ icon: "-"
1292
+ },
1293
+ login: {
1294
+ color: "text-purple-700 dark:text-purple-300",
1295
+ bgColor: "bg-purple-100",
1296
+ darkBgColor: "dark:bg-purple-900",
1297
+ icon: "→"
1298
+ },
1299
+ logout: {
1300
+ color: "text-gray-700 dark:text-gray-300",
1301
+ bgColor: "bg-gray-100",
1302
+ darkBgColor: "dark:bg-gray-800",
1303
+ icon: ""
1304
+ },
1305
+ access: {
1306
+ color: "text-cyan-700 dark:text-cyan-300",
1307
+ bgColor: "bg-cyan-100",
1308
+ darkBgColor: "dark:bg-cyan-900",
1309
+ icon: "◉"
1310
+ },
1311
+ export: {
1312
+ color: "text-orange-700 dark:text-orange-300",
1313
+ bgColor: "bg-orange-100",
1314
+ darkBgColor: "dark:bg-orange-900",
1315
+ icon: "↑"
1316
+ },
1317
+ import: {
1318
+ color: "text-teal-700 dark:text-teal-300",
1319
+ bgColor: "bg-teal-100",
1320
+ darkBgColor: "dark:bg-teal-900",
1321
+ icon: "↓"
1322
+ },
1323
+ approve: {
1324
+ color: "text-emerald-700 dark:text-emerald-300",
1325
+ bgColor: "bg-emerald-100",
1326
+ darkBgColor: "dark:bg-emerald-900",
1327
+ icon: ""
1328
+ },
1329
+ reject: {
1330
+ color: "text-rose-700 dark:text-rose-300",
1331
+ bgColor: "bg-rose-100",
1332
+ darkBgColor: "dark:bg-rose-900",
1333
+ icon: "✗"
1334
+ },
1335
+ deploy: {
1336
+ color: "text-indigo-700 dark:text-indigo-300",
1337
+ bgColor: "bg-indigo-100",
1338
+ darkBgColor: "dark:bg-indigo-900",
1339
+ icon: "▲"
1340
+ },
1341
+ rollback: {
1342
+ color: "text-amber-700 dark:text-amber-300",
1343
+ bgColor: "bg-amber-100",
1344
+ darkBgColor: "dark:bg-amber-900",
1345
+ icon: "↺"
1526
1346
  }
1527
- );
1528
- const WorkflowTemplate = ({
1529
- className,
1530
- children,
1531
- disabled = false,
1532
- onPress,
1533
- ...props
1534
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1535
- Pressable,
1536
- {
1537
- onPress: disabled ? void 0 : onPress,
1538
- disabled,
1539
- accessibilityRole: "button",
1540
- accessibilityLabel: "Workflow Template",
1541
- className: cn(
1542
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1543
- disabled && "opacity-50",
1544
- className
1545
- ),
1546
- ...props,
1547
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "WorkflowTemplate Component" })
1347
+ };
1348
+ const formatTimestamp = (date) => {
1349
+ const now = /* @__PURE__ */ new Date();
1350
+ const diffMs = now.getTime() - date.getTime();
1351
+ const diffMins = Math.floor(diffMs / 6e4);
1352
+ const diffHours = Math.floor(diffMs / 36e5);
1353
+ const diffDays = Math.floor(diffMs / 864e5);
1354
+ if (diffMins < 1) return "Just now";
1355
+ if (diffMins < 60) return `${diffMins}m ago`;
1356
+ if (diffHours < 24) return `${diffHours}h ago`;
1357
+ if (diffDays < 7) return `${diffDays}d ago`;
1358
+ return date.toLocaleDateString();
1359
+ };
1360
+ const AuditLog = ({
1361
+ entries,
1362
+ title,
1363
+ maxHeight = 500,
1364
+ onEntryPress,
1365
+ className
1366
+ }) => {
1367
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: cn("overflow-hidden", className), children: [
1368
+ title && /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "px-4 py-3 border-b border-gray-200 dark:border-gray-700", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-base font-semibold text-gray-900 dark:text-gray-100", children: title }) }),
1369
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollView, { style: { maxHeight }, showsVerticalScrollIndicator: true, children: entries.map((entry, index) => {
1370
+ const config = actionConfig[entry.action];
1371
+ const isLast = index === entries.length - 1;
1372
+ const content = /* @__PURE__ */ jsxRuntimeExports.jsx(
1373
+ View,
1374
+ {
1375
+ className: cn(
1376
+ "px-4 py-3",
1377
+ !isLast && "border-b border-gray-100 dark:border-gray-800"
1378
+ ),
1379
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-start", children: [
1380
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1381
+ View,
1382
+ {
1383
+ className: cn(
1384
+ "w-8 h-8 rounded-full items-center justify-center mr-3",
1385
+ config.bgColor,
1386
+ config.darkBgColor
1387
+ ),
1388
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: cn("text-sm font-bold", config.color), children: config.icon })
1389
+ }
1390
+ ),
1391
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-1", children: [
1392
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-center flex-wrap", children: [
1393
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: entry.actor.name }),
1394
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "text-sm text-gray-600 dark:text-gray-400 mx-1", children: [
1395
+ entry.action,
1396
+ "d"
1397
+ ] }),
1398
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: entry.resource.name })
1399
+ ] }),
1400
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-center mt-1", children: [
1401
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1402
+ View,
1403
+ {
1404
+ className: cn(
1405
+ "px-1.5 py-0.5 rounded mr-2",
1406
+ config.bgColor,
1407
+ config.darkBgColor
1408
+ ),
1409
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
1410
+ Text,
1411
+ {
1412
+ className: cn(
1413
+ "text-xs font-medium uppercase",
1414
+ config.color
1415
+ ),
1416
+ children: entry.action
1417
+ }
1418
+ )
1419
+ }
1420
+ ),
1421
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-xs text-gray-500 dark:text-gray-500", children: entry.resource.type })
1422
+ ] }),
1423
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-center mt-2", children: [
1424
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-xs text-gray-400 dark:text-gray-600", children: formatTimestamp(entry.timestamp) }),
1425
+ entry.ipAddress && /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "text-xs text-gray-400 dark:text-gray-600 ml-2", children: [
1426
+ "IP: ",
1427
+ entry.ipAddress
1428
+ ] })
1429
+ ] })
1430
+ ] })
1431
+ ] })
1432
+ }
1433
+ );
1434
+ if (onEntryPress) {
1435
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
1436
+ Pressable,
1437
+ {
1438
+ onPress: () => onEntryPress(entry),
1439
+ accessibilityRole: "button",
1440
+ children: content
1441
+ },
1442
+ entry.id
1443
+ );
1444
+ }
1445
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(View, { children: content }, entry.id);
1446
+ }) }),
1447
+ /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "px-4 py-2 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "text-xs text-gray-500 dark:text-gray-500", children: [
1448
+ "Showing ",
1449
+ entries.length,
1450
+ " audit entries"
1451
+ ] }) })
1452
+ ] });
1453
+ };
1454
+ const statusConfig = {
1455
+ pending: {
1456
+ color: "text-gray-600 dark:text-gray-400",
1457
+ bgColor: "bg-gray-100",
1458
+ darkBgColor: "dark:bg-gray-800",
1459
+ borderColor: "border-gray-300 dark:border-gray-600",
1460
+ icon: "○"
1461
+ },
1462
+ running: {
1463
+ color: "text-blue-600 dark:text-blue-400",
1464
+ bgColor: "bg-blue-100",
1465
+ darkBgColor: "dark:bg-blue-900",
1466
+ borderColor: "border-blue-400 dark:border-blue-500",
1467
+ icon: "◐"
1468
+ },
1469
+ success: {
1470
+ color: "text-green-600 dark:text-green-400",
1471
+ bgColor: "bg-green-100",
1472
+ darkBgColor: "dark:bg-green-900",
1473
+ borderColor: "border-green-400 dark:border-green-500",
1474
+ icon: "●"
1475
+ },
1476
+ failed: {
1477
+ color: "text-red-600 dark:text-red-400",
1478
+ bgColor: "bg-red-100",
1479
+ darkBgColor: "dark:bg-red-900",
1480
+ borderColor: "border-red-400 dark:border-red-500",
1481
+ icon: "✗"
1482
+ },
1483
+ skipped: {
1484
+ color: "text-gray-400 dark:text-gray-600",
1485
+ bgColor: "bg-gray-50",
1486
+ darkBgColor: "dark:bg-gray-900",
1487
+ borderColor: "border-gray-200 dark:border-gray-700",
1488
+ icon: "◌"
1489
+ },
1490
+ cancelled: {
1491
+ color: "text-orange-600 dark:text-orange-400",
1492
+ bgColor: "bg-orange-100",
1493
+ darkBgColor: "dark:bg-orange-900",
1494
+ borderColor: "border-orange-400 dark:border-orange-500",
1495
+ icon: "⊘"
1548
1496
  }
1549
- );
1550
- const XmlParser = ({
1551
- className,
1552
- children,
1553
- disabled,
1554
- ...props
1555
- }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1556
- View,
1557
- {
1558
- className: cn(
1559
- "p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700",
1560
- disabled && "opacity-50",
1561
- className
1497
+ };
1498
+ const formatDuration = (seconds) => {
1499
+ if (seconds < 60) return `${seconds}s`;
1500
+ const minutes = Math.floor(seconds / 60);
1501
+ const remainingSeconds = seconds % 60;
1502
+ return `${minutes}m ${remainingSeconds}s`;
1503
+ };
1504
+ const PipelineView = ({
1505
+ stages,
1506
+ pipelineName,
1507
+ pipelineId,
1508
+ onStagePress,
1509
+ className
1510
+ }) => {
1511
+ const overallStatus = stages.some((s) => s.status === "failed") ? "failed" : stages.some((s) => s.status === "running") ? "running" : stages.every((s) => s.status === "success") ? "success" : stages.every((s) => s.status === "pending") ? "pending" : "running";
1512
+ const overallConfig = statusConfig[overallStatus];
1513
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: cn("overflow-hidden", className), children: [
1514
+ (pipelineName || pipelineId) && /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "px-4 py-3 border-b border-gray-200 dark:border-gray-700", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-center justify-between", children: [
1515
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { children: [
1516
+ pipelineName && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-base font-semibold text-gray-900 dark:text-gray-100", children: pipelineName }),
1517
+ pipelineId && /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "text-xs font-mono text-gray-500 dark:text-gray-500", children: [
1518
+ "#",
1519
+ pipelineId
1520
+ ] })
1521
+ ] }),
1522
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1523
+ View,
1524
+ {
1525
+ className: cn(
1526
+ "px-2 py-1 rounded-full",
1527
+ overallConfig.bgColor,
1528
+ overallConfig.darkBgColor
1529
+ ),
1530
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: cn("text-xs font-medium", overallConfig.color), children: [
1531
+ overallConfig.icon,
1532
+ " ",
1533
+ overallStatus.charAt(0).toUpperCase() + overallStatus.slice(1)
1534
+ ] })
1535
+ }
1536
+ )
1537
+ ] }) }),
1538
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1539
+ ScrollView,
1540
+ {
1541
+ horizontal: true,
1542
+ showsHorizontalScrollIndicator: true,
1543
+ contentContainerStyle: { padding: 16 },
1544
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "flex-row items-center", children: stages.map((stage, index) => {
1545
+ const config = statusConfig[stage.status];
1546
+ const isLast = index === stages.length - 1;
1547
+ const stageContent = /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "items-center", children: [
1548
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1549
+ View,
1550
+ {
1551
+ className: cn(
1552
+ "w-24 p-3 rounded-lg border-2",
1553
+ config.bgColor,
1554
+ config.darkBgColor,
1555
+ config.borderColor
1556
+ ),
1557
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "items-center", children: [
1558
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: cn("text-lg", config.color), children: config.icon }),
1559
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1560
+ Text,
1561
+ {
1562
+ className: "text-xs font-medium text-gray-900 dark:text-gray-100 mt-1 text-center",
1563
+ numberOfLines: 2,
1564
+ children: stage.name
1565
+ }
1566
+ ),
1567
+ stage.duration !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-xs text-gray-500 dark:text-gray-500 mt-1", children: formatDuration(stage.duration) })
1568
+ ] })
1569
+ }
1570
+ ),
1571
+ stage.jobs && stage.jobs.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "mt-2", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "text-xs text-gray-500 dark:text-gray-500", children: [
1572
+ stage.jobs.filter((j) => j.status === "success").length,
1573
+ "/",
1574
+ stage.jobs.length,
1575
+ " jobs"
1576
+ ] }) })
1577
+ ] });
1578
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "flex-row items-center", children: [
1579
+ onStagePress ? /* @__PURE__ */ jsxRuntimeExports.jsx(
1580
+ Pressable,
1581
+ {
1582
+ onPress: () => onStagePress(stage),
1583
+ accessibilityRole: "button",
1584
+ accessibilityLabel: `${stage.name} - ${stage.status}`,
1585
+ children: stageContent
1586
+ }
1587
+ ) : stageContent,
1588
+ !isLast && /* @__PURE__ */ jsxRuntimeExports.jsxs(View, { className: "mx-2", children: [
1589
+ /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "w-8 h-0.5 bg-gray-300 dark:bg-gray-600" }),
1590
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "absolute -top-2 left-2 text-gray-400 dark:text-gray-600", children: "→" })
1591
+ ] })
1592
+ ] }, stage.id);
1593
+ }) })
1594
+ }
1562
1595
  ),
1563
- accessibilityLabel: "XML Parser",
1564
- ...props,
1565
- children: children || /* @__PURE__ */ jsxRuntimeExports.jsx(Text, { className: "text-gray-900 dark:text-white", children: "XmlParser Component" })
1566
- }
1567
- );
1596
+ /* @__PURE__ */ jsxRuntimeExports.jsx(View, { className: "px-4 py-2 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Text, { className: "text-xs text-gray-500 dark:text-gray-500", children: [
1597
+ stages.length,
1598
+ " stages |",
1599
+ " ",
1600
+ stages.filter((s) => s.status === "success").length,
1601
+ " completed"
1602
+ ] }) })
1603
+ ] });
1604
+ };
1568
1605
  export {
1569
- AlertDialog,
1570
- ApiPlayground,
1571
- ApiReference,
1572
1606
  AuditLog,
1573
- BodyMetrics,
1574
1607
  BuildLog,
1575
- ChangelogDisplay,
1576
- CodePlayground,
1577
- ConflictResolver,
1578
- DealPipeline,
1579
1608
  DeploymentStatus,
1580
- DriverLog,
1581
- MemoryUsage,
1582
1609
  MetricsGrid,
1583
1610
  PipelineView,
1584
- RegressionTest,
1585
- SystemStatusIndicator,
1586
- TestResult,
1587
- TestRunner,
1588
- WebhookLogger,
1589
- WorkflowBuilder,
1590
- WorkflowTemplate,
1591
- XmlParser
1611
+ SystemStatusIndicator
1592
1612
  };
1593
- //# sourceMappingURL=index.esm.js.map
1613
+ //# sourceMappingURL=index.mjs.map