sass-cms-template-common 0.0.12 → 0.0.14

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/dist/index.d.ts CHANGED
@@ -35,7 +35,7 @@ export declare type AppMessageNode = string | {
35
35
  /** Árbol de mensajes del gestor (namespaces → claves → string anidable). */
36
36
  export declare type AppMessages = Record<string, AppMessageNode>;
37
37
 
38
- export declare function AppShell({ pathname, sites, children, notificationUnreadCount, notificationsData, editorialOpportunities, showEditorialOpportunities, copilotSuggestionsHref, onEditorialSeeMore, profile, primaryLogo, brandLogo, selectedPublicationId, getPublicationHref, resolvePublicationImageUrl, profileAvatarOptions, legacyBaseUrl, cmsBaseUrl, legacySession, newContentGroups, previewFormats, operationPermissions, isAdmin, onNewContentSelect, onPreviewSelect, LinkComponent, permissions, locale, language, messages, appMessages, baseUrl, profileServices, }: AppShellProps): JSX.Element;
38
+ export declare function AppShell({ pathname, sites, children, notificationUnreadCount, notificationsData, copilotSuggestionsHref, onEditorialSeeMore, onEditorialRemindLater, profile, primaryLogo, brandLogo, selectedPublicationId, getPublicationHref, resolvePublicationImageUrl, profileAvatarOptions, legacyBaseUrl, cmsBaseUrl, legacySession, newContentGroups, previewFormats, operationPermissions, isAdmin, onNewContentSelect, onPreviewSelect, LinkComponent, permissions, locale, language, messages, appMessages, baseUrl, profileServices, }: AppShellProps): JSX.Element;
39
39
 
40
40
  export declare type AppShellProps = {
41
41
  pathname: string;
@@ -44,14 +44,12 @@ export declare type AppShellProps = {
44
44
  notificationUnreadCount: number;
45
45
  /** Respuesta cruda de `POST /dashboard/notification` (newsTask/expireTask/videos). */
46
46
  notificationsData?: DashboardNotificationsResponse | null;
47
- /** Oportunidades editoriales copilot (card de la campanita). Si se omite, mock temporal. */
48
- editorialOpportunities?: EditorialOpportunity[];
49
- /** Muestra la card de oportunidades editoriales copilot. Por defecto `true`. */
50
- showEditorialOpportunities?: boolean;
51
- /** URL del gestor de sugerencias copilot para el "Ver más" (enlace real). */
47
+ /** Destino del "Ver más" / clic en una oportunidad copilot (página de sugerencias). */
52
48
  copilotSuggestionsHref?: string;
53
49
  /** Clic en "Ver más" cuando no hay `copilotSuggestionsHref` (fallback). */
54
50
  onEditorialSeeMore?: () => void;
51
+ /** "Recordar luego": recibe los `opportunity_id` mostrados para el snooze. */
52
+ onEditorialRemindLater?: (opportunityIds: string[]) => void;
55
53
  profile: ProfileGetResponse;
56
54
  primaryLogo: ReactNode;
57
55
  brandLogo?: ReactNode;
@@ -494,6 +492,22 @@ export declare interface CkeditorPrompt {
494
492
  [key: string]: unknown;
495
493
  }
496
494
 
495
+ export declare interface ClassifiedNetworkError {
496
+ errorCode: NetworkErrorCode;
497
+ /** Si conviene reintentar la petición. */
498
+ retryable: boolean;
499
+ /** Mensaje crudo del error original (para el detalle copiable del toast). */
500
+ error: string;
501
+ }
502
+
503
+ /**
504
+ * Clasifica una excepción (error de axios en el servidor, o `TypeError:
505
+ * Failed to fetch` del navegador al invocar un server action) como error de
506
+ * red/servidor. Devuelve `null` si NO es un error de red (p. ej. un 4xx o una
507
+ * excepción de lógica): el caller lo trata entonces como error de negocio.
508
+ */
509
+ export declare function classifyNetworkError(error: unknown): ClassifiedNetworkError | null;
510
+
497
511
  /**
498
512
  * Contenedor de "Búsqueda avanzada" reutilizable y declarativo. Recibe una lista
499
513
  * de `fields` y los renderiza en una grilla, manejando el estado del formulario
@@ -727,6 +741,8 @@ export declare const cmsColors: {
727
741
  readonly primary: string;
728
742
  readonly primaryHover: string;
729
743
  readonly primaryDisabled: string;
744
+ readonly kundera: string;
745
+ readonly kunderaHover: string;
730
746
  readonly secondary: string;
731
747
  readonly secondaryHover: string;
732
748
  readonly onSecondaryContainer: string;
@@ -734,6 +750,9 @@ export declare const cmsColors: {
734
750
  readonly controlBorder: string;
735
751
  readonly controlText: string;
736
752
  readonly controlHoverBg: string;
753
+ readonly searchHoverBg: string;
754
+ readonly searchFocusBg: string;
755
+ readonly searchClearHoverBg: string;
737
756
  readonly whiteBtnBorder: string;
738
757
  readonly whiteBtnText: string;
739
758
  readonly iconButtonHoverBg: string;
@@ -745,6 +764,11 @@ export declare const cmsColors: {
745
764
  readonly alphabetIdleSoft: string;
746
765
  readonly alphabetLetter: string;
747
766
  readonly alphabetLetterDisabled: string;
767
+ readonly rowHover: string;
768
+ readonly neutralHover: string;
769
+ readonly onPrimaryStateLayer: string;
770
+ readonly actionIcon: string;
771
+ readonly actionIconHover: string;
748
772
  readonly textStrong: string;
749
773
  readonly textNav: string;
750
774
  readonly textMuted: string;
@@ -755,6 +779,9 @@ export declare const cmsColors: {
755
779
  readonly border: string;
756
780
  readonly avatarBg: string;
757
781
  readonly avatarBorder: string;
782
+ readonly avatarInactiveBg: string;
783
+ readonly avatarInactiveIcon: string;
784
+ readonly tooltipSurface: string;
758
785
  readonly surface: string;
759
786
  };
760
787
 
@@ -880,10 +907,10 @@ export declare type CmsConfirmDialogProps = {
880
907
  icon?: ReactNode;
881
908
  /** Color de acento del badge del ícono. Por defecto el texto de navegación. */
882
909
  iconColor?: string;
883
- /** Título opcional. Product Sans 32/400. Admite `\n` para saltos de línea. */
910
+ /** Título opcional. M3 title-large (Google Sans 500 22/28). Admite `\n` para saltos de línea. */
884
911
  title?: ReactNode;
885
912
  /**
886
- * Descripción opcional. Roboto 14/400. Puede incluir negrita (`<b>`/`<strong>`)
913
+ * Descripción opcional. Google Sans 14/400. Puede incluir negrita (`<b>`/`<strong>`)
887
914
  * y enlaces (`<a>`); ambos se estilan según el diseño.
888
915
  */
889
916
  description?: ReactNode;
@@ -981,6 +1008,13 @@ export declare class CmsCopilotServices {
981
1008
  * oportunidad: `save` | `like` | `dislike` | `assign` (permiso COPILOT_ACTION).
982
1009
  */
983
1010
  executeAction: (input: CopilotActionInput) => Promise<CopilotActionResponse>;
1011
+ /**
1012
+ * POST /copilot/snooze — "recordar luego" de una oportunidad de la campanita
1013
+ * (permiso COPILOT_VIEW). La oportunidad desaparece de la campanita para el
1014
+ * usuario y reaparece sola al vencer el plazo configurado.
1015
+ * @param opportunityId - Id de la oportunidad a posponer.
1016
+ */
1017
+ snooze: (opportunityId: string) => Promise<CopilotSnoozeResponse>;
984
1018
  }
985
1019
 
986
1020
  /**
@@ -1064,6 +1098,24 @@ export declare type CmsDialogActionsProps = {
1064
1098
  testId?: string;
1065
1099
  };
1066
1100
 
1101
+ /**
1102
+ * Bloque de "sin resultados" para listados y tablas: icono + título + subtítulo,
1103
+ * centrado. Presentacional; los textos vienen por props (i18n del gestor).
1104
+ * Replica el estado vacío del CMS Angular legacy.
1105
+ */
1106
+ export declare function CmsEmptyState({ title, description, icon, testId, }: CmsEmptyStateProps): JSX.Element;
1107
+
1108
+ export declare type CmsEmptyStateProps = {
1109
+ /** Título principal (ya traducido). */
1110
+ title: string;
1111
+ /** Subtítulo / ayuda opcional (ya traducido). */
1112
+ description?: string;
1113
+ /** Icono a mostrar. Por defecto `search_off` (SearchOffOutlined). */
1114
+ icon?: ReactNode;
1115
+ /** Base para los `data-testid` (p. ej. `panel-users-empty`). */
1116
+ testId?: string;
1117
+ };
1118
+
1067
1119
  /**
1068
1120
  * Página de error compartida por todos los gestores (mecanismo en la lib).
1069
1121
  * Replica la de cmsmedios: ilustración + título + subtítulo + botón HOME, y en
@@ -1134,15 +1186,54 @@ export declare class CmsFileExplorerServices {
1134
1186
  }
1135
1187
 
1136
1188
  /**
1137
- * Inyecta los `@font-face` de Roboto y Product Sans como estilos globales.
1138
- * Va montado dentro de los providers MUI de la lib, así cada gestor que los use
1139
- * tiene las fuentes disponibles sin configurar nada.
1189
+ * Barra de filtros activos: aparece bajo la toolbar del listado con el label
1190
+ * "Filtros:", un chip removible por cada filtro aplicado y un botón
1191
+ * "Limpiar todo". Presentacional y controlado: los chips y los callbacks los
1192
+ * arma el gestor (dominio del producto); la lib solo aporta la estética común.
1193
+ *
1194
+ * No renderiza nada si no hay chips activos.
1195
+ */
1196
+ export declare function CmsFilterBar({ label, chips, onClearAll, clearAllLabel, testId, }: CmsFilterBarProps): JSX.Element | null;
1197
+
1198
+ export declare type CmsFilterBarProps = {
1199
+ /** Texto del prefijo (p. ej. "Filtros:"). */
1200
+ label: string;
1201
+ /** Chips de filtros activos. Si está vacío, la barra no se renderiza. */
1202
+ chips: CmsFilterChip[];
1203
+ /** Callback de "Limpiar todo" (limpia todos los filtros). Si se omite, no se muestra. */
1204
+ onClearAll?: () => void;
1205
+ /** Texto del botón "Limpiar todo" (ya traducido). */
1206
+ clearAllLabel?: string;
1207
+ /** `data-testid` base de la barra. */
1208
+ testId?: string;
1209
+ };
1210
+
1211
+ /** Chip de un filtro activo dentro del `CmsFilterBar`. */
1212
+ export declare type CmsFilterChip = {
1213
+ /** Id estable del chip (para la key y el `data-testid`). */
1214
+ id: string;
1215
+ /** Texto o nodo a mostrar (ya traducido / formateado). */
1216
+ label: ReactNode;
1217
+ /** Icono opcional a la izquierda del label (p. ej. `search`). */
1218
+ icon?: ReactNode;
1219
+ /** Callback al quitar este filtro (clic en la X del chip). */
1220
+ onRemove: () => void;
1221
+ /** `aria-label` de la X del chip. */
1222
+ removeAriaLabel?: string;
1223
+ /** `data-testid` base del chip (la X será `${testId}-icon-btn-remove`). */
1224
+ testId?: string;
1225
+ };
1226
+
1227
+ /**
1228
+ * Inyecta los `@font-face` de Google Sans (fuente única del CMS) como estilos
1229
+ * globales. Va montado dentro de los providers MUI de la lib, así cada gestor que
1230
+ * los use tiene la fuente disponible sin configurar nada.
1140
1231
  */
1141
1232
  export declare function CmsFontFaces(): JSX.Element;
1142
1233
 
1143
1234
  /**
1144
- * Reglas `@font-face` de todas las fuentes del CMS, listas para inyectarse como
1145
- * estilos globales (ver el componente `CmsFontFaces`).
1235
+ * Reglas `@font-face` de Google Sans, listas para inyectarse como estilos
1236
+ * globales (ver el componente `CmsFontFaces`).
1146
1237
  */
1147
1238
  export declare const cmsFontFaces: string;
1148
1239
 
@@ -1290,6 +1381,68 @@ export declare type CmsMultiSelectFieldProps = {
1290
1381
  testId?: string;
1291
1382
  };
1292
1383
 
1384
+ export declare const CmsNetworkContext: Context<CmsNetworkContextValue | null>;
1385
+
1386
+ export declare interface CmsNetworkContextValue {
1387
+ /** Estado actual de la conexión. */
1388
+ status: CmsNetworkState;
1389
+ /** Atajo: `status === 'online'`. */
1390
+ isOnline: boolean;
1391
+ /**
1392
+ * Promesa que resuelve cuando la conexión vuelve a `online`. Si ya está
1393
+ * online, resuelve al instante. La usa el reintento para "retomar el llamado"
1394
+ * cuando vuelve internet.
1395
+ */
1396
+ waitForOnline: () => Promise<void>;
1397
+ /**
1398
+ * Fuerza una verificación por ping (útil cuando una petición falló por red
1399
+ * pero `navigator.onLine` todavía dice `true`).
1400
+ */
1401
+ verifyConnectivity: () => void;
1402
+ }
1403
+
1404
+ /**
1405
+ * Provee el estado de conectividad a toda la app y una promesa `waitForOnline`
1406
+ * para reanudar peticiones al recuperar internet.
1407
+ *
1408
+ * Replica el `NetworkService` del Angular legacy: combina `navigator.onLine`,
1409
+ * los eventos `window` `online`/`offline` y un **ping activo con polling** que
1410
+ * confirma la reconexión real (los eventos del navegador a veces mienten).
1411
+ *
1412
+ * El mecanismo vive en la lib; el **disparo** de toasts lo hace
1413
+ * `CmsNetworkToaster` (globales) y `useResilientAction` (por petición).
1414
+ */
1415
+ export declare function CmsNetworkProvider({ children, pingUrl, pingIntervalMs, }: CmsNetworkProviderProps): JSX.Element;
1416
+
1417
+ export declare interface CmsNetworkProviderProps {
1418
+ children: ReactNode;
1419
+ /**
1420
+ * URL de ping para confirmar conectividad real (además de los eventos del
1421
+ * navegador). Debe responder rápido a un `GET` sin CORS. `null` desactiva el
1422
+ * ping y deja solo los eventos `online`/`offline`. Default: endpoint 204 de
1423
+ * Google (mismo que usa el Angular legacy).
1424
+ */
1425
+ pingUrl?: string | null;
1426
+ /** Intervalo del polling de ping mientras siga offline (ms). Default 5000. */
1427
+ pingIntervalMs?: number;
1428
+ }
1429
+
1430
+ /** Estado de conectividad del navegador. */
1431
+ export declare type CmsNetworkState = 'online' | 'offline';
1432
+
1433
+ /**
1434
+ * Componente sin UI que observa el estado de conexión y dispara los toasts
1435
+ * globales, replicando el Angular legacy:
1436
+ *
1437
+ * - Al perder internet → toast de error "sin conexión" (no se autocierra).
1438
+ * - Al recuperarla → cierra el anterior y muestra "conexión restablecida".
1439
+ *
1440
+ * Se monta una sola vez, dentro de `CmsNetworkProvider` + `CmsToastProvider`.
1441
+ * El reintento y "reanudar el llamado" por acción los maneja
1442
+ * `useResilientAction`.
1443
+ */
1444
+ export declare function CmsNetworkToaster(): null;
1445
+
1293
1446
  /**
1294
1447
  * Servicios HTTP del módulo `news` del CMS (core + publish, unpublish, pin,
1295
1448
  * massive, freshness, views y analytics).
@@ -2121,6 +2274,7 @@ export declare type CmsTranslator = {
2121
2274
  count?: number;
2122
2275
  }) => string;
2123
2276
  toast: (key: ToastMessageKey) => string;
2277
+ network: (key: NetworkMessageKey) => string;
2124
2278
  userAvatar: (key: UserAvatarMessageKey) => string;
2125
2279
  errorPage: (key: ErrorPageMessageKey) => string;
2126
2280
  /**
@@ -2683,7 +2837,8 @@ export declare interface CopilotOpportunitiesResponse extends CmsResponse {
2683
2837
  *
2684
2838
  * La doc del gateway lista `id`, `topic` y `created_at`, pero el microservicio
2685
2839
  * (observado en dev) puede omitirlos: solo `title`, `status` y `score` están
2686
- * garantizados. El consumidor debe tolerar los faltantes.
2840
+ * garantizados. El consumidor debe tolerar los faltantes. En dev (2026-07-06) el
2841
+ * micro también entrega `source`, `type`, `reasons` e `is_followed`.
2687
2842
  */
2688
2843
  export declare interface CopilotOpportunity {
2689
2844
  id?: string;
@@ -2695,8 +2850,23 @@ export declare interface CopilotOpportunity {
2695
2850
  score?: number;
2696
2851
  /** Fecha de creación (ISO 8601, p. ej. "2026-06-26T10:15:00Z"). */
2697
2852
  created_at?: string;
2853
+ /** Fuente detectada (p. ej. "rss"). Verificado en dev 2026-07-06. */
2854
+ source?: CopilotOpportunitySource;
2855
+ /** Subtipo de match del micro (p. ej. "rss_match"). */
2856
+ type?: string;
2857
+ /** Motivos por los que el micro la propuso (para tooltip/detalle). */
2858
+ reasons?: string[];
2859
+ /** Si el editor ya la siguió/guardó (acción "save" de `copilot/actions`). */
2860
+ is_followed?: boolean;
2698
2861
  }
2699
2862
 
2863
+ /**
2864
+ * Fuente de la que el microservicio detectó la oportunidad. Valor observado en
2865
+ * dev hoy: `"rss"`. Se deja abierto (passthrough) para no romper cuando el micro
2866
+ * agregue fuentes nuevas.
2867
+ */
2868
+ declare type CopilotOpportunitySource = 'rss' | 'gtrends' | 'sconsole' | 'x' | (string & {});
2869
+
2700
2870
  /**
2701
2871
  * Estado de una oportunidad tal como lo entrega el microservicio (passthrough).
2702
2872
  * El único valor documentado hoy es `"open"`; se deja abierto para no romper
@@ -2704,6 +2874,18 @@ export declare interface CopilotOpportunity {
2704
2874
  */
2705
2875
  export declare type CopilotOpportunityStatus = 'open' | (string & {});
2706
2876
 
2877
+ /**
2878
+ * Cuerpo de la respuesta de POST /copilot/snooze (NAA-4645). El "recordar luego"
2879
+ * de la campanita: la oportunidad se oculta para ese usuario y reaparece sola al
2880
+ * vencer el plazo configurado.
2881
+ */
2882
+ export declare interface CopilotSnoozeResponse extends CmsResponse {
2883
+ copilotEnabled?: boolean;
2884
+ opportunity_id?: string;
2885
+ /** Momento hasta el cual la oportunidad queda oculta (ISO 8601 o epoch). */
2886
+ snoozed_until?: string | number;
2887
+ }
2888
+
2707
2889
  /** POST /dashboard/countNotificatio */
2708
2890
  export declare interface CountNotificationsResponse {
2709
2891
  status: string;
@@ -2744,10 +2926,32 @@ export declare interface CurrentUserPhotoProviderProps {
2744
2926
  children: ReactNode;
2745
2927
  }
2746
2928
 
2929
+ /**
2930
+ * Oportunidad editorial copilot presente en POST /dashboard/notification
2931
+ * (NAA-4645). El back manda hasta 3, ordenadas por `score` desc, y solo si hay.
2932
+ */
2933
+ export declare interface DashboardCopilotOpportunity {
2934
+ /** Id de la oportunidad (opportunity_id, requerido para el snooze). */
2935
+ id?: string;
2936
+ title: string;
2937
+ /** Tema/categoría de la oportunidad. */
2938
+ topic?: string;
2939
+ /** Puntaje de coincidencia editorial (0-100). */
2940
+ score?: number;
2941
+ /** Fecha de creación (ISO 8601, p. ej. "2026-06-26T10:15:00Z"). */
2942
+ created_at?: string;
2943
+ isRead?: boolean;
2944
+ }
2945
+
2747
2946
  /** Cuerpo de la respuesta de POST /dashboard/countNotifications. */
2748
2947
  export declare interface DashboardCountNotificationsResponse extends CmsResponse {
2749
2948
  /** Total de notificaciones no leídas del usuario autenticado. */
2750
2949
  unreadNotifications?: number;
2950
+ /**
2951
+ * Oportunidades copilot no leídas (NAA-4645). Ya está **sumado** dentro de
2952
+ * `unreadNotifications`; solo aparece si copilot aplica al usuario/publicación.
2953
+ */
2954
+ copilotOpportunities?: number;
2751
2955
  }
2752
2956
 
2753
2957
  /** Actividad vencida o por vencer presente en POST /dashboard/notification. */
@@ -2792,6 +2996,8 @@ export declare interface DashboardNotificationsResponse extends CmsResponse {
2792
2996
  newsTask?: DashboardNewsTask[];
2793
2997
  /** Actividades vencidas o por vencer. */
2794
2998
  expireTask?: DashboardExpireTask[];
2999
+ /** Oportunidades editoriales copilot (hasta 3, por `score` desc). NAA-4645. */
3000
+ copilot?: DashboardCopilotOpportunity[];
2795
3001
  }
2796
3002
 
2797
3003
  /** Evento de encoder de video presente en POST /dashboard/notification. */
@@ -2842,6 +3048,9 @@ export declare const DEFAULT_PREVIEW_FORMATS: PreviewFormat[];
2842
3048
 
2843
3049
  export declare const DEFAULT_SITE_ID = "bluestack-es";
2844
3050
 
3051
+ /** Preferencia por defecto (sin nada guardado): tema nuevo activo, modo claro. */
3052
+ export declare const DEFAULT_THEME_PREFERENCE: ThemePreference;
3053
+
2845
3054
  export declare const DefaultCmsLink: ForwardRefExoticComponent<AnchorHTMLAttributes<HTMLAnchorElement> & {
2846
3055
  href: string;
2847
3056
  children?: ReactNode;
@@ -2918,25 +3127,6 @@ export declare type DropdownOption = {
2918
3127
  testId?: string;
2919
3128
  };
2920
3129
 
2921
- /**
2922
- * Oportunidad editorial de un tema copilot (fuente de la card de la campanita).
2923
- * Misma forma que el `getCopilotOpportunities()` del CMS Angular (NAA-4645): hoy
2924
- * datos quemados; cuando el back libere el bloque en el WS de notificaciones se
2925
- * reemplaza la fuente manteniendo esta forma.
2926
- */
2927
- export declare interface EditorialOpportunity {
2928
- id: number | string;
2929
- title: string;
2930
- /** % de coincidencia con la línea editorial. */
2931
- match: number;
2932
- trending: boolean;
2933
- isRead: boolean;
2934
- /** Momento de entrega (epoch ms), como `{ time }` o número. */
2935
- timeStamp?: {
2936
- time: number;
2937
- } | number | null;
2938
- }
2939
-
2940
3130
  export declare type EditorialOpportunityColors = typeof editorialOpportunityColors;
2941
3131
 
2942
3132
  export declare const editorialOpportunityColors: Record<"accent" | "text" | "topicBg" | "topicBorder" | "trending", string>;
@@ -3137,6 +3327,11 @@ export declare const enMessages: {
3137
3327
  readonly defaultWarning: "Please review the request.";
3138
3328
  readonly defaultInfo: "Information";
3139
3329
  };
3330
+ readonly network: {
3331
+ readonly disconnected: "No connection. Check your network or Wi-Fi status. We will retry when the connection is restored.";
3332
+ readonly retrying: "Retrying requests.";
3333
+ readonly restored: "Connection restored.";
3334
+ };
3140
3335
  readonly userAvatar: {
3141
3336
  readonly alt: "User avatar";
3142
3337
  readonly unknownUser: "Unknown user";
@@ -3353,6 +3548,11 @@ export declare const esMessages: {
3353
3548
  defaultWarning: string;
3354
3549
  defaultInfo: string;
3355
3550
  };
3551
+ network: {
3552
+ disconnected: string;
3553
+ retrying: string;
3554
+ restored: string;
3555
+ };
3356
3556
  userAvatar: {
3357
3557
  alt: string;
3358
3558
  unknownUser: string;
@@ -3606,16 +3806,17 @@ export declare const fieldStyles: {
3606
3806
  */
3607
3807
  sxAutocompleteListbox: SxProps<Theme>;
3608
3808
  /**
3609
- * Paper del menú de `CmsSelectField`. Con padding propio para que las opciones
3610
- * queden "embutidas" (hay aire entre el borde del contenedor y el resaltado de
3611
- * cada opción), igual que el diseño de referencia.
3809
+ * Paper del menú de `CmsSelectField`. Menú M3 común a todos los desplegables:
3810
+ * fondo `menuSurface` (#ECEDF6), sin padding lateral (ítems de borde a borde) y
3811
+ * 8px arriba/abajo; `overflow: hidden` recorta las esquinas del hover.
3612
3812
  */
3613
3813
  sxSelectMenuPaper: SxProps<Theme>;
3614
- /** Lista del menú del select (sin padding; el aire lo pone el paper). */
3814
+ /** Lista del menú del select (sin padding ni gap: los ítems van full-bleed). */
3615
3815
  sxSelectList: SxProps<Theme>;
3616
3816
  /**
3617
- * Opción del menú del select: redondeada, hover en `secondaryHover`, activa en
3618
- * `secondary` (y su hover también `secondaryHover`). El check va a la derecha.
3817
+ * Opción del menú del select: full-bleed (sin radio), hover en `neutralHover`
3818
+ * (state layer M3 `onSurface` al 8%, #191C20), activa en `secondary`. El check
3819
+ * va a la derecha.
3619
3820
  */
3620
3821
  sxSelectItem: SxProps<Theme>;
3621
3822
  /** Check de la opción activa del select. */
@@ -3664,14 +3865,13 @@ export declare function findPublicationBySlug(sites: SiteSection[], slug: string
3664
3865
  export declare function findPublicationLabel(sites: SiteSection[], publicationId: string): string;
3665
3866
 
3666
3867
  /**
3667
- * Familias tipográficas del CMS. `roboto` = texto general (default del theme);
3668
- * `productSans` = marca / títulos. Las `@font-face` que las cargan viven en
3669
- * `theme/fonts.ts` y se inyectan vía el provider MUI.
3868
+ * Familias tipográficas del CMS. `googleSans` = fuente única de todo el CMS
3869
+ * (texto, marca y títulos); reemplaza a Roboto y Product Sans. La `@font-face`
3870
+ * que la carga vive en `theme/fonts.ts` y se inyecta vía el provider MUI.
3670
3871
  */
3671
3872
  export declare const fontFamilies: {
3672
- readonly roboto: "\"Roboto\",\"Helvetica\",\"Arial\",sans-serif";
3673
- readonly productSans: "\"Product Sans\",\"Roboto\",\"Helvetica\",\"Arial\",sans-serif";
3674
- /** Monoespaciada (url del toast de error, fragmentos de código). */
3873
+ readonly googleSans: "\"Google Sans\",\"Helvetica\",\"Arial\",sans-serif";
3874
+ /** Monoespaciada (url del toast de error, fragmentos de código). No es de marca. */
3675
3875
  readonly mono: "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace";
3676
3876
  };
3677
3877
 
@@ -3699,17 +3899,19 @@ export declare function getCommonError(errorCode: string | number | Array<string
3699
3899
 
3700
3900
  export declare function getDefaultPublicationSlug(sites: SiteSection[]): string;
3701
3901
 
3902
+ /** Modo efectivo aplicado al sitio a partir de la preferencia. */
3903
+ export declare function getEffectiveThemeMode(pref: ThemePreference): ThemeMode;
3904
+
3702
3905
  /** BCP 47 tag for `Intl` / `toLocaleString` formatting. */
3703
3906
  export declare function getIntlLocaleTag(locale: Locale): string;
3704
3907
 
3705
3908
  /**
3706
- * Oportunidades editoriales copilot QUEMADAS temporales (NAA-4837). El back aún
3707
- * no envía este bloque; cuando lo haga, el gestor pasa las oportunidades reales
3708
- * por la prop `editorialOpportunities` y este mock se elimina.
3709
- *
3710
- * @param now Instante actual (epoch ms) usado como hora de entrega de las cards.
3909
+ * Si un resultado ya devuelto por un server action es un envelope de error con
3910
+ * un código de red (`{ status: 'error', errorCode: 'net.*' }`), devuelve ese
3911
+ * código; si no, `null`. Permite reintentar cuando el fallo de red se detectó
3912
+ * en el servidor (Next→OpenCms) y viajó como `CmsResponse`.
3711
3913
  */
3712
- export declare function getMockCopilotOpportunities(now: number): EditorialOpportunity[];
3914
+ export declare function getNetworkErrorCodeFromResult(result: unknown): NetworkErrorCode | null;
3713
3915
 
3714
3916
  export declare function getProfileAvatarSrc(profile: ProfileGetResponse, options?: ProfileAvatarOptions): string;
3715
3917
 
@@ -4115,6 +4317,9 @@ declare interface ISitesServices {
4115
4317
  authentication: Authentication;
4116
4318
  }
4117
4319
 
4320
+ /** `true` si el código dado es uno de los códigos internos de red. */
4321
+ export declare function isNetworkErrorCode(code: string | null | undefined): boolean;
4322
+
4118
4323
  /**
4119
4324
  * Decide si un ítem es visible según los permisos de operación del usuario.
4120
4325
  *
@@ -4131,6 +4336,9 @@ declare interface ISitesServices {
4131
4336
  */
4132
4337
  export declare function isNewContentItemVisible(item: NewContentItem, operationPermissions: string[] | undefined, isAdmin: boolean | undefined): boolean;
4133
4338
 
4339
+ /** `true` si un código de red debe reintentarse. */
4340
+ export declare function isRetryableNetworkCode(code: string | null | undefined): boolean;
4341
+
4134
4342
  declare interface ITagsServices {
4135
4343
  axiosApi: AxiosInstance;
4136
4344
  authentication: Authentication;
@@ -4265,8 +4473,30 @@ export declare type NavLinkItem = {
4265
4473
  accent?: 'ai';
4266
4474
  /** Si el href apunta al admin legacy (JSP/Angular), se prefija con `legacyBaseUrl`. */
4267
4475
  legacy?: boolean;
4476
+ /**
4477
+ * Si la ruta del Angular master exige el id de publicación al final
4478
+ * (p. ej. `/admin/tags/:idPub`, `/admin/planning/:idPub`), se le agrega
4479
+ * `selectedPublicationId`. Solo aplica junto con `legacy`.
4480
+ */
4481
+ appendPublicationId?: boolean;
4482
+ };
4483
+
4484
+ /** Códigos internos de error de red/servidor (no son del CMS). */
4485
+ export declare const NETWORK_ERROR_CODES: {
4486
+ /** Sin conexión a internet (no se pudo alcanzar el servidor). */
4487
+ readonly offline: "net.offline";
4488
+ /** La petición excedió el timeout. */
4489
+ readonly timeout: "net.timeout";
4490
+ /** El backend no responde (502/503/504). */
4491
+ readonly unavailable: "net.unavailable";
4492
+ /** Error interno del servidor (5xx genérico). */
4493
+ readonly server: "net.server";
4268
4494
  };
4269
4495
 
4496
+ export declare type NetworkErrorCode = (typeof NETWORK_ERROR_CODES)[keyof typeof NETWORK_ERROR_CODES];
4497
+
4498
+ export declare type NetworkMessageKey = keyof CmsMessages['network'];
4499
+
4270
4500
  /** Columna del menú "Nuevo" (Frecuentes / Otros / Videos). */
4271
4501
  export declare type NewContentGroup = {
4272
4502
  /** Clave i18n del título de la columna (namespace `newMenu`). */
@@ -4868,7 +5098,7 @@ export declare interface NotificationsListResponse {
4868
5098
  total?: number;
4869
5099
  }
4870
5100
 
4871
- export declare function NotificationsMenu({ unreadCount, notificationsData, masterBaseUrl, currentPublicationId, gmtRedaction, editorialOpportunities, showEditorialOpportunities, copilotSuggestionsHref, onEditorialSeeMore, }: NotificationsMenuProps): JSX.Element;
5101
+ export declare function NotificationsMenu({ unreadCount, notificationsData, masterBaseUrl, currentPublicationId, gmtRedaction, copilotSuggestionsHref, onEditorialSeeMore, onEditorialRemindLater, }: NotificationsMenuProps): JSX.Element;
4872
5102
 
4873
5103
  export declare type NotificationsMenuMessageKey = keyof CmsMessages['notificationsMenu'];
4874
5104
 
@@ -4884,21 +5114,20 @@ export declare type NotificationsMenuProps = {
4884
5114
  /** Offset GMT de la publicación (para mostrar las fechas en zona de redacción). */
4885
5115
  gmtRedaction?: string | null;
4886
5116
  /**
4887
- * Oportunidades editoriales copilot (card de la campanita, NAA-4837). Si se
4888
- * omite y `showEditorialOpportunities` no es `false`, se usan datos QUEMADOS
4889
- * temporales; cuando el back libere el bloque, el gestor pasa las reales aquí.
4890
- */
4891
- editorialOpportunities?: EditorialOpportunity[];
4892
- /** Muestra la card de oportunidades editoriales copilot. Por defecto `true`. */
4893
- showEditorialOpportunities?: boolean;
4894
- /**
4895
- * URL del gestor de sugerencias copilot para el "Ver más" de la card. La arma
4896
- * el gestor con su deploy (env) + la publicación actual; si se pasa, el "Ver
4897
- * más" es un enlace real (nueva pestaña). Si no, cae al callback.
5117
+ * Destino del "Ver más" / clic en una oportunidad copilot (página de
5118
+ * sugerencias). Lo arma el gestor: URL absoluta al deploy de sugerencias
5119
+ * (env) si estás en otro gestor abre en pestaña nueva; ruta relativa si ya
5120
+ * estás en el gestor de sugerencias → navega en la misma. Sin valor, cae al callback.
4898
5121
  */
4899
5122
  copilotSuggestionsHref?: string;
4900
5123
  /** Clic en "Ver más" cuando no hay `copilotSuggestionsHref` (fallback). */
4901
5124
  onEditorialSeeMore?: () => void;
5125
+ /**
5126
+ * "Recordar luego" de la card de oportunidades: recibe los `opportunity_id` de
5127
+ * las oportunidades mostradas para que el gestor dispare `copilot/snooze` por
5128
+ * cada una. La card se oculta de inmediato (optimista).
5129
+ */
5130
+ onEditorialRemindLater?: (opportunityIds: string[]) => void;
4902
5131
  };
4903
5132
 
4904
5133
  /** Topic devuelto por notification/topics (`{ name, description }`). */
@@ -5993,6 +6222,11 @@ export declare const ptMessages: {
5993
6222
  defaultWarning: string;
5994
6223
  defaultInfo: string;
5995
6224
  };
6225
+ network: {
6226
+ disconnected: string;
6227
+ retrying: string;
6228
+ restored: string;
6229
+ };
5996
6230
  userAvatar: {
5997
6231
  alt: string;
5998
6232
  unknownUser: string;
@@ -6115,6 +6349,12 @@ export declare const radii: {
6115
6349
  readonly pill: "999px";
6116
6350
  };
6117
6351
 
6352
+ /** Modo efectivo leído directo de `localStorage`. SSR-safe. */
6353
+ export declare function readEffectiveThemeMode(): ThemeMode;
6354
+
6355
+ /** Lee la preferencia de `localStorage`. SSR-safe (fallback al default). */
6356
+ export declare function readThemePreference(): ThemePreference;
6357
+
6118
6358
  /** Receta del CMS. La forma exacta depende del recurso y del formato pedido. */
6119
6359
  export declare interface Recipe {
6120
6360
  [key: string]: unknown;
@@ -6280,6 +6520,19 @@ export declare interface RecipesPublishCheckResponse extends CmsResponse {
6280
6520
  [key: string]: unknown;
6281
6521
  }
6282
6522
 
6523
+ export declare type ResilientRunner = <T>(fn: () => Promise<T>, options?: ResilientRunOptions) => Promise<T>;
6524
+
6525
+ export declare interface ResilientRunOptions {
6526
+ /** Servicio/endpoint (para el detalle del toast, si el resultado es error). */
6527
+ service?: string;
6528
+ /** Params de la llamada (para el detalle del toast). */
6529
+ params?: Record<string, unknown>;
6530
+ /** Máximo de reintentos con backoff (fallos de servidor/timeout). Default 3. */
6531
+ maxRetries?: number;
6532
+ /** Mostrar el toast "reintentando" al reanudar tras una desconexión. Default true. */
6533
+ notifyRetry?: boolean;
6534
+ }
6535
+
6283
6536
  export declare function resolveCmsAssetUrl(path: string, cmsOrigin?: string): string;
6284
6537
 
6285
6538
  export declare function resolveCmsOrigin(cmsOrigin?: string): string;
@@ -6423,13 +6676,15 @@ export declare type SelectOption = {
6423
6676
  * importarlo para construir un trigger/menú coherente con el sistema.
6424
6677
  *
6425
6678
  * Reglas de color (todas con variables de `variables.ts`):
6426
- * - Trigger por defecto: borde `controlBorder` (#727784), texto `controlText`
6427
- * (#000) en negrita, fondo transparente; hover → `controlHoverBg` (#F9F9FF).
6679
+ * - Trigger por defecto: borde `m3.outlineVariant` (#C4C6CF), texto `controlText`
6680
+ * (#000) en negrita, fondo transparente; hover → `neutralHover` (state layer
6681
+ * M3 `onSurface` al 8%, #191C20).
6428
6682
  * - Trigger activo (abierto) o resaltado (valor activo): fondo `secondary`
6429
6683
  * (#D8E2FF), sin borde.
6430
- * - Opción del menú: hover → `secondaryHover` (#E1E2EA); seleccionada
6431
- * fondo `secondary` (#D8E2FF). El menú es full-bleed (sin padding lateral ni
6432
- * radio en los ítems): el resaltado llega de borde a borde.
6684
+ * - Opción del menú: hover → `neutralHover` (state layer M3 `onSurface` al 8%,
6685
+ * #191C20); seleccionada → fondo `secondary` (#D8E2FF). El menú es full-bleed
6686
+ * (sin padding lateral ni radio en los ítems): el resaltado llega de borde a
6687
+ * borde, sobre el fondo `menuSurface` (#ECEDF6) común a todos los desplegables.
6433
6688
  */
6434
6689
  export declare const SelectStyles: {
6435
6690
  /**
@@ -6482,7 +6737,7 @@ export declare type SidebarProps = {
6482
6737
  * todo. El anclado se identifica por `item.module` y persiste vía
6483
6738
  * `profileServices.addPins`/`deletePins`/`getPins` (recurso de perfil).
6484
6739
  */
6485
- export declare function SidebarRail({ pathname, permissions, LinkComponent, legacyBaseUrl, items, profileServices, }: SidebarRailProps): JSX.Element;
6740
+ export declare function SidebarRail({ pathname, permissions, LinkComponent, legacyBaseUrl, selectedPublicationId, items, profileServices, }: SidebarRailProps): JSX.Element;
6486
6741
 
6487
6742
  /** Servicio de pines usado por el rail: solo necesita estos tres métodos. */
6488
6743
  export declare type SidebarRailPinService = Pick<CmsProfileServices, 'addPins' | 'deletePins' | 'getPins'>;
@@ -6493,6 +6748,8 @@ export declare type SidebarRailProps = {
6493
6748
  permissions: Array<NavItemPermissions>;
6494
6749
  /** Dominio del admin legacy (JSP/Angular) para prefijar hrefs con `item.legacy`. */
6495
6750
  legacyBaseUrl?: string;
6751
+ /** Id de publicación activa; se agrega a los ítems legacy con `appendPublicationId`. */
6752
+ selectedPublicationId?: string;
6496
6753
  /** Ítems de navegación. Por defecto, `ACCOUNT_NAV_BLOCKS`. */
6497
6754
  items?: NavLinkItem[];
6498
6755
  /**
@@ -6596,8 +6853,8 @@ export declare const sizes: {
6596
6853
  readonly buttonHeight: 40;
6597
6854
  /** Alto de botones/triggers compactos (selector de sitios). */
6598
6855
  readonly buttonHeightSm: 34;
6599
- /** Alto del campo buscador (`CmsSearchField`). */
6600
- readonly searchHeight: 48;
6856
+ /** Alto del campo buscador (`CmsSearchField`): igual al del filtro (`buttonHeight`). */
6857
+ readonly searchHeight: 40;
6601
6858
  };
6602
6859
 
6603
6860
  export declare type SourceColors = typeof sourceColors;
@@ -6830,6 +7087,27 @@ export declare type TextFieldConfig = BaseFieldConfig & {
6830
7087
  type?: 'text' | 'email' | 'url';
6831
7088
  };
6832
7089
 
7090
+ /**
7091
+ * Atributo que MUI togglea en `<html>` (coincide con `colorSchemeSelector` de
7092
+ * `createAppTheme`). Las CSS vars `--cms-*` y `--mui-palette-*` se enganchan acá.
7093
+ */
7094
+ export declare const THEME_COLOR_SCHEME_ATTRIBUTE = "data-mui-color-scheme";
7095
+
7096
+ /** Clave de localStorage para el switch "Tema nuevo". */
7097
+ export declare const THEME_ENABLED_STORAGE_KEY = "cms-theme-enabled";
7098
+
7099
+ /** Clave de localStorage para el modo deseado (`light`/`dark`). */
7100
+ export declare const THEME_MODE_STORAGE_KEY = "cms-theme-mode";
7101
+
7102
+ export declare type ThemeMode = 'light' | 'dark';
7103
+
7104
+ export declare type ThemePreference = {
7105
+ /** Switch "Tema nuevo" del menú Apariencia. Off → se fuerza claro. */
7106
+ enabled: boolean;
7107
+ /** Modo deseado por el usuario (se recuerda aunque `enabled` esté off). */
7108
+ mode: ThemeMode;
7109
+ };
7110
+
6833
7111
  /**
6834
7112
  * Detalle extra que enriquece el toast de error (replica el toast de error del
6835
7113
  * Angular legacy: detalle copiable con url/servicio/params/versión).
@@ -6877,7 +7155,7 @@ export declare interface ToastOptions {
6877
7155
  /** Severidad visual de un toast. */
6878
7156
  export declare type ToastSeverity = 'success' | 'error' | 'warning' | 'info';
6879
7157
 
6880
- export declare function TopBar({ sites, sidebarOpen, onToggleSidebar, notificationUnreadCount, notificationsData, editorialOpportunities, showEditorialOpportunities, copilotSuggestionsHref, onEditorialSeeMore, profile, primaryLogo, brandLogo, selectedPublicationId, getPublicationHref, resolvePublicationImageUrl, profileAvatarOptions, legacyBaseUrl, cmsBaseUrl, legacySession, newContentGroups, previewFormats, operationPermissions, isAdmin, onNewContentSelect, onPreviewSelect, }: TopBarProps): JSX.Element;
7158
+ export declare function TopBar({ sites, sidebarOpen, onToggleSidebar, notificationUnreadCount, notificationsData, copilotSuggestionsHref, onEditorialSeeMore, onEditorialRemindLater, profile, primaryLogo, brandLogo, selectedPublicationId, getPublicationHref, resolvePublicationImageUrl, profileAvatarOptions, legacyBaseUrl, cmsBaseUrl, legacySession, newContentGroups, previewFormats, operationPermissions, isAdmin, onNewContentSelect, onPreviewSelect, }: TopBarProps): JSX.Element;
6881
7159
 
6882
7160
  export declare type TopBarMessageKey = keyof CmsMessages['topBar'];
6883
7161
 
@@ -6889,14 +7167,12 @@ export declare type TopBarProps = {
6889
7167
  notificationUnreadCount: number;
6890
7168
  /** Respuesta cruda de `POST /dashboard/notification` (newsTask/expireTask/videos). */
6891
7169
  notificationsData?: DashboardNotificationsResponse | null;
6892
- /** Oportunidades editoriales copilot (card de la campanita). Si se omite, mock temporal. */
6893
- editorialOpportunities?: EditorialOpportunity[];
6894
- /** Muestra la card de oportunidades editoriales copilot. Por defecto `true`. */
6895
- showEditorialOpportunities?: boolean;
6896
- /** URL del gestor de sugerencias copilot para el "Ver más" (enlace real). */
7170
+ /** Destino del "Ver más" / clic en una oportunidad copilot (página de sugerencias). */
6897
7171
  copilotSuggestionsHref?: string;
6898
7172
  /** Clic en "Ver más" cuando no hay `copilotSuggestionsHref` (fallback). */
6899
7173
  onEditorialSeeMore?: () => void;
7174
+ /** "Recordar luego": recibe los `opportunity_id` mostrados para el snooze. */
7175
+ onEditorialRemindLater?: (opportunityIds: string[]) => void;
6900
7176
  profile: ProfileGetResponse;
6901
7177
  primaryLogo: ReactNode;
6902
7178
  brandLogo?: ReactNode;
@@ -7211,6 +7487,11 @@ export declare interface UploadResponse extends CmsResponse {
7211
7487
  [key: string]: unknown;
7212
7488
  }
7213
7489
 
7490
+ /**
7491
+ * Lee el estado de conectividad. Debe usarse dentro de `<CmsNetworkProvider>`.
7492
+ */
7493
+ export declare function useCmsNetworkStatus(): CmsNetworkContextValue;
7494
+
7214
7495
  /**
7215
7496
  * Hook para disparar toasts. Debe usarse dentro de `CmsToastProvider`.
7216
7497
  */
@@ -7244,7 +7525,7 @@ export declare function useCurrentUserPhoto(): CurrentUserPhotoContextValue | nu
7244
7525
  * nombre y textos traducidos (es/en/pt). Reacciona al cambio de la prop `photo`;
7245
7526
  * para el usuario logueado, reacciona además al `CurrentUserPhotoProvider`.
7246
7527
  */
7247
- export declare function UserAvatar({ photo, description, username, size, showTooltip, cmsOrigin, crossOrigin, isCurrentUser, onClick, testId, }: UserAvatarProps): JSX.Element;
7528
+ export declare function UserAvatar({ photo, description, username, size, showTooltip, inactive, cmsOrigin, crossOrigin, isCurrentUser, onClick, testId, }: UserAvatarProps): JSX.Element;
7248
7529
 
7249
7530
  export declare type UserAvatarMessageKey = keyof CmsMessages['userAvatar'];
7250
7531
 
@@ -7263,6 +7544,11 @@ export declare type UserAvatarProps = {
7263
7544
  size?: number;
7264
7545
  /** Muestra el tooltip con el nombre al pasar el mouse. Por defecto `true`. */
7265
7546
  showTooltip?: boolean;
7547
+ /**
7548
+ * Marca al usuario como inactivo/desactivado: el avatar cae a un gris apagado
7549
+ * (fondo y ícono más grises). Por defecto `false`.
7550
+ */
7551
+ inactive?: boolean;
7266
7552
  /** Origen del CMS para resolver rutas relativas de la foto. */
7267
7553
  cmsOrigin?: string;
7268
7554
  /**
@@ -7282,6 +7568,31 @@ export declare type UserAvatarProps = {
7282
7568
  testId?: string;
7283
7569
  };
7284
7570
 
7571
+ /**
7572
+ * Envuelve la invocación de un server action para hacerla **resiliente a la
7573
+ * red**, replicando el comportamiento del Angular legacy:
7574
+ *
7575
+ * - **Sin internet (usuario offline):** no se pierde la acción. Se espera —sin
7576
+ * consumir reintentos— a que vuelva la conexión y entonces se **retoma el
7577
+ * llamado** automáticamente (muestra "reintentando…").
7578
+ * - **Backend caído / timeout / 5xx (con internet):** reintenta con backoff
7579
+ * exponencial (1s, 2s, 4s, 8s) hasta `maxRetries`; luego devuelve el
7580
+ * resultado de error para que el caller muestre el toast.
7581
+ * - **Error de negocio (4xx / `status:'fail'`):** no reintenta; devuelve el
7582
+ * resultado tal cual para que el caller decida (toast/update optimista).
7583
+ *
7584
+ * El toast global de "sin conexión" / "conexión restablecida" lo dispara
7585
+ * `CmsNetworkToaster`; este hook solo añade el "reintentando…" por acción.
7586
+ *
7587
+ * Uso en el gestor:
7588
+ * ```ts
7589
+ * const run = useResilientAction();
7590
+ * const res = await run(() => setUserStatus(slug, id, action),
7591
+ * { service: '/users/actions/setStatus', params: { id, action } });
7592
+ * ```
7593
+ */
7594
+ export declare function useResilientAction(): ResilientRunner;
7595
+
7285
7596
  /** Grupo del sistema devuelto por POST /users/groups/get. */
7286
7597
  export declare interface UserGroup {
7287
7598
  id: string;
@@ -7816,6 +8127,12 @@ export declare interface WorkpaperStatusResponse extends CmsResponse {
7816
8127
  ediciones: WorkpaperEdition[];
7817
8128
  }
7818
8129
 
8130
+ /**
8131
+ * Guarda la preferencia y refleja el modo efectivo en el atributo de `<html>`
8132
+ * de una (para que el cambio se vea sin recargar). SSR-safe.
8133
+ */
8134
+ export declare function writeThemePreference(pref: ThemePreference): void;
8135
+
7819
8136
  /** Cuerpo de la respuesta de POST /videos/youtube/getThumbnails. */
7820
8137
  export declare interface YoutubeThumbnailsResponse extends CmsResponse {
7821
8138
  [key: string]: unknown;