sass-template-common 0.15.12 → 0.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -353,8 +353,32 @@ export declare type BucketOriginConfig = {
353
353
  cacheTtlMs?: number;
354
354
  };
355
355
 
356
+ declare type BuildArgs = {
357
+ route: string;
358
+ slug: string;
359
+ page: number;
360
+ /** Tamano del lote. Es el `NEWS_PER_SECTION` con el que se pinto la pagina 1. */
361
+ size: number;
362
+ cfg?: LibraryConfig;
363
+ };
364
+
356
365
  export declare function buildConfigMenuApiPath(servicePrefix: string, configVersion: string, fileName: string): string;
357
366
 
367
+ /**
368
+ * Arma `{ path, params }` para la pagina `page` de `route`.
369
+ *
370
+ * `publication` es OBLIGATORIO: sin el, el CMS responde 500 (verificado contra
371
+ * `news-list-section`). En el resto de la app viaja gratis porque `createAxiosApi`
372
+ * lo pone como param por default del instance; aca el request se arma a mano.
373
+ *
374
+ * Los listados transversales (tema / autor / ultimas-noticias) lo pisan con la
375
+ * lista de ids de multipublicacion; `seccion` NO, porque sus slugs son propios
376
+ * de cada publicacion.
377
+ *
378
+ * Devuelve `null` si la ruta no es una ruta de listado conocida.
379
+ */
380
+ export declare function buildLoadMoreRequest({ route, slug, page, size, cfg, }: BuildArgs): LoadMoreCmsRequest | null;
381
+
358
382
  export declare const buildTagUrl: (tag: Tag, paths: RoutePathConfig) => string;
359
383
 
360
384
  /**
@@ -1266,11 +1290,29 @@ export declare const extractRealtedNews: typeof extractRelatedNews;
1266
1290
  */
1267
1291
  export declare function extractRelatedNews(article: NewListResponseData): Array<Array<string>>;
1268
1292
 
1293
+ /** ID de tag en slugs como `lionel-messi-t640863` o `t640863`. */
1294
+ export declare const extractTagIdFromSlug: (slug: string) => string;
1295
+
1269
1296
  export declare type FetchConfig = {
1270
1297
  imgSizes: string;
1271
1298
  newsType: string;
1272
1299
  };
1273
1300
 
1301
+ declare type FetchMoreArgs = {
1302
+ endpoint: string;
1303
+ route: string;
1304
+ slug: string;
1305
+ page: number;
1306
+ size: number;
1307
+ /** Rama CDN: URL ya armada (con params) + headers. Ausente = endpoint propio. */
1308
+ direct?: {
1309
+ url: string;
1310
+ headers: Record<string, string>;
1311
+ };
1312
+ };
1313
+
1314
+ export declare function fetchMoreNews({ endpoint, route, slug, page, size, direct, }: FetchMoreArgs): Promise<MoreNewsPage>;
1315
+
1274
1316
  /**
1275
1317
  * Cache in-memory + deduplicación de requests en vuelo (misma clave → misma promesa).
1276
1318
  * TTL corto pensado para SSR: evita 4–5 GETs repetidos de menú/banners por instancia.
@@ -1599,6 +1641,8 @@ export declare const GTM: () => "" | JSX.Element | undefined;
1599
1641
 
1600
1642
  export declare function handleGetComments({ publication, path, size, sizereply, id, lastid, state, apiToken, API_ENV, }: GetCommentsParams): Promise<any>;
1601
1643
 
1644
+ export declare function handleListLoadMoreRequest(url: URL, { size, cfg, timeoutMs }: ListLoadMoreHandlerOptions): Promise<Response>;
1645
+
1602
1646
  export declare interface Hascontent {
1603
1647
  hasgalleryvideosflash: boolean;
1604
1648
  hasgalleryvideosyoutube: boolean;
@@ -1914,6 +1958,9 @@ export declare interface Info {
1914
1958
 
1915
1959
  export declare function initLibrary(userConfig?: LibraryConfig): void;
1916
1960
 
1961
+ /** Engancha todos los botones "Ver mas" presentes en `scope` (default: el documento). */
1962
+ export declare function initListLoadMore(scope?: ParentNode | null): void;
1963
+
1917
1964
  /**
1918
1965
  * Reescribe a "hace 3 horas" el texto de todo `[data-rel-ts]` cuya fecha caiga
1919
1966
  * dentro de `maxAgeHours`, y lo refresca mientras la pestaña esté visible.
@@ -1955,6 +2002,9 @@ export declare interface ISection {
1955
2002
  */
1956
2003
  export declare const isHomePath: (pathname?: string) => boolean;
1957
2004
 
2005
+ /** `true` si esta ruta muestra el boton "Ver mas" en lugar del paginador. */
2006
+ export declare function isLoadMoreRoute(route: string, cfg?: Pick<LibraryConfig, 'CONFIG_listLoadMore'>): boolean;
2007
+
1958
2008
  export declare const isPhotoGallery: (news: NewListResponseData) => boolean | undefined;
1959
2009
 
1960
2010
  /**
@@ -1972,6 +2022,15 @@ export declare const isPhotoGallery: (news: NewListResponseData) => boolean | un
1972
2022
  */
1973
2023
  export declare function isRecaptchaBlocked(cfg?: Pick<LibraryConfig, 'CONFIG_blockRecaptcha'>): boolean;
1974
2024
 
2025
+ /**
2026
+ * ¿El molde es una tarjeta que este renderer sabe completar? Cubre
2027
+ * `section-card-1` y `SectionCard6`, que son las dos que emiten el bloque de
2028
+ * `NewsDescription` (`.sass-com-nd-*`). Una `OpinionCard2` (`.sass-com-oc2-*`)
2029
+ * NO lo emite: ahi el clon saldria con los datos de la primera nota repetidos,
2030
+ * asi que el runtime corta antes de pintar nada.
2031
+ */
2032
+ export declare const isSupportedCardTemplate: (template: Element) => boolean;
2033
+
1975
2034
  export declare class IssuuServices {
1976
2035
  private issuuApi;
1977
2036
  private api;
@@ -2113,6 +2172,28 @@ export declare type LibraryConfig = {
2113
2172
  * hidratador de imágenes offline). Default `false` → usa `<HomeCard>` React.
2114
2173
  */
2115
2174
  CONFIG_landingFastRender?: boolean;
2175
+ /**
2176
+ * [listados] Boton "Ver mas" en lugar de ANTERIOR/SIGUIENTE.
2177
+ *
2178
+ * `true` lo prende en todas las rutas de {@link LISTING_ROUTES} con los
2179
+ * defaults; la forma larga ({@link ListLoadMoreConfig}) permite elegir rutas,
2180
+ * tope de paginas y los params del pedido al CMS.
2181
+ *
2182
+ * Prenderlo arrastra, sin tocar codigo de la ruta:
2183
+ * - `SectionServerComponent` pinta `<ListLoadMore>` en el lugar exacto donde
2184
+ * pintaba `<NextPrev>`, o sea que hereda su caja y su CSS.
2185
+ * - `shouldDisablePagination(route)` pasa a `true`, para que el sitio recorte
2186
+ * la metadata de paginado (`rel=prev` / `rel=next`).
2187
+ *
2188
+ * Lo unico que cada repo monta a mano es el runtime de cliente
2189
+ * (`initListLoadMore()`, un `<script>` en el layout) y el endpoint
2190
+ * (`handleListLoadMoreRequest`, un archivo de ~6 lineas en `src/pages/api/`),
2191
+ * porque ni los `<script>` ni las rutas de Astro se pueden declarar desde un
2192
+ * paquete.
2193
+ *
2194
+ * Default `undefined` -> paginacion clasica, comportamiento actual.
2195
+ */
2196
+ CONFIG_listLoadMore?: boolean | ListLoadMoreConfig;
2116
2197
  /**
2117
2198
  * [render] Fecha relativa ("hace 3 horas") en las superficies que emiten
2118
2199
  * `data-rel-ts`. Solo lo lee el hidratador `initRelativeTime` en el cliente:
@@ -2317,8 +2398,137 @@ export declare interface Link {
2317
2398
 
2318
2399
  export declare function LinkComponent(props: any): JSX.Element;
2319
2400
 
2401
+ /** Se emite cuando el boton agrego tarjetas: lo escucha `initRelativeTime`. */
2402
+ export declare const LIST_APPENDED_EVENT = "list:appended";
2403
+
2404
+ /**
2405
+ * Rutas de listado que el boton "Ver mas" sabe recorrer. Es la key con la que
2406
+ * viaja el `route` desde el boton hasta `buildLoadMoreRequest` y hasta el
2407
+ * endpoint propio del sitio; cada una resuelve a un endpoint distinto del CMS.
2408
+ *
2409
+ * `cartonista` NO es una `MetadataDefaultsKeys` (esa ruta se cuelga de la key
2410
+ * 'autor' para menu / banners / schemas), pero SI es una ruta de listado a
2411
+ * estos efectos.
2412
+ */
2413
+ export declare const LISTING_ROUTES: readonly ["seccion", "tema", "ultimas-noticias", "autor", "cartonista"];
2414
+
2415
+ export declare type ListingRoute = (typeof LISTING_ROUTES)[number];
2416
+
2417
+ /**
2418
+ * Boton "Ver mas": reemplaza a ANTERIOR/SIGUIENTE en las rutas que el sitio
2419
+ * marca en `CONFIG_listLoadMore`.
2420
+ *
2421
+ * Se renderiza en el SERVIDOR (sin `client:`): el boton esta en el HTML desde el
2422
+ * primer byte, no hay salto de layout ni espera de hidratacion. Lo unico que
2423
+ * corre en el cliente es `initListLoadMore`, que lee todo de estos `data-*`.
2424
+ *
2425
+ * Va con las clases del paginador (`sass-com-np-content` + `sass-com-np-linkStyled`)
2426
+ * y en el mismo lugar del arbol a proposito: mismo alto, mismo radio, mismo
2427
+ * color y mismo hover que los links que reemplaza, sin CSS nuevo salvo el reset
2428
+ * del <button>.
2429
+ */
2430
+ declare const ListLoadMore: FC<ListLoadMoreProps>;
2431
+ export { ListLoadMore }
2432
+ export { ListLoadMore as ListLoadMoreComponent }
2433
+
2434
+ /**
2435
+ * Forma larga del toggle {@link LibraryConfig.CONFIG_listLoadMore}.
2436
+ */
2437
+ export declare type ListLoadMoreConfig = {
2438
+ /** Kill switch. `false` apaga la feature aunque el objeto este presente. */
2439
+ enabled?: boolean;
2440
+ /** Que rutas llevan boton. Default: todas las de {@link LISTING_ROUTES}. */
2441
+ routes?: ListingRoute[];
2442
+ /**
2443
+ * Tope de paginas que el boton deja alcanzar, contando la pagina 1 que ya
2444
+ * pinto el SSR: 5 => 4 clicks (paginas 2, 3, 4 y 5) y despues el boton se
2445
+ * saca del DOM. Default 5.
2446
+ */
2447
+ maxPages?: number;
2448
+ /** Endpoint propio del sitio. Default `/api/get-more-list`. */
2449
+ endpoint?: string;
2450
+ /**
2451
+ * `newstype` del pedido. Tiene que ser el MISMO que usa el router del sitio
2452
+ * para la pagina 1 (`config.newsType`), o la tarjeta 46 no sale del mismo
2453
+ * universo que la 45. Sin valor, el param no se manda y el CMS aplica su
2454
+ * default.
2455
+ */
2456
+ newsType?: string;
2457
+ /**
2458
+ * `imagesizes` del pedido. Mismo criterio: el corte con el que el router
2459
+ * pidio la pagina 1 (tipicamente `imageSizes.note.listStandard`). Sin valor,
2460
+ * el param no se manda y el CMS devuelve sus cortes por default — o sea,
2461
+ * imagenes con otra medida que las del SSR.
2462
+ */
2463
+ imageSizes?: string;
2464
+ /** `exclude` del pedido. Default: el mismo de los routers de listado. */
2465
+ exclude?: string;
2466
+ /**
2467
+ * Opt-in: el browser le pide las notas al CMS por `/hit/*` en vez de al
2468
+ * endpoint propio. Ahorra el paso por el SSR, pero obliga a publicar los dos
2469
+ * tokens (`PUBLIC_X_SECURITY_TOKEN` y `PUBLIC_X_SECURITY_WAF_TOKEN`) en el
2470
+ * HTML de la pagina. Default `false`.
2471
+ */
2472
+ cdnDirect?: boolean;
2473
+ /** Overrides por ruta de `newsType` / `imageSizes`. */
2474
+ routeOverrides?: Partial<Record<ListingRoute, ListLoadMoreRouteOverride>>;
2475
+ };
2476
+
2477
+ export declare type ListLoadMoreHandlerOptions = {
2478
+ /** Tamano del lote. Es el `config.newsListLimit` del sitio. */
2479
+ size: number;
2480
+ cfg?: LibraryConfig;
2481
+ /**
2482
+ * Techo del pedido al CMS. Sin esto, un lote alto que tarda mas de lo normal
2483
+ * se corta solo del lado de Node y el boton queda sin salida. Default 20 s
2484
+ * (medido: hay lotes que tardan ~9 s, y el resto de la app no pone timeout).
2485
+ */
2486
+ timeoutMs?: number;
2487
+ };
2488
+
2489
+ export declare type ListLoadMoreProps = {
2490
+ /** Ruta de listado. Es la key con la que viaja hasta el endpoint. */
2491
+ route: string;
2492
+ /** Slug del listado: seccion, tag (`...-t1234`) o usuario del autor. */
2493
+ slug: string;
2494
+ /** Cuantas notas ya pinto el SSR. Lote incompleto = no hay pagina siguiente. */
2495
+ renderedCount: number;
2496
+ /** Tamano del lote (`NEWS_PER_SECTION`). */
2497
+ batchSize: number;
2498
+ /** Pagina que ya esta en pantalla. El boton arranca en `currentPage + 1`. */
2499
+ currentPage?: number;
2500
+ texts?: {
2501
+ [key: string]: string | undefined;
2502
+ };
2503
+ paths: RoutePathConfig;
2504
+ /** Clase de speculation rules, para sacarla de los clones. */
2505
+ prerenderClass?: string;
2506
+ /**
2507
+ * Variante de tarjeta con la que se pinto el listado (el `option` de
2508
+ * `SectionCardServerComponent`). Las variantes de opinion montan
2509
+ * `OpinionCard2`, que el renderer no sabe completar.
2510
+ */
2511
+ cardOption?: string;
2512
+ /** Override del contenedor al que se le hace `appendChild`. */
2513
+ targetSelector?: string;
2514
+ /** Override del selector de la tarjeta molde dentro de ese contenedor. */
2515
+ itemSelector?: string;
2516
+ };
2517
+
2518
+ /** Overrides de los params del CMS para una ruta puntual. */
2519
+ export declare type ListLoadMoreRouteOverride = {
2520
+ newsType?: string;
2521
+ imageSizes?: string;
2522
+ };
2523
+
2320
2524
  export declare const LiveBlogHeader: FC<Props_43>;
2321
2525
 
2526
+ export declare type LoadMoreCmsRequest = {
2527
+ /** Nombre del endpoint del CMS, sin host ni version de path. */
2528
+ path: string;
2529
+ params: Record<string, string>;
2530
+ };
2531
+
2322
2532
  declare const Location_2: FC<Props_23>;
2323
2533
  export { Location_2 as Location }
2324
2534
 
@@ -2545,6 +2755,12 @@ declare interface ModuloNewsletterProps {
2545
2755
 
2546
2756
  export declare const ModuloOpinion: FC<OptionCardBlockProps>;
2547
2757
 
2758
+ export declare type MoreNewsPage = {
2759
+ items: NewListResponseData[];
2760
+ /** Mismo criterio que el `showNext` del paginador: lote incompleto = no hay mas. */
2761
+ hasMore: boolean;
2762
+ };
2763
+
2548
2764
  declare type Network = {
2549
2765
  title: string;
2550
2766
  slug: string;
@@ -2973,6 +3189,15 @@ export declare type NoteShare = {
2973
3189
 
2974
3190
  export declare type NoteShareOption = 'X' | 'Email' | 'LinkedIn' | 'Whatsapp' | 'FaceBook';
2975
3191
 
3192
+ export declare const OpinionCard2: FC<OpinionCardProps>;
3193
+
3194
+ declare interface OpinionCardProps {
3195
+ data: NewListResponseData;
3196
+ autorIcon: any;
3197
+ paths: RoutePathConfig;
3198
+ speculationPrerenderClass?: string;
3199
+ }
3200
+
2976
3201
  declare interface OptionCardBlockProps {
2977
3202
  title: ReactNode;
2978
3203
  banner?: ReactNode;
@@ -3747,6 +3972,20 @@ declare type Props_8 = {
3747
3972
  custom_bannerPosition?: {
3748
3973
  [key: number]: number;
3749
3974
  };
3975
+ /**
3976
+ * [listados] Identidad del listado para el boton "Ver mas". Es lo UNICO que
3977
+ * cada ruta agrega para sumarse a la feature; el on/off vive en
3978
+ * `CONFIG_listLoadMore` (initLibrary), asi que con el toggle apagado este prop
3979
+ * no hace nada.
3980
+ *
3981
+ * `slug` va aparte del prop `slug` del componente a proposito: ese prop es la
3982
+ * VARIANTE de tarjeta (`option` de `SectionCardServerComponent`), y en varios
3983
+ * repos no coincide con el slug real del listado.
3984
+ */
3985
+ loadMore?: {
3986
+ route: string;
3987
+ slug: string;
3988
+ };
3750
3989
  };
3751
3990
 
3752
3991
  declare type Props_9 = {
@@ -3916,6 +4155,21 @@ export declare type RelativeTimeSurface = 'note' | 'summary';
3916
4155
 
3917
4156
  export declare const removePages: (pathname: string) => string;
3918
4157
 
4158
+ export declare type RenderCardContext = {
4159
+ /** Base de las imagenes relativas (`getEnvironmentUrl()` resuelto en el SSR). */
4160
+ imageBase: string;
4161
+ paths: RoutePathConfig;
4162
+ /** `SHOW_TAG_BY_SECTION`: la volanta muestra el primer tag y no la seccion. */
4163
+ showTagBySection: boolean;
4164
+ /** `PUBLIC_LNG` (el mismo valor que lee `formatDate` del singleton en el SSR). */
4165
+ lng: string;
4166
+ timeZone: string;
4167
+ /** Clase de speculation rules a sacar del clon. */
4168
+ prerenderClass?: string;
4169
+ };
4170
+
4171
+ export declare function renderCardFast(template: Element, item: NewListResponseData, ctx: RenderCardContext): Element;
4172
+
3919
4173
  declare type ReplaceProps = {
3920
4174
  '[author_replace]': string;
3921
4175
  '[section_replace]': string;
@@ -4051,6 +4305,18 @@ export declare function resolveBucketMenuSubtype(path?: string): string;
4051
4305
  */
4052
4306
  export declare function resolveBucketOriginUrl(bucket: BucketOriginConfig, servicePrefix: string | undefined, type: 'menu' | 'banners' | 'bloques', subtype: string, offline?: boolean): string;
4053
4307
 
4308
+ /** {@link ListLoadMoreConfig} con todos los defaults ya aplicados. */
4309
+ export declare type ResolvedListLoadMore = {
4310
+ routes: readonly ListingRoute[];
4311
+ maxPages: number;
4312
+ endpoint: string;
4313
+ newsType: string;
4314
+ imageSizes: string;
4315
+ exclude: string;
4316
+ cdnDirect: boolean;
4317
+ routeOverrides?: Partial<Record<ListingRoute, ListLoadMoreRouteOverride>>;
4318
+ };
4319
+
4054
4320
  /**
4055
4321
  * Recibe lo que el app mande hoy (contrato completo, parcial, o nada) y
4056
4322
  * devuelve SIEMPRE un contrato completo. Los constructores públicos del
@@ -4063,6 +4329,13 @@ export declare function resolveBucketOriginUrl(bucket: BucketOriginConfig, servi
4063
4329
  */
4064
4330
  export declare function resolveImageSizes(input: ImageSizesContractInput | undefined): ImageSizesResolution;
4065
4331
 
4332
+ /**
4333
+ * El toggle del boton "Ver mas" con los defaults aplicados, o `null` si el
4334
+ * sitio no lo prendio. Fuente UNICA de la resolucion: la consumen el componente,
4335
+ * el armador de params y el endpoint.
4336
+ */
4337
+ export declare function resolveListLoadMore(cfg?: Pick<LibraryConfig, 'CONFIG_listLoadMore'>): ResolvedListLoadMore | null;
4338
+
4066
4339
  /** Clase de prerender para una nota por índice (primer slot: todas las notas). */
4067
4340
  export declare function resolveSpeculationPrerenderClass(index: number, speculationPrerenderClass?: string, speculationPrerender?: SpeculationPrerenderConfig): string | undefined;
4068
4341
 
@@ -4247,6 +4520,14 @@ declare type SelectItem = {
4247
4520
 
4248
4521
  export declare function shareButtons({ noteShare }: Props_34): JSX.Element | null;
4249
4522
 
4523
+ /**
4524
+ * `true` si la ruta dejo de paginar de verdad, o sea si el sitio tiene que
4525
+ * recortar la metadata de paginado: sin `rel=prev` / `rel=next` y con el
4526
+ * canonical sin `/page/N`. Hoy es exactamente "esta ruta usa el boton", y existe
4527
+ * aparte para que los consumidores expresen la intencion y no la condicion.
4528
+ */
4529
+ export declare function shouldDisablePagination(route: string, cfg?: Pick<LibraryConfig, 'CONFIG_listLoadMore'>): boolean;
4530
+
4250
4531
  export declare const ShowSection: FC<Props_25>;
4251
4532
 
4252
4533
  declare interface Size {