{"version":3,"file":"packages_core-machinery_src_index_ts-packages_ui-mobile_src_index_tsx.chunk.bundle","sources":["/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-machinery/src/constants/moduleMachineryRoles.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-machinery/src/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-machinery/src/services/ddlCacheMap.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-machinery/src/services/machineryApi.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/api.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/dashboardRoles.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/database.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/defaultConfig.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/navigation.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/constants/staleTimes.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/http/post.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/types/api.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/types/appModules.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/types/role.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/date.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/fetchWithCache.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/fileUpload.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/isAllowedForRoles.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/number.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/safeDateTimeParsers.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/safeParseParamId.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/core-utils/src/utils/sortDropdownByName.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/breadcrumb.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/breadcrumbRegistry.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/checkbox.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/confirmation-modal.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/date-picker.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/date-range-picker/Calendar.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/date-range-picker/DateRangePicker.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/date-range-picker/Day.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/date-range-picker/Header.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/date-range-picker/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/field-group.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/folder-icon-button.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/form-box.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/icon-card-button.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/loading-spinner.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/mobile-table.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/network-indicator.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/numeric-field.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/ods-widget.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/progress-bar.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/radio-group.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/search-input.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/searchable-select.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/select.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/skeleton-loader.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/stat-card.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/status-button.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/summary-table.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/tag.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/time-picker.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/components/useSelectPositioning.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/hooks/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/hooks/useBreadcrumbTrail.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/hooks/useExitConfirmationGuard.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/hooks/useNetworkStatus.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/hooks/useToast.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/ui-mobile/src/index.tsx"],"sourcesContent":["import { type UserRole, UserRoles } from \"@data-oil-front/core-utils\";\n\nexport const MODULE_MACHINERY_ROLES: UserRole[] = [\n  UserRoles.ADMINISTRADOR,\n  UserRoles.ANALISTA_DE_PLANIFICACION,\n];\n","export * from './services/machineryApi';\nexport * from './services/ddlCacheMap';\nexport * from './constants/moduleMachineryRoles';","import { storageService } from \"@data-oil-front/core-host\";\nimport {\n  TABLE_NAMES,\n  type TableName,\n} from \"@data-oil-front/core-utils\";\n\n/**\n * Canonical TABLE → AsyncStorage cache key(s) map for the \"machinery\"\n * namespace. Same concept as `DAILY_REPORT_DDL_CACHE_MAP` in\n * core-reports.\n *\n * Heads up: as of today core-machinery does NOT persist anything to\n * AsyncStorage. All its getters go straight through `post` without\n * `fetchWithCache`. The entries below are intentionally empty so the\n * DDL sync orchestrator still recognises these tables as owned by the\n * Machinery MFE (fingerprint detection runs, warmup is re-fired) even\n * though there is nothing to invalidate in storage.\n *\n * Whenever persistent caching is added to core-machinery, flesh out\n * each entry with the actual `keys` / `prefixes` and the invalidation\n * pipeline will pick it up automatically.\n */\nexport interface MachineryCacheEntry {\n  keys?: string[];\n  prefixes?: string[];\n}\n\nexport const MACHINERY_NAMESPACE = \"machinery\" as const;\n\nexport const MACHINERY_DDL_CACHE_MAP: Partial<\n  Record<TableName, MachineryCacheEntry>\n> = {\n  [TABLE_NAMES.MACHINERY]: {},\n  [TABLE_NAMES.MACHINERY_LOCATION]: {},\n  [TABLE_NAMES.MACHINERY_FUEL_LOAD]: {},\n  [TABLE_NAMES.MACHINERY_STATUS_CHANGE]: {},\n  [TABLE_NAMES.MACHINERY_OPERATOR]: {},\n  [TABLE_NAMES.MACHINERY_SUPPLIER]: {},\n};\n\nexport const MACHINERY_DDL_TABLES: readonly TableName[] = Object.keys(\n  MACHINERY_DDL_CACHE_MAP,\n) as TableName[];\n\n/**\n * Invalidates the AsyncStorage entries associated to the given\n * Machinery tables. Silent on errors.\n *\n * Today this is effectively a no-op because core-machinery does not\n * persist anything, but the orchestrator still calls it so the\n * contract remains uniform across packages. It becomes meaningful as\n * soon as `keys` / `prefixes` are added to the map above.\n */\nexport async function invalidateMachineryDDLCaches(\n  tables: readonly TableName[],\n): Promise<void> {\n  const work: Array<Promise<void>> = [];\n\n  for (const table of tables) {\n    const entry = MACHINERY_DDL_CACHE_MAP[table];\n    if (!entry) continue;\n\n    if (entry.keys) {\n      for (const key of entry.keys) {\n        work.push(\n          storageService\n            .remove(MACHINERY_NAMESPACE, key)\n            .catch(() => undefined),\n        );\n      }\n    }\n    if (entry.prefixes) {\n      for (const prefix of entry.prefixes) {\n        work.push(\n          storageService\n            .removeByPrefix(MACHINERY_NAMESPACE, prefix)\n            .catch(() => undefined),\n        );\n      }\n    }\n  }\n\n  await Promise.all(work);\n}\n","import { ApiPostBody, TABLE_NAMES, API_VERBS, purePost } from \"@data-oil-front/core-utils\";\nimport { configService } from \"@data-oil-front/core-host\";\n\nasync function post<T>(\n  body: Partial<ApiPostBody>,\n  options?: RequestInit,\n): Promise<T> {\n  const config = await configService.getEffectiveConfig();\n  const url = config?.API_BASE_URL;\n\n  if (!url) {\n    throw new Error(\"[API Client] API_BASE_URL is missing in config.\");\n  }\n\n  const response = await purePost<T>(url, body, options);\n\n  if (!response.success) {\n    const message =\n      \"message\" in response ? response.message : \"Unknown API error\";\n    throw new Error(message);\n  }\n\n  if (!(\"data\" in response)) {\n    throw new Error(\"Invalid API response shape.\");\n  }\n\n  return response.data as T;\n}\nimport dayjs from \"dayjs\";\nimport utc from \"dayjs/plugin/utc\";\n\ndayjs.extend(utc);\n\nexport interface MachineryData {\n  id: number;\n  name?: string;\n  machine_name?: string;\n  machinery_name?: string;\n  description?: string;\n  plate?: string;\n  status?: \"operational\" | \"maintenance\" | \"inactive\";\n  location_id?: number | string;\n  [key: string]: any;\n}\n\nexport interface MachineryLocation {\n  id: number | string;\n  name: string;\n}\n\nexport interface MachineryOperator {\n  id: number;\n  name?: string;\n  operator_name?: string;\n  [key: string]: any;\n}\n\nexport interface MachinerySupplier {\n  id: number;\n  name?: string;\n  supplier_name?: string;\n  [key: string]: any;\n}\n\nexport interface MachineryFuelLoad {\n  id?: number;\n  machinery_id: number;\n  load_quantity: number;\n  load_date: string;\n  fuel_type?: string | null;\n  image?: string | null;\n  user_id?: number | string | null;\n}\n\nexport interface MachineryFuelArrival {\n  id?: number;\n  tank_id: number;\n  arrival_date: string;\n  liters: number;\n  comments?: string | null;\n  user_id?: number | string | null;\n}\n\nexport interface MachineryFuelTank {\n  id: number;\n  name: string;\n  fuel_type: string;\n}\n\nexport interface FuelTankStock {\n  id: number;\n  name: string;\n  fuel_type: string;\n  stock_actual: number;\n  total_entradas: number;\n  total_salidas: number;\n}\n\nexport interface MachineryStatusChange {\n  id: number;\n  machinery_id: number;\n  status_change_date: string;\n  title?: string | null;\n  comment?: string | null;\n  image?: string | null;\n  user_id?: number | string | null;\n  [key: string]: any;\n}\n\nexport interface FormattedFuelLoad {\n  Fecha: string;\n  Hora: string;\n  Cantidad: string;\n  Tipo: string;\n  load_date: string;\n  load_quantity: number;\n  timestamp: number;\n  id: number;\n  image?: string | null;\n}\n\n/**\n * Fetches all machinery from the API\n */\nexport function fetchMachineryList(): Promise<MachineryData[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryData[]>(payload);\n}\n\n/**\n * Fetches all machinery locations from the API\n */\nexport function fetchMachineryLocations(): Promise<MachineryLocation[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_LOCATION,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryLocation[]>(payload);\n}\n\n/**\n * Fetches all machinery fuel loads from the API\n */\nexport function fetchMachineryFuelLoads(): Promise<MachineryFuelLoad[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_FUEL_LOAD,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryFuelLoad[]>(payload);\n}\n\n/**\n * Gets the last fuel load for each machinery\n * Returns a Map of machinery_id -> LastFuelLoad\n */\nexport function getLastFuelLoadsByMachinery(\n  fuelLoads: MachineryFuelLoad[],\n): Map<number, MachineryFuelLoad> {\n  const fuelLoadsMap = new Map<number, MachineryFuelLoad>();\n  const loadsByMachinery = new Map<number, MachineryFuelLoad[]>();\n\n  // Group fuel loads by machinery_id\n  fuelLoads.forEach((load) => {\n    const machineryId = load.machinery_id;\n    if (!loadsByMachinery.has(machineryId)) {\n      loadsByMachinery.set(machineryId, []);\n    }\n    loadsByMachinery.get(machineryId)!.push(load);\n  });\n\n  // Sort by date and get the most recent for each machinery\n  loadsByMachinery.forEach((loads, machineryId) => {\n    if (!loads || !loads[0]) {\n      return;\n    }\n    loads.sort((a, b) => {\n      const dateA = dayjs(a.load_date).valueOf();\n      const dateB = dayjs(b.load_date).valueOf();\n      return dateB - dateA;\n    });\n    const firstLoad = loads[0];\n    if (firstLoad) {\n      fuelLoadsMap.set(machineryId, firstLoad);\n    }\n  });\n\n  return fuelLoadsMap;\n}\n\n/**\n * Creates a Map of location_id -> location name\n */\nexport function createLocationsMap(\n  locations: MachineryLocation[],\n): Map<number | string, string> {\n  const locationsMap = new Map<number | string, string>();\n  locations.forEach((loc) => {\n    locationsMap.set(loc.id, loc.name);\n  });\n  return locationsMap;\n}\n\n/**\n * Fetches a single machinery by ID\n */\nexport async function fetchMachineryById(\n  id: number,\n): Promise<MachineryData | null> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY,\n    fields: [],\n    filter: [[\"id\", \"=\", id]],\n    values: [],\n  };\n\n  const result = await post<MachineryData[]>(payload);\n  if (Array.isArray(result) && result.length > 0 && result[0]) {\n    return result[0];\n  }\n  return null;\n}\n\n/**\n * Fetches status change history for a machinery\n */\nexport function fetchMachineryStatusChanges(\n  machineryId: number,\n): Promise<MachineryStatusChange[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_STATUS_CHANGE,\n    fields: [],\n    filter: [[\"machinery_id\", \"=\", machineryId]],\n    values: [],\n  };\n\n  return post<MachineryStatusChange[]>(payload);\n}\n\n/**\n * Fetches operator details by ID\n */\nexport async function fetchMachineryOperator(\n  operatorId: number,\n): Promise<MachineryOperator | null> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_OPERATOR,\n    fields: [],\n    filter: [[\"id\", \"=\", operatorId]],\n    values: [],\n  };\n\n  const result = await post<MachineryOperator[]>(payload);\n  if (Array.isArray(result) && result[0]) {\n    return result[0];\n  }\n  return null;\n}\n\n/**\n * Fetches supplier details by ID\n */\nexport async function fetchMachinerySupplier(\n  supplierId: number,\n): Promise<MachinerySupplier | null> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_SUPPLIER,\n    fields: [],\n    filter: [[\"id\", \"=\", supplierId]],\n    values: [],\n  };\n\n  const result = await post<MachinerySupplier[]>(payload);\n  if (Array.isArray(result) && result.length > 0 && result[0]) {\n    return result[0];\n  }\n  return null;\n}\n\n/**\n * Fetches fuel loads for a specific machinery\n */\nexport async function fetchMachineryFuelLoadsByMachinery(\n  machineryId: number,\n): Promise<MachineryFuelLoad[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_FUEL_LOAD,\n    fields: [],\n    filter: [[\"machinery_id\", \"=\", machineryId]],\n    values: [],\n  };\n\n  return post<MachineryFuelLoad[]>(payload);\n}\n\n/**\n * Fetches a single fuel load by id\n */\nexport async function fetchMachineryFuelLoadById(\n  fuelLoadId: number,\n): Promise<MachineryFuelLoad | null> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_FUEL_LOAD,\n    fields: [],\n    filter: [[\"id\", \"=\", fuelLoadId]],\n    values: [],\n  };\n\n  const result = await post<MachineryFuelLoad[]>(payload);\n  if (Array.isArray(result) && result.length > 0 && result[0]) {\n    return result[0];\n  }\n  return null;\n}\n\n/**\n * Updates an existing fuel load record\n * Date format expected by backend: \"YYYY-MM-DD HH:mm:ss\"\n */\nexport async function updateMachineryFuelLoad(\n  fuelLoadId: number,\n  loadDate: string,\n  loadQuantity: number,\n  image?: string | null,\n): Promise<any> {\n  const fields: string[] = [\"load_date\", \"load_quantity\"];\n  const values: any[] = [loadDate, loadQuantity];\n\n  if (image) {\n    fields.push(\"image\");\n    values.push(image);\n  }\n\n  const payload: ApiPostBody = {\n    verb: API_VERBS.UPDATE,\n    table: TABLE_NAMES.MACHINERY_FUEL_LOAD,\n    fields,\n    filter: [[\"id\", \"=\", fuelLoadId]],\n    values,\n  };\n\n  return post<any>(payload);\n}\n\n/**\n * Formats and sorts fuel load history with proper date/time handling\n * Returns formatted data with date, time, quantity, and type\n */\nexport function formatFuelLoadHistory(\n  fuelLoads: MachineryFuelLoad[],\n  fallbackFuelType?: string | null,\n): FormattedFuelLoad[] {\n  const formatted = fuelLoads.map((item, index) => {\n    const rawDateValue = item.load_date;\n    let loadDate: dayjs.Dayjs;\n\n    if (typeof rawDateValue === \"string\") {\n      if (rawDateValue.includes(\"T\") && rawDateValue.endsWith(\"Z\")) {\n        // Format ISO UTC: \"2025-11-20T00:00:00.000Z\"\n        loadDate = dayjs.utc(rawDateValue);\n      } else if (rawDateValue.includes(\" \")) {\n        // Format \"YYYY-MM-DD HH:mm:ss\"\n        loadDate = dayjs(rawDateValue);\n      } else {\n        loadDate = dayjs(rawDateValue);\n        if (!loadDate.isValid()) {\n          loadDate = dayjs.utc(rawDateValue);\n        }\n      }\n    } else if (rawDateValue) {\n      loadDate = dayjs(rawDateValue);\n      if (!loadDate.isValid()) {\n        loadDate = dayjs.utc(rawDateValue);\n      }\n    } else {\n      loadDate = dayjs();\n    }\n\n    if (!loadDate.isValid()) {\n      loadDate = dayjs();\n    }\n\n    const quantity =\n      typeof item.load_quantity === \"number\"\n        ? item.load_quantity\n        : parseFloat(String(item.load_quantity)) || 0;\n\n    // Format time: if hour is 00:00:00, show \"—\" (backend didn't save time)\n    let formattedTime: string;\n    const hourUTC = loadDate.utc().hour();\n    const minuteUTC = loadDate.utc().minute();\n\n    if (hourUTC === 0 && minuteUTC === 0) {\n      formattedTime = \"—\";\n    } else {\n      formattedTime = `${String(hourUTC).padStart(2, \"0\")}:${String(minuteUTC).padStart(2, \"0\")}HS`;\n    }\n\n    const formattedDate = loadDate.format(\"DD/MM/YYYY\");\n\n    const rawType = item.fuel_type ?? fallbackFuelType ?? null;\n    const fuelType =\n      typeof rawType === \"string\" && rawType.trim().length > 0\n        ? rawType.trim().charAt(0).toUpperCase() +\n          rawType.trim().slice(1).toLowerCase()\n        : \"—\";\n\n    return {\n      Fecha: formattedDate,\n      Hora: formattedTime,\n      Cantidad: `${quantity} L`,\n      Tipo: fuelType,\n      load_date: rawDateValue,\n      load_quantity: quantity,\n      timestamp: loadDate.valueOf(),\n      id: item.id || index,\n      image: item.image ?? null,\n    };\n  });\n\n  // Sort by date descending (most recent first)\n  formatted.sort((a, b) => {\n    if (a.timestamp === b.timestamp) {\n      return (b.id || 0) - (a.id || 0);\n    }\n    return b.timestamp - a.timestamp;\n  });\n\n  return formatted;\n}\n\n/**\n * Calculates total fuel load for the last 30 days\n */\nexport function calculateTotal30Days(\n  formattedLoads: FormattedFuelLoad[],\n): number {\n  const thirtyDaysAgo = dayjs().subtract(30, \"days\").startOf(\"day\");\n  const today = dayjs().startOf(\"day\");\n\n  return formattedLoads\n    .filter((item) => {\n      const itemDate = dayjs(item.load_date).startOf(\"day\");\n      return (\n        (itemDate.isAfter(thirtyDaysAgo) || itemDate.isSame(thirtyDaysAgo)) &&\n        (itemDate.isBefore(today) || itemDate.isSame(today))\n      );\n    })\n    .reduce((sum, item) => sum + item.load_quantity, 0);\n}\n\n/**\n * Inserts a new fuel load record for a machinery.\n * Date format expected by backend: \"YYYY-MM-DD HH:mm:ss\"\n */\nexport async function insertMachineryFuelLoad(\n  machineryId: number,\n  loadDate: string,\n  loadQuantity: number,\n  image?: string | null,\n  tankId?: number,\n  userId: number | string | null = null,\n): Promise<any> {\n  const fields: string[] = [\n    \"machinery_id\",\n    \"load_date\",\n    \"load_quantity\",\n    \"user_id\",\n  ];\n  const values: any[] = [\n    machineryId,\n    loadDate,\n    loadQuantity,\n    userId != null ? String(userId) : null,\n  ];\n\n  if (image) {\n    fields.push(\"image\");\n    values.push(image);\n  }\n\n  if (tankId !== undefined) {\n    fields.push(\"tank_id\");\n    values.push(tankId);\n  }\n\n  const payload: ApiPostBody = {\n    verb: API_VERBS.INSERT,\n    table: TABLE_NAMES.MACHINERY_FUEL_LOAD,\n    fields,\n    filter: [],\n    values,\n  };\n\n  return post<any>(payload);\n}\n\n/**\n * Fetches all machinery operators from the API\n */\nexport function fetchMachineryOperators(): Promise<MachineryOperator[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_OPERATOR,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryOperator[]>(payload);\n}\n\n/**\n * Updates machinery status and related fields\n */\nexport async function updateMachineryStatus(\n  machineryId: number,\n  fields: string[],\n  values: any[],\n): Promise<any> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.UPDATE,\n    table: TABLE_NAMES.MACHINERY,\n    fields,\n    filter: [[\"id\", \"=\", machineryId]],\n    values,\n  };\n\n  return post<any>(payload);\n}\n\n/**\n * Inserts a machinery status change record\n */\nexport async function insertMachineryStatusChange(\n  machineryId: number,\n  statusChangeDate: string,\n  title?: string | null,\n  comment?: string | null,\n  image?: string | null,\n  userId: number | string | null = null,\n): Promise<any> {\n  const fields: string[] = [\"machinery_id\", \"status_change_date\", \"user_id\"];\n  const values: any[] = [\n    machineryId,\n    statusChangeDate,\n    userId != null ? String(userId) : null,\n  ];\n\n  if (title) {\n    fields.push(\"title\");\n    values.push(title);\n  }\n  if (comment) {\n    fields.push(\"comment\");\n    values.push(comment);\n  }\n  if (image) {\n    fields.push(\"image\");\n    values.push(image);\n  }\n\n  const payload: ApiPostBody = {\n    verb: API_VERBS.INSERT,\n    table: TABLE_NAMES.MACHINERY_STATUS_CHANGE,\n    fields,\n    filter: [],\n    values,\n  };\n\n  return post<any>(payload);\n}\n\n/**\n * Inserts a new fuel arrival record (tanker truck delivery).\n */\nexport async function insertMachineryFuelArrival(\n  tankId: number,\n  arrivalDate: string,\n  liters: number,\n  comments?: string | null,\n  userId: number | string | null = null,\n): Promise<any> {\n  const fields: string[] = [\"tank_id\", \"arrival_date\", \"liters\", \"user_id\"];\n  const values: any[] = [\n    tankId,\n    arrivalDate,\n    liters,\n    userId != null ? String(userId) : null,\n  ];\n\n  if (comments) {\n    fields.push(\"comments\");\n    values.push(comments);\n  }\n\n  const payload: ApiPostBody = {\n    verb: API_VERBS.INSERT,\n    table: TABLE_NAMES.MACHINERY_FUEL_ARRIVALS,\n    fields,\n    filter: [],\n    values,\n  };\n\n  return post<any>(payload);\n}\n\n/**\n * Fetches all fuel arrival records (tanker truck deliveries).\n */\nexport function fetchMachineryFuelArrivals(): Promise<MachineryFuelArrival[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_FUEL_ARRIVALS,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryFuelArrival[]>(payload);\n}\n\n/**\n * Most recent arrival per tank_id (by arrival_date descending).\n */\nexport function getLastFuelArrivalsByTankId(\n  arrivals: MachineryFuelArrival[],\n): Map<number, MachineryFuelArrival> {\n  const byTank = new Map<number, MachineryFuelArrival[]>();\n  arrivals.forEach((a) => {\n    const raw = a.tank_id as unknown;\n    const id =\n      typeof raw === \"number\" && Number.isFinite(raw)\n        ? raw\n        : parseInt(String(raw), 10);\n    if (!Number.isFinite(id)) return;\n    if (!byTank.has(id)) byTank.set(id, []);\n    byTank.get(id)!.push(a);\n  });\n\n  const result = new Map<number, MachineryFuelArrival>();\n  byTank.forEach((list, tid) => {\n    if (!list.length) return;\n    list.sort((a, b) => {\n      const dateA = dayjs(a.arrival_date).valueOf();\n      const dateB = dayjs(b.arrival_date).valueOf();\n      return dateB - dateA;\n    });\n    const latest = list[0];\n    if (latest) result.set(tid, latest);\n  });\n  return result;\n}\n\n/**\n * Fetches all fuel tanks from the reference table.\n */\nexport function fetchMachineryFuelTanks(): Promise<MachineryFuelTank[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.MACHINERY_FUEL_TANK,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<MachineryFuelTank[]>(payload);\n}\n\n/**\n * Fetches current stock for all fuel tanks from the dashboard view.\n */\nexport function fetchFuelTankStock(): Promise<FuelTankStock[]> {\n  const payload: ApiPostBody = {\n    verb: API_VERBS.SELECT,\n    table: TABLE_NAMES.DASH_FUEL_TANK_STOCK,\n    fields: [],\n    filter: [],\n    values: [],\n  };\n\n  return post<FuelTankStock[]>(payload);\n}\n\n/**\n * Resolves tank_id from a fuel_type string by looking up machinery_fuel_tank.\n * Returns the matching tank or null if not found.\n */\nexport async function getTankByFuelType(\n  fuelType: string,\n): Promise<MachineryFuelTank | null> {\n  const tanks = await fetchMachineryFuelTanks();\n  if (!Array.isArray(tanks)) return null;\n  const normalized = fuelType.toLowerCase().trim();\n  const match = tanks.find(\n    (t) => t.fuel_type.toLowerCase().trim() === normalized,\n  );\n  return match ?? null;\n}\n\n/**\n * Validates whether a tank has enough stock for the requested quantity.\n * Returns { ok, stockActual }.\n */\nexport async function validateTankStock(\n  tankId: number,\n  quantity: number,\n): Promise<{ ok: boolean; stockActual: number }> {\n  const stocks = await fetchFuelTankStock();\n  if (!Array.isArray(stocks)) return { ok: false, stockActual: 0 };\n  const tank = stocks.find((s) => s.id === tankId);\n  if (!tank) return { ok: false, stockActual: 0 };\n  const stockActual =\n    typeof tank.stock_actual === \"number\"\n      ? tank.stock_actual\n      : parseFloat(String(tank.stock_actual)) || 0;\n  return { ok: stockActual >= quantity, stockActual };\n}\n","export const MULTITENANT_API_BASE_URL =\n  \"https://multit-back.digitalflow.ar/api\";\n// export const MULTITENANT_API_BASE_URL = process.env.NODE_ENV === \"production\" && process.env.APP_ENV !== \"stage\"\n//     ? \"https://multit-back.digitalflow.ar/api\"\n//     : \"https://dataoilmanager.proyectolibertador.app/api\";\n","import { UserRole, UserRoles } from \"../types/role\";\n\nexport const DASHBOARD_ROLES: UserRole[] = [\n  UserRoles.ADMINISTRADOR,\n  UserRoles.GERENTE_DE_PLANIFICACION,\n  UserRoles.ANALISTA_DE_PLANIFICACION,\n  UserRoles.SUPERVISOR_DE_PRODUCCION,\n  UserRoles.OPERADOR_DE_PRODUCCION,\n];\n","export const TABLE_NAMES = {\n  // Machinery\n  MACHINERY: 'machinery',\n  MACHINERY_LOCATION: 'machinery_location',\n  MACHINERY_FUEL_LOAD: 'machinery_fuel_load',\n  MACHINERY_STATUS_CHANGE: 'machinery_status_change',\n  MACHINERY_OPERATOR: 'machinery_operator',\n  MACHINERY_SUPPLIER: 'machinery_supplier',\n  MACHINERY_FUEL_ARRIVALS: 'machinery_fuel_arrivals',\n  MACHINERY_FUEL_TANK: 'machinery_fuel_tank',\n  DASH_FUEL_TANK_STOCK: 'dash_fuel_tank_stock',\n\n  // Daily Reports\n  DAILY_REPORT_WELL: 'daily_report_well',\n  DAILY_REPORT_MEASUREMENT_POINT: 'daily_report_measurement_point',\n  DAILY_REPORT_PIT: 'daily_report_pit',\n  DAILY_REPORT_VACUUM_LOAD: 'daily_report_vacuum_load',\n  DAILY_REPORT_VACUUM_UNLOAD: 'daily_report_vacuum_unload',\n  DAILY_REPORT_STORAGE_TANK: 'daily_report_storage_tank',\n  DAILY_REPORT_DYNAMIC_SETTLEMENT_TANK: 'daily_report_dynamic_settlement_tank',\n  DAILY_REPORT_UPT_TANK: 'daily_report_upt_tank',\n  DAILY_REPORT_FLOW_STATION_TANK: 'daily_report_flow_station_tank',\n\n  // Financial / Fiscal\n  LIFTING_COST: 'lifting_cost',\n  SHIP_TO_SHIP: 'ship_to_ship',\n  BILLED_RECOVERY_AND_EXPENSES: 'billed_recovery_and_expenses',\n  OWN_FISCALIZED_PRODUCTION: 'own_fiscalized_production',\n  THIRD_PARTY_FISCALIZED_PRODUCTION: 'third_party_fiscalized_production',\n  MARKET_REFERENCE_PRICE: 'market_reference_price',\n\n  // Misc / Forms\n  COMMENTS_FORM: 'comments_form',\n  LOCATION: 'location',\n  FIELD: 'field',\n  WELL_CATEGORY: 'well_category',\n  PUMPING_METHOD: 'pumping_method',\n  ASSOCIATED_STRATEGY: 'associated_strategy',\n  FLOW_STATION: 'flow_station',\n  TREATMENT_PLANT_SYSTEM: 'treatment_plant_system',\n  VACUUM_INFO: 'vacuum_info',\n  VACUUM_COMPANY: 'vacuum_company',\n  DRIVERS_INFO: 'drivers_info',\n  WELL: 'well',\n  WELL_CLUSTER: 'well_cluster',\n  USER_INFO: 'user_info',\n  ACTIVITY: 'activity',\n  GET_FACILITIES_LIST: 'get_facilities_list',\n  LAB_REPORT: 'lab_report',\n  THIRD_PARTY_COMPANY: 'third_party_company',\n  TREATMENT_PLANT: 'treatment_plant',\n  UPT: 'upt',\n\n  // ODS\n  ODS_ACTIVITY_REPORT: 'ods_activity_report',\n  ODS_ITEM: 'ods_item',\n  ODS_COST_CENTER: 'ods_cost_center',\n  ODS_ACTIVITY: 'ods_activity',\n  ODS_GROUP: 'ods_group',\n  \n  // Facilities\n  MEASUREMENT_POINT: 'measurement_point',\n  FLOW_STATION_TANK: 'flow_station_tank',\n  TREATMENT_PLANT_DYNAMIC_STORAGE_TANK: 'treatment_plant_dynamic_storage_tank',\n  UPT_TANK: 'upt_tank',\n  PIT: 'pit',\n} as const;\n\nexport type TableName = (typeof TABLE_NAMES)[keyof typeof TABLE_NAMES];\n\n/**\n * Subset of tables that are **DDL / reference catalogs**: nearly-static\n * data managed by an admin from the backoffice (locations, wells,\n * facilities, dropdowns…).\n *\n * Their opposite are the transactional tables (daily reports, status\n * changes, fuel loads…) that are created from the app itself and\n * don't make sense to \"re-sync\" from the server.\n *\n * These are the tables we consider worth re-validating on\n * pull-to-refresh even when no MFE bundle changed, because the admin\n * may have added or removed rows directly in the database without\n * producing any frontend hash change.\n *\n * Rough ordering:\n *   - Most-used tables first (locations, fields, wells, facilities…)\n *     so that if the sync gets cut short we still refresh what the\n *     user is most likely to see.\n */\nexport const DDL_TABLES: readonly TableName[] = [\n  // Reports / dailyReport\n  TABLE_NAMES.LOCATION,\n  TABLE_NAMES.FIELD,\n  TABLE_NAMES.GET_FACILITIES_LIST,\n  TABLE_NAMES.WELL,\n  TABLE_NAMES.WELL_CATEGORY,\n  TABLE_NAMES.WELL_CLUSTER,\n  TABLE_NAMES.PUMPING_METHOD,\n  TABLE_NAMES.ASSOCIATED_STRATEGY,\n  TABLE_NAMES.FLOW_STATION,\n  TABLE_NAMES.FLOW_STATION_TANK,\n  TABLE_NAMES.TREATMENT_PLANT_SYSTEM,\n  TABLE_NAMES.TREATMENT_PLANT_DYNAMIC_STORAGE_TANK,\n  TABLE_NAMES.TREATMENT_PLANT,\n  TABLE_NAMES.UPT_TANK,\n  TABLE_NAMES.UPT,\n  TABLE_NAMES.PIT,\n  TABLE_NAMES.MEASUREMENT_POINT,\n  TABLE_NAMES.VACUUM_INFO,\n  TABLE_NAMES.VACUUM_COMPANY,\n  TABLE_NAMES.DRIVERS_INFO,\n  TABLE_NAMES.ACTIVITY,\n  TABLE_NAMES.THIRD_PARTY_COMPANY,\n\n  // ODS\n  TABLE_NAMES.ODS_COST_CENTER,\n  TABLE_NAMES.ODS_ITEM,\n  TABLE_NAMES.ODS_GROUP,\n  TABLE_NAMES.ODS_ACTIVITY,\n\n  // Machinery\n  TABLE_NAMES.MACHINERY,\n  TABLE_NAMES.MACHINERY_LOCATION,\n  TABLE_NAMES.MACHINERY_FUEL_LOAD,\n  TABLE_NAMES.MACHINERY_STATUS_CHANGE,\n  TABLE_NAMES.MACHINERY_OPERATOR,\n  TABLE_NAMES.MACHINERY_SUPPLIER,\n] as const;\n\nexport type DDLTableName = (typeof DDL_TABLES)[number];\n\n/**\n * Subset of DDL_TABLES that excludes tables NOT present in the aldyl API:\n * well_cluster, measurement_point, and daily_report_measurement_point.\n * These tables cause false \"unknownTables\" results in detectChangedDDLs\n * because the aldyl backend returns \"Error al procesar la consulta\".\n */\nexport const DDL_TABLES_ALDYL: readonly TableName[] = [\n  ...DDL_TABLES.filter(\n    (t) =>\n      t !== TABLE_NAMES.WELL_CLUSTER &&\n      t !== TABLE_NAMES.MEASUREMENT_POINT &&\n      t !== TABLE_NAMES.DAILY_REPORT_MEASUREMENT_POINT,\n  ),\n] as const;\n\nexport type DDLTableNameAldyl = (typeof DDL_TABLES_ALDYL)[number];\n\nexport const API_VERBS = {\n  SELECT: 'select',\n  INSERT: 'insert',\n  UPDATE: 'update',\n  DELETE: 'delete',\n} as const;\n\nexport type ApiVerb = (typeof API_VERBS)[keyof typeof API_VERBS];\n\n/**\n * Human-readable labels for each report table type.\n */\nexport const TABLE_LABELS: Partial<Record<TableName, string>> = {\n  [TABLE_NAMES.DAILY_REPORT_WELL]: 'Reporte de Pozo',\n  [TABLE_NAMES.DAILY_REPORT_MEASUREMENT_POINT]: 'Punto de Medición',\n  [TABLE_NAMES.DAILY_REPORT_PIT]: 'Reporte de Fosa',\n  [TABLE_NAMES.DAILY_REPORT_VACUUM_LOAD]: 'Carga VACUUM',\n  [TABLE_NAMES.DAILY_REPORT_VACUUM_UNLOAD]: 'Descarga VACUUM',\n  [TABLE_NAMES.DAILY_REPORT_STORAGE_TANK]: 'Tanque de Almacenamiento',\n  [TABLE_NAMES.DAILY_REPORT_DYNAMIC_SETTLEMENT_TANK]: 'Tanque de Asentamiento Dinámico',\n  [TABLE_NAMES.DAILY_REPORT_UPT_TANK]: 'Tanque UPT',\n  [TABLE_NAMES.DAILY_REPORT_FLOW_STATION_TANK]: 'Tanque Estación de Flujo',\n  [TABLE_NAMES.LIFTING_COST]: 'Lifting Cost',\n  [TABLE_NAMES.SHIP_TO_SHIP]: 'Ship To Ship',\n  [TABLE_NAMES.BILLED_RECOVERY_AND_EXPENSES]: 'Facturado, Recobro y Gastos PDVSA',\n  [TABLE_NAMES.OWN_FISCALIZED_PRODUCTION]: 'Fiscalización Propia',\n  [TABLE_NAMES.THIRD_PARTY_FISCALIZED_PRODUCTION]: 'Fiscalización de Terceros',\n  [TABLE_NAMES.MARKET_REFERENCE_PRICE]: 'Valor del Mercado',\n  [TABLE_NAMES.COMMENTS_FORM]: 'Comentarios',\n  [TABLE_NAMES.MACHINERY]: 'Maquinaria',\n  [TABLE_NAMES.MACHINERY_LOCATION]: 'Ubicación de Maquinaria',\n  [TABLE_NAMES.MACHINERY_FUEL_LOAD]: 'Carga de Combustible',\n  [TABLE_NAMES.MACHINERY_STATUS_CHANGE]: 'Cambio de Estatus',\n  [TABLE_NAMES.MACHINERY_OPERATOR]: 'Operador de Maquinaria',\n  [TABLE_NAMES.MACHINERY_SUPPLIER]: 'Proveedor de Maquinaria',\n  [TABLE_NAMES.MACHINERY_FUEL_ARRIVALS]: 'Llegada de Combustible',\n  [TABLE_NAMES.MACHINERY_FUEL_TANK]: 'Tanque de Combustible',\n  [TABLE_NAMES.DASH_FUEL_TANK_STOCK]: 'Stock de Tanque',\n};\n","import type { AppConfig } from '../types/config';\n\nexport const defaultConfig: AppConfig = {\n  API_BASE_URL: null,\n  LOGO_BASE_URL: null,\n  LOGO_SMALL: null,\n  primaryColor: null,\n  clientName: 'DataOil',\n  CORE_CONFIG: {},\n};\n","export const NAVIGATION = {\n  HOME: 'Home',\n  SYNC_DATA: 'SyncData',\n  DASHBOARD_WEB_VIEW: 'DashboardWebView',\n  DATA_LOADING: 'DataLoading',\n  REPORTS_HISTORY: 'ReportsHistory',\n  OTHER_REPORTS_FLOW: 'OtherReportsFlow',\n  LAB_REPORTS_FLOW: 'LabReportsFlow',\n  ODS_FLOW: 'ODSFlow',\n  MACHINERY_FLOW: 'MachineryFlow',\n  LOGIN: 'Login',\n} as const;\n\nexport const MACHINERY_SCREENS = {\n  HOME: 'MachineryHome',\n  PREVIEW: 'MachineryPreviewScreen',\n  NEW_FUEL: 'MachineNewFuel',\n  CHANGE_STATUS: 'MachineChangeStatus',\n  FUEL_ARRIVAL: 'MachineryFuelArrival',\n} as const;\n\nexport const ODS_SCREENS = {\n  HOME: 'ODSHome',\n  REPORT: 'ODSReport',\n} as const;\n\nexport const LAB_REPORTS_SCREENS = {\n  HOME: 'LabReportsHome',\n  VIEW_REPORT: 'LabViewReport',\n  ACTIVE_FORM: 'LabActiveForm',\n} as const;\n\nexport const OTHER_REPORTS_SCREENS = {\n  HOME: 'OtherReports',\n  LIFTING_COST: 'LiftingCostFormScreen',\n  OWN_INSPECTION: 'OwnInspectionFormScreen',\n  THIRD_PARTY_AUDIT: 'ThirdPartyAuditFormScreen',\n  MARKET_REFERENCE_PRICE: 'MarketReferencePriceFormScreen',\n  SHIP_TO_SHIP: 'ShipToShipFormScreen',\n  BILLED_RECOVERY_EXPENSES: 'BilledRecoveryAndExpensesFormScreen',\n  COMMENTS: 'CommentsFormScreen',\n} as const;\n\nexport const REPORTS_SCREENS = {\n  HISTORY_LIST: 'ReportsHistoryList',\n  HISTORY_VIEW: 'ReportsHistoryView',\n  DAILY_REPORT: 'DailyReport',\n  PAGE_2_EF: 'DRPage2EF',\n  PAGE_2_EPT1: 'DRPage2EPT1',\n  PAGE_2_FOSA: 'DRPage2Fosa',\n  PAGE_2_PM: 'DRPage2PM',\n  PAGE_2_UPT: 'DRPage2UPT',\n  PAGE_2_VACUUM: 'DRPage2Vacuum',\n  PAGE_2_WELL: 'DRPage2Well',\n  PAGE_3_EF_UNIC_MODEL: 'DRPage3EFUnicModel',\n  PAGE_3_EPT1: 'DRPage3EPT1',\n  PAGE_3_FOSA: 'DRPage3Fosa',\n  PAGE_3_PM: 'DRPage3PM',\n  PAGE_3_UPT: 'DRPage3UPT',\n  PAGE_3_VACUUM_LOADING: 'DRPage3VacuumLoading',\n  PAGE_3_VACUUM_UNLOADING: 'DRPage3VacuumUnloading',\n  PAGE_3_WELL: 'DRPage3Well',\n  PAGE_4_VACUUM_LOADING: 'DRPage4VacuumLoading',\n  PAGE_5_VACUUM_LOADING: 'DRPage5VacuumLoading',\n} as const;\n","const STALE_TIME_DDL_PROD = 5 * 60 * 1000; // 5 minutes\nconst STALE_TIME_DDL_DEV = 60 * 1000; // 1 minute\n\nexport const STALE_TIME_DDL =\n  process.env.NODE_ENV === \"development\"\n    ? STALE_TIME_DDL_DEV\n    : STALE_TIME_DDL_PROD;\n","import { HttpClientOptions } from \"./misc\";\n\ninterface RequestSuccess<T> {\n  data: T | T[];\n}\n\ninterface RequestFail {\n  message: string;\n}\n\ntype PostResponse<T> = (RequestSuccess<T> | RequestFail) & {\n  success: boolean;\n  status: number;\n};\n\nexport type PurePostResponse<T> = Promise<PostResponse<T>>;\n\n/**\n * @description Makes a POST request to the given URL with the given body and options.\n * @param url - The URL to make the request to.\n * @param body - The body of the request.\n * @param options - The options for the request.\n * @returns A promise that resolves to the response data.\n * @example\n * ```ts\n * const result = await purePost(\"https://api.example.com/data\", { foo: \"bar\" });\n * console.log(result);\n * ```\n */\nexport async function purePost<T>(\n  url: string,\n  body: unknown,\n  options?: HttpClientOptions,\n): PurePostResponse<T> {\n  try {\n    const { headers, ...restOptions } = options || {};\n\n    const res = await fetch(url, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\", ...headers },\n      body: JSON.stringify(body),\n      ...restOptions,\n    });\n\n    if (!res.ok) {\n      const status = res.status;\n      const text = await res.text();\n\n      throw new Error(`HTTP ${status}: ${text}`, {\n        cause: { status },\n      });\n    }\n\n    const json = await res.json();\n\n    if (json && Array.isArray(json.result)) {\n      return { success: true, data: json.result as T, status: res.status };\n    } else {\n      return {\n        success: true,\n        data: (json?.result || {}) as T,\n        status: res.status,\n      };\n    }\n  } catch (error: unknown) {\n    if (typeof error === \"string\") {\n      return { success: false, message: error, status: 500 };\n    }\n\n    if (error instanceof Error) {\n      if (error.name === \"AbortError\") {\n        throw error; // Re-lanzar para que React Query / fetch reconozcan la cancelación\n      }\n\n      const cause = error.cause as { status?: number } | undefined;\n      const status = cause?.status || 500;\n      return {\n        success: false,\n        message: error.message,\n        status,\n      };\n    }\n\n    return {\n      success: false,\n      message: 'Unknown Error on \"post\" method',\n      status: 500,\n    };\n  }\n}\n","// CONSTANTS\nexport * from \"./constants/api\";\nexport * from \"./constants/dashboardRoles\";\nexport * from \"./constants/database\";\nexport * from \"./constants/defaultConfig\";\nexport * from \"./constants/staleTimes\";\nexport * from \"./constants/navigation\";\n\n// TYPES\nexport * from \"./types/api\";\nexport type { User } from \"./types/auth\";\nexport type { AppState, LabDataStore } from \"./types/app\";\nexport type {\n  AppConfig,\n  ConfigFetchOptions,\n  ConfigStoreState,\n  ConfigStatus,\n} from \"./types/config\";\nexport { AppModules } from \"./types/appModules\";\nexport * from \"./types/role\";\n\n// UTILS\nexport * from \"./utils/isAllowedForRoles\";\nexport * from \"./utils/safeDateTimeParsers\";\nexport * from \"./utils/sortDropdownByName\";\nexport * from \"./utils/safeParseParamId\";\nexport { getDefaultTime, formatTwoDigits, formatDateWithTime } from \"./utils/date\";\nexport { normalizeNumericString, toNumber } from \"./utils/number\";\nexport * from \"./utils/fileUpload\";\nexport * from \"./utils/fetchWithCache\";\n\n// HTTP METHODS\nexport * from \"./http/post\";\n","import { ApiVerb } from \"../constants/database\";\n\nexport type ApiFilter = [\n  string,\n  string,\n  string | number | boolean | string[] | number[],\n];\n\nexport interface IApiPostBody {\n  verb: ApiVerb;\n  table: string;\n  fields?: string[];\n  values?: unknown[];\n  filter?: ApiFilter[];\n}\n\nexport class ApiPostBody {\n  verb: ApiVerb;\n  table: string;\n  fields: string[] = [];\n  values: unknown[] = [];\n  filter: ApiFilter[] = [];\n\n  constructor(options: IApiPostBody) {\n    const { verb, table, fields = [], values = [], filter = [] } = options;\n    this.verb = verb;\n    this.table = table;\n    this.fields = fields;\n    this.values = values;\n    this.filter = filter;\n  }\n}\n\n// const newApiPostBody = new ApiPostBody(); // Error: Expected 1 arguments, but got 0.\n","export const AppModules = {\n  DailyReport: \"dailyReport\",\n  LabReport: \"labReport\",\n  ReportHistory: \"reportHistory\",\n  OtherReports: \"otherReports\",\n  ODS: \"odsModule\",\n  Dashboard: \"dashboard\",\n  Machinery: \"machinery\",\n} as const;\n\nexport type AppModule = (typeof AppModules)[keyof typeof AppModules];\n","export const UserRoles = {\n  OPERADOR_DE_PRODUCCION: \"OPERADOR_DE_PRODUCCION\",\n  SUPERVISOR_DE_PRODUCCION: \"SUPERVISOR_DE_PRODUCCION\",\n  ANALISTA_DE_PLANIFICACION: \"ANALISTA_DE_PLANIFICACION\",\n  GERENTE_DE_PLANIFICACION: \"GERENTE_DE_PLANIFICACION\",\n  ADMINISTRADOR: \"ADMINISTRADOR\",\n} as const;\n\nexport type UserRole = (typeof UserRoles)[keyof typeof UserRoles];\n","export const formatTwoDigits = (value: number) => value.toString().padStart(2, '0');\n\nexport const getDefaultTime = () => {\n  const now = new Date();\n  return `${formatTwoDigits(now.getHours())}:${formatTwoDigits(\n    now.getMinutes(),\n  )}`;\n};\n\nexport const formatDateWithTime = (date: Date | null, time: string | null) => {\n  if (!date) return null;\n  const safeTime = time ?? '00:00';\n  const [hoursRaw, minutesRaw] = safeTime.split(':');\n  const hours = formatTwoDigits(\n    Math.max(\n      0,\n      Math.min(\n        23,\n        Number.isFinite(Number(hoursRaw)) ? Number(hoursRaw) : 0,\n      ),\n    ),\n  );\n  const minutes = formatTwoDigits(\n    Math.max(\n      0,\n      Math.min(\n        59,\n        Number.isFinite(Number(minutesRaw)) ? Number(minutesRaw) : 0,\n      ),\n    ),\n  );\n  const seconds = '00';\n  return `${date.getFullYear()}-${formatTwoDigits(\n    date.getMonth() + 1,\n  )}-${formatTwoDigits(date.getDate())} ${hours}:${minutes}:${seconds}`;\n};\n","import NetInfo from \"@react-native-community/netinfo\";\nimport { storageService } from \"@data-oil-front/core-host\";\nimport { PurePostResponse } from \"../http/post\";\n\nexport type Namespace = \"dailyReport\" | \"ods\";\n\nexport interface FetchWithCacheOptions {\n  ttl?: number; // Time-to-Live in minutes\n  shouldFetch?: boolean; // Force refresh ignoring cache\n  ignoreExpiration?: boolean; // Ignore expiration if offline\n}\n\n/**\n * Standardizes API responses to extract data and throw on errors.\n */\nasync function executeFetch<T>(\n  fetcher: () => Promise<T> | PurePostResponse<T>,\n): Promise<T> {\n  const response = await fetcher();\n\n  if (response && typeof response === \"object\" && \"success\" in response) {\n    if (!(response as any).success) {\n      throw new Error((response as any).message || \"Failed to fetch data\");\n    }\n    return \"data\" in response ? (response as any).data : (response as T);\n  }\n\n  return response as T;\n}\n\n/**\n * Normalizes cache reading for legacy format { success, data }.\n */\nfunction parseCacheValue<T>(value: any): T {\n  if (value && typeof value === \"object\" && \"success\" in value && \"data\" in value) {\n    return value.data as T;\n  }\n  return value as T;\n}\n\n/**\n * Fetch data with robust Cache-Aside and Stale-While-Revalidate (SWR) support.\n *\n * @param namespace - The namespace for storage.\n * @param key - The key for storage.\n * @param fetcher - The function to fetch data.\n * @param options - Cache options (ttl, shouldFetch, ignoreExpiration).\n * @returns The cached data or the fetched data.\n * @throws Error if the device is offline and no cached data is found.\n */\nexport async function fetchWithCache<T>(\n  namespace: Namespace,\n  key: string,\n  fetcher: () => Promise<T> | PurePostResponse<T>,\n  options: FetchWithCacheOptions = {},\n): Promise<T> {\n  const {\n    ttl = process.env.NODE_ENV === \"development\" ? 5 : 30, // default 30 mins\n    shouldFetch = false,\n    ignoreExpiration = true,\n  } = options;\n\n  let isConnected = true;\n  try {\n    const netState = await NetInfo.fetch();\n    isConnected = netState.isConnected ?? true;\n  } catch (error) {\n    if (process.env.NODE_ENV === \"development\") {\n      console.warn(`⚠️ [fetchWithCache] NetInfo check failed for ${namespace}:${key}, assuming online.`, error);\n    }\n  }\n\n  // 1. Force Fetch (e.g. Pull-to-Refresh)\n  if (shouldFetch && isConnected) {\n    if (process.env.NODE_ENV === \"development\") {\n      console.log(`ℹ️ [fetchWithCache] Force fetch requested for ${namespace}:${key}`);\n    }\n    const data = await executeFetch(fetcher);\n    await storageService.set(namespace, key, data, ttl);\n    return data;\n  }\n\n  // 2. Read from Cache\n  const rawCache = await storageService.getRaw<T>(namespace, key);\n  const hasCache = rawCache && rawCache.value !== undefined;\n  \n  // Calculate expiration\n  const isExpired = !rawCache || (rawCache.expiresAt && Date.now() > rawCache.expiresAt);\n\n  // 3. Valid Cache\n  if (hasCache && (!isExpired || (!isConnected && ignoreExpiration))) {\n    if (process.env.NODE_ENV === \"development\") {\n      console.log(`[fetchWithCache] Serving valid cache for ${namespace}:${key}`);\n    }\n    return parseCacheValue<T>(rawCache.value);\n  }\n\n  // 4. Stale Cache -> SWR (Stale-While-Revalidate)\n  if (hasCache && isExpired) {\n    if (isConnected) {\n      if (process.env.NODE_ENV === \"development\") {\n        console.log(`[fetchWithCache] Cache expired for ${namespace}:${key}, stale-while-revalidate triggered`);\n      }\n      executeFetch(fetcher)\n        .then(async (data) => {\n          await storageService.set(namespace, key, data, ttl);\n        })\n        .catch((err) => {\n          if (err.name === \"AbortError\" || err.message?.includes(\"aborted\")) return;\n          if (process.env.NODE_ENV === \"development\") {\n            console.error(`[fetchWithCache] Background fetch failed for ${namespace}:${key}`, err);\n          }\n        });\n    }\n    return parseCacheValue<T>(rawCache.value);\n  }\n\n  // 5. No Cache -> Fetch Online\n  if (isConnected) {\n    if (process.env.NODE_ENV === \"development\") {\n      console.log(`[fetchWithCache] No cache, fetching online for ${namespace}:${key}`);\n    }\n    const data = await executeFetch(fetcher);\n    await storageService.set(namespace, key, data, ttl);\n    return data;\n  }\n\n  // 6. No Cache & Offline -> Throw\n  if (process.env.NODE_ENV === \"development\") {\n    console.error(`[fetchWithCache] Offline and no cache found for ${namespace}:${key}`);\n  }\n  throw new Error(`No cached data found for ${key} and device is offline.`);\n}\n","import RNFS from 'react-native-fs';\nimport { configService } from '@data-oil-front/core-host';\n\n/**\n * Lee un archivo local (uri) y lo convierte a base64 (sin prefijo data:)\n */\nexport async function readFileAsBase64(localUri: string): Promise<string> {\n  // En Android, DocumentPicker puede devolver content://; RNFS soporta ambos esquemas\n  const path = localUri;\n  const base64 = await RNFS.readFile(path, 'base64');\n  return base64;\n}\n\n/**\n * Sube un archivo como base64 al API_FILE_SERVER /save.\n * Devuelve el fileName remoto para posterior preview.\n */\nexport async function uploadFileToServer(localUri: string, preferredName: string): Promise<string> {\n  const ext = preferredName.includes('.') ? preferredName.split('.').pop() : undefined;\n  const fileName = preferredName || `ods-upload-${Date.now()}${ext ? `.${ext}` : ''}`;\n  const base64 = await readFileAsBase64(localUri);\n\n  const config = configService.getCurrentConfig();\n  const fileServer =\n    (config as any)?.API_FILE_SERVER ||\n    (configService.getDefaultConfig() as any)?.API_FILE_SERVER;\n\n  if (!fileServer) {\n    throw new Error('API_FILE_SERVER no está configurado');\n  }\n\n  const res = await fetch(`${fileServer}/save`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ fileName, fileContent: base64 }),\n  });\n  if (!res.ok) {\n    throw new Error('Error subiendo el archivo');\n  }\n  const json = await res.json();\n  return json?.fileName || fileName;\n}\n","export function isAllowedForRoles(\n  userRoles: string[] | undefined | null,\n  allowedRoles: string[],\n): boolean {\n  if (!userRoles || userRoles.length === 0) {\n    return false;\n  }\n\n  if (!allowedRoles || allowedRoles.length === 0) {\n    return false;\n  }\n\n  return userRoles.some((role) => allowedRoles.includes(role));\n}\n","export const normalizeNumericString = (\n  value: string | number | null | undefined,\n): string => {\n  if (value === null || value === undefined || value === '') return '';\n  const str = String(value);\n  return str.replace(',', '.');\n};\n\nexport const toNumber = (\n  value: string | number | null | undefined,\n): number | null => {\n  if (value === null || value === undefined || value === '') return null;\n  const normalized = normalizeNumericString(value);\n  const num = Number(normalized);\n  return Number.isNaN(num) ? null : num;\n};\n","import dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\n\ndayjs.extend(customParseFormat);\n\nexport const parseDate = (\n  value?: string | null,\n  format = \"YYYY-MM-DD\",\n): Date | null => {\n  if (!value) return null;\n  const parsed = dayjs(value, format);\n  return parsed.isValid() ? parsed.toDate() : null;\n};\n\nexport const parseTime = (\n  value?: string | null,\n  format = \"HH:mm\",\n): string | null => {\n  if (!value) return null;\n  const parsed = dayjs(value);\n  return parsed.isValid() ? parsed.format(format) : null;\n};\n","export const safeParseParamId = (value: unknown): number | undefined => {\n  const parsed = Number(value);\n  \n  if (Number.isFinite(parsed) && parsed > 0) {\n    return parsed;\n  }\n\n  return undefined;\n};","/**\n * Sort dropdown rows alphabetically by display name (Spanish locale, case-insensitive).\n * Do not use when order is fixed (e.g. well category whitelist, Sí/No, installation type).\n */\nexport function sortByLocalizedName<T>(\n  items: readonly T[],\n  getName: (item: T) => string,\n): T[] {\n  return [...items].sort((a, b) =>\n    String(getName(a) ?? '').localeCompare(String(getName(b) ?? ''), 'es', {\n      sensitivity: 'base',\n    }),\n  );\n}\n\nexport function sortStringsLocale(strings: readonly string[]): string[] {\n  return [...strings].sort((a, b) =>\n    a.localeCompare(b, 'es', { sensitivity: 'base' }),\n  );\n}\n\nconst naturalCollator = new Intl.Collator(undefined, {\n  numeric: true,\n  sensitivity: 'base',\n});\n\nconst normalizeString = (value: string | null | undefined): string =>\n  String(value ?? '').trim().replaceAll('-', ' ');\n\nexport const compareNaturalAsc = (\n  left: string | null | undefined,\n  right: string | null | undefined,\n): number => naturalCollator.compare(normalizeString(left), normalizeString(right));\n\nexport const sortByNaturalOrder = <T>(\n  items: T[],\n  getValue: (item: T) => string | null | undefined,\n): T[] => [...items].sort((a, b) => compareNaturalAsc(getValue(a), getValue(b)));\n","import React, { useState, FunctionComponent } from 'react';\nimport {\n  View,\n  Text,\n  TouchableOpacity,\n  StyleSheet,\n  Modal,\n  Pressable,\n} from 'react-native';\nimport { ChevronRightIcon } from 'react-native-heroicons/outline';\nimport { CommonActions, useNavigation } from '@react-navigation/native';\nimport { useBreadcrumbTrail } from '../hooks/useBreadcrumbTrail';\nimport type { TrailNode } from '../hooks/useBreadcrumbTrail';\nimport {\n  BREADCRUMB_LABEL_PARAM,\n  resolveBreadcrumbLabel,\n  type BreadcrumbLabelRegistry,\n} from './breadcrumbRegistry';\n\n/** Un item ya resuelto del breadcrumb: texto + destino de navegación. */\ninterface BreadcrumbItem {\n  label: string;\n  navigateTo?:\n    | string\n    | {\n        name: string;\n        params?: Record<string, unknown>;\n        mode?: 'push' | 'replace' | 'reset';\n      };\n}\n\ninterface BreadcrumbProps {\n  /** Registro de labels del dominio del MFE que monta el breadcrumb. */\n  routeLabels?: BreadcrumbLabelRegistry;\n  color?: string;\n}\n\n/**\n * Deriva los items visibles del breadcrumb a partir del trail de navegación.\n * - Omite rutas contenedoras (las que no tienen label propio): su pantalla hija\n *   las representa — así `ReportsHistory` (host) y `ReportsHistoryList` (MFE)\n *   colapsan en un solo item.\n * - Colapsa nodos consecutivos con el mismo label (p. ej. `Home` anidado).\n * - La pantalla actual (último nodo) se conserva siempre y no es navegable.\n */\nfunction deriveItemsFromTrail(\n  trail: TrailNode[],\n  routeLabels: BreadcrumbLabelRegistry,\n): BreadcrumbItem[] {\n  const resolved = trail.map((node, index) => {\n    const isLast = index === trail.length - 1;\n    const hasOwnLabel =\n      routeLabels[node.routeName] != null ||\n      typeof node.params?.[BREADCRUMB_LABEL_PARAM] === 'string';\n    return {\n      node,\n      isLast,\n      label: resolveBreadcrumbLabel(node, routeLabels),\n      // Un contenedor es un nodo intermedio sin label propio.\n      isContainer: !isLast && !hasOwnLabel,\n    };\n  });\n\n  const items: BreadcrumbItem[] = [];\n  for (const entry of resolved) {\n    if (entry.isContainer) continue;\n    // Colapsar consecutivos con el mismo label.\n    const prev = items[items.length - 1];\n    if (prev && prev.label === entry.label) continue;\n    items.push({\n      label: entry.label,\n      navigateTo: entry.isLast\n        ? undefined\n        : { name: entry.node.routeName, params: entry.node.params },\n    });\n  }\n  return items;\n}\n\nexport const Breadcrumb: FunctionComponent<BreadcrumbProps> = ({\n  routeLabels,\n  color,\n}) => {\n  const [showDropdown, setShowDropdown] = useState(false);\n  const navigation = useNavigation();\n  const trail = useBreadcrumbTrail();\n\n  // Sin `routeLabels` el componente no tiene con qué etiquetar el trail → null.\n  const items = routeLabels\n    ? deriveItemsFromTrail(trail, routeLabels)\n    : undefined;\n\n  if (!items || items.length === 0) return null;\n\n  const handleNavigate = (navigateTo?: BreadcrumbItem['navigateTo']) => {\n    if (!navigateTo) return;\n\n    const nav = navigation as any;\n\n    // \"Home\" no es un caso especial: como cualquier crumb, usa popTo(name) más abajo.\n    // popTo sube por el árbol de navegación hasta el navigator que contiene esa ruta —\n    // para \"Home\" ese es el AppStack del shell (el dashboard), no el tope del stack del\n    // MFE actual.\n\n    if (typeof navigateTo === 'string') {\n      nav.navigate(navigateTo);\n      return;\n    }\n\n    if (navigateTo.mode === 'replace') {\n      nav.dispatch(\n        CommonActions.navigate({\n          name: navigateTo.name,\n          params: navigateTo.params ?? {},\n          merge: true,\n        }),\n      );\n      return;\n    }\n\n    if (navigateTo.mode === 'reset') {\n      nav.dispatch(\n        CommonActions.reset({\n          index: 0,\n          routes: [{ name: navigateTo.name, params: navigateTo.params ?? {} }],\n        }),\n      );\n      return;\n    }\n\n    // Preferimos popTo sobre navigate: garantiza que volvemos al screen que YA\n    // está en el stack (no creamos una segunda instancia con los mismos params).\n    // Si popTo no existe o la ruta no está en el stack actual, caemos a\n    // navigate, que React Navigation propaga al árbol para encontrarla.\n    if (typeof nav?.popTo === 'function') {\n      try {\n        nav.popTo(navigateTo.name, navigateTo.params ?? {});\n        return;\n      } catch {\n        // ruta no está en el stack actual — sigue al navigate de abajo.\n      }\n    }\n\n    nav.navigate(navigateTo.name, navigateTo.params ?? {});\n  };\n\n  const ArrowRightIcon = () => <ChevronRightIcon size={16} color=\"#B0B0B0\" />;\n\n  // Con 2 items o menos se muestran todos; con 3+ se colapsa el medio en \"...\".\n  if (items.length <= 2) {\n    return (\n      <View style={styles.container}>\n        {items.map((item, idx) => (\n          <React.Fragment key={idx}>\n            {idx !== 0 && <ArrowRightIcon />}\n            {idx === items.length - 1 ? (\n              <Text style={[styles.lastItem, color ? { color } : null]}>\n                {item.label}\n              </Text>\n            ) : (\n              <TouchableOpacity\n                style={styles.clickableItem}\n                onPress={() => handleNavigate(item.navigateTo)}\n                activeOpacity={0.7}\n                accessibilityRole=\"button\"\n                accessibilityLabel={`Ir a ${item.label}`}\n              >\n                <Text style={styles.clickableText}>{item.label}</Text>\n              </TouchableOpacity>\n            )}\n          </React.Fragment>\n        ))}\n      </View>\n    );\n  }\n\n  const first = items[0];\n  const last = items[items.length - 1];\n  const middle = items.slice(1, -1);\n\n  return (\n    <View style={styles.wrapper}>\n      <View style={styles.container}>\n        <TouchableOpacity\n          style={styles.clickableItem}\n          onPress={() => handleNavigate(first.navigateTo)}\n          activeOpacity={0.7}\n          accessibilityRole=\"button\"\n          accessibilityLabel={`Ir a ${first.label}`}\n        >\n          <Text style={styles.clickableText}>{first.label}</Text>\n        </TouchableOpacity>\n        <ArrowRightIcon />\n\n        <View style={styles.dropdownContainer}>\n          <TouchableOpacity\n            style={styles.dropdownButton}\n            onPress={() => setShowDropdown((v) => !v)}\n            activeOpacity={0.7}\n            accessibilityRole=\"button\"\n            accessibilityLabel=\"Ver pasos intermedios de navegación\"\n          >\n            <Text style={styles.dropdownText}>...</Text>\n          </TouchableOpacity>\n        </View>\n\n        <ArrowRightIcon />\n        <Text style={[styles.lastItem, color ? { color } : null]}>\n          {last.label}\n        </Text>\n      </View>\n\n      {showDropdown && (\n        <Modal\n          visible={showDropdown}\n          transparent\n          animationType=\"none\"\n          statusBarTranslucent\n          onRequestClose={() => setShowDropdown(false)}\n        >\n          <View style={styles.modalContainer}>\n            <Pressable\n              style={styles.overlay}\n              onPress={() => setShowDropdown(false)}\n            />\n            <View style={styles.dropdownMenu}>\n              {middle.map((item, idx) => (\n                <TouchableOpacity\n                  key={idx}\n                  style={styles.dropdownItem}\n                  onPress={() => {\n                    setShowDropdown(false);\n                    handleNavigate(item.navigateTo);\n                  }}\n                  activeOpacity={0.7}\n                  accessibilityRole=\"button\"\n                  accessibilityLabel={`Ir a ${item.label}`}\n                >\n                  <Text style={styles.dropdownItemText}>{item.label}</Text>\n                </TouchableOpacity>\n              ))}\n            </View>\n          </View>\n        </Modal>\n      )}\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  wrapper: {\n    position: 'relative',\n    zIndex: 1,\n    width: '100%',\n  },\n  container: {\n    backgroundColor: '#f9fafb',\n    width: '100%',\n    flexDirection: 'row',\n    justifyContent: 'flex-start',\n    alignItems: 'center',\n    gap: 8,\n    paddingHorizontal: 16,\n    paddingVertical: 6,\n  },\n  clickableItem: {\n    backgroundColor: '#F3F4F6',\n    borderRadius: 6,\n    paddingVertical: 4,\n    paddingHorizontal: 8,\n  },\n  clickableText: {\n    fontSize: 14,\n    color: '#6B7280',\n    fontWeight: '600',\n  },\n  lastItem: {\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  dropdownContainer: {\n    position: 'relative',\n  },\n  dropdownButton: {\n    paddingHorizontal: 8,\n    paddingVertical: 4,\n    borderRadius: 4,\n    backgroundColor: 'transparent',\n  },\n  dropdownText: {\n    fontSize: 14,\n    color: '#6B7280',\n    fontWeight: 'bold',\n  },\n  dropdownMenu: {\n    position: 'absolute',\n    top: 50,\n    left: 16,\n    backgroundColor: 'white',\n    borderRadius: 8,\n    borderWidth: 1,\n    borderColor: '#E5E7EB',\n    shadowColor: '#000',\n    shadowOffset: {\n      width: 0,\n      height: 4,\n    },\n    shadowOpacity: 0.3,\n    shadowRadius: 4.65,\n    elevation: 8,\n    minWidth: 120,\n  },\n  modalContainer: {\n    flex: 1,\n    position: 'relative',\n  },\n  dropdownItem: {\n    paddingHorizontal: 16,\n    paddingVertical: 12,\n    borderBottomWidth: 1,\n    borderBottomColor: '#F3F4F6',\n  },\n  dropdownItemText: {\n    fontSize: 14,\n    color: '#374151',\n  },\n  overlay: {\n    flex: 1,\n    backgroundColor: 'transparent',\n  },\n});\n","import type { TrailNode } from '../hooks/useBreadcrumbTrail';\n\n/**\n * Una entrada del registro de labels: un texto fijo, o una función que deriva el\n * label a partir de los params de la ruta (para labels dinámicos como\n * \"Reporte #123\" o el nombre de un tanque).\n */\nexport type BreadcrumbLabel =\n  | string\n  | ((params: Record<string, unknown> | undefined) => string);\n\n/**\n * Mapa de routeName → label. Cada MFE aporta el registro de su dominio y lo pasa\n * al `<Breadcrumb routeLabels={...} />` desde su header. Es data pura: aunque\n * `ui-mobile` no sea un singleton federado, cada copia bundleada es idéntica.\n */\nexport type BreadcrumbLabelRegistry = Record<string, BreadcrumbLabel>;\n\n/**\n * Route param reservado para que una pantalla publique su propio label dinámico\n * (resuelto en runtime, p. ej. tras cargar datos async). Viaja por el nav state,\n * así que cruza el borde entre MFEs sin necesidad de un contexto compartido.\n */\nexport const BREADCRUMB_LABEL_PARAM = '__breadcrumbLabel';\n\n/**\n * Resuelve el label de un nodo del trail. Orden de prioridad:\n * 1. Label dinámico publicado por la pantalla vía route param.\n * 2. Entrada del registro (texto fijo o derivado de params).\n * 3. Fallback: el nombre crudo de la ruta (visible en dev, mejor que vacío).\n */\nexport function resolveBreadcrumbLabel(\n  node: TrailNode,\n  registry: BreadcrumbLabelRegistry,\n): string {\n  const fromParam = node.params?.[BREADCRUMB_LABEL_PARAM];\n  if (typeof fromParam === 'string' && fromParam.length > 0) {\n    return fromParam;\n  }\n\n  const entry = registry[node.routeName];\n  if (typeof entry === 'function') {\n    return entry(node.params);\n  }\n  if (typeof entry === 'string') {\n    return entry;\n  }\n\n  return node.routeName;\n}\n","import React from 'react';\nimport { Pressable, View, Text, StyleSheet } from 'react-native';\n\nexport type CheckboxProps = {\n  checked: boolean;\n  onChange: (next: boolean) => void;\n  label?: string;\n  size?: number;\n  disabled?: boolean;\n  color?: string;\n  style?: any;\n  required?: boolean;\n};\n\nexport default function Checkbox({ checked, onChange, label, size = 22, disabled = false, color = '#2563EB', style, required = false }: CheckboxProps) {\n  return (\n    <Pressable\n      onPress={() => (!disabled ? onChange(!checked) : undefined)}\n      accessibilityRole=\"checkbox\"\n      accessibilityState={{ checked, disabled }}\n      style={[styles.row, style, disabled && styles.disabled]}\n    >\n      <View\n        style={[\n          styles.box,\n          { width: size, height: size, borderColor: color, backgroundColor: checked ? color : '#FFFFFF' },\n        ]}\n      >\n        {checked ? <View style={styles.tick} /> : null}\n      </View>\n      {label ? (\n        <Text style={styles.label}>\n          {label}\n          {required ? <Text style={styles.required}> *</Text> : null}\n        </Text>\n      ) : null}\n    </Pressable>\n  );\n}\n\nconst styles = StyleSheet.create({\n  row: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n  box: { borderWidth: 2, borderRadius: 6, alignItems: 'center', justifyContent: 'center' },\n  tick: { width: 10, height: 10, backgroundColor: '#FFFFFF', borderRadius: 2 },\n  label: { fontSize: 16, color: '#111827' },\n  required: {\n    color: '#FF0000',\n    fontSize: 16,\n    fontWeight: '600',\n  },\n  disabled: { opacity: 0.6 },\n});\n\n\n","import React, { useEffect, useRef } from 'react';\nimport { Modal, View, Text, StyleSheet, TouchableOpacity, Animated, Easing } from 'react-native';\nimport { XMarkIcon } from 'react-native-heroicons/outline';\n\nexport interface ConfirmationModalProps {\n  open: boolean;\n  onClose: () => void;\n  onConfirm: () => void;\n  title: string;\n  message: string;\n  confirmText?: string;\n  cancelText?: string;\n}\n\nexport default function ConfirmationModal({\n  open,\n  onClose,\n  onConfirm,\n  title,\n  message,\n  confirmText = 'Sí, cancelar',\n  cancelText = 'No, continuar',\n}: ConfirmationModalProps) {\n  const opacity = useRef(new Animated.Value(0)).current;\n  const scale = useRef(new Animated.Value(0.95)).current;\n\n  useEffect(() => {\n    if (open) {\n      Animated.parallel([\n        Animated.timing(opacity, { toValue: 1, duration: 200, easing: Easing.out(Easing.ease), useNativeDriver: true }),\n        Animated.timing(scale, { toValue: 1, duration: 200, easing: Easing.out(Easing.ease), useNativeDriver: true }),\n      ]).start();\n    } else {\n      opacity.setValue(0);\n      scale.setValue(0.95);\n    }\n  }, [open, opacity, scale]);\n\n  return (\n    <Modal visible={open} transparent animationType=\"fade\" onRequestClose={onClose}>\n      <View style={styles.overlay}>\n        <Animated.View style={[styles.backdrop, { opacity }]} />\n        <Animated.View style={[styles.panelWrapper, { transform: [{ scale }], opacity }]}> \n          <View style={styles.panel}>\n            <View style={styles.header}>\n              <Text style={styles.title}>{title}</Text>\n              <TouchableOpacity accessibilityLabel=\"Cerrar\" onPress={onClose} style={styles.iconBtn}>\n                <XMarkIcon size={24} color=\"#6B7280\" />\n              </TouchableOpacity>\n            </View>\n            <View style={styles.body}>\n              <Text style={styles.message}>{message}</Text>\n            </View>\n            <View style={styles.footer}>\n              <TouchableOpacity\n                style={[styles.btn, styles.btnDanger]}\n                onPress={() => {\n                  onConfirm();\n                  onClose();\n                }}\n                activeOpacity={0.9}\n              >\n                <Text style={styles.btnDangerText}>{confirmText}</Text>\n              </TouchableOpacity>\n              <TouchableOpacity style={[styles.btn, styles.btnSecondary]} onPress={onClose} activeOpacity={0.9}>\n                <Text style={styles.btnSecondaryText}>{cancelText}</Text>\n              </TouchableOpacity>\n            </View>\n          </View>\n        </Animated.View>\n      </View>\n    </Modal>\n  );\n}\n\nconst styles = StyleSheet.create({\n  overlay: {\n    flex: 1,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  backdrop: {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    backgroundColor: 'rgba(0,0,0,0.5)',\n  },\n  panelWrapper: {\n    width: '100%',\n    paddingHorizontal: 16,\n  },\n  panel: {\n    backgroundColor: '#FFFFFF',\n    borderRadius: 12,\n    shadowColor: '#000',\n    shadowOpacity: 0.2,\n    shadowRadius: 12,\n    shadowOffset: { width: 0, height: 6 },\n    elevation: 8,\n    overflow: 'hidden',\n  },\n  header: {\n    paddingHorizontal: 16,\n    paddingTop: 16,\n    paddingBottom: 8,\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n  },\n  title: {\n    fontSize: 18,\n    fontWeight: '600',\n    color: '#111827',\n  },\n  iconBtn: {\n    padding: 6,\n    borderRadius: 999,\n  },\n  body: {\n    paddingHorizontal: 16,\n    paddingVertical: 8,\n  },\n  message: {\n    fontSize: 14,\n    color: '#6B7280',\n  },\n  footer: {\n    flexDirection: 'row',\n    gap: 12,\n    paddingHorizontal: 16,\n    paddingVertical: 12,\n    backgroundColor: '#F9FAFB',\n  },\n  btn: {\n    flex: 1,\n    borderRadius: 8,\n    paddingVertical: 12,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  btnDanger: {\n    backgroundColor: '#DC2626',\n  },\n  btnDangerText: {\n    color: '#FFFFFF',\n    fontWeight: '600',\n  },\n  btnSecondary: {\n    backgroundColor: '#FFFFFF',\n    borderWidth: 1,\n    borderColor: '#D1D5DB',\n  },\n  btnSecondaryText: {\n    color: '#374151',\n    fontWeight: '600',\n  },\n});\n\n\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { Modal, Platform, StyleSheet, Text, TouchableOpacity, View } from 'react-native';\nimport { CalendarIcon } from 'react-native-heroicons/outline';\nimport DateTimePicker, { DateTimePickerEvent } from '@react-native-community/datetimepicker';\n\nexport interface DatePickerProps {\n  label?: string;\n  value: Date | null;\n  onChange: (value: Date | null) => void;\n  onApply?: (date?: Date | null) => void;\n  onClear?: () => void;\n  onMonthChange?: (monthDate: Date) => void; // se llama cuando cambia el mes visible (aprox.)\n  open?: boolean;\n  onOpenChange?: (open: boolean) => void;\n  applyText?: string;\n  clearText?: string;\n  disabled?: boolean;\n  required?: boolean;\n}\n\n/**\n * DatePicker móvil simple basado en Modal + DateTimePicker\n * - iOS: inline dentro de un modal con botones Apply/Clear\n * - Android: usa el picker nativo y cierra al seleccionar\n */\nexport default function UiMobileDatePicker({\n  label,\n  value,\n  onChange,\n  onApply,\n  onClear,\n  onMonthChange,\n  open,\n  onOpenChange,\n  applyText = 'Aplicar',\n  clearText = 'Limpiar',\n  disabled = false,\n  required = false,\n}: DatePickerProps) {\n  const [internalOpen, setInternalOpen] = useState(false);\n  const isOpen = open ?? internalOpen;\n\n  // Estado interno para manejar la fecha seleccionada en el picker (iOS)\n  // Se sincroniza con value al abrir, pero permite cambios locales inmediatos\n  const [pickerDate, setPickerDate] = useState(value ?? new Date());\n\n  // Sincronizar pickerDate cuando value cambia (externamente) o al abrir\n  React.useEffect(() => {\n    if (value) {\n      setPickerDate(value);\n    }\n  }, [value, isOpen]);\n\n  const setOpen = useCallback(\n    (next: boolean) => {\n      if (next) {\n        // Al abrir, aseguramos que pickerDate esté sync con value actual\n        setPickerDate(value ?? new Date());\n      }\n      if (onOpenChange) onOpenChange(next);\n      else setInternalOpen(next);\n    },\n    [onOpenChange, value]\n  );\n\n  const handleAndroidChange = useCallback(\n    (event: DateTimePickerEvent, date?: Date) => {\n      if (event.type === 'dismissed') {\n        setOpen(false);\n        return;\n      }\n      if (date) {\n        setPickerDate(date);\n        onChange(date);\n        // Heurística para onMonthChange\n        onMonthChange?.(date);\n      }\n      setOpen(false);\n      // En Android, el cambio es confirmación implícita\n      onApply?.(date);\n    },\n    [onApply, onChange, onMonthChange, setOpen]\n  );\n\n  const handleIOSChange = useCallback(\n    (_: any, date?: Date) => {\n      if (date) {\n        setPickerDate(date);\n        onChange(date);\n        onMonthChange?.(date);\n      }\n    },\n    [onChange, onMonthChange]\n  );\n\n  const iconColor = useMemo(() => {\n    if (disabled) return '#D1D5DB';\n    return value ? '#6B7280' : '#9CA3AF';\n  }, [disabled, value]);\n\n  return (\n    <View>\n      {label ? (\n        <Text style={styles.label}>\n          {label}\n          {required ? <Text style={styles.required}> *</Text> : null}\n        </Text>\n      ) : null}\n      <TouchableOpacity\n        accessibilityRole=\"button\"\n        onPress={() => setOpen(true)}\n        activeOpacity={0.8}\n        style={[styles.trigger, disabled && styles.triggerDisabled]}\n        disabled={disabled}\n      >\n        <Text style={styles.triggerText}>\n          {value ? formatDate(value) : 'Seleccionar fecha'}\n        </Text>\n        <View style={styles.calendarIcon} pointerEvents=\"none\">\n          <CalendarIcon size={20} color={iconColor} />\n        </View>\n      </TouchableOpacity>\n\n      {Platform.OS === 'android' ? (\n        isOpen ? (\n          <DateTimePicker\n            value={pickerDate}\n            mode=\"date\"\n            display=\"calendar\"\n            onChange={handleAndroidChange}\n          />\n        ) : null\n      ) : (\n        <Modal visible={isOpen} transparent animationType=\"slide\" onRequestClose={() => setOpen(false)}>\n          <View style={styles.backdrop}>\n            <View style={styles.sheet}>\n              <DateTimePicker value={pickerDate} mode=\"date\" display=\"inline\" onChange={handleIOSChange} />\n              <View style={styles.actions}>\n                <TouchableOpacity\n                  onPress={() => {\n                    onClear?.();\n                    setOpen(false);\n                  }}\n                  style={[styles.btn, styles.btnSecondary]}\n                  activeOpacity={0.9}\n                >\n                  <Text style={styles.btnSecondaryText}>{clearText}</Text>\n                </TouchableOpacity>\n                <TouchableOpacity\n                  onPress={() => {\n                    onApply?.(pickerDate);\n                    setOpen(false);\n                  }}\n                  style={[styles.btn, styles.btnPrimary]}\n                  activeOpacity={0.9}\n                >\n                  <Text style={styles.btnPrimaryText}>{applyText}</Text>\n                </TouchableOpacity>\n              </View>\n            </View>\n          </View>\n        </Modal>\n      )}\n    </View>\n  );\n}\n\nfunction formatDate(d: Date) {\n  const dd = String(d.getDate()).padStart(2, '0');\n  const mm = String(d.getMonth() + 1).padStart(2, '0');\n  const yy = d.getFullYear();\n  return `${dd}/${mm}/${yy}`;\n}\n\nconst styles = StyleSheet.create({\n  label: {\n    marginBottom: 6,\n    color: '#6B7280',\n    fontSize: 14,\n    fontWeight: '500',\n  },\n  required: {\n    color: '#FF0000',\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  trigger: {\n    borderWidth: 1,\n    borderColor: '#D1D5DB',\n    borderRadius: 8,\n    backgroundColor: '#FFFFFF',\n    paddingVertical: 12,\n    paddingHorizontal: 14,\n    paddingRight: 44,\n    minHeight: 48,\n    justifyContent: 'center',\n  },\n  triggerText: {\n    color: '#111827',\n    fontSize: 16,\n  },\n  triggerDisabled: {\n    backgroundColor: '#F9FAFB',\n    borderColor: '#E5E7EB',\n  },\n  calendarIcon: {\n    position: 'absolute',\n    right: 12,\n    top: 0,\n    bottom: 0,\n    justifyContent: 'center',\n  },\n  backdrop: {\n    flex: 1,\n    backgroundColor: 'rgba(0,0,0,0.3)',\n    justifyContent: 'flex-end',\n  },\n  sheet: {\n    backgroundColor: '#FFF',\n    borderTopLeftRadius: 16,\n    borderTopRightRadius: 16,\n    padding: 16,\n  },\n  actions: {\n    marginTop: 12,\n    flexDirection: 'row',\n    gap: 8,\n  },\n  btn: {\n    flex: 1,\n    paddingVertical: 12,\n    borderRadius: 10,\n    alignItems: 'center',\n  },\n  btnSecondary: {\n    backgroundColor: '#6B7280',\n  },\n  btnSecondaryText: {\n    color: '#FFF',\n    fontWeight: '600',\n  },\n  btnPrimary: {\n    backgroundColor: '#1B418C',\n  },\n  btnPrimaryText: {\n    color: '#FFF',\n    fontWeight: '600',\n  },\n});\n\n\n","import React, { useMemo } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport dayjs from 'dayjs';\nimport { CalendarProps } from './types';\nimport Header from './Header';\nimport Day from './Day';\n\nconst WEEKDAYS = ['Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb', 'Dom'];\n\n/**\n * Calendar grid component that handles month rendering and day selection logic.\n */\nconst Calendar: React.FC<CalendarProps> = ({\n  currentDate,\n  startDate,\n  endDate,\n  minDate,\n  maxDate,\n  onSelectDate,\n  onMonthChange,\n}) => {\n  const days = useMemo(() => {\n    const startOfMonth = currentDate.startOf('month');\n    const endOfMonth = currentDate.endOf('month');\n    \n    // Adjust to start from Monday (ISO)\n    // dayjs().day() returns 0 (Sun) to 6 (Sat)\n    const dayOfWeek = startOfMonth.day();\n    const startDay = dayOfWeek === 0 ? 7 : dayOfWeek; // Sunday is 7\n    const daysBefore = startDay - 1;\n\n    const calendarDays = [];\n\n    // Days from previous month\n    for (let i = daysBefore; i > 0; i--) {\n      calendarDays.push({\n        date: startOfMonth.subtract(i, 'day'),\n        isCurrentMonth: false,\n      });\n    }\n\n    // Days of current month\n    const totalDaysInMonth = currentDate.daysInMonth();\n    for (let i = 1; i <= totalDaysInMonth; i++) {\n      calendarDays.push({\n        date: startOfMonth.date(i),\n        isCurrentMonth: true,\n      });\n    }\n\n    // Days from next month to complete 6 rows (42 days)\n    const remainingDays = 42 - calendarDays.length;\n    for (let i = 1; i <= remainingDays; i++) {\n      calendarDays.push({\n        date: endOfMonth.add(i, 'day'),\n        isCurrentMonth: false,\n      });\n    }\n\n    return calendarDays;\n  }, [currentDate]);\n\n  const handlePrevMonth = () => {\n    onMonthChange(currentDate.subtract(1, 'month'));\n  };\n\n  const handleNextMonth = () => {\n    onMonthChange(currentDate.add(1, 'month'));\n  };\n\n  return (\n    <View style={styles.container}>\n      <Header\n        currentDate={currentDate}\n        onPrevMonth={handlePrevMonth}\n        onNextMonth={handleNextMonth}\n      />\n      \n      <View style={styles.weekdays}>\n        {WEEKDAYS.map((day) => (\n          <Text key={day} style={styles.weekdayText}>\n            {day}\n          </Text>\n        ))}\n      </View>\n\n      <View style={styles.grid}>\n        {days.map(({ date, isCurrentMonth }, index) => {\n          const isSelected = (startDate && date.isSame(startDate, 'day')) || \n                             (endDate && date.isSame(endDate, 'day')) || false;\n          const isStart = startDate ? date.isSame(startDate, 'day') : false;\n          const isEnd = endDate ? date.isSame(endDate, 'day') : false;\n          const isInRange = startDate && endDate && date.isAfter(startDate, 'day') && date.isBefore(endDate, 'day') || false;\n          \n          const isDisabled = (minDate && date.isBefore(minDate, 'day')) || \n                             (maxDate && date.isAfter(maxDate, 'day')) || false;\n          const isToday = date.isSame(dayjs(), 'day');\n\n          return (\n            <Day\n              key={date.toISOString() + index}\n              date={date}\n              isCurrentMonth={isCurrentMonth}\n              isSelected={isSelected}\n              isStart={isStart}\n              isEnd={isEnd}\n              isInRange={isInRange}\n              isDisabled={isDisabled}\n              isToday={isToday}\n              onPress={onSelectDate}\n            />\n          );\n        })}\n      </View>\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    paddingHorizontal: 16,\n    paddingBottom: 16,\n  },\n  weekdays: {\n    flexDirection: 'row',\n    marginTop: 10,\n    marginBottom: 8,\n  },\n  weekdayText: {\n    flex: 1,\n    textAlign: 'center',\n    fontSize: 13,\n    fontWeight: '500',\n    color: '#9CA3AF',\n    textTransform: 'capitalize',\n  },\n  grid: {\n    flexDirection: 'row',\n    flexWrap: 'wrap',\n  },\n});\n\nexport default React.memo(Calendar);\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n  Modal,\n  Platform,\n  StyleSheet,\n  Text,\n  TouchableOpacity,\n  View,\n  ActivityIndicator,\n} from 'react-native';\nimport { CalendarIcon } from 'react-native-heroicons/outline';\nimport dayjs, { Dayjs } from 'dayjs';\nimport 'dayjs/locale/es';\nimport { DateRangePickerProps, DateRange } from './types';\nimport Calendar from './Calendar';\n\ntype QuickFilterType = 'UD' | 'Hoy' | 'US' | '1M' | '6M';\n\nconst QUICK_FILTERS: { label: string; value: QuickFilterType }[] = [\n  { label: 'U.Día', value: 'UD' },\n  { label: 'Hoy', value: 'Hoy' },\n  { label: 'U.Sem', value: 'US' },\n  { label: '1M', value: '1M' },\n  { label: '6M', value: '6M' },\n];\n\n/**\n * DateRangePicker component for selecting a start and end date.\n * Features:\n * - Start and end date selection with range validation.\n * - Navigable monthly calendar.\n * - Min/Max date support.\n * - Loading and disabled states.\n * - Responsive and accessible design.\n * \n * @param {DateRangePickerProps} props - The component props.\n */\nconst DateRangePicker: React.FC<DateRangePickerProps> = ({\n  label,\n  value,\n  onStartDateChange,\n  onEndDateChange,\n  onDateRangeChange,\n  onChange,\n  minDate,\n  maxDate,\n  disabled = false,\n  loading = false,\n  required = false,\n  locale = 'es',\n  format = 'DD/MM/YYYY',\n  applyText = 'Aplicar',\n  clearText = 'Limpiar',\n  onClear,\n  placeholder = 'Seleccionar rango',\n}) => {\n  const [isOpen, setIsOpen] = useState(false);\n  const [currentDate, setCurrentDate] = useState(dayjs());\n  const [activeQuickFilter, setActiveQuickFilter] = useState<QuickFilterType | null>(null);\n  \n  // Internal state for range during selection in modal\n  const [internalRange, setInternalRange] = useState<DateRange>({\n    startDate: value.startDate,\n    endDate: value.endDate,\n  });\n\n  // Set locale\n  useEffect(() => {\n    dayjs.locale(locale);\n  }, [locale]);\n\n  // Sync internal range when value prop changes or modal opens\n  useEffect(() => {\n    if (isOpen) {\n      setInternalRange({\n        startDate: value.startDate,\n        endDate: value.endDate,\n      });\n      setActiveQuickFilter(null); // Reset quick filter when opening modal\n      // Set current month to start date or today\n      setCurrentDate(value.startDate ? dayjs(value.startDate) : dayjs());\n    }\n  }, [value, isOpen]);\n\n  const handleSelectDate = useCallback((date: Dayjs) => {\n    const nativeDate = date.toDate();\n    setActiveQuickFilter(null); // Clear active filter on manual selection\n    \n    setInternalRange((prev) => {\n      // If no start date or both dates already selected, start a new range\n      if (!prev.startDate || (prev.startDate && prev.endDate)) {\n        return { startDate: nativeDate, endDate: null };\n      }\n\n      // If start date exists but no end date\n      if (prev.startDate && !prev.endDate) {\n        // If selected date is before start date, set it as new start date\n        if (date.isBefore(dayjs(prev.startDate), 'day')) {\n          return { startDate: nativeDate, endDate: null };\n        }\n        // Otherwise set as end date\n        return { ...prev, endDate: nativeDate };\n      }\n\n      return prev;\n    });\n  }, []);\n\n  const handleQuickFilterPress = (type: QuickFilterType) => {\n    let start: Dayjs = dayjs();\n    let end: Dayjs = dayjs();\n\n    switch (type) {\n      case 'UD':\n        start = dayjs().subtract(1, 'day');\n        end = dayjs().subtract(1, 'day');\n        break;\n      case 'Hoy':\n        start = dayjs();\n        end = dayjs();\n        break;\n      case 'US':\n        start = dayjs().subtract(6, 'day');\n        end = dayjs();\n        break;\n      case '1M':\n        start = dayjs().subtract(29, 'day');\n        end = dayjs();\n        break;\n      case '6M':\n        start = dayjs().subtract(179, 'day');\n        end = dayjs();\n        break;\n    }\n\n    setInternalRange({\n      startDate: start.startOf('day').toDate(),\n      endDate: end.endOf('day').toDate(),\n    });\n    setActiveQuickFilter(type);\n    setCurrentDate(start);\n  };\n\n  const handleApply = () => {\n    onChange(internalRange);\n    onDateRangeChange?.(internalRange);\n    onStartDateChange?.(internalRange.startDate);\n    onEndDateChange?.(internalRange.endDate);\n    setIsOpen(false);\n  };\n\n  const handleClear = () => {\n    const emptyRange = { startDate: null, endDate: null };\n    setInternalRange(emptyRange);\n    setActiveQuickFilter(null);\n    onChange(emptyRange);\n    onDateRangeChange?.(emptyRange);\n    onStartDateChange?.(null);\n    onEndDateChange?.(null);\n    onClear?.();\n    setIsOpen(false);\n  };\n\n  const displayValue = useMemo(() => {\n    if (!value.startDate) return placeholder;\n    const start = dayjs(value.startDate).format(format);\n    if (!value.endDate) return start;\n    const end = dayjs(value.endDate).format(format);\n    return `${start} - ${end}`;\n  }, [value, format, placeholder]);\n\n  const iconColor = useMemo(() => {\n    if (disabled) return '#D1D5DB';\n    return value.startDate ? '#6B7280' : '#9CA3AF';\n  }, [disabled, value.startDate]);\n\n  return (\n    <View style={styles.container}>\n      {label && (\n        <Text style={styles.label}>\n          {label}\n          {required && <Text style={styles.required}> *</Text>}\n        </Text>\n      )}\n\n      <TouchableOpacity\n        style={[styles.trigger, disabled && styles.triggerDisabled]}\n        onPress={() => !disabled && !loading && setIsOpen(true)}\n        disabled={disabled || loading}\n        activeOpacity={0.8}\n        accessibilityRole=\"button\"\n        accessibilityLabel={label || 'Seleccionar rango de fechas'}\n      >\n        <View style={styles.triggerContent}>\n          <Text style={[styles.triggerText, !value.startDate && styles.placeholderText]}>\n            {displayValue}\n          </Text>\n          {loading ? (\n            <ActivityIndicator size=\"small\" color=\"#1B418C\" />\n          ) : (\n            <CalendarIcon size={20} color={iconColor} />\n          )}\n        </View>\n      </TouchableOpacity>\n\n      <Modal\n        visible={isOpen}\n        transparent\n        animationType=\"slide\"\n        onRequestClose={() => setIsOpen(false)}\n      >\n        <View style={styles.backdrop}>\n          <View style={styles.sheet}>\n            <View style={styles.sheetHeader}>\n              <Text style={styles.sheetTitle}>Seleccionar Rango</Text>\n            </View>\n\n            <Calendar\n              currentDate={currentDate}\n              startDate={internalRange.startDate ? dayjs(internalRange.startDate) : null}\n              endDate={internalRange.endDate ? dayjs(internalRange.endDate) : null}\n              minDate={minDate ? dayjs(minDate) : undefined}\n              maxDate={maxDate ? dayjs(maxDate) : undefined}\n              onSelectDate={handleSelectDate}\n              onMonthChange={setCurrentDate}\n            />\n\n            <View style={styles.quickFiltersContainer}>\n              {QUICK_FILTERS.map((filter) => (\n                <TouchableOpacity\n                  key={filter.value}\n                  style={[\n                    styles.quickFilterBtn,\n                    activeQuickFilter === filter.value && styles.quickFilterBtnActive,\n                  ]}\n                  onPress={() => handleQuickFilterPress(filter.value)}\n                  activeOpacity={0.7}\n                  accessibilityRole=\"button\"\n                  accessibilityLabel={`Filtrar por ${filter.label}`}\n                  accessibilityState={{ selected: activeQuickFilter === filter.value }}\n                >\n                  <Text\n                    style={[\n                      styles.quickFilterText,\n                      activeQuickFilter === filter.value && styles.quickFilterTextActive,\n                    ]}\n                  >\n                    {filter.label}\n                  </Text>\n                </TouchableOpacity>\n              ))}\n            </View>\n\n            <View style={styles.actions}>\n              <TouchableOpacity\n                onPress={handleClear}\n                style={[styles.btn, styles.btnSecondary]}\n                activeOpacity={0.9}\n              >\n                <Text style={styles.btnSecondaryText}>{clearText}</Text>\n              </TouchableOpacity>\n              <TouchableOpacity\n                onPress={handleApply}\n                style={[styles.btn, styles.btnPrimary, !internalRange.startDate && styles.btnDisabled]}\n                activeOpacity={0.9}\n                disabled={!internalRange.startDate}\n              >\n                <Text style={styles.btnPrimaryText}>{applyText}</Text>\n              </TouchableOpacity>\n            </View>\n          </View>\n        </View>\n      </Modal>\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    width: '100%',\n  },\n  label: {\n    marginBottom: 6,\n    color: '#6B7280',\n    fontSize: 14,\n    fontWeight: '500',\n  },\n  required: {\n    color: '#FF0000',\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  trigger: {\n    borderWidth: 1,\n    borderColor: '#D1D5DB',\n    borderRadius: 8,\n    backgroundColor: '#FFFFFF',\n    paddingVertical: 12,\n    paddingHorizontal: 14,\n    minHeight: 48,\n    justifyContent: 'center',\n  },\n  triggerDisabled: {\n    backgroundColor: '#F9FAFB',\n    borderColor: '#E5E7EB',\n  },\n  triggerContent: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n  },\n  triggerText: {\n    color: '#111827',\n    fontSize: 16,\n  },\n  placeholderText: {\n    color: '#9CA3AF',\n  },\n  backdrop: {\n    flex: 1,\n    backgroundColor: 'rgba(0,0,0,0.5)',\n    justifyContent: 'flex-end',\n  },\n  sheet: {\n    backgroundColor: '#FFF',\n    borderTopLeftRadius: 24,\n    borderTopRightRadius: 24,\n    paddingBottom: Platform.OS === 'ios' ? 40 : 24,\n    maxHeight: '90%',\n  },\n  sheetHeader: {\n    paddingVertical: 20,\n    paddingHorizontal: 16,\n    alignItems: 'center',\n  },\n  sheetTitle: {\n    fontSize: 18,\n    fontWeight: '700',\n    color: '#111827',\n  },\n  quickFiltersContainer: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    paddingHorizontal: 20,\n    paddingVertical: 12,\n    gap: 8,\n  },\n  quickFilterBtn: {\n    flex: 1,\n    paddingVertical: 10,\n    borderRadius: 8,\n    backgroundColor: '#F3F4F6',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  quickFilterBtnActive: {\n    backgroundColor: '#1B418C',\n  },\n  quickFilterText: {\n    fontSize: 13,\n    fontWeight: '700',\n    color: '#4B5563',\n  },\n  quickFilterTextActive: {\n    color: '#FFFFFF',\n  },\n  actions: {\n    flexDirection: 'row',\n    paddingHorizontal: 20,\n    paddingTop: 8,\n    gap: 16,\n  },\n  btn: {\n    flex: 1,\n    paddingVertical: 16,\n    borderRadius: 12,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  btnSecondary: {\n    backgroundColor: '#F3F4F6',\n  },\n  btnSecondaryText: {\n    color: '#4B5563',\n    fontWeight: '600',\n    fontSize: 16,\n  },\n  btnPrimary: {\n    backgroundColor: '#1B418C',\n  },\n  btnPrimaryText: {\n    color: '#FFF',\n    fontWeight: '600',\n    fontSize: 16,\n  },\n  btnDisabled: {\n    backgroundColor: '#D1D5DB',\n  },\n});\n\nexport default React.memo(DateRangePicker);\n","import React from \"react\";\nimport { StyleSheet, Text, TouchableOpacity, View } from \"react-native\";\nimport { DayProps } from \"./types\";\n\n/**\n * Individual day component for the calendar grid\n */\nconst Day: React.FC<DayProps> = ({\n  date,\n  isCurrentMonth,\n  isSelected,\n  isStart,\n  isEnd,\n  isInRange,\n  isDisabled,\n  isToday,\n  onPress,\n}) => {\n  const containerStyles = [styles.container];\n\n  const selectionStyles = [styles.selection, isSelected && styles.selected];\n\n  const textStyles = [\n    styles.text,\n    !isCurrentMonth && styles.notCurrentMonthText,\n    isSelected && styles.selectedText,\n    isDisabled && styles.disabledText,\n    isToday && !isSelected && styles.todayText,\n  ];\n\n  return (\n    <TouchableOpacity\n      style={containerStyles}\n      onPress={() => !isDisabled && onPress(date)}\n      disabled={isDisabled}\n      activeOpacity={0.7}\n      accessibilityRole=\"button\"\n      accessibilityLabel={date.format(\"D MMMM YYYY\")}\n      accessibilityState={{ selected: isSelected, disabled: isDisabled }}\n    >\n      {/* Background for range highlighting */}\n      {(isInRange || isStart || isEnd) && (\n        <View style={styles.rangeBackgroundContainer} pointerEvents=\"none\">\n          {isInRange && <View style={styles.rangeBackground} />}\n          {isStart && (\n            <View style={[styles.rangeBackground, styles.rangeStartFill]} />\n          )}\n          {isEnd && (\n            <View style={[styles.rangeBackground, styles.rangeEndFill]} />\n          )}\n        </View>\n      )}\n\n      <View style={selectionStyles} pointerEvents=\"none\">\n        {isToday && !isSelected && <View style={styles.todayDot} />}\n        <Text style={textStyles}>{date.date()}</Text>\n      </View>\n    </TouchableOpacity>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    width: \"14.28%\",\n    aspectRatio: 1,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    position: \"relative\",\n    padding: 0,\n    margin: 0,\n  },\n  rangeBackgroundContainer: {\n    position: \"absolute\",\n    left: 0,\n    right: 0,\n    top: 0,\n    bottom: 0,\n    zIndex: -1,\n  },\n  rangeBackground: {\n    position: \"absolute\",\n    left: 0,\n    right: 0,\n    top: \"50%\",\n    height: 36,\n    marginTop: -13,\n    backgroundColor: \"#EBF0F9\",\n  },\n  rangeStartFill: {\n    left: \"50%\",\n  },\n  rangeEndFill: {\n    right: \"50%\",\n  },\n  selection: {\n    width: 36,\n    height: 36,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    borderRadius: 18,\n    overflow: \"hidden\",\n  },\n  selected: {\n    backgroundColor: \"#1B418C\",\n    borderRadius: 18, // Explicitly repeat to avoid some Android rendering issues\n  },\n  text: {\n    fontSize: 15,\n    color: \"#111827\",\n    fontWeight: \"500\",\n    textAlign: \"center\",\n  },\n  notCurrentMonthText: {\n    color: \"#D1D5DB\",\n  },\n  todayText: {\n    color: \"#1B418C\",\n    fontWeight: \"bold\",\n  },\n  todayDot: {\n    position: \"absolute\",\n    bottom: 2,\n    width: 4,\n    height: 4,\n    borderRadius: 2,\n    backgroundColor: \"#1B418C\",\n  },\n  selectedText: {\n    color: \"#FFFFFF\",\n    fontWeight: \"600\",\n  },\n  disabledText: {\n    color: \"#E5E7EB\",\n  },\n});\n\nexport default React.memo(Day);\n","import React from 'react';\nimport { StyleSheet, Text, TouchableOpacity, View } from 'react-native';\nimport { ChevronLeftIcon, ChevronRightIcon } from 'react-native-heroicons/outline';\nimport { Dayjs } from 'dayjs';\n\ninterface HeaderProps {\n  currentDate: Dayjs;\n  onPrevMonth: () => void;\n  onNextMonth: () => void;\n}\n\nconst Header: React.FC<HeaderProps> = ({ currentDate, onPrevMonth, onNextMonth }) => {\n  return (\n    <View style={styles.container}>\n      <TouchableOpacity\n        onPress={onPrevMonth}\n        style={styles.button}\n        accessibilityLabel=\"Mes anterior\"\n        accessibilityRole=\"button\"\n      >\n        <ChevronLeftIcon size={24} color=\"#6B7280\" />\n      </TouchableOpacity>\n\n      <View style={styles.titleContainer}>\n        <Text style={styles.title} accessibilityRole=\"header\">\n          {currentDate.format('MMMM YYYY').charAt(0).toUpperCase() +\n            currentDate.format('MMMM YYYY').slice(1)}\n        </Text>\n      </View>\n\n      <TouchableOpacity\n        onPress={onNextMonth}\n        style={styles.button}\n        accessibilityLabel=\"Mes siguiente\"\n        accessibilityRole=\"button\"\n      >\n        <ChevronRightIcon size={24} color=\"#6B7280\" />\n      </TouchableOpacity>\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    paddingVertical: 10,\n    paddingHorizontal: 5,\n  },\n  titleContainer: {\n    flex: 1,\n    alignItems: 'center',\n  },\n  title: {\n    fontSize: 16,\n    fontWeight: '600',\n    color: '#111827',\n  },\n  button: {\n    padding: 8,\n    borderRadius: 20,\n  },\n});\n\nexport default React.memo(Header);\n","export { default as DateRangePicker } from './DateRangePicker';\nexport * from './types';\n","import React from 'react';\nimport { View, Text, StyleSheet, ViewStyle, TextStyle } from 'react-native';\n\nexport interface FieldGroupProps {\n  label?: string;\n  required?: boolean;\n  errorText?: string | null;\n  children: React.ReactNode;\n  style?: ViewStyle;\n  labelStyle?: TextStyle;\n}\n\nexport function FieldGroup({ label, required, errorText, children, style, labelStyle }: FieldGroupProps) {\n  return (\n    <View style={[styles.group, style]}> \n      {label ? (\n        <Text style={[styles.label, labelStyle]}>\n          {label} {required ? <Text style={styles.required}>*</Text> : null}\n        </Text>\n      ) : null}\n      {children}\n      {!!errorText && <Text style={styles.error}>{errorText}</Text>}\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  group: {\n    marginBottom: 12,\n  },\n  label: {\n    fontSize: 14,\n    color: '#111827',\n    marginBottom: 8,\n    fontWeight: '600',\n  },\n  required: {\n    color: '#FF1D4B',\n  },\n  error: {\n    color: '#FF1D4B',\n    fontSize: 14,\n    marginTop: 4,\n  },\n});\n\nexport default FieldGroup;\n\n\n","import { FunctionComponent } from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity } from 'react-native';\n\ninterface FolderIconButtonProps {\n  label: string;\n  onPress: () => void;\n  disabled?: boolean;\n  size?: 'small' | 'medium' | 'large';\n}\n\nexport const FolderIconButton: FunctionComponent<FolderIconButtonProps> = ({\n  label,\n  onPress,\n  disabled = false,\n  size = 'medium',\n}) => {\n  const handlePress = () => {\n    if (!disabled) {\n      onPress();\n    }\n  };\n\n  const getSizeStyles = () => {\n    switch (size) {\n      case 'small':\n        return {\n          container: styles.smallContainer,\n          folder: styles.smallFolder,\n          tab: styles.smallTab,\n          label: styles.smallLabel,\n        };\n      case 'large':\n        return {\n          container: styles.largeContainer,\n          folder: styles.largeFolder,\n          tab: styles.largeTab,\n          label: styles.largeLabel,\n        };\n      default:\n        return {\n          container: styles.mediumContainer,\n          folder: styles.mediumFolder,\n          tab: styles.mediumTab,\n          label: styles.mediumLabel,\n        };\n    }\n  };\n\n  const sizeStyles = getSizeStyles();\n\n  return (\n    <TouchableOpacity\n      onPress={handlePress}\n      disabled={disabled}\n      style={[styles.button, sizeStyles.container, disabled && styles.disabled]}\n      activeOpacity={1}\n    >\n      <View style={[styles.folderContainer, sizeStyles.folder]}>\n        {/* Parte trasera de la carpeta */}\n        <View\n          style={[\n            styles.folderBack,\n            sizeStyles.folder,\n            {\n              backgroundColor: disabled ? '#9CA3AF' : '#3B82F6',\n              shadowColor: disabled ? '#9CA3AF' : '#3B82F6',\n            },\n          ]}\n        />\n\n        {/* Pestaña de la carpeta */}\n        <View\n          style={[\n            styles.folderTab,\n            sizeStyles.tab,\n            {\n              backgroundColor: disabled ? '#6B7280' : '#2563EB',\n              shadowColor: disabled ? '#6B7280' : '#2563EB',\n            },\n          ]}\n        />\n      </View>\n\n      <Text\n        style={[\n          styles.label,\n          sizeStyles.label,\n          disabled && styles.disabledLabel,\n        ]}\n      >\n        {label}\n      </Text>\n    </TouchableOpacity>\n  );\n};\n\nconst styles = StyleSheet.create({\n  button: {\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'center',\n    borderRadius: 8,\n  },\n  disabled: {\n    opacity: 0.5,\n  },\n\n  // Tamaños del contenedor\n  smallContainer: {\n    padding: 8,\n    gap: 4,\n  },\n  mediumContainer: {\n    padding: 12,\n    gap: 8,\n  },\n  largeContainer: {\n    padding: 12,\n    gap: 12,\n  },\n\n  // Contenedor de la carpeta\n  folderContainer: {\n    position: 'relative',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n\n  // Tamaños de la carpeta\n  smallFolder: {\n    width: 32,\n    height: 24,\n  },\n  mediumFolder: {\n    width: 48,\n    height: 36,\n  },\n  largeFolder: {\n    width: 64,\n    height: 48,\n  },\n\n  // Parte trasera de la carpeta\n  folderBack: {\n    position: 'absolute',\n    borderRadius: 6,\n    shadowOffset: {\n      width: 0,\n      height: 4,\n    },\n    shadowOpacity: 0.45,\n    shadowRadius: 3,\n    elevation: 6\n  },\n\n  // Pestaña de la carpeta\n  folderTab: {\n    position: 'absolute',\n    top: -6,\n    left: 0,\n    borderTopLeftRadius: 6,\n    borderTopRightRadius: 6,\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.15,\n    shadowRadius: 3,\n    elevation: 3,\n  },\n\n  // Tamaños de la pestaña\n  smallTab: {\n    width: 16,\n    height: 6,\n  },\n  mediumTab: {\n    width: 24,\n    height: 9,\n  },\n  largeTab: {\n    width: 32,\n    height: 12,\n  },\n\n  // Estilos del label\n  label: {\n    textAlign: 'center',\n    fontWeight: '500',\n    color: '#374151',\n  },\n  disabledLabel: {\n    color: '#9CA3AF',\n  },\n\n  // Tamaños del label\n  smallLabel: {\n    fontSize: 10,\n    lineHeight: 12,\n  },\n  mediumLabel: {\n    fontSize: 14,\n    lineHeight: 14,\n  },\n  largeLabel: {\n    fontSize: 14,\n    lineHeight: 16,\n  },\n});\n","import React from 'react';\nimport { View, Text, StyleSheet, ViewStyle, TextStyle } from 'react-native';\n\nexport interface FormBoxProps {\n  title?: string;\n  children: React.ReactNode;\n  style?: ViewStyle;\n  titleStyle?: TextStyle;\n}\n\nexport function FormBox({ title, children, style, titleStyle }: FormBoxProps) {\n  return (\n    <View style={[styles.box, style]}> \n      {title ? <Text style={[styles.title, titleStyle]}>{title}</Text> : null}\n      {children}\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  box: {\n    backgroundColor: '#F9FAFB',\n    borderColor: '#E5E7EB',\n    borderWidth: 1,\n    borderRadius: 12,\n    padding: 12,\n  },\n  title: {\n    fontSize: 14,\n    fontWeight: '700',\n    color: '#111827',\n    marginBottom: 8,\n  },\n});\n\nexport default FormBox;\n\n\n","import React from 'react';\nimport {\n  TouchableOpacity,\n  View,\n  Text,\n  StyleSheet,\n  ViewStyle,\n  TextStyle,\n  DimensionValue,\n} from 'react-native';\n\ninterface IconProps {\n  color?: string;\n  size?: number;\n}\n\nexport interface IconCardButtonProps {\n  /**\n   * Icono a mostrar en el botón (componente React)\n   */\n  icon: React.ReactNode;\n  /**\n   * Texto a mostrar debajo del icono\n   */\n  title: string;\n  /**\n   * Estado de conexión que determina si el botón está habilitado\n   */\n  isConnected?: boolean | undefined;\n  /**\n   * Deshabilita el botón independientemente del estado de conexión.\n   * Útil para módulos/remotes no disponibles.\n   */\n  disabled?: boolean;\n  /**\n   * Función que se ejecuta cuando se presiona el botón\n   */\n  onPress: () => void;\n  /**\n   * Función que se ejecuta cuando se presiona el botón en modo offline\n   */\n  onOfflinePress?: () => void;\n  /**\n   * Estilos personalizados para el contenedor\n   */\n  style?: ViewStyle;\n  /**\n   * Estilos personalizados para el texto\n   */\n  textStyle?: TextStyle;\n  /**\n   * Ancho del botón (por defecto: 100%)\n   */\n  width?: DimensionValue;\n  /**\n   * Altura del botón (por defecto: 160)\n   */\n  height?: number;\n}\n\nexport function IconCardButton({\n  icon,\n  title,\n  isConnected = true,\n  disabled = false,\n  onPress,\n  onOfflinePress,\n  style,\n  textStyle,\n  width = '100%',\n  height = 160,\n}: IconCardButtonProps) {\n  const handlePress = () => {\n    if (disabled) return;\n    if (isConnected === true) {\n      onPress();\n    } else if (onOfflinePress) {\n      onOfflinePress();\n    }\n  };\n\n  const isEffectivelyDisabled = disabled || (!isConnected && !onOfflinePress);\n\n  const containerStyle = [\n    styles.container,\n    {\n      width,\n      height,\n      backgroundColor: isEffectivelyDisabled ? '#F3F4F6' : '#FFFFFF',\n      borderColor: isEffectivelyDisabled ? '#E5E7EB' : '#D1D5DB',\n      opacity: isEffectivelyDisabled ? 0.55 : 1,\n    },\n    style,\n  ];\n\n  const textColor = isEffectivelyDisabled ? '#9CA3AF' : '#7A7A85';\n  const iconColor = isEffectivelyDisabled ? '#9CA3AF' : '#7A7A85';\n\n  // Render icon according to the value type\n  const iconNode = (() => {\n    // If it's a valid React element, try to inject color/size if supported\n    if (React.isValidElement(icon)) {\n      return React.cloneElement(icon as React.ReactElement<IconProps>, {\n        color: iconColor,\n        size: 40,\n      } as IconProps);\n    }\n\n    // If a plain string (emoji or glyph), wrap in Text to satisfy RN requirements\n    if (typeof icon === 'string' || typeof icon === 'number') {\n      return (\n        <Text style={[styles.iconText, { color: iconColor }]}>\n          {icon}\n        </Text>\n      );\n    }\n\n    // Fallback: render whatever it is\n    return icon as React.ReactNode;\n  })();\n\n  return (\n    <TouchableOpacity\n      style={containerStyle}\n      onPress={handlePress}\n      disabled={isEffectivelyDisabled}\n      activeOpacity={isEffectivelyDisabled ? 1 : 0.7}\n    >\n      <View style={styles.content}>\n        <View style={styles.iconContainer}>\n          {iconNode}\n        </View>\n        <Text\n          style={[\n            styles.title,\n            { color: textColor },\n            textStyle,\n          ]}\n        >\n          {title}\n        </Text>\n      </View>\n    </TouchableOpacity>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    borderWidth: 1,\n    borderRadius: 8,\n    justifyContent: 'center',\n    alignItems: 'center',\n    padding: 16,\n  },\n  content: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  iconContainer: {\n    justifyContent: 'center',\n    alignItems: 'center',\n    marginBottom: 8,\n  },\n  iconText: {\n    fontSize: 40,\n    textAlign: 'center',\n  },\n  title: {\n    fontSize: 16,\n    fontWeight: '600',\n    textAlign: 'center',\n  },\n});\n\nexport default IconCardButton;\n","// Componentes exportados\nexport { Breadcrumb } from './breadcrumb';\nexport { BREADCRUMB_LABEL_PARAM } from './breadcrumbRegistry';\nexport type { BreadcrumbLabel, BreadcrumbLabelRegistry } from './breadcrumbRegistry';\n\nexport { FolderIconButton } from './folder-icon-button';\n\nexport { IconCardButton } from './icon-card-button';\nexport type { IconCardButtonProps } from './icon-card-button';\n\n\nexport { NetworkIndicator } from './network-indicator';\nexport type { NetworkState } from './network-indicator';\n\nexport { ODSWidget } from './ods-widget';\n\nexport { default as StatusButton } from './status-button';\nexport { default as Tag } from './tag';\n\n// UiMobile placeholder eliminado del bundle público\n\n// Modals\nexport { default as ConfirmationModal } from './confirmation-modal';\nexport type { ConfirmationModalProps } from './confirmation-modal';\n\nexport { default as SkeletonLoader } from './skeleton-loader';\nexport type { SkeletonLoaderProps } from './skeleton-loader';\n\nexport { default as Select, MenuItem } from './select';\nexport type { SelectProps, MenuItemProps } from './select';\n\nexport { default as SearchableSelect } from './searchable-select';\nexport type { SearchableSelectProps, SearchableSelectOption } from './searchable-select';\n\nexport { default as RadioGroup } from './radio-group';\nexport type { RadioGroupProps, RadioOption, RadioValue } from './radio-group';\n\nexport { default as DatePicker } from './date-picker';\nexport type { DatePickerProps } from './date-picker';\nexport { DateRangePicker } from './date-range-picker';\nexport type { DateRangePickerProps, DateRange } from './date-range-picker';\nexport { default as TimePicker } from './time-picker';\nexport type { TimePickerProps } from './time-picker';\n\n// Inputs\nexport { default as NumericField } from './numeric-field';\nexport type { NumericFieldProps } from './numeric-field';\n\nexport { default as SearchInput } from './search-input';\nexport type { SearchInputProps } from './search-input';\n\nexport { default as LoadingSpinner } from './loading-spinner';\nexport type { LoadingSpinnerProps } from './loading-spinner';\n\n// Form primitives\nexport { FormBox } from './form-box';\nexport type { FormBoxProps } from './form-box';\nexport { FieldGroup } from './field-group';\nexport type { FieldGroupProps } from './field-group';\n// Data display\nexport { StatCard } from './stat-card';\nexport type { StatCardProps } from './stat-card';\n\n// Summary\nexport { default as SummaryTable } from './summary-table';\nexport type { SummaryTableProps, SummaryItem } from './summary-table';\n\n// Lists\nexport { default as MobileTable } from './mobile-table';\nexport type { MobileTableProps } from './mobile-table';\n\n// Progress\nexport { default as ProgressBar } from './progress-bar';\nexport type { ProgressBarProps } from './progress-bar';\n\n// Inputs extra\nexport { default as Checkbox } from './checkbox';\nexport type { CheckboxProps } from './checkbox';\n\n","import React from 'react';\nimport { ActivityIndicator, StyleSheet, View, ViewStyle } from 'react-native';\n\nexport interface LoadingSpinnerProps {\n  size?: 'small' | 'large' | number;\n  color?: string;\n  style?: ViewStyle;\n}\n\nexport default function LoadingSpinner({ size = 'small', color = '#6B7280', style }: LoadingSpinnerProps) {\n  return (\n    <View style={[styles.container, style]}>\n      <ActivityIndicator size={size} color={color} />\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    alignItems: 'center',\n    justifyContent: 'center',\n    paddingVertical: 12,\n  },\n});\n\n\n","import React, { memo, useMemo } from 'react';\nimport { FlatList, ListRenderItemInfo, StyleSheet, Text, TouchableOpacity, View, ViewStyle, TextStyle, StyleProp } from 'react-native';\nimport SummaryTable, { SummaryItem } from './summary-table';\n\nexport interface CardAction {\n  key: string;\n  label?: string;\n  icon?: React.ReactNode;\n  onPress: () => void;\n  backgroundColor?: string;\n  textColor?: string;\n  borderColor?: string;\n  showLabel?: boolean;\n}\n\nexport interface MobileTableProps {\n  data: Array<Record<string, any>>;\n  titleKey?: string;\n  onRowClick?: (item: Record<string, any>) => void;\n  onEdit?: (item: Record<string, any>) => void;\n  hasActions?: boolean;\n  cardType?: string;\n  accentColor?: string;\n  headerComponent?: React.ReactNode;\n  footerComponent?: React.ReactNode;\n  contentContainerStyle?: StyleProp<ViewStyle>;\n  ListEmptyComponent?: React.ReactNode;\n  style?: StyleProp<ViewStyle>;\n  scrollEnabled?: boolean;\n  getCardTitle?: (item: Record<string, any>) => string | undefined;\n  getCardSubtitle?: (item: Record<string, any>) => string | undefined;\n  isItemSelected?: (item: Record<string, any>) => boolean;\n  getActions?: (item: Record<string, any>) => CardAction[] | undefined;\n  onScroll?: (event: any) => void;\n  onScrollBeginDrag?: (event: any) => void;\n  stickyHeaderIndices?: number[];\n}\n\nfunction toSummaryItems(item: Record<string, any>, titleKey: string): { title: string; items: SummaryItem[] } {\n  const entries = Object.entries(item);\n  const title = (item[titleKey] ?? '').toString();\n  const items: SummaryItem[] = entries\n    .filter(([k, value]) => {\n      if (k === titleKey || k === 'id' || k === 'raw') {\n        return false;\n      }\n\n      return typeof value !== 'object' || React.isValidElement(value);\n    })\n    .map(([name, value]) => ({\n      name,\n      value: React.isValidElement(value) ? value : String(value ?? ''),\n    }));\n  return { title, items };\n}\n\ntype CardProps = {\n  item: Record<string, any>;\n  titleKey: string;\n  accentColor?: string;\n  hasActions?: boolean;\n  onPress?: () => void;\n  onEdit?: () => void;\n  cardStyle?: ViewStyle;\n  titleStyle?: TextStyle;\n  actions?: CardAction[];\n};\n\nconst Card = memo(function Card({\n  item,\n  titleKey,\n  accentColor,\n  onPress,\n  onEdit,\n  hasActions,\n  cardStyle,\n  titleStyle,\n  actions,\n}: CardProps) {\n  const { title, items } = useMemo(() => toSummaryItems(item, titleKey), [item, titleKey]);\n  const resolvedActions = actions?.length ? actions : undefined;\n  return (\n    <TouchableOpacity activeOpacity={0.9} onPress={onPress} style={[styles.card, cardStyle]}>\n      <View style={styles.header}>\n        <Text style={[styles.title, titleStyle]} numberOfLines={1}>{title}</Text>\n        {resolvedActions ? (\n          <View style={styles.actionsRow}>\n            {resolvedActions.map((action) => (\n              <TouchableOpacity\n                key={action.key}\n                onPress={action.onPress}\n                activeOpacity={0.85}\n                style={[\n                  styles.actionBtn,\n                  action.backgroundColor ? { backgroundColor: action.backgroundColor } : undefined,\n                  action.borderColor ? { borderColor: action.borderColor, borderWidth: 1 } : undefined,\n                ]}\n                accessibilityRole=\"button\"\n                accessibilityLabel={action.label ?? 'Acción'}\n              >\n                {action.icon ? action.icon : null}\n                {action.label && action.showLabel !== false ? (\n                  <Text style={[styles.actionText, action.textColor ? { color: action.textColor } : undefined]}>\n                    {action.label}\n                  </Text>\n                ) : null}\n              </TouchableOpacity>\n            ))}\n          </View>\n        ) : hasActions && onEdit ? (\n          <TouchableOpacity onPress={onEdit} activeOpacity={0.85} style={styles.editBtn}>\n            <Text style={[styles.editText, { color: accentColor ?? '#1B418C' }]}>Editar</Text>\n          </TouchableOpacity>\n        ) : null}\n      </View>\n      <SummaryTable items={items} />\n    </TouchableOpacity>\n  );\n});\n\nexport default function MobileTable({\n  data,\n  titleKey = 'Campo',\n  onRowClick,\n  onEdit,\n  hasActions,\n  accentColor,\n  headerComponent,\n  footerComponent,\n  contentContainerStyle,\n  ListEmptyComponent,\n  style,\n  scrollEnabled = true,\n  getCardTitle: _getCardTitle,\n  getCardSubtitle: _getCardSubtitle,\n  isItemSelected,\n  getActions,\n  onScroll,\n  onScrollBeginDrag,\n  stickyHeaderIndices,\n}: MobileTableProps) {\n  const renderItem = ({ item }: ListRenderItemInfo<Record<string, any>>) => {\n    const selected = isItemSelected ? isItemSelected(item) : false;\n    const actions = getActions?.(item);\n    return (\n      <Card\n        item={item}\n        titleKey={titleKey}\n        accentColor={accentColor}\n        hasActions={hasActions}\n        onPress={onRowClick ? () => onRowClick(item) : undefined}\n        onEdit={onEdit ? () => onEdit(item) : undefined}\n        cardStyle={selected ? styles.selectedCard : undefined}\n        titleStyle={selected ? styles.selectedTitle : undefined}\n        actions={actions}\n      />\n    );\n  };\n\n  return (\n    <FlatList\n      data={data}\n      keyExtractor={(it, idx) => String((it as any).id ?? idx)}\n      renderItem={renderItem}\n      ItemSeparatorComponent={() => <View style={styles.sep} />}\n      contentContainerStyle={[styles.container, contentContainerStyle]}\n      ListHeaderComponent={headerComponent as any}\n      ListFooterComponent={footerComponent as any}\n      ListEmptyComponent={ListEmptyComponent as any}\n      style={style}\n      nestedScrollEnabled\n      scrollEnabled={scrollEnabled}\n      keyboardShouldPersistTaps=\"handled\"\n      contentInsetAdjustmentBehavior=\"automatic\"\n      onScroll={onScroll}\n      onScrollBeginDrag={onScrollBeginDrag}\n      stickyHeaderIndices={stickyHeaderIndices}\n    />\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    paddingVertical: 8,\n    paddingHorizontal: 12,\n    rowGap: 24 as any,\n    backgroundColor: '#f9fafb',\n  },\n  sep: {\n    height: 24,\n  },\n  card: {\n    width: '100%',\n  },\n  header: {\n    paddingHorizontal: 4,\n    paddingVertical: 6,\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    marginBottom: 12,\n  },\n  title: {\n    fontSize: 18,\n    fontWeight: '700',\n    color: '#111827',\n    flex: 1,\n    marginRight: 12,\n  },\n  editBtn: {\n    paddingHorizontal: 12,\n    paddingVertical: 6,\n    borderRadius: 8,\n    backgroundColor: '#F3F4F6',\n  },\n  editText: {\n    fontWeight: '600',\n  },\n  actionsRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 8,\n  },\n  actionBtn: {\n    paddingHorizontal: 10,\n    paddingVertical: 6,\n    borderRadius: 999,\n    backgroundColor: '#EFF6FF',\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'center',\n    minWidth: 36,\n    minHeight: 36,\n  },\n  actionText: {\n    fontWeight: '600',\n    color: '#1D4ED8',\n  },\n  selectedCard: {\n    backgroundColor: '#DBEAFE',\n    borderColor: '#3B82F6',\n    borderWidth: 2,\n    borderRadius: 12,\n  },\n  selectedTitle: {\n    color: '#1D4ED8',\n  },\n});\n\n","import { View, Text, StyleSheet } from 'react-native';\nimport { useNetworkStatus } from '../hooks/useNetworkStatus';\n\nimport { ExclamationTriangleIcon, QuestionMarkCircleIcon, SignalIcon, WifiIcon } from \"react-native-heroicons/outline\";\n\nexport type NetworkStatus = 'wifi' | 'cellular' | 'none' | 'unknown';\n\nexport interface NetworkState {\n  status: NetworkStatus;\n  isConnected: boolean;\n}\n\nexport function NetworkIndicator() {\n  const { status, isConnected } = useNetworkStatus();\n\n  const getNetworkInfo = (status: NetworkStatus, isConnected: boolean) => {\n    if (!isConnected || status === 'none') {\n      return {\n        icon: <ExclamationTriangleIcon size={16} color=\"#F87171\" />,\n        text: 'Sin conexión',\n        containerStyle: styles.containerDisconnected,\n        textStyle: styles.textDisconnected,\n      };\n    }\n\n    switch (status) {\n      case 'wifi':\n        return {\n          icon: <WifiIcon size={16} color=\"#4ADE80\" />,\n          text: 'WiFi',\n          containerStyle: styles.containerWifi,\n          textStyle: styles.textWifi,\n        };\n      case 'cellular':\n        return {\n          icon: <SignalIcon size={16} color=\"#60A5FA\" />,\n          text: 'Datos móviles',\n          containerStyle: styles.containerCellular,\n          textStyle: styles.textCellular,\n        };\n      case 'unknown':\n      default:\n        return {\n          icon: <QuestionMarkCircleIcon size={16} color=\"#6B7280\" />,\n          text: 'Desconocido',\n          containerStyle: styles.containerUnknown,\n          textStyle: styles.textUnknown,\n        };\n    }\n  };\n\n  const networkInfo = getNetworkInfo(status, isConnected);\n\n  return (\n    <View style={[styles.container, networkInfo.containerStyle]}>\n      {networkInfo.icon}\n      <Text style={[styles.text, networkInfo.textStyle]}>{networkInfo.text}</Text>\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 6, // equivalent to gap-1.5 (1.5 * 4px = 6px)\n    paddingHorizontal: 8, // equivalent to px-2 (2 * 4px = 8px)\n    paddingVertical: 4, // equivalent to py-1 (1 * 4px = 4px)\n    borderRadius: 9999, // equivalent to rounded-full\n    fontSize: 14, // equivalent to text-xs\n    fontWeight: '500', // equivalent to font-medium\n  },\n  text: {\n    fontSize: 14,\n    fontWeight: '500',\n  },\n  // Disconnected state\n  containerDisconnected: {\n    backgroundColor: '#EF444433', // equivalent to bg-red-500/20\n  },\n  textDisconnected: {\n    color: '#F87171', // equivalent to text-red-400\n  },\n  // WiFi state\n  containerWifi: {\n    backgroundColor: '#22C55E33', // equivalent to bg-green-500/20\n  },\n  textWifi: {\n    color: '#4ADE80', // equivalent to text-green-400\n  },\n  // Cellular state\n  containerCellular: {\n    backgroundColor: '#3B82F633', // equivalent to bg-blue-500/20\n  },\n  textCellular: {\n    color: '#60A5FA', // equivalent to text-blue-400\n  },\n  // Unknown state\n  containerUnknown: {\n    backgroundColor: '#6B728033', // equivalent to bg-gray-500/20\n  },\n  textUnknown: {\n    color: '#9CA3AF', // equivalent to text-gray-400\n  },\n});\n\nexport default NetworkIndicator;\n","import React, { useMemo } from 'react';\nimport { View, Text, TextInput, StyleSheet, ViewStyle, TextStyle } from 'react-native';\n\nexport interface NumericFieldProps {\n  label?: string;\n  unit?: string;\n  required?: boolean;\n  value: string | number | null;\n  onChange: (value: string) => void;\n  min?: number;\n  step?: number;\n  onlyIntegers?: boolean;\n  disabled?: boolean;\n  touched?: boolean;\n  errorText?: string;\n  containerStyle?: ViewStyle;\n  inputStyle?: TextStyle;\n  unitTextStyle?: TextStyle;\n}\n\n/**\n * NumericField: campo numérico consistente con la estética de ui-mobile.\n * No aplica validación compleja; delega al consumidor y muestra errores si se indican.\n */\nexport default function NumericField({\n  label,\n  unit,\n  required = false,\n  value,\n  onChange,\n  onlyIntegers = false,\n  disabled = false,\n  touched = false,\n  errorText,\n  containerStyle,\n  inputStyle,\n  unitTextStyle,\n}: NumericFieldProps) {\n  const showError = useMemo(() => Boolean(touched && errorText), [touched, errorText]);\n\n  return (\n    <View style={containerStyle}>\n      {label ? (\n        <Text style={styles.label}>\n          {label}\n          {required ? <Text style={styles.required}> *</Text> : null}\n        </Text>\n      ) : null}\n      <View style={[styles.fieldRow, disabled && styles.disabled]}>\n        <TextInput\n          value={value == null ? '' : String(value)}\n          onChangeText={(text) => {\n            if (text === '') {\n              onChange('');\n              return;\n            }\n\n            if (onlyIntegers) {\n              const numeric = text.replace(/[^0-9]/g, '');\n              onChange(numeric);\n            } else {\n              const normalized = text.replace(',', '.');\n              const parts = normalized.split('.');\n              const numeric = parts.length > 2\n                ? parts[0] + '.' + parts.slice(1).join('')\n                : normalized.replace(/[^0-9.]/g, '');\n              onChange(numeric);\n            }\n          }}\n          editable={!disabled}\n          keyboardType={onlyIntegers ? 'number-pad' : 'decimal-pad'}\n          style={[styles.input, inputStyle]}\n          accessibilityLabel={label}\n          placeholder={required ? 'Requerido' : undefined}\n        />\n        {unit ? <Text style={[styles.unit, unitTextStyle]}>{unit}</Text> : null}\n      </View>\n      {showError ? <Text style={styles.errorText}>{errorText}</Text> : null}\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  label: {\n    marginBottom: 6,\n    color: '#6B7280',\n    fontSize: 14,\n    fontWeight: '500',\n  },\n  required: {\n    color: '#FF0000',\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  fieldRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 8,\n    borderWidth: 1,\n    borderColor: '#D1D5DB',\n    borderRadius: 8,\n    backgroundColor: '#FFFFFF',\n    paddingHorizontal: 12,\n    minHeight: 48,\n  },\n  disabled: {\n    opacity: 0.6,\n  },\n  input: {\n    flex: 1,\n    color: '#111827',\n    fontSize: 16,\n    paddingVertical: 10,\n  },\n  unit: {\n    color: '#6B7280',\n    fontWeight: '600',\n  },\n  errorText: {\n    marginTop: 4,\n    color: '#FF1D4B',\n    fontSize: 12,\n  },\n});\n\n","import { FunctionComponent } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  TouchableOpacity,\n} from 'react-native';\n\nimport Svg, { Path } from 'react-native-svg';\n\n// Componente del icono de documento\ninterface DocumentIconProps {\n  size?: number;\n  color?: string;\n}\n\nconst DocumentIcon: FunctionComponent<DocumentIconProps> = ({ \n  size = 24, \n  color = '#F59E0B' \n}) => (\n  <Svg\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke={color}\n    strokeWidth={2}\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  >\n    <Path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n    <Path d=\"M14 2v6h6\" />\n    <Path d=\"M16 13H8\" />\n    <Path d=\"M16 17H8\" />\n    <Path d=\"M10 9H8\" />\n  </Svg>\n);\n\n// Componente del icono de plus\ninterface PlusIconProps {\n  size?: number;\n  color?: string;\n}\n\nconst PlusIcon: FunctionComponent<PlusIconProps> = ({ \n  size = 20, \n  color = '#F59E0B' \n}) => (\n  <Svg\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke={color}\n    strokeWidth={2}\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  >\n    <Path d=\"M12 4v16m8-8H4\" />\n  </Svg>\n);\n\ninterface ODSWidgetProps {\n  onViewODS?: () => void;\n  onCreateODS?: () => void;\n}\n\nexport const ODSWidget: FunctionComponent<ODSWidgetProps> = ({\n  onViewODS,\n  onCreateODS,\n}) => {\n  const handleViewODS = () => {\n    if (onViewODS) {\n      onViewODS();\n    }\n  };\n\n  const handleCreateODS = () => {\n    if (onCreateODS) {\n      onCreateODS();\n    }\n  };\n\n  return (\n    <View style={styles.wrapper}>\n      <TouchableOpacity\n        onPress={handleViewODS}\n        style={styles.container}\n        activeOpacity={0.95}\n      >\n        {/* Header Section */}\n        <View style={styles.header}>\n          <View style={styles.leftSection}>\n            <View style={styles.iconContainer}>\n              <DocumentIcon size={24} color=\"#F59E0B\" />\n            </View>\n            <View style={styles.textContainer}>\n              <Text style={styles.title}>ODS</Text>\n              <Text style={styles.subtitle}>Orden de Servicio</Text>\n            </View>\n          </View>\n        </View>\n      </TouchableOpacity>\n\n      {/* Botón de acción posicionado sobre la tarjeta */}\n      <View style={styles.actionButtonContainer}>\n        <TouchableOpacity\n          onPress={handleCreateODS}\n          style={styles.actionButton}\n          activeOpacity={0.8}\n        >\n          <Text style={styles.actionButtonText}>Crear ODS</Text>\n          <PlusIcon size={20} color=\"#F59E0B\" />\n        </TouchableOpacity>\n      </View>\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  wrapper: {\n    width: '100%',\n    position: 'relative',\n  },\n  container: {\n    width: '100%',\n    borderRadius: 8,\n    padding: 16,\n    backgroundColor: '#F59E0B', // Color base del gradiente\n    shadowColor: '#000',\n    shadowOffset: {\n      width: 0,\n      height: 4,\n    },\n    shadowOpacity: 0.1,\n    shadowRadius: 6,\n    elevation: 4,\n  },\n  header: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'flex-start',\n    paddingRight: 130, // Dejar espacio para el botón absoluto\n  },\n  leftSection: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    flex: 1,\n  },\n  iconContainer: {\n    width: 48,\n    height: 48,\n    borderRadius: 8,\n    backgroundColor: 'rgba(255, 255, 255, 0.9)',\n    justifyContent: 'center',\n    alignItems: 'center',\n    marginRight: 12,\n  },\n  textContainer: {\n    flex: 1,\n  },\n  title: {\n    fontSize: 18,\n    fontWeight: 'bold',\n    color: '#FFFFFF',\n    marginBottom: 2,\n    textShadowColor: 'rgba(0, 0, 0, 0.1)',\n    textShadowOffset: { width: 0, height: 1 },\n    textShadowRadius: 2,\n  },\n  subtitle: {\n    fontSize: 14,\n    color: '#FED7AA', // text-orange-100 equivalente\n    textShadowColor: 'rgba(0, 0, 0, 0.05)',\n    textShadowOffset: { width: 0, height: 1 },\n    textShadowRadius: 1,\n  },\n  actionButtonContainer: {\n    position: 'absolute',\n    right: 16,\n    top: 16,\n    bottom: 16,\n    justifyContent: 'center',\n    zIndex: 10,\n    elevation: 5,\n  },\n  actionButton: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    backgroundColor: '#FFFFFF',\n    paddingHorizontal: 16,\n    paddingVertical: 10,\n    borderRadius: 8,\n    shadowColor: '#000',\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.1,\n    shadowRadius: 4,\n    elevation: 2,\n    gap: 8,\n  },\n  actionButtonText: {\n    color: '#F59E0B',\n    fontSize: 14,\n    fontWeight: '600',\n  },\n});\n","import React from 'react';\nimport { View, ViewStyle, StyleSheet } from 'react-native';\n\nexport interface ProgressBarProps {\n  value: number; // 0 - 100\n  height?: number;\n  backgroundColor?: string; // track color\n  progressColor?: string; // bar color\n  rounded?: boolean;\n  style?: ViewStyle;\n}\n\nexport function ProgressBar({\n  value,\n  height = 8,\n  backgroundColor = '#E5E7EB',\n  progressColor = '#2563EB',\n  rounded = true,\n  style,\n}: ProgressBarProps) {\n  const clamped = Math.max(0, Math.min(100, Number.isFinite(value) ? value : 0));\n  const radius = rounded ? height / 2 : 0;\n\n  return (\n    <View\n      style={[\n        styles.track,\n        { height, backgroundColor, borderRadius: radius },\n        style,\n      ]}\n      accessible\n      accessibilityRole=\"progressbar\"\n      accessibilityValue={{ now: clamped, min: 0, max: 100 }}\n    >\n      <View\n        style={{\n          width: `${clamped}%`,\n          height: '100%',\n          backgroundColor: progressColor,\n          borderRadius: radius,\n        }}\n      />\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  track: {\n    width: '100%',\n    overflow: 'hidden',\n  },\n});\n\nexport default ProgressBar;\n\n\n","import React from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet, ViewStyle, TextStyle } from 'react-native';\n\nexport type RadioValue = string | number | null;\n\nexport interface RadioOption {\n  value: RadioValue;\n  label: string;\n  disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n  title?: string;\n  options: RadioOption[];\n  selectedValue: RadioValue;\n  onValueChange: (next: RadioValue) => void;\n  row?: boolean;\n  accentColor?: string;\n  style?: ViewStyle;\n  titleStyle?: TextStyle;\n  optionStyle?: ViewStyle;\n  labelStyle?: TextStyle;\n  required?: boolean;\n}\n\nexport function RadioGroup({\n  title,\n  options,\n  selectedValue,\n  onValueChange,\n  row = false,\n  accentColor = '#007AFF',\n  style,\n  titleStyle,\n  optionStyle,\n  labelStyle,\n  required = false,\n}: RadioGroupProps) {\n  return (\n    <View style={[styles.container, style]}>\n      {title ? (\n        <Text style={[styles.title, titleStyle]}>\n          {title}\n          {required ? <Text style={styles.required}> *</Text> : null}\n        </Text>\n      ) : null}\n      <View style={[styles.options, row && styles.row]}>\n        {options.map((opt) => {\n          const isSelected = opt.value === selectedValue;\n          return (\n            <TouchableOpacity\n              key={String(opt.value)}\n              accessibilityRole=\"radio\"\n              accessibilityState={{ selected: isSelected, disabled: !!opt.disabled }}\n              activeOpacity={0.8}\n              disabled={opt.disabled}\n              onPress={() => onValueChange(opt.value)}\n              style={[\n                styles.pillOption,\n                row && styles.optionRow,\n                {\n                  backgroundColor: isSelected ? accentColor : '#FFFFFF',\n                  borderColor: accentColor,\n                },\n                optionStyle,\n              ]}\n            >\n              <Text\n                style={[\n                  styles.pillLabel,\n                  { color: isSelected ? '#FFFFFF' : accentColor },\n                  labelStyle,\n                ]}\n              >\n                {opt.label}\n              </Text>\n            </TouchableOpacity>\n          );\n        })}\n      </View>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    gap: 8,\n  },\n  title: {\n    fontSize: 14,\n    fontWeight: '600',\n    color: '#374151',\n  },\n  required: {\n    color: '#FF0000',\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  options: {\n    gap: 12,\n  },\n  row: {\n    flexDirection: 'row',\n    flexWrap: 'wrap',\n  },\n  pillOption: {\n    width: '100%',\n    borderRadius: 16,\n    borderWidth: 2,\n    paddingVertical: 20,\n    paddingHorizontal: 16,\n    alignItems: 'center',\n    justifyContent: 'center',\n    shadowColor: '#000',\n    shadowOpacity: 0.1,\n    shadowRadius: 6,\n    shadowOffset: { width: 0, height: 3 },\n    elevation: 3,\n  },\n  optionRow: {\n    marginRight: 12,\n  },\n  pillLabel: {\n    fontSize: 18,\n    fontWeight: '700',\n  },\n});\n\nexport default RadioGroup;\n\n\n","import React from 'react';\nimport {\n  View,\n  TextInput,\n  StyleSheet,\n  TouchableOpacity,\n  ViewStyle,\n} from 'react-native';\nimport { MagnifyingGlassIcon, XMarkIcon } from 'react-native-heroicons/outline';\n\nexport interface SearchInputProps {\n  value: string;\n  onChangeText: (text: string) => void;\n  placeholder?: string;\n  containerStyle?: ViewStyle;\n  accentColor?: string;\n}\n\nexport default function SearchInput({\n  value,\n  onChangeText,\n  placeholder = 'Buscar...',\n  containerStyle,\n  accentColor = '#1B418C',\n}: SearchInputProps) {\n  return (\n    <View style={[styles.container, containerStyle]}>\n      <View style={styles.inputWrapper}>\n        <MagnifyingGlassIcon size={20} color=\"#6B7280\" style={styles.searchIcon} />\n        <TextInput\n          value={value}\n          onChangeText={onChangeText}\n          placeholder={placeholder}\n          placeholderTextColor=\"#9CA3AF\"\n          style={styles.input}\n          autoCorrect={false}\n          autoCapitalize=\"none\"\n        />\n        {value.length > 0 && (\n          <TouchableOpacity\n            onPress={() => onChangeText('')}\n            style={styles.clearButton}\n          >\n            <XMarkIcon size={20} color=\"#6B7280\" />\n          </TouchableOpacity>\n        )}\n      </View>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    paddingVertical: 12,\n    backgroundColor: '#f9fafb',\n  },\n  inputWrapper: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    backgroundColor: '#FFFFFF',\n    borderWidth: 1,\n    borderColor: '#E5E7EB',\n    borderRadius: 12,\n    paddingHorizontal: 12,\n    height: 48,\n    shadowColor: '#000',\n    shadowOffset: { width: 0, height: 1 },\n    shadowOpacity: 0.05,\n    shadowRadius: 2,\n    elevation: 2,\n  },\n  searchIcon: {\n    marginRight: 8,\n  },\n  input: {\n    flex: 1,\n    fontSize: 15,\n    color: '#111827',\n    paddingVertical: 8,\n  },\n  clearButton: {\n    padding: 4,\n  },\n});\n","import React, { useMemo, useState } from 'react';\nimport { View, Text, TextInput, StyleSheet } from 'react-native';\nimport Select, { MenuItem } from './select';\n\nexport interface SearchableSelectOption {\n  value: string | number | null;\n  label: string;\n}\n\nexport interface SearchableSelectProps {\n  label?: string;\n  placeholder?: string;\n  options: SearchableSelectOption[];\n  selectedValue: string | number | null;\n  onValueChange: (next: string | number | null) => void;\n  emptyStateText?: string;\n  loading?: boolean;\n  loadingMessage?: string;\n  searchPlaceholder?: string;\n  minSearchLength?: number;\n  accentColor?: string;\n  required?: boolean;\n  disabled?: boolean;\n  direction?: \"auto\" | \"up\" | \"down\";\n  margin?: number;\n}\n\nexport default function SearchableSelect({\n  label,\n  placeholder = 'Selecciona una opción',\n  options,\n  selectedValue,\n  onValueChange,\n  emptyStateText,\n  loading = false,\n  loadingMessage = 'Cargando opciones...',\n  searchPlaceholder = 'Buscar...',\n  minSearchLength = 0,\n  accentColor,\n  required = false,\n  disabled = false,\n  direction = \"auto\",\n  margin = 16,\n}: SearchableSelectProps) {\n  const [query, setQuery] = useState('');\n  const hasNoOptions = !loading && options.length === 0;\n  const emptyOptionsMessage = emptyStateText ?? 'No hay opciones disponibles';\n  const selectIsDisabled = disabled || loading;\n  const selectPlaceholder = loading\n    ? loadingMessage\n    : hasNoOptions\n      ? emptyOptionsMessage\n      : placeholder;\n\n  const filtered = useMemo(() => {\n    const q = query.trim().toLowerCase();\n    if (q.length < minSearchLength) return options;\n    return options.filter((o) => o.label.toLowerCase().includes(q));\n  }, [options, query, minSearchLength]);\n\n  return (\n    <View style={styles.container}>\n      <Select\n        value={selectedValue}\n        onChange={onValueChange}\n        label={label}\n        placeholder={selectPlaceholder}\n        accentColor={accentColor}\n        menuStyle={styles.menu}\n        required={required}\n        disabled={selectIsDisabled}\n        headerHeight={50} // Approximate height of the searchBox\n        direction={direction}\n        margin={margin}\n      >\n        <View style={styles.searchBox}>\n          <TextInput\n            value={query}\n            onChangeText={setQuery}\n            placeholder={searchPlaceholder}\n            style={styles.input}\n            placeholderTextColor=\"#9CA3AF\"\n          />\n          {minSearchLength > 0 ? (\n            <Text style={styles.hint}>{`Min. ${minSearchLength} caracteres`}</Text>\n          ) : null}\n        </View>\n        {loading ? (\n          <MenuItem value=\"__searchable_select_loading_state__\" disabled>\n            {loadingMessage}\n          </MenuItem>\n        ) : null}\n        {!loading ? filtered.map((opt) => (\n          <MenuItem key={String(opt.value)} value={opt.value}>\n            {opt.label}\n          </MenuItem>\n        )) : null}\n        {!loading && filtered.length === 0 ? (\n          <MenuItem value=\"__searchable_select_empty_state__\" disabled>\n            {emptyOptionsMessage}\n          </MenuItem>\n        ) : null}\n      </Select>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n  },\n  menu: {\n  },\n  searchBox: {\n    paddingHorizontal: 12,\n    paddingTop: 8,\n    paddingBottom: 4,\n    borderBottomWidth: 1,\n    borderBottomColor: '#E5E7EB',\n    backgroundColor: '#FFFFFF',\n  },\n  input: {\n    height: 36,\n    borderWidth: 1,\n    borderColor: '#E5E7EB',\n    borderRadius: 6,\n    paddingHorizontal: 10,\n    color: '#111827',\n  },\n  hint: {\n    marginTop: 4,\n    color: '#9CA3AF',\n    fontSize: 12,\n  },\n});\n\n\n","import React, {\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport {\n  View,\n  Text,\n  Modal,\n  TouchableOpacity,\n  TouchableWithoutFeedback,\n  StyleSheet,\n  Dimensions,\n  ViewStyle,\n  TextStyle,\n  ScrollView,\n  InteractionManager,\n  Animated,\n} from \"react-native\";\nimport { ChevronUpDownIcon } from \"react-native-heroicons/solid\";\nimport { useSelectPositioning } from \"./useSelectPositioning\";\n\ntype SelectValue = string | number | null;\n\ninterface SelectContextValue {\n  selectedValue: SelectValue;\n  onSelect: (value: SelectValue) => void;\n}\n\nconst SelectContext = React.createContext<SelectContextValue | null>(null);\n\nexport interface MenuItemProps {\n  value: SelectValue;\n  children: React.ReactNode;\n  disabled?: boolean;\n  style?: ViewStyle;\n  textStyle?: TextStyle;\n}\n\nexport function MenuItem({\n  value,\n  children,\n  disabled = false,\n  style,\n  textStyle,\n}: MenuItemProps) {\n  const ctx = useContext(SelectContext);\n\n  const isSelected = ctx?.selectedValue === value;\n\n  const handlePress = useCallback(() => {\n    if (disabled) return;\n    ctx?.onSelect(value);\n  }, [ctx, value, disabled]);\n\n  return (\n    <TouchableOpacity\n      accessibilityRole=\"button\"\n      accessibilityState={{ disabled, selected: !!isSelected }}\n      activeOpacity={0.7}\n      onPress={handlePress}\n      disabled={disabled}\n      style={[\n        styles.item,\n        isSelected && styles.itemSelected,\n        disabled && styles.itemDisabled,\n        style,\n      ]}\n    >\n      <Text\n        style={[\n          styles.itemText,\n          isSelected && styles.itemTextSelected,\n          textStyle,\n        ]}\n      >\n        {children}\n      </Text>\n    </TouchableOpacity>\n  );\n}\n\nexport interface SelectProps {\n  value: SelectValue;\n  required?: boolean;\n  onChange: (value: SelectValue) => void;\n  children: React.ReactNode;\n  label?: string;\n  placeholder?: string;\n  loading?: boolean;\n  loadingMessage?: string;\n  emptyStateText?: string;\n  disabled?: boolean;\n  size?: \"small\" | \"medium\" | \"large\";\n  style?: ViewStyle; // container\n  triggerStyle?: ViewStyle; // button\n  textStyle?: TextStyle; // selected text\n  menuStyle?: ViewStyle; // dropdown container\n  maxMenuHeight?: number;\n  offsetX?: number;\n  offsetY?: number;\n  accentColor?: string;\n  margin?: number;\n  headerHeight?: number;\n  direction?: \"auto\" | \"up\" | \"down\";\n}\n\nexport function Select({\n  value,\n  required = false,\n  onChange,\n  children,\n  label,\n  placeholder = \"Selecciona una opción\",\n  loading = false,\n  loadingMessage = \"Cargando opciones...\",\n  emptyStateText,\n  disabled = false,\n  size = \"medium\",\n  style,\n  triggerStyle,\n  textStyle,\n  menuStyle,\n  maxMenuHeight = 320,\n  offsetX = 0,\n  offsetY = 0,\n  accentColor = \"#6B7280\",\n  margin = 16,\n  headerHeight = 0,\n  direction = \"auto\",\n}: SelectProps) {\n  const [isOpen, setIsOpen] = useState(false);\n  const [menuHeight, setMenuHeight] = useState(0);\n  const [anchor, setAnchor] = useState<{\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n  } | null>(null);\n\n  const openerRef = useRef<View>(null);\n  const animValue = useRef(new Animated.Value(0)).current;\n\n  const windowDims = Dimensions.get(\"window\");\n  const emptyMessage =\n    emptyStateText ?? \"No hay opciones disponibles\";\n\n  const sizeStyles = useMemo(() => {\n    switch (size) {\n      case \"small\":\n        return {\n          paddingVertical: 8,\n          paddingHorizontal: 12,\n          minHeight: 36,\n          fontSize: 14,\n        };\n      case \"large\":\n        return {\n          paddingVertical: 16,\n          paddingHorizontal: 16,\n          minHeight: 56,\n          fontSize: 18,\n        };\n      default:\n        return {\n          paddingVertical: 12,\n          paddingHorizontal: 14,\n          minHeight: 48,\n          fontSize: 16,\n        };\n    }\n  }, [size]);\n\n  const selectableItemsCount = useMemo(() => {\n    let count = 0;\n    React.Children.forEach(children, (child) => {\n      if (!React.isValidElement(child)) return;\n      const childProps = child.props as MenuItemProps;\n      if (\n        childProps &&\n        Object.prototype.hasOwnProperty.call(childProps, \"value\") &&\n        !childProps.disabled\n      ) {\n        count += 1;\n      }\n    });\n    return count;\n  }, [children]);\n\n  const hasNoOptions = !loading && selectableItemsCount === 0;\n  const effectiveDisabled = disabled || loading || hasNoOptions;\n  const effectivePlaceholder = loading\n    ? loadingMessage\n    : hasNoOptions\n      ? emptyMessage\n      : placeholder;\n\n  const openMenu = useCallback(() => {\n    if (effectiveDisabled) return;\n    InteractionManager.runAfterInteractions(() => {\n      requestAnimationFrame(() => {\n        openerRef.current?.measureInWindow((x, y, width, height) => {\n          setAnchor({ x, y, width, height });\n          setIsOpen(true);\n        });\n      });\n    });\n  }, [effectiveDisabled]);\n\n  const closeMenu = useCallback(() => {\n    Animated.timing(animValue, {\n      toValue: 0,\n      duration: 150,\n      useNativeDriver: true,\n    }).start(() => {\n      setIsOpen(false);\n      setMenuHeight(0);\n      animValue.setValue(0);\n    });\n  }, [animValue]);\n\n  useEffect(() => {\n    const sub = Dimensions.addEventListener(\"change\", () => {\n      setIsOpen(false);\n    });\n    return () => {\n      sub.remove();\n    };\n  }, []);\n\n  const displayLabel = useMemo(() => {\n    let labelText: React.ReactNode = effectivePlaceholder;\n    React.Children.forEach(children, (child) => {\n      if (!React.isValidElement(child)) return;\n      const childProps = child.props as MenuItemProps;\n      if (\n        childProps &&\n        Object.prototype.hasOwnProperty.call(childProps, \"value\")\n      ) {\n        if (childProps.value === value) {\n          labelText = childProps.children;\n        }\n      }\n    });\n    return labelText;\n  }, [children, value, effectivePlaceholder]);\n\n  const onSelect = useCallback(\n    (nextValue: SelectValue) => {\n      onChange(nextValue);\n      closeMenu();\n    },\n    [onChange, closeMenu]\n  );\n\n  const items = useMemo(\n    () => React.Children.toArray(children).filter(Boolean),\n    [children]\n  );\n\n  const computedMenu = useSelectPositioning({\n    anchor,\n    viewport: { width: windowDims.width, height: windowDims.height },\n    maxMenuHeight,\n    headerHeight,\n    itemCount: items.length,\n    margin,\n    offsetX,\n    offsetY,\n    direction,\n    menuHeight,\n  });\n\n  useEffect(() => {\n    if (computedMenu?.isMeasured && isOpen) {\n      Animated.timing(animValue, {\n        toValue: 1,\n        duration: 200,\n        useNativeDriver: true,\n      }).start();\n    }\n  }, [computedMenu?.isMeasured, isOpen, animValue]);\n\n  return (\n    <View style={style}>\n      {label ? (\n        <Text style={[styles.label, { color: effectiveDisabled ? '#bfbfbf' : accentColor }]}>\n          {label}\n          {required ? <Text style={styles.required}> *</Text> : null}\n        </Text>\n      ) : null}\n\n      <TouchableOpacity\n        ref={openerRef}\n        activeOpacity={0.8}\n        onPress={openMenu}\n        disabled={effectiveDisabled}\n        accessibilityRole=\"button\"\n        accessibilityState={{ disabled: effectiveDisabled }}\n        style={[\n          styles.trigger,\n          {\n            paddingVertical: sizeStyles.paddingVertical,\n            paddingHorizontal: sizeStyles.paddingHorizontal,\n            minHeight: sizeStyles.minHeight,\n          },\n          // { borderColor: accentColor },\n          effectiveDisabled && styles.triggerDisabled,\n          triggerStyle,\n        ]}\n      >\n        <Text\n          numberOfLines={1}\n          style={[\n            styles.triggerText,\n            { fontSize: sizeStyles.fontSize },\n            (value === '' || value === null || value === undefined) && styles.placeholderText,\n            textStyle,\n          ]}\n        >\n          {displayLabel}\n        </Text>\n        <ChevronUpDownIcon size={18} color={accentColor} />\n      </TouchableOpacity>\n\n      <Modal\n        visible={isOpen}\n        transparent\n        onRequestClose={closeMenu}\n        presentationStyle=\"overFullScreen\"\n      >\n        <TouchableWithoutFeedback onPress={closeMenu}>\n          <Animated.View style={[styles.backdrop, { opacity: animValue }]} />\n        </TouchableWithoutFeedback>\n\n        {computedMenu ? (\n          <Animated.View\n            onLayout={(e) => {\n              const { height } = e.nativeEvent.layout;\n              if (height > 0 && menuHeight === 0) {\n                setMenuHeight(height);\n              }\n            }}\n            style={[\n              styles.menu,\n              {\n                top: computedMenu.top,\n                left: computedMenu.left,\n                width: computedMenu.width,\n                maxHeight: computedMenu.maxHeight,\n                opacity: animValue,\n                transform: [\n                  {\n                    translateY: animValue.interpolate({\n                      inputRange: [0, 1],\n                      outputRange: [computedMenu.openDown ? -10 : 10, 0],\n                    }),\n                  },\n                ],\n              },\n              menuStyle,\n            ]}\n          >\n            <SelectContext.Provider value={{ selectedValue: value, onSelect }}>\n              <View style={styles.menuInner}>\n                <ScrollView\n                  style={{ maxHeight: computedMenu.maxHeight }}\n                  contentContainerStyle={styles.scrollContainer}\n                  keyboardShouldPersistTaps=\"handled\"\n                  showsVerticalScrollIndicator\n                >\n                  {loading ? (\n                    <MenuItem value=\"__select_loading_state__\" disabled>\n                      {loadingMessage}\n                    </MenuItem>\n                  ) : null}\n                  {React.Children.map(children, (child) => child)}\n                  {!loading && hasNoOptions ? (\n                    <MenuItem value=\"__select_empty_state__\" disabled>\n                      {emptyMessage}\n                    </MenuItem>\n                  ) : null}\n                </ScrollView>\n              </View>\n            </SelectContext.Provider>\n          </Animated.View>\n        ) : null}\n      </Modal>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  label: {\n    marginBottom: 6,\n    color: \"#6B7280\",\n    fontSize: 14,\n    fontWeight: \"500\",\n  },\n  trigger: {\n    borderWidth: 1,\n    borderColor: \"#D1D5DB\",\n    borderRadius: 8,\n    backgroundColor: \"#FFFFFF\",\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    justifyContent: \"space-between\",\n    gap: 8,\n  },\n  triggerDisabled: {\n    opacity: 0.45,\n  },\n  triggerText: {\n    color: \"#111827\",\n    flex: 1,\n  },\n  placeholderText: {\n    color: \"#9CA3AF\",\n  },\n  backdrop: {\n    position: \"absolute\",\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    backgroundColor: \"rgba(0,0,0,0.2)\",\n  },\n  menu: {\n    position: \"absolute\",\n    backgroundColor: \"#FFFFFF\",\n    borderRadius: 8,\n    borderWidth: 1,\n    borderColor: \"#E5E7EB\",\n    shadowColor: \"#000\",\n    shadowOpacity: 0.15,\n    shadowRadius: 12,\n    shadowOffset: { width: 0, height: 6 },\n    elevation: 8,\n    overflow: \"hidden\",\n  },\n  menuInner: {\n    paddingVertical: 4,\n  },\n  scrollContainer: {\n    paddingVertical: 4,\n  },\n  item: {\n    paddingHorizontal: 12,\n    paddingVertical: 12,\n  },\n  itemDisabled: {\n    opacity: 0.5,\n  },\n  itemSelected: {\n    backgroundColor: \"#F3F4F6\",\n  },\n  itemText: {\n    color: \"#111827\",\n    fontSize: 16,\n  },\n  itemTextSelected: {\n    fontWeight: \"600\",\n  },\n  required: {\n    color: \"#FF0000\",\n    fontSize: 14,\n    fontWeight: \"600\",\n  },\n});\n\n// Attach subcomponent for ergonomic API: <Select.MenuItem />\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nSelect.MenuItem = MenuItem;\n\nexport default Select;\n","import * as React from 'react';\nimport { useEffect, useRef } from 'react';\nimport { Animated, StyleSheet, ViewStyle, DimensionValue } from 'react-native';\n\nexport interface SkeletonLoaderProps {\n  width?: DimensionValue;\n  height?: DimensionValue;\n  style?: ViewStyle;\n  borderRadius?: number;\n}\n\nexport const SkeletonLoader = ({\n  width = '100%',\n  height = 16,\n  style,\n  borderRadius = 4,\n}: SkeletonLoaderProps) => {\n  const opacity = useRef(new Animated.Value(0.3)).current;\n\n  useEffect(() => {\n    const pulse = Animated.loop(\n      Animated.sequence([\n        Animated.timing(opacity, {\n          toValue: 0.7,\n          duration: 800,\n          useNativeDriver: true,\n        }),\n        Animated.timing(opacity, {\n          toValue: 0.3,\n          duration: 800,\n          useNativeDriver: true,\n        }),\n      ])\n    );\n    \n    pulse.start();\n\n    return () => pulse.stop();\n  }, [opacity]);\n\n  return (\n    <Animated.View\n      style={[\n        styles.skeleton,\n        { width, height, borderRadius, opacity },\n        style,\n      ]}\n    />\n  );\n};\n\nconst styles = StyleSheet.create({\n  skeleton: {\n    backgroundColor: '#D1D5DB', // gray-300\n  },\n});\n\nexport default SkeletonLoader;\n","import React from 'react';\nimport { View, Text, StyleSheet, ViewStyle, TextStyle } from 'react-native';\n\ntype Tone = 'success' | 'warning' | 'danger' | 'info';\n\nexport interface StatCardProps {\n  value: string | number;\n  label: string;\n  icon?: React.ReactNode;\n  badge?: { text: string; tone: Tone } | null;\n  style?: ViewStyle;\n  valueStyle?: TextStyle;\n  labelStyle?: TextStyle;\n  iconSlot?: React.ReactNode;\n}\n\nexport function StatCard({ value, label, icon, badge, style, valueStyle, labelStyle, iconSlot }: StatCardProps) {\n  return (\n    <View style={[styles.card, style]}> \n      {iconSlot ? (\n        <View style={styles.iconWrap}>{iconSlot}</View>\n      ) : (\n        <View style={styles.iconWrap}>{icon}</View>\n      )}\n      <Text style={[styles.value, valueStyle]}>{value ?? 'N/A'}</Text>\n      <Text style={[styles.label, labelStyle]}>{label}</Text>\n      {badge ? (\n        <View style={[styles.badge, toneToStyle(badge.tone).container]}> \n          <Text style={[styles.badgeText, toneToStyle(badge.tone).text]}>{badge.text}</Text>\n        </View>\n      ) : null}\n    </View>\n  );\n}\n\nfunction toneToStyle(tone: Tone): { container: ViewStyle; text: TextStyle } {\n  switch (tone) {\n    case 'success':\n      return { container: { backgroundColor: '#D1FAE5' }, text: { color: '#065F46' } };\n    case 'warning':\n      return { container: { backgroundColor: '#FEF3C7' }, text: { color: '#92400E' } };\n    case 'danger':\n      return { container: { backgroundColor: '#FEE2E2' }, text: { color: '#991B1B' } };\n    default:\n      return { container: { backgroundColor: '#DBEAFE' }, text: { color: '#1E40AF' } };\n  }\n}\n\nconst styles = StyleSheet.create({\n  card: {\n    backgroundColor: '#FFFFFF',\n    borderRadius: 12,\n    padding: 16,\n    alignItems: 'center',\n    justifyContent: 'center',\n    gap: 6,\n    // Sombra sutil\n    shadowColor: '#00000050',\n    shadowOffset: { width: 0, height: 8 },\n    shadowOpacity: 0.02,\n    shadowRadius: 20,\n    elevation: 6,\n  },\n  iconWrap: {\n    width: 48,\n    height: 48,\n    borderRadius: 10,\n    alignItems: 'center',\n    justifyContent: 'center',\n    backgroundColor: '#2563EB',\n    overflow: 'hidden',\n  },\n  value: {\n    fontSize: 24,\n    fontWeight: '700',\n    color: '#111827',\n    textAlign: 'center',\n    lineHeight: 28,\n    marginTop: 6,\n  },\n  label: {\n    fontSize: 13,\n    color: '#6B7280',\n    textAlign: 'center',\n    marginTop: 4,\n    fontWeight: '500',\n  },\n  badge: {\n    marginTop: 4,\n    paddingHorizontal: 8,\n    paddingVertical: 4,\n    borderRadius: 999,\n  },\n  badgeText: {\n    fontSize: 10,\n    fontWeight: '600',\n  },\n});\n\nexport default StatCard;\n\n\n","import React from 'react';\nimport {\n  TouchableOpacity,\n  Text,\n  ActivityIndicator,\n  StyleSheet,\n  ViewStyle,\n  TextStyle,\n  View,\n} from 'react-native';\n\ninterface StatusButtonProps {\n  title: string;\n  loadingTitle?: string;\n  onPress: () => void;\n  loading?: boolean;\n  disabled?: boolean;\n  style?: ViewStyle;\n  textStyle?: TextStyle;\n  loadingColor?: string;\n  backgroundColor?: string;\n  size?: 'small' | 'medium' | 'large';\n  leftIcon?: React.ReactNode;\n  rightIcon?: React.ReactNode;\n}\n\nexport default function StatusButton({\n  title,\n  loadingTitle,\n  onPress,\n  loading = false,\n  disabled = false,\n  style,\n  textStyle,\n  loadingColor = 'white',\n  backgroundColor,\n  size = 'medium',\n  leftIcon,\n  rightIcon,\n}: StatusButtonProps) {\n  const isDisabled = disabled || loading;\n\n  const getSizeStyles = () => {\n    switch (size) {\n      case 'small':\n        return {\n          paddingVertical: 8,\n          paddingHorizontal: 16,\n          minHeight: 36,\n          fontSize: 14,\n        };\n      case 'large':\n        return {\n          paddingVertical: 20,\n          paddingHorizontal: 32,\n          minHeight: 64,\n          fontSize: 18,\n        };\n      default: // medium\n        return {\n          paddingVertical: 16,\n          paddingHorizontal: 24,\n          minHeight: 56,\n          fontSize: 16,\n        };\n    }\n  };\n\n  const sizeStyles = getSizeStyles();\n\n  return (\n    <TouchableOpacity\n      style={[\n        styles.button,\n        {\n          paddingVertical: sizeStyles.paddingVertical,\n          paddingHorizontal: sizeStyles.paddingHorizontal,\n          minHeight: sizeStyles.minHeight,\n        },\n        backgroundColor && { backgroundColor },\n        isDisabled && styles.disabledButton,\n        style,\n      ]}\n      onPress={onPress}\n      disabled={isDisabled}\n    >\n      {loading ? (\n        <View style={styles.loadingContainer}>\n          <ActivityIndicator \n            color={loadingColor} \n            size=\"small\" \n            style={styles.spinner}\n          />\n          <Text style={[\n            styles.buttonText, \n            { fontSize: sizeStyles.fontSize },\n            textStyle\n          ]}\n          numberOfLines={1}\n          adjustsFontSizeToFit\n          minimumFontScale={0.75}>\n            {loadingTitle || title}\n          </Text>\n        </View>\n      ) : (\n        <View style={styles.contentRow}>\n          {leftIcon ? <View style={styles.iconLeft}>{leftIcon}</View> : null}\n          <Text\n            style={[\n              styles.buttonText,\n              { fontSize: sizeStyles.fontSize },\n              textStyle,\n            ]}\n            numberOfLines={1}\n            adjustsFontSizeToFit\n            minimumFontScale={0.75}\n          >\n            {title}\n          </Text>\n          {rightIcon ? <View style={styles.iconRight}>{rightIcon}</View> : null}\n        </View>\n      )}\n    </TouchableOpacity>\n  );\n}\n\nconst styles = StyleSheet.create({\n  button: {\n    borderRadius: 8,\n    alignItems: 'center',\n    justifyContent: 'center',\n    flexDirection: 'row',\n  },\n  disabledButton: {\n    opacity: 0.6,\n  },\n  loadingContainer: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  spinner: {\n    marginRight: 8,\n  },\n  contentRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'center',\n    width: '100%',\n  },\n  iconLeft: {\n    marginRight: 8,\n    flexShrink: 0,\n  },\n  iconRight: {\n    marginLeft: 8,\n    flexShrink: 0,\n  },\n  buttonText: {\n    fontWeight: '500',\n    color: 'white',\n    flexShrink: 1,\n    textAlign: 'center',\n  },\n});\n","import React from 'react';\nimport { View, Text, StyleSheet, ViewStyle } from 'react-native';\n\nexport interface SummaryItem {\n  name: string;\n  value: React.ReactNode;\n}\n\nexport interface SummaryTableProps {\n  items: SummaryItem[];\n  style?: ViewStyle;\n  accentColor?: string;\n  leftBackgroundColor?: string;\n}\n\nexport function SummaryTable({ items, style, leftBackgroundColor = '#F9FAFB' }: SummaryTableProps) {\n  const renderValue = (value: React.ReactNode) => {\n    if (React.isValidElement(value)) {\n      return value;\n    }\n\n    if (typeof value === 'string' || typeof value === 'number') {\n      return <Text style={[styles.value, { color: '#111827' }]}>{value}</Text>;\n    }\n\n    if (typeof value === 'boolean') {\n      return <Text style={[styles.value, { color: '#111827' }]}>{String(value)}</Text>;\n    }\n\n    return <Text style={[styles.value, { color: '#111827' }]}>{''}</Text>;\n  };\n\n  return (\n    <View style={[styles.card, style]}>\n      {items.map((item, idx) => (\n        <View\n          key={`${item.name}-${idx}`}\n          style={[styles.row, idx !== items.length - 1 && styles.rowDivider]}\n        >\n          <View style={styles.cellLeft}>\n            <View\n              pointerEvents=\"none\"\n              style={[\n                styles.leftBg,\n                idx === 0 && styles.leftBgTop,\n                idx === items.length - 1 && styles.leftBgBottom,\n                { backgroundColor: leftBackgroundColor },\n              ]}\n            />\n            <Text style={[styles.name]}>{item.name}:</Text>\n          </View>\n          <View style={styles.cellRight}>\n            {renderValue(item.value)}\n          </View>\n        </View>\n      ))}\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  card: {\n    backgroundColor: '#FFFFFF',\n    borderRadius: 10,\n    borderWidth: 1,\n    borderColor: '#E5E7EB',\n    overflow: 'hidden',\n    marginBottom: 16,\n    boxShadow: '0px 10px 16px 0px rgba(0, 0, 0, 0.05)',\n  },\n  row: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    paddingVertical: 12,\n    paddingHorizontal: 12,\n    backgroundColor: '#FFFFFF',\n  },\n  rowDivider: {\n    borderBottomWidth: 1,\n    borderBottomColor: '#E5E7EB',\n  },\n  cellLeft: {\n    width: '35%',\n    position: 'relative',\n    justifyContent: 'center',\n  },\n  cellRight: {\n    width: '65%',\n    paddingStart: 12,\n  },\n  leftBg: {\n    position: 'absolute',\n    top: -12,\n    bottom: -12,\n    left: -14,\n    right: 0,\n  },\n  leftBgTop: {\n    borderTopLeftRadius: 10,\n  },\n  leftBgBottom: {\n    borderBottomLeftRadius: 10,\n  },\n  name: {\n    color: '#111827',\n    fontWeight: '700',\n  },\n  value: {\n    color: '#374151',\n    fontWeight: '400',\n  },\n});\n\nexport default SummaryTable;\n\n\n","import React from 'react';\nimport { View, Text, StyleSheet, ViewStyle, TextStyle } from 'react-native';\n\nexport interface TagProps {\n  label: string;\n  backgroundColor?: string;\n  textColor?: string;\n  size?: 'small' | 'medium';\n  style?: ViewStyle;\n  textStyle?: TextStyle;\n}\n\nexport default function Tag({\n  label,\n  backgroundColor = '#E5E7EB', // gray-200\n  textColor = '#111827', // gray-900\n  size = 'medium',\n  style,\n  textStyle,\n}: TagProps) {\n  const sizeStyles = size === 'small'\n    ? { paddingVertical: 4, paddingHorizontal: 10, fontSize: 12 }\n    : { paddingVertical: 6, paddingHorizontal: 12, fontSize: 14 };\n\n  return (\n    <View\n      style={[\n        styles.container,\n        { backgroundColor, paddingVertical: sizeStyles.paddingVertical, paddingHorizontal: sizeStyles.paddingHorizontal },\n        style,\n      ]}\n    >\n      <Text style={[styles.text, { color: textColor, fontSize: sizeStyles.fontSize }, textStyle]}>{label}</Text>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    borderRadius: 9999,\n    alignSelf: 'flex-start',\n  },\n  text: {\n    fontWeight: '600',\n  },\n});\n\n\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { Modal, Platform, StyleSheet, Text, TouchableOpacity, View } from 'react-native';\nimport DateTimePicker, { DateTimePickerEvent } from '@react-native-community/datetimepicker';\nimport { ClockIcon } from 'react-native-heroicons/outline';\n\nexport interface TimePickerProps {\n  label?: string;\n  value: string | null; // \"HH:mm\"\n  onChange: (value: string | null) => void;\n  open?: boolean;\n  onOpenChange?: (open: boolean) => void;\n  applyText?: string;\n  clearText?: string;\n  disabled?: boolean;\n  required?: boolean;\n}\n\n/**\n * TimePicker móvil simple basado en Modal + DateTimePicker\n * - iOS: inline dentro de un modal con botones Apply/Clear\n * - Android: usa el picker nativo y cierra al seleccionar\n */\nexport default function UiMobileTimePicker({\n  label,\n  value,\n  onChange,\n  open,\n  onOpenChange,\n  applyText = 'Aplicar',\n  clearText = 'Limpiar',\n  disabled = false,\n  required = false,\n}: TimePickerProps) {\n  const [internalOpen, setInternalOpen] = useState(false);\n  const isOpen = open ?? internalOpen;\n\n  const selected = useMemo(() => (value ? parseHHmm(value) : new Date()), [value]);\n\n  const setOpen = useCallback(\n    (next: boolean) => {\n      if (onOpenChange) onOpenChange(next);\n      else setInternalOpen(next);\n    },\n    [onOpenChange]\n  );\n\n  const handleAndroidChange = useCallback(\n    (event: DateTimePickerEvent, date?: Date) => {\n      if (event.type === 'dismissed') {\n        setOpen(false);\n        return;\n      }\n      if (date) {\n        onChange(formatHHmm(date));\n      }\n      setOpen(false);\n    },\n    [onChange, setOpen]\n  );\n\n  const handleIOSChange = useCallback(\n    (_: any, date?: Date) => {\n      if (date) {\n        onChange(formatHHmm(date));\n      }\n    },\n    [onChange]\n  );\n\n  const iconColor = useMemo(() => {\n    if (disabled) return '#D1D5DB';\n    return value ? '#6B7280' : '#9CA3AF';\n  }, [disabled, value]);\n\n  return (\n    <View>\n      {label ? (\n        <Text style={styles.label}>\n          {label}\n          {required ? <Text style={styles.required}> *</Text> : null}\n        </Text>\n      ) : null}\n      <TouchableOpacity\n        accessibilityRole=\"button\"\n        onPress={() => setOpen(true)}\n        activeOpacity={0.8}\n        style={[styles.trigger, disabled && styles.triggerDisabled]}\n        disabled={disabled}\n      >\n        <Text style={styles.triggerText}>{value ?? 'Seleccionar hora'}</Text>\n        <View style={styles.icon} pointerEvents=\"none\">\n          <ClockIcon size={20} color={iconColor} />\n        </View>\n      </TouchableOpacity>\n\n      {Platform.OS === 'android' ? (\n        isOpen ? (\n          <DateTimePicker value={selected} mode=\"time\" display=\"spinner\" onChange={handleAndroidChange} />\n        ) : null\n      ) : (\n        <Modal visible={isOpen} transparent animationType=\"slide\" onRequestClose={() => setOpen(false)}>\n          <View style={styles.backdrop}>\n            <View style={styles.sheet}>\n              <DateTimePicker value={selected} mode=\"time\" display=\"spinner\" onChange={handleIOSChange} />\n              <View style={styles.actions}>\n                <TouchableOpacity\n                  onPress={() => {\n                    onChange(null);\n                    setOpen(false);\n                  }}\n                  style={[styles.btn, styles.btnSecondary]}\n                  activeOpacity={0.9}\n                >\n                  <Text style={styles.btnSecondaryText}>{clearText}</Text>\n                </TouchableOpacity>\n                <TouchableOpacity\n                  onPress={() => {\n                    setOpen(false);\n                  }}\n                  style={[styles.btn, styles.btnPrimary]}\n                  activeOpacity={0.9}\n                >\n                  <Text style={styles.btnPrimaryText}>{applyText}</Text>\n                </TouchableOpacity>\n              </View>\n            </View>\n          </View>\n        </Modal>\n      )}\n    </View>\n  );\n}\n\nfunction formatHHmm(d: Date) {\n  const hh = String(d.getHours()).padStart(2, '0');\n  const mm = String(d.getMinutes()).padStart(2, '0');\n  return `${hh}:${mm}`;\n}\n\nfunction parseHHmm(v: string) {\n  const [hh, mm] = v.split(':');\n  const d = new Date();\n  d.setHours(Number(hh) || 0);\n  d.setMinutes(Number(mm) || 0);\n  d.setSeconds(0);\n  d.setMilliseconds(0);\n  return d;\n}\n\nconst styles = StyleSheet.create({\n  label: {\n    marginBottom: 6,\n    color: '#6B7280',\n    fontSize: 14,\n    fontWeight: '500',\n  },\n  required: {\n    color: '#FF0000',\n    fontSize: 14,\n    fontWeight: '600',\n  },\n  trigger: {\n    borderWidth: 1,\n    borderColor: '#D1D5DB',\n    borderRadius: 8,\n    backgroundColor: '#FFFFFF',\n    paddingVertical: 12,\n    paddingHorizontal: 14,\n    paddingRight: 44,\n    minHeight: 48,\n    justifyContent: 'center',\n  },\n  triggerText: {\n    color: '#111827',\n    fontSize: 16,\n  },\n  triggerDisabled: {\n    backgroundColor: '#F9FAFB',\n    borderColor: '#E5E7EB',\n  },\n  icon: {\n    position: 'absolute',\n    right: 12,\n    top: 0,\n    bottom: 0,\n    justifyContent: 'center',\n  },\n  backdrop: {\n    flex: 1,\n    backgroundColor: 'rgba(0,0,0,0.3)',\n    justifyContent: 'flex-end',\n  },\n  sheet: {\n    backgroundColor: '#FFF',\n    borderTopLeftRadius: 16,\n    borderTopRightRadius: 16,\n    padding: 16,\n  },\n  actions: {\n    marginTop: 12,\n    flexDirection: 'row',\n    gap: 8,\n  },\n  btn: {\n    flex: 1,\n    paddingVertical: 12,\n    borderRadius: 10,\n    alignItems: 'center',\n  },\n  btnSecondary: {\n    backgroundColor: '#6B7280',\n  },\n  btnSecondaryText: {\n    color: '#FFF',\n    fontWeight: '600',\n  },\n  btnPrimary: {\n    backgroundColor: '#1B418C',\n  },\n  btnPrimaryText: {\n    color: '#FFF',\n    fontWeight: '600',\n  },\n});\n\n\n","import { useMemo } from 'react';\n\nexport interface Anchor {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\nexport interface Viewport {\n  width: number;\n  height: number;\n}\n\nexport interface PositioningOptions {\n  anchor: Anchor | null;\n  viewport: Viewport;\n  maxMenuHeight: number;\n  headerHeight: number;\n  itemCount: number;\n  itemHeight?: number;\n  margin?: number;\n  offsetX?: number;\n  offsetY?: number;\n  direction?: 'auto' | 'up' | 'down';\n  menuHeight?: number; // Real measured height\n}\n\nexport function calculatePosition({\n  anchor,\n  viewport,\n  maxMenuHeight,\n  headerHeight,\n  itemCount,\n  itemHeight = 48,\n  margin = 16,\n  offsetX = 0,\n  offsetY = 0,\n  direction = 'auto',\n  menuHeight = 0,\n}: PositioningOptions) {\n  if (!anchor) return null;\n\n  const spaceBelow = viewport.height - (anchor.y + anchor.height) - margin;\n  const spaceAbove = anchor.y - margin;\n\n  // Estimate content height for direction decision only\n  const estimatedContentHeight = headerHeight + Math.max(1, itemCount) * itemHeight;\n  const estimatedHeight = Math.min(maxMenuHeight, estimatedContentHeight);\n\n  let openDown = true;\n  if (direction === 'down') {\n    openDown = true;\n  } else if (direction === 'up') {\n    openDown = false;\n  } else {\n    // auto logic: prefer down if it fits the estimated content, otherwise check up\n    if (spaceBelow >= estimatedHeight) {\n      openDown = true;\n    } else if (spaceAbove >= estimatedHeight) {\n      openDown = false;\n    } else {\n      openDown = spaceBelow >= spaceAbove;\n    }\n  }\n\n  const maxHeight = Math.min(maxMenuHeight, openDown ? spaceBelow : spaceAbove);\n  \n  // Use real menuHeight if available, otherwise fallback to estimated\n  const finalMenuHeight = menuHeight > 0 ? Math.min(menuHeight, maxHeight) : Math.min(estimatedHeight, maxHeight);\n\n  const rawTop = openDown ? anchor.y + anchor.height : anchor.y - finalMenuHeight;\n\n  // Boundary check for Y\n  const top = Math.max(\n    margin,\n    Math.min(\n      rawTop + offsetY,\n      viewport.height - margin - (openDown ? 0 : finalMenuHeight)\n    )\n  );\n\n  // X positioning logic\n  const rawLeft = anchor.x + offsetX;\n  const left = Math.max(\n    margin,\n    Math.min(rawLeft, viewport.width - anchor.width - margin)\n  );\n  const width = Math.min(anchor.width, viewport.width - left - margin);\n\n  return {\n    top,\n    left,\n    width,\n    maxHeight,\n    openDown,\n    isMeasured: menuHeight > 0,\n  };\n}\n\nexport function useSelectPositioning(options: PositioningOptions) {\n  return useMemo(() => calculatePosition(options), [\n    options.anchor,\n    options.viewport.width,\n    options.viewport.height,\n    options.maxMenuHeight,\n    options.headerHeight,\n    options.itemCount,\n    options.itemHeight,\n    options.margin,\n    options.offsetX,\n    options.offsetY,\n    options.direction,\n    options.menuHeight,\n  ]);\n}\n","// Hooks exportados\nexport { useNetworkStatus } from './useNetworkStatus';\nexport type { NetworkStatus } from './useNetworkStatus';\n\nexport { useToast } from './useToast';\n\nexport { useExitConfirmationGuard } from './useExitConfirmationGuard';\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useNavigation } from '@react-navigation/native';\nimport type { NavigationState, PartialState, Route } from '@react-navigation/native';\n\n/**\n * Un nodo del trail de navegación: una ruta activa dentro del árbol de React\n * Navigation, con lo necesario para etiquetarla y para navegar de vuelta a ella.\n */\nexport interface TrailNode {\n  /** Nombre de la ruta (p. ej. NAVIGATION.HOME, REPORTS_SCREENS.HISTORY_VIEW). */\n  routeName: string;\n  /** key única de la ruta dentro de su navigator. */\n  routeKey: string;\n  /** params de la ruta, si tiene. */\n  params?: Record<string, unknown>;\n  /** Profundidad en el árbol: 0 = navigator raíz. */\n  depth: number;\n}\n\ntype AnyNavigationState = NavigationState | PartialState<NavigationState>;\ntype RouteWithState = Route<string> & { state?: AnyNavigationState };\n\n/**\n * Subconjunto mínimo del API de un navigator que el trail necesita. Se usa un\n * tipo estructural propio para no pelear con los genéricos de React Navigation:\n * solo dependemos de getParent / getState / addListener.\n */\ninterface NavigationLike {\n  getParent: () => NavigationLike | undefined;\n  getState: () => AnyNavigationState | undefined;\n  addListener: (type: 'state', callback: () => void) => () => void;\n}\n\n/** Camina hacia arriba por getParent() hasta llegar al navigator raíz. */\nfunction getRootNavigation(navigation: NavigationLike): NavigationLike {\n  let current = navigation;\n  let parent = current.getParent();\n  while (parent) {\n    current = parent;\n    parent = current.getParent();\n  }\n  return current;\n}\n\n/**\n * Aplana la rama ACTIVA del árbol: desde la ruta activa del navigator raíz hasta\n * la pantalla actual, descendiendo por cada navigator anidado (shell del host +\n * MFEs remotos). El resultado es el historial de navegación real, crudo — el\n * colapso de rutas contenedoras y el etiquetado se resuelven más arriba.\n *\n * En un Stack Navigator, las rutas `[0..index]` son el historial navegable: cada\n * `goBack` desapila una. Por eso recorremos todas ellas, no solo la activa.\n * En Tab/Drawer, en cambio, las rutas hermanas no son \"atrás\" sino siblings sin\n * relación jerárquica, así que solo nos quedamos con la activa.\n */\nfunction flattenActiveBranch(rootState: AnyNavigationState | undefined): TrailNode[] {\n  const trail: TrailNode[] = [];\n  let state: AnyNavigationState | undefined = rootState;\n  let depth = 0;\n\n  while (state && state.routes.length > 0) {\n    // En un PartialState el índice puede faltar; la última ruta es la activa.\n    const activeIndex =\n      typeof state.index === 'number' ? state.index : state.routes.length - 1;\n\n    // PartialState puede no traer `type`; el árbol de esta app es 100% stacks,\n    // así que la falta de info se trata como stack (la opción que recolecta más).\n    const navigatorType: string | undefined = (state as NavigationState).type;\n    const isStack = navigatorType === undefined || navigatorType === 'stack';\n    const startIndex = isStack ? 0 : activeIndex;\n\n    // Si un mismo routeName aparece más de una vez en este nivel (porque la\n    // navegación pusheó un screen que ya estaba en el historial en lugar de\n    // hacer pop), mantenemos solo la ÚLTIMA ocurrencia: la activa siempre gana,\n    // así el último item del trail refleja la pantalla que el usuario está\n    // viendo. La regla \"última posición\" se calcula en una pasada previa.\n    const lastIndexByName = new Map<string, number>();\n    for (let i = startIndex; i <= activeIndex; i += 1) {\n      const route = state.routes[i] as RouteWithState | undefined;\n      if (!route) continue;\n      lastIndexByName.set(route.name, i);\n    }\n\n    for (let i = startIndex; i <= activeIndex; i += 1) {\n      const route = state.routes[i] as RouteWithState | undefined;\n      if (!route) continue;\n      if (lastIndexByName.get(route.name) !== i) continue;\n      trail.push({\n        routeName: route.name,\n        routeKey: route.key ?? `${route.name}@${depth}-${i}`,\n        params: route.params as Record<string, unknown> | undefined,\n        depth,\n      });\n    }\n\n    // Solo la ruta activa puede llevar un sub-navigator anidado.\n    const activeRoute = state.routes[activeIndex] as RouteWithState | undefined;\n    state = activeRoute?.state;\n    depth += 1;\n  }\n\n  return trail;\n}\n\n/**\n * Lee el árbol de React Navigation y devuelve el trail completo de rutas activas,\n * atravesando los navigators anidados (shell del host + MFEs remotos).\n *\n * Es la única fuente de verdad del breadcrumb: el trail ES el historial real de\n * navegación. Funciona desde cualquier MFE porque React Navigation comparte un\n * único contenedor (es singleton en Module Federation).\n */\nexport function useBreadcrumbTrail(): TrailNode[] {\n  const navigation = useNavigation() as unknown as NavigationLike;\n  const [tick, setTick] = useState(0);\n  const forceRender = useCallback(() => setTick((n) => n + 1), []);\n\n  const rootNavigation = useMemo(\n    () => getRootNavigation(navigation),\n    [navigation],\n  );\n\n  // El navigator raíz emite 'state' ante cualquier cambio del árbol: el cambio\n  // de un navigator anidado se propaga hacia la raíz. Re-renderizamos para\n  // recalcular el trail.\n  useEffect(() => {\n    const unsubscribe = rootNavigation.addListener('state', forceRender);\n    return unsubscribe;\n  }, [rootNavigation, forceRender]);\n\n  // `tick` fuerza el recálculo en cada cambio de estado de navegación.\n  return useMemo(\n    () => flattenActiveBranch(rootNavigation.getState()),\n    [rootNavigation, tick],\n  );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useNavigation } from '@react-navigation/native';\nimport ConfirmationModal from '../components/confirmation-modal';\n\ntype ExitConfirmationCopy = {\n  title: string;\n  message: string;\n  confirmText?: string;\n  cancelText?: string;\n};\n\ntype UseExitConfirmationGuardParams = {\n  enabled?: boolean;\n  copy?: ExitConfirmationCopy;\n};\n\nconst DEFAULT_EXIT_CONFIRMATION_COPY: ExitConfirmationCopy = {\n  title: '¿Salir del formulario?',\n  message:\n    'Si sales ahora, perderás los datos ingresados. ¿Deseas continuar?',\n  confirmText: 'Sí, salir',\n  cancelText: 'No, permanecer',\n};\n\nexport function useExitConfirmationGuard({\n  enabled = true,\n  copy = DEFAULT_EXIT_CONFIRMATION_COPY,\n}: UseExitConfirmationGuardParams = {}) {\n  const navigation = useNavigation<any>();\n  const [isOpen, setIsOpen] = useState(false);\n  const pendingActionRef = useRef<any | null>(null);\n  const bypassOnceRef = useRef(false);\n\n  useEffect(() => {\n    if (!enabled) {\n      return;\n    }\n\n    const unsubscribe = navigation.addListener(\n      'beforeRemove',\n      (event: any) => {\n        if (bypassOnceRef.current) {\n          bypassOnceRef.current = false;\n          return;\n        }\n\n        event.preventDefault();\n        pendingActionRef.current = event.data.action;\n        setIsOpen(true);\n      },\n    );\n\n    return unsubscribe;\n  }, [enabled, navigation]);\n\n  const handleClose = useCallback(() => {\n    setIsOpen(false);\n    pendingActionRef.current = null;\n  }, []);\n\n  const handleConfirm = useCallback(() => {\n    const action = pendingActionRef.current;\n    setIsOpen(false);\n    pendingActionRef.current = null;\n\n    if (!action) {\n      return;\n    }\n\n    bypassOnceRef.current = true;\n    navigation.dispatch(action);\n  }, [navigation]);\n\n  return {\n    exitConfirmationModal: (\n      <ConfirmationModal\n        open={isOpen}\n        onClose={handleClose}\n        onConfirm={handleConfirm}\n        title={copy.title}\n        message={copy.message}\n        confirmText={copy.confirmText ?? 'Sí, salir'}\n        cancelText={copy.cancelText ?? 'No, permanecer'}\n      />\n    ),\n  };\n}\n\n","// Nota: 'use client' no aplica en React Native\nimport { useState, useEffect } from 'react';\nimport NetInfo, { NetInfoState, NetInfoStateType } from '@react-native-community/netinfo';\n\nexport type NetworkStatus = 'wifi' | 'cellular' | 'none' | 'unknown';\n\ninterface NetworkState {\n  status: NetworkStatus;\n  isConnected: boolean;\n}\n\nconst mapNetInfoTypeToStatus = (type: NetInfoStateType, isConnected: boolean): NetworkStatus => {\n  if (!isConnected) return 'none';\n  \n  switch (type) {\n    case NetInfoStateType.wifi:\n      return 'wifi';\n    case NetInfoStateType.cellular:\n      return 'cellular';\n    case NetInfoStateType.ethernet:\n      return 'wifi'; // Treat ethernet as wifi for consistency\n    case NetInfoStateType.bluetooth:\n    case NetInfoStateType.wimax:\n    case NetInfoStateType.vpn:\n    case NetInfoStateType.other:\n      return 'wifi'; // Default to wifi for other connection types\n    case NetInfoStateType.none:\n    case NetInfoStateType.unknown:\n    default:\n      return isConnected ? 'unknown' : 'none';\n  }\n};\n\nexport const useNetworkStatus = () => {\n  const [networkState, setNetworkState] = useState<NetworkState>({\n    status: 'unknown',\n    isConnected: false,\n  });\n\n  useEffect(() => {\n    let mounted = true;\n\n    // Get initial network state\n    NetInfo.fetch().then((state: NetInfoState) => {\n      if (mounted) {\n        const isConnected = state.isConnected ?? false;\n        const status = mapNetInfoTypeToStatus(state.type, isConnected);\n        \n        setNetworkState({\n          status,\n          isConnected\n        });\n      }\n    }).catch(() => {\n      if (mounted) {\n        setNetworkState({\n          status: 'unknown',\n          isConnected: false,\n        });\n      }\n    });\n\n    // Subscribe to network state changes\n    const unsubscribe = NetInfo.addEventListener((state: NetInfoState) => {\n      if (mounted) {\n        const isConnected = state.isConnected ?? false;\n        const status = mapNetInfoTypeToStatus(state.type, isConnected);\n        \n        setNetworkState({\n          status,\n          isConnected\n        });\n      }\n    });\n\n    // Cleanup function\n    return () => {\n      mounted = false;\n      unsubscribe();\n    };\n  }, []);\n\n  return networkState;\n};\n","import { useMemo } from 'react';\nimport Toast from 'react-native-toast-message';\n\n/**\n * API mínima compatible con consumidores que aún importan el hook desde ui-mobile.\n * Implementación directa sobre react-native-toast-message (sin contexto propio).\n */\nexport function useToast() {\n  return useMemo(\n    () => ({\n      show: (params: Parameters<typeof Toast.show>[0]) => Toast.show(params),\n      hide: () => Toast.hide(),\n    }),\n    [],\n  );\n}\n","// Exportar todos los componentes\nexport * from \"./components\";\n\n// Exportar todos los hooks\nexport * from \"./hooks\";\n\n// Nota: If you need to use the native module, uncomment the following code\n// import UiMobile from './NativeUiMobile';\n// export function multiply(a: number, b: number): number {\n//   return UiMobile.multiply(a, b);\n// }\n"],"names":["MODULE_MACHINERY_ROLES","UserRoles","ADMINISTRADOR","ANALISTA_DE_PLANIFICACION","MACHINERY_DDL_CACHE_MAP","MACHINERY_DDL_TABLES","MACHINERY_NAMESPACE","TABLE_NAMES","MACHINERY","MACHINERY_LOCATION","MACHINERY_FUEL_LOAD","MACHINERY_STATUS_CHANGE","MACHINERY_OPERATOR","MACHINERY_SUPPLIER","Object","keys","invalidateMachineryDDLCaches","tables","work","table","entry","key","push","storageService","remove","catch","prefixes","prefix","removeByPrefix","Promise","all","calculateTotal30Days","fetchFuelTankStock","fetchMachineryById","fetchMachineryFuelLoadById","fetchMachineryFuelLoadsByMachinery","fetchMachineryFuelTanks","fetchMachineryLocations","fetchMachineryOperator","fetchMachineryOperators","fetchMachineryStatusChanges","fetchMachinerySupplier","formatFuelLoadHistory","getLastFuelArrivalsByTankId","getLastFuelLoadsByMachinery","getTankByFuelType","insertMachineryFuelArrival","insertMachineryFuelLoad","insertMachineryStatusChange","updateMachineryFuelLoad","updateMachineryStatus","validateTankStock","post","body","Partial","config","configService","getEffectiveConfig","url","API_BASE_URL","Error","response","purePost","options","success","message","data","fetchMachineryList","verb","API_VERBS","SELECT","fields","filter","values","fetchMachineryFuelLoads","fuelLoads","fuelLoadsMap","Map","loadsByMachinery","forEach","load","machineryId","machinery_id","has","set","get","loads","sort","a","b","dateA","dayjs","load_date","valueOf","firstLoad","createLocationsMap","locations","locationsMap","loc","id","name","payload","result","Array","isArray","length","operatorId","supplierId","fuelLoadId","loadDate","loadQuantity","image","UPDATE","fallbackFuelType","formatted","map","item","index","rawDateValue","includes","endsWith","utc","isValid","formattedTime","quantity","load_quantity","parseFloat","String","hourUTC","hour","minuteUTC","minute","padStart","formattedDate","format","rawType","fuel_type","Fecha","Hora","Cantidad","Tipo","trim","charAt","toUpperCase","slice","toLowerCase","timestamp","formattedLoads","thirtyDaysAgo","subtract","startOf","today","itemDate","isAfter","isSame","isBefore","reduce","sum","tankId","userId","undefined","INSERT","statusChangeDate","title","comment","liters","arrivalDate","comments","MACHINERY_FUEL_ARRIVALS","fetchMachineryFuelArrivals","arrivals","byTank","raw","tank_id","Number","isFinite","parseInt","list","tid","arrival_date","latest","MACHINERY_FUEL_TANK","DASH_FUEL_TANK_STOCK","fuelType","tanks","normalized","match","find","t","stocks","ok","stockActual","tank","s","stock_actual","extend","MULTITENANT_API_BASE_URL","DASHBOARD_ROLES","GERENTE_DE_PLANIFICACION","SUPERVISOR_DE_PRODUCCION","OPERADOR_DE_PRODUCCION","DDL_TABLES","DDL_TABLES_ALDYL","DAILY_REPORT_WELL","DAILY_REPORT_MEASUREMENT_POINT","DAILY_REPORT_PIT","DAILY_REPORT_VACUUM_LOAD","DAILY_REPORT_VACUUM_UNLOAD","DAILY_REPORT_STORAGE_TANK","DAILY_REPORT_DYNAMIC_SETTLEMENT_TANK","DAILY_REPORT_UPT_TANK","DAILY_REPORT_FLOW_STATION_TANK","LIFTING_COST","SHIP_TO_SHIP","BILLED_RECOVERY_AND_EXPENSES","OWN_FISCALIZED_PRODUCTION","THIRD_PARTY_FISCALIZED_PRODUCTION","MARKET_REFERENCE_PRICE","COMMENTS_FORM","LOCATION","FIELD","WELL_CATEGORY","PUMPING_METHOD","ASSOCIATED_STRATEGY","FLOW_STATION","TREATMENT_PLANT_SYSTEM","VACUUM_INFO","VACUUM_COMPANY","DRIVERS_INFO","WELL","WELL_CLUSTER","USER_INFO","ACTIVITY","GET_FACILITIES_LIST","LAB_REPORT","THIRD_PARTY_COMPANY","TREATMENT_PLANT","UPT","ODS_ACTIVITY_REPORT","ODS_ITEM","ODS_COST_CENTER","ODS_ACTIVITY","ODS_GROUP","MEASUREMENT_POINT","FLOW_STATION_TANK","TREATMENT_PLANT_DYNAMIC_STORAGE_TANK","UPT_TANK","PIT","DELETE","TABLE_LABELS","Record","defaultConfig","LOGO_BASE_URL","LOGO_SMALL","primaryColor","clientName","CORE_CONFIG","LAB_REPORTS_SCREENS","REPORTS_SCREENS","NAVIGATION","HOME","SYNC_DATA","DASHBOARD_WEB_VIEW","DATA_LOADING","REPORTS_HISTORY","OTHER_REPORTS_FLOW","LAB_REPORTS_FLOW","ODS_FLOW","MACHINERY_FLOW","LOGIN","MACHINERY_SCREENS","PREVIEW","NEW_FUEL","CHANGE_STATUS","FUEL_ARRIVAL","ODS_SCREENS","REPORT","VIEW_REPORT","ACTIVE_FORM","OTHER_REPORTS_SCREENS","OWN_INSPECTION","THIRD_PARTY_AUDIT","BILLED_RECOVERY_EXPENSES","COMMENTS","HISTORY_LIST","HISTORY_VIEW","DAILY_REPORT","PAGE_2_EF","PAGE_2_EPT1","PAGE_2_FOSA","PAGE_2_PM","PAGE_2_UPT","PAGE_2_VACUUM","PAGE_2_WELL","PAGE_3_EF_UNIC_MODEL","PAGE_3_EPT1","PAGE_3_FOSA","PAGE_3_PM","PAGE_3_UPT","PAGE_3_VACUUM_LOADING","PAGE_3_VACUUM_UNLOADING","PAGE_3_WELL","PAGE_4_VACUUM_LOADING","PAGE_5_VACUUM_LOADING","STALE_TIME_DDL","headers","restOptions","res","fetch","method","JSON","stringify","status","text","cause","json","error","AppModules","formatDateWithTime","formatTwoDigits","getDefaultTime","normalizeNumericString","toNumber","this","DailyReport","LabReport","ReportHistory","OtherReports","ODS","Dashboard","Machinery","value","toString","now","Date","getHours","getMinutes","date","safeTime","time","split","hoursRaw","minutesRaw","hours","Math","max","min","minutes","getFullYear","getMonth","getDate","executeFetch","fetcher","parseCacheValue","namespace","Namespace","FetchWithCacheOptions","ttl","shouldFetch","ignoreExpiration","isConnected","NetInfo","netState","process","rawCache","getRaw","hasCache","isExpired","expiresAt","T","then","err","readFileAsBase64","localUri","path","RNFS","readFile","uploadFileToServer","preferredName","ext","pop","fileName","base64","getCurrentConfig","fileServer","API_FILE_SERVER","getDefaultConfig","fileContent","isAllowedForRoles","userRoles","allowedRoles","some","role","replace","num","isNaN","parseDate","customParseFormat","parsed","toDate","parseTime","safeParseParamId","sortStringsLocale","sortByLocalizedName","items","getName","localeCompare","sensitivity","strings","naturalCollator","Intl","Collator","numeric","normalizeString","replaceAll","compareNaturalAsc","left","compare","right","sortByNaturalOrder","getValue","Breadcrumb","routeLabels","color","showDropdown","setShowDropdown","useState","navigation","useNavigation","trail","useBreadcrumbTrail","TrailNode","resolved","node","isLast","hasOwnLabel","routeName","params","BREADCRUMB_LABEL_PARAM","label","resolveBreadcrumbLabel","isContainer","prev","navigateTo","deriveItemsFromTrail","handleNavigate","nav","mode","popTo","navigate","dispatch","CommonActions","reset","routes","merge","ArrowRightIcon","ChevronRightIcon","size","View","style","styles","container","idx","Fragment","Text","lastItem","TouchableOpacity","clickableItem","onPress","activeOpacity","accessibilityRole","accessibilityLabel","clickableText","first","last","middle","wrapper","dropdownContainer","dropdownButton","v","dropdownText","Modal","visible","transparent","animationType","statusBarTranslucent","onRequestClose","modalContainer","Pressable","overlay","dropdownMenu","dropdownItem","dropdownItemText","StyleSheet","create","position","zIndex","width","backgroundColor","flexDirection","justifyContent","alignItems","gap","paddingHorizontal","paddingVertical","borderRadius","fontSize","fontWeight","top","borderWidth","borderColor","shadowColor","shadowOffset","height","shadowOpacity","shadowRadius","elevation","minWidth","flex","borderBottomWidth","borderBottomColor","registry","fromParam","Checkbox","checked","onChange","disabled","required","accessibilityState","row","box","tick","opacity","ConfirmationModal","open","onClose","onConfirm","confirmText","cancelText","useRef","Animated","Value","current","scale","useEffect","parallel","timing","toValue","duration","easing","Easing","out","ease","useNativeDriver","start","setValue","backdrop","panelWrapper","transform","panel","header","iconBtn","XMarkIcon","footer","btn","btnDanger","btnDangerText","btnSecondary","btnSecondaryText","bottom","overflow","paddingTop","paddingBottom","padding","UiMobileDatePicker","onApply","onClear","onMonthChange","onOpenChange","applyText","clearText","internalOpen","setInternalOpen","isOpen","pickerDate","setPickerDate","React","d","dd","mm","yy","setOpen","useCallback","next","handleAndroidChange","event","type","handleIOSChange","_","iconColor","useMemo","trigger","triggerDisabled","triggerText","calendarIcon","pointerEvents","CalendarIcon","Platform","OS","display","sheet","actions","btnPrimary","btnPrimaryText","marginBottom","paddingRight","minHeight","borderTopLeftRadius","borderTopRightRadius","marginTop","WEEKDAYS","Calendar","CalendarProps","currentDate","startDate","endDate","minDate","maxDate","onSelectDate","days","startOfMonth","endOfMonth","endOf","dayOfWeek","day","calendarDays","i","isCurrentMonth","totalDaysInMonth","daysInMonth","remainingDays","add","onPrevMonth","handlePrevMonth","onNextMonth","handleNextMonth","weekdays","weekdayText","grid","isSelected","isStart","isEnd","isInRange","isDisabled","isToday","toISOString","textAlign","textTransform","flexWrap","memo","QUICK_FILTERS","DateRangePicker","DateRangePickerProps","onStartDateChange","onEndDateChange","onDateRangeChange","loading","locale","placeholder","setIsOpen","setCurrentDate","activeQuickFilter","setActiveQuickFilter","internalRange","setInternalRange","handleSelectDate","nativeDate","displayValue","triggerContent","placeholderText","ActivityIndicator","sheetHeader","sheetTitle","quickFiltersContainer","quickFilterBtn","quickFilterBtnActive","handleQuickFilterPress","Dayjs","end","selected","quickFilterText","quickFilterTextActive","handleClear","emptyRange","handleApply","btnDisabled","maxHeight","Day","DayProps","containerStyles","selectionStyles","selection","textStyles","notCurrentMonthText","selectedText","disabledText","todayText","rangeBackgroundContainer","rangeBackground","rangeStartFill","rangeEndFill","todayDot","aspectRatio","margin","Header","HeaderProps","button","ChevronLeftIcon","titleContainer","FieldGroup","errorText","children","labelStyle","group","FolderIconButton","sizeStyles","getSizeStyles","smallContainer","folder","smallFolder","tab","smallTab","smallLabel","largeContainer","largeFolder","largeTab","largeLabel","mediumContainer","mediumFolder","mediumTab","mediumLabel","handlePress","folderContainer","folderBack","folderTab","disabledLabel","lineHeight","FormBox","titleStyle","IconCardButton","icon","onOfflinePress","textStyle","isEffectivelyDisabled","containerStyle","textColor","iconNode","isValidElement","cloneElement","iconText","content","iconContainer","DatePicker","LoadingSpinner","MenuItem","MobileTable","NetworkIndicator","NumericField","ODSWidget","ProgressBar","RadioGroup","SearchInput","SearchableSelect","Select","SkeletonLoader","StatCard","StatusButton","SummaryTable","Tag","TimePicker","Card","titleKey","accentColor","onEdit","hasActions","cardStyle","entries","k","toSummaryItems","resolvedActions","card","numberOfLines","actionsRow","action","actionBtn","showLabel","actionText","editBtn","editText","onRowClick","headerComponent","footerComponent","contentContainerStyle","ListEmptyComponent","scrollEnabled","getCardTitle","getCardSubtitle","isItemSelected","getActions","onScroll","onScrollBeginDrag","stickyHeaderIndices","FlatList","keyExtractor","it","renderItem","selectedCard","selectedTitle","ItemSeparatorComponent","sep","ListHeaderComponent","ListFooterComponent","nestedScrollEnabled","keyboardShouldPersistTaps","contentInsetAdjustmentBehavior","rowGap","marginRight","networkInfo","getNetworkInfo","ExclamationTriangleIcon","containerDisconnected","textDisconnected","WifiIcon","containerWifi","textWifi","SignalIcon","containerCellular","textCellular","QuestionMarkCircleIcon","containerUnknown","textUnknown","useNetworkStatus","unit","onlyIntegers","touched","inputStyle","unitTextStyle","showError","Boolean","fieldRow","TextInput","onChangeText","parts","join","editable","keyboardType","input","DocumentIcon","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","Path","PlusIcon","onViewODS","onCreateODS","handleViewODS","leftSection","textContainer","subtitle","actionButtonContainer","handleCreateODS","actionButton","actionButtonText","textShadowColor","textShadowOffset","textShadowRadius","progressColor","rounded","clamped","radius","track","accessible","accessibilityValue","selectedValue","onValueChange","optionStyle","opt","pillOption","optionRow","pillLabel","inputWrapper","MagnifyingGlassIcon","searchIcon","placeholderTextColor","autoCorrect","autoCapitalize","clearButton","emptyStateText","loadingMessage","searchPlaceholder","minSearchLength","direction","query","setQuery","hasNoOptions","emptyOptionsMessage","selectIsDisabled","selectPlaceholder","filtered","q","o","menuStyle","menu","headerHeight","searchBox","hint","SelectContext","createContext","ctx","useContext","onSelect","itemSelected","itemDisabled","itemText","itemTextSelected","triggerStyle","maxMenuHeight","offsetX","offsetY","menuHeight","setMenuHeight","anchor","setAnchor","openerRef","animValue","windowDims","Dimensions","emptyMessage","selectableItemsCount","count","Children","child","childProps","props","prototype","hasOwnProperty","call","effectiveDisabled","effectivePlaceholder","openMenu","InteractionManager","runAfterInteractions","requestAnimationFrame","measureInWindow","x","y","closeMenu","sub","addEventListener","displayLabel","labelText","nextValue","toArray","computedMenu","useSelectPositioning","viewport","itemCount","isMeasured","ref","ChevronUpDownIcon","presentationStyle","TouchableWithoutFeedback","onLayout","e","nativeEvent","layout","translateY","interpolate","inputRange","outputRange","openDown","Provider","menuInner","ScrollView","scrollContainer","showsVerticalScrollIndicator","pulse","loop","sequence","stop","skeleton","badge","valueStyle","iconSlot","iconWrap","toneToStyle","tone","badgeText","loadingTitle","loadingColor","leftIcon","rightIcon","disabledButton","loadingContainer","spinner","buttonText","adjustsFontSizeToFit","minimumFontScale","contentRow","iconLeft","iconRight","flexShrink","marginLeft","leftBackgroundColor","rowDivider","cellLeft","leftBg","leftBgTop","leftBgBottom","cellRight","renderValue","boxShadow","paddingStart","borderBottomLeftRadius","alignSelf","UiMobileTimePicker","hh","setHours","setMinutes","setSeconds","setMilliseconds","DateTimePickerEvent","formatHHmm","ClockIcon","calculatePosition","itemHeight","spaceBelow","spaceAbove","estimatedContentHeight","estimatedHeight","finalMenuHeight","rawTop","rawLeft","useExitConfirmationGuard","useToast","setTick","forceRender","n","rootNavigation","parent","getParent","getRootNavigation","addListener","rootState","state","depth","activeIndex","navigatorType","startIndex","lastIndexByName","route","routeKey","activeRoute","flattenActiveBranch","getState","DEFAULT_EXIT_CONFIRMATION_COPY","enabled","copy","pendingActionRef","bypassOnceRef","preventDefault","handleClose","handleConfirm","exitConfirmationModal","mapNetInfoTypeToStatus","NetInfoStateType","wifi","cellular","ethernet","bluetooth","wimax","vpn","other","none","unknown","networkState","setNetworkState","mounted","unsubscribe","show","Toast","hide"],"mappings":"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"}