sass-template-common 0.11.21 → 0.11.23-beta.0

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.
package/README.md CHANGED
@@ -1,36 +1,36 @@
1
- # sass-template-common
2
-
3
- Librería web, maqueta de configuración y componentes para proyectos sass.
4
-
5
- ## Publicar nueva versión
6
-
7
- Para que los cambios se reflejen al publicar:
8
-
9
- 1. **Subir versión** (obligatorio; si no, npm rechaza o se usa la misma versión):
10
- ```bash
11
- pnpm version:patch # 0.3.21 → 0.3.22
12
- # o
13
- pnpm version:minor # 0.3.21 → 0.4.0
14
- pnpm version:major # 0.3.21 → 1.0.0
15
- ```
16
-
17
- 2. **Build limpio + publicar**:
18
- ```bash
19
- pnpm run clean && pnpm run build && pnpm publish
20
- ```
21
- O en un solo paso (patch):
22
- ```bash
23
- pnpm release:patch
24
- ```
25
-
26
- 3. **`prepublishOnly`**: Antes de cada `pnpm publish` se ejecuta `clean` + `build`, así siempre se publica un build nuevo.
27
-
28
- 4. **En proyectos que consumen la lib**: Actualizar la dependencia y reinstalar:
29
- ```bash
30
- pnpm update sass-template-common
31
- # o cambiar la versión en package.json y luego
32
- pnpm install
33
- ```
34
- Si usan versión fija (`"0.3.21"`), hay que actualizarla a la nueva (p. ej. `"0.3.22"`).
35
-
36
- **Si no ves los cambios:** comprueba que subiste la versión (`version:patch` o similar), que hiciste `clean` + `build` antes de publicar, y que el proyecto consumidor tiene actualizada la dependencia (o `^0.3.21` y ha ejecutado `pnpm update`).
1
+ # sass-template-common
2
+
3
+ Librería web, maqueta de configuración y componentes para proyectos sass.
4
+
5
+ ## Publicar nueva versión
6
+
7
+ Para que los cambios se reflejen al publicar:
8
+
9
+ 1. **Subir versión** (obligatorio; si no, npm rechaza o se usa la misma versión):
10
+ ```bash
11
+ pnpm version:patch # 0.3.21 → 0.3.22
12
+ # o
13
+ pnpm version:minor # 0.3.21 → 0.4.0
14
+ pnpm version:major # 0.3.21 → 1.0.0
15
+ ```
16
+
17
+ 2. **Build limpio + publicar**:
18
+ ```bash
19
+ pnpm run clean && pnpm run build && pnpm publish
20
+ ```
21
+ O en un solo paso (patch):
22
+ ```bash
23
+ pnpm release:patch
24
+ ```
25
+
26
+ 3. **`prepublishOnly`**: Antes de cada `pnpm publish` se ejecuta `clean` + `build`, así siempre se publica un build nuevo.
27
+
28
+ 4. **En proyectos que consumen la lib**: Actualizar la dependencia y reinstalar:
29
+ ```bash
30
+ pnpm update sass-template-common
31
+ # o cambiar la versión en package.json y luego
32
+ pnpm install
33
+ ```
34
+ Si usan versión fija (`"0.3.21"`), hay que actualizarla a la nueva (p. ej. `"0.3.22"`).
35
+
36
+ **Si no ves los cambios:** comprueba que subiste la versión (`version:patch` o similar), que hiciste `clean` + `build` antes de publicar, y que el proyecto consumidor tiene actualizada la dependencia (o `^0.3.21` y ha ejecutado `pnpm update`).
@@ -51,6 +51,16 @@ export declare type Analytics = {
51
51
  comscore: string | undefined;
52
52
  };
53
53
 
54
+ /**
55
+ * Una pasada sobre el DOM. Exportada aparte de `initRelativeTime` para poder
56
+ * re-correrla a mano después de inyectar HTML (paginados, "más noticias") —
57
+ * pasándole las MISMAS `opts` que se le pasaron a `initRelativeTime`.
58
+ *
59
+ * Tambien gateada por el flag: sin `enabled` no escribe nada. Es la condición
60
+ * de que el HTML de un sitio que no opto in sea el de siempre.
61
+ */
62
+ export declare const applyRelativeTime: (opts?: RelativeTimeOptions) => void;
63
+
54
64
  /**
55
65
  * Red de seguridad runtime para consumidores JS (sin type-check). El tipo
56
66
  * marca la forma en build; esto valida presencia de cada slot y que matchee
@@ -1248,6 +1258,21 @@ export declare const formatNewsMeta: (meta: any, news: NewListResponseData | und
1248
1258
  };
1249
1259
  };
1250
1260
 
1261
+ /**
1262
+ * Relativo ("hace 3 horas") si la nota es más nueva que `maxAgeHours`;
1263
+ * si no, cae a `formatDate` (absoluto).
1264
+ *
1265
+ * `now` entra POR PARÁMETRO, no se lee adentro: así la función es determinista
1266
+ * dado `(date, now)` y el SSR nunca la llama con `Date.now()` por accidente
1267
+ * (un relativo renderizado en servidor queda congelado en el cache del CDN y
1268
+ * a los 40 minutos sigue diciendo "hace 5 minutos" — información incorrecta,
1269
+ * no desactualizada).
1270
+ */
1271
+ export declare const formatRelativeDate: (date: number, now: number, maxAgeHours?: number, DATE_CONFIG?: {
1272
+ PUBLIC_LNG: string;
1273
+ DATE_TIMEZONE: string;
1274
+ }) => string;
1275
+
1251
1276
  export declare const FormatScripts: (props: ScriptProps) => JSX.Element | null;
1252
1277
 
1253
1278
  export declare const formatVideoData: (meta: any, news: VideoResponseData, config: Config) => {
@@ -1736,6 +1761,19 @@ export declare interface Info {
1736
1761
 
1737
1762
  export declare function initLibrary(userConfig?: LibraryConfig): void;
1738
1763
 
1764
+ /**
1765
+ * Reescribe a "hace 3 horas" el texto de todo `[data-rel-ts]` cuya fecha caiga
1766
+ * dentro de `maxAgeHours`, y lo refresca mientras la pestaña esté visible.
1767
+ *
1768
+ * Sin React a propósito: hidratar un nodo de texto con React cuesta más que el
1769
+ * dato. Sin JS —o sin llamar a esta función— queda el absoluto que emitió el
1770
+ * SSR, que es correcto, cacheable y el que lee el crawler.
1771
+ *
1772
+ * Idempotente: una segunda llamada reemplaza los listeners de la anterior.
1773
+ * Devuelve el disposer.
1774
+ */
1775
+ export declare const initRelativeTime: (opts?: RelativeTimeOptions) => () => void;
1776
+
1739
1777
  export declare function isConfigOriginAuditEnabled(): boolean;
1740
1778
 
1741
1779
  export declare interface ISection {
@@ -1781,6 +1819,18 @@ export declare class IssuuServices {
1781
1819
  /** True para videos (flash, youtube y embedded) en cualquiera de sus formas. */
1782
1820
  export declare const isVideoContentItem: (item: any) => boolean;
1783
1821
 
1822
+ /**
1823
+ * ¿La fecha cae dentro de la ventana en la que corresponde texto relativo?
1824
+ *
1825
+ * Fuente ÚNICA de la decisión relativo-vs-absoluto: la consumen
1826
+ * `formatRelativeDate` (SSR/render) y el hidratador `initRelativeTime`
1827
+ * (cliente), para que nunca puedan discrepar.
1828
+ *
1829
+ * Las fechas futuras (`date > now`) quedan FUERA de la ventana a propósito:
1830
+ * un reloj de cliente atrasado no debe producir "en 3 horas".
1831
+ */
1832
+ export declare const isWithinRelativeWindow: (date: number, now: number, maxAgeHours?: number) => boolean;
1833
+
1784
1834
  export declare interface ItemFormatedType extends NewListResponseData {
1785
1835
  gallery?: Array<Preview>;
1786
1836
  videos?: Array<VideoItem>;
@@ -1877,6 +1927,19 @@ export declare type LibraryConfig = {
1877
1927
  * hidratador de imágenes offline). Default `false` → usa `<HomeCard>` React.
1878
1928
  */
1879
1929
  CONFIG_landingFastRender?: boolean;
1930
+ /**
1931
+ * [render] Fecha relativa ("hace 3 horas") en las superficies que emiten
1932
+ * `data-rel-ts`. Solo lo lee el hidratador `initRelativeTime` en el cliente:
1933
+ * el SSR SIEMPRE emite la fecha absoluta, porque el HTML se sirve cacheado y
1934
+ * un relativo renderizado en servidor queda congelado en el CDN.
1935
+ *
1936
+ * Default `undefined` -> comportamiento actual (absoluto, sin hidratador).
1937
+ * `maxAgeHours` default 24: pasada esa antiguedad se muestra el absoluto.
1938
+ */
1939
+ CONFIG_relativeTime?: {
1940
+ enabled: boolean;
1941
+ maxAgeHours?: number;
1942
+ };
1880
1943
  CONFIG_deferBanners?: {
1881
1944
  common?: boolean;
1882
1945
  middle?: boolean;
@@ -3382,6 +3445,49 @@ declare interface Relatedexternal {
3382
3445
  news: boolean;
3383
3446
  }
3384
3447
 
3448
+ /**
3449
+ * Marca un elemento como hidratable a fecha relativa. El valor es el timestamp
3450
+ * en milisegundos (el mismo número que consume `formatDate`).
3451
+ */
3452
+ export declare const RELATIVE_TIME_ATTR = "data-rel-ts";
3453
+
3454
+ /**
3455
+ * Texto literal a preservar ANTES del relativo, para las superficies donde el
3456
+ * elemento contiene `"Autor - fecha"` en un ÚNICO nodo de texto (super,
3457
+ * block-video-2/3, fast-render de la home). Existe para no partir ese texto en
3458
+ * nodos nuevos: el hidratador reescribe el `textContent` como `prefix + relativo`.
3459
+ *
3460
+ * Duplica el nombre del autor en el HTML; al ser una repetición literal dentro
3461
+ * del mismo documento, gzip/brotli la resuelven como back-reference.
3462
+ */
3463
+ export declare const RELATIVE_TIME_PREFIX_ATTR = "data-rel-prefix";
3464
+
3465
+ /**
3466
+ * Props JSX del contrato. Devuelve `{}` (spread vacío, cero atributos en el
3467
+ * HTML) si el timestamp no sirve: la superficie queda exactamente como hoy.
3468
+ */
3469
+ export declare const relativeTimeAttrs: (ts: number | undefined, prefix?: string) => Record<string, string | number>;
3470
+
3471
+ /**
3472
+ * La misma info que `relativeTimeAttrs`, para los emisores de HTML-string
3473
+ * (`homeCardFastRender`). Devuelve `''` o un fragmento que ARRANCA con espacio,
3474
+ * listo para concatenar dentro del tag.
3475
+ */
3476
+ export declare const relativeTimeAttrsHTML: (ts: number | undefined, prefix?: string) => string;
3477
+
3478
+ declare type RelativeTimeOptions = {
3479
+ /**
3480
+ * Gana sobre `CONFIG_relativeTime.enabled`. Sin ninguno de los dos en `true`
3481
+ * el hidratador es un no-op: no observa, no agenda y no toca el DOM.
3482
+ */
3483
+ enabled?: boolean;
3484
+ maxAgeHours?: number;
3485
+ /** Cada cuánto refresca el texto. Default 60_000. `0` desactiva el refresco. */
3486
+ refreshMs?: number;
3487
+ /** Raíz del query. Default `document`. */
3488
+ root?: ParentNode;
3489
+ };
3490
+
3385
3491
  export declare const removePages: (pathname: string) => string;
3386
3492
 
3387
3493
  declare type ReplaceProps = {