@sudobility/devops-components-rn 1.0.0 → 1.0.2

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 (65) 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 +1002 -0
  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.mjs +1002 -0
  35. package/dist/index.mjs.map +1 -0
  36. package/package.json +9 -10
  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 +0 -1593
  63. package/dist/index.cjs.js.map +0 -1
  64. package/dist/index.esm.js +0 -1593
  65. package/dist/index.esm.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/SystemStatusIndicator.tsx","../src/DeploymentStatus.tsx","../src/BuildLog.tsx","../src/MetricsGrid.tsx","../src/AuditLog.tsx","../src/PipelineView.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react';\nimport { View, Text, Pressable } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport type SystemStatus = 'operational' | 'degraded' | 'major-outage';\n\nexport interface SystemStatusIndicatorProps {\n status: SystemStatus;\n systemName: string;\n description?: string;\n lastChecked?: Date;\n onPress?: () => void;\n className?: string;\n}\n\nconst statusConfig: Record<\n SystemStatus,\n { color: string; darkColor: string; label: string }\n> = {\n operational: {\n color: 'bg-green-500',\n darkColor: 'dark:bg-green-400',\n label: 'Operational',\n },\n degraded: {\n color: 'bg-yellow-500',\n darkColor: 'dark:bg-yellow-400',\n label: 'Degraded',\n },\n 'major-outage': {\n color: 'bg-red-500',\n darkColor: 'dark:bg-red-400',\n label: 'Major Outage',\n },\n};\n\nexport const SystemStatusIndicator: React.FC<SystemStatusIndicatorProps> = ({\n status,\n systemName,\n description,\n lastChecked,\n onPress,\n className,\n}) => {\n const config = statusConfig[status];\n\n const content = (\n <Card className={cn('p-4', className)}>\n <View className='flex-row items-center'>\n <View\n className={cn(\n 'w-3 h-3 rounded-full mr-3',\n config.color,\n config.darkColor\n )}\n />\n <View className='flex-1'>\n <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>\n {systemName}\n </Text>\n <Text\n className={cn(\n 'text-sm',\n status === 'operational' && 'text-green-600 dark:text-green-400',\n status === 'degraded' && 'text-yellow-600 dark:text-yellow-400',\n status === 'major-outage' && 'text-red-600 dark:text-red-400'\n )}\n >\n {config.label}\n </Text>\n </View>\n </View>\n {description && (\n <Text className='mt-2 text-sm text-gray-600 dark:text-gray-400'>\n {description}\n </Text>\n )}\n {lastChecked && (\n <Text className='mt-2 text-xs text-gray-500 dark:text-gray-500'>\n Last checked: {lastChecked.toLocaleString()}\n </Text>\n )}\n </Card>\n );\n\n if (onPress) {\n return (\n <Pressable onPress={onPress} accessibilityRole='button'>\n {content}\n </Pressable>\n );\n }\n\n return content;\n};\n\nexport default SystemStatusIndicator;\n","import React from 'react';\nimport { View, Text, Pressable } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport type DeploymentState =\n | 'pending'\n | 'building'\n | 'deploying'\n | 'success'\n | 'failed'\n | 'cancelled';\n\nexport interface DeploymentStatusProps {\n state: DeploymentState;\n environment: string;\n version: string;\n timestamp: Date;\n commitHash?: string;\n commitMessage?: string;\n duration?: number;\n onPress?: () => void;\n className?: string;\n}\n\nconst stateConfig: Record<\n DeploymentState,\n {\n color: string;\n bgColor: string;\n darkBgColor: string;\n label: string;\n icon: string;\n }\n> = {\n pending: {\n color: 'text-gray-600 dark:text-gray-400',\n bgColor: 'bg-gray-100',\n darkBgColor: 'dark:bg-gray-800',\n label: 'Pending',\n icon: '⏳',\n },\n building: {\n color: 'text-blue-600 dark:text-blue-400',\n bgColor: 'bg-blue-100',\n darkBgColor: 'dark:bg-blue-900',\n label: 'Building',\n icon: '🔨',\n },\n deploying: {\n color: 'text-purple-600 dark:text-purple-400',\n bgColor: 'bg-purple-100',\n darkBgColor: 'dark:bg-purple-900',\n label: 'Deploying',\n icon: '🚀',\n },\n success: {\n color: 'text-green-600 dark:text-green-400',\n bgColor: 'bg-green-100',\n darkBgColor: 'dark:bg-green-900',\n label: 'Success',\n icon: '✓',\n },\n failed: {\n color: 'text-red-600 dark:text-red-400',\n bgColor: 'bg-red-100',\n darkBgColor: 'dark:bg-red-900',\n label: 'Failed',\n icon: '✗',\n },\n cancelled: {\n color: 'text-orange-600 dark:text-orange-400',\n bgColor: 'bg-orange-100',\n darkBgColor: 'dark:bg-orange-900',\n label: 'Cancelled',\n icon: '⊘',\n },\n};\n\nconst formatDuration = (seconds: number): string => {\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n if (minutes < 60) return `${minutes}m ${remainingSeconds}s`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n};\n\nexport const DeploymentStatus: React.FC<DeploymentStatusProps> = ({\n state,\n environment,\n version,\n timestamp,\n commitHash,\n commitMessage,\n duration,\n onPress,\n className,\n}) => {\n const config = stateConfig[state];\n\n const content = (\n <Card className={cn('p-4', className)}>\n <View className='flex-row items-start justify-between'>\n <View className='flex-1'>\n <View className='flex-row items-center'>\n <View\n className={cn(\n 'px-2 py-1 rounded-md mr-2',\n config.bgColor,\n config.darkBgColor\n )}\n >\n <Text className={cn('text-xs font-medium', config.color)}>\n {config.icon} {config.label}\n </Text>\n </View>\n <View className='bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded-md'>\n <Text className='text-xs font-medium text-gray-700 dark:text-gray-300'>\n {environment}\n </Text>\n </View>\n </View>\n <Text className='mt-2 text-base font-semibold text-gray-900 dark:text-gray-100'>\n {version}\n </Text>\n {commitHash && (\n <Text className='mt-1 text-sm font-mono text-gray-600 dark:text-gray-400'>\n {commitHash.substring(0, 7)}\n </Text>\n )}\n {commitMessage && (\n <Text\n className='mt-1 text-sm text-gray-600 dark:text-gray-400'\n numberOfLines={2}\n >\n {commitMessage}\n </Text>\n )}\n </View>\n </View>\n <View className='flex-row items-center justify-between mt-3 pt-3 border-t border-gray-200 dark:border-gray-700'>\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n {timestamp.toLocaleString()}\n </Text>\n {duration !== undefined && (\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n Duration: {formatDuration(duration)}\n </Text>\n )}\n </View>\n </Card>\n );\n\n if (onPress) {\n return (\n <Pressable onPress={onPress} accessibilityRole='button'>\n {content}\n </Pressable>\n );\n }\n\n return content;\n};\n\nexport default DeploymentStatus;\n","import React from 'react';\nimport { View, Text, ScrollView } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport type LogLevel = 'info' | 'warn' | 'error' | 'debug' | 'success';\n\nexport interface LogEntry {\n id: string;\n level: LogLevel;\n message: string;\n timestamp: Date;\n source?: string;\n}\n\nexport interface BuildLogProps {\n entries: LogEntry[];\n title?: string;\n maxHeight?: number;\n showTimestamp?: boolean;\n showSource?: boolean;\n className?: string;\n}\n\nconst levelConfig: Record<\n LogLevel,\n { color: string; bgColor: string; darkBgColor: string; prefix: string }\n> = {\n info: {\n color: 'text-blue-600 dark:text-blue-400',\n bgColor: 'bg-blue-50',\n darkBgColor: 'dark:bg-blue-950',\n prefix: 'INFO',\n },\n warn: {\n color: 'text-yellow-600 dark:text-yellow-400',\n bgColor: 'bg-yellow-50',\n darkBgColor: 'dark:bg-yellow-950',\n prefix: 'WARN',\n },\n error: {\n color: 'text-red-600 dark:text-red-400',\n bgColor: 'bg-red-50',\n darkBgColor: 'dark:bg-red-950',\n prefix: 'ERROR',\n },\n debug: {\n color: 'text-gray-600 dark:text-gray-400',\n bgColor: 'bg-gray-50',\n darkBgColor: 'dark:bg-gray-900',\n prefix: 'DEBUG',\n },\n success: {\n color: 'text-green-600 dark:text-green-400',\n bgColor: 'bg-green-50',\n darkBgColor: 'dark:bg-green-950',\n prefix: 'SUCCESS',\n },\n};\n\nconst formatTime = (date: Date): string => {\n return date.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n};\n\nexport const BuildLog: React.FC<BuildLogProps> = ({\n entries,\n title,\n maxHeight = 400,\n showTimestamp = true,\n showSource = false,\n className,\n}) => {\n return (\n <Card className={cn('overflow-hidden', className)}>\n {title && (\n <View className='px-4 py-3 border-b border-gray-200 dark:border-gray-700'>\n <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>\n {title}\n </Text>\n </View>\n )}\n <ScrollView\n style={{ maxHeight }}\n className='bg-gray-900 dark:bg-black'\n showsVerticalScrollIndicator={true}\n >\n <View className='p-3'>\n {entries.map(entry => {\n const config = levelConfig[entry.level];\n return (\n <View\n key={entry.id}\n className={cn(\n 'flex-row flex-wrap py-1 px-2 mb-1 rounded',\n config.bgColor,\n config.darkBgColor\n )}\n >\n {showTimestamp && (\n <Text className='font-mono text-xs text-gray-500 dark:text-gray-500 mr-2'>\n [{formatTime(entry.timestamp)}]\n </Text>\n )}\n <Text\n className={cn(\n 'font-mono text-xs font-bold mr-2',\n config.color\n )}\n >\n [{config.prefix}]\n </Text>\n {showSource && entry.source && (\n <Text className='font-mono text-xs text-gray-400 dark:text-gray-600 mr-2'>\n [{entry.source}]\n </Text>\n )}\n <Text className='font-mono text-xs text-gray-200 dark:text-gray-300 flex-1'>\n {entry.message}\n </Text>\n </View>\n );\n })}\n </View>\n </ScrollView>\n <View className='px-4 py-2 bg-gray-800 dark:bg-gray-950 border-t border-gray-700'>\n <Text className='text-xs text-gray-400 dark:text-gray-500'>\n {entries.length} log entries\n </Text>\n </View>\n </Card>\n );\n};\n\nexport default BuildLog;\n","import React from 'react';\nimport { View, Text, Pressable } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport interface Metric {\n id: string;\n label: string;\n value: number | string;\n unit?: string;\n change?: number;\n changeLabel?: string;\n icon?: React.ReactNode;\n}\n\nexport interface MetricsGridProps {\n metrics: Metric[];\n columns?: 1 | 2 | 3 | 4;\n onMetricPress?: (metric: Metric) => void;\n className?: string;\n}\n\nconst formatChange = (change: number): string => {\n const sign = change >= 0 ? '+' : '';\n return sign + change.toFixed(1) + '%';\n};\n\nexport const MetricsGrid: React.FC<MetricsGridProps> = ({\n metrics,\n columns = 2,\n onMetricPress,\n className,\n}) => {\n const columnWidthClass = {\n 1: 'w-full',\n 2: 'w-1/2',\n 3: 'w-1/3',\n 4: 'w-1/4',\n }[columns];\n\n return (\n <View className={cn('flex-row flex-wrap -m-1', className)}>\n {metrics.map(metric => {\n const content = (\n <Card className='p-4 m-1 flex-1'>\n <View className='flex-row items-start justify-between'>\n <View className='flex-1'>\n <Text className='text-sm text-gray-600 dark:text-gray-400 mb-1'>\n {metric.label}\n </Text>\n <View className='flex-row items-baseline'>\n <Text className='text-2xl font-bold text-gray-900 dark:text-gray-100'>\n {metric.value}\n </Text>\n {metric.unit && (\n <Text className='text-sm text-gray-500 dark:text-gray-500 ml-1'>\n {metric.unit}\n </Text>\n )}\n </View>\n {metric.change !== undefined && (\n <View className='flex-row items-center mt-2'>\n <View\n className={cn(\n 'px-1.5 py-0.5 rounded',\n metric.change >= 0\n ? 'bg-green-100 dark:bg-green-900'\n : 'bg-red-100 dark:bg-red-900'\n )}\n >\n <Text\n className={cn(\n 'text-xs font-medium',\n metric.change >= 0\n ? 'text-green-700 dark:text-green-300'\n : 'text-red-700 dark:text-red-300'\n )}\n >\n {formatChange(metric.change)}\n </Text>\n </View>\n {metric.changeLabel && (\n <Text className='text-xs text-gray-500 dark:text-gray-500 ml-2'>\n {metric.changeLabel}\n </Text>\n )}\n </View>\n )}\n </View>\n {metric.icon && <View className='ml-2'>{metric.icon}</View>}\n </View>\n </Card>\n );\n\n if (onMetricPress) {\n return (\n <View key={metric.id} className={columnWidthClass}>\n <Pressable\n onPress={() => onMetricPress(metric)}\n accessibilityRole='button'\n accessibilityLabel={\n metric.label + ': ' + metric.value + (metric.unit || '')\n }\n >\n {content}\n </Pressable>\n </View>\n );\n }\n\n return (\n <View key={metric.id} className={columnWidthClass}>\n {content}\n </View>\n );\n })}\n </View>\n );\n};\n\nexport default MetricsGrid;\n","import React from 'react';\nimport { View, Text, ScrollView, Pressable } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport type AuditActionType =\n | 'create'\n | 'update'\n | 'delete'\n | 'login'\n | 'logout'\n | 'access'\n | 'export'\n | 'import'\n | 'approve'\n | 'reject'\n | 'deploy'\n | 'rollback';\n\nexport interface AuditEntry {\n id: string;\n action: AuditActionType;\n actor: {\n id: string;\n name: string;\n email?: string;\n avatar?: string;\n };\n resource: {\n type: string;\n id: string;\n name: string;\n };\n timestamp: Date;\n metadata?: Record<string, unknown>;\n ipAddress?: string;\n}\n\nexport interface AuditLogProps {\n entries: AuditEntry[];\n title?: string;\n maxHeight?: number;\n onEntryPress?: (entry: AuditEntry) => void;\n className?: string;\n}\n\nconst actionConfig: Record<\n AuditActionType,\n { color: string; bgColor: string; darkBgColor: string; icon: string }\n> = {\n create: {\n color: 'text-green-700 dark:text-green-300',\n bgColor: 'bg-green-100',\n darkBgColor: 'dark:bg-green-900',\n icon: '+',\n },\n update: {\n color: 'text-blue-700 dark:text-blue-300',\n bgColor: 'bg-blue-100',\n darkBgColor: 'dark:bg-blue-900',\n icon: '~',\n },\n delete: {\n color: 'text-red-700 dark:text-red-300',\n bgColor: 'bg-red-100',\n darkBgColor: 'dark:bg-red-900',\n icon: '-',\n },\n login: {\n color: 'text-purple-700 dark:text-purple-300',\n bgColor: 'bg-purple-100',\n darkBgColor: 'dark:bg-purple-900',\n icon: '→',\n },\n logout: {\n color: 'text-gray-700 dark:text-gray-300',\n bgColor: 'bg-gray-100',\n darkBgColor: 'dark:bg-gray-800',\n icon: '←',\n },\n access: {\n color: 'text-cyan-700 dark:text-cyan-300',\n bgColor: 'bg-cyan-100',\n darkBgColor: 'dark:bg-cyan-900',\n icon: '◉',\n },\n export: {\n color: 'text-orange-700 dark:text-orange-300',\n bgColor: 'bg-orange-100',\n darkBgColor: 'dark:bg-orange-900',\n icon: '↑',\n },\n import: {\n color: 'text-teal-700 dark:text-teal-300',\n bgColor: 'bg-teal-100',\n darkBgColor: 'dark:bg-teal-900',\n icon: '↓',\n },\n approve: {\n color: 'text-emerald-700 dark:text-emerald-300',\n bgColor: 'bg-emerald-100',\n darkBgColor: 'dark:bg-emerald-900',\n icon: '✓',\n },\n reject: {\n color: 'text-rose-700 dark:text-rose-300',\n bgColor: 'bg-rose-100',\n darkBgColor: 'dark:bg-rose-900',\n icon: '✗',\n },\n deploy: {\n color: 'text-indigo-700 dark:text-indigo-300',\n bgColor: 'bg-indigo-100',\n darkBgColor: 'dark:bg-indigo-900',\n icon: '▲',\n },\n rollback: {\n color: 'text-amber-700 dark:text-amber-300',\n bgColor: 'bg-amber-100',\n darkBgColor: 'dark:bg-amber-900',\n icon: '↺',\n },\n};\n\nconst formatTimestamp = (date: Date): string => {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString();\n};\n\nexport const AuditLog: React.FC<AuditLogProps> = ({\n entries,\n title,\n maxHeight = 500,\n onEntryPress,\n className,\n}) => {\n return (\n <Card className={cn('overflow-hidden', className)}>\n {title && (\n <View className='px-4 py-3 border-b border-gray-200 dark:border-gray-700'>\n <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>\n {title}\n </Text>\n </View>\n )}\n <ScrollView style={{ maxHeight }} showsVerticalScrollIndicator={true}>\n {entries.map((entry, index) => {\n const config = actionConfig[entry.action];\n const isLast = index === entries.length - 1;\n\n const content = (\n <View\n className={cn(\n 'px-4 py-3',\n !isLast && 'border-b border-gray-100 dark:border-gray-800'\n )}\n >\n <View className='flex-row items-start'>\n <View\n className={cn(\n 'w-8 h-8 rounded-full items-center justify-center mr-3',\n config.bgColor,\n config.darkBgColor\n )}\n >\n <Text className={cn('text-sm font-bold', config.color)}>\n {config.icon}\n </Text>\n </View>\n <View className='flex-1'>\n <View className='flex-row items-center flex-wrap'>\n <Text className='text-sm font-medium text-gray-900 dark:text-gray-100'>\n {entry.actor.name}\n </Text>\n <Text className='text-sm text-gray-600 dark:text-gray-400 mx-1'>\n {entry.action}d\n </Text>\n <Text className='text-sm font-medium text-gray-900 dark:text-gray-100'>\n {entry.resource.name}\n </Text>\n </View>\n <View className='flex-row items-center mt-1'>\n <View\n className={cn(\n 'px-1.5 py-0.5 rounded mr-2',\n config.bgColor,\n config.darkBgColor\n )}\n >\n <Text\n className={cn(\n 'text-xs font-medium uppercase',\n config.color\n )}\n >\n {entry.action}\n </Text>\n </View>\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n {entry.resource.type}\n </Text>\n </View>\n <View className='flex-row items-center mt-2'>\n <Text className='text-xs text-gray-400 dark:text-gray-600'>\n {formatTimestamp(entry.timestamp)}\n </Text>\n {entry.ipAddress && (\n <Text className='text-xs text-gray-400 dark:text-gray-600 ml-2'>\n IP: {entry.ipAddress}\n </Text>\n )}\n </View>\n </View>\n </View>\n </View>\n );\n\n if (onEntryPress) {\n return (\n <Pressable\n key={entry.id}\n onPress={() => onEntryPress(entry)}\n accessibilityRole='button'\n >\n {content}\n </Pressable>\n );\n }\n\n return <View key={entry.id}>{content}</View>;\n })}\n </ScrollView>\n <View className='px-4 py-2 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700'>\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n Showing {entries.length} audit entries\n </Text>\n </View>\n </Card>\n );\n};\n\nexport default AuditLog;\n","import React from 'react';\nimport { View, Text, ScrollView, Pressable } from 'react-native';\nimport { cn, Card } from '@sudobility/components-rn';\n\nexport type PipelineStageStatus =\n | 'pending'\n | 'running'\n | 'success'\n | 'failed'\n | 'skipped'\n | 'cancelled';\n\nexport interface PipelineStage {\n id: string;\n name: string;\n status: PipelineStageStatus;\n duration?: number;\n startedAt?: Date;\n finishedAt?: Date;\n jobs?: {\n id: string;\n name: string;\n status: PipelineStageStatus;\n }[];\n}\n\nexport interface PipelineViewProps {\n stages: PipelineStage[];\n pipelineName?: string;\n pipelineId?: string;\n onStagePress?: (stage: PipelineStage) => void;\n className?: string;\n}\n\nconst statusConfig: Record<\n PipelineStageStatus,\n {\n color: string;\n bgColor: string;\n darkBgColor: string;\n borderColor: string;\n icon: string;\n }\n> = {\n pending: {\n color: 'text-gray-600 dark:text-gray-400',\n bgColor: 'bg-gray-100',\n darkBgColor: 'dark:bg-gray-800',\n borderColor: 'border-gray-300 dark:border-gray-600',\n icon: '○',\n },\n running: {\n color: 'text-blue-600 dark:text-blue-400',\n bgColor: 'bg-blue-100',\n darkBgColor: 'dark:bg-blue-900',\n borderColor: 'border-blue-400 dark:border-blue-500',\n icon: '◐',\n },\n success: {\n color: 'text-green-600 dark:text-green-400',\n bgColor: 'bg-green-100',\n darkBgColor: 'dark:bg-green-900',\n borderColor: 'border-green-400 dark:border-green-500',\n icon: '●',\n },\n failed: {\n color: 'text-red-600 dark:text-red-400',\n bgColor: 'bg-red-100',\n darkBgColor: 'dark:bg-red-900',\n borderColor: 'border-red-400 dark:border-red-500',\n icon: '✗',\n },\n skipped: {\n color: 'text-gray-400 dark:text-gray-600',\n bgColor: 'bg-gray-50',\n darkBgColor: 'dark:bg-gray-900',\n borderColor: 'border-gray-200 dark:border-gray-700',\n icon: '◌',\n },\n cancelled: {\n color: 'text-orange-600 dark:text-orange-400',\n bgColor: 'bg-orange-100',\n darkBgColor: 'dark:bg-orange-900',\n borderColor: 'border-orange-400 dark:border-orange-500',\n icon: '⊘',\n },\n};\n\nconst formatDuration = (seconds: number): string => {\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds}s`;\n};\n\nexport const PipelineView: React.FC<PipelineViewProps> = ({\n stages,\n pipelineName,\n pipelineId,\n onStagePress,\n className,\n}) => {\n const overallStatus = stages.some(s => s.status === 'failed')\n ? 'failed'\n : stages.some(s => s.status === 'running')\n ? 'running'\n : stages.every(s => s.status === 'success')\n ? 'success'\n : stages.every(s => s.status === 'pending')\n ? 'pending'\n : 'running';\n\n const overallConfig = statusConfig[overallStatus];\n\n return (\n <Card className={cn('overflow-hidden', className)}>\n {(pipelineName || pipelineId) && (\n <View className='px-4 py-3 border-b border-gray-200 dark:border-gray-700'>\n <View className='flex-row items-center justify-between'>\n <View>\n {pipelineName && (\n <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>\n {pipelineName}\n </Text>\n )}\n {pipelineId && (\n <Text className='text-xs font-mono text-gray-500 dark:text-gray-500'>\n #{pipelineId}\n </Text>\n )}\n </View>\n <View\n className={cn(\n 'px-2 py-1 rounded-full',\n overallConfig.bgColor,\n overallConfig.darkBgColor\n )}\n >\n <Text className={cn('text-xs font-medium', overallConfig.color)}>\n {overallConfig.icon}{' '}\n {overallStatus.charAt(0).toUpperCase() + overallStatus.slice(1)}\n </Text>\n </View>\n </View>\n </View>\n )}\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={true}\n contentContainerStyle={{ padding: 16 }}\n >\n <View className='flex-row items-center'>\n {stages.map((stage, index) => {\n const config = statusConfig[stage.status];\n const isLast = index === stages.length - 1;\n\n const stageContent = (\n <View className='items-center'>\n <View\n className={cn(\n 'w-24 p-3 rounded-lg border-2',\n config.bgColor,\n config.darkBgColor,\n config.borderColor\n )}\n >\n <View className='items-center'>\n <Text className={cn('text-lg', config.color)}>\n {config.icon}\n </Text>\n <Text\n className='text-xs font-medium text-gray-900 dark:text-gray-100 mt-1 text-center'\n numberOfLines={2}\n >\n {stage.name}\n </Text>\n {stage.duration !== undefined && (\n <Text className='text-xs text-gray-500 dark:text-gray-500 mt-1'>\n {formatDuration(stage.duration)}\n </Text>\n )}\n </View>\n </View>\n {stage.jobs && stage.jobs.length > 0 && (\n <View className='mt-2'>\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n {stage.jobs.filter(j => j.status === 'success').length}/\n {stage.jobs.length} jobs\n </Text>\n </View>\n )}\n </View>\n );\n\n return (\n <View key={stage.id} className='flex-row items-center'>\n {onStagePress ? (\n <Pressable\n onPress={() => onStagePress(stage)}\n accessibilityRole='button'\n accessibilityLabel={`${stage.name} - ${stage.status}`}\n >\n {stageContent}\n </Pressable>\n ) : (\n stageContent\n )}\n {!isLast && (\n <View className='mx-2'>\n <View className='w-8 h-0.5 bg-gray-300 dark:bg-gray-600' />\n <Text className='absolute -top-2 left-2 text-gray-400 dark:text-gray-600'>\n →\n </Text>\n </View>\n )}\n </View>\n );\n })}\n </View>\n </ScrollView>\n <View className='px-4 py-2 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700'>\n <Text className='text-xs text-gray-500 dark:text-gray-500'>\n {stages.length} stages |{' '}\n {stages.filter(s => s.status === 'success').length} completed\n </Text>\n </View>\n </Card>\n );\n};\n\nexport default PipelineView;\n"],"names":["jsxRuntimeModule","require$$0","require$$1","statusConfig","jsxs","jsx","formatDuration"],"mappings":";;;;;;;;;;;;;;;;;;AAWA,MAAI,qBAAqB,OAAO,IAAI,4BAA4B,GAC9D,sBAAsB,OAAO,IAAI,gBAAgB;AACnD,WAAS,QAAQ,MAAM,QAAQ,UAAU;AACvC,QAAI,MAAM;AACV,eAAW,aAAa,MAAM,KAAK;AACnC,eAAW,OAAO,QAAQ,MAAM,KAAK,OAAO;AAC5C,QAAI,SAAS,QAAQ;AACnB,iBAAW,CAAA;AACX,eAAS,YAAY;AACnB,kBAAU,aAAa,SAAS,QAAQ,IAAI,OAAO,QAAQ;AAAA,IACjE,MAAS,YAAW;AAClB,aAAS,SAAS;AAClB,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,KAAK,WAAW,SAAS,SAAS;AAAA,MAClC,OAAO;AAAA;EAEX;AACA,6BAAA,WAAmB;AACnB,6BAAA,MAAc;AACd,6BAAA,OAAe;;;;;;;;;;;;;;;;;ACtBf,mBAAiB,QAAQ,IAAI,aAC1B,WAAY;AACX,aAAS,yBAAyB,MAAM;AACtC,UAAI,QAAQ,KAAM,QAAO;AACzB,UAAI,eAAe,OAAO;AACxB,eAAO,KAAK,aAAa,yBACrB,OACA,KAAK,eAAe,KAAK,QAAQ;AACvC,UAAI,aAAa,OAAO,KAAM,QAAO;AACrC,cAAQ,MAAI;AAAA,QACV,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,MACjB;AACM,UAAI,aAAa,OAAO;AACtB,gBACG,aAAa,OAAO,KAAK,OACxB,QAAQ;AAAA,UACN;AAAA,WAEJ,KAAK,UACf;AAAA,UACU,KAAK;AACH,mBAAO;AAAA,UACT,KAAK;AACH,mBAAO,KAAK,eAAe;AAAA,UAC7B,KAAK;AACH,oBAAQ,KAAK,SAAS,eAAe,aAAa;AAAA,UACpD,KAAK;AACH,gBAAI,YAAY,KAAK;AACrB,mBAAO,KAAK;AACZ,qBACI,OAAO,UAAU,eAAe,UAAU,QAAQ,IACnD,OAAO,OAAO,OAAO,gBAAgB,OAAO,MAAM;AACrD,mBAAO;AAAA,UACT,KAAK;AACH,mBACG,YAAY,KAAK,eAAe,MACjC,SAAS,YACL,YACA,yBAAyB,KAAK,IAAI,KAAK;AAAA,UAE/C,KAAK;AACH,wBAAY,KAAK;AACjB,mBAAO,KAAK;AACZ,gBAAI;AACF,qBAAO,yBAAyB,KAAK,SAAS,CAAC;AAAA,YAC7D,SAAqB,GAAG;AAAA,YAAA;AAAA,QACxB;AACM,aAAO;AAAA,IACb;AACI,aAAS,mBAAmB,OAAO;AACjC,aAAO,KAAK;AAAA,IAClB;AACI,aAAS,uBAAuB,OAAO;AACrC,UAAI;AACF,2BAAmB,KAAK;AACxB,YAAI,2BAA2B;AAAA,MACvC,SAAe,GAAG;AACV,mCAA2B;AAAA,MACnC;AACM,UAAI,0BAA0B;AAC5B,mCAA2B;AAC3B,YAAI,wBAAwB,yBAAyB;AACrD,YAAI,oCACD,eAAe,OAAO,UACrB,OAAO,eACP,MAAM,OAAO,WAAW,KAC1B,MAAM,YAAY,QAClB;AACF,8BAAsB;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA;AAEF,eAAO,mBAAmB,KAAK;AAAA,MACvC;AAAA,IACA;AACI,aAAS,YAAY,MAAM;AACzB,UAAI,SAAS,oBAAqB,QAAO;AACzC,UACE,aAAa,OAAO,QACpB,SAAS,QACT,KAAK,aAAa;AAElB,eAAO;AACT,UAAI;AACF,YAAI,OAAO,yBAAyB,IAAI;AACxC,eAAO,OAAO,MAAM,OAAO,MAAM;AAAA,MACzC,SAAe,GAAG;AACV,eAAO;AAAA,MACf;AAAA,IACA;AACI,aAAS,WAAW;AAClB,UAAI,aAAa,qBAAqB;AACtC,aAAO,SAAS,aAAa,OAAO,WAAW,SAAQ;AAAA,IAC7D;AACI,aAAS,eAAe;AACtB,aAAO,MAAM,uBAAuB;AAAA,IAC1C;AACI,aAAS,YAAY,QAAQ;AAC3B,UAAI,eAAe,KAAK,QAAQ,KAAK,GAAG;AACtC,YAAI,SAAS,OAAO,yBAAyB,QAAQ,KAAK,EAAE;AAC5D,YAAI,UAAU,OAAO,eAAgB,QAAO;AAAA,MACpD;AACM,aAAO,WAAW,OAAO;AAAA,IAC/B;AACI,aAAS,2BAA2B,OAAO,aAAa;AACtD,eAAS,wBAAwB;AAC/B,uCACI,6BAA6B,MAC/B,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACZ;AAAA,MACA;AACM,4BAAsB,iBAAiB;AACvC,aAAO,eAAe,OAAO,OAAO;AAAA,QAClC,KAAK;AAAA,QACL,cAAc;AAAA,MACtB,CAAO;AAAA,IACP;AACI,aAAS,yCAAyC;AAChD,UAAI,gBAAgB,yBAAyB,KAAK,IAAI;AACtD,6BAAuB,aAAa,MAChC,uBAAuB,aAAa,IAAI,MAC1C,QAAQ;AAAA,QACN;AAAA,MACV;AACM,sBAAgB,KAAK,MAAM;AAC3B,aAAO,WAAW,gBAAgB,gBAAgB;AAAA,IACxD;AACI,aAAS,aAAa,MAAM,KAAK,OAAO,OAAO,YAAY,WAAW;AACpE,UAAI,UAAU,MAAM;AACpB,aAAO;AAAA,QACL,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA;AAEV,gBAAU,WAAW,UAAU,UAAU,QACrC,OAAO,eAAe,MAAM,OAAO;AAAA,QACjC,YAAY;AAAA,QACZ,KAAK;AAAA,OACN,IACD,OAAO,eAAe,MAAM,OAAO,EAAE,YAAY,OAAI,OAAO,MAAM;AACtE,WAAK,SAAS,CAAA;AACd,aAAO,eAAe,KAAK,QAAQ,aAAa;AAAA,QAC9C,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO;AACD,aAAO,eAAe,MAAM,cAAc;AAAA,QACxC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO;AACD,aAAO,eAAe,MAAM,eAAe;AAAA,QACzC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO;AACD,aAAO,eAAe,MAAM,cAAc;AAAA,QACxC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO;AACD,aAAO,WAAW,OAAO,OAAO,KAAK,KAAK,GAAG,OAAO,OAAO,IAAI;AAC/D,aAAO;AAAA,IACb;AACI,aAAS,WACP,MACA,QACA,UACA,kBACA,YACA,WACA;AACA,UAAI,WAAW,OAAO;AACtB,UAAI,WAAW;AACb,YAAI;AACF,cAAI,YAAY,QAAQ,GAAG;AACzB,iBACE,mBAAmB,GACnB,mBAAmB,SAAS,QAC5B;AAEA,gCAAkB,SAAS,gBAAgB,CAAC;AAC9C,mBAAO,UAAU,OAAO,OAAO,QAAQ;AAAA,UACnD;AACY,oBAAQ;AAAA,cACN;AAAA;YAED,mBAAkB,QAAQ;AACjC,UAAI,eAAe,KAAK,QAAQ,KAAK,GAAG;AACtC,mBAAW,yBAAyB,IAAI;AACxC,YAAI,OAAO,OAAO,KAAK,MAAM,EAAE,OAAO,SAAU,GAAG;AACjD,iBAAO,UAAU;AAAA,QAC3B,CAAS;AACD,2BACE,IAAI,KAAK,SACL,oBAAoB,KAAK,KAAK,SAAS,IAAI,WAC3C;AACN,8BAAsB,WAAW,gBAAgB,MAC7C,OACA,IAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,IAAI,WAAW,MAC5D,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,WAED,sBAAsB,WAAW,gBAAgB,IAAI;AAAA,MAChE;AACM,iBAAW;AACX,iBAAW,aACR,uBAAuB,QAAQ,GAAI,WAAW,KAAK;AACtD,kBAAY,MAAM,MACf,uBAAuB,OAAO,GAAG,GAAI,WAAW,KAAK,OAAO;AAC/D,UAAI,SAAS,QAAQ;AACnB,mBAAW,CAAA;AACX,iBAAS,YAAY;AACnB,oBAAU,aAAa,SAAS,QAAQ,IAAI,OAAO,QAAQ;AAAA,MACrE,MAAa,YAAW;AAClB,kBACE;AAAA,QACE;AAAA,QACA,eAAe,OAAO,OAClB,KAAK,eAAe,KAAK,QAAQ,YACjC;AAAA;AAER,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAQ;AAAA,QACR;AAAA,QACA;AAAA;IAER;AACI,aAAS,kBAAkB,MAAM;AAC/B,qBAAe,IAAI,IACf,KAAK,WAAW,KAAK,OAAO,YAAY,KACxC,aAAa,OAAO,QACpB,SAAS,QACT,KAAK,aAAa,oBACjB,gBAAgB,KAAK,SAAS,SAC3B,eAAe,KAAK,SAAS,KAAK,KAClC,KAAK,SAAS,MAAM,WACnB,KAAK,SAAS,MAAM,OAAO,YAAY,KACxC,KAAK,WAAW,KAAK,OAAO,YAAY;AAAA,IACtD;AACI,aAAS,eAAe,QAAQ;AAC9B,aACE,aAAa,OAAO,UACpB,SAAS,UACT,OAAO,aAAa;AAAA,IAE5B;AACI,QAAI,QAAQ,YACV,qBAAqB,OAAO,IAAI,4BAA4B,GAC5D,oBAAoB,OAAO,IAAI,cAAc,GAC7C,sBAAsB,OAAO,IAAI,gBAAgB,GACjD,yBAAyB,OAAO,IAAI,mBAAmB,GACvD,sBAAsB,OAAO,IAAI,gBAAgB,GACjD,sBAAsB,OAAO,IAAI,gBAAgB,GACjD,qBAAqB,OAAO,IAAI,eAAe,GAC/C,yBAAyB,OAAO,IAAI,mBAAmB,GACvD,sBAAsB,OAAO,IAAI,gBAAgB,GACjD,2BAA2B,OAAO,IAAI,qBAAqB,GAC3D,kBAAkB,OAAO,IAAI,YAAY,GACzC,kBAAkB,OAAO,IAAI,YAAY,GACzC,sBAAsB,OAAO,IAAI,gBAAgB,GACjD,yBAAyB,OAAO,IAAI,wBAAwB,GAC5D,uBACE,MAAM,iEACR,iBAAiB,OAAO,UAAU,gBAClC,cAAc,MAAM,SACpB,aAAa,QAAQ,aACjB,QAAQ,aACR,WAAY;AACV,aAAO;AAAA,IACnB;AACI,YAAQ;AAAA,MACN,0BAA0B,SAAU,mBAAmB;AACrD,eAAO,kBAAiB;AAAA,MAChC;AAAA;AAEI,QAAI;AACJ,QAAI,yBAAyB,CAAA;AAC7B,QAAI,yBAAyB,MAAM,yBAAyB;AAAA,MAC1D;AAAA,MACA;AAAA,IACN,EAAK;AACD,QAAI,wBAAwB,WAAW,YAAY,YAAY,CAAC;AAChE,QAAI,wBAAwB,CAAA;AAC5B,gCAAA,WAAmB;AACnB,gCAAA,MAAc,SAAU,MAAM,QAAQ,UAAU;AAC9C,UAAI,mBACF,MAAM,qBAAqB;AAC7B,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,mBACI,MAAM,uBAAuB,IAC7B;AAAA,QACJ,mBAAmB,WAAW,YAAY,IAAI,CAAC,IAAI;AAAA;IAE3D;AACI,gCAAA,OAAe,SAAU,MAAM,QAAQ,UAAU;AAC/C,UAAI,mBACF,MAAM,qBAAqB;AAC7B,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,mBACI,MAAM,uBAAuB,IAC7B;AAAA,QACJ,mBAAmB,WAAW,YAAY,IAAI,CAAC,IAAI;AAAA;IAE3D;AAAA,EACA,GAAG;;;;;;;AC7VH,MAAI,QAAQ,IAAI,aAAa,cAAc;AACzCA,eAAA,UAAiBC,kCAAA;AAAA,EACnB,OAAO;AACLD,eAAA,UAAiBE,mCAAA;AAAA,EACnB;;;;ACSA,MAAMC,iBAGF;AAAA,EACF,aAAa;AAAA,IACX,OAAO;AAAA,IACP,WAAW;AAAA,IACX,OAAO;AAAA,EAAA;AAAA,EAET,UAAU;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,OAAO;AAAA,EAAA;AAAA,EAET,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,WAAW;AAAA,IACX,OAAO;AAAA,EAAA;AAEX;AAEO,MAAM,wBAA8D,CAAC;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAASA,eAAa,MAAM;AAElC,QAAM,UACJC,uCAAC,MAAA,EAAK,WAAW,GAAG,OAAO,SAAS,GAClC,UAAA;AAAA,IAAAA,kCAAAA,KAAC,MAAA,EAAK,WAAU,yBACd,UAAA;AAAA,MAAAC,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,OAAO;AAAA,YACP,OAAO;AAAA,UAAA;AAAA,QACT;AAAA,MAAA;AAAA,MAEFD,kCAAAA,KAAC,MAAA,EAAK,WAAU,UACd,UAAA;AAAA,QAAAC,kCAAAA,IAAC,MAAA,EAAK,WAAU,4DACb,UAAA,YACH;AAAA,QACAA,kCAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,WAAW,iBAAiB;AAAA,cAC5B,WAAW,cAAc;AAAA,cACzB,WAAW,kBAAkB;AAAA,YAAA;AAAA,YAG9B,UAAA,OAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MACV,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IACC,eACCA,kCAAAA,IAAC,MAAA,EAAK,WAAU,iDACb,UAAA,aACH;AAAA,IAED,eACCD,kCAAAA,KAAC,MAAA,EAAK,WAAU,iDAAgD,UAAA;AAAA,MAAA;AAAA,MAC/C,YAAY,eAAA;AAAA,IAAe,EAAA,CAC5C;AAAA,EAAA,GAEJ;AAGF,MAAI,SAAS;AACX,WACEC,kCAAAA,IAAC,WAAA,EAAU,SAAkB,mBAAkB,UAC5C,UAAA,SACH;AAAA,EAEJ;AAEA,SAAO;AACT;ACtEA,MAAM,cASF;AAAA,EACF,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,UAAU;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,WAAW;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,WAAW;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAEV;AAEA,MAAMC,mBAAiB,CAAC,YAA4B;AAClD,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,mBAAmB,UAAU;AACnC,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO,KAAK,gBAAgB;AACxD,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,mBAAmB,UAAU;AACnC,SAAO,GAAG,KAAK,KAAK,gBAAgB;AACtC;AAEO,MAAM,mBAAoD,CAAC;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAAS,YAAY,KAAK;AAEhC,QAAM,UACJF,uCAAC,MAAA,EAAK,WAAW,GAAG,OAAO,SAAS,GAClC,UAAA;AAAA,IAAAC,kCAAAA,IAAC,QAAK,WAAU,wCACd,UAAAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,UACd,UAAA;AAAA,MAAAA,kCAAAA,KAAC,MAAA,EAAK,WAAU,yBACd,UAAA;AAAA,QAAAC,kCAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,OAAO;AAAA,cACP,OAAO;AAAA,YAAA;AAAA,YAGT,iDAAC,MAAA,EAAK,WAAW,GAAG,uBAAuB,OAAO,KAAK,GACpD,UAAA;AAAA,cAAA,OAAO;AAAA,cAAK;AAAA,cAAE,OAAO;AAAA,YAAA,EAAA,CACxB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEFA,kCAAAA,IAAC,QAAK,WAAU,qDACd,gDAAC,MAAA,EAAK,WAAU,wDACb,UAAA,YAAA,CACH,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MACAA,kCAAAA,IAAC,MAAA,EAAK,WAAU,iEACb,UAAA,SACH;AAAA,MACC,oDACE,MAAA,EAAK,WAAU,2DACb,UAAA,WAAW,UAAU,GAAG,CAAC,EAAA,CAC5B;AAAA,MAED,iBACCA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,eAAe;AAAA,UAEd,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,EAAA,CAEJ,EAAA,CACF;AAAA,IACAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,iGACd,UAAA;AAAA,MAAAC,sCAAC,MAAA,EAAK,WAAU,4CACb,UAAA,UAAU,kBACb;AAAA,MACC,aAAa,UACZD,uCAAC,MAAA,EAAK,WAAU,4CAA2C,UAAA;AAAA,QAAA;AAAA,QAC9CE,iBAAe,QAAQ;AAAA,MAAA,EAAA,CACpC;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAGF,MAAI,SAAS;AACX,WACED,kCAAAA,IAAC,WAAA,EAAU,SAAkB,mBAAkB,UAC5C,UAAA,SACH;AAAA,EAEJ;AAEA,SAAO;AACT;AC5IA,MAAM,cAGF;AAAA,EACF,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ;AAAA,EAAA;AAAA,EAEV,OAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ;AAAA,EAAA;AAAA,EAEV,OAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ;AAAA,EAAA;AAAA,EAEV,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ;AAAA,EAAA;AAEZ;AAEA,MAAM,aAAa,CAAC,SAAuB;AACzC,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,CACT;AACH;AAEO,MAAM,WAAoC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb;AACF,MAAM;AACJ,gDACG,MAAA,EAAK,WAAW,GAAG,mBAAmB,SAAS,GAC7C,UAAA;AAAA,IAAA,SACCA,kCAAAA,IAAC,QAAK,WAAU,2DACd,gDAAC,MAAA,EAAK,WAAU,4DACb,UAAA,MAAA,CACH,EAAA,CACF;AAAA,IAEFA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO,EAAE,UAAA;AAAA,QACT,WAAU;AAAA,QACV,8BAA8B;AAAA,QAE9B,gDAAC,MAAA,EAAK,WAAU,OACb,UAAA,QAAQ,IAAI,CAAA,UAAS;AACpB,gBAAM,SAAS,YAAY,MAAM,KAAK;AACtC,iBACED,kCAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAW;AAAA,gBACT;AAAA,gBACA,OAAO;AAAA,gBACP,OAAO;AAAA,cAAA;AAAA,cAGR,UAAA;AAAA,gBAAA,iBACCA,kCAAAA,KAAC,MAAA,EAAK,WAAU,2DAA0D,UAAA;AAAA,kBAAA;AAAA,kBACtE,WAAW,MAAM,SAAS;AAAA,kBAAE;AAAA,gBAAA,GAChC;AAAA,gBAEFA,kCAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,OAAO;AAAA,oBAAA;AAAA,oBAEV,UAAA;AAAA,sBAAA;AAAA,sBACG,OAAO;AAAA,sBAAO;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEjB,cAAc,MAAM,UACnBA,kCAAAA,KAAC,MAAA,EAAK,WAAU,2DAA0D,UAAA;AAAA,kBAAA;AAAA,kBACtE,MAAM;AAAA,kBAAO;AAAA,gBAAA,GACjB;AAAA,gBAEFC,kCAAAA,IAAC,MAAA,EAAK,WAAU,6DACb,gBAAM,QAAA,CACT;AAAA,cAAA;AAAA,YAAA;AAAA,YA3BK,MAAM;AAAA,UAAA;AAAA,QA8BjB,CAAC,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,0CAED,MAAA,EAAK,WAAU,mEACd,UAAAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,4CACb,UAAA;AAAA,MAAA,QAAQ;AAAA,MAAO;AAAA,IAAA,EAAA,CAClB,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AClHA,MAAM,eAAe,CAAC,WAA2B;AAC/C,QAAM,OAAO,UAAU,IAAI,MAAM;AACjC,SAAO,OAAO,OAAO,QAAQ,CAAC,IAAI;AACpC;AAEO,MAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AACF,MAAM;AACJ,QAAM,mBAAmB;AAAA,IACvB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EAAA,EACH,OAAO;AAET,SACEC,sCAAC,QAAK,WAAW,GAAG,2BAA2B,SAAS,GACrD,UAAA,QAAQ,IAAI,CAAA,WAAU;AACrB,UAAM,gDACH,MAAA,EAAK,WAAU,kBACd,UAAAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,wCACd,UAAA;AAAA,MAAAA,kCAAAA,KAAC,MAAA,EAAK,WAAU,UACd,UAAA;AAAA,QAAAC,kCAAAA,IAAC,MAAA,EAAK,WAAU,iDACb,UAAA,OAAO,OACV;AAAA,QACAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,2BACd,UAAA;AAAA,UAAAC,kCAAAA,IAAC,MAAA,EAAK,WAAU,uDACb,UAAA,OAAO,OACV;AAAA,UACC,OAAO,QACNA,kCAAAA,IAAC,QAAK,WAAU,iDACb,iBAAO,KAAA,CACV;AAAA,QAAA,GAEJ;AAAA,QACC,OAAO,WAAW,UACjBD,kCAAAA,KAAC,MAAA,EAAK,WAAU,8BACd,UAAA;AAAA,UAAAC,kCAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,OAAO,UAAU,IACb,mCACA;AAAA,cAAA;AAAA,cAGN,UAAAA,kCAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,OAAO,UAAU,IACb,uCACA;AAAA,kBAAA;AAAA,kBAGL,UAAA,aAAa,OAAO,MAAM;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC7B;AAAA,UAAA;AAAA,UAED,OAAO,eACNA,kCAAAA,IAAC,QAAK,WAAU,iDACb,iBAAO,YAAA,CACV;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,GAEJ;AAAA,MACC,OAAO,QAAQA,kCAAAA,IAAC,QAAK,WAAU,QAAQ,iBAAO,KAAA,CAAK;AAAA,IAAA,EAAA,CACtD,EAAA,CACF;AAGF,QAAI,eAAe;AACjB,aACEA,kCAAAA,IAAC,MAAA,EAAqB,WAAW,kBAC/B,UAAAA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAM,cAAc,MAAM;AAAA,UACnC,mBAAkB;AAAA,UAClB,oBACE,OAAO,QAAQ,OAAO,OAAO,SAAS,OAAO,QAAQ;AAAA,UAGtD,UAAA;AAAA,QAAA;AAAA,MAAA,EACH,GATS,OAAO,EAUlB;AAAA,IAEJ;AAEA,iDACG,MAAA,EAAqB,WAAW,kBAC9B,UAAA,QAAA,GADQ,OAAO,EAElB;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;ACxEA,MAAM,eAGF;AAAA,EACF,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,OAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,UAAU;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAEV;AAEA,MAAM,kBAAkB,CAAC,SAAuB;AAC9C,QAAM,0BAAU,KAAA;AAChB,QAAM,SAAS,IAAI,QAAA,IAAY,KAAK,QAAA;AACpC,QAAM,WAAW,KAAK,MAAM,SAAS,GAAK;AAC1C,QAAM,YAAY,KAAK,MAAM,SAAS,IAAO;AAC7C,QAAM,WAAW,KAAK,MAAM,SAAS,KAAQ;AAE7C,MAAI,WAAW,EAAG,QAAO;AACzB,MAAI,WAAW,GAAI,QAAO,GAAG,QAAQ;AACrC,MAAI,YAAY,GAAI,QAAO,GAAG,SAAS;AACvC,MAAI,WAAW,EAAG,QAAO,GAAG,QAAQ;AACpC,SAAO,KAAK,mBAAA;AACd;AAEO,MAAM,WAAoC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,MAAM;AACJ,gDACG,MAAA,EAAK,WAAW,GAAG,mBAAmB,SAAS,GAC7C,UAAA;AAAA,IAAA,SACCA,kCAAAA,IAAC,QAAK,WAAU,2DACd,gDAAC,MAAA,EAAK,WAAU,4DACb,UAAA,MAAA,CACH,EAAA,CACF;AAAA,IAEFA,kCAAAA,IAAC,YAAA,EAAW,OAAO,EAAE,UAAA,GAAa,8BAA8B,MAC7D,UAAA,QAAQ,IAAI,CAAC,OAAO,UAAU;AAC7B,YAAM,SAAS,aAAa,MAAM,MAAM;AACxC,YAAM,SAAS,UAAU,QAAQ,SAAS;AAE1C,YAAM,UACJA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,CAAC,UAAU;AAAA,UAAA;AAAA,UAGb,UAAAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,wBACd,UAAA;AAAA,YAAAC,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,OAAO;AAAA,kBACP,OAAO;AAAA,gBAAA;AAAA,gBAGT,UAAAA,kCAAAA,IAAC,QAAK,WAAW,GAAG,qBAAqB,OAAO,KAAK,GAClD,UAAA,OAAO,KAAA,CACV;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFD,kCAAAA,KAAC,MAAA,EAAK,WAAU,UACd,UAAA;AAAA,cAAAA,kCAAAA,KAAC,MAAA,EAAK,WAAU,mCACd,UAAA;AAAA,gBAAAC,sCAAC,MAAA,EAAK,WAAU,wDACb,UAAA,MAAM,MAAM,MACf;AAAA,gBACAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,iDACb,UAAA;AAAA,kBAAA,MAAM;AAAA,kBAAO;AAAA,gBAAA,GAChB;AAAA,sDACC,MAAA,EAAK,WAAU,wDACb,UAAA,MAAM,SAAS,KAAA,CAClB;AAAA,cAAA,GACF;AAAA,cACAA,kCAAAA,KAAC,MAAA,EAAK,WAAU,8BACd,UAAA;AAAA,gBAAAC,kCAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,OAAO;AAAA,sBACP,OAAO;AAAA,oBAAA;AAAA,oBAGT,UAAAA,kCAAAA;AAAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAW;AAAA,0BACT;AAAA,0BACA,OAAO;AAAA,wBAAA;AAAA,wBAGR,UAAA,MAAM;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACT;AAAA,gBAAA;AAAA,sDAED,MAAA,EAAK,WAAU,4CACb,UAAA,MAAM,SAAS,KAAA,CAClB;AAAA,cAAA,GACF;AAAA,cACAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,8BACd,UAAA;AAAA,gBAAAC,sCAAC,QAAK,WAAU,4CACb,UAAA,gBAAgB,MAAM,SAAS,GAClC;AAAA,gBACC,MAAM,aACLD,uCAAC,MAAA,EAAK,WAAU,iDAAgD,UAAA;AAAA,kBAAA;AAAA,kBACzD,MAAM;AAAA,gBAAA,EAAA,CACb;AAAA,cAAA,EAAA,CAEJ;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAIJ,UAAI,cAAc;AAChB,eACEC,kCAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,aAAa,KAAK;AAAA,YACjC,mBAAkB;AAAA,YAEjB,UAAA;AAAA,UAAA;AAAA,UAJI,MAAM;AAAA,QAAA;AAAA,MAOjB;AAEA,aAAOA,kCAAAA,IAAC,MAAA,EAAqB,UAAA,QAAA,GAAX,MAAM,EAAa;AAAA,IACvC,CAAC,EAAA,CACH;AAAA,0CACC,MAAA,EAAK,WAAU,uFACd,UAAAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,4CAA2C,UAAA;AAAA,MAAA;AAAA,MAChD,QAAQ;AAAA,MAAO;AAAA,IAAA,EAAA,CAC1B,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;ACrNA,MAAM,eASF;AAAA,EACF,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER,WAAW;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAEV;AAEA,MAAM,iBAAiB,CAAC,YAA4B;AAClD,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,mBAAmB,UAAU;AACnC,SAAO,GAAG,OAAO,KAAK,gBAAgB;AACxC;AAEO,MAAM,eAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,gBAAgB,OAAO,KAAK,CAAA,MAAK,EAAE,WAAW,QAAQ,IACxD,WACA,OAAO,KAAK,CAAA,MAAK,EAAE,WAAW,SAAS,IACrC,YACA,OAAO,MAAM,CAAA,MAAK,EAAE,WAAW,SAAS,IACtC,YACA,OAAO,MAAM,CAAA,MAAK,EAAE,WAAW,SAAS,IACtC,YACA;AAEV,QAAM,gBAAgB,aAAa,aAAa;AAEhD,gDACG,MAAA,EAAK,WAAW,GAAG,mBAAmB,SAAS,GAC5C,UAAA;AAAA,KAAA,gBAAgB,qDACf,MAAA,EAAK,WAAU,2DACd,UAAAA,kCAAAA,KAAC,MAAA,EAAK,WAAU,yCACd,UAAA;AAAA,MAAAA,uCAAC,MAAA,EACE,UAAA;AAAA,QAAA,gBACCC,kCAAAA,IAAC,MAAA,EAAK,WAAU,4DACb,UAAA,cACH;AAAA,QAED,cACCD,kCAAAA,KAAC,MAAA,EAAK,WAAU,sDAAqD,UAAA;AAAA,UAAA;AAAA,UACjE;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA,GAEJ;AAAA,MACAC,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,cAAc;AAAA,YACd,cAAc;AAAA,UAAA;AAAA,UAGhB,iDAAC,MAAA,EAAK,WAAW,GAAG,uBAAuB,cAAc,KAAK,GAC3D,UAAA;AAAA,YAAA,cAAc;AAAA,YAAM;AAAA,YACpB,cAAc,OAAO,CAAC,EAAE,gBAAgB,cAAc,MAAM,CAAC;AAAA,UAAA,EAAA,CAChE;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CACF,EAAA,CACF;AAAA,IAEFA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,YAAU;AAAA,QACV,gCAAgC;AAAA,QAChC,uBAAuB,EAAE,SAAS,GAAA;AAAA,QAElC,UAAAA,kCAAAA,IAAC,QAAK,WAAU,yBACb,iBAAO,IAAI,CAAC,OAAO,UAAU;AAC5B,gBAAM,SAAS,aAAa,MAAM,MAAM;AACxC,gBAAM,SAAS,UAAU,OAAO,SAAS;AAEzC,gBAAM,eACJD,kCAAAA,KAAC,MAAA,EAAK,WAAU,gBACd,UAAA;AAAA,YAAAC,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,OAAO;AAAA,gBAAA;AAAA,gBAGT,UAAAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,gBACd,UAAA;AAAA,kBAAAC,kCAAAA,IAAC,MAAA,EAAK,WAAW,GAAG,WAAW,OAAO,KAAK,GACxC,iBAAO,KAAA,CACV;AAAA,kBACAA,kCAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,eAAe;AAAA,sBAEd,UAAA,MAAM;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAER,MAAM,aAAa,UAClBA,kCAAAA,IAAC,MAAA,EAAK,WAAU,iDACb,UAAA,eAAe,MAAM,QAAQ,EAAA,CAChC;AAAA,gBAAA,EAAA,CAEJ;AAAA,cAAA;AAAA,YAAA;AAAA,YAED,MAAM,QAAQ,MAAM,KAAK,SAAS,KACjCA,kCAAAA,IAAC,MAAA,EAAK,WAAU,QACd,UAAAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,4CACb,UAAA;AAAA,cAAA,MAAM,KAAK,OAAO,CAAA,MAAK,EAAE,WAAW,SAAS,EAAE;AAAA,cAAO;AAAA,cACtD,MAAM,KAAK;AAAA,cAAO;AAAA,YAAA,EAAA,CACrB,EAAA,CACF;AAAA,UAAA,GAEJ;AAGF,iBACEA,kCAAAA,KAAC,MAAA,EAAoB,WAAU,yBAC5B,UAAA;AAAA,YAAA,eACCC,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM,aAAa,KAAK;AAAA,gBACjC,mBAAkB;AAAA,gBAClB,oBAAoB,GAAG,MAAM,IAAI,MAAM,MAAM,MAAM;AAAA,gBAElD,UAAA;AAAA,cAAA;AAAA,YAAA,IAGH;AAAA,YAED,CAAC,UACAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,QACd,UAAA;AAAA,cAAAC,kCAAAA,IAAC,MAAA,EAAK,WAAU,yCAAA,CAAyC;AAAA,cACzDA,kCAAAA,IAAC,MAAA,EAAK,WAAU,2DAA0D,UAAA,IAAA,CAE1E;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,GAlBO,MAAM,EAoBjB;AAAA,QAEJ,CAAC,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,0CAED,MAAA,EAAK,WAAU,uFACd,UAAAD,kCAAAA,KAAC,MAAA,EAAK,WAAU,4CACb,UAAA;AAAA,MAAA,OAAO;AAAA,MAAO;AAAA,MAAU;AAAA,MACxB,OAAO,OAAO,CAAA,MAAK,EAAE,WAAW,SAAS,EAAE;AAAA,MAAO;AAAA,IAAA,EAAA,CACrD,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;","x_google_ignoreList":[0,1,2]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sudobility/devops-components-rn",
3
- "version": "1.0.0",
4
- "description": "React Native DevOps components for Sudobility",
3
+ "version": "1.0.2",
4
+ "description": "React Native DevOps and deployment UI components for Sudobility",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
7
7
  "types": "dist/index.d.ts",
@@ -21,7 +21,8 @@
21
21
  "scripts": {
22
22
  "build": "tsc && vite build",
23
23
  "dev": "vite build --watch",
24
- "type-check": "tsc --noEmit"
24
+ "type-check": "tsc --noEmit",
25
+ "test": "jest --passWithNoTests"
25
26
  },
26
27
  "peerDependencies": {
27
28
  "@sudobility/components-rn": "^1.0.0",
@@ -30,12 +31,9 @@
30
31
  "react-native": ">=0.72.0"
31
32
  },
32
33
  "devDependencies": {
33
- "@sudobility/components-rn": "^1.0.3",
34
+ "@sudobility/components-rn": "^1.0.7",
34
35
  "@sudobility/design": "^1.1.14",
35
36
  "@types/react": "^18.3.0",
36
- "@types/react-native": "^0.73.0",
37
- "react": "^18.3.0",
38
- "react-native": "^0.76.0",
39
37
  "typescript": "^5.6.0",
40
38
  "vite": "^6.0.0",
41
39
  "vite-plugin-dts": "^4.3.0"
@@ -48,9 +46,10 @@
48
46
  "keywords": [
49
47
  "react-native",
50
48
  "devops",
51
- "components",
52
- "monitoring"
49
+ "deployment",
50
+ "monitoring",
51
+ "components"
53
52
  ],
54
53
  "author": "Sudobility",
55
- "license": "MIT"
54
+ "license": "BUSL-1.1"
56
55
  }
@@ -25,7 +25,10 @@ export interface AlertDialogProps extends ViewProps {
25
25
  loading?: boolean;
26
26
  }
27
27
 
28
- const variantClasses: Record<AlertVariant, { iconBg: string; icon: string; button: string }> = {
28
+ const variantClasses: Record<
29
+ AlertVariant,
30
+ { iconBg: string; icon: string; button: string }
31
+ > = {
29
32
  default: {
30
33
  iconBg: 'bg-blue-100 dark:bg-blue-900/30',
31
34
  icon: 'text-blue-600 dark:text-blue-400',
@@ -86,10 +89,10 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
86
89
  <Modal
87
90
  visible={isOpen}
88
91
  transparent
89
- animationType="fade"
92
+ animationType='fade'
90
93
  onRequestClose={onClose}
91
94
  >
92
- <View className="flex-1 justify-center items-center bg-black/50 p-4">
95
+ <View className='flex-1 justify-center items-center bg-black/50 p-4'>
93
96
  <View
94
97
  className={cn(
95
98
  'w-full max-w-md bg-white dark:bg-gray-900 rounded-lg shadow-xl',
@@ -98,8 +101,8 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
98
101
  {...props}
99
102
  >
100
103
  {/* Content */}
101
- <View className="p-6">
102
- <View className="flex-row items-start gap-4">
104
+ <View className='p-6'>
105
+ <View className='flex-row items-start gap-4'>
103
106
  <View
104
107
  className={cn(
105
108
  'w-12 h-12 rounded-full items-center justify-center',
@@ -111,14 +114,14 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
111
114
  </Text>
112
115
  </View>
113
116
 
114
- <View className="flex-1">
115
- <Text className="text-lg font-semibold text-gray-900 dark:text-white mb-2">
117
+ <View className='flex-1'>
118
+ <Text className='text-lg font-semibold text-gray-900 dark:text-white mb-2'>
116
119
  {typeof title === 'string' ? title : null}
117
120
  </Text>
118
121
  {typeof title !== 'string' && title}
119
122
 
120
123
  {description && (
121
- <Text className="text-sm text-gray-600 dark:text-gray-400">
124
+ <Text className='text-sm text-gray-600 dark:text-gray-400'>
122
125
  {typeof description === 'string' ? description : null}
123
126
  </Text>
124
127
  )}
@@ -128,12 +131,12 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
128
131
  </View>
129
132
 
130
133
  {/* Actions */}
131
- <View className="flex-row gap-3 px-6 py-4 bg-gray-50 dark:bg-gray-800/50 rounded-b-lg">
134
+ <View className='flex-row gap-3 px-6 py-4 bg-gray-50 dark:bg-gray-800/50 rounded-b-lg'>
132
135
  {showCancel && (
133
136
  <Pressable
134
137
  onPress={onClose}
135
138
  disabled={loading}
136
- accessibilityRole="button"
139
+ accessibilityRole='button'
137
140
  className={cn(
138
141
  'flex-1 px-4 py-2 rounded-md border',
139
142
  'bg-white dark:bg-gray-700',
@@ -141,7 +144,7 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
141
144
  loading && 'opacity-50'
142
145
  )}
143
146
  >
144
- <Text className="text-sm font-medium text-center text-gray-700 dark:text-gray-300">
147
+ <Text className='text-sm font-medium text-center text-gray-700 dark:text-gray-300'>
145
148
  {cancelLabel}
146
149
  </Text>
147
150
  </Pressable>
@@ -150,7 +153,7 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
150
153
  <Pressable
151
154
  onPress={handleConfirm}
152
155
  disabled={confirmDisabled || loading}
153
- accessibilityRole="button"
156
+ accessibilityRole='button'
154
157
  className={cn(
155
158
  'flex-1 px-4 py-2 rounded-md',
156
159
  styles.button,
@@ -158,12 +161,14 @@ export const AlertDialog: React.FC<AlertDialogProps> = ({
158
161
  )}
159
162
  >
160
163
  {loading ? (
161
- <View className="flex-row items-center justify-center gap-2">
162
- <ActivityIndicator size="small" color="white" />
163
- <Text className="text-sm font-medium text-white">Loading...</Text>
164
+ <View className='flex-row items-center justify-center gap-2'>
165
+ <ActivityIndicator size='small' color='white' />
166
+ <Text className='text-sm font-medium text-white'>
167
+ Loading...
168
+ </Text>
164
169
  </View>
165
170
  ) : (
166
- <Text className="text-sm font-medium text-center text-white">
171
+ <Text className='text-sm font-medium text-center text-white'>
167
172
  {confirmLabel}
168
173
  </Text>
169
174
  )}
@@ -18,8 +18,8 @@ export const ApiPlayground: React.FC<ApiPlaygroundProps> = ({
18
18
  <Pressable
19
19
  onPress={disabled ? undefined : onPress}
20
20
  disabled={disabled}
21
- accessibilityRole="button"
22
- accessibilityLabel="API Playground"
21
+ accessibilityRole='button'
22
+ accessibilityLabel='API Playground'
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 ApiPlayground: React.FC<ApiPlaygroundProps> = ({
27
27
  )}
28
28
  {...props}
29
29
  >
30
- {children || <Text className="text-gray-900 dark:text-white">ApiPlayground Component</Text>}
30
+ {children || (
31
+ <Text className='text-gray-900 dark:text-white'>
32
+ ApiPlayground Component
33
+ </Text>
34
+ )}
31
35
  </Pressable>
32
36
  );
@@ -19,9 +19,13 @@ export const ApiReference: React.FC<ApiReferenceProps> = ({
19
19
  disabled && 'opacity-50',
20
20
  className
21
21
  )}
22
- accessibilityLabel="API Reference"
22
+ accessibilityLabel='API Reference'
23
23
  {...props}
24
24
  >
25
- {children || <Text className="text-gray-900 dark:text-white">ApiReference Component</Text>}
25
+ {children || (
26
+ <Text className='text-gray-900 dark:text-white'>
27
+ ApiReference Component
28
+ </Text>
29
+ )}
26
30
  </View>
27
31
  );
package/src/AuditLog.tsx CHANGED
@@ -1,27 +1,250 @@
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, ScrollView, Pressable } from 'react-native';
3
+ import { cn, Card } from '@sudobility/components-rn';
4
4
 
5
- export interface AuditLogProps extends ViewProps {
6
- disabled?: boolean;
7
- children?: React.ReactNode;
5
+ export type AuditActionType =
6
+ | 'create'
7
+ | 'update'
8
+ | 'delete'
9
+ | 'login'
10
+ | 'logout'
11
+ | 'access'
12
+ | 'export'
13
+ | 'import'
14
+ | 'approve'
15
+ | 'reject'
16
+ | 'deploy'
17
+ | 'rollback';
18
+
19
+ export interface AuditEntry {
20
+ id: string;
21
+ action: AuditActionType;
22
+ actor: {
23
+ id: string;
24
+ name: string;
25
+ email?: string;
26
+ avatar?: string;
27
+ };
28
+ resource: {
29
+ type: string;
30
+ id: string;
31
+ name: string;
32
+ };
33
+ timestamp: Date;
34
+ metadata?: Record<string, unknown>;
35
+ ipAddress?: string;
36
+ }
37
+
38
+ export interface AuditLogProps {
39
+ entries: AuditEntry[];
40
+ title?: string;
41
+ maxHeight?: number;
42
+ onEntryPress?: (entry: AuditEntry) => void;
43
+ className?: string;
8
44
  }
9
45
 
46
+ const actionConfig: Record<
47
+ AuditActionType,
48
+ { color: string; bgColor: string; darkBgColor: string; icon: string }
49
+ > = {
50
+ create: {
51
+ color: 'text-green-700 dark:text-green-300',
52
+ bgColor: 'bg-green-100',
53
+ darkBgColor: 'dark:bg-green-900',
54
+ icon: '+',
55
+ },
56
+ update: {
57
+ color: 'text-blue-700 dark:text-blue-300',
58
+ bgColor: 'bg-blue-100',
59
+ darkBgColor: 'dark:bg-blue-900',
60
+ icon: '~',
61
+ },
62
+ delete: {
63
+ color: 'text-red-700 dark:text-red-300',
64
+ bgColor: 'bg-red-100',
65
+ darkBgColor: 'dark:bg-red-900',
66
+ icon: '-',
67
+ },
68
+ login: {
69
+ color: 'text-purple-700 dark:text-purple-300',
70
+ bgColor: 'bg-purple-100',
71
+ darkBgColor: 'dark:bg-purple-900',
72
+ icon: '→',
73
+ },
74
+ logout: {
75
+ color: 'text-gray-700 dark:text-gray-300',
76
+ bgColor: 'bg-gray-100',
77
+ darkBgColor: 'dark:bg-gray-800',
78
+ icon: '←',
79
+ },
80
+ access: {
81
+ color: 'text-cyan-700 dark:text-cyan-300',
82
+ bgColor: 'bg-cyan-100',
83
+ darkBgColor: 'dark:bg-cyan-900',
84
+ icon: '◉',
85
+ },
86
+ export: {
87
+ color: 'text-orange-700 dark:text-orange-300',
88
+ bgColor: 'bg-orange-100',
89
+ darkBgColor: 'dark:bg-orange-900',
90
+ icon: '↑',
91
+ },
92
+ import: {
93
+ color: 'text-teal-700 dark:text-teal-300',
94
+ bgColor: 'bg-teal-100',
95
+ darkBgColor: 'dark:bg-teal-900',
96
+ icon: '↓',
97
+ },
98
+ approve: {
99
+ color: 'text-emerald-700 dark:text-emerald-300',
100
+ bgColor: 'bg-emerald-100',
101
+ darkBgColor: 'dark:bg-emerald-900',
102
+ icon: '✓',
103
+ },
104
+ reject: {
105
+ color: 'text-rose-700 dark:text-rose-300',
106
+ bgColor: 'bg-rose-100',
107
+ darkBgColor: 'dark:bg-rose-900',
108
+ icon: '✗',
109
+ },
110
+ deploy: {
111
+ color: 'text-indigo-700 dark:text-indigo-300',
112
+ bgColor: 'bg-indigo-100',
113
+ darkBgColor: 'dark:bg-indigo-900',
114
+ icon: '▲',
115
+ },
116
+ rollback: {
117
+ color: 'text-amber-700 dark:text-amber-300',
118
+ bgColor: 'bg-amber-100',
119
+ darkBgColor: 'dark:bg-amber-900',
120
+ icon: '↺',
121
+ },
122
+ };
123
+
124
+ const formatTimestamp = (date: Date): string => {
125
+ const now = new Date();
126
+ const diffMs = now.getTime() - date.getTime();
127
+ const diffMins = Math.floor(diffMs / 60000);
128
+ const diffHours = Math.floor(diffMs / 3600000);
129
+ const diffDays = Math.floor(diffMs / 86400000);
130
+
131
+ if (diffMins < 1) return 'Just now';
132
+ if (diffMins < 60) return `${diffMins}m ago`;
133
+ if (diffHours < 24) return `${diffHours}h ago`;
134
+ if (diffDays < 7) return `${diffDays}d ago`;
135
+ return date.toLocaleDateString();
136
+ };
137
+
10
138
  export const AuditLog: React.FC<AuditLogProps> = ({
139
+ entries,
140
+ title,
141
+ maxHeight = 500,
142
+ onEntryPress,
11
143
  className,
12
- children,
13
- disabled,
14
- ...props
15
- }) => (
16
- <View
17
- className={cn(
18
- 'p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700',
19
- disabled && 'opacity-50',
20
- className
21
- )}
22
- accessibilityLabel="Audit Log"
23
- {...props}
24
- >
25
- {children || <Text className="text-gray-900 dark:text-white">AuditLog Component</Text>}
26
- </View>
27
- );
144
+ }) => {
145
+ return (
146
+ <Card className={cn('overflow-hidden', className)}>
147
+ {title && (
148
+ <View className='px-4 py-3 border-b border-gray-200 dark:border-gray-700'>
149
+ <Text className='text-base font-semibold text-gray-900 dark:text-gray-100'>
150
+ {title}
151
+ </Text>
152
+ </View>
153
+ )}
154
+ <ScrollView style={{ maxHeight }} showsVerticalScrollIndicator={true}>
155
+ {entries.map((entry, index) => {
156
+ const config = actionConfig[entry.action];
157
+ const isLast = index === entries.length - 1;
158
+
159
+ const content = (
160
+ <View
161
+ className={cn(
162
+ 'px-4 py-3',
163
+ !isLast && 'border-b border-gray-100 dark:border-gray-800'
164
+ )}
165
+ >
166
+ <View className='flex-row items-start'>
167
+ <View
168
+ className={cn(
169
+ 'w-8 h-8 rounded-full items-center justify-center mr-3',
170
+ config.bgColor,
171
+ config.darkBgColor
172
+ )}
173
+ >
174
+ <Text className={cn('text-sm font-bold', config.color)}>
175
+ {config.icon}
176
+ </Text>
177
+ </View>
178
+ <View className='flex-1'>
179
+ <View className='flex-row items-center flex-wrap'>
180
+ <Text className='text-sm font-medium text-gray-900 dark:text-gray-100'>
181
+ {entry.actor.name}
182
+ </Text>
183
+ <Text className='text-sm text-gray-600 dark:text-gray-400 mx-1'>
184
+ {entry.action}d
185
+ </Text>
186
+ <Text className='text-sm font-medium text-gray-900 dark:text-gray-100'>
187
+ {entry.resource.name}
188
+ </Text>
189
+ </View>
190
+ <View className='flex-row items-center mt-1'>
191
+ <View
192
+ className={cn(
193
+ 'px-1.5 py-0.5 rounded mr-2',
194
+ config.bgColor,
195
+ config.darkBgColor
196
+ )}
197
+ >
198
+ <Text
199
+ className={cn(
200
+ 'text-xs font-medium uppercase',
201
+ config.color
202
+ )}
203
+ >
204
+ {entry.action}
205
+ </Text>
206
+ </View>
207
+ <Text className='text-xs text-gray-500 dark:text-gray-500'>
208
+ {entry.resource.type}
209
+ </Text>
210
+ </View>
211
+ <View className='flex-row items-center mt-2'>
212
+ <Text className='text-xs text-gray-400 dark:text-gray-600'>
213
+ {formatTimestamp(entry.timestamp)}
214
+ </Text>
215
+ {entry.ipAddress && (
216
+ <Text className='text-xs text-gray-400 dark:text-gray-600 ml-2'>
217
+ IP: {entry.ipAddress}
218
+ </Text>
219
+ )}
220
+ </View>
221
+ </View>
222
+ </View>
223
+ </View>
224
+ );
225
+
226
+ if (onEntryPress) {
227
+ return (
228
+ <Pressable
229
+ key={entry.id}
230
+ onPress={() => onEntryPress(entry)}
231
+ accessibilityRole='button'
232
+ >
233
+ {content}
234
+ </Pressable>
235
+ );
236
+ }
237
+
238
+ return <View key={entry.id}>{content}</View>;
239
+ })}
240
+ </ScrollView>
241
+ <View className='px-4 py-2 bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700'>
242
+ <Text className='text-xs text-gray-500 dark:text-gray-500'>
243
+ Showing {entries.length} audit entries
244
+ </Text>
245
+ </View>
246
+ </Card>
247
+ );
248
+ };
249
+
250
+ export default AuditLog;
@@ -19,9 +19,13 @@ export const BodyMetrics: React.FC<BodyMetricsProps> = ({
19
19
  disabled && 'opacity-50',
20
20
  className
21
21
  )}
22
- accessibilityLabel="Body Metrics"
22
+ accessibilityLabel='Body Metrics'
23
23
  {...props}
24
24
  >
25
- {children || <Text className="text-gray-900 dark:text-white">BodyMetrics Component</Text>}
25
+ {children || (
26
+ <Text className='text-gray-900 dark:text-white'>
27
+ BodyMetrics Component
28
+ </Text>
29
+ )}
26
30
  </View>
27
31
  );