{"version":3,"file":"main.js","mappings":"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","sources":["webpack://@mtnkente/ac-kente-platform/./src/app/constant.ts","webpack://@mtnkente/ac-kente-platform/./src/app/services/NavigationService.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/externals/ExternalLibs.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/services/SharedDataService.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/services/StepperContext.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/services/StepperService.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/services/LocalDataService.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/services/DynamicDataService.tsx","webpack://@mtnkente/ac-kente-platform/./src/utilities/authconfig.ts","webpack://@mtnkente/ac-kente-platform/./src/app/components/shared/BaseStyles.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/Dashboard/Dashboard.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/ErrorUI/ErrorUI.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/ErrorUI/FeatureAppErrorBoundary.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/ErrorUI/feature-app-errors.ts","webpack://@mtnkente/ac-kente-platform/./src/app/ErrorUI/SafeFeatureAppLoader.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/Tabs/TabOverviewContent.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/Tabs/TabOverviewContent.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/services/feature-app-auth.ts","webpack://@mtnkente/ac-kente-platform/./src/app/services/opco-api.ts","webpack://@mtnkente/ac-kente-platform/./src/app/services/rbac/rbac-auth-config.ts","webpack://@mtnkente/ac-kente-platform/./src/app/services/rbac/opco-api.ts","webpack://@mtnkente/ac-kente-platform/./src/app/services/rbac/session.ts","webpack://@mtnkente/ac-kente-platform/./src/app/services/rbac/engine.ts","webpack://@mtnkente/ac-kente-platform/./src/app/hooks/StoreDataProvider.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/ProjectOverview/project-overview-mock.ts","webpack://@mtnkente/ac-kente-platform/./src/app/components/ProjectOverview/ProjectOverview.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/ProjectOverview/ProjectOverview.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/NoOpcoAccess/NoOpcoAccess.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/NoOpcoAccess/NoOpcoAccess.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/WorkItems/WorkItemsSection.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/WorkItems/HorizontalScrollSection.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/WorkItems/WorkItemCard.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/WorkItems/WorkItemsSection.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/Loading/Loading.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/Dashboard/Dashboard.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/AppStore/AppStore.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/AppStore/AppStore.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateFlows/TestAutomation/TestAutomation.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/ProductFeatureOverview/ProductFeatureOverview.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/ProductFeatureOverview/ProductFeatureOverview.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateFlows/MicroServices/Microservice.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateFlows/AppFeature/AppFeature.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateFlows/ApiProxy/APIProxy.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateFlows/CustomComponent/CustomComponent.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateFlows/AppServices/AppServices.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateFlows/AppContainer/AppContainer.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/ComingSoon/ComingSoon.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/ComingSoon/ComingSoon.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/APIProxies/APIProxies.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/TestSuites/TestSuites.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/Component/Component.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/InfraAsCode/InfraAsCode.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/InfraAsCode/InfraAsCode.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/MicroServices/MicroService.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/SearchResults/SearchResults.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/SearchResults/SearchResults.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/ProfileManagement/ProfileManagement.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/ProfileManagement/ProfileManagement.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/Error.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/InfraAsCodeDetails/InfraAsCodeDetails.style.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateInfraAsCode/CreateStandaloneWebApp.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateInfraAsCode/CreateServerlessMicroservice.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/LogoutModal/LogoutModal.styled.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/LogoutModal/LogoutModal.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/hooks/UserActivityProvider.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/InfraAsCodeDetails/InfraAsCodeDetails.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateInfraAsCode/CreateWebAppServerlessMicro.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/components/HelpDocumentation/HelpDocumentation.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/ErrorUI/navigation-retry-signal.ts","webpack://@mtnkente/ac-kente-platform/./src/app/components/CreateFlows/InfraAsCodeCreate/CreateIfraAsCode/CreateIfraAsCode.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/App.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/ErrorUI/RootErrorBoundary.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/AppDefinition.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/services/HelloWorldService.tsx","webpack://@mtnkente/ac-kente-platform/./src/app/services/DynamicStoreDataService.tsx","webpack://@mtnkente/ac-kente-platform/./src/index.tsx"],"sourcesContent":["export const defaultRoute = 'kente';\n","import {\n  FeatureServiceBinder,\n  FeatureServiceProviderDefinition,\n  FeatureServices,\n  SharedFeatureService,\n} from '@feature-hub/core';\nimport { HistoryServiceV3 } from '@feature-hub/history-service';\nimport { History } from 'history';\nimport { contentTracking, Content } from '@mtnkente/gtm';\nimport { defaultRoute } from '../constant';\n\nexport interface NavigationServiceV1 {\n  readonly history: History;\n  navigateTo(name: string, params?: Record<string, any>): string;\n  updateStep(step: string | number, replaceHistory?: boolean): void;\n  getStep(): string | null;\n}\n\nexport interface SharedNavigationService extends SharedFeatureService {\n  readonly '1.0.0': FeatureServiceBinder<NavigationServiceV1>;\n}\n\nexport interface NavigationServiceDependencies extends FeatureServices {\n  readonly 's2:history': HistoryServiceV3;\n}\n\nexport function createSlug(name: string): string {\n  return name\n    .toLowerCase()\n    .replace(/\\s+/g, '-')\n    .replace(/[^a-z0-9-/]/g, '');\n}\n\nexport const navigationServiceDefinition: FeatureServiceProviderDefinition<\n  SharedNavigationService,\n  NavigationServiceDependencies\n> = {\n  id: 'shell:navigation-service',\n  dependencies: {\n    featureServices: {\n      's2:history': '^3.0.0',\n    },\n  },\n\n  create: ({ featureServices }) => {\n    const history = featureServices['s2:history'].rootHistory;\n    return {\n      '1.0.0': () => ({\n        featureService: {\n          history,\n          navigateTo(name: string, params?: Record<string, any>): string {\n            // test events\n            contentTracking(\n              new Content({\n                eventName: 'buttonClick',\n                eventDescription: 'User clicked on Create button',\n                eventTrigger: 'button_click',\n                category: 'Navigation',\n                subcategory: 'create',\n                title: 'Create Button ',\n                description: `User initiated Create ${name}`,\n              })\n            );\n\n            const slug = createSlug(name);\n            const queryParams = params ? `?${new URLSearchParams(params)}` : '';\n            const url = `/${defaultRoute}${slug}${queryParams}`;\n            history.push({ pathname: url });\n            const originalPush = history.push;\n            history.push = (HistoryUrl, state) => {\n              originalPush(HistoryUrl, state);\n            };\n            return url;\n          },\n\n          updateStep(step: string | number, replaceHistory = false): void {\n            const currentPath = history.location.pathname;\n            const segments = currentPath.split('/').filter(Boolean);\n\n            if (segments.length > 0) {\n              const lastSegment = segments[segments.length - 1];\n              if (!isNaN(Number(lastSegment))) {\n                segments[segments.length - 1] = String(step);\n              } else {\n                console.log('Appending new step:', String(step));\n                segments.push(String(step));\n              }\n            } else {\n              segments.push(String(step));\n            }\n\n            const newPathname = '/' + segments.join('/');\n            const currentSearch = history.location.search;\n\n            const locationUpdate = {\n              pathname: newPathname,\n              search: currentSearch,\n            };\n\n            if (replaceHistory) {\n              history.replace(locationUpdate);\n            } else {\n              history.push(locationUpdate);\n            }\n          },\n\n          getStep(): string | null {\n            const currentPath = history.location.pathname;\n            const segments = currentPath.split('/').filter(Boolean);\n\n            if (segments.length === 0) return null;\n            return segments[segments.length - 1];\n          },\n        },\n      }),\n    };\n  },\n};\n","import * as FeatureHubReact from '@feature-hub/react';\nimport * as react from 'react';\n\nexport const Externals = {\n  react: react,\n  '@feature-hub/react': FeatureHubReact,\n};\n","// SharedDataService.ts\n\nimport {\n  SharedFeatureService,\n  FeatureServiceBinder,\n  FeatureServiceProviderDefinition,\n} from '@feature-hub/core';\n\nexport interface SharedDataServiceV1<T = Record<string, unknown>> {\n  setData(data: T): void;\n  getData(): T | undefined;\n}\n\nexport interface SharedDataService extends SharedFeatureService {\n  readonly '1.0.0': FeatureServiceBinder<SharedDataServiceV1>;\n}\n\nexport const dataSharingServiceDefinition: FeatureServiceProviderDefinition<SharedDataService> = {\n  id: 'acme:shared-data-service',\n\n  create: (): SharedDataService => {\n    let sharedData: Record<string, unknown> | undefined;\n\n    return {\n      '1.0.0': (): { featureService: SharedDataServiceV1 } => ({\n        featureService: {\n          setData(data: Record<string, unknown>): void {\n            console.trace('latest state received by service', data);\n            sharedData = {\n              ...sharedData,\n              ...data,\n            };\n          },\n          getData(): Record<string, unknown> | undefined {\n            return sharedData;\n          },\n        },\n      }),\n    };\n  },\n};\n","import React, { createContext, useContext, useState, ReactNode, ReactElement } from 'react';\n\ninterface StepperContextType {\n  activeStep: number;\n  handleNext: () => void;\n  handleBack: () => void;\n  addSteps: (newSteps: ReactElement[]) => void;\n  steps: ReactElement[];\n  goTo: (index?: number) => void;\n}\n\nconst StepperContext = createContext<StepperContextType | undefined>(undefined);\n\nexport const StepperProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n  const [activeStep, setActiveStep] = useState(0);\n  const [steps, setSteps] = useState<ReactElement[]>([]);\n\n  const handleNext = () => {\n    if (activeStep < steps.length - 1) {\n      setActiveStep((prevActiveStep) => prevActiveStep + 1);\n    }\n  };\n\n  const handleBack = () => {\n    if (activeStep > 0) {\n      setActiveStep((prevActiveStep) => prevActiveStep - 1);\n    }\n  };\n\n  const addSteps = (newSteps: ReactElement[]) => {\n    setSteps((prevSteps) => [...prevSteps, ...newSteps]);\n  };\n\n  const goTo = (index?: any) => {\n    if (index < 0) {\n      setActiveStep(0);\n    } else if (index >= 5) {\n      setActiveStep(0);\n    } else if (isNaN(index)) {\n      setActiveStep(0);\n    } else {\n      setActiveStep(index);\n    }\n  };\n\n  return (\n    <StepperContext.Provider value={{ activeStep, handleNext, handleBack, addSteps, steps, goTo }}>\n      {children}\n    </StepperContext.Provider>\n  );\n};\n\nexport const useStepper = (): StepperContextType => {\n  const context = useContext(StepperContext);\n  if (!context) {\n    throw new Error('useStepper must be used within a StepperProvider');\n  }\n  return context;\n};\n","import {\n  FeatureServiceBinder,\n  FeatureServiceProviderDefinition,\n  SharedFeatureService,\n} from '@feature-hub/core';\nimport { ReactElement } from 'react';\nimport { useStepper } from './StepperContext';\n\nexport interface StepperServiceV1 {\n  useMultiStepForm: () => {\n    activeStep: number;\n    handleBack: () => void;\n    handleNext: () => void;\n    addSteps: (steps: ReactElement[]) => void;\n    steps: ReactElement[];\n    goTo: () => void;\n  };\n}\n\nexport interface SharedStepperService extends SharedFeatureService {\n  readonly '1.0.0': FeatureServiceBinder<StepperServiceV1>;\n}\n\nexport const stepperServiceDefinition: FeatureServiceProviderDefinition<SharedStepperService> = {\n  id: 'shared:stepper-service',\n\n  create: () => ({\n    '1.0.0': () => ({\n      featureService: {\n        useMultiStepForm: useStepper,\n      },\n    }),\n  }),\n};\n","// SharedDataService.ts\n\nimport {\n  SharedFeatureService,\n  FeatureServiceBinder,\n  FeatureServiceProviderDefinition,\n} from '@feature-hub/core';\n\n// 1. Defined a re-usable type for the shared data\ntype SharedData = Record<string, unknown>;\n\nexport interface LocalSharedDataServiceV1 {\n  setData(data: SharedData): void;\n  getData(): SharedData;\n}\n\nexport interface LocalSharedDataService extends SharedFeatureService {\n  readonly '1.0.0': FeatureServiceBinder<LocalSharedDataServiceV1>;\n}\n\nexport const localDataSharingServiceDefinition: FeatureServiceProviderDefinition<LocalSharedDataService> =\n  {\n    id: 'acme:local-data-service',\n\n    create: () => {\n      let sharedData: SharedData = {};\n\n      return {\n        '1.0.0': () => ({\n          featureService: {\n            setData(data: SharedData): void {\n              sharedData = { ...data };\n            },\n            getData(): SharedData {\n              return sharedData;\n            },\n          },\n        }),\n      };\n    },\n  };\n","// DynamicDataService.ts\n\nimport {\n  SharedFeatureService,\n  FeatureServiceBinder,\n  FeatureServiceProviderDefinition,\n} from '@feature-hub/core';\n\nexport interface DynamicServiceV1<T = Record<string, unknown>> {\n  setData(data: T): void;\n  getData(): T | undefined;\n  setReady?(ready: boolean): void;\n  isReady?(): boolean;\n  whenReady?(): Promise<T | undefined>;\n  subscribe?(listener: (event: DynamicDataEvent<T>) => void): () => void;\n}\n\nexport type DynamicDataEvent<T = Record<string, unknown>> = {\n  data: T | undefined;\n  isReady: boolean;\n};\n\nexport interface DynamicService extends SharedFeatureService {\n  readonly '1.0.0': FeatureServiceBinder<DynamicServiceV1>;\n}\n\nexport const dynamicServiceDefinition: FeatureServiceProviderDefinition<DynamicService> = {\n  id: 'acme:dynamic-service',\n\n  create: (): DynamicService => {\n    let dynamicData: Record<string, unknown> | undefined;\n    let ready = false;\n    const listeners = new Set<(event: DynamicDataEvent<Record<string, unknown>>) => void>();\n    const readyResolvers = new Set<(data: Record<string, unknown> | undefined) => void>();\n\n    const emit = (): void => {\n      const event: DynamicDataEvent<Record<string, unknown>> = {\n        data: dynamicData,\n        isReady: ready,\n      };\n\n      listeners.forEach((listener) => listener(event));\n    };\n\n    const resolveReadyWaiters = (): void => {\n      readyResolvers.forEach((resolve) => resolve(dynamicData));\n      readyResolvers.clear();\n    };\n\n    return {\n      '1.0.0': (): { featureService: DynamicServiceV1 } => ({\n        featureService: {\n          setData(data: Record<string, unknown>): void {\n            console.trace('latest state received by global service', data);\n            dynamicData = { ...dynamicData, ...data };\n            emit();\n          },\n          getData(): Record<string, unknown> | undefined {\n            return dynamicData;\n          },\n          setReady(nextReady: boolean): void {\n            if (ready === nextReady) {\n              return;\n            }\n\n            const previousReady = ready;\n            ready = nextReady;\n            console.info('[acme:dynamic-service] ready state changed', {\n              previousReady,\n              ready,\n              hasData: !!dynamicData,\n            });\n            if (ready) {\n              resolveReadyWaiters();\n            }\n            emit();\n          },\n          isReady(): boolean {\n            return ready;\n          },\n          whenReady(): Promise<Record<string, unknown> | undefined> {\n            if (ready) {\n              return Promise.resolve(dynamicData);\n            }\n\n            return new Promise((resolve) => {\n              readyResolvers.add(resolve);\n            });\n          },\n          subscribe(\n            listener: (event: DynamicDataEvent<Record<string, unknown>>) => void\n          ): () => void {\n            listeners.add(listener);\n            return () => {\n              listeners.delete(listener);\n            };\n          },\n        },\n      }),\n    };\n  },\n};\n","import { AuthConfig } from '@mtnkente/authentication';\n\nexport const authConfig: AuthConfig = {\n  clientId: process.env.REACT_APP_CLIENT_ID ?? '',\n  tenantId: process.env.REACT_APP_TENANT_ID ?? '',\n  redirectUri: process.env.REACT_APP_KENTE_SHELL_URL ?? '',\n  shelltype: process.env.REACT_APP_KENTE_SHELL_TYPE ?? 'shell',\n};\n","import styled, { css } from 'styled-components';\n\n/**\n * Base styles for consistent page layout across the application.\n * These styles ensure all sections align horizontally (same left/right edges).\n *\n * Usage: Import and extend these base components in page-specific style files.\n */\n\n// Common CSS for ensuring children align to full width\nconst fullWidthChildren = css`\n  & > * {\n    width: 100%;\n    margin-left: 0;\n    margin-right: 0;\n  }\n`;\n\n/**\n * Base shell container for wrapping feature apps\n * Ensures no extra margin/padding that would break alignment\n */\nexport const BaseShellContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  margin: 0;\n  padding: 0;\n  height: auto !important;\n  flex-shrink: 0;\n  border-radius: 0;\n  background: transparent;\n  ${fullWidthChildren}\n`;\n\n/**\n * Body layout container - main content area with specific dimensions\n * This is the primary content container for all pages\n * Min-height ensures it fills the screen even before feature apps load\n */\nexport const BodyLayoutContainer = styled.div`\n  display: flex;\n  width: 100%;\n  min-height: calc(100vh - 20px);\n  padding: var(--padding-large, 24px);\n  flex-direction: column;\n  justify-content: flex-start;\n  align-items: flex-start;\n  gap: var(--margin-medium, 16px);\n  border-radius: var(--corner-radius-small, 16px);\n  background: var(--container-bg-colour-subtle, #f5f5f5);\n  box-sizing: border-box;\n  ${fullWidthChildren}\n`;\n\n/**\n * Base page container with consistent padding and alignment\n */\nexport const BasePageContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  width: 100%;\n  min-height: 100vh;\n  padding: var(--padding-large, 24px);\n  gap: var(--margin-medium, 16px);\n  ${fullWidthChildren}\n\n  @media (max-width: 768px) {\n    padding: var(--padding-medium, 16px);\n    gap: var(--margin-small, 12px);\n  }\n`;\n\n/**\n * Base app container - outermost wrapper for pages\n * Has 10px gap around screen edges\n */\nexport const BaseAppContainer = styled.div`\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  margin: 0;\n  padding: 10px;\n  box-sizing: border-box;\n`;\n\n/**\n * Base two-column layout for side-by-side content\n */\nexport const BaseTwoColumnLayout = styled.div`\n  display: flex;\n  width: 100%;\n  margin: 0;\n  gap: var(--margin-medium, 16px);\n\n  @media (max-width: 1024px) {\n    flex-direction: column;\n  }\n`;\n\n/**\n * Base flex item for equal-width columns\n */\nexport const BaseFlexItem = styled.div`\n  display: flex;\n  flex: 1;\n  width: 100%;\n  margin: 0;\n  padding: 0;\n  ${fullWidthChildren}\n`;\n","import styled from 'styled-components';\nimport {\n  BaseShellContainer,\n  BaseAppContainer,\n  BaseTwoColumnLayout,\n  BaseFlexItem,\n  BodyLayoutContainer,\n} from '../shared/BaseStyles';\n\n/**\n * Dashboard-specific styled components\n * Background and spacing managed by base styles\n */\n\nexport const StyledShellContainer = styled(BaseShellContainer)``;\n\nexport const StyledPageContainer = styled(BodyLayoutContainer)``;\n\nexport const StyledAppContainer = styled(BaseAppContainer)``;\n\nexport const StyledServicesContainer = styled(BaseTwoColumnLayout)``;\n\nexport const ServiceItemContainer = styled(BaseFlexItem)``;\n\nexport const DashboardSectionsContainer = styled.section`\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  gap: var(--margin-large, 24px);\n  padding: var(--padding-large, 24px);\n  border-radius: var(--corner-radius-medium, 24px);\n  background: var(--container-bg-colour-subtle, #e9e9e9);\n\n  @media (max-width: 820px) {\n    padding: 16px;\n    gap: 16px;\n  }\n`;\n\nexport const DashboardSectionSurface = styled.div`\n  width: 100%;\n  border-radius: var(--corner-radius-medium, 24px);\n  background: var(--container-bg-colour-subtle, #f5f5f5);\n  padding: var(--padding-small, 8px);\n`;\n","import React, { useState, useCallback } from 'react';\nimport { InlineNotification } from '@mtnkente/paragon-overlays';\nimport Fault from '@mtnkente/paragon-icons/Fault';\n\ninterface ProductProps {\n  productName: string;\n}\n\nconst ErrorUi: React.FC<ProductProps> = ({ productName }) => {\n  const [showNotification, setShowNotification] = useState(true);\n\n  const handleClose = useCallback(function closeNotification(): void {\n    setShowNotification(false);\n  }, []);\n\n  if (!showNotification) return null;\n\n  return (\n    <InlineNotification\n      title={`${productName} Feature App failed to load`}\n      descriptionText='Please refresh the page or contact the support team.'\n      $colourType='error'\n      showNotification\n      inputIcon={<Fault />}\n      style={{ position: 'relative', flex: '1 1 1', width: '100%', top: '0' }}\n      onClose={handleClose}\n      $isStacked\n      isDismissable\n    />\n  );\n};\n\nexport default ErrorUi;\n","import React, { ReactNode } from 'react';\n\ntype Props = {\n  children: ReactNode;\n  fallback: ReactNode;\n  onError?: (error: unknown) => void;\n  /** When this key changes, the boundary resets its error state. */\n  resetKey?: string | number;\n};\n\ntype State = {\n  hasError: boolean;\n  /** Track which resetKey we last saw so we can auto-reset on prop changes. */\n  lastResetKey?: string | number;\n  /** Track the error so we can report it in componentDidCatch. */\n  error?: unknown;\n};\n\nexport class FeatureAppErrorBoundary extends React.Component<Props, State> {\n  state: State = { hasError: false, lastResetKey: this.props.resetKey };\n\n  static getDerivedStateFromError(error: unknown): Partial<State> {\n    return { hasError: true, error };\n  }\n\n  static getDerivedStateFromProps(props: Props, state: State): State | null {\n    // If the resetKey prop changes, reset the error state so the children\n    // get another chance to render (e.g. after route navigation).\n    // This is the primary mechanism for allowing retry after navigation.\n    if (props.resetKey !== state.lastResetKey) {\n      return { hasError: false, lastResetKey: props.resetKey, error: undefined };\n    }\n    return null;\n  }\n\n  componentDidCatch(error: unknown): void {\n    console.error('Feature App Runtime Error:', error);\n    this.props.onError?.(error);\n  }\n\n  render(): ReactNode {\n    if (this.state.hasError) {\n      return this.props.fallback;\n    }\n\n    return this.props.children;\n  }\n}\n\nexport default FeatureAppErrorBoundary;\n","type ErrorCallback = (error: unknown) => void;\n\ntype FeatureAppStatus = 'loading' | 'ready' | 'failed';\n\ntype RegisteredFeatureApp = {\n  featureAppId: string;\n  src: string;\n  baseUrl: string;\n  onError: ErrorCallback;\n  status: FeatureAppStatus;\n  lastUpdatedAt: number;\n};\n\ntype FeatureAppFailureHints = {\n  url?: string;\n  source?: 'module-loader' | 'window.error' | 'window.unhandledrejection' | 'boundary';\n};\n\nconst ANALYTICS_RESOURCE_PATTERN =\n  /googletagmanager\\.com|google-analytics\\.com|analytics\\.google\\.com|\\/gtag\\/js|\\/gtm\\.js/i;\nconst DUPLICATE_FEATURE_SERVICE_REGISTRATION_PATTERN =\n  /Feature Service .+ is already registered|has already been registered|has already been defined|duplicate shell-owned feature service registrations|provided by multiple feature apps|cannot be provided by multiple feature apps/i;\n\nconst featureApps = new Map<string, RegisteredFeatureApp>();\nconst recentNotificationFingerprints = new Map<string, number>();\n\nlet lastResolvedModule:\n  | {\n      url: string;\n      timestamp: number;\n    }\n  | undefined;\n\nconst RECENT_MODULE_WINDOW_MS = 4_000;\nconst ERROR_DEDUPE_WINDOW_MS = 2_000;\nconst MAX_DEDUPE_ENTRIES = 300;\n\nfunction getErrorMessage(error: unknown): string {\n  if (typeof error === 'string') {\n    return error;\n  }\n\n  if (error && typeof error === 'object') {\n    const candidate = error as { message?: unknown; stack?: unknown; name?: unknown };\n    return [candidate.name, candidate.message, candidate.stack]\n      .filter((value): value is string => typeof value === 'string' && value.length > 0)\n      .join(' ');\n  }\n\n  return '';\n}\n\nfunction normalizeUrl(url: string): string {\n  return url.split('#')[0].split('?')[0];\n}\n\nfunction getBaseUrl(src: string): string {\n  return normalizeUrl(src).replace(/\\/main\\.js$/, '/');\n}\n\nfunction getErrorText(error: unknown): string {\n  return getErrorMessage(error).toLowerCase();\n}\n\nfunction isAnalyticsUrl(url?: string): boolean {\n  return !!url && ANALYTICS_RESOURCE_PATTERN.test(url);\n}\n\nexport function isAnalyticsResourceFailure(\n  error: unknown,\n  hints?: FeatureAppFailureHints\n): boolean {\n  const hintedUrl = hints?.url ? normalizeUrl(hints.url) : undefined;\n  const message = getErrorText(error);\n\n  return (\n    isAnalyticsUrl(hintedUrl) ||\n    ANALYTICS_RESOURCE_PATTERN.test(message) ||\n    isAnalyticsUrl(message.match(/https?:\\/\\/[^\\s)]+/i)?.[0])\n  );\n}\n\nfunction isJavaScriptResourceUrl(url: string | undefined): boolean {\n  if (!url) {\n    return false;\n  }\n\n  return /\\.m?js(?:$|[?#])|\\/\\d+(?:\\.[a-z0-9]+)?\\.js(?:$|[?#])/i.test(url);\n}\n\nfunction isNonJavaScriptAssetUrl(url: string | undefined): boolean {\n  if (!url) {\n    return false;\n  }\n\n  return /\\.(?:png|jpe?g|gif|webp|svg|ico|bmp|css|woff2?|ttf|otf|eot)(?:$|[?#])/i.test(url);\n}\n\nexport function isNonFatalResourceFailure(\n  error: unknown,\n  hints?: Pick<FeatureAppFailureHints, 'url' | 'source'>\n): boolean {\n  const hintedUrl = hints?.url ? normalizeUrl(hints.url) : undefined;\n  const errorText = getErrorText(error);\n\n  if (hints?.source === 'window.error' && hintedUrl && !isJavaScriptResourceUrl(hintedUrl)) {\n    return true;\n  }\n\n  if (isNonJavaScriptAssetUrl(hintedUrl)) {\n    return true;\n  }\n\n  return (\n    /resource load failure|loading failed for the <img>|failed to load resource/i.test(errorText) &&\n    !isJavaScriptResourceUrl(hintedUrl)\n  );\n}\n\nfunction createErrorFingerprint(error: unknown, hints?: FeatureAppFailureHints): string {\n  const message =\n    typeof error === 'string'\n      ? error\n      : error && typeof error === 'object'\n        ? [(error as { name?: unknown }).name, (error as { message?: unknown }).message]\n            .filter((value): value is string => typeof value === 'string' && value.length > 0)\n            .join(' ')\n        : '';\n  const url = hints?.url ? normalizeUrl(hints.url).toLowerCase() : '';\n  const source = hints?.source ?? 'unknown';\n\n  return `${source}|${url}|${message.toLowerCase().slice(0, 400)}`;\n}\n\nfunction shouldSkipDuplicateNotification(\n  featureAppId: string,\n  error: unknown,\n  hints?: FeatureAppFailureHints\n): boolean {\n  const now = Date.now();\n  const fingerprint = `${featureAppId}|${createErrorFingerprint(error, hints)}`;\n  const previous = recentNotificationFingerprints.get(fingerprint);\n\n  recentNotificationFingerprints.set(fingerprint, now);\n\n  if (recentNotificationFingerprints.size > MAX_DEDUPE_ENTRIES) {\n    Array.from(recentNotificationFingerprints.entries()).forEach(([key, timestamp]) => {\n      if (now - timestamp > ERROR_DEDUPE_WINDOW_MS) {\n        recentNotificationFingerprints.delete(key);\n      }\n    });\n  }\n\n  return typeof previous === 'number' && now - previous <= ERROR_DEDUPE_WINDOW_MS;\n}\n\nfunction matchesFeatureApp(entry: RegisteredFeatureApp, haystack: string, url?: string): boolean {\n  const normalizedUrl = url ? normalizeUrl(url) : undefined;\n\n  return (\n    haystack.includes(entry.featureAppId) ||\n    haystack.includes(entry.src) ||\n    haystack.includes(entry.baseUrl) ||\n    !!(normalizedUrl && (normalizedUrl === entry.src || normalizedUrl.startsWith(entry.baseUrl)))\n  );\n}\n\nfunction notifyEntries(\n  entries: RegisteredFeatureApp[],\n  error: unknown,\n  hints?: FeatureAppFailureHints\n): boolean {\n  if (entries.length === 0) {\n    return false;\n  }\n\n  entries.forEach((entry) => {\n    if (shouldSkipDuplicateNotification(entry.featureAppId, error, hints)) {\n      return;\n    }\n\n    try {\n      entry.onError(error);\n      entry.status = 'failed';\n      entry.lastUpdatedAt = Date.now();\n    } catch (notificationError) {\n      console.error(`Error notifying feature app \"${entry.featureAppId}\":`, notificationError);\n    }\n  });\n\n  return true;\n}\n\nfunction getRecentModuleUrl(): string | undefined {\n  if (!lastResolvedModule) {\n    return undefined;\n  }\n\n  return Date.now() - lastResolvedModule.timestamp <= RECENT_MODULE_WINDOW_MS\n    ? lastResolvedModule.url\n    : undefined;\n}\n\nfunction resolveTargets(error: unknown, hints?: FeatureAppFailureHints): RegisteredFeatureApp[] {\n  if (isAnalyticsResourceFailure(error, hints)) {\n    return [];\n  }\n\n  const message = getErrorMessage(error);\n  const hintedUrl = hints?.url ? normalizeUrl(hints.url) : undefined;\n\n  const directMatches = Array.from(featureApps.values()).filter((entry) =>\n    matchesFeatureApp(entry, message, hintedUrl)\n  );\n\n  if (directMatches.length > 0) {\n    return directMatches;\n  }\n\n  const recentModuleUrl = getRecentModuleUrl();\n\n  if (recentModuleUrl) {\n    const recentMatches = Array.from(featureApps.values()).filter((entry) =>\n      matchesFeatureApp(entry, message, recentModuleUrl)\n    );\n\n    if (recentMatches.length > 0) {\n      return recentMatches;\n    }\n  }\n\n  if (\n    isChunkLoadError(error) ||\n    (hints?.source === 'window.error' && isJavaScriptResourceUrl(hintedUrl))\n  ) {\n    const loadingEntries = Array.from(featureApps.values()).filter(\n      (entry) => entry.status === 'loading'\n    );\n\n    if (loadingEntries.length > 0) {\n      return loadingEntries;\n    }\n  }\n\n  return [];\n}\n\nexport function isChunkLoadError(error: unknown): boolean {\n  const message = getErrorMessage(error);\n\n  return /ChunkLoadError|Loading chunk [^ ]+ failed|Failed to fetch dynamically imported module/i.test(\n    message\n  );\n}\n\nexport function isFeatureServiceError(error: unknown): boolean {\n  const message = getErrorMessage(error);\n\n  return (\n    /Feature Service .+ is not registered|could not be bound to consumer/i.test(message) ||\n    isDuplicateFeatureServiceRegistrationError(error)\n  );\n}\n\nexport function isDuplicateFeatureServiceRegistrationError(error: unknown): boolean {\n  const message = getErrorMessage(error);\n\n  return DUPLICATE_FEATURE_SERVICE_REGISTRATION_PATTERN.test(message);\n}\n\nexport function handleFeatureAppError(error: unknown): void {\n  console.error('Feature App Load Error:', error);\n}\n\nexport function registerFeatureApp(\n  featureAppId: string,\n  src: string,\n  onError: ErrorCallback,\n  status: FeatureAppStatus = 'loading'\n): void {\n  featureApps.set(featureAppId, {\n    featureAppId,\n    src: normalizeUrl(src),\n    baseUrl: getBaseUrl(src),\n    onError,\n    status,\n    lastUpdatedAt: Date.now(),\n  });\n}\n\nexport function unregisterFeatureApp(featureAppId: string): void {\n  featureApps.delete(featureAppId);\n\n  Array.from(recentNotificationFingerprints.keys()).forEach((fingerprint) => {\n    if (fingerprint.startsWith(`${featureAppId}|`)) {\n      recentNotificationFingerprints.delete(fingerprint);\n    }\n  });\n}\n\nexport function updateFeatureAppStatus(featureAppId: string, status: FeatureAppStatus): void {\n  const entry = featureApps.get(featureAppId);\n\n  if (!entry) {\n    return;\n  }\n\n  entry.status = status;\n  entry.lastUpdatedAt = Date.now();\n}\n\nexport function recordResolvedFeatureAppModule(url: string): void {\n  lastResolvedModule = {\n    url: normalizeUrl(url),\n    timestamp: Date.now(),\n  };\n}\n\nexport function notifyFeatureAppFailure(error: unknown, hints?: FeatureAppFailureHints): boolean {\n  if (isAnalyticsResourceFailure(error, hints) || isNonFatalResourceFailure(error, hints)) {\n    return false;\n  }\n\n  return notifyEntries(resolveTargets(error, hints), error, hints);\n}\n\nexport function reportFeatureAppFailure(featureAppId: string, error: unknown): boolean {\n  const entry = featureApps.get(featureAppId);\n\n  if (!entry) {\n    return false;\n  }\n\n  return notifyEntries([entry], error, {\n    source: 'boundary',\n  });\n}\n","import React, { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { CustomFeatureAppRenderingParams, FeatureAppLoader } from '@feature-hub/react';\nimport FeatureAppErrorBoundary from './FeatureAppErrorBoundary';\nimport {\n  handleFeatureAppError,\n  isChunkLoadError,\n  isDuplicateFeatureServiceRegistrationError,\n  isFeatureServiceError,\n  registerFeatureApp,\n  unregisterFeatureApp,\n  updateFeatureAppStatus,\n} from './feature-app-errors';\nimport { getShellFeatureAppAuth } from '../services/feature-app-auth';\n\ntype SafeFeatureAppLoaderProps = React.ComponentProps<typeof FeatureAppLoader> & {\n  fallback: ReactNode;\n  onStatusChange?: (status: 'loading' | 'ready' | 'failed') => void;\n};\n\nconst MAX_AUTO_RETRIES = 3;\nconst INITIAL_RETRY_DELAY_MS = 800;\n\nexport const SafeFeatureAppLoader = ({\n  fallback,\n  onStatusChange,\n  children,\n  moduleType = 'feature-app', // ← Default added\n  ...featureAppLoaderProps\n}: SafeFeatureAppLoaderProps): ReactNode => {\n  const { featureAppId, src } = featureAppLoaderProps;\n\n  const [loadError, setLoadError] = useState<unknown>(null);\n  const [retryVersion, setRetryVersion] = useState(0);\n  const [autoRetryAttempts, setAutoRetryAttempts] = useState(0);\n\n  const hasUnmountedRef = useRef(false);\n  const isDebugEnabled = process.env.REACT_APP_DEBUG_FEATURE_APPS === 'true';\n\n  const debugTrace = useCallback(\n    (...args: unknown[]) => {\n      if (isDebugEnabled) console.trace('[SafeFeatureAppLoader]', ...args);\n    },\n    [isDebugEnabled]\n  );\n\n  const isRetryableError = useCallback((error: unknown): boolean => {\n    return (\n      isChunkLoadError(error) ||\n      isFeatureServiceError(error) ||\n      /timeout|network|failed to fetch|loading script failed|net::err/i.test(String(error))\n    );\n  }, []);\n\n  const triggerError = useCallback(\n    (error: unknown) => {\n      if (hasUnmountedRef.current) return;\n\n      debugTrace(`Error triggered for ${featureAppId}:`, error);\n\n      if (isDuplicateFeatureServiceRegistrationError(error)) {\n        // Handle duplicate service gracefully\n        setRetryVersion((v) => v + 1);\n        return;\n      }\n\n      setLoadError(error);\n      updateFeatureAppStatus(featureAppId, 'failed');\n      onStatusChange?.('failed');\n      handleFeatureAppError(error);\n    },\n    [featureAppId, debugTrace, onStatusChange]\n  );\n\n  // Auto Retry Logic\n  useEffect(() => {\n    if (!loadError || hasUnmountedRef.current) return;\n\n    const retryable = isRetryableError(loadError);\n    if (!retryable || autoRetryAttempts >= MAX_AUTO_RETRIES) return;\n\n    const delay = INITIAL_RETRY_DELAY_MS * (autoRetryAttempts + 1); // Progressive delay\n\n    const timer = setTimeout(() => {\n      if (hasUnmountedRef.current) return;\n\n      setAutoRetryAttempts((prev) => prev + 1);\n      setLoadError(null);\n      setRetryVersion((v) => v + 1);\n      updateFeatureAppStatus(featureAppId, 'loading');\n      onStatusChange?.('loading');\n    }, delay);\n\n    return () => clearTimeout(timer);\n  }, [loadError, autoRetryAttempts, featureAppId, isRetryableError, onStatusChange]);\n\n  // Cleanup\n  useEffect(() => {\n    return () => {\n      hasUnmountedRef.current = true;\n      unregisterFeatureApp(featureAppId);\n    };\n  }, [featureAppId]);\n\n  const wrappedChildren = useCallback(\n    (params: CustomFeatureAppRenderingParams): ReactNode => {\n      if (params.error) {\n        triggerError(params.error);\n        return fallback;\n      }\n\n      if (!params.loading && !params.error) {\n        updateFeatureAppStatus(featureAppId, 'ready');\n        onStatusChange?.('ready');\n      }\n\n      if (typeof children === 'function') {\n        return (children as (p: CustomFeatureAppRenderingParams) => ReactNode)(params);\n      }\n\n      return params.featureAppNode;\n    },\n    [children, fallback, featureAppId, onStatusChange, triggerError]\n  );\n\n  if (loadError) {\n    return <>{fallback}</>;\n  }\n\n  return (\n    <FeatureAppErrorBoundary fallback={fallback} onError={triggerError}>\n      <FeatureAppLoader\n        key={`${featureAppId}-${retryVersion}`}\n        {...featureAppLoaderProps}\n        featureAppId={featureAppId}\n        src={src}\n        moduleType={moduleType}\n        onError={triggerError}\n      >\n        {wrappedChildren}\n      </FeatureAppLoader>\n    </FeatureAppErrorBoundary>\n  );\n};\n","import styled from 'styled-components';\n\nexport const OverviewContainer = styled.section`\n  display: flex;\n  padding: var(--padding-xlarge, 32px);\n  flex-direction: column;\n  justify-content: center;\n  align-items: flex-start;\n  gap: var(--navigation-rail-scale-m-l-container-padding-left-and-right, 24px);\n  align-self: stretch;\n  border-radius: inherit;\n  background: transparent;\n  box-shadow: none;\n`;\n\nexport const OverviewHeader = styled.div`\n  width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--margin-medium, 16px);\n`;\n\nexport const OverviewTitle = styled.h3`\n  margin: 0;\n  font-family: 'MTN Brighter Sans', 'Trebuchet MS', sans-serif;\n  font-size: 2rem;\n  font-weight: 700;\n  line-height: 1.2;\n  color: #111111;\n`;\n\nexport const SummaryGrid = styled.div`\n  width: 100%;\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: var(--margin-medium, 16px);\n\n  @media (max-width: 860px) {\n    grid-template-columns: 1fr;\n  }\n`;\n\nexport const SummaryCard = styled.article`\n  display: flex;\n  min-height: 116px;\n  padding: var(--padding-large, 24px);\n  flex-direction: column;\n  justify-content: center;\n  align-items: flex-start;\n  gap: var(--padding-small, 12px);\n  border-radius: var(--navigation-rail-action-menu-button-scale-xl-corner-radius-all-round, 16px);\n  border: 1px solid var(--border-colour-opacity-low-inverse, rgba(0, 0, 0, 0.16));\n  background: var(--page-bg-colour-full, #fff);\n  box-shadow: 0 var(--shadow-level-1-y, 1px) calc(var(--shadow-level-1-blur, 4px) / 2)\n    var(--shadow-level-1-colour, rgba(0, 0, 0, 0.04));\n`;\n\nexport const CardLabel = styled.p`\n  margin: 0;\n  font-family: 'MTN Brighter Sans', 'Trebuchet MS', sans-serif;\n  font-size: 0.9rem;\n  font-weight: 600;\n  color: #4a4a4a;\n`;\n\nexport const CardValue = styled.p`\n  margin: 0;\n  font-family: 'MTN Brighter Sans', 'Trebuchet MS', sans-serif;\n  font-size: 2.2rem;\n  font-weight: 700;\n  line-height: 1;\n  color: #101010;\n`;\n","import React from 'react';\nimport { StandardButton } from '@mtnkente/paragon-buttons';\nimport {\n  OverviewHeader,\n  OverviewContainer,\n  SummaryCard,\n  SummaryGrid,\n} from './TabOverviewContent.style';\nimport { Text } from '@mtnkente/paragon-display';\nimport { NewTab } from '@mtnkente/paragon-icons';\n\nexport type TabMetric = {\n  label: string;\n  value: string;\n};\n\nexport interface TabOverviewContentProps {\n  title: string;\n  metrics: [TabMetric, TabMetric, TabMetric];\n}\n\nconst TabOverviewContent: React.FC<TabOverviewContentProps> = ({ title, metrics }) => {\n  function handleViewAll(): void {\n    // Placeholder action until navigation target is provided.\n  }\n\n  return (\n    <OverviewContainer>\n      <OverviewHeader>\n        <Text $fontStyle='title-small-bold' $colour='full'>\n          {title}\n        </Text>\n        <StandardButton\n          $variant='primary'\n          label='Project Details'\n          icon={<NewTab />}\n          onClick={handleViewAll}\n        />\n      </OverviewHeader>\n\n      <SummaryGrid>\n        {metrics.map((metric): React.JSX.Element => {\n          return (\n            <SummaryCard key={metric.label}>\n              <Text $fontStyle='body-small-semibold' $colour='subtle'>\n                {metric.label}\n              </Text>\n              <Text $fontStyle='headline-small' $colour='full'>\n                {metric.value}\n              </Text>\n            </SummaryCard>\n          );\n        })}\n      </SummaryGrid>\n    </OverviewContainer>\n  );\n};\n\nexport default TabOverviewContent;\n","import { authConfig } from '../../utilities/authconfig';\n\nexport type ShellFeatureAppAuth = Record<string, unknown>;\n\ntype MsalAuthStoragePayload = {\n  account?: unknown;\n};\n\nexport function getMsalAuthStorageKey(): string {\n  return `msalAuth_${authConfig.clientId}_${authConfig.tenantId}`;\n}\n\nfunction parseMsalAuthStoragePayload(rawValue: string): MsalAuthStoragePayload | null {\n  try {\n    return JSON.parse(rawValue) as MsalAuthStoragePayload;\n  } catch {\n    return null;\n  }\n}\n\nexport function getShellFeatureAppAuth(): ShellFeatureAppAuth | null {\n  if (typeof window === 'undefined') {\n    return null;\n  }\n\n  const rawValue = window.sessionStorage.getItem(getMsalAuthStorageKey());\n  if (!rawValue) {\n    return null;\n  }\n\n  const payload = parseMsalAuthStoragePayload(rawValue);\n  if (!payload) {\n    return null;\n  }\n\n  // Support both wrapped payloads ({ account }) and direct account payloads.\n  const candidate = payload.account ?? payload;\n  if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {\n    return null;\n  }\n\n  return candidate as ShellFeatureAppAuth;\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { getMsalAuthStorageKey } from './feature-app-auth';\n\nexport type OpcoApiItem = {\n  id: string;\n  name: string;\n  code: string;\n  sort: number;\n  status: boolean;\n};\n\nexport type OpcoCatalogProject = {\n  id: string;\n  name: string;\n  tenant: string;\n  date_created?: string | null;\n  sort?: number | null;\n  code?: string;\n};\n\ntype ApiBody = {\n  code?: string;\n  status?: number;\n  data?: unknown;\n};\n\ntype OpcoCatalogData = {\n  opcoHouse?: unknown;\n  projects?: OpcoCatalogProject[];\n};\n\nfunction getApiUrl(): string {\n  const url = process.env.REACT_APP_OPCOS_API_URL?.trim();\n  if (!url) throw new Error('REACT_APP_OPCOS_API_URL is not configured');\n  const [withoutQuery] = url.split('?');\n  const [withoutHash] = withoutQuery.split('#');\n  return withoutHash.replace(/\\/+$/, '');\n}\n\nfunction getIdToken(): string {\n  try {\n    const raw = window.sessionStorage.getItem(getMsalAuthStorageKey());\n    if (!raw) return '';\n    const parsed = JSON.parse(raw) as { account?: { idToken?: string } };\n    return parsed?.account?.idToken ?? '';\n  } catch {\n    return '';\n  }\n}\n\nfunction wait(ms: number): Promise<void> {\n  return new Promise((resolve) => {\n    setTimeout(resolve, ms);\n  });\n}\n\nasync function getIdTokenWithRetry(maxAttempts = 6, delayMs = 350): Promise<string> {\n  for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n    const token = getIdToken();\n    if (token) {\n      return token;\n    }\n    if (attempt < maxAttempts - 1) {\n      await wait(delayMs);\n    }\n  }\n\n  return '';\n}\n\nasync function buildHeaders(opCoCode?: string): Promise<Record<string, string>> {\n  const token = await getIdTokenWithRetry();\n  const headers: Record<string, string> = {\n    'Content-Type': 'application/json',\n    Authorization: `Bearer ${token}`,\n    correlationId: uuidv4(),\n    commandType: 'ac',\n  };\n  if (opCoCode) {\n    headers.opCohouse = opCoCode;\n  }\n  return headers;\n}\n\nasync function parseBody(res: Response): Promise<unknown> {\n  const body = (await res.json()) as ApiBody;\n  if (!res.ok || (body.code !== '200' && body.status !== 200)) {\n    const message =\n      typeof (body as { message?: unknown })?.message === 'string'\n        ? (body as { message?: string }).message\n        : '';\n    const detail = typeof body?.data === 'string' ? body.data : '';\n    throw new Error(`Opcos API error: ${res.status} ${message} ${detail}`.trim());\n  }\n  return body.data;\n}\n\nexport async function fetchOpcos(): Promise<OpcoApiItem[]> {\n  const headers = await buildHeaders();\n  const res = await fetch(getApiUrl(), { method: 'GET', headers });\n  const data = await parseBody(res);\n  return (data as OpcoApiItem[]) ?? [];\n}\n\nexport async function fetchOpcoCatalogProjects(opCoCode: string): Promise<OpcoCatalogProject[]> {\n  const headers = await buildHeaders(opCoCode);\n  const res = await fetch(getApiUrl(), {\n    method: 'GET',\n    headers,\n  });\n  const data = (await parseBody(res)) as OpcoCatalogData;\n  return data?.projects ?? [];\n}\n","export type RbacAuthConfig = {\n  clientId: string;\n  tenantId: string;\n};\n\nexport function getRbacAuthConfig(): RbacAuthConfig {\n  return {\n    clientId: process.env.REACT_APP_CLIENT_ID ?? '',\n    tenantId: process.env.REACT_APP_TENANT_ID ?? '',\n  };\n}\n\nexport function getRbacAuthStorageKey(): string {\n  const { clientId, tenantId } = getRbacAuthConfig();\n  return `msalAuth_${clientId}_${tenantId}`;\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { getRbacAuthStorageKey } from './rbac-auth-config';\n\nexport type OpcoApiItem = {\n  id: string;\n  name: string;\n  code: string;\n  sort: number;\n  status: boolean;\n};\n\ntype ApiBody = {\n  code?: string;\n  status?: number;\n  data?: unknown;\n};\n\nfunction getApiUrl(): string {\n  const url = process.env.REACT_APP_OPCOS_API_URL?.trim();\n  if (!url) throw new Error('REACT_APP_OPCOS_API_URL is not configured');\n  const [withoutQuery] = url.split('?');\n  const [withoutHash] = withoutQuery.split('#');\n  return withoutHash.replace(/\\/+$/, '');\n}\n\nfunction getMsalAuthStorageKey(): string {\n  return getRbacAuthStorageKey();\n}\n\nfunction getIdToken(): string {\n  try {\n    const raw = window.sessionStorage.getItem(getMsalAuthStorageKey());\n    if (!raw) return '';\n    const parsed = JSON.parse(raw) as { account?: { idToken?: string } };\n    return parsed?.account?.idToken ?? '';\n  } catch {\n    return '';\n  }\n}\n\nfunction wait(ms: number): Promise<void> {\n  return new Promise((resolve) => {\n    setTimeout(resolve, ms);\n  });\n}\n\nasync function getIdTokenWithRetry(maxAttempts = 6, delayMs = 350): Promise<string> {\n  for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n    const token = getIdToken();\n    if (token) {\n      return token;\n    }\n\n    if (attempt < maxAttempts - 1) {\n      await wait(delayMs);\n    }\n  }\n\n  return '';\n}\n\nasync function buildHeaders(): Promise<Record<string, string>> {\n  const token = await getIdTokenWithRetry();\n  return {\n    'Content-Type': 'application/json',\n    Authorization: `Bearer ${token}`,\n    correlationId: uuidv4(),\n    commandType: 'ac',\n  };\n}\n\nasync function parseBody(res: Response): Promise<unknown> {\n  const body = (await res.json()) as ApiBody;\n  if (!res.ok || (body.code !== '200' && body.status !== 200)) {\n    const message =\n      typeof (body as { message?: unknown })?.message === 'string'\n        ? (body as { message?: string }).message\n        : '';\n    const detail = typeof body?.data === 'string' ? body.data : '';\n    throw new Error(`Opcos API error: ${res.status} ${message} ${detail}`.trim());\n  }\n\n  return body.data;\n}\n\nexport async function fetchOpcos(): Promise<OpcoApiItem[]> {\n  const headers = await buildHeaders();\n  const res = await fetch(getApiUrl(), { method: 'GET', headers });\n  const data = await parseBody(res);\n  return (data as OpcoApiItem[]) ?? [];\n}\n","import { getRbacAuthStorageKey } from './rbac-auth-config';\nimport { SessionAccount } from './types';\n\ntype SessionGroupCandidate = {\n  displayName?: unknown;\n};\n\nconst normalizeGroupName = (value: string): string =>\n  value.trim().replace(/\\s+/g, ' ').toLowerCase();\n\nexport const ADMIN_GROUP_NAME = normalizeGroupName('Kente Studio Administrators');\n\ntype MsalAuthStoragePayload = {\n  account?: unknown;\n};\n\nfunction parseMsalAuthStoragePayload(rawValue: string): MsalAuthStoragePayload | null {\n  try {\n    return JSON.parse(rawValue) as MsalAuthStoragePayload;\n  } catch {\n    return null;\n  }\n}\n\nexport function readSessionAccount(): SessionAccount | null {\n  if (typeof window === 'undefined') {\n    return null;\n  }\n\n  const rawValue = window.sessionStorage.getItem(getRbacAuthStorageKey());\n  if (!rawValue) {\n    return null;\n  }\n\n  const payload = parseMsalAuthStoragePayload(rawValue);\n  if (!payload) {\n    return null;\n  }\n\n  const candidate = payload.account ?? payload;\n  if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {\n    return null;\n  }\n\n  return candidate;\n}\n\nexport function readSessionGroupDisplayNames(): string[] {\n  const account = readSessionAccount();\n  const groups = account?.idTokenClaims?.groups;\n\n  if (!Array.isArray(groups)) {\n    return [];\n  }\n\n  return groups\n    .map((group) => (group as SessionGroupCandidate)?.displayName)\n    .filter(\n      (displayName): displayName is string =>\n        typeof displayName === 'string' && !!displayName.trim()\n    )\n    .map((displayName) => normalizeGroupName(displayName));\n}\n\nexport function isAdministratorGroupMember(groupDisplayNames: string[]): boolean {\n  return groupDisplayNames.includes(ADMIN_GROUP_NAME);\n}\n","import { fetchOpcos, OpcoApiItem } from './opco-api';\nimport { isAdministratorGroupMember, readSessionGroupDisplayNames } from './session';\nimport { RbacContext } from './types';\n\nconst normalizeText = (value: string): string => value.trim().replace(/\\s+/g, ' ').toLowerCase();\n\nconst toComparableLabel = (value: string): string =>\n  normalizeText(value)\n    .replace(/-\\s*kente\\s*studio$/i, '')\n    .trim();\n\nfunction buildGroupLabelSet(groupDisplayNames: string[]): Set<string> {\n  const labels = new Set<string>();\n\n  groupDisplayNames.forEach((groupName) => {\n    labels.add(normalizeText(groupName));\n    labels.add(toComparableLabel(groupName));\n  });\n\n  return labels;\n}\n\nfunction isMatchingOpcoGroup(opco: OpcoApiItem, groupLabels: Set<string>): boolean {\n  const opcoName = normalizeText(opco.name);\n  const opcoLabel = `${opcoName} - kente studio`;\n\n  return groupLabels.has(opcoName) || groupLabels.has(opcoLabel);\n}\n\nfunction sortByDefinedOrder(opcos: OpcoApiItem[]): OpcoApiItem[] {\n  return [...opcos].sort(\n    (left, right) =>\n      (left.sort ?? Number.MAX_SAFE_INTEGER) - (right.sort ?? Number.MAX_SAFE_INTEGER)\n  );\n}\n\nexport function resolveRbacContextFromOpcos(opcos: OpcoApiItem[]): RbacContext {\n  const groupDisplayNames = readSessionGroupDisplayNames();\n  const isAdmin = isAdministratorGroupMember(groupDisplayNames);\n\n  if (groupDisplayNames.length === 0) {\n    return {\n      isAdmin: false,\n      hasAnyOpcoAccess: false,\n      deniedReason: 'NO_SESSION',\n      matchedGroupNames: [],\n      accessibleOpcos: [],\n    };\n  }\n\n  const activeOpcos = opcos.filter((opco) => opco.status);\n  if (isAdmin) {\n    return {\n      isAdmin: true,\n      hasAnyOpcoAccess: activeOpcos.length > 0,\n      deniedReason: activeOpcos.length > 0 ? null : 'NO_GROUP_MATCH',\n      matchedGroupNames: groupDisplayNames,\n      accessibleOpcos: sortByDefinedOrder(activeOpcos),\n    };\n  }\n\n  const groupLabels = buildGroupLabelSet(groupDisplayNames);\n  const accessibleOpcos = sortByDefinedOrder(\n    activeOpcos.filter((opco) => isMatchingOpcoGroup(opco, groupLabels))\n  );\n\n  return {\n    isAdmin: false,\n    hasAnyOpcoAccess: accessibleOpcos.length > 0,\n    deniedReason: accessibleOpcos.length > 0 ? null : 'NO_GROUP_MATCH',\n    matchedGroupNames: groupDisplayNames,\n    accessibleOpcos,\n  };\n}\n\nexport async function getRbacContext(opcos?: OpcoApiItem[]): Promise<RbacContext> {\n  const sourceOpcos = opcos ?? (await fetchOpcos());\n  return resolveRbacContextFromOpcos(sourceOpcos);\n}\n\nexport async function getAccessibleOpcos(): Promise<OpcoApiItem[]> {\n  const context = await getRbacContext();\n  return context.accessibleOpcos;\n}\n\nexport async function canAccessOpco(opcoCode: string): Promise<boolean> {\n  const context = await getRbacContext();\n  return context.accessibleOpcos.some(\n    (opco) => normalizeText(opco.code) === normalizeText(opcoCode)\n  );\n}\n","import React, { ReactElement, ReactNode, createContext, useContext } from 'react';\nimport { StoreDataEvent, StoreDataService1 } from '../services/DynamicStoreDataService';\n\nconst StoreContext = createContext<StoreDataService1 | undefined>(undefined);\n\ntype StoreDataProps = {\n  value: StoreDataService1;\n  children: ReactNode;\n};\nconst StoreDataProvider = ({ value, children }: StoreDataProps): ReactElement => (\n  <StoreContext.Provider value={value}>{children}</StoreContext.Provider>\n);\ntype StoreProps = {\n  setData(data: Record<string, unknown>): void;\n  getData(): Record<string, unknown> | undefined;\n  setReady(ready: boolean): void;\n  isReady(): boolean;\n  whenReady(): Promise<Record<string, unknown> | undefined>;\n  subscribe(listener: (event: StoreDataEvent<Record<string, unknown>>) => void): () => void;\n};\n\nexport const useStoreData = (): StoreProps => {\n  const storeDataService = useContext(StoreContext);\n  if (!storeDataService) {\n    throw new Error('\"Use store data\" must be used within the StoreData Provider.');\n  }\n  const { setData, getData } = storeDataService;\n  const setReady = storeDataService.setReady ?? (() => undefined);\n  const isReady = storeDataService.isReady ?? (() => false);\n  const whenReady = storeDataService.whenReady ?? (() => Promise.resolve(getData()));\n  const subscribe =\n    storeDataService.subscribe ??\n    (() => {\n      return () => undefined;\n    });\n  return { setData, getData, setReady, isReady, whenReady, subscribe };\n};\nexport default StoreDataProvider;\n","import type { TabMetric } from '../Tabs/TabOverviewContent';\n\ntype OverviewMetrics = [TabMetric, TabMetric, TabMetric];\n\nfunction getSeedValue(projectId: string, projectName: string): number {\n  const source = `${projectId}:${projectName}`;\n\n  return Array.from(source).reduce((total, character) => total + character.charCodeAt(0), 0);\n}\n\nexport function getProjectOverviewMockMetrics(\n  projectId: string,\n  projectName: string\n): OverviewMetrics {\n  const seed = getSeedValue(projectId, projectName);\n  const secureScore = 78 + (seed % 19);\n  const highPriorityTasks = 8 + (seed % 37);\n  const criticalVulnerabilities = 2 + (seed % 12);\n\n  return [\n    { label: 'Secure Score', value: `${secureScore}%` },\n    { label: 'High Priority Tasks', value: String(highPriorityTasks) },\n    { label: 'Critical Vulnerabilities', value: String(criticalVulnerabilities) },\n  ];\n}\n","import styled from 'styled-components';\n\nexport const ProjectOverviewLoadingCard = styled.section`\n  width: 100%;\n  display: flex;\n  min-height: 196px;\n  padding: 24px;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  gap: 8px;\n  border-radius: var(--card-base-container-corner-radius-all-round, 24px);\n  background: var(--colour-surface-full, #fff);\n  box-shadow: 0 var(--shadow-level-1-y, 1px) var(--shadow-level-1-blur, 4px)\n    var(--shadow-level-1-spread, 2px) var(--shadow-level-1-colour, rgba(0, 0, 0, 0.04));\n`;\n\nexport const IconWrap = styled.span`\n  display: inline-flex;\n  align-items: center;\n  color: #ffffff;\n  flex: 0 0 auto;\n`;\n\nexport const SearchHeader = styled.header`\n  display: flex;\n  width: 100%;\n  flex-direction: column;\n  gap: var(--margin-small, 12px);\n  padding: var(--margin-medium, 16px) 0;\n`;\n\nexport const HeaderTitleRow = styled.div`\n  display: flex;\n  align-items: center;\n  gap: var(--margin-small, 12px);\n`;\n\nexport const SelectionHeader = styled.header`\n  display: flex;\n  width: 100%;\n  flex-direction: column;\n  gap: var(--margin-small, 12px);\n`;\n\nexport const SelectionIconWrap = styled.span`\n  display: inline-flex;\n  align-items: center;\n  color: var(--text-embed-text-colour, #000);\n  flex: 0 0 auto;\n`;\n\ntype SearchPanelProps = {\n  $backgroundImageUrl?: string;\n};\n\nexport const SearchPanel = styled.div<SearchPanelProps>`\n  position: relative;\n  overflow: hidden;\n  display: flex;\n  --button-select-group-button-active-container-colour-inverse: #fff;\n  --button-select-group-button-container-colour-inverse: rgba(255, 255, 255, 0.16);\n  --button-select-group-button-label-font-inverse: var(\n    --typescale-label-m-l-small-regular-font-size,\n    14px\n  );\n  width: 100%;\n  max-width: 100%;\n  min-width: 0;\n  box-sizing: border-box;\n  padding: var(--navigation-rail-scale-xl-margin, 40px) var(--padding-2xlarge, 40px);\n  flex-direction: column;\n  justify-content: center;\n  align-items: flex-start;\n  gap: var(--margin-large, 24px);\n  align-self: stretch;\n  border-radius: var(--corner-radius-medium, 24px);\n  box-shadow: 0 var(--shadow-level-1-y, 1px) var(--shadow-level-1-blur, 4px)\n    var(--shadow-level-1-spread, 2px) var(--shadow-level-1-colour, rgba(0, 0, 0, 0.04));\n\n  &::before {\n    content: '';\n    position: absolute;\n    inset: 0;\n    border-radius: inherit;\n    background: linear-gradient(\n      90deg,\n      var(--container-bg-colour-subtle-inverse, #262626) 0%,\n      var(--container-bg-colour-subtle-inverse, #262626) 100%\n    );\n    pointer-events: none;\n    z-index: 0;\n  }\n\n  &::after {\n    content: '';\n    position: absolute;\n    inset: 0;\n    border-radius: inherit;\n    background-image: ${({ $backgroundImageUrl }: SearchPanelProps): string =>\n      $backgroundImageUrl ? `url(${$backgroundImageUrl})` : 'none'};\n    background-position: center;\n    background-repeat: no-repeat;\n    background-size: cover;\n    mix-blend-mode: overlay;\n    pointer-events: none;\n    z-index: 1;\n  }\n\n  > * {\n    position: relative;\n    z-index: 2;\n  }\n\n  @media (max-width: 820px) {\n    padding: 20px 16px;\n    gap: 24px;\n  }\n\n  @media (max-width: 520px) {\n    padding: 14px 8px;\n    gap: 16px;\n    border-radius: 16px;\n  }\n`;\n\nexport const SelectionCard = styled.section`\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: var(--margin-large, 24px);\n  padding: 0 0 var(--margin-medium, 16px);\n`;\n\nexport const SelectionDivider = styled.div`\n  width: 100%;\n  border-bottom: 1px dashed var(--border-colour-opacity-low-inverse, rgba(0, 0, 0, 0.16));\n\n  @media (max-width: 820px) {\n    gap: 20px;\n  }\n`;\n\nexport const SelectionTagsWrap = styled.div`\n  width: 100%;\n\n  & > * {\n    display: inline-flex;\n    flex-wrap: wrap;\n    gap: 8px;\n  }\n`;\n\nexport const GroupedSectionsContainer = styled.section`\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  gap: 24px;\n  padding: var(--padding-2xlarge, 40px);\n  border-radius: var(--card-base-container-corner-radius-all-round, 24px);\n  background: var(--colour-surface-full, #fff);\n  box-shadow: 0 var(--shadow-level-1-y, 1px) var(--shadow-level-1-blur, 4px)\n    var(--shadow-level-1-spread, 2px) var(--shadow-level-1-colour, rgba(0, 0, 0, 0.04));\n\n  @media (max-width: 820px) {\n    padding: 24px;\n    gap: 16px;\n  }\n`;\n\nexport const SectionSurface = styled.div`\n  width: 100%;\n  border-radius: var(--card-base-container-corner-radius-all-round, 24px);\n  background: var(--container-bg-colour-subtle, #f5f5f5);\n  border: 1px solid var(--border-colour-opacity-low-inverse, rgba(0, 0, 0, 0.16));\n  overflow: hidden;\n`;\n\nexport const OpCoSection = styled.div`\n  width: 100%;\n  min-width: 0;\n`;\n\nexport const LoadingDots = styled.span`\n  display: inline-block;\n  min-width: 14px;\n\n  &::after {\n    content: '...';\n    display: inline-block;\n    overflow: hidden;\n    vertical-align: bottom;\n    animation: loading-dots 1.2s steps(4, end) infinite;\n  }\n\n  @keyframes loading-dots {\n    0% {\n      width: 0;\n    }\n\n    100% {\n      width: 1.2em;\n    }\n  }\n`;\n\nexport const OpCoScroller = styled.div`\n  position: relative;\n  width: 100%;\n\n  &:hover button,\n  &:focus-within button {\n    opacity: 1;\n    pointer-events: auto;\n  }\n`;\n\ntype ScrollEdgeFadeProps = {\n  $side: 'left' | 'right';\n  $visible: boolean;\n};\n\nexport const ScrollEdgeFade = styled.div<ScrollEdgeFadeProps>`\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  width: 56px;\n  pointer-events: none;\n  opacity: ${({ $visible }: ScrollEdgeFadeProps): number => ($visible ? 1 : 0)};\n  transition: opacity 140ms ease;\n  ${({ $side }: ScrollEdgeFadeProps): string =>\n    $side === 'left'\n      ? 'left: 0; background: linear-gradient(90deg, rgba(42, 42, 42, 0.98) 0%, rgba(42, 42, 42, 0) 100%);'\n      : 'right: 0; background: linear-gradient(270deg, rgba(42, 42, 42, 0.98) 0%, rgba(42, 42, 42, 0) 100%);'}\n`;\n\ntype OpCoButtonGroupWrapProps = {\n  $isOverflowing: boolean;\n};\n\nexport const OpCoButtonGroupWrap = styled.div<OpCoButtonGroupWrapProps>`\n  width: 100%;\n  min-width: 0;\n  overflow-x: auto;\n  overflow-y: hidden;\n  scroll-behavior: smooth;\n  -webkit-overflow-scrolling: touch;\n  -ms-overflow-style: none;\n  scrollbar-width: none;\n  padding: ${({ $isOverflowing }: OpCoButtonGroupWrapProps): string =>\n    $isOverflowing ? '0 56px' : '0'};\n\n  &::-webkit-scrollbar {\n    display: none;\n  }\n\n  /* Keep OpCo chips on a single horizontal row so overflow scroll works consistently. */\n  & > * {\n    display: inline-flex;\n    flex-wrap: nowrap;\n    min-width: max-content;\n  }\n\n  & button {\n    flex: 0 0 auto;\n  }\n\n  @media (max-width: 520px) {\n    padding: ${({ $isOverflowing }: OpCoButtonGroupWrapProps): string =>\n      $isOverflowing ? '0 44px 2px' : '0 0 2px'};\n  }\n`;\n\ntype ScrollNavButtonProps = {\n  $side: 'left' | 'right';\n};\n\nexport const ScrollNavButton = styled.button<ScrollNavButtonProps>`\n  position: absolute;\n  top: 50%;\n  ${({ $side }: ScrollNavButtonProps): string => ($side === 'left' ? 'left: 4px;' : 'right: 4px;')}\n  transform: translateY(-50%);\n  width: 30px;\n  height: 30px;\n  border: 1px solid rgba(255, 255, 255, 0.26);\n  border-radius: 999px;\n  background: rgba(35, 35, 35, 0.76);\n  color: #ffffff;\n  font-size: 18px;\n  line-height: 1;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  cursor: pointer;\n  opacity: 0;\n  pointer-events: none;\n  transition: opacity 140ms ease;\n\n  &:disabled {\n    opacity: 0;\n    cursor: default;\n    pointer-events: none;\n  }\n`;\n\nexport const MainContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  width: 100%;\n  margin-top: var(--margin-small, 8px);\n  margin-bottom: 16px;\n  gap: var(--margin-medium, 16px);\n  align-self: stretch;\n  border-radius: var(--corner-radius-small, 16px);\n  background: var(--container-bg-colour-subtle, #f5f5f5);\n\n  @media (max-width: 820px) {\n    padding: 20px 16px 32px;\n  }\n\n  @media (max-width: 520px) {\n    padding: 12px 8px 24px;\n  }\n`;\n","import React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react';\nimport { DisplayIcon, Text } from '@mtnkente/paragon-display';\nimport { ProgressCircular } from '@mtnkente/paragon-indicators';\nimport { Docs, Globe } from '@mtnkente/paragon-icons';\nimport { SelectButton, SelectButtonGroup } from '@mtnkente/paragon-buttons';\nimport TabOverviewContent from '../Tabs/TabOverviewContent';\nimport {\n  fetchOpcos,\n  fetchOpcoCatalogProjects,\n  OpcoApiItem,\n  OpcoCatalogProject,\n} from '../../services/opco-api';\nimport { resolveRbacContextFromOpcos } from '../../services/rbac';\nimport { useStoreData } from '../../hooks/StoreDataProvider';\nimport { getProjectOverviewMockMetrics } from './project-overview-mock';\n\nimport {\n  SearchPanel,\n  SearchHeader,\n  HeaderTitleRow,\n  IconWrap,\n  SelectionCard,\n  SelectionDivider,\n  SelectionHeader,\n  SelectionIconWrap,\n  SelectionTagsWrap,\n  SectionSurface,\n  GroupedSectionsContainer,\n  MainContainer,\n  OpCoSection,\n  OpCoScroller,\n  OpCoButtonGroupWrap,\n  ProjectOverviewLoadingCard,\n  ScrollEdgeFade,\n  ScrollNavButton,\n  LoadingDots,\n} from './ProjectOverview.style';\nimport searchPanelBackground from './assets/search-panel-bg.png';\n\ntype DashboardProjectOverviewStoreState = {\n  opcoList?: OpcoApiItem[];\n  selectedOpcoCode?: string | null;\n  projects?: OpcoCatalogProject[];\n  selectedProjectId?: string | null;\n  opcoError?: string | null;\n  projectError?: string | null;\n  lastFetchedCode?: string | null;\n};\n\ntype DashboardStoreState = {\n  dashboardProjectOverview?: DashboardProjectOverviewStoreState;\n  dashboardSelectionEvent?: {\n    selectedOpcoCode: string;\n    selectedProjectId: string;\n    revision: number;\n    changedAt: string;\n    isReady: boolean;\n  };\n};\n\nfunction getProjectTimestamp(project: OpcoCatalogProject): number {\n  if (!project.date_created) {\n    return 0;\n  }\n\n  const timestamp = new Date(project.date_created).getTime();\n  return Number.isNaN(timestamp) ? 0 : timestamp;\n}\n\nfunction dedupeProjectsByLatestName(projects: OpcoCatalogProject[]): OpcoCatalogProject[] {\n  const latestByName = new Map<string, OpcoCatalogProject>();\n\n  projects.forEach((project) => {\n    const normalizedName = project.name.trim().toLowerCase();\n    const existingProject = latestByName.get(normalizedName);\n\n    if (!existingProject) {\n      latestByName.set(normalizedName, project);\n      return;\n    }\n\n    const existingTimestamp = getProjectTimestamp(existingProject);\n    const currentTimestamp = getProjectTimestamp(project);\n\n    if (currentTimestamp >= existingTimestamp) {\n      latestByName.set(normalizedName, project);\n    }\n  });\n\n  return Array.from(latestByName.values());\n}\n\nexport interface ProjectOverviewProps {\n  opcoTitle?: string;\n  opcoCaption?: string;\n  projectSelectionTitle?: string;\n  projectSelectionCaption?: string;\n  backgroundImageUrl?: string;\n  children?: ReactNode;\n}\n\nfunction splitAfterFirstSentence(value: string): [string, string] | null {\n  const delimiter = '. ';\n  const firstSentenceEnd = value.indexOf(delimiter);\n\n  if (firstSentenceEnd < 0) {\n    return null;\n  }\n\n  return [value.slice(0, firstSentenceEnd + 1), value.slice(firstSentenceEnd + delimiter.length)];\n}\n\nfunction isWorkItemsSectionChild(child: ReactNode): child is React.ReactElement {\n  if (!React.isValidElement(child)) {\n    return false;\n  }\n\n  const elementType = child.type as { displayName?: string; name?: string } | string;\n\n  if (typeof elementType === 'string') {\n    return false;\n  }\n\n  return elementType.displayName === 'WorkItemsSection' || elementType.name === 'WorkItemsSection';\n}\n\nexport const ProjectOverview: React.FC<ProjectOverviewProps> = ({\n  opcoTitle = 'Select For Your OpCo',\n  opcoCaption = 'Projects, services, and environments are organised by OpCo. Select an OpCo to access an overview or search for a specific project.',\n  projectSelectionTitle = 'Project Selection',\n  projectSelectionCaption = 'Select a project to view its details, progress, owner, risks, and next actions.',\n  backgroundImageUrl = searchPanelBackground,\n  children,\n}) => {\n  const opcoCaptionParts = splitAfterFirstSentence(opcoCaption);\n  const { setData, getData, setReady } = useStoreData();\n  const persistedState = (getData() as DashboardStoreState | undefined)?.dashboardProjectOverview;\n\n  const [opcoList, setOpcoList] = useState<OpcoApiItem[]>(() => persistedState?.opcoList ?? []);\n  const [selectedOpcoCode, setSelectedOpcoCode] = useState<string>(\n    () => persistedState?.selectedOpcoCode ?? ''\n  );\n  const [projects, setProjects] = useState<OpcoCatalogProject[]>(\n    () => persistedState?.projects ?? []\n  );\n  const [selectedProjectId, setSelectedProjectId] = useState<string>(\n    () => persistedState?.selectedProjectId ?? ''\n  );\n  const [opcoError, setOpcoError] = useState<string | null>(\n    () => persistedState?.opcoError ?? null\n  );\n  const [hasLoadedOpcos, setHasLoadedOpcos] = useState<boolean>(\n    () => (persistedState?.opcoList?.length ?? 0) > 0 || persistedState?.opcoError != null\n  );\n  const [projectError, setProjectError] = useState<string | null>(\n    () => persistedState?.projectError ?? null\n  );\n  const [lastFetchedCode, setLastFetchedCode] = useState<string | null>(\n    () => persistedState?.lastFetchedCode ?? null\n  );\n  const [isOpcoOverflowing, setIsOpcoOverflowing] = useState(false);\n  const [canScrollLeft, setCanScrollLeft] = useState(false);\n  const [canScrollRight, setCanScrollRight] = useState(false);\n  const opcoScrollRef = useRef<HTMLDivElement | null>(null);\n  const selectionRevisionRef = useRef(0);\n  const previousSelectionRef = useRef<string>('');\n  const selectedOpcoCodeValue = opcoList.some((opco) => opco.code === selectedOpcoCode)\n    ? selectedOpcoCode\n    : (opcoList[opcoList.length - 1]?.code ?? '');\n  const selectedProjectIdValue = projects.some((project) => project.id === selectedProjectId)\n    ? selectedProjectId\n    : (projects[projects.length - 1]?.id ?? '');\n  const projectsLoading = selectedOpcoCodeValue !== '' && selectedOpcoCodeValue !== lastFetchedCode;\n  const hasSelectionContext =\n    selectedOpcoCodeValue !== '' &&\n    selectedProjectIdValue !== '' &&\n    selectedOpcoCodeValue === lastFetchedCode;\n\n  useEffect(() => {\n    console.info('[ProjectOverview] selection context readiness changed', {\n      hasSelectionContext,\n      selectedOpcoCode: selectedOpcoCodeValue,\n      selectedProjectId: selectedProjectIdValue,\n    });\n    setReady(hasSelectionContext);\n  }, [hasSelectionContext, selectedOpcoCodeValue, selectedProjectIdValue, setReady]);\n\n  useEffect(() => {\n    const selectionKey = `${selectedOpcoCodeValue}::${selectedProjectIdValue}`;\n    if (previousSelectionRef.current === selectionKey) {\n      return;\n    }\n\n    previousSelectionRef.current = selectionKey;\n    selectionRevisionRef.current += 1;\n\n    const selectionEvent = {\n      selectedOpcoCode: selectedOpcoCodeValue,\n      selectedProjectId: selectedProjectIdValue,\n      revision: selectionRevisionRef.current,\n      changedAt: new Date().toISOString(),\n      isReady: hasSelectionContext,\n    };\n\n    console.info('[ProjectOverview] publishing selection change event', selectionEvent);\n    setData({ dashboardSelectionEvent: selectionEvent });\n  }, [hasSelectionContext, selectedOpcoCodeValue, selectedProjectIdValue, setData]);\n\n  useEffect(() => {\n    setData({\n      dashboardProjectOverview: {\n        opcoList,\n        selectedOpcoCode: selectedOpcoCodeValue,\n        projects,\n        selectedProjectId: selectedProjectIdValue,\n        opcoError,\n        projectError,\n        lastFetchedCode,\n      },\n    });\n  }, [\n    lastFetchedCode,\n    opcoError,\n    opcoList,\n    projectError,\n    projects,\n    selectedOpcoCodeValue,\n    selectedProjectIdValue,\n    setData,\n  ]);\n\n  const refreshOpcoScrollerState = useCallback((): void => {\n    const container = opcoScrollRef.current;\n    if (!container) {\n      return;\n    }\n\n    const maxScrollLeft = container.scrollWidth - container.clientWidth;\n    const overflowing = maxScrollLeft > 1;\n    setIsOpcoOverflowing(overflowing);\n    setCanScrollLeft(container.scrollLeft > 1);\n    setCanScrollRight(container.scrollLeft < maxScrollLeft - 1);\n  }, []);\n\n  useEffect(() => {\n    if (opcoList.length > 0) {\n      return;\n    }\n\n    fetchOpcos()\n      .then((data) => {\n        const sorted = [...data].filter((o) => o.status).sort((a, b) => a.sort - b.sort);\n        const rbacContext = resolveRbacContextFromOpcos(sorted);\n        const authorizedOpcos = rbacContext.accessibleOpcos;\n\n        setOpcoList(authorizedOpcos);\n        setOpcoError(\n          rbacContext.hasAnyOpcoAccess\n            ? null\n            : 'No OpCo access assigned for this user. Please contact a Kente administrator.'\n        );\n        setHasLoadedOpcos(true);\n        if (authorizedOpcos.length > 0) {\n          setSelectedOpcoCode((current) =>\n            authorizedOpcos.some((opco) => opco.code === current)\n              ? current\n              : authorizedOpcos[authorizedOpcos.length - 1].code\n          );\n        } else {\n          setSelectedOpcoCode('');\n        }\n      })\n      .catch((error: unknown) => {\n        setOpcoList([]);\n        setOpcoError(error instanceof Error ? error.message : 'Failed to load OpCos.');\n        setHasLoadedOpcos(true);\n      });\n  }, [opcoList.length]);\n\n  const isOpcoLoading = opcoList.length === 0 && !opcoError && !hasLoadedOpcos;\n\n  useEffect(() => {\n    if (!selectedOpcoCodeValue) return;\n    if (selectedOpcoCodeValue === lastFetchedCode) return;\n\n    fetchOpcoCatalogProjects(selectedOpcoCodeValue)\n      .then((data) => {\n        const sorted = dedupeProjectsByLatestName(data).sort((a, b) => {\n          if (a.sort == null) return 1;\n          if (b.sort == null) return -1;\n          return a.sort - b.sort;\n        });\n        setProjects(sorted);\n        setSelectedProjectId((current) => {\n          if (current && sorted.some((project) => project.id === current)) {\n            return current;\n          }\n\n          return sorted[sorted.length - 1]?.id ?? '';\n        });\n        setProjectError(null);\n        setLastFetchedCode(selectedOpcoCodeValue);\n      })\n      .catch((error: unknown) => {\n        setProjects([]);\n        setSelectedProjectId('');\n        setProjectError(error instanceof Error ? error.message : 'Failed to load projects.');\n        setLastFetchedCode(selectedOpcoCodeValue);\n      });\n  }, [lastFetchedCode, selectedOpcoCodeValue]);\n\n  useEffect(() => {\n    refreshOpcoScrollerState();\n\n    const onResize = (): void => refreshOpcoScrollerState();\n    window.addEventListener('resize', onResize);\n\n    const scroller = opcoScrollRef.current;\n    if (scroller) {\n      scroller.addEventListener('scroll', refreshOpcoScrollerState);\n    }\n\n    return () => {\n      window.removeEventListener('resize', onResize);\n      if (scroller) {\n        scroller.removeEventListener('scroll', refreshOpcoScrollerState);\n      }\n    };\n  }, [opcoList, refreshOpcoScrollerState]);\n\n  const selectedProject =\n    projects.find((project) => project.id === selectedProjectIdValue) ??\n    projects[projects.length - 1];\n  const opcoOptions = [...opcoList].reverse();\n  const projectOptions = [...projects].reverse();\n  const selectedOpcoIndex = opcoOptions.findIndex((opco) => opco.code === selectedOpcoCodeValue);\n  const selectedProjectIndex = projectOptions.findIndex(\n    (project) => project.id === selectedProjectIdValue\n  );\n\n  function scrollOpcos(direction: 'left' | 'right'): void {\n    const container = opcoScrollRef.current;\n    if (!container) {\n      return;\n    }\n\n    const scrollAmount = Math.max(container.clientWidth * 0.5, 220);\n    container.scrollBy({\n      left: direction === 'left' ? -scrollAmount : scrollAmount,\n      behavior: 'smooth',\n    });\n  }\n\n  return (\n    <MainContainer>\n      <SearchPanel $backgroundImageUrl={backgroundImageUrl}>\n        <SearchHeader>\n          <HeaderTitleRow>\n            <IconWrap aria-hidden='true'>\n              <DisplayIcon\n                $icon={<Globe />}\n                $variant='full'\n                $isGhost={true}\n                $iconSize='large'\n                $isInverted={false}\n              />\n            </IconWrap>\n            <Text $fontStyle='title-large-bold' $colour='full-inverse'>\n              {opcoTitle}\n            </Text>\n          </HeaderTitleRow>\n          <Text data-testid='opco-caption' $fontStyle='caption-regular' $colour='full-inverse'>\n            {opcoCaptionParts ? (\n              <>\n                {opcoCaptionParts[0]}\n                <br />\n                {opcoCaptionParts[1]}\n              </>\n            ) : (\n              opcoCaption\n            )}\n          </Text>\n        </SearchHeader>\n\n        <OpCoSection>\n          <OpCoScroller>\n            <OpCoButtonGroupWrap\n              ref={opcoScrollRef}\n              $isOverflowing={isOpcoOverflowing}\n              data-testid='opco-select-group'\n            >\n              <SelectButtonGroup\n                key={`opco-group-${selectedOpcoIndex}`}\n                $isInverted={true}\n                $defaultActiveIndex={selectedOpcoIndex >= 0 ? selectedOpcoIndex : undefined}\n              >\n                {opcoOptions.map(\n                  (opco): React.JSX.Element => (\n                    <SelectButton\n                      key={opco.id}\n                      label={opco.name}\n                      onSelect={() => setSelectedOpcoCode(opco.code)}\n                    />\n                  )\n                )}\n              </SelectButtonGroup>\n            </OpCoButtonGroupWrap>\n            {isOpcoOverflowing && (\n              <>\n                <ScrollEdgeFade $side='left' $visible={canScrollLeft} />\n                <ScrollEdgeFade $side='right' $visible={canScrollRight} />\n                <ScrollNavButton\n                  type='button'\n                  aria-label='Scroll OpCos left'\n                  $side='left'\n                  disabled={!canScrollLeft}\n                  onClick={() => scrollOpcos('left')}\n                >\n                  {'\\u2039'}\n                </ScrollNavButton>\n                <ScrollNavButton\n                  type='button'\n                  aria-label='Scroll OpCos right'\n                  $side='right'\n                  disabled={!canScrollRight}\n                  onClick={() => scrollOpcos('right')}\n                >\n                  {'\\u203A'}\n                </ScrollNavButton>\n              </>\n            )}\n          </OpCoScroller>\n          {opcoError && (\n            <Text $fontStyle='caption-regular' $colour='full-inverse'>\n              {opcoError}\n            </Text>\n          )}\n          {isOpcoLoading && (\n            <Text $fontStyle='caption-regular' $colour='full-inverse'>\n              Loading OpCos\n              <LoadingDots aria-hidden='true' />\n            </Text>\n          )}\n          {!isOpcoLoading && !opcoError && opcoList.length === 0 && (\n            <Text $fontStyle='caption-regular' $colour='full-inverse'>\n              No OpCos returned by the API.\n            </Text>\n          )}\n        </OpCoSection>\n      </SearchPanel>\n\n      <GroupedSectionsContainer>\n        <SelectionCard>\n          <SelectionHeader>\n            <HeaderTitleRow>\n              <SelectionIconWrap aria-hidden='true'>\n                <Docs width={22} height={22} />\n              </SelectionIconWrap>\n              <Text $fontStyle='title-large-bold' $colour='full'>\n                {projectSelectionTitle}\n              </Text>\n            </HeaderTitleRow>\n            <Text $fontStyle='caption-regular' $colour='full'>\n              {projectSelectionCaption}\n            </Text>\n          </SelectionHeader>\n\n          <SelectionTagsWrap data-testid='project-select-group'>\n            <SelectButtonGroup\n              key={`project-group-${selectedProjectIndex}`}\n              $isInverted={false}\n              $defaultActiveIndex={selectedProjectIndex >= 0 ? selectedProjectIndex : undefined}\n            >\n              {projectOptions.map(\n                (project): React.JSX.Element => (\n                  <SelectButton\n                    key={project.id}\n                    label={project.name}\n                    onSelect={() => setSelectedProjectId(project.id)}\n                  />\n                )\n              )}\n            </SelectButtonGroup>\n          </SelectionTagsWrap>\n          <SelectionDivider />\n        </SelectionCard>\n\n        {selectedOpcoCodeValue && projectsLoading && (\n          <SectionSurface>\n            <ProjectOverviewLoadingCard>\n              <ProgressCircular size='large' />\n            </ProjectOverviewLoadingCard>\n          </SectionSurface>\n        )}\n\n        {selectedOpcoCodeValue && !projectsLoading && selectedProject && (\n          <SectionSurface>\n            <TabOverviewContent\n              key={`${selectedOpcoCodeValue}-${selectedProject.id}`}\n              title='Project Overview'\n              metrics={getProjectOverviewMockMetrics(selectedProject.id, selectedProject.name)}\n            />\n          </SectionSurface>\n        )}\n        {selectedOpcoCodeValue && !projectsLoading && projects.length === 0 && (\n          <SectionSurface>\n            <Text $fontStyle='caption-regular' $colour='full'>\n              {projectError ?? 'No projects found for the selected OpCo.'}\n            </Text>\n          </SectionSurface>\n        )}\n\n        {React.Children.map(children, (child) => {\n          if (!child) {\n            return child;\n          }\n\n          if (isWorkItemsSectionChild(child)) {\n            return child;\n          }\n\n          return <SectionSurface>{child}</SectionSurface>;\n        })}\n      </GroupedSectionsContainer>\n    </MainContainer>\n  );\n};\n\nexport default ProjectOverview;\n","import styled from 'styled-components';\n\ntype NoOpcoAccessPanelProps = {\n  $backgroundImageUrl?: string;\n};\n\nexport const NoOpcoAccessPanel = styled.section<NoOpcoAccessPanelProps>`\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  gap: 24px;\n  min-height: 476px;\n  margin-top: 16px;\n  padding: 32px 40px 40px;\n  border-radius: var(--card-base-container-corner-radius-all-round, 24px);\n  background: linear-gradient(120deg, #1f1f21 0%, #2a2a2d 100%);\n  box-shadow: 0 var(--shadow-level-1-y, 1px) var(--shadow-level-1-blur, 4px)\n    var(--shadow-level-1-spread, 2px) var(--shadow-level-1-colour, rgba(0, 0, 0, 0.04));\n\n  &::after {\n    content: '';\n    position: absolute;\n    inset: 0;\n    border-radius: inherit;\n    background-image: ${({ $backgroundImageUrl }: NoOpcoAccessPanelProps): string =>\n      $backgroundImageUrl ? `url(${$backgroundImageUrl})` : 'none'};\n    background-position: center;\n    background-repeat: no-repeat;\n    background-size: cover;\n    mix-blend-mode: soft-light;\n    opacity: 0.85;\n    pointer-events: none;\n    z-index: 1;\n  }\n\n  > * {\n    position: relative;\n    z-index: 2;\n  }\n\n  @media (max-width: 820px) {\n    min-height: 420px;\n    padding: 28px 16px;\n    gap: 16px;\n  }\n`;\n\nexport const NoOpcoAccessHeader = styled.div`\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n  max-width: 640px;\n`;\n\nexport const NoOpcoAccessTitleRow = styled.div`\n  display: flex;\n  align-items: center;\n  gap: 10px;\n`;\n\nexport const NoOpcoInfoIcon = styled.span`\n  width: 24px;\n  height: 24px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 50%;\n  color: #fff;\n\n  & svg {\n    display: block;\n  }\n`;\n\nexport const NoOpcoFeatureGrid = styled.div`\n  width: 100%;\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: 24px;\n\n  @media (max-width: 1024px) {\n    width: 100%;\n    grid-template-columns: 1fr;\n  }\n`;\n\nexport const NoOpcoFeatureCard = styled.article`\n  height: 256px;\n  display: flex;\n  flex-direction: column;\n  padding: 32px 24px 40px;\n  border-radius: 24px;\n  background: #fff;\n`;\n\nexport const NoOpcoFeatureIcon = styled.span`\n  width: 32px;\n  height: 32px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  color: #000;\n\n  & svg {\n    display: block;\n  }\n`;\n\nexport const NoOpcoFeatureContent = styled.div`\n  margin-top: 24px;\n  width: 100%;\n  align-self: stretch;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n\n  & > * {\n    width: 100%;\n    display: block;\n  }\n`;\n\nexport const NoOpcoFeatureTitle = styled.div`\n  max-width: 340px;\n`;\n\nexport const NoOpcoFeatureSubtitle = styled.div`\n  max-width: 360px;\n`;\n","import React, { ReactElement } from 'react';\nimport { Text } from '@mtnkente/paragon-display';\nimport { Analytics, Info, PlusWithCircle, UserGroup } from '@mtnkente/paragon-icons';\nimport {\n  NoOpcoAccessPanel,\n  NoOpcoAccessHeader,\n  NoOpcoAccessTitleRow,\n  NoOpcoInfoIcon,\n  NoOpcoFeatureGrid,\n  NoOpcoFeatureCard,\n  NoOpcoFeatureIcon,\n  NoOpcoFeatureContent,\n  NoOpcoFeatureTitle,\n  NoOpcoFeatureSubtitle,\n} from './NoOpcoAccess.style';\nimport backgroundImage from '../ProjectOverview/assets/search-panel-bg.png';\n\ntype NoAccessFeature = {\n  id: string;\n  icon: ReactElement;\n  title: ReactElement;\n  description: ReactElement;\n};\n\nconst NO_ACCESS_FEATURES: NoAccessFeature[] = [\n  {\n    id: 'create-manage-resources',\n    icon: <PlusWithCircle width={32} height={32} />,\n    title: (\n      <>\n        Create and Manage Project\n        <br />\n        Resources\n      </>\n    ),\n    description: (\n      <>\n        Create and manage applications, app containers,\n        <br />\n        and microservices from one place.\n      </>\n    ),\n  },\n  {\n    id: 'track-sprint-progress',\n    icon: <Analytics width={32} height={32} />,\n    title: (\n      <>\n        Track Sprint Tasks and\n        <br />\n        Progress\n      </>\n    ),\n    description: (\n      <>\n        Stay up to date with assigned work, monitor progress,\n        <br />\n        and keep delivery on track.\n      </>\n    ),\n  },\n  {\n    id: 'view-project-collaborate',\n    icon: <UserGroup width={32} height={32} />,\n    title: (\n      <>\n        View Projects and Collaborate\n        <br />\n        with Your Team\n      </>\n    ),\n    description: (\n      <>\n        Access project information and work effectively with team\n        <br />\n        members across your projects.\n      </>\n    ),\n  },\n];\n\nexport const NoOpcoAccess = (): ReactElement => (\n  <NoOpcoAccessPanel $backgroundImageUrl={backgroundImage}>\n    <NoOpcoAccessHeader>\n      <NoOpcoAccessTitleRow>\n        <NoOpcoInfoIcon>\n          <Info width={20} height={20} />\n        </NoOpcoInfoIcon>\n        <Text $fontStyle='title-large-bold' $colour='full-inverse'>\n          You're not assigned to an OpCo yet\n        </Text>\n      </NoOpcoAccessTitleRow>\n      <Text $fontStyle='caption-regular' $colour='full-inverse'>\n        Once access has been granted, you'll be able to view project information, create and manage\n        repos, track sprint tasks, and more\n      </Text>\n    </NoOpcoAccessHeader>\n\n    <NoOpcoFeatureGrid>\n      {NO_ACCESS_FEATURES.map((feature) => (\n        <NoOpcoFeatureCard key={feature.id}>\n          <NoOpcoFeatureIcon>{feature.icon}</NoOpcoFeatureIcon>\n          <NoOpcoFeatureContent>\n            <NoOpcoFeatureTitle>\n              <Text $fontStyle='body-large-semibold' $colour='full'>\n                {feature.title}\n              </Text>\n            </NoOpcoFeatureTitle>\n            <NoOpcoFeatureSubtitle>\n              <Text $fontStyle='caption-regular' $colour='subtle'>\n                {feature.description}\n              </Text>\n            </NoOpcoFeatureSubtitle>\n          </NoOpcoFeatureContent>\n        </NoOpcoFeatureCard>\n      ))}\n    </NoOpcoFeatureGrid>\n  </NoOpcoAccessPanel>\n);\n\nexport default NoOpcoAccess;\n","import styled from 'styled-components';\n\nexport const ScrollSectionContainer = styled.section`\n  display: flex;\n  width: 100%;\n  align-self: stretch;\n  padding: var(--padding-large, 24px) var(--padding-none, 0)\n    var(--navigation-rail-scale-xs-s-margin, 24px) 0;\n  flex-direction: column;\n  align-items: center;\n  gap: var(--padding-none, 0);\n  border-radius: var(--corner-radius-medium, 24px);\n  border: 1px solid var(--border-colour-opacity-low-inverse, rgba(0, 0, 0, 0.16));\n  background-image:\n    linear-gradient(\n      90deg,\n      var(--page-bg-colour-subtle, #f5f5f5) 0%,\n      var(--page-bg-colour-subtle, #f5f5f5) 100%\n    ),\n    linear-gradient(\n      90deg,\n      var(--navigation-rail-action-menu-container-colour, #fff) 0%,\n      var(--navigation-rail-action-menu-container-colour, #fff) 100%\n    );\n`;\n\nexport const HeaderRow = styled.div`\n  width: 100%;\n  padding: var(--navigation-rail-scale-xs-s-container-padding-all-round, 16px)\n    var(--margin-2xlarge, 40px);\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--margin-medium, 16px);\n\n  @media (max-width: 768px) {\n    padding: var(--navigation-rail-scale-xs-s-container-padding-all-round, 16px)\n      var(--padding-large, 24px);\n  }\n`;\n\nexport const ScrollContent = styled.div`\n  width: 100%;\n  padding: var(--margin-medium, 16px) var(--navigation-rail-scale-m-l-margin, 40px)\n    var(--navigation-rail-scale-xs-s-margin, 24px) var(--padding-2xlarge, 40px);\n  overflow-x: auto;\n  overflow-y: clip;\n\n  > div {\n    width: 100%;\n  }\n\n  @media (max-width: 768px) {\n    padding: var(--margin-medium, 16px) var(--padding-large, 24px)\n      var(--navigation-rail-scale-xs-s-margin, 24px);\n  }\n\n  /* Keep the Paragon scrollbar compact and centered for Work Items. */\n  [data-testid='scroll-area-scrollbar-horizontal'] {\n    display: flex;\n    width: 172px !important;\n    height: 4px !important;\n    min-width: 120px;\n    padding: var(--scrollbar-container-padding, 0);\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n  }\n`;\n\nexport const ItemsRow = styled.div`\n  display: flex;\n  gap: var(--margin-large, 24px);\n  width: max-content;\n`;\n\nexport const CardSlot = styled.div`\n  display: flex;\n\n  &:focus-visible {\n    outline: 2px solid #ffcb05;\n    outline-offset: 4px;\n    border-radius: 12px;\n  }\n`;\n\nexport const WorkItemCardContainer = styled.article`\n  display: flex;\n  width: 408px;\n  flex: 0 0 auto;\n  min-width: 408px;\n  padding: 24px;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: 12px;\n  border-radius: var(--corner-radius-medium, 24px);\n  border: 1px solid var(--border-colour-opacity-low-inverse, rgba(0, 0, 0, 0.16));\n  background: var(--card-base-elevated-container-colour, #fff);\n  box-shadow: 0 var(--shadow-level-1-y, 1px) calc(var(--shadow-level-1-blur, 4px) / 2)\n    var(--shadow-level-1-spread, 2px) var(--shadow-level-1-colour, rgba(0, 0, 0, 0.04));\n\n  @media (max-width: 768px) {\n    width: min(88vw, 520px);\n    min-width: min(88vw, 520px);\n    padding: 20px;\n  }\n`;\n\nexport const ItemHeader = styled.div`\n  width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: nowrap;\n  gap: 16px;\n\n  > :first-child {\n    flex: 1 1 auto;\n    min-width: 0;\n  }\n`;\n\nexport const ItemPrimaryContent = styled.div`\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  gap: var(--padding-xsmall, 8px);\n`;\n\nexport const ItemTitle = styled.p`\n  margin: 0;\n  font-family: 'MTN Brighter Sans', 'Trebuchet MS', sans-serif;\n  font-size: 2.8rem;\n  font-weight: 700;\n  line-height: 1.2;\n  color: #111;\n`;\n\nexport const SprintTag = styled.p`\n  margin: 0;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 44px;\n  padding: 0 18px;\n  border-radius: 999px;\n  border: 2px solid #111;\n  white-space: nowrap;\n  font-family: 'MTN Brighter Sans', 'Trebuchet MS', sans-serif;\n  font-size: 3.1rem;\n  font-weight: 500;\n  line-height: 1.2;\n  color: #111;\n`;\n\nexport const ItemDivider = styled.div`\n  width: 100%;\n  border-bottom: 1px dashed rgba(0, 0, 0, 0.16);\n`;\n\nexport const ItemFooter = styled.div`\n  width: 100%;\n  display: flex;\n  align-items: center;\n  gap: 10px;\n`;\n\nexport const ItemMetaChip = styled.div`\n  display: inline-flex;\n  align-items: center;\n`;\n\nexport const SprintTagWrap = styled.div`\n  display: inline-flex;\n  align-items: center;\n\n  > * {\n    width: auto;\n    max-width: 100%;\n    color: var(--text-colour, #000);\n    border-color: var(--tag-outlined-container-border-colour, #000000);\n    font-weight: var(--typescale-label-m-l-small-bold-weight, 700);\n  }\n\n  > * * {\n    color: var(--text-colour, #000);\n  }\n\n  .tag-prefix {\n    font-weight: var(--typescale-label-m-l-small-bold-weight, 700);\n    font-size: var(--typescale-label-xs-s-small-regular-size, 14px);\n    line-height: var(--typescale-label-xs-s-small-regular-line-height, 14px);\n    letter-spacing: var(--typescale-label-xs-s-small-regular-letter-spacing, 0);\n  }\n\n  .tag-value {\n    font-weight: var(--typescale-label-m-l-small-regular-weight, 400);\n    font-size: var(--typescale-label-xs-s-small-regular-size, 14px);\n    line-height: var(--typescale-label-xs-s-small-regular-line-height, 14px);\n    letter-spacing: var(--typescale-label-xs-s-small-regular-letter-spacing, 0);\n  }\n\n  > *:hover,\n  > *:active {\n    color: var(--text-colour, #000);\n  }\n`;\n\nexport const FooterTagWrap = styled.div`\n  display: inline-flex;\n  align-items: center;\n\n  > * {\n    background: var(--tag-filled-container-colour, #00000029);\n    border-color: transparent;\n    color: var(--text-colour, #000);\n    font-weight: var(--typescale-label-m-l-small-bold-weight, 700);\n  }\n\n  > *:hover,\n  > *:active {\n    color: var(--text-colour, #000);\n  }\n\n  > * * {\n    color: var(--text-colour, #000);\n  }\n\n  .tag-prefix {\n    font-weight: var(--typescale-label-m-l-small-bold-weight, 700);\n    font-size: var(--typescale-label-xs-s-small-regular-size, 14px);\n    line-height: var(--typescale-label-xs-s-small-regular-line-height, 14px);\n    letter-spacing: var(--typescale-label-xs-s-small-regular-letter-spacing, 0);\n  }\n\n  .tag-value {\n    font-weight: var(--typescale-label-m-l-small-regular-weight, 400);\n    font-size: var(--typescale-label-xs-s-small-regular-size, 14px);\n    line-height: var(--typescale-label-xs-s-small-regular-line-height, 14px);\n    letter-spacing: var(--typescale-label-xs-s-small-regular-letter-spacing, 0);\n  }\n`;\n\nexport const PriorityTagWrap = styled.div<{\n  $priority: 'high' | 'moderate' | 'low';\n}>`\n  display: inline-flex;\n  align-items: center;\n  flex: 0 0 auto;\n\n  > * {\n    color: var(--text-colour, #000);\n    font-weight: var(--typescale-label-m-l-small-bold-weight, 700);\n  }\n\n  > * * {\n    color: var(--text-colour, #000);\n    font-weight: var(--typescale-label-m-l-small-bold-weight, 700);\n    font-size: var(--typescale-label-m-l-small-regular-size, 16px);\n    line-height: var(--typescale-label-m-l-small-regular-line-height, 16px);\n    letter-spacing: var(--typescale-label-m-l-small-regular-letter-spacing, 0);\n  }\n\n  ${({ $priority }): string => {\n    if ($priority === 'high') {\n      return `\n        > * {\n          background: var(--colour-on-error, #ffbec4);\n          border-color: var(--border-colour-error, #b20010);\n          color: var(--text-colour, #000);\n        }\n      `;\n    }\n\n    if ($priority === 'moderate') {\n      return `\n        > * {\n          background: var(--colour-surface-subtle-warning, #ffeee5);\n          border-color: var(--border-colour-warning, #ff732e);\n          color: var(--text-colour, #000);\n        }\n      `;\n    }\n\n    return '';\n  }}\n\n  > *:hover,\n  > *:active {\n    color: inherit;\n  }\n`;\n","import React from 'react';\nimport { Text } from '@mtnkente/paragon-display';\nimport { MicroButton } from '@mtnkente/paragon-buttons';\nimport { ScrollbarNavigator } from '@mtnkente/paragon-navigation/scrollbar-navigator';\nimport {\n  CardSlot,\n  HeaderRow,\n  ItemsRow,\n  ScrollContent,\n  ScrollSectionContainer,\n} from './WorkItemsSection.style';\n\nexport interface HorizontalScrollSectionProps {\n  title: string;\n  children: React.ReactNode;\n  viewAllLabel?: string;\n}\n\nconst HorizontalScrollSection: React.FC<HorizontalScrollSectionProps> = ({\n  title,\n  children,\n  viewAllLabel = 'View All',\n}) => {\n  const scrollHostRef = React.useRef<HTMLDivElement | null>(null);\n  const scrollbarRef = React.useRef<{\n    scrollTo: (options?: ScrollToOptions | number, y?: number) => void;\n  } | null>(null);\n\n  function stopCardDragScroll(\n    event: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>\n  ): void {\n    event.stopPropagation();\n  }\n\n  React.useEffect(() => {\n    const host = scrollHostRef.current;\n\n    if (!host) {\n      return;\n    }\n\n    const track = host.querySelector<HTMLElement>(\n      \"[data-testid='scroll-area-scrollbar-horizontal']\"\n    );\n    const thumb = host.querySelector<HTMLElement>(\"[data-testid='scroll-area-thumb-horizontal']\");\n    const viewport = host.querySelector<HTMLElement>(\"[data-testid='scroll-area-viewport']\");\n\n    if (!track || !viewport) {\n      return;\n    }\n\n    const scrollToTrackPosition = (clientX: number): void => {\n      const trackRect = track.getBoundingClientRect();\n      const thumbRect = thumb?.getBoundingClientRect();\n      const thumbWidth = thumbRect?.width ?? 0;\n      const usableTrackWidth = Math.max(trackRect.width - thumbWidth, 1);\n      const desiredOffset = clientX - trackRect.left - thumbWidth / 2;\n      const clampedOffset = Math.max(0, Math.min(desiredOffset, usableTrackWidth));\n      const ratio = clampedOffset / usableTrackWidth;\n      const maxScrollLeft = Math.max(viewport.scrollWidth - viewport.clientWidth, 0);\n\n      scrollbarRef.current?.scrollTo({\n        left: ratio * maxScrollLeft,\n        behavior: 'smooth',\n      });\n    };\n\n    const handleTrackMouseDown = (event: MouseEvent): void => {\n      const target = event.target as Node | null;\n\n      if (thumb && target && thumb.contains(target)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n      scrollToTrackPosition(event.clientX);\n    };\n\n    const handleTrackTouchStart = (event: TouchEvent): void => {\n      const target = event.target as Node | null;\n\n      if (thumb && target && thumb.contains(target)) {\n        return;\n      }\n\n      const touch = event.touches[0];\n\n      if (!touch) {\n        return;\n      }\n\n      event.stopPropagation();\n      scrollToTrackPosition(touch.clientX);\n    };\n\n    track.addEventListener('mousedown', handleTrackMouseDown);\n    track.addEventListener('touchstart', handleTrackTouchStart, { passive: true });\n\n    return () => {\n      track.removeEventListener('mousedown', handleTrackMouseDown);\n      track.removeEventListener('touchstart', handleTrackTouchStart);\n    };\n  }, []);\n\n  return (\n    <ScrollSectionContainer>\n      <HeaderRow>\n        <Text as='h3' $fontStyle='title-small-bold' $colour='full'>\n          {title}\n        </Text>\n        <MicroButton $variant='secondary' label={viewAllLabel} />\n      </HeaderRow>\n\n      <ScrollContent ref={scrollHostRef}>\n        <ScrollbarNavigator ref={scrollbarRef} $isVertical={false} $width={100}>\n          <ItemsRow>\n            {React.Children.map(children, (child, index): React.JSX.Element => {\n              return (\n                <CardSlot\n                  key={index}\n                  onMouseDown={stopCardDragScroll}\n                  onTouchStart={stopCardDragScroll}\n                >\n                  {child}\n                </CardSlot>\n              );\n            })}\n          </ItemsRow>\n        </ScrollbarNavigator>\n      </ScrollContent>\n    </ScrollSectionContainer>\n  );\n};\n\nexport default HorizontalScrollSection;\n","import React from 'react';\nimport { Tag } from '@mtnkente/paragon-indicators';\nimport {\n  FooterTagWrap,\n  ItemFooter,\n  ItemHeader,\n  ItemMetaChip,\n  ItemPrimaryContent,\n  PriorityTagWrap,\n  SprintTagWrap,\n  WorkItemCardContainer,\n} from './WorkItemsSection.style';\nimport { Text } from '@mtnkente/paragon-display';\nimport { Divider } from '@mtnkente/paragon-layouts';\n\nexport type WorkItem = {\n  id: string;\n  title: string;\n  sprintEndDate: string;\n  priority: 'high' | 'moderate' | 'low';\n  pending: number;\n  complete: number;\n};\n\nexport interface WorkItemCardProps {\n  item: WorkItem;\n}\n\nfunction getPriorityLabel(priority: WorkItem['priority']): string {\n  switch (priority) {\n    case 'high':\n      return 'High Priority';\n    case 'moderate':\n      return 'Med Priority';\n    case 'low':\n      return 'Low Priority';\n    default:\n      return 'Priority';\n  }\n}\n\nconst WorkItemCard: React.FC<WorkItemCardProps> = ({ item }) => {\n  const priorityLabel = getPriorityLabel(item.priority);\n  const sprintLabel = (\n    <>\n      <span className='tag-prefix'>Sprint Ends:</span>{' '}\n      <span className='tag-value'>{item.sprintEndDate}</span>\n    </>\n  );\n  const pendingLabel = (\n    <>\n      <span className='tag-prefix'>Pending:</span> <span className='tag-value'>{item.pending}</span>\n    </>\n  );\n  const completeLabel = (\n    <>\n      <span className='tag-prefix'>Complete:</span>{' '}\n      <span className='tag-value'>{item.complete}</span>\n    </>\n  );\n\n  return (\n    <WorkItemCardContainer>\n      <ItemPrimaryContent>\n        <ItemHeader>\n          <Text\n            $fontStyle='label-small-bold'\n            $colour='full'\n            style={{\n              minWidth: 0,\n              overflowWrap: 'anywhere',\n              color: 'var(--text-colour, #000)',\n            }}\n          >\n            {item.title}\n          </Text>\n          <PriorityTagWrap $priority={item.priority}>\n            <Tag label={priorityLabel} $variant='outlined' icon={null} isDismissible={false} />\n          </PriorityTagWrap>\n        </ItemHeader>\n\n        <SprintTagWrap>\n          <Tag label={sprintLabel} $variant='outlined' icon={null} isDismissible={false} />\n        </SprintTagWrap>\n      </ItemPrimaryContent>\n\n      <Divider orientation='horizontal' $variant='subtle' $isInverted={false} $isDashed={true} />\n\n      <ItemFooter>\n        <ItemMetaChip>\n          <FooterTagWrap>\n            <Tag label={pendingLabel} $variant='filled' icon={null} isDismissible={false} />\n          </FooterTagWrap>\n        </ItemMetaChip>\n        <ItemMetaChip>\n          <FooterTagWrap>\n            <Tag label={completeLabel} $variant='filled' icon={null} isDismissible={false} />\n          </FooterTagWrap>\n        </ItemMetaChip>\n      </ItemFooter>\n    </WorkItemCardContainer>\n  );\n};\n\nexport default WorkItemCard;\n","import React from 'react';\nimport HorizontalScrollSection from './HorizontalScrollSection';\nimport WorkItemCard, { WorkItem } from './WorkItemCard';\n\nexport interface WorkItemsSectionProps {\n  title?: string;\n  items: WorkItem[];\n}\n\nconst WorkItemsSection: React.FC<WorkItemsSectionProps> = ({ title = 'My work items', items }) => {\n  return (\n    <HorizontalScrollSection title={title}>\n      {items.map((item): React.JSX.Element => {\n        return <WorkItemCard key={item.id} item={item} />;\n      })}\n    </HorizontalScrollSection>\n  );\n};\n\nWorkItemsSection.displayName = 'WorkItemsSection';\n\nexport default WorkItemsSection;\n","import { ProgressCircular } from '@mtnkente/paragon-indicators';\nimport React from 'react';\nimport styled from 'styled-components';\n\nconst Overlay = styled.div`\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: 9999; /* Make sure it covers everything */\n`;\n\ninterface LoadingProps {\n  isLoading: boolean;\n}\n\nconst Loading: React.FC<LoadingProps> = ({ isLoading }) => {\n  if (!isLoading) return null;\n\n  return (\n    <Overlay>\n      <ProgressCircular data-testid='circular' size='large' />\n    </Overlay>\n  );\n};\n\nexport default Loading;\n","import React, { ReactElement, useEffect, useState } from 'react';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StyledAppContainer, StyledPageContainer, StyledShellContainer } from './Dashboard.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\nimport ProjectOverview from '../ProjectOverview/ProjectOverview';\nimport NoOpcoAccess from '../NoOpcoAccess/NoOpcoAccess';\nimport WorkItemsSection from '../WorkItems/WorkItemsSection';\nimport { WorkItem } from '../WorkItems/WorkItemCard';\nimport Loading from '../Loading/Loading';\nimport { getRbacContext } from '../../services/rbac';\nimport { useStoreData } from '../../hooks/StoreDataProvider';\n\ntype DashboardProps = {\n  profilePicture: string;\n  userFirstName: string;\n  userLastName: string;\n  logoutUser: () => Promise<void>;\n};\n\ntype DashboardSelectionEvent = {\n  selectedOpcoCode: string;\n  selectedProjectId: string;\n  revision: number;\n  changedAt: string;\n  isReady: boolean;\n};\n\ntype DashboardStoreState = {\n  dashboardSelectionEvent?: DashboardSelectionEvent;\n};\n\nconst DEFAULT_WORK_ITEMS: WorkItem[] = [\n  {\n    id: 'item-1',\n    title: 'No Funds Page Shell',\n    sprintEndDate: '19 Apr 2026',\n    priority: 'high',\n    pending: 5,\n    complete: 5,\n  },\n  {\n    id: 'item-2',\n    title: 'No Funds Page Shell',\n    sprintEndDate: '19 Apr 2026',\n    priority: 'moderate',\n    pending: 5,\n    complete: 5,\n  },\n  {\n    id: 'item-3',\n    title: 'No Funds Page Shell',\n    sprintEndDate: '19 Apr 2026',\n    priority: 'low',\n    pending: 5,\n    complete: 5,\n  },\n];\n\nexport const Dashboard = ({\n  userFirstName,\n  userLastName,\n  profilePicture,\n  logoutUser,\n}: DashboardProps): ReactElement => {\n  const [isNavbarLoaded, setIsNavbarLoaded] = useState(false);\n  const [hasOpcoAccess, setHasOpcoAccess] = useState<boolean | null>(null);\n  const { getData, subscribe } = useStoreData();\n  const [selectionEvent, setSelectionEvent] = useState<DashboardSelectionEvent | null>(() => {\n    const initialStoreData = getData() as DashboardStoreState | undefined;\n    return initialStoreData?.dashboardSelectionEvent ?? null;\n  });\n\n  useEffect(() => {\n    let isCancelled = false;\n\n    getRbacContext()\n      .then((context) => {\n        if (!isCancelled) {\n          setHasOpcoAccess(context.hasAnyOpcoAccess);\n        }\n      })\n      .catch(() => {\n        if (!isCancelled) {\n          setHasOpcoAccess(true);\n        }\n      });\n\n    return () => {\n      isCancelled = true;\n    };\n  }, []);\n\n  useEffect(() => {\n    const unsubscribe = subscribe(({ data }) => {\n      const storeData = data as DashboardStoreState | undefined;\n      setSelectionEvent(storeData?.dashboardSelectionEvent ?? null);\n    });\n\n    return unsubscribe;\n  }, [subscribe]);\n\n  const isSearchDisabled = hasOpcoAccess === false;\n  const isCreateDisabled = hasOpcoAccess === false;\n  const shouldShowProjectDetails = hasOpcoAccess !== false;\n  const shouldRenderDashboardBody = hasOpcoAccess === false || isNavbarLoaded;\n  const hasCardholderSelection =\n    selectionEvent?.isReady === true &&\n    selectionEvent.selectedOpcoCode !== '' &&\n    selectionEvent.selectedProjectId !== '';\n\n  useEffect(() => {\n    if (typeof document === 'undefined') {\n      return;\n    }\n\n    const selector = \"button[data-testid='menu-action-button']\";\n    const originalState = new Map<\n      HTMLButtonElement,\n      {\n        disabled: boolean;\n        tabIndex: string | null;\n        ariaDisabled: string | null;\n      }\n    >();\n\n    const rememberState = (button: HTMLButtonElement): void => {\n      if (originalState.has(button)) {\n        return;\n      }\n\n      originalState.set(button, {\n        disabled: button.disabled,\n        tabIndex: button.getAttribute('tabindex'),\n        ariaDisabled: button.getAttribute('aria-disabled'),\n      });\n    };\n\n    const applyDisabledState = (button: HTMLButtonElement): void => {\n      rememberState(button);\n      button.disabled = true;\n      button.setAttribute('aria-disabled', 'true');\n      button.setAttribute('tabindex', '-1');\n    };\n\n    const restoreState = (button: HTMLButtonElement): void => {\n      const previousState = originalState.get(button);\n      if (!previousState) {\n        return;\n      }\n\n      button.disabled = previousState.disabled;\n\n      if (previousState.tabIndex === null) {\n        button.removeAttribute('tabindex');\n      } else {\n        button.setAttribute('tabindex', previousState.tabIndex);\n      }\n\n      if (previousState.ariaDisabled === null) {\n        button.removeAttribute('aria-disabled');\n      } else {\n        button.setAttribute('aria-disabled', previousState.ariaDisabled);\n      }\n    };\n\n    const syncCreateButtons = (): void => {\n      const buttons = document.querySelectorAll<HTMLButtonElement>(selector);\n      buttons.forEach((button) => {\n        if (isCreateDisabled) {\n          applyDisabledState(button);\n        } else {\n          restoreState(button);\n        }\n      });\n    };\n\n    syncCreateButtons();\n\n    const observer = new MutationObserver(() => {\n      syncCreateButtons();\n    });\n\n    observer.observe(document.body, { childList: true, subtree: true });\n\n    return () => {\n      observer.disconnect();\n      const buttons = document.querySelectorAll<HTMLButtonElement>(selector);\n      buttons.forEach((button) => restoreState(button));\n    };\n  }, [isCreateDisabled]);\n\n  if (hasOpcoAccess === null) {\n    return (\n      <StyledAppContainer data-testid='dashboard-app-container'>\n        <StyledPageContainer data-testid='dashboard-shell-container'>\n          <Loading isLoading={true} />\n        </StyledPageContainer>\n      </StyledAppContainer>\n    );\n  }\n\n  const handleSearchDisableFocusCapture = (\n    event: React.FocusEvent<HTMLDivElement, Element>\n  ): void => {\n    if (!isSearchDisabled) {\n      return;\n    }\n\n    const target = event.target as HTMLElement;\n    const isSearchField =\n      target.matches('input') ||\n      target.matches('[role=\"searchbox\"]') ||\n      target.matches('[type=\"search\"]') ||\n      target.matches('[aria-label*=\"search\" i]') ||\n      target.matches('[placeholder*=\"search\" i]');\n\n    if (isSearchField) {\n      target.blur();\n    }\n  };\n\n  return (\n    <StyledAppContainer data-testid='dashboard-app-container'>\n      <StyledPageContainer data-testid='dashboard-shell-container'>\n        <div\n          style={{\n            width: '100%',\n            opacity: isSearchDisabled ? 0.72 : 1,\n          }}\n          onFocusCapture={handleSearchDisableFocusCapture}\n          aria-disabled={isSearchDisabled}\n        >\n          {isCreateDisabled && (\n            <style>\n              {`\n                button[data-testid='menu-action-button'] {\n                  pointer-events: none !important;\n                  opacity: 0.56 !important;\n                  cursor: not-allowed !important;\n                }\n              `}\n            </style>\n          )}\n          {isSearchDisabled && (\n            <style>\n              {`\n                [data-testid='dashboard-search-wrapper'] input,\n                [data-testid='dashboard-search-wrapper'] [role='searchbox'],\n                [data-testid='dashboard-search-wrapper'] [type='search'],\n                [data-testid='dashboard-search-wrapper'] [aria-label*='search' i],\n                [data-testid='dashboard-search-wrapper'] [placeholder*='search' i] {\n                  pointer-events: none !important;\n                  user-select: none;\n                }\n              `}\n            </style>\n          )}\n          <SafeFeatureAppLoader\n            featureAppId='fa-search-bar'\n            src={process.env.REACT_APP_FA_SEARCH_BAR_URL + 'fa-main/main.js'}\n            moduleType=''\n            fallback={<ErrorUi productName='Search Bar' />}\n            config={{\n              mode: 'light',\n              variant: 'search-bar',\n              caption: '',\n              profile: profilePicture,\n              logoutUser: logoutUser,\n              userFirstName: userFirstName,\n              userLastName: userLastName,\n            }}\n          >\n            {({\n              error,\n              featureAppNode,\n              loading,\n            }: CustomFeatureAppRenderingParams): ReactElement => {\n              if (!loading && !error && !isNavbarLoaded) {\n                setIsNavbarLoaded(true);\n              }\n              return error ? (\n                <ErrorUi productName={'Search Bar'} />\n              ) : (\n                <StyledShellContainer\n                  style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                >\n                  <div data-testid='dashboard-search-wrapper'>{featureAppNode}</div>\n                </StyledShellContainer>\n              );\n            }}\n          </SafeFeatureAppLoader>\n        </div>\n\n        {shouldRenderDashboardBody && (\n          <>\n            <SafeFeatureAppLoader\n              featureAppId='fa-banner'\n              src={process.env.REACT_APP_FA_BANNER_URL + 'fa-main/main.js'}\n              moduleType=''\n              fallback={<ErrorUi productName='Banner' />}\n              config={{\n                appType: 'app-feature',\n                userFirstName: userFirstName,\n                userLastName: userLastName,\n                profile: profilePicture,\n              }}\n            >\n              {({\n                error,\n                featureAppNode,\n                loading,\n              }: CustomFeatureAppRenderingParams): ReactElement => {\n                return error ? (\n                  <ErrorUi productName={'Banner'} />\n                ) : (\n                  <StyledShellContainer\n                    style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                    data-testid='fa-app-container'\n                  >\n                    {featureAppNode}\n                  </StyledShellContainer>\n                );\n              }}\n            </SafeFeatureAppLoader>\n            {shouldShowProjectDetails ? (\n              <ProjectOverview>\n                <WorkItemsSection items={DEFAULT_WORK_ITEMS} />\n                {hasCardholderSelection && selectionEvent && (\n                  <SafeFeatureAppLoader\n                    key={`fa-cardholder-${selectionEvent.revision}`}\n                    featureAppId='fa-cardholder'\n                    src={process.env.REACT_APP_FA_CARDHOLDER_URL + 'fa-main/main.js'}\n                    moduleType=''\n                    fallback={<ErrorUi productName='Cardholder' />}\n                    config={{\n                      selectedOpcoCode: selectionEvent.selectedOpcoCode,\n                      selectedProjectId: selectionEvent.selectedProjectId,\n                      opcoCode: selectionEvent.selectedOpcoCode,\n                      projectId: selectionEvent.selectedProjectId,\n                    }}\n                  >\n                    {({\n                      error,\n                      featureAppNode,\n                      loading,\n                    }: CustomFeatureAppRenderingParams): ReactElement => {\n                      return error ? (\n                        <ErrorUi productName={'Cardholder'} />\n                      ) : (\n                        <StyledShellContainer\n                          style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                          data-testid='fa-app-container'\n                        >\n                          {featureAppNode}\n                        </StyledShellContainer>\n                      );\n                    }}\n                  </SafeFeatureAppLoader>\n                )}\n              </ProjectOverview>\n            ) : (\n              <NoOpcoAccess />\n            )}\n          </>\n        )}\n      </StyledPageContainer>\n    </StyledAppContainer>\n  );\n};\n","import styled from 'styled-components';\nimport { BaseShellContainer, BaseAppContainer, BodyLayoutContainer } from '../shared/BaseStyles';\n\n/**\n * AppStore-specific styled components\n * Background and spacing managed by base styles\n */\n\nexport const StyledShellContainer = styled(BaseShellContainer)``;\n\nexport const StyledPageContainer = styled(BodyLayoutContainer)``;\n\nexport const StyledAppContainer = styled(BaseAppContainer)``;\n\nexport const StyledAppStoreContainer = styled.div`\n  display: flex;\n  width: 100%;\n  min-height: 100%;\n  flex-wrap: wrap;\n`;\n","import React, { ReactElement, useState } from 'react';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport {\n  StyledAppContainer,\n  StyledAppStoreContainer,\n  StyledPageContainer,\n  StyledShellContainer,\n} from './AppStore.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\nimport { useStoreData } from '../../hooks/StoreDataProvider';\n\ntype AppStoreProps = {\n  userName: string;\n  userLastName: string;\n  profilePicture: string;\n  logoutUser: () => Promise<void>;\n  storeType: string;\n};\n\nexport const AppFeatures = ({\n  userName,\n  profilePicture,\n  logoutUser,\n  storeType,\n  userLastName,\n}: AppStoreProps): ReactElement => {\n  const storeService = useStoreData();\n  storeService.setData({ appType: storeType });\n\n  const [isNavbarLoaded, setIsNavbarLoaded] = useState(false);\n\n  return (\n    <StyledAppContainer data-testid='appstore-app-container'>\n      <StyledPageContainer data-testid='appstore-shell-container'>\n        <SafeFeatureAppLoader\n          featureAppId='fa-search-bar'\n          src={process.env.REACT_APP_FA_SEARCH_BAR_URL + 'fa-main/main.js'}\n          moduleType=''\n          fallback={<ErrorUi productName='Search Bar' />}\n          config={{\n            mode: 'light',\n            variant: 'search-bar',\n            caption: '',\n            profile: profilePicture,\n            logoutUser: logoutUser,\n            userFirstName: userName,\n            userLastName: userLastName,\n          }}\n        >\n          {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n            if (!loading && !error && !isNavbarLoaded) {\n              setIsNavbarLoaded(true);\n            }\n            return error ? (\n              <ErrorUi productName={'Search Bar'} />\n            ) : (\n              <StyledShellContainer style={{ display: loading ? 'none' : 'block', padding: '0px' }}>\n                {featureAppNode}\n              </StyledShellContainer>\n            );\n          }}\n        </SafeFeatureAppLoader>\n\n        {isNavbarLoaded && (\n          <>\n            <SafeFeatureAppLoader\n              featureAppId='fa-banner'\n              src={process.env.REACT_APP_FA_BANNER_URL + 'fa-main/main.js'}\n              moduleType=''\n              fallback={<ErrorUi productName='Banner' />}\n              config={{ appType: '', user: userName }}\n            >\n              {({\n                error,\n                featureAppNode,\n                loading,\n              }: CustomFeatureAppRenderingParams): ReactElement => {\n                return error ? (\n                  <ErrorUi productName={'Banner'} />\n                ) : (\n                  <StyledShellContainer\n                    style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                  >\n                    {featureAppNode}\n                  </StyledShellContainer>\n                );\n              }}\n            </SafeFeatureAppLoader>\n\n            <StyledAppStoreContainer>\n              <SafeFeatureAppLoader\n                featureAppId='fa-appstore'\n                src={process.env.REACT_APP_FA_APPSTORE_UR + 'fa-main/main.js'}\n                moduleType=''\n                fallback={<ErrorUi productName='App Store' />}\n                config={{ type: storeType }}\n              >\n                {({\n                  error,\n                  featureAppNode,\n                  loading,\n                }: CustomFeatureAppRenderingParams): ReactElement => {\n                  return error ? (\n                    <ErrorUi productName={'App Store'} />\n                  ) : (\n                    <StyledShellContainer\n                      style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                    >\n                      {featureAppNode}\n                    </StyledShellContainer>\n                  );\n                }}\n              </SafeFeatureAppLoader>\n            </StyledAppStoreContainer>\n          </>\n        )}\n      </StyledPageContainer>\n    </StyledAppContainer>\n  );\n};\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StepperProvider } from '../../../services/StepperContext';\nimport ErrorUi from '../../../ErrorUI/ErrorUI';\nimport { StyledShellContainer } from '../../AppStore/AppStore.style';\nimport { SafeFeatureAppLoader } from '../../../ErrorUI/SafeFeatureAppLoader';\nimport Loading from '../../Loading/Loading';\n\ntype TestAutomationProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const TestAutomation = ({ email, userFirstName }: TestAutomationProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StepperProvider>\n      <SafeFeatureAppLoader\n        featureAppId='fa-test-automation'\n        src={process.env.REACT_APP_FA_CREATE_TEST_AUTOMATION_URL + 'fa-main/main.js'}\n        moduleType=''\n        fallback={<ErrorUi productName='Create Test Automation' />}\n        config={{ email: email, userFirstName: userFirstName }}\n      >\n        {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n          return error ? (\n            <ErrorUi productName={'Create Test Automation'} />\n          ) : (\n            <>\n              <Loading isLoading={loading} />\n              <StyledShellContainer\n                style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                data-testid='fa-app-container'\n              >\n                {featureAppNode}\n              </StyledShellContainer>\n            </>\n          );\n        }}\n      </SafeFeatureAppLoader>\n    </StepperProvider>\n  </ThemeProvider>\n);\n","import styled from 'styled-components';\nimport { BaseShellContainer, BaseAppContainer } from '../shared/BaseStyles';\n\n/**\n * ProductFeatureOverview-specific styled components\n */\n\nexport const StyledShellContainer = styled(BaseShellContainer)`\n  min-height: 2.5rem;\n`;\n\nexport const StyledAppContainer = styled(BaseAppContainer)`\n  background: var(--colour-surface-full-inverse, #101315);\n`;\n\nexport const StyledContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: auto !important;\n  gap: 1.5rem;\n  flex-shrink: 0;\n  border-radius: 0;\n\n  & > * {\n    width: 100%;\n    margin-left: 0;\n    margin-right: 0;\n  }\n`;\n","import React, { ReactElement, useState } from 'react';\nimport { ThemeProvider, Container } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport {\n  StyledAppContainer,\n  StyledShellContainer,\n  StyledContainer,\n} from './ProductFeatureOverview.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype ProductFeatureOverviewProps = {\n  profilePicture: string;\n  logoutUser: () => Promise<void>;\n};\nexport const ProductFeatureOverview = ({\n  profilePicture,\n  logoutUser,\n}: ProductFeatureOverviewProps): ReactElement => {\n  const [isNavbarLoaded, setIsNavbarLoaded] = useState(false);\n\n  return (\n    <ThemeProvider mode='light' platform='core'>\n      <StyledAppContainer data-testid='product-overview-app-container'>\n        <StyledShellContainer data-testid='product-overview-shell-container'>\n          <SafeFeatureAppLoader\n            featureAppId='fa-search-bar'\n            src={process.env.REACT_APP_FA_SEARCH_BAR_URL + 'fa-main/main.js'}\n            fallback={<ErrorUi productName='Search Bar' />}\n            config={{\n              mode: 'light',\n              isSearchComplete: true,\n              caption: 'App Store',\n              profile: profilePicture,\n              logoutUser: logoutUser,\n            }}\n            moduleType=''\n          >\n            {({\n              error,\n              featureAppNode,\n              loading,\n            }: CustomFeatureAppRenderingParams): ReactElement => {\n              if (!loading && !error && !isNavbarLoaded) {\n                setIsNavbarLoaded(true);\n              }\n              return error ? (\n                <ErrorUi productName={'Search Bar'} />\n              ) : (\n                <StyledContainer style={{ display: loading ? 'none' : 'block', padding: '0px' }}>\n                  {featureAppNode}\n                </StyledContainer>\n              );\n            }}\n          </SafeFeatureAppLoader>\n\n          {isNavbarLoaded && (\n            <>\n              <SafeFeatureAppLoader\n                featureAppId='fa-product-feature-overview'\n                src={process.env.REACT_APP_FA_FEATURE_OVERVIEW_URL + 'fa-main/main.js'}\n                moduleType=''\n                fallback={<ErrorUi productName='Product Feature Name' />}\n              >\n                {({\n                  error,\n                  featureAppNode,\n                  loading,\n                }: CustomFeatureAppRenderingParams): ReactElement => {\n                  return error ? (\n                    <ErrorUi productName={'Product Feature Name'} />\n                  ) : (\n                    <Container\n                      style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                      data-testid='product-overview-container'\n                      $isFullWidth={true}\n                    >\n                      {featureAppNode}\n                    </Container>\n                  );\n                }}\n              </SafeFeatureAppLoader>\n            </>\n          )}\n        </StyledShellContainer>\n      </StyledAppContainer>\n    </ThemeProvider>\n  );\n};\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StepperProvider } from '../../../services/StepperContext';\nimport ErrorUi from '../../../ErrorUI/ErrorUI';\nimport { StyledShellContainer } from '../../AppStore/AppStore.style';\nimport { SafeFeatureAppLoader } from '../../../ErrorUI/SafeFeatureAppLoader';\nimport Loading from '../../Loading/Loading';\n\ntype MicroservicesProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const Microservices = ({ email, userFirstName }: MicroservicesProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StepperProvider>\n      <SafeFeatureAppLoader\n        featureAppId='fa-micro-services'\n        src={process.env.REACT_APP_FA_CREATE_MICRO_SERVICES_URL + 'fa-main/main.js'}\n        moduleType=''\n        fallback={<ErrorUi productName='Create Microservices' />}\n        config={{ email: email, userFirstName: userFirstName }}\n      >\n        {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n          return error ? (\n            <ErrorUi productName={'Create Microservices'} />\n          ) : (\n            <>\n              <Loading isLoading={loading} />\n              <StyledShellContainer\n                style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                data-testid='fa-app-container'\n              >\n                {featureAppNode}\n              </StyledShellContainer>\n            </>\n          );\n        }}\n      </SafeFeatureAppLoader>\n    </StepperProvider>\n  </ThemeProvider>\n);\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StepperProvider } from '../../../services/StepperContext';\nimport ErrorUi from '../../../ErrorUI/ErrorUI';\nimport { StyledShellContainer } from '../../AppStore/AppStore.style';\nimport { SafeFeatureAppLoader } from '../../../ErrorUI/SafeFeatureAppLoader';\nimport Loading from '../../Loading/Loading';\n\ntype AppFeatureProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const AppFeature = ({ email, userFirstName }: AppFeatureProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StepperProvider>\n      <SafeFeatureAppLoader\n        featureAppId='fa-app-feature'\n        src={process.env.REACT_APP_FA_CREATE_APP_FEATURE_URL + 'fa-main/main.js'}\n        moduleType=''\n        fallback={<ErrorUi productName='Create App Feature' />}\n        config={{ email: email, userFirstName: userFirstName }}\n      >\n        {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n          return error ? (\n            <ErrorUi productName={'Create App Feature'} />\n          ) : (\n            <>\n              <Loading isLoading={loading} />\n              <StyledShellContainer\n                style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                data-testid='fa-app-container'\n              >\n                {featureAppNode}\n              </StyledShellContainer>\n            </>\n          );\n        }}\n      </SafeFeatureAppLoader>\n    </StepperProvider>\n  </ThemeProvider>\n);\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StepperProvider } from '../../../services/StepperContext';\nimport ErrorUi from '../../../ErrorUI/ErrorUI';\nimport { StyledShellContainer } from '../../AppStore/AppStore.style';\nimport { SafeFeatureAppLoader } from '../../../ErrorUI/SafeFeatureAppLoader';\nimport Loading from '../../Loading/Loading';\n\ntype APIProxyProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const APIProxy = ({ email, userFirstName }: APIProxyProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StepperProvider>\n      <SafeFeatureAppLoader\n        featureAppId='fa-api-proxy'\n        src={process.env.REACT_APP_FA_CREATE_API_PROXY_URL + 'fa-main/main.js'}\n        moduleType=''\n        fallback={<ErrorUi productName='Create API Proxy' />}\n        config={{ email: email, userFirstName: userFirstName }}\n      >\n        {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n          return error ? (\n            <ErrorUi productName={'Create API Proxy'} />\n          ) : (\n            <>\n              <Loading isLoading={loading} />\n              <StyledShellContainer\n                style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                data-testid='fa-app-container'\n              >\n                {featureAppNode}\n              </StyledShellContainer>\n            </>\n          );\n        }}\n      </SafeFeatureAppLoader>\n    </StepperProvider>\n  </ThemeProvider>\n);\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StepperProvider } from '../../../services/StepperContext';\nimport ErrorUi from '../../../ErrorUI/ErrorUI';\nimport { StyledShellContainer } from '../../AppStore/AppStore.style';\nimport { SafeFeatureAppLoader } from '../../../ErrorUI/SafeFeatureAppLoader';\nimport Loading from '../../Loading/Loading';\n\ntype CustomComponentProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const CustomComponent = ({ email, userFirstName }: CustomComponentProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StepperProvider>\n      <SafeFeatureAppLoader\n        featureAppId='fa-custom-component'\n        src={process.env.REACT_APP_FA_CREATE_CUSTOM_COMPONENT_URL + 'fa-main/main.js'}\n        moduleType=''\n        fallback={<ErrorUi productName='Create Custom Component' />}\n        config={{ email: email, userFirstName: userFirstName }}\n      >\n        {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n          return error ? (\n            <ErrorUi productName={'Create Custom Component'} />\n          ) : (\n            <>\n              <Loading isLoading={loading} />\n              <StyledShellContainer\n                style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                data-testid='fa-app-container'\n              >\n                {featureAppNode}\n              </StyledShellContainer>\n            </>\n          );\n        }}\n      </SafeFeatureAppLoader>\n    </StepperProvider>\n  </ThemeProvider>\n);\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StepperProvider } from '../../../services/StepperContext';\nimport ErrorUi from '../../../ErrorUI/ErrorUI';\nimport { StyledShellContainer } from '../../AppStore/AppStore.style';\nimport { SafeFeatureAppLoader } from '../../../ErrorUI/SafeFeatureAppLoader';\nimport Loading from '../../Loading/Loading';\n\ntype AppServiceProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const AppServices = ({ email, userFirstName }: AppServiceProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StepperProvider>\n      <SafeFeatureAppLoader\n        featureAppId='fa-app-service'\n        src={process.env.REACT_APP_FA_CREATE_APP_SERVICES_URL + 'fa-main/main.js'}\n        moduleType=''\n        fallback={<ErrorUi productName='Create App Service' />}\n        config={{ email: email, userFirstName: userFirstName }}\n      >\n        {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n          return error ? (\n            <ErrorUi productName={'Create App Service'} />\n          ) : (\n            <>\n              <Loading isLoading={loading} />\n              <StyledShellContainer\n                style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                data-testid='fa-app-container'\n              >\n                {featureAppNode}\n              </StyledShellContainer>\n            </>\n          );\n        }}\n      </SafeFeatureAppLoader>\n    </StepperProvider>\n  </ThemeProvider>\n);\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StepperProvider } from '../../../services/StepperContext';\nimport ErrorUi from '../../../ErrorUI/ErrorUI';\nimport { StyledShellContainer } from '../../AppStore/AppStore.style';\nimport { SafeFeatureAppLoader } from '../../../ErrorUI/SafeFeatureAppLoader';\nimport Loading from '../../Loading/Loading';\n\ntype AppContainerProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const AppContainer = ({ email, userFirstName }: AppContainerProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StepperProvider>\n      <SafeFeatureAppLoader\n        featureAppId='fa-app-container'\n        src={process.env.REACT_APP_FA_CREATE_APP_CONTAINER_URL + 'fa-main/main.js'}\n        moduleType=''\n        fallback={<ErrorUi productName='Create App Container' />}\n        config={{ email: email, userFirstName: userFirstName }}\n      >\n        {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n          return error ? (\n            <ErrorUi productName={'Create App Container'} />\n          ) : (\n            <>\n              <Loading isLoading={loading} />\n              <StyledShellContainer\n                style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                data-testid='fa-app-container'\n              >\n                {featureAppNode}\n              </StyledShellContainer>\n            </>\n          );\n        }}\n      </SafeFeatureAppLoader>\n    </StepperProvider>\n  </ThemeProvider>\n);\n","import styled, { css } from 'styled-components';\n\nexport const ContentFrame = styled.div`\n  ${({ theme }) => css`\n    width: 100%;\n    min-height: 100vh;\n    padding: 1.5rem;\n    border-radius: 1rem;\n    background: ${theme.colors['container-bg-colour-subtle']};\n\n    @media (max-width: 768px) {\n      padding: 1rem;\n    }\n  `}\n`;\n\nexport const ContentContainer = styled.div`\n  display: flex;\n  padding: 4rem 1.5rem 1rem 4rem;\n  flex-direction: column;\n  align-items: center;\n  width: 100%;\n\n  @media (max-width: 768px) {\n    padding: 2rem 1rem;\n  }\n`;\n\nexport const StyleYellowBanner = styled.div`\n  ${({ theme: { floats } }) => {\n    const bannerImageUrl = `${process.env.REACT_APP_IMAGES_URL}Assets/Banner%20Assets/_Archive/header-banner-yellow.jpg`;\n    return css`\n      width: 100%;\n      height: 30.3125rem;\n      border-radius: ${floats['corner-radius-small']};\n      background: url(${bannerImageUrl});\n      padding: var(--padding-2xlarge, 0.5rem) var(--padding-2xlarge, 4.5rem)\n        var(--padding-2xlarge, 2.5rem) var(--padding-2xlarge, 4.5rem);\n      overflow: hidden;\n      background-size: 100%;\n      background-position: center;\n      flex-shrink: 0;\n    `;\n  }}\n`;\n\nexport const StyleYellowImage = styled.div`\n  width: 15.5rem;\n  height: 5.125rem;\n  flex-shrink: 0;\n  background: url('https://s3-alpha-sig.figma.com/img/1242/22b5/6aafa8eb21dc8e68cb3b1f0e36b28e95?Expires=1723420800&Key-Pair-Id=APKAQ4GOSFWCVNEHN3O4&Signature=RIRmWZ0wJRUEjOyq-e2zkxkusaNb-nI8GYG04zPeYvmGqfmXaqjt0rwJ1znrj5fQfklOUa9J-0b-qEZanCOMYzfPZAIlky8RljzTjq3DL4uBkYz8W0gZoFdTOVeiKLsNMEejH019yRBuyrOl-PXl06BQ-N7Y0WE0XQxvPiLQ-HRfomKjp0wu9Uc~UX8JDOqhG0KXsU09E73GCmNAF~q1UmY3YycL~PQLT7K-4AboEX6oj6EOfeT1Xb5XqbMU7ZKU5efY7X7wvLD1ORq7OGIoJtXadAKdti8qfb2mFjBLu4PQJFfiQKOvUWfl8U0Fs7Fa7Aj3WPSAa7fErO0aHdEjVg__')\n    no-repeat;\n`;\n\nexport const StyleBrowsingHome = styled.div`\n  width: 35.9375rem;\n  height: 35.8125rem;\n  flex-shrink: 0;\n  display: flex;\n  flex-direction: column;\n  margin: auto;\n  padding: var(--padding-2xlarge, 2.5rem) var(--padding-2xlarge, 1.5rem)\n    var(--padding-2xlarge, 1.5rem) var(--padding-2xlarge, 1.5rem);\n  border-radius: var(--corner-radius-small, 1rem);\n  background: var(--container-bg-colour-full, #101315);\n`;\n\nexport const StyleMicroServiceImage = styled.div`\n  ${() => {\n    const microServicesUrl = `${process.env.REACT_APP_IMAGES_URL}Assets/coming%20soon/microservice-img.png`;\n    return css`\n      width: 100%;\n      height: 30.0625rem;\n      flex-shrink: 0;\n      background: url(${microServicesUrl}) lightgray 50% / cover no-repeat;\n    `;\n  }}\n`;\n\nexport const StyleInfraAsCodeImage = styled.div`\n  ${() => {\n    const infraAsCodeUrl = `${process.env.REACT_APP_IMAGES_URL}Assets/coming%20soon/infra-as-code-img.png`;\n    return css`\n      width: 100%;\n      height: 30.0625rem;\n      flex-shrink: 0;\n      background: url(${infraAsCodeUrl}) lightgray 50% 0% / cover no-repeat;\n    `;\n  }}\n`;\n\nexport const StyleTestSuitesImage = styled.div`\n  ${() => {\n    const testSuitessUrl = `${process.env.REACT_APP_IMAGES_URL}Assets/coming%20soon/test-automation-img.png`;\n    return css`\n      width: 100%;\n      height: 30.0625rem;\n      flex-shrink: 0;\n      background: url(${testSuitessUrl}) lightgray 50% / cover no-repeat;\n    `;\n  }}\n`;\n\nexport const StyleComponentImage = styled.div`\n  ${() => {\n    const componentUrl = `${process.env.REACT_APP_IMAGES_URL}Assets/coming%20soon/components-img.jpg`;\n    return css`\n      width: 100%;\n      height: 30.0625rem;\n      flex-shrink: 0;\n      background: url(${componentUrl}) lightgray 50% calc(50% + 3.4rem) / cover no-repeat;\n    `;\n  }}\n`;\n\nexport const StyleAPIProxiesImage = styled.div`\n  ${() => {\n    const apiProxiesUrl = `${process.env.REACT_APP_IMAGES_URL}Assets/coming%20soon/api-proxy-img.png`;\n    return css`\n      width: 100%;\n      height: 30.0625rem;\n      flex-shrink: 0;\n      background: url(${apiProxiesUrl}) lightgray 50% / cover no-repeat;\n    `;\n  }}\n`;\n\nexport const StyleContentFrame2 = styled.div`\n  display: flex;\n  width: 100%;\n  padding: var(--padding-medium, 1rem) var(--padding-none, 0rem);\n  flex-direction: column;\n  align-items: center;\n`;\n\nexport const StyledTextContainer = styled.p`\n  ${({ theme }) => css`\n    display: flex;\n    width: 714px;\n    align-items: flex-start;\n    gap: 100px;\n    text-align: center;\n    ${theme.typography['body-small-regular']}\n  `}\n`;\n\nexport const StyleTitleContainer = styled.p`\n  ${({ theme }) => css`\n    color: ${theme.floats['text-embed-text-colour']};\n    text-align: center;\n    height: 0px;\n    gap: 80px;\n    ${theme.typography['display-large']};\n  `}\n`;\n\nexport const StylePadContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  align-self: stretch;\n`;\n\nexport const StyleBackButton = styled.div`\n  display: flex;\n  padding: var(--padding-2xsmall, 0.25rem);\n  align-items: center;\n  gap: var(--margin-small, 0.75rem);\n`;\n\nexport const StyleArrow = styled.div`\n  width: 1.5rem;\n  height: 1.5rem;\n  background-image: url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"%3E%3Cpath fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.2606 20.7835C9.9643 21.0722 9.48397 21.0722 9.18771 20.7835L1.2222 13.0226C0.925936 12.734 0.925936 12.266 1.2222 11.9774L9.18771 4.21649C9.48397 3.92784 9.96431 3.92784 10.2606 4.21649C10.5568 4.50514 10.5568 4.97313 10.2606 5.26178L2.83147 12.5L10.2606 19.7382C10.5568 20.0269 10.5568 20.4949 10.2606 20.7835Z\" fill=\"black\"%3E%3C/path%3E%3Cpath fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M23 12.5C23 12.9082 22.6604 13.2391 22.2414 13.2391L1.75862 13.2391C1.33965 13.2391 1 12.9082 1 12.5C1 12.0918 1.33965 11.7609 1.75862 11.7609L22.2414 11.7609C22.6604 11.7609 23 12.0918 23 12.5Z\" fill=\"black\"%3E%3C/path%3E%3C/svg%3E');\n`;\n\nexport const StyleDashboardLabel = styled.div`\n  ${({ theme }) => css`\n    display: flex;\n    width: 5.5rem;\n    align-items: flex-start;\n    gap: 0.625rem;\n    ${theme.typography['label-small-regular']}\n  `}\n`;\n","import React, { ReactElement } from 'react';\nimport {\n  StyledTextContainer,\n  StyleTitleContainer,\n  StylePadContainer,\n  StyleYellowBanner,\n  StyleYellowImage,\n  StyleBrowsingHome,\n  StyleMicroServiceImage,\n  StyleContentFrame2,\n  StyleBackButton,\n  StyleDashboardLabel,\n  StyleArrow,\n  ContentFrame,\n  ContentContainer,\n  StyleAPIProxiesImage,\n  StyleComponentImage,\n  StyleTestSuitesImage,\n} from '../ComingSoon/ComingSoon.style';\nimport { Link, useLocation } from 'react-router-dom';\n\nconst componentMap: Record<string, React.ComponentType> = {\n  '/api-proxies/coming-soon/page': StyleAPIProxiesImage,\n  '/micro-services/coming-soon/page': StyleMicroServiceImage,\n  '/custom-component/coming-soon/page': StyleComponentImage,\n  '/test-suites/coming-soon/page': StyleTestSuitesImage,\n};\n\nconst ComingSoon = (): ReactElement => {\n  const { pathname } = useLocation();\n\n  const ComponentToRender = componentMap[pathname] || StyledTextContainer;\n\n  return (\n    <ContentFrame>\n      <ContentContainer>\n        <StyleYellowBanner>\n          <StyleYellowImage />\n          <StyleBrowsingHome>\n            {/* 3. Render it directly */}\n            <ComponentToRender />\n          </StyleBrowsingHome>\n        </StyleYellowBanner>\n        <StylePadContainer>\n          <StyleContentFrame2>\n            <StyleTitleContainer>Coming Soon</StyleTitleContainer>\n            <StyledTextContainer>\n              We&apos;re busy crafting something amazing to display all the efficient solutions that\n              our team has been creating via the kente platform. Watch the space for updates!\n            </StyledTextContainer>\n          </StyleContentFrame2>\n          <Link to='/dashboard' style={{ textDecoration: 'none', color: 'inherit' }}>\n            <StyleBackButton>\n              <StyleArrow />\n              <StyleDashboardLabel> Dashboard</StyleDashboardLabel>\n            </StyleBackButton>\n          </Link>\n        </StylePadContainer>\n      </ContentContainer>\n    </ContentFrame>\n  );\n};\n\nexport default ComingSoon;\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport {\n  StyledAppContainer,\n  StyledShellContainer,\n  StyledPageContainer,\n} from '../Dashboard/Dashboard.style';\nimport ComingSoon from '../ComingSoon/ComingSoon';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype APIProxiesProps = {\n  userName?: string;\n  userLastName?: string;\n  profilePicture?: string;\n  logoutUser?: () => Promise<void>;\n};\n\nexport const APIProxies = ({\n  userName = '',\n  userLastName = '',\n  profilePicture = '',\n  logoutUser,\n}: APIProxiesProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StyledAppContainer data-testid='apiproxies-app-container'>\n      <StyledPageContainer>\n        <SafeFeatureAppLoader\n          featureAppId='fa-search-bar'\n          src={process.env.REACT_APP_FA_SEARCH_BAR_URL + 'fa-main/main.js'}\n          moduleType=''\n          fallback={<ErrorUi productName='Search Bar' />}\n          config={{\n            mode: 'light',\n            variant: 'search-bar',\n            caption: '',\n            profile: profilePicture,\n            logoutUser: logoutUser,\n            userFirstName: userName,\n            userLastName: userLastName,\n          }}\n        >\n          {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n            return error ? (\n              <ErrorUi productName={'Search Bar'} />\n            ) : (\n              <StyledShellContainer style={{ display: loading ? 'none' : 'block', padding: '0px' }}>\n                {featureAppNode}\n              </StyledShellContainer>\n            );\n          }}\n        </SafeFeatureAppLoader>\n        <ComingSoon />\n      </StyledPageContainer>\n    </StyledAppContainer>\n  </ThemeProvider>\n);\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport {\n  StyledAppContainer,\n  StyledShellContainer,\n  StyledPageContainer,\n} from '../Dashboard/Dashboard.style';\nimport ComingSoon from '../ComingSoon/ComingSoon';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype TestSuitesProps = {\n  userName?: string;\n  userLastName?: string;\n  profilePicture?: string;\n  logoutUser?: () => Promise<void>;\n};\n\nexport const TestSuites = ({\n  userName = '',\n  userLastName = '',\n  profilePicture = '',\n  logoutUser,\n}: TestSuitesProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StyledAppContainer data-testid='testsuites-app-container'>\n      <StyledPageContainer>\n        <SafeFeatureAppLoader\n          featureAppId='fa-search-bar'\n          src={process.env.REACT_APP_FA_SEARCH_BAR_URL + 'fa-main/main.js'}\n          moduleType=''\n          fallback={<ErrorUi productName='Search Bar' />}\n          config={{\n            mode: 'light',\n            variant: 'search-bar',\n            caption: '',\n            profile: profilePicture,\n            logoutUser: logoutUser,\n            userFirstName: userName,\n            userLastName: userLastName,\n          }}\n        >\n          {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n            return error ? (\n              <ErrorUi productName={'Search Bar'} />\n            ) : (\n              <StyledShellContainer style={{ display: loading ? 'none' : 'block', padding: '0px' }}>\n                {featureAppNode}\n              </StyledShellContainer>\n            );\n          }}\n        </SafeFeatureAppLoader>\n        <ComingSoon />\n      </StyledPageContainer>\n    </StyledAppContainer>\n  </ThemeProvider>\n);\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport {\n  StyledAppContainer,\n  StyledShellContainer,\n  StyledPageContainer,\n} from '../Dashboard/Dashboard.style';\nimport ComingSoon from '../ComingSoon/ComingSoon';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype ComponentProps = {\n  userName?: string;\n  userLastName?: string;\n  profilePicture?: string;\n  logoutUser?: () => Promise<void>;\n};\n\nexport const Component = ({\n  userName = '',\n  userLastName = '',\n  profilePicture = '',\n  logoutUser,\n}: ComponentProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StyledAppContainer data-testid='component-app-container'>\n      <StyledPageContainer>\n        <SafeFeatureAppLoader\n          featureAppId='fa-search-bar'\n          src={process.env.REACT_APP_FA_SEARCH_BAR_URL + 'fa-main/main.js'}\n          moduleType=''\n          fallback={<ErrorUi productName='Search Bar' />}\n          config={{\n            mode: 'light',\n            variant: 'search-bar',\n            caption: '',\n            profile: profilePicture,\n            logoutUser: logoutUser,\n            userFirstName: userName,\n            userLastName: userLastName,\n          }}\n        >\n          {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n            return error ? (\n              <ErrorUi productName={'Search Bar'} />\n            ) : (\n              <StyledShellContainer style={{ display: loading ? 'none' : 'block', padding: '0px' }}>\n                {featureAppNode}\n              </StyledShellContainer>\n            );\n          }}\n        </SafeFeatureAppLoader>\n        <ComingSoon />\n      </StyledPageContainer>\n    </StyledAppContainer>\n  </ThemeProvider>\n);\n","import styled from 'styled-components';\nimport { BaseShellContainer, BaseAppContainer, BodyLayoutContainer } from '../shared/BaseStyles';\n\n/**\n * InfraAsCode-specific styled components\n * Background and spacing managed by base styles\n */\n\nexport const StyledShellContainer = styled(BaseShellContainer)`\n  overflow: hidden;\n`;\n\nexport const StyledPageContainer = styled(BodyLayoutContainer)``;\n\nexport const StyledAppContainer = styled(BaseAppContainer)`\n  min-height: 100vh;\n`;\n\n/** @deprecated Use StyledPageContainer instead */\nexport const StyledContainer = styled.div`\n  display: flex;\n  width: 100%;\n  padding: var(--padding-large, 24px);\n  justify-content: space-between;\n  align-items: flex-start;\n  flex-direction: row;\n\n  @media (max-width: 768px) {\n    padding: var(--padding-medium, 16px);\n    flex-direction: column;\n  }\n`;\n\nexport const StyledAppStoreContainer = styled.div`\n  display: flex;\n  width: 100%;\n  min-height: 100%;\n  padding: var(--padding-large, 24px);\n  align-items: flex-start;\n  align-content: flex-start;\n  gap: var(--margin-medium, 16px);\n  flex-wrap: wrap;\n  border-radius: var(--corner-radius-small, 16px);\n\n  @media (max-width: 768px) {\n    padding: var(--padding-medium, 16px);\n  }\n`;\n","import React, { ReactElement, useState } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StyledAppContainer, StyledPageContainer, StyledShellContainer } from './InfraAsCode.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype InfraAsCodeProps = {\n  profilePicture: string;\n  logoutUser: () => Promise<void>;\n};\nexport const InfraAsCode = ({ profilePicture, logoutUser }: InfraAsCodeProps): ReactElement => {\n  const [isNavbarLoaded, setIsNavbarLoaded] = useState(false);\n\n  return (\n    <ThemeProvider mode='light' platform='core'>\n      <StyledAppContainer data-testid='appstore-app-container'>\n        <StyledPageContainer data-testid='appstore-shell-container'>\n          <SafeFeatureAppLoader\n            featureAppId='fa-search-bar'\n            src={process.env.REACT_APP_FA_SEARCH_BAR_URL + 'fa-main/main.js'}\n            fallback={<ErrorUi productName='Search Bar' />}\n            config={{\n              mode: 'light',\n              variant: 'search-bar',\n              caption: '',\n              profile: profilePicture,\n              logoutUser: logoutUser,\n            }}\n            moduleType=''\n          >\n            {({\n              error,\n              featureAppNode,\n              loading,\n            }: CustomFeatureAppRenderingParams): ReactElement => {\n              if (!loading && !error && !isNavbarLoaded) {\n                setIsNavbarLoaded(true);\n              }\n              return error ? (\n                <ErrorUi productName={'Search Bar'} />\n              ) : (\n                <StyledShellContainer\n                  style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                >\n                  {featureAppNode}\n                </StyledShellContainer>\n              );\n            }}\n          </SafeFeatureAppLoader>\n\n          {isNavbarLoaded && (\n            <>\n              <SafeFeatureAppLoader\n                featureAppId='fa-banner'\n                src={process.env.REACT_APP_FA_BANNER_URL + 'fa-main/main.js'}\n                moduleType=''\n                fallback={<ErrorUi productName='Banner' />}\n                config={{ appType: '' }}\n              >\n                {({\n                  error,\n                  featureAppNode,\n                  loading,\n                }: CustomFeatureAppRenderingParams): ReactElement => {\n                  return error ? (\n                    <ErrorUi productName={'Banner'} />\n                  ) : (\n                    <StyledShellContainer\n                      style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                    >\n                      {featureAppNode}\n                    </StyledShellContainer>\n                  );\n                }}\n              </SafeFeatureAppLoader>\n\n              <SafeFeatureAppLoader\n                featureAppId='fa-infraascode'\n                src={process.env.REACT_APP_FA_INFRA_AS_CODE_URL + 'fa-main/main.js'}\n                moduleType=''\n                fallback={<ErrorUi productName='Infra-As-Code' />}\n                config={{\n                  NoAppsFoundConfig: {\n                    RenderButton: true,\n                    Title: 'No apps published yet',\n                    Description:\n                      'When something has been created & published you will see it here.',\n                    ButtonText: 'Create Item',\n                  },\n                }}\n              >\n                {({\n                  error,\n                  featureAppNode,\n                  loading,\n                }: CustomFeatureAppRenderingParams): ReactElement => {\n                  return error ? (\n                    <ErrorUi productName={'Infra-As-Code'} />\n                  ) : (\n                    <StyledShellContainer\n                      style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                    >\n                      {featureAppNode}\n                    </StyledShellContainer>\n                  );\n                }}\n              </SafeFeatureAppLoader>\n            </>\n          )}\n        </StyledPageContainer>\n      </StyledAppContainer>\n    </ThemeProvider>\n  );\n};\n","import React, { ReactElement, useState } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport {\n  StyledAppContainer,\n  StyledShellContainer,\n  StyledPageContainer,\n} from '../Dashboard/Dashboard.style';\nimport ComingSoon from '../ComingSoon/ComingSoon';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype MicroServiceProps = {\n  userName?: string;\n  userLastName?: string;\n  profilePicture?: string;\n  logoutUser?: () => Promise<void>;\n};\n\nexport const MicroService = ({\n  userName = '',\n  userLastName = '',\n  profilePicture = '',\n  logoutUser,\n}: MicroServiceProps): ReactElement => {\n  const [isNavbarLoaded, setIsNavbarLoaded] = useState(false);\n\n  return (\n    <ThemeProvider mode='light' platform='core'>\n      <StyledAppContainer data-testid='microservice-app-container'>\n        <StyledPageContainer>\n          <SafeFeatureAppLoader\n            featureAppId='fa-search-bar'\n            src={process.env.REACT_APP_FA_SEARCH_BAR_URL + 'fa-main/main.js'}\n            moduleType=''\n            fallback={<ErrorUi productName='Search Bar' />}\n            config={{\n              mode: 'light',\n              variant: 'search-bar',\n              caption: '',\n              profile: profilePicture,\n              logoutUser: logoutUser,\n              userFirstName: userName,\n              userLastName: userLastName,\n            }}\n          >\n            {({\n              error,\n              featureAppNode,\n              loading,\n            }: CustomFeatureAppRenderingParams): ReactElement => {\n              if (!loading && !error && !isNavbarLoaded) {\n                setIsNavbarLoaded(true);\n              }\n              return error ? (\n                <ErrorUi productName={'Search Bar'} />\n              ) : (\n                <StyledShellContainer\n                  style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                >\n                  {featureAppNode}\n                </StyledShellContainer>\n              );\n            }}\n          </SafeFeatureAppLoader>\n\n          {isNavbarLoaded && (\n            <>\n              <ComingSoon />\n            </>\n          )}\n        </StyledPageContainer>\n      </StyledAppContainer>\n    </ThemeProvider>\n  );\n};\n","import styled from 'styled-components';\nimport { BaseShellContainer, BaseAppContainer, BodyLayoutContainer } from '../shared/BaseStyles';\n\n/**\n * SearchResults-specific styled components\n * Background and spacing managed by base styles\n */\n\nexport const StyledShellContainer = styled(BaseShellContainer)``;\n\nexport const StyledPageContainer = styled(BodyLayoutContainer)``;\n\nexport const StyledAppContainer = styled(BaseAppContainer)``;\n\nexport const SearchResultsContainer = styled.div`\n  display: flex;\n  width: 100%;\n  min-height: 100%;\n  align-items: flex-start;\n  align-content: flex-start;\n  gap: var(--margin-medium, 16px);\n  flex-wrap: wrap;\n`;\n","import React, { ReactElement, useState } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport {\n  StyledAppContainer,\n  StyledPageContainer,\n  StyledShellContainer,\n  SearchResultsContainer,\n} from './SearchResults.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype SearchResultsProps = {\n  profilePicture: string;\n  userFirstName: string;\n  userLastName: string;\n  logoutUser: () => Promise<void>;\n};\nconst SearchResults = ({\n  userFirstName,\n  userLastName,\n  profilePicture,\n  logoutUser,\n}: SearchResultsProps): ReactElement => {\n  const [isNavbarLoaded, setIsNavbarLoaded] = useState(false);\n\n  return (\n    <ThemeProvider mode='light' platform='core'>\n      <StyledAppContainer data-testid='search-results-app-container'>\n        <StyledPageContainer data-testid='search-results-shell-container'>\n          <SafeFeatureAppLoader\n            featureAppId='fa-search-bar'\n            src={process.env.REACT_APP_FA_SEARCH_BAR_URL + 'fa-main/main.js'}\n            moduleType=''\n            fallback={<ErrorUi productName='Search Bar' />}\n            config={{\n              mode: 'light',\n              variant: 'search-bar',\n              isSearchComplete: true,\n              caption: '',\n              profile: profilePicture,\n              logoutUser: logoutUser,\n              userFirstName: userFirstName,\n              userLastName: userLastName,\n            }}\n          >\n            {({\n              error,\n              featureAppNode,\n              loading,\n            }: CustomFeatureAppRenderingParams): ReactElement => {\n              if (!loading && !error && !isNavbarLoaded) {\n                setIsNavbarLoaded(true);\n              }\n              return error ? (\n                <ErrorUi productName={'Search Bar'} />\n              ) : (\n                <StyledShellContainer\n                  style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                >\n                  {featureAppNode}\n                </StyledShellContainer>\n              );\n            }}\n          </SafeFeatureAppLoader>\n\n          {isNavbarLoaded && (\n            <SearchResultsContainer>\n              <SafeFeatureAppLoader\n                featureAppId='fa-search-results'\n                src={process.env.REACT_APP_FA_SEARCH_RESULTS_URL + 'fa-main/main.js'}\n                moduleType=''\n                fallback={<ErrorUi productName='Search Results' />}\n                config={{ data: 'Hello World from the Kente Platform' }}\n              >\n                {({\n                  error,\n                  featureAppNode,\n                  loading,\n                }: CustomFeatureAppRenderingParams): ReactElement => {\n                  return error ? (\n                    <ErrorUi productName={'Search Results'} />\n                  ) : (\n                    <StyledShellContainer\n                      style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                    >\n                      {featureAppNode}\n                    </StyledShellContainer>\n                  );\n                }}\n              </SafeFeatureAppLoader>\n            </SearchResultsContainer>\n          )}\n        </StyledPageContainer>\n      </StyledAppContainer>\n    </ThemeProvider>\n  );\n};\n\nexport default SearchResults;\n","import styled from 'styled-components';\n\nexport const StyledTitlebarContainer = styled.div`\n  display: flex;\n  width: 100%;\n  padding: 1.5rem;\n  align-items: center;\n  flex-shrink: 0;\n  justify-content: space-between;\n`;\n\nexport const StyledIconContainer = styled.div`\n  display: flex;\n  padding-right: 0.75rem;\n  align-items: center;\n  gap: 0.75rem;\n  width: fit-content;\n  cursor: pointer;\n  ${({ theme }) => theme.typography['label-large-regular-title-case']};\n`;\n\nexport const StyledRighIconContainer = styled.div`\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  gap: 1rem;\n`;\n\nexport const StyledBack = styled.div`\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  gap: 1rem;\n`;\n","import React, { ReactElement, useCallback } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport {\n  StyledAppContainer,\n  StyledPageContainer,\n  StyledShellContainer,\n} from '../Dashboard/Dashboard.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { Avatar } from '@mtnkente/paragon-display';\nimport ChevronLeft from '@mtnkente/paragon-icons/ChevronLeft';\nimport { Divider } from '@mtnkente/paragon-layouts';\nimport {\n  StyledIconContainer,\n  StyledRighIconContainer,\n  StyledTitlebarContainer,\n  StyledBack,\n} from '../ProfileManagement/ProfileManagement.style';\nimport { NavigationServiceV1 } from '../../services/NavigationService';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype ProfileProps = {\n  profilePicture: string;\n  userFirstName: string;\n  userLastName: string;\n  email: string;\n  logoutUser: () => Promise<void>;\n  navigationService: NavigationServiceV1;\n};\n\nexport const Profile = ({\n  userFirstName,\n  userLastName,\n  profilePicture,\n  email,\n  navigationService, // Destructured this to use in handleBack\n}: ProfileProps): ReactElement => {\n  const handleBack = useCallback((): void => {\n    navigationService.history.back();\n  }, [navigationService]);\n\n  return (\n    <ThemeProvider mode='light' platform='core'>\n      <StyledAppContainer data-testid='profile-app-container'>\n        <StyledPageContainer data-testid='profile-shell-container'>\n          <StyledTitlebarContainer data-testid='back'>\n            <StyledIconContainer>\n              <ChevronLeft style={{ color: 'white', width: '1.5rem', height: '1.5rem' }} />\n              <StyledBack style={{ color: 'white' }} onClick={handleBack}>\n                Back\n              </StyledBack>\n            </StyledIconContainer>\n            <StyledRighIconContainer>\n              <Divider orientation='horizontal' $variant='subtle' $isInverted />\n              <Avatar\n                image={profilePicture || ''}\n                size='40x40'\n                initials={(userFirstName?.charAt(0) || '') + (userLastName?.charAt(0) || '')}\n              />\n            </StyledRighIconContainer>\n          </StyledTitlebarContainer>\n\n          <SafeFeatureAppLoader\n            featureAppId='fa-banner'\n            src={`${process.env.REACT_APP_FA_BANNER_URL}fa-main/main.js`}\n            moduleType=''\n            fallback={<ErrorUi productName='Banner' />}\n            config={{\n              appType: 'profile',\n              userFirstName: userFirstName,\n              userLastName: userLastName,\n              profilePicture: profilePicture,\n            }}\n          >\n            {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement =>\n              error ? (\n                <ErrorUi productName='Banner' />\n              ) : (\n                <StyledShellContainer\n                  style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                  data-testid='fa-app-container'\n                >\n                  {featureAppNode}\n                </StyledShellContainer>\n              )\n            }\n          </SafeFeatureAppLoader>\n\n          <SafeFeatureAppLoader\n            featureAppId='fa-profile'\n            src={`${process.env.REACT_APP_FA_PROFILE_URL}fa-main/main.js`}\n            moduleType=''\n            fallback={<ErrorUi productName='Profile' />}\n            config={{ userName: userFirstName, email: email }}\n          >\n            {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement =>\n              error ? (\n                <ErrorUi productName='Profile' />\n              ) : (\n                <StyledShellContainer\n                  style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                  data-testid='fa-app-container'\n                >\n                  {featureAppNode}\n                </StyledShellContainer>\n              )\n            }\n          </SafeFeatureAppLoader>\n        </StyledPageContainer>\n      </StyledAppContainer>\n    </ThemeProvider>\n  );\n};\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\n// Styled components\nconst ErrorWrapper = styled.div`\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  height: 100vh;\n  text-align: center;\n  background-color: #f8f8f8;\n`;\n\nconst ErrorTitle = styled.h1`\n  font-size: 72px;\n  margin: 0;\n  color: #ff4d4f;\n`;\n\nconst ErrorMessage = styled.p`\n  font-size: 24px;\n  color: #333;\n`;\n\nconst HomeLink = styled(Link)`\n  margin-top: 20px;\n  font-size: 18px;\n  color: #007bff;\n  text-decoration: underline;\n  cursor: pointer;\n\n  &:hover {\n    color: #0056b3;\n  }\n`;\n\nconst Error404: React.FC = () => {\n  return (\n    <ErrorWrapper>\n      <ErrorTitle>404</ErrorTitle>\n      <ErrorMessage>Oops! The page you&apos;re looking for doesn&apos;t exist.</ErrorMessage>\n      <HomeLink to='/dashboard'>Go back to Home</HomeLink>\n    </ErrorWrapper>\n  );\n};\n\nexport default Error404;\n","import styled from 'styled-components';\nimport { BaseShellContainer, BaseAppContainer, BodyLayoutContainer } from '../shared/BaseStyles';\n\n/**\n * InfraAsCodeDetails-specific styled components\n * Background and spacing managed by base styles\n */\n\nexport const StyledShellContainer = styled(BaseShellContainer)`\n  overflow: hidden;\n`;\n\nexport const StyledPageContainer = styled(BodyLayoutContainer)`\n  overflow-y: auto;\n  scroll-behavior: smooth;\n`;\n\nexport const StyledAppContainer = styled(BaseAppContainer)`\n  min-height: 100vh;\n`;\n\n/** @deprecated Use StyledPageContainer instead */\nexport const StyledContainer = styled.div`\n  display: flex;\n  width: 100%;\n  padding: var(--padding-large, 24px);\n  justify-content: space-between;\n  align-items: flex-start;\n  flex-direction: row;\n\n  @media (max-width: 768px) {\n    padding: var(--padding-medium, 16px);\n    flex-direction: column;\n  }\n`;\n\nexport const StyledAppStoreContainer = styled.div`\n  display: flex;\n  width: 100%;\n  min-height: 100%;\n  padding: var(--padding-large, 24px);\n  align-items: flex-start;\n  align-content: flex-start;\n  gap: var(--margin-medium, 16px);\n  flex-wrap: wrap;\n  border-radius: var(--corner-radius-small, 16px);\n\n  @media (max-width: 768px) {\n    padding: var(--padding-medium, 16px);\n  }\n`;\n","import React, { ReactElement } from 'react';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StyledShellContainer } from '../InfraAsCodeDetails/InfraAsCodeDetails.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { StepperProvider } from '../../services/StepperContext';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype InfraAsCodeProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const CreateStandaloneWebApp = ({\n  email,\n  userFirstName,\n}: InfraAsCodeProps): ReactElement => (\n  <StepperProvider>\n    <SafeFeatureAppLoader\n      featureAppId='fa-infra-as-code'\n      src={process.env.REACT_APP_FA_CREATE_STANDALONE_WEB_APP + 'fa-main/main.js'}\n      moduleType=''\n      fallback={<ErrorUi productName='Create Infra-as-code' />}\n      config={{ email: email, userFirstName: userFirstName }}\n    >\n      {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n        return error ? (\n          <ErrorUi productName={'Create Infra-as-code'} />\n        ) : (\n          <StyledShellContainer\n            style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n            data-testid='fa-app-container'\n          >\n            {featureAppNode}\n          </StyledShellContainer>\n        );\n      }}\n    </SafeFeatureAppLoader>\n  </StepperProvider>\n);\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StyledShellContainer } from '../InfraAsCodeDetails/InfraAsCodeDetails.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { StepperProvider } from '../../services/StepperContext';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype InfraAsCodeProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const CreateServerlessMicroservice = ({\n  email,\n  userFirstName,\n}: InfraAsCodeProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StepperProvider>\n      <SafeFeatureAppLoader\n        featureAppId='fa-infra-as-code'\n        src={process.env.REACT_APP_FA_CREATE_SERVERLESS_MICROSERVICE + 'fa-main/main.js'}\n        moduleType=''\n        fallback={<ErrorUi productName='Create Infra-as-code' />}\n        config={{ email: email, userFirstName: userFirstName }}\n      >\n        {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n          return error ? (\n            <ErrorUi productName={'Create Infra-as-code'} />\n          ) : (\n            <StyledShellContainer\n              style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n              data-testid='fa-app-container'\n            >\n              {featureAppNode}\n            </StyledShellContainer>\n          );\n        }}\n      </SafeFeatureAppLoader>\n    </StepperProvider>\n  </ThemeProvider>\n);\n","import styled, { css } from 'styled-components';\n\nexport const Overlay = styled.div`\n  ${({ theme: { colors } }) => {\n    return css`\n      display: flex;\n      position: fixed;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      justify-content: center;\n      align-items: center;\n      background: ${colors['colour-opacity-higher-inverse']};\n      z-index: 1050;\n    `;\n  }}\n`;\n\nexport const Modal = styled.div`\n  ${({ theme: { floats } }) => {\n    return css`\n      display: flex;\n      width: 508px;\n      padding: ${floats['padding-2xlarge']};\n      flex-direction: column;\n      align-items: flex-start;\n      gap: ${floats['padding-large']};\n      z-index: 11;\n\n      border-radius: ${floats['corner-radius-small']};\n      background: #fff;\n      box-shadow: 0px var(--shadow-level-3-y, 16px) var(--shadow-level-3-blur, 24px)\n        var(--shadow-level-3-spread, 4px) var(--shadow-level-3-colour, rgba(0, 0, 0, 0.08));\n    `;\n  }}\n`;\n","import React, { useEffect, useState, useCallback, ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { Text } from '@mtnkente/paragon-display';\nimport { Overlay, Modal } from './LogoutModal.styled';\nimport { StandardButton, ComboButtons } from '@mtnkente/paragon-buttons';\nimport { ModalProps } from '../../types/logout-modal.types';\n\nfunction formatTime(time: number): string {\n  const minutes = Math.floor(time / 60);\n  const seconds = time % 60;\n  return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n}\n\nconst LogoutModal: React.FC<ModalProps> = ({\n  onContinue,\n  onLogout,\n  timeRemaining,\n}): ReactElement | null => {\n  const [close, setClose] = useState(false);\n  const [timeLeft, setTimeLeft] = useState(timeRemaining);\n\n  useEffect((): void | (() => void) => {\n    // Explicit check to return void if no interval is needed\n    if (close || timeLeft <= 0) {\n      return;\n    }\n\n    const intervalId = setInterval(() => {\n      setTimeLeft((prev) => {\n        const newTime = prev - 1;\n\n        if (newTime <= 0) {\n          clearInterval(intervalId);\n          onLogout().catch(console.error);\n          setClose(true);\n        }\n        return newTime;\n      });\n    }, 1000);\n\n    return (): void => {\n      clearInterval(intervalId);\n    };\n  }, [close, onLogout, timeLeft]);\n\n  const handleStayLoggedIn = useCallback(\n    function stayLoggedIn(): void {\n      setClose(true);\n      onContinue();\n    },\n    [onContinue]\n  );\n\n  const handleLogoutNow = useCallback(\n    function logoutNow(): void {\n      setClose(true);\n      onLogout().catch(console.error);\n    },\n    [onLogout]\n  );\n\n  if (close) {\n    return null;\n  }\n\n  return (\n    <ThemeProvider mode='light' platform='core'>\n      <Overlay>\n        <Modal>\n          <Text $fontStyle='title-small-bold'>Are you still there?</Text>\n          <Text $fontStyle='body-large-regular'>\n            For your security, your session will automatically log out in{' '}\n            <b>{formatTime(timeLeft)}</b>\n          </Text>\n          <div>\n            <ComboButtons>\n              <StandardButton\n                $variant='primary'\n                label='Stay Logged In'\n                onClick={handleStayLoggedIn}\n              />\n              <StandardButton $variant='secondary' label='Log Out Now' onClick={handleLogoutNow} />\n            </ComboButtons>\n          </div>\n        </Modal>\n      </Overlay>\n    </ThemeProvider>\n  );\n};\n\nexport default LogoutModal;\n","import React, {\n  createContext,\n  useContext,\n  useEffect,\n  useState,\n  useCallback,\n  ReactElement,\n  ReactNode,\n} from 'react';\nimport LogoutModal from '../components/LogoutModal/LogoutModal';\nimport { useAuthLoginProvider } from '@mtnkente/authentication';\nimport { authConfig } from '../../utilities/authconfig';\n\ndeclare global {\n  interface Window {\n    inactivityTimeout: ReturnType<typeof setTimeout>;\n    idleTimer: ReturnType<typeof setTimeout>;\n    warningTimer: ReturnType<typeof setInterval>;\n  }\n}\n\ninterface UserActivityContextProps {\n  logoutUser: () => Promise<void>;\n  children?: ReactNode;\n}\n\ninterface ProviderProps {\n  children: ReactNode;\n  logoutUser: () => Promise<void>;\n}\n\nconst UserActivityContext = createContext<UserActivityContextProps | undefined>(undefined);\n\nexport const UserActivityProvider = ({ children, logoutUser }: ProviderProps): ReactElement => {\n  const { isAuthenticated } = useAuthLoginProvider(authConfig);\n\n  const [isInactive, setIsInactive] = useState(false);\n  const [timeRemaining, setTimeRemaining] = useState(300);\n  const idleTimeout = 600000;\n\n  // Fix for: Missing return type & jsx-no-bind\n  const handleLogout = useCallback(async (): Promise<void> => {\n    await logoutUser();\n  }, [logoutUser]);\n\n  const resetActivity = useCallback((): void => {\n    if (isInactive) return;\n\n    clearTimeout(window.idleTimer);\n    clearInterval(window.warningTimer);\n    setIsInactive(false);\n    setTimeRemaining(300);\n\n    if (isAuthenticated) {\n      window.idleTimer = setTimeout(() => setIsInactive(true), idleTimeout);\n    }\n  }, [idleTimeout, isInactive, isAuthenticated]);\n\n  // Fix for: Missing return type & jsx-no-bind\n  const handleContinueSession = useCallback((): void => {\n    clearTimeout(window.idleTimer);\n    clearInterval(window.warningTimer);\n    setIsInactive(false);\n    setTimeRemaining(300);\n\n    if (isAuthenticated) {\n      window.idleTimer = setTimeout(() => setIsInactive(true), idleTimeout);\n    }\n  }, [isAuthenticated, idleTimeout]);\n\n  useEffect((): (() => void) | void => {\n    if (!isAuthenticated) return;\n\n    const activityEvents = ['mousemove', 'mousedown', 'keypress', 'scroll', 'touchstart'];\n    activityEvents.forEach((event) => window.addEventListener(event, resetActivity));\n\n    window.idleTimer = setTimeout(() => setIsInactive(true), idleTimeout);\n\n    return (): void => {\n      clearTimeout(window.idleTimer);\n      clearInterval(window.warningTimer);\n      activityEvents.forEach((event) => window.removeEventListener(event, resetActivity));\n    };\n  }, [resetActivity, isAuthenticated, idleTimeout]);\n\n  useEffect((): (() => void) | void => {\n    if (isInactive && isAuthenticated) {\n      window.warningTimer = setInterval((): void => {\n        setTimeRemaining((prev) => Math.max(0, prev - 1));\n      }, 1000);\n    }\n\n    return (): void => {\n      clearInterval(window.warningTimer);\n    };\n  }, [isInactive, isAuthenticated]);\n\n  useEffect((): void => {\n    if (isInactive && timeRemaining <= 0) {\n      handleLogout().catch(console.error);\n    }\n  }, [isInactive, timeRemaining, handleLogout]);\n\n  // Memoize context value to prevent re-renders of all consumers\n  const contextValue = React.useMemo(\n    () => ({\n      logoutUser: handleLogout,\n    }),\n    [handleLogout]\n  );\n\n  return (\n    <UserActivityContext.Provider value={contextValue}>\n      {children}\n      {isInactive && (\n        <LogoutModal\n          onContinue={handleContinueSession}\n          onLogout={handleLogout}\n          timeRemaining={timeRemaining}\n        />\n      )}\n    </UserActivityContext.Provider>\n  );\n};\n\nexport const useUserActivity = (): UserActivityContextProps => {\n  const context = useContext(UserActivityContext);\n  if (!context) {\n    throw new Error('useUserActivity must be used within a UserActivityProvider');\n  }\n  return context;\n};\n","import React, { ReactElement, useEffect } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport {\n  StyledAppContainer,\n  StyledPageContainer,\n  StyledShellContainer,\n} from './InfraAsCodeDetails.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\nexport const InfraAsCodeDetails = (): ReactElement => {\n  useEffect(() => {\n    window.scrollTo({ top: 0, behavior: 'auto' });\n  }, []);\n\n  return (\n    <ThemeProvider mode='light' platform='core'>\n      <StyledAppContainer data-testid='appstore-app-container'>\n        <StyledPageContainer data-testid='appstore-shell-container'>\n          <SafeFeatureAppLoader\n            featureAppId='fa-infrastructure-as-code-details'\n            src={process.env.REACT_APP_FA_INFRA_AS_CODE_DETAILS_URL + 'fa-main/main.js'}\n            moduleType=''\n            fallback={<ErrorUi productName='Infrastructure-As-Code-Details' />}\n            config={{\n              NoAppsFoundConfig: {\n                RenderButton: true,\n                Title: 'No apps published yet',\n                Description: 'When something has been create & published you will see it here.',\n                ButtonText: 'Create Item',\n              },\n            }}\n          >\n            {({\n              error,\n              featureAppNode,\n              loading,\n            }: CustomFeatureAppRenderingParams): ReactElement => {\n              return error ? (\n                <ErrorUi productName={'Infrastructure-As-Code-Details'} />\n              ) : (\n                <StyledShellContainer\n                  style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                >\n                  {featureAppNode}\n                </StyledShellContainer>\n              );\n            }}\n          </SafeFeatureAppLoader>\n        </StyledPageContainer>\n      </StyledAppContainer>\n    </ThemeProvider>\n  );\n};\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StyledShellContainer } from '../InfraAsCodeDetails/InfraAsCodeDetails.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { StepperProvider } from '../../services/StepperContext';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\ntype InfraAsCodeProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const CreateWebAppServerlessMicro = ({\n  email,\n  userFirstName,\n}: InfraAsCodeProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StepperProvider>\n      <SafeFeatureAppLoader\n        featureAppId='fa-infra-as-code'\n        src={process.env.REACT_APP_FA_WEB_APPLICATION_SERVERLESS_MICRO + 'fa-main/main.js'}\n        moduleType=''\n        fallback={<ErrorUi productName='Create Infra-as-code' />}\n        config={{ email: email, userFirstName: userFirstName }}\n      >\n        {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n          return error ? (\n            <ErrorUi productName={'Create Infra-as-code'} />\n          ) : (\n            <StyledShellContainer\n              style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n              data-testid='fa-app-container'\n            >\n              {featureAppNode}\n            </StyledShellContainer>\n          );\n        }}\n      </SafeFeatureAppLoader>\n    </StepperProvider>\n  </ThemeProvider>\n);\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StyledShellContainer } from '../AppStore/AppStore.style';\nimport ErrorUi from '../../ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from '../../ErrorUI/SafeFeatureAppLoader';\n\nexport const HelpDocumentation = (): ReactElement => {\n  return (\n    <ThemeProvider mode='light' platform='core'>\n      <StyledShellContainer>\n        <SafeFeatureAppLoader\n          featureAppId='fa-iac-help-documentation'\n          src={process.env.REACT_APP_FA_HELP_DOCUMENTATION_URL + 'fa-main/main.js'}\n          // src={'http://127.0.0.1:5501/dist/' + 'fa-main/main.js'}\n          fallback={<ErrorUi productName='Help Documentation' />}\n          config={{ data: 'Hello! from featureApp config' }}\n          moduleType=''\n        >\n          {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n            return error ? (\n              <ErrorUi productName={'Help Documentation'} />\n            ) : (\n              <StyledShellContainer style={{ display: loading ? 'none' : 'block', padding: '0px' }}>\n                {featureAppNode}\n              </StyledShellContainer>\n            );\n          }}\n        </SafeFeatureAppLoader>\n      </StyledShellContainer>\n    </ThemeProvider>\n  );\n};\n","// Navigation signal - simplified version without retry mechanism\n// Kept for potential future use or if other components depend on it\n\nlet navigationVersion = 0;\n\nconst listeners = new Set<() => void>();\n\nexport const bumpNavigationRetry = (): void => {\n  navigationVersion += 1;\n\n  listeners.forEach((listener) => {\n    try {\n      listener();\n    } catch (error) {\n      console.error('Navigation listener failed:', error);\n    }\n  });\n};\n\nexport const subscribeNavigationRetry = (listener: () => void): (() => void) => {\n  listeners.add(listener);\n\n  return () => {\n    listeners.delete(listener);\n  };\n};\n\nexport const getNavigationRetrySnapshot = (): number => navigationVersion;\n","import React, { ReactElement } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport { StepperProvider } from '../../../../services/StepperContext';\nimport ErrorUi from '../../../../ErrorUI/ErrorUI';\nimport { StyledShellContainer } from '../../../AppStore/AppStore.style';\nimport { SafeFeatureAppLoader } from '../../../../ErrorUI/SafeFeatureAppLoader';\nimport Loading from '../../../Loading/Loading';\n\ntype InfraAsCodeProps = {\n  email: string;\n  userFirstName: string;\n};\nexport const CreateInfraAsCode = ({ email, userFirstName }: InfraAsCodeProps): ReactElement => (\n  <ThemeProvider mode='light' platform='core'>\n    <StepperProvider>\n      <SafeFeatureAppLoader\n        featureAppId='fa-infra-as-code'\n        src={process.env.REACT_APP_FA_CREATE_INFRA_AS_CODE_URL + 'fa-main/main.js'}\n        moduleType=''\n        fallback={<ErrorUi productName='Create Infrastructure As Code' />}\n        config={{ email: email, userFirstName: userFirstName }}\n      >\n        {({ error, featureAppNode, loading }: CustomFeatureAppRenderingParams): ReactElement => {\n          return error ? (\n            <ErrorUi productName={'Create Infra As Code'} />\n          ) : (\n            <>\n              <Loading isLoading={loading} />\n              <StyledShellContainer\n                style={{ display: loading ? 'none' : 'block', padding: '0px' }}\n                data-testid='fa-app-container'\n              >\n                {featureAppNode}\n              </StyledShellContainer>\n            </>\n          );\n        }}\n      </SafeFeatureAppLoader>\n    </StepperProvider>\n  </ThemeProvider>\n);\n","import React, { ReactElement, useEffect, useState } from 'react';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { Dashboard } from './components/Dashboard/Dashboard';\nimport { Route, Routes, useLocation, Navigate } from 'react-router-dom';\nimport { AppFeatures } from './components/AppStore/AppStore';\nimport { TestAutomation } from './components/CreateFlows/TestAutomation/TestAutomation';\nimport { ProductFeatureOverview } from './components/ProductFeatureOverview/ProductFeatureOverview';\nimport { CustomFeatureAppRenderingParams } from '@feature-hub/react';\nimport ErrorUi from '../app/ErrorUI/ErrorUI';\nimport { SafeFeatureAppLoader } from './ErrorUI/SafeFeatureAppLoader';\nimport { StyledAppContainer } from './components/Dashboard/Dashboard.style';\nimport { Microservices as MicroservicesComponent } from './components/CreateFlows/MicroServices/Microservice';\nimport { AppFeature } from './components/CreateFlows/AppFeature/AppFeature';\nimport { APIProxy } from './components/CreateFlows/ApiProxy/APIProxy';\nimport { CustomComponent } from './components/CreateFlows/CustomComponent/CustomComponent';\nimport { AppServices } from './components/CreateFlows/AppServices/AppServices';\nimport { AppContainer } from './components/CreateFlows/AppContainer/AppContainer';\nimport { useAuthLoginProvider } from '@mtnkente/authentication';\nimport { authConfig } from '../utilities/authconfig';\nimport { APIProxies as APIProxiesComponent } from './components/APIProxies/APIProxies';\nimport { TestSuites as TestSuitesComponent } from './components/TestSuites/TestSuites';\nimport { Component } from './components/Component/Component';\nimport { InfraAsCode } from './components/InfraAsCode/InfraAsCode';\nimport { MicroService } from './components/MicroServices/MicroService';\nimport Loading from './components/Loading/Loading';\nimport SearchResults from './components/SearchResults/SearchResults';\nimport { Profile } from './components/ProfileManagement/ProfileManagement';\nimport Error404 from './Error';\nimport { CreateStandaloneWebApp } from './components/CreateInfraAsCode/CreateStandaloneWebApp';\nimport { CreateServerlessMicroservice } from './components/CreateInfraAsCode/CreateServerlessMicroservice';\nimport { UserActivityProvider } from './hooks/UserActivityProvider';\nimport { InfraAsCodeDetails } from './components/InfraAsCodeDetails/InfraAsCodeDetails';\nimport { CreateWebAppServerlessMicro } from './components/CreateInfraAsCode/CreateWebAppServerlessMicro';\nimport { HelpDocumentation } from './components/HelpDocumentation/HelpDocumentation';\nimport { NavigationServiceV1 } from './services/NavigationService';\nimport { bumpNavigationRetry } from './ErrorUI/navigation-retry-signal';\nimport { CreateInfraAsCode } from './components/CreateFlows/InfraAsCodeCreate/CreateIfraAsCode/CreateIfraAsCode';\nimport { defaultRoute } from './constant';\nimport { version as shellVersion } from '../../package.json';\n\nconst PLATFORM_VERSION_TEXT = `Platform Version v${shellVersion}`;\nconst HIDE_INFRA_AS_CODE_MENU_CSS = `\n  /* Hide Infra as Code from the remote side menu while keeping route access intact. */\n  a[href*='infra-as-code'],\n  [role='menuitem'][href*='infra-as-code'],\n  button[data-route*='infra-as-code'],\n  li:has(> a[href*='infra-as-code']),\n  [role='menu'] > *:has(a[href*='infra-as-code']) {\n    display: none !important;\n  }\n`;\n\nexport interface User {\n  givenName: string;\n  familyName: string;\n  email: string;\n  nickname: string;\n  name: string;\n  picture: string;\n}\n\nconst FALLBACK_USER: User = {\n  givenName: 'User',\n  familyName: '',\n  email: '',\n  nickname: '',\n  name: 'User',\n  picture: '',\n};\n\nexport enum PlatformName {\n  Microservices = 'Microservices',\n  APIProxies = 'API Proxies',\n  AppStore = 'App Store',\n  TestSuites = 'Test Suites',\n  Components = 'Components',\n}\n\nconst isCreateRoutePath = (pathname: string): boolean => pathname.includes('/create/');\n\nexport const NavBar = (): ReactElement => {\n  // Move the arrow function to a named callback to avoid react/jsx-no-bind\n  const renderFeatureApp = ({\n    error,\n    featureAppNode,\n    loading,\n  }: CustomFeatureAppRenderingParams): ReactElement => {\n    return error ? (\n      <StyledAppContainer data-testid='dashboard-app-container'>\n        <ErrorUi productName={'NavBar'} />\n      </StyledAppContainer>\n    ) : (\n      <StyledAppContainer style={{ display: loading ? 'none' : 'block', padding: '0px' }}>\n        {featureAppNode}\n      </StyledAppContainer>\n    );\n  };\n\n  return (\n    <ThemeProvider mode='light' platform='core'>\n      <SafeFeatureAppLoader\n        featureAppId='fa-navbar'\n        src={process.env.REACT_APP_FA_NAVBAR_URL + 'fa-main/main.js'}\n        moduleType='feature-app'\n        fallback={<ErrorUi productName='NavBar' />}\n        config={{\n          header: {\n            ShowHeader: true,\n          },\n          footer: {\n            ShowFooter: true,\n            FooterText: PLATFORM_VERSION_TEXT,\n          },\n        }}\n      >\n        {renderFeatureApp}\n      </SafeFeatureAppLoader>\n    </ThemeProvider>\n  );\n};\n\nexport const App = ({\n  navigationService,\n}: {\n  navigationService: NavigationServiceV1;\n}): ReactElement => {\n  const location = useLocation();\n  const previousPathnameRef = React.useRef(location.pathname);\n  const [user, setUser] = useState<User | null>(null);\n  const [loading, setLoading] = useState<boolean>(true);\n  const { getUserAccount, logoutUser, isAuthenticated, isInitialized } =\n    useAuthLoginProvider(authConfig);\n\n  useEffect(() => {\n    const previousPathname = previousPathnameRef.current;\n    const currentPathname = location.pathname;\n\n    if (previousPathname === currentPathname) {\n      return;\n    }\n\n    const createTransition =\n      isCreateRoutePath(previousPathname) || isCreateRoutePath(currentPathname);\n\n    previousPathnameRef.current = currentPathname;\n\n    if (createTransition) {\n      bumpNavigationRetry();\n    }\n  }, [location.pathname]);\n\n  // Keep a stable ref so the one-time effect always calls the latest version\n  // without re-running when the function reference changes (which happens when\n  // the library sets msalInstance after its internal 100ms init delay).\n  const getUserAccountRef = React.useRef(getUserAccount);\n  useEffect(() => {\n    getUserAccountRef.current = getUserAccount;\n  }, [getUserAccount]);\n\n  useEffect(() => {\n    // Must run ONCE on mount — before the auth library's 100ms delay sets\n    // msalInstance. After msalInstance is set, getUserAccount() returns\n    // undefined (library limitation), so calling it a second time would\n    // overwrite a successfully fetched user with null.\n    let cancelled = false;\n    (async (): Promise<void> => {\n      try {\n        const userData = (await getUserAccountRef.current()) ?? null;\n        if (!cancelled) setUser(userData);\n      } catch (error) {\n        if (!cancelled) console.error('Error fetching user data:', error);\n      } finally {\n        if (!cancelled) setLoading(false);\n      }\n    })().catch((error: unknown) => {\n      if (!cancelled) console.error('Unhandled error in fetchUser IIFE:', error);\n    });\n    return (): void => {\n      cancelled = true;\n    };\n  }, []);\n\n  // While the library is still initialising AND we haven't fetched user data yet,\n  // keep showing the loader so we don't flash a \"Session failed\" card to users\n  // who are mid-auth-redirect.\n  const isStillInitialising = loading || (!isInitialized && !user);\n\n  if (isStillInitialising) {\n    return (\n      <ThemeProvider mode='light' platform='core'>\n        <Loading isLoading={true} />\n      </ThemeProvider>\n    );\n  }\n\n  const effectiveUser = user ?? FALLBACK_USER;\n\n  return (\n    <ThemeProvider mode='light' platform='core'>\n      <UserActivityProvider logoutUser={logoutUser}>\n        {/* Only show the session error card when not authenticated at all.\n            If isAuthenticated is true but user profile is null (e.g. Graph API\n            unreachable), silently proceed with the fallback user instead of\n            blocking the shell with a redundant error card. */}\n        {!user && !isAuthenticated && (\n          <div style={{ padding: '1rem', width: '100%' }}>\n            <ErrorUi productName='Session' />\n          </div>\n        )}\n        {!location.pathname.includes('/create/') && <NavBar />}\n        {!location.pathname.includes('/create/') && <style>{HIDE_INFRA_AS_CODE_MENU_CSS}</style>}\n        <Routes>\n          <Route path='/' element={<Navigate replace to='/dashboard/' />} />\n          <Route path='/kente/' element={<Navigate replace to='/dashboard/' />} />\n          <Route\n            path='/'\n            element={\n              <Dashboard\n                userFirstName={effectiveUser.givenName}\n                userLastName={effectiveUser.familyName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n\n          <Route\n            path={`${defaultRoute}/dashboard/`}\n            element={\n              <Dashboard\n                userFirstName={effectiveUser.givenName}\n                userLastName={effectiveUser.familyName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n\n          <Route\n            path={`/dashboard/`}\n            element={\n              <Dashboard\n                userFirstName={effectiveUser.givenName}\n                userLastName={effectiveUser.familyName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n          <Route\n            path={`${defaultRoute}/app-store/`}\n            element={\n              <AppFeatures\n                storeType={PlatformName.AppStore}\n                userName={effectiveUser.givenName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n                userLastName={effectiveUser.familyName}\n              />\n            }\n          />\n          <Route\n            path={`${defaultRoute}/profile/`}\n            element={\n              <Profile\n                profilePicture={effectiveUser.picture}\n                userFirstName={effectiveUser.givenName}\n                email={effectiveUser.email}\n                userLastName={effectiveUser.familyName}\n                logoutUser={logoutUser}\n                navigationService={navigationService}\n              />\n            }\n          />\n\n          <Route\n            path='/custom-component/'\n            element={\n              <AppFeatures\n                userLastName={effectiveUser.familyName}\n                storeType={PlatformName.Components}\n                userName={effectiveUser.givenName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n          <Route\n            path={`/${defaultRoute}/micro-services/`}\n            element={\n              <AppFeatures\n                userLastName={effectiveUser.familyName}\n                storeType={PlatformName.Microservices}\n                userName={effectiveUser.givenName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n          <Route\n            path={`/${defaultRoute}/api-proxies/`}\n            element={\n              <AppFeatures\n                userLastName={effectiveUser.familyName}\n                storeType={PlatformName.APIProxies}\n                userName={effectiveUser.givenName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n          <Route\n            path={`/${defaultRoute}/test-suites/`}\n            element={\n              <AppFeatures\n                userLastName={effectiveUser.familyName}\n                storeType={PlatformName.TestSuites}\n                userName={effectiveUser.givenName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n          <Route\n            path={`/${defaultRoute}/search-results/`}\n            element={\n              <SearchResults\n                profilePicture={effectiveUser.picture}\n                userFirstName={effectiveUser.givenName}\n                userLastName={effectiveUser.familyName}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n          <Route\n            path={`${defaultRoute}/create/feature-app/:step?`}\n            element={\n              <AppFeature email={effectiveUser.email} userFirstName={effectiveUser.givenName} />\n            }\n          />\n          <Route\n            path={`${defaultRoute}/create/micro-service/:step?`}\n            element={\n              <MicroservicesComponent\n                email={effectiveUser.email}\n                userFirstName={effectiveUser.givenName}\n              />\n            }\n          />\n          <Route\n            path={`/${defaultRoute}/create/test-automation/`}\n            element={\n              <TestAutomation email={effectiveUser.email} userFirstName={effectiveUser.givenName} />\n            }\n          />\n          <Route\n            path='/create/api-proxy/'\n            element={\n              <APIProxy email={effectiveUser.email} userFirstName={effectiveUser.givenName} />\n            }\n          />\n          <Route\n            path='/create/custom-component/'\n            element={\n              <CustomComponent\n                email={effectiveUser.email}\n                userFirstName={effectiveUser.givenName}\n              />\n            }\n          />\n          <Route\n            path={`${defaultRoute}/create/app-service/`}\n            element={\n              <AppServices email={effectiveUser.email} userFirstName={effectiveUser.givenName} />\n            }\n          />\n          <Route\n            path={`${defaultRoute}/create/app-container/:step?`}\n            element={\n              <AppContainer email={effectiveUser.email} userFirstName={effectiveUser.givenName} />\n            }\n          />\n\n          <Route\n            path={`${defaultRoute}/create/infra-as-code/:step?`}\n            element={\n              <CreateInfraAsCode\n                email={effectiveUser.email}\n                userFirstName={effectiveUser.givenName}\n              />\n            }\n          />\n\n          <Route\n            path='/api-proxies/coming-soon/page/'\n            element={\n              <APIProxiesComponent\n                userName={effectiveUser.givenName}\n                userLastName={effectiveUser.familyName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n          <Route\n            path='/micro-services/coming-soon/page/'\n            element={\n              <MicroService\n                userName={effectiveUser.givenName}\n                userLastName={effectiveUser.familyName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n          <Route\n            path='/custom-component/coming-soon/page/'\n            element={\n              <Component\n                userName={effectiveUser.givenName}\n                userLastName={effectiveUser.familyName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n          <Route\n            path={`/${defaultRoute}/infra-as-code/`}\n            element={<InfraAsCode profilePicture={effectiveUser.picture} logoutUser={logoutUser} />}\n          />\n          <Route\n            path={`/${defaultRoute}/infra-as-code/details/:defaultRouteTitle`}\n            element={<InfraAsCodeDetails />}\n          />\n          <Route\n            path={`/${defaultRoute}/test-suites/coming-soon/page/`}\n            element={\n              <TestSuitesComponent\n                userName={effectiveUser.givenName}\n                userLastName={effectiveUser.familyName}\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n          <Route\n            path='/infra-as-code/create/standalone-serverless-microservice/'\n            element={\n              <CreateServerlessMicroservice\n                email={effectiveUser.email}\n                userFirstName={effectiveUser.givenName}\n              />\n            }\n          />\n          <Route\n            path='/infra-as-code/create/standalone-web-application/'\n            element={\n              <CreateStandaloneWebApp\n                email={effectiveUser.email}\n                userFirstName={effectiveUser.givenName}\n              />\n            }\n          />\n          <Route\n            path='/infra-as-code/create/web-application-with-serverless-microservice/'\n            element={\n              <CreateWebAppServerlessMicro\n                email={effectiveUser.email}\n                userFirstName={effectiveUser.givenName}\n              />\n            }\n          />\n          <Route\n            path={`/${defaultRoute}/product-feature-overview/`}\n            element={\n              <ProductFeatureOverview\n                profilePicture={effectiveUser.picture}\n                logoutUser={logoutUser}\n              />\n            }\n          />\n\n          <Route path={`/${defaultRoute}/help-documentation/`} element={<HelpDocumentation />} />\n          <Route path='*' element={<Error404 />} />\n        </Routes>\n      </UserActivityProvider>\n    </ThemeProvider>\n  );\n};\n\n// export const sendToAnalytics = ({ id, name, value }: Metric): void => {\n//   // Assumes the metric name is the same as the event name in Google Analytics\n//   miscTracking('webVitals', 'reportWebVitals', {\n//     eventCategory: 'Web Vitals',\n//     value: Math.round(name === 'CLS' ? value * 1000 : value), // Ensure values are in milliseconds\n//     eventLabel: id, // Use the Web Vitals ID as the event label\n//     nonInteraction: true, // Prevents this event from affecting bounce rate\n//   });\n// };\n// // webVital to monitor application performance\n// reportWebVitals(sendToAnalytics);\n","import React, { ReactNode } from 'react';\n\ntype Props = {\n  children: ReactNode;\n};\n\ntype State = {\n  hasError: boolean;\n  error: unknown;\n};\n\n/**\n * Top-most safety net for the entire shell application.\n * Catches any render-time error that escapes all lower-level boundaries\n * and shows a minimal recoverable message instead of a blank screen.\n */\nexport class RootErrorBoundary extends React.Component<Props, State> {\n  state: State = { hasError: false, error: null };\n\n  static getDerivedStateFromError(error: unknown): State {\n    return { hasError: true, error };\n  }\n\n  componentDidCatch(error: unknown, info: React.ErrorInfo): void {\n    console.error('Root Error Boundary caught an unhandled error:', error, info);\n  }\n\n  handleReload = (): void => {\n    window.location.reload();\n  };\n\n  render(): ReactNode {\n    if (this.state.hasError) {\n      return (\n        <div\n          style={{\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'center',\n            justifyContent: 'center',\n            minHeight: '100vh',\n            padding: '2rem',\n            fontFamily: 'sans-serif',\n            background: '#f5f5f5',\n          }}\n        >\n          <h2 style={{ color: '#c00', marginBottom: '1rem' }}>Something went wrong</h2>\n          <p style={{ color: '#333', maxWidth: '480px', textAlign: 'center' }}>\n            The application encountered an unexpected error. Please refresh the page or contact the\n            support team if the problem persists.\n          </p>\n          <button\n            style={{\n              marginTop: '1.5rem',\n              padding: '0.6rem 1.4rem',\n              background: '#ffcc00',\n              border: 'none',\n              borderRadius: '4px',\n              cursor: 'pointer',\n              fontWeight: 600,\n            }}\n            onClick={this.handleReload}\n          >\n            Reload page\n          </button>\n        </div>\n      );\n    }\n\n    return this.props.children;\n  }\n}\n\nexport default RootErrorBoundary;\n","import { FeatureAppDefinition } from '@feature-hub/core';\nimport { ReactFeatureApp } from '@feature-hub/react';\nimport React from 'react';\nimport { helloWorldServiceDefinition } from './services/HelloWorldService';\nimport { App } from './App';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport StoreDataProvider from './hooks/StoreDataProvider';\nimport { StoreDataService1 } from './services/DynamicStoreDataService';\nimport { NavigationServiceV1 } from './services/NavigationService';\nimport RootErrorBoundary from './ErrorUI/RootErrorBoundary';\nimport { Location } from 'history';\n\nconst FeatureHubAppDefinition: FeatureAppDefinition<ReactFeatureApp> = {\n  dependencies: {\n    featureServices: {\n      'test:hello-world-service': '1.0.0',\n      'shared:stepper-service': '1.0.0',\n      'acme:shared-data-service': '1.0.0',\n      'acme:local-data-service': '1.0.0',\n      'acme:dynamic-service': '1.0.0',\n      'acme:store-dynamic-data-service': '1.0.0',\n      'shell:navigation-service': '1.0.0',\n    },\n  },\n\n  ownFeatureServiceDefinitions: [helloWorldServiceDefinition],\n\n  create: ({ featureServices }) => {\n    const storeDataService = featureServices[\n      'acme:store-dynamic-data-service'\n    ] as StoreDataService1;\n    const navigationService = featureServices['shell:navigation-service'] as NavigationServiceV1;\n\n    return {\n      render: () => (\n        <RootErrorBoundary>\n          <ThemeProvider mode='light' platform='core'>\n            <StoreDataProvider value={storeDataService}>\n              <App navigationService={navigationService} />\n            </StoreDataProvider>\n          </ThemeProvider>\n        </RootErrorBoundary>\n      ),\n    };\n  },\n};\nexport default FeatureHubAppDefinition;\n","import {\n  FeatureServiceBinder,\n  FeatureServiceProviderDefinition,\n  SharedFeatureService,\n} from '@feature-hub/core';\n\nexport interface HelloWorldServiceV1 {\n  name: string;\n}\n\nexport interface SharedHelloWorldService extends SharedFeatureService {\n  readonly '1.0.0': FeatureServiceBinder<HelloWorldServiceV1>;\n}\n\nexport const helloWorldServiceDefinition: FeatureServiceProviderDefinition<SharedHelloWorldService> =\n  {\n    id: 'test:hello-world-service',\n\n    create: () => ({\n      '1.0.0': () => ({\n        featureService: {\n          get name(): string {\n            return 'Hello World from Service';\n          },\n        },\n      }),\n    }),\n  };\n","// DynamicStoreDataService.ts\nimport {\n  SharedFeatureService,\n  FeatureServiceBinder,\n  FeatureServiceProviderDefinition,\n} from '@feature-hub/core';\n\nexport interface StoreDataService1<T = Record<string, unknown>> {\n  setData(data: T): void;\n  getData(): T | undefined;\n  setReady?(ready: boolean): void;\n  isReady?(): boolean;\n  whenReady?(): Promise<T | undefined>;\n  subscribe?(listener: (event: StoreDataEvent<T>) => void): () => void;\n}\n\nexport type StoreDataEvent<T = Record<string, unknown>> = {\n  data: T | undefined;\n  isReady: boolean;\n};\n\nexport interface StoreDataService extends SharedFeatureService {\n  readonly '1.0.0': FeatureServiceBinder<StoreDataService1>;\n}\n\nexport const StoreDataServiceDefinition: FeatureServiceProviderDefinition<StoreDataService> = {\n  id: 'acme:store-dynamic-data-service',\n\n  create: (): StoreDataService => {\n    let storeData: Record<string, unknown> | undefined;\n    let ready = false;\n    const listeners = new Set<(event: StoreDataEvent<Record<string, unknown>>) => void>();\n    const readyResolvers = new Set<(data: Record<string, unknown> | undefined) => void>();\n\n    const emit = (): void => {\n      const event: StoreDataEvent<Record<string, unknown>> = {\n        data: storeData,\n        isReady: ready,\n      };\n\n      listeners.forEach((listener) => listener(event));\n    };\n\n    const resolveReadyWaiters = (): void => {\n      readyResolvers.forEach((resolve) => resolve(storeData));\n      readyResolvers.clear();\n    };\n\n    return {\n      '1.0.0': (): { featureService: StoreDataService1 } => ({\n        featureService: {\n          setData(data: Record<string, unknown>): void {\n            console.trace('latest state received from the store data: ', data);\n            storeData = { ...storeData, ...data };\n            emit();\n          },\n          getData(): Record<string, unknown> | undefined {\n            return storeData;\n          },\n          setReady(nextReady: boolean): void {\n            if (ready === nextReady) {\n              return;\n            }\n\n            const previousReady = ready;\n            ready = nextReady;\n            console.info('[acme:store-dynamic-data-service] ready state changed', {\n              previousReady,\n              ready,\n              hasData: !!storeData,\n            });\n            if (ready) {\n              resolveReadyWaiters();\n            }\n            emit();\n          },\n          isReady(): boolean {\n            return ready;\n          },\n          whenReady(): Promise<Record<string, unknown> | undefined> {\n            if (ready) {\n              return Promise.resolve(storeData);\n            }\n\n            return new Promise((resolve) => {\n              readyResolvers.add(resolve);\n            });\n          },\n          subscribe(\n            listener: (event: StoreDataEvent<Record<string, unknown>>) => void\n          ): () => void {\n            listeners.add(listener);\n            return () => {\n              listeners.delete(listener);\n            };\n          },\n        },\n      }),\n    };\n  },\n};\n","/* eslint-disable @typescript-eslint/prefer-nullish-coalescing, no-void */\nimport { FeatureAppContainer, FeatureHubContextProvider } from '@feature-hub/react';\nimport { createFeatureHub } from '@feature-hub/core';\nimport { defineExternals, loadAmdModule } from '@feature-hub/module-loader-amd';\nimport React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport { createRootLocationTransformer, defineHistoryService } from '@feature-hub/history-service';\nimport { NavigationServiceV1, navigationServiceDefinition } from './app/services/NavigationService';\nimport { unstable_HistoryRouter as HistoryRouter } from 'react-router-dom';\nimport { Externals } from './app/externals/ExternalLibs';\nimport { loadFederatedModule } from '@feature-hub/module-loader-federation';\nimport { Initialise, initialise } from '@mtnkente/gtm';\nimport { dataSharingServiceDefinition } from './app/services/SharedDataService';\nimport { stepperServiceDefinition } from './app/services/StepperService';\nimport { localDataSharingServiceDefinition } from './app/services/LocalDataService';\nimport { dynamicServiceDefinition } from './app/services/DynamicDataService';\nimport { AuthProvider } from '@mtnkente/authentication';\nimport { authConfig } from './utilities/authconfig';\nimport FeatureHubAppDefinition from './app/AppDefinition';\nimport { StoreDataServiceDefinition } from './app/services/DynamicStoreDataService';\nimport { CoreFonts } from '@mtnkente/paragon-core-fonts';\nimport { ThemeProvider } from '@mtnkente/paragon-foundation';\nimport { createGlobalStyle } from 'styled-components';\nimport {\n  isAnalyticsResourceFailure,\n  isChunkLoadError,\n  isFeatureServiceError,\n  isNonFatalResourceFailure,\n  notifyFeatureAppFailure,\n  recordResolvedFeatureAppModule,\n} from './app/ErrorUI/feature-app-errors';\nimport { bumpNavigationRetry } from './app/ErrorUI/navigation-retry-signal';\nimport RootErrorBoundary from './app/ErrorUI/RootErrorBoundary';\n\ntype HistoryRouterHistory = React.ComponentProps<typeof HistoryRouter>['history'];\n\ntype FeatureServiceDefinitionLike = {\n  id?: string;\n};\n\ntype FeatureAppDefinitionLike = {\n  ownFeatureServiceDefinitions?: FeatureServiceDefinitionLike[];\n};\n\nconst ShellFontFamilyStyle = createGlobalStyle`\n  :root {\n    --shell-font-family: 'MTNBrighterSans-Regular','WorkSans-Regular', 'Segoe UI', Arial, sans-serif;\n  }\n\n  body,\n  #root {\n    font-family: var(--shell-font-family) !important;\n  }\n`;\n\ndefineExternals(Externals);\n\nconst extractFailedUrl = (value: unknown): string | undefined => {\n  if (value && typeof value === 'object') {\n    const candidate = value as { message?: unknown; stack?: unknown };\n    const text = [candidate.message, candidate.stack]\n      .filter((part): part is string => typeof part === 'string')\n      .join(' ');\n    const match = text.match(/https?:\\/\\/[^\\s)]+/i);\n\n    return match?.[0];\n  }\n\n  if (typeof value === 'string') {\n    return value.match(/https?:\\/\\/[^\\s)]+/i)?.[0];\n  }\n\n  return undefined;\n};\n\nconst isJavaScriptResourceUrl = (url?: string): boolean =>\n  !!url && /\\.m?js(?:$|[?#])|\\/\\d+(?:\\.[a-z0-9]+)?\\.js(?:$|[?#])/i.test(url);\n\nconst getResourceUrlFromEvent = (event: Event): string | undefined => {\n  const target = event.target as {\n    src?: string;\n    currentSrc?: string;\n    href?: string;\n  } | null;\n\n  return target?.src || target?.currentSrc || target?.href;\n};\n\nconst MODULE_LOAD_RETRY_DELAYS_MS = [800, 1_800];\nconst isDebugFeatureAppsEnabled = process.env.REACT_APP_DEBUG_FEATURE_APPS === 'true';\nconst isCreateRoutePath = (pathname: string): boolean => pathname.includes('/create/');\n\nconst SHELL_FEATURE_SERVICE_DEFINITIONS = [\n  defineHistoryService(createRootLocationTransformer({ consumerPathsQueryParamName: '/' })),\n  navigationServiceDefinition,\n  stepperServiceDefinition,\n  dataSharingServiceDefinition,\n  localDataSharingServiceDefinition,\n  dynamicServiceDefinition,\n  StoreDataServiceDefinition,\n];\n\nconst ADDITIONAL_SHELL_OWNED_SERVICE_IDS = ['test:hello-world-service'];\n\nconst shellOwnedServiceIds = new Set([\n  ...SHELL_FEATURE_SERVICE_DEFINITIONS.map((definition) => definition.id),\n  ...ADDITIONAL_SHELL_OWNED_SERVICE_IDS,\n]);\n\nconst INTERCEPT_LOG_TTL_MS = 2_500;\nconst INTERCEPT_LOG_MAX_ENTRIES = 120;\nconst interceptedLogCache = new Map<string, number>();\n\nconst pruneInterceptedLogCache = (now: number): void => {\n  interceptedLogCache.forEach((loggedAt, key) => {\n    if (now - loggedAt > INTERCEPT_LOG_TTL_MS) {\n      interceptedLogCache.delete(key);\n    }\n  });\n\n  if (interceptedLogCache.size <= INTERCEPT_LOG_MAX_ENTRIES) {\n    return;\n  }\n\n  const cacheEntries: Array<[string, number]> = [];\n  interceptedLogCache.forEach((loggedAt, key) => {\n    cacheEntries.push([key, loggedAt]);\n  });\n\n  const oldestEntries = cacheEntries\n    .sort((left, right) => left[1] - right[1])\n    .slice(0, interceptedLogCache.size - INTERCEPT_LOG_MAX_ENTRIES);\n\n  oldestEntries.forEach(([key]) => interceptedLogCache.delete(key));\n};\n\nconst logInterceptedErrorOnce = (\n  message: string,\n  payload: unknown,\n  fingerprintHint?: string\n): void => {\n  const text = getErrorText(payload).slice(0, 300);\n  const fingerprint = `${message}|${fingerprintHint ?? extractFailedUrl(payload) ?? ''}|${text}`;\n  const now = Date.now();\n\n  pruneInterceptedLogCache(now);\n  const lastLoggedAt = interceptedLogCache.get(fingerprint);\n\n  if (lastLoggedAt && now - lastLoggedAt <= INTERCEPT_LOG_TTL_MS) {\n    return;\n  }\n\n  interceptedLogCache.set(fingerprint, now);\n  console.warn(message, payload);\n};\n\nconst removeDuplicateShellOwnedServices = (\n  definition: FeatureAppDefinitionLike,\n  featureAppUrl: string\n): void => {\n  const ownServices = definition.ownFeatureServiceDefinitions;\n  if (!Array.isArray(ownServices) || ownServices.length === 0) {\n    return;\n  }\n\n  const removedIds: string[] = [];\n  definition.ownFeatureServiceDefinitions = ownServices.filter((serviceDefinition) => {\n    const serviceId = serviceDefinition?.id;\n    const isShellOwned = typeof serviceId === 'string' && shellOwnedServiceIds.has(serviceId);\n\n    if (isShellOwned && serviceId) {\n      removedIds.push(serviceId);\n      return false;\n    }\n\n    return true;\n  });\n\n  if (removedIds.length > 0) {\n    if (isDebugFeatureAppsEnabled) {\n      console.warn(\n        `Stripped duplicate shell-owned feature service registrations from remote at ${featureAppUrl}:`,\n        removedIds\n      );\n    }\n  }\n};\n\nconst sanitizeRemoteFeatureAppModule = (module: unknown, featureAppUrl: string): void => {\n  if (!module || typeof module !== 'object') {\n    return;\n  }\n\n  const candidateRecords = [\n    module as Record<string, unknown>,\n    (module as { default?: unknown }).default,\n    (module as { featureAppDefinition?: unknown }).featureAppDefinition,\n    (module as { default?: { featureAppDefinition?: unknown } }).default?.featureAppDefinition,\n  ];\n\n  candidateRecords.forEach((candidate) => {\n    if (candidate && typeof candidate === 'object') {\n      removeDuplicateShellOwnedServices(candidate, featureAppUrl);\n    }\n  });\n};\n\nconst getErrorText = (error: unknown): string => {\n  if (typeof error === 'string') {\n    return error;\n  }\n\n  if (error && typeof error === 'object') {\n    const candidate = error as { message?: unknown; stack?: unknown };\n    return [candidate.message, candidate.stack]\n      .filter((part): part is string => typeof part === 'string')\n      .join(' ');\n  }\n\n  return '';\n};\n\nconst isRetryableModuleLoadError = (error: unknown): boolean => {\n  if (isChunkLoadError(error)) {\n    return true;\n  }\n\n  return /timeout|networkerror|failed to fetch|loading script failed|net::err/i.test(\n    getErrorText(error)\n  );\n};\n\nconst waitForRetryDelay = async (delayMs: number): Promise<void> =>\n  new Promise((resolve) => {\n    window.setTimeout(resolve, delayMs);\n  });\n\nconst loadFeatureAppModuleWithRetry = async (\n  url: string,\n  moduleType?: string\n): Promise<unknown> => {\n  const executeLoad = (): Promise<unknown> =>\n    moduleType === 'federated' ? loadFederatedModule(url) : loadAmdModule(url);\n\n  for (let attempt = 0; ; attempt += 1) {\n    try {\n      return await executeLoad();\n    } catch (error) {\n      const retryDelay = MODULE_LOAD_RETRY_DELAYS_MS[attempt];\n      if (!isRetryableModuleLoadError(error) || retryDelay === undefined) {\n        throw error;\n      }\n\n      await waitForRetryDelay(retryDelay);\n    }\n  }\n};\n\nconst handleFeatureAppFailure = (\n  error: unknown,\n  hints?: { url?: string; source?: 'module-loader' | 'window.error' | 'window.unhandledrejection' }\n): boolean => {\n  const failedUrl = hints?.url ?? extractFailedUrl(error);\n\n  return notifyFeatureAppFailure(error, {\n    url: failedUrl,\n    source: hints?.source,\n  });\n};\n\nconst isLikelyRemoteRuntimeError = (value: unknown): boolean => {\n  if (!value) {\n    return false;\n  }\n\n  const text =\n    typeof value === 'string'\n      ? value\n      : [(value as { message?: unknown }).message, (value as { stack?: unknown }).stack]\n          .filter((part): part is string => typeof part === 'string')\n          .join(' ');\n\n  return /TypeError|ReferenceError|main\\.js:\\d+|amd\\.js|s\\.js|kente-dev\\.mtn\\.com/i.test(text);\n};\n\n// --------------------\n// GLOBAL ERROR HANDLERS\n// --------------------\n\n// Catch unhandled promise rejections (e.g., chunk load failures)\nwindow.addEventListener(\n  'unhandledrejection',\n  (event) => {\n    const reason = event?.reason;\n    if (isAnalyticsResourceFailure(reason, { source: 'window.unhandledrejection' })) {\n      logInterceptedErrorOnce('Analytics async failure intercepted:', reason);\n      event.preventDefault();\n      event.stopImmediatePropagation();\n      return;\n    }\n\n    const handled = handleFeatureAppFailure(reason, {\n      source: 'window.unhandledrejection',\n    });\n\n    // Only prevent default if we successfully attributed the error to a feature app,\n    // or if it's a known benign error type (ChunkLoadError, FeatureServiceError).\n    // Do NOT fail all active feature apps as a fallback - this is too aggressive\n    // and causes the entire UI to go blank.\n    if (handled || isChunkLoadError(reason) || isFeatureServiceError(reason)) {\n      logInterceptedErrorOnce('Feature app async failure intercepted:', reason);\n      event.preventDefault();\n      event.stopImmediatePropagation();\n    } else if (isLikelyRemoteRuntimeError(reason)) {\n      // Log but don't prevent - let it bubble to the console for debugging\n      logInterceptedErrorOnce('Likely remote runtime error (unattributed):', reason);\n    }\n  },\n  true\n);\n\n// Catch runtime errors that bubble to window (e.g., o is not a function)\nwindow.addEventListener(\n  'error',\n  (event) => {\n    const error = event?.error;\n    const resourceUrl = getResourceUrlFromEvent(event);\n    const failurePayload =\n      error || event.message || (resourceUrl ? `Resource load failure: ${resourceUrl}` : undefined);\n\n    if (\n      isAnalyticsResourceFailure(failurePayload, {\n        url: resourceUrl || event.filename,\n        source: 'window.error',\n      })\n    ) {\n      logInterceptedErrorOnce(\n        'Analytics runtime/resource failure intercepted:',\n        failurePayload || resourceUrl,\n        resourceUrl || event.filename\n      );\n      event.preventDefault();\n      event.stopImmediatePropagation();\n      return;\n    }\n\n    if (\n      isNonFatalResourceFailure(failurePayload, {\n        url: resourceUrl || event.filename,\n        source: 'window.error',\n      })\n    ) {\n      logInterceptedErrorOnce(\n        'Non-fatal feature-app asset failure ignored:',\n        failurePayload || resourceUrl,\n        resourceUrl || event.filename\n      );\n      return;\n    }\n\n    const handled = handleFeatureAppFailure(failurePayload, {\n      url: resourceUrl || event.filename,\n      source: 'window.error',\n    });\n    const isScriptResourceFailure = isJavaScriptResourceUrl(resourceUrl);\n\n    // Only prevent default if we successfully attributed the error to a feature app,\n    // or if it's a known benign error type. Do NOT fail all active feature apps\n    // as a fallback - this causes the entire UI to go blank.\n    if (\n      handled ||\n      isChunkLoadError(failurePayload) ||\n      isScriptResourceFailure ||\n      isFeatureServiceError(failurePayload)\n    ) {\n      logInterceptedErrorOnce(\n        'Feature app runtime/resource failure intercepted:',\n        failurePayload || resourceUrl,\n        resourceUrl || event.filename\n      );\n      event.preventDefault();\n      event.stopImmediatePropagation();\n    } else if (isLikelyRemoteRuntimeError(failurePayload)) {\n      // Log but don't prevent - let it bubble to the console for debugging\n      logInterceptedErrorOnce('Likely remote runtime error (unattributed):', failurePayload);\n    } else {\n      console.error('Global runtime error caught:', failurePayload);\n    }\n  },\n  true\n);\n\nconst { featureAppManager, featureServices } = createFeatureHub('main:integrator', {\n  moduleLoader: async (url, moduleType) => {\n    try {\n      const module = await loadFeatureAppModuleWithRetry(url, moduleType);\n      sanitizeRemoteFeatureAppModule(module, url);\n\n      recordResolvedFeatureAppModule(url);\n\n      return module;\n    } catch (error) {\n      handleFeatureAppFailure(error, {\n        url,\n        source: 'module-loader',\n      });\n      throw error;\n    }\n  },\n  providedExternals: {\n    react: process.env.REACT_VERSION as string,\n    '@feature-hub/react': process.env.FEATURE_HUB_REACT_VERSION as string,\n  },\n  featureServiceDefinitions: SHELL_FEATURE_SERVICE_DEFINITIONS,\n  featureServiceDependencies: {\n    'shell:navigation-service': '^1.0.0',\n    'shared:stepper-service': '1.0.0',\n    'acme:shared-data-service': '1.0.0',\n    'acme:local-data-service': '1.0.0',\n    'acme:dynamic-service': '1.0.0',\n    'acme:store-dynamic-data-service': '1.0.0',\n  },\n});\n\nconst navigationService = featureServices[navigationServiceDefinition.id] as NavigationServiceV1;\n\n// -----------------------------\n// PRELOAD FEATURE APP MODULES\n// -----------------------------\n// Start loading all feature app modules in parallel immediately.\n// This ensures modules begin downloading before React renders the components.\nconst featureAppUrls = [\n  process.env.REACT_APP_FA_NAVBAR_URL,\n  process.env.REACT_APP_FA_BANNER_URL,\n  process.env.REACT_APP_FA_SEARCH_BAR_URL,\n  process.env.REACT_APP_FA_CARDHOLDER_URL,\n  process.env.REACT_APP_FA_SERVICES_LIST_URL,\n  process.env.REACT_APP_FA_PROJECTS_LIST_URL,\n  process.env.REACT_APP_FA_APP_STORE_URL,\n]\n  .filter(Boolean)\n  .map((url) => `${url}fa-main/main.js`);\n\n// Preload modules in parallel (fire and forget - errors handled by SafeFeatureAppLoader)\nfeatureAppUrls.forEach((url) => {\n  loadFeatureAppModuleWithRetry(url).catch(() => {\n    // Silently ignore preload errors - SafeFeatureAppLoader will handle them\n  });\n});\n\n// Broadcast every shell navigation so SafeFeatureAppLoader can deterministically\n// remount failed loaders on page changes and same-page revisits.\nlet lastNavigationPathname = navigationService.history.location.pathname;\n\nconst unsubscribeNavigationRetry = (\n  navigationService.history as unknown as { listen: (listener: () => void) => () => void }\n).listen(() => {\n  const currentPathname = navigationService.history.location.pathname;\n  const createTransition =\n    isCreateRoutePath(lastNavigationPathname) || isCreateRoutePath(currentPathname);\n\n  lastNavigationPathname = currentPathname;\n\n  if (createTransition) {\n    bumpNavigationRetry();\n  }\n});\n\n// keep unsubscribe referenced so bundlers/lints don't drop setup as unused\nvoid unsubscribeNavigationRetry;\n\nconst root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);\nconst gtmId = process.env.GTM_ID as string;\nconst shouldUseStrictMode = process.env.NODE_ENV === 'production';\n\ntry {\n  initialise(\n    new Initialise({\n      consentAds: true,\n      consentAnalytics: true,\n      consentPreferences: true,\n      gtmId: gtmId,\n    })\n  );\n} catch (error) {\n  console.warn('GTM initialise failed. Continuing without analytics.', error);\n}\n\nconst appTree = (\n  <RootErrorBoundary>\n    <ThemeProvider mode='light' platform='core'>\n      <CoreFonts />\n      <ShellFontFamilyStyle />\n      <AuthProvider config={authConfig}>\n        <FeatureHubContextProvider value={{ featureAppManager }}>\n          <HistoryRouter history={navigationService.history as unknown as HistoryRouterHistory}>\n            <FeatureAppContainer\n              featureAppDefinition={FeatureHubAppDefinition}\n              featureAppId='ke:kente-platform'\n            />\n          </HistoryRouter>\n        </FeatureHubContextProvider>\n      </AuthProvider>\n    </ThemeProvider>\n  </RootErrorBoundary>\n);\n\nroot.render(shouldUseStrictMode ? <React.StrictMode>{appTree}</React.StrictMode> : appTree);\n"],"names":["defaultRoute","navigationServiceDefinition","id","dependencies","featureServices","create","_ref","history","rootHistory","1.0.0","featureService","navigateTo","name","params","contentTracking","Content","eventName","eventDescription","eventTrigger","category","subcategory","title","description","concat","slug","toLowerCase","replace","createSlug","queryParams","URLSearchParams","url","push","pathname","originalPush","HistoryUrl","state","updateStep","step","replaceHistory","arguments","length","undefined","segments","location","split","filter","Boolean","lastSegment","isNaN","Number","console","log","String","locationUpdate","join","search","getStep","Externals","react","dataSharingServiceDefinition","sharedData","setData","data","trace","_objectSpread","getData","StepperContext","createContext","StepperProvider","children","_useState","useState","_useState2","_slicedToArray","activeStep","setActiveStep","_useState3","_useState4","steps","setSteps","_jsx","Provider","value","handleNext","prevActiveStep","handleBack","addSteps","newSteps","prevSteps","goTo","index","useStepper","context","useContext","Error","stepperServiceDefinition","useMultiStepForm","localDataSharingServiceDefinition","dynamicServiceDefinition","dynamicData","ready","listeners","Set","readyResolvers","emit","event","isReady","forEach","listener","setReady","nextReady","previousReady","info","hasData","resolve","clear","whenReady","Promise","add","subscribe","delete","authConfig","clientId","_process$env$REACT_AP","process","tenantId","_process$env$REACT_AP2","redirectUri","_process$env$REACT_AP3","shelltype","_process$env$REACT_AP4","REACT_APP_KENTE_SHELL_TYPE","fullWidthChildren","css","_templateObject","_taggedTemplateLiteral","BaseShellContainer","styled","div","_templateObject2","BodyLayoutContainer","_templateObject3","BaseAppContainer","_templateObject4","_templateObject5","BaseTwoColumnLayout","_templateObject6","BaseFlexItem","_templateObject7","StyledShellContainer","StyledPageContainer","StyledAppContainer","section","ErrorUI","productName","showNotification","setShowNotification","handleClose","useCallback","InlineNotification","descriptionText","$colourType","inputIcon","Fault","style","position","flex","width","top","onClose","$isStacked","isDismissable","FeatureAppErrorBoundary","React","constructor","super","_defineProperty","this","hasError","lastResetKey","props","resetKey","getDerivedStateFromError","error","getDerivedStateFromProps","componentDidCatch","_this$props$onError","_this$props","onError","call","render","fallback","ErrorUI_FeatureAppErrorBoundary","ANALYTICS_RESOURCE_PATTERN","DUPLICATE_FEATURE_SERVICE_REGISTRATION_PATTERN","featureApps","Map","recentNotificationFingerprints","lastResolvedModule","getErrorMessage","candidate","message","stack","normalizeUrl","getErrorText","isAnalyticsUrl","test","isAnalyticsResourceFailure","hints","_message$match","hintedUrl","match","isJavaScriptResourceUrl","isNonFatalResourceFailure","errorText","source","shouldSkipDuplicateNotification","featureAppId","now","Date","fingerprint","_hints$source","slice","createErrorFingerprint","previous","get","set","size","Array","from","entries","_ref2","key","timestamp","matchesFeatureApp","entry","haystack","normalizedUrl","includes","src","baseUrl","startsWith","notifyEntries","status","lastUpdatedAt","notificationError","resolveTargets","directMatches","values","recentModuleUrl","getRecentModuleUrl","recentMatches","isChunkLoadError","loadingEntries","isFeatureServiceError","isDuplicateFeatureServiceRegistrationError","updateFeatureAppStatus","SafeFeatureAppLoader","onStatusChange","_ref$moduleType","moduleType","featureAppLoaderProps","_objectWithoutProperties","_excluded","loadError","setLoadError","retryVersion","setRetryVersion","_useState5","_useState6","autoRetryAttempts","setAutoRetryAttempts","hasUnmountedRef","useRef","isDebugEnabled","REACT_APP_DEBUG_FEATURE_APPS","debugTrace","_len","args","_key","isRetryableError","triggerError","current","v","handleFeatureAppError","useEffect","timer","setTimeout","prev","clearTimeout","keys","unregisterFeatureApp","wrappedChildren","loading","featureAppNode","_Fragment","FeatureAppLoader","OverviewContainer","OverviewHeader","SummaryGrid","h3","SummaryCard","article","p","Tabs_TabOverviewContent","metrics","_jsxs","Text","$fontStyle","$colour","StandardButton","$variant","label","icon","NewTab","onClick","map","metric","getMsalAuthStorageKey","getApiUrl","trim","_url$split","_withoutQuery$split","getIdToken","_parsed$account$idTok","_parsed$account","raw","window","sessionStorage","getItem","parsed","JSON","parse","account","idToken","_unused","wait","ms","async","buildHeaders","opCoCode","token","maxAttempts","delayMs","attempt","getIdTokenWithRetry","headers","Authorization","correlationId","uuidv4","commandType","opCohouse","parseBody","res","body","json","ok","code","detail","getRbacAuthStorageKey","_getRbacAuthConfig","getRbacAuthConfig","fetchOpcos","fetch","method","normalizeGroupName","ADMIN_GROUP_NAME","readSessionAccount","_payload$account","rawValue","payload","parseMsalAuthStoragePayload","isArray","normalizeText","buildGroupLabelSet","groupDisplayNames","labels","groupName","sortByDefinedOrder","opcos","sort","left","right","_left$sort","_right$sort","MAX_SAFE_INTEGER","resolveRbacContextFromOpcos","_account$idTokenClaim","groups","idTokenClaims","group","displayName","readSessionGroupDisplayNames","isAdmin","isAdministratorGroupMember","hasAnyOpcoAccess","deniedReason","matchedGroupNames","accessibleOpcos","activeOpcos","opco","groupLabels","opcoName","opcoLabel","has","isMatchingOpcoGroup","getRbacContext","StoreContext","useStoreData","_storeDataService$set","_storeDataService$isR","_storeDataService$whe","_storeDataService$sub","storeDataService","hooks_StoreDataProvider","getProjectOverviewMockMetrics","projectId","projectName","seed","reduce","total","character","charCodeAt","getSeedValue","highPriorityTasks","criticalVulnerabilities","ProjectOverviewLoadingCard","IconWrap","span","SearchHeader","header","HeaderTitleRow","SelectionHeader","SelectionIconWrap","SearchPanel","$backgroundImageUrl","SelectionCard","_templateObject8","SelectionDivider","_templateObject9","SelectionTagsWrap","_templateObject0","GroupedSectionsContainer","_templateObject1","SectionSurface","_templateObject10","OpCoSection","_templateObject11","LoadingDots","_templateObject12","OpCoScroller","_templateObject13","ScrollEdgeFade","_templateObject14","$visible","_ref3","$side","OpCoButtonGroupWrap","_templateObject15","_ref4","$isOverflowing","_ref5","ScrollNavButton","button","_templateObject16","_ref6","MainContainer","_templateObject17","getProjectTimestamp","project","date_created","getTime","ProjectOverview_ProjectOverview","_getData","_opcoList$code","_opcoList","_projects$id","_projects","_projects$find","_ref$opcoTitle","opcoTitle","_ref$opcoCaption","opcoCaption","_ref$projectSelection","projectSelectionTitle","_ref$projectSelection2","projectSelectionCaption","_ref$backgroundImageU","backgroundImageUrl","searchPanelBackground","opcoCaptionParts","firstSentenceEnd","indexOf","delimiter","splitAfterFirstSentence","_useStoreData","persistedState","dashboardProjectOverview","_persistedState$opcoL","opcoList","setOpcoList","_persistedState$selec","selectedOpcoCode","setSelectedOpcoCode","_persistedState$proje","projects","setProjects","_useState7","_persistedState$selec2","selectedProjectId","_useState8","setSelectedProjectId","_useState9","_persistedState$opcoE","opcoError","_useState0","setOpcoError","_useState1","_persistedState$opcoL2","_persistedState$opcoL3","_useState10","hasLoadedOpcos","setHasLoadedOpcos","_useState11","_persistedState$proje2","projectError","_useState12","setProjectError","_useState13","_persistedState$lastF","lastFetchedCode","_useState14","setLastFetchedCode","_useState15","_useState16","isOpcoOverflowing","setIsOpcoOverflowing","_useState17","_useState18","canScrollLeft","setCanScrollLeft","_useState19","_useState20","canScrollRight","setCanScrollRight","opcoScrollRef","selectionRevisionRef","previousSelectionRef","selectedOpcoCodeValue","some","selectedProjectIdValue","projectsLoading","hasSelectionContext","selectionKey","selectionEvent","revision","changedAt","toISOString","dashboardSelectionEvent","refreshOpcoScrollerState","container","maxScrollLeft","scrollWidth","clientWidth","scrollLeft","then","rbacContext","o","a","b","authorizedOpcos","catch","isOpcoLoading","_data$projects","fetchOpcoCatalogProjects","sorted","latestByName","normalizedName","existingProject","existingTimestamp","dedupeProjectsByLatestName","_sorted$id","_sorted","onResize","addEventListener","scroller","removeEventListener","selectedProject","find","opcoOptions","reverse","projectOptions","selectedOpcoIndex","findIndex","selectedProjectIndex","scrollOpcos","direction","scrollAmount","Math","max","scrollBy","behavior","DisplayIcon","$icon","Globe","$isGhost","$iconSize","$isInverted","ref","SelectButtonGroup","$defaultActiveIndex","SelectButton","onSelect","type","disabled","Docs","height","ProgressCircular","TabOverviewContent","child","elementType","isWorkItemsSectionChild","NoOpcoAccessPanel","NoOpcoAccessHeader","NoOpcoAccessTitleRow","NoOpcoInfoIcon","NoOpcoFeatureGrid","NoOpcoFeatureCard","NoOpcoFeatureIcon","NoOpcoFeatureContent","NoOpcoFeatureTitle","NoOpcoFeatureSubtitle","NO_ACCESS_FEATURES","PlusWithCircle","Analytics","UserGroup","NoOpcoAccess_NoOpcoAccess","NoOpcoAccess","backgroundImage","Info","feature","ScrollSectionContainer","HeaderRow","ScrollContent","ItemsRow","CardSlot","WorkItemCardContainer","ItemHeader","ItemPrimaryContent","ItemFooter","ItemMetaChip","SprintTagWrap","FooterTagWrap","PriorityTagWrap","$priority","WorkItems_HorizontalScrollSection","_ref$viewAllLabel","viewAllLabel","scrollHostRef","scrollbarRef","stopCardDragScroll","stopPropagation","host","track","querySelector","thumb","viewport","scrollToTrackPosition","clientX","_thumbRect$width","_scrollbarRef$current","trackRect","getBoundingClientRect","thumbRect","thumbWidth","usableTrackWidth","desiredOffset","ratio","min","scrollTo","handleTrackMouseDown","target","contains","preventDefault","handleTrackTouchStart","touch","touches","passive","as","MicroButton","ScrollbarNavigator","$isVertical","$width","onMouseDown","onTouchStart","WorkItems_WorkItemCard","item","priorityLabel","priority","getPriorityLabel","sprintLabel","className","sprintEndDate","pendingLabel","pending","completeLabel","complete","minWidth","overflowWrap","color","Tag","isDismissible","Divider","orientation","$isDashed","WorkItemsSection","_ref$title","items","HorizontalScrollSection","WorkItemCard","WorkItems_WorkItemsSection","Overlay","Loading_Loading","isLoading","DEFAULT_WORK_ITEMS","Dashboard","userFirstName","userLastName","profilePicture","logoutUser","isNavbarLoaded","setIsNavbarLoaded","hasOpcoAccess","setHasOpcoAccess","_initialStoreData$das","initialStoreData","setSelectionEvent","isCancelled","_storeData$dashboardS","storeData","isSearchDisabled","isCreateDisabled","shouldShowProjectDetails","shouldRenderDashboardBody","hasCardholderSelection","document","selector","originalState","applyDisabledState","tabIndex","getAttribute","ariaDisabled","rememberState","setAttribute","restoreState","previousState","removeAttribute","syncCreateButtons","querySelectorAll","observer","MutationObserver","observe","childList","subtree","disconnect","Loading","opacity","onFocusCapture","matches","blur","ErrorUi","config","mode","variant","caption","profile","display","padding","appType","ProjectOverview","opcoCode","StyledAppStoreContainer","AppFeatures","userName","storeType","user","REACT_APP_FA_APPSTORE_UR","TestAutomation","email","ThemeProvider","platform","StyledContainer","ProductFeatureOverview","isSearchComplete","Container","$isFullWidth","Microservices","AppFeature","APIProxy","CustomComponent","AppServices","AppContainer","ContentFrame","theme","colors","ContentContainer","StyleYellowBanner","floats","bannerImageUrl","StyleYellowImage","StyleBrowsingHome","StyleMicroServiceImage","microServicesUrl","StyleTestSuitesImage","infraAsCodeUrl","testSuitessUrl","StyleComponentImage","componentUrl","StyleAPIProxiesImage","apiProxiesUrl","StyleContentFrame2","StyledTextContainer","_templateObject18","typography","StyleTitleContainer","_templateObject19","_templateObject20","StylePadContainer","_templateObject21","StyleBackButton","_templateObject22","StyleArrow","_templateObject23","StyleDashboardLabel","_templateObject24","_templateObject25","componentMap","ComingSoon_ComingSoon","ComingSoon","useLocation","ComponentToRender","Link","to","textDecoration","APIProxies","_ref$userName","_ref$userLastName","_ref$profilePicture","TestSuites","Component","InfraAsCode","NoAppsFoundConfig","RenderButton","Title","Description","ButtonText","MicroService","SearchResultsContainer","SearchResults_SearchResults","StyledTitlebarContainer","StyledIconContainer","StyledRighIconContainer","StyledBack","Profile","navigationService","back","ChevronLeft","Avatar","image","initials","charAt","ErrorWrapper","ErrorTitle","h1","ErrorMessage","HomeLink","app_Error","Error404","CreateStandaloneWebApp","CreateServerlessMicroservice","Modal","formatTime","time","minutes","floor","seconds","padStart","LogoutModal_LogoutModal","onContinue","onLogout","timeRemaining","close","setClose","timeLeft","setTimeLeft","intervalId","setInterval","newTime","clearInterval","handleStayLoggedIn","handleLogoutNow","ComboButtons","UserActivityContext","UserActivityProvider","isAuthenticated","useAuthLoginProvider","isInactive","setIsInactive","setTimeRemaining","idleTimeout","handleLogout","resetActivity","idleTimer","warningTimer","handleContinueSession","activityEvents","contextValue","LogoutModal","InfraAsCodeDetails","CreateWebAppServerlessMicro","HelpDocumentation","navigationVersion","bumpNavigationRetry","CreateInfraAsCode","PLATFORM_VERSION_TEXT","FALLBACK_USER","givenName","familyName","nickname","picture","PlatformName","isCreateRoutePath","NavBar","ShowHeader","footer","ShowFooter","FooterText","App","previousPathnameRef","setUser","setLoading","_useAuthLoginProvider","getUserAccount","isInitialized","previousPathname","currentPathname","createTransition","getUserAccountRef","cancelled","_await$getUserAccount","userData","effectiveUser","Routes","Route","path","element","Navigate","AppStore","Components","SearchResults","MicroservicesComponent","APIProxiesComponent","TestSuitesComponent","RootErrorBoundary","reload","flexDirection","alignItems","justifyContent","minHeight","fontFamily","background","marginBottom","maxWidth","textAlign","marginTop","border","borderRadius","cursor","fontWeight","handleReload","ErrorUI_RootErrorBoundary","FeatureHubAppDefinition","ownFeatureServiceDefinitions","StoreDataProvider","AppDefinition","StoreDataServiceDefinition","ShellFontFamilyStyle","createGlobalStyle","defineExternals","extractFailedUrl","part","_value$match","MODULE_LOAD_RETRY_DELAYS_MS","isDebugFeatureAppsEnabled","SHELL_FEATURE_SERVICE_DEFINITIONS","defineHistoryService","createRootLocationTransformer","consumerPathsQueryParamName","shellOwnedServiceIds","definition","interceptedLogCache","logInterceptedErrorOnce","fingerprintHint","text","loggedAt","cacheEntries","pruneInterceptedLogCache","lastLoggedAt","warn","sanitizeRemoteFeatureAppModule","module","featureAppUrl","_default","default","featureAppDefinition","removeDuplicateShellOwnedServices","ownServices","removedIds","serviceDefinition","serviceId","isRetryableModuleLoadError","waitForRetryDelay","loadFeatureAppModuleWithRetry","executeLoad","loadFederatedModule","loadAmdModule","retryDelay","handleFeatureAppFailure","_hints$url","notifyFeatureAppFailure","isLikelyRemoteRuntimeError","reason","stopImmediatePropagation","resourceUrl","currentSrc","href","getResourceUrlFromEvent","failurePayload","filename","handled","isScriptResourceFailure","_createFeatureHub","createFeatureHub","moduleLoader","recordResolvedFeatureAppModule","providedExternals","featureServiceDefinitions","featureServiceDependencies","featureAppManager","REACT_APP_FA_APP_STORE_URL","lastNavigationPathname","listen","root","ReactDOM","getElementById","initialise","Initialise","consentAds","consentAnalytics","consentPreferences","gtmId","appTree","CoreFonts","AuthProvider","FeatureHubContextProvider","HistoryRouter","FeatureAppContainer"],"sourceRoot":""}