import { AxiosInstance } from 'axios'; import { AxiosResponse } from 'axios'; import { ComponentType } from 'react'; import { CSSProperties } from 'react'; import { default as default_2 } from 'react'; import { DetailedHTMLProps } from 'react'; import { FC } from 'react'; import { ForwardRefExoticComponent } from 'react'; import { InputHTMLAttributes } from 'react'; import { JSX } from 'react/jsx-runtime'; import { JSX as JSX_2 } from 'react'; import { ReactNode } from 'react'; import { RefAttributes } from 'react'; import { SVGProps } from 'react'; import { TextareaHTMLAttributes } from 'react'; export declare function addComment({ publication, path, username, comment, id, recaptchaResponse, baseUrl, apiToken, securityToken, COMMENTS_VARS, }: { publication: string; path: string; username: string; comment: string; id?: string; recaptchaResponse: string; baseUrl: string; apiToken: string; securityToken: string; COMMENTS_VARS: any; }): Promise; declare type AddCommentResponse = { type: 'success' | 'error'; message: string; status: number; }; export declare interface Advanced { tagarticle: string; cintillo: boolean; color: string; imagearticle: string; imagehomeorientation: string; imagesectionorientation: string; elementhome: string; elementarticle: string; } export declare type Analytics = { ga4: string | undefined; marfeel: string | undefined; gtm: string | undefined; comscore: string | undefined; }; /** * Una pasada sobre el DOM. Exportada aparte de `initRelativeTime` para poder * re-correrla a mano después de inyectar HTML (paginados, "más noticias") — * pasándole las MISMAS `opts` que se le pasaron a `initRelativeTime`. * * Tambien gateada por el flag: sin `enabled` no escribe nada. Es la condición * de que el HTML de un sitio que no opto in sea el de siempre. */ export declare const applyRelativeTime: (opts?: RelativeTimeOptions) => void; /** * Red de seguridad runtime para consumidores JS (sin type-check). El tipo * marca la forma en build; esto valida presencia de cada slot y que matchee * el formato exacto en runtime — enforcement doble, decisión del owner (§3). */ export declare function assertImageSizesContract(x: unknown): asserts x is ImageSizesContract; export declare const assetsImagesPrefixer: (imagePath: string, assetsClient?: string) => string; export declare const AssetsPreconnect: () => false | "" | JSX.Element | undefined; export declare function auditConfigOrigin(entry: ConfigOriginAuditEntry): void; export declare interface Author { firstname: string; lastname: string; fullname: string; image: Preview; name: string; internaluser: boolean; } /** * Normalizacion de las redes del autor que llegan en `addtional.USER_PAGE_*`. * * El CMS deja esos campos como texto libre: el mismo campo puede traer una URL * completa (`https://www.tiktok.com/@debate_mx`), un handle con `@` * (`@debatenoticias`), un handle pelado (`debate_mx`) o venir vacio. Prefijar * `https://` a ciegas produce links rotos (`https://@debatenoticias`), asi que * se arma la URL por red y se descarta lo que no resuelve: el componente no * renderiza el icono en vez de renderizarlo roto. * * Alcance: solo las redes que hasta ahora no tenian render en `AutorHeader1/2` * ni en `JournalistArticule2`. Facebook / Instagram / X / LinkedIn siguen * resolviendose como siempre (`ensureHttpsProtocol`) y no se tocan aca. */ export declare type AuthorSocialNetwork = 'tiktok' | 'youtube' | 'pinterest'; export declare const AutorHeader1: FC; export declare const AutorHeader2: FC; export declare interface AutorInfo { info: { id: string; name: string; nickname: string; firstname: string; lastname: string; fullname: string; email: string; image: ImageProps; country: string; birthdate: string; gender: string; address: string; telephone: string; cellphone: string; }; addtional: { USER_JOBSTART: string; USER_JOBTITLE: string; USER_VIEW_NEWS: string; USER_USERIG: string; USER_USERFB: string; USER_MIBIO: string; USER_MIBIO_EN: string; USER_COUNTRY: string; USER_PICTURE: string; APODO: string; USER_SHOWEMAIL: boolean; USER_TWOFACTOR_DEADLINE: string; USER_MISITIO: string; USER_SHOWBIO: boolean; USER_MODULEALERTS_20220120: string; USER_USERLIN: string; USER_USERTWT: string; USER_VIEW_PINS: string; USER_PAGE_FACEBOOK: string; USER_PAGE_TWITTER: string; USER_PAGE_INSTAGRAM: string; USER_PAGE_LINKEDIN: string; USER_PAGE_TIKTOK: string; USER_PAGE_YOUTUBE: string; USER_PAGE_PINTEREST: string; USER_FACEBOOK_FAN_PAGE: string; USER_POSITION: string; USER_POSITION_EN: string; USER_DESCRIPCION: string; USER_DESCRIPCION_EN: string; USER_MOSTRAR_MAIL: string; }; } export declare const BannerAdvertising: ({ banners, name, legacy, scope }: Props_28) => JSX.Element | null; export declare const BannerAdvertisingMiddle: ({ banners, index, name, legacy, scope, }: Props_27) => JSX.Element | null; /** * Arma la cadena de candidatos de una posición: primero la key canónica * (nomenclatura nueva), después los alias legacy en orden. * * No deduplica por accidente: si un sitio pasa `legacy` igual al canónico el * resultado es el mismo lookup una sola vez. */ export declare const bannerKeyCandidates: (canonical: string, legacy?: BannerLegacyKey) => string[]; /** * Nombres legacy de una posición de banner. Acepta un string o una lista * ordenada (de más a menos prioritario). */ export declare type BannerLegacyKey = string | string[] | undefined; export declare interface BannerResponse { key: string; value: string; show: boolean; } export declare interface BannerResponse { key: string; value: string; show: boolean; } export declare type BannerScope = { type: 'general'; } | { type: 'seccion'; value: string; } | { type: 'tema'; value: number; }; /** * ¿La ruta actual debe emitir banners para este request? Fuente ÚNICA de la * política "banners condicionados a query". Para las rutas listadas en * `CONFIG_bannersRequireQuery` (default `['buscar']`) devuelve `true` solo si hay * query no vacío; para el resto de rutas devuelve siempre `true`. * * Consumida por `GenerateHead` (gatea `` + `headscripts`) y * por el `LayoutCore` de cada sitio (para saltar el self-fetch de `getBanners` * cuando no corresponde). Al vivir acá, agregar/quitar rutas gateadas o el * default es un cambio de un solo lugar que se propaga a todos los repos. * * `cfg` default = `getConfig()` (singleton de `initLibrary`, ya poblado cuando * corre el render de Head/LayoutCore). Se puede pasar explícito para tests. */ export declare function bannersEnabledForRequest(route: string, query: string | undefined, cfg?: Pick): boolean; export declare const BannersPreconnect: ({ gpt, googleAds, syndication, adsense, }: BannersPreconnectProps) => JSX.Element; /** * BannersPreconnect — resource hints (preconnect / dns-prefetch) para el stack * de publicidad de Google Ad Manager (GPT). Migrado desde el preconnect * hardcodeado que vivía en los sitios (ej. saas-redmas-astro * `components/temporal/BannersPreconnect.astro`). * * NO incluye el preconnect a `PUBLIC_ASSETS_URL`: eso ya lo emite * `AssetsPreconnect` dentro de `GenerateHead`. Este componente es SOLO de * banners/ads. * * Cada dominio se controla con su propio flag de `headConfig`. Base = todo en * `false`; cada sitio prende los que usa (un sitio con GAM completo los prende * todos). Sin gate de entorno: al igual que el resto de flags de `headConfig` * (schemas, preloadImages, amp), lo que se configura es lo que se emite. */ declare type BannersPreconnectProps = { /** securepubads.g.doubleclick.net — requests de GPT (googletag). */ gpt?: boolean; /** googleads.g.doubleclick.net — serving / clicks de Google Ads. */ googleAds?: boolean; /** tpc.googlesyndication.com — render de creatividades (SafeFrame). */ syndication?: boolean; /** pagead2.googlesyndication.com — AdSense/GPT (hint liviano: dns-prefetch). */ adsense?: boolean; }; export declare const bannersReplace: (bannerLineAd: string, replaces?: { [key: string]: string; }) => string; export declare const becomeVideoObject: (video: VideoResponseData, showtime?: boolean, showsubtitle?: boolean, showauthor?: boolean) => NewListResponseData; export declare interface BlockSaasResponse { key: string; block: string; size: string; value: string; title: string; link: string; } export declare interface BlockSaasResponseData { blockSass: Array; news?: NewListResponse | undefined; } /** * Ruta del recurso en el bucket: `${clientName}/${site}/${type}/${subtype}/${subtype}.json`, * donde `site` = `forceSite` ?? `servicePrefix` ?? `clientName` (ver `forceSite`). * `subtype` se deriva en runtime (nombre del archivo de menú sin `.html`, o el * `template` de banners en minúscula) — no forma parte de esta config. */ export declare type BucketOriginConfig = { /** Base URL pública del bucket (sin slash final). Ej: `https://debate-site-configs.s3.us-west-2.amazonaws.com` */ url: string; /** * Base URL alternativa (CloudFront u otro proxy cacheado). Si está definida, * reemplaza `url` al armar las rutas de menú/banners en bucket. */ proxyUrl?: string; /** Prefijo raíz del cliente dentro del bucket (ej. `'debate'`). */ clientName: string; /** * Sirve el menú (sidebar/menu/footer/freeZone/cintillo + equipos/sites) desde * el bucket. Con el toggle ON, SIN fallback a CMS: si el bucket agota los 4 * intentos, se sirve vacío + registro en el debugPanel (`reportBucketOriginExhausted`). */ menu?: boolean; /** * Sirve los banners (home/seccion/nota) desde el bucket. Con el toggle ON, SIN * fallback a CMS: si el bucket agota los 4 intentos, se sirve vacío + registro * en el debugPanel. */ banners?: boolean; /** * [transicional] Sirve la config de los slots dinámicos de home * (`bloques/modulos-dinamicos/modulos-dinamicos.json`) desde el bucket en * lugar del fan-out N contra `/config/blocks-saas`. Toggle de migración: al * pasar todos los sitios a `true`, la rama legacy CMS se elimina y el toggle * queda no-op (luego se remueve). El JSON keyea plano `Home_N` (sin subíndices); * cada entry se resuelve con `resolveSlotContent` (content-fetch al CMS igual * que legacy). SIN fallback de CONFIG a CMS: con el toggle ON el bucket es el * método único; si agota los 4 intentos, los slots se sirven vacíos y se * registra en el debugPanel (`reportBucketOriginExhausted`) para notar la falla. * El fan-out CMS solo corre con el toggle OFF (sitios sin migrar). * Ver `PLAN_DYNAMIC_SLOTS_BUCKET_ORIGIN.md` §4.3/§7. */ slots?: boolean; /** * [transicional] Sirve la config del destacado dinámico * (`bloques/destacado/destacado.json`) desde el bucket en lugar de * `/config/blocks`. Es drop-in de TRANSPORTE (mismo `.data.data` que el CMS). * ⚠ CONTRATO (verificado contra un sitio CMS funcional, golfo): el LAYOUT del * destacado va en `data[0].block`, que debe ser uno de los 5 nombres de layout * (`Diario` | `Diario con imagen` | `Super` | `3 notas verticales` | * `3 notas horizontales`) — es la key que consume `DynamicMainSlot` vía el prop * `component`. Los campos `value`/`size`/`title`/`link` NO los usa el destacado * (en el CMS vuelven como tokens sin rellenar) → se ignoran. (Nota: existe * `getMainBlockData`, que lee `value` contra `GetByOptions`, pero es otra ruta * que el render vivo de golfo no usa.) * El CONTENIDO (las notas) SIEMPRE sale del CMS (zona `destacadas`, sección * provista por la app) — permanente, no transicional: este toggle solo mueve el * ORIGEN DE LA CONFIG (bucket vs CMS), nunca el contenido. SIN fallback de CONFIG * a CMS: con el toggle ON el bucket es el método único; si agota los 4 intentos, * el destacado se sirve vacío y se registra en el debugPanel (`reportBucketOriginExhausted`). * El CMS solo sirve la config con el toggle OFF (sitios sin migrar). * Ver `PLAN_DYNAMIC_SLOTS_BUCKET_ORIGIN.md` §4.4/§7. */ destacado?: boolean; /** * Referer exigido por la bucket policy (`aws:Referer`). Sin este header el * bucket devuelve 403 aunque la ruta/archivo exista. Default: el mismo * valor que usa `getRankingS3` (bucket propio de Debate). */ referer?: string; /** * Segmento de sitio a usar en la ruta del bucket. Es un OVERRIDE explícito: * si está definido GANA sobre `PUBLIC_SERVICE_PREFIX`. Orden de resolución: * `forceSite` > `servicePrefix` > `clientName`. * * Sirve para dos casos: * 1. Sitios sin `servicePrefix` (ej. soyfutbol): evita que la ruta quede mal * formada (`debate//menu/...`) cayendo a `clientName`. * 2. Sitios cuyo `servicePrefix` NO coincide con el segmento del bucket * (ej. vader-en: `PUBLIC_SERVICE_PREFIX=en` porque así lo pide el CMS, pero * en el bucket el sitio es `vaderen`). El prefix no se puede tocar porque lo * consume `getServicePrefix` para armar las URLs del CMS, así que `forceSite` * es la única salida. * * Ver `resolveBucketOriginUrl`. */ forceSite?: string; /** * TTL (ms) del cache in-memory SSR para menú/banners (bucket o API). Default 45000. * `0` desactiva. Prioridad sobre `CONFIG_configCacheTtlMs`. */ cacheTtlMs?: number; }; declare type BuildArgs = { route: string; slug: string; page: number; /** Tamano del lote. Es el `NEWS_PER_SECTION` con el que se pinto la pagina 1. */ size: number; cfg?: LibraryConfig; }; export declare function buildConfigMenuApiPath(servicePrefix: string, configVersion: string, fileName: string): string; /** * Arma `{ path, params }` para la pagina `page` de `route`. * * `publication` es OBLIGATORIO: sin el, el CMS responde 500 (verificado contra * `news-list-section`). En el resto de la app viaja gratis porque `createAxiosApi` * lo pone como param por default del instance; aca el request se arma a mano. * * Los listados transversales (tema / autor / ultimas-noticias) lo pisan con la * lista de ids de multipublicacion; `seccion` NO, porque sus slugs son propios * de cada publicacion. * * Devuelve `null` si la ruta no es una ruta de listado conocida. */ export declare function buildLoadMoreRequest({ route, slug, page, size, cfg, }: BuildArgs): LoadMoreCmsRequest | null; export declare const buildTagUrl: (tag: Tag, paths: RoutePathConfig) => string; /** * Reconstruye la URL pública desde `info.link.internal`. Es el inverso exacto * de `getVideoRealPath`, que es quien la vuelve a resolver en `/video/[…slug]`. */ export declare const buildVideoUrlFromInternal: (internal: string, options?: { videoPath?: string; title?: string; }) => string; declare interface ButtonCSS { '--button-background-color'?: string; '--button-color'?: string; '--button-background-color-hover'?: string; '--button-border-image-source'?: string; '--button-border'?: string; '--button-font-size'?: string; '--button-letter-spacing'?: string; '--button-text-transform'?: string; '--button-border-radius'?: string; } export declare type captchaActionType = 'comment_login' | 'comment_register' | 'login' | 'register'; export declare function CarrouselCSR(props: CarrouselProps): JSX.Element | undefined; export declare function CarrouselIRS(props: CarrouselProps): JSX.Element; declare type CarrouselProps = { children: ReactNode[]; slot_id: string; visibleItems?: number; cardWidth?: number; cardGap?: number; fullPageWidth?: boolean; pagination?: boolean; /** Dots circulares (opt-in). No altera el estilo de barra de `pagination`. */ paginationCircle?: boolean; enableDrag?: boolean; }; export declare const CarruselCard: FC; declare interface CarruselCardProps extends Omit { title: string; titleUrl: string; content: Array; heightImageOverwrite?: string; heightImageOverwriteMobile?: string; slot_id: string; isHome?: boolean; paths: RoutePathConfig; speculationPrerenderClass?: string; } export declare const CarruselOpinion: FC; /** Corre `resolveImageSizes` y reduce el resultado a pass/fail para CI. */ export declare function checkImageSizes(input: ImageSizesContractInput | undefined): ImageSizesCheckReport; /** * Recorre recursivamente un schema (objeto o array) y elimina toda entry * que quede sin valor. Si una propiedad de un objeto queda sin valor, la * propiedad se elimina del objeto; si un item de un array queda sin valor, * se quita del array. */ export declare const cleanSchema: (value: T) => T; export declare function clearConfigOriginAudit(): void; /** Limpia el cache (útil en tests o tras invalidación manual). */ export declare function clearConfigOriginCache(cacheKey?: string): void; export declare function clearConfigOriginComparisonCache(): void; export declare const coloringByStrokeSVGs: string[]; /** Textos del popup anónimo (AnonimusPopUp.tsx) */ export declare type ComentariosAnonimusPopUpTexts = { /** Botón para continuar de forma anónima */ anonimusContinueButton?: string; /** Texto del divisor entre opciones (ej. "o") */ anonimusDividerOr?: string; /** alt de la imagen de usuario anónimo */ anonimusImageAlt?: string; /** aria-label del botón de cerrar popup */ popupCloseAriaLabel?: string; }; /** Solo fase ChangePassword (código + nueva contraseña). changePasswordMessage puede usar {{email}} */ export declare type ComentariosChangePasswordPhaseTexts = { changePasswordMessage?: string; verificationCodeLabel?: string; newPasswordLabel?: string; confirmPasswordLabel?: string; showPasswordsLabel?: string; changePasswordButton?: string; }; /** Textos del formulario de comentario/respuesta (CommentInput, CommentUsername, CommentButton) */ export declare type ComentariosCommentFormTexts = { /** Label del textarea de comentario */ commentInputLabel?: string; /** Placeholder del textarea de comentario */ commentInputPlaceholder?: string; /** Label del input de nombre anónimo */ usernameInputLabel?: string; /** Placeholder del input de nombre anónimo */ usernameInputPlaceholder?: string; /** Texto del botón de envío del comentario */ submitCommentButton?: string; }; /** Textos de la lista/cabecera de comentarios (Comments.tsx) */ export declare type ComentariosCommentsSectionTexts = { commentsSectionTitle?: string; commentHeaderMessageEmpty?: string; commentHeaderMessageWithComments?: string; loadMoreButton?: string; /** Botón para cargar más respuestas en un hilo (Comment.tsx) */ moreRepliesButton?: string; /** Saludo al usuario autenticado en UserHeader (usa {{name}} como placeholder del nombre) */ userGreeting?: string; /** Botón de cerrar sesión en UserHeader */ logoutButton?: string; /** Prefijo del mensaje anónimo antes del botón de login (Comments.tsx) */ anonimusPromptPrefix?: string; /** Texto del botón para iniciar sesión dentro del mensaje anónimo */ anonimusPromptLinkText?: string; /** Sufijo del mensaje anónimo después del botón de login */ anonimusPromptSuffix?: string; /** Etiqueta "Respondiendo a" en Reply.tsx */ replyingToLabel?: string; }; /** Solo fase Feedback (éxito al cambiar contraseña) */ export declare type ComentariosFeedbackPhaseTexts = { feedbackSuccessMessage?: string; }; /** Solo fase Forgot (olvidé contraseña) */ export declare type ComentariosForgotPhaseTexts = { forgotMessage?: string; sendCodeButton?: string; }; /** Tipo resuelto con todos los textos con valor por defecto (para el objeto `t` en LoginForm) */ export declare type ComentariosLoginFormResolved = Required & Required & Required & Required & Required; /** Solo fase Login (iniciar sesión) */ export declare type ComentariosLoginPhaseTexts = { GoogleButtonText?: string; noAccountText?: string; alreadyHasAccountText?: string; registerButtonText?: string; forgotPasswordText?: string; }; /** Labels para los campos del formulario de registro (comentarios) */ export declare type ComentariosRegisterFormLabels = { email?: string; given_name?: string; family_name?: string; password?: string; confirmPassword?: string; }; /** Textos del formulario de registro (crear cuenta, confirmar código, éxito) */ export declare type ComentariosRegisterFormPhaseTexts = { showPasswordsLabel?: string; termsPrefix?: string; termsLinkText?: string; termsSuffix?: string; createAccountButton?: string; confirmAccountButton?: string; alreadyConfirmedText?: string; successTitle?: string; successMessage?: string; /** Labels de las reglas de contraseña (orden: minLength, number, lowercase, uppercase, symbol) */ passwordRuleMinLength?: string; passwordRuleNumber?: string; passwordRuleLowercase?: string; passwordRuleUppercase?: string; passwordRuleSymbol?: string; /** Mensajes de error del formulario */ errorCompleteFields?: string; errorPasswordMismatch?: string; errorPasswordInvalid?: string; errorVerificationCodeRequired?: string; errorUnexpected?: string; }; /** Textos del popup Reportar abuso (ReportPop.tsx) */ export declare type ComentariosReportPopTexts = { reportAbuseTitle?: string; errorAlreadyReported?: string; errorReportComment?: string; cancelButton?: string; reportButton?: string; reportSuccessMessage?: string; reportCloseButton?: string; /** Override de labels por motivo de reporte */ reportReasons?: Partial>; }; /** Claves de motivos de reporte (debe coincidir con reportComment.ReportReasonKey) */ export declare type ComentariosReportReasonKey = 'spam' | 'inappropriate' | 'hate' | 'misinformation' | 'terrorism' | 'intellectual' | 'bullying'; /** Textos de la sección comentarios: común + por fase + register (usado en LoginForm y RegisterForm) */ export declare type ComentariosTexts = ComentariosTextsCommon & ComentariosLoginPhaseTexts & ComentariosForgotPhaseTexts & ComentariosChangePasswordPhaseTexts & ComentariosFeedbackPhaseTexts & ComentariosRegisterFormPhaseTexts & ComentariosCommentsSectionTexts & ComentariosCommentFormTexts & ComentariosAnonimusPopUpTexts & ComentariosReportPopTexts & { /** Labels para campos del formulario de registro; usados en FIELDS_CONFIG */ registerForm?: ComentariosRegisterFormLabels; }; /** Textos compartidos entre fases del login/recuperar contraseña */ export declare type ComentariosTextsCommon = { title?: string; button?: string; /** Mensaje cuando el usuario no está autenticado (ej. "Súmate a la comunidad para dejar tu comentario") */ commentPromptMessage?: string; email?: string; password?: string; showPassword?: string; loginButtonText?: string; backButton?: string; }; export declare interface CommentDate { date?: number; day?: number; hours?: number; minutes?: number; month?: number; seconds?: number; time: number; timezoneOffset?: number; year?: number; } export declare const CommentLazyLoader: ({ internalPath, icon, API_ENV, texts, }: CommentLazyLoaderProps) => JSX.Element; declare type CommentLazyLoaderProps = { internalPath: string; icon?: string; isVisibleDefault?: boolean; API_ENV: LibraryConfig; texts?: textsType; }; export declare interface CommentsResponse { comments: CommentType[]; morecomment?: boolean; } export declare interface CommentType extends ReplyType { morereply?: boolean; reply?: ReplyType[] | false; } export declare class CommonServices { protected props?: ICommonServices | undefined; configVersion: string; exclude: string; /** * Contrato de tamaños resuelto UNA vez en el punto de entrada (§3). El resto * de los métodos consume `this.contract.` — cero literales sueltos. */ readonly contract: ImageSizesContract; constructor(props?: ICommonServices | undefined); generateTokenOffline: (browserId: string) => Promise; getEntitySection: (params: Params) => Promise; }, any, {}>> | undefined; getMainMenu: (params: Params) => Promise<{ data: { data: Array; }; }>; getNewsListZone: (params: Params) => Promise>; getNewsListZoneSection: (params: Params) => Promise>; getNewsList: (params: Params) => Promise>; getNewsListTag: (params: Params) => Promise>; getNewsListSection: (params: Params) => Promise>; getNewsListAvanced: (params: Params) => Promise>; getNewsListTags: (params: Params) => Promise>; getNewsListTagEntity: (params: Params) => Promise>; getNewsListTagLite: (params: Params) => Promise>; getNewsListAutor: (params: Params) => Promise>; getNewsSearch: (params: Params) => Promise> | undefined; getAutorInfo: (params: Params) => Promise; }, any, {}>> | undefined; getvideoListAdvanced: (params: Params) => Promise; }, any, {}>> | undefined; getVideos: (params: Params) => Promise; }, any, {}>> | undefined; getVideosList: (params: Params) => Promise; }, any, {}>> | undefined; getBanners: (params: Params) => Promise<{ data: { data: Array; }; }>; getPages: (params: Params) => Promise; }, any, {}>> | undefined; getRankingS3: (url: string, headers?: { Referer: string; }) => Promise; }, any, {}> | { data: Array; }>; getNews: (params: Params) => Promise; }, any, {}>> | undefined; getNewsMultimedia: (params: Params) => Promise; videos: Array; }[]; }, any, {}>> | undefined; getNewsItemsList: (params: Params) => Promise; }, any, {}>> | undefined; getNewsListPath: (params?: Params) => Promise; }, any, {}>> | undefined; getNewsSchemasImages: (params?: Params) => Promise; }, any, {}>> | undefined; getNewsItemsRelated: (path: string, params?: Params) => Promise | { data: NewListResponse; }> | undefined; sendEmail: (data: EmailParams) => Promise; }, any, {}>> | undefined; searchData: (params: Params) => Promise<{ search: AxiosResponse; lastNews?: undefined; } | { lastNews: AxiosResponse; search?: undefined; }>; commonNewsServices: (path: string, imgSizes?: { getNews?: string; getNewsItemsList?: string; getAutorInfo?: string; getNewsItemsRelated?: string; }, exclude?: { getNewsItemsRelated?: string; getAutorInfo?: string; }) => Promise<{ news: any[]; autor: any[]; newsRelatedResponses: any[]; itemList: any; newsRelatedListResponses: (NewListResponseData[] | undefined)[]; schemasImages: any[]; }>; } export declare const compileStyleProps: (data: { [key: string]: any; }) => { [key: string]: any; }; export declare const Comscore: () => "" | JSX.Element | undefined; export declare type Config = { paginationLimit: number; newsListLimit: number; description: string; email: string; ampOption: boolean; useS3Font: boolean; fontName: string; fontWeight: string; fontDisplay: 'swap' | 'block' | 'fallback' | 'optional'; fontFormat?: 'woff2' | 'woff' | 'ttf' | 'eot' | 'otf'; useSpeculationRules: boolean; googleFontFamily: string; sideCopyright: string; footerCopyright: string; tapeTitle: string; fontS3Url: string; /** * Opt-in: URL de un .css inmutable que contiene SOLO el @font-face con el woff2 * embebido en base64. Si esta seteado, Font.tsx lo carga con un * render-blocking y NO emite ni el preload de font ni el @font-face inline. * Ausente = comportamiento historico. Ver PLAN_blocking-font-css.md en saas-soyfutbol-astro. */ fontCssUrl?: string; /** * Opt-in, requiere fontCssUrl. Techo en ms del GATE DE PAINT: Font.tsx emite un *