sass-cms-template-common 0.0.18 → 0.0.19
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 +53 -4
- package/dist/index.js +1753 -1739
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +22 -0
- package/dist/server.js +2 -2
- package/dist/{services-CyMIBZpF.js → services-DiR0yIFz.js} +76 -34
- package/dist/services-DiR0yIFz.js.map +1 -0
- package/package.json +1 -1
- package/dist/services-CyMIBZpF.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/lib/version.ts","../src/lib/theme/material-theme.json","../src/lib/theme/createAppTheme.ts","../src/lib/theme/buttonStyles.ts","../src/lib/theme/selectStyles.ts","../src/lib/theme/fonts/GoogleSans-Regular.woff2","../src/lib/theme/fonts/GoogleSans-Italic.woff2","../src/lib/theme/fonts/GoogleSans-Medium.woff2","../src/lib/theme/fonts/GoogleSans-MediumItalic.woff2","../src/lib/theme/fonts/GoogleSans-Bold.woff2","../src/lib/theme/fonts/GoogleSans-BoldItalic.woff2","../src/lib/theme/fonts.ts","../src/lib/theme/themePreference.ts","../src/lib/i18n/createTranslator.ts","../src/lib/i18n/messages/en.ts","../src/lib/i18n/messages/es.ts","../src/lib/i18n/messages/pt.ts","../src/lib/i18n/messages/index.ts","../src/lib/i18n/types.ts","../src/lib/i18n/normalizeLocale.ts","../src/lib/i18n/CmsI18nProvider.tsx","../src/lib/i18n/useCmsTranslation.ts","../src/lib/components/toast/CmsToast.styles.ts","../src/lib/components/toast/CmsToast.tsx","../src/lib/components/toast/CmsToastProvider.tsx","../src/lib/components/toast/useCmsToast.ts","../src/lib/network/CmsNetworkProvider.tsx","../src/lib/network/useCmsNetworkStatus.ts","../src/lib/network/CmsNetworkToaster.tsx","../src/lib/network/useResilientAction.ts","../src/lib/components/link.tsx","../src/lib/utils/legacy-admin.ts","../src/lib/components/sidebar/nav-helpers.ts","../src/lib/components/sidebar/nav-blocks.ts","../src/lib/components/sidebar/SidebarRail.styles.ts","../src/lib/components/sidebar/SidebarRail.tsx","../src/lib/components/site-selector-menu/SiteSelectorMenu.styles.ts","../src/lib/components/site-selector-menu/SiteSelectorMenu.tsx","../src/lib/components/top-bar/AppearanceMenu.styles.ts","../src/lib/components/top-bar/TopBar.styles.ts","../src/lib/components/top-bar/AppearanceMenu.tsx","../src/lib/components/top-bar/notificationsFeed.ts","../src/lib/components/top-bar/NotificationsMenu.styles.ts","../src/lib/components/top-bar/NotificationsMenu.tsx","../src/lib/components/dropdowns/SimpleDropdown.styles.ts","../src/lib/components/dropdowns/SimpleDropdown.tsx","../src/lib/components/top-bar/previewMenu.config.ts","../src/lib/components/top-bar/PreviewMenu.tsx","../src/lib/utils/cms-asset.ts","../src/lib/utils/profile-avatar.ts","../src/lib/components/user-avatar/UserAvatar.styles.ts","../src/lib/components/user-avatar/CurrentUserPhotoProvider.tsx","../src/lib/components/user-avatar/useCurrentUserPhoto.ts","../src/lib/components/user-avatar/UserAvatar.tsx","../src/lib/components/top-bar/ProfileMenu.tsx","../src/lib/components/top-bar/TopBarClock.tsx","../src/lib/components/top-bar/TopBar.tsx","../src/lib/components/shell/AppShell.styles.ts","../src/lib/components/shell/AppShell.tsx","../src/lib/components/sidebar/Sidebar.styles.ts","../src/lib/components/sidebar/Sidebar.tsx","../src/lib/components/top-bar/newContentMenu.config.ts","../src/lib/components/top-bar/NewContentMenu.styles.ts","../src/lib/components/top-bar/NewContentMenu.tsx","../src/lib/components/error-page/CmsErrorPage.styles.ts","../src/lib/components/error-page/CmsErrorPage.tsx","../src/lib/components/mui-provider/CmsColorSchemeVars.tsx","../src/lib/components/mui-provider/CmsFontFaces.tsx","../src/lib/components/mui-provider/CmsThemeInitScript.tsx","../src/lib/components/mui-provider/CmsThemeModeSync.tsx","../src/lib/components/mui-provider/CmsMuiProvider.tsx","../src/lib/components/mui-provider/NextCmsMuiProvider.tsx","../src/lib/components/dropdowns/BtnDropdown.styles.ts","../src/lib/components/dropdowns/BtnDropdown.tsx","../src/lib/components/dropdowns/SelectDropdown.tsx","../src/lib/components/search/CmsSearchField.styles.ts","../src/lib/components/search/CmsSearchField.tsx","../src/lib/components/empty-state/CmsEmptyState.styles.ts","../src/lib/components/empty-state/CmsEmptyState.tsx","../src/lib/components/filter-bar/CmsFilterBar.styles.ts","../src/lib/components/filter-bar/CmsFilterBar.tsx","../src/lib/components/fields/fieldStyles.ts","../src/lib/components/fields/CmsCheckboxField.tsx","../src/lib/components/fields/FieldShell.tsx","../src/lib/components/fields/CmsComboboxField.tsx","../src/lib/components/fields/CmsDateField.styles.ts","../src/lib/components/fields/CmsDateField.tsx","../src/lib/components/fields/CmsMultiSelectField.tsx","../src/lib/components/fields/CmsNumberField.tsx","../src/lib/components/fields/CmsSelectField.tsx","../src/lib/components/fields/CmsTagsField.tsx","../src/lib/components/fields/CmsTextField.tsx","../src/lib/components/fields/FieldRenderer.tsx","../src/lib/components/advanced-search/CmsAdvancedSearch.styles.ts","../src/lib/components/advanced-search/defaultFields.ts","../src/lib/components/advanced-search/CmsAdvancedSearch.tsx","../src/lib/components/confirm-dialog/CmsConfirmDialog.styles.ts","../src/lib/components/confirm-dialog/CmsDialogActions.styles.ts","../src/lib/components/confirm-dialog/CmsDialogActions.tsx","../src/lib/components/confirm-dialog/CmsConfirmDialog.tsx"],"sourcesContent":["export const LIB_VERSION = '0.0.0' as const\n","{\n \"description\": \"TYPE: CUSTOM\\nMaterial Theme Builder export 2026-05-08 02:18:51\",\n \"seed\": \"#0067C4\",\n \"coreColors\": {\n \"primary\": \"#0067C4\",\n \"secondary\": \"#D8E2FF\",\n \"tertiary\": \"#B4BEDA\"\n },\n \"extendedColors\": [\n {\n \"name\": \"Bluestack color\",\n \"color\": \"#2962FF\",\n \"description\": \"primario de bluestack\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado publicada\",\n \"color\": \"#00C853\",\n \"description\": \"\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado Redaccion\",\n \"color\": \"#0091EA\",\n \"description\": \"\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado frescura\",\n \"color\": \"#30FF5D\",\n \"description\": \"\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado Programado\",\n \"color\": \"#FF6D00\",\n \"description\": \"\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado bloqueada\",\n \"color\": \"#D50000\",\n \"description\": \"\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado borrador\",\n \"color\": \"#FFAB00\",\n \"description\": \"\",\n \"harmonized\": false\n }\n ],\n \"schemes\": {\n \"light\": {\n \"primary\": \"#536dfe\",\n \"surfaceTint\": \"#3E5F90\",\n \"onPrimary\": \"#FFFFFF\",\n \"primaryContainer\": \"#D5E3FF\",\n \"onPrimaryContainer\": \"#254777\",\n \"secondary\": \"#455E91\",\n \"onSecondary\": \"#FFFFFF\",\n \"secondaryContainer\": \"#D8E2FF\",\n \"onSecondaryContainer\": \"#2C4678\",\n \"tertiary\": \"#455E91\",\n \"onTertiary\": \"#FFFFFF\",\n \"tertiaryContainer\": \"#D8E2FF\",\n \"onTertiaryContainer\": \"#2C4678\",\n \"error\": \"#BA1A1A\",\n \"onError\": \"#FFFFFF\",\n \"errorContainer\": \"#FFDAD6\",\n \"onErrorContainer\": \"#93000A\",\n \"background\": \"#F9F9FF\",\n \"onBackground\": \"#191C20\",\n \"surface\": \"#F9F9FF\",\n \"onSurface\": \"#191C20\",\n \"surfaceVariant\": \"#E0E2EC\",\n \"onSurfaceVariant\": \"#43474E\",\n \"outline\": \"#74777F\",\n \"outlineVariant\": \"#C4C6CF\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#2E3035\",\n \"inverseOnSurface\": \"#F0F0F7\",\n \"inversePrimary\": \"#A8C8FF\",\n \"primaryFixed\": \"#D5E3FF\",\n \"onPrimaryFixed\": \"#001B3C\",\n \"primaryFixedDim\": \"#A8C8FF\",\n \"onPrimaryFixedVariant\": \"#254777\",\n \"secondaryFixed\": \"#D8E2FF\",\n \"onSecondaryFixed\": \"#001A42\",\n \"secondaryFixedDim\": \"#AEC6FF\",\n \"onSecondaryFixedVariant\": \"#2C4678\",\n \"tertiaryFixed\": \"#D8E2FF\",\n \"onTertiaryFixed\": \"#001A42\",\n \"tertiaryFixedDim\": \"#AEC6FF\",\n \"onTertiaryFixedVariant\": \"#2C4678\",\n \"surfaceDim\": \"#D9D9E0\",\n \"surfaceBright\": \"#F9F9FF\",\n \"surfaceContainerLowest\": \"#FFFFFF\",\n \"surfaceContainerLow\": \"#F3F3FA\",\n \"surfaceContainer\": \"#ECEDF6\",\n \"surfaceContainerHigh\": \"#E7E8EE\",\n \"surfaceContainerHighest\": \"#E1E2E9\"\n },\n \"light-medium-contrast\": {\n \"primary\": \"#0F3665\",\n \"surfaceTint\": \"#3E5F90\",\n \"onPrimary\": \"#FFFFFF\",\n \"primaryContainer\": \"#4E6EA0\",\n \"onPrimaryContainer\": \"#FFFFFF\",\n \"secondary\": \"#193566\",\n \"onSecondary\": \"#FFFFFF\",\n \"secondaryContainer\": \"#546CA1\",\n \"onSecondaryContainer\": \"#FFFFFF\",\n \"tertiary\": \"#193566\",\n \"onTertiary\": \"#FFFFFF\",\n \"tertiaryContainer\": \"#546CA1\",\n \"onTertiaryContainer\": \"#FFFFFF\",\n \"error\": \"#740006\",\n \"onError\": \"#FFFFFF\",\n \"errorContainer\": \"#CF2C27\",\n \"onErrorContainer\": \"#FFFFFF\",\n \"background\": \"#F9F9FF\",\n \"onBackground\": \"#191C20\",\n \"surface\": \"#F9F9FF\",\n \"onSurface\": \"#0F1116\",\n \"surfaceVariant\": \"#E0E2EC\",\n \"onSurfaceVariant\": \"#33363D\",\n \"outline\": \"#4F525A\",\n \"outlineVariant\": \"#6A6D75\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#2E3035\",\n \"inverseOnSurface\": \"#F0F0F7\",\n \"inversePrimary\": \"#A8C8FF\",\n \"primaryFixed\": \"#4E6EA0\",\n \"onPrimaryFixed\": \"#FFFFFF\",\n \"primaryFixedDim\": \"#345586\",\n \"onPrimaryFixedVariant\": \"#FFFFFF\",\n \"secondaryFixed\": \"#546CA1\",\n \"onSecondaryFixed\": \"#FFFFFF\",\n \"secondaryFixedDim\": \"#3B5487\",\n \"onSecondaryFixedVariant\": \"#FFFFFF\",\n \"tertiaryFixed\": \"#546CA1\",\n \"onTertiaryFixed\": \"#FFFFFF\",\n \"tertiaryFixedDim\": \"#3B5487\",\n \"onTertiaryFixedVariant\": \"#FFFFFF\",\n \"surfaceDim\": \"#C5C6CD\",\n \"surfaceBright\": \"#F9F9FF\",\n \"surfaceContainerLowest\": \"#FFFFFF\",\n \"surfaceContainerLow\": \"#F3F3FA\",\n \"surfaceContainer\": \"#E7E8EE\",\n \"surfaceContainerHigh\": \"#DCDCE3\",\n \"surfaceContainerHighest\": \"#D0D1D8\"\n },\n \"light-high-contrast\": {\n \"primary\": \"#002C5A\",\n \"surfaceTint\": \"#3E5F90\",\n \"onPrimary\": \"#FFFFFF\",\n \"primaryContainer\": \"#274A79\",\n \"onPrimaryContainer\": \"#FFFFFF\",\n \"secondary\": \"#0B2A5B\",\n \"onSecondary\": \"#FFFFFF\",\n \"secondaryContainer\": \"#2E487A\",\n \"onSecondaryContainer\": \"#FFFFFF\",\n \"tertiary\": \"#0C2A5B\",\n \"onTertiary\": \"#FFFFFF\",\n \"tertiaryContainer\": \"#2F487A\",\n \"onTertiaryContainer\": \"#FFFFFF\",\n \"error\": \"#600004\",\n \"onError\": \"#FFFFFF\",\n \"errorContainer\": \"#98000A\",\n \"onErrorContainer\": \"#FFFFFF\",\n \"background\": \"#F9F9FF\",\n \"onBackground\": \"#191C20\",\n \"surface\": \"#F9F9FF\",\n \"onSurface\": \"#000000\",\n \"surfaceVariant\": \"#E0E2EC\",\n \"onSurfaceVariant\": \"#000000\",\n \"outline\": \"#292C33\",\n \"outlineVariant\": \"#464951\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#2E3035\",\n \"inverseOnSurface\": \"#FFFFFF\",\n \"inversePrimary\": \"#A8C8FF\",\n \"primaryFixed\": \"#274A79\",\n \"onPrimaryFixed\": \"#FFFFFF\",\n \"primaryFixedDim\": \"#093361\",\n \"onPrimaryFixedVariant\": \"#FFFFFF\",\n \"secondaryFixed\": \"#2E487A\",\n \"onSecondaryFixed\": \"#FFFFFF\",\n \"secondaryFixedDim\": \"#143162\",\n \"onSecondaryFixedVariant\": \"#FFFFFF\",\n \"tertiaryFixed\": \"#2F487A\",\n \"onTertiaryFixed\": \"#FFFFFF\",\n \"tertiaryFixedDim\": \"#153162\",\n \"onTertiaryFixedVariant\": \"#FFFFFF\",\n \"surfaceDim\": \"#B7B8BF\",\n \"surfaceBright\": \"#F9F9FF\",\n \"surfaceContainerLowest\": \"#FFFFFF\",\n \"surfaceContainerLow\": \"#F0F0F7\",\n \"surfaceContainer\": \"#E1E2E9\",\n \"surfaceContainerHigh\": \"#D3D4DB\",\n \"surfaceContainerHighest\": \"#C5C6CD\"\n },\n \"dark\": {\n \"primary\": \"#A8C8FF\",\n \"surfaceTint\": \"#A8C8FF\",\n \"onPrimary\": \"#05305F\",\n \"primaryContainer\": \"#254777\",\n \"onPrimaryContainer\": \"#D5E3FF\",\n \"secondary\": \"#AEC6FF\",\n \"onSecondary\": \"#112F60\",\n \"secondaryContainer\": \"#2C4678\",\n \"onSecondaryContainer\": \"#D8E2FF\",\n \"tertiary\": \"#AEC6FF\",\n \"onTertiary\": \"#122F60\",\n \"tertiaryContainer\": \"#2C4678\",\n \"onTertiaryContainer\": \"#D8E2FF\",\n \"error\": \"#FFB4AB\",\n \"onError\": \"#690005\",\n \"errorContainer\": \"#93000A\",\n \"onErrorContainer\": \"#FFDAD6\",\n \"background\": \"#111318\",\n \"onBackground\": \"#E1E2E9\",\n \"surface\": \"#111318\",\n \"onSurface\": \"#E1E2E9\",\n \"surfaceVariant\": \"#43474E\",\n \"onSurfaceVariant\": \"#C4C6CF\",\n \"outline\": \"#8E9199\",\n \"outlineVariant\": \"#43474E\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#E1E2E9\",\n \"inverseOnSurface\": \"#2E3035\",\n \"inversePrimary\": \"#3E5F90\",\n \"primaryFixed\": \"#D5E3FF\",\n \"onPrimaryFixed\": \"#001B3C\",\n \"primaryFixedDim\": \"#A8C8FF\",\n \"onPrimaryFixedVariant\": \"#254777\",\n \"secondaryFixed\": \"#D8E2FF\",\n \"onSecondaryFixed\": \"#001A42\",\n \"secondaryFixedDim\": \"#AEC6FF\",\n \"onSecondaryFixedVariant\": \"#2C4678\",\n \"tertiaryFixed\": \"#D8E2FF\",\n \"onTertiaryFixed\": \"#001A42\",\n \"tertiaryFixedDim\": \"#AEC6FF\",\n \"onTertiaryFixedVariant\": \"#2C4678\",\n \"surfaceDim\": \"#111318\",\n \"surfaceBright\": \"#37393E\",\n \"surfaceContainerLowest\": \"#0C0E13\",\n \"surfaceContainerLow\": \"#191C20\",\n \"surfaceContainer\": \"#1D2024\",\n \"surfaceContainerHigh\": \"#282A2F\",\n \"surfaceContainerHighest\": \"#33353A\"\n },\n \"dark-medium-contrast\": {\n \"primary\": \"#CCDDFF\",\n \"surfaceTint\": \"#A8C8FF\",\n \"onPrimary\": \"#00254E\",\n \"primaryContainer\": \"#7292C6\",\n \"onPrimaryContainer\": \"#000000\",\n \"secondary\": \"#CFDCFF\",\n \"onSecondary\": \"#012455\",\n \"secondaryContainer\": \"#7790C7\",\n \"onSecondaryContainer\": \"#000000\",\n \"tertiary\": \"#CFDCFF\",\n \"onTertiary\": \"#022455\",\n \"tertiaryContainer\": \"#7890C7\",\n \"onTertiaryContainer\": \"#000000\",\n \"error\": \"#FFD2CC\",\n \"onError\": \"#540003\",\n \"errorContainer\": \"#FF5449\",\n \"onErrorContainer\": \"#000000\",\n \"background\": \"#111318\",\n \"onBackground\": \"#E1E2E9\",\n \"surface\": \"#111318\",\n \"onSurface\": \"#FFFFFF\",\n \"surfaceVariant\": \"#43474E\",\n \"onSurfaceVariant\": \"#DADCE5\",\n \"outline\": \"#AFB2BB\",\n \"outlineVariant\": \"#8D9099\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#E1E2E9\",\n \"inverseOnSurface\": \"#282A2F\",\n \"inversePrimary\": \"#264878\",\n \"primaryFixed\": \"#D5E3FF\",\n \"onPrimaryFixed\": \"#001129\",\n \"primaryFixedDim\": \"#A8C8FF\",\n \"onPrimaryFixedVariant\": \"#0F3665\",\n \"secondaryFixed\": \"#D8E2FF\",\n \"onSecondaryFixed\": \"#00102E\",\n \"secondaryFixedDim\": \"#AEC6FF\",\n \"onSecondaryFixedVariant\": \"#193566\",\n \"tertiaryFixed\": \"#D8E2FF\",\n \"onTertiaryFixed\": \"#00102E\",\n \"tertiaryFixedDim\": \"#AEC6FF\",\n \"onTertiaryFixedVariant\": \"#193566\",\n \"surfaceDim\": \"#111318\",\n \"surfaceBright\": \"#42444A\",\n \"surfaceContainerLowest\": \"#06070C\",\n \"surfaceContainerLow\": \"#1B1E22\",\n \"surfaceContainer\": \"#26282D\",\n \"surfaceContainerHigh\": \"#303338\",\n \"surfaceContainerHighest\": \"#3B3E43\"\n },\n \"dark-high-contrast\": {\n \"primary\": \"#EAF0FF\",\n \"surfaceTint\": \"#A8C8FF\",\n \"onPrimary\": \"#000000\",\n \"primaryContainer\": \"#A4C4FB\",\n \"onPrimaryContainer\": \"#000B1F\",\n \"secondary\": \"#ECEFFF\",\n \"onSecondary\": \"#000000\",\n \"secondaryContainer\": \"#A9C2FC\",\n \"onSecondaryContainer\": \"#000A23\",\n \"tertiary\": \"#ECEFFF\",\n \"onTertiary\": \"#000000\",\n \"tertiaryContainer\": \"#A9C2FC\",\n \"onTertiaryContainer\": \"#000A23\",\n \"error\": \"#FFECE9\",\n \"onError\": \"#000000\",\n \"errorContainer\": \"#FFAEA4\",\n \"onErrorContainer\": \"#220001\",\n \"background\": \"#111318\",\n \"onBackground\": \"#E1E2E9\",\n \"surface\": \"#111318\",\n \"onSurface\": \"#FFFFFF\",\n \"surfaceVariant\": \"#43474E\",\n \"onSurfaceVariant\": \"#FFFFFF\",\n \"outline\": \"#EEF0F9\",\n \"outlineVariant\": \"#C0C2CC\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#E1E2E9\",\n \"inverseOnSurface\": \"#000000\",\n \"inversePrimary\": \"#264878\",\n \"primaryFixed\": \"#D5E3FF\",\n \"onPrimaryFixed\": \"#000000\",\n \"primaryFixedDim\": \"#A8C8FF\",\n \"onPrimaryFixedVariant\": \"#001129\",\n \"secondaryFixed\": \"#D8E2FF\",\n \"onSecondaryFixed\": \"#000000\",\n \"secondaryFixedDim\": \"#AEC6FF\",\n \"onSecondaryFixedVariant\": \"#00102E\",\n \"tertiaryFixed\": \"#D8E2FF\",\n \"onTertiaryFixed\": \"#000000\",\n \"tertiaryFixedDim\": \"#AEC6FF\",\n \"onTertiaryFixedVariant\": \"#00102E\",\n \"surfaceDim\": \"#111318\",\n \"surfaceBright\": \"#4E5055\",\n \"surfaceContainerLowest\": \"#000000\",\n \"surfaceContainerLow\": \"#1D2024\",\n \"surfaceContainer\": \"#2E3035\",\n \"surfaceContainerHigh\": \"#393B41\",\n \"surfaceContainerHighest\": \"#45474C\"\n }\n },\n \"palettes\": {\n \"primary\": {\n \"0\": \"#000000\",\n \"5\": \"#001129\",\n \"10\": \"#001B3C\",\n \"15\": \"#00264E\",\n \"20\": \"#003061\",\n \"25\": \"#003B75\",\n \"30\": \"#004689\",\n \"35\": \"#00529E\",\n \"40\": \"#005EB3\",\n \"50\": \"#2777D5\",\n \"60\": \"#4A91F1\",\n \"70\": \"#76ACFF\",\n \"80\": \"#A8C8FF\",\n \"90\": \"#D5E3FF\",\n \"95\": \"#ECF1FF\",\n \"98\": \"#F9F9FF\",\n \"99\": \"#FDFBFF\",\n \"100\": \"#FFFFFF\"\n },\n \"secondary\": {\n \"0\": \"#000000\",\n \"5\": \"#061025\",\n \"10\": \"#111B30\",\n \"15\": \"#1B263B\",\n \"20\": \"#263046\",\n \"25\": \"#313B52\",\n \"30\": \"#3D475E\",\n \"35\": \"#48526A\",\n \"40\": \"#545E76\",\n \"50\": \"#6D7790\",\n \"60\": \"#8690AB\",\n \"70\": \"#A1ABC6\",\n \"80\": \"#BCC6E2\",\n \"90\": \"#D8E2FF\",\n \"95\": \"#EDF0FF\",\n \"98\": \"#F9F9FF\",\n \"99\": \"#FEFBFF\",\n \"100\": \"#FFFFFF\"\n },\n \"tertiary\": {\n \"0\": \"#000000\",\n \"5\": \"#061025\",\n \"10\": \"#111B30\",\n \"15\": \"#1B253B\",\n \"20\": \"#263046\",\n \"25\": \"#313B52\",\n \"30\": \"#3D475E\",\n \"35\": \"#48526A\",\n \"40\": \"#545E77\",\n \"50\": \"#6D7790\",\n \"60\": \"#8690AB\",\n \"70\": \"#A1ABC6\",\n \"80\": \"#BCC6E2\",\n \"90\": \"#D8E2FF\",\n \"95\": \"#EDF0FF\",\n \"98\": \"#FAF9FF\",\n \"99\": \"#FEFBFF\",\n \"100\": \"#FFFFFF\"\n },\n \"neutral\": {\n \"0\": \"#000000\",\n \"5\": \"#101114\",\n \"10\": \"#1A1C1E\",\n \"15\": \"#252629\",\n \"20\": \"#2F3033\",\n \"25\": \"#3A3B3E\",\n \"30\": \"#46474A\",\n \"35\": \"#525256\",\n \"40\": \"#5E5E62\",\n \"50\": \"#76777A\",\n \"60\": \"#909094\",\n \"70\": \"#ABABAF\",\n \"80\": \"#C7C6CA\",\n \"90\": \"#E3E2E6\",\n \"95\": \"#F1F0F4\",\n \"98\": \"#FAF9FD\",\n \"99\": \"#FDFBFF\",\n \"100\": \"#FFFFFF\"\n },\n \"neutral-variant\": {\n \"0\": \"#000000\",\n \"5\": \"#0D1117\",\n \"10\": \"#181C22\",\n \"15\": \"#22262D\",\n \"20\": \"#2D3038\",\n \"25\": \"#383B43\",\n \"30\": \"#43474E\",\n \"35\": \"#4F525A\",\n \"40\": \"#5B5E66\",\n \"50\": \"#74777F\",\n \"60\": \"#8E9199\",\n \"70\": \"#A8ABB4\",\n \"80\": \"#C4C6CF\",\n \"90\": \"#E0E2EC\",\n \"95\": \"#EEF0FA\",\n \"98\": \"#F9F9FF\",\n \"99\": \"#FDFBFF\",\n \"100\": \"#FFFFFF\"\n }\n }\n}\n","import { alpha, createTheme } from '@mui/material/styles';\nimport type { PaletteMode, PaletteOptions } from '@mui/material/styles';\n\nimport materialThemeSource from './material-theme.json';\nimport { fontFamilies } from './variables';\n\ntype SchemeDef = (typeof materialThemeSource)['schemes']['light'];\n\nfunction extendedColor(name: string): string | undefined {\n return materialThemeSource.extendedColors.find((e) => e.name === name)?.color;\n}\n\nfunction neutralToGrey(p: (typeof materialThemeSource)['palettes']['neutral']) {\n return {\n 50: p['98'],\n 100: p['95'],\n 200: p['90'],\n 300: p['80'],\n 400: p['70'],\n 500: p['60'],\n 600: p['50'],\n 700: p['40'],\n 800: p['30'],\n 900: p['20'],\n A100: p['90'],\n A200: p['80'],\n A400: p['60'],\n A700: p['40'],\n };\n}\n\nfunction schemeToPalette(mode: PaletteMode, scheme: SchemeDef): PaletteOptions {\n const onSurfaceToken = scheme.onSurface;\n\n return {\n mode,\n primary: {\n main: scheme.primary,\n light: scheme.primaryContainer,\n dark: scheme.onPrimaryContainer,\n contrastText: scheme.onPrimary,\n },\n secondary: {\n main: scheme.secondary,\n light: '#D8E2FF',\n dark: scheme.onSecondaryContainer,\n contrastText: scheme.onSecondary,\n },\n tertiary: {\n main: scheme.tertiary,\n light: scheme.tertiaryContainer,\n dark: scheme.onTertiaryContainer,\n contrastText: scheme.onTertiary,\n },\n error: {\n main: scheme.error,\n light: scheme.errorContainer,\n dark: scheme.onErrorContainer,\n contrastText: scheme.onError,\n },\n warning: {\n main: extendedColor('Estado Programado') ?? '#FF6D00',\n light: '#FF9E40',\n dark: '#C25400',\n contrastText: '#FFFFFF',\n },\n info: {\n main: extendedColor('Estado Redaccion') ?? '#0091EA',\n light: '#64B5F6',\n dark: '#0064B7',\n contrastText: '#FFFFFF',\n },\n success: {\n main: extendedColor('Estado publicada') ?? '#00C853',\n light: '#69F0AE',\n dark: '#009624',\n contrastText: '#FFFFFF',\n },\n brand: {\n main: extendedColor('Bluestack color') ?? '#2962FF',\n },\n text: {\n primary: scheme.onSurface,\n secondary: scheme.onSurfaceVariant,\n disabled: alpha(scheme.onSurface, 0.38),\n },\n divider: scheme.outlineVariant,\n background: {\n default: scheme.background,\n // En claro, `paper` es el blanco base (surfaceContainerLowest). En oscuro,\n // usamos una superficie elevada (surfaceContainerHigh) para que las cards\n // se lean por encima del fondo del shell y no queden \"hundidas\" en negro.\n paper:\n mode === 'dark'\n ? scheme.surfaceContainerHigh\n : scheme.surfaceContainerLowest,\n },\n action: {\n active: alpha(onSurfaceToken, 0.56),\n hover: alpha(onSurfaceToken, mode === 'light' ? 0.04 : 0.08),\n selected: alpha(scheme.primary, 0.12),\n focus: alpha(scheme.primary, 0.12),\n disabled: alpha(onSurfaceToken, 0.26),\n disabledBackground: alpha(onSurfaceToken, 0.12),\n },\n common: {\n black: scheme.shadow,\n white: '#FFFFFF',\n },\n grey: neutralToGrey(materialThemeSource.palettes.neutral),\n m3: {\n surfaceTint: scheme.surfaceTint,\n surfaceDim: scheme.surfaceDim,\n surfaceBright: scheme.surfaceBright,\n surface: scheme.surface,\n surfaceContainerLowest: scheme.surfaceContainerLowest,\n surfaceContainerLow: scheme.surfaceContainerLow,\n surfaceContainer: scheme.surfaceContainer,\n surfaceContainerHigh: scheme.surfaceContainerHigh,\n surfaceContainerHighest: scheme.surfaceContainerHighest,\n outline: scheme.outline,\n outlineVariant: scheme.outlineVariant,\n inverseSurface: scheme.inverseSurface,\n inverseOnSurface: scheme.inverseOnSurface,\n inversePrimary: scheme.inversePrimary,\n onBackground: scheme.onBackground,\n surfaceVariant: scheme.surfaceVariant,\n onSurfaceVariant: scheme.onSurfaceVariant,\n },\n };\n}\n\nexport function createAppTheme() {\n const lightPalette = schemeToPalette(\n 'light',\n materialThemeSource.schemes.light,\n );\n const darkPalette = schemeToPalette('dark', materialThemeSource.schemes.dark);\n\n return createTheme({\n cssVariables: {\n // Atributo explícito y legible: MUI togglea `data-mui-color-scheme=\"dark\"`\n // sobre <html>. Las CSS vars de `variables.ts` se enganchan a ese selector.\n colorSchemeSelector: 'data-mui-color-scheme',\n },\n defaultColorScheme: 'light',\n colorSchemes: {\n light: { palette: lightPalette },\n dark: { palette: darkPalette },\n },\n typography: {\n fontFamily: fontFamilies.googleSans,\n },\n });\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, radii, shadows, sizes } from './variables';\n\n/**\n * Estilos de botón unificados de la librería.\n *\n * Define las dos variantes de botón pill del CMS y las piezas reutilizables\n * (superficie + hover) para que cualquier componente las componga sin repetir\n * colores ni medidas. `BtnDropdown` los usa para su botón principal y su flecha;\n * `sxPillButton` sirve para cualquier botón pill suelto.\n */\n\n/** Variante visual de los botones de la lib. */\nexport type CmsButtonVariant = 'cta' | 'white';\n\n/** Fondo, color de texto y borde según la variante (compartido por todas las piezas). */\nexport function cmsButtonSurface(variant: CmsButtonVariant): SxProps<Theme> {\n if (variant === 'white') {\n return {\n bgcolor: 'm3.surfaceContainerLowest',\n color: cmsColors.whiteBtnText,\n border: '1px solid',\n borderColor: cmsColors.whiteBtnBorder,\n };\n }\n return {\n bgcolor: cmsColors.primary,\n color: cmsColors.white,\n border: 'none',\n borderColor: 'transparent',\n };\n}\n\n/** Color de fondo en hover según la variante. */\nexport function cmsButtonHoverBg(variant: CmsButtonVariant): string {\n return variant === 'cta' ? cmsColors.primaryHover : 'action.hover';\n}\n\n/** Borde divisor (p. ej. entre botón principal y flecha de un split button). */\nexport function cmsButtonDivider(variant: CmsButtonVariant): string {\n return variant === 'white'\n ? cmsColors.whiteBtnBorder\n : 'rgba(255, 255, 255, 0.28)';\n}\n\n/** Botón pill completo y autónomo. Reutilizable en cualquier CTA de la lib. */\nexport function sxPillButton(variant: CmsButtonVariant = 'cta'): SxProps<Theme> {\n return {\n height: sizes.buttonHeight,\n px: '20px',\n borderRadius: radii.pill,\n textTransform: 'none',\n fontSize: 14,\n fontWeight: 500,\n minWidth: 0,\n gap: 1,\n boxShadow: shadows.button,\n ...(cmsButtonSurface(variant) as object),\n '& .MuiSvgIcon-root': { fontSize: 18 },\n '&:hover': {\n boxShadow: shadows.button,\n bgcolor: cmsButtonHoverBg(variant),\n },\n '&.Mui-disabled': {\n bgcolor:\n variant === 'white'\n ? 'm3.surfaceContainerLowest'\n : cmsColors.primaryDisabled,\n color: 'action.disabled',\n },\n };\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii, shadows, sizes } from './variables';\n\n/**\n * Estilos del `SelectDropdown` — el selector tipo \"vista/filtro\" del CMS\n * (mismo patrón visual que el dropdown \"Últimas Noticias\" del diseño).\n *\n * Vive en `theme/` (no junto al componente) porque es parte del set de estilos\n * compartidos y reutilizables: cualquier proyecto que consuma la librería puede\n * importarlo para construir un trigger/menú coherente con el sistema.\n *\n * Reglas de color (todas con variables de `variables.ts`):\n * - Trigger por defecto: borde `m3.outlineVariant` (#C4C6CF), texto `controlText`\n * (#000) en negrita, fondo transparente; hover → `neutralHover` (state layer\n * M3 `onSurface` al 8%, #191C20).\n * - Trigger resaltado (valor activo, `highlighted`): fondo `secondary`\n * (#D8E2FF), sin borde. Abrir el menú NO lo colorea: queda outlined.\n * - Opción del menú: hover → `neutralHover` (state layer M3 `onSurface` al 8%,\n * #191C20); seleccionada → fondo `secondary` (#D8E2FF). El menú es full-bleed\n * (sin padding lateral ni radio en los ítems): el resaltado llega de borde a\n * borde, sobre el fondo `menuSurface` (#ECEDF6) común a todos los desplegables.\n */\nexport const SelectStyles = {\n /**\n * Disparador outlined con label + chevron. Se rellena con `secondary` solo\n * cuando está resaltado (`highlighted`, valor activo); abrir el menú (`open`)\n * NO lo colorea.\n */\n sxTrigger: (highlighted: boolean, open: boolean): SxProps<Theme> => {\n // Solo el valor activo (`highlighted`) colorea el trigger; abrir el menú no.\n const filled = highlighted;\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '10px',\n height: sizes.buttonHeight,\n pl: '16px',\n pr: '10px',\n borderRadius: radii.md,\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n // La negrita va en el input principal, no en la opción activa del menú.\n fontWeight: 600,\n minWidth: 0,\n border: '1px solid',\n color: cmsColors.controlText,\n bgcolor: filled ? cmsColors.secondary : 'transparent',\n // Borde del filtro: 1px solid `m3.outlineVariant` (#C4C6CF).\n borderColor: filled ? 'transparent' : 'm3.outlineVariant',\n '&:hover': {\n // Hover del botón principal del filtro: state layer M3 `onSurface` al 8% (#191C20).\n bgcolor: filled ? cmsColors.secondary : cmsColors.neutralHover,\n borderColor: filled ? 'transparent' : 'm3.outlineVariant',\n },\n '& .sel-lead': {\n display: 'inline-flex',\n },\n '& .sel-lead .MuiSvgIcon-root': { fontSize: 18, width: 18, height: 18 },\n '& .sel-chevron': {\n display: 'inline-flex',\n color: 'm3.onSurfaceVariant',\n transition: 'transform 0.18s ease',\n transform: open ? 'rotate(180deg)' : 'none',\n },\n '& .sel-chevron .MuiSvgIcon-root': { fontSize: 18 },\n };\n },\n\n /** Paper sin padding lateral: los ítems llegan de borde a borde. */\n sxMenuPaper: (minWidth: number | string): SxProps<Theme> => ({\n mt: 0.75,\n py: '8px',\n px: 0,\n minWidth,\n borderRadius: radii.lg,\n bgcolor: cmsColors.menuSurface,\n border: '1px solid',\n borderColor: 'm3.outlineVariant',\n boxShadow: shadows.menuSoft,\n overflow: 'hidden',\n }),\n\n sxList: {\n p: 0,\n display: 'flex',\n flexDirection: 'column',\n } as SxProps<Theme>,\n\n /**\n * Ítem full-bleed (sin radio): hover → `secondaryHover`; activo → `secondary`.\n * Peso normal incluso en la opción activa (la negrita vive en el trigger).\n */\n sxItem: (selected: boolean): SxProps<Theme> => ({\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n px: '16px',\n py: '10px',\n borderRadius: 0,\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 400,\n color: cmsColors.textNav,\n bgcolor: selected ? cmsColors.secondary : 'transparent',\n // El color del ícono lo define cada opción (`iconColor`) desde el\n // componente; acá solo se ajusta el ancho para que pegue al label.\n '& .MuiListItemIcon-root': {\n minWidth: 0,\n },\n '& .MuiSvgIcon-root': { fontSize: 18, width: 18, height: 18 },\n '&:hover': {\n bgcolor: cmsColors.neutralHover,\n },\n '&.Mui-selected': {\n bgcolor: cmsColors.secondary,\n '&:hover': { bgcolor: cmsColors.secondaryHover },\n },\n }),\n};\n","export default \"data:font/woff2;base64,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\"","export default \"data:font/woff2;base64,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\"","export default \"data:font/woff2;base64,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\"","export default \"data:font/woff2;base64,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\"","export default \"data:font/woff2;base64,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\"","export default \"data:font/woff2;base64,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\"","/// <reference types=\"vite/client\" />\n/**\n * Fuente única del CMS Bluestack: **Google Sans**. Reemplaza a Roboto y Product\n * Sans (retiradas). Está **self-hosted** dentro de la lib: los `.woff2` viven en\n * `theme/fonts/` y Vite los inlinea como data URI en el build (ver\n * `assetsInlineLimit` en `vite.config.ts`). Así cada gestor que use el provider\n * MUI hereda la fuente sin CDN ni configuración de `public/`.\n *\n * Los archivos originales eran `.ttf` con cobertura multi-idioma (~2 MB c/u);\n * se subsetearon al **subconjunto latin** (es/en/pt + puntuación/símbolos de UI)\n * y se convirtieron a woff2 (~22-24 KB c/u). Pesos: 400/500/700, normal e italic.\n */\n\n// Google Sans (woff2, subconjunto latin)\nimport GoogleSans400 from './fonts/GoogleSans-Regular.woff2';\nimport GoogleSans400Italic from './fonts/GoogleSans-Italic.woff2';\nimport GoogleSans500 from './fonts/GoogleSans-Medium.woff2';\nimport GoogleSans500Italic from './fonts/GoogleSans-MediumItalic.woff2';\nimport GoogleSans700 from './fonts/GoogleSans-Bold.woff2';\nimport GoogleSans700Italic from './fonts/GoogleSans-BoldItalic.woff2';\n\n/**\n * Reglas `@font-face` de Google Sans, listas para inyectarse como estilos\n * globales (ver el componente `CmsFontFaces`).\n */\nexport const cmsFontFaces = `\n@font-face {\n font-family: 'Google Sans';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(${GoogleSans400}) format('woff2');\n}\n@font-face {\n font-family: 'Google Sans';\n font-style: italic;\n font-weight: 400;\n font-display: swap;\n src: url(${GoogleSans400Italic}) format('woff2');\n}\n@font-face {\n font-family: 'Google Sans';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(${GoogleSans500}) format('woff2');\n}\n@font-face {\n font-family: 'Google Sans';\n font-style: italic;\n font-weight: 500;\n font-display: swap;\n src: url(${GoogleSans500Italic}) format('woff2');\n}\n@font-face {\n font-family: 'Google Sans';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(${GoogleSans700}) format('woff2');\n}\n@font-face {\n font-family: 'Google Sans';\n font-style: italic;\n font-weight: 700;\n font-display: swap;\n src: url(${GoogleSans700Italic}) format('woff2');\n}\n`;\n","// Preferencia de tema (claro/oscuro) persistida en `localStorage`.\n//\n// Mecanismo compartido: vive en la lib para que TODOS los gestores persistan y\n// lean el tema igual. El dato es por gestor (localStorage está aislado por\n// origen: elegir \"oscuro\" en un gestor NO se propaga a los demás dominios).\n//\n// Dos dimensiones, para recordar tal cual la selección del menú \"Apariencia\":\n// - `enabled`: switch \"Tema nuevo\". Apagado → se fuerza claro.\n// - `mode`: modo deseado (`light`/`dark`), se recuerda aunque `enabled` esté off.\n// El \"modo efectivo\" que se aplica al sitio = `enabled ? mode : 'light'`.\n//\n// Funciones puras que solo tocan `localStorage`/DOM (sin React ni MUI), así\n// funcionan aunque el gestor tenga su propia copia de @mui symlinkeada.\n\nexport type ThemeMode = 'light' | 'dark';\n\nexport type ThemePreference = {\n /** Switch \"Tema nuevo\" del menú Apariencia. Off → se fuerza claro. */\n enabled: boolean;\n /** Modo deseado por el usuario (se recuerda aunque `enabled` esté off). */\n mode: ThemeMode;\n};\n\n/** Clave de localStorage para el modo deseado (`light`/`dark`). */\nexport const THEME_MODE_STORAGE_KEY = 'cms-theme-mode';\n/** Clave de localStorage para el switch \"Tema nuevo\". */\nexport const THEME_ENABLED_STORAGE_KEY = 'cms-theme-enabled';\n/**\n * Atributo que MUI togglea en `<html>` (coincide con `colorSchemeSelector` de\n * `createAppTheme`). Las CSS vars `--cms-*` y `--mui-palette-*` se enganchan acá.\n */\nexport const THEME_COLOR_SCHEME_ATTRIBUTE = 'data-mui-color-scheme';\n\n/** Preferencia por defecto (sin nada guardado): tema nuevo activo, modo claro. */\nexport const DEFAULT_THEME_PREFERENCE: ThemePreference = {\n enabled: true,\n mode: 'light',\n};\n\n/** Modo efectivo aplicado al sitio a partir de la preferencia. */\nexport function getEffectiveThemeMode(pref: ThemePreference): ThemeMode {\n return pref.enabled && pref.mode === 'dark' ? 'dark' : 'light';\n}\n\n/** Lee la preferencia de `localStorage`. SSR-safe (fallback al default). */\nexport function readThemePreference(): ThemePreference {\n if (typeof window === 'undefined') return DEFAULT_THEME_PREFERENCE;\n try {\n const rawMode = window.localStorage.getItem(THEME_MODE_STORAGE_KEY);\n const rawEnabled = window.localStorage.getItem(THEME_ENABLED_STORAGE_KEY);\n return {\n mode: rawMode === 'dark' ? 'dark' : 'light',\n enabled: rawEnabled === null ? true : rawEnabled === 'true',\n };\n } catch {\n return DEFAULT_THEME_PREFERENCE;\n }\n}\n\n/** Modo efectivo leído directo de `localStorage`. SSR-safe. */\nexport function readEffectiveThemeMode(): ThemeMode {\n return getEffectiveThemeMode(readThemePreference());\n}\n\n/**\n * Guarda la preferencia y refleja el modo efectivo en el atributo de `<html>`\n * de una (para que el cambio se vea sin recargar). SSR-safe.\n */\nexport function writeThemePreference(pref: ThemePreference): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(THEME_MODE_STORAGE_KEY, pref.mode);\n window.localStorage.setItem(\n THEME_ENABLED_STORAGE_KEY,\n String(pref.enabled),\n );\n document.documentElement.setAttribute(\n THEME_COLOR_SCHEME_ATTRIBUTE,\n getEffectiveThemeMode(pref),\n );\n } catch {\n // Sin storage (modo privado / bloqueado): el tema simplemente no persiste.\n }\n}\n","import type {\n AppMessageNode,\n AppMessages,\n CmsMessages,\n ErrorPageMessageKey,\n NavigationModule,\n NetworkMessageKey,\n NewMenuMessageKey,\n NotificationsMenuMessageKey,\n PreviewMenuMessageKey,\n ProfileMenuMessageKey,\n SidebarMessageKey,\n ToastMessageKey,\n TopBarMessageKey,\n UserAvatarMessageKey,\n} from './types';\n\n/** Parámetros de interpolación para placeholders `{nombre}` en un mensaje. */\nexport type TranslationParams = Record<string, string | number>;\n\n/** Traductor genérico de claves del gestor por ruta con puntos (`ns.clave`). */\nexport type AppTranslate = (path: string, params?: TranslationParams) => string;\n\nexport type CmsTranslator = {\n messages: CmsMessages;\n /** Árbol de mensajes del gestor ya resuelto al locale activo (con fallback en). */\n appMessages: AppMessages;\n navigation: (module: NavigationModule | string) => string;\n sidebar: (key: SidebarMessageKey) => string;\n topBar: (key: TopBarMessageKey) => string;\n newMenu: (key: NewMenuMessageKey) => string;\n previewMenu: (key: PreviewMenuMessageKey) => string;\n profileMenu: (key: ProfileMenuMessageKey) => string;\n notificationsMenu: (\n key: NotificationsMenuMessageKey,\n params?: { count?: number },\n ) => string;\n toast: (key: ToastMessageKey) => string;\n network: (key: NetworkMessageKey) => string;\n userAvatar: (key: UserAvatarMessageKey) => string;\n errorPage: (key: ErrorPageMessageKey) => string;\n /**\n * Resuelve una clave propia del gestor por ruta con puntos\n * (p. ej. `t.app('usuarios.modal.deactivate.title')`). Si falta, devuelve la\n * ruta tal cual (útil para detectar claves ausentes en desarrollo).\n */\n app: AppTranslate;\n /**\n * Devuelve un traductor del gestor con un namespace fijado:\n * `const tu = t.scoped('usuarios'); tu('modal.deactivate.title')`.\n */\n scoped: (namespace: string) => AppTranslate;\n};\n\nfunction interpolate(template: string, params?: TranslationParams): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n const value = params[key];\n return value === undefined ? `{${key}}` : String(value);\n });\n}\n\n/** Navega un árbol de mensajes del gestor por ruta con puntos. */\nfunction resolveAppPath(tree: AppMessages, path: string): string | undefined {\n let node: AppMessageNode | undefined = tree;\n for (const segment of path.split('.')) {\n if (typeof node !== 'object' || node === null) return undefined;\n node = node[segment];\n }\n return typeof node === 'string' ? node : undefined;\n}\n\nexport function createTranslator(\n messages: CmsMessages,\n appMessages: AppMessages = {},\n): CmsTranslator {\n const navigationLookup = messages.navigation as Record<string, string>;\n\n const app: AppTranslate = (path, params) => {\n const value = resolveAppPath(appMessages, path);\n return value === undefined ? path : interpolate(value, params);\n };\n\n return {\n messages,\n appMessages,\n navigation: (module) => navigationLookup[module] ?? module,\n sidebar: (key) => messages.sidebar[key],\n topBar: (key) => messages.topBar[key],\n newMenu: (key) => messages.newMenu[key],\n previewMenu: (key) => messages.previewMenu[key],\n profileMenu: (key) => messages.profileMenu[key],\n notificationsMenu: (key, params) =>\n interpolate(messages.notificationsMenu[key], params),\n toast: (key) => messages.toast[key],\n network: (key) => messages.network[key],\n userAvatar: (key) => messages.userAvatar[key],\n errorPage: (key) => messages.errorPage[key],\n app,\n scoped: (namespace) => (path, params) => app(`${namespace}.${path}`, params),\n };\n}\n","export const enMessages = {\n navigation: {\n COMMENTS: 'Comments',\n POLLS: 'Polls',\n MEDIA: 'Media',\n AUDIOS: 'Audio',\n IMAGES: 'Images',\n PLAYLISTS: 'Playlist',\n VIDEOS: 'Videos',\n NEWS: 'News',\n PLANNING: 'Planning',\n ANALYTICS: 'Analytics',\n TAGS: 'Tags',\n TRIVIAS: 'Trivia',\n OTHERS: 'Other',\n NEWSWIRES: 'News Wires',\n EVENTS: 'Events',\n PAGES: 'Pages',\n FEEDS: 'Feed',\n PERSONS: 'People',\n CONTRIBUTIONS: 'Contributions',\n RECIPES: 'Recipes',\n POSTS: 'Posts',\n BANNERS: 'Banners',\n BLOCKS: 'Blocks',\n MENUS: 'Menu',\n TOPICS: 'Topics',\n ADVANCEDQUERYS: 'Advanced search',\n IMPORTS: 'Imports',\n NEWSLETTERS: 'Newsletters',\n NOTIFICATIONS: 'Notifications',\n PAYMENTS: 'Payments',\n PLANS: 'Plans',\n REPORTS: 'Reports',\n SECTIONS: 'Sections',\n TWITTERS: 'Twitter Feeds',\n USERS: 'Users',\n ZONES: 'Zones',\n IA: 'IA',\n },\n sidebar: {\n navAriaLabel: 'Main navigation',\n collapse: 'Collapse',\n expand: 'Expand',\n newBadge: 'New',\n pin: 'Pin to top',\n unpin: 'Unpin',\n },\n topBar: {\n openSidebar: 'Open sidebar menu',\n closeSidebar: 'Close sidebar menu',\n new: 'New',\n language: 'Language',\n analytics: 'Analytics',\n preview: 'Preview',\n help: 'Help',\n publication: 'Publication',\n appearance: 'Appearance',\n newTheme: 'New theme',\n newThemeSubtitle: 'Redesigned interface',\n modeLabel: 'Mode',\n modeLight: 'Light',\n modeDark: 'Dark',\n classicUnavailable: 'The classic view is not available in this prototype.',\n },\n newMenu: {\n frequentsTitle: 'Frequent',\n othersTitle: 'Others',\n videosTitle: 'Videos',\n post: 'New Post',\n trivia: 'New Trivia',\n poll: 'New Poll',\n listicle: 'New Listicle',\n tag: 'New Tag',\n gamecast: 'New Gamecast',\n liveblog: 'New LiveBlog',\n aiPost: 'New AI Post',\n aiListicle: 'New AI Listicle',\n videoNative: 'New Video Native',\n videoEmbedded: 'New Video Embedded',\n videoYoutube: 'New Video Youtube',\n },\n previewMenu: {\n desktop: 'Preview Desktop',\n mobile: 'Preview Mobile',\n tablet: 'Preview Tablet',\n },\n profileMenu: {\n ariaLabel: 'My profile',\n myProfile: 'My Profile',\n webmasterView: 'Webmaster View',\n signOff: 'Sign off',\n },\n notificationsMenu: {\n title: 'Notifications',\n unreadCount: '{count} unread',\n empty: 'No notifications',\n ariaLabel: 'Notifications',\n close: 'Close',\n today: 'Today',\n yesterday: 'Yesterday',\n assignedBefore: 'You have',\n assignedAfter: 'new assigned topics.',\n pendingBefore: 'You have',\n pendingAfter: 'assigned topics about to expire.',\n assignedToday: 'Assigned today',\n assignedYesterday: 'Assigned yesterday',\n assignedOn: 'Assigned on',\n expires: 'Due',\n unassignedText: 'You are no longer responsible for the task',\n unassignedRemovedYouFrom: 'removed you from the task',\n unassignedNoLongerResponsible: 'You are no longer responsible.',\n editorialOpportunityLabel: 'Editorial opportunity',\n editorialOpportunityText: '{count} topics require your attention',\n editorialOpportunityTop: 'Top',\n editorialOpportunityMatch: 'Match',\n editorialOpportunityTrending: 'Trending',\n editorialOpportunitySeeMoreOpportunities: 'See {count} more opportunities',\n editorialOpportunityHide: 'Hide',\n editorialOpportunityRemindLater: 'Remind me later',\n editorialOpportunitySeeMore: 'See more',\n },\n search: {\n placeholder: 'Search…',\n addPlaceholder: 'Add…',\n inputAriaLabel: 'Search',\n clearAriaLabel: 'Clear search',\n removeChipAriaLabel: 'Remove term',\n advancedAriaLabel: 'Advanced search',\n title: 'Advanced search',\n apply: 'Apply',\n reset: 'Reset',\n close: 'Close',\n noOptions: 'No matches',\n dateToday: 'Today',\n dateClear: 'Clear',\n dateOpenAriaLabel: 'Open calendar',\n prevMonthAriaLabel: 'Previous month',\n nextMonthAriaLabel: 'Next month',\n },\n searchFields: {\n text: 'Text',\n textPlaceholder: 'Title, summary or body',\n type: 'Type',\n typePlaceholder: 'All types',\n section: 'Section',\n sectionPlaceholder: 'All sections',\n category: 'Category',\n categoryPlaceholder: 'All categories',\n states: 'Statuses',\n statesPlaceholder: 'All statuses',\n creator: 'Creator',\n creatorPlaceholder: 'Type to search a creator',\n author: 'Author',\n authorPlaceholder: 'Type to search an author',\n tags: 'Tags',\n tagsPlaceholder: 'Type and press Enter',\n groups: 'Groups',\n groupsPlaceholder: 'All groups',\n amount: 'Amount to show',\n amountPlaceholder: 'e.g. 50',\n dateFrom: 'Date from',\n dateTo: 'Date to',\n sortBy: 'Sort by',\n sortByPlaceholder: 'Relevance',\n zone: 'Zone',\n zonePlaceholder: 'Any zone',\n priority: 'Priority',\n priorityPlaceholder: 'All',\n order: 'Order',\n orderPlaceholder: 'Descending',\n includeDrafts: 'Include drafts',\n includeHistory: 'Include historical content',\n },\n searchOptions: {\n typeNews: 'Article',\n typeList: 'List note',\n typeLiveblog: 'LiveBlog',\n statePublished: 'Published',\n stateDraft: 'In drafting',\n stateScheduled: 'Scheduled',\n stateReview: 'In review',\n stateDone: 'Finished',\n sortRelevance: 'Relevance',\n sortDate: 'Date',\n sortTitle: 'Title',\n orderDesc: 'Descending',\n orderAsc: 'Ascending',\n priorityHigh: 'High (1–10)',\n priorityMid: 'Medium (11–30)',\n priorityLow: 'Low (31+)',\n },\n toast: {\n close: 'Close',\n copyDetail: 'Copy error detail',\n copied: 'Copied',\n defaultSuccess: 'Operation completed successfully.',\n defaultError: 'An error occurred in the service.',\n defaultWarning: 'Please review the request.',\n defaultInfo: 'Information',\n },\n network: {\n disconnected:\n 'No connection. Check your network or Wi-Fi status. We will retry when the connection is restored.',\n retrying: 'Retrying requests.',\n restored: 'Connection restored.',\n },\n userAvatar: {\n alt: 'User avatar',\n unknownUser: 'Unknown user',\n },\n errorPage: {\n homeButton: 'Home',\n notFoundTitle: 'Sorry an error occurred.',\n notFoundSubtitle: 'This website is no longer available. Keep browsing!',\n notFoundCode: '404',\n errorLabel: 'Error',\n copyDetail: 'Copy detail.',\n copyDetailText:\n 'The route {url} you are trying to access is no longer available.',\n copied: 'Text copied to clipboard!',\n notAllowedTitle: 'Sorry.\\nYou do not have access.',\n notAllowedSubtitle:\n 'What you want to see is restricted by permissions. Keep browsing!',\n },\n} as const;\n","import type { CmsMessages } from '../types';\n\nexport const esMessages = {\n navigation: {\n COMMENTS: 'Comentarios',\n POLLS: 'Encuestas',\n MEDIA: 'Media',\n AUDIOS: 'Audio',\n IMAGES: 'Imágenes',\n PLAYLISTS: 'Playlist',\n VIDEOS: 'Videos',\n NEWS: 'Noticias',\n PLANNING: 'Planificación',\n ANALYTICS: 'Analíticas',\n TAGS: 'Tags',\n TRIVIAS: 'Trivias',\n OTHERS: 'Otros',\n NEWSWIRES: 'News Wires',\n EVENTS: 'Eventos',\n PAGES: 'Páginas',\n FEEDS: 'Feed',\n PERSONS: 'Personas',\n CONTRIBUTIONS: 'Contribuciones',\n RECIPES: 'Recetas',\n POSTS: 'Posts',\n BANNERS: 'Banners',\n BLOCKS: 'Bloques',\n MENUS: 'Menú',\n TOPICS: 'Temas',\n ADVANCEDQUERYS: 'Búsqueda avanzada',\n IMPORTS: 'Importaciones',\n NEWSLETTERS: 'Newsletters',\n NOTIFICATIONS: 'Notificaciones',\n PAYMENTS: 'Pagos',\n PLANS: 'Planes',\n REPORTS: 'Reportes',\n SECTIONS: 'Secciones',\n TWITTERS: 'Twitter Feeds',\n USERS: 'Usuarios',\n ZONES: 'Zonas',\n IA: 'IA',\n },\n sidebar: {\n navAriaLabel: 'Principal',\n collapse: 'Contraer',\n expand: 'Expandir',\n newBadge: 'Nuevo',\n pin: 'Anclar arriba',\n unpin: 'Desanclar',\n },\n topBar: {\n openSidebar: 'Abrir menú lateral',\n closeSidebar: 'Cerrar menú lateral',\n new: 'Nuevo',\n language: 'Idioma',\n analytics: 'Analíticas',\n preview: 'Previsualizar',\n help: 'Ayuda',\n publication: 'Publicación',\n appearance: 'Apariencia',\n newTheme: 'Tema nuevo',\n newThemeSubtitle: 'Interfaz rediseñada',\n modeLabel: 'Modo',\n modeLight: 'Claro',\n modeDark: 'Oscuro',\n classicUnavailable: 'La vista clásica no está disponible en este prototipo.',\n },\n newMenu: {\n frequentsTitle: 'Frecuentes',\n othersTitle: 'Otros',\n videosTitle: 'Videos',\n post: 'Nueva Nota',\n trivia: 'Nueva Trivia',\n poll: 'Nueva Encuesta',\n listicle: 'Nueva Nota Lista',\n tag: 'Nuevo Tag',\n gamecast: 'Nuevo Gamecast',\n liveblog: 'Nuevo LiveBlog',\n aiPost: 'Nueva Nota IA',\n aiListicle: 'Nueva Lista IA',\n videoNative: 'Nuevo Video Nativo',\n videoEmbedded: 'Nuevo Video Embebido',\n videoYoutube: 'Nuevo Video Youtube',\n },\n previewMenu: {\n desktop: 'Previsualizar Escritorio',\n mobile: 'Previsualizar Móvil',\n tablet: 'Previsualizar Tablet',\n },\n profileMenu: {\n ariaLabel: 'Mi perfil',\n myProfile: 'Mi perfil',\n webmasterView: 'Vista Webmaster',\n signOff: 'Cerrar sesión',\n },\n notificationsMenu: {\n title: 'Notificaciones',\n unreadCount: '{count} sin leer',\n empty: 'No hay notificaciones',\n ariaLabel: 'Notificaciones',\n close: 'Cerrar',\n today: 'Hoy',\n yesterday: 'Ayer',\n assignedBefore: 'Tienes',\n assignedAfter: 'nuevos temas asignados.',\n pendingBefore: 'Tienes',\n pendingAfter: 'temas asignados por vencer.',\n assignedToday: 'Asignado hoy',\n assignedYesterday: 'Asignado ayer',\n assignedOn: 'Asignado el',\n expires: 'Vence',\n unassignedText: 'Ya no eres responsable de la tarea',\n unassignedRemovedYouFrom: 'te quitó de la tarea',\n unassignedNoLongerResponsible: 'Ya no eres el responsable.',\n editorialOpportunityLabel: 'Oportunidad editorial',\n editorialOpportunityText: '{count} temas requieren tu atención',\n editorialOpportunityTop: 'Top',\n editorialOpportunityMatch: 'Coincidencia',\n editorialOpportunityTrending: 'Trending',\n editorialOpportunitySeeMoreOpportunities: 'Ver {count} oportunidades más',\n editorialOpportunityHide: 'Ocultar',\n editorialOpportunityRemindLater: 'Recordar luego',\n editorialOpportunitySeeMore: 'Ver más',\n },\n search: {\n placeholder: 'Buscar…',\n addPlaceholder: 'Agregar…',\n inputAriaLabel: 'Buscar',\n clearAriaLabel: 'Borrar búsqueda',\n removeChipAriaLabel: 'Quitar término',\n advancedAriaLabel: 'Búsqueda avanzada',\n title: 'Búsqueda avanzada',\n apply: 'Aplicar',\n reset: 'Restablecer',\n close: 'Cerrar',\n noOptions: 'Sin coincidencias',\n dateToday: 'Hoy',\n dateClear: 'Limpiar',\n dateOpenAriaLabel: 'Abrir calendario',\n prevMonthAriaLabel: 'Mes anterior',\n nextMonthAriaLabel: 'Mes siguiente',\n },\n searchFields: {\n text: 'Texto',\n textPlaceholder: 'Título, copete o cuerpo',\n type: 'Tipo',\n typePlaceholder: 'Todos los tipos',\n section: 'Sección',\n sectionPlaceholder: 'Todas las secciones',\n category: 'Categoría',\n categoryPlaceholder: 'Todas las categorías',\n states: 'Estados',\n statesPlaceholder: 'Todos los estados',\n creator: 'Creador',\n creatorPlaceholder: 'Escribí para buscar creador',\n author: 'Autor',\n authorPlaceholder: 'Escribí para buscar autor',\n tags: 'Etiquetas',\n tagsPlaceholder: 'Escribí y presioná Enter',\n groups: 'Grupos',\n groupsPlaceholder: 'Todos los grupos',\n amount: 'Cantidad a mostrar',\n amountPlaceholder: 'Ej: 50',\n dateFrom: 'Fecha desde',\n dateTo: 'Fecha hasta',\n sortBy: 'Ordenar por',\n sortByPlaceholder: 'Relevancia',\n zone: 'Zona',\n zonePlaceholder: 'Cualquier zona',\n priority: 'Prioridad',\n priorityPlaceholder: 'Todas',\n order: 'Orden',\n orderPlaceholder: 'Descendente',\n includeDrafts: 'Incluir borradores',\n includeHistory: 'Incluir contenido histórico',\n },\n searchOptions: {\n typeNews: 'Noticia',\n typeList: 'Nota Lista',\n typeLiveblog: 'LiveBlog',\n statePublished: 'Publicada',\n stateDraft: 'En Redacción',\n stateScheduled: 'Programada',\n stateReview: 'En Revisión',\n stateDone: 'Terminada',\n sortRelevance: 'Relevancia',\n sortDate: 'Fecha',\n sortTitle: 'Título',\n orderDesc: 'Descendente',\n orderAsc: 'Ascendente',\n priorityHigh: 'Alta (1–10)',\n priorityMid: 'Media (11–30)',\n priorityLow: 'Baja (31+)',\n },\n toast: {\n close: 'Cerrar',\n copyDetail: 'Copiar detalle del error',\n copied: 'Copiado',\n defaultSuccess: 'Operación realizada correctamente.',\n defaultError: 'Se produjo un error en el servicio.',\n defaultWarning: 'Revisá el requerimiento.',\n defaultInfo: 'Información',\n },\n network: {\n disconnected:\n 'Sin conexión. Revisa tu red o el estado del Wi-Fi. Reintentaremos cuando se restablezca.',\n retrying: 'Reintentando solicitudes.',\n restored: 'Conexión restablecida.',\n },\n userAvatar: {\n alt: 'Avatar de usuario',\n unknownUser: 'Usuario sin nombre',\n },\n errorPage: {\n homeButton: 'Inicio',\n notFoundTitle: 'Lo sentimos.\\nHa ocurrido un error.',\n notFoundSubtitle:\n 'Lo que quieres ver ya no está disponible. ¡Sigue navegando!',\n notFoundCode: '404',\n errorLabel: 'Error',\n copyDetail: 'Copiar detalle.',\n copyDetailText:\n 'La ruta {url} donde estás intentando acceder ya no está disponible.',\n copied: '¡Texto copiado en el portapapeles!',\n notAllowedTitle: 'Lo sentimos.\\nNo tienes acceso.',\n notAllowedSubtitle:\n 'Lo que quieres ver está restringido por permisos. ¡Sigue navegando!',\n },\n} satisfies CmsMessages;\n","import type { CmsMessages } from '../types';\n\nexport const ptMessages = {\n navigation: {\n COMMENTS: 'Comentários',\n POLLS: 'Enquetes',\n MEDIA: 'Mídia',\n AUDIOS: 'Áudio',\n IMAGES: 'Imagens',\n PLAYLISTS: 'Playlist',\n VIDEOS: 'Vídeos',\n NEWS: 'Notícias',\n PLANNING: 'Planejamento',\n ANALYTICS: 'Análises',\n TAGS: 'Tags',\n TRIVIAS: 'Trivias',\n OTHERS: 'Outros',\n NEWSWIRES: 'News Wires',\n EVENTS: 'Eventos',\n PAGES: 'Páginas',\n FEEDS: 'Feed',\n PERSONS: 'Pessoas',\n CONTRIBUTIONS: 'Contribuições',\n RECIPES: 'Receitas',\n POSTS: 'Posts',\n BANNERS: 'Banners',\n BLOCKS: 'Blocos',\n MENUS: 'Menu',\n TOPICS: 'Tópicos',\n ADVANCEDQUERYS: 'Busca avançada',\n IMPORTS: 'Importações',\n NEWSLETTERS: 'Newsletters',\n NOTIFICATIONS: 'Notificações',\n PAYMENTS: 'Pagamentos',\n PLANS: 'Planos',\n REPORTS: 'Relatórios',\n SECTIONS: 'Seções',\n TWITTERS: 'Twitter Feeds',\n USERS: 'Usuários',\n ZONES: 'Zonas',\n IA: 'IA',\n },\n sidebar: {\n navAriaLabel: 'Principal',\n collapse: 'Recolher',\n expand: 'Expandir',\n newBadge: 'Novo',\n pin: 'Fixar no topo',\n unpin: 'Desafixar',\n },\n topBar: {\n openSidebar: 'Abrir menu lateral',\n closeSidebar: 'Fechar menu lateral',\n new: 'Novo',\n language: 'Idioma',\n analytics: 'Análises',\n preview: 'Pré-visualizar',\n help: 'Ajuda',\n publication: 'Publicação',\n appearance: 'Aparência',\n newTheme: 'Tema novo',\n newThemeSubtitle: 'Interface redesenhada',\n modeLabel: 'Modo',\n modeLight: 'Claro',\n modeDark: 'Escuro',\n classicUnavailable: 'A visualização clássica não está disponível neste protótipo.',\n },\n newMenu: {\n frequentsTitle: 'Frequentes',\n othersTitle: 'Outros',\n videosTitle: 'Vídeos',\n post: 'Nova Matéria',\n trivia: 'Novo Quiz',\n poll: 'Nova Enquete',\n listicle: 'Nova Lista',\n tag: 'Nova Tag',\n gamecast: 'Novo Gamecast',\n liveblog: 'Novo LiveBlog',\n aiPost: 'Nova Matéria IA',\n aiListicle: 'Nova Lista IA',\n videoNative: 'Novo Vídeo Nativo',\n videoEmbedded: 'Novo Vídeo Incorporado',\n videoYoutube: 'Novo Vídeo Youtube',\n },\n previewMenu: {\n desktop: 'Pré-visualizar Desktop',\n mobile: 'Pré-visualizar Celular',\n tablet: 'Pré-visualizar Tablet',\n },\n profileMenu: {\n ariaLabel: 'Meu perfil',\n myProfile: 'Meu perfil',\n webmasterView: 'Visão Webmaster',\n signOff: 'Sair',\n },\n notificationsMenu: {\n title: 'Notificações',\n unreadCount: '{count} não lidas',\n empty: 'Nenhuma notificação',\n ariaLabel: 'Notificações',\n close: 'Fechar',\n today: 'Hoje',\n yesterday: 'Ontem',\n assignedBefore: 'Você tem',\n assignedAfter: 'novos temas atribuídos.',\n pendingBefore: 'Você tem',\n pendingAfter: 'temas atribuídos a vencer.',\n assignedToday: 'Atribuído hoje',\n assignedYesterday: 'Atribuído ontem',\n assignedOn: 'Atribuído em',\n expires: 'Vence',\n unassignedText: 'Você já não é responsável pela tarefa',\n unassignedRemovedYouFrom: 'removeu você da tarefa',\n unassignedNoLongerResponsible: 'Você já não é responsável.',\n editorialOpportunityLabel: 'Oportunidade editorial',\n editorialOpportunityText: '{count} temas exigem sua atenção',\n editorialOpportunityTop: 'Top',\n editorialOpportunityMatch: 'Correspondência',\n editorialOpportunityTrending: 'Em alta',\n editorialOpportunitySeeMoreOpportunities: 'Ver mais {count} oportunidades',\n editorialOpportunityHide: 'Ocultar',\n editorialOpportunityRemindLater: 'Lembrar depois',\n editorialOpportunitySeeMore: 'Ver mais',\n },\n search: {\n placeholder: 'Buscar…',\n addPlaceholder: 'Adicionar…',\n inputAriaLabel: 'Buscar',\n clearAriaLabel: 'Limpar busca',\n removeChipAriaLabel: 'Remover termo',\n advancedAriaLabel: 'Busca avançada',\n title: 'Busca avançada',\n apply: 'Aplicar',\n reset: 'Redefinir',\n close: 'Fechar',\n noOptions: 'Sem correspondências',\n dateToday: 'Hoje',\n dateClear: 'Limpar',\n dateOpenAriaLabel: 'Abrir calendário',\n prevMonthAriaLabel: 'Mês anterior',\n nextMonthAriaLabel: 'Mês seguinte',\n },\n searchFields: {\n text: 'Texto',\n textPlaceholder: 'Título, resumo ou corpo',\n type: 'Tipo',\n typePlaceholder: 'Todos os tipos',\n section: 'Seção',\n sectionPlaceholder: 'Todas as seções',\n category: 'Categoria',\n categoryPlaceholder: 'Todas as categorias',\n states: 'Estados',\n statesPlaceholder: 'Todos os estados',\n creator: 'Criador',\n creatorPlaceholder: 'Digite para buscar um criador',\n author: 'Autor',\n authorPlaceholder: 'Digite para buscar um autor',\n tags: 'Etiquetas',\n tagsPlaceholder: 'Digite e pressione Enter',\n groups: 'Grupos',\n groupsPlaceholder: 'Todos os grupos',\n amount: 'Quantidade a mostrar',\n amountPlaceholder: 'Ex: 50',\n dateFrom: 'Data de',\n dateTo: 'Data até',\n sortBy: 'Ordenar por',\n sortByPlaceholder: 'Relevância',\n zone: 'Zona',\n zonePlaceholder: 'Qualquer zona',\n priority: 'Prioridade',\n priorityPlaceholder: 'Todas',\n order: 'Ordem',\n orderPlaceholder: 'Decrescente',\n includeDrafts: 'Incluir rascunhos',\n includeHistory: 'Incluir conteúdo histórico',\n },\n searchOptions: {\n typeNews: 'Notícia',\n typeList: 'Nota Lista',\n typeLiveblog: 'LiveBlog',\n statePublished: 'Publicada',\n stateDraft: 'Em redação',\n stateScheduled: 'Programada',\n stateReview: 'Em revisão',\n stateDone: 'Concluída',\n sortRelevance: 'Relevância',\n sortDate: 'Data',\n sortTitle: 'Título',\n orderDesc: 'Decrescente',\n orderAsc: 'Crescente',\n priorityHigh: 'Alta (1–10)',\n priorityMid: 'Média (11–30)',\n priorityLow: 'Baixa (31+)',\n },\n toast: {\n close: 'Fechar',\n copyDetail: 'Copiar detalhe do erro',\n copied: 'Copiado',\n defaultSuccess: 'Operação realizada com sucesso.',\n defaultError: 'Ocorreu um erro no serviço.',\n defaultWarning: 'Revise a solicitação.',\n defaultInfo: 'Informação',\n },\n network: {\n disconnected:\n 'Sem conexão. Verifique sua rede ou o status do Wi-Fi. Tentaremos novamente quando a conexão for restabelecida.',\n retrying: 'Tentando pedidos novamente.',\n restored: 'Conexão restabelecida.',\n },\n userAvatar: {\n alt: 'Avatar do usuário',\n unknownUser: 'Usuário sem nome',\n },\n errorPage: {\n homeButton: 'Início',\n notFoundTitle: 'Desculpe, ocorreu um erro.',\n notFoundSubtitle: 'Este site não está mais disponível. Continue navegando!',\n notFoundCode: '404',\n errorLabel: 'Erro',\n copyDetail: 'Copiar detalhe.',\n copyDetailText:\n 'A rota {url} que você está tentando acessar não está mais disponível.',\n copied: 'Texto copiado para a área de transferência!',\n notAllowedTitle: 'Sentimos muito.\\nVocê não tem acesso.',\n notAllowedSubtitle:\n 'O que você deseja ver é restrito por permissões. Continue navegando!',\n },\n} satisfies CmsMessages;\n","import type {\n AppLocaleCatalog,\n AppMessageNode,\n AppMessages,\n CmsMessages,\n CmsMessagesOverride,\n Locale,\n LocaleCatalog,\n} from '../types';\nimport { enMessages } from './en';\nimport { esMessages } from './es';\nimport { ptMessages } from './pt';\n\nexport { enMessages, esMessages, ptMessages };\n\nexport const defaultLocaleCatalog: LocaleCatalog = {\n en: enMessages,\n es: esMessages,\n pt: ptMessages,\n};\n\nfunction mergeNamespace<T extends Record<string, string>>(\n base: T,\n override?: Partial<T>,\n): T {\n if (!override) return base;\n return { ...base, ...override };\n}\n\n/** Deep-merge custom overrides on top of the locale catalog entry. */\nexport function mergeMessages(\n locale: Locale,\n catalog: LocaleCatalog,\n overrides?: CmsMessagesOverride,\n): CmsMessages {\n const base = catalog[locale];\n const fallback = catalog.en;\n\n return {\n navigation: mergeNamespace(\n { ...fallback.navigation, ...base.navigation },\n overrides?.navigation,\n ),\n sidebar: mergeNamespace(\n { ...fallback.sidebar, ...base.sidebar },\n overrides?.sidebar,\n ),\n topBar: mergeNamespace({ ...fallback.topBar, ...base.topBar }, overrides?.topBar),\n newMenu: mergeNamespace(\n { ...fallback.newMenu, ...base.newMenu },\n overrides?.newMenu,\n ),\n previewMenu: mergeNamespace(\n { ...fallback.previewMenu, ...base.previewMenu },\n overrides?.previewMenu,\n ),\n profileMenu: mergeNamespace(\n { ...fallback.profileMenu, ...base.profileMenu },\n overrides?.profileMenu,\n ),\n notificationsMenu: mergeNamespace(\n { ...fallback.notificationsMenu, ...base.notificationsMenu },\n overrides?.notificationsMenu,\n ),\n search: mergeNamespace(\n { ...fallback.search, ...base.search },\n overrides?.search,\n ),\n searchFields: mergeNamespace(\n { ...fallback.searchFields, ...base.searchFields },\n overrides?.searchFields,\n ),\n searchOptions: mergeNamespace(\n { ...fallback.searchOptions, ...base.searchOptions },\n overrides?.searchOptions,\n ),\n toast: mergeNamespace({ ...fallback.toast, ...base.toast }, overrides?.toast),\n network: mergeNamespace(\n { ...fallback.network, ...base.network },\n overrides?.network,\n ),\n userAvatar: mergeNamespace(\n { ...fallback.userAvatar, ...base.userAvatar },\n overrides?.userAvatar,\n ),\n errorPage: mergeNamespace(\n { ...fallback.errorPage, ...base.errorPage },\n overrides?.errorPage,\n ),\n };\n}\n\n/** Deep-merge recursivo de dos árboles de mensajes del gestor (override gana). */\nfunction deepMergeAppNode(base: AppMessageNode, override: AppMessageNode): AppMessageNode {\n // Si alguno es hoja (string), el override reemplaza directamente.\n if (typeof base === 'string' || typeof override === 'string') {\n return override;\n }\n const result: Record<string, AppMessageNode> = { ...base };\n for (const key of Object.keys(override)) {\n const overrideChild = override[key];\n result[key] =\n key in base ? deepMergeAppNode(base[key], overrideChild) : overrideChild;\n }\n return result;\n}\n\n/**\n * Resuelve el árbol de mensajes del gestor para el locale activo, usando `en`\n * como fallback (igual criterio que `mergeMessages`). Devuelve `{}` si no se\n * pasó catálogo del gestor.\n */\nexport function mergeAppMessages(\n locale: Locale,\n appCatalog?: AppLocaleCatalog,\n): AppMessages {\n if (!appCatalog) return {};\n const fallback = appCatalog.en ?? {};\n const base = appCatalog[locale] ?? {};\n return deepMergeAppNode(fallback, base) as AppMessages;\n}\n","import type { enMessages } from './messages/en';\n\nexport const SUPPORTED_LOCALES = ['es', 'en', 'pt'] as const;\n\nexport type Locale = (typeof SUPPORTED_LOCALES)[number];\n\nexport const DEFAULT_LOCALE: Locale = 'en';\n\ntype DeepStringMap<T> = {\n [K in keyof T]: T[K] extends Record<string, unknown>\n ? { [K2 in keyof T[K]]: string }\n : string;\n};\n\n/** Message tree shape; values are strings, keys are inferred from `enMessages`. */\nexport type CmsMessages = DeepStringMap<typeof enMessages>;\n\nexport type NavigationModule = keyof CmsMessages['navigation'];\n\nexport type SidebarMessageKey = keyof CmsMessages['sidebar'];\n\nexport type TopBarMessageKey = keyof CmsMessages['topBar'];\n\nexport type NewMenuMessageKey = keyof CmsMessages['newMenu'];\n\nexport type PreviewMenuMessageKey = keyof CmsMessages['previewMenu'];\n\nexport type ProfileMenuMessageKey = keyof CmsMessages['profileMenu'];\n\nexport type NotificationsMenuMessageKey = keyof CmsMessages['notificationsMenu'];\n\nexport type ToastMessageKey = keyof CmsMessages['toast'];\n\nexport type NetworkMessageKey = keyof CmsMessages['network'];\n\nexport type UserAvatarMessageKey = keyof CmsMessages['userAvatar'];\n\nexport type ErrorPageMessageKey = keyof CmsMessages['errorPage'];\n\n/** Partial override tree; missing keys fall back to the active locale, then `en`. */\nexport type CmsMessagesOverride = {\n [Namespace in keyof CmsMessages]?: Partial<CmsMessages[Namespace]>;\n};\n\nexport type LocaleCatalog = Record<Locale, CmsMessages>;\n\n/**\n * Nodo de un árbol de mensajes propio de un gestor: una hoja string o un\n * sub-árbol anidable. Permite namespaces arbitrarios (`usuarios.*`, etc.)\n * que la lib desconoce.\n */\nexport type AppMessageNode = string | { [key: string]: AppMessageNode };\n\n/** Árbol de mensajes del gestor (namespaces → claves → string anidable). */\nexport type AppMessages = Record<string, AppMessageNode>;\n\n/**\n * Catálogo de mensajes del gestor por idioma. Cada gestor declara su propio\n * `en` como fuente de la forma y valida `es`/`pt` con `satisfies typeof enTree`\n * para garantizar que las tres lenguas comparten las mismas claves.\n */\nexport type AppLocaleCatalog = Record<Locale, AppMessages>;\n","import { DEFAULT_LOCALE, SUPPORTED_LOCALES, type Locale } from './types';\n\n/** Normaliza códigos BCP 47 o variantes (`es-MX`, `pt_BR`) al `Locale` soportado. */\nexport function normalizeLocale(value?: string | null): Locale {\n if (!value) return DEFAULT_LOCALE;\n\n const normalized = value.trim().toLowerCase().replace('_', '-');\n const primary = normalized.split('-')[0];\n\n if ((SUPPORTED_LOCALES as readonly string[]).includes(normalized)) {\n return normalized as Locale;\n }\n\n if ((SUPPORTED_LOCALES as readonly string[]).includes(primary)) {\n return primary as Locale;\n }\n\n return DEFAULT_LOCALE;\n}\n","'use client';\n\nimport { createContext, useMemo, type ReactNode } from 'react';\n\nimport { createTranslator, type CmsTranslator } from './createTranslator';\nimport { defaultLocaleCatalog, mergeAppMessages, mergeMessages } from './messages';\nimport { normalizeLocale } from './normalizeLocale';\nimport type {\n AppLocaleCatalog,\n CmsMessagesOverride,\n Locale,\n LocaleCatalog,\n} from './types';\n\nexport type CmsI18nContextValue = {\n locale: Locale;\n t: CmsTranslator;\n};\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CmsI18nContext = createContext<CmsI18nContextValue | null>(null);\n\nexport type CmsI18nProviderProps = {\n locale?: Locale | string;\n /** Alias de `locale` (p. ej. consumidores que pasan `language=\"es\"`). */\n language?: Locale | string;\n messages?: CmsMessagesOverride;\n catalog?: LocaleCatalog;\n /** Catálogo de mensajes propio del gestor (namespaces libres, es/en/pt). */\n appMessages?: AppLocaleCatalog;\n children: ReactNode;\n};\n\nexport function CmsI18nProvider({\n locale,\n language,\n messages,\n catalog = defaultLocaleCatalog,\n appMessages,\n children,\n}: CmsI18nProviderProps) {\n const resolvedLocale = normalizeLocale(locale ?? language);\n\n const value = useMemo<CmsI18nContextValue>(() => {\n const resolvedMessages = mergeMessages(resolvedLocale, catalog, messages);\n const resolvedAppMessages = mergeAppMessages(resolvedLocale, appMessages);\n return {\n locale: resolvedLocale,\n t: createTranslator(resolvedMessages, resolvedAppMessages),\n };\n }, [appMessages, catalog, messages, resolvedLocale]);\n\n return <CmsI18nContext.Provider value={value}>{children}</CmsI18nContext.Provider>;\n}\n","'use client';\n\nimport { useContext, useMemo } from 'react';\n\nimport { CmsI18nContext } from './CmsI18nProvider';\nimport { createTranslator } from './createTranslator';\nimport { defaultLocaleCatalog, mergeAppMessages, mergeMessages } from './messages';\nimport type {\n AppLocaleCatalog,\n CmsMessagesOverride,\n Locale,\n LocaleCatalog,\n} from './types';\nimport { DEFAULT_LOCALE } from './types';\n\nexport type UseCmsTranslationOptions = {\n locale?: Locale;\n messages?: CmsMessagesOverride;\n catalog?: LocaleCatalog;\n /** Catálogo propio del gestor cuando se usa el hook fuera del provider. */\n appMessages?: AppLocaleCatalog;\n};\n\nexport function useCmsTranslation(options?: UseCmsTranslationOptions) {\n const context = useContext(CmsI18nContext);\n\n const locale = options?.locale ?? context?.locale ?? DEFAULT_LOCALE;\n const catalog = options?.catalog ?? defaultLocaleCatalog;\n const overrides = options?.messages;\n const appCatalog = options?.appMessages;\n\n const t = useMemo(() => {\n if (!overrides && !appCatalog && context && context.locale === locale) {\n return context.t;\n }\n return createTranslator(\n mergeMessages(locale, catalog, overrides),\n mergeAppMessages(locale, appCatalog),\n );\n }, [appCatalog, catalog, context, locale, overrides]);\n\n return { locale, t };\n}\n\n/** BCP 47 tag for `Intl` / `toLocaleString` formatting. */\nexport function getIntlLocaleTag(locale: Locale): string {\n switch (locale) {\n case 'pt':\n return 'pt-BR';\n case 'en':\n return 'en-US';\n case 'es':\n default:\n return 'es-MX';\n }\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport {\n feedbackBadgeColors,\n feedbackColors,\n fontFamilies,\n radii,\n} from '../../theme/variables';\nimport type { ToastSeverity } from './types';\n\nexport const CmsToastStyles = {\n /** Contenedor fijo que apila los toasts (abajo y centrado). */\n sxStack: {\n position: 'fixed',\n bottom: 16,\n left: 0,\n right: 0,\n px: 2,\n zIndex: (theme: Theme) => theme.zIndex.snackbar,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 1.25,\n pointerEvents: 'none',\n } as SxProps<Theme>,\n\n /** Toast compacto (success / warning / info). */\n sxToast: {\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: 1.25,\n minWidth: 300,\n maxWidth: 420,\n px: 2,\n py: 1.5,\n borderRadius: radii.lg,\n bgcolor: feedbackColors.surface,\n color: feedbackColors.onSurface,\n boxShadow: '0 8px 24px rgba(0, 0, 0, 0.35)',\n } as SxProps<Theme>,\n\n /** Toast de error: más grande, en columna, con detalle copiable. */\n sxToastError: {\n pointerEvents: 'auto',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n gap: 1,\n minWidth: 360,\n maxWidth: 560,\n width: '100%',\n p: 2.5,\n borderRadius: radii.lg,\n bgcolor: feedbackColors.surface,\n color: feedbackColors.onSurface,\n boxShadow: '0 8px 24px rgba(0, 0, 0, 0.35)',\n } as SxProps<Theme>,\n\n /** Fila superior del toast de error (ícono + título + cerrar). */\n sxErrorHeader: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 1.25,\n } as SxProps<Theme>,\n\n sxTextWrap: {\n flex: 1,\n minWidth: 0,\n } as SxProps<Theme>,\n\n sxTitle: {\n fontWeight: 600,\n fontSize: 14,\n lineHeight: 1.3,\n } as SxProps<Theme>,\n\n sxMessage: {\n fontSize: 14,\n lineHeight: 1.4,\n whiteSpace: 'pre-line',\n } as SxProps<Theme>,\n\n /** Título del toast de error. */\n sxErrorTitle: {\n fontFamily: fontFamilies.googleSans,\n fontWeight: 700,\n fontSize: 16,\n lineHeight: 1.3,\n // Separa del mensaje solo cuando hay título (no siempre existe).\n mb: '10px',\n } as SxProps<Theme>,\n\n /** Descripción del toast de error (sin fondo). */\n sxErrorMessage: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n color: feedbackColors.onSurfaceSoft,\n lineHeight: 1.4,\n whiteSpace: 'pre-line',\n // La descripción no lleva margen; el respiro sobre el título lo da su mb.\n margin: '0 !important',\n } as SxProps<Theme>,\n\n /** Detalle crudo del servidor (solo si el servicio devolvió texto de error). */\n sxDetail: {\n mt: '10px',\n p: 1,\n borderRadius: radii.sm,\n bgcolor: feedbackColors.overlay,\n color: feedbackColors.onSurfaceMuted,\n fontFamily: fontFamilies.googleSans,\n fontSize: 12.5,\n lineHeight: 1.4,\n wordBreak: 'break-word',\n } as SxProps<Theme>,\n\n /** Enlace (url del recurso) sobre la superficie oscura (monoespaciada). */\n sxLink: {\n display: 'block',\n mt: '10px',\n color: feedbackColors.link,\n fontFamily: fontFamilies.mono,\n fontSize: 11.5,\n lineHeight: 1.4,\n textDecoration: 'none',\n wordBreak: 'break-all',\n '&:hover': { textDecoration: 'underline' },\n } as SxProps<Theme>,\n\n /** Fila inferior: chip de versión + punto + fecha. */\n sxFooter: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n mt: '10px',\n color: feedbackColors.onSurfaceSoft,\n fontFamily: fontFamilies.googleSans,\n fontSize: 11,\n lineHeight: 1.4,\n } as SxProps<Theme>,\n\n /** Chip con la versión (ícono de etiqueta + vX.Y.Z). */\n sxVersionChip: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n px: 0.75,\n py: 0.25,\n borderRadius: radii.pill,\n bgcolor: feedbackColors.versionChipBg,\n color: feedbackColors.onSurfaceSoft,\n fontFamily: fontFamilies.googleSans,\n fontSize: 11,\n fontWeight: 600,\n '& svg': { fontSize: 13 },\n } as SxProps<Theme>,\n\n /** Punto separador entre versión y fecha. */\n sxDot: {\n flexShrink: 0,\n width: '3px',\n height: '3px',\n borderRadius: '50%',\n bgcolor: feedbackColors.separator,\n } as SxProps<Theme>,\n\n sxClose: {\n color: feedbackColors.onSurfaceMuted,\n p: 0.5,\n '&:hover': { color: feedbackColors.onSurface },\n } as SxProps<Theme>,\n\n sxCopyButton: {\n color: feedbackColors.onSurfaceMuted,\n p: 0.5,\n flexShrink: 0,\n '&:hover': { color: feedbackColors.onSurface },\n } as SxProps<Theme>,\n};\n\n/** Estilo del círculo de ícono (contenedor tonal + ícono por severidad). */\nexport function sxIconBadge(severity: ToastSeverity): SxProps<Theme> {\n const badge = feedbackBadgeColors[severity];\n return {\n flexShrink: 0,\n width: 28,\n height: 28,\n borderRadius: '50%',\n display: 'grid',\n placeItems: 'center',\n bgcolor: badge.bg,\n color: badge.on,\n '& svg': { fontSize: 18 },\n };\n}\n","'use client';\n\nimport { useState } from 'react';\n\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport CloseIcon from '@mui/icons-material/Close';\nimport ContentCopyOutlinedIcon from '@mui/icons-material/ContentCopyOutlined';\nimport DoneIcon from '@mui/icons-material/Done';\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutlineOutlined';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\nimport LocalOfferOutlinedIcon from '@mui/icons-material/LocalOfferOutlined';\nimport ReportProblemOutlinedIcon from '@mui/icons-material/ReportProblemOutlined';\n\nimport type { CmsTranslator } from '../../i18n/createTranslator';\nimport { CmsToastStyles, sxIconBadge } from './CmsToast.styles';\nimport type { ToastItem, ToastSeverity } from './types';\n\nconst ICONS: Record<ToastSeverity, typeof DoneIcon> = {\n success: DoneIcon,\n warning: ReportProblemOutlinedIcon,\n error: ErrorOutlineIcon,\n info: InfoOutlinedIcon,\n};\n\nexport interface CmsToastProps {\n item: ToastItem;\n t: CmsTranslator;\n /** Tag BCP 47 para formatear la fecha del detalle del error. */\n localeTag: string;\n /** Versión a mostrar en el detalle del error (app o lib). */\n appVersion: string;\n onClose: (id: string) => void;\n}\n\n/**\n * Construye el texto copiable del toast de error, con el mismo formato que el\n * Angular legacy (`Message / Error / Url / Service / Params / Version`).\n */\nfunction buildCopyText(\n message: string,\n item: ToastItem,\n url: string,\n version: string,\n dateTime: string,\n): string {\n const detail = item.detail;\n return [\n `Message: ${message}`,\n detail?.error ? `Error: ${detail.error}` : null,\n `Url: ${url}`,\n detail?.service ? `Service: ${detail.service}` : null,\n detail?.params !== undefined\n ? `Params: ${JSON.stringify(detail.params)}`\n : null,\n `Version: v${version} ${dateTime}`,\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\nexport function CmsToast({\n item,\n t,\n localeTag,\n appVersion,\n onClose,\n}: CmsToastProps) {\n const Icon = ICONS[item.severity];\n const [copied, setCopied] = useState(false);\n\n // Url y fecha se capturan una vez al montar el toast (no en cada render).\n const [meta] = useState(() => ({\n url: typeof window !== 'undefined' ? window.location.href : '',\n dateTime: new Date().toLocaleString(localeTag),\n }));\n\n const handleCopy = () => {\n const text = buildCopyText(\n item.message,\n item,\n meta.url,\n appVersion,\n meta.dateTime,\n );\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(text).then(\n () => {\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1500);\n },\n () => undefined,\n );\n }\n };\n\n const badge = (\n <Box sx={sxIconBadge(item.severity)} aria-hidden>\n <Icon />\n </Box>\n );\n\n const closeButton = (\n <IconButton\n data-testid=\"btn-toast-close\"\n size=\"small\"\n aria-label={t.toast('close')}\n onClick={() => onClose(item.id)}\n sx={CmsToastStyles.sxClose}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n );\n\n const copyButton = (\n <Tooltip title={copied ? t.toast('copied') : t.toast('copyDetail')}>\n <IconButton\n data-testid=\"btn-toast-copy\"\n size=\"small\"\n aria-label={t.toast('copyDetail')}\n onClick={handleCopy}\n sx={CmsToastStyles.sxCopyButton}>\n {copied ? (\n <DoneIcon fontSize=\"small\" />\n ) : (\n <ContentCopyOutlinedIcon fontSize=\"small\" />\n )}\n </IconButton>\n </Tooltip>\n );\n\n // Toast de error: más grande, con url del recurso, versión y botón copiar.\n if (item.severity === 'error') {\n return (\n <Box\n data-testid={`toast-${item.severity}`}\n data-severity={item.severity}\n sx={CmsToastStyles.sxToastError}\n role=\"alert\">\n <Box sx={CmsToastStyles.sxErrorHeader}>\n {badge}\n <Box sx={CmsToastStyles.sxTextWrap}>\n {item.title ? (\n <Box sx={CmsToastStyles.sxErrorTitle}>{item.title}</Box>\n ) : null}\n <Box sx={CmsToastStyles.sxErrorMessage}>{item.message}</Box>\n\n {item.detail?.error ? (\n <Box sx={CmsToastStyles.sxDetail}>{item.detail.error}</Box>\n ) : null}\n\n {meta.url ? (\n <Box component=\"a\" href={meta.url} sx={CmsToastStyles.sxLink}>\n {meta.url}\n </Box>\n ) : null}\n\n <Box sx={CmsToastStyles.sxFooter}>\n <Box component=\"span\" sx={CmsToastStyles.sxVersionChip}>\n <LocalOfferOutlinedIcon />v{appVersion}\n </Box>\n <Box sx={CmsToastStyles.sxDot} />\n <Box component=\"span\">{meta.dateTime}</Box>\n </Box>\n </Box>\n {copyButton}\n {closeButton}\n </Box>\n </Box>\n );\n }\n\n // Toast compacto (success / warning / info): click en cualquier parte cierra.\n return (\n <Box\n data-testid={`toast-${item.severity}`}\n data-severity={item.severity}\n sx={{ ...CmsToastStyles.sxToast, cursor: 'pointer' }}\n role=\"status\"\n onClick={() => onClose(item.id)}>\n {badge}\n <Box sx={CmsToastStyles.sxTextWrap}>\n {item.title ? <Box sx={CmsToastStyles.sxTitle}>{item.title}</Box> : null}\n <Box sx={CmsToastStyles.sxMessage}>{item.message}</Box>\n </Box>\n {closeButton}\n </Box>\n );\n}\n","'use client';\n\nimport {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\n\nimport Box from '@mui/material/Box';\n\nimport type { CmsTranslator } from '../../i18n/createTranslator';\nimport { normalizeLocale } from '../../i18n/normalizeLocale';\nimport type { Locale } from '../../i18n/types';\nimport { useCmsTranslation } from '../../i18n/useCmsTranslation';\nimport { LIB_VERSION } from '../../version';\nimport { CmsToast } from './CmsToast';\nimport { CmsToastStyles } from './CmsToast.styles';\nimport type { ToastItem } from './types';\n\nexport interface CmsToastContextValue {\n /** Encola un toast ya normalizado. Devuelve su id. */\n enqueue: (item: Omit<ToastItem, 'id'>) => string;\n /** Cierra un toast por id; sin id, cierra todos. */\n dismiss: (id?: string) => void;\n /** Translator resuelto al locale del provider (para resolver mensajes). */\n t: CmsTranslator;\n /** Locale activo del provider. */\n locale: Locale;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CmsToastContext = createContext<CmsToastContextValue | null>(null);\n\nexport interface CmsToastProviderProps {\n children: ReactNode;\n /** Locale del usuario (sale de `profile.locale` en el gestor). */\n locale?: Locale | string;\n /** Alias de `locale`. */\n language?: Locale | string;\n /** Versión a mostrar en el detalle del toast de error. Default: `LIB_VERSION`. */\n appVersion?: string;\n /** Máximo de toasts simultáneos (se descarta el más viejo). Default: 4. */\n max?: number;\n}\n\n/**\n * Provee el sistema de toasts a toda la app. Renderiza una pila fija (abajo a\n * la izquierda) y expone `useCmsToast()` para disparar feedback de operaciones.\n *\n * El mecanismo vive en la lib; el **disparo** lo hace el gestor (catch de un\n * server action / handler de mutación).\n */\nexport function CmsToastProvider({\n children,\n locale,\n language,\n appVersion,\n max = 4,\n}: CmsToastProviderProps) {\n const resolvedLocale = normalizeLocale(locale ?? language);\n const { locale: tLocale, t } = useCmsTranslation({ locale: resolvedLocale });\n const version = appVersion ?? LIB_VERSION;\n\n const [items, setItems] = useState<ToastItem[]>([]);\n const idRef = useRef(0);\n const timers = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n const dismiss = useCallback((id?: string) => {\n if (id === undefined) {\n timers.current.forEach((tm) => clearTimeout(tm));\n timers.current.clear();\n setItems([]);\n return;\n }\n const tm = timers.current.get(id);\n if (tm) {\n clearTimeout(tm);\n timers.current.delete(id);\n }\n setItems((prev) => prev.filter((it) => it.id !== id));\n }, []);\n\n const enqueue = useCallback(\n (item: Omit<ToastItem, 'id'>) => {\n idRef.current += 1;\n const id = `toast-${idRef.current}`;\n const next: ToastItem = { ...item, id };\n setItems((prev) => {\n const merged = [...prev, next];\n return merged.length > max ? merged.slice(merged.length - max) : merged;\n });\n if (next.duration !== null && next.duration > 0) {\n const tm = setTimeout(() => dismiss(id), next.duration);\n timers.current.set(id, tm);\n }\n return id;\n },\n [dismiss, max],\n );\n\n // Limpia timers pendientes al desmontar.\n useEffect(() => {\n const map = timers.current;\n return () => {\n map.forEach((tm) => clearTimeout(tm));\n map.clear();\n };\n }, []);\n\n const value = useMemo<CmsToastContextValue>(\n () => ({ enqueue, dismiss, t, locale: tLocale }),\n [enqueue, dismiss, t, tLocale],\n );\n\n const localeTag = useMemo(() => {\n switch (tLocale) {\n case 'pt':\n return 'pt-BR';\n case 'en':\n return 'en-US';\n default:\n return 'es-MX';\n }\n }, [tLocale]);\n\n return (\n <CmsToastContext.Provider value={value}>\n {children}\n <Box sx={CmsToastStyles.sxStack}>\n {items.map((item) => (\n <CmsToast\n key={item.id}\n item={item}\n t={t}\n localeTag={localeTag}\n appVersion={version}\n onClose={dismiss}\n />\n ))}\n </Box>\n </CmsToastContext.Provider>\n );\n}\n","'use client';\n\nimport { useContext, useMemo } from 'react';\n\nimport { getCommonError, resolveErrorSeverity } from '../../errors';\nimport { CmsToastContext } from './CmsToastProvider';\nimport type {\n CmsResponseLike,\n NotifyCmsResponseOptions,\n ToastErrorOptions,\n ToastOptions,\n ToastSeverity,\n} from './types';\n\n/** Duración por defecto (ms) según severidad. Error no se autocierra. */\nconst DEFAULT_DURATION: Record<ToastSeverity, number | null> = {\n success: 5000,\n info: 5000,\n warning: 5000,\n error: null,\n};\n\nexport interface CmsToastApi {\n /** Toast de éxito (verde). */\n success: (message: string, options?: ToastOptions) => string;\n /** Toast informativo (azul). */\n info: (message: string, options?: ToastOptions) => string;\n /** Toast de advertencia (ámbar) — condición esperada/accionable. */\n warning: (message: string, options?: ToastOptions) => string;\n /** Toast de error (rojo, grande, con detalle copiable). */\n error: (message: string, options?: ToastErrorOptions) => string;\n /** Atajo genérico. */\n show: (\n severity: ToastSeverity,\n message: string,\n options?: ToastErrorOptions,\n ) => string;\n /** Cierra un toast por id; sin id, cierra todos. */\n dismiss: (id?: string) => void;\n /**\n * Interpreta un envelope `CmsResponse` y dispara el toast adecuado:\n * - `status: 'ok'` → success.\n * - fallo → severidad por código (`resolveErrorSeverity`) y mensaje legible\n * (`getCommonError` → `error` crudo → default i18n).\n */\n notifyCmsResponse: (\n response: CmsResponseLike | null | undefined,\n options?: NotifyCmsResponseOptions,\n ) => string;\n}\n\n/**\n * Hook para disparar toasts. Debe usarse dentro de `CmsToastProvider`.\n */\nexport function useCmsToast(): CmsToastApi {\n const ctx = useContext(CmsToastContext);\n if (!ctx) {\n throw new Error('useCmsToast debe usarse dentro de <CmsToastProvider>.');\n }\n const { enqueue, dismiss, t, locale } = ctx;\n\n return useMemo<CmsToastApi>(() => {\n const show: CmsToastApi['show'] = (severity, message, options) =>\n enqueue({\n severity,\n message,\n title: options?.title,\n duration:\n options?.duration === undefined\n ? DEFAULT_DURATION[severity]\n : options.duration,\n detail:\n severity === 'error'\n ? {\n errorCode: options?.errorCode,\n error: options?.error,\n service: options?.service,\n params: options?.params,\n }\n : undefined,\n });\n\n const success: CmsToastApi['success'] = (message, options) =>\n show('success', message, options);\n const info: CmsToastApi['info'] = (message, options) =>\n show('info', message, options);\n const warning: CmsToastApi['warning'] = (message, options) =>\n show('warning', message, options);\n const error: CmsToastApi['error'] = (message, options) =>\n show('error', message, options);\n\n const notifyCmsResponse: CmsToastApi['notifyCmsResponse'] = (\n response,\n options,\n ) => {\n if (response?.status === 'ok') {\n return success(options?.successMessage ?? t.toast('defaultSuccess'), {\n title: options?.successTitle,\n });\n }\n const severity = resolveErrorSeverity(response?.errorCode);\n const mapped = getCommonError(response?.errorCode, locale);\n const message =\n mapped ??\n response?.error ??\n (severity === 'warning'\n ? t.toast('defaultWarning')\n : t.toast('defaultError'));\n if (severity === 'warning') {\n return warning(message);\n }\n return error(message, {\n errorCode: response?.errorCode,\n error: response?.error,\n service: options?.service,\n params: options?.params,\n });\n };\n\n return { success, info, warning, error, show, dismiss, notifyCmsResponse };\n }, [enqueue, dismiss, t, locale]);\n}\n","'use client';\n\nimport {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\n\nimport { cmsNetworkBridge } from './networkBridge';\n\n/** Estado de conectividad del navegador. */\nexport type CmsNetworkState = 'online' | 'offline';\n\nexport interface CmsNetworkContextValue {\n /** Estado actual de la conexión. */\n status: CmsNetworkState;\n /** Atajo: `status === 'online'`. */\n isOnline: boolean;\n /**\n * Promesa que resuelve cuando la conexión vuelve a `online`. Si ya está\n * online, resuelve al instante. La usa el reintento para \"retomar el llamado\"\n * cuando vuelve internet.\n */\n waitForOnline: () => Promise<void>;\n /**\n * Fuerza una verificación por ping (útil cuando una petición falló por red\n * pero `navigator.onLine` todavía dice `true`). Resuelve a `true` si confirma\n * conexión real, `false` si confirma que no hay internet.\n */\n verifyConnectivity: () => Promise<boolean>;\n /**\n * Marca la conexión como `offline` de inmediato (dispara el toast de \"sin\n * conexión\" sin esperar al ping). Lo usa el reintento cuando el navegador ya\n * reporta que no hay internet, para que el error se vea al perder la conexión\n * y no recién al recuperarla.\n */\n reportOffline: () => void;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CmsNetworkContext = createContext<CmsNetworkContextValue | null>(\n null,\n);\n\nexport interface CmsNetworkProviderProps {\n children: ReactNode;\n /**\n * URL de ping para confirmar conectividad real (además de los eventos del\n * navegador). Debe responder rápido a un `GET` sin CORS. `null` desactiva el\n * ping y deja solo los eventos `online`/`offline`. Default: endpoint 204 de\n * Google (mismo que usa el Angular legacy).\n */\n pingUrl?: string | null;\n /** Intervalo del polling de ping mientras siga offline (ms). Default 5000. */\n pingIntervalMs?: number;\n /**\n * Timeout del ping antes de darlo por fallido (ms). Sin él, un `fetch` a un\n * host externo sin internet puede colgarse hasta que la red vuelva, y el\n * offline se detectaría tarde. Default 5000.\n */\n pingTimeoutMs?: number;\n}\n\nconst DEFAULT_PING_URL = 'https://clients3.google.com/generate_204';\nconst DEFAULT_PING_INTERVAL = 5000;\nconst DEFAULT_PING_TIMEOUT = 5000;\n\n/** Estado inicial SSR-safe: en el servidor asume `online`. */\nfunction initialState(): CmsNetworkState {\n if (typeof navigator === 'undefined') return 'online';\n return navigator.onLine ? 'online' : 'offline';\n}\n\n/**\n * Provee el estado de conectividad a toda la app y una promesa `waitForOnline`\n * para reanudar peticiones al recuperar internet.\n *\n * Replica el `NetworkService` del Angular legacy: combina `navigator.onLine`,\n * los eventos `window` `online`/`offline` y un **ping activo con polling** que\n * confirma la reconexión real (los eventos del navegador a veces mienten).\n *\n * El mecanismo vive en la lib; el **disparo** de toasts lo hace\n * `CmsNetworkToaster` (globales) y `useResilientAction` (por petición).\n */\nexport function CmsNetworkProvider({\n children,\n pingUrl = DEFAULT_PING_URL,\n pingIntervalMs = DEFAULT_PING_INTERVAL,\n pingTimeoutMs = DEFAULT_PING_TIMEOUT,\n}: CmsNetworkProviderProps) {\n const [status, setStatus] = useState<CmsNetworkState>(initialState);\n\n // Espejo síncrono del estado: `waitForOnline` y el ping necesitan el valor\n // fresco sin esperar al re-render de React.\n const statusRef = useRef<CmsNetworkState>(status);\n\n // Resolvers de las promesas `waitForOnline` pendientes.\n const onlineResolvers = useRef<Array<() => void>>([]);\n\n const flushOnline = useCallback(() => {\n const resolvers = onlineResolvers.current;\n onlineResolvers.current = [];\n resolvers.forEach((resolve) => resolve());\n }, []);\n\n // Punto único de cambio de estado: mantiene el ref sincronizado y, al volver\n // a `online`, resuelve las esperas pendientes (reanuda las peticiones).\n const updateStatus = useCallback(\n (next: CmsNetworkState) => {\n statusRef.current = next;\n setStatus(next);\n if (next === 'online') flushOnline();\n },\n [flushOnline],\n );\n\n const waitForOnline = useCallback(() => {\n // Se basa en el estado CONFIRMADO (ping/eventos), no en `navigator.onLine`:\n // el caso a cubrir es justamente \"el navegador dice online sin internet real\".\n if (statusRef.current === 'online') {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n onlineResolvers.current.push(resolve);\n });\n }, []);\n\n const verifyConnectivity = useCallback(async (): Promise<boolean> => {\n // Sin ping configurado (o sin `fetch`): cae al reporte del navegador.\n if (!pingUrl || typeof fetch === 'undefined') {\n const online = typeof navigator === 'undefined' || navigator.onLine;\n updateStatus(online ? 'online' : 'offline');\n return online;\n }\n // `ngsw-bypass` evita el service worker; el timestamp evita la caché.\n const sep = pingUrl.includes('?') ? '&' : '?';\n const url = `${pingUrl}${sep}ngsw-bypass=true&_t=${Date.now()}`;\n // Timeout: sin internet, un `fetch` a un host externo puede colgarse hasta\n // que la red vuelva; el corte evita detectar el offline recién al reconectar.\n const controller =\n typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = controller\n ? setTimeout(() => controller.abort(), pingTimeoutMs)\n : null;\n try {\n await fetch(url, {\n mode: 'no-cors',\n cache: 'no-store',\n signal: controller?.signal,\n });\n updateStatus('online');\n return true;\n } catch {\n updateStatus('offline');\n return false;\n } finally {\n if (timer) clearTimeout(timer);\n }\n }, [pingUrl, pingTimeoutMs, updateStatus]);\n\n // Marca offline de inmediato (dispara el toast sin esperar el ping).\n const reportOffline = useCallback(() => {\n updateStatus('offline');\n }, [updateStatus]);\n\n // Expone las funciones al interceptor de axios (que no puede usar hooks), para\n // que una petición fallida por red dispare el toast/ping y se reanude al\n // volver la conexión. Réplica del `NetworkService` inyectado en el Angular.\n useEffect(() => {\n cmsNetworkBridge.register({ reportOffline, waitForOnline, verifyConnectivity });\n return () => cmsNetworkBridge.unregister();\n }, [reportOffline, waitForOnline, verifyConnectivity]);\n\n // Eventos del navegador. Ante `offline`, confirma con un ping.\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const goOnline = () => updateStatus('online');\n const goOffline = () => {\n updateStatus('offline');\n void verifyConnectivity();\n };\n window.addEventListener('online', goOnline);\n window.addEventListener('offline', goOffline);\n return () => {\n window.removeEventListener('online', goOnline);\n window.removeEventListener('offline', goOffline);\n };\n }, [updateStatus, verifyConnectivity]);\n\n // Polling de ping mientras siga offline: confirma la reconexión real aunque\n // el evento `online` no llegue (redes que no lo emiten de forma fiable).\n useEffect(() => {\n if (status !== 'offline' || !pingUrl) return;\n const id = setInterval(() => {\n void verifyConnectivity();\n }, pingIntervalMs);\n return () => clearInterval(id);\n }, [status, pingUrl, pingIntervalMs, verifyConnectivity]);\n\n const value = useMemo<CmsNetworkContextValue>(\n () => ({\n status,\n isOnline: status === 'online',\n waitForOnline,\n verifyConnectivity,\n reportOffline,\n }),\n [status, waitForOnline, verifyConnectivity, reportOffline],\n );\n\n return (\n <CmsNetworkContext.Provider value={value}>\n {children}\n </CmsNetworkContext.Provider>\n );\n}\n","'use client';\n\nimport { useContext } from 'react';\n\nimport {\n CmsNetworkContext,\n type CmsNetworkContextValue,\n} from './CmsNetworkProvider';\n\n/**\n * Lee el estado de conectividad. Debe usarse dentro de `<CmsNetworkProvider>`.\n */\nexport function useCmsNetworkStatus(): CmsNetworkContextValue {\n const ctx = useContext(CmsNetworkContext);\n if (!ctx) {\n throw new Error(\n 'useCmsNetworkStatus debe usarse dentro de <CmsNetworkProvider>.',\n );\n }\n return ctx;\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\nimport { useCmsToast } from '../components/toast/useCmsToast';\nimport { useCmsTranslation } from '../i18n/useCmsTranslation';\nimport { useCmsNetworkStatus } from './useCmsNetworkStatus';\n\n/**\n * Componente sin UI que observa el estado de conexión y dispara los toasts\n * globales, replicando el Angular legacy:\n *\n * - Al perder internet → toast de error \"sin conexión\" (no se autocierra).\n * - Al recuperarla → cierra el anterior y muestra \"conexión restablecida\".\n *\n * Se monta una sola vez, dentro de `CmsNetworkProvider` + `CmsToastProvider`.\n * El reintento y \"reanudar el llamado\" por acción los maneja\n * `useResilientAction`.\n */\nexport function CmsNetworkToaster() {\n const { status } = useCmsNetworkStatus();\n const { t } = useCmsTranslation();\n const toast = useCmsToast();\n\n const prevStatus = useRef(status);\n const disconnectToastId = useRef<string | null>(null);\n\n useEffect(() => {\n const prev = prevStatus.current;\n prevStatus.current = status;\n if (status === prev) return;\n\n if (status === 'offline') {\n // Evita duplicar el toast si ya hay uno visible.\n if (disconnectToastId.current === null) {\n disconnectToastId.current = toast.error(t.network('disconnected'), {\n errorCode: 'net.offline',\n });\n }\n return;\n }\n\n // Volvió la conexión: cierra el de \"sin conexión\" y confirma.\n if (disconnectToastId.current !== null) {\n toast.dismiss(disconnectToastId.current);\n disconnectToastId.current = null;\n toast.success(t.network('restored'));\n }\n }, [status, t, toast]);\n\n return null;\n}\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { useCmsToast } from '../components/toast/useCmsToast';\nimport { useCmsTranslation } from '../i18n/useCmsTranslation';\nimport {\n NETWORK_ERROR_CODES,\n classifyNetworkError,\n getNetworkErrorCodeFromResult,\n} from './classifyNetworkError';\nimport { useCmsNetworkStatus } from './useCmsNetworkStatus';\n\nexport interface ResilientRunOptions {\n /** Servicio/endpoint (para el detalle del toast, si el resultado es error). */\n service?: string;\n /** Params de la llamada (para el detalle del toast). */\n params?: Record<string, unknown>;\n /** Máximo de reintentos con backoff (fallos de servidor/timeout). Default 3. */\n maxRetries?: number;\n /** Mostrar el toast \"reintentando\" al reanudar tras una desconexión. Default true. */\n notifyRetry?: boolean;\n}\n\nexport type ResilientRunner = <T>(\n fn: () => Promise<T>,\n options?: ResilientRunOptions,\n) => Promise<T>;\n\nconst MAX_BACKOFF_MS = 8000;\n\nconst delay = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\n/** Backoff exponencial topado: 1s, 2s, 4s, 8s (igual que el Angular legacy). */\nconst backoff = (attempt: number) => Math.min(1000 * 2 ** (attempt - 1), MAX_BACKOFF_MS);\n\n/** `true` si el navegador reporta que no hay conexión (siempre valor fresco). */\nconst isOfflineNow = () =>\n typeof navigator !== 'undefined' ? !navigator.onLine : false;\n\n/**\n * Envuelve la invocación de un server action para hacerla **resiliente a la\n * red**, replicando el comportamiento del Angular legacy:\n *\n * - **Sin internet (usuario offline):** no se pierde la acción. Se espera —sin\n * consumir reintentos— a que vuelva la conexión y entonces se **retoma el\n * llamado** automáticamente (muestra \"reintentando…\").\n * - **Backend caído / timeout / 5xx (con internet):** reintenta con backoff\n * exponencial (1s, 2s, 4s, 8s) hasta `maxRetries`; luego devuelve el\n * resultado de error para que el caller muestre el toast.\n * - **Error de negocio (4xx / `status:'fail'`):** no reintenta; devuelve el\n * resultado tal cual para que el caller decida (toast/update optimista).\n *\n * El toast global de \"sin conexión\" / \"conexión restablecida\" lo dispara\n * `CmsNetworkToaster`; este hook solo añade el \"reintentando…\" por acción.\n *\n * Uso en el gestor:\n * ```ts\n * const run = useResilientAction();\n * const res = await run(() => setUserStatus(slug, id, action),\n * { service: '/users/actions/setStatus', params: { id, action } });\n * ```\n */\nexport function useResilientAction(): ResilientRunner {\n const network = useCmsNetworkStatus();\n const toast = useCmsToast();\n const { t } = useCmsTranslation();\n\n return useCallback(\n async <T>(fn: () => Promise<T>, options?: ResilientRunOptions): Promise<T> => {\n const maxRetries = options?.maxRetries ?? 3;\n const notifyRetry = options?.notifyRetry ?? true;\n let attempt = 0;\n let announcedRetry = false;\n\n /**\n * Confirma con el ping si de verdad hay internet —aunque `navigator.onLine`\n * mienta, igual que el interceptor del Angular ante un `status 0`—.\n * Devuelve `true` si hay conexión; si no, espera la reconexión (sin gastar\n * el presupuesto de reintentos) y avisa \"reintentando…\" una sola vez.\n */\n const announceRetry = () => {\n if (notifyRetry && !announcedRetry) {\n announcedRetry = true;\n toast.info(t.network('retrying'));\n }\n };\n\n const ensureOnlineOrWait = async (): Promise<boolean> => {\n // El navegador ya sabe que no hay internet: muestra el error de\n // inmediato (no espera el ping; el ping solo detecta la reconexión).\n if (isOfflineNow()) {\n network.reportOffline();\n await network.waitForOnline();\n announceRetry();\n return false;\n }\n // El navegador dice que hay conexión: puede mentir. Lo confirma el ping.\n const online = await network.verifyConnectivity();\n if (online) return true;\n await network.waitForOnline();\n announceRetry();\n return false;\n };\n\n // Si arranca sin conexión, confirma con el ping y espera antes de intentar.\n if (isOfflineNow()) {\n await ensureOnlineOrWait();\n }\n\n while (true) {\n try {\n const result = await fn();\n\n // El server action pudo devolver un error de red (Next→OpenCms).\n const netCode = getNetworkErrorCodeFromResult(result);\n if (netCode) {\n const online = await ensureOnlineOrWait();\n if (!online) continue; // faltaba internet → ya esperó, retoma\n if (attempt < maxRetries) {\n // hay internet → era el backend → backoff acotado\n attempt += 1;\n await delay(backoff(attempt));\n continue;\n }\n }\n return result;\n } catch (error) {\n const classified = classifyNetworkError(error);\n\n // ¿Huele a falta de conexión o backend inalcanzable? Lo confirma el\n // ping, aunque `navigator.onLine` diga que sí (WiFi sin salida real,\n // Next→OpenCms caído). Un 5xx \"puro\" no pinguea: hay respuesta, hay\n // internet.\n const maybeConnectivity =\n isOfflineNow() ||\n classified?.errorCode === NETWORK_ERROR_CODES.offline ||\n classified?.errorCode === NETWORK_ERROR_CODES.timeout ||\n classified?.errorCode === NETWORK_ERROR_CODES.unavailable;\n\n if (maybeConnectivity) {\n const online = await ensureOnlineOrWait();\n if (!online) continue; // sin internet → esperó reconexión, retoma\n // hay internet → error transitorio del servidor → cae al backoff\n }\n\n // Con internet: red/timeout/5xx transitorio → backoff acotado.\n if (classified?.retryable && attempt < maxRetries) {\n attempt += 1;\n await delay(backoff(attempt));\n continue;\n }\n\n // Error de negocio o presupuesto agotado: lo maneja el caller.\n throw error;\n }\n }\n },\n [network, toast, t],\n );\n}\n","import type {\n AnchorHTMLAttributes,\n ElementType,\n ForwardedRef,\n ReactNode,\n RefAttributes,\n} from 'react';\nimport { forwardRef } from 'react';\n\nexport type CmsLinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n href: string;\n children?: ReactNode;\n};\n\nexport type CmsLinkComponent = ElementType<\n CmsLinkProps & RefAttributes<HTMLAnchorElement>\n>;\n\nexport const DefaultCmsLink = forwardRef(function DefaultCmsLink(\n { href, children, ...rest }: CmsLinkProps,\n ref: ForwardedRef<HTMLAnchorElement>,\n) {\n return (\n <a href={href} ref={ref} {...rest}>\n {children}\n </a>\n );\n});\n","/**\n * Redirección al admin viejo del CMS (JSP) replicando el `openExternalPage()` de\n * cmsmedios-ux: en vez de un enlace, se arma y envía un formulario POST oculto\n * al endpoint `auth/adminBack/login`, que re-establece la sesión en la pestaña\n * nueva y luego redirige a la ruta pedida (campo `r`).\n *\n * Es código de navegador (usa `document`): debe llamarse desde un handler de\n * cliente, no en SSR.\n */\n\n/** Datos de sesión que el form POST envía al admin viejo. */\nexport type LegacyAdminSession = {\n /** Token de autenticación (se envía en base64, igual que el Angular legacy). */\n token: string;\n browserId: string;\n siteName: string;\n publication: string | number;\n userName: string;\n /** Proyecto del CMS. Por defecto `'Offline'`. */\n project?: string;\n};\n\n/** Parámetros de dispositivo para la previsualización (protocolo/queryString). */\nexport type LegacyAdminDevice = {\n /** `'https'` (por defecto) o `'http'`. */\n protocol?: string;\n /** QueryString específico del formato de preview (viene del backend). */\n queryString?: string;\n};\n\nconst ADMIN_BACK_LOGIN_PATH =\n '/system/modules/com.tfsla.diario.webservices/auth/adminBack/login';\n\n/** Devuelve el host de una URL/origen, forzando https (como el Angular legacy). */\nfunction toHttpsOrigin(cmsBaseUrl: string): string {\n const host = cmsBaseUrl.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n return `https://${host}`;\n}\n\n/** Crea un `<input type=\"hidden\">` con nombre y valor. */\nfunction hiddenInput(name: string, value: string): HTMLInputElement {\n const input = document.createElement('input');\n input.setAttribute('type', 'hidden');\n input.setAttribute('id', name);\n input.setAttribute('name', name);\n input.setAttribute('value', value);\n return input;\n}\n\n/**\n * Arma y envía el formulario POST que abre una ruta del admin viejo en una\n * pestaña nueva, pasando la sesión del usuario (igual que cmsmedios).\n *\n * @param params.cmsBaseUrl - Origen del CMS (p. ej. `https://dev.cms-medios.com`).\n * @param params.path - Ruta destino dentro del CMS (campo `r`).\n * @param params.session - Datos de sesión a enviar (token, sitio, etc.).\n * @param params.device - Opcional: protocolo/queryString del preview.\n * @returns void\n */\nexport function submitLegacyAdminPage(params: {\n cmsBaseUrl: string;\n path: string;\n session: LegacyAdminSession;\n device?: LegacyAdminDevice;\n}): void {\n const { cmsBaseUrl, path, session, device } = params;\n const loginService = `${toHttpsOrigin(cmsBaseUrl)}${ADMIN_BACK_LOGIN_PATH}`;\n\n // Igual que el legacy: si hay queryString, se concatena a la ruta destino.\n let targetUrl = path;\n const queryString = device?.queryString ?? '';\n if (queryString.length) {\n targetUrl = queryString.includes('/')\n ? `${queryString}?path=${targetUrl}` // redirect\n : `${targetUrl}?${queryString}`; // Apache\n }\n\n const form = document.createElement('form');\n form.setAttribute('method', 'post');\n form.setAttribute('action', loginService);\n form.setAttribute('target', '_blank');\n\n form.appendChild(hiddenInput('token', btoa(session.token)));\n form.appendChild(hiddenInput('project', session.project ?? 'Offline'));\n form.appendChild(hiddenInput('browserId', session.browserId));\n form.appendChild(hiddenInput('siteName', session.siteName));\n form.appendChild(hiddenInput('publication', String(session.publication)));\n form.appendChild(hiddenInput('r', targetUrl));\n form.appendChild(hiddenInput('user', session.userName));\n\n document.body.appendChild(form);\n form.submit();\n document.body.removeChild(form);\n}\n","import type { CmsTranslator } from '../../i18n';\nimport type { NavItemPermissions, NavLinkItem } from '../../types/navigation';\n\nexport function resolveNavLabel(item: NavLinkItem, t: CmsTranslator): string {\n return item.label ?? t.navigation(item.module);\n}\n\nexport function isPathActive(pathname: string, href: string): boolean {\n if (pathname === href) return true;\n if (href !== '/' && pathname.startsWith(`${href}/`)) return true;\n return false;\n}\n\nexport function isItemActive(pathname: string, item: NavLinkItem): boolean {\n if (isPathActive(pathname, item.href)) return true;\n return item.children?.some((child) => isPathActive(pathname, child.href)) ?? false;\n}\n\n/**\n * Prefija `item.href` con `legacyBaseUrl` cuando el ítem apunta al admin legacy.\n * Si el ítem lo pide (`appendPublicationId`) y hay publicación activa, agrega el\n * id de publicación al final (rutas del Angular master `/admin/x/:idPub`).\n */\nexport function resolveNavHref(\n item: NavLinkItem,\n legacyBaseUrl?: string,\n selectedPublicationId?: string,\n): string {\n if (!item.legacy || !legacyBaseUrl) return item.href;\n const base = `${legacyBaseUrl.replace(/\\/$/, '')}${item.href}`;\n if (item.appendPublicationId && selectedPublicationId) {\n return `${base.replace(/\\/$/, '')}/${selectedPublicationId}`;\n }\n return base;\n}\n\n/**\n * Cómo debe navegar un ítem del sidebar:\n * - `jsp`: página del admin viejo (OpenCMS). Se abre con el form POST autenticado\n * (`submitLegacyAdminPage`) a `cmsBaseUrl`; `path` es la ruta destino (`r`).\n * - `link`: enlace normal. `external: true` para los `/admin/*` del Angular master\n * (abren en pestaña nueva); `external: false` para rutas internas del propio gestor.\n */\nexport type NavItemNavigation =\n | { kind: 'jsp'; path: string }\n | { kind: 'link'; href: string; external: boolean };\n\n/**\n * Resuelve el modo de navegación de un ítem según sus flags (`jsp`/`legacy`).\n * `jsp` tiene prioridad: siempre va por form POST al CMS viejo. `legacy` (sin\n * `jsp`) es un enlace externo al Angular master. El resto es navegación interna.\n * @param item - Ítem de navegación.\n * @param opts - Bases resueltas por el host y publicación activa.\n * @returns Descriptor de navegación para que el componente arme el nodo real.\n */\nexport function resolveNavNavigation(\n item: NavLinkItem,\n opts: {\n legacyBaseUrl?: string;\n cmsBaseUrl?: string;\n selectedPublicationId?: string;\n },\n): NavItemNavigation {\n if (item.jsp) {\n return { kind: 'jsp', path: item.href };\n }\n if (item.legacy) {\n return {\n kind: 'link',\n href: resolveNavHref(item, opts.legacyBaseUrl, opts.selectedPublicationId),\n external: true,\n };\n }\n return { kind: 'link', href: item.href, external: false };\n}\n\nexport function findModulePermission(\n permissions: Array<NavItemPermissions>,\n module: string,\n): NavItemPermissions | undefined {\n return permissions.find((permission) => permission.module === module);\n}\n\nexport function getVisibleChildren(\n item: NavLinkItem,\n permissions: Array<NavItemPermissions>,\n): NavLinkItem[] {\n return item.children?.filter((child) => findModulePermission(permissions, child.module)) ?? [];\n}\n","'use client';\nimport BarChartOutlinedIcon from '@mui/icons-material/BarChartOutlined';\nimport BookmarkBorderOutlinedIcon from '@mui/icons-material/BookmarkBorderOutlined';\nimport ChatBubbleOutlineOutlinedIcon from '@mui/icons-material/ChatBubbleOutlineOutlined';\nimport CreateOutlinedIcon from '@mui/icons-material/CreateOutlined';\nimport EventOutlinedIcon from '@mui/icons-material/EventOutlined';\nimport ExploreOutlinedIcon from '@mui/icons-material/ExploreOutlined';\nimport ImageOutlinedIcon from '@mui/icons-material/ImageOutlined';\nimport ImportExportOutlinedIcon from '@mui/icons-material/ImportExportOutlined';\n//import LabelOutlinedIcon from '@mui/icons-material/LabelOutlined';\nimport MailOutlineOutlinedIcon from '@mui/icons-material/MailOutlineOutlined';\nimport MoreHorizOutlinedIcon from '@mui/icons-material/MoreHorizOutlined';\nimport NotificationsNoneOutlinedIcon from '@mui/icons-material/NotificationsNoneOutlined';\nimport PeopleOutlinedIcon from '@mui/icons-material/PeopleOutlined';\n//import PermMediaOutlinedIcon from '@mui/icons-material/PermMediaOutlined';\nimport PlayCircleOutlineOutlinedIcon from '@mui/icons-material/PlayCircleOutlineOutlined';\nimport RestaurantOutlinedIcon from '@mui/icons-material/RestaurantOutlined';\nimport SearchOutlinedIcon from '@mui/icons-material/SearchOutlined';\nimport ShoppingCartOutlinedIcon from '@mui/icons-material/ShoppingCartOutlined';\nimport ManageAccountsOutlinedIcon from '@mui/icons-material/ManageAccountsOutlined';\nimport FormatAlignCenterOutlinedIcon from '@mui/icons-material/FormatAlignCenterOutlined';\nimport TimelineOutlinedIcon from '@mui/icons-material/TimelineOutlined';\n//import MessageOutlinedIcon from '@mui/icons-material/MessageOutlined';\nimport MicNoneOutlinedIcon from '@mui/icons-material/MicNoneOutlined';\nimport PlaylistPlayOutlinedIcon from '@mui/icons-material/PlaylistPlayOutlined';\nimport PendingActionsOutlinedIcon from '@mui/icons-material/PendingActionsOutlined';\nimport ForumOutlinedIcon from '@mui/icons-material/ForumOutlined';\nimport UsbOutlinedIcon from '@mui/icons-material/UsbOutlined';\nimport FormatListBulletedOutlinedIcon from '@mui/icons-material/FormatListBulletedOutlined';\nimport GridViewOutlinedIcon from '@mui/icons-material/GridViewOutlined';\nimport ViewQuiltOutlinedIcon from '@mui/icons-material/ViewQuiltOutlined';\nimport SubscriptionsOutlinedIcon from '@mui/icons-material/SubscriptionsOutlined';\nimport QuizOutlinedIcon from '@mui/icons-material/QuizOutlined';\nimport SellOutlinedIcon from '@mui/icons-material/SellOutlined';\nimport MenuOutlinedIcon from '@mui/icons-material/MenuOutlined';\nimport type { NavBlock } from '../../types/navigation';\n\n/**\n * Navegación lateral por defecto.\n * `module` debe coincidir exactamente con `module` en POST /auth/modulesAvailable\n * y con las claves en `messages.navigation`.\n *\n * Convención de destino por ítem:\n * - `jsp: true` → admin viejo (OpenCMS). Abre con form POST autenticado a\n * `cmsBaseUrl` (dev.cms-medios.com), en pestaña nueva. Tiene prioridad.\n * - `legacy: true` (sin `jsp`) → Angular master (`legacyBaseUrl`). Enlace en\n * pestaña nueva.\n * - sin flags → ruta interna del propio gestor React (misma pestaña).\n */\nexport const ACCOUNT_NAV_BLOCKS: NavBlock[] = [\n {\n href: '/admin/comments/',\n icon: ForumOutlinedIcon,\n module: 'COMMENTS',\n legacy: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/poll.jsp',\n icon: BarChartOutlinedIcon,\n module: 'POLLS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/media',\n icon: ImageOutlinedIcon,\n module: 'MEDIA',\n children: [\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/audios.jsp',\n icon: MicNoneOutlinedIcon,\n module: 'AUDIOS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/admin/images',\n icon: ImageOutlinedIcon,\n module: 'IMAGES',\n legacy: true,\n },\n {\n href: '/media/playlist',\n icon: PlaylistPlayOutlinedIcon,\n module: 'PLAYLISTS',\n },\n {\n href: '/admin/videos/',\n icon: PlayCircleOutlineOutlinedIcon,\n module: 'VIDEOS',\n legacy: true,\n },\n ],\n },\n {\n href: '/admin/posts/',\n icon: FormatAlignCenterOutlinedIcon,\n module: 'POSTS',\n legacy: true,\n },\n {\n href: '/admin/reports/',\n icon: TimelineOutlinedIcon,\n module: 'PRODUCTION',\n legacy: true,\n },\n\n {\n href: '/admin/planning',\n icon: PendingActionsOutlinedIcon,\n module: 'PLANNING',\n legacy: true,\n appendPublicationId: true,\n },\n /* {\n href: '/analiticas',\n icon: BarChartOutlinedIcon,\n module: 'ANALYTICS',\n }, */\n {\n href: '/admin/tags',\n icon: SellOutlinedIcon,\n module: 'TAGS',\n legacy: true,\n appendPublicationId: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/trivias.jsp',\n icon: QuizOutlinedIcon,\n module: 'TRIVIAS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/otros',\n icon: MoreHorizOutlinedIcon,\n module: 'OTHERS',\n children: [\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/newswires.jsp',\n icon: UsbOutlinedIcon,\n module: 'NEWSWIRES',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/event.jsp',\n icon: EventOutlinedIcon,\n module: 'EVENTS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/adminPages.jsp',\n icon: ExploreOutlinedIcon,\n module: 'PAGES',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/dashboard.jsp',\n icon: FormatListBulletedOutlinedIcon,\n module: 'FEEDS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/adminPeople.jsp',\n icon: PeopleOutlinedIcon,\n module: 'PERSONS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/adminPosts.jsp',\n icon: CreateOutlinedIcon,\n module: 'POSTS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/recipe.jsp',\n icon: RestaurantOutlinedIcon,\n module: 'RECIPES',\n legacy: true,\n jsp: true,\n },\n ],\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/banners.jsp',\n icon: ViewQuiltOutlinedIcon,\n module: 'BANNERS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/dynamicContent.jsp',\n icon: GridViewOutlinedIcon,\n module: 'BLOCKS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/menuSite.jsp',\n icon: MenuOutlinedIcon,\n module: 'MENUS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/navigationTags.jsp',\n icon: BookmarkBorderOutlinedIcon,\n module: 'TOPICS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/filterQueryList.jsp',\n icon: SearchOutlinedIcon,\n module: 'ADVANCEDQUERYS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/adminImports.jsp',\n icon: ImportExportOutlinedIcon,\n module: 'IMPORTS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/newsletter.jsp',\n icon: MailOutlineOutlinedIcon,\n module: 'NEWSLETTERS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/adminQueues.jsp',\n icon: NotificationsNoneOutlinedIcon,\n module: 'NOTIFICATIONS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/payments.jsp',\n icon: ShoppingCartOutlinedIcon,\n module: 'PAYMENTS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/subscriptions.jsp',\n icon: SubscriptionsOutlinedIcon,\n module: 'PAYMENTS',\n legacy: true,\n jsp: true,\n },\n /* {\n href: '/reportes',\n icon: BarChartOutlinedIcon,\n module: 'REPORTS',\n },\n {\n href: '/secciones',\n icon: ViewListOutlinedIcon,\n module: 'SECTIONS',\n }, */\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/twitterFeeds.jsp',\n icon: ChatBubbleOutlineOutlinedIcon,\n module: 'TWITTERS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/users',\n icon: ManageAccountsOutlinedIcon,\n module: 'USERS',\n },\n /* {\n href: '/zonas',\n icon: LayersOutlinedIcon,\n module: 'ZONES',\n },\n { href: '/ia', icon: ExploreOutlinedIcon, module: 'IA' }, */\n];\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport {\n cmsColors,\n fontFamilies,\n radii,\n shadows,\n stateColors,\n} from '../../theme/variables';\n\nexport const SIDEBAR_RAIL_WIDTH = 88;\n\nconst ITEM_WIDTH = 56;\nconst ITEM_HEIGHT = 32;\nconst ICON_SIZE = 20;\n\nconst scrollbarHidden = {\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n} as const;\n\nfunction activeColors(accent?: 'ai') {\n if (accent === 'ai')\n return { bg: stateColors.generating.bg, on: stateColors.generating.on };\n return { bg: cmsColors.secondary, on: cmsColors.onSecondaryContainer };\n}\n\nexport const SidebarRailStyles = {\n sxRoot: {\n width: SIDEBAR_RAIL_WIDTH,\n maxWidth: SIDEBAR_RAIL_WIDTH,\n minWidth: SIDEBAR_RAIL_WIDTH,\n flexShrink: 0,\n alignSelf: 'stretch',\n minHeight: 0,\n maxHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n bgcolor: 'm3.surfaceContainer',\n boxSizing: 'border-box',\n } as SxProps<Theme>,\n\n sxNavScroll: {\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n overflowX: 'hidden',\n width: '100%',\n boxSizing: 'border-box',\n ...scrollbarHidden,\n } as SxProps<Theme>,\n\n sxNav: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 1,\n px: 0.5,\n py: 2,\n width: '100%',\n boxSizing: 'border-box',\n } as SxProps<Theme>,\n\n sxItemWrap: {\n position: 'relative',\n width: '100%',\n '&:hover .rail-pin-btn, &:focus-within .rail-pin-btn': {\n opacity: 1,\n transform: 'none',\n },\n } as SxProps<Theme>,\n\n sxItemButton: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 0,\n width: '100%',\n py: 0.5,\n border: 0,\n background: 'transparent',\n cursor: 'pointer',\n textDecoration: 'none',\n font: 'inherit',\n } as SxProps<Theme>,\n\n sxPinButton: (pinned: boolean): SxProps<Theme> => ({\n position: 'absolute',\n top: -2,\n right: 8,\n width: 22,\n height: 22,\n minWidth: 22,\n p: 0,\n borderRadius: '50%',\n bgcolor: 'm3.surfaceContainerHigh',\n color: pinned ? cmsColors.primary : 'm3.onSurfaceVariant',\n boxShadow: shadows.button,\n opacity: pinned ? 1 : 0,\n transform: pinned ? 'none' : 'scale(0.6)',\n transition:\n 'opacity 0.12s, transform 0.12s, background-color 0.12s, color 0.12s',\n zIndex: 2,\n '&:hover': {\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n },\n '& .MuiSvgIcon-root': {\n fontSize: 15,\n },\n }),\n\n sxPinDivider: {\n width: 32,\n height: '1px',\n bgcolor: cmsColors.border,\n my: 0.5,\n } as SxProps<Theme>,\n\n sxItemIconBox: (selected: boolean, accent?: 'ai'): SxProps<Theme> => {\n const active = activeColors(accent);\n return {\n position: 'relative',\n width: ITEM_WIDTH,\n height: ITEM_HEIGHT,\n borderRadius: '16px',\n display: 'grid',\n placeItems: 'center',\n transition: 'background-color 0.15s ease, color 0.15s ease',\n bgcolor: selected ? active.bg : 'transparent',\n color: selected ? active.on : 'm3.onSurfaceVariant',\n '&:hover': {\n bgcolor: selected ? active.bg : cmsColors.surfaceHover,\n color: selected ? active.on : cmsColors.textStrong,\n },\n };\n },\n\n sxItemIcon: {\n fontSize: ICON_SIZE,\n } as SxProps<Theme>,\n\n sxItemLabel: (selected: boolean, accent?: 'ai'): SxProps<Theme> => ({\n fontSize: 12,\n fontWeight: 500,\n lineHeight: 1,\n textAlign: 'center',\n mt: '4px',\n color: selected ? activeColors(accent).on : cmsColors.textNav,\n }),\n\n sxChildrenChevron: {\n position: 'absolute',\n left: -8,\n top: '50%',\n transform: 'translateY(-50%)',\n fontSize: 14,\n color: cmsColors.textMuted,\n } as SxProps<Theme>,\n\n sxAccentDot: {\n position: 'absolute',\n top: -1,\n right: 6,\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: stateColors.generating.on,\n boxShadow: `0 0 0 2px ${cmsColors.surface}`,\n } as SxProps<Theme>,\n\n sxChildrenMenuPaper: {\n mt: 0.5,\n borderRadius: radii.flyout,\n // Borde sutil (`outlineVariant`, #C4C6CF en claro) para que el flyout no se\n // pierda contra el fondo del shell, que comparte el mismo gris.\n border: '1px solid',\n borderColor: 'divider',\n bgcolor: cmsColors.menuSurface,\n boxShadow: shadows.flyout,\n // Sin padding lateral: el resaltado/hover de los ítems llega de borde a\n // borde. El radio se recorta con overflow para que el full-bleed no\n // desborde las esquinas redondeadas.\n px: 0,\n overflow: 'hidden',\n minWidth: 200,\n } as SxProps<Theme>,\n\n /**\n * Título del ítem padre (p. ej. \"MEDIA\") arriba del flyout: mayúsculas,\n * peso medio (500, no bold), 11px, color `m3.onSurfaceVariant` (#43474E en\n * claro), no interactivo.\n */\n sxChildrenMenuTitle: {\n px: 2,\n pt: 0.5,\n pb: 0.5,\n fontFamily: fontFamilies.googleSans,\n fontSize: 11,\n fontWeight: 500,\n lineHeight: 1.4,\n letterSpacing: '0.08em',\n textTransform: 'uppercase',\n color: 'm3.onSurfaceVariant',\n listStyle: 'none',\n userSelect: 'none',\n } as SxProps<Theme>,\n\n sxChildrenMenuItem: (selected: boolean): SxProps<Theme> => ({\n minHeight: 44,\n // Full-bleed: sin radio, el hover cubre todo el ancho del flyout.\n borderRadius: 0,\n px: 2,\n py: 1,\n gap: 1.25,\n color: cmsColors.textNav,\n bgcolor: selected ? cmsColors.secondary : 'transparent',\n '& .MuiListItemText-primary': {\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 400,\n },\n '&:hover': {\n bgcolor: selected ? cmsColors.secondary : cmsColors.surfaceHover,\n },\n }),\n\n sxChildrenMenuListItemIcon: {\n minWidth: 34,\n color: 'm3.onSurfaceVariant',\n '& .MuiSvgIcon-root': {\n fontSize: 22,\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport PushPinOutlinedIcon from '@mui/icons-material/PushPinOutlined';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport { useCmsTranslation } from '../../i18n';\nimport type { CmsProfileServices } from '../../services/profile';\nimport type { NavItemPermissions, NavLinkItem } from '../../types/navigation';\nimport { toTestId } from '../../utils/toTestId';\nimport {\n submitLegacyAdminPage,\n type LegacyAdminSession,\n} from '../../utils/legacy-admin';\nimport { DefaultCmsLink, type CmsLinkComponent } from '../link';\nimport {\n findModulePermission,\n getVisibleChildren,\n isItemActive,\n isPathActive,\n resolveNavLabel,\n resolveNavNavigation,\n} from './nav-helpers';\nimport { ACCOUNT_NAV_BLOCKS } from './nav-blocks';\nimport { SidebarRailStyles } from './SidebarRail.styles';\n\n/**\n * Cómo navega un ítem del sidebar (discriminado para ramificar el JSX):\n * - `jsp-post`: `.jsp` con sesión → dispara el form POST autenticado al CMS viejo.\n * - `link`: enlace normal; `external: true` abre en pestaña nueva (Angular master\n * o `.jsp` sin sesión), `false` es navegación interna del gestor (misma pestaña).\n */\ntype NavAction =\n | { mode: 'jsp-post'; onClick: () => void }\n | { mode: 'link'; href: string; external: boolean };\n\n/**\n * Decide cómo navega un ítem del sidebar según sus flags y la sesión disponible.\n * @param params - Ítem, bases resueltas por el host, sesión y publicación activa.\n * @returns Acción de navegación (form POST o enlace) para el nodo real.\n */\nfunction resolveNavAction(params: {\n item: NavLinkItem;\n legacyBaseUrl?: string;\n cmsBaseUrl?: string;\n legacySession?: LegacyAdminSession;\n selectedPublicationId?: string;\n}): NavAction {\n const { item, legacyBaseUrl, cmsBaseUrl, legacySession, selectedPublicationId } =\n params;\n const nav = resolveNavNavigation(item, {\n legacyBaseUrl,\n cmsBaseUrl,\n selectedPublicationId,\n });\n\n if (nav.kind === 'jsp') {\n if (cmsBaseUrl && legacySession) {\n return {\n mode: 'jsp-post',\n onClick: () =>\n submitLegacyAdminPage({ cmsBaseUrl, path: nav.path, session: legacySession }),\n };\n }\n // Fallback sin sesión: enlace directo al CMS viejo (probablemente pida login),\n // igual en pestaña nueva. Mejor que dejar el ítem sin destino.\n const base = (cmsBaseUrl ?? '').replace(/\\/$/, '');\n return { mode: 'link', href: `${base}${nav.path}`, external: true };\n }\n\n return { mode: 'link', href: nav.href, external: nav.external };\n}\n\n/** Servicio de pines usado por el rail: solo necesita estos tres métodos. */\nexport type SidebarRailPinService = Pick<\n CmsProfileServices,\n 'addPins' | 'deletePins' | 'getPins'\n>;\n\n/**\n * `getPins()` devuelve `pines: unknown[]` sin tipar en el backend. Se acepta\n * tanto el string plano (mismo valor enviado a `addPins`) como un objeto que\n * lo traiga en `pin`/`module`, para no romper si el envelope cambia de forma.\n */\nfunction extractPinnedModule(entry: unknown): string | undefined {\n if (typeof entry === 'string') return entry;\n if (entry && typeof entry === 'object') {\n const { pin, module } = entry as { pin?: unknown; module?: unknown };\n if (typeof pin === 'string') return pin;\n if (typeof module === 'string') return module;\n }\n return undefined;\n}\n\nfunction RailItem({\n item,\n blockIndex,\n pathname,\n permissions,\n LinkComponent,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n selectedPublicationId,\n pinned,\n onTogglePin,\n}: {\n item: NavLinkItem;\n blockIndex: number;\n pathname: string;\n permissions: Array<NavItemPermissions>;\n LinkComponent: CmsLinkComponent;\n legacyBaseUrl?: string;\n cmsBaseUrl?: string;\n legacySession?: LegacyAdminSession;\n selectedPublicationId?: string;\n pinned: boolean;\n onTogglePin: () => void;\n}) {\n // Mismo escopo que el Sidebar: `module` no es único (POSTS/PAYMENTS repetidos\n // en nav-blocks.ts) y no hay id de bloque estable, así que se usa el índice del\n // bloque para no duplicar testids cuando ambos ítems se ven a la vez.\n const blockScope = `block-${blockIndex}`;\n const { t } = useCmsTranslation();\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n const menuOpen = Boolean(anchor);\n const itemRef = useRef<HTMLDivElement | null>(null);\n\n const permission = findModulePermission(permissions, item.module);\n const visibleChildren = getVisibleChildren(item, permissions);\n const hasChildren = visibleChildren.length > 0;\n const selected = hasChildren ? isItemActive(pathname, item) : isPathActive(pathname, item.href);\n\n // Trae el ítem activo al área visible del rail al cargar o cambiar de ruta,\n // para que siempre se vea en qué sección estás aunque quede fuera del scroll.\n // `block: 'nearest'` solo desplaza el contenedor del rail lo mínimo (no la\n // ventana, que está con overflow oculto en el shell).\n useEffect(() => {\n if (selected) itemRef.current?.scrollIntoView({ block: 'nearest' });\n }, [selected]);\n\n if (!permission && !hasChildren) return null;\n\n const label = resolveNavLabel(item, t);\n const Icon = item.icon;\n // Siempre outline (regla §3): el estado \"pinned\" se distingue por el color\n // azul y la opacidad plena del botón (sxPinButton), no por rellenar el pin.\n const PinIcon = PushPinOutlinedIcon;\n\n const content = (\n <>\n <Box sx={SidebarRailStyles.sxItemIconBox(selected, item.accent)}>\n <Icon sx={SidebarRailStyles.sxItemIcon} />\n {hasChildren && <ChevronRightIcon sx={SidebarRailStyles.sxChildrenChevron} />}\n {item.accent === 'ai' && !selected && <Box sx={SidebarRailStyles.sxAccentDot} />}\n </Box>\n <Box component=\"span\" sx={SidebarRailStyles.sxItemLabel(selected, item.accent)}>\n {label}\n </Box>\n </>\n );\n\n const pinButton = (\n <IconButton\n className=\"rail-pin-btn\"\n size=\"small\"\n data-testid={`toggle-pin-${blockScope}-${toTestId(item.module)}`}\n data-action={pinned ? 'unpin' : 'pin'}\n aria-label={pinned ? t.sidebar('unpin') : t.sidebar('pin')}\n title={pinned ? t.sidebar('unpin') : t.sidebar('pin')}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onTogglePin();\n }}\n sx={SidebarRailStyles.sxPinButton(pinned)}>\n <PinIcon />\n </IconButton>\n );\n\n if (hasChildren) {\n return (\n <Box ref={itemRef} sx={SidebarRailStyles.sxItemWrap}>\n <Box\n component=\"button\"\n type=\"button\"\n data-testid={`dropdown-toggle-nav-${blockScope}-${toTestId(item.module)}`}\n aria-label={label}\n aria-haspopup=\"true\"\n aria-expanded={menuOpen ? 'true' : undefined}\n onClick={(e) => setAnchor(e.currentTarget)}\n sx={SidebarRailStyles.sxItemButton}>\n {content}\n </Box>\n {pinButton}\n <Menu\n anchorEl={anchor}\n open={menuOpen}\n onClose={() => setAnchor(null)}\n anchorOrigin={{ vertical: 'center', horizontal: 'right' }}\n transformOrigin={{ vertical: 'center', horizontal: 'left' }}\n slotProps={{\n paper: { sx: SidebarRailStyles.sxChildrenMenuPaper },\n list: { sx: { py: 1 } },\n }}>\n <Box\n component=\"li\"\n aria-hidden=\"true\"\n data-testid={`sidebar-flyout-title-${blockScope}-${toTestId(item.module)}`}\n sx={SidebarRailStyles.sxChildrenMenuTitle}>\n {label}\n </Box>\n {visibleChildren.map((child) => {\n const ChildIcon = child.icon;\n const childAction = resolveNavAction({\n item: child,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n selectedPublicationId,\n });\n const childSx = SidebarRailStyles.sxChildrenMenuItem(\n isPathActive(pathname, child.href),\n );\n const childInner = (\n <>\n <ListItemIcon sx={SidebarRailStyles.sxChildrenMenuListItemIcon}>\n <ChildIcon />\n </ListItemIcon>\n <ListItemText primary={resolveNavLabel(child, t)} />\n </>\n );\n const childTestId = `dropdown-item-nav-${toTestId(child.module)}`;\n // `.jsp` con sesión: botón que dispara el form POST autenticado.\n if (childAction.mode === 'jsp-post') {\n return (\n <MenuItem\n key={child.href}\n data-testid={childTestId}\n component=\"button\"\n type=\"button\"\n onClick={() => {\n setAnchor(null);\n childAction.onClick();\n }}\n sx={childSx}>\n {childInner}\n </MenuItem>\n );\n }\n // Enlace (master en pestaña nueva, o interno en la misma).\n return (\n <MenuItem\n key={child.href}\n data-testid={childTestId}\n component={LinkComponent}\n href={childAction.href}\n target={childAction.external ? '_blank' : undefined}\n rel={childAction.external ? 'noopener noreferrer' : undefined}\n onClick={() => setAnchor(null)}\n sx={childSx}>\n {childInner}\n </MenuItem>\n );\n })}\n </Menu>\n </Box>\n );\n }\n\n const action = resolveNavAction({\n item,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n selectedPublicationId,\n });\n const testId = `nav-${blockScope}-${toTestId(item.module)}`;\n\n return (\n <Box ref={itemRef} sx={SidebarRailStyles.sxItemWrap}>\n {action.mode === 'jsp-post' ? (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={action.onClick}\n data-testid={testId}\n sx={SidebarRailStyles.sxItemButton}>\n {content}\n </Box>\n ) : (\n <Box\n component={LinkComponent}\n href={action.href}\n target={action.external ? '_blank' : undefined}\n rel={action.external ? 'noopener noreferrer' : undefined}\n data-testid={testId}\n sx={SidebarRailStyles.sxItemButton}>\n {content}\n </Box>\n )}\n {pinButton}\n </Box>\n );\n}\n\nexport type SidebarRailProps = {\n pathname: string;\n LinkComponent?: CmsLinkComponent;\n permissions: Array<NavItemPermissions>;\n /** Dominio del Angular master para prefijar hrefs `legacy` (no `jsp`). */\n legacyBaseUrl?: string;\n /** Origen del CMS viejo (JSP) para el form POST de los ítems `jsp`. */\n cmsBaseUrl?: string;\n /** Sesión para el form POST al admin viejo (token, sitio, publicación, usuario). */\n legacySession?: LegacyAdminSession;\n /** Id de publicación activa; se agrega a los ítems legacy con `appendPublicationId`. */\n selectedPublicationId?: string;\n /** Ítems de navegación. Por defecto, `ACCOUNT_NAV_BLOCKS`. */\n items?: NavLinkItem[];\n /**\n * Servicio de pines (`CmsProfileServices`, construido por el host con su\n * `axiosApi`/`authentication`). Si se omite, el anclado es solo visual y no\n * persiste entre sesiones.\n */\n profileServices?: SidebarRailPinService;\n};\n\n/**\n * Variante compacta del sidebar: rail vertical de íconos con etiqueta debajo,\n * sin modo expandido. Los ítems con hijos abren un menú flotante a la derecha.\n * Al pasar el mouse sobre un ítem aparece un botón para anclarlo arriba del\n * todo. El anclado se identifica por `item.module` y persiste vía\n * `profileServices.addPins`/`deletePins`/`getPins` (recurso de perfil).\n */\nexport function SidebarRail({\n pathname,\n permissions,\n LinkComponent = DefaultCmsLink,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n selectedPublicationId,\n items = ACCOUNT_NAV_BLOCKS,\n profileServices,\n}: SidebarRailProps) {\n const { t } = useCmsTranslation();\n const [pinnedModules, setPinnedModules] = useState<string[]>([]);\n\n useEffect(() => {\n if (!profileServices) return;\n let cancelled = false;\n profileServices\n .getPins()\n .then((response) => {\n if (cancelled) return;\n const modules = (response.pines ?? [])\n .map(extractPinnedModule)\n .filter((module): module is string => Boolean(module));\n setPinnedModules(modules);\n })\n .catch((error: unknown) => {\n console.error('[SidebarRail] getPins', error);\n });\n return () => {\n cancelled = true;\n };\n }, [profileServices]);\n\n const togglePin = (module: string) => {\n const wasPinned = pinnedModules.includes(module);\n const next = wasPinned\n ? pinnedModules.filter((m) => m !== module)\n : [...pinnedModules, module];\n setPinnedModules(next);\n\n if (!profileServices) return;\n const request = wasPinned\n ? profileServices.deletePins([module])\n : profileServices.addPins([module]);\n request.catch((error: unknown) => {\n console.error('[SidebarRail] togglePin', error);\n setPinnedModules(pinnedModules);\n });\n };\n\n const pinnedSet = new Set(pinnedModules);\n const pinnedItems = pinnedModules\n .map((module) => items.find((item) => item.module === module))\n .filter((item): item is NavLinkItem => Boolean(item));\n const unpinnedItems = items.filter((item) => !pinnedSet.has(item.module));\n\n return (\n <Box component=\"aside\" sx={SidebarRailStyles.sxRoot}>\n <Box sx={SidebarRailStyles.sxNavScroll}>\n <Box component=\"nav\" aria-label={t.sidebar('navAriaLabel')} sx={SidebarRailStyles.sxNav}>\n {pinnedItems.map((item) => (\n <RailItem\n key={item.href}\n item={item}\n blockIndex={items.indexOf(item)}\n pathname={pathname}\n permissions={permissions}\n LinkComponent={LinkComponent}\n legacyBaseUrl={legacyBaseUrl}\n cmsBaseUrl={cmsBaseUrl}\n legacySession={legacySession}\n selectedPublicationId={selectedPublicationId}\n pinned\n onTogglePin={() => togglePin(item.module)}\n />\n ))}\n {pinnedItems.length > 0 && <Box sx={SidebarRailStyles.sxPinDivider} />}\n {unpinnedItems.map((item) => (\n <RailItem\n key={item.href}\n item={item}\n blockIndex={items.indexOf(item)}\n pathname={pathname}\n permissions={permissions}\n LinkComponent={LinkComponent}\n legacyBaseUrl={legacyBaseUrl}\n cmsBaseUrl={cmsBaseUrl}\n legacySession={legacySession}\n selectedPublicationId={selectedPublicationId}\n pinned={false}\n onTogglePin={() => togglePin(item.module)}\n />\n ))}\n </Box>\n </Box>\n </Box>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport { cmsColors, radii, shadows } from '../../theme/variables';\n\nexport const SiteSelectorMenuStyles = {\n // Nameplate del header: píldora con logo + divisor + país + flecha.\n sxTriggerButton: (open: boolean): SxProps<Theme> => ({\n height: 38,\n borderRadius: radii.pill,\n border: 'none',\n color: cmsColors.textStrong,\n bgcolor: open ? cmsColors.secondaryHover : cmsColors.menuItemActive,\n textTransform: 'none',\n px: 1.5,\n py: 0,\n gap: 0,\n flexShrink: 0,\n '&:hover': {\n border: 'none',\n bgcolor: open ? cmsColors.secondaryHover : cmsColors.surfaceHover,\n },\n }),\n\n // Logo de la publicación seleccionada en el trigger (máx 70px de ancho).\n sxTriggerLogo: {\n display: 'block',\n maxWidth: 70,\n maxHeight: 20,\n width: 'auto',\n height: 'auto',\n objectFit: 'contain',\n } as SxProps<Theme>,\n\n sxTriggerDivider: {\n width: '1px',\n height: 18,\n flexShrink: 0,\n bgcolor: cmsColors.border,\n mx: 1.25,\n } as SxProps<Theme>,\n\n sxTriggerCountry: {\n fontSize: 14,\n fontWeight: 500,\n lineHeight: 1,\n color: cmsColors.textStrong,\n whiteSpace: 'nowrap',\n } as SxProps<Theme>,\n\n sxTriggerIcon: {\n fontSize: 20,\n ml: 0.5,\n } as SxProps<Theme>,\n\n // Panel flotante: superficie elevada, redondeado y con scroll (look del nuevo diseño).\n sxMenuPaper: {\n mt: 1,\n marginTop: 0,\n bgcolor: cmsColors.menuSurface,\n border: `1px solid ${cmsColors.border}`,\n borderRadius: '20px',\n boxShadow: shadows.menuSoft,\n width: 420,\n maxWidth: '92vw',\n maxHeight: 560,\n overflow: 'hidden',\n p: 1,\n } as SxProps<Theme>,\n\n sxMenuList: {\n p: 0,\n maxHeight: 540,\n overflowY: 'auto',\n } as SxProps<Theme>,\n\n // Cada marca/sitio es una sección; separador superior salvo la primera.\n sxSection: (isFirst: boolean): SxProps<Theme> => ({\n pt: isFirst ? 0 : 0.75,\n mt: isFirst ? 0 : 0.5,\n borderTop: isFirst ? 'none' : `1px solid ${cmsColors.border}`,\n }),\n\n sxSectionTitle: {\n px: 1.5,\n pt: 1,\n pb: 0.5,\n fontSize: 12,\n fontWeight: 500,\n letterSpacing: '0.07em',\n textTransform: 'uppercase',\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n // Fila de opción (publicación). `isSub` la indenta como sub-sitio.\n sxOption: (selected: boolean, isSub: boolean): SxProps<Theme> => ({\n display: 'flex',\n alignItems: 'center',\n // 8px entre el punto/check/flecha y el nombre (NAA-4847: −2px respecto de los 10px previos).\n gap: 1,\n width: '100%',\n height: 48,\n minHeight: 48,\n boxSizing: 'border-box',\n pl: isSub ? 1.5 : 1.5,\n pr: 1.5,\n py: 0.5,\n borderRadius: '14px',\n bgcolor: selected ? cmsColors.secondary : 'transparent',\n // Hover: state layer M3 `onSurface` al 8% (#191C20), común a los desplegables.\n '&:hover': {\n bgcolor: selected ? cmsColors.secondary : cmsColors.neutralHover,\n },\n '&.Mui-selected': {\n bgcolor: cmsColors.secondary,\n '&:hover': { bgcolor: cmsColors.secondary },\n },\n }),\n\n // Zona inicial de la fila (punto / check / flecha). Más ancha en sub-filas\n // para alinear con la línea-guía vertical.\n sxLead: (isSub: boolean): SxProps<Theme> => ({\n width: isSub ? 42 : 28,\n flexShrink: 0,\n display: 'grid',\n placeItems: 'center',\n }),\n\n sxLeadDot: {\n width: 5,\n height: 5,\n borderRadius: radii.pill,\n bgcolor: cmsColors.border,\n } as SxProps<Theme>,\n\n sxLeadCheck: {\n fontSize: 20,\n color: cmsColors.onSecondaryContainer,\n } as SxProps<Theme>,\n\n // Flecha que despliega los sub-sitios; rota 90° al abrir.\n sxTwist: (open: boolean): SxProps<Theme> => ({\n width: 28,\n height: 28,\n minWidth: 0,\n p: 0,\n borderRadius: radii.pill,\n display: 'grid',\n placeItems: 'center',\n color: 'm3.onSurfaceVariant',\n transition: 'transform .15s, background-color .12s',\n transform: open ? 'rotate(90deg)' : 'none',\n '&:hover': { bgcolor: 'action.hover' },\n }),\n\n sxName: (selected: boolean, isSub: boolean): SxProps<Theme> => ({\n flex: 1,\n minWidth: 0,\n fontSize: 14,\n fontWeight: 500,\n lineHeight: 1.4,\n color: selected\n ? cmsColors.onSecondaryContainer\n : isSub\n ? 'm3.onSurfaceVariant'\n : cmsColors.textStrong,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n\n // Contador de sub-sitios (solo cuando la publicación trae hijos).\n sxCount: (selected: boolean): SxProps<Theme> => ({\n flexShrink: 0,\n fontSize: 11,\n fontWeight: 600,\n lineHeight: 1,\n px: 0.875,\n py: '3px',\n borderRadius: radii.pill,\n bgcolor: selected ? cmsColors.surface : cmsColors.menuItemActive,\n color: selected ? cmsColors.onSecondaryContainer : cmsColors.textNav,\n }),\n\n sxLogoWrap: {\n ml: 'auto',\n pl: 1.25,\n display: 'flex',\n alignItems: 'center',\n flexShrink: 0,\n } as SxProps<Theme>,\n\n sxLogoImg: {\n display: 'block',\n maxWidth: 70,\n maxHeight: 24,\n width: 'auto',\n height: 'auto',\n objectFit: 'contain',\n } as SxProps<Theme>,\n\n // Contenedor de sub-sitios con línea-guía vertical a la izquierda.\n sxKids: {\n position: 'relative',\n my: 0.25,\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: 25,\n top: 2,\n bottom: 8,\n width: '1.5px',\n bgcolor: cmsColors.border,\n borderRadius: '2px',\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Typography from '@mui/material/Typography';\nimport { useState } from 'react';\n\nimport type { Publication } from '../../types/publication';\nimport type { SiteSection } from '../../types/site';\nimport { findPublicationLabel } from '../../utils/site-selector';\nimport { toTestId } from '../../utils/toTestId';\nimport { SiteSelectorMenuStyles } from './SiteSelectorMenu.styles';\n\n/** ¿La publicación trae sub-sitios (multisitio)? */\nfunction hasChildren(publication: Publication): boolean {\n return Boolean(publication.children && publication.children.length > 0);\n}\n\n/**\n * Fila de una publicación. Si tiene hijos, muestra la flecha para desplegarlos\n * y un contador; si no, un punto (o el check cuando está seleccionada).\n */\nfunction SiteMenuItem({\n publication,\n selected,\n isSub,\n href,\n imageUrl,\n expanded,\n onToggle,\n}: {\n publication: Publication;\n selected: boolean;\n isSub: boolean;\n href: string;\n imageUrl?: string;\n expanded?: boolean;\n onToggle?: () => void;\n}) {\n const parent = hasChildren(publication);\n\n return (\n <a href={href} style={{ textDecoration: 'none', color: 'inherit' }}>\n <MenuItem\n selected={selected}\n data-testid={`link-site-${toTestId(publication.id)}`}\n sx={SiteSelectorMenuStyles.sxOption(selected, isSub)}>\n <Box sx={SiteSelectorMenuStyles.sxLead(isSub)}>\n {parent ? (\n <Box\n component=\"span\"\n role=\"button\"\n data-testid={`toggle-site-children-${toTestId(publication.id)}`}\n data-action={expanded ? 'collapse' : 'expand'}\n aria-label=\"expand\"\n onClick={(event) => {\n // Desplegar/plegar sin navegar a la publicación.\n event.preventDefault();\n event.stopPropagation();\n onToggle?.();\n }}\n sx={SiteSelectorMenuStyles.sxTwist(Boolean(expanded))}>\n <KeyboardArrowRightIcon sx={{ fontSize: 20 }} />\n </Box>\n ) : selected ? (\n <CheckIcon sx={SiteSelectorMenuStyles.sxLeadCheck} />\n ) : (\n <Box component=\"span\" sx={SiteSelectorMenuStyles.sxLeadDot} />\n )}\n </Box>\n\n <Typography sx={SiteSelectorMenuStyles.sxName(selected, isSub)}>\n {publication.description}\n </Typography>\n\n {parent ? (\n <Box component=\"span\" sx={SiteSelectorMenuStyles.sxCount(selected)}>\n {publication.children!.length}\n </Box>\n ) : null}\n\n {imageUrl ? (\n <Box sx={SiteSelectorMenuStyles.sxLogoWrap}>\n <Box\n component=\"img\"\n src={imageUrl}\n alt={publication.description}\n sx={SiteSelectorMenuStyles.sxLogoImg}\n />\n </Box>\n ) : null}\n </MenuItem>\n </a>\n );\n}\n\nexport type SiteSelectorMenuProps = {\n sites: SiteSection[];\n selectedPublicationId?: string;\n getPublicationHref: (publication: Publication) => string;\n resolvePublicationImageUrl?: (imagePath: string) => string;\n};\n\nexport function SiteSelectorMenu({\n sites,\n selectedPublicationId,\n getPublicationHref,\n resolvePublicationImageUrl,\n}: SiteSelectorMenuProps) {\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const open = Boolean(anchorEl);\n\n // Sub-sitios desplegados. Arranca con los padres del seleccionado abiertos.\n const [expandedIds, setExpandedIds] = useState<Set<number>>(() => {\n const initial = new Set<number>();\n sites.forEach((section) =>\n section.publications.forEach((publication) => {\n if (\n hasChildren(publication) &&\n publication.children!.some(\n (child) => String(child.id) === selectedPublicationId,\n )\n ) {\n initial.add(publication.id);\n }\n }),\n );\n return initial;\n });\n\n const handleOpen = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const toggleExpanded = (id: number) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const isSelected = (publication: Publication) =>\n Number(selectedPublicationId) === publication.id;\n\n const resolveImage = (publication: Publication) =>\n publication.imagePath && resolvePublicationImageUrl\n ? resolvePublicationImageUrl(publication.imagePath)\n : undefined;\n\n const labelId = selectedPublicationId ?? '';\n\n // Publicación seleccionada (incluye sub-sitios) para el nameplate del header.\n const selectedPublication = sites\n .flatMap((section) =>\n section.publications.flatMap((publication) => [\n publication,\n ...(publication.children ?? []),\n ]),\n )\n .find((publication) => String(publication.id) === labelId);\n const triggerLabel = selectedPublication?.description\n ? selectedPublication.description\n : findPublicationLabel(sites, labelId);\n const triggerLogo = selectedPublication\n ? resolveImage(selectedPublication)\n : undefined;\n\n return (\n <>\n <Button\n id=\"site-selector-button\"\n data-testid=\"dropdown-toggle-site-selector\"\n aria-controls={open ? 'site-selector-menu' : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n variant=\"outlined\"\n onClick={handleOpen}\n endIcon={\n <KeyboardArrowDownIcon sx={SiteSelectorMenuStyles.sxTriggerIcon} />\n }\n sx={SiteSelectorMenuStyles.sxTriggerButton(open)}>\n {triggerLogo ? (\n <Box\n component=\"img\"\n src={triggerLogo}\n alt=\"\"\n sx={SiteSelectorMenuStyles.sxTriggerLogo}\n />\n ) : null}\n {triggerLogo ? (\n <Box component=\"span\" sx={SiteSelectorMenuStyles.sxTriggerDivider} />\n ) : null}\n <Box component=\"span\" sx={SiteSelectorMenuStyles.sxTriggerCountry}>\n {triggerLabel}\n </Box>\n </Button>\n\n <Menu\n id=\"site-selector-menu\"\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{\n paper: {\n sx: SiteSelectorMenuStyles.sxMenuPaper,\n },\n list: {\n 'aria-labelledby': 'site-selector-button',\n disablePadding: true,\n sx: SiteSelectorMenuStyles.sxMenuList,\n },\n }}>\n {sites.map((section, sectionIndex) => (\n <Box\n key={section.title}\n sx={SiteSelectorMenuStyles.sxSection(sectionIndex === 0)}>\n <Typography sx={SiteSelectorMenuStyles.sxSectionTitle}>\n {section.title}\n </Typography>\n\n {section.publications.map((publication) => {\n const parent = hasChildren(publication);\n const expanded = expandedIds.has(publication.id);\n\n return (\n <Box key={publication.id}>\n <SiteMenuItem\n publication={publication}\n selected={isSelected(publication)}\n isSub={false}\n href={getPublicationHref(publication)}\n imageUrl={resolveImage(publication)}\n expanded={expanded}\n onToggle={() => toggleExpanded(publication.id)}\n />\n\n {parent && expanded ? (\n <Box sx={SiteSelectorMenuStyles.sxKids}>\n {publication.children!.map((child) => (\n <SiteMenuItem\n key={child.id}\n publication={child}\n selected={isSelected(child)}\n isSub\n href={getPublicationHref(child)}\n imageUrl={resolveImage(child)}\n />\n ))}\n </Box>\n ) : null}\n </Box>\n );\n })}\n </Box>\n ))}\n </Menu>\n </>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii, shadows } from '../../theme/variables';\n\n/**\n * Estilos del menú \"Apariencia\" del TopBar: switch \"Tema nuevo\" + segmentado\n * Claro/Oscuro (dos botones UNIDOS, look de píldora segmentada). Los colores\n * usan tokens mode-aware (los hexes de diseño son los de modo claro; en oscuro\n * se adaptan solos): `m3.onSurfaceVariant` (#43474E), `text.primary` (#191C20),\n * `onSecondaryContainer` (#2C4678) y `m3.outline` (#74777F).\n */\nexport const AppearanceMenuStyles = {\n /** Paper del popover — ancho FIJO (no varía al mostrar/ocultar el texto de ayuda). */\n sxPaper: {\n mt: 1,\n p: 2,\n width: 280,\n borderRadius: radii.lg,\n bgcolor: cmsColors.menuSurface,\n boxShadow: shadows.menu,\n fontFamily: fontFamilies.googleSans,\n } as SxProps<Theme>,\n\n /** Título \"Apariencia\": Google Sans 14px #43474E. */\n sxTitle: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n color: 'm3.onSurfaceVariant',\n mb: 1.5,\n } as SxProps<Theme>,\n\n /** Fila del switch (label a la izquierda, switch a la derecha). */\n sxRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n } as SxProps<Theme>,\n\n /** Label principal (\"Tema nuevo\"): Google Sans 15px #191C20. */\n sxRowLabel: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 15,\n fontWeight: 500,\n color: 'text.primary',\n lineHeight: 1.3,\n } as SxProps<Theme>,\n\n /** Subtítulo (\"Interfaz rediseñada\"): Google Sans 12px #43474E, +5px de separación del título. */\n sxRowSub: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 12,\n color: 'm3.onSurfaceVariant',\n lineHeight: 1.3,\n mt: '5px',\n } as SxProps<Theme>,\n\n /** Switch 52×25, con el azul primario del CMS al estar activo. */\n sxSwitch: {\n width: 52,\n height: 25,\n padding: 0,\n display: 'flex',\n '& .MuiSwitch-switchBase': {\n padding: 0,\n margin: '3.5px',\n '&.Mui-checked': {\n transform: 'translateX(27px)',\n color: cmsColors.white,\n '& + .MuiSwitch-track': {\n backgroundColor: cmsColors.primary,\n opacity: 1,\n },\n },\n },\n '& .MuiSwitch-thumb': { width: 18, height: 18, boxShadow: 'none' },\n '& .MuiSwitch-track': {\n borderRadius: '999px',\n backgroundColor: cmsColors.controlBorder,\n opacity: 1,\n },\n } as SxProps<Theme>,\n\n /** Separador. */\n sxDivider: {\n my: 1.5,\n borderColor: cmsColors.border,\n } as SxProps<Theme>,\n\n /** Caption \"MODO\": Google Sans 12px #43474E en mayúsculas. */\n sxCaption: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 12,\n fontWeight: 600,\n letterSpacing: '0.5px',\n textTransform: 'uppercase',\n color: 'm3.onSurfaceVariant',\n mb: 1,\n } as SxProps<Theme>,\n\n /**\n * Segmentado UNIDO: dos botones de 120×40 pegados, con extremos redondeados\n * (píldora) y un divisor central. Borde #74777F.\n */\n sxToggleGroup: {\n display: 'inline-flex',\n width: 'fit-content',\n '& .MuiToggleButtonGroup-grouped': {\n width: 120,\n height: 40,\n margin: 0,\n border: '1px solid',\n borderColor: 'm3.outline',\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n gap: '6px',\n // Label del botón inactivo (p. ej. \"Oscuro\"): #191C20.\n color: 'text.primary',\n '& .MuiSvgIcon-root': { fontSize: 18 },\n // Botón izquierdo: extremo izquierdo redondeado, sin borde derecho (el divisor lo pone el derecho).\n '&:first-of-type': {\n borderTopLeftRadius: radii.pill,\n borderBottomLeftRadius: radii.pill,\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n borderRight: 0,\n },\n // Botón derecho: extremo derecho redondeado, con el borde divisor a la izquierda.\n '&:last-of-type': {\n borderTopRightRadius: radii.pill,\n borderBottomRightRadius: radii.pill,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n borderLeft: '1px solid',\n borderColor: 'm3.outline',\n marginLeft: 0,\n },\n '&:hover': { backgroundColor: cmsColors.surfaceHover },\n // Botón activo (p. ej. \"Claro\"): texto #2C4678 sobre contenedor secundario.\n '&.Mui-selected': {\n backgroundColor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n borderColor: 'm3.outline',\n '&:hover': { backgroundColor: cmsColors.secondary },\n },\n '&.Mui-disabled': {\n opacity: 0.45,\n color: 'text.disabled',\n borderColor: 'm3.outline',\n },\n },\n } as SxProps<Theme>,\n\n /** Texto de ayuda cuando el switch está apagado. */\n sxHelper: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 12,\n color: 'm3.onSurfaceVariant',\n mt: 1.5,\n lineHeight: 1.4,\n } as SxProps<Theme>,\n};\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, radii, shadows } from '../../theme/variables';\n\nconst CLOCK_TIME_SIZE = 13;\nconst CLOCK_META_SIZE = 11;\n\nexport const ICON_SLOT_SIZE = 48;\nexport const HEADER_HEIGHT = 48;\nexport const FRAME_GAP = '15px';\nconst DIVIDER_HEIGHT = 27.6;\n\nexport const TopBarStyles = {\n sxAppBar: {\n bgcolor: 'm3.surfaceContainer',\n color: 'm3.onSurfaceVariant',\n height: HEADER_HEIGHT,\n } as SxProps<Theme>,\n\n sxToolbar: {\n minHeight: HEADER_HEIGHT,\n height: HEADER_HEIGHT,\n pl: '10px',\n pr: 2,\n gap: 1.5,\n } as SxProps<Theme>,\n\n sxMenuButton: {\n width: 40,\n height: 40,\n flexShrink: 0,\n borderRadius: '100px',\n color: 'm3.onSurfaceVariant',\n '&:hover': {\n bgcolor: cmsColors.surfaceHover,\n },\n } as SxProps<Theme>,\n\n sxMenuButtonIcon: {\n fontSize: 24,\n } as SxProps<Theme>,\n\n sxLogoBox: {\n width: 200,\n height: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n my: 'auto',\n } as SxProps<Theme>,\n\n sxActionsFrame: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: FRAME_GAP,\n flexShrink: 0,\n } as SxProps<Theme>,\n\n sxIconActionsRow: {\n display: 'flex',\n alignItems: 'center',\n height: ICON_SLOT_SIZE,\n flexShrink: 0,\n } as SxProps<Theme>,\n\n sxActionIcon: {\n width: ICON_SLOT_SIZE,\n height: ICON_SLOT_SIZE,\n color: 'm3.onSurfaceVariant',\n borderRadius: '50%',\n } as SxProps<Theme>,\n\n sxActionIconGlyph: {\n fontSize: 24,\n } as SxProps<Theme>,\n\n sxBadge: {\n '& .MuiBadge-badge': {\n // Fondo #BA1A1A y texto blanco los aporta `color=\"error\"` del Badge\n // (error.main = #BA1A1A, contrastText = onError = #FFFFFF).\n fontSize: 10,\n fontWeight: 600,\n minWidth: 16,\n height: 16,\n px: 0.5,\n top: 5,\n right: 5,\n },\n } as SxProps<Theme>,\n\n sxDivider: {\n width: '1px',\n height: DIVIDER_HEIGHT,\n flexShrink: 0,\n bgcolor: cmsColors.border,\n } as SxProps<Theme>,\n\n sxClock: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexShrink: 0,\n } as SxProps<Theme>,\n\n sxClockIcon: {\n fontSize: 20,\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n sxClockText: {\n display: 'flex',\n flexDirection: 'column',\n } as SxProps<Theme>,\n\n sxClockTime: {\n fontSize: CLOCK_TIME_SIZE,\n fontWeight: 600,\n lineHeight: 1.2,\n color: cmsColors.textStrong,\n } as SxProps<Theme>,\n\n sxClockMeta: {\n fontSize: CLOCK_META_SIZE,\n lineHeight: 1.2,\n color: cmsColors.textNav,\n } as SxProps<Theme>,\n\n sxProfileButton: {\n p: 0,\n width: 36,\n height: 36,\n flexShrink: 0,\n borderRadius: '50%',\n // Círculo gris lavanda `m3.surfaceVariant` (#E0E2EC) con el ícono en\n // `m3.onSurfaceVariant` (#43474E), en reposo. El botón es el dueño del fondo\n // (el avatar va transparente vía `transparentFallbackBg`), así el círculo\n // mide 36×36. Al hover se superpone el state layer neutro `neutralHover`\n // (M3 onSurface ~8%) SOBRE el gris —vía `backgroundImage` para no reemplazar\n // el `bgcolor`—: oscurece en claro y aclara en oscuro, feedback en ambos modos.\n bgcolor: 'm3.surfaceVariant',\n color: 'm3.onSurfaceVariant',\n '&:hover': {\n bgcolor: 'm3.surfaceVariant',\n backgroundImage: `linear-gradient(${cmsColors.neutralHover}, ${cmsColors.neutralHover})`,\n },\n } as SxProps<Theme>,\n\n sxProfileAvatar: {\n width: 34,\n height: 34,\n border: `1px solid ${cmsColors.avatarBorder}`,\n bgcolor: cmsColors.avatarBg,\n } as SxProps<Theme>,\n\n sxProfileMenuPaper: {\n mt: 1,\n minWidth: 255,\n borderRadius: radii.accountMenu,\n bgcolor: cmsColors.menuSurface,\n py: 0.5,\n boxShadow: shadows.accountMenu,\n } as SxProps<Theme>,\n\n sxProfileMenuItem: {\n // Inset lateral (`mx`) + `px` reducido: el resaltado del hover no llega a los\n // bordes del paper (queda \"flotando\"), pero el contenido sigue a 16px del\n // borde (8+8), alineado con el header. Esquinas redondeadas para el hover.\n mx: 1,\n px: 1,\n py: 1.25,\n borderRadius: radii.md,\n fontSize: 14,\n color: cmsColors.textStrong,\n // Hover: state layer M3 `onSurface` al 8% (#191C20), común a los desplegables.\n '&:hover': {\n bgcolor: cmsColors.neutralHover,\n },\n } as SxProps<Theme>,\n\n sxProfileMenuListItemIcon: {\n minWidth: 36,\n color: 'm3.onSurfaceVariant',\n '& .MuiSvgIcon-root': {\n fontSize: 20,\n },\n } as SxProps<Theme>,\n\n sxProfileMenuDivider: {\n // Sin margen vertical: el divisor queda pegado a los ítems, así el resaltado\n // del hover llega hasta la línea (sin el hueco de ~4px que dejaba `my`).\n my: 0,\n borderColor: cmsColors.border,\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport DarkModeOutlinedIcon from '@mui/icons-material/DarkModeOutlined';\nimport LightModeOutlinedIcon from '@mui/icons-material/LightModeOutlined';\nimport PaletteOutlinedIcon from '@mui/icons-material/PaletteOutlined';\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport Popover from '@mui/material/Popover';\nimport Switch from '@mui/material/Switch';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { useColorScheme } from '@mui/material/styles';\nimport { useEffect, useState, type MouseEvent } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport {\n readThemePreference,\n writeThemePreference,\n type ThemeMode,\n} from '../../theme/themePreference';\nimport { AppearanceMenuStyles } from './AppearanceMenu.styles';\nimport { TopBarStyles } from './TopBar.styles';\n\n/**\n * Menú \"Apariencia\" del TopBar (ícono de paleta). Un switch \"Tema nuevo\"\n * habilita la selección de modo; con el switch apagado se fuerza el modo claro\n * y el segmentado Claro/Oscuro queda deshabilitado. Al elegir \"Oscuro\" se\n * togglea el `data-mui-color-scheme` de MUI y todo el sitio pasa a oscuro.\n *\n * La selección se **persiste en `localStorage`** (helper `themePreference`), así\n * el menú recuerda el switch y el modo, y el gestor abre en ese tema (por\n * gestor: localStorage está aislado por origen). Solo afecta estilos: no toca\n * datos ni funcionalidad del gestor.\n */\nexport function AppearanceMenu() {\n const { t } = useCmsTranslation();\n const { setMode } = useColorScheme();\n\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n // \"Tema nuevo\": habilita la selección de modo. Apagado → se fuerza claro.\n const [enabled, setEnabled] = useState(true);\n // Modo elegido por el usuario (se recuerda aunque se apague el switch).\n const [desiredMode, setDesiredMode] = useState<ThemeMode>('light');\n\n const open = Boolean(anchorEl);\n const title = t.topBar('appearance');\n\n // Hidratar desde localStorage tras el montaje (no en el initializer de\n // useState, para no romper la hidratación server/cliente: el SSR arranca con\n // los defaults). Mismo criterio que el `locale` del login.\n useEffect(() => {\n const pref = readThemePreference();\n /* eslint-disable react-hooks/set-state-in-effect -- sync único desde localStorage en el mount (evita mismatch de hidratación) */\n setEnabled(pref.enabled);\n setDesiredMode(pref.mode);\n /* eslint-enable react-hooks/set-state-in-effect */\n }, []);\n\n // Aplicar el modo efectivo a MUI cada vez que cambie (hidratación o usuario).\n // La persistencia se hace en los handlers (no acá) para no pisar el\n // localStorage con los defaults antes de hidratar.\n useEffect(() => {\n setMode(enabled ? desiredMode : 'light');\n }, [enabled, desiredMode, setMode]);\n\n const handleEnabledChange = (checked: boolean) => {\n setEnabled(checked);\n writeThemePreference({ enabled: checked, mode: desiredMode });\n };\n\n const handleModeChange = (\n _event: MouseEvent<HTMLElement>,\n value: ThemeMode | null,\n ) => {\n if (value && enabled) {\n setDesiredMode(value);\n writeThemePreference({ enabled, mode: value });\n }\n };\n\n const selected: ThemeMode = enabled ? desiredMode : 'light';\n\n return (\n <>\n <Tooltip title={title}>\n <IconButton\n onClick={(event) => setAnchorEl(event.currentTarget)}\n aria-label={title}\n aria-haspopup=\"true\"\n aria-expanded={open}\n data-testid=\"dropdown-toggle-appearance\"\n sx={TopBarStyles.sxActionIcon}>\n <PaletteOutlinedIcon sx={TopBarStyles.sxActionIconGlyph} />\n </IconButton>\n </Tooltip>\n\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{\n paper: {\n sx: AppearanceMenuStyles.sxPaper,\n ...({ 'data-testid': 'dropdown-menu-appearance' } as object),\n },\n }}>\n <Typography sx={AppearanceMenuStyles.sxTitle}>{title}</Typography>\n\n <Box sx={AppearanceMenuStyles.sxRow}>\n <Box>\n <Typography sx={AppearanceMenuStyles.sxRowLabel}>\n {t.topBar('newTheme')}\n </Typography>\n <Typography sx={AppearanceMenuStyles.sxRowSub}>\n {t.topBar('newThemeSubtitle')}\n </Typography>\n </Box>\n <Switch\n checked={enabled}\n onChange={(event) => handleEnabledChange(event.target.checked)}\n data-testid=\"check-new-theme\"\n sx={AppearanceMenuStyles.sxSwitch}\n slotProps={{ input: { 'aria-label': t.topBar('newTheme') } }}\n />\n </Box>\n\n <Divider sx={AppearanceMenuStyles.sxDivider} />\n\n <Typography sx={AppearanceMenuStyles.sxCaption}>\n {t.topBar('modeLabel')}\n </Typography>\n\n <ToggleButtonGroup\n exclusive\n value={selected}\n onChange={handleModeChange}\n disabled={!enabled}\n aria-label={t.topBar('modeLabel')}\n sx={AppearanceMenuStyles.sxToggleGroup}>\n <ToggleButton\n value=\"light\"\n aria-label={t.topBar('modeLight')}\n data-testid=\"btn-theme-light\"\n data-action=\"light\">\n <LightModeOutlinedIcon />\n {t.topBar('modeLight')}\n </ToggleButton>\n <ToggleButton\n value=\"dark\"\n aria-label={t.topBar('modeDark')}\n data-testid=\"btn-theme-dark\"\n data-action=\"dark\">\n <DarkModeOutlinedIcon />\n {t.topBar('modeDark')}\n </ToggleButton>\n </ToggleButtonGroup>\n\n {!enabled && (\n <Typography sx={AppearanceMenuStyles.sxHelper}>\n {t.topBar('classicUnavailable')}\n </Typography>\n )}\n </Popover>\n </>\n );\n}\n","/**\n * Transforma la respuesta cruda de `POST /dashboard/notification`\n * (`newsTask` / `expireTask` / `videos`) en el feed único, ordenado por hora,\n * que consume el desplegable de la campanita (`NotificationsMenu`).\n *\n * Replica la lógica del header del CMS Angular (`cmsmedios-ux`):\n * `buildAssignedTopicsGroup`, `buildActivityNotificationsGroup`,\n * `buildSystemNote`, `buildDatetimeParts`, `parseSystemDescription`,\n * `highlightVideoFormats` y `buildDueParts`. Todas las fechas se calculan en la\n * zona de redacción de la publicación (offset GMT fijo), igual que el resto del CMS.\n */\n\nimport type { DashboardNotificationsResponse } from '../../services/dashboard';\nimport { toSiteWallClock } from '../../utils/site-time';\n\n/** Tipo de tarjeta del feed. */\nexport type NotificationFeedType =\n | 'assigned'\n | 'pending'\n | 'unassigned'\n | 'system'\n | 'editorialOpportunity';\n\n/** Tema individual dentro de una tarjeta agrupada (asignados / por vencer / copilot). */\nexport interface NotificationTopic {\n /** Id crudo del ítem. Para copilot es el `opportunity_id` (necesario en el snooze). */\n id?: string;\n title: string;\n /** Código visible del tema (`CP-<id>`), en asignados / por vencer. */\n code: string;\n /** Temas asignados: etiqueta relativa de la fecha de asignación. */\n assignedToday?: boolean;\n assignedYesterday?: boolean;\n assignedDate?: string;\n /** Temas por vencer: fecha (\"DD/MM\") y hora (\"HH:mm\") de vencimiento. */\n dueDate?: string;\n dueTime?: string;\n /** Oportunidades copilot: % de coincidencia editorial (score) y tema. */\n matchPercent?: number;\n topic?: string;\n /** Datos de navegación al planning del evento destino. */\n eventId?: string;\n eventDate?: number;\n site?: string;\n publication?: number;\n unread?: boolean;\n}\n\n/** Item del feed ya listo para renderizar. */\nexport interface NotificationFeedItem {\n id: string;\n type: NotificationFeedType;\n /** Etiquetas de fecha/hora relativas (zona de redacción). */\n isToday: boolean;\n isYesterday: boolean;\n /** Fecha \"DD/MM/AAAA\" (se muestra si no es hoy ni ayer). */\n date: string;\n /** Hora \"HH:mm\" (24h). */\n time: string;\n /** Timestamp crudo usado para ordenar el feed por hora. */\n sortTime: number;\n unread: boolean;\n\n /** Tarjetas agrupadas (asignados / por vencer). */\n count?: number;\n expirationDatetime?: string;\n children?: NotificationTopic[];\n\n /** Título de la tarea (desasignación). */\n title?: string;\n\n /** Notificación del sistema (video) / desasignación. */\n userFullName?: string;\n userLogin?: string;\n /** HTML seguro (escapado + formatos de video resaltados) para `dangerouslySetInnerHTML`. */\n preTextHtml?: string;\n pathPart?: string;\n postTextHtml?: string;\n detailHtml?: string;\n}\n\n/** Formatos de video que se resaltan (negrita + mayúscula) dentro del texto. */\nconst VIDEO_FORMATS = ['hls', 'dash', 'mp4', 'webm', 'mov', 'm3u8', 'mpd'];\n\nfunction pad(n: number): string {\n return String(n).padStart(2, '0');\n}\n\n/**\n * Normaliza un campo de timestamp del backend a epoch ms. Acepta un número, un\n * string numérico, una fecha ISO 8601 (`created_at` de copilot) o un objeto\n * `{ time }` (como `timeStamp.time`).\n */\nfunction readEpoch(value: unknown): number | null {\n if (value == null) return null;\n if (typeof value === 'object') {\n const time = (value as { time?: unknown }).time;\n return readEpoch(time);\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n // String puramente numérico → epoch; si no, se intenta como fecha ISO.\n if (/^\\d+$/.test(trimmed)) return parseInt(trimmed, 10);\n const parsed = Date.parse(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n }\n const n = Number(value);\n return Number.isNaN(n) ? null : n;\n}\n\n/**\n * Descompone un timestamp (epoch ms, UTC) en las partes de fecha/hora de la\n * zona de redacción, más los indicadores relativos hoy/ayer.\n */\nfunction buildDatetimeParts(\n value: unknown,\n gmt: string | null | undefined,\n nowWall: number,\n): {\n date: string;\n time: string;\n isToday: boolean;\n isYesterday: boolean;\n sortTime: number;\n} {\n const epoch = readEpoch(value);\n if (epoch == null) {\n return { date: '', time: '', isToday: false, isYesterday: false, sortTime: 0 };\n }\n const wall = toSiteWallClock(epoch, gmt);\n const d = new Date(wall);\n const date = `${pad(d.getUTCDate())}/${pad(d.getUTCMonth() + 1)}/${d.getUTCFullYear()}`;\n const time = `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}`;\n\n const now = new Date(nowWall);\n const yesterday = new Date(nowWall - 86_400_000);\n const sameDay = (a: Date, b: Date) =>\n a.getUTCFullYear() === b.getUTCFullYear() &&\n a.getUTCMonth() === b.getUTCMonth() &&\n a.getUTCDate() === b.getUTCDate();\n\n return {\n date,\n time,\n isToday: sameDay(d, now),\n isYesterday: sameDay(d, yesterday),\n sortTime: epoch,\n };\n}\n\n/** Fecha \"DD/MM\" y hora \"HH:mm\" de vencimiento, en zona de redacción. */\nfunction buildDueParts(\n value: unknown,\n gmt: string | null | undefined,\n): { date: string; time: string } {\n const epoch = readEpoch(value);\n if (epoch == null) return { date: '', time: '' };\n const d = new Date(toSiteWallClock(epoch, gmt));\n return {\n date: `${pad(d.getUTCDate())}/${pad(d.getUTCMonth() + 1)}`,\n time: `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}`,\n };\n}\n\n/** Escapa HTML y resalta los formatos de video conocidos en negrita + mayúscula. */\nfunction highlightVideoFormats(text: string): string {\n if (!text) return '';\n const escaped = text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n const pattern = new RegExp(`\\\\b(${VIDEO_FORMATS.join('|')})\\\\b`, 'gi');\n return escaped.replace(pattern, (match) => `<strong>${match.toUpperCase()}</strong>`);\n}\n\n/** Separa una descripción en texto previo, path (\"/algo/archivo.ext\") y texto posterior. */\nfunction parseSystemDescription(description: string): {\n preText: string;\n pathPart: string;\n postText: string;\n} {\n if (!description) return { preText: '', pathPart: '', postText: '' };\n const match = description.match(/(\\/[\\w\\-./]+\\.[\\w]+)/);\n if (match && match.index !== undefined) {\n return {\n preText: description.substring(0, match.index).trim(),\n pathPart: match[1],\n postText: description.substring(match.index + match[1].length).trim(),\n };\n }\n return { preText: description, pathPart: '', postText: '' };\n}\n\n/** Construye la card de nuevos temas asignados a partir de `newsTask`. */\nfunction buildAssignedGroup(\n tasks: DashboardNotificationsResponse['newsTask'],\n gmt: string | null | undefined,\n nowWall: number,\n): NotificationFeedItem | null {\n if (!tasks || !tasks.length) return null;\n // Hora de la card: la del delivery (`timeStamp.time`) del tema más reciente.\n const withDelivery = tasks.filter((t) => t && readEpoch(t.timeStamp) != null);\n const latest = withDelivery.length\n ? withDelivery.reduce(\n (max, t) =>\n Number(readEpoch(t.timeStamp)) > Number(readEpoch(max.timeStamp)) ? t : max,\n withDelivery[0],\n )\n : null;\n const datetime = buildDatetimeParts(\n latest ? latest.timeStamp : Date.now(),\n gmt,\n nowWall,\n );\n return {\n id: 'assigned-group',\n type: 'assigned',\n ...datetime,\n count: tasks.length,\n children: tasks.map((task) => {\n const assigned = buildDatetimeParts(task.assignedDate, gmt, nowWall);\n return {\n title: String(task.title ?? ''),\n code: `CP-${task.id}`,\n assignedToday: assigned.isToday,\n assignedYesterday: assigned.isYesterday,\n assignedDate: assigned.date,\n eventId: task.id != null ? String(task.id) : undefined,\n eventDate: task.startdate,\n site: task.site,\n publication: task.publication,\n unread: !task.isRead,\n };\n }),\n unread: tasks.some((t) => !t.isRead),\n };\n}\n\n/** Construye la card de actividades por vencer a partir de `expireTask`. */\nfunction buildPendingGroup(\n activities: DashboardNotificationsResponse['expireTask'],\n gmt: string | null | undefined,\n nowWall: number,\n now: number,\n): NotificationFeedItem | null {\n if (!activities || !activities.length) return null;\n const withDate = activities.filter((a) => a && a.startdate != null);\n const earliest = withDate.length\n ? withDate.reduce(\n (min, a) => (Number(a.startdate) < Number(min.startdate) ? a : min),\n withDate[0],\n )\n : activities[0];\n // `expireTask` no trae hora de entrega desde el back: se sella con \"ahora\"\n // para que la alerta figure como recién recibida (simplificación respecto de\n // la memoria por ids del CMS Angular). Los vencimientos reales de cada tema\n // se muestran en la lista desplegada (dueDate/dueTime).\n const datetime = buildDatetimeParts(now, gmt, nowWall);\n const earliestDue = earliest.startdate != null ? buildDueParts(earliest.startdate, gmt) : null;\n return {\n id: 'pending-group',\n type: 'pending',\n ...datetime,\n count: activities.length,\n expirationDatetime: earliestDue ? `${earliestDue.date}, ${earliestDue.time}hs` : '',\n children: activities.map((activity) => {\n const due = buildDueParts(activity.startdate, gmt);\n return {\n title: String(activity.title ?? ''),\n code: `CP-${activity.id}`,\n dueDate: due.date,\n dueTime: due.time,\n eventId: activity.id != null ? String(activity.id) : undefined,\n eventDate: activity.startdate,\n site: activity.site,\n publication: activity.publication,\n unread: !activity.isRead,\n };\n }),\n unread: activities.some((a) => !a.isRead),\n };\n}\n\n/** Construye una notificación del sistema (video) a partir de un item de `videos`. */\nfunction buildSystemNote(\n item: NonNullable<DashboardNotificationsResponse['videos']>[number],\n gmt: string | null | undefined,\n nowWall: number,\n index: number,\n): NotificationFeedItem {\n const description = String(item.description ?? '');\n const openIdx = description.indexOf('(');\n const closingIdx = description.indexOf(')');\n let userFullName: string;\n let userLogin = '';\n let bodyText = description;\n\n if (openIdx !== -1 && closingIdx !== -1 && closingIdx > openIdx) {\n userFullName = description.substring(0, openIdx).trim();\n userLogin = description.substring(openIdx, closingIdx + 1).trim();\n bodyText = description.substring(closingIdx + 1).trim();\n } else {\n userFullName = String(item.userName ?? '');\n }\n\n const parsed = parseSystemDescription(bodyText);\n const datetime = buildDatetimeParts(item.timeStamp, gmt, nowWall);\n return {\n // El índice garantiza unicidad aunque el backend repita `actionId`.\n id: `system-${item.actionId ?? 'x'}-${index}`,\n type: 'system',\n ...datetime,\n userFullName,\n userLogin,\n pathPart: parsed.pathPart,\n preTextHtml: highlightVideoFormats(parsed.preText),\n postTextHtml: highlightVideoFormats(parsed.postText),\n detailHtml: highlightVideoFormats(description),\n unread: !item.isRead,\n };\n}\n\n/**\n * Construye las notificaciones de desasignación de tarea a partir del array\n * `unassignTask` (person_remove). Una tarjeta por aviso, informativa (no navega).\n * El texto se arma con i18n en el componente; del payload solo salen el título\n * de la tarea y, opcionalmente, el autor (`userName`/`userCreation` + `userLogin`).\n * Replica `buildUnassignedNote` del header del CMS Angular.\n */\nfunction buildUnassignedNotes(\n tasks: DashboardNotificationsResponse['unassignTask'],\n gmt: string | null | undefined,\n nowWall: number,\n): NotificationFeedItem[] {\n if (!tasks || !tasks.length) return [];\n return tasks.map((task, index) => {\n const datetime = buildDatetimeParts(task.timeStamp, gmt, nowWall);\n return {\n // El índice garantiza unicidad aunque el backend repita `id`.\n id: `unassigned-${task.id ?? 'x'}-${index}`,\n type: 'unassigned' as const,\n ...datetime,\n title: String(task.title ?? ''),\n // Autor de la desasignación: opcional (nombre por `userName` o `userCreation`).\n userFullName: String(task.userName ?? task.userCreation ?? ''),\n userLogin: String(task.userLogin ?? ''),\n unread: !task.isRead,\n };\n });\n}\n\n/**\n * Construye la card agrupada de oportunidades editoriales copilot a partir del\n * array `copilot` de `dashboard/notification` (NAA-4645). El back manda hasta 3,\n * por `score` desc; la primera es la destacada (siempre visible) y el resto queda\n * tras el botón \"Ver N más\". La hora de la card es el `created_at` más reciente.\n * Se excluyen las oportunidades ya pospuestas en la sesión (`snoozedIds`).\n */\nfunction buildEditorialOpportunitiesGroup(\n opportunities: DashboardNotificationsResponse['copilot'] | null | undefined,\n gmt: string | null | undefined,\n nowWall: number,\n snoozedIds: ReadonlySet<string>,\n): NotificationFeedItem | null {\n if (!opportunities || !opportunities.length) return null;\n const visible = opportunities.filter(\n (o) => o && !(o.id != null && snoozedIds.has(String(o.id))),\n );\n if (!visible.length) return null;\n const withDelivery = visible.filter((o) => readEpoch(o.created_at) != null);\n const latest = withDelivery.length\n ? withDelivery.reduce(\n (max, o) =>\n Number(readEpoch(o.created_at)) > Number(readEpoch(max.created_at)) ? o : max,\n withDelivery[0],\n )\n : null;\n const datetime = buildDatetimeParts(\n latest ? latest.created_at : Date.now(),\n gmt,\n nowWall,\n );\n return {\n id: 'editorial-group',\n type: 'editorialOpportunity',\n ...datetime,\n count: visible.length,\n children: visible.map((opportunity) => ({\n id: opportunity.id != null ? String(opportunity.id) : undefined,\n title: String(opportunity.title ?? ''),\n code: opportunity.id != null ? `CP-${opportunity.id}` : '',\n matchPercent: opportunity.score,\n topic: opportunity.topic,\n unread: !opportunity.isRead,\n })),\n unread: visible.some((o) => !o.isRead),\n };\n}\n\n/**\n * Arma el feed completo de notificaciones, ordenado por hora descendente\n * (lo más reciente primero).\n *\n * @param response Respuesta cruda de `POST /dashboard/notification`.\n * @param opts.now Instante actual (epoch ms) — por defecto `Date.now()`.\n * @param opts.gmtRedaction Offset GMT de la publicación seleccionada.\n * @param opts.snoozedCopilotIds Ids de oportunidades copilot pospuestas (se ocultan).\n */\nexport function buildNotificationsFeed(\n response: DashboardNotificationsResponse | null | undefined,\n opts: {\n now?: number;\n gmtRedaction?: string | null;\n snoozedCopilotIds?: Iterable<string>;\n } = {},\n): NotificationFeedItem[] {\n const now = opts.now ?? Date.now();\n const gmt = opts.gmtRedaction;\n const nowWall = toSiteWallClock(now, gmt);\n const snoozedIds = new Set(opts.snoozedCopilotIds ?? []);\n\n const items: NotificationFeedItem[] = [];\n\n if (response) {\n const editorial = buildEditorialOpportunitiesGroup(\n response.copilot,\n gmt,\n nowWall,\n snoozedIds,\n );\n if (editorial) items.push(editorial);\n const assigned = buildAssignedGroup(response.newsTask, gmt, nowWall);\n if (assigned) items.push(assigned);\n const pending = buildPendingGroup(response.expireTask, gmt, nowWall, now);\n if (pending) items.push(pending);\n items.push(...buildUnassignedNotes(response.unassignTask, gmt, nowWall));\n (response.videos ?? []).forEach((video, i) => {\n items.push(buildSystemNote(video, gmt, nowWall, i));\n });\n }\n\n items.sort((a, b) => (b.sortTime || 0) - (a.sortTime || 0));\n return items;\n}\n\n/** Une el dominio de `master` (Angular) con una ruta, sin barra doble. */\nfunction joinUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n}\n\n/**\n * Construye la URL de redirección de un tema a `master` (el CMS Angular\n * desplegado), replicando la ruta interna que usa cmsmedios: el planning de la\n * publicación destino, abierto en la vista día sobre el evento.\n *\n * @param topic Tema clickeado (trae `publication`, `eventDate`, `eventId`).\n * @param masterBaseUrl Dominio de `master` (`NEXT_PUBLIC_BASE_ANGULAR`).\n * @param currentPublicationId Id de la publicación activa (fallback).\n * @returns URL absoluta a `master`, o `undefined` si no hay publicación destino.\n */\nexport function buildPlanningHref(\n topic: Pick<NotificationTopic, 'eventId' | 'eventDate' | 'publication'>,\n masterBaseUrl: string | undefined,\n currentPublicationId?: number | string,\n): string | undefined {\n const targetPub =\n topic.publication != null ? Number(topic.publication) : Number(currentPublicationId);\n if (!targetPub) return undefined;\n\n let path = `/admin/planning/${targetPub}`;\n if (topic.eventDate) {\n const params = new URLSearchParams({\n view: 'timeGridDay',\n eventDate: String(topic.eventDate),\n });\n if (topic.eventId) params.set('eventId', String(topic.eventId));\n path += `?${params.toString()}`;\n }\n return joinUrl(masterBaseUrl, path);\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport { alpha } from '@mui/material/styles';\n\nimport {\n cmsColors,\n editorialOpportunityColors,\n fontFamilies,\n notificationColors,\n radii,\n shadows,\n} from '../../theme/variables';\n\n/**\n * Estilos del centro de notificaciones (campanita del TopBar).\n * Replican el diseño del mockup \"Gestión de Noticias\" (bloque `.oe-toast`):\n * panel flotante con tarjetas por tipo, acordeones y lista de temas.\n */\nexport const NotificationsMenuStyles = {\n /**\n * Paper del desplegable de la campanita: se ancla al ícono (lo posiciona el\n * `Popover`, no `position:fixed`). Sin velo/backdrop gris sobre el gestor.\n */\n sxPanel: {\n mt: 1,\n width: 380,\n maxWidth: 'calc(100vw - 24px)',\n maxHeight: 'min(560px, calc(100vh - 96px))',\n display: 'flex',\n flexDirection: 'column',\n bgcolor: cmsColors.menuSurface,\n border: 1,\n borderColor: 'm3.outlineVariant',\n borderRadius: 4,\n boxShadow: shadows.menuSoft,\n overflow: 'hidden',\n outline: 'none',\n } as SxProps<Theme>,\n\n /** Pulso rojo del badge de no leídas sobre la campanita. */\n sxBadgePulse: (theme: Theme) => ({\n '@keyframes notifBellPulse': {\n '0%, 100%': {\n boxShadow: `0 0 0 0 ${alpha(theme.palette.error.main, 0.6)}`,\n },\n '50%': {\n boxShadow: `0 0 0 6px ${alpha(theme.palette.error.main, 0)}`,\n },\n },\n '& .MuiBadge-badge': {\n animation: 'notifBellPulse 1.6s ease-out infinite',\n },\n }),\n\n /** Contenedor scrollable de la lista de notificaciones. */\n sxScroll: {\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n px: 1.5,\n py: 1,\n } as SxProps<Theme>,\n\n /**\n * Línea divisora entre notificaciones (1px sólido `outlineVariant` = #C4C6CF).\n * Replica el `.group-divider` del dropdown del CMS Angular.\n */\n sxDivider: {\n height: '1px',\n bgcolor: 'm3.outlineVariant',\n my: 1,\n mx: 'auto',\n width: '100%',\n maxWidth: 352,\n } as SxProps<Theme>,\n\n /** Estado vacío. */\n sxEmpty: {\n px: 2,\n py: 4,\n textAlign: 'center',\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /**\n * Etiqueta de fecha/hora sobre cada notificación (\"Hoy, 14:32\").\n * 11px, peso 500, `onSurfaceVariant` (#43474E), según spec de Material (Juan).\n */\n sxTimestamp: {\n color: 'm3.onSurfaceVariant',\n fontSize: 11,\n fontWeight: 500,\n letterSpacing: '0.02em',\n px: 0.5,\n pt: 0.5,\n pb: 0.75,\n } as SxProps<Theme>,\n\n /** Fila de notificación (tarjeta). `clickable` agrega hover y cursor. */\n sxRow: (clickable: boolean): SxProps<Theme> => ({\n display: 'grid',\n gridTemplateColumns: clickable ? '36px 1fr 20px' : '36px 1fr',\n columnGap: 1.5,\n alignItems: 'start',\n p: 1.25,\n borderRadius: 3,\n bgcolor: 'm3.surface',\n textAlign: 'left',\n width: '100%',\n border: 0,\n cursor: clickable ? 'pointer' : 'default',\n transition: 'background-color .12s',\n '&:hover': clickable\n ? { bgcolor: (theme: Theme) => alpha(theme.palette.text.primary, 0.06) }\n : undefined,\n }),\n\n /** Avatar cuadrado de ícono. `type` define los colores. */\n sxAvatar: (type: keyof typeof notificationColors): SxProps<Theme> => ({\n position: 'relative',\n width: 36,\n height: 36,\n borderRadius: 3,\n display: 'grid',\n placeItems: 'center',\n bgcolor: notificationColors[type].bg,\n color: notificationColors[type].on,\n '& svg': { fontSize: 20 },\n }),\n\n /** Punto rojo de \"no leído\" sobre el avatar. */\n sxUnreadDot: {\n position: 'absolute',\n top: -5,\n right: -5,\n width: 10,\n height: 10,\n borderRadius: '50%',\n bgcolor: 'error.main',\n border: 2,\n borderColor: 'm3.surfaceContainer',\n } as SxProps<Theme>,\n\n /** Cuerpo de texto de la fila. */\n sxBody: {\n minWidth: 0,\n alignSelf: 'center',\n color: 'm3.onSurface',\n lineHeight: 1.4,\n overflowWrap: 'break-word',\n wordBreak: 'break-word',\n '& b': { fontWeight: 600 },\n '& strong': { fontWeight: 600, textTransform: 'uppercase' },\n } as SxProps<Theme>,\n\n /** Subtítulo (fecha de vencimiento de la card por vencer). */\n sxSubtitle: {\n display: 'block',\n mt: 0.25,\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /** Login del usuario (entre paréntesis, sin negrita). */\n sxUserLogin: {\n color: 'm3.onSurfaceVariant',\n fontWeight: 500,\n } as SxProps<Theme>,\n\n /** Chip monoespaciado con el path del archivo de video. */\n sxPathChip: {\n display: 'inline-block',\n fontFamily: fontFamilies.mono,\n fontSize: 12,\n bgcolor: (theme: Theme) => alpha(theme.palette.text.primary, 0.06),\n color: 'm3.onSurface',\n px: 0.75,\n py: '1px',\n borderRadius: 1.5,\n wordBreak: 'break-all',\n my: 0.25,\n lineHeight: 1.5,\n } as SxProps<Theme>,\n\n /** Chevron de acordeón (rota al abrir). */\n sxChevron: (open: boolean): SxProps<Theme> => ({\n alignSelf: 'center',\n color: 'm3.onSurfaceVariant',\n fontSize: 20,\n transition: 'transform .2s',\n transform: open ? 'rotate(180deg)' : 'none',\n }),\n\n /** Lista de temas desplegada bajo una card agrupada. */\n sxTopics: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n gap: 0.25,\n pt: 0.75,\n pb: 0.25,\n pl: '38px',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '17px',\n top: 8,\n bottom: 8,\n width: '2px',\n borderRadius: radii.pill,\n bgcolor: 'm3.outlineVariant',\n },\n } as SxProps<Theme>,\n\n /** Fila de un tema individual (navegable). */\n sxTopicRow: {\n display: 'grid',\n gridTemplateColumns: '1fr 20px',\n columnGap: 1.25,\n alignItems: 'center',\n p: 1,\n borderRadius: 2.5,\n textAlign: 'left',\n width: '100%',\n border: 0,\n bgcolor: 'transparent',\n cursor: 'pointer',\n color: 'inherit',\n textDecoration: 'none',\n transition: 'background-color .12s',\n '&:hover': {\n bgcolor: (theme: Theme) => alpha(theme.palette.text.primary, 0.08),\n },\n } as SxProps<Theme>,\n\n sxTopicTitle: {\n display: 'block',\n color: 'm3.onSurface',\n fontWeight: 500,\n lineHeight: 1.3,\n } as SxProps<Theme>,\n\n /** Meta del tema (\"CP-…\", \"Asignado el\", \"Vence\"): 11px, spec de Material (Juan). */\n sxTopicMeta: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.75,\n mt: 0.25,\n fontSize: 11,\n color: 'm3.onSurfaceVariant',\n letterSpacing: '0.02em',\n } as SxProps<Theme>,\n\n /** Punto separador entre el código y la fecha del tema. */\n sxMetaDot: {\n width: 3,\n height: 3,\n borderRadius: '50%',\n bgcolor: 'm3.outlineVariant',\n flexShrink: 0,\n } as SxProps<Theme>,\n\n /** Fecha de vencimiento resaltada (naranja). */\n sxDue: {\n color: notificationColors.pending.on,\n fontWeight: 600,\n } as SxProps<Theme>,\n\n sxTopicChevron: {\n color: 'm3.onSurfaceVariant',\n fontSize: 20,\n justifySelf: 'end',\n } as SxProps<Theme>,\n\n // ── Card de oportunidades editoriales copilot (NAA-4837) ─────────────────\n\n /** Contenedor de la card: apila encabezado, oportunidades, toggle y acciones. */\n sxOpportunityCard: {\n display: 'flex',\n flexDirection: 'column',\n gap: 1.25,\n p: 1.25,\n borderRadius: 3,\n bgcolor: 'm3.surface',\n width: '100%',\n } as SxProps<Theme>,\n\n /** Encabezado clickeable (icono + label + título + chevron). */\n sxOpportunityHeader: {\n display: 'grid',\n gridTemplateColumns: '36px 1fr 20px',\n columnGap: 1.5,\n alignItems: 'center',\n width: '100%',\n p: 0,\n border: 0,\n bgcolor: 'transparent',\n textAlign: 'left',\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n } as SxProps<Theme>,\n\n /** Fila del label (\"OPORTUNIDAD EDITORIAL\" + contador). */\n sxOpportunityLabel: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n } as SxProps<Theme>,\n\n sxOpportunityLabelText: {\n fontSize: 11,\n fontWeight: 700,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n color: cmsColors.primary,\n } as SxProps<Theme>,\n\n /** Contador circular con la cantidad de oportunidades del grupo. */\n sxOpportunityCount: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: 18,\n height: 18,\n px: 0.5,\n borderRadius: radii.pill,\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n fontSize: 11,\n fontWeight: 600,\n lineHeight: 1,\n } as SxProps<Theme>,\n\n /**\n * Avatar del ícono de la card de oportunidades: fondo azul primario, ícono\n * blanco y un anillo pulsante 2px (borde animado). El anillo se anima por\n * opacidad/escala (no `alpha()`) para conservar el color como variable.\n */\n sxOpportunityAvatar: {\n position: 'relative',\n width: 36,\n height: 36,\n borderRadius: 3,\n display: 'grid',\n placeItems: 'center',\n bgcolor: cmsColors.primary,\n color: cmsColors.white,\n border: '2px solid',\n borderColor: cmsColors.primary,\n '& svg': { fontSize: 20 },\n '@keyframes opportunityIconRing': {\n '0%': { opacity: 0.6, transform: 'scale(1)' },\n '100%': { opacity: 0, transform: 'scale(1.35)' },\n },\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n inset: '-2px',\n borderRadius: 'inherit',\n border: '2px solid',\n borderColor: cmsColors.primary,\n pointerEvents: 'none',\n animation: 'opportunityIconRing 1.6s ease-out infinite',\n },\n } as SxProps<Theme>,\n\n sxOpportunityHeaderTitle: {\n display: 'block',\n mt: 0.25,\n color: 'm3.onSurface',\n fontWeight: 600,\n lineHeight: 1.3,\n } as SxProps<Theme>,\n\n /**\n * Caja de una oportunidad, con barra de acento a la izquierda (pseudo `::before`).\n * `unread` la marca como nueva/no leída: barra en degradé azul (primario →\n * Kundera). Leída: barra gris (`m3.outlineVariant`). `clickable` la vuelve\n * enlace al gestor de sugerencias (cursor + hover + reset de link).\n */\n sxOpportunityTopic: (unread: boolean, clickable = false): SxProps<Theme> => ({\n position: 'relative',\n overflow: 'hidden',\n display: 'block',\n bgcolor: editorialOpportunityColors.topicBg,\n borderRadius: 2.5,\n p: 1,\n pl: 1.5,\n color: 'inherit',\n textDecoration: 'none',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: '4px',\n ...(unread\n ? {\n backgroundImage: `linear-gradient(180deg, ${cmsColors.primary}, ${cmsColors.kundera})`,\n }\n : { backgroundColor: 'm3.outlineVariant' }),\n },\n ...(clickable\n ? {\n cursor: 'pointer',\n transition: 'filter .12s',\n '&:hover': { filter: 'brightness(0.96)' },\n }\n : {}),\n }),\n\n /**\n * Meta de la oportunidad (\"Top · 94% Coincidencia\" / \"82% Coincidencia\").\n * `unread`: azul primario (nueva/no leída); leída: `m3.onSurface` (#191C20).\n */\n sxOpportunityMeta: (unread: boolean): SxProps<Theme> => ({\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n fontSize: 11,\n fontWeight: 700,\n letterSpacing: '0.04em',\n textTransform: 'uppercase',\n color: unread ? cmsColors.primary : 'm3.onSurface',\n }),\n\n sxOpportunityMetaDot: {\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /** Etiqueta \"Trending\" (dorado) de las oportunidades en tendencia. */\n sxOpportunityTrending: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.25,\n fontSize: 11,\n fontWeight: 700,\n color: editorialOpportunityColors.trending,\n } as SxProps<Theme>,\n\n sxOpportunityTrendingIcon: {\n fontSize: 16,\n } as SxProps<Theme>,\n\n sxOpportunityTopicTitle: {\n mt: 0.5,\n color: 'm3.onSurface',\n fontWeight: 600,\n fontSize: 14,\n lineHeight: 1.35,\n overflowWrap: 'break-word',\n wordBreak: 'break-word',\n } as SxProps<Theme>,\n\n sxOpportunityCode: {\n mt: 0.5,\n fontSize: 11,\n fontWeight: 500,\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /** Botón punteado \"Ver N oportunidades más / Ocultar\". */\n sxOpportunityToggle: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 0.5,\n width: '100%',\n p: 1,\n bgcolor: 'transparent',\n border: '1px dashed',\n borderColor: 'm3.outlineVariant',\n borderRadius: 2.5,\n cursor: 'pointer',\n color: 'm3.onSurfaceVariant',\n fontSize: 14,\n fontFamily: fontFamilies.googleSans,\n transition: 'background-color .12s',\n '&:hover': {\n bgcolor: (theme: Theme) => alpha(theme.palette.text.primary, 0.06),\n },\n } as SxProps<Theme>,\n\n /** Pie: \"Recordar luego\" a la izquierda, \"Ver más\" a la derecha. */\n sxOpportunityFooter: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n // px 0: el footer abarca todo el ancho del contenido, igual que el botón\n // \"Ocultar\", para que los hover queden alineados a sus bordes.\n px: 0,\n } as SxProps<Theme>,\n\n sxOpportunityRemind: {\n bgcolor: 'transparent',\n border: 0,\n // Alineado al botón \"Ocultar\": sin margen lateral, la pastilla arranca en el\n // borde del contenido. Pastilla completa (radii.pill) y padding 10/15.\n py: '10px',\n px: '15px',\n borderRadius: radii.pill,\n cursor: 'pointer',\n color: 'm3.onSurfaceVariant',\n fontSize: 14,\n fontWeight: 500,\n fontFamily: fontFamilies.googleSans,\n transition: 'background-color .12s, color .12s',\n // Hover: pastilla gris neutra (state layer onSurface ~8%), texto oscuro.\n '&:hover': {\n bgcolor: (theme: Theme) => alpha(theme.palette.text.primary, 0.08),\n color: 'm3.onSurface',\n },\n } as SxProps<Theme>,\n\n sxOpportunitySeeMore: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n bgcolor: 'transparent',\n border: 0,\n // Alineado al botón \"Ocultar\": sin margen lateral, la pastilla arranca en el\n // borde del contenido. Pastilla completa (radii.pill) y padding 10/15.\n py: '10px',\n px: '15px',\n borderRadius: radii.pill,\n cursor: 'pointer',\n color: cmsColors.primary,\n fontSize: 14,\n fontWeight: 600,\n fontFamily: fontFamilies.googleSans,\n textDecoration: 'none',\n transition: 'background-color .12s, color .12s',\n // Hover/focus: pastilla azul claro (tonal `secondary`), texto azul primario\n // (#0067C4), sin subrayado.\n '&:hover, &:focus': {\n bgcolor: cmsColors.secondary,\n color: cmsColors.primary,\n textDecoration: 'none',\n },\n } as SxProps<Theme>,\n\n sxOpportunitySeeMoreIcon: {\n fontSize: 18,\n } as SxProps<Theme>,\n} as const;\n","'use client';\n\nimport type { SvgIconComponent } from '@mui/icons-material';\nimport ArrowForwardOutlinedIcon from '@mui/icons-material/ArrowForwardOutlined';\nimport AssignmentIndOutlinedIcon from '@mui/icons-material/AssignmentIndOutlined';\nimport AutoAwesomeOutlinedIcon from '@mui/icons-material/AutoAwesomeOutlined';\nimport ChevronRightOutlinedIcon from '@mui/icons-material/ChevronRightOutlined';\nimport ExpandMoreOutlinedIcon from '@mui/icons-material/ExpandMoreOutlined';\nimport MovieOutlinedIcon from '@mui/icons-material/MovieOutlined';\nimport NotificationsNoneOutlinedIcon from '@mui/icons-material/NotificationsNoneOutlined';\nimport PersonRemoveOutlinedIcon from '@mui/icons-material/PersonRemoveOutlined';\nimport ScheduleOutlinedIcon from '@mui/icons-material/ScheduleOutlined';\nimport TrendingUpOutlinedIcon from '@mui/icons-material/TrendingUpOutlined';\nimport Badge from '@mui/material/Badge';\nimport Box from '@mui/material/Box';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport Popover from '@mui/material/Popover';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { type MouseEvent, useMemo, useState } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport { toTestId } from '../../utils/toTestId';\nimport type { DashboardNotificationsResponse } from '../../services/dashboard';\nimport {\n buildNotificationsFeed,\n buildPlanningHref,\n type NotificationFeedItem,\n type NotificationFeedType,\n type NotificationTopic,\n} from './notificationsFeed';\nimport { NotificationsMenuStyles as S } from './NotificationsMenu.styles';\nimport { TopBarStyles } from './TopBar.styles';\n\nexport type NotificationsMenuProps = {\n /** Total de no leídas (badge de la campanita). */\n unreadCount: number;\n /** Respuesta cruda de `POST /dashboard/notification` (newsTask/expireTask/videos). */\n notificationsData?: DashboardNotificationsResponse | null;\n /** Dominio de `master` (Angular) para la redirección de los temas. */\n masterBaseUrl?: string;\n /** Id de la publicación activa (fallback de la redirección). */\n currentPublicationId?: number | string;\n /** Offset GMT de la publicación (para mostrar las fechas en zona de redacción). */\n gmtRedaction?: string | null;\n /**\n * Destino del \"Ver más\" / clic en una oportunidad copilot (página de\n * sugerencias). Lo arma el gestor: URL absoluta al deploy de sugerencias\n * (env) si estás en otro gestor → abre en pestaña nueva; ruta relativa si ya\n * estás en el gestor de sugerencias → navega en la misma. Sin valor, cae al callback.\n */\n copilotSuggestionsHref?: string;\n /** Clic en \"Ver más\" cuando no hay `copilotSuggestionsHref` (fallback). */\n onEditorialSeeMore?: () => void;\n /**\n * \"Recordar luego\" de la card de oportunidades: recibe los `opportunity_id` de\n * las oportunidades mostradas para que el gestor dispare `copilot/snooze` por\n * cada una. La card se oculta de inmediato (optimista).\n */\n onEditorialRemindLater?: (opportunityIds: string[]) => void;\n};\n\n/** Ícono de cada tipo de tarjeta. */\nconst TYPE_ICON: Record<NotificationFeedType, SvgIconComponent> = {\n assigned: AssignmentIndOutlinedIcon,\n pending: ScheduleOutlinedIcon,\n unassigned: PersonRemoveOutlinedIcon,\n system: MovieOutlinedIcon,\n editorialOpportunity: AutoAwesomeOutlinedIcon,\n};\n\nexport function NotificationsMenu({\n unreadCount,\n notificationsData,\n masterBaseUrl,\n currentPublicationId,\n gmtRedaction,\n copilotSuggestionsHref,\n onEditorialSeeMore,\n onEditorialRemindLater,\n}: NotificationsMenuProps) {\n const { t } = useCmsTranslation();\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n // Hora de apertura del menú: se captura en el handler (no en render) para las\n // etiquetas relativas hoy/ayer, y se recalcula el feed cuando cambia.\n const [openedAt, setOpenedAt] = useState<number | null>(null);\n // Oportunidades copilot pospuestas en esta sesión (update optimista del snooze):\n // se ocultan del feed hasta que el back deje de mandarlas en el próximo fetch.\n const [snoozedIds, setSnoozedIds] = useState<ReadonlySet<string>>(new Set());\n const open = Boolean(anchorEl);\n\n const badgeContent = unreadCount > 0 ? unreadCount : undefined;\n\n const feed = useMemo(\n () =>\n buildNotificationsFeed(notificationsData, {\n now: openedAt ?? undefined,\n gmtRedaction,\n snoozedCopilotIds: snoozedIds,\n }),\n [notificationsData, gmtRedaction, openedAt, snoozedIds],\n );\n\n const openMenu = (event: MouseEvent<HTMLElement>) => {\n setOpenedAt(Date.now());\n // Se restaura el estado en cada apertura: los acordeones arrancan cerrados y\n // el scroll vuelve arriba (el contenido se desmonta al cerrar el Popover).\n setExpanded({});\n setAnchorEl(event.currentTarget);\n };\n const close = () => setAnchorEl(null);\n const toggle = (id: string) =>\n setExpanded((prev) => ({ ...prev, [id]: !prev[id] }));\n\n /**\n * \"Recordar luego\": oculta la card al instante (optimista) y delega en el\n * gestor el snooze real (una llamada `copilot/snooze` por `opportunity_id`).\n */\n const remindOpportunitiesLater = (opportunityIds: string[]) => {\n if (opportunityIds.length) {\n setSnoozedIds((prev) => new Set([...prev, ...opportunityIds]));\n onEditorialRemindLater?.(opportunityIds);\n }\n };\n\n /**\n * \"Ver más\": si hay `copilotSuggestionsHref`, el enlace ya navega; si no,\n * dispara el callback del gestor. En ambos casos cierra el menú.\n */\n const seeMoreOpportunities = () => {\n if (!copilotSuggestionsHref) onEditorialSeeMore?.();\n close();\n };\n\n /** Etiqueta de fecha/hora de cabecera de una notificación (\"Hoy, 14:32\"). */\n const timestampLabel = (item: NotificationFeedItem): string => {\n const label = item.isToday\n ? t.notificationsMenu('today')\n : item.isYesterday\n ? t.notificationsMenu('yesterday')\n : item.date;\n if (!label) return item.time;\n return item.time ? `${label}, ${item.time}` : label;\n };\n\n return (\n <>\n <Tooltip title={t.notificationsMenu('title')}>\n <IconButton\n aria-label={t.notificationsMenu('ariaLabel')}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={openMenu}\n data-testid=\"dropdown-toggle-notifications\"\n sx={TopBarStyles.sxActionIcon}>\n <Badge\n badgeContent={badgeContent}\n color=\"error\"\n data-testid=\"badge-notifications-count\"\n sx={\n [\n TopBarStyles.sxBadge,\n ...(badgeContent ? [S.sxBadgePulse] : []),\n ] as SxProps<Theme>\n }>\n <NotificationsNoneOutlinedIcon sx={TopBarStyles.sxActionIconGlyph} />\n </Badge>\n </IconButton>\n </Tooltip>\n\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n marginThreshold={12}\n slotProps={{\n paper: {\n 'aria-label': t.notificationsMenu('title'),\n sx: S.sxPanel,\n // `data-testid` no está tipado en el slot del Paper; se agrega por\n // spread (se conserva en runtime) para el contrato QA (§10).\n ...({ 'data-testid': 'dropdown-notifications' } as object),\n },\n }}>\n {feed.length === 0 ? (\n <Box sx={S.sxEmpty}>\n <Typography variant=\"body2\">\n {t.notificationsMenu('empty')}\n </Typography>\n </Box>\n ) : (\n <Box sx={S.sxScroll} data-testid=\"list-notifications\">\n {feed.map((item, i) => (\n <Box\n key={item.id}\n data-testid={`dropdown-item-${toTestId(item.id)}`}>\n {i > 0 ? (\n <Box sx={S.sxDivider} data-testid={`divider-notification-${i}`} />\n ) : null}\n\n {timestampLabel(item) ? (\n <Typography component=\"div\" variant=\"caption\" sx={S.sxTimestamp}>\n {timestampLabel(item)}\n </Typography>\n ) : null}\n\n {item.type === 'editorialOpportunity' ? (\n <EditorialOpportunityCard\n item={item}\n open={!!expanded[item.id]}\n onToggle={() => toggle(item.id)}\n onRemindLater={remindOpportunitiesLater}\n onSeeMore={seeMoreOpportunities}\n seeMoreHref={copilotSuggestionsHref}\n t={t}\n />\n ) : item.type === 'unassigned' ? (\n <UnassignedRow item={item} t={t} />\n ) : item.type === 'system' ? (\n <SystemRow item={item} />\n ) : (\n <GroupRow\n item={item}\n open={!!expanded[item.id]}\n onToggle={() => toggle(item.id)}\n masterBaseUrl={masterBaseUrl}\n currentPublicationId={currentPublicationId}\n onNavigate={close}\n t={t}\n />\n )}\n </Box>\n ))}\n </Box>\n )}\n </Popover>\n </>\n );\n}\n\n/**\n * Card de oportunidades editoriales copilot (NAA-4837): encabezado con contador,\n * oportunidad destacada siempre visible, secundarias desplegables, botón de\n * despliegue y acciones \"Recordar luego\" / \"Ver más\".\n */\nfunction EditorialOpportunityCard({\n item,\n open,\n onToggle,\n onRemindLater,\n onSeeMore,\n seeMoreHref,\n t,\n}: {\n item: NotificationFeedItem;\n open: boolean;\n onToggle: () => void;\n onRemindLater: (opportunityIds: string[]) => void;\n onSeeMore: () => void;\n seeMoreHref?: string;\n t: ReturnType<typeof useCmsTranslation>['t'];\n}) {\n const topics = item.children ?? [];\n const [top, ...rest] = topics;\n const count = item.count ?? topics.length;\n // Absoluta (otro gestor) → pestaña nueva; relativa (mismo gestor) → misma pestaña.\n const seeMoreExternal = !!seeMoreHref && /^https?:\\/\\//i.test(seeMoreHref);\n // Props del enlace a sugerencias (oportunidad clickeable y \"Ver más\").\n const seeMoreLinkProps = seeMoreHref\n ? {\n href: seeMoreHref,\n onClick: onSeeMore,\n ...(seeMoreExternal ? { target: '_blank', rel: 'noopener noreferrer' } : {}),\n }\n : {};\n // \"Recordar luego\" pospone TODAS las oportunidades mostradas (una llamada al\n // snooze por cada opportunity_id) y oculta la card.\n const remindLater = () =>\n onRemindLater(\n topics.map((topic) => topic.id).filter((id): id is string => !!id),\n );\n\n return (\n <Box sx={S.sxOpportunityCard}>\n {/* Encabezado clickeable: icono + label con contador + título + chevron */}\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onToggle}\n data-testid=\"toggle-opportunity-card\"\n sx={S.sxOpportunityHeader}>\n <Box sx={S.sxOpportunityAvatar}>\n <AutoAwesomeOutlinedIcon />\n {item.unread ? <Box component=\"span\" sx={S.sxUnreadDot} /> : null}\n </Box>\n <Box sx={{ minWidth: 0 }}>\n <Box sx={S.sxOpportunityLabel}>\n <Typography component=\"span\" variant=\"caption\" sx={S.sxOpportunityLabelText}>\n {t.notificationsMenu('editorialOpportunityLabel')}\n </Typography>\n <Box component=\"span\" sx={S.sxOpportunityCount}>\n {count}\n </Box>\n </Box>\n <Typography component=\"span\" variant=\"body2\" sx={S.sxOpportunityHeaderTitle}>\n {t.notificationsMenu('editorialOpportunityText', { count })}\n </Typography>\n </Box>\n <ExpandMoreOutlinedIcon sx={S.sxChevron(open)} />\n </Box>\n\n {/* Oportunidad destacada: siempre visible (clickeable → gestor de sugerencias) */}\n {top ? (\n <Box\n component={seeMoreHref ? 'a' : 'div'}\n {...seeMoreLinkProps}\n data-testid={`link-opportunity-${toTestId(top.id || top.code || 'top')}`}\n sx={S.sxOpportunityTopic(!!top.unread, !!seeMoreHref)}>\n <Typography component=\"div\" variant=\"caption\" sx={S.sxOpportunityMeta(!!top.unread)}>\n <Box component=\"span\" sx={S.sxOpportunityTrending}>\n <TrendingUpOutlinedIcon sx={S.sxOpportunityTrendingIcon} />\n {t.notificationsMenu('editorialOpportunityTop')}\n </Box>\n <span>\n · {top.matchPercent}% {t.notificationsMenu('editorialOpportunityMatch')}\n </span>\n </Typography>\n <Box sx={S.sxOpportunityTopicTitle}>{top.title}</Box>\n {top.topic ? <Box sx={S.sxOpportunityCode}>{top.topic}</Box> : null}\n </Box>\n ) : null}\n\n {/* Oportunidades secundarias: visibles al desplegar */}\n <Collapse in={open} unmountOnExit>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n {rest.map((topic, i) => (\n <Box\n key={`${item.id}-${i + 1}`}\n component={seeMoreHref ? 'a' : 'div'}\n {...seeMoreLinkProps}\n data-testid={`link-opportunity-${toTestId(topic.id || topic.code || String(i + 1))}`}\n sx={S.sxOpportunityTopic(!!topic.unread, !!seeMoreHref)}>\n <Typography component=\"div\" variant=\"caption\" sx={S.sxOpportunityMeta(!!topic.unread)}>\n <span>\n {topic.matchPercent}% {t.notificationsMenu('editorialOpportunityMatch')}\n </span>\n </Typography>\n <Box sx={S.sxOpportunityTopicTitle}>{topic.title}</Box>\n {topic.topic ? <Box sx={S.sxOpportunityCode}>{topic.topic}</Box> : null}\n </Box>\n ))}\n </Box>\n </Collapse>\n\n {/* Botón punteado: ver N oportunidades más / ocultar */}\n {topics.length > 1 ? (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onToggle}\n data-testid=\"toggle-opportunity-topics\"\n sx={S.sxOpportunityToggle}>\n {open\n ? t.notificationsMenu('editorialOpportunityHide')\n : t.notificationsMenu('editorialOpportunitySeeMoreOpportunities', {\n count: topics.length - 1,\n })}\n <ExpandMoreOutlinedIcon sx={S.sxChevron(open)} />\n </Box>\n ) : null}\n\n {/* Acciones: recordar luego (snooze) y ver más (sugerencias copilot) */}\n <Box sx={S.sxOpportunityFooter}>\n <Box\n component=\"button\"\n type=\"button\"\n onClick={remindLater}\n data-testid=\"btn-opportunity-remind-later\"\n sx={S.sxOpportunityRemind}>\n {t.notificationsMenu('editorialOpportunityRemindLater')}\n </Box>\n <Box\n component={seeMoreHref ? 'a' : 'button'}\n {...(seeMoreHref\n ? {\n href: seeMoreHref,\n onClick: onSeeMore,\n ...(seeMoreExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {}),\n }\n : { type: 'button', onClick: onSeeMore })}\n data-testid=\"btn-opportunity-see-more\"\n sx={S.sxOpportunitySeeMore}>\n {t.notificationsMenu('editorialOpportunitySeeMore')}\n <ArrowForwardOutlinedIcon sx={S.sxOpportunitySeeMoreIcon} />\n </Box>\n </Box>\n </Box>\n );\n}\n\n/** Notificación del sistema (video): icono verde + texto con formatos resaltados. */\nfunction SystemRow({ item }: { item: NotificationFeedItem }) {\n const hasStructured =\n item.userFullName || item.userLogin || item.preTextHtml || item.pathPart || item.postTextHtml;\n return (\n <Box sx={S.sxRow(false)}>\n <Box sx={S.sxAvatar('system')}>\n <MovieOutlinedIcon />\n {item.unread ? <Box component=\"span\" sx={S.sxUnreadDot} /> : null}\n </Box>\n <Typography component=\"div\" variant=\"body2\" sx={S.sxBody}>\n {hasStructured ? (\n <>\n {item.userFullName ? <b>{item.userFullName}</b> : null}\n {item.userLogin ? (\n <Box component=\"span\" sx={S.sxUserLogin}>\n {' '}\n {item.userLogin}\n </Box>\n ) : null}\n {(item.userFullName || item.userLogin) &&\n (item.preTextHtml || item.pathPart || item.postTextHtml) ? (\n <span> — </span>\n ) : null}\n {item.preTextHtml ? (\n <Box component=\"span\" dangerouslySetInnerHTML={{ __html: item.preTextHtml }} />\n ) : null}\n {item.pathPart ? (\n <Box component=\"span\" sx={S.sxPathChip}>\n {item.pathPart}\n </Box>\n ) : null}\n {item.postTextHtml ? (\n <Box component=\"span\" dangerouslySetInnerHTML={{ __html: item.postTextHtml }} />\n ) : null}\n </>\n ) : (\n <Box component=\"span\" dangerouslySetInnerHTML={{ __html: item.detailHtml ?? '' }} />\n )}\n </Typography>\n </Box>\n );\n}\n\n/**\n * Aviso de desasignación de tarea de planning (`person_remove`). Informativo:\n * no navega. Con autor muestra \"{autor} (login) te quitó de la tarea «título».\n * Ya no eres el responsable.\"; sin autor cae al texto genérico. Replica la card\n * `--unassigned` del dropdown del CMS Angular.\n */\nfunction UnassignedRow({\n item,\n t,\n}: {\n item: NotificationFeedItem;\n t: ReturnType<typeof useCmsTranslation>['t'];\n}) {\n const hasAuthor = !!(item.userFullName || item.userLogin);\n return (\n <Box sx={S.sxRow(false)}>\n <Box sx={S.sxAvatar('unassigned')}>\n <PersonRemoveOutlinedIcon />\n {item.unread ? <Box component=\"span\" sx={S.sxUnreadDot} /> : null}\n </Box>\n <Typography\n component=\"div\"\n variant=\"body2\"\n sx={S.sxBody}\n data-testid={`text-unassigned-${toTestId(item.id)}`}>\n {hasAuthor ? (\n <>\n {item.userFullName ? <b>{item.userFullName}</b> : null}\n {item.userLogin ? (\n <Box component=\"span\" sx={S.sxUserLogin}>\n {' ('}\n {item.userLogin}\n {')'}\n </Box>\n ) : null}\n {' '}\n {t.notificationsMenu('unassignedRemovedYouFrom')}\n {' «'}\n <b>{item.title}</b>\n {'». '}\n {t.notificationsMenu('unassignedNoLongerResponsible')}\n </>\n ) : (\n <>\n {t.notificationsMenu('unassignedText')}\n {' «'}\n <b>{item.title}</b>\n {'»'}\n </>\n )}\n </Typography>\n </Box>\n );\n}\n\n/** Tarjeta agrupada (temas asignados / por vencer) con acordeón de temas. */\nfunction GroupRow({\n item,\n open,\n onToggle,\n masterBaseUrl,\n currentPublicationId,\n onNavigate,\n t,\n}: {\n item: NotificationFeedItem;\n open: boolean;\n onToggle: () => void;\n masterBaseUrl?: string;\n currentPublicationId?: number | string;\n onNavigate: () => void;\n t: ReturnType<typeof useCmsTranslation>['t'];\n}) {\n const Icon = TYPE_ICON[item.type];\n const before =\n item.type === 'assigned'\n ? t.notificationsMenu('assignedBefore')\n : t.notificationsMenu('pendingBefore');\n const after =\n item.type === 'assigned'\n ? t.notificationsMenu('assignedAfter')\n : t.notificationsMenu('pendingAfter');\n\n return (\n <>\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onToggle}\n data-testid={`toggle-notification-group-${toTestId(item.type)}`}\n data-action={item.type}\n sx={S.sxRow(true)}>\n <Box sx={S.sxAvatar(item.type)}>\n <Icon />\n {item.unread ? <Box component=\"span\" sx={S.sxUnreadDot} /> : null}\n </Box>\n <Typography component=\"div\" variant=\"body2\" sx={S.sxBody}>\n {before} <b>{item.count}</b> {after}\n {item.expirationDatetime ? (\n <Typography component=\"span\" variant=\"caption\" sx={S.sxSubtitle}>\n {item.expirationDatetime}\n </Typography>\n ) : null}\n </Typography>\n <ExpandMoreOutlinedIcon sx={S.sxChevron(open)} />\n </Box>\n\n <Collapse in={open} unmountOnExit>\n <Box sx={S.sxTopics}>\n {(item.children ?? []).map((topic, i) => (\n <TopicRow\n key={`${item.id}-${i}`}\n topic={topic}\n type={item.type}\n masterBaseUrl={masterBaseUrl}\n currentPublicationId={currentPublicationId}\n onNavigate={onNavigate}\n t={t}\n />\n ))}\n </Box>\n </Collapse>\n </>\n );\n}\n\n/** Tema individual navegable: redirige al planning en `master`. */\nfunction TopicRow({\n topic,\n type,\n masterBaseUrl,\n currentPublicationId,\n onNavigate,\n t,\n}: {\n topic: NotificationTopic;\n type: NotificationFeedType;\n masterBaseUrl?: string;\n currentPublicationId?: number | string;\n onNavigate: () => void;\n t: ReturnType<typeof useCmsTranslation>['t'];\n}) {\n const href = buildPlanningHref(topic, masterBaseUrl, currentPublicationId);\n\n const assignedLabel = topic.assignedToday\n ? t.notificationsMenu('assignedToday')\n : topic.assignedYesterday\n ? t.notificationsMenu('assignedYesterday')\n : `${t.notificationsMenu('assignedOn')} ${topic.assignedDate ?? ''}`;\n\n return (\n <Box\n component={href ? 'a' : 'div'}\n href={href}\n target={href ? '_blank' : undefined}\n rel={href ? 'noopener noreferrer' : undefined}\n onClick={href ? onNavigate : undefined}\n data-testid={`link-topic-${toTestId(topic.code)}`}\n sx={S.sxTopicRow}>\n <Box sx={{ minWidth: 0 }}>\n <Typography component=\"span\" variant=\"body2\" sx={S.sxTopicTitle}>\n {topic.title}\n </Typography>\n <Typography component=\"span\" variant=\"caption\" sx={S.sxTopicMeta}>\n <span>{topic.code}</span>\n <Box component=\"span\" sx={S.sxMetaDot} />\n {type === 'pending' ? (\n <Box component=\"span\" sx={S.sxDue}>\n {t.notificationsMenu('expires')} {topic.dueDate} · {topic.dueTime}\n </Box>\n ) : (\n <span>{assignedLabel}</span>\n )}\n </Typography>\n </Box>\n <ChevronRightOutlinedIcon sx={S.sxTopicChevron} />\n </Box>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii, shadows } from '../../theme/variables';\n\nexport const SimpleDropdownStyles = {\n sxTriggerWrap: {\n display: 'inline-flex',\n } as SxProps<Theme>,\n\n /**\n * Disparador por defecto (botón de ícono, p. ej. `more_vert`).\n * En reposo el ícono es gris; en hover/activo el fondo es `iconButtonHoverBg`\n * y el ícono pasa a `controlText` (#000).\n */\n sxIconTrigger: (open: boolean): SxProps<Theme> => ({\n borderRadius: '30px',\n color: open ? cmsColors.controlText : cmsColors.iconButtonIcon,\n bgcolor: open ? cmsColors.iconButtonHoverBg : 'transparent',\n '& .MuiSvgIcon-root': { fontSize: 22 },\n '&:hover': {\n bgcolor: cmsColors.iconButtonHoverBg,\n color: cmsColors.controlText,\n },\n }),\n\n sxMenuPaper: (\n minWidth: number | string,\n upward = false,\n ): SxProps<Theme> => ({\n // Separación con el disparador. MUI ancla el panel por `top` (medido con\n // offsetHeight, sin contar margen), así que el hueco SIEMPRE se controla con\n // `margin-top`: hacia abajo, +8px (`mt: 1`); hacia arriba, subiéndolo con\n // margen negativo (`mt: -5px`). `margin-bottom` no movería un panel anclado\n // por `top` (por eso antes quedaba pegado).\n ...(upward ? { mt: '-5px' } : { mt: 1 }),\n // Menú M3: sin padding lateral (los ítems llegan de borde a borde) y con\n // 8px arriba/abajo. `overflow: hidden` recorta las esquinas del hover.\n py: '8px',\n px: 0,\n minWidth,\n borderRadius: radii.lg,\n bgcolor: cmsColors.menuSurface,\n border: 'none',\n boxShadow: shadows.menuDropdown,\n overflow: 'hidden',\n }),\n\n sxList: {\n p: 0,\n display: 'flex',\n flexDirection: 'column',\n } as SxProps<Theme>,\n\n sxGrid: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '2px',\n } as SxProps<Theme>,\n\n sxItem: (selected: boolean): SxProps<Theme> => ({\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n px: '16px',\n py: '10px',\n // Full-bleed (sin radio): el hover llega de borde a borde (M3 por defecto).\n borderRadius: 0,\n color: cmsColors.textStrong,\n whiteSpace: 'normal',\n bgcolor: selected ? cmsColors.menuItemActive : 'transparent',\n // Hover: state layer M3 `onSurface` al 8% (#191C20).\n '&:hover': {\n bgcolor: cmsColors.neutralHover,\n },\n // Opción activa: fondo `menuItemActive` (#E1E2EB).\n '&.Mui-selected': {\n bgcolor: cmsColors.menuItemActive,\n '&:hover': { bgcolor: cmsColors.menuItemActive },\n },\n }),\n\n sxIcon: {\n minWidth: 0,\n mt: '2px',\n color: 'm3.onSurfaceVariant',\n display: 'inline-flex',\n '& .MuiSvgIcon-root': { fontSize: 20 },\n } as SxProps<Theme>,\n\n sxItemText: {\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n } as SxProps<Theme>,\n\n sxLabel: (hasDescription: boolean): SxProps<Theme> => ({\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: hasDescription ? 600 : 500,\n lineHeight: '20px',\n color: cmsColors.textStrong,\n }),\n\n sxDescription: {\n fontSize: 12,\n fontWeight: 400,\n lineHeight: '16px',\n color: 'm3.onSurfaceVariant',\n mt: '2px',\n } as SxProps<Theme>,\n\n sxSubItem: {\n pl: '44px',\n py: '8px',\n fontSize: 13,\n color: 'm3.onSurface',\n borderRadius: 0,\n '&:hover': {\n bgcolor: cmsColors.neutralHover,\n },\n } as SxProps<Theme>,\n\n sxFooter: {\n px: '12px',\n py: 1,\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport MoreVertIcon from '@mui/icons-material/MoreVert';\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Typography from '@mui/material/Typography';\nimport { Fragment, useMemo, useState } from 'react';\nimport type { MouseEvent, ReactNode } from 'react';\n\nimport { SimpleDropdownStyles } from './SimpleDropdown.styles';\nimport type { DropdownOption } from './types';\n\ntype MenuOrigin = {\n vertical: 'top' | 'center' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n};\n\nexport type SimpleDropdownProps = {\n /** Ítems del menú. */\n options: DropdownOption[];\n /**\n * Disparador del menú. Puede ser un nodo o una función que recibe el estado\n * de apertura (útil para cambiar el ícono). Solo se usa en modo no controlado.\n * Si no se pasa, se usa un botón de ícono por defecto (`triggerIcon`).\n */\n trigger?: ReactNode | ((state: { open: boolean }) => ReactNode);\n /**\n * Ícono del disparador por defecto (cuando no se pasa `trigger`).\n * Por defecto `more_vert`. El disparador del SimpleDropdown es siempre un ícono.\n */\n triggerIcon?: ReactNode;\n /** Número de columnas del menú. Por defecto `1`. */\n columns?: 1 | 2;\n /** Contenido extra al pie del menú (p. ej. un toggle). */\n footer?: ReactNode;\n /** Ancho mínimo del panel. Por defecto `220`. */\n minWidth?: number | string;\n anchorOrigin?: MenuOrigin;\n transformOrigin?: MenuOrigin;\n /** Cierra el menú al hacer clic en un ítem. Por defecto `true`. */\n closeOnSelect?: boolean;\n /** Modo controlado: elemento ancla del menú. */\n anchorEl?: HTMLElement | null;\n /** Modo controlado: si el menú está abierto. */\n open?: boolean;\n /** Modo controlado: callback de cierre. */\n onClose?: () => void;\n /** Valor para `data-testid` del panel. */\n testId?: string;\n};\n\n/**\n * Menú desplegable genérico y presentacional. Renderiza una lista de opciones\n * recibidas por props y ejecuta el `onClick` de cada una. Soporta una o dos\n * columnas, sub-ítems expandibles, separadores y un pie de menú opcional.\n *\n * Funciona en dos modos:\n * - No controlado: se le pasa `trigger` y gestiona su propio estado de apertura.\n * - Controlado: se le pasan `open`, `anchorEl` y `onClose` (p. ej. desde\n * `BtnDropdown`).\n */\nexport function SimpleDropdown({\n options,\n trigger,\n triggerIcon,\n columns = 1,\n footer,\n minWidth = 220,\n anchorOrigin = { vertical: 'bottom', horizontal: 'right' },\n transformOrigin = { vertical: 'top', horizontal: 'right' },\n closeOnSelect = true,\n anchorEl: controlledAnchorEl,\n open: controlledOpen,\n onClose,\n testId,\n}: SimpleDropdownProps) {\n const isControlled = controlledOpen !== undefined;\n const [internalAnchor, setInternalAnchor] = useState<HTMLElement | null>(\n null,\n );\n const [expandedKey, setExpandedKey] = useState<string | null>(null);\n\n const anchorEl = isControlled ? controlledAnchorEl ?? null : internalAnchor;\n const open = isControlled ? Boolean(controlledOpen) : Boolean(internalAnchor);\n\n /**\n * Cierra el menú según el modo (controlado o no) y limpia la expansión.\n * @returns void\n */\n const handleClose = () => {\n if (isControlled) onClose?.();\n else setInternalAnchor(null);\n setExpandedKey(null);\n };\n\n /**\n * Abre el menú anclándolo al disparador (solo en modo no controlado).\n * @param event - Evento de clic sobre el disparador.\n * @returns void\n */\n const handleTriggerClick = (event: MouseEvent<HTMLElement>) => {\n setInternalAnchor(event.currentTarget);\n };\n\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n\n /**\n * Maneja el clic sobre un ítem: expande sub-ítems o ejecuta su acción.\n * @param option - Ítem clickeado.\n * @param key - Clave única del ítem.\n * @returns void\n */\n const handleItemClick = (option: DropdownOption, key: string) => {\n if (option.disabled) return;\n if (option.subItems?.length) {\n setExpandedKey((current) => (current === key ? null : key));\n return;\n }\n option.onClick?.(option);\n if (closeOnSelect) handleClose();\n };\n\n /**\n * Renderiza un ítem del menú (con su ícono, sub-ítems y separador superior).\n * @param option - Ítem a renderizar.\n * @param index - Posición del ítem en la lista visible.\n * @returns Nodo del ítem.\n */\n const renderOption = (option: DropdownOption, index: number) => {\n const key = option.id ?? String(index);\n const isExpanded = expandedKey === key;\n\n return (\n <Fragment key={key}>\n {option.hasTopLine ? <Divider sx={{ my: 0.5 }} /> : null}\n <MenuItem\n disabled={option.disabled}\n selected={option.selected}\n onClick={() => handleItemClick(option, key)}\n data-testid={option.testId}\n sx={SimpleDropdownStyles.sxItem(Boolean(option.selected))}>\n {option.icon ? (\n <ListItemIcon sx={SimpleDropdownStyles.sxIcon}>\n {option.icon}\n </ListItemIcon>\n ) : null}\n <Box sx={SimpleDropdownStyles.sxItemText}>\n <Typography\n component=\"span\"\n sx={SimpleDropdownStyles.sxLabel(Boolean(option.description))}>\n {option.label}\n </Typography>\n {option.description ? (\n <Typography\n component=\"span\"\n sx={SimpleDropdownStyles.sxDescription}>\n {option.description}\n </Typography>\n ) : null}\n </Box>\n </MenuItem>\n {isExpanded\n ? option.subItems\n ?.filter((subItem) => subItem.show !== false)\n .map((subItem, subIndex) => (\n <MenuItem\n key={`${key}-${subItem.id ?? subIndex}`}\n disabled={subItem.disabled}\n data-testid={subItem.testId}\n onClick={() => {\n if (subItem.disabled) return;\n subItem.onClick?.(subItem);\n if (closeOnSelect) handleClose();\n }}\n sx={SimpleDropdownStyles.sxSubItem}>\n {subItem.label}\n </MenuItem>\n ))\n : null}\n </Fragment>\n );\n };\n\n const defaultTrigger = (\n <IconButton\n aria-haspopup=\"true\"\n sx={SimpleDropdownStyles.sxIconTrigger(open)}>\n {triggerIcon ?? <MoreVertIcon />}\n </IconButton>\n );\n const renderedTrigger =\n typeof trigger === 'function'\n ? trigger({ open })\n : (trigger ?? defaultTrigger);\n\n return (\n <>\n {!isControlled && renderedTrigger ? (\n <Box\n component=\"span\"\n onClick={handleTriggerClick}\n sx={SimpleDropdownStyles.sxTriggerWrap}>\n {renderedTrigger}\n </Box>\n ) : null}\n\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n slotProps={{\n paper: {\n sx: SimpleDropdownStyles.sxMenuPaper(\n minWidth,\n transformOrigin.vertical === 'bottom',\n ),\n },\n list: {\n sx: SimpleDropdownStyles.sxList,\n // MUI no tipa atributos data-* en el slot list; cast puntual.\n ...(testId ? ({ 'data-testid': testId } as object) : {}),\n },\n }}>\n {columns === 2 ? (\n <Box sx={SimpleDropdownStyles.sxGrid}>\n {visibleOptions.map((option, index) => renderOption(option, index))}\n </Box>\n ) : (\n visibleOptions.map((option, index) => renderOption(option, index))\n )}\n {footer ? <Divider sx={{ my: 0.5 }} /> : null}\n {footer ? <Box sx={SimpleDropdownStyles.sxFooter}>{footer}</Box> : null}\n </Menu>\n </>\n );\n}\n","import type { PreviewMenuMessageKey } from '../../i18n';\n\n/**\n * Formato de previsualización (Desktop / Mobile / Tablet…). En el CMS legacy la\n * lista es dinámica (`POST /news/previewFormats`); acá se reciben por props.\n */\nexport type PreviewFormat = {\n /** Identificador estable; lo recibe `onSelect` al hacer clic. */\n id: string;\n /** Clave i18n del namespace `previewMenu` (cuando el texto es conocido). */\n labelKey?: PreviewMenuMessageKey;\n /** Texto ya resuelto (cuando el nombre viene dinámico del backend). */\n label?: string;\n /**\n * Ruta de preview de la publicación (campo `r` del form), p. ej.\n * `/sites/<sitio>/index.html`. Viene de `POST /news/previewFormats`. Si está\n * presente (con sesión), el clic redirige al admin viejo; si no, usa `onSelect`.\n */\n path?: string;\n /** QueryString del dispositivo (de `POST /news/previewFormats`). */\n queryString?: string;\n /** Protocolo del preview (`'https'` por defecto). */\n protocol?: string;\n};\n\n/**\n * Formatos por defecto con la ruta EXACTA de cmsmedios. El redirect (form POST\n * al CMS, como Ayuda) arma el campo `r` con `submitLegacyAdminPage`:\n * - Desktop → `r = /index.html`\n * - Mobile → `r = /preview/mobile.html?path=/index.html`\n * - Tablet → `r = /preview/tablet.html?path=/index.html`\n *\n * `path` es la ruta de la publicación (`/index.html` para la principal). El\n * `queryString` del device, al contener `/`, dispara la rama \"redirect\" de\n * cmsmedios (`<queryString>?path=<path>`). El gestor puede sobrescribir estos\n * formatos con los de `POST /news/previewFormats` por publicación.\n */\nexport const DEFAULT_PREVIEW_FORMATS: PreviewFormat[] = [\n { id: 'desktop', labelKey: 'desktop', path: '/index.html' },\n {\n id: 'mobile',\n labelKey: 'mobile',\n path: '/index.html',\n queryString: '/preview/mobile.html',\n },\n {\n id: 'tablet',\n labelKey: 'tablet',\n path: '/index.html',\n queryString: '/preview/tablet.html',\n },\n];\n","'use client';\n\nimport DevicesOtherOutlinedIcon from '@mui/icons-material/DevicesOtherOutlined';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useMemo } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport {\n submitLegacyAdminPage,\n type LegacyAdminSession,\n} from '../../utils/legacy-admin';\nimport { SimpleDropdown } from '../dropdowns/SimpleDropdown';\nimport type { DropdownOption } from '../dropdowns/types';\nimport {\n DEFAULT_PREVIEW_FORMATS,\n type PreviewFormat,\n} from './previewMenu.config';\nimport { TopBarStyles } from './TopBar.styles';\n\nexport type PreviewMenuProps = {\n /** Formatos de preview. Por defecto, Desktop / Mobile / Tablet. */\n formats?: PreviewFormat[];\n /** Origen del CMS (JSP) para el redirect al admin viejo. */\n cmsBaseUrl?: string;\n /** Sesión para el form POST del redirect (token, sitio, etc.). */\n legacySession?: LegacyAdminSession;\n /**\n * Punto de integración: se invoca con el `id` del formato cuando no se puede\n * redirigir directo (falta `path`/sesión). El gestor arma la URL y redirige.\n */\n onSelect?: (formatId: string) => void;\n};\n\n/**\n * Menú desplegable del botón de previsualización (icono de dispositivos) del\n * header. Usa el `SimpleDropdown` de la lib. Igual que en cmsmedios, solo se\n * renderiza si hay al menos un formato disponible.\n */\nexport function PreviewMenu({\n formats = DEFAULT_PREVIEW_FORMATS,\n cmsBaseUrl,\n legacySession,\n onSelect,\n}: PreviewMenuProps) {\n const { t } = useCmsTranslation();\n const title = t.topBar('preview');\n\n const options = useMemo<DropdownOption[]>(\n () =>\n formats.map((format) => ({\n id: format.id,\n label: format.labelKey ? t.previewMenu(format.labelKey) : format.label,\n testId: `dropdown-item-preview-${format.id}`,\n onClick: () => {\n // Con sesión y la ruta del formato, redirige al CMS con el form POST\n // (igual que Ayuda). `submitLegacyAdminPage` arma el `r` exacto de\n // cmsmedios: con queryString que contiene `/` → `<qs>?path=<path>`.\n if (cmsBaseUrl && legacySession && format.path) {\n submitLegacyAdminPage({\n cmsBaseUrl,\n path: format.path,\n session: legacySession,\n device: {\n protocol: format.protocol,\n queryString: format.queryString,\n },\n });\n return;\n }\n onSelect?.(format.id);\n },\n })),\n [formats, cmsBaseUrl, legacySession, onSelect, t],\n );\n\n if (formats.length === 0) return null;\n\n return (\n <SimpleDropdown\n options={options}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n testId=\"dropdown-menu-preview\"\n trigger={({ open }) => (\n <Tooltip title={title}>\n <IconButton\n aria-label={title}\n aria-haspopup=\"true\"\n aria-expanded={open}\n data-testid=\"dropdown-toggle-preview\"\n sx={TopBarStyles.sxActionIcon}>\n <DevicesOtherOutlinedIcon sx={TopBarStyles.sxActionIconGlyph} />\n </IconButton>\n </Tooltip>\n )}\n />\n );\n}\n","const DEFAULT_CMS_ORIGIN = 'https://dev.cms-medios.com';\n\nexport function resolveCmsOrigin(cmsOrigin?: string): string {\n const base = cmsOrigin?.trim();\n if (!base) return DEFAULT_CMS_ORIGIN;\n return base.replace(/\\/$/, '');\n}\n\nexport function resolveCmsAssetUrl(path: string, cmsOrigin?: string): string {\n if (!path) return '';\n if (path.startsWith('http://') || path.startsWith('https://')) return path;\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return `${resolveCmsOrigin(cmsOrigin)}${normalized}`;\n}\n","import { resolveCmsAssetUrl } from './cms-asset';\nimport type { ProfileGetResponse } from '../types/profile';\n\nconst NO_PICTURE = 'noPicture';\nconst DEFAULT_FALLBACK_AVATAR = '/topbar_profile.png';\n\nexport type ProfileAvatarOptions = {\n cmsOrigin?: string;\n fallbackAvatar?: string;\n};\n\nexport function getProfileAvatarSrc(\n profile: ProfileGetResponse,\n options?: ProfileAvatarOptions,\n): string {\n const { image } = profile;\n const fallback = options?.fallbackAvatar ?? DEFAULT_FALLBACK_AVATAR;\n if (!image || image === NO_PICTURE) return fallback;\n return resolveCmsAssetUrl(image, options?.cmsOrigin);\n}\n\nexport function getProfileDisplayName(profile: ProfileGetResponse): string {\n if (profile.fullName?.trim()) return profile.fullName.trim();\n const parts = [profile.firstName, profile.lastName].filter(Boolean);\n if (parts.length > 0) return parts.join(' ');\n return profile.userName;\n}\n\n/**\n * Nombre y apellido del usuario, SIN el nickname/login. Para el título del\n * desplegable de perfil, donde no debe aparecer el nickname (a diferencia de\n * `getProfileDisplayName`, que puede caer en `fullName` —que incluye el\n * nickname— o en `userName`). Solo cae a `userName` si no hay nombre ni apellido.\n */\nexport function getProfileFullName(profile: ProfileGetResponse): string {\n const parts = [profile.firstName, profile.lastName].filter(Boolean);\n if (parts.length > 0) return parts.join(' ');\n return profile.userName;\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors } from '../../theme/variables';\n\n/** Proporción del ícono fallback respecto al diámetro del avatar (≈ 16/27). */\nconst ICON_RATIO = 0.58;\n\nexport const UserAvatarStyles = {\n /**\n * Avatar circular. Cuando no hay foto, el fondo secundario y el ícono\n * `PersonOutlined` quedan visibles (mismo look que la tabla del gestor).\n * Si `inactive`, cae a un gris apagado (usuario desactivado).\n */\n sxAvatar: (\n size: number,\n clickable: boolean,\n inactive: boolean,\n neutralFallback = false,\n transparentFallbackBg = false,\n ): SxProps<Theme> => ({\n width: size,\n height: size,\n bgcolor: inactive\n ? cmsColors.avatarInactiveBg\n : neutralFallback\n ? // El disparador del header no pinta fondo en reposo: lo hace el botón\n // contenedor al hover (ver `sxProfileButton`).\n transparentFallbackBg\n ? 'transparent'\n : 'm3.surfaceVariant'\n : cmsColors.secondary,\n color: inactive\n ? cmsColors.avatarInactiveIcon\n : neutralFallback\n ? 'm3.onSurfaceVariant'\n : cmsColors.onSecondaryContainer,\n cursor: clickable ? 'pointer' : 'default',\n }),\n\n /** Ícono fallback (persona) escalado al tamaño del avatar. */\n sxIcon: (\n size: number,\n inactive: boolean,\n neutralFallback = false,\n ): SxProps<Theme> => ({\n fontSize: Math.round(size * ICON_RATIO),\n color: inactive\n ? cmsColors.avatarInactiveIcon\n : neutralFallback\n ? 'm3.onSurfaceVariant'\n : cmsColors.onSecondaryContainer,\n }),\n\n /** Superficie oscura del tooltip del avatar (fondo + flecha + texto claro). */\n sxTooltip: {\n bgcolor: cmsColors.tooltipSurface,\n color: cmsColors.white,\n '& .MuiTooltip-arrow': {\n color: cmsColors.tooltipSurface,\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport { createContext, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\n/**\n * Estado compartido de la foto del usuario logueado.\n *\n * Es el equivalente React del `updateImageProfile` (BehaviorSubject) del CMS\n * Angular legacy: cuando el usuario cambia su foto de perfil, la pantalla de\n * edición llama a `setPhoto(...)` y todos los avatares marcados como\n * `isCurrentUser` se actualizan al instante, sin recargar ni hacer\n * prop-drilling.\n */\nexport interface CurrentUserPhotoContextValue {\n /** Foto actual del usuario logueado: ruta/URL, '' o 'noPicture'. `null` = sin valor todavía. */\n photo: string | null;\n /** Notifica una foto nueva (o '' / 'noPicture' al borrarla). */\n setPhoto: (photo: string | null) => void;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CurrentUserPhotoContext =\n createContext<CurrentUserPhotoContextValue | null>(null);\n\nexport interface CurrentUserPhotoProviderProps {\n /** Foto inicial del usuario logueado (p. ej. `profile.image`). */\n initialPhoto?: string | null;\n children: ReactNode;\n}\n\n/**\n * Provider de la foto del usuario logueado. Montarlo por encima de los avatares\n * que representan al usuario actual (típicamente en el `AppShell` o el layout de\n * la cuenta), sembrado con `profile.image`.\n */\nexport function CurrentUserPhotoProvider({\n initialPhoto = null,\n children,\n}: CurrentUserPhotoProviderProps) {\n const [photo, setPhoto] = useState<string | null>(initialPhoto);\n // Si el perfil se recarga del servidor con otra foto, resincronizamos el\n // estado ajustándolo en render (patrón recomendado por React, sin useEffect).\n const [seed, setSeed] = useState<string | null>(initialPhoto);\n if (seed !== initialPhoto) {\n setSeed(initialPhoto);\n setPhoto(initialPhoto);\n }\n\n const value = useMemo<CurrentUserPhotoContextValue>(\n () => ({ photo, setPhoto }),\n [photo],\n );\n\n return (\n <CurrentUserPhotoContext.Provider value={value}>\n {children}\n </CurrentUserPhotoContext.Provider>\n );\n}\n","'use client';\n\nimport { useContext } from 'react';\n\nimport {\n CurrentUserPhotoContext,\n type CurrentUserPhotoContextValue,\n} from './CurrentUserPhotoProvider';\n\n/**\n * Acceso al estado compartido de la foto del usuario logueado.\n *\n * Devuelve `null` si no hay provider montado: así `UserAvatar` y la pantalla de\n * perfil funcionan también sin el provider (caso tabla de usuarios, donde cada\n * avatar es otro usuario y no necesita actualización en vivo).\n */\nexport function useCurrentUserPhoto(): CurrentUserPhotoContextValue | null {\n return useContext(CurrentUserPhotoContext);\n}\n","'use client';\n\nimport PersonOutlinedIcon from '@mui/icons-material/PersonOutlined';\nimport Avatar from '@mui/material/Avatar';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useMemo } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport { resolveCmsAssetUrl } from '../../utils/cms-asset';\nimport { UserAvatarStyles } from './UserAvatar.styles';\nimport { useCurrentUserPhoto } from './useCurrentUserPhoto';\n\n/** Valor que el backend usa para \"sin foto\" (igual que en cmsmedios). */\nconst NO_PICTURE = 'noPicture';\n\nexport type UserAvatarProps = {\n /**\n * Foto del usuario: ruta relativa, URL absoluta, `''` o `'noPicture'`\n * (misma forma que el campo `photo` en cmsmedios). Si falta o es `'noPicture'`,\n * se muestra el ícono de persona sobre fondo secundario.\n */\n photo?: string | null;\n /** Nombre legible del usuario (campo `description` en cmsmedios). Tooltip + alt. */\n description?: string;\n /** Login del usuario (campo `username`). Fallback del nombre. */\n username?: string;\n /** Diámetro del avatar en px. Por defecto 32. */\n size?: number;\n /** Muestra el tooltip con el nombre al pasar el mouse. Por defecto `true`. */\n showTooltip?: boolean;\n /**\n * Marca al usuario como inactivo/desactivado: el avatar cae a un gris apagado\n * (fondo y ícono más grises). Por defecto `false`.\n */\n inactive?: boolean;\n /**\n * Usa el fallback neutro (fondo `m3.surfaceVariant` #E0E2EC + ícono\n * `m3.onSurfaceVariant` #43474E) en vez del azul tonal. Para el avatar de\n * cuenta del header/perfil. Sin efecto si hay foto o si `inactive`.\n */\n neutralFallback?: boolean;\n /**\n * Solo con `neutralFallback`: el fondo del fallback queda transparente (no\n * pinta el círculo gris en reposo). Pensado para el disparador del perfil en\n * el header, donde el botón contenedor pinta el círculo al hover.\n */\n transparentFallbackBg?: boolean;\n /** Origen del CMS para resolver rutas relativas de la foto. */\n cmsOrigin?: string;\n /**\n * `crossOrigin` del `<img>`. Sin valor por defecto (lo más seguro para mostrar).\n * El `TopBar` de la lib usa `'anonymous'`; pasarlo si el CMS lo requiere.\n */\n crossOrigin?: 'anonymous' | 'use-credentials';\n /**\n * Marca este avatar como el del usuario logueado: así reacciona al cambio de\n * foto de perfil emitido por `CurrentUserPhotoProvider` (equivalente al\n * `updateImageProfile` del Angular legacy). Sin provider, usa la prop `photo`.\n */\n isCurrentUser?: boolean;\n /** Acción al hacer clic. Si se define, el avatar muestra cursor de puntero. */\n onClick?: () => void;\n /** Base para el `data-testid` (`avatar-<testId>`). */\n testId?: string;\n};\n\n/**\n * Avatar de usuario compartible: muestra la foto del usuario y, si no tiene,\n * el ícono `PersonOutlined` sobre fondo secundario. Incluye tooltip con el\n * nombre y textos traducidos (es/en/pt). Reacciona al cambio de la prop `photo`;\n * para el usuario logueado, reacciona además al `CurrentUserPhotoProvider`.\n */\nexport function UserAvatar({\n photo,\n description,\n username,\n size = 32,\n showTooltip = true,\n inactive = false,\n neutralFallback = false,\n transparentFallbackBg = false,\n cmsOrigin,\n crossOrigin,\n isCurrentUser = false,\n onClick,\n testId,\n}: UserAvatarProps) {\n const { t } = useCmsTranslation();\n const currentUserPhoto = useCurrentUserPhoto();\n\n // Para el usuario logueado, si hay provider la foto la manda el provider\n // (se actualiza al cambiarla en el perfil); si no, usamos la prop.\n const effectivePhoto =\n isCurrentUser && currentUserPhoto ? currentUserPhoto.photo : photo;\n\n const src = useMemo(() => {\n if (!effectivePhoto || effectivePhoto === NO_PICTURE) return '';\n return resolveCmsAssetUrl(effectivePhoto, cmsOrigin);\n }, [effectivePhoto, cmsOrigin]);\n\n const name = description?.trim() || username?.trim() || '';\n const tooltipText = name || t.userAvatar('unknownUser');\n const altText = name || t.userAvatar('alt');\n\n const avatar = (\n <Avatar\n src={src || undefined}\n alt={altText}\n onClick={onClick}\n data-testid={testId ? `avatar-${testId}` : undefined}\n slotProps={crossOrigin ? { img: { crossOrigin } } : undefined}\n sx={UserAvatarStyles.sxAvatar(\n size,\n Boolean(onClick),\n inactive,\n neutralFallback,\n transparentFallbackBg,\n )}>\n <PersonOutlinedIcon\n sx={UserAvatarStyles.sxIcon(size, inactive, neutralFallback)}\n />\n </Avatar>\n );\n\n if (!showTooltip) return avatar;\n\n return (\n <Tooltip\n title={tooltipText}\n arrow\n slotProps={{ tooltip: { sx: UserAvatarStyles.sxTooltip } }}>\n {avatar}\n </Tooltip>\n );\n}\n","'use client';\n\nimport AccountCircleOutlinedIcon from '@mui/icons-material/AccountCircleOutlined';\nimport AdminPanelSettingsOutlinedIcon from '@mui/icons-material/AdminPanelSettingsOutlined';\nimport LogoutOutlinedIcon from '@mui/icons-material/LogoutOutlined';\nimport type { SvgIconComponent } from '@mui/icons-material';\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Typography from '@mui/material/Typography';\nimport { useMemo, useState } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport type { ProfileMenuMessageKey } from '../../i18n';\nimport { cmsColors } from '../../theme/variables';\nimport type { ProfileGetResponse } from '../../types/profile';\nimport {\n submitLegacyAdminPage,\n type LegacyAdminSession,\n} from '../../utils/legacy-admin';\nimport {\n getProfileDisplayName,\n getProfileFullName,\n type ProfileAvatarOptions,\n} from '../../utils/profile-avatar';\nimport { toTestId } from '../../utils/toTestId';\nimport { UserAvatar } from '../user-avatar/UserAvatar';\nimport { TopBarStyles } from './TopBar.styles';\n\n/**\n * Rutas del CMS Angular legacy (las mismas para todos los gestores). El dominio\n * base lo inyecta el gestor con la prop `legacyBaseUrl` (dato de entorno).\n */\nconst LEGACY_PROFILE_PATH = '/admin/user_profile/user-settings';\nconst LEGACY_WEBMASTER_PATH = '/system/login';\n\n/**\n * Permiso de operación que habilita la \"Vista Webmaster\" (igual que el\n * `permissionName: 'ACCESS_WEBMASTERS'` del header de cmsmedios).\n */\nconst WEBMASTER_PERMISSION = 'ACCESS_WEBMASTERS';\n\n/** Une el dominio base del Angular con una ruta, sin doble barra. */\nfunction joinLegacyUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n}\n\ntype ProfileMenuItem = {\n id: string;\n labelKey: ProfileMenuMessageKey;\n icon: SvgIconComponent;\n /** Si está, el ítem es un enlace al Angular legacy. */\n href?: string;\n /** Abre el enlace en una pestaña nueva. */\n external?: boolean;\n /** Acción de cliente (tiene prioridad sobre `href`). */\n onActivate?: () => void;\n};\n\nfunction ProfileMenuOption({\n label,\n icon: Icon,\n onSelect,\n href,\n external,\n danger,\n testId,\n}: {\n label: string;\n icon: SvgIconComponent;\n onSelect: () => void;\n href?: string;\n external?: boolean;\n /** Variante destructiva: texto e icono en rojo (p. ej. \"Cerrar sesión\"). */\n danger?: boolean;\n /** `data-testid` del ítem del menú. */\n testId?: string;\n}) {\n // Texto e icono comparten color: opciones normales `onSurface` (#191C20),\n // \"Cerrar sesión\" en rojo destructivo (#BA1A1A).\n const color = danger ? cmsColors.danger : 'text.primary';\n return (\n <MenuItem\n onClick={onSelect}\n data-testid={testId}\n sx={TopBarStyles.sxProfileMenuItem}\n {...(href\n ? {\n component: 'a',\n href,\n ...(external\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {}),\n }\n : {})}>\n <ListItemIcon sx={TopBarStyles.sxProfileMenuListItemIcon}>\n <Icon sx={{ color }} />\n </ListItemIcon>\n <ListItemText\n primary={label}\n slotProps={{\n primary: {\n sx: { fontSize: 14, fontWeight: 500, color },\n },\n }}\n />\n </MenuItem>\n );\n}\n\nexport type ProfileMenuProps = {\n profile: ProfileGetResponse;\n avatarOptions?: ProfileAvatarOptions;\n /** Dominio del CMS Angular legacy para \"Mi Perfil\" / \"Vista Webmaster\". */\n legacyBaseUrl?: string;\n /** Origen del CMS (JSP) para el POST de auto-login de \"Vista Webmaster\". */\n cmsBaseUrl?: string;\n /**\n * Sesión para el redirect al admin viejo (token, sitio, publicación, usuario).\n * Con ella, \"Vista Webmaster\" hace el form POST de cmsmedios (auto-login); sin\n * ella, cae a un enlace simple.\n */\n legacySession?: LegacyAdminSession;\n /**\n * Operaciones concedidas al usuario (`POST /auth/permissions`). Si se omite,\n * no se filtra por permisos (se muestra \"Vista Webmaster\"). Igual criterio que\n * el menú \"Nuevo\".\n */\n operationPermissions?: string[];\n /** Si el usuario es administrador (ve \"Vista Webmaster\" siempre). */\n isAdmin?: boolean;\n};\n\nexport function ProfileMenu({\n profile,\n avatarOptions,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n operationPermissions,\n isAdmin,\n}: ProfileMenuProps) {\n const { t } = useCmsTranslation();\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const displayName = getProfileDisplayName(profile);\n // Título del desplegable: solo nombre y apellido (sin el nickname/login que\n // sí puede traer `displayName` vía `fullName`/`userName`).\n const fullName = getProfileFullName(profile);\n\n // \"Vista Webmaster\" solo para usuarios con permiso `ACCESS_WEBMASTERS` (o\n // admin). Sin `operationPermissions` cableado, no se filtra (mismo criterio\n // que el menú \"Nuevo\", útil para maquetado antes de `/auth/permissions`).\n const canSeeWebmaster =\n operationPermissions === undefined ||\n Boolean(isAdmin) ||\n operationPermissions.includes(WEBMASTER_PERMISSION);\n\n const menuItems = useMemo<ProfileMenuItem[]>(() => {\n const items: ProfileMenuItem[] = [\n {\n id: 'profile',\n labelKey: 'myProfile',\n icon: AccountCircleOutlinedIcon,\n href: joinLegacyUrl(legacyBaseUrl, LEGACY_PROFILE_PATH),\n },\n ];\n if (canSeeWebmaster) {\n // Como cmsmedios (`validateCurrentToken('/system/login')`): con sesión, se\n // arma el form POST al admin viejo (auto-login) en vez de un enlace simple.\n const canPost = Boolean(cmsBaseUrl && legacySession);\n items.push({\n id: 'webmaster',\n labelKey: 'webmasterView',\n icon: AdminPanelSettingsOutlinedIcon,\n external: true,\n onActivate: canPost\n ? () =>\n submitLegacyAdminPage({\n cmsBaseUrl: cmsBaseUrl as string,\n path: LEGACY_WEBMASTER_PATH,\n session: legacySession as LegacyAdminSession,\n })\n : undefined,\n href: canPost\n ? undefined\n : joinLegacyUrl(cmsBaseUrl ?? legacyBaseUrl, LEGACY_WEBMASTER_PATH),\n });\n }\n return items;\n }, [legacyBaseUrl, cmsBaseUrl, legacySession, canSeeWebmaster]);\n\n const signOffItem = useMemo<ProfileMenuItem>(\n () => ({ id: 'sign-off', labelKey: 'signOff', icon: LogoutOutlinedIcon }),\n [],\n );\n\n const handleClose = () => setAnchorEl(null);\n\n const handleSelect = (item: ProfileMenuItem) => {\n item.onActivate?.();\n handleClose();\n };\n\n return (\n <>\n <IconButton\n id=\"profile-menu-button\"\n aria-label={t.profileMenu('ariaLabel')}\n aria-controls={open ? 'profile-menu' : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n onClick={(e) => setAnchorEl(e.currentTarget)}\n data-testid=\"dropdown-toggle-profile\"\n sx={TopBarStyles.sxProfileButton}>\n <UserAvatar\n photo={profile.image}\n description={displayName}\n username={profile.userName}\n size={36}\n showTooltip={false}\n isCurrentUser\n neutralFallback\n transparentFallbackBg\n cmsOrigin={avatarOptions?.cmsOrigin}\n crossOrigin=\"anonymous\"\n />\n </IconButton>\n\n <Menu\n id=\"profile-menu\"\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{\n paper: {\n sx: TopBarStyles.sxProfileMenuPaper,\n ...({ 'data-testid': 'dropdown-menu-profile' } as object),\n },\n list: { disablePadding: true },\n }}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n px: 2,\n py: 1.5,\n borderBottom: 1,\n borderColor: 'divider',\n // Respiro entre la línea del header y el primer ítem: así el hover de\n // \"Mi Perfil\" no queda pegado a la línea de arriba.\n mb: 0.5,\n }}>\n <UserAvatar\n photo={profile.image}\n description={displayName}\n username={profile.userName}\n size={40}\n showTooltip={false}\n isCurrentUser\n neutralFallback\n cmsOrigin={avatarOptions?.cmsOrigin}\n crossOrigin=\"anonymous\"\n />\n <Box sx={{ minWidth: 0 }}>\n <Typography\n variant=\"subtitle2\"\n sx={{ fontSize: 14, fontWeight: 500, color: 'text.primary' }}>\n {fullName}\n </Typography>\n <Typography\n variant=\"caption\"\n sx={{ fontSize: 12, fontWeight: 400, color: 'text.secondary' }}>\n {profile.email}\n </Typography>\n </Box>\n </Box>\n {menuItems.map((item) => (\n <ProfileMenuOption\n key={item.id}\n label={t.profileMenu(item.labelKey)}\n icon={item.icon}\n href={item.href}\n external={item.external}\n testId={`dropdown-item-${toTestId(item.id)}`}\n onSelect={() => handleSelect(item)}\n />\n ))}\n <Divider sx={TopBarStyles.sxProfileMenuDivider} />\n <ProfileMenuOption\n label={t.profileMenu(signOffItem.labelKey)}\n icon={signOffItem.icon}\n testId=\"dropdown-item-sign-off\"\n onSelect={() => handleSelect(signOffItem)}\n danger\n />\n </Menu>\n </>\n );\n}\n","'use client';\n\nimport ScheduleOutlinedIcon from '@mui/icons-material/ScheduleOutlined';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { useEffect, useState } from 'react';\n\nimport { getIntlLocaleTag, useCmsTranslation } from '../../i18n';\nimport { formatSiteDateTime } from '../../utils/site-time';\nimport { TopBarStyles } from './TopBar.styles';\n\nexport type TopBarClockProps = {\n /** Offset GMT de la publicación, tal como llega del CMS (p. ej. `\"-4\"`). */\n gmtRedaction?: string;\n /** Formato horario del CMS: `\"12h\"` (AM/PM) o `\"24h\"`. */\n timeFormat?: string;\n};\n\n/**\n * Etiqueta GMT a partir del offset de la publicación:\n * `\"-4\"` → `\"GMT-4\"`, `\"5\"` → `\"GMT+5\"`, vacío → `\"GMT\"`.\n */\nfunction formatGmtLabel(gmtRedaction?: string): string {\n const raw = (gmtRedaction ?? '').trim();\n if (!raw) return 'GMT';\n return `GMT${/^[+-]/.test(raw) ? raw : `+${raw}`}`;\n}\n\n/**\n * Reloj del header: hora actual en la zona de redacción de la publicación\n * seleccionada. Equivale al `.time` del modal de calendario del CMS Angular\n * (`cmsmedios`): toma la hora del navegador y la desplaza por el offset GMT de\n * la publicación; el formato 12h/24h sale del `timeFormat` del CMS.\n */\nexport function TopBarClock({ gmtRedaction, timeFormat }: TopBarClockProps) {\n const { locale, t } = useCmsTranslation();\n const [now, setNow] = useState<number | null>(null);\n\n // La hora real se fija solo en cliente para evitar desajustes de hidratación\n // (el `Date.now()` del servidor no coincide con el del navegador).\n useEffect(() => {\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, []);\n\n if (now === null) return null;\n\n const time = formatSiteDateTime(now, gmtRedaction, getIntlLocaleTag(locale), {\n hour: 'numeric',\n minute: '2-digit',\n hour12: timeFormat !== '24h',\n });\n\n return (\n <Box sx={TopBarStyles.sxClock}>\n <ScheduleOutlinedIcon sx={TopBarStyles.sxClockIcon} />\n <Box sx={TopBarStyles.sxClockText}>\n <Typography component=\"span\" sx={TopBarStyles.sxClockTime}>\n {time}\n </Typography>\n <Typography component=\"span\" sx={TopBarStyles.sxClockMeta}>\n {`${t.topBar('publication')} · ${formatGmtLabel(gmtRedaction)}`}\n </Typography>\n </Box>\n </Box>\n );\n}\n","'use client';\n\nimport HelpOutlineOutlinedIcon from '@mui/icons-material/HelpOutlineOutlined';\nimport MenuIcon from '@mui/icons-material/Menu';\nimport AppBar from '@mui/material/AppBar';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Toolbar from '@mui/material/Toolbar';\nimport Tooltip from '@mui/material/Tooltip';\nimport type { ReactNode } from 'react';\n\nimport type { DashboardNotificationsResponse } from '../../services/dashboard';\nimport type { ProfileGetResponse } from '../../types/profile';\nimport type { Publication } from '../../types/publication';\nimport type { SiteSection } from '../../types/site';\nimport { useCmsTranslation } from '../../i18n';\nimport type { ProfileAvatarOptions } from '../../utils/profile-avatar';\nimport {\n submitLegacyAdminPage,\n type LegacyAdminSession,\n} from '../../utils/legacy-admin';\nimport { findPublicationBySlug } from '../../utils/site-selector';\nimport { SiteSelectorMenu } from '../site-selector-menu/SiteSelectorMenu';\nimport { AppearanceMenu } from './AppearanceMenu';\nimport { NotificationsMenu } from './NotificationsMenu';\nimport { PreviewMenu } from './PreviewMenu';\nimport type { PreviewFormat } from './previewMenu.config';\nimport { ProfileMenu } from './ProfileMenu';\nimport { TopBarClock } from './TopBarClock';\nimport { TopBarStyles } from './TopBar.styles';\n\n/** Une el dominio del Angular legacy con una ruta, sin barra doble. */\nfunction joinLegacyUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n}\n\nfunction TopBarDivider() {\n return (\n <Box\n component=\"span\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n sx={TopBarStyles.sxDivider}\n />\n );\n}\n\nexport type TopBarProps = {\n sites: SiteSection[];\n /** Solo aplica con un sidebar colapsable (p. ej. `Sidebar`). Omitir oculta el botón. */\n sidebarOpen?: boolean;\n onToggleSidebar?: () => void;\n notificationUnreadCount: number;\n /** Respuesta cruda de `POST /dashboard/notification` (newsTask/expireTask/videos). */\n notificationsData?: DashboardNotificationsResponse | null;\n /** Destino del \"Ver más\" / clic en una oportunidad copilot (página de sugerencias). */\n copilotSuggestionsHref?: string;\n /** Clic en \"Ver más\" cuando no hay `copilotSuggestionsHref` (fallback). */\n onEditorialSeeMore?: () => void;\n /** \"Recordar luego\": recibe los `opportunity_id` mostrados para el snooze. */\n onEditorialRemindLater?: (opportunityIds: string[]) => void;\n profile: ProfileGetResponse;\n primaryLogo: ReactNode;\n brandLogo?: ReactNode;\n selectedPublicationId?: string;\n getPublicationHref: (publication: Publication) => string;\n resolvePublicationImageUrl?: (imagePath: string) => string;\n profileAvatarOptions?: ProfileAvatarOptions;\n /** Dominio del CMS Angular legacy (deploy nuevo) para enlaces de perfil. */\n legacyBaseUrl?: string;\n /**\n * Origen del CMS (JSP), p. ej. `https://dev.cms-medios.com`. Se usa para Ayuda\n * y Preview, que redirigen al admin viejo (NO al deploy de `legacyBaseUrl`).\n */\n cmsBaseUrl?: string;\n /**\n * Sesión para el redirect al admin viejo (token, sitio, publicación, usuario).\n * Si se pasa, Ayuda/Preview usan el form POST de cmsmedios; si no, Ayuda cae a\n * un enlace simple al CMS.\n */\n legacySession?: LegacyAdminSession;\n /** Formatos del menú de previsualización. Por defecto, Desktop/Mobile/Tablet. */\n previewFormats?: PreviewFormat[];\n /**\n * Operaciones concedidas al usuario (`POST /auth/permissions`). Filtran los\n * ítems del menú de perfil según permisos.\n */\n operationPermissions?: string[];\n /** Si el usuario es administrador (ve todos los ítems restringidos por permiso). */\n isAdmin?: boolean;\n /** Integración: clic en un formato de previsualización (recibe su `id`). */\n onPreviewSelect?: (formatId: string) => void;\n};\n\nexport function TopBar({\n sites,\n sidebarOpen,\n onToggleSidebar,\n notificationUnreadCount,\n notificationsData,\n copilotSuggestionsHref,\n onEditorialSeeMore,\n onEditorialRemindLater,\n profile,\n primaryLogo,\n brandLogo,\n selectedPublicationId,\n getPublicationHref,\n resolvePublicationImageUrl,\n profileAvatarOptions,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n previewFormats,\n operationPermissions,\n isAdmin,\n onPreviewSelect,\n}: TopBarProps) {\n const { t, locale } = useCmsTranslation();\n\n const selectedPublication = selectedPublicationId\n ? findPublicationBySlug(sites, selectedPublicationId)\n : undefined;\n\n // Mismo armado de URL que el `openManual()` del Angular legacy: ruta del\n // manual de ayuda por idioma sobre el ORIGEN DEL CMS (no el deploy nuevo).\n const helpTitle = t.topBar('help');\n const helpBase = cmsBaseUrl ?? legacyBaseUrl;\n const helpPath = `/system/modules/com.tfsla.diario.help/${locale}/index.html`;\n\n /**\n * Abre el manual de ayuda. Con sesión, usa el form POST de cmsmedios (pasa el\n * token al admin viejo); sin sesión, cae a un enlace simple al CMS.\n * @returns void\n */\n const handleHelpClick = () => {\n if (cmsBaseUrl && legacySession) {\n submitLegacyAdminPage({\n cmsBaseUrl,\n path: helpPath,\n session: legacySession,\n });\n return;\n }\n if (typeof window !== 'undefined') {\n window.open(joinLegacyUrl(helpBase, helpPath), '_blank', 'noopener');\n }\n };\n\n return (\n <AppBar position=\"static\" elevation={0} sx={TopBarStyles.sxAppBar}>\n <Toolbar disableGutters variant=\"dense\" sx={TopBarStyles.sxToolbar}>\n {onToggleSidebar && (\n <IconButton\n aria-label={\n sidebarOpen ? t.topBar('closeSidebar') : t.topBar('openSidebar')\n }\n aria-expanded={sidebarOpen}\n onClick={onToggleSidebar}\n sx={TopBarStyles.sxMenuButton}\n data-testid=\"icon-btn-sidebar-toggle\">\n <MenuIcon sx={TopBarStyles.sxMenuButtonIcon} />\n </IconButton>\n )}\n\n <Box sx={TopBarStyles.sxLogoBox}>{primaryLogo}</Box>\n\n <Box sx={{ flex: 1 }} />\n\n <Box sx={TopBarStyles.sxActionsFrame}>\n <Box sx={TopBarStyles.sxIconActionsRow}>\n <AppearanceMenu />\n\n <NotificationsMenu\n unreadCount={notificationUnreadCount}\n notificationsData={notificationsData}\n masterBaseUrl={legacyBaseUrl}\n currentPublicationId={selectedPublication?.id}\n gmtRedaction={selectedPublication?.gmtRedaction}\n copilotSuggestionsHref={copilotSuggestionsHref}\n onEditorialSeeMore={onEditorialSeeMore}\n onEditorialRemindLater={onEditorialRemindLater}\n />\n\n <PreviewMenu\n formats={previewFormats}\n cmsBaseUrl={cmsBaseUrl}\n legacySession={legacySession}\n onSelect={onPreviewSelect}\n />\n\n <Tooltip title={helpTitle}>\n <IconButton\n onClick={handleHelpClick}\n aria-label={helpTitle}\n sx={TopBarStyles.sxActionIcon}\n data-testid=\"icon-btn-help\">\n <HelpOutlineOutlinedIcon sx={TopBarStyles.sxActionIconGlyph} />\n </IconButton>\n </Tooltip>\n </Box>\n\n <TopBarDivider />\n\n {brandLogo}\n\n <SiteSelectorMenu\n sites={sites}\n selectedPublicationId={selectedPublicationId}\n getPublicationHref={getPublicationHref}\n resolvePublicationImageUrl={resolvePublicationImageUrl}\n />\n\n <TopBarDivider />\n\n <TopBarClock\n gmtRedaction={selectedPublication?.gmtRedaction}\n timeFormat={selectedPublication?.timeFormat}\n />\n\n <TopBarDivider />\n\n <ProfileMenu\n profile={profile}\n avatarOptions={profileAvatarOptions}\n legacyBaseUrl={legacyBaseUrl}\n cmsBaseUrl={cmsBaseUrl}\n legacySession={legacySession}\n operationPermissions={operationPermissions}\n isAdmin={isAdmin}\n />\n </Box>\n </Toolbar>\n </AppBar>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nexport const AppShellStyles = {\n sxRoot: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n height: '100%',\n minHeight: 0,\n overflow: 'hidden',\n bgcolor: 'm3.surfaceContainer',\n } as SxProps<Theme>,\n\n sxHeader: {\n flexShrink: 0,\n } as SxProps<Theme>,\n\n sxBody: {\n display: 'flex',\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n } as SxProps<Theme>,\n\n sxMain: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n minWidth: 0,\n minHeight: 0,\n overflowY: 'auto',\n overflowX: 'hidden',\n mt: '10px',\n pt: 1,\n // Sin margen inferior: el contenido (tabla/footer) llega al borde de abajo,\n // como pidió el diseño. Antes había 24px (pb:3) que dejaban un hueco visible.\n pb: 0,\n pr: 3,\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport Box from '@mui/material/Box';\nimport type { ReactNode } from 'react';\nimport { CmsI18nProvider } from '../../i18n';\nimport type { AppLocaleCatalog, CmsMessagesOverride, Locale } from '../../i18n';\nimport type { NavItemPermissions } from '../../types/navigation';\nimport type { DashboardNotificationsResponse } from '../../services/dashboard';\nimport type { ProfileGetResponse } from '../../types/profile';\nimport type { Publication } from '../../types/publication';\nimport type { SiteSection } from '../../types/site';\nimport type { ProfileAvatarOptions } from '../../utils/profile-avatar';\nimport type { LegacyAdminSession } from '../../utils/legacy-admin';\nimport type { CmsLinkComponent } from '../link';\nimport { DefaultCmsLink } from '../link';\nimport { SidebarRail, type SidebarRailPinService } from '../sidebar/SidebarRail';\nimport { TopBar } from '../top-bar/TopBar';\nimport type { PreviewFormat } from '../top-bar/previewMenu.config';\nimport { AppShellStyles } from './AppShell.styles';\n\nexport type AppShellProps = {\n pathname: string;\n sites: SiteSection[];\n children: ReactNode;\n notificationUnreadCount: number;\n /** Respuesta cruda de `POST /dashboard/notification` (newsTask/expireTask/videos). */\n notificationsData?: DashboardNotificationsResponse | null;\n /** Destino del \"Ver más\" / clic en una oportunidad copilot (página de sugerencias). */\n copilotSuggestionsHref?: string;\n /** Clic en \"Ver más\" cuando no hay `copilotSuggestionsHref` (fallback). */\n onEditorialSeeMore?: () => void;\n /** \"Recordar luego\": recibe los `opportunity_id` mostrados para el snooze. */\n onEditorialRemindLater?: (opportunityIds: string[]) => void;\n profile: ProfileGetResponse;\n primaryLogo: ReactNode;\n brandLogo?: ReactNode;\n selectedPublicationId: string;\n getPublicationHref: (publication: Publication) => string;\n resolvePublicationImageUrl?: (imagePath: string) => string;\n profileAvatarOptions?: ProfileAvatarOptions;\n /** Dominio del CMS Angular legacy (deploy nuevo) para enlaces de perfil. */\n legacyBaseUrl?: string;\n /**\n * Origen del CMS (JSP) para Ayuda/Preview. Si se omite, se usa `baseUrl`.\n */\n cmsBaseUrl?: string;\n /** Sesión para el redirect al admin viejo (token, sitio, publicación, usuario). */\n legacySession?: LegacyAdminSession;\n /** Formatos del menú de previsualización. Por defecto, Desktop/Mobile/Tablet. */\n previewFormats?: PreviewFormat[];\n /** Operaciones concedidas al usuario (`POST /auth/permissions`). */\n operationPermissions?: string[];\n /** Si el usuario es administrador (ve todos los ítems restringidos por permiso). */\n isAdmin?: boolean;\n /** Integración: clic en un formato de previsualización (recibe su `id`). */\n onPreviewSelect?: (formatId: string) => void;\n LinkComponent?: CmsLinkComponent;\n permissions: Array<NavItemPermissions>;\n locale?: Locale | string;\n /** Alias de `locale`. */\n language?: Locale | string;\n messages?: CmsMessagesOverride;\n /** Catálogo de mensajes propio del gestor (namespaces libres, es/en/pt). */\n appMessages?: AppLocaleCatalog;\n\n baseUrl: string;\n /**\n * Servicio de pines del sidebar (`CmsProfileServices`, construido por el\n * host con su `axiosApi`/`authentication`). Si se omite, el anclado de\n * accesos es solo visual y no persiste entre sesiones.\n */\n profileServices?: SidebarRailPinService;\n};\n\nexport function AppShell({\n pathname,\n sites,\n children,\n notificationUnreadCount,\n notificationsData,\n copilotSuggestionsHref,\n onEditorialSeeMore,\n onEditorialRemindLater,\n profile,\n primaryLogo,\n brandLogo,\n selectedPublicationId,\n getPublicationHref,\n resolvePublicationImageUrl,\n profileAvatarOptions,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n previewFormats,\n operationPermissions,\n isAdmin,\n onPreviewSelect,\n LinkComponent = DefaultCmsLink,\n permissions,\n locale,\n language,\n messages,\n appMessages,\n baseUrl,\n profileServices,\n}: AppShellProps) {\n return (\n <CmsI18nProvider\n locale={locale}\n language={language}\n messages={messages}\n appMessages={appMessages}>\n <Box sx={AppShellStyles.sxRoot}>\n <Box component=\"header\" sx={AppShellStyles.sxHeader}>\n <TopBar\n sites={sites}\n notificationUnreadCount={notificationUnreadCount}\n notificationsData={notificationsData}\n copilotSuggestionsHref={copilotSuggestionsHref}\n onEditorialSeeMore={onEditorialSeeMore}\n onEditorialRemindLater={onEditorialRemindLater}\n profile={profile}\n primaryLogo={primaryLogo}\n brandLogo={brandLogo}\n selectedPublicationId={selectedPublicationId}\n getPublicationHref={getPublicationHref}\n resolvePublicationImageUrl={resolvePublicationImageUrl}\n profileAvatarOptions={profileAvatarOptions}\n legacyBaseUrl={legacyBaseUrl}\n cmsBaseUrl={cmsBaseUrl ?? baseUrl}\n legacySession={legacySession}\n previewFormats={previewFormats}\n operationPermissions={operationPermissions}\n isAdmin={isAdmin}\n onPreviewSelect={onPreviewSelect}\n />\n </Box>\n <Box sx={AppShellStyles.sxBody}>\n <SidebarRail\n pathname={pathname}\n LinkComponent={LinkComponent}\n permissions={permissions}\n legacyBaseUrl={legacyBaseUrl}\n cmsBaseUrl={cmsBaseUrl ?? baseUrl}\n legacySession={legacySession}\n selectedPublicationId={selectedPublicationId}\n profileServices={profileServices}\n />\n <Box component=\"main\" sx={AppShellStyles.sxMain}>\n {children}\n </Box>\n </Box>\n </Box>\n </CmsI18nProvider>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, radii, shadows } from '../../theme/variables';\n\nconst ACTIVE_BG = cmsColors.secondary;\nconst HOVER_BG = cmsColors.surfaceHover;\nconst NAV_TEXT = cmsColors.textNav;\n\nexport const SIDEBAR_WIDTH_EXPANDED = 195;\nexport const SIDEBAR_WIDTH_COLLAPSED = 96;\n\nconst ICON_SIZE_EXPANDED = 24;\nconst ICON_SIZE_COLLAPSED = 24;\n\nconst scrollbarHidden = {\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n} as const;\n\nexport const SidebarStyles = {\n sxRoot: (open: boolean): SxProps<Theme> => {\n const width = open ? SIDEBAR_WIDTH_EXPANDED : SIDEBAR_WIDTH_COLLAPSED;\n return {\n width,\n maxWidth: width,\n minWidth: width,\n flexShrink: 0,\n alignSelf: 'stretch',\n minHeight: 0,\n maxHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n bgcolor: 'm3.surfaceContainer',\n paddingTop: open ? '1rem' : '1.5rem',\n boxSizing: 'border-box',\n transition: 'width 0.2s ease, min-width 0.2s ease, max-width 0.2s ease',\n };\n },\n\n sxNavScroll: {\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n overflowX: 'hidden',\n width: '100%',\n boxSizing: 'border-box',\n ...scrollbarHidden,\n } as SxProps<Theme>,\n\n sxNav: (open: boolean): SxProps<Theme> => ({\n display: 'flex',\n flexDirection: 'column',\n py: 1.5,\n gap: open ? 0.25 : 0.5,\n width: '100%',\n maxWidth: '100%',\n minWidth: 0,\n boxSizing: 'border-box',\n position: 'relative',\n px: open ? '1rem' : 0.75,\n alignItems: open ? 'stretch' : 'start',\n }),\n\n sxNavGroup: (open: boolean): SxProps<Theme> => ({\n position: 'relative',\n minWidth: 0,\n maxWidth: open ? '100%' : 'none',\n overflow: 'visible',\n width: open ? '100%' : 'auto',\n gap: 0,\n }),\n\n /** Wrapper del Tooltip: ancho completo expandido, auto en rail colapsado */\n sxTooltipWrap: (open: boolean): SxProps<Theme> => ({\n display: 'flex',\n width: open ? '100%' : 'auto',\n alignItems: 'flex-start',\n }),\n\n sxDivider: {\n my: 1,\n borderColor: cmsColors.border,\n } as SxProps<Theme>,\n\n sxItem: (\n selected: boolean,\n nested = false,\n hasChildren = false,\n collapsed = false,\n ): SxProps<Theme> => {\n if (collapsed) {\n return {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 48,\n minWidth: 0,\n width: 'auto',\n maxWidth: 'none',\n boxSizing: 'border-box',\n overflow: 'hidden',\n px: 0,\n py: 0,\n borderRadius: '100px',\n color: NAV_TEXT,\n textDecoration: 'none',\n bgcolor: selected ? ACTIVE_BG : 'transparent',\n '&:hover': {\n bgcolor: selected ? ACTIVE_BG : 'action.hover',\n },\n };\n }\n\n return {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n gap: '15px', // separación ícono → texto\n minHeight: 40,\n minWidth: 0,\n maxWidth: 'none',\n // Para que el hover/active se vea igual al diseño: el fondo llega al borde izquierdo\n width: 'calc(100% + 1rem)',\n boxSizing: 'border-box',\n overflow: hasChildren ? 'visible' : 'hidden',\n px: nested ? 1.5 : 0,\n pl: nested ? 4.5 : 3,\n py: 0.75,\n ml: '-1rem',\n mr: 0,\n // Sub-items: píldora completa; top-level: píldora pegada a la izquierda\n borderRadius: nested ? '100px' : '0 100px 100px 0',\n color: NAV_TEXT,\n textDecoration: 'none',\n bgcolor: selected ? ACTIVE_BG : 'transparent',\n '&:hover': {\n bgcolor: selected ? ACTIVE_BG : HOVER_BG,\n },\n };\n },\n\n sxItemIcon: (selected: boolean, collapsed = false): SxProps<Theme> => ({\n fontSize: collapsed ? ICON_SIZE_COLLAPSED : ICON_SIZE_EXPANDED,\n color: selected ? 'secondary.dark' : 'm3.onSurfaceVariant',\n width: collapsed ? 48 : 'auto',\n flexShrink: 0,\n }),\n\n sxItemLabel: (selected: boolean): SxProps<Theme> => ({\n flex: 1,\n minWidth: 0,\n fontSize: 14,\n fontWeight: selected ? 600 : 400,\n lineHeight: 1.43,\n color: NAV_TEXT,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n\n sxExpandButton: {\n pl: '1.5rem',\n position: 'absolute',\n left: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n p: 0.25,\n color: 'm3.onSurfaceVariant',\n zIndex: 1,\n } as SxProps<Theme>,\n\n sxChildrenMenuPaper: {\n mt: 0.5,\n borderRadius: radii.flyout,\n // Borde sutil (`outlineVariant`, #C4C6CF en claro) para que el flyout no se\n // pierda contra el fondo del shell, que comparte el mismo gris.\n border: '1px solid',\n borderColor: 'divider',\n bgcolor: cmsColors.menuSurface,\n boxShadow: shadows.flyout,\n // Menú M3: sin padding lateral (ítems de borde a borde) y 8px arriba/abajo.\n py: '8px',\n px: 0,\n overflow: 'hidden',\n } as SxProps<Theme>,\n\n sxChildrenMenuItem: (selected: boolean): SxProps<Theme> => ({\n minHeight: 44,\n // Full-bleed (sin radio): el hover llega de borde a borde (M3 por defecto).\n borderRadius: 0,\n px: 2,\n py: 1,\n gap: 1.25,\n color: NAV_TEXT,\n bgcolor: selected ? ACTIVE_BG : 'transparent',\n // Hover: state layer M3 `onSurface` al 8% (#191C20).\n '&:hover': {\n bgcolor: selected ? ACTIVE_BG : cmsColors.neutralHover,\n },\n '&.Mui-selected': {\n bgcolor: ACTIVE_BG,\n '&:hover': { bgcolor: ACTIVE_BG },\n },\n }),\n\n sxChildrenMenuListItemIcon: {\n minWidth: 34,\n color: 'm3.onSurfaceVariant',\n '& .MuiSvgIcon-root': {\n fontSize: 22,\n },\n } as SxProps<Theme>,\n\n sxBetaChip: (open = false): SxProps<Theme> => ({\n height: 15,\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: '0.04em',\n bgcolor: 'primary.main',\n color: 'primary.contrastText',\n borderRadius: '.625rem',\n px: 0.75,\n mr: open ? 1 : 0,\n lineHeight: 1,\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }),\n};\n","'use client';\n\nimport { useMemo, useState, type ReactElement } from 'react';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport Box from '@mui/material/Box';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { useCmsTranslation } from '../../i18n';\nimport type { CmsTranslator } from '../../i18n';\nimport { cmsColors } from '../../theme/variables';\nimport type { NavItemPermissions, NavLinkItem } from '../../types/navigation';\nimport { toTestId } from '../../utils/toTestId';\nimport { DefaultCmsLink, type CmsLinkComponent } from '../link';\nimport { SidebarStyles } from './Sidebar.styles';\nimport { ACCOUNT_NAV_BLOCKS } from './nav-blocks';\nimport {\n findModulePermission,\n getVisibleChildren,\n isItemActive,\n isPathActive,\n resolveNavHref,\n resolveNavLabel,\n} from './nav-helpers';\n\nfunction wrapWithTooltip(open: boolean, label: string, node: ReactElement) {\n if (open) return node;\n return (\n <Tooltip title={label} placement=\"right\" arrow>\n <Box component=\"span\" sx={SidebarStyles.sxTooltipWrap(open)}>\n {node}\n </Box>\n </Tooltip>\n );\n}\n\nfunction NavRow({\n item,\n blockIndex,\n nested = false,\n open = true,\n expanded,\n onToggleExpand,\n LinkComponent,\n pathname,\n permissions,\n t,\n legacyBaseUrl,\n selectedPublicationId,\n}: {\n item: NavLinkItem;\n blockIndex: number;\n nested?: boolean;\n open?: boolean;\n expanded?: boolean;\n onToggleExpand?: () => void;\n LinkComponent: CmsLinkComponent;\n pathname: string;\n permissions: Array<NavItemPermissions>;\n t: CmsTranslator;\n legacyBaseUrl?: string;\n selectedPublicationId: string;\n}) {\n // Los testids de navegación se escopan por el índice del bloque padre: `module`\n // no es único (POSTS y PAYMENTS se repiten en nav-blocks.ts) y no hay id de\n // bloque estable, así que sin el escopo habría testids duplicados en pantalla.\n const blockScope = `block-${blockIndex}`;\n const label = resolveNavLabel(item, t);\n const permission = findModulePermission(permissions, item.module);\n const visibleChildren = getVisibleChildren(item, permissions);\n const collapsed = !open;\n const selected = isPathActive(pathname, item.href);\n const parentSelected = isItemActive(pathname, item);\n const hasChildren = visibleChildren.length > 0;\n const Icon = item.icon;\n const iconSelected = nested ? selected : selected || parentSelected;\n const [childMenuAnchor, setChildMenuAnchor] = useState<HTMLElement | null>(null);\n const childMenuOpen = Boolean(childMenuAnchor);\n if (!permission && !hasChildren) return null;\n const content = (\n <>\n {hasChildren && !collapsed ? (\n <IconButton\n size=\"small\"\n data-testid={`toggle-nav-${blockScope}-${toTestId(item.module)}`}\n data-action={expanded ? 'collapse' : 'expand'}\n aria-label={expanded ? t.sidebar('collapse') : t.sidebar('expand')}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onToggleExpand?.();\n }}\n sx={SidebarStyles.sxExpandButton}>\n {expanded ? (\n <ExpandMoreIcon sx={{ fontSize: 20 }} />\n ) : (\n <ChevronRightIcon sx={{ fontSize: 20 }} />\n )}\n </IconButton>\n ) : null}\n <Icon sx={SidebarStyles.sxItemIcon(iconSelected, collapsed)} />\n {!collapsed ? (\n <Typography component=\"span\" sx={SidebarStyles.sxItemLabel(selected)}>\n {label}\n </Typography>\n ) : null}\n {permission?.isnew && (\n <Box component=\"span\" sx={SidebarStyles.sxBetaChip(open)}>\n {t.sidebar('newBadge')}\n </Box>\n )}\n </>\n );\n\n if (hasChildren && !collapsed) {\n return (\n <Box sx={SidebarStyles.sxNavGroup(open)}>\n <Box\n component=\"div\"\n data-testid={`nav-${blockScope}-${toTestId(item.module)}`}\n onClick={onToggleExpand}\n sx={{\n ...SidebarStyles.sxItem(parentSelected, nested, true, false),\n cursor: 'pointer',\n }}>\n {content}\n </Box>\n <Collapse in={expanded} timeout=\"auto\" unmountOnExit>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 0.25,\n mt: 0.25,\n minWidth: 0,\n maxWidth: '100%',\n overflow: 'hidden',\n }}>\n {visibleChildren.map((child) => (\n <NavRow\n key={child.href}\n item={child}\n blockIndex={blockIndex}\n nested\n open={open}\n LinkComponent={LinkComponent}\n pathname={pathname}\n permissions={permissions}\n t={t}\n legacyBaseUrl={legacyBaseUrl}\n selectedPublicationId={selectedPublicationId}\n />\n ))}\n </Box>\n </Collapse>\n </Box>\n );\n }\n\n // Sidebar colapsado + item con hijos: mostrar menú flotante (como en la imagen)\n if (hasChildren && collapsed) {\n const row = (\n <Box\n component=\"button\"\n type=\"button\"\n data-testid={`dropdown-toggle-nav-${blockScope}-${toTestId(item.module)}`}\n aria-label={label}\n aria-controls={childMenuOpen ? `sidebar-children-${item.href}` : undefined}\n aria-haspopup=\"true\"\n aria-expanded={childMenuOpen ? 'true' : undefined}\n onClick={(e) => setChildMenuAnchor(e.currentTarget)}\n onMouseEnter={(e) => setChildMenuAnchor(e.currentTarget)}\n sx={{\n ...SidebarStyles.sxItem(parentSelected, nested, hasChildren, true),\n border: 0,\n background: 'transparent',\n cursor: 'pointer',\n }}>\n {content}\n </Box>\n );\n\n // En colapsado + hijos: solo menú flotante (sin tooltip)\n return (\n <>\n {row}\n <Menu\n id={`sidebar-children-${item.href}`}\n anchorEl={childMenuAnchor}\n open={childMenuOpen}\n onClose={() => setChildMenuAnchor(null)}\n anchorOrigin={{ vertical: 'center', horizontal: 'right' }}\n transformOrigin={{ vertical: 'center', horizontal: 'left' }}\n slotProps={{\n paper: { sx: SidebarStyles.sxChildrenMenuPaper },\n list: {\n onMouseLeave: () => setChildMenuAnchor(null),\n sx: { py: 1 },\n },\n }}>\n {visibleChildren.map((child) => {\n const ChildIcon = child.icon;\n return (\n <MenuItem\n key={child.href}\n data-testid={`dropdown-item-nav-${toTestId(child.module)}`}\n component={LinkComponent}\n href={resolveNavHref(child, legacyBaseUrl, selectedPublicationId)}\n onClick={() => setChildMenuAnchor(null)}\n sx={SidebarStyles.sxChildrenMenuItem(isPathActive(pathname, child.href))}>\n <ListItemIcon sx={SidebarStyles.sxChildrenMenuListItemIcon}>\n <ChildIcon />\n </ListItemIcon>\n <ListItemText\n primary={resolveNavLabel(child, t)}\n slotProps={{\n primary: {\n sx: {\n fontSize: 14,\n fontWeight: 400,\n color: cmsColors.textStrong,\n },\n },\n }}\n />\n </MenuItem>\n );\n })}\n </Menu>\n </>\n );\n }\n\n const row = (\n <Box\n component={LinkComponent}\n href={resolveNavHref(item, legacyBaseUrl, selectedPublicationId)}\n data-testid={`nav-${blockScope}-${toTestId(item.module)}`}\n sx={SidebarStyles.sxItem(\n collapsed ? parentSelected : selected,\n nested,\n hasChildren,\n collapsed,\n )}>\n {content}\n </Box>\n );\n\n return wrapWithTooltip(open, label, row);\n}\n\nfunction NavSection({\n items,\n open = true,\n LinkComponent,\n pathname,\n permissions,\n t,\n legacyBaseUrl,\n selectedPublicationId,\n}: {\n items: NavLinkItem[];\n open: boolean;\n LinkComponent: CmsLinkComponent;\n pathname: string;\n permissions: Array<NavItemPermissions>;\n t: CmsTranslator;\n legacyBaseUrl?: string;\n selectedPublicationId: string;\n}) {\n\n const initialOpen = useMemo(() => {\n const state: Record<string, boolean> = {};\n for (const item of items) {\n if (item.children) {\n state[item.href] =\n item.defaultOpen ?? item.children.some((c) => isPathActive(pathname, c.href));\n }\n }\n return state;\n }, [items, pathname]);\n\n const [openGroups, setOpenGroups] = useState(initialOpen);\n\n const toggleGroup = (href: string) => {\n setOpenGroups((prev) => ({ ...prev, [href]: !prev[href] }));\n };\n\n return (\n <>\n {items.map((item, blockIndex) => (\n <NavRow\n key={item.href}\n item={item}\n blockIndex={blockIndex}\n open={open}\n permissions={permissions}\n expanded={openGroups[item.href]}\n onToggleExpand={\n getVisibleChildren(item, permissions).length > 0\n ? () => toggleGroup(item.href)\n : undefined\n }\n LinkComponent={LinkComponent}\n pathname={pathname}\n t={t}\n legacyBaseUrl={legacyBaseUrl}\n selectedPublicationId={selectedPublicationId}\n />\n ))}\n </>\n );\n}\n\nexport type SidebarProps = {\n open?: boolean;\n pathname: string;\n LinkComponent?: CmsLinkComponent;\n permissions: Array<NavItemPermissions>;\n /** Dominio del admin legacy (JSP/Angular) para prefijar hrefs con `item.legacy`. */\n legacyBaseUrl?: string;\n selectedPublicationId: string;\n};\n\nexport function Sidebar({\n open = true,\n pathname,\n permissions,\n LinkComponent = DefaultCmsLink,\n legacyBaseUrl,\n selectedPublicationId,\n}: SidebarProps) {\n const { t } = useCmsTranslation();\n\n return (\n <Box component=\"aside\" sx={SidebarStyles.sxRoot(open)}>\n <Box sx={SidebarStyles.sxNavScroll}>\n <Box\n component=\"nav\"\n aria-label={t.sidebar('navAriaLabel')}\n sx={SidebarStyles.sxNav(open)}>\n <NavSection\n permissions={permissions}\n items={ACCOUNT_NAV_BLOCKS}\n open={open}\n LinkComponent={LinkComponent}\n pathname={pathname}\n t={t}\n legacyBaseUrl={legacyBaseUrl}\n selectedPublicationId={selectedPublicationId}\n />\n </Box>\n </Box>\n </Box>\n );\n}\n","import type { NewMenuMessageKey } from '../../i18n';\n\n/**\n * Ítem del menú \"Nuevo\" (botón \"+\"). Replica la estructura del header del CMS\n * Angular legacy (`newContent` de cmsmedios): cada ítem declara su clave i18n y\n * el/los permiso(s) de operación que habilitan su visibilidad.\n */\nexport type NewContentItem = {\n /** Identificador estable; lo recibe `onNewContentSelect` al hacer clic. */\n id: string;\n /** Clave i18n del namespace `newMenu`. */\n labelKey: NewMenuMessageKey;\n /**\n * Permiso(s) de operación requeridos (p. ej. `NEWS_CREATE`). Si es un array,\n * se exigen TODOS (criterio NAA-4038 del Angular legacy). Si se omite, el ítem\n * no requiere permiso.\n */\n permission?: string | string[];\n};\n\n/** Columna del menú \"Nuevo\" (Frecuentes / Otros / Videos). */\nexport type NewContentGroup = {\n /** Clave i18n del título de la columna (namespace `newMenu`). */\n titleKey: NewMenuMessageKey;\n items: NewContentItem[];\n};\n\n/**\n * Estructura por defecto del menú \"Nuevo\", equivalente al `newContent` del\n * header de cmsmedios (frecuentes / otros / videos) con sus permisos. El gestor\n * puede sobreescribirla por props si su producto difiere.\n */\nexport const DEFAULT_NEW_CONTENT_GROUPS: NewContentGroup[] = [\n {\n titleKey: 'frequentsTitle',\n items: [\n { id: 'trivias', labelKey: 'trivia', permission: 'TRIVIAS_CREATE' },\n { id: 'polls', labelKey: 'poll', permission: 'POLLS_CREATE' },\n { id: 'listas', labelKey: 'listicle', permission: 'NEWS_CREATE' },\n ],\n },\n {\n titleKey: 'othersTitle',\n items: [\n { id: 'tag', labelKey: 'tag', permission: 'TAGS_CREATE' },\n { id: 'gamecast', labelKey: 'gamecast', permission: 'NEWS_CREATE' },\n { id: 'liveblog', labelKey: 'liveblog', permission: 'NEWS_CREATE' },\n { id: 'aiPost', labelKey: 'aiPost', permission: 'IA_NEWS_CREATE' },\n { id: 'aiListicle', labelKey: 'aiListicle', permission: 'IA_NEWS_CREATE' },\n ],\n },\n {\n titleKey: 'videosTitle',\n items: [\n {\n id: 'videoNative',\n labelKey: 'videoNative',\n permission: ['VIDEOS_UPLOAD', 'VIDEOS_NATIVE'],\n },\n { id: 'videoEmbedded', labelKey: 'videoEmbedded', permission: 'VIDEOS_UPLOAD' },\n { id: 'videoYoutube', labelKey: 'videoYoutube', permission: 'VIDEOS_UPLOAD' },\n ],\n },\n];\n\n/**\n * Decide si un ítem es visible según los permisos de operación del usuario.\n *\n * - Si `operationPermissions` es `undefined`, no hay gating (se muestra todo);\n * útil para maquetado/mock antes de cablear `/auth/permissions`.\n * - Si el usuario es admin, ve todo.\n * - Si el ítem no declara permiso, se muestra.\n * - Con un array de permisos, se exigen todos.\n *\n * @param item - Ítem a evaluar.\n * @param operationPermissions - Nombres de operaciones concedidas al usuario.\n * @param isAdmin - Si el usuario es administrador.\n * @returns `true` si el ítem debe mostrarse.\n */\nexport function isNewContentItemVisible(\n item: NewContentItem,\n operationPermissions: string[] | undefined,\n isAdmin: boolean | undefined,\n): boolean {\n if (operationPermissions === undefined) return true;\n if (isAdmin) return true;\n if (!item.permission) return true;\n const required = Array.isArray(item.permission)\n ? item.permission\n : [item.permission];\n return required.every((name) => operationPermissions.includes(name));\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, shadows } from '../../theme/variables';\n\nexport const NewContentMenuStyles = {\n sxMenuPaper: {\n mt: 1,\n borderRadius: 2,\n bgcolor: cmsColors.menuSurface,\n py: 2,\n px: 1,\n boxShadow: shadows.menu,\n } as SxProps<Theme>,\n\n sxContainer: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: 4,\n px: 2,\n } as SxProps<Theme>,\n\n sxColumn: {\n display: 'flex',\n flexDirection: 'column',\n minWidth: 132,\n } as SxProps<Theme>,\n\n // Mismo estilo que el título del flyout del menú lateral colapsado\n // (`SidebarRailStyles.sxChildrenMenuTitle`): mayúsculas, Google Sans, 12px.\n sxColumnTitle: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 12,\n fontWeight: 600,\n lineHeight: 1.4,\n letterSpacing: '0.4px',\n textTransform: 'uppercase',\n color: 'm3.onSurfaceVariant',\n mb: 1,\n } as SxProps<Theme>,\n\n sxItem: {\n fontSize: 14,\n color: cmsColors.textStrong,\n py: 1,\n px: 1,\n borderRadius: '10px',\n cursor: 'pointer',\n textDecoration: 'none',\n display: 'block',\n // Hover: state layer M3 `onSurface` al 8% (#191C20), común a los desplegables.\n '&:hover': {\n bgcolor: cmsColors.neutralHover,\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport AddOutlinedIcon from '@mui/icons-material/AddOutlined';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Menu from '@mui/material/Menu';\nimport Typography from '@mui/material/Typography';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useMemo, useState } from 'react';\nimport type { MouseEvent } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport {\n DEFAULT_NEW_CONTENT_GROUPS,\n isNewContentItemVisible,\n type NewContentGroup,\n type NewContentItem,\n} from './newContentMenu.config';\nimport { NewContentMenuStyles } from './NewContentMenu.styles';\nimport { TopBarStyles } from './TopBar.styles';\n\nexport type NewContentMenuProps = {\n /** Columnas e ítems del menú. Por defecto, la estructura del CMS legacy. */\n groups?: NewContentGroup[];\n /**\n * Nombres de operaciones concedidas al usuario (de `POST /auth/permissions`).\n * Si se omite, no hay filtrado por permisos (se muestran todos los ítems).\n */\n operationPermissions?: string[];\n /** Si el usuario es administrador (ve todos los ítems). */\n isAdmin?: boolean;\n /**\n * Dominio del deploy nuevo (master) al que se redirige, p. ej.\n * `https://master.d1c5iid93veq15.amplifyapp.com`. Se navega a\n * `<legacyBaseUrl><getRedirectPath(id)>` en una pestaña nueva.\n */\n legacyBaseUrl?: string;\n /**\n * Ruta/parámetro por ítem que se concatena a `legacyBaseUrl`. Por defecto\n * `/?new=<id>`: el deploy destino lee `new` y dispara la creación.\n */\n getRedirectPath?: (itemId: string) => string;\n /**\n * Fallback cuando no hay `legacyBaseUrl`: se invoca con el `id` del ítem\n * (punto de integración para maquetado).\n */\n onSelect?: (itemId: string) => void;\n};\n\n/** Ruta destino por defecto: el deploy leerá `?new=<id>` y disparará la acción. */\nfunction defaultNewRedirectPath(itemId: string): string {\n return `/?new=${encodeURIComponent(itemId)}`;\n}\n\n/** Une dominio + ruta sin barra doble. */\nfunction joinUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n}\n\n/**\n * Menú desplegable del botón \"Nuevo\" (+) del header. Replica las tres columnas\n * del header de cmsmedios (Frecuentes / Otros / Videos) con visibilidad por\n * permisos. El comportamiento de cada ítem lo resuelve el gestor.\n */\nexport function NewContentMenu({\n groups = DEFAULT_NEW_CONTENT_GROUPS,\n operationPermissions,\n isAdmin,\n legacyBaseUrl,\n getRedirectPath = defaultNewRedirectPath,\n onSelect,\n}: NewContentMenuProps) {\n const { t } = useCmsTranslation();\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const handleClose = () => setAnchorEl(null);\n\n /** Filtra ítems por permiso y descarta columnas que quedan vacías. */\n const visibleGroups = useMemo(\n () =>\n groups\n .map((group) => ({\n ...group,\n items: group.items.filter((item) =>\n isNewContentItemVisible(item, operationPermissions, isAdmin),\n ),\n }))\n .filter((group) => group.items.length > 0),\n [groups, operationPermissions, isAdmin],\n );\n\n /**\n * Ejecuta la acción del ítem: navega al deploy master con el parámetro\n * (`<legacyBaseUrl>/?new=<id>`) en pestaña nueva; sin `legacyBaseUrl`, delega\n * en `onSelect`. Cierra el menú.\n * @param item - Ítem clickeado.\n * @returns void\n */\n const handleItemClick = (item: NewContentItem) => {\n if (legacyBaseUrl && typeof window !== 'undefined') {\n window.open(\n joinUrl(legacyBaseUrl, getRedirectPath(item.id)),\n '_blank',\n 'noopener',\n );\n } else {\n onSelect?.(item.id);\n }\n handleClose();\n };\n\n const title = t.topBar('new');\n\n return (\n <>\n <Tooltip title={title}>\n <IconButton\n aria-label={title}\n aria-haspopup=\"true\"\n aria-expanded={open}\n onClick={(event: MouseEvent<HTMLElement>) =>\n setAnchorEl(event.currentTarget)\n }\n data-testid=\"dropdown-toggle-new-content\"\n sx={TopBarStyles.sxActionIcon}>\n <AddOutlinedIcon sx={TopBarStyles.sxActionIconGlyph} />\n </IconButton>\n </Tooltip>\n\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{\n paper: { sx: NewContentMenuStyles.sxMenuPaper },\n list: {\n sx: { p: 0 },\n ...({ 'data-testid': 'dropdown-menu-new-content' } as object),\n },\n }}>\n <Box sx={NewContentMenuStyles.sxContainer}>\n {visibleGroups.map((group) => (\n <Box key={group.titleKey} sx={NewContentMenuStyles.sxColumn}>\n <Typography\n component=\"span\"\n sx={NewContentMenuStyles.sxColumnTitle}>\n {t.newMenu(group.titleKey)}\n </Typography>\n {group.items.map((item) => (\n <Box\n key={item.id}\n component=\"span\"\n role=\"menuitem\"\n tabIndex={0}\n onClick={() => handleItemClick(item)}\n data-testid={`dropdown-item-new-${item.id}`}\n sx={NewContentMenuStyles.sxItem}>\n {t.newMenu(item.labelKey)}\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n </Menu>\n </>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors } from '../../theme/variables';\n\n/**\n * Estilos de la página de error compartida (404 / sin permisos).\n * Replica el layout de cmsmedios: ilustración + bloque de texto.\n * Solo variables del theme: nada de colores quemados.\n */\nexport const CmsErrorPageStyles = {\n // Cubre toda la ventana (por encima del shell), como en cmsmedios.\n // Ilustración e info en fila (columna en móvil).\n sxRoot: {\n position: 'fixed',\n inset: 0,\n zIndex: 1300,\n overflow: 'auto',\n display: 'flex',\n flexDirection: { xs: 'column', md: 'row' },\n alignItems: 'center',\n justifyContent: 'center',\n gap: { xs: 4, md: 8 },\n px: { xs: 3, md: 6 },\n py: { xs: 6, md: 8 },\n bgcolor: cmsColors.avatarBg,\n } as SxProps<Theme>,\n\n // Ilustración de marca (PNG servido desde el `public/` del gestor).\n sxIllustration: {\n width: { xs: 220, sm: 300, md: 420 },\n maxWidth: '100%',\n height: 'auto',\n flexShrink: 0,\n } as SxProps<Theme>,\n\n // Bloque de texto: alineado a la izquierda en desktop, centrado en móvil.\n sxContent: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: { xs: 'center', md: 'flex-start' },\n textAlign: { xs: 'center', md: 'left' },\n maxWidth: 520,\n } as SxProps<Theme>,\n\n // Título grande (respeta saltos de línea `\\n` de la traducción).\n sxTitle: {\n fontSize: { xs: 32, md: 46 },\n fontWeight: 700,\n lineHeight: 1.1,\n color: cmsColors.textStrong,\n whiteSpace: 'pre-line',\n } as SxProps<Theme>,\n\n // Subtítulo.\n sxSubtitle: {\n mt: 2,\n fontSize: { xs: 16, md: 18 },\n color: cmsColors.textNav,\n } as SxProps<Theme>,\n\n // Botón HOME (sobre el pill de la lib: separación y mayúsculas).\n sxButton: {\n mt: 3,\n textTransform: 'uppercase',\n px: 4,\n } as SxProps<Theme>,\n\n // Línea \"Error 404. Copiar detalle.\" (solo en 404).\n sxErrorLine: {\n mt: 3,\n fontSize: 14,\n color: cmsColors.textMuted,\n } as SxProps<Theme>,\n\n // Enlace \"Copiar detalle.\" clicable.\n sxCopyLink: {\n ml: 0.5,\n color: cmsColors.link,\n fontWeight: 500,\n cursor: 'pointer',\n userSelect: 'none',\n '&:hover': { textDecoration: 'underline' },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport type { ElementType } from 'react';\nimport { useState } from 'react';\n\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\n\nimport { useCmsTranslation } from '../../i18n';\nimport { sxPillButton } from '../../theme/buttonStyles';\nimport { DefaultCmsLink, type CmsLinkComponent } from '../link';\nimport { CmsErrorPageStyles } from './CmsErrorPage.styles';\n\n/** Variante de error a mostrar: 404 (no encontrado) o sin permisos. */\nexport type CmsErrorPageVariant = 'not-found' | 'not-allowed';\n\nexport type CmsErrorPageProps = {\n /** Tipo de error a mostrar. */\n variant: CmsErrorPageVariant;\n /** Destino del botón HOME. Por defecto la raíz del gestor (`/`). */\n homeHref?: string;\n /** Componente de enlace del host (p. ej. `next/link`). Por defecto un `<a>`. */\n LinkComponent?: CmsLinkComponent;\n /**\n * Ruta de la ilustración (servida desde el `public/` del gestor). Por defecto\n * `/errors/notfound.png` o `/errors/not-allowed.png` según la variante.\n */\n illustrationSrc?: string;\n};\n\n/**\n * Página de error compartida por todos los gestores (mecanismo en la lib).\n * Replica la de cmsmedios: ilustración + título + subtítulo + botón HOME, y en\n * el 404 la línea \"Error 404. Copiar detalle.\" que copia la URL al portapapeles.\n * Los textos salen del i18n de la lib (namespace `errorPage`, es/en/pt), así que\n * ningún gestor los duplica.\n */\nexport function CmsErrorPage({\n variant,\n homeHref = '/',\n LinkComponent = DefaultCmsLink,\n illustrationSrc,\n}: CmsErrorPageProps) {\n const { t } = useCmsTranslation();\n const [copied, setCopied] = useState(false);\n const isNotAllowed = variant === 'not-allowed';\n\n const title = t.errorPage(isNotAllowed ? 'notAllowedTitle' : 'notFoundTitle');\n const subtitle = t.errorPage(\n isNotAllowed ? 'notAllowedSubtitle' : 'notFoundSubtitle',\n );\n const imageSrc =\n illustrationSrc ??\n (isNotAllowed ? '/errors/not-allowed.png' : '/errors/notfound.png');\n\n // Copia al portapapeles el detalle del error (la ruta a la que se intentó\n // acceder), replicando el \"Copiar detalle\" de cmsmedios.\n const handleCopy = async () => {\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const detail = t.errorPage('copyDetailText').replace('{url}', url);\n try {\n await navigator.clipboard.writeText(detail);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 2500);\n } catch {\n // Si el navegador bloquea el portapapeles, no hacemos nada.\n }\n };\n\n return (\n <Box\n data-testid=\"panel-error\"\n data-variant={variant}\n sx={CmsErrorPageStyles.sxRoot}>\n <Box\n component=\"img\"\n src={imageSrc}\n alt=\"\"\n aria-hidden\n sx={CmsErrorPageStyles.sxIllustration}\n />\n <Box sx={CmsErrorPageStyles.sxContent}>\n <Typography component=\"h1\" sx={CmsErrorPageStyles.sxTitle}>\n {title}\n </Typography>\n <Typography component=\"p\" sx={CmsErrorPageStyles.sxSubtitle}>\n {subtitle}\n </Typography>\n <Button\n data-testid=\"btn-error-home\"\n component={LinkComponent as ElementType}\n href={homeHref}\n sx={{\n ...(sxPillButton('cta') as object),\n ...(CmsErrorPageStyles.sxButton as object),\n }}>\n {t.errorPage('homeButton')}\n </Button>\n {!isNotAllowed && (\n <Typography component=\"p\" sx={CmsErrorPageStyles.sxErrorLine}>\n {t.errorPage('errorLabel')} {t.errorPage('notFoundCode')}.\n <Box\n data-testid=\"btn-error-copy\"\n component=\"span\"\n role=\"button\"\n tabIndex={0}\n onClick={handleCopy}\n sx={CmsErrorPageStyles.sxCopyLink}>\n {copied ? t.errorPage('copied') : t.errorPage('copyDetail')}\n </Box>\n </Typography>\n )}\n </Box>\n </Box>\n );\n}\n","'use client';\n\nimport GlobalStyles from '@mui/material/GlobalStyles';\n\nimport { buildCmsColorSchemeVars } from '../../theme/variables';\n\nconst { light, dark } = buildCmsColorSchemeVars();\n\n/**\n * Inyecta las CSS variables `--cms-*` de la paleta mode-aware.\n *\n * - `:root` → valores claros (base; aplican siempre).\n * - `:root[data-mui-color-scheme=\"dark\"]` → valores oscuros (mayor\n * especificidad; ganan cuando MUI pone el atributo en <html>).\n *\n * Va montado dentro de los providers MUI, así todos los gestores y el showroom\n * obtienen el modo oscuro sin cambios adicionales.\n */\nexport function CmsColorSchemeVars() {\n return (\n <GlobalStyles\n styles={{\n ':root': light,\n ':root[data-mui-color-scheme=\"dark\"]': dark,\n }}\n />\n );\n}\n","'use client';\n\nimport GlobalStyles from '@mui/material/GlobalStyles';\n\nimport { cmsFontFaces } from '../../theme/fonts';\n\n/**\n * Inyecta los `@font-face` de Google Sans (fuente única del CMS) como estilos\n * globales. Va montado dentro de los providers MUI de la lib, así cada gestor que\n * los use tiene la fuente disponible sin configurar nada.\n */\nexport function CmsFontFaces() {\n return <GlobalStyles styles={cmsFontFaces} />;\n}\n","import {\n THEME_COLOR_SCHEME_ATTRIBUTE,\n THEME_ENABLED_STORAGE_KEY,\n THEME_MODE_STORAGE_KEY,\n} from '../../theme/themePreference';\n\n// Script inline que corre ANTES del primer pintado: lee la preferencia de\n// `localStorage` y aplica el modo efectivo al atributo de `<html>`. Sin esto el\n// primer render saldría en claro (defaultMode) y luego saltaría a oscuro →\n// parpadeo. Es JS plano (no React), así que funciona igual en cualquier gestor.\n//\n// Va montado dentro de los providers MUI (primer hijo), así todos los gestores\n// y el login lo obtienen sin cablear nada por app.\nconst INIT_SCRIPT = `(function(){try{var m=localStorage.getItem('${THEME_MODE_STORAGE_KEY}');var e=localStorage.getItem('${THEME_ENABLED_STORAGE_KEY}');var on=e===null?true:e==='true';var eff=on&&m==='dark'?'dark':'light';document.documentElement.setAttribute('${THEME_COLOR_SCHEME_ATTRIBUTE}',eff);}catch(_){}})();`;\n\n/** Anti-flash de tema: aplica el modo guardado antes de pintar. */\nexport function CmsThemeInitScript() {\n return (\n <script\n suppressHydrationWarning\n dangerouslySetInnerHTML={{ __html: INIT_SCRIPT }}\n />\n );\n}\n","'use client';\n\nimport { useColorScheme } from '@mui/material/styles';\nimport { useEffect } from 'react';\n\nimport { readEffectiveThemeMode } from '../../theme/themePreference';\n\n// Al montar (solo cliente), sincroniza el estado de color de MUI con la\n// preferencia guardada en `localStorage`. El atributo `<html>` ya lo aplica el\n// `CmsThemeInitScript` (anti-flash, vía CSS), pero MUI arranca su contexto React\n// en `defaultMode=\"light\"`; este sync alinea `theme.palette.mode` para los\n// componentes que lo leen en JS. Va dentro del ThemeProvider de la lib.\nexport function CmsThemeModeSync() {\n const { setMode } = useColorScheme();\n\n useEffect(() => {\n setMode(readEffectiveThemeMode());\n }, [setMode]);\n\n return null;\n}\n","'use client';\n\nimport CssBaseline from '@mui/material/CssBaseline';\nimport { ThemeProvider } from '@mui/material/styles';\nimport type { ReactNode } from 'react';\n\nimport { createAppTheme } from '../../theme/createAppTheme';\nimport { CmsColorSchemeVars } from './CmsColorSchemeVars';\nimport { CmsFontFaces } from './CmsFontFaces';\nimport { CmsThemeInitScript } from './CmsThemeInitScript';\nimport { CmsThemeModeSync } from './CmsThemeModeSync';\n\nconst theme = createAppTheme();\n\nexport type CmsMuiProviderProps = {\n children: ReactNode;\n};\n\n/** Provider MUI sin integración Next.js (playground Vite u otros frameworks). */\nexport function CmsMuiProvider({ children }: CmsMuiProviderProps) {\n return (\n <ThemeProvider theme={theme} defaultMode=\"light\" storageManager={null}>\n {/* Anti-flash + sincronización del modo con la preferencia guardada. */}\n <CmsThemeInitScript />\n <CmsThemeModeSync />\n <CssBaseline enableColorScheme />\n <CmsColorSchemeVars />\n <CmsFontFaces />\n {children}\n </ThemeProvider>\n );\n}\n","'use client';\n\nimport Box from '@mui/material/Box';\nimport CssBaseline from '@mui/material/CssBaseline';\nimport { ThemeProvider } from '@mui/material/styles';\nimport { AppRouterCacheProvider } from '@mui/material-nextjs/v16-appRouter';\nimport type { ReactNode } from 'react';\n\nimport { createAppTheme } from '../../theme/createAppTheme';\nimport { CmsColorSchemeVars } from './CmsColorSchemeVars';\nimport { CmsFontFaces } from './CmsFontFaces';\nimport { CmsThemeInitScript } from './CmsThemeInitScript';\nimport { CmsThemeModeSync } from './CmsThemeModeSync';\n\nconst theme = createAppTheme();\n\nexport type NextCmsMuiProviderProps = {\n children: ReactNode;\n};\n\nexport function NextCmsMuiProvider({ children }: NextCmsMuiProviderProps) {\n return (\n <AppRouterCacheProvider options={{ enableCssLayer: true }}>\n {/* Anti-flash: aplica el tema guardado antes de pintar. */}\n <CmsThemeInitScript />\n <ThemeProvider theme={theme} defaultMode=\"light\" storageManager={null}>\n {/* Alinea el modo de MUI con la preferencia persistida. */}\n <CmsThemeModeSync />\n <CssBaseline enableColorScheme />\n <CmsColorSchemeVars />\n <CmsFontFaces />\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n minHeight: '100dvh',\n }}>\n {children}\n </Box>\n </ThemeProvider>\n </AppRouterCacheProvider>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport {\n cmsButtonDivider,\n cmsButtonHoverBg,\n cmsButtonSurface,\n type CmsButtonVariant,\n} from '../../theme/buttonStyles';\nimport { cmsColors, fontFamilies, shadows, sizes } from '../../theme/variables';\n\nconst variantOf = (whiteBtn: boolean): CmsButtonVariant =>\n whiteBtn ? 'white' : 'cta';\n\nexport const BtnDropdownStyles = {\n sxGroup: {\n display: 'inline-flex',\n alignItems: 'stretch',\n // Sin separación: los dos segmentos se tocan y la división la marca un\n // divisor fino dibujado en la flecha (ver sxArrowButton). Antes había un\n // gap que dejaba ver el fondo (blanco en el footer) como una línea gruesa.\n } as SxProps<Theme>,\n\n sxMainButton: (whiteBtn: boolean, fullPill: boolean): SxProps<Theme> => {\n const variant = variantOf(whiteBtn);\n return {\n height: sizes.buttonHeight,\n px: '20px',\n pr: fullPill ? '20px' : '14px',\n // Esquinas externas redondas; la interna (junto a la flecha) recta para\n // que el divisor quede como una línea limpia de alto completo.\n borderRadius: fullPill ? '999px' : '999px 0 0 999px',\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 15,\n fontWeight: 600,\n minWidth: 0,\n gap: 1,\n boxShadow: shadows.button,\n ...(cmsButtonSurface(variant) as object),\n '& .MuiSvgIcon-root': { fontSize: 18 },\n '&:hover': {\n boxShadow: shadows.button,\n bgcolor: cmsButtonHoverBg(variant),\n },\n '&.Mui-disabled': {\n bgcolor: whiteBtn\n ? 'm3.surfaceContainerLowest'\n : cmsColors.primaryDisabled,\n color: 'action.disabled',\n },\n };\n },\n\n sxArrowButton: (whiteBtn: boolean, open: boolean): SxProps<Theme> => {\n const variant = variantOf(whiteBtn);\n return {\n height: sizes.buttonHeight,\n minWidth: 38,\n width: 38,\n px: 0,\n // Esquina interna (junto al botón principal) recta; externa redonda.\n borderRadius: '0 999px 999px 0',\n boxShadow: shadows.button,\n ...(cmsButtonSurface(variant) as object),\n // Divisor fino entre el botón principal y la flecha (blanco translúcido en\n // la variante CTA, borde gris en la blanca). Reemplaza al viejo gap.\n borderLeft: `1px solid ${cmsButtonDivider(variant)}`,\n '& .MuiSvgIcon-root': {\n fontSize: 22,\n transition: 'transform 0.15s',\n transform: open ? 'rotate(180deg)' : 'none',\n },\n '&:hover': {\n boxShadow: shadows.button,\n bgcolor: cmsButtonHoverBg(variant),\n },\n '&.Mui-disabled': {\n bgcolor: whiteBtn\n ? 'm3.surfaceContainerLowest'\n : cmsColors.primaryDisabled,\n color: 'action.disabled',\n },\n };\n },\n};\n","'use client';\n\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport { useMemo, useState } from 'react';\nimport type { MouseEvent, ReactNode } from 'react';\n\nimport { BtnDropdownStyles } from './BtnDropdown.styles';\nimport { SimpleDropdown } from './SimpleDropdown';\nimport type { DropdownOption } from './types';\n\nexport type BtnDropdownProps = {\n /** Texto o nodo (ya traducido) del botón principal. */\n titleButton: ReactNode;\n /** Opciones del menú desplegable. */\n options: DropdownOption[];\n /** Ícono opcional a la izquierda del texto del botón principal. */\n icon?: ReactNode;\n /** Acción del botón principal. */\n onAction?: () => void;\n /** Deshabilita el botón y el menú completo. */\n disabled?: boolean;\n /** Habilita o deshabilita solo el botón principal. Por defecto `true`. */\n enableButton?: boolean;\n /** Variante visual de botón blanco. */\n whiteBtn?: boolean;\n /** Muestra u oculta la flecha del desplegable. Por defecto `true`. */\n showDropdownOptions?: boolean;\n /**\n * Abre el menú hacia arriba (útil cuando el botón vive al pie de un footer o\n * pegado al margen inferior). Por defecto `false` (abre hacia abajo).\n */\n openUpward?: boolean;\n /** Valor base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Botón primario con menú desplegable integrado, en forma de píldora dividida.\n * Combina un botón principal de acción (emite `onAction`) con una flecha que\n * despliega opciones adicionales. Si no hay opciones visibles, la flecha se\n * oculta automáticamente.\n */\nexport function BtnDropdown({\n titleButton,\n options,\n icon,\n onAction,\n disabled = false,\n enableButton = true,\n whiteBtn = false,\n showDropdownOptions = true,\n openUpward = false,\n testId,\n}: BtnDropdownProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n /**\n * Alterna la apertura del menú anclándolo al botón de la flecha.\n * @param event - Evento de clic sobre la flecha.\n * @returns void\n */\n const handleToggle = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl((current) => (current ? null : event.currentTarget));\n };\n\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n const hasOptions = visibleOptions.length > 0;\n const showArrow = showDropdownOptions && hasOptions;\n\n return (\n <>\n <Box sx={BtnDropdownStyles.sxGroup}>\n <Button\n disableElevation\n startIcon={icon}\n onClick={onAction}\n disabled={disabled || !enableButton}\n data-testid={testId ? `btn-${testId}` : undefined}\n sx={BtnDropdownStyles.sxMainButton(whiteBtn, !showArrow)}>\n {titleButton}\n </Button>\n {showArrow ? (\n <Button\n disableElevation\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n onClick={handleToggle}\n disabled={disabled}\n data-testid={testId ? `dropdown-toggle-${testId}` : undefined}\n sx={BtnDropdownStyles.sxArrowButton(whiteBtn, open)}>\n <ArrowDropDownIcon />\n </Button>\n ) : null}\n </Box>\n\n <SimpleDropdown\n options={options}\n anchorEl={anchorEl}\n open={open}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{\n vertical: openUpward ? 'top' : 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: openUpward ? 'bottom' : 'top',\n horizontal: 'right',\n }}\n testId={testId ? `dropdown-menu-${testId}` : undefined}\n />\n </>\n );\n}\n","'use client';\n\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { cloneElement, isValidElement, useMemo, useState } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport { SelectStyles } from '../../theme/selectStyles';\n\n/** Tamaño fijo (px) de los íconos de las opciones, en trigger y menú. */\nconst ICON_SIZE = 18;\n\n/**\n * Fuerza el ícono de una opción a {@link ICON_SIZE}×{@link ICON_SIZE}px. El\n * tamaño se aplica con `sx` sobre el **propio** ícono (no con un selector del\n * contenedor): así gana al tamaño por defecto de MUI (24px) sin depender de la\n * especificidad CSS. El `sx` del consumidor se respeta salvo el tamaño.\n */\nfunction withIconSize(icon: ReactNode): ReactNode {\n if (!isValidElement(icon)) return icon;\n const el = icon as ReactElement<{ sx?: SxProps<Theme> }>;\n return cloneElement(el, {\n sx: [\n el.props.sx,\n { fontSize: ICON_SIZE, width: ICON_SIZE, height: ICON_SIZE },\n ] as SxProps<Theme>,\n });\n}\n\n/** Opción de un `SelectDropdown`. */\nexport type SelectOption = {\n /** Valor que se emite en `onChange` y se compara con `value`. */\n value: string;\n /** Texto o nodo (ya traducido) a mostrar. */\n label: ReactNode;\n /** Ícono opcional a la izquierda del label. */\n icon?: ReactNode;\n /**\n * Color del ícono de esta opción (en el disparador y en el menú). Acepta un\n * valor de variable del theme (`cmsColors.*`, `feedbackColors.*`) o un path\n * del tema MUI (p. ej. `'m3.onSurfaceVariant'`). Si se omite, el ícono usa el\n * gris por defecto (`m3.onSurfaceVariant`).\n */\n iconColor?: string;\n /** Si es `false` la opción no se renderiza. Por defecto `true`. */\n show?: boolean;\n};\n\nexport type SelectDropdownProps = {\n /** Valor seleccionado actualmente. */\n value: string;\n /** Opciones disponibles. */\n options: SelectOption[];\n /** Callback al elegir una opción. */\n onChange: (value: string) => void;\n /**\n * Resalta el disparador con el color de acento (`secondary`).\n * Útil para señalar que hay un filtro activo distinto del valor por defecto.\n */\n highlighted?: boolean;\n /**\n * Muestra los íconos de las opciones (en el disparador y en el menú).\n * `true` → variante con ícono; `false` → variante solo texto. Por defecto `true`.\n */\n showIcons?: boolean;\n /** Ancho mínimo del menú. Por defecto `200`. */\n minWidth?: number | string;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Texto a mostrar cuando ningún valor coincide. */\n placeholder?: ReactNode;\n /**\n * Prefijo fijo antes del valor seleccionado en el disparador (p. ej.\n * \"Estado:\"). Solo aparece en el trigger, no en el menú. El prefijo va en peso\n * normal y el valor seleccionado en negrita.\n */\n prefix?: ReactNode;\n /** `aria-label` del disparador (accesibilidad). */\n ariaLabel?: string;\n /** Valor base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Selector de una sola opción con la estética \"vista/filtro\" del CMS: un\n * disparador outlined con label + chevron y un menú cuyo ítem activo se resalta\n * en `secondaryContainer`. Es presentacional y controlado: el consumidor pasa\n * `value` y `onChange`.\n *\n * Pensado para filtros de listado (p. ej. \"Últimas Noticias\" o\n * \"Todos / Activos / Inactivos\"), reutilizable desde cualquier app que consuma\n * la librería.\n */\nexport function SelectDropdown({\n value,\n options,\n onChange,\n highlighted = false,\n showIcons = true,\n minWidth = 200,\n disabled = false,\n placeholder,\n prefix,\n ariaLabel,\n testId,\n}: SelectDropdownProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n const active = useMemo(\n () => visibleOptions.find((option) => option.value === value),\n [visibleOptions, value],\n );\n\n /**\n * Aplica la selección y cierra el menú.\n * @param next - Valor de la opción elegida.\n * @returns void\n */\n const handleSelect = (next: string) => {\n onChange(next);\n setAnchorEl(null);\n };\n\n /** Renderiza una opción del menú. */\n const renderOption = (option: SelectOption) => {\n const selected = option.value === value;\n return (\n <MenuItem\n key={option.value}\n selected={selected}\n onClick={() => handleSelect(option.value)}\n data-testid={testId ? `${testId}-option-${option.value}` : undefined}\n sx={SelectStyles.sxItem(selected)}>\n {showIcons && option.icon ? (\n <ListItemIcon\n sx={{ color: option.iconColor ?? 'm3.onSurfaceVariant' }}>\n {withIconSize(option.icon)}\n </ListItemIcon>\n ) : null}\n {option.label}\n </MenuItem>\n );\n };\n\n return (\n <>\n <Button\n type=\"button\"\n disableElevation\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open ? 'true' : undefined}\n aria-label={ariaLabel}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n data-testid={testId}\n sx={SelectStyles.sxTrigger(highlighted, open)}>\n {showIcons && active?.icon ? (\n <Box\n component=\"span\"\n className=\"sel-lead\"\n sx={{ color: active.iconColor ?? 'inherit' }}>\n {withIconSize(active.icon)}\n </Box>\n ) : null}\n <Box\n component=\"span\"\n sx={{ flex: 1, textAlign: 'left', whiteSpace: 'nowrap' }}>\n {prefix != null ? (\n <>\n <Box component=\"span\" sx={{ fontWeight: 400, mr: 0.5 }}>\n {prefix}\n </Box>\n <Box component=\"span\" sx={{ fontWeight: 600 }}>\n {active?.label ?? placeholder}\n </Box>\n </>\n ) : (\n (active?.label ?? placeholder)\n )}\n </Box>\n <Box component=\"span\" className=\"sel-chevron\">\n <ExpandMoreIcon />\n </Box>\n </Button>\n\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{\n paper: { sx: SelectStyles.sxMenuPaper(minWidth) },\n list: {\n sx: SelectStyles.sxList,\n role: 'listbox',\n ...(testId ? ({ 'data-testid': `${testId}-menu` } as object) : {}),\n },\n }}>\n {visibleOptions.map(renderOption)}\n </Menu>\n </>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii, sizes } from '../../theme/variables';\n\n/**\n * Estilos del `CmsSearchField` — el buscador del CMS (equivale al `app-search`\n * del Angular legacy). Caja redondeada sobre `surfaceContainerHigh`, con lupa\n * opcional a la izquierda, input que puede crecer/colapsar, chips de términos\n * confirmados (modo chips) y un botón de \"opciones avanzadas\" (tres puntos)\n * opcional a la derecha.\n */\nexport const CmsSearchFieldStyles = {\n /** Caja contenedora del buscador (con hover y estado de foco). */\n sxRoot: (opts: { collapsed: boolean; focused: boolean }): SxProps<Theme> => ({\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n // Alto mínimo igual al del filtro (`buttonHeight`); crece si los chips\n // envuelven a varias líneas.\n minHeight: sizes.searchHeight,\n pl: '16px',\n pr: '6px',\n // Borde reservado (2px transparente en reposo) para que el foco no desplace el layout.\n border: '2px solid transparent',\n borderRadius: radii.md,\n bgcolor: 'm3.surfaceContainerHigh',\n color: 'm3.onSurfaceVariant',\n transition:\n 'width 0.16s cubic-bezier(0.4, 0, 0.2, 1), flex-basis 0.16s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.12s, border-color 0.12s',\n overflow: 'hidden',\n cursor: opts.collapsed ? 'pointer' : 'text',\n // Hover (sin foco): gris algo más oscuro.\n '&:hover': { bgcolor: cmsColors.searchHoverBg },\n ...(opts.collapsed ? { width: sizes.buttonHeight } : {}),\n // Foco (mientras se escribe): fondo gris lavanda + borde primario 2px.\n ...(opts.focused && !opts.collapsed\n ? {\n bgcolor: cmsColors.searchFocusBg,\n borderColor: cmsColors.primary,\n '&:hover': { bgcolor: cmsColors.searchFocusBg },\n }\n : {}),\n }),\n\n /** Zona de contenido (chips + input): fluye y envuelve si hay muchos chips. */\n sxContent: {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: '6px',\n flex: 1,\n minWidth: 0,\n py: '5px',\n } as SxProps<Theme>,\n\n /** Chip de un término de búsqueda confirmado (color secundario/tonal). */\n sxChip: {\n height: 24,\n maxWidth: '100%',\n borderRadius: radii.sm,\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n fontFamily: fontFamilies.googleSans,\n fontWeight: 500,\n '& .MuiChip-deleteIcon': {\n fontSize: 16,\n color: cmsColors.onSecondaryContainer,\n opacity: 0.7,\n '&:hover': { opacity: 1, color: cmsColors.onSecondaryContainer },\n },\n } as SxProps<Theme>,\n\n /** Lupa principal (toma el color primario al enfocar). */\n sxLeadIcon: (focused: boolean): SxProps<Theme> => ({\n color: focused ? cmsColors.primary : 'm3.onSurfaceVariant',\n fontSize: 20,\n flex: 'none',\n transition: 'color 0.12s',\n }),\n\n /** Input de texto. */\n sxInput: {\n flex: 1,\n minWidth: 60,\n border: 0,\n outline: 0,\n background: 'transparent',\n fontFamily: fontFamilies.googleSans,\n fontSize: 16,\n fontWeight: 400,\n color: cmsColors.textNav,\n '&::placeholder': {\n color: cmsColors.textNav,\n opacity: 1,\n },\n } as SxProps<Theme>,\n\n /** Botón redondo de opciones avanzadas (tres puntos). */\n sxIconBtn: {\n width: 28,\n height: 28,\n p: 0,\n flex: 'none',\n color: 'm3.onSurfaceVariant',\n '&:hover': {\n bgcolor: 'action.hover',\n color: 'm3.onSurface',\n },\n '& .MuiSvgIcon-root': { fontSize: 20 },\n } as SxProps<Theme>,\n\n /**\n * Botón limpiar (X): con foco toma el color primario; al perder el foco vuelve\n * a gris oscuro (`onSurfaceVariant`) —feedback pedido en NAA-4820—. Hover neutro.\n */\n sxClearBtn: (focused: boolean): SxProps<Theme> => ({\n width: 28,\n height: 28,\n p: 0,\n flex: 'none',\n color: focused ? cmsColors.primary : 'm3.onSurfaceVariant',\n transition: 'color 0.12s',\n '&:hover': {\n bgcolor: cmsColors.searchClearHoverBg,\n color: focused ? cmsColors.primary : 'm3.onSurfaceVariant',\n },\n '& .MuiSvgIcon-root': { fontSize: 20 },\n }),\n\n /** Botón de opciones avanzadas cuando hay filtros activos. */\n sxAdvancedActive: {\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n '&:hover': {\n bgcolor: cmsColors.secondaryHover,\n color: cmsColors.onSecondaryContainer,\n },\n } as SxProps<Theme>,\n\n /** Punto indicador de filtros activos sobre el botón de avanzadas. */\n sxDot: {\n position: 'absolute',\n top: 2,\n right: 2,\n width: 8,\n height: 8,\n borderRadius: radii.pill,\n bgcolor: cmsColors.primary,\n border: '1.5px solid',\n borderColor: 'm3.surfaceContainerHigh',\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';\nimport MoreVertOutlinedIcon from '@mui/icons-material/MoreVertOutlined';\nimport SearchOutlinedIcon from '@mui/icons-material/SearchOutlined';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport IconButton from '@mui/material/IconButton';\nimport { useRef, useState } from 'react';\nimport type { CSSProperties, KeyboardEvent } from 'react';\n\nimport { useCmsTranslation } from '../../i18n/useCmsTranslation';\nimport { toTestId } from '../../utils/toTestId';\nimport { CmsSearchFieldStyles } from './CmsSearchField.styles';\n\n/**\n * Transición de la expansión del buscador (modo `grow`): rápida y con easing\n * estándar de Material para que el crecer/encoger sea fluido (NAA-4820).\n */\nconst GROW_TRANSITION = '0.16s cubic-bezier(0.4, 0, 0.2, 1)';\n\nexport type CmsSearchFieldProps = {\n /** Valor del texto de búsqueda en curso (controlado). */\n value: string;\n /** Callback en cada cambio del texto. */\n onChange: (value: string) => void;\n /**\n * Callback al ejecutar la búsqueda. En modo texto simple recibe el `value`\n * (string) al presionar Enter. En modo chips recibe la **lista de chips\n * vigente** (string[]) cuando hay que aplicar la búsqueda: al presionar Enter,\n * al quitar un chip y al limpiar. Con `;` NO se dispara (los chips se agregan y\n * esperan; ver §NAA-4820).\n */\n onSearch?: (value: string | string[]) => void;\n /** Callback al limpiar el campo. Si no se pasa, igual limpia `value` (y chips). */\n onClear?: () => void;\n /** Placeholder del input (ya traducido y modificable por el consumidor). */\n placeholder?: string;\n /**\n * Modo \"chips\": lista controlada de términos de búsqueda ya confirmados. Si se\n * pasa (aunque sea `[]`), el buscador funciona como buscador de chips: cada\n * término escrito se confirma como chip con `;` (sin buscar) o con Enter (que\n * además ejecuta la búsqueda). Los chips se muestran dentro del campo, cada uno\n * con su \"x\" para quitarlo. Sin esta prop, el campo es un buscador de texto simple.\n */\n chips?: string[];\n /** Callback con la nueva lista de chips (al agregar o quitar). */\n onChipsChange?: (chips: string[]) => void;\n /** Tecla que confirma un chip sin ejecutar la búsqueda. Por defecto `;`. */\n chipSeparator?: string;\n /** Placeholder cuando ya hay chips (ya traducido). Por defecto el de la lib (\"Agregar…\"). */\n addPlaceholder?: string;\n /** `aria-label` del botón de quitar un chip. */\n removeChipAriaLabel?: string;\n /** Muestra la lupa a la izquierda. Por defecto `true`. */\n showIcon?: boolean;\n /** Muestra el botón de opciones avanzadas (tres puntos). Por defecto `false`. */\n showAdvanced?: boolean;\n /** Marca el botón de avanzadas como activo (hay filtros aplicados). */\n advancedActive?: boolean;\n /** Callback al hacer clic en opciones avanzadas (abre modal o panel). */\n onAdvancedClick?: () => void;\n /**\n * Modo \"crece/colapsa\" como el `app-search` del Angular: arranca como un botón\n * con lupa y se expande al hacer foco; colapsa al perder foco si está vacío.\n * Por defecto `false` (input siempre expandido).\n */\n collapsible?: boolean;\n /** Ancho del input cuando está expandido. */\n width?: number | string;\n /**\n * Crece al enfocar hasta llenar el espacio disponible del contenedor (como el\n * buscador clásico del CMS), dejando `endGap` px antes del borde. En reposo\n * queda alineado a la derecha con ancho `width`. Por defecto `false`.\n */\n grow?: boolean;\n /** Ancho máximo opcional cuando `grow` está activo (por defecto sin tope). */\n maxWidth?: number | string;\n /** Espacio mínimo a la derecha cuando `grow` está activo. Por defecto `40`. */\n endGap?: number;\n /**\n * Separación fija a la izquierda (px) cuando `grow` está activo. Si se pasa, el\n * buscador **llena** el espacio restante dejando este hueco respecto del control\n * previo (p. ej. un filtro), en reposo y expandido. Si se omite, en reposo se\n * alinea a la derecha con ancho `width` y crece al enfocar.\n */\n startGap?: number;\n /** `aria-label` del botón de avanzadas. */\n advancedAriaLabel?: string;\n /** `aria-label` del botón de limpiar. */\n clearAriaLabel?: string;\n /** `aria-label` del input. */\n ariaLabel?: string;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Buscador del CMS: input con lupa opcional, botón de limpiar y botón opcional\n * de \"opciones avanzadas\" (tres puntos) que el consumidor cablea a un modal o\n * panel lateral. Replica el comportamiento del `app-search` del Angular legacy\n * (incluido el modo `collapsible` que crece al enfocar y colapsa al vaciarse).\n *\n * Con la prop `chips` pasa a **buscador de chips**: cada término escrito se\n * confirma como chip con `;` (sin buscar) o con Enter (que además ejecuta la\n * búsqueda), y cada chip se muestra dentro del campo con su \"x\" para quitarlo\n * (NAA-4820). Es presentacional y controlado: el texto, los chips y los textos\n * visibles vienen por props; la decisión de qué abrir en \"avanzadas\" y cómo\n * filtrar vive en el gestor.\n */\nexport function CmsSearchField({\n value,\n onChange,\n onSearch,\n onClear,\n placeholder,\n chips,\n onChipsChange,\n chipSeparator = ';',\n addPlaceholder,\n removeChipAriaLabel,\n showIcon = true,\n showAdvanced = false,\n advancedActive = false,\n onAdvancedClick,\n collapsible = false,\n width = 320,\n grow = false,\n maxWidth,\n endGap = 40,\n startGap,\n advancedAriaLabel,\n clearAriaLabel,\n ariaLabel,\n testId,\n}: CmsSearchFieldProps) {\n // Textos por defecto desde la lib (resueltos al idioma del provider). Si el\n // consumidor pasa el prop, manda el suyo.\n const { t } = useCmsTranslation();\n const s = t.messages.search;\n const resolvedAriaLabel = ariaLabel ?? s.inputAriaLabel;\n const resolvedClearAria = clearAriaLabel ?? s.clearAriaLabel;\n const resolvedAdvancedAria = advancedAriaLabel ?? s.advancedAriaLabel;\n const resolvedRemoveChipAria = removeChipAriaLabel ?? s.removeChipAriaLabel;\n\n // Modo chips: activo cuando el consumidor pasa la prop `chips`.\n const chipMode = chips !== undefined;\n const chipList = chips ?? [];\n // Placeholder: \"Agregar…\" cuando ya hay chips; el normal en caso contrario.\n const resolvedPlaceholder =\n chipMode && chipList.length > 0\n ? (addPlaceholder ?? s.addPlaceholder)\n : (placeholder ?? s.placeholder);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [focused, setFocused] = useState(false);\n\n // En modo collapsible la caja colapsa solo si no hay foco, texto ni chips.\n const collapsed =\n collapsible && !focused && value.trim() === '' && chipList.length === 0;\n // Hay algo que limpiar: texto en curso o chips confirmados.\n const hasContent = value.length > 0 || chipList.length > 0;\n\n /**\n * Confirma el texto en curso como chip (dedupe + trim) SIN ejecutar la\n * búsqueda. Devuelve la nueva lista de chips para que Enter pueda, además,\n * dispararla con `onSearch`.\n */\n const commitChip = (): string[] => {\n const term = value.trim();\n const next =\n term && !chipList.includes(term) ? [...chipList, term] : chipList;\n if (next !== chipList) onChipsChange?.(next);\n if (term) onChange('');\n return next;\n };\n\n /** Quita un chip y re-ejecuta la búsqueda (quitar un filtro actualiza al toque). */\n const removeChip = (term: string) => {\n const next = chipList.filter((chip) => chip !== term);\n onChipsChange?.(next);\n onSearch?.(next);\n inputRef.current?.focus();\n };\n\n /** Maneja `;` (agrega chip y espera), Enter (agrega + busca) y Backspace (quita el último). */\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (!chipMode) {\n if (event.key === 'Enter') onSearch?.(value);\n return;\n }\n if (event.key === chipSeparator) {\n // `;` agrega el chip y espera: NO ejecuta la búsqueda todavía.\n event.preventDefault();\n commitChip();\n } else if (event.key === 'Enter') {\n // Enter agrega el texto pendiente y ejecuta la búsqueda con todos los chips.\n event.preventDefault();\n onSearch?.(commitChip());\n } else if (\n event.key === 'Backspace' &&\n value === '' &&\n chipList.length > 0\n ) {\n // Backspace con el input vacío quita el último chip (y re-ejecuta la búsqueda).\n event.preventDefault();\n const next = chipList.slice(0, -1);\n onChipsChange?.(next);\n onSearch?.(next);\n }\n };\n\n /** Limpia el texto y los chips, ejecuta la búsqueda vacía y devuelve el foco. */\n const handleClear = () => {\n if (onClear) onClear();\n else onChange('');\n if (chipMode) {\n onChipsChange?.([]);\n onSearch?.([]);\n }\n inputRef.current?.focus();\n };\n\n /** Expande el buscador colapsado al hacer clic en la caja. */\n const handleRootClick = () => {\n if (collapsed) inputRef.current?.focus();\n };\n\n let rootStyle: CSSProperties | undefined;\n if (collapsed) {\n rootStyle = undefined;\n } else if (grow) {\n // En reposo queda a la derecha con ancho `width`; al enfocar crece hasta\n // llenar el espacio disponible dejando `endGap` px antes del borde. Se anima\n // SIEMPRE `flex-basis` (misma propiedad en ambos estados, con `flex-shrink`\n // acotando al espacio real) para que la expansión sea fluida y no un salto.\n // Con `startGap` el buscador llena el espacio restante dejando ese hueco a la\n // izquierda (p. ej. 40px de los filtros). Sin él, en reposo se alinea a la\n // derecha con ancho `width` y crece al enfocar.\n const fillFromGap = startGap != null;\n rootStyle = {\n flexGrow: fillFromGap ? 1 : 0,\n flexShrink: 1,\n flexBasis: fillFromGap ? 0 : focused ? (maxWidth ?? '100%') : width,\n // Permite encoger por debajo del contenido para caber junto a otros\n // controles en la misma fila (toolbars angostos).\n minWidth: 0,\n maxWidth: maxWidth ?? 'none',\n marginLeft: fillFromGap ? startGap : 'auto',\n marginRight: endGap,\n transition: `flex-basis ${GROW_TRANSITION}`,\n };\n } else {\n rootStyle = { flexBasis: width, maxWidth: '100%' };\n }\n\n return (\n <Box\n sx={CmsSearchFieldStyles.sxRoot({ collapsed, focused })}\n style={rootStyle}\n onClick={handleRootClick}\n data-testid={testId}>\n {showIcon && (\n <SearchOutlinedIcon sx={CmsSearchFieldStyles.sxLeadIcon(focused)} />\n )}\n\n {!collapsed && (\n <Box sx={CmsSearchFieldStyles.sxContent}>\n {chipMode &&\n chipList.map((chip) => (\n <Chip\n key={chip}\n label={chip}\n size=\"small\"\n onDelete={() => removeChip(chip)}\n deleteIcon={\n <CloseOutlinedIcon\n aria-label={resolvedRemoveChipAria}\n data-testid={\n testId\n ? `${testId}-chip-${toTestId(chip)}-remove`\n : undefined\n }\n />\n }\n sx={CmsSearchFieldStyles.sxChip}\n data-testid={\n testId ? `${testId}-chip-${toTestId(chip)}` : undefined\n }\n />\n ))}\n\n <Box\n component=\"input\"\n ref={inputRef}\n type=\"text\"\n autoComplete=\"off\"\n aria-label={resolvedAriaLabel}\n placeholder={resolvedPlaceholder}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n sx={CmsSearchFieldStyles.sxInput}\n data-testid={testId ? `${testId}-input` : undefined}\n />\n </Box>\n )}\n\n {!collapsed && hasContent && (\n <IconButton\n size=\"small\"\n aria-label={resolvedClearAria}\n onClick={handleClear}\n sx={CmsSearchFieldStyles.sxClearBtn(focused)}\n data-testid={testId ? `${testId}-icon-btn-clear` : undefined}>\n <CloseOutlinedIcon />\n </IconButton>\n )}\n\n {!collapsed && showAdvanced && (\n <IconButton\n size=\"small\"\n aria-label={resolvedAdvancedAria}\n aria-haspopup=\"dialog\"\n onClick={(event) => {\n event.stopPropagation();\n onAdvancedClick?.();\n }}\n sx={{\n ...(CmsSearchFieldStyles.sxIconBtn as object),\n position: 'relative',\n ...(advancedActive\n ? (CmsSearchFieldStyles.sxAdvancedActive as object)\n : {}),\n }}\n data-testid={testId ? `${testId}-icon-btn-advanced` : undefined}>\n <MoreVertOutlinedIcon />\n {advancedActive && <Box component=\"span\" sx={CmsSearchFieldStyles.sxDot} />}\n </IconButton>\n )}\n </Box>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies } from '../../theme/variables';\n\n/**\n * Estilos del `CmsEmptyState` — bloque centrado de \"sin resultados\" para\n * listados y tablas (icono + título + subtítulo). El color del icono usa la\n * variable `actionIcon` (#43474E) para mantener el gris del sistema.\n */\nexport const CmsEmptyStateStyles = {\n /** Contenedor centrado en columna. */\n sxRoot: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n gap: '6px',\n py: 8,\n px: 3,\n } as SxProps<Theme>,\n\n /** Icono ilustrativo (por defecto `search_off`), en gris `actionIcon` (rgb 67,71,78). */\n sxIcon: {\n color: cmsColors.actionIcon,\n mb: '2px',\n '& .MuiSvgIcon-root': { fontSize: 40, color: cmsColors.actionIcon },\n } as SxProps<Theme>,\n\n /** Título del estado vacío. */\n sxTitle: {\n fontFamily: fontFamilies.googleSans,\n fontWeight: 600,\n fontSize: 16,\n color: cmsColors.textStrong,\n } as SxProps<Theme>,\n\n /** Subtítulo / ayuda. */\n sxDescription: {\n fontFamily: fontFamilies.googleSans,\n fontWeight: 400,\n fontSize: 14,\n color: cmsColors.textNav,\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport SearchOffOutlinedIcon from '@mui/icons-material/SearchOffOutlined';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { ReactNode } from 'react';\n\nimport { CmsEmptyStateStyles } from './CmsEmptyState.styles';\n\nexport type CmsEmptyStateProps = {\n /** Título principal (ya traducido). */\n title: string;\n /** Subtítulo / ayuda opcional (ya traducido). */\n description?: string;\n /** Icono a mostrar. Por defecto `search_off` (SearchOffOutlined). */\n icon?: ReactNode;\n /** Base para los `data-testid` (p. ej. `panel-users-empty`). */\n testId?: string;\n};\n\n/**\n * Bloque de \"sin resultados\" para listados y tablas: icono + título + subtítulo,\n * centrado. Presentacional; los textos vienen por props (i18n del gestor).\n * Replica el estado vacío del CMS Angular legacy.\n */\nexport function CmsEmptyState({\n title,\n description,\n icon,\n testId,\n}: CmsEmptyStateProps) {\n return (\n <Box sx={CmsEmptyStateStyles.sxRoot} data-testid={testId}>\n <Box sx={CmsEmptyStateStyles.sxIcon}>\n {icon ?? <SearchOffOutlinedIcon />}\n </Box>\n <Typography\n sx={CmsEmptyStateStyles.sxTitle}\n data-testid={testId ? `${testId}-title` : undefined}>\n {title}\n </Typography>\n {description ? (\n <Typography\n sx={CmsEmptyStateStyles.sxDescription}\n data-testid={testId ? `${testId}-description` : undefined}>\n {description}\n </Typography>\n ) : null}\n </Box>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii } from '../../theme/variables';\n\n/**\n * Estilos del `CmsFilterBar` — la barra de filtros activos que aparece bajo la\n * toolbar del listado (label \"Filtros:\" + chips removibles + \"Limpiar todo\").\n *\n * Colores (todos con variables de `variables.ts`):\n * - Label + icono `filter_alt`: `actionIcon` (#43474E), 14px.\n * - Chip: fondo `secondary` (#D8E2FF); icono/texto `onSecondaryContainer`\n * (#2C4678), peso 400, 14px; X `onSecondaryContainer` con hover `secondaryHover`.\n * - \"Limpiar todo\": `primary` (#0067C4), 14px; X 18px.\n */\nexport const CmsFilterBarStyles = {\n /** Fila con label + chips + limpiar todo (envuelve si no entra). */\n sxRoot: {\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '10px',\n } as SxProps<Theme>,\n\n /** Grupo \"icono filter_alt + Filtros:\". */\n sxLabel: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n color: cmsColors.actionIcon,\n } as SxProps<Theme>,\n\n sxLabelIcon: {\n fontSize: 18,\n } as SxProps<Theme>,\n\n sxLabelText: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n color: cmsColors.actionIcon,\n } as SxProps<Theme>,\n\n /** Chip de un filtro activo (fondo secundario). */\n sxChip: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n height: 32,\n pl: '10px',\n pr: '4px',\n borderRadius: radii.sm,\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n } as SxProps<Theme>,\n\n /** Icono opcional a la izquierda del label del chip (p. ej. `search`). */\n sxChipIcon: {\n display: 'inline-flex',\n color: cmsColors.onSecondaryContainer,\n '& .MuiSvgIcon-root': { fontSize: 18 },\n } as SxProps<Theme>,\n\n sxChipLabel: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 400,\n color: cmsColors.onSecondaryContainer,\n whiteSpace: 'nowrap',\n } as SxProps<Theme>,\n\n /** Botón X del chip: quita ese filtro. */\n sxChipRemove: {\n width: 24,\n height: 24,\n p: 0,\n flex: 'none',\n color: cmsColors.onSecondaryContainer,\n '&:hover': {\n bgcolor: cmsColors.secondaryHover,\n color: cmsColors.onSecondaryContainer,\n },\n '& .MuiSvgIcon-root': { fontSize: 18 },\n } as SxProps<Theme>,\n\n /** \"Limpiar todo\": link de acción primario con X de 18px. */\n sxClearAll: {\n minWidth: 0,\n px: '8px',\n height: 32,\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n color: cmsColors.primary,\n '&:hover': { bgcolor: cmsColors.neutralHover },\n '& .MuiButton-startIcon': { mr: '4px' },\n '& .MuiButton-startIcon .MuiSvgIcon-root': { fontSize: 18 },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';\nimport FilterAltOutlinedIcon from '@mui/icons-material/FilterAltOutlined';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport type { ReactNode } from 'react';\n\nimport { CmsFilterBarStyles } from './CmsFilterBar.styles';\n\n/** Chip de un filtro activo dentro del `CmsFilterBar`. */\nexport type CmsFilterChip = {\n /** Id estable del chip (para la key y el `data-testid`). */\n id: string;\n /** Texto o nodo a mostrar (ya traducido / formateado). */\n label: ReactNode;\n /** Icono opcional a la izquierda del label (p. ej. `search`). */\n icon?: ReactNode;\n /** Callback al quitar este filtro (clic en la X del chip). */\n onRemove: () => void;\n /** `aria-label` de la X del chip. */\n removeAriaLabel?: string;\n /** `data-testid` base del chip (la X será `${testId}-icon-btn-remove`). */\n testId?: string;\n};\n\nexport type CmsFilterBarProps = {\n /** Texto del prefijo (p. ej. \"Filtros:\"). */\n label: string;\n /** Chips de filtros activos. Si está vacío, la barra no se renderiza. */\n chips: CmsFilterChip[];\n /** Callback de \"Limpiar todo\" (limpia todos los filtros). Si se omite, no se muestra. */\n onClearAll?: () => void;\n /** Texto del botón \"Limpiar todo\" (ya traducido). */\n clearAllLabel?: string;\n /** `data-testid` base de la barra. */\n testId?: string;\n};\n\n/**\n * Barra de filtros activos: aparece bajo la toolbar del listado con el label\n * \"Filtros:\", un chip removible por cada filtro aplicado y un botón\n * \"Limpiar todo\". Presentacional y controlado: los chips y los callbacks los\n * arma el gestor (dominio del producto); la lib solo aporta la estética común.\n *\n * No renderiza nada si no hay chips activos.\n */\nexport function CmsFilterBar({\n label,\n chips,\n onClearAll,\n clearAllLabel,\n testId,\n}: CmsFilterBarProps) {\n if (chips.length === 0) return null;\n\n return (\n <Box sx={CmsFilterBarStyles.sxRoot} data-testid={testId}>\n <Box sx={CmsFilterBarStyles.sxLabel}>\n <FilterAltOutlinedIcon sx={CmsFilterBarStyles.sxLabelIcon} />\n <Typography component=\"span\" sx={CmsFilterBarStyles.sxLabelText}>\n {label}\n </Typography>\n </Box>\n\n {chips.map((chip) => (\n <Box\n key={chip.id}\n sx={CmsFilterBarStyles.sxChip}\n data-testid={chip.testId}>\n {chip.icon ? (\n <Box sx={CmsFilterBarStyles.sxChipIcon}>{chip.icon}</Box>\n ) : null}\n <Box component=\"span\" sx={CmsFilterBarStyles.sxChipLabel}>\n {chip.label}\n </Box>\n <IconButton\n size=\"small\"\n aria-label={chip.removeAriaLabel}\n onClick={chip.onRemove}\n sx={CmsFilterBarStyles.sxChipRemove}\n data-testid={\n chip.testId ? `${chip.testId}-icon-btn-remove` : undefined\n }>\n <CloseOutlinedIcon />\n </IconButton>\n </Box>\n ))}\n\n {onClearAll ? (\n <Button\n onClick={onClearAll}\n startIcon={<CloseOutlinedIcon />}\n sx={CmsFilterBarStyles.sxClearAll}\n data-testid={testId ? `${testId}-btn-clear-all` : undefined}>\n {clearAllLabel}\n </Button>\n ) : null}\n </Box>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, radii, shadows } from '../../theme/variables';\n\n/**\n * Estilos compartidos de los campos de formulario del CMS.\n *\n * Replican la estética \"Material 3 standard\" del diseño de referencia\n * (etiqueta arriba en gris, control con subrayado inferior; el subrayado pasa a\n * `primary` al enfocar). Viven juntos para que todos los campos\n * (`CmsTextField`, `CmsSelectField`, etc.) compartan exactamente el mismo look y\n * puedan reutilizarse en cualquier formulario de cualquier gestor.\n */\nexport const fieldStyles = {\n /** Contenedor vertical: etiqueta + control + ayuda. */\n sxField: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n minWidth: 0,\n } as SxProps<Theme>,\n\n /** Etiqueta superior (gris, label-medium). */\n sxLabel: {\n font: 'inherit',\n fontSize: 12,\n fontWeight: 500,\n lineHeight: '16px',\n letterSpacing: '0.02em',\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /** Texto de ayuda bajo el control. */\n sxHint: {\n fontSize: 11,\n lineHeight: '16px',\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /**\n * `sx` para los controles basados en `TextField variant=\"standard\"`\n * (texto, número, fecha, select) y para el `renderInput` de los\n * `Autocomplete` (combobox, tags, multiselect). Unifica subrayado,\n * tipografía y color del placeholder.\n */\n sxStandard: {\n '& .MuiInputBase-root': {\n fontSize: 14,\n color: 'm3.onSurface',\n },\n '& .MuiInputBase-input': {\n paddingTop: '6px',\n paddingBottom: '6px',\n },\n // Subrayado en reposo / hover / foco.\n '& .MuiInputBase-root::before': {\n borderBottom: `1px solid ${cmsColors.border}`,\n },\n '& .MuiInputBase-root:hover:not(.Mui-disabled, .Mui-error)::before': {\n borderBottom: `1px solid ${cmsColors.controlBorder}`,\n },\n '& .MuiInputBase-root::after': {\n borderBottomColor: cmsColors.primary,\n },\n // Placeholder atenuado.\n '& input::placeholder, & textarea::placeholder': {\n color: 'm3.onSurfaceVariant',\n opacity: 0.6,\n },\n } as SxProps<Theme>,\n\n /**\n * Chips de los campos multiselección / etiquetas: fondo secundario, texto\n * sobre contenedor secundario y radio \"redondo cuadrado\".\n */\n sxChip: {\n height: 26,\n borderRadius: radii.sm,\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n fontWeight: 500,\n '& .MuiChip-deleteIcon': {\n color: cmsColors.onSecondaryContainer,\n opacity: 0.7,\n '&:hover': { opacity: 1, color: cmsColors.onSecondaryContainer },\n },\n } as SxProps<Theme>,\n\n /** Paper del desplegable de los `Autocomplete` (con aire vertical). */\n sxAutocompletePaper: {\n borderRadius: radii.lg,\n border: '1px solid',\n borderColor: 'm3.outlineVariant',\n py: '6px',\n } as SxProps<Theme>,\n\n /**\n * Listbox de los `Autocomplete`: opciones \"embutidas\" (con aire lateral y\n * radio), hover en `secondaryHover` y opción activa en `secondary`.\n */\n sxAutocompleteListbox: {\n '& .MuiAutocomplete-option': {\n borderRadius: radii.sm,\n mx: '6px',\n my: '2px',\n minHeight: 40,\n },\n '& .MuiAutocomplete-option.Mui-focused': {\n bgcolor: cmsColors.secondaryHover,\n },\n '& .MuiAutocomplete-option[aria-selected=\"true\"]': {\n bgcolor: cmsColors.secondary,\n },\n '& .MuiAutocomplete-option[aria-selected=\"true\"].Mui-focused': {\n bgcolor: cmsColors.secondaryHover,\n },\n } as SxProps<Theme>,\n\n /**\n * Paper del menú de `CmsSelectField`. Menú M3 común a todos los desplegables:\n * fondo `menuSurface` (#ECEDF6), sin padding lateral (ítems de borde a borde) y\n * 8px arriba/abajo; `overflow: hidden` recorta las esquinas del hover.\n */\n sxSelectMenuPaper: {\n mt: '4px',\n py: '8px',\n px: 0,\n borderRadius: radii.lg,\n bgcolor: cmsColors.menuSurface,\n border: '1px solid',\n borderColor: 'm3.outlineVariant',\n boxShadow: shadows.menuSoft,\n overflow: 'hidden',\n } as SxProps<Theme>,\n\n /** Lista del menú del select (sin padding ni gap: los ítems van full-bleed). */\n sxSelectList: {\n p: 0,\n display: 'flex',\n flexDirection: 'column',\n } as SxProps<Theme>,\n\n /**\n * Opción del menú del select: full-bleed (sin radio), hover en `neutralHover`\n * (state layer M3 `onSurface` al 8%, #191C20), activa en `secondary`. El check\n * va a la derecha.\n */\n sxSelectItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n borderRadius: 0,\n px: '16px',\n py: '8px',\n fontSize: 14,\n color: cmsColors.controlText,\n '&:hover': { bgcolor: cmsColors.neutralHover },\n '&.Mui-selected': {\n bgcolor: cmsColors.secondary,\n '&:hover': { bgcolor: cmsColors.secondary },\n },\n '&.Mui-focusVisible': { bgcolor: cmsColors.neutralHover },\n } as SxProps<Theme>,\n\n /** Check de la opción activa del select. */\n sxSelectCheck: {\n fontSize: 18,\n color: cmsColors.primary,\n flex: 'none',\n } as SxProps<Theme>,\n\n /** Etiqueta del checkbox (alineada al control). */\n sxCheckboxLabel: {\n m: 0,\n gap: '4px',\n '& .MuiFormControlLabel-label': {\n fontSize: 14,\n color: 'm3.onSurface',\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport Checkbox from '@mui/material/Checkbox';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport { useId } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { cmsColors } from '../../theme/variables';\nimport { fieldStyles } from './fieldStyles';\n\nexport type CmsCheckboxFieldProps = {\n /** Estado actual (controlado). */\n value: boolean;\n /** Callback con el nuevo estado. */\n onChange: (value: boolean) => void;\n /** Etiqueta a la derecha del checkbox (ya traducida). */\n label?: ReactNode;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Checkbox con etiqueta. Activo = cuadro relleno con el color primario y check\n * blanco (íconos por defecto de MUI, sin override). Controlado y reutilizable.\n */\nexport function CmsCheckboxField({\n value,\n onChange,\n label,\n disabled = false,\n testId,\n}: CmsCheckboxFieldProps) {\n const id = useId();\n return (\n <FormControlLabel\n sx={fieldStyles.sxCheckboxLabel}\n disabled={disabled}\n control={\n <Checkbox\n id={id}\n checked={value}\n onChange={(event) => onChange(event.target.checked)}\n data-testid={testId}\n sx={{\n color: cmsColors.controlBorder,\n '&.Mui-checked': { color: cmsColors.primary },\n }}\n />\n }\n label={label}\n />\n );\n}\n","'use client';\n\nimport Box from '@mui/material/Box';\nimport type { ReactNode } from 'react';\n\nimport { fieldStyles } from './fieldStyles';\n\nexport type FieldShellProps = {\n /** Etiqueta superior (ya traducida). Si se omite no se renderiza. */\n label?: ReactNode;\n /** `htmlFor` para asociar la etiqueta al control. */\n htmlFor?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** El control del campo. */\n children: ReactNode;\n};\n\n/**\n * Envoltorio común de un campo: etiqueta arriba + control + ayuda abajo.\n *\n * Centraliza la disposición vertical y la tipografía de la etiqueta para que\n * todos los campos del CMS se vean idénticos. Se exporta para poder construir\n * campos a medida que respeten el mismo layout.\n */\nexport function FieldShell({ label, htmlFor, hint, children }: FieldShellProps) {\n return (\n <Box sx={fieldStyles.sxField}>\n {label != null && (\n <Box component=\"label\" htmlFor={htmlFor} sx={fieldStyles.sxLabel}>\n {label}\n </Box>\n )}\n {children}\n {hint != null && <Box sx={fieldStyles.sxHint}>{hint}</Box>}\n </Box>\n );\n}\n","'use client';\n\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport { useId, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { useCmsTranslation } from '../../i18n/useCmsTranslation';\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\nimport type { FieldOption } from './types';\n\nexport type CmsComboboxFieldProps = {\n /** Valor seleccionado (value de la opción; vacío = ninguno). */\n value: string;\n /** Callback con el nuevo value (o '' al limpiar). */\n onChange: (value: string) => void;\n /** Opciones disponibles. */\n options: FieldOption[];\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Texto cuando no hay coincidencias (ya traducido). */\n noOptionsText?: ReactNode;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Combobox de una sola opción con búsqueda escribiendo (equivale al campo\n * \"Creador\" / \"Autor\" del diseño). Internamente usa `Autocomplete` de MUI pero\n * expone una API por `value: string`. Controlado y reutilizable.\n */\nexport function CmsComboboxField({\n value,\n onChange,\n options,\n label,\n placeholder,\n hint,\n noOptionsText,\n disabled = false,\n testId,\n}: CmsComboboxFieldProps) {\n const id = useId();\n const { t } = useCmsTranslation();\n const resolvedNoOptions = noOptionsText ?? t.messages.search.noOptions;\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n const selected = useMemo(\n () => visibleOptions.find((option) => option.value === value) ?? null,\n [visibleOptions, value],\n );\n\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <Autocomplete\n id={id}\n data-testid={testId}\n options={visibleOptions}\n value={selected}\n disabled={disabled}\n noOptionsText={resolvedNoOptions}\n getOptionLabel={(option) =>\n typeof option.label === 'string' ? option.label : option.value\n }\n getOptionDisabled={(option) => Boolean(option.disabled)}\n isOptionEqualToValue={(option, current) =>\n option.value === current.value\n }\n onChange={(_event, next) => onChange(next ? next.value : '')}\n slotProps={{\n paper: { sx: fieldStyles.sxAutocompletePaper },\n listbox: { sx: fieldStyles.sxAutocompleteListbox },\n }}\n renderInput={(params) => (\n <TextField\n {...params}\n variant=\"standard\"\n placeholder={placeholder}\n sx={fieldStyles.sxStandard}\n />\n )}\n />\n </FieldShell>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, shadows } from '../../theme/variables';\n\n/**\n * Estilos del calendario M3 propio de `CmsDateField` (reemplaza al selector\n * nativo del navegador). Superficie gris, día seleccionado y botones en color\n * primario, ancho cómodo y sombra suave, igual que el diseño de referencia.\n */\nexport const datePickerStyles = {\n /** Paper del popover del calendario. */\n sxPaper: {\n width: 312,\n p: '12px 12px 8px',\n borderRadius: '16px',\n bgcolor: 'm3.surfaceContainer',\n backgroundImage: 'none',\n boxShadow: shadows.menu,\n } as SxProps<Theme>,\n\n /** Cabecera: mes/año + navegación. */\n sxHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n px: '6px',\n pb: '8px',\n } as SxProps<Theme>,\n\n sxMonthLabel: {\n fontSize: 14,\n fontWeight: 600,\n color: 'm3.onSurface',\n textTransform: 'capitalize',\n } as SxProps<Theme>,\n\n sxNav: { display: 'inline-flex', gap: '2px' } as SxProps<Theme>,\n\n sxNavBtn: {\n width: 36,\n height: 36,\n color: 'm3.onSurfaceVariant',\n '&:hover': { bgcolor: cmsColors.surfaceHover, color: 'm3.onSurface' },\n } as SxProps<Theme>,\n\n sxGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: '2px',\n } as SxProps<Theme>,\n\n sxDow: {\n height: 32,\n display: 'grid',\n placeItems: 'center',\n fontSize: 11,\n fontWeight: 500,\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /** Celda de día, con sus variantes (otro mes / hoy / seleccionado). */\n sxDay: (opts: {\n other: boolean;\n today: boolean;\n selected: boolean;\n }): SxProps<Theme> => ({\n height: 40,\n border: 0,\n p: 0,\n borderRadius: '999px',\n display: 'grid',\n placeItems: 'center',\n fontSize: 14,\n cursor: 'pointer',\n bgcolor: 'transparent',\n color: 'm3.onSurface',\n transition: 'background-color 0.12s, color 0.12s',\n '&:hover': { bgcolor: cmsColors.surfaceHover },\n ...(opts.other ? { color: 'm3.onSurfaceVariant', opacity: 0.55 } : {}),\n ...(opts.today\n ? { boxShadow: `inset 0 0 0 1px ${cmsColors.primary}`, color: cmsColors.primary }\n : {}),\n ...(opts.selected\n ? {\n bgcolor: cmsColors.primary,\n color: cmsColors.white,\n fontWeight: 600,\n '&:hover': { bgcolor: cmsColors.primaryHover },\n }\n : {}),\n }),\n\n sxFooter: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '4px',\n pt: '6px',\n } as SxProps<Theme>,\n\n sxFooterBtn: {\n height: 36,\n px: '14px',\n borderRadius: '999px',\n textTransform: 'none',\n fontWeight: 500,\n color: cmsColors.primary,\n '&:hover': {\n bgcolor: `color-mix(in oklab, ${cmsColors.primary} 10%, transparent)`,\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport CalendarTodayOutlinedIcon from '@mui/icons-material/CalendarTodayOutlined';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Popover from '@mui/material/Popover';\nimport TextField from '@mui/material/TextField';\nimport { useId, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\nimport {\n getIntlLocaleTag,\n useCmsTranslation,\n} from '../../i18n/useCmsTranslation';\nimport { datePickerStyles } from './CmsDateField.styles';\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\n\nexport type CmsDateFieldProps = {\n /** Valor en formato ISO `AAAA-MM-DD` (controlado; vacío = sin fecha). */\n value: string;\n /** Callback con la nueva fecha ISO (o '' al limpiar). */\n onChange: (value: string) => void;\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : `${n}`;\n}\n\n/** Parsea un ISO `AAAA-MM-DD` a sus partes; `null` si no es válido. */\nfunction parseISO(value: string): { y: number; m: number; d: number } | null {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n if (!match) return null;\n return { y: +match[1], m: +match[2] - 1, d: +match[3] };\n}\n\nfunction toISO(y: number, m: number, d: number): string {\n return `${y}-${pad(m + 1)}-${pad(d)}`;\n}\n\n/**\n * Campo de fecha con calendario Material 3 propio (no el selector nativo del\n * navegador, que no se puede estilar). El valor se maneja en ISO `AAAA-MM-DD` y\n * se muestra como `dd/mm/aaaa`. Los meses y días se rotulan según el idioma del\n * provider. Controlado y reutilizable.\n */\nexport function CmsDateField({\n value,\n onChange,\n label,\n hint,\n disabled = false,\n testId,\n}: CmsDateFieldProps) {\n const id = useId();\n const { t, locale } = useCmsTranslation();\n const s = t.messages.search;\n const localeTag = getIntlLocaleTag(locale);\n\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const [open, setOpen] = useState(false);\n\n const selected = parseISO(value);\n const today = new Date();\n\n // Mes en vista: arranca en la fecha seleccionada o en el mes actual.\n const [view, setView] = useState(() =>\n selected\n ? { y: selected.y, m: selected.m }\n : { y: today.getFullYear(), m: today.getMonth() },\n );\n\n const display = selected\n ? `${pad(selected.d)}/${pad(selected.m + 1)}/${selected.y}`\n : '';\n\n // Nombres de los días (orden lunes→domingo) según el idioma.\n const weekdays = useMemo(() => {\n const fmt = new Intl.DateTimeFormat(localeTag, { weekday: 'short' });\n const monday = new Date(2023, 0, 2); // lunes de referencia\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(monday.getFullYear(), monday.getMonth(), monday.getDate() + i);\n return fmt.format(d).replace('.', '').slice(0, 2);\n });\n }, [localeTag]);\n\n const monthLabel = useMemo(\n () =>\n new Intl.DateTimeFormat(localeTag, {\n month: 'long',\n year: 'numeric',\n }).format(new Date(view.y, view.m, 1)),\n [localeTag, view],\n );\n\n // 42 celdas (6 semanas) empezando en lunes.\n const cells = useMemo(() => {\n const first = new Date(view.y, view.m, 1);\n const startDow = (first.getDay() + 6) % 7;\n return Array.from({ length: 42 }, (_, i) => {\n const date = new Date(view.y, view.m, 1 + (i - startDow));\n return { y: date.getFullYear(), m: date.getMonth(), d: date.getDate() };\n });\n }, [view]);\n\n const openPicker = (event: React.MouseEvent) => {\n if (disabled) return;\n event.preventDefault();\n const host = (event.currentTarget as HTMLElement).closest(\n '[data-cms-datefield]',\n ) as HTMLElement | null;\n setAnchorEl(host);\n setView(\n selected\n ? { y: selected.y, m: selected.m }\n : { y: today.getFullYear(), m: today.getMonth() },\n );\n setOpen(true);\n };\n\n const prevMonth = () =>\n setView((v) => (v.m === 0 ? { y: v.y - 1, m: 11 } : { y: v.y, m: v.m - 1 }));\n const nextMonth = () =>\n setView((v) => (v.m === 11 ? { y: v.y + 1, m: 0 } : { y: v.y, m: v.m + 1 }));\n\n const pickDay = (cell: { y: number; m: number; d: number }) => {\n onChange(toISO(cell.y, cell.m, cell.d));\n setOpen(false);\n };\n\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <Box data-cms-datefield>\n <TextField\n id={id}\n variant=\"standard\"\n value={display}\n placeholder=\"dd/mm/aaaa\"\n disabled={disabled}\n fullWidth\n onClick={openPicker}\n sx={fieldStyles.sxStandard}\n slotProps={{\n input: {\n readOnly: true,\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n edge=\"end\"\n disabled={disabled}\n aria-label={s.dateOpenAriaLabel}\n onClick={openPicker}>\n <CalendarTodayOutlinedIcon sx={{ fontSize: 18 }} />\n </IconButton>\n </InputAdornment>\n ),\n },\n htmlInput: { 'data-testid': testId, style: { cursor: 'pointer' } },\n }}\n />\n </Box>\n\n <Popover\n open={open && Boolean(anchorEl)}\n anchorEl={anchorEl}\n onClose={() => setOpen(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{ paper: { sx: datePickerStyles.sxPaper } }}>\n <Box sx={datePickerStyles.sxHeader}>\n <Box sx={datePickerStyles.sxMonthLabel}>{monthLabel}</Box>\n <Box sx={datePickerStyles.sxNav}>\n <IconButton\n size=\"small\"\n aria-label={s.prevMonthAriaLabel}\n onClick={prevMonth}\n sx={datePickerStyles.sxNavBtn}>\n <ChevronLeftIcon />\n </IconButton>\n <IconButton\n size=\"small\"\n aria-label={s.nextMonthAriaLabel}\n onClick={nextMonth}\n sx={datePickerStyles.sxNavBtn}>\n <ChevronRightIcon />\n </IconButton>\n </Box>\n </Box>\n\n <Box sx={datePickerStyles.sxGrid}>\n {weekdays.map((day, i) => (\n <Box key={`dow-${i}`} sx={datePickerStyles.sxDow}>\n {day}\n </Box>\n ))}\n {cells.map((cell, i) => {\n const other = cell.m !== view.m;\n const isToday =\n cell.y === today.getFullYear() &&\n cell.m === today.getMonth() &&\n cell.d === today.getDate();\n const isSelected =\n !!selected &&\n cell.y === selected.y &&\n cell.m === selected.m &&\n cell.d === selected.d;\n return (\n <Box\n key={`day-${i}`}\n component=\"button\"\n type=\"button\"\n onClick={() => pickDay(cell)}\n sx={datePickerStyles.sxDay({\n other,\n today: isToday,\n selected: isSelected,\n })}>\n {cell.d}\n </Box>\n );\n })}\n </Box>\n\n <Box sx={datePickerStyles.sxFooter}>\n <Button\n sx={datePickerStyles.sxFooterBtn}\n onClick={() => {\n onChange('');\n setOpen(false);\n }}>\n {s.dateClear}\n </Button>\n <Button\n sx={datePickerStyles.sxFooterBtn}\n onClick={() => {\n onChange(toISO(today.getFullYear(), today.getMonth(), today.getDate()));\n setOpen(false);\n }}>\n {s.dateToday}\n </Button>\n </Box>\n </Popover>\n </FieldShell>\n );\n}\n","'use client';\n\nimport Autocomplete from '@mui/material/Autocomplete';\nimport Box from '@mui/material/Box';\nimport Checkbox from '@mui/material/Checkbox';\nimport Chip from '@mui/material/Chip';\nimport TextField from '@mui/material/TextField';\nimport { useId, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { cmsColors } from '../../theme/variables';\nimport { useCmsTranslation } from '../../i18n/useCmsTranslation';\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\nimport type { FieldOption } from './types';\n\nexport type CmsMultiSelectFieldProps = {\n /** Valores seleccionados (controlado). */\n value: string[];\n /** Callback con los nuevos valores. */\n onChange: (value: string[]) => void;\n /** Opciones disponibles. */\n options: FieldOption[];\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder cuando no hay selección (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Texto cuando no hay coincidencias (ya traducido). */\n noOptionsText?: ReactNode;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Campo de selección múltiple con chips y checkboxes en el desplegable\n * (equivale al campo \"Estados\" del diseño). Internamente usa `Autocomplete`\n * múltiple de MUI pero expone una API por `value: string[]`. Reutilizable.\n */\nexport function CmsMultiSelectField({\n value,\n onChange,\n options,\n label,\n placeholder,\n hint,\n noOptionsText,\n disabled = false,\n testId,\n}: CmsMultiSelectFieldProps) {\n const id = useId();\n const { t } = useCmsTranslation();\n const resolvedNoOptions = noOptionsText ?? t.messages.search.noOptions;\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n const selected = useMemo(\n () => visibleOptions.filter((option) => value.includes(option.value)),\n [visibleOptions, value],\n );\n\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <Autocomplete\n id={id}\n data-testid={testId}\n multiple\n disableCloseOnSelect\n options={visibleOptions}\n value={selected}\n disabled={disabled}\n noOptionsText={resolvedNoOptions}\n getOptionLabel={(option) =>\n typeof option.label === 'string' ? option.label : option.value\n }\n getOptionDisabled={(option) => Boolean(option.disabled)}\n isOptionEqualToValue={(option, current) =>\n option.value === current.value\n }\n onChange={(_event, next) => onChange(next.map((option) => option.value))}\n slotProps={{\n paper: { sx: fieldStyles.sxAutocompletePaper },\n listbox: { sx: fieldStyles.sxAutocompleteListbox },\n }}\n renderValue={(items, getItemProps) =>\n items.map((option, index) => {\n const { key, ...chipProps } = getItemProps({ index });\n return (\n <Chip\n key={key}\n label={option.label}\n size=\"small\"\n sx={fieldStyles.sxChip}\n icon={\n option.color ? (\n <Box\n component=\"span\"\n sx={{\n width: 9,\n height: 9,\n borderRadius: '999px',\n bgcolor: option.color,\n ml: '6px',\n flex: 'none',\n }}\n />\n ) : undefined\n }\n {...chipProps}\n />\n );\n })\n }\n renderOption={(props, option, { selected: isSelected }) => {\n const { key, ...liProps } = props;\n return (\n <li key={key} {...liProps}>\n <Checkbox\n checked={isSelected}\n sx={{\n mr: 1,\n p: 0.5,\n color: cmsColors.controlBorder,\n '&.Mui-checked': { color: cmsColors.primary },\n }}\n />\n {option.color && (\n <Box\n component=\"span\"\n sx={{\n width: 9,\n height: 9,\n borderRadius: '999px',\n bgcolor: option.color,\n mr: '8px',\n flex: 'none',\n }}\n />\n )}\n {option.label}\n </li>\n );\n }}\n renderInput={(params) => (\n <TextField\n {...params}\n variant=\"standard\"\n placeholder={selected.length === 0 ? placeholder : undefined}\n sx={fieldStyles.sxStandard}\n />\n )}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport TextField from '@mui/material/TextField';\nimport { useId } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\n\nexport type CmsNumberFieldProps = {\n /** Valor actual como string (controlado; vacío = sin valor). */\n value: string;\n /** Callback con el nuevo valor (string para permitir el campo vacío). */\n onChange: (value: string) => void;\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Valor mínimo permitido. */\n min?: number;\n /** Valor máximo permitido. */\n max?: number;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Campo numérico con la estética estándar del CMS. Mantiene el valor como string\n * para permitir el estado vacío. Controlado y reutilizable.\n */\nexport function CmsNumberField({\n value,\n onChange,\n label,\n placeholder,\n hint,\n min,\n max,\n disabled = false,\n testId,\n}: CmsNumberFieldProps) {\n const id = useId();\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <TextField\n id={id}\n variant=\"standard\"\n type=\"number\"\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n fullWidth\n onChange={(event) => onChange(event.target.value)}\n sx={fieldStyles.sxStandard}\n slotProps={{\n htmlInput: { min, max, inputMode: 'numeric', 'data-testid': testId },\n }}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport Box from '@mui/material/Box';\nimport MenuItem from '@mui/material/MenuItem';\nimport TextField from '@mui/material/TextField';\nimport { useId, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\nimport type { FieldOption } from './types';\n\nexport type CmsSelectFieldProps = {\n /** Valor seleccionado (controlado; vacío = ninguno). */\n value: string;\n /** Callback con el nuevo valor. */\n onChange: (value: string) => void;\n /** Opciones disponibles. */\n options: FieldOption[];\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder mostrado cuando no hay valor (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Muestra el check en la opción activa. Por defecto `true`. */\n showCheck?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Selector de una sola opción tipo formulario (subrayado M3). A diferencia de\n * `SelectDropdown` (píldora para filtros de listado), este es un campo de\n * formulario con etiqueta arriba. El menú resalta la opción activa en\n * `secondary`, hace hover en `secondaryHover`, deja aire entre el borde del\n * contenedor y el resaltado, y marca la activa con un check. Controlado y\n * reutilizable.\n */\nexport function CmsSelectField({\n value,\n onChange,\n options,\n label,\n placeholder,\n hint,\n disabled = false,\n showCheck = true,\n testId,\n}: CmsSelectFieldProps) {\n const id = useId();\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <TextField\n id={id}\n select\n variant=\"standard\"\n value={value}\n disabled={disabled}\n fullWidth\n onChange={(event) => onChange(event.target.value)}\n sx={fieldStyles.sxStandard}\n slotProps={{\n select: {\n displayEmpty: true,\n renderValue: (selected) => {\n const current = visibleOptions.find(\n (option) => option.value === (selected as string),\n );\n if (current) return current.label;\n return <span style={{ opacity: 0.6 }}>{placeholder ?? ''}</span>;\n },\n MenuProps: {\n anchorOrigin: { vertical: 'bottom', horizontal: 'left' },\n transformOrigin: { vertical: 'top', horizontal: 'left' },\n slotProps: {\n paper: { sx: fieldStyles.sxSelectMenuPaper },\n list: { sx: fieldStyles.sxSelectList },\n },\n },\n },\n htmlInput: { 'data-testid': testId },\n }}>\n {placeholder != null && (\n <MenuItem value=\"\" sx={fieldStyles.sxSelectItem}>\n <Box component=\"span\" sx={{ flex: 1, opacity: 0.6 }}>\n {placeholder}\n </Box>\n </MenuItem>\n )}\n {visibleOptions.map((option) => (\n <MenuItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n sx={fieldStyles.sxSelectItem}>\n <Box component=\"span\" sx={{ flex: 1 }}>\n {option.label}\n </Box>\n {showCheck && value === option.value && (\n <CheckIcon sx={fieldStyles.sxSelectCheck} />\n )}\n </MenuItem>\n ))}\n </TextField>\n </FieldShell>\n );\n}\n","'use client';\n\nimport Autocomplete from '@mui/material/Autocomplete';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport TextField from '@mui/material/TextField';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { useId } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\n\nexport type CmsTagsFieldProps = {\n /** Etiquetas actuales (controlado). */\n value: string[];\n /** Callback con las nuevas etiquetas. */\n onChange: (value: string[]) => void;\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder cuando no hay etiquetas (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Sugerencias opcionales para el autocompletado. */\n suggestions?: string[];\n /** Ícono opcional a la izquierda del control (p. ej. una etiqueta/lupa). */\n startIcon?: ReactNode;\n /**\n * `sx` de los chips de etiqueta. Si se pasa, **reemplaza** el estilo por\n * defecto (`fieldStyles.sxChip`, primario tenue), permitiendo p. ej. usar el\n * color secundario.\n */\n chipSx?: SxProps<Theme>;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Campo de etiquetas libres: se escribe y se presiona Enter para agregar chips\n * (equivale al campo \"Etiquetas\" del diseño). Internamente usa `Autocomplete`\n * `freeSolo` múltiple. Controlado y reutilizable.\n */\nexport function CmsTagsField({\n value,\n onChange,\n label,\n placeholder,\n hint,\n suggestions = [],\n startIcon,\n chipSx,\n disabled = false,\n testId,\n}: CmsTagsFieldProps) {\n const id = useId();\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <Autocomplete\n id={id}\n data-testid={testId}\n multiple\n freeSolo\n options={suggestions}\n value={value}\n disabled={disabled}\n onChange={(_event, next) =>\n onChange(\n next\n .map((item) => (typeof item === 'string' ? item.trim() : ''))\n .filter((item, index, all) => item && all.indexOf(item) === index),\n )\n }\n slotProps={{ paper: { sx: fieldStyles.sxAutocompletePaper } }}\n renderValue={(items, getItemProps) =>\n items.map((item, index) => {\n const { key, ...chipProps } = getItemProps({ index });\n return (\n <Chip\n key={key}\n label={item}\n size=\"small\"\n sx={chipSx ?? fieldStyles.sxChip}\n {...chipProps}\n />\n );\n })\n }\n renderInput={(params) => (\n <TextField\n {...params}\n variant=\"standard\"\n placeholder={value.length === 0 ? placeholder : undefined}\n sx={fieldStyles.sxStandard}\n slotProps={\n startIcon\n ? {\n ...params.slotProps,\n input: {\n ...params.slotProps.input,\n startAdornment: (\n <>\n <Box\n component=\"span\"\n sx={{\n display: 'inline-flex',\n color: 'm3.onSurfaceVariant',\n mr: 0.5,\n }}>\n {startIcon}\n </Box>\n {params.slotProps.input.startAdornment}\n </>\n ),\n },\n }\n : params.slotProps\n }\n />\n )}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport TextField from '@mui/material/TextField';\nimport { useId } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\n\nexport type CmsTextFieldProps = {\n /** Valor actual (controlado). */\n value: string;\n /** Callback con el nuevo texto. */\n onChange: (value: string) => void;\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Tipo HTML del input. Por defecto `text`. */\n type?: 'text' | 'email' | 'url';\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Campo de texto de una línea con la estética estándar del CMS (etiqueta arriba,\n * subrayado inferior). Controlado: el consumidor pasa `value` y `onChange`.\n * Reutilizable en cualquier formulario.\n */\nexport function CmsTextField({\n value,\n onChange,\n label,\n placeholder,\n hint,\n type = 'text',\n disabled = false,\n testId,\n}: CmsTextFieldProps) {\n const id = useId();\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <TextField\n id={id}\n variant=\"standard\"\n type={type}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n fullWidth\n onChange={(event) => onChange(event.target.value)}\n sx={fieldStyles.sxStandard}\n slotProps={{ htmlInput: { 'data-testid': testId } }}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport { CmsCheckboxField } from './CmsCheckboxField';\nimport { CmsComboboxField } from './CmsComboboxField';\nimport { CmsDateField } from './CmsDateField';\nimport { CmsMultiSelectField } from './CmsMultiSelectField';\nimport { CmsNumberField } from './CmsNumberField';\nimport { CmsSelectField } from './CmsSelectField';\nimport { CmsTagsField } from './CmsTagsField';\nimport { CmsTextField } from './CmsTextField';\nimport type { FieldConfig, FieldValue } from './types';\n\nexport type FieldRendererProps = {\n /** Configuración del campo a renderizar. */\n field: FieldConfig;\n /** Valor actual del campo. */\n value: FieldValue | undefined;\n /** Callback con el nuevo valor del campo. */\n onChange: (value: FieldValue) => void;\n};\n\n/**\n * Renderiza el componente de campo que corresponde a una `FieldConfig`,\n * resolviendo el tipo de valor por cada `kind`. Es el puente entre la\n * configuración declarativa del modal y los componentes de campo concretos.\n */\nexport function FieldRenderer({ field, value, onChange }: FieldRendererProps) {\n const asString = typeof value === 'string' ? value : '';\n const asArray = Array.isArray(value) ? value : [];\n const asBool = value === true;\n\n switch (field.kind) {\n case 'text':\n return (\n <CmsTextField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n type={field.type}\n disabled={field.disabled}\n testId={field.testId}\n value={asString}\n onChange={onChange}\n />\n );\n case 'number':\n return (\n <CmsNumberField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n min={field.min}\n max={field.max}\n disabled={field.disabled}\n testId={field.testId}\n value={asString}\n onChange={onChange}\n />\n );\n case 'date':\n return (\n <CmsDateField\n label={field.label}\n hint={field.hint}\n disabled={field.disabled}\n testId={field.testId}\n value={asString}\n onChange={onChange}\n />\n );\n case 'select':\n return (\n <CmsSelectField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n options={field.options}\n disabled={field.disabled}\n showCheck={field.showCheck}\n testId={field.testId}\n value={asString}\n onChange={onChange}\n />\n );\n case 'combobox':\n return (\n <CmsComboboxField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n options={field.options}\n disabled={field.disabled}\n testId={field.testId}\n value={asString}\n onChange={onChange}\n />\n );\n case 'multiselect':\n return (\n <CmsMultiSelectField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n options={field.options}\n disabled={field.disabled}\n testId={field.testId}\n value={asArray}\n onChange={onChange}\n />\n );\n case 'tags':\n return (\n <CmsTagsField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n disabled={field.disabled}\n testId={field.testId}\n value={asArray}\n onChange={onChange}\n />\n );\n case 'checkbox':\n return (\n <CmsCheckboxField\n label={field.label}\n disabled={field.disabled}\n testId={field.testId}\n value={asBool}\n onChange={onChange}\n />\n );\n default:\n return null;\n }\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, radii, shadows, sizes } from '../../theme/variables';\n\n/**\n * Estilos del `CmsAdvancedSearch` — el contenedor de \"Búsqueda avanzada\" en sus\n * dos presentaciones: modal centrado (como el gestor de Noticias) y panel\n * lateral derecho (como Imágenes/Videos). Comparten cabecera, cuerpo en grilla y\n * pie con Restablecer + Aplicar.\n */\nexport const CmsAdvancedSearchStyles = {\n /** Paper del modal centrado. */\n sxModalPaper: {\n width: 'min(1080px, calc(100vw - 48px))',\n maxWidth: 'none',\n borderRadius: radii.xl,\n bgcolor: 'm3.surfaceContainerLowest',\n backgroundImage: 'none',\n } as SxProps<Theme>,\n\n /** Paper del panel lateral. */\n sxDrawerPaper: (drawerWidth: number | string): SxProps<Theme> => ({\n width: drawerWidth,\n maxWidth: '100vw',\n bgcolor: 'm3.surfaceContainerLow',\n backgroundImage: 'none',\n display: 'flex',\n flexDirection: 'column',\n }),\n\n /** Layout vertical interno (cabecera / cuerpo / pie). */\n sxContainer: {\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n maxHeight: '100%',\n } as SxProps<Theme>,\n\n /** Cabecera con ícono + título + cerrar. */\n sxHead: {\n flex: 'none',\n display: 'flex',\n alignItems: 'center',\n gap: '14px',\n px: '24px',\n py: '18px',\n borderBottom: '1px solid',\n borderColor: 'm3.outlineVariant',\n } as SxProps<Theme>,\n\n /** Ícono de la cabecera (cuadro con tinte primario). */\n sxHeadIcon: {\n width: 44,\n height: 44,\n flex: 'none',\n display: 'grid',\n placeItems: 'center',\n borderRadius: radii.lg,\n bgcolor: `color-mix(in oklab, ${cmsColors.primary} 14%, transparent)`,\n color: cmsColors.primary,\n '& .MuiSvgIcon-root': { fontSize: 24 },\n } as SxProps<Theme>,\n\n /** Título. */\n sxTitle: {\n flex: 1,\n minWidth: 0,\n fontSize: 22,\n fontWeight: 500,\n lineHeight: '28px',\n color: 'm3.onSurface',\n } as SxProps<Theme>,\n\n /** Botón cerrar. */\n sxClose: {\n flex: 'none',\n color: 'm3.onSurfaceVariant',\n '&:hover': { bgcolor: cmsColors.surfaceHover },\n } as SxProps<Theme>,\n\n /** Cuerpo desplazable. */\n sxBody: {\n flex: '1 1 auto',\n minHeight: 0,\n overflowY: 'auto',\n px: '24px',\n py: '24px',\n } as SxProps<Theme>,\n\n /** Grilla de campos. `columns` controla el modal; el drawer fuerza 1 columna. */\n sxGrid: (columns: number, single: boolean): SxProps<Theme> => ({\n display: 'grid',\n gap: '18px 22px',\n alignItems: 'start',\n gridTemplateColumns: single ? '1fr' : `repeat(${columns}, minmax(0, 1fr))`,\n }),\n\n /** Pie con acciones. */\n sxFoot: {\n flex: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: '12px',\n px: '24px',\n py: '16px',\n borderTop: '1px solid',\n borderColor: 'm3.outlineVariant',\n bgcolor: 'm3.surfaceContainer',\n } as SxProps<Theme>,\n\n /** Botón \"Restablecer\" (texto). */\n sxReset: {\n height: sizes.buttonHeight,\n px: '16px',\n borderRadius: radii.pill,\n textTransform: 'none',\n fontWeight: 500,\n color: cmsColors.primary,\n '&:hover': {\n bgcolor: `color-mix(in oklab, ${cmsColors.primary} 8%, transparent)`,\n },\n '&.Mui-disabled': { color: 'm3.onSurface', opacity: 0.38 },\n } as SxProps<Theme>,\n\n /** Botón \"Aplicar\" (relleno primario). */\n sxApply: {\n height: sizes.buttonHeight,\n px: '24px',\n borderRadius: radii.pill,\n textTransform: 'none',\n fontWeight: 600,\n gap: '8px',\n bgcolor: cmsColors.primary,\n color: cmsColors.white,\n boxShadow: shadows.button,\n '&:hover': { bgcolor: cmsColors.primaryHover },\n '& .MuiSvgIcon-root': { fontSize: 18 },\n } as SxProps<Theme>,\n};\n","import type { CmsTranslator } from '../../i18n/createTranslator';\nimport type { FieldConfig } from '../fields/types';\n\n/**\n * Construye el catálogo estándar de campos de \"Búsqueda avanzada\" del CMS con\n * los textos por defecto de la librería (resueltos al idioma activo). Es lo que\n * usa `CmsAdvancedSearch` cuando el consumidor no pasa `fields`.\n *\n * Los campos de datos (sección, categoría, creador, autor, grupos, zona) traen\n * `options: []`: sus etiquetas/placeholder vienen traducidos de la lib, pero las\n * opciones reales las inyecta cada gestor (son datos del backend). Los campos de\n * enum fijo (tipo, estados, orden, prioridad, dirección) sí traen sus opciones\n * por defecto, también traducidas.\n *\n * @param t - Traductor de la lib (`useCmsTranslation().t`).\n * @returns Lista de campos lista para `CmsAdvancedSearch`.\n */\nexport function buildDefaultSearchFields(t: CmsTranslator): FieldConfig[] {\n const f = t.messages.searchFields;\n const o = t.messages.searchOptions;\n\n return [\n { kind: 'text', name: 'text', label: f.text, placeholder: f.textPlaceholder, span: 3 },\n {\n kind: 'select',\n name: 'type',\n label: f.type,\n placeholder: f.typePlaceholder,\n options: [\n { value: 'news', label: o.typeNews },\n { value: 'list', label: o.typeList },\n { value: 'liveblog', label: o.typeLiveblog },\n ],\n },\n {\n kind: 'select',\n name: 'section',\n label: f.section,\n placeholder: f.sectionPlaceholder,\n options: [],\n },\n {\n kind: 'select',\n name: 'category',\n label: f.category,\n placeholder: f.categoryPlaceholder,\n options: [],\n },\n {\n kind: 'multiselect',\n name: 'states',\n label: f.states,\n placeholder: f.statesPlaceholder,\n options: [\n { value: 'published', label: o.statePublished },\n { value: 'draft', label: o.stateDraft },\n { value: 'scheduled', label: o.stateScheduled },\n { value: 'review', label: o.stateReview },\n { value: 'done', label: o.stateDone },\n ],\n },\n {\n kind: 'combobox',\n name: 'creator',\n label: f.creator,\n placeholder: f.creatorPlaceholder,\n options: [],\n },\n {\n kind: 'combobox',\n name: 'author',\n label: f.author,\n placeholder: f.authorPlaceholder,\n options: [],\n },\n { kind: 'tags', name: 'tags', label: f.tags, placeholder: f.tagsPlaceholder },\n {\n kind: 'select',\n name: 'groups',\n label: f.groups,\n placeholder: f.groupsPlaceholder,\n options: [],\n },\n {\n kind: 'number',\n name: 'amount',\n label: f.amount,\n placeholder: f.amountPlaceholder,\n min: 1,\n },\n { kind: 'date', name: 'dateFrom', label: f.dateFrom },\n { kind: 'date', name: 'dateTo', label: f.dateTo },\n {\n kind: 'select',\n name: 'sortBy',\n label: f.sortBy,\n placeholder: f.sortByPlaceholder,\n options: [\n { value: 'relevance', label: o.sortRelevance },\n { value: 'date', label: o.sortDate },\n { value: 'title', label: o.sortTitle },\n ],\n },\n {\n kind: 'select',\n name: 'zone',\n label: f.zone,\n placeholder: f.zonePlaceholder,\n options: [],\n },\n {\n kind: 'select',\n name: 'priority',\n label: f.priority,\n placeholder: f.priorityPlaceholder,\n options: [\n { value: 'high', label: o.priorityHigh },\n { value: 'mid', label: o.priorityMid },\n { value: 'low', label: o.priorityLow },\n ],\n },\n {\n kind: 'select',\n name: 'order',\n label: f.order,\n placeholder: f.orderPlaceholder,\n options: [\n { value: 'desc', label: o.orderDesc },\n { value: 'asc', label: o.orderAsc },\n ],\n },\n { kind: 'checkbox', name: 'includeDrafts', label: f.includeDrafts, span: 1 },\n { kind: 'checkbox', name: 'includeHistory', label: f.includeHistory, span: 2 },\n ];\n}\n","'use client';\n\nimport CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';\nimport FilterAltOutlinedIcon from '@mui/icons-material/FilterAltOutlined';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport Drawer from '@mui/material/Drawer';\nimport IconButton from '@mui/material/IconButton';\nimport { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { useCmsTranslation } from '../../i18n/useCmsTranslation';\nimport { FieldRenderer } from '../fields/FieldRenderer';\nimport type { FieldConfig, FieldValue, FieldValues } from '../fields/types';\nimport { CmsAdvancedSearchStyles } from './CmsAdvancedSearch.styles';\nimport { buildDefaultSearchFields } from './defaultFields';\n\n/** Presentación del contenedor de búsqueda avanzada. */\nexport type CmsAdvancedSearchVariant = 'modal' | 'drawer';\n\nexport type CmsAdvancedSearchProps = {\n /** Si el contenedor está abierto. */\n open: boolean;\n /** Callback al cerrar (botón X, scrim o Escape). */\n onClose: () => void;\n /** Modal centrado o panel lateral derecho. Por defecto `modal`. */\n variant?: CmsAdvancedSearchVariant;\n /** Título. Por defecto el de la lib (\"Búsqueda avanzada\", según idioma). */\n title?: ReactNode;\n /** Ícono de la cabecera. Por defecto un embudo de filtro. */\n titleIcon?: ReactNode;\n /**\n * Campos a mostrar. Si se omite, usa el catálogo estándar de la lib\n * (`buildDefaultSearchFields`) ya traducido. Cada gestor puede pasar solo los\n * campos que necesita o partir del catálogo por defecto y ajustar opciones.\n */\n fields?: FieldConfig[];\n /** Valores iniciales (al abrir se sincroniza el borrador con estos). */\n initialValues?: FieldValues;\n /** Callback al aplicar, con los valores del formulario. */\n onApply: (values: FieldValues) => void;\n /** Callback al restablecer (luego de limpiar el borrador). */\n onReset?: () => void;\n /** Texto del botón aplicar. Por defecto el de la lib. */\n applyLabel?: ReactNode;\n /** Texto del botón restablecer. Por defecto el de la lib. */\n resetLabel?: ReactNode;\n /** `aria-label` del botón cerrar. Por defecto el de la lib. */\n closeAriaLabel?: string;\n /** Columnas de la grilla en variante modal. Por defecto `3`. */\n columns?: number;\n /** Ancho del panel lateral. Por defecto `360`. */\n drawerWidth?: number | string;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/** Devuelve el valor vacío que corresponde a cada tipo de campo. */\nfunction emptyValueFor(field: FieldConfig): FieldValue {\n switch (field.kind) {\n case 'multiselect':\n case 'tags':\n return [];\n case 'checkbox':\n return false;\n default:\n return '';\n }\n}\n\n/**\n * Contenedor de \"Búsqueda avanzada\" reutilizable y declarativo. Recibe una lista\n * de `fields` y los renderiza en una grilla, manejando el estado del formulario\n * internamente. Se presenta como modal centrado o panel lateral derecho según\n * `variant`. El mismo componente sirve a cualquier gestor: solo cambian los\n * campos que se le pasan.\n */\nexport function CmsAdvancedSearch({\n open,\n onClose,\n variant = 'modal',\n title,\n titleIcon,\n fields,\n initialValues,\n onApply,\n onReset,\n applyLabel,\n resetLabel,\n closeAriaLabel,\n columns = 3,\n drawerWidth = 360,\n testId,\n}: CmsAdvancedSearchProps) {\n // Defaults desde la lib (resueltos al idioma del provider): campos, título y\n // textos de los botones. El consumidor puede sobrescribir cualquiera por prop.\n const { t } = useCmsTranslation();\n const s = t.messages.search;\n const resolvedFields = useMemo(\n () => fields ?? buildDefaultSearchFields(t),\n [fields, t],\n );\n const resolvedTitle = title ?? s.title;\n const resolvedApply = applyLabel ?? s.apply;\n const resolvedReset = resetLabel ?? s.reset;\n const resolvedCloseAria = closeAriaLabel ?? s.close;\n\n /** Borrador con los valores por defecto de cada campo + los iniciales. */\n const defaults = useMemo(() => {\n const base: FieldValues = {};\n for (const field of resolvedFields) base[field.name] = emptyValueFor(field);\n return { ...base, ...initialValues };\n }, [resolvedFields, initialValues]);\n\n const [draft, setDraft] = useState<FieldValues>(defaults);\n\n // Al abrir, reinicia el borrador con los valores iniciales vigentes. Se ajusta\n // el estado durante el render (patrón de React para \"estado derivado de un\n // cambio de prop\"), evitando un efecto con setState.\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setDraft(defaults);\n }\n\n /** Actualiza el valor de un campo del borrador. */\n const handleChange = (name: string, value: FieldValue) => {\n setDraft((prev) => ({ ...prev, [name]: value }));\n };\n\n /** Limpia todos los campos y notifica el restablecimiento. */\n const handleReset = () => {\n const cleared: FieldValues = {};\n for (const field of resolvedFields) cleared[field.name] = emptyValueFor(field);\n setDraft(cleared);\n onReset?.();\n };\n\n /** Aplica el borrador y cierra. */\n const handleApply = () => {\n onApply(draft);\n onClose();\n };\n\n const single = variant === 'drawer';\n\n const content = (\n <Box sx={CmsAdvancedSearchStyles.sxContainer} data-testid={testId}>\n <Box sx={CmsAdvancedSearchStyles.sxHead}>\n <Box sx={CmsAdvancedSearchStyles.sxHeadIcon}>\n {titleIcon ?? <FilterAltOutlinedIcon />}\n </Box>\n <Box component=\"h2\" sx={CmsAdvancedSearchStyles.sxTitle}>\n {resolvedTitle}\n </Box>\n <IconButton\n aria-label={resolvedCloseAria}\n onClick={onClose}\n sx={CmsAdvancedSearchStyles.sxClose}\n data-testid={testId ? `${testId}-icon-btn-close` : undefined}>\n <CloseOutlinedIcon />\n </IconButton>\n </Box>\n\n <Box sx={CmsAdvancedSearchStyles.sxBody}>\n <Box sx={CmsAdvancedSearchStyles.sxGrid(columns, single)}>\n {resolvedFields.map((field) => (\n <Box\n key={field.name}\n sx={{\n gridColumn:\n !single && field.span && field.span > 1\n ? `span ${field.span}`\n : undefined,\n }}>\n <FieldRenderer\n field={field}\n value={draft[field.name]}\n onChange={(value) => handleChange(field.name, value)}\n />\n </Box>\n ))}\n </Box>\n </Box>\n\n <Box sx={CmsAdvancedSearchStyles.sxFoot}>\n <Button\n type=\"button\"\n disableElevation\n onClick={handleReset}\n sx={CmsAdvancedSearchStyles.sxReset}\n data-testid={testId ? `${testId}-btn-reset` : undefined}>\n {resolvedReset}\n </Button>\n <Button\n type=\"button\"\n disableElevation\n onClick={handleApply}\n startIcon={<FilterAltOutlinedIcon />}\n sx={CmsAdvancedSearchStyles.sxApply}\n data-testid={testId ? `${testId}-btn-apply` : undefined}>\n {resolvedApply}\n </Button>\n </Box>\n </Box>\n );\n\n if (variant === 'drawer') {\n return (\n <Drawer\n anchor=\"right\"\n open={open}\n onClose={onClose}\n slotProps={{\n paper: { sx: CmsAdvancedSearchStyles.sxDrawerPaper(drawerWidth) },\n }}>\n {content}\n </Drawer>\n );\n }\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n maxWidth={false}\n slotProps={{ paper: { sx: CmsAdvancedSearchStyles.sxModalPaper } }}>\n {content}\n </Dialog>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii } from '../../theme/variables';\n\n/**\n * Estilos del `CmsConfirmDialog` — modal de confirmación con ícono, título,\n * descripción y botones, todo opcional. Contenido alineado a la izquierda y\n * acciones a la derecha. Réplica funcional del `confirm-modal` del Angular\n * legacy (`cmsmedios-ux`) construida con MUI + variables del theme.\n */\nexport const CmsConfirmDialogStyles = {\n /**\n * Paper del modal: por defecto crece con el contenido respetando los mínimos\n * (ancho 420, alto 280). Si se pasa `width`, el ancho queda fijo.\n */\n sxPaper: (\n width: number | string | undefined,\n minWidth: number | string,\n minHeight: number | string,\n ): SxProps<Theme> => ({\n position: 'relative',\n width: width ?? 'auto',\n minWidth,\n maxWidth: 'calc(100vw - 32px)',\n minHeight,\n m: 2,\n px: '32px',\n py: '32px',\n borderRadius: radii.dialog,\n bgcolor: 'm3.surfaceContainerHigh',\n backgroundImage: 'none',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n justifyContent: 'flex-start',\n gap: '16px',\n }),\n\n /** Botón \"X\" de cerrar (dentro, esquina superior derecha). 14×14. */\n sxClose: {\n position: 'absolute',\n top: 16,\n right: 16,\n p: 0.5,\n color: cmsColors.textNav,\n '& .MuiSvgIcon-root': { width: 14, height: 14, fontSize: 14 },\n } as SxProps<Theme>,\n\n /** Badge circular del ícono opcional, tintado con el color de acento. */\n sxIcon: (accent: string): SxProps<Theme> => ({\n width: 48,\n height: 48,\n flex: 'none',\n display: 'grid',\n placeItems: 'center',\n borderRadius: '50%',\n bgcolor: `color-mix(in oklab, ${accent} 16%, transparent)`,\n color: accent,\n '& .MuiSvgIcon-root': { fontSize: 24 },\n }),\n\n /** Título: M3 title-large — Google Sans 500 22/28, texto fuerte. Respeta saltos de línea. */\n sxTitle: {\n m: 0,\n fontFamily: fontFamilies.googleSans,\n fontSize: 22,\n fontWeight: 500,\n lineHeight: '28px',\n color: cmsColors.textStrong,\n whiteSpace: 'pre-line',\n } as SxProps<Theme>,\n\n /** Descripción: Google Sans 14/400. Admite negrita (`b`/`strong`) y enlaces (`a`). */\n sxDescription: {\n m: 0,\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 400,\n lineHeight: 1.5,\n color: cmsColors.textStrong,\n whiteSpace: 'pre-line',\n '& b, & strong': { fontWeight: 700 },\n '& a': {\n color: cmsColors.link,\n fontWeight: 700,\n textDecoration: 'underline',\n cursor: 'pointer',\n },\n } as SxProps<Theme>,\n\n /** Contenedor de la fila de botones (empuja al fondo del modal). */\n sxActions: {\n width: '100%',\n mt: 'auto',\n pt: '8px',\n } as SxProps<Theme>,\n};\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport type { SystemStyleObject } from '@mui/system';\n\nimport { cmsColors, fontFamilies, radii, sizes } from '../../theme/variables';\n\n/** Alineación horizontal de la fila de botones. */\nexport type CmsDialogActionsAlign = 'start' | 'center' | 'end' | 'between';\n\n/** Color del botón \"Confirmar/Enviar\": CTA primario (azul) o destructivo (rojo). */\nexport type CmsConfirmColor = 'primary' | 'danger';\n\nconst JUSTIFY: Record<CmsDialogActionsAlign, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n};\n\n/**\n * Estilos de `CmsDialogActions` — la fila de botones (cancelar + confirmar) del\n * modal de confirmación. El \"cancelar\" es un botón tipo texto (transparente, con\n * hover secundario) y el \"confirmar\" es un CTA relleno (primario o destructivo).\n * Ambos pueden crecer para repartir el ancho disponible del padre (`sxGrow`).\n */\nexport const CmsDialogActionsStyles = {\n /** Contenedor flex de los botones (10px de separación). */\n sxRoot: (align: CmsDialogActionsAlign): SxProps<Theme> => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: JUSTIFY[align],\n gap: '10px',\n width: '100%',\n }),\n\n /** Hace que un botón crezca y reparta el ancho del contenedor. */\n sxGrow: { flex: 1 } as SxProps<Theme>,\n\n /** Botón \"Cancelar\": transparente, label primario, hover state layer primario 8%. */\n sxCancel: {\n height: sizes.buttonHeight,\n px: '16px',\n borderRadius: radii.pill,\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n color: cmsColors.primary,\n bgcolor: 'transparent',\n boxShadow: 'none',\n // Hover según Material: primario al 8% sobre transparente (state layer).\n '&:hover': {\n bgcolor: `color-mix(in oklab, ${cmsColors.primary} 8%, transparent)`,\n boxShadow: 'none',\n },\n '&.Mui-disabled': { color: cmsColors.primary, opacity: 0.38 },\n } as SxProps<Theme>,\n\n /** Botón \"Cancelar\" con `flex: 1` opcional para repartir ancho. */\n sxCancelButton: (fullWidth: boolean): SystemStyleObject<Theme> => ({\n ...(CmsDialogActionsStyles.sxCancel as SystemStyleObject<Theme>),\n ...(fullWidth ? (CmsDialogActionsStyles.sxGrow as SystemStyleObject<Theme>) : {}),\n }),\n\n /** Botón \"Confirmar/Enviar\" con `flex: 1` opcional para repartir ancho. */\n sxConfirmButton: (\n color: CmsConfirmColor,\n fullWidth: boolean,\n ): SystemStyleObject<Theme> => ({\n ...(CmsDialogActionsStyles.sxConfirm(color) as SystemStyleObject<Theme>),\n ...(fullWidth ? (CmsDialogActionsStyles.sxGrow as SystemStyleObject<Theme>) : {}),\n }),\n\n /** Botón \"Confirmar/Enviar\": relleno, label blanco, con su hover por color. */\n sxConfirm: (color: CmsConfirmColor): SxProps<Theme> => {\n const bg = color === 'danger' ? cmsColors.danger : cmsColors.primary;\n const hover = color === 'danger' ? cmsColors.dangerHover : cmsColors.primaryHover;\n return {\n height: sizes.buttonHeight,\n px: '24px',\n borderRadius: radii.pill,\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n color: cmsColors.white,\n bgcolor: bg,\n boxShadow: 'none',\n '& .MuiButton-startIcon': { mr: '6px' },\n '& .MuiSvgIcon-root': { fontSize: 18 },\n '&:hover': { bgcolor: hover, boxShadow: 'none' },\n '&.Mui-disabled': { bgcolor: bg, color: cmsColors.white, opacity: 0.5 },\n };\n },\n};\n","'use client';\n\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport type { ReactNode } from 'react';\n\nimport {\n CmsDialogActionsStyles,\n type CmsConfirmColor,\n type CmsDialogActionsAlign,\n} from './CmsDialogActions.styles';\n\nexport type { CmsConfirmColor, CmsDialogActionsAlign };\n\nexport type CmsDialogActionsProps = {\n /** Label del botón \"Cancelar\". Si se omite, ese botón no se muestra. */\n cancelLabel?: ReactNode;\n /** Acción del botón \"Cancelar\". */\n onCancel?: () => void;\n /** Label del botón \"Confirmar/Enviar\". Si se omite, ese botón no se muestra. */\n confirmLabel?: ReactNode;\n /** Acción del botón \"Confirmar/Enviar\". */\n onConfirm?: () => void;\n /** Ícono opcional al inicio del botón \"Confirmar/Enviar\". */\n confirmIcon?: ReactNode;\n /** Color del botón \"Confirmar/Enviar\": `primary` (azul) o `danger` (rojo). */\n confirmColor?: CmsConfirmColor;\n /** Deshabilita el botón \"Cancelar\". */\n cancelDisabled?: boolean;\n /** Deshabilita el botón \"Confirmar/Enviar\". */\n confirmDisabled?: boolean;\n /**\n * Si los botones crecen para repartir el ancho del contenedor padre. Por\n * defecto `true`. Con un solo botón, ocupa todo el ancho disponible.\n */\n fullWidth?: boolean;\n /** Alineación horizontal de los botones. Por defecto `end`. */\n align?: CmsDialogActionsAlign;\n /**\n * Base para los `data-testid`. El contenedor usa `testId`; el botón cancelar\n * emite `${testId}-btn-cancel` y el de confirmar `${testId}-btn-confirm`\n * (cada uno con su `data-action` `cancel` / `confirm` como atributo extra).\n */\n testId?: string;\n};\n\n/**\n * Fila de acciones del modal de confirmación. Muestra 1 o 2 botones según los\n * labels que reciba: el de \"Cancelar\" (tipo texto) y/o el de \"Confirmar/Enviar\"\n * (CTA primario o destructivo, con ícono opcional). Reutilizable de forma\n * independiente del modal.\n */\nexport function CmsDialogActions({\n cancelLabel,\n onCancel,\n confirmLabel,\n onConfirm,\n confirmIcon,\n confirmColor = 'primary',\n cancelDisabled,\n confirmDisabled,\n fullWidth = true,\n align = 'end',\n testId,\n}: CmsDialogActionsProps) {\n const hasCancel = cancelLabel != null;\n const hasConfirm = confirmLabel != null;\n if (!hasCancel && !hasConfirm) return null;\n\n return (\n <Box sx={CmsDialogActionsStyles.sxRoot(align)} data-testid={testId}>\n {hasCancel && (\n <Button\n type=\"button\"\n disableElevation\n onClick={onCancel}\n disabled={cancelDisabled}\n sx={CmsDialogActionsStyles.sxCancelButton(fullWidth)}\n data-testid={testId ? `${testId}-btn-cancel` : undefined}\n data-action=\"cancel\">\n {cancelLabel}\n </Button>\n )}\n {hasConfirm && (\n <Button\n type=\"button\"\n disableElevation\n onClick={onConfirm}\n disabled={confirmDisabled}\n startIcon={confirmIcon ?? undefined}\n sx={CmsDialogActionsStyles.sxConfirmButton(confirmColor, fullWidth)}\n data-testid={testId ? `${testId}-btn-confirm` : undefined}\n data-action=\"confirm\">\n {confirmLabel}\n </Button>\n )}\n </Box>\n );\n}\n","'use client';\n\nimport CloseIcon from '@mui/icons-material/Close';\nimport Box from '@mui/material/Box';\nimport Dialog from '@mui/material/Dialog';\nimport IconButton from '@mui/material/IconButton';\nimport type { PaperProps } from '@mui/material/Paper';\nimport type { ReactNode } from 'react';\n\nimport { cmsColors } from '../../theme/variables';\nimport { CmsConfirmDialogStyles } from './CmsConfirmDialog.styles';\nimport { CmsDialogActions } from './CmsDialogActions';\nimport type {\n CmsConfirmColor,\n CmsDialogActionsAlign,\n} from './CmsDialogActions.styles';\n\nexport type CmsConfirmDialogProps = {\n /** Si el modal está abierto. */\n open: boolean;\n /** Callback al cerrar (botón X, scrim o Escape). */\n onClose: () => void;\n /** Ícono opcional (se muestra en un badge circular sobre el título). */\n icon?: ReactNode;\n /** Color de acento del badge del ícono. Por defecto el texto de navegación. */\n iconColor?: string;\n /** Título opcional. M3 title-large (Google Sans 500 22/28). Admite `\\n` para saltos de línea. */\n title?: ReactNode;\n /**\n * Descripción opcional. Google Sans 14/400. Puede incluir negrita (`<b>`/`<strong>`)\n * y enlaces (`<a>`); ambos se estilan según el diseño.\n */\n description?: ReactNode;\n /** Muestra el botón \"X\" de cerrar (dentro, arriba a la derecha). Por defecto `true`. */\n showClose?: boolean;\n /** `aria-label` del botón cerrar. */\n closeAriaLabel?: string;\n /** Label del botón \"Cancelar\". Si se omite, no se muestra. */\n cancelLabel?: ReactNode;\n /** Acción del botón \"Cancelar\". Por defecto cierra el modal (`onClose`). */\n onCancel?: () => void;\n /** Label del botón \"Confirmar/Enviar\". Si se omite, no se muestra. */\n confirmLabel?: ReactNode;\n /** Acción del botón \"Confirmar/Enviar\". */\n onConfirm?: () => void;\n /** Ícono opcional al inicio del botón \"Confirmar/Enviar\". */\n confirmIcon?: ReactNode;\n /** Color del botón \"Confirmar/Enviar\": `primary` (azul) o `danger` (rojo). */\n confirmColor?: CmsConfirmColor;\n /** Deshabilita el botón \"Cancelar\". */\n cancelDisabled?: boolean;\n /** Deshabilita el botón \"Confirmar/Enviar\". */\n confirmDisabled?: boolean;\n /** Los botones reparten el ancho del modal. Por defecto `false`. */\n fullWidthActions?: boolean;\n /** Alineación de los botones. Por defecto `end` (a la derecha). */\n actionsAlign?: CmsDialogActionsAlign;\n /** Ancho fijo del modal. Si se omite, crece con el contenido (respetando `minWidth`). */\n width?: number | string;\n /** Ancho mínimo del modal. Por defecto `420`. */\n minWidth?: number | string;\n /** Alto mínimo del modal (crece con el contenido). Por defecto `280`. */\n minHeight?: number | string;\n /** Evita cerrar al hacer clic fuera o con Escape (p. ej. mientras carga). */\n disableBackdropClose?: boolean;\n /**\n * Base para los `data-testid`. Emite: `${testId}` (modal),\n * `${testId}-icon-btn-close` (botón X), `${testId}-actions` (fila de botones)\n * y los botones `${testId}-actions-btn-cancel` y `${testId}-actions-btn-confirm`.\n */\n testId?: string;\n};\n\n/**\n * Modal de confirmación reutilizable: ícono, título, descripción y 1–2 botones,\n * todo opcional. Contenido alineado a la izquierda, acciones a la derecha y \"X\"\n * de cerrar dentro del modal. Réplica funcional del `confirm-modal` del Angular\n * legacy (`cmsmedios-ux`) con MUI + el theme de la lib. Los textos (i18n) los\n * pasa el gestor; este componente solo presenta.\n */\nexport function CmsConfirmDialog({\n open,\n onClose,\n icon,\n iconColor = cmsColors.textNav,\n title,\n description,\n showClose = true,\n closeAriaLabel,\n cancelLabel,\n onCancel,\n confirmLabel,\n onConfirm,\n confirmIcon,\n confirmColor = 'primary',\n cancelDisabled,\n confirmDisabled,\n fullWidthActions = false,\n actionsAlign = 'end',\n width,\n minWidth = 420,\n minHeight = 280,\n disableBackdropClose,\n testId,\n}: CmsConfirmDialogProps) {\n const hasActions = cancelLabel != null || confirmLabel != null;\n\n return (\n <Dialog\n open={open}\n onClose={(_event, reason) => {\n if (\n disableBackdropClose &&\n (reason === 'backdropClick' || reason === 'escapeKeyDown')\n )\n return;\n onClose();\n }}\n maxWidth={false}\n slotProps={{\n paper: {\n sx: CmsConfirmDialogStyles.sxPaper(width, minWidth, minHeight),\n ...(testId != null ? { 'data-testid': testId } : {}),\n } as PaperProps,\n }}>\n {showClose && (\n <IconButton\n aria-label={closeAriaLabel ?? 'Close'}\n onClick={onClose}\n sx={CmsConfirmDialogStyles.sxClose}\n data-testid={testId ? `${testId}-icon-btn-close` : undefined}>\n <CloseIcon />\n </IconButton>\n )}\n\n {icon != null && (\n <Box sx={CmsConfirmDialogStyles.sxIcon(iconColor)}>{icon}</Box>\n )}\n\n {title != null && (\n <Box component=\"h2\" sx={CmsConfirmDialogStyles.sxTitle}>\n {title}\n </Box>\n )}\n\n {description != null && (\n <Box component=\"p\" sx={CmsConfirmDialogStyles.sxDescription}>\n {description}\n </Box>\n )}\n\n {hasActions && (\n <Box sx={CmsConfirmDialogStyles.sxActions}>\n <CmsDialogActions\n cancelLabel={cancelLabel}\n onCancel={onCancel ?? onClose}\n confirmLabel={confirmLabel}\n onConfirm={onConfirm}\n confirmIcon={confirmIcon}\n confirmColor={confirmColor}\n cancelDisabled={cancelDisabled}\n confirmDisabled={confirmDisabled}\n fullWidth={fullWidthActions}\n align={actionsAlign}\n testId={testId ? `${testId}-actions` : undefined}\n />\n </Box>\n )}\n </Dialog>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/lib/version.ts","../src/lib/theme/material-theme.json","../src/lib/theme/createAppTheme.ts","../src/lib/theme/buttonStyles.ts","../src/lib/theme/selectStyles.ts","../src/lib/theme/fonts/GoogleSans-Regular.woff2","../src/lib/theme/fonts/GoogleSans-Italic.woff2","../src/lib/theme/fonts/GoogleSans-Medium.woff2","../src/lib/theme/fonts/GoogleSans-MediumItalic.woff2","../src/lib/theme/fonts/GoogleSans-Bold.woff2","../src/lib/theme/fonts/GoogleSans-BoldItalic.woff2","../src/lib/theme/fonts.ts","../src/lib/theme/themePreference.ts","../src/lib/i18n/createTranslator.ts","../src/lib/i18n/messages/en.ts","../src/lib/i18n/messages/es.ts","../src/lib/i18n/messages/pt.ts","../src/lib/i18n/messages/index.ts","../src/lib/i18n/types.ts","../src/lib/i18n/normalizeLocale.ts","../src/lib/i18n/CmsI18nProvider.tsx","../src/lib/i18n/useCmsTranslation.ts","../src/lib/components/toast/CmsToast.styles.ts","../src/lib/components/toast/CmsToast.tsx","../src/lib/components/toast/CmsToastProvider.tsx","../src/lib/components/toast/useCmsToast.ts","../src/lib/network/CmsNetworkProvider.tsx","../src/lib/network/useCmsNetworkStatus.ts","../src/lib/network/CmsNetworkToaster.tsx","../src/lib/network/useResilientAction.ts","../src/lib/components/link.tsx","../src/lib/utils/legacy-admin.ts","../src/lib/components/sidebar/nav-helpers.ts","../src/lib/components/sidebar/nav-blocks.ts","../src/lib/components/sidebar/SidebarRail.styles.ts","../src/lib/components/sidebar/SidebarRail.tsx","../src/lib/components/site-selector-menu/SiteSelectorMenu.styles.ts","../src/lib/components/site-selector-menu/SiteSelectorMenu.tsx","../src/lib/components/top-bar/AppearanceMenu.styles.ts","../src/lib/components/top-bar/TopBar.styles.ts","../src/lib/components/top-bar/AppearanceMenu.tsx","../src/lib/components/top-bar/notificationsFeed.ts","../src/lib/components/top-bar/NotificationsMenu.styles.ts","../src/lib/components/top-bar/NotificationsMenu.tsx","../src/lib/components/dropdowns/SimpleDropdown.styles.ts","../src/lib/components/dropdowns/SimpleDropdown.tsx","../src/lib/components/top-bar/previewMenu.config.ts","../src/lib/components/top-bar/PreviewMenu.tsx","../src/lib/utils/cms-asset.ts","../src/lib/utils/profile-avatar.ts","../src/lib/components/user-avatar/UserAvatar.styles.ts","../src/lib/components/user-avatar/CurrentUserPhotoProvider.tsx","../src/lib/components/user-avatar/useCurrentUserPhoto.ts","../src/lib/components/user-avatar/UserAvatar.tsx","../src/lib/components/top-bar/ProfileMenu.tsx","../src/lib/components/top-bar/TopBarClock.tsx","../src/lib/components/top-bar/TopBar.tsx","../src/lib/components/shell/AppShell.styles.ts","../src/lib/components/shell/AppShell.tsx","../src/lib/components/sidebar/Sidebar.styles.ts","../src/lib/components/sidebar/Sidebar.tsx","../src/lib/components/top-bar/newContentMenu.config.ts","../src/lib/components/top-bar/NewContentMenu.styles.ts","../src/lib/components/top-bar/NewContentMenu.tsx","../src/lib/components/error-page/CmsErrorPage.styles.ts","../src/lib/components/error-page/CmsErrorPage.tsx","../src/lib/components/mui-provider/CmsColorSchemeVars.tsx","../src/lib/components/mui-provider/CmsFontFaces.tsx","../src/lib/components/mui-provider/CmsThemeInitScript.tsx","../src/lib/components/mui-provider/CmsThemeModeSync.tsx","../src/lib/components/mui-provider/CmsMuiProvider.tsx","../src/lib/components/mui-provider/NextCmsMuiProvider.tsx","../src/lib/components/dropdowns/BtnDropdown.styles.ts","../src/lib/components/dropdowns/BtnDropdown.tsx","../src/lib/components/dropdowns/SelectDropdown.tsx","../src/lib/components/search/CmsSearchField.styles.ts","../src/lib/components/search/CmsSearchField.tsx","../src/lib/components/empty-state/CmsEmptyState.styles.ts","../src/lib/components/empty-state/CmsEmptyState.tsx","../src/lib/components/filter-bar/CmsFilterBar.styles.ts","../src/lib/components/filter-bar/CmsFilterBar.tsx","../src/lib/components/fields/fieldStyles.ts","../src/lib/components/fields/CmsCheckboxField.tsx","../src/lib/components/fields/FieldShell.tsx","../src/lib/components/fields/CmsComboboxField.tsx","../src/lib/components/fields/CmsDateField.styles.ts","../src/lib/components/fields/CmsDateField.tsx","../src/lib/components/fields/CmsMultiSelectField.tsx","../src/lib/components/fields/CmsNumberField.tsx","../src/lib/components/fields/CmsSelectField.tsx","../src/lib/components/fields/CmsTagsField.tsx","../src/lib/components/fields/CmsTextField.tsx","../src/lib/components/fields/FieldRenderer.tsx","../src/lib/components/advanced-search/CmsAdvancedSearch.styles.ts","../src/lib/components/advanced-search/defaultFields.ts","../src/lib/components/advanced-search/CmsAdvancedSearch.tsx","../src/lib/components/confirm-dialog/CmsConfirmDialog.styles.ts","../src/lib/components/confirm-dialog/CmsDialogActions.styles.ts","../src/lib/components/confirm-dialog/CmsDialogActions.tsx","../src/lib/components/confirm-dialog/CmsConfirmDialog.tsx","../src/lib/components/relative-time/CmsRelativeTime.tsx"],"sourcesContent":["export const LIB_VERSION = '0.0.0' as const\n","{\n \"description\": \"TYPE: CUSTOM\\nMaterial Theme Builder export 2026-05-08 02:18:51\",\n \"seed\": \"#0067C4\",\n \"coreColors\": {\n \"primary\": \"#0067C4\",\n \"secondary\": \"#D8E2FF\",\n \"tertiary\": \"#B4BEDA\"\n },\n \"extendedColors\": [\n {\n \"name\": \"Bluestack color\",\n \"color\": \"#2962FF\",\n \"description\": \"primario de bluestack\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado publicada\",\n \"color\": \"#00C853\",\n \"description\": \"\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado Redaccion\",\n \"color\": \"#0091EA\",\n \"description\": \"\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado frescura\",\n \"color\": \"#30FF5D\",\n \"description\": \"\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado Programado\",\n \"color\": \"#FF6D00\",\n \"description\": \"\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado bloqueada\",\n \"color\": \"#D50000\",\n \"description\": \"\",\n \"harmonized\": false\n },\n {\n \"name\": \"Estado borrador\",\n \"color\": \"#FFAB00\",\n \"description\": \"\",\n \"harmonized\": false\n }\n ],\n \"schemes\": {\n \"light\": {\n \"primary\": \"#536dfe\",\n \"surfaceTint\": \"#3E5F90\",\n \"onPrimary\": \"#FFFFFF\",\n \"primaryContainer\": \"#D5E3FF\",\n \"onPrimaryContainer\": \"#254777\",\n \"secondary\": \"#455E91\",\n \"onSecondary\": \"#FFFFFF\",\n \"secondaryContainer\": \"#D8E2FF\",\n \"onSecondaryContainer\": \"#2C4678\",\n \"tertiary\": \"#455E91\",\n \"onTertiary\": \"#FFFFFF\",\n \"tertiaryContainer\": \"#D8E2FF\",\n \"onTertiaryContainer\": \"#2C4678\",\n \"error\": \"#BA1A1A\",\n \"onError\": \"#FFFFFF\",\n \"errorContainer\": \"#FFDAD6\",\n \"onErrorContainer\": \"#93000A\",\n \"background\": \"#F9F9FF\",\n \"onBackground\": \"#191C20\",\n \"surface\": \"#F9F9FF\",\n \"onSurface\": \"#191C20\",\n \"surfaceVariant\": \"#E0E2EC\",\n \"onSurfaceVariant\": \"#43474E\",\n \"outline\": \"#74777F\",\n \"outlineVariant\": \"#C4C6CF\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#2E3035\",\n \"inverseOnSurface\": \"#F0F0F7\",\n \"inversePrimary\": \"#A8C8FF\",\n \"primaryFixed\": \"#D5E3FF\",\n \"onPrimaryFixed\": \"#001B3C\",\n \"primaryFixedDim\": \"#A8C8FF\",\n \"onPrimaryFixedVariant\": \"#254777\",\n \"secondaryFixed\": \"#D8E2FF\",\n \"onSecondaryFixed\": \"#001A42\",\n \"secondaryFixedDim\": \"#AEC6FF\",\n \"onSecondaryFixedVariant\": \"#2C4678\",\n \"tertiaryFixed\": \"#D8E2FF\",\n \"onTertiaryFixed\": \"#001A42\",\n \"tertiaryFixedDim\": \"#AEC6FF\",\n \"onTertiaryFixedVariant\": \"#2C4678\",\n \"surfaceDim\": \"#D9D9E0\",\n \"surfaceBright\": \"#F9F9FF\",\n \"surfaceContainerLowest\": \"#FFFFFF\",\n \"surfaceContainerLow\": \"#F3F3FA\",\n \"surfaceContainer\": \"#ECEDF6\",\n \"surfaceContainerHigh\": \"#E7E8EE\",\n \"surfaceContainerHighest\": \"#E1E2E9\"\n },\n \"light-medium-contrast\": {\n \"primary\": \"#0F3665\",\n \"surfaceTint\": \"#3E5F90\",\n \"onPrimary\": \"#FFFFFF\",\n \"primaryContainer\": \"#4E6EA0\",\n \"onPrimaryContainer\": \"#FFFFFF\",\n \"secondary\": \"#193566\",\n \"onSecondary\": \"#FFFFFF\",\n \"secondaryContainer\": \"#546CA1\",\n \"onSecondaryContainer\": \"#FFFFFF\",\n \"tertiary\": \"#193566\",\n \"onTertiary\": \"#FFFFFF\",\n \"tertiaryContainer\": \"#546CA1\",\n \"onTertiaryContainer\": \"#FFFFFF\",\n \"error\": \"#740006\",\n \"onError\": \"#FFFFFF\",\n \"errorContainer\": \"#CF2C27\",\n \"onErrorContainer\": \"#FFFFFF\",\n \"background\": \"#F9F9FF\",\n \"onBackground\": \"#191C20\",\n \"surface\": \"#F9F9FF\",\n \"onSurface\": \"#0F1116\",\n \"surfaceVariant\": \"#E0E2EC\",\n \"onSurfaceVariant\": \"#33363D\",\n \"outline\": \"#4F525A\",\n \"outlineVariant\": \"#6A6D75\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#2E3035\",\n \"inverseOnSurface\": \"#F0F0F7\",\n \"inversePrimary\": \"#A8C8FF\",\n \"primaryFixed\": \"#4E6EA0\",\n \"onPrimaryFixed\": \"#FFFFFF\",\n \"primaryFixedDim\": \"#345586\",\n \"onPrimaryFixedVariant\": \"#FFFFFF\",\n \"secondaryFixed\": \"#546CA1\",\n \"onSecondaryFixed\": \"#FFFFFF\",\n \"secondaryFixedDim\": \"#3B5487\",\n \"onSecondaryFixedVariant\": \"#FFFFFF\",\n \"tertiaryFixed\": \"#546CA1\",\n \"onTertiaryFixed\": \"#FFFFFF\",\n \"tertiaryFixedDim\": \"#3B5487\",\n \"onTertiaryFixedVariant\": \"#FFFFFF\",\n \"surfaceDim\": \"#C5C6CD\",\n \"surfaceBright\": \"#F9F9FF\",\n \"surfaceContainerLowest\": \"#FFFFFF\",\n \"surfaceContainerLow\": \"#F3F3FA\",\n \"surfaceContainer\": \"#E7E8EE\",\n \"surfaceContainerHigh\": \"#DCDCE3\",\n \"surfaceContainerHighest\": \"#D0D1D8\"\n },\n \"light-high-contrast\": {\n \"primary\": \"#002C5A\",\n \"surfaceTint\": \"#3E5F90\",\n \"onPrimary\": \"#FFFFFF\",\n \"primaryContainer\": \"#274A79\",\n \"onPrimaryContainer\": \"#FFFFFF\",\n \"secondary\": \"#0B2A5B\",\n \"onSecondary\": \"#FFFFFF\",\n \"secondaryContainer\": \"#2E487A\",\n \"onSecondaryContainer\": \"#FFFFFF\",\n \"tertiary\": \"#0C2A5B\",\n \"onTertiary\": \"#FFFFFF\",\n \"tertiaryContainer\": \"#2F487A\",\n \"onTertiaryContainer\": \"#FFFFFF\",\n \"error\": \"#600004\",\n \"onError\": \"#FFFFFF\",\n \"errorContainer\": \"#98000A\",\n \"onErrorContainer\": \"#FFFFFF\",\n \"background\": \"#F9F9FF\",\n \"onBackground\": \"#191C20\",\n \"surface\": \"#F9F9FF\",\n \"onSurface\": \"#000000\",\n \"surfaceVariant\": \"#E0E2EC\",\n \"onSurfaceVariant\": \"#000000\",\n \"outline\": \"#292C33\",\n \"outlineVariant\": \"#464951\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#2E3035\",\n \"inverseOnSurface\": \"#FFFFFF\",\n \"inversePrimary\": \"#A8C8FF\",\n \"primaryFixed\": \"#274A79\",\n \"onPrimaryFixed\": \"#FFFFFF\",\n \"primaryFixedDim\": \"#093361\",\n \"onPrimaryFixedVariant\": \"#FFFFFF\",\n \"secondaryFixed\": \"#2E487A\",\n \"onSecondaryFixed\": \"#FFFFFF\",\n \"secondaryFixedDim\": \"#143162\",\n \"onSecondaryFixedVariant\": \"#FFFFFF\",\n \"tertiaryFixed\": \"#2F487A\",\n \"onTertiaryFixed\": \"#FFFFFF\",\n \"tertiaryFixedDim\": \"#153162\",\n \"onTertiaryFixedVariant\": \"#FFFFFF\",\n \"surfaceDim\": \"#B7B8BF\",\n \"surfaceBright\": \"#F9F9FF\",\n \"surfaceContainerLowest\": \"#FFFFFF\",\n \"surfaceContainerLow\": \"#F0F0F7\",\n \"surfaceContainer\": \"#E1E2E9\",\n \"surfaceContainerHigh\": \"#D3D4DB\",\n \"surfaceContainerHighest\": \"#C5C6CD\"\n },\n \"dark\": {\n \"primary\": \"#A8C8FF\",\n \"surfaceTint\": \"#A8C8FF\",\n \"onPrimary\": \"#05305F\",\n \"primaryContainer\": \"#254777\",\n \"onPrimaryContainer\": \"#D5E3FF\",\n \"secondary\": \"#AEC6FF\",\n \"onSecondary\": \"#112F60\",\n \"secondaryContainer\": \"#2C4678\",\n \"onSecondaryContainer\": \"#D8E2FF\",\n \"tertiary\": \"#AEC6FF\",\n \"onTertiary\": \"#122F60\",\n \"tertiaryContainer\": \"#2C4678\",\n \"onTertiaryContainer\": \"#D8E2FF\",\n \"error\": \"#FFB4AB\",\n \"onError\": \"#690005\",\n \"errorContainer\": \"#93000A\",\n \"onErrorContainer\": \"#FFDAD6\",\n \"background\": \"#111318\",\n \"onBackground\": \"#E1E2E9\",\n \"surface\": \"#111318\",\n \"onSurface\": \"#E1E2E9\",\n \"surfaceVariant\": \"#43474E\",\n \"onSurfaceVariant\": \"#C4C6CF\",\n \"outline\": \"#8E9199\",\n \"outlineVariant\": \"#43474E\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#E1E2E9\",\n \"inverseOnSurface\": \"#2E3035\",\n \"inversePrimary\": \"#3E5F90\",\n \"primaryFixed\": \"#D5E3FF\",\n \"onPrimaryFixed\": \"#001B3C\",\n \"primaryFixedDim\": \"#A8C8FF\",\n \"onPrimaryFixedVariant\": \"#254777\",\n \"secondaryFixed\": \"#D8E2FF\",\n \"onSecondaryFixed\": \"#001A42\",\n \"secondaryFixedDim\": \"#AEC6FF\",\n \"onSecondaryFixedVariant\": \"#2C4678\",\n \"tertiaryFixed\": \"#D8E2FF\",\n \"onTertiaryFixed\": \"#001A42\",\n \"tertiaryFixedDim\": \"#AEC6FF\",\n \"onTertiaryFixedVariant\": \"#2C4678\",\n \"surfaceDim\": \"#111318\",\n \"surfaceBright\": \"#37393E\",\n \"surfaceContainerLowest\": \"#0C0E13\",\n \"surfaceContainerLow\": \"#191C20\",\n \"surfaceContainer\": \"#1D2024\",\n \"surfaceContainerHigh\": \"#282A2F\",\n \"surfaceContainerHighest\": \"#33353A\"\n },\n \"dark-medium-contrast\": {\n \"primary\": \"#CCDDFF\",\n \"surfaceTint\": \"#A8C8FF\",\n \"onPrimary\": \"#00254E\",\n \"primaryContainer\": \"#7292C6\",\n \"onPrimaryContainer\": \"#000000\",\n \"secondary\": \"#CFDCFF\",\n \"onSecondary\": \"#012455\",\n \"secondaryContainer\": \"#7790C7\",\n \"onSecondaryContainer\": \"#000000\",\n \"tertiary\": \"#CFDCFF\",\n \"onTertiary\": \"#022455\",\n \"tertiaryContainer\": \"#7890C7\",\n \"onTertiaryContainer\": \"#000000\",\n \"error\": \"#FFD2CC\",\n \"onError\": \"#540003\",\n \"errorContainer\": \"#FF5449\",\n \"onErrorContainer\": \"#000000\",\n \"background\": \"#111318\",\n \"onBackground\": \"#E1E2E9\",\n \"surface\": \"#111318\",\n \"onSurface\": \"#FFFFFF\",\n \"surfaceVariant\": \"#43474E\",\n \"onSurfaceVariant\": \"#DADCE5\",\n \"outline\": \"#AFB2BB\",\n \"outlineVariant\": \"#8D9099\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#E1E2E9\",\n \"inverseOnSurface\": \"#282A2F\",\n \"inversePrimary\": \"#264878\",\n \"primaryFixed\": \"#D5E3FF\",\n \"onPrimaryFixed\": \"#001129\",\n \"primaryFixedDim\": \"#A8C8FF\",\n \"onPrimaryFixedVariant\": \"#0F3665\",\n \"secondaryFixed\": \"#D8E2FF\",\n \"onSecondaryFixed\": \"#00102E\",\n \"secondaryFixedDim\": \"#AEC6FF\",\n \"onSecondaryFixedVariant\": \"#193566\",\n \"tertiaryFixed\": \"#D8E2FF\",\n \"onTertiaryFixed\": \"#00102E\",\n \"tertiaryFixedDim\": \"#AEC6FF\",\n \"onTertiaryFixedVariant\": \"#193566\",\n \"surfaceDim\": \"#111318\",\n \"surfaceBright\": \"#42444A\",\n \"surfaceContainerLowest\": \"#06070C\",\n \"surfaceContainerLow\": \"#1B1E22\",\n \"surfaceContainer\": \"#26282D\",\n \"surfaceContainerHigh\": \"#303338\",\n \"surfaceContainerHighest\": \"#3B3E43\"\n },\n \"dark-high-contrast\": {\n \"primary\": \"#EAF0FF\",\n \"surfaceTint\": \"#A8C8FF\",\n \"onPrimary\": \"#000000\",\n \"primaryContainer\": \"#A4C4FB\",\n \"onPrimaryContainer\": \"#000B1F\",\n \"secondary\": \"#ECEFFF\",\n \"onSecondary\": \"#000000\",\n \"secondaryContainer\": \"#A9C2FC\",\n \"onSecondaryContainer\": \"#000A23\",\n \"tertiary\": \"#ECEFFF\",\n \"onTertiary\": \"#000000\",\n \"tertiaryContainer\": \"#A9C2FC\",\n \"onTertiaryContainer\": \"#000A23\",\n \"error\": \"#FFECE9\",\n \"onError\": \"#000000\",\n \"errorContainer\": \"#FFAEA4\",\n \"onErrorContainer\": \"#220001\",\n \"background\": \"#111318\",\n \"onBackground\": \"#E1E2E9\",\n \"surface\": \"#111318\",\n \"onSurface\": \"#FFFFFF\",\n \"surfaceVariant\": \"#43474E\",\n \"onSurfaceVariant\": \"#FFFFFF\",\n \"outline\": \"#EEF0F9\",\n \"outlineVariant\": \"#C0C2CC\",\n \"shadow\": \"#000000\",\n \"scrim\": \"#000000\",\n \"inverseSurface\": \"#E1E2E9\",\n \"inverseOnSurface\": \"#000000\",\n \"inversePrimary\": \"#264878\",\n \"primaryFixed\": \"#D5E3FF\",\n \"onPrimaryFixed\": \"#000000\",\n \"primaryFixedDim\": \"#A8C8FF\",\n \"onPrimaryFixedVariant\": \"#001129\",\n \"secondaryFixed\": \"#D8E2FF\",\n \"onSecondaryFixed\": \"#000000\",\n \"secondaryFixedDim\": \"#AEC6FF\",\n \"onSecondaryFixedVariant\": \"#00102E\",\n \"tertiaryFixed\": \"#D8E2FF\",\n \"onTertiaryFixed\": \"#000000\",\n \"tertiaryFixedDim\": \"#AEC6FF\",\n \"onTertiaryFixedVariant\": \"#00102E\",\n \"surfaceDim\": \"#111318\",\n \"surfaceBright\": \"#4E5055\",\n \"surfaceContainerLowest\": \"#000000\",\n \"surfaceContainerLow\": \"#1D2024\",\n \"surfaceContainer\": \"#2E3035\",\n \"surfaceContainerHigh\": \"#393B41\",\n \"surfaceContainerHighest\": \"#45474C\"\n }\n },\n \"palettes\": {\n \"primary\": {\n \"0\": \"#000000\",\n \"5\": \"#001129\",\n \"10\": \"#001B3C\",\n \"15\": \"#00264E\",\n \"20\": \"#003061\",\n \"25\": \"#003B75\",\n \"30\": \"#004689\",\n \"35\": \"#00529E\",\n \"40\": \"#005EB3\",\n \"50\": \"#2777D5\",\n \"60\": \"#4A91F1\",\n \"70\": \"#76ACFF\",\n \"80\": \"#A8C8FF\",\n \"90\": \"#D5E3FF\",\n \"95\": \"#ECF1FF\",\n \"98\": \"#F9F9FF\",\n \"99\": \"#FDFBFF\",\n \"100\": \"#FFFFFF\"\n },\n \"secondary\": {\n \"0\": \"#000000\",\n \"5\": \"#061025\",\n \"10\": \"#111B30\",\n \"15\": \"#1B263B\",\n \"20\": \"#263046\",\n \"25\": \"#313B52\",\n \"30\": \"#3D475E\",\n \"35\": \"#48526A\",\n \"40\": \"#545E76\",\n \"50\": \"#6D7790\",\n \"60\": \"#8690AB\",\n \"70\": \"#A1ABC6\",\n \"80\": \"#BCC6E2\",\n \"90\": \"#D8E2FF\",\n \"95\": \"#EDF0FF\",\n \"98\": \"#F9F9FF\",\n \"99\": \"#FEFBFF\",\n \"100\": \"#FFFFFF\"\n },\n \"tertiary\": {\n \"0\": \"#000000\",\n \"5\": \"#061025\",\n \"10\": \"#111B30\",\n \"15\": \"#1B253B\",\n \"20\": \"#263046\",\n \"25\": \"#313B52\",\n \"30\": \"#3D475E\",\n \"35\": \"#48526A\",\n \"40\": \"#545E77\",\n \"50\": \"#6D7790\",\n \"60\": \"#8690AB\",\n \"70\": \"#A1ABC6\",\n \"80\": \"#BCC6E2\",\n \"90\": \"#D8E2FF\",\n \"95\": \"#EDF0FF\",\n \"98\": \"#FAF9FF\",\n \"99\": \"#FEFBFF\",\n \"100\": \"#FFFFFF\"\n },\n \"neutral\": {\n \"0\": \"#000000\",\n \"5\": \"#101114\",\n \"10\": \"#1A1C1E\",\n \"15\": \"#252629\",\n \"20\": \"#2F3033\",\n \"25\": \"#3A3B3E\",\n \"30\": \"#46474A\",\n \"35\": \"#525256\",\n \"40\": \"#5E5E62\",\n \"50\": \"#76777A\",\n \"60\": \"#909094\",\n \"70\": \"#ABABAF\",\n \"80\": \"#C7C6CA\",\n \"90\": \"#E3E2E6\",\n \"95\": \"#F1F0F4\",\n \"98\": \"#FAF9FD\",\n \"99\": \"#FDFBFF\",\n \"100\": \"#FFFFFF\"\n },\n \"neutral-variant\": {\n \"0\": \"#000000\",\n \"5\": \"#0D1117\",\n \"10\": \"#181C22\",\n \"15\": \"#22262D\",\n \"20\": \"#2D3038\",\n \"25\": \"#383B43\",\n \"30\": \"#43474E\",\n \"35\": \"#4F525A\",\n \"40\": \"#5B5E66\",\n \"50\": \"#74777F\",\n \"60\": \"#8E9199\",\n \"70\": \"#A8ABB4\",\n \"80\": \"#C4C6CF\",\n \"90\": \"#E0E2EC\",\n \"95\": \"#EEF0FA\",\n \"98\": \"#F9F9FF\",\n \"99\": \"#FDFBFF\",\n \"100\": \"#FFFFFF\"\n }\n }\n}\n","import { alpha, createTheme } from '@mui/material/styles';\nimport type { PaletteMode, PaletteOptions } from '@mui/material/styles';\n\nimport materialThemeSource from './material-theme.json';\nimport { fontFamilies } from './variables';\n\ntype SchemeDef = (typeof materialThemeSource)['schemes']['light'];\n\nfunction extendedColor(name: string): string | undefined {\n return materialThemeSource.extendedColors.find((e) => e.name === name)?.color;\n}\n\nfunction neutralToGrey(p: (typeof materialThemeSource)['palettes']['neutral']) {\n return {\n 50: p['98'],\n 100: p['95'],\n 200: p['90'],\n 300: p['80'],\n 400: p['70'],\n 500: p['60'],\n 600: p['50'],\n 700: p['40'],\n 800: p['30'],\n 900: p['20'],\n A100: p['90'],\n A200: p['80'],\n A400: p['60'],\n A700: p['40'],\n };\n}\n\nfunction schemeToPalette(mode: PaletteMode, scheme: SchemeDef): PaletteOptions {\n const onSurfaceToken = scheme.onSurface;\n\n return {\n mode,\n primary: {\n main: scheme.primary,\n light: scheme.primaryContainer,\n dark: scheme.onPrimaryContainer,\n contrastText: scheme.onPrimary,\n },\n secondary: {\n main: scheme.secondary,\n light: '#D8E2FF',\n dark: scheme.onSecondaryContainer,\n contrastText: scheme.onSecondary,\n },\n tertiary: {\n main: scheme.tertiary,\n light: scheme.tertiaryContainer,\n dark: scheme.onTertiaryContainer,\n contrastText: scheme.onTertiary,\n },\n error: {\n main: scheme.error,\n light: scheme.errorContainer,\n dark: scheme.onErrorContainer,\n contrastText: scheme.onError,\n },\n warning: {\n main: extendedColor('Estado Programado') ?? '#FF6D00',\n light: '#FF9E40',\n dark: '#C25400',\n contrastText: '#FFFFFF',\n },\n info: {\n main: extendedColor('Estado Redaccion') ?? '#0091EA',\n light: '#64B5F6',\n dark: '#0064B7',\n contrastText: '#FFFFFF',\n },\n success: {\n main: extendedColor('Estado publicada') ?? '#00C853',\n light: '#69F0AE',\n dark: '#009624',\n contrastText: '#FFFFFF',\n },\n brand: {\n main: extendedColor('Bluestack color') ?? '#2962FF',\n },\n text: {\n primary: scheme.onSurface,\n secondary: scheme.onSurfaceVariant,\n disabled: alpha(scheme.onSurface, 0.38),\n },\n divider: scheme.outlineVariant,\n background: {\n default: scheme.background,\n // En claro, `paper` es el blanco base (surfaceContainerLowest). En oscuro,\n // usamos una superficie elevada (surfaceContainerHigh) para que las cards\n // se lean por encima del fondo del shell y no queden \"hundidas\" en negro.\n paper:\n mode === 'dark'\n ? scheme.surfaceContainerHigh\n : scheme.surfaceContainerLowest,\n },\n action: {\n active: alpha(onSurfaceToken, 0.56),\n hover: alpha(onSurfaceToken, mode === 'light' ? 0.04 : 0.08),\n selected: alpha(scheme.primary, 0.12),\n focus: alpha(scheme.primary, 0.12),\n disabled: alpha(onSurfaceToken, 0.26),\n disabledBackground: alpha(onSurfaceToken, 0.12),\n },\n common: {\n black: scheme.shadow,\n white: '#FFFFFF',\n },\n grey: neutralToGrey(materialThemeSource.palettes.neutral),\n m3: {\n surfaceTint: scheme.surfaceTint,\n surfaceDim: scheme.surfaceDim,\n surfaceBright: scheme.surfaceBright,\n surface: scheme.surface,\n surfaceContainerLowest: scheme.surfaceContainerLowest,\n surfaceContainerLow: scheme.surfaceContainerLow,\n surfaceContainer: scheme.surfaceContainer,\n surfaceContainerHigh: scheme.surfaceContainerHigh,\n surfaceContainerHighest: scheme.surfaceContainerHighest,\n outline: scheme.outline,\n outlineVariant: scheme.outlineVariant,\n inverseSurface: scheme.inverseSurface,\n inverseOnSurface: scheme.inverseOnSurface,\n inversePrimary: scheme.inversePrimary,\n onBackground: scheme.onBackground,\n surfaceVariant: scheme.surfaceVariant,\n onSurfaceVariant: scheme.onSurfaceVariant,\n },\n };\n}\n\nexport function createAppTheme() {\n const lightPalette = schemeToPalette(\n 'light',\n materialThemeSource.schemes.light,\n );\n const darkPalette = schemeToPalette('dark', materialThemeSource.schemes.dark);\n\n return createTheme({\n cssVariables: {\n // Atributo explícito y legible: MUI togglea `data-mui-color-scheme=\"dark\"`\n // sobre <html>. Las CSS vars de `variables.ts` se enganchan a ese selector.\n colorSchemeSelector: 'data-mui-color-scheme',\n },\n defaultColorScheme: 'light',\n colorSchemes: {\n light: { palette: lightPalette },\n dark: { palette: darkPalette },\n },\n typography: {\n fontFamily: fontFamilies.googleSans,\n },\n });\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, radii, shadows, sizes } from './variables';\n\n/**\n * Estilos de botón unificados de la librería.\n *\n * Define las dos variantes de botón pill del CMS y las piezas reutilizables\n * (superficie + hover) para que cualquier componente las componga sin repetir\n * colores ni medidas. `BtnDropdown` los usa para su botón principal y su flecha;\n * `sxPillButton` sirve para cualquier botón pill suelto.\n */\n\n/** Variante visual de los botones de la lib. */\nexport type CmsButtonVariant = 'cta' | 'white';\n\n/** Fondo, color de texto y borde según la variante (compartido por todas las piezas). */\nexport function cmsButtonSurface(variant: CmsButtonVariant): SxProps<Theme> {\n if (variant === 'white') {\n return {\n bgcolor: 'm3.surfaceContainerLowest',\n color: cmsColors.whiteBtnText,\n border: '1px solid',\n borderColor: cmsColors.whiteBtnBorder,\n };\n }\n return {\n bgcolor: cmsColors.primary,\n color: cmsColors.white,\n border: 'none',\n borderColor: 'transparent',\n };\n}\n\n/** Color de fondo en hover según la variante. */\nexport function cmsButtonHoverBg(variant: CmsButtonVariant): string {\n return variant === 'cta' ? cmsColors.primaryHover : 'action.hover';\n}\n\n/** Borde divisor (p. ej. entre botón principal y flecha de un split button). */\nexport function cmsButtonDivider(variant: CmsButtonVariant): string {\n return variant === 'white'\n ? cmsColors.whiteBtnBorder\n : 'rgba(255, 255, 255, 0.28)';\n}\n\n/** Botón pill completo y autónomo. Reutilizable en cualquier CTA de la lib. */\nexport function sxPillButton(variant: CmsButtonVariant = 'cta'): SxProps<Theme> {\n return {\n height: sizes.buttonHeight,\n px: '20px',\n borderRadius: radii.pill,\n textTransform: 'none',\n fontSize: 14,\n fontWeight: 500,\n minWidth: 0,\n gap: 1,\n boxShadow: shadows.button,\n ...(cmsButtonSurface(variant) as object),\n '& .MuiSvgIcon-root': { fontSize: 18 },\n '&:hover': {\n boxShadow: shadows.button,\n bgcolor: cmsButtonHoverBg(variant),\n },\n '&.Mui-disabled': {\n bgcolor:\n variant === 'white'\n ? 'm3.surfaceContainerLowest'\n : cmsColors.primaryDisabled,\n color: 'action.disabled',\n },\n };\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii, shadows, sizes } from './variables';\n\n/**\n * Estilos del `SelectDropdown` — el selector tipo \"vista/filtro\" del CMS\n * (mismo patrón visual que el dropdown \"Últimas Noticias\" del diseño).\n *\n * Vive en `theme/` (no junto al componente) porque es parte del set de estilos\n * compartidos y reutilizables: cualquier proyecto que consuma la librería puede\n * importarlo para construir un trigger/menú coherente con el sistema.\n *\n * Reglas de color (todas con variables de `variables.ts`):\n * - Trigger por defecto: borde `m3.outlineVariant` (#C4C6CF), texto `controlText`\n * (#000) en negrita, fondo transparente; hover → `neutralHover` (state layer\n * M3 `onSurface` al 8%, #191C20).\n * - Trigger resaltado (valor activo, `highlighted`): fondo `secondary`\n * (#D8E2FF), sin borde. Abrir el menú NO lo colorea: queda outlined.\n * - Opción del menú: hover → `neutralHover` (state layer M3 `onSurface` al 8%,\n * #191C20); seleccionada → fondo `secondary` (#D8E2FF). El menú es full-bleed\n * (sin padding lateral ni radio en los ítems): el resaltado llega de borde a\n * borde, sobre el fondo `menuSurface` (#ECEDF6) común a todos los desplegables.\n */\nexport const SelectStyles = {\n /**\n * Disparador outlined con label + chevron. Se rellena con `secondary` solo\n * cuando está resaltado (`highlighted`, valor activo); abrir el menú (`open`)\n * NO lo colorea.\n */\n sxTrigger: (highlighted: boolean, open: boolean): SxProps<Theme> => {\n // Solo el valor activo (`highlighted`) colorea el trigger; abrir el menú no.\n const filled = highlighted;\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '10px',\n height: sizes.buttonHeight,\n pl: '16px',\n pr: '10px',\n borderRadius: radii.md,\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n // La negrita va en el input principal, no en la opción activa del menú.\n fontWeight: 600,\n minWidth: 0,\n border: '1px solid',\n color: cmsColors.controlText,\n bgcolor: filled ? cmsColors.secondary : 'transparent',\n // Borde del filtro: 1px solid `m3.outlineVariant` (#C4C6CF).\n borderColor: filled ? 'transparent' : 'm3.outlineVariant',\n '&:hover': {\n // Hover del botón principal del filtro: state layer M3 `onSurface` al 8% (#191C20).\n bgcolor: filled ? cmsColors.secondary : cmsColors.neutralHover,\n borderColor: filled ? 'transparent' : 'm3.outlineVariant',\n },\n '& .sel-lead': {\n display: 'inline-flex',\n },\n '& .sel-lead .MuiSvgIcon-root': { fontSize: 18, width: 18, height: 18 },\n '& .sel-chevron': {\n display: 'inline-flex',\n color: 'm3.onSurfaceVariant',\n transition: 'transform 0.18s ease',\n transform: open ? 'rotate(180deg)' : 'none',\n },\n '& .sel-chevron .MuiSvgIcon-root': { fontSize: 18 },\n };\n },\n\n /** Paper sin padding lateral: los ítems llegan de borde a borde. */\n sxMenuPaper: (minWidth: number | string): SxProps<Theme> => ({\n mt: 0.75,\n py: '8px',\n px: 0,\n minWidth,\n borderRadius: radii.lg,\n bgcolor: cmsColors.menuSurface,\n border: '1px solid',\n borderColor: 'm3.outlineVariant',\n boxShadow: shadows.menuSoft,\n overflow: 'hidden',\n }),\n\n sxList: {\n p: 0,\n display: 'flex',\n flexDirection: 'column',\n } as SxProps<Theme>,\n\n /**\n * Ítem full-bleed (sin radio): hover → `secondaryHover`; activo → `secondary`.\n * Peso normal incluso en la opción activa (la negrita vive en el trigger).\n */\n sxItem: (selected: boolean): SxProps<Theme> => ({\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n px: '16px',\n py: '10px',\n borderRadius: 0,\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 400,\n color: cmsColors.textNav,\n bgcolor: selected ? cmsColors.secondary : 'transparent',\n // El color del ícono lo define cada opción (`iconColor`) desde el\n // componente; acá solo se ajusta el ancho para que pegue al label.\n '& .MuiListItemIcon-root': {\n minWidth: 0,\n },\n '& .MuiSvgIcon-root': { fontSize: 18, width: 18, height: 18 },\n '&:hover': {\n bgcolor: cmsColors.neutralHover,\n },\n '&.Mui-selected': {\n bgcolor: cmsColors.secondary,\n '&:hover': { bgcolor: cmsColors.secondaryHover },\n },\n }),\n};\n","export default \"data:font/woff2;base64,d09GMgABAAAAAFgkABEAAAAA+pgAAFe9AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGYNuGoE+G4GIeByvMAZgP1NUQVR4AIQ+EQgKgo0EgdRCC4kkAAE2AiQDkkQEIAWEcgcgDAcbitgH8OYZ1XI72KB7+hZiCdumHQ3lrs3I9U8ruWJU1E3SCpn9/5+RdMi1uq1+nIPRo9FEyKokjZTUpRQp61QalRwFlZbstacRj8i51RnJy1OzilweKzDg3mENLeeJ5wbe9xBquLXcL86Gw+1dNh6YG/xvTmREHo1eR+Iymdqchy3C9yckQfQkebcykSZ5JZPHKiioKY/44RvWwh3uBuN0z8C2kT/JyUsRH0vrI+t1S7YGegi1LHuRPQuM9gLRCT4R3QjOROT+eV43/9z7Rl5eXrIJSUhCEkIISVgRA6YQhhBZW6TWNXHR5SplORZa5SPFsXEsuly7GxdVXNRiB7rBTfkWhqfp/Ee5IrrSNqWRRuySXOwi3sjlLnoXvSQ1SYWWFGuhRXRFXDcGE4eJt39MMBmM2d+cjc2Betr93ngO5xujmqWpAc//c/if+5w7tQH2R6PDtSQB6R2kiScgP6LRAEY4a12/n6r3zbQwplQUT5lKbRihDuidwM3n2d87v/R3BzhD/HKiZyQ5Me0sLc7xv8lpCa7z0lj7T42YSc3y589HFR9iQ2yIDbEVbIgNeTvkPgyx/G8E8GM/t55IctZJOBY25v4KrDmjA+UY3Gz16+rqCbWxdSXnk0N6auRhTXPmsJVaNoZwHQJcSRfrEN+l131z3wDAxhsEX7dghzACQmBSp12zLp3xt1+HboBoZJGtoOzYAcFDAPjhWu9MsluYd9uyLFsgRWCBAnvJwWeQxa3M2g9oC6wIhO7/X1Prt++qUt0lJTnjigcqPfCtQX+2P60deQBo9Wc3f/3PufVeSVWvnhWR0xaMA2hIOrIy+S21G1xVsiPJDtA5cTIM/sQlZ3La0OCke4jgIy+RVrj6K+LtimCx3BP0vRfy/rGzvGCAqLfUDq41/n/TfnZD6M2oLszvUifzZvM2eckfenMcNI6zL3cmbUMtCqE4OLAIbeCf92/Ch/C6f/tArQWYtaW5PsV4/vtlze7fQ2zUI9txBLXCTWFVT9p0IauQVQqtiFE4hMRYHDgKiUYB//8tnc3s3UcZ6CmPoqIwGrcSJ1uZfGoVMgfjSlUS5yCwHT/wwGQwkd0AAwo0wsTC4LG9WfEkDH04qWCNR5XBjpsQ4j2+93PhcX6W86TracUEIwZhjBDGbMzilPbxE25nVtVOwP6k5i5CU4TCBGOMMUEYYYQRQhhT5LX7My5fhP3ztHYlFUXPcSW2t6KAU6A/QpK/X+Y8zr3mbaVqz2s/yB12nL8wVS288J6qRs/rG1aNeT3bFtWvT7Ut5Q12wtk3V2711795eq4yv2V0kEnCqxQ9Pfm61Ck3vy1bKBd+nOwrav7pQqesf36pm2jxT29l9EepRQNHfHNtOEAXj0s7K9ugh/j/X4xL2Vx5yP/9pZhI0kNe/PJE5MBD/t9P6yWOq734Xp2U0Aue/CxxFG7i/Taw03/RuRl4oLaeOLDsLU+8btmYC6HTbraU4OrBUfhkOu+4I2U3/f8PGC4/Z/plGW2iven//b1o+V73eZWVrHji//9WCiWS1MU/AXrpENC73u48IdhC4HLg+1lIzSzhMQqkQUEhXoyImPL2iRQOQ8rVAlFCSKgiiAlGk0AlwGxoaObD2Pvdn0MNNjAvHhcT8ZGrQ6IgblmQHHPy27CVfrxMG9qIgDazgODT4gg4qm409A+818/o29Vs42vslEF8Y6U8qZHnrQUNYm8HjK8fH3iUba9kIY24SYK5shNipco2WRoVkKT0SkHTs30OuJaj0brLloWj1q3m58hrOrTbGyF5z+hmGswNx6qvVoLueQh915IFCdj/FxJYJ/KxflciEtEVyzhmG9F9XVEkFInXFSQYrYWe9OITiXWe1QaFiUtUveDZRGSo/JM0W5opTfrco7607KlcKi6d/VUwHeX9gGqjtK9bN1sSEBaYfGYk6OchikzLFJCQwSuHCR7zgMeYr6qVeaQLJbUSD1WkUQoVPkmuKD5wCtqai76+cCLgYBwa8nAEgFycmsH6QC+qU9u8wb0NNh1UEFKVaostQZKQYLEwDQWCgggDLc20QN1VxZaxaTKpbt+UVdbiHDw2alNZeFIqKYXxxQc3HAivMEGPWyonSKBBEFgYJsAmone92jXjiGfrwfpzta824Vck3L5+2dgqL6xT68j6eu2DNzHf5tW46lbtWryq1vzVA59C5aTVvGpXZsUJhxexXNxKpX6FLusyLS1cCTf1UTo/tliCxH3Tw18I3nNPplM6d8ztuTaX5id+TuY/MYemefbM9tk4DbN6lsMX0rxi5s6MyU3bNE51qkxNdILjnXKpjB7nOMYyBuZzjmYUI8IMxuhdb3Swu0f9Lc3vdrPWWvqhMx2TwZa+7YA039XW1lffqpZWw0tb3qym1VlL9YNCATGA/DsCQAF+HFoiZj3KHbRwCTD8grzxCP7h/+k/5azh5NVoUs1pMMhB1fIAH6oSp5++Zf33E3k1mqmW4UAydPRBH2/pQ2ceET0z+BS4eFDgEqA3kNVV3zXOX/CS9nS8jfGW3dv2dPTJpzFr1L6qj+CDz/qxtT7GX9vaPu3g+Yv2dLSHWbP4XcDJI5m8JvXymtgDWP296gd+8Zu6PANwknoeSMmLhIQMOZm+V//mVfOpqy5oJ2ZnrgVZ0if5IMN3r1vVVKSmPUY7utosRGfrMWcWZUmLw2GT+iT06I2FtQmd+RKzB9ycZasu0Cz5yMVIe9BpAaLM6LE0O9snMHAFcESAoSbhsNlr3wgYgz46cnrVYes6k4MM1oYEgb/AJ/Drkd8X920/ebzjUHSvrZrE4WPt5kBTrdiVw/e7aYxcVdvxewzHntaUDrV2C/S7nTBQrVja3foZRPfpR0gvfTfsLrBFRlemIMG8qhYFzbfentcAuVtpWehuLsaBxXja1uaNLrY+7swxF78miOW4G6Aaa2kxCog66Wi9vST2ChdmhfsdRSTCVWMFJswCSWLF/seACN1yJ+HllSgZXWVVvdTxTnQSFqxVK4FrrvF13XVKbdpI3HSTwi23yN12mzhNGrL45UcVXTrS+OfPJwGZ4YIKgrNlQxZaKGHhhaOLKIKo+FxQiXmgkvJCZUVRJ684ovwSqApKIiqMRlVUCq+hpTFfG/FbVjRctT7Y9rUfrjlocF9ryL7ToA5rUEc1qGMaouMaqhMaopMaarI7EcAYt1TKHUGWKXAJAmUXKKMRK1DUNSN4ZiPB+unZSkALtEfdTYQkYvWhefy/zG2iTd/eEcNe1S2nvgagXRJPvzemaQZmbH3GDiby6G4ik/0WsrBGMGOcqdmJiV9mzQMLZQUeupTZLBsPnsVN2GXGHzbxUfeEvXuHn1vkrrmuzQ033Y46v/wbTk+lESXnK9AMmEbAwvxWVB/XVD/XVbU2IUO65JtT6EQVu69ij1SBxyrPE1XkmcrqauESqSBOA5xMI0iu4aXQiFJq2Hw1XBqNMlqNJjqNPIYMFQ1IEonfndTyoqFK0VClIWMpoSspSJMV9rFqmFYeO7rpu5LDJEwIicRIOEe5ISrppkq73YJTZ7AUJ/jkJnglZ4mSVYMaokGl9kG9+ybvKs80DmR6tvb4PXVHOPZMZfrGTxuuLX6UPZy8nUThL08jQD5pM2TMlL24EsIKFY5sRWv6tkMdgcm0asXD3D8GrDZt+Dp0wP70J8ojjxCeeIKOQQzgWMQClSwZIkUKdMaMmAIyQwUVBFVUCtm+9kM11wxN9kTwYJy//IX01FNUAiQAMp98UGnTIqxgkmWJTEVDZx+BV3qkWEvR4NYEYVFeuS8XfCEqhHfrer+F9tFBVp5JEJMOFw9Pq674pmtoKycbRopNwbZpju9haSGSaog0GiZ9Bn0hweuyAqNyEqqZWEfsDltdRUP2nLWCoOsmcJsL1MICta0gO60g4O6MITIk+J3NxkxPDyG1ZVzt5SC/rUHa1iGPN8IYCAPTIsE8jgVC42txYhjMYg7QAFyOgIvpJ8AitgHDIPw0ozdiIRgcxJRiCh9yglH+Mf01d+iJHc/Ej2e8Q0Aa5a0Cyqhd5QRMX+FewApdWdAMgcZFBgVEuS+H3Ao2RlIxVxbob2yTRuW+0nT/68Waqw81jgmd8HFOJDTmEm9E4csA6/zNMBoH6l3KrL1GhSLAWofhNDqX2bHqybY3G96IYBD84Jh7XaUt0ZxTl4g/OKo/nUQJSOig4Sv11HsOfiLngPt9TY/FUFB4a8Sm1kz8cp9W1o4TI+43w2L2NwAbTIdEXV3zJyi5ku2X1hcTYzJMA/sK9nLiLKdKmOeLALP0lRGAXem3QV64o/TgsuwREjOJFOgs70sP/ShJjh/z1pe6tHl1DT9CDxNrKI8zhcOUwO7EmwMHHWGckoOgFknH4secUoBxt6305UbX/PocLydrcZVAe2pYWmJVsAQxAa9r8hGLAz87RKgTbBaPsBR+iV8UZcbQUr3xhq+hwNLVnxyrg0+rRWCgbepXMly/juOwsYi/AhYvSPzUjTxXFmAgL8U1GLIbqyeohmm3z4JEUdf3kkf5Q+VmeBvhBQvUlzIIAKiQBMyqkKF5coEvnWXs+Zq5fsfmVo/7G1JoYYUXUSSHflNFihbTZc5UaW3mWdOKlrWmNy6W/dVrdjxvPChMqT+WACYv5ktNSlMDoyBYMMxRHyEi8DgFGEApsmYDuQhFTRpuCUiDpUHSA1ZGkVz55AomvaGGESgxCjI6CDIGMpbAOGLjKzHBFIypOKVUptVmupk4sy6tskHlvBxrhVoSK/0PrZ4aNfgSYUsJOzRR2EVhd02aHUI4gnC8vk44g++sYOeona/dBT8Q+fEG6ni0Fo5roLTTyjyQKZOb+glN/VgIMmVSUj8RWX7q+Lkb+lLOMgspJ/EKPUlU2FTwxswNcZFMBYgQutczWbKLidyleBs24kf46lfMJjr7oFwmEC9Cc3MRSpgezZVI9i7F2zBvuy3+Q/fSiCTGsiJfzU8wvv26wzYDSdmw8Dn/Tmwtb0Vfi8ojCNNCI1h46BwjUBdjLmZECOd4kZYofAiRcuilEz6BkeIoANNMbKJMBWLOBDM0Pd9em29dSTj+fo2f9GLqHdshgcSUr4ax6+F64XI4DVQc9drtUbaQEBO9IxMcO5hDfYHpJpKtOcpXbW+asiPD+8iKMHMdYAfJScSNjl8bzlJYSe8aVHsu2AUwUOCR1ZNvysnaVRYpQSSRaJlMiA7oDbdVKLGiWQEjj/cYLz0SW38cWriGItckx82IJ6vHYmN7/W4+OImSgKdKR8iRh1SoEE+J0RhjjSUx3mxS5SoEqlHDaqGFgi21lM1ytewwN7cEWKJERO8Zu5W8mCkrfZ9D9CGCoVyhIkQ32kq9ZlB48w6EJqRHj8uQcyUKO2SzZiUhHSJ+fIbaOHOS6C/4+OHTPHF0lIQjxZFGSfB8o6J2imgGHVEvFNiwhBWRsoOPHz6F4UhxTRolqA3tSUKGrRYaBTWmzyGggvEI4PN85aWQz4tVEVRXFKJRPUVYUazazwm57kpVv/OTh24qZsKxqNu/T3MjBmMB72dBAfpQr2Dtwimg6BGl2eoqQc7+i6jrJfpoD8Ff82LSqM4e0wvizy6meVVpuBLJ60hDCByOHwwo9q14DZPOIBIHvw0fiR9KZPef4jiq8euFR+jhqCnYD+KFHqU88Ky5UqJzA/e8+D73619zHPMEaLZBZmSKomt87pzZxIF42BCwfb4CgKUNj0NolUODhuFU0JKjK/vcSTb4rjPjDmsydBQUgRx14SA0NQ9M8/jNj9N60qu/qkyZFtj2jSMa4siz1cm9TLPQ7jkrQmNg1zjxAFTUoVQKGR8jwXbdvJ4jWBcd60m3h5S7/Bs8QRpGpkxCRoJhRPzjvNScUjKVJbfozxVW2sLHdk2sdtvHrtmPwnhDhgxAk9LdpUpLuvDfcJQScUYv28Pr5aF6NhZNyoSOkt2gwkpsxHmVtSVIaN/CGm2utcWW2mr7VHSfF9qphewqod1DrT0OQgL8PHaYQo4UdrSQY8V3PBJJjmQkE4CJ74ILx7PI+dPEwLAIhoIGh1GbCEaxUbOtKBZiPsR84sewomNSOBw5AQEBMR/i5nPeKKGEqHSI6mJCwAkjyRqv15XIOpuQNkcBbYS1b2wvRdkzlNtrHwGcEB9oXEKEoiTmi44UmHBIwuFwn3OKQEsZgR9W+nVehz5wP85V/5diYvy7nYC9CZFQ8qWSLEOWfAWKjJnxzQJ3ZxlMoFHN9SREKGSGrC8aDi49uGgYDh5b3lFSQdJgniCY91NIJK8uB7ElSqDvTnVeP1wBAW4jd6/7LNWTwfNl4234gFV4M5jhA/dbNsGFUf3f0VLwoabnz2CrbXbaZb8DDrruptvxLzBL1oJz5GxAw3uyg30FE9MQIoyeGJKM5nU9gSXDFKmhmxlvPgMStkXnCk2o9guv2ebqyx0KJikkyG2gXAehE9cnNfBDqncJbba4DEKiZXHBRUPn0PByanADNEzD2/slVNkXEJkcI2N3qJb+5TPryssPvnaVIqHvo34nHsU0JZoB304qIDBfqLp2yLCmx3oMc1Tn5JUUepophcaS1qti6beQdhRFNGaIBzYuxd/VzkqndAFp5vplBoQMAAdwWDeI7xR4DnhYL8f2N4RYvPBpm7/8JVn4NFn7+SnFfxdB4L6Krpsmvj8hsEZsKhgMPw8IatYvc7M00ZKndiLVoXi8fZi+otUxjjEvZ0PkTuPEb1oKPdODtqrhbsqoJHOlEZF1Tc4m2onGOIu9tMktzZ2AH1ahDYaCXxxnjXJNb9xWdgJTyzDxgUhIl0v+kAKoTs1NoYoaV/xxb+J5hYKaq+HaY3lTtTkozCsHjkggjnAmh5izQ8Fg1hIOvVxzVrJIfgwECC0XZ17ettyl6Umly9W3GMEEydBVHlD1a/tAkPaSME+3L6pBU1jHzLoB1zwvlk7lUxmHoHKntIomMFHqyjaAWyjHXJmJyeQcaDYULccUYqZQiy0TNBk4XeWN1dkBjKbeeKKFlH5bony2YwieVhCauw+Kn9gkcR/1AhvrBmW9yLO4NwXpH2UKQwHO5+vqBPf3RVxg0Y97H3nZctC0PuMdvmFqAoK2OfLfVoZfHd+D8xrXy7jHf1JWv2PAeeAVUByji9mc1AgIKr0bZLhkKL8s04ZSiPWsKlPDGzlZUhNO7DBQp+wWavIV2Uk+R+Tz/PIQtH+4dFBEqzQ2NdBhRhDAWKZ0mc1xAJqJKTuItM+pGiS7tLgjWy+aYuo06k5A5Mzz3zEqja7Z73h6T0QTrSLWsnpKT4rDo7FJ/3qXkpSS1pUqUjxR545cJGIcZIgpaYtRth5/IEGr4MoZTDRz7/SY1RjUnAecJUQIpqG4N6poUWxmZgjzspGSqBZM9l06ijDpS3gOyMdSaWMQJEKzczzk/IwuYyf9hI1uUBA5cBOd3zGK4jsL/q9C80WrhcEWQXh4GIxQfHwYS4DEkU3V3CMpKGdr+I7C+DG8aBSEZGWdszlPspXC7CXniHbmhkA8nQRSptDjuc/Zwee4CIul4cB+Lp7FGU8npqDEkTDIIxm3ElFiEq5nIUJphAgUgh+CHzcChUAh+PAnlMson+zJYFdc9Z7WUnF+qzRtNcTNynarstyuZHeSoilGrQ4kQFmMWiNgiVeTiFkpSMb0jkiDpRqYJB2BJZmTPL2tx6WDYhJ/kCoJBzmT2NeZKmlAVB+MiOHMAIUygSPh5Mz/sNMLohfEJTqx+kWipoAy6AOYhIyKRSRxNiW2gXE82A5/bCwiatUjAXonNTMVFRW9IPoEzbtsxKXPlfM5wY1CNKIJSTdkpSTkxacpkt9KMS0dhrWkbMWxF48jbHMgyQjIURE2LMVrI+RCJnwP7pWydbxzUFm0YJWb7G7DmfTU/i3BEZzRI3+766ZWLb8TP3wXkNBsa4mbna4ThpCImISUg9MAkWW+OaKky5DncyustMoXVlujzv80+dmvWlye80t0T/Mtjjj3CSQPC/l1356gqy6DzFbbintzbpxd/tnZbBTJ4/kGBVDIvz7CMTgOJ8jJ1yOkgAKWyyuPEyl2T4vfQ7mc8lihzECvNIbBQi1FSISfqT8NB16sE6BbGC6ugffdmGOcxQBHevGi0hDSAdBn6dEG0yQo7xwJiXMINQg1oVWFlRqxbhsJiVGh0XuhdUoR51DSs/yGEYSa0CiaHsXdInhgJjArk/tWEdF3X450LrAwJM71bXPu3zjZjaDGBRm5Msp9c0HDD8GGRvp1a2QSwBx3p5LecSSRb5LFU1Q6/6bhPfolJ9KE+wfPqxp6P2/1hMcHZ+rzg89V7x08Bx+vqinvDmJYTMQbTHtgVYAcJBGY5jbhcfsnzLm5F3oqWFNhow8Wv+iDxcXdqQR3HBbimDd8mP1x4IfOd4/FX699v4v46Zat38LX50vrEvfOTw8ON19Xpg3OPTyk8cJb3pamzbM33JzDqacj9tlhkzWWWaDPjF/k3pYco+3tnHs0viPd8er/p6SbyLy79hwdf7czPfyHl7/7w537osi6H7LV/ZGhHoCU9UDE1UMQ/vah0PNfhNlBL5b6M09+4ix13qL2DHUAcRh24RWBvjMYdPjdEh20BKvFm5bkVItT89wBrE5zItqIOjpOQAasQljx8BtzeQgIOaxBoGA0hGNDCWG082ESMkZMW/i9V0vPwMTMAiQYiBsYoQDLe2IkAyNStCGXv1A6V3os+VvSIjkkmS95jOSU+NKubleyQ3eqS/+89Nql317adGmFwRhIJIbgJe/gEmyEUogeKRIA+wdHV+5zA/uS01dPnzrdcNp9WHP4yWHbfNYH/z9IXD+tM6txRS/TdPaqfa2uXD7zjPQp9PnFRqs62S7T9qKtIDpbP6LY28AToNXFwuFu/4IEfOjIBcc3x3MvvPTKa2+81ePfRMGwVndAdykQG04BBkpg1pbgefoROBHRWW7ilmD4AuSDV1lNDlNK4We/sIw9L7rksp+8gk9fw370rILBkURloNrQBKUsXGyeda8Cc6NrOBkLhXSb5FZ7Q+j9FTu48x3UBl5NJnlrfulP2WemETLIYAa0QTgTjOY1NpQMCxcpkeHi7Sr/miGkz9Bva87/rpIHJWxUWPO24WiMkheK7c3mboQ80ZpzC/iAq40zn663kvPKmGzcZX/1MsPYzde47cZt/Xbhtnyb27Ztq7epbXQb3Hq35RAs3XgkxDNaODwcWKCNu1RUBbeIfKjgoSeiNp4KNCSvl21iA1n7rXQZdGMmCcN63pAO5xx0Imguwxxss5wTm3eObEwAcIuZaSkhhCxVFofK22AbinmRlZrDf9T8NqL8ctgsJoOOzSJdZ9CBYqiv3t70omc9qrM/u9vt2mrtUr/0Q+c61bEO9XUH2lNTW9tYY/WtrralLayq8vrqaVq5JuVZsHHVloqKqDxXoaLg4zJtyiSxiEQA/6fHK92eeOBvHdphNLdM4FnmUChXyaPaIomWqDXENGn1329UR7VVS1XKqlIVKleZSo2ieMLL5+2XAgMdLd5AjGKXIV3abkj7uld6L4FeMTJDA31UpURgCAQUcplUIhYJBXwel8NmMeg0P758+vDm1YtnTx49uHfn1o1rVy5dOHfm1Mn5uDVuPTtrgmuurnWK3939w+PT88trjveP9aPp8zY17fByPT8II8nUaaZ7ASDCKVN+bNe3QvUNjJImS54iZWyqWxIYzQ+vWA0kTLZaYu6XoV27vM/D+psz/m90yuJ06Cys2EbUUGNNn9df30l11NnkcnU1palNqxtGU+2r20OKwebJQ9yo6kkyvjbSfNICPkj+CU9P4TycYrgYYspUNy1xJpmlJvCyUNznd6Za2HgrYOkkmxBadMji7t6tJhjLe/vO/7YlYoBxzbzzl1+swmwzTTJKsRxpknhEc3KwMFheCizLFVm6qoWWqAUWq1kWqZk+V9OVi8R5dEqnYsHeWqSmtVB1a4Gq1iyVrZkqROI1bu+530UxDJg2EfQKs6tUGaePd5FVC6TgdZN4uvPoCcOYlXQm5+oiG1hyRL78BQp+VvjKVlfTxjZApAnOXkhhxRWfO09Y3o8QZ06VbkXrGUBBglLZjL8qQn1NjNxKlPGECyZ7ok9Oq97CPjiS+Ov1f+/8p09/NiiEEYGiG5S794ppVNlaaq2tnmY2q976mt2c5jav+S2A8ZhTy52yMFUuK2pEWYS40TWTZHLTKLSwqeizV99q47VrUKzFJLEkqVNwx7uAVmxfLe+QdKZmROhDbFuxCtmrs70ABNwFhrX7B3RDKqyLmX2dg9irFSD336I/fip3Cn9WI/AzLCJvu33uwB1a92xBYfb2uN2Mm3d4Ti2iexO3nidyu9vQGlbxyxLp5l1fo3xkRNMW6cbhVUh5RtRska6Pz5xQE+O2SNeKPP4E3u8KuBqGdOpi209q46AIF/o6hRFw5QkoVeCTHtf+wfZbH49hJMNgCQxcwTe3O9HmappSNHOGWHilQ4tjdmmw2FylRimQJl449HsY7MC3wAtggNgLcKPxJYhQ9u30S6ThpI2Lk6iYg62HA9rhpAMPJ/EcTjr0dBLj4qRTVTjgezjpdFVOYj2cdFSlkwRerjpvDzKhwk05qO/1DJh6E+SVE5F9+Zl1cA7knTg08ku6TDjWSbTUdx16pnD6cDydL9fbbTb8mbk7cyxbeD6aLwr+X416/cFwNJ5MZ/PFcrXebHf7L/gw/+xrmjCKkzTLi9JWrXana+D91egHAxPFTGdhZWOwc3BycfMEX2QBxK8Kz/phnOZl3fbjvO7n/f6voJZfju2eH4RRnKRZXpRV3bSdZK6ltW3TI2o5o1N55YBxvxqdwgRAhAllXEiljXVRxEYHONTqiVvyXyX1m77lhxI/ksybAUahCsgKRlqCHmN913nFlYQpL5qofGnvqQOz6A7Xn4Sg0pHztlUoMJ+dYuCp+8y9QkFQv770J8ACn/jCf/ue+PrujM4w3JITP1z8E2zvvom6PUKnAV2cFuD2ZBCEQQLXIIEHwG9/x7DEBPD+T6uIYuiJzzk4Rin8xvfoDhyEcGYqDAIBpwQICIbzAwiCU7YKGGCSkwFXgY/vvxhgAdcgIOAa5NiAhzAgqYQZpNwW2+yw1wFfOey4y37X5T/9NQqD2qAzmAwWwz6jybjGNMp0Iejq/v64vXDuKNgNzZ2POe2qDs9vJzeoDFpYJZ9/Mb4Z+LQzTgN/CLyXeTX3dX9suRdzz3VPcK+OH+8oBfjD8wC/8wsg0WBmGX5D/Nbfb9FtvZEVbuENhjq3aK8IriR1o+tuZe+zwkFVkxOlgrBwbnTZGXWWS97SO883cIRDEabtMnvlRlbBbOwcQsZhL1xUBqctqRlR7eKWaLBkLvvBlilLgUJFhipWYrQxxhpnvAmmKjXNdLPibl2JTW+VKylqbWWuZmgKFIzAQ6IxBKTDuLj644OCQaDS/D/GIOZMYREhVJhwLh7viREvVpwESdIMkSJVvhy58gwzwvuGG+WDdBhpiokmmWxGllRZVdXNagoE7fvbAebZgM03g7k3uOM/APe6DnDJ88DhpQBg7ZX4dUsbmHPDwMc9Y59NMhoZRZgs5nnGuiYWSBZ7umtQYgoD5Ii74sB4I8bLYi8fxeuxB33s3/51wmDZl3EtotVid8h4Ow9Fz3vr7ckyIccHYv969JJmQk2/xjZzDXmWJY2xJDPyPOdy5A5UGNjER6yhLmwCgy32V01V7n0L1SL2BNkI9SSs7M8Bt3vzNEZgOGU7Ksf8aulOuQkM9vhl/0kKWLJPkceZAU0h4OPWTEddpSQElghK4LykQtcNJwacOnsg8iIpIb3eout//IRt7jDocgpCgC8WYRgxx9mPw0UsWUrjeLvLvXjaZjCLv0B3VE2ay2gfGUbsrAOmiec5cFhLdHtFjQjo8w0vTd3pXvXa3OiwXz34ub2lamfkF0QrpWQ3qtsaIMv1Ah9yx1vVbzHbJVcxBsmwrVc2GtYqIRotKSjt2aUOsQGmBP2xTHtP0xyNpISyKSHIHtAltUBP9NhaAUpBvsJiq1gHmYncG6hO4stJwQV3rGnJBGNNPqgRj+VpqrBHXGjEg4N+ztSovE1G615PypUeYiJ2OTOjYi12RwuFdvsUNnGQ8TTQafbVIW5vv4rWl25LuAMO4xiVjiOmJRC24UGHTQU1MoZyOT0i7tuEcYhnRV7U4grkGeB9ubZLEhh1t4SVf0wk+8/2JnlrwUpxOloc2+Bqr0lKeMENXjeq4katpml+mvFbLirqBocRbBiFiqGcaMJDcooqFDbMYIZYiLfK0O+4WLyFxjCxLAsvnSaWfTfDBdMwaqjnF2dVVAz5V9DHwyC6XXzN10YXmWgvLemIVYdNo3B64mM7pwKG1r2XHJslG1siW4xCjEDlyfccMadoec7b6DS04pgAQPNJYqEU9FzpdVXaBDteFEnxi2FXe9A+SWM3KCpTx8XZlSHiY/CxsjMjxMJm33fQttR36QjuLUfoMePrpWpJ5yg53XpCmxiUIAPDNGJASmiosSNuzlAKeLzBBY3INVSYVqju1nPJjSBcbD5hX48UDzZ+3kZj9luWNBhh1PecDQp7NW2CSRsarJixCjfH1M12vI8OCMsKgL3npYBJ5qy3bGL44PJRsboyaOmF6Tsu1nwDmbp1iGfznCSZ5BRFnp3x2IeQ5CCD9S6zR1OPLbWaqLqcQsdSSo/s1DEyrafYSKheRcqQDxD9+zMgy3tOOAqxlBuyobMtMd2jVd+J6KoSaFOHs3YSwgrTGoKALLbpy4KLn9M352CO7Dk//OuifrHdMBkqQ3MLEPrruwnr3QG4TLi1iNCM+WNpxtCWSUdlPSHNsLuCYwGt5rOMI5ai0dLooawnEOvRHQKmJ+Cdn2boiIsntu08QMwJq5O99f20stX2bwmDZ/6qiw3sBCeprHDCjIETw0Y99tLQE6I/LFktgUvuk2V+smzyEyd24cZElu99F7RLinhJRxbMPsGeBw/3oC4DZhmo+Km+bymMgUE0ztb9lB1HEWp5gHqclbXfmj9vY4974bd4SYFGkX7k1ux/nU9wY9H7k64Ajz/Zi2i/snr+LtIu2hLOktOl5QFVruX4wAssqCcKOhmdGC2iXVaspVqLGFe/zkflyOHA9z2+cQpjDBN1Xt9dVS555eBQ9p8gvMrk9mEtSQxP5aXZf8IDD1+BCHVP2wtDNywlLBu8ow+ZprDn0zUgWY/08v8BtoHXs/ueQ3+ZGkbwLWAzpeHLVfZ+WtoE27U08FW0g2OntRGeusJtVt+0Mw57i3Np8ww9F2nrr+UAPcS+dCEhcXiwyJ00eNjojzXUP2aDu8ogKNFNbgug9ZgNWymjQjxEEUxQnH+/K9AFiQI5hn16cEfODOOho0Mk/J5PgE0cR1DpiltgZzXTrErYlyRYiEqKovnUXEq3Y2Pr7zSItodOHENjhffih5i1Ip7iek/Hpa9VlLF25OmbfhHoKKQUHYCjhk8aR7MMvOwYFxeG1ego/vEM420b7w0mz72VNnJ6um2qmVruQLCSpGrjHdgHLabNTnc7DMaXEC0Ch7dLLiUvDMeUuKLC5ffUMPtnC9L76TiX2qli/fMM8UzjbrfN3JnQvEZ7zkfSAptY78Ss5paLSHzZ3jyU6eGa08zEXSivpCbMcg94Xsb1zjMZvpa2cHyy5zIlC7RP1zmkkQy0pi94SfF3FTC/RG9H3r51RVAVednY25u1TjpY6bIptVUNvq5MdgZMzdT2c/M3UYpJhlT3Z7Qu+iQv2kOu9r9MwmBWfkyi664XmGHj8JISPZRoMVyDbDegunsimKDsh62qbVFiBtPHrMOn1DYtGETrKr62y9Rsnde0nn49Gy9KXwxAKKuWxI7vzNnP/FKAlTmREzZW9OBVMqH5Bqx4kXqDKZiJyh51Rsu6Xkf3bbsgefXSkxzSrmKFxjxNYLv8Evji5sJXp/pdbbSuIGISlef1OOkGlkOYi2Hed63j11iPyhRRFfMkc5O9UeG/IDiu0bRs/NFOHsMM2OiIzBGHbfymRRnB2nOfRR7LNY+50uzSe4jvc+NeGBMjstW6R5dKabnl6IMKs0HqjSJtH+vKdIi7h93USFyAuR+doWfQsNqkt4eXTVGBipLrvM+MWv8RHotjJ37q1LoPtUuR7drcEPAORc86g+jE2mnHk+k27lamwBW2u0n9tKmZcRmzmGGHq2ICC9qFS5+lMZG+zmSCjK5oduQbqtistZMzBRhRM2hHwlB2sUnhX18Ba6tdKom4tSgu/7fAlKUbqCyfpbevQbSl7WOMQHR4jjtDLVsXDLMs0aET3/TndDd402WSlNoHifOcO8dXJ5wIKo3UGTGiSR00WmAV7EXPYl1d53RA+DNNmX2QzFEASvesswEyWvkPWZkCGjinda37si5+KTjXyhY/6RRJFl5a1yPrhIULZkXQfs9UE6vhBF20wo9mx6DDEIBumuNQ06NYHvnfZ7wPrkJtj+TkZYnZmPRRYhDt0J8HyYXMNRI/Kr7W3Ya3FrI646FQVL9jmugww2mUvUm4LnS8S4MaHbWEpMBKCYoVQNaBxGkPmo5fKnQFBcNLF3p7UEqpBo5mym49Kbaw8q1de4sbZHzkdhP4T4/ueXVcAwFJXzM9WN33Wp+IieYuVwUXtSoTdRTqmVyCpUGI6sk2utGR62uCjtOyNuX5lQ7WDXdZR5mp3so9sXofW6zSMznUiXj1NtHedSRb56/RyS/wVwpPzbVIe2DLKuYZi8CXecV8KS18WR/xEI4zQwfY6/Smp6VyEhy5ZQfe8KluiNLJGpKfC+9c6l42nPvSmf8qR1Rna611IiE3PfrYtjtval/yXv1D7uc+7qX+PuynHur1pD5iHtOEQ+OumNP1JxYxwUgybWQB0FmEj09o7fjSjJRu9gzG1n2ofTrbM4ci/or0dDBqXyeLsrviLcke8S7ezdbyKwNl3gnYTT/1t5PmQR5o4CSb9krcwTvZPWQvzGCw7v9BKVdhJ+0g2/u6cbTfGhcVT0xSG7DRzEcb9rD0uUVrY3A0dt4K3DqKTFweG8154iLv6NPrmZZj+UfF3iRN/tH86uYbWyHjLSZ8S3bj8kyOu2tujg47M7vS8VV23MxgWDO7UtWGePM1qqNlODZwpRlmYiBOaGt/u18FibzmGUHCh8Q0+YE7W50cK8XaEKzTe7ljzg0PrTCzFCgldXTuFFdL7gadtwQvll5+25XsIyna0yfLJjuecu8pxqVaMkbVPUmacWq7gpouerzb/oHc67bmLu6c+arZHGiuJy2YN4Lah7YdAfXQj41U2PR2+C2qqzF86XPgYa2tT3W7RtOWfJiyBD3tFttzCVP9IJG2+KpptX/pOhVahTpC78k7ZjocNnd5AHXAJtd8A5XTZlb1ofKH3kaCnMBn+W2FtnDrUcvnY6eVdcX7ryJ3Dg9k2NRj2KK4gYs9bWKv/aP+VPNnH+MmE0dXjn3CHinmMHKgHo8Nu3OMJaZIHftgseJhJPLiVs9G/l6wgcfw6Lhr1vGy/5nmWmyxyPBjyOvPcFcil13pHVw1PI/+OsgF23iX0pLDNx7t4uLEuocfMtzvyjzzX4B7mtMGDrenkHzjdixZCnlPOrpdZKnd1gY/lO+5wcNQIKE+aLlWZTrTpFF7EqWjZhApLtJ1K2szc69m2vy5u8SHiKVNCvw7NpWF3stp0kKjUbfsFHSrZXtiYmn6Gd1c02SmCe/p3kx/xui+3gM84sQff+j+9hXeP6h55FlZz9awp2YbhN1Qdh3A8+FBx6nZ94sVVvbtmeq4ZYyGT6o5LjMA/7uQ8bgk9uHuXsdOlnk9vma3OsaPH6hf2tW8xWCFoY5vMa6+FT3Mjix5CQ5HwbC1Xz+KBeSB2J7Z0OvVfvItVWRLdOPG8B7gj8aiIEIOMVVrzCmLwUA+DcV703a7rbJBZ7mLxy5K4m+yWE+j4qfk5yUzrnLKvloMg43I7jc3N5uWRaKmpX7W/eaIqZYV0f36wb73iUI5udBHLqqsIBeH1wjRaVl3437K0sYD2eTVKfsr0/vb29P79ldNWRRdnJztwmZnMoakkot7Yo92mSkOdSiRny01RH57kNFvymYtS6NRQ0d5a4cjK0xvvNzxW6BQZmmFqbCyA8NUHZFwC2zWVDL9ZnUFNSKSYUvHAahKN6+mcr4WZJP0oBSPnYoV4om9vCzgFahuemIkwiv0BFGVHY97HtI/ho3t9Ubawp/8VTd0utmlfQrq2je76/Rk6ERutiX2e+Psz4PQ4jN7MPnu0KXkQ4oIFnThP/7YtK3FAg1d3kwPZnqS+P8KGpH9uKWxxdhPUYaOtVGE9KOi1LxAaEkqHVosGkXODyTTKZDmIEL+bM8a7LXOcntdOPNbsXfkz4028EY/Z9szW+b9lTUu9VnHfnZcAvLsY3zP31eV7FW/2JuvQsIKPlEpcp6NvCb+ebY0/PdN2lcN3fVDzYABfVZB0twob2xFwgV72EthER+X8C9c/xC5rdCb6AadC6vU6D0rKX6SvUYhHHDxlD7dWz/+5eGuF/p1JjmFa+MM8Mc0vZ3TF/syBsKgugnPvMSb9LtmaYZCbbYIKs2Y36XfTJTP6ybA2F9b7VPDfAloIvHCsBH5A+C3nYHahWObyY69Y4u3je2AnqoYO+K1gczW/LdOw3dToLa1PM0Yy3mm+Q35aJ6c88y4b5TZCftGnZeDdyZ6OjHQ9JwCetre9P0CGsDchfxpsYvr/8P3x8BuTDzW3HCyta3++PGGtli/4StfaGeF2Orvdnv7YhQ2uxsLeFqVzup8z6+t1RpWO71/bxr8Enf6p4fHd//y8In8VZY4AN5nAcDv1vK0LWu3NDWv3dKW7qsZ7fsMgG+yA5+2Aw9IK3n61j3wJyy0QhPWmi3hBolNsOPJI1xrDLPJ/SLXo9jj4RJFW/fkGiwWgN7+w1VaFkT8CkUA6fIWygKYDZE/4CXhDwLFu2BI5N1pIRbiqzes+b7W4Ax3eqwzwsPHQue9rRBIHZTLglJV3O1D0xGpwuzTp/yCb7pCydBk4j2RK1tuzefmCM5AFo6HDCuVXYZCsUH606EEdGW/mJiMO3sjEUP3o8JIWKVK2+yqVOBIDatTdrvaF5gRmkG4+0jK3cscoVSOmhzmqoIagzKs7m20WdVprk5pJLXKEHdFVwwwgOcEIjaeQ7Mr0FDiU3owFoIub/u4YblmEapNnV7AgOA03NVLBeyzc8FQZQPdLc9760iaH+pHJWmzW0tTskD8LT7BtZcYcO7d1XKz+wzJ+zNsNkfp6oQFmlGB2j2dmHNWJGLoSY99f9bdUCD2f9rVlTMScmUIQWh7OZIMKZS1TZl0OJR5BHiM8hrCIUOl3uRO6GQZq4+2auUrBHK3WhySsYHnj/5PXlWqK2WiyxYBs1R49FMNqLtxiUWx6T2jeEfFBE0YBNhnQ6eXp7kOJD2ob50sgjuhuj+fl7501w89vWGB5y8Wgq6O+JpviRlZO9ImRxU9ucKXtAZfMUkHBX4Fj7YEXzVK/ycIKMpSvqT6SoOxtraz0kdbg4TdLP9PGJBxgRVkt8/TFw4bukVW4pdCeChWRZXalMOhqP0qVSxAvsYg9vJyLNwCvjcRjiqTBxqK3zpU1BGyFy5v9VgjTiKr5eckHLv8Z1HTUuX/fRKHdj16r6xk06Hq332F4msiXM4BXbCkRGsuhviOkFar/kJcsqfYfMfyoE2mMrjTAhQJT1z3eYAv/lcqv8jjqQOBCcEJoaBRY8CrxOANamsn17lpfRh36ZVulTAA8+j/YkHoXdg1EbTu/1u1e3vepi8rLvwL9iz8m5m1YUjF6vSC9UNmr08d+je1eAuomgC0TTRy3c3mdycO2/Z37b/1u+9B7zCbtt4dDn7akEwZkqm+vbl68weL8a2q7X3Vw+vNw+6PH7zydfXevhHAWoa0ishVa5+B7PKXs4ka3f6MVG8M2mBPUbzCpG/z3r3ll0iYDEPvm70TxYFJHusMcvhY6DWiDQLuGbkhaJDQGidaEVMph/y3k9hVbFZAIbJ/fVSrMWPzxj7QM7y9m+yK8BJSNwuAr1plxxNrdxVhahkRr6VAQNzilePwIQCelQjA9RYvmHCfyvnEZI1stgfVBsM0qRp65ps/JeEcZu0hSeusTjyop2WP58W3vSn8F1dhMmFYiwpDmFSpxGBxSKuX1P9sASuZGwRGkH04NoeK4n29WDjch+GzI5R3Ti9O1mj8ajim1cKRgFqNBJSKiE4Lx/xqIH7Aqr/Gqg7u78rvOrD/9R3BJaxAiBVYGwTDdNhuquRYCdX5MH+N/p32vygRdaqBWkrZtOQiCvgL72tiUg2uRL53QbetOKrV+WlY93pe6Fm1gcsVK9ed3KWeJRDOREEunJ2qaALJuVxILproVDmVoeK/du96MyjSWBvMlqzXa8k2mK3GGPLbsU24Kl4KUgpfr18VCC1M0aFFKwMNHWRHR29Xc3NvV0cH8Bd26mSXa2MQS3jI+ZVkkiAFZ6cyEVflPB5Df6tOVpYrI8Vuad8Oydg1BkuT0ZHFcUe2yWSxpGR6kh4ITSxBRgJw//BmPDpJA1IKaa90CDWfkg7JbP+6gmsgWgIOkvvTVbF2rnYrvcGpTSUV5xeQLJiho9ohTcm8UY1Q9jD9cIwyxTPOX4BeuzBNk6mhncpXT3vPnYeI9lR+CVvEz+aTOR/tzegGoKFd1SACZ4c6kkByTieSc6zI4CR1NKHYo6FgLS+nbHVWc9bjEZRam98cpBReNGQQA6nXGyjmOUod150Si07pFj4En4SfhEja5ZIcWXHlEv6+OrO5xYOZs3UWiU1a6i1fd2778v/bvvr6d9JlY1qmI00yrutUjIGuCh1RYlqtYotu0e//vEyX5L8xAgIPQHRFGRRV9pSrHJW7NArWYWouMmtkdppAgfijCr3JLzk6M8htUysVtYKJT10+Hj6HK2EPqhS4lnsKwdnABOvRa+oUBSTwtlqsbUQH3eUO0P5AIOXqojtwU1urFTy8xjIbN4ah6h0bM59h4PklLNOxYSf065IN8fkbBqCdkzdUHMIS8zZ8DH28eAPgPuWjt9yu+TE94tDjCFa75froP+TVB78dCW7/XcBrt/4KbXpVM4D/B6xsfJc5umv9j2ogCv7Snvxu1UXozrnz7vOCvtjxkzEIRGydNATcOkHhqtGLLWLfh+LcfHcnP8XhpPgrbAvKDKVMEQdEbI2LG3APOL8+77zkBIhwttjsbR6svLXN7jQlxbtvS76TKIIyZUinQ0IBWOGM+FMbLR//ZMU2kWIQsYWdZydr7o2J5eMv7rp1/9xYCkRspZcmlyYz57FHBNVP6vrJodQjGNoWYOe3y938yTLZZDdfPsPZI17B5a4QA3Gb0+E8P38PtgdcBBISKj2IVu+ieShnJLn5MeGjaL0kMM4nOPKBj6U1ZGT6mH0Y5YGeXdNdjJfmNXaxC/bcFijSS0vFTwPY5TbZzG1uj7m1yeZKsq0e9x6ZwxkQfSklVGop/qVI9FCTatXO/yGIh7PJ4suKl1KUlflamsxOZ7PZo+Qc2WZLedSaIJEl8QSymNVWa5zkcf6NSIIrzJm0wvXGSuMgcDAFH30SrPr49j2EQvgP9wWJu8bi4bLkPWeAo8FqLbpKvVJMG/zLB18zF/tagI8KhgKuEASoAhfJHx306aUuYU4ime0WwLaoQfREsVj0oE8s4X6YJQV7dFhSbSuvVulSdnj18Z3Qu1yuF3E5GltNwD7vCn9fOZgI5v9QtT0KmFDVSYOJ8a4g559I2Oalk5hSjHulSjEmsNN8VXc2xmPfd03HShX2rM3e6vU42ieVAyVMafjnu4IkUo7WFzYoPWqfIXITU72P+l7xPBDOOME2NVlcLRgqSrlctBCNKr0SqVephL1oiIKQaggi9b7vgrVIl+jrcx92foQ2gmbqq2lpOHGAPpzcD2TwtJltdXY5B0MfUWs39nIt+soavcNRrddXWri9a9bm93f0mNxur2s1u6Owiz9ZBne4+DDs5nfAbcWSDpV5XSYT4UB1NpNJ/Nsc8CXUu2AHx9j8ymDOjo5yjykD3/2Zn0TKtfXCm45KbzZfgeAqolvKGlUdxRccYqKYSZBWawSpoKGo16Rp1IL0C2DyKsew2WMqeVzvP+AgJ2RaIw2UOQdKhOaCZfrkoHfcEWXR3xMZ9q4XTuFaBa9XzZ9Y8drJWYOPZpv9NrCOqQyp3nxu4a4SZheztIpZMgFE24ndodJvGYw/itmv1va/+YrK4LGqSpeQq0bqxNhJoF5BTv/uyLlHQw3LrppBI4sVO7rgnYpOFjvD5qTYhY9apxNfuWDePrrw+CiZzo9ZRJanwDam+HWLgNtvO2wIHhJ8/NZb9zyfDBc2juAJAmesHD+L6edw/EyWGYyo3rNOV6+v33vK9ofpbWunpQPsZAo+aBQy/7eWOZPB5/Vyue08fvGyUZtOMoWNH4wqOV068XRJ6Z7S0r0TjxSPKi76rqT0ZhFjJKitEtx76+LHnnvDBdNG8IT+14XiM2Yht992yBDM360zM1lmTlmhvsAOZ5PR1yBeGAoZCtYTnc5mEqG9q3MAmUtSyNyE3/KjUOSueAC8n4TO9RQIYXpfue327Pj5brSMy7m4UAE33PZ4HVX+Mo27zqjP+AsiWs+ymTtS9MwswAJAlfxAkBPmjgw5Y3teu1g0y837D1fEYAw6DFq/WS9hf9BM8nZrXXGlzVGrNiaNkuNHZ0P3cLrc4ahtNQDHiMt5tfpUUgPdDq+NggIoaySB2KO08i8yaMWSMY87nsREP9lpsSLTGGMzP9RM/1pha7LYsx6Xva3dDpRQJkTucklcZddNKrxpy9gqbmAq8uQrJ8mCUae00hD3W1FUY3e2tTmdUZlHIvXIZLDbI4FhTAK7ZTKpB5OABqRLIuv28ql1Q0bEXkjHtx1GgRyeNoOt2uJw0w+hlJ5UmvR0DepwVKN62qTUkSnoSw/tsNirWw0DaYDbLpG0rjoD3FaJpJ2kNMx8dp1wfIVA0D5eqMPt4HW4/LvmqCXyfMFfr2h1zo7y1nany9fmsbRZHLo2IeLJPD5GKvPctcil7qQMNnQhV3hOYEd8Wo39WFeX/ei02nhcUPRqHTsWxyJ0aveyZRqng39XgmT2uUWIe+SzrkGQxml5zIMRxIrbooN8Pur3eeVve2dRvAPGUI3eS2T1xiqLRkSb8BeX3jxx/EQW1FGBFPIaQThS4KK438YJI4wJV0slO3GBzBE1mSmXSR92GkV147IU70nUS2sczgbUlDHLX3l+J6Tt4nmVrvKGdhMwzjvJHyoGkyHo++oDUSCDul4Wose7wmX/xGN2FQFLCRUiIbwytdQlCKdEyKTOmJh9R7PkT5WjxVreRmDlHZOdwAFTBv75Lp9GbLImXBto3qgNeNW5Ox/e7uL3r5AwpBT/X0kSdbo6OzyeqByXyXwKhQzH5XI5IZfhavn0LQWOIFUqC8e2xrfFtslCYBp1MCOPpval9tL7gB3eDou93urEK0ugHhOFmvSVdUaXq9YoSzahRqof8iUqnVZH/SQLFpVhglVSeFXKymTeSxaWruL1AVeLVucHiKBVZtGqIpGweDUg4VV/Y0vaE9cK+ncwGDCpnuZydXRezkCLfiwQZdQVKR/lq/DKZYQcsbxXptA9RSB7ZG4w28Xz8XMYECA0OW5bkUwqem0o8QuGUZ9D0lbulLZia9HqVqdT8m84cPSiybP72DSzFyC1JwQuJ+Z5afuD+0zhCr3g/5tdobLeD0i51ZZSqcJKMcf9bpZuQvuXAm05+AnSGNft/jzMueA1KgyYVcVBlgt1QZXapUJk+9Qq/YoQa9f7QanBnJSr/SrtX4Bsc3jNOmO0Sg0s9eXsVWlv/APotfxsCPwBVULoID4Ncj50u/VmH6ZHccLMq4TiAonQGfp74mHX9fHLVMaMRp+2mIyZWh14B3eNFa3UakVJzonE9ONuBI66ozC/2Xy4QJfU6pImvbmixmgOiaYM46M+3CDcm2/iD1sHOb4K70xvj/mwNOTyeMQ/3z8vvJYi4He4qtSaqFpv9W2EZD/CiDIYV5pNcUQVVMJ3JkAbB/l1PewXO0MoYVKrJYfqcCf4G4qBHJTK9iPIfpn0ILgDDyKNuqJSfpPpUIGW1upoo8GcqTFadJ1bI4qrtydnjPrWSGB6PeE1At4yDHQ7s7ws5tLC8jIrQaVmhSH+y/elD+Xj2sEWCtfzbN9z6Ir5hzGXs9bNPn00288ZvyvJkxH5DxgPRuZzr2b6TEOXD0YUuUcWPZBlud+o4O0TjTAv912iEGaqB8wizq0ekvekFoupbY5KDZo0ygXu2+M9T18plctFScz0g3takDZc7zv//fOb2JJyCobW/oMVSlnqGybx2FstlIzDLN15lb96wlXd43Lvqcwu+1laGVhQtz3UUtIlZngmS2IzfTPdOcknbn2l4ZbtwZbhYJ5kILSMmvsjcxTOLD7+GJxeWMQC+HqAohe0fw+k//MhN4VH4+FlNZS8CPwKR9XOHleBvCFtezg/cV5PXSfPxjnKgeAyavYPrFE4q+jYXnB60RLYoEHpnbmfcd5FncPcF1wXtL+tWuZi9OzX9+wbBqWPjFsMxk0lgyf+r3gN8gVdfZ+U1+lm8PpDIUPHWv7JjfXEYvnWaFRQnng9yOkj974xN7bCdKqZbWkgrwkNwBK/9jRHNKGYKJ4gZp/WfuFjEmXMPuI85WkNgwWxip+1KPPEWcBpaoAkqM0PDtMQSYGh83OrbEPeqjw9B68+OpDVtOl9Ys6IOWeIkP74vL8JxHgQDgI4knSTjLCvvrwsS297NcG8wVKWlzm2F2ylcC1vtwOlrz4o/PaYdj9fV6772UnlleD7pHevlhbOvhPtwNQkzt4TFmc/Epx5u0XeumlpEPH3kQkEFGGA4VGhvvP+siNqNyaVyNzsmVJ+2aG6Bfu8MFgfg6J0rd7jSau0ntUBbnLMWpsp5FRz/3l65lhR2mAIWw2SsFsTLfG6O4lO8BKSe/VVjbpldFK3vLphlh6Xkoz7Uo8C0RdqMkI8AHcGObvJuD8j0gpfPy8hRIniD/KIXcTOfdN7LxCXcZ8vdpeJOR4Jxgmp9GhFldFhiyBq1x6Su67PIHU/w5FyMLGL44XZP7yoR1+Ea3fi7KfW35DrRvgQH/iN9WV3w8rvudD4ZU8b7k3P/PeC9whxeHd4W4FnkNyLVtXrlqUyupXVDbNQnGkZQkqx8zaOJiPA/XAuHIQ7cSIj0E7ckpNJ/MJE0Qd/qRU4U/xL0lni7N/PSjEBXKZc8w+RqxTJgYHPx0OvXhnmvcyebiyxRtpKiXPEq6/+uiLY4Zhj/Nm9qf1gYGu1qB+aR1Lzni8H36asiEaJ+6H2YJCVYk6D8Gfr4A+l/xDzCfCM9f+S2ylWG8SaNu/IYzNj8Vni79UVxIK/d30tFfQ+M3//52VnYemBQkwmz3HYLsa/L8u2obNDi8Co6WNabHm1KxbegRb8ASa4eF7Zolt1T3KfFEvIzyWSN0mJmHwr/+WnwKdzX6zk7ubydnG5r/C4r445rn9is/xU2ZLASfN3W1988aUXt30HItvnbC0gCraGLOgYOpZt/Y74bht40HTX85wTiAlATyihHfW6hz//+qDA/aEQINbptmyH7IQCikX0zw9BItG2dZHtT1VUAN7TPfj1mqDpLzWwEQJdwY//uacUgGPUxBpbe7t1ZTRqXTFp0mpbIrFyTyyvaQuv1mVCJct//v31uwqE1Kmq7HZ9Fa3TsX5Y+QukwfJLL/BKbvyTKME009Op6ZOFGbqind6jDT6yhP++eoBLjjf9KjgTlssVa/n8vQq57FYMDEPdhdwHXKUyQCpUbjLwn18Sw0YwRaMlhZ8+kf1UwFH6xWY3Qpd54bC5OeCvlJjC08vdU4NaacbnezC+8izfLUZlFIkABs42h6PN6RSUWmfyGrPm+HVf8vhf1PG53T99u3MOgzPA5w9wGK/vHvnqRujSJbTaBKrTxknpUKz4jHuUKmVN5Xvm10gpca+O8wK35E28wJbMQ01JJj1XPdY5dvSEcRrwx+M9u/Ng3tLRfk/ex8rDDpe9JfP8+s69hMNPw56XwJZr0QGrUGTdLxKtl4uE8g1WdgWbk2GzZ3HYvYCqW0euA5uRudTS0mJZSpKGjrURSZb7XzCmUG3KYFDU14RR5uWtfEH4NkuwnikRKxYK+GzGl2uCMt0c91QNndJMdblJ0nRNul0kUzToKHgGdZxFHE/Ylv01bFuS28jvHCKQfCMXNK6A0qpW6la9FSlxlBb/zIyCYn3xeEbJ2OKSWyWMOy8zHsnyfxnTwCx97LdTgvfW6HrBDonOCVFkkeRnZ4SWOfPjdSMi4L0Kzren2ZwnvuXwh9Gvctjnv3236GRR0YmiwpeKil4GWFW0aOThQaMeK5hAwNyikuJpo46kjnyMn0fA4yGw44XPOFlMZh8r6i2Y0Fc0ekTr04JqQ9S9b3hgUs7ceQ1kjQr+erkcuenTHzenyBNdypKQ/8gP637MJeR2+R2wpbHwVmHx9eUZTxQXPtGP3vPAp0lqmAjCaKEhP2GSjhffkSHg04RgbTq0l9wrGoXAYH/Cgnkzp4Jdobk4tw586tDfcqIf9BMuMuweQT9QwMLHXng38RsDXO1RkyoE3XDqV2vCAQn/EHFZhQLJyOA2RNEOehy2IxdQ8VPobgI9sfP0URsucU4h57L1PFycPYZjN1nxyb79TYL347RD9cPw1jQvttz0RFOz6VRsxVwn5G5uMVlNgzj8MxqwTeFUReC0YjuP4G1XnA6mMmHno/smPKdkgm3HuQT3+MUCqYowaHI7zm8q2b9niOfdAiY4tne1sPvtSUed7AVX/aYGOdos9VJ4ipvuv0UHT0bnP+A8GA02Yc9R9mHc/fhDkbpfq/Lqx4WfRhM90yKENa3UxoyIhlaVvS3096v/sXhuZLPsYDxu6GVz7/jikStdXSAngpMmovYOw9wgpilSkw6dhjuFhLATPh36OutISZAh/Rw5qTJVQ9VG9UnFfSkjCBY2NZrfV5xUE2Eo7FOdRD4PjUv4Tg8qmjZd9M+B5vjBzKafr/HFTWDu+QpDnwrseDPhXfQo15hy2BzleqS7q35SBKaQzhUVlc7lygMV0SornCv8/FGt3wxnPRjcHDStJmDWMA+c/bc5OH/Y6VO4np1t8gIFDUxb/0O5zBN+s0R+AFVgyKUw950Bmqcx04ia1IknlR5Z2jjynfcAio2AR9BlRC7sW7JsvF+nR59RqH1mm47SGecqJJRc8eWvYe5bR6JclSkqURJquRJblC+xkHoUpTIIKKhTuPkrq+ZHqehM9lsDwyDQB2pGaoIvxPkkbNUbMDdq8GAG/gdEUiwVEtSQkoMaHDenUG3abDWka7TgX2ginIHtLAKW8ZOvYhrsnynn3Ij+jyPVB4GMuMzQUSokZjDpUhUaB2nAnFoUKzeY8HJUiztBfMzHmigS1MQdWdibp4ospe2ONmcnuUiXAX/DXqcwhdUaCyXOn672wkrUn5IbDLRc61PBKu/i/MDmWWjUxnCtwhYzEiaFgjAZTT6Ir7xQtV8iOa1SXUgbXgd3dGlzucJAI9ca15t1dKXGqomyX9nOwmVaF48uMuFOrdZyJr3XEbfehqcmcgz0Tt3H+xn/2a9HHvnIzgrryZdXAiSub22KOyqnW/WanNuj62/MC97f3Ge9UwpGZeFdqZCp2Wf7/l4p4d0JW/8W5Hh32q47rvYO0nbP8VlGaFvY7CybQ69NUqBTM6iP6fYVP1zZuOXSreP4nuf2gflg1l1n63mIHqnNI82qZ9DvcsSgUNGc7stXJsplGaxj321ke8kUQVlOFsvrDeT1ZpBpAinVTtrX/Kv4PBGjLk+dYgNEHLxv2pF4cMrUw2LnfcVqukEmaAW/aJOshAsVkypYBCsLTYoMMhyd4FDZYdHqGG42RoHWJJuDNiiqoKqbFV0uo7vHJvzEQc/51YQKdSeHade+Vvj8cBq1zm7TSFrgfoT7D2jTv7II3B009+7qH727Uo7uCeFH9wTeD6zIO6LdMbqXdx9XrPo787U3dH4l/05+IJ/2+oeTdpBXkrPkUy/739o/blR8cQPIEwg4bK2Vdpi1DZau1Flm+3O9Kn940GZw12+02ObCyv06fRLCbEZIyDAJKZGQ3IFP5Pd+Tt2wnxwetG2fcdv1+6GipR8Qh/ThPxONYZyCOzLSJiM3ZORSMQ5iSxjTuKYQViiExQphiUKoiIHCuOLOfl77ONUNjwTXPYrrHwz+8uGQG2+LwSunInlbB69eihtewHUvNF7/jPFJuTvJjtP5pIXr7FffJW74VuDtINd/LcW58eWUeO0bueE8113g+pfxrn3mrPE1E5GR95Qzqye8ej5ueJbJumdvUT2J6b/WPoxc9yDKvPbV3PAyrns51z+Pv3yRX40vWVlqqk7+cigxs7jsGEtdnZ+dkUvFNy9NWsHETfEZyvkUfaFrTZn7mn4kNWxjsl5NweBXU8irKOLpmeyZBYsqMgte8rLMA01PmmvLigtg0rhCFhdB8+0t2RS1q6ZZ7q83pGI+Y2e9RkK8cl9YuZXXr727NBpe6bpXn7j+RXf31l/fOtf4ijtHw88CTtfrrs/ZaTQ8xHUPs8zV39fOtsbaH2w0fK/rvl/i/7Hn+m8b7P0JvODPsBcOzFO9K5pfPteyGzdYusncchY1R7W/CTvVPLeEOZ1oHVxfuHttNLzada89mat/yd25MLn2EVvt1rmXPOgEF/9y3dcDPdSj9Dj9GU9sPEXP1JU645Clgw466KA7OujAYZMDmoPZ81D3PfDQI4898dSz1nW4pADgzInO34w3WsDm2jS4RaMQHqmA20NnvmcXeAeWLuzvdgc2dPn2FccgvhJIJBosqdLFyljK7KWrYML53WCncGuh4j3FfjLMsKm/1cnJOeUWjUaf0G7sfXeM2x160l7gzOM1XFSiS+7pJl/XTbmlm3prV3qlad30+3UzHpSZ1ayUddVSth31Ng/lrG8zm7fsTYu+e8Znwy67jjfumXfyaM0//dmdQ3PP7LmAzX3OZN18h8Ry++opJ0z7hD2c1ElO90/BLSunojqlU1zSJS7rcmnvbrfrbrfXwRM94ame8kzP9Iw+9dFf9+eBycLkQB7J5EjORyqSFhmSSYZJJgIUUMz0zaAvXB2YzOlM6aVt7hWR95G+hYEaiCtc0YgCsriS5JILr7wMqYeca/1Liay8k57e+jb9GxB39fyFLeLc7ZZ0f/z9fm9T9aO//+8uLv/YYT/Y/R+w2/fXKabv8N6/clTFYT+44iLAJ+6O4j4VGziGwHD+87uvg0MVYAfmC9aCm0YVVh47XzXHyvGxaZcN+vuei9RVSNKfk9q/AFtAl/3nqSICvrVX/f1pKcC8OzPbPSxupbbCkvaV+DkK8SotdJPEAhlkwTwSK4Anld+ngwbtrFx+8Nct5ZjEIpxZy6GJdvVXgy7MRR7g10Nqfw359yCwfmWk3f4P+JIgD7bEXxEIc9HadoEO2R9HO6q3J0NmDbeS526SaJfd5N6KejCyJI0DN12x/NiIoe7ZPy2Xosy3UZs+9rTcDGx+UFsvn8uh1TNP/j7x1N7+nvlV4+/I6LlVaGGe/Fb7ElCVLmPIWwqLpna3TnbbEtAIW5n64eOBdeV44BRIAf3oElCHSfo9gv2d8P/w6Or/ezDEAN8xPOABXxdRv2uSCjB3zc5291PctDbPkusrJ4ejEA9iF0lg2c2C/oOFMei3J7n1UAI/mOlHuh16C/yJJtRDGGJab85aOf3PI1LV2CfQTctgRXL1MbRYszdkIrYo4E80oUQzxOte1RrdP6dxohr1kdm0FOVSuStMSdo0TxKZxBYF/IlmedH8MiKpV7WugtYfE6mXMqLAD8jSXdvbKnO4QsKhVMtMQaG9VERQ2+DIDTqdD92Hb5SEfP4787NgnjGDouQ63PcVBWjr7NmGhC4HORCdlVsX9bLSgxGyQUXMQU87xianvrbwrBhmcBFfODR9DZubnS1cedADbniHkEnKaHTgn+aDF+uztIrA3HWU68g/fFp2IDWKvZV/Jlhq5AeS83e3IIommIVMyypAK52QnyH2VSo6j+s8QC//x18KwNwiiNyb45l2Y9riZTtQZnTpLFDe9e3UoGNV3IaeT9T29qA5gsJixXPH9PzVprknZ5tWyQsFLm7UpStyl5U5bKMefHfZqPQ1dm4KWQG3ElisNGvTQpQo9HMF3Xzk3gt6CM7m3Q8tFUL8BqF2np7xGX16GjGfmw4c4PoR2A562AN6aAAFFEA8VFSGb3fz5yYbEPqOQ8Blqv+7WNo4cmf/d4YgHgB+/ddDGcBfHGv6zXeh/xdw6YZNF3AAAwT+o1ry0l/oKP/bTgOOt9+L5tnjld09xB9GrKPoKe4XPuOAn6yT8SAFqZHoRUdke4myL0GoWDQyqn5Ib/5EmfoVfePhGiNHbz2tH/Zmy66CrjLKruNlsV7i1UzaqbhJxR4/mtyso+WYB/JbKOBIzVoPF/NUS4HibiJGZAp183Wkk8dVdpZ5UnutAPyPwll6tMUzk9c1jPsrTwAbS4p9UsaTG9QpRR9v6GbWvEMuHtDdQleTfCdrtCqUudGkQSQdRObUWLmXcq5Qdw/KcYly7FFoluhVbubd6L3eprJuZipvBppg3/2VQXzalYweXymtYD0e0RQp+ZJf7cOmiyZL8Q/BfSLloBjOI6du6FjPGxLs3/LU+2sv67r0t364GUjJJ7S5RtFs8VwTQrxcpNXhBuDomKd+OJs0llSKyJjQ8T/+2SaixmBmvXQfkOQmaxGYWy08BwwoB476sDTbB8M4a68gXmXhaJIZ9B5SxibgGc6jiYucPoEaj2Iies6i8zgyVmB5EFIRBDVF+ADhDoCLm8kVsxkMg2RIABN4IAZS7Dj+WM02j71bOz6hKWHPXWl7JKiaVPqF97DzDwPTzSZPuFjrLKEeMWiX+4JzielC82TmOEsr6OOASXv82ywt2G/axfQNpHHLoMCLBEbC0NH5zWA9E+Xl3DwI+ZxIWJ8Y2VMza/6w2HWlpqY3vR3Y/CKhH1a4u7omlrA7JSzt3Ynn9FXMe6k9AH4ZdA8wt9B1Lm0FEFg30RQbDCihCNsLOcTWIKFlXHWJYXW6uNe6CpPRSuZcJlgxPwsgP/6BxDM/RChlelmu84KOOUXJlw1rjYwJS1lwjmBWmcjOYK9MgPjnOV6J/D2WPQg7en8bcA54DXxN/GEV7qA+KasFMPvHzr3N0Y0ezCD1ZR6vYVdBb/Jph3Mu+33cpAljty5TleUQ63Xb4iaZtL0R3s55w4OcSpTkkpzs4JXwuDxOj8TXo74jKDc9bED7BcdAYZhyggPNZ1fTLFXZKyjbeQlPz2XecFWalIRn5zW6XFkYEGV0hnMf0ByhmciWLvY8Y65JcDEE73ow1/NvWCsdtcVjIRG0x0VIn4zMrRMFKnSSzsv4g1U7fcbpw3uaNQzk5P/0B0ziTxLvRx4FCwdPKnHDQT79Vwrucy+FfMAxixcOaPGmtY2ztZ+ztZ5zVSW9bmG9Dt618aL0oi7ZkkJSkbPSsoST9rVp5Mw5FueLvfM5+rSYnnFEpThyG6foBbtvvjbWfIttNW1SZWlYWA53mClMfpipjoKODijY7/vcTheU/6jhT9NBHT7XalPs8J+pPzQIzLMrwUWBGPJWHNqru9wBBLThA/jWGCpHGmfhuC+/uw0hxpnbkCwab0OJNOHWNLPEvZCMig0hdw1u44OjEspsg9uosUS38YNxXJde/08fEIi6q83OGevcvtm6rOKNnt/1sYf25uST/l6+tGchlJ190n7YfLRl6jS/Wh7q4OVutrWzo/a/xjbLi2zP7P5kJuR9BOmWkju7K+Lsyzgncmo1o/jRvLtf8CIKUg3i4zt/PoCtas7cPbd4k4QJ5Q6S8+oouMVXxkV9+sGmyZYJbrvMEsW6eMTFiw8DtqyKvH1Ej/7zXPqCHsQAAA==\"","export default \"data:font/woff2;base64,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\"","export default \"data:font/woff2;base64,d09GMgABAAAAAFyAABEAAAAA+ugAAFwbAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGYNuGoE0G4GJTByvMAZgP1NUQVR4AIQ+EQgKgo0QgdQpC4kkAAE2AiQDkkQEIAWEbgcgDAcbt9gXjHa7FxK9WfV3cPjo9iqUbbtKuW1QXNreTB87MhA4D5XQD+xd9v//CcnJGDIsmNOs8oeCM7t6V+gwlBlTkiAioSBmSFBjigmyyEiHaadn1oVeql5j1dAYA1X36CRnZjD8hEsQlK/WEy4M9kxu9sFMSKbJ141FJCpRiX02u2wqsQfCZ/LS+7yFHWYYOcMMv3Fc8X/7v+E+zOdZbEBn+/ktOarFalRU3ME+ZuNlOzqqfcUZ5gG16SIwbuGj5tRLz/P/U+tr7XNlJW5whtE9QAAPAb4IyTridetn95W8vLzkpRF6DBBDgFAtIIccJYKUYKTJYaPViAH8FMXSwYLKITYsraNXOpaPSrWfhw3LdQ8Lw9N0/qO0KYNSKhazu4vYRVwqaZqmSZOUGpSKoR98wMQYMxj8oVMmiE+hyPRvaIE/YGLonKNv05+5gyczoRqtiu7skts0iD0R430ev9GqQUpqTkvNY1bmlFb22TrHK0UBUpj7Inx9Ox2cy7azQ2lnxKSYA/7vMRYAcpgC5ZoHqmoELav3+D6JUCAxAo+R/I5AGLzCqrnXn4NpYxhWmzv2/RmXIBbEglgQO8SuYlcJkoodkr7XAMgAACGMuO1pydUsF+D7tdBnfggD4RMYs2bNmRU5s+Yo1NScqa2SFd7PuLmUEmrDL2gB/IcAcsgwIYdHwN+bmrb/YYHTAsebIcSbEc+RkESFTKeawSGkTpVcVG//R9i/n0sAS54PC5i6kMkLC1KcAxWJBXkGQCoFnqNirOy8IB0AUoE8aUbUOSmE2DnGTmVqOlepC6lz19rVyaVbF13lojPP///enM37m/qjbkpVkVlREW6srLQ50NWndjeSKgeEw1lwWCT/t1Zpp7YWD1GFHZBHdInQF533eurX1J+ev7V9PG/fBBim6lf3dvf07F4QXVadDll2KKOiou/5c7HRUcAqQhJrGSF94P/j3uSdt9X+tSP6wLao9LSb3rxVXcxyivHq14CFI5RMIBNl7P/XfpW3s4Ms+Ne6KeIT4xd/e1E9Hc/uyUqjZkoECoaumN0ktsJHXjEFc1j82qfKW1zbmVEwPm24FVkhIiEFl/qVcunbarYRkorlGFaMMmza14nfiV9/bUlg937vU6eqqiIiokaMGGOMEbHuGJs985if7T4ZZXIKOgWM/1EEnAP9EQQoUn2lFtSW1ZMf0I7sEWsJ2pjTPiug5bn9BYVoVn6RNaC2fGtuMZqSX2kNyFGQm2VFU4oLSq1oZGdPTkCMrtQMTWVdqQoLDJR2lQbontFXHeDb8g5LARyraC8JsLkin1kIyyq6SwJUFLJpaOAYDbRxgM6unasv79xP/v8/a7SE3Dz5//4cVxDju559Lgk58q7/9+MNcgOX9YZ+KuiJD0nWAEfJRifHgR39s31dAhn+7LMbO+J++clXj1Zd8Bl1DfV973qHtTBrNK/eIdZn//+bp3geO/qG+Dhxevb//X1Bnlu+6f/pycqT//9Xp7REGj/7E6AbDgG99lWlFkCw2cClwFfTkcmTJ00sI6NYJ8JIhGG8IH4wpM4qHULOLw2Qf1AlTMcBzrkhmiaoCQGs1U3CVAJcBAmcJ1hCp1m1agBb7Ye6LbUiQu2YQnBvcgQc1zQO1D9/xycjVDUNmsjKym3bUWKbSiEpi4f6VCaKatbeo3PtM6yopmUliGSpRagOZj1ErcysfSXWpYsbVCoTXjexSzYbZan3WVpdCh2tzL8mmQlnGnoR0vWnigZyaGvMSq9WQpvbh2quIKj2gAQc6kIC1kmFWL4x0RzRGHtwOCxGyxqj5lBzgsYgwUGdoAc/ZZwGWOacNhQmXaIKRX9CRDvUdVKVVCYV7D7jz1yrBeqktJ5Vf83ILoHEh6U6iP27uHQ8IxAWGH0aSNApQDgP7aGAhIJ46GCi+37YNCzv9H53nW/0m1aHjGdHSAphgdDAOWhXsiuBdqk4GIeGfNgiQO69hsxrGQgl9IfiHh89OwhpgYWWWY7kypUUCzOozOvt3HnBg+tEUJIsXSNngpXa89v13WTt1rvtq7B9i3P0Q/PWuNVvi/r+dVvVZt1KtrxL/4wtfUveErbx4L1UxBayyTbhxt4YmKStboAr54qthKRJIP5n/bVeS7mbf7UeU/r3Vue6uX5e3662dS5M58Q6tPasbWvjalqr1rK1YM0O/WetslW0cta0S/+0lbjiV9QKwwxekkK6z0IWbRHg/AGuVqtW2ZoeVxXiT/PO1E4D/zED0z8Pp3duz/X5cb5mepfmzBybA7NrWqdl1s6KWTLzQumaqRjLFEzWTJlU9zdP7BgndBRdf3S4Aw1lcFTiTtWUYgZj9KF/emvzRU+G5Rh0v+46JqiJvu+qGkxQ+zrVkVL72tHmmmusPkxnUXVVZa2kvDKgKGxU+sUR4mIIUbhe1LCLW3zjfOOFhS96f697lSQQbCYvIXETMSecSzhlMdF25YfmPp64idRmLjIW0iNUJURFSAySF7box/wiv/WQVWBmm8E7fnjwZ59KyQ1y11WT3ZVp/J4PonCRcBzOf1mLSLrNYXPVZHdlij33t+qeP3x6RPG3RsQngQ+fMd2NmU0bPajcE/KwPRoq1ku8IsPT7SAuGly4LFxovd/jiVT4fMeFyRBmuTEYTMe8yGsmKtfWxM9nXOeJmM2U1ai+a5hxsQEHWu6bW9dyjeq7hllEUYp8zpGobu9dS2iC+q5hhuTCznio8uDBIybY2AVl9C40ZQaBGtV3DRMeYCTGMTYQmHiuDvleZ8HABeAY8mEZIffW/vwAMAZ9fO58475jXc1ADutEgsBfEBL5XPeDucL9YY5bDulVFvW8YG9i26lU8+6wfbhKg7nCXfoT7eFfc2xfddQD+t39YKA6sIolz2QQLHYmQp6qo3ZXgh0y+tbjkWCeXR4JhxeuvegEyL1U1YQrznoHMaxbOpg9rmhX8OCtgyDHcSDENdF0AQ0/qHYgBxNO5IjPnSKS9rsWKAjql6gyTLElf0dEItajL79CJZVcSulN7kIXu9RlmIcOk8ht2bojlU5JdUupRwq9BZ8D5OFhFxGyyHPYRI8B594A5wkyH4jzA50/JIUBFQGUEagE2BcCURKokkGUAqpUCJq0jZkuCWsAcK2ag+1Qh+GONcCdANlpoM4CdR6oCyC6CKpLILoMaiYkIhijR5Q+k2Ual2CU3SijlI4lFPUOEDxVSLB+fHYQcQI0U3dESNKarb4YTP+Jj6yndoqIgS1sfmwD7RLYcx7TKg9MLfxndog8tbboqBx8ESwWY5uRpTc1XCB+HSghjcSHQ5UZy44ytriMbjOFYXwUViDkd4Yj37vwnwFPFG67o1OXbr3Zh4/ccAN5LMpadDHN0JcHMF+3TDZuy9Ed2eu0HOlhe6TUD+I9FfZCIi8lMCCJ12K9KbgkAj4AJ4coBQQpIUkFNltwOUAVAQ4RoYiyw44GQhrCXrKlKADVeFDF9mGaEtpJk9OhuEoC0+rPo5u+nbwiYWJIggl8ROlCkbpF6y1w9jtYirOQ3Cwo+ZBoHAEVDVQMsw1x98rXhnFykMm2dvqT4g7HKx2M5zk9ljbcFi/y0UEsfxOlX71KhGwiRIkaLU76jEUWV3ym6lvXqc50DibXoYMAc2bhPBJ6aMIem8KWCVQd0jEI4FiASg4iJehcdjAcEsiI+k1SfCAjyq4Ijji/mkivCioRQGazg8KdCcSZSXZI5Eqg83pAUFwmXKoH4Na14LU64aVPo7Tm25dpXfYA1JQvzr10EnB1j6Q3jkCHN9lGrL6GmQCjwiaxbTop9NwWEclWIXJYhUm9CX0jErAsYVT2oJoJGPGwcPONrUL2O7QC0XUj3OaEWphQ2xLJtETAvV8MkSPBd5snLTU1hNRZToVZILeOIJ3nIC/PwhgIA3NCgrk/HYTG18dNDINZzAEagEsRMBJGoJ76Q8I01CqoOxjsqKiYzltdEpQ/0M9XDz1jRzeGiRjjREHUkK0EZeRXOQOup7kn0kOvFDTR0Iwmh0JE524s9nbzYuQQ+mNmmTH5+SzdH4ud3jzUGIY/wkFHAo22RABXT0Mg1sh2ORoD6ijD2q9ih6oR+gKGUzMXMlaRbHtseB0BEHw05paXd0pvh9inp9fXamQW6oDMefSers//R6HqI8a6TRfzyO5pYRX/lTsUuylIv4680ez4gC/CMF/zR+DoFbNuzLOKuBApP8mTjUyLT5spJ/aMhLBMoyO6LhndEuW4eBjlbBmym0JUqYTCi+RECAI9x6tzWC9iunP5Sz344GFj+j17gsSaVsZFrzxlSnCwBkvgVHs2ztGDTC2iSj0lIKmJQjpLlyu8/ct9soqzAO3e26vKcmBJJQSC7gl7Piz0gfoUl5oMilU3xY144jLz0EK9+Qd/Dwcst/q16exCWk3MK2iz+ozcjE0RFtZLHq1ZrYjhIQkzN2KfVZCBMF9p2+k480TXEMKKDRJEPdsBQRb02X/D1Cee8wq1L4KAAZUlAbV4kIGZgAh9Waoq8Pk1i3sTTz0c919e/AQJEyWR0G8TmpC5ibbMSWqTrJnnU6uvoXXcOBbZ03aNw2TjEYWxPAxLBFNkzJY9GYes4cId5iHMkG148ycQIDcjpDIya40ymlhgmYNg4UiRYiFxjVjxGZkoiUJymdokXxBJlwHJbOQuS0i2RHLEy81SeYowisUpkZ3S7MmiDGfmmRNrx7N8BdZKq0it9iVaM2QXLTYgbM+E3fZQ2iel/dnVMWcQzolwMdu65Cqhr+Tha9n7Jnv51vckfrCzjLZO4nq4trNeeITccr1pR6VpRxEScsu1pB1VZMXRzvJ8ViZZlrwNgnwgyXeieIM55BsJEwViwva6kedvosptxzU8VD8Wml/B9mlpqu0QqRfT0txiDTNDS6WR7m3HyocwPuZYdm63tLEr8Fh2yNeVJzy+w9hhiPikekLlc8C+PHu4lZ0guxNCmCYawSRAZxWRuSg5yZAYzuoSK5GEEHLGYZBNeAGMVEdgmbSIMkch8AjmnHn3ct2+ehlxhvnkSc+Yd7ieHQ10xlepZb1NMSJMfFFROl4hoNeGWLC9FEcmOSFhI0XeCd0k73LKFyqPSti8YpDB7tt5zjXNDJJLxGWDg2gdxEGHKx8MNXGVCd4BTKCAycrKzaFisyeIlOLQODTVNzA4C6tr+E+YoqGAa89TfiPIGprSdMy5aOblbGNH5jOLu3yf8zs4EYzAw8QhmCUipUghkC4TI1s2qVxVZOrMM9wii+gtsYSHevU8rbCKFyxYsHBYhAgE9wyRHZOE9MscawgeIlpWSJGKYKOz1HcTimDOQGhiavSoHDk3orDLbPoQUtIh4chm2Sk0lNR+ISSMkObxcaYkHBmOLCqCZxs7aqeMQ6cj9jMlNixhRWLsEBJGSGE4MlyTRQVqQ5tGZNhqoVFQY8YaAiqYgAgehOqskLnFmhdUVxSiUWMowspirVol9Lqbbdz7j+6D2dFq6tomhohF7CwIJyN+2V/3VwEeSoyDf8bjoRxUGhVz6ASPoTDrgU6hR8qCDbt59tyrBJGWn5c4UbldVt0VATOR70Lw4fwTAeXPDtVIOqWSOOZno6fUz+bQ+qzAiMr+fry9vm3con0+xae90wl6XQECnjvhIUtfy9ku8KWPhnbR+8INjbkHwylgOZUhNnM/Ui1YZTpVmnq5AnhIcYVyRsM68phTDRCIvCbrEz1D7Z6Las81KVOQEGQWzqBlhv1D7RbSBCRFupmKdYIL1BYpsIysz9+JxVFwq9exn0GlXWBRxPWBbdtPz56uqkuvmIIvRbSfvMI53TTTWnF2UsfjDJl0ofln8ECxGCYmYkESifwYZKqt5OaXwtJ/V1ptOxu77KG33yFejvmBr2xIdAc049ldjNjEKf+pko9Ew0et2yPg8lCcjUWTcUVHJW5QYTU2YrCz3oKU9jtso21Tbbe9dtg1Vd2D2F4qZF+J7V92csBRSIEP2Fko5Fxh5wu5UEIXI9XkSC7k3DCxnXHhZBaFYRyiEVhEy6Iii2Q/RdSLjb3YinLGs8GziaPAirOQwuEoiIiI8GzwzWZwEW4hKh2iupgQcMJI8iYY02lkk61I26KENuLaN3aMRTmwrHDQISI4ITbQqJQERYVni44MmHBIwuFwq5wh0MYfge9U8nMBQ9+67Xbr+PxHnhj/74TbdUOkVGzZGSdegiTJUmWNCmex/9AAE1lUczsJEQqZIeuLhoNLDy4ahoP7lh9U7CBtME8QLPsHwkIrbHmr3Qp9TnYH6DtLJsIdmSczfgOqx2EuxjIJ7z74QwUQeNjhTDhlUtiHHSdKNuypDaOxw0577XPYEUfd0a23YTGDQmLFDU1cc0c62nEYT0OSIMZOJJKMdF0t1gwKqUQ3sxToERBiW1QbNES1HwmaTZsvuVcUTFqIkV9GqqPQ2p1BjRCaNO9W2OJ2EBrtEOdhoDNAUABwI8A0ZRtVtoesR2iEDjLmlMILn+f7x2LU/IHvetJxj+ecYa9hj7BLlQPwjCVib4f0WJ2CJ6g/Aq1qqgtHoiYavFJ5KVIgzctCqn3CY9HJ8/WVp+6lLhl6j76OTdLFn4n2BpeAutrgpsw/SWCNSO97RqAuMUWZkfpFp8SKRQjyh2Cv/KVe0vdAKruLcE2Wfpgsc2WWfYrsIwBc6yldENMdznR4bU4sLFZ0hm8vqvMHY71jnRP0+8A423CjopuHZEfzzMbOJJJIVxtRfOxZrm3gtw6Eo4Ul3oijOratMixkthhhCffyL06TtTiBotQ/3UzeUds2C476icF0mNVZ4NVsjs94BigoLYcpntRpoVkEyQ0i8rqbKlFTj03MX0DzADYC9Nlvjx1UbkAi5/du1CYRGY17s64CcjZxRZuYzS7mSVKamHoz6UupkXHJv3SR/LX1R6uFwiFL478ODP1QjWogQSJ06ix++zTDaQRS9PVpvaiCkG6bKDe48eTYrAdM6mnyWVeIhzJ2iQB3vk1eJ9qs0czYKgnW4ip/0avL5iqdT7fVrILnsgl2kAaCCLv64BX2tFf2l2pVbI2YEQdawOjXJU7eY8kphB9WIJqbRFOB4QdfwhalXaBjk4WygpVZmmpSDUKjjd5LAbKEZqoHuJ9oUdwFIPGWSmmFZ90hoScK6r6VkJ1RtNmR/0iXVZCtOni7Qbb7PeGDsv5jhebtSNMVN6DN+YIJ+CMJxB5ph7/RENi/GruNiPzZhnHa6wLNF6qmpmL71dHzOke/1EfLm5q0jpN0MZL68o74XxDh6O0Ed4pgo7amZmyYCqoZeJ1S0GLOXHAjMeTCctVIp86gWdH1giGmpC1tjyuV0y1/K7Qsg1smctD8dWvN8wjUNzHds3GP9m3GbtNJ6oykTEZaDirfiG96vnYfdVqQNV1GWU6ifD1LuykzMZyBozmITQFDZa3oGNfbpLKpdBpGTYSOdvAqF3VhsgE2YWJfN0pLSS0d6IzCIKOQllTU/k9dSU2cj/eY1ywFZze6PjSY6nWrHcsFg4IogKtzpuAikG2cOHx6tLV8YUshAgIMhg8hIYwlQuLIYQoKJCXVaM3qsz3y5UjzpQt3JD39mM1A8rTCvErBEKeRGyJhnIWTcQ3dn1tlO5+jEiyWAwN2lR/FGY3DU1LhSGkkko7qSagw8bOzEKEsQgQKwRHBUTAChUAhbKFqZDMFUYVVLLPgJnwK6pGM6F844IrdEIh/JCc+WyDWgY04LMXYmwNxMxZjbxHQJcqSiNYoSPzwjpEixRgVo41AF9Mgzzhe1cseCEGGPVCHjHsARabxNDMliVP3wggNNGKDMsyecALjPzhIYCQwGUW09kXkQ0BRvgATXq+YKKbRlLA7xtFhOw/1jYmCNT1CtzthMdSpU4cERgo87nJNL6uq8ZwoCzcKyRFNTHZNbiWlKCGHIjme5jlxxtCXjGdxvErAELY5kOREFKiIG5byux5yIXkjcHZwyxZU2cZVDfOaUmrmQtMV8UN86u3Ek3jrhSfu69ah/TL6/SSF+GRrI8aFulIYYhI8KRmDACOMLPOWCBQnXqK5Vlqt0RprrdPkS3v85BftbnydX7Tyq/nGQwJuAJKI70BZ88sVAGtuXFGU7l08amXm2Jd2zeZJWSiQhC8ZUviJKeyDi3BJXFaE5DsKmyhOogBIIjXS2PtW2F03UYBEeigtkETesERuraOUwC+N7ih90gkW9urGQJfAbOgAH/4JE+psO3DkDVObBCF3AWjX83jDNAmqcUx8RBtCgVD4iCWYKQQxgomPYH34Rx9xSCbaUAZ+eNQShMKHzQauGq8EJwyuqnakGqlEfBp5R/ratcRHtC2gAmN6bOpqQFDvlJzCJKX0jyIc0czsUoXOqys32rhXlOzlI23+6h5+hCrvPBfB2LxP+jiNPHN4cvL7mEPz8uzh0X53eLoWOUPwJsYNpryXiWExzTYj7oi1A+RIkoAZeWz0uMMnzrlkEHoYWCNho48sYdFHFhf3ihK9fNhmm0NzYw9Po69Lo8F0ZkkFepser2ta6FlOV2E+epzTM6MU3c3ry8xGbSNLJjpX0lPZaidGzQl7Dx3q7LHNRk1WWWaeGhV/sVgqS62oYIY1x4KyyvSuT/mPJ71FaeWFFk4mlpdml6Hxx0PnzfO7DUrqtsiu2yGlbo81dYf6AyqpIFTw6xh498/GXIA/1sruDPzDXegfj+0TeAjEAF78yh/9IRK0n7QIRy3camGmGZ1rn6uFfgCsZ50bQRB4MgGAjLC86QkIG/NoiFwn5LATAgWjIRxPGuBLWRBFyMUxbeH7rhM1DVdaOiAeQIKB4QOwfCbEOGCMFCT6u0ZX49TSJ7zlJmczgsys6ydNJ+knASd1F1+9+PbFpy7ec/G8CFkQQTTeiz7AdWiFEghKl4iA/YPjm0N5YJ96vvt82/mW88H7pftZ+4LTtI9eHEWst+vq2riCFm2u91eHWlsdfvPxjazKJz9r1chka11vEO0EwWydiHKtAw+E5jUWDrz1H4jCS49clD8Rf/eHP/3lb//41zv/TSAM69AHulFMbCZBKxWBBVxUcNKJwIUIyrJdsHB25kO+c/NbZGIqTP3kZ8HR+5rrbvjxVAjpq9uRml49ZCXxM1C+T4KeLNzYdEufhqdC13A4FgrpHlKwf3AIpV51Aq98AvnD7+Yhn+o60NocUmaaeHKYBm0MTp5MUbJLEF+CVOnipZ82UrB0m5qDPjSdHSOP8OI92WHVuu4gjPQtmSoqm/1BKBI1rUnhI642Nvl2T1OIEj9czm2fvrQwdjuB27XumndLdnU7y65gN2WXujPvYnfGXSgEi5OLBD2+hQPDgAU6+LsqfqVgMfLpB3c5Kar1UqCOeaH8IbaQtdNqN0BXiybcrejCODjn+AEIDuQ42DZtJ7atHMUBAcBNpuVEBSEkWGBZqGcn7ESM3GQO/OvmKZMWOqqRDTr8YQ80tCENbmqmYkoxi2mM0acG+6c/et2L+nvc/XrrrKPr/dz3fV1bFzrTiY50oD3tqLWNNbe2VdW3pAXVVdOsrFkqyjNBmaaVWkJRhSbTB2p5ZUI1lTUdkQjg/7zzF5gDnukD96G7MFowE/Bo1ZTqzBdqoaUiLLdKtA59TFCuUC5QGqhhUGooZygnKEcoByh72JExzX8wqhmZEiltpLU+AVE3Vw/p2XjW4ZCaZk3Utofq8hDt7WwBAZ/H5bBZTAadRqWQSUQCHofFoJE21lYW5mYmxkaGBvp6ujraWpoa6gi//fLj+79aQ/051Z4f1Feq0bQsKnXg1CabbdFqq222a81Ou7r32e/A6E1w8KHUMcedcNIppxHFPOc89b/oksvaXBGUq/q1b3zrOz9kHy58hIiRIv9iAqP5biQQIGG4wBLNKJpy/q3f9uju0avP0YGL8QRpaymzrLJftb+qRRVXUmmWZlTWzKxVwmiq7dGd02BV7i8FX0YZpLVXQNZg89iQ/MefLxKw+xBThBBTe02DE19bhXp5ougoYRzaKliulbA4ko2KHXaQwINrO+TJFvXSzv7MEjHAuK32+ivnzVOlTIEMacxiGYUKEsBAR2NFKdBgpqpP/hTL/cmW+RMs9ZvM9cepExGj6ZROxeK1JtWimhQLa5ItqEkwv8Zknoi4x0td8y0KocG0lYgrIqwyyDjF30g+WCCFgE30OD9cLpZSerLxnMuSJM1aVNGNL6bYVwy/2ilNbV1bILJYceIlSJ+h8CKKzPhCInsB8aT1bRYAKSnKcAv+8SPUJXERLJ1VJjxrJoz51HQYLOyhYTTMoPc++OiToUZAIYwIFJQyVeo0tZZbXvkVNKv/VVV1NdU2uznVNbd5MIFwqr5BEDPoEpKm2ST4MsshrSMrpS02EnX2wbfaUF0TirWYxEvSAqV0fBWoavfX7M5Ip3nTQt9l14GVyZfuvgVO3IhIvtm7fgNdtTpsnpHou32SAJp9Lbbkc1qSXuUG8tmmEaYhCh0dnuvFBhdeUyTYORzX2e72gUAb0dsjulY8affqTrQWSz/ToV3jyhMoFaA9R4d2tcsbkRJBi6weh3YVWzasRjmPQ7sSJconEbUz4AowpN8bsf1sm4EynNR12gUBl3sYyi7w2Wf04dnjm49HM2UzDUth4ALbznWpbS2qKHNBUZoOf3mo3QX7tFimRokMyWKF8YO+Lgcn4IfwLLAAswlcNmeCAA8/nqcktZebx0vKeLnzekE7Xh4xXgocL/esl4zHy3MBXgq9Xp4P8pJlvDwO9FLE+bDTcTTNyc/oQbWvq8DqNCHvnIzk5ec6u2EYkPdwnIP+kmIyLD2cqO8teJ2fTK5QqtSaX7aJ9RobNTZr06r3ZY8Spz6PGEwIRlhsDpfHFwhFqFgifRM1kX7yKquqa2rrsDg8gUgiU6g0+iTCPo8AhjEmMIkpTGMBZrAQs1iEOSzGEsxjaflbjf5c6M+ilEtt/Xm/f8y1z30bq/3TeAEAIRhBMZwgKZphOV7QzHna2sYT0nKaqbgcoqP7eeS4nh+A7W5/OJ5gGMVJGlVLdXOUq0vMy2JRihWJNen6lYDrL4xTuYWA/hbRPa2dF/R5FkyJpZCUP3BQ8R9vOwAJvK3ikItBf6HAfHTSgIet2++ZkgvwedB3gwXe/Qf4z/egXyZEw1WaHxTEh2ePg93NNvl10ZQrgM6mHbguOQRhkMAVkcDt4Ve9urwGycGbfi2oQDbQgx4bbkT28Eten1mCnBH8aNlhEAg4FUBAMJwjQBDoKt0BBpgU5MDlwbtu6IABFnBFBARcETmewJ1pkOz4GqPOdjvtdtARx5110Q33vPHRUJNSY69x1rhqdJpDQ1eXdaOMUe5cMTSE6/ITHCX2i2P7veCK/3vo970UGjuNk2gcynkPXwl82FVXgD8E3mB6n4fmP1YmHhMPCfuoh98bL4E//Argd/5FgsD4svgN+q0/z6vX4MgTmuOcc7r7G/bM9DXlW6rKGposCi/1qSOtdNwSSqM791aSJc9W/4762RxxVwSsXXCv7ELPgycvBt69sXcWmDn/LFWU0GbBIkQaJ2V3NJMEyVKkmiRNukxZsuXIladYiVIWMwuvsYjKW+Fmqa3O6v9NygsFIwiQaAwRWWfO2r+I8L9TYzhXbtxpm03Hnw9ffkYL9ZkQYcb6XDijWNHGi5HEbKJEX5hmsikyTK3YdEXyFSg0o0XNb0ELm1kZBB0OTgDzGMD2lWBuBa7//w3c8gsAFz0e7C8GAOvwqY27qBs1eBwffjZ743QOhAEe/Bt4D4kJ6YKbY4OSKUwgJz04HhiegCyk3C5C7nocPfV3uM8Ml6lM84iVx/GQfhhGjb/5arM8mfycjsP9fUsbYq1eurs5R/4JWTnWhHv2L88PP1K7gBbxZDpqq0k0n/kIacrJd1Ae8SdkJxRJXOHDwdvfPeUIDVe30zjYhbJdvdUw2rzcjymBbEoJ84cvY9XLQkeBWylfH1srSLBHIzsz08RXApsBbJkrUM/rIpB8shsX70WTUfcxG7MFhcONFszrZEOdWNs1hCLB5ItDvXI9JEj1z/Ijm0lbD2L1UK9umKMWiDXPDQz9lY9rlrIOTHnDc8l0fbWTIcsRi/7KKZ3s7bCtRVc1UUbiZMelVRpZ6YKDpsuznQ7I+IJ3OJxkXjfplWVUe0g8xlii0nusI2UA0C/0TQ3l3qG6WIigtPEkgcQDxhDfoSYmfDWAxiFbWKp202pSNb2BbZD8stlll/vMvFARYki6TGXUnOLdmOOe3nOXUblwhTKHGryfTEQS/Y5CYhVJmThZ08XOYjh8So1XMbwu4o/5YH1Heun6tL2UOAX7b/+a1sjTpMIGWSoMQ7Y4BBUOdAVp1mfmso6Qh+KYHAzlzj0ALYLTXaVu8pBzYRGzzC2iwEguW4QXFPOrWzVmMWevdbk6n/SSL3jGGa4W4ZVyZzI4+DuTVzXLuA/dCFgIFirSOSlTPOBJtip9NTDCaKmuvpGEoeY2FBumlonwcEczVR5NanOMqxtddv77d0zHCXkmBXGTYWBroZdK+zjCAXINNVAjiZMt/py1G/gXC5vmsEp3dGuI1GxgjWKEQUuRUN/AsAG58yaeqY/LBumcsKxanwBEWS2wRO5nML1bFpyGby4NQY1Xo07tZ16QfyyAfPP8q+f3PYbQv8CP1Z2ZK4xCqVAj1wsby5/xUD2axwZfWhucQY3MMzhFHiUznDdIUphddr7A0xcJE2OmAkOQ1KtnO0bcAx2K4OYSP3RxxrrCFFbvzj6hitp5HmQKyMqSY4SQ1n5sVLR17a5WYZYumaTzqawDjJDarGc6N0/gaVhUM28L8fZRrS6WH5hexAb9xK3KCgztZ+69qNqqmVJCdFbnpKAq9/5SYz68N4SAggyKD7gvhXN09cBabyfqAlN6lE7EOMTpbh1r5EClB6Vh8GWkHMkR5tDhRSBSAZFEajpjRxb1bIlVPdR0c+T+LfE+ibS1oaXRdzDrwhIbWF+t4i+qsXkePhmLQQ78h7r//Fc5j6ExwxD2TD18UbYLMEsYXaZcFDDwgx1jz8pqbE5MF0hQMU1oM89xCglYoxlosCwkjBW2xyBSzTXzKlgoxRNZ8mGE6RhISH03tyZsuFY9vE69n65gDdDnS+FEWH8xcnYRHJgFLouesdcTQm8sm0cehbkRVd1TRTabNEkTUUmt7NDW7oEaM9fyZ21Um+bP0YMidaDqR3rW3hgHrRWkQ7Du8wbvTSGwPEDqvOM1t6uyTxjViWGXhqUo5TMBRPn10TFU6mBqbHfD/b8/XIF2Pi0c4X2eh7iWZAJDEGUBv4ZGRtUjtwxadUl1mDhqysUSIJNtemTxwiXyQJgV9znaVs9RjSc0Wp5wZiHoRqp2jjkUe8pI/+HJKycQjr+ZW8+Wugwj7tQrIK2WrBbc7vzoP2xEiyYH2Ka0kYQZkCKp3BfgM7VDzk57x7oFCxbGPU8DD1SHd2WB9c3xFKRXTdJZ/jZ83ULDAcbQqDBnBgs0QspgHDbKOg/6x1is9wp4Drn1aAvgKmyOO+WnFc/Icy4JEvJb2xC7ISCHQSP7p3eevOs85CO9XUBYQCNgCY2WIaz31sNCrZcxHUITJk/AOlQUzYehFCSaDTGUR6JWsyb7nlXMLfKPwXcgDXkr0LrM20VsOfnEtcK1eKZfyGlZDt7IUekE8F93fExpGDPA2MqWu7ru19zHwRdVvr5WHwBv9R5sUpNVunOnsqplWudEELSg1hdBhrhc4qBIuDJruDvjYB5CVBvMLKMghVN9TCjFSvpljpO0DUGFqsqP1SRmzLhQ7tjavLI+16dUqq1qqqwc9YyL9himuouVSthrLu2aiKftLUdp2nTFDf8o3P7cWj3z3N8S/1x0EZfLQ6sJ6fSkdQjFVhX2xdyci9tEdk9oE9dWj8LmjO9ad9saw47FVvL+/XxNnnWrLn9Vq4+MwBkPAFWobFrdnCsZrF+NMe0658w6MXq9Imbfco5IuUmlSN2VUC76wBYNO+SSkkrBeyMocYmTmFVuKasgRuuSm/Il/OQhOopTi3jm9jaqUNvaZC22xeQrnQu+M8inAG11DQN15kQn6t4OcBE78TRD7eBlNSP56rp86zSgm/24YG13HGCLQ5sIyqsDvM3hZNykAko3hl261zRwu/q6pt4Hl6nBeSc0FeV372YhXHRhqZeNzsfoH69HcAL3RVqCyGVjLD4AxSe2/eypqzSpanmY7AcRgXTrvv8GdzruO7fiLTvJngPpurTKU9SZYj12OcAyk2fZUdSy6tmWio6IDrMqXMs1VSKHouTuUFDphDHltG9ZTR4cMQu5Ix3Jfc0GuR1h102OtCxLGv8pQ71C7DCCZmdzeYbm3lHaHBZdatKR6D2czTPpV2qBqecxbdRRxOwkXTD9bmqT8+lT+ksJRXR3LI3lS66dmmePtCUQhkRp0llh6IKIMdOjKKtEE5Fy51uAfFTQkfW7pCJSwTHL0GpxJXTSVvU6ZXu1vNekMAVdzSAwHNoKqDZlrM01KZQWrBLaKGjkRU6U83NbWi1aQCV03r3pU42Z7aSFJYF8mRd0yw5zmvnyiefn2kGrrdIy8sNZ9l/2EhdnPGQIK60XiZbroZGo5tRLvD81Tx6phJ0FX+yks9RBiLByYtxdt0VEZscWnQ0aBPAXbxaHykHUrTh7tLum3iurTbU2UoMMVUZUpShNHOEGr7/ql+ogTZjGMh37uJy5imXuM8QrW6XHZHYQsi1h/Y2XkGR91FU4my8XTsQs0mc2vGy16LJVp9aYu50XsiUMB2FOE+aWRexYgyGA20dw80DmgduZkMAGwwHAQrwWYDDF8B0n6FMM/qwAkWZcPn5SBHh5sKp9FAcFn8yBcNElI5vVNGOxyF+c3x9OsXugJtLdmcpos1uJ2UOpvWJDMIOB0GrSoTHff73S8T68WbBEqT6wEXEt/Xrx+FPjTq4+5o+80tkWqxbl2jZR33Ci3EBxjPINvO6P8ionTw1X+11KcW7Ggx4w6pxUdZUzh8pBr5vS3F/K9ViEjeGwoyErt/3YPR+vTu+Ppl6nS43LzltGZnfS25vaZaZsa833iLCLHoxrRWckKVu7ExOYiEHi2CcBUYiZr5QV/kn5NeYNFdMj4cMJp41YRZBlLzqPPyWnJDmU7VvYheklUqK/lKjtF0t9FTooYfH+Ue10NqkEyQgF/sQBOBBF9MpAmYQ2MBDuE0FSOpOKWFO/zcbFftgftUnF0kY4xjaSSGdEQX/oB/LHsf0qQcXJyU9GLDRN+WZdOBD8R3OOPHIitdkK7J4oV5A3bbgErTMc3P/r9HnLUWdz++Z8tUu1q1Lx67irb650nsPKu7bKlahTj31sXu3DSzHx5XKNXjepsag7zi6SrFnc0lb5kJxyxXaw2jV2cH9qXOUjkCaYa8v4K0UW5zxpQDiSVJEPH9js5LiCbQ0hTp8rHhu44OlctjG8IO1RaVOXr5DKbbTDLreGXDwd2o0lF3jzKk9vVAbyv7TgfMqaRMprlohhFUHDArSGVlUsxgXMsrf1ovUOwN2YE4+qX5a1CVhrhP1S02vjt6i05u5Qz8RPhmxtXsfXGhEya9Pi4g1yQN34sr0u+nQRcM+0RmrxA1nNdmRvfdk2gZhkfVSKsg4OOqYYv75kWvBVeHTVnlP4SY9tIxH6XJYTYSYtPdpAqxb6XtYWDr8i9hIhksOnjgBAEQ6Gs9NSh9wr/8hWTj4MmCcR6FmCqBgeOI8Jst/pvt9pDNwB80oCvFQOn1M0MsUMY2i2CY+QJcFKDiORxA7D8sr74v5omt5/xGjbDXD34pJdqsIM/pG16YGii8nfgF0SsG2cUBofWNHV97bmal00TB8pncssLWui+FnEAdvbPP10w4nuHG274KoUwgrMsMNAEGekB4UGKAcuVPLfwuwp53sXQblYI00hfHBNwj4mNkxxkSI+Z221KPWnFn+4RHPC6UnWreFeijXbEPMmn3uGVyrYu6x7Os/1c8N90w/wHz52f73m7DD//LeKc+b1M5VrB2EtOVo2jJatA7BXp5xmdXCLnymnJRSpe367MUojzUxlBqH/KGq6mKMy9kf1TWwxl+b19doqaCzMVDNT1mwAJeaCs2aenF96cuTt33FBzBVv1hPvZv9Lb1/Lo/fFLMDsO/lb3vK3Jf9mpvgHA6x8T5V7Mr96dX71ZD6WB4H2EnVSpIjK5FLvy0VBc71Wo2nMotrzmraT9JIXsNiH/6Y+P2UHQ7sJT3zdC4FtvH+FIpNRrPQHFCsymRUKvyKJ94sLPa7xQVMl4hgy2YbCIdtwmrrDmJH2+NyYemWODMzt387d3NSwqaOjYVNwmjuY6w/O06jn+v07JB7sXxJvlmcMiBaIBcmMiLXjtJn3rpBnM6qVgUDEhJqqN7Raec3t6njZWoFIk0yHjdWm07HbQG4oqSiCvw27fHdTzXhdKYBMkoWJpkVCYG7vmRAp89vykHKie2J/C8DffGikoc7fzvrdJOJKtXbNr90/+lSzM7KPbcbBWeZ/Zrsiir2Yfx8Dz057fiWGMTKSsso+cZaC+ZTyxETXk0ULMGcr66+LMUULnpxNLDHPvKevWto90RdGGucXwQt8YLkynZUv9/kiJszpgcAyZSYrG6LRaCd/ztlvto4EgtZhap2OAXNtMGAdcQaB9nvGDpmuzWjQpcNlGPflD8KB94nE40F4TUbzLbXLV7DQYRV8jBaUH6NzGn43KO3/v/3LlJNrUkYOzWvQNFNVO9sP0LqrqMQ9Bmhdu9w2PuWyCbMQkHlljuurrzDkWH/4vRraKzoa5YKRQT1z4jD/MlumqM9IzNZmocT8QhsrcoPNpNh/x8O/Hr/MMVP6KA5Uzg7Y0EgteLCm+1FpOv9vHkT44LDNvKRxb/dhCT1o58ukdj49KDncvTdmGNWFww4Q///J4U3n7cwYh8C281WFv8D7K79Uz715mf64LrOsOvuBvlN2tubAyYpV5/gImo9YdQ6GnlzaCtXQiyVHVbIp1eNfqLbCcodTsqMq+FBXWjftlwU7xHSreOGrud2gnzP4Z35Bf1n/n9rDSB48z+e2ZVI7c/nW7dtT+eBy6Q27e2MjU+UYMFpGgz7z2IDZacrx9M1Fpju5ZiG+I7rpxXpwS//ar/e2b791b3f4YWUIAG+sBMDvmimi7Pqn0pn1T+XrRxMz7JMA+AoAPgzA7cfUvnXxKrjMK8IcoQeVK9wtsIrasPEdPGpXK2ErLeFQtPzgreX2DHW16fN6zOfH3ymvZ99nGKCuswzjPJjhBdd4VXTGXToe/hArMWsePOkLEbjwZTeObU0Ktv8R56v93WZVv2vGlKoDwXABrpLJYFioHKfOzPM76ZDEzKc1smf0uSL2TuO1tW1yYT37Pt0ArT1Dm8eMvDx8//oXGEt2omuiyIb58vp92NZtNYz4/YaR5BRtQ2wstlciZXtCBoJYWRyPVBqRWw948N5Bq2nU5zONDNq80X53nSEF15kQPtvKZrmlEpbXymKLzBw4yTrQ7we1vLXXqh/x+0GuhBW5f/0DTJFtonOi3YJ5//r92nm8ikfql3C8tTrePXAvG/E59WN9Lre/x6wccM2YUvhu0FeAq5TRuWYu0y9Vcbx2mC228NEG9oy5LkB/am5lq03H0qz7NhS1+8NeEaYvzJEbu4yGwUBQqCkb5WF2P8aQuxY2zJurdloQC4S4pApklWAiiGpZLrkMdW2C0Pau94v8GEtMKDVExKwmralTwrqGJcP7qTakDIR+6vpX6iDtIJG3bZc+QyY92/uVg4pHZS8fyy99uoTQR1V1qdWQ3UydGuZIrkx714Qkv7KkZDlm+P4b5S7n9Sjm9FoAuk9ZG+bm3Q+pSr902oqoTNdU39Vk75Tq7ALmMMnKKX8EtA0iekdr2cAZRmJCSUuiJ2HqlOi+RuFnKVakAnjz/iG7edTjiZgO4PcNOcwjPtPbxrYjXI9MJlQnm+2gT9GJgLFdX2Wt6/+7yaaKivWYItuXj7PbIHGx68slugmLI2v4vFjbv/qXvWbpgt/f3Zi9H71CqX5/zxy4oxraRjWzS8G/vLaR8cIXraw6E5uLPEet3nH0w1MKAzTG4ktMjXSJ0Ff30tRm1pRnaRAfizs1zVnurnB75CI5G5tadP7hG6eVZYa8nHfvUz6et6ow8y//zR1Hd9l0Ql/Hx6pVfUVrrIO3P8I37PhYWWAhrZYZ1h4396Xynf/MrCwjK8qA/mVf0dJrC266Uet6av+Z0/gFdV1f98jXNPS36SwF5bHu75ty6o3FsS33cHxIMD2Dus5+3/u66lGNI14C9Ol4a2XL0xiMli92rad+h1Az2kyOBlhSCf6v3jt9WMxhKcG6t/XU73pKWzHvFt2jumdbFP2uGeWFB4ORgumVEJNt4SBeVCcIuCBYbG787xV8rytIP373oSJL+k71mLbn+598fBQMrtkw4O31U8KwEQ/AFxwmhMLrn6syC1i2UIsPOKdnLWwrsgUAjx4JwFUqLaDiaazHzvQmWGMmVOTyRL38qW+89Qfk6TGrBr1e1XCX1SWJspYVGPLH6f9Y+WYW3SNC6W4zzOOZEaZbJIGyAfRPxtculfeOWs3jvoB1dMTs8YyarWN+n2V8xOpNCB0CJCgSIX6nQMB18jh+MWpw+igFfL954IZ53pPLasyYGvMTy95a17KQkQjSE6taAKbQvD9TOV6VWTRZ/G7hK9lfMszMG6nMioxVl16YAU7jz+IIIrKw+f9Qis6oLWJUam+E5Qf+jO9mnycQP0EWLFvFLaFQCQKQxOu7+YEwr8dg4PUEwjzI9HxftZH9vMsx307nyepRNK7VovF6VCbyst5w29+w88N1IMZ4KrXW6V4ci7qXrHWmWtOJXGe2vr4zm0sAp3FhpnK8MmP5JcPO7E5xkvtdmpkGjby+hxcOCnpNJkFPOMQdqxcEqk2sjU5H1QkdRdooksZ1Omm8SSSVuOk/N7zXTKjVlwBwe9eM1d8lBDHGLovoXnpeWnjP0mnZv6rgCu+c7fa1we/YmewC7qOdjxgk9Q2cYRP0P8bQLMGYyY5gWQdmSd+YLC5mKkvffg3zzmuLLZ1wUStm64rIf1dg/mvwYs6kcE0xpofYaZlbvglT1IuCRN7QJQiEuT16fcSEOd1g7BQEw5whGo3ONLTLY2I0rtEI1SmXRQlxBjHGr9VxniQok0lCoZL6hdQmAZ1GE/F7r4L5Lh9SpZjRGIfzK3ewpyuCVkJD6v0urd36h0+69U9tJVzSNHHRoJxFMxr4DbWS+a0vs7pgeilv3tUrb93vn773bwx4w3vmBquDaXj/CI9pp9f2fudJ5P/I9tP4fHeYI1M6me+NJeDcu0zmHnzV+LLt8y+beHQTyqMbd1iqwFfc7JKay5njGcDn7bOV6i53W1deZfQajEavKt/ZZld2z9ZQ9rwnct7CfPUDMba2Vfl5DyPB6Z2R8yanrsd0lccKylI76eYvYhXbzD1lBX30L5V54JqjeO93c+4XSdZ0W8x1j2f0cjR/TuPXUuj597pnbNFFwcJ7VSfi78Npl/q1/Bfs6lK+VvsC8E/RbvO6L8l7bX4+HXYfZo+3vPhSohD4X3ld7jHKqOXjfy2HoPzPUHYeq50IHByA8zL7QuwvNTWX64D/lTr3x6yP3d/vdX/lBgUCfVatzZvM+lxeY1CGmLvrq3YyEQvMsgoELKsFYskcmrWrbV/dMeledlOB/5XAYaa750Jhsii895n/LTxaUQT8r3SOmEZNnYcDN6aGhpXGYeXU0A2wqLw/cHgT20hbwGItMNLY/e5+ipiAl1AAX+52uSfmPR14GkzwPBeda+IKUUOYKiR87X5nFnnvPRJN+UOI9Q3OgeWpm1mSoK4wpcAcX0Ar8dcdJSlrQ7tGCYxrxhpKGSB5Y7tamTOZlLl2tdHUrlZll2pGTdTHdCy29jEqZbOWzdJtBnbekFU6M9AKvz/uwtmeVRiMmEKhmilnGtplHjsy6vXZ4rHJpG6bYz4v/03mtoMvPuv1S0MfrPVMAEEedfLa7NlnDqxh2GDCSzoa7a9voq1wrjDpJggtKZW0WcalhlDHgVNrjuyeOljAbwOzeGGC4fQTM6zrFq2IupZBo4tPweq0jOL6lUre/TuFdmpHJsV6TWqLCbWGpEgaUyLrVo9h/qKSLBydJtUhB17ro7pL/ROdbMzH3LXtgMALU4g7/EuS+aHdJlO5PSp45h6E9kJtB5fdO68Nj5toDd5kq9JqTYfFrJ3dqQNOvKIJ+W2SWs8zyroUfraRZxU4nggrA2zDRukdy1K4Wtaq0mbNKDNmNMToojR0TAsj3mNMxudeGNZ8Dl7hm0Voc/ZY9pgoURHIftQFu0PPhZ8PPQfIvLVLoUmqOURTwSVM74IOskIWT0n1+lapPK4gd/QsxPw8hWjmqLXJToU1w9wN0WnSF5iMQ0waHdrN8Al+FAj+4PP/EJCP4sB/sohyLtuwWnzPsrS2RppS6nImi7GzS2tUxpGrk+QozyTtdGxXN+qSNuZxLwJrjkHMzzQw4j0O9qWIrXJ6vUBIj1nlYolVTosJBbR6q1xsJxbewxPuFhLxVXcJ+HtVoHzqTNx72ZClB9RNVZevpIcPiKc8WlX+XnX1H81W/C4byqdvKKPUuY7szz273yJ6ygpeTBF4BJ/bsb2N1bX42loEW1cGQkEiK6z7qLpyTwV2u8+EO34RlZnVXGym5eE/iMzwSYDdKd19y9XjmVJUP/qNATyXSgi+8ogVV4+twxVg8VOwFZdf+7P2wJeGDdPd731XidpNKqbzDNiaAh9T0snLVFulri0bjmza/Cl6rIhiLKbRlEeZJtztutrbONzt2rrbIJdgpq1D46L4w1ttDy4r84o8eD6Fdq6Pjj+1jp2roVJWUagjFGp1HrfuIJ7ed45qqo7X1jRX16hra9XVmyo/qqzYVl39dGXVO+Bx04azm948YjxWRE4V0+iOTxnwMYRBXsbeInUVb8Xerq27hs/rCLS8vk1mSzEXu92gMffV69Iye4oRIplam6bew18cCEZLvVujibmRg4Gtt5gHfBI5FBvet1y4C/DiLPsvGc0bQWVFBYV8cw+f/Z9fLRZc5CrJQRIYEzJxg5hP9YnM+zZcGo4NWYA7GhTwrAaq3TXTjC/xm2QsC30+wlxjobHVNrnCo1eI3To53PJj1kJ4XmQI8lSaZoE0LIX3vbumsMAW1Wk1LVkpMKyXWS6Gdrn0hT+3PmkDZTy/GXIEH1w3K+jW2BvqbdZYow0yUVu8VG6s2U4iXhQuM+F56rRS3W4yqPN5DVDxaJj5gB7kaSQdlRfUDeqm83tbDh462FKOLyUhHvJ5RkCo0eXzer2NY0PYdi7npLQxjl04SnBZdl0LoIk3Uv1PvIT4ngDZ6D3e0LNb5UDOm3JSdbNCa4rVFK6cvHyZJNos0mjjIq6JjC/xDRbWmGJapTqelZpsbCt1LYKssVA5kI3q8/t7DyukcOrlTHQjg74TZcqdevAnv/drZVgd+rgcTyIhbvIPjIBQq8t16A32vEmRV2rFeTrX1LhsxjSujcW2cngsq53FZXfoKfI4bKuNBbz46EBCu623V/vKQEs0CqJkddvUGsl4AuuWLLHp8fqN/FsJFCF75stD0/d5JoAt31JqMtptO36eED4g8Yw6FZScOZSCtyhcSbHFkZfJm5VCclhi/XHltkhoIArcWQDmRa0Md2BWGv6fS48yD8lotKiBDGtaZWKnQsIzKUS0v77LJOHXpZZ6gc6URhX1StbqFWsxJRSSmavTtXUqgMPqiONG30QnC3NWvLEdsHhxmuWNzjKkoI/cLhVyTcBC+F8gjOeR2TxOdryNTjgeTN9D9DmVZrbdpu/s1QMDr2iCf/uNVi9Qs3IHBdbUGoE1ovY8u2qD19Tv2FMGu6kXGBHUaOrqNprS0Bd+CPZ+CTG/9cKQ/wtwnG9CYbvvkR2UE2jPO9fF9kY3RjZq6oDD27qVmpRKb2q8gYlJvKhc2piSmYwBuR/LUbE3i7lhbtSrtKkupTXDPATRGMzDTOYZJoMGnWYEKbgzZPJpLIWCvUQmX8YBho+o35F55d530P78ljLYRb3AjKAmU2eP0aRohCbLaQ1CNSu3u/gtKOVAX/og2PcFBH3hgyHfl6CbNbDPvmPkvIPPmBPUro7GtKuU9Hp7vRqNqPKeJM8op7eo1YyEQcHjGWR6hqbR0FqMMtDWFteKfTv7vRaATqeaPzm5L/rSGzUUPoewbI6hhbn2+wCi1DXwBR4+A2fc/jR6Ym/4PJieDv7iBRGqznS1lbH/dZZgM4y7IaGhjTz2xwiVw2b9vDxO2/2dF5KpY2yBgy/YcAvTKjfLUUmgRQh0xcHa5b2W3A7M1kstSTCVFzTQDbbjLYwN+0TCH7i8HwTEbyezbIjsi/9Rt7ptb2muStEglDSoVfLGVhSQvKVVJYqLRfT6J5cHupYHFEX4mfgicfquuEQYFKFhuUzVmJQqEmT8YQLnvICMP0gkHMaDFJdpxt6L05z7zNZn2r32UfuI/2V6wb+8MSFAA0KxwtaPKTiEcPnOCE+liHAFTh7yQgEmLbeLhaJAQmBo4R6FkaNc3hsI/Aa3hKmh0tRMCE+jEsBTPqgswuPxRaZQobiEHxKiUZlc2ZCUKi1JlTguFjFjywcC3bMeCL/h8c4JBed4vG/AYoqyn0LaTyHvJ1H2g7ZZQJ5adQdH3k8u2y/eV1bSvmcMLC6j7CdT9lHI+wQFg1J16TzZ6d5xbIYbM34r0V8fwlzpujIdw/5uplLurisPVddPr74i9c25yEC+HY7/yqIVLPxbdPl2LWQWUk68N5CEN4stEYFGlxBKojLk1GtoePMeLFH2HWUnmbyTQu4Wgz+f6l/VxqTIxRnMfJPB7VJQp/aWiM5MrYXCAuqJ99qT8Cax9ZHUtFCGh+bk/NFPtBSGSi1upVFbMXGamCBYV2gSuDJwNxPn7WSmBsIDwS7jswrP0KmWYlBVeLL5mrHqD7gkAldvuasJYv+hnaxRBKCekzk6wPnrVe7n04vqWfKd1Er5XGm+daSd4E9+Eb/VF03hxz6oY3QLqZXbpNUlWREl7ydfdICROcp3kV0i1S/NPtk8u5aAzIyU35b3Y98G+F0t1v2WLnzUfzR8w0f5d7Rw34a/5zxdDEqe11ysqblgMnHSU9Xrjh3BL0s/1SXFA5TlbnfEhNnhU798s3kh9IjPJ4t5wcugbelo7uOWBQnLwscGBxkPrpHtyrjJQ28bUFwr9bIRj3QrjvJLVVPVL1TsVini8bKlhMYK2iXWJtHvLozrd9Em1iVaRSMg1jZW0U4XAtNUGNW03qdpVY1EmSf5BbHUBxVNFQ8oOBw7yMCE2icmG0evjn5C6NQ5TD4BNIJmRzPQdtJNUjvR11NvJMBjfWSRR3IMT9nZbrB/jLdHAB9Gx0Vu41vQvTOj09UNbvueunSpvrlxawoM+zr15jAdnBm43Hb5QTQAOtm6BNUS2FNr5osdRxLQ4wfuMOnP8CmEHfTknYVmVsVhSCyJpsRmaxNPbFwfh8M3XBBqFCPYZ0SBf1fGVVKfSgp7TMJgnde1KLAIHOMd8yXNbeJVkYh4VSI1LnGwfNXVaPRPfFUlP0I1WpgZi4nZbjRHaALGoy8K4u2R6s/vh3aFdm4P7goC5hekzW48k2BkmohuvkTSlJDptEGOyPhoEl4ACak/rcVDBIMeb4YJ3ywut7xC941F6Xu2Gog8eVFUGgW/T/hufNGCiyQDhmQYvbj4+lig+oXEvsTeXc37msEu3jkuTqTEK6Ix8ZpE27jYiXdSW0SxdXiCIEI1mplZK4m00XSoLMAu92P5zdFI1an7wV3BnTt35cFPfgeaD5S81nyoGRjKlw486DQ9nB8kfdxwqOHSBfIGMgnsOQmx6FCQb/cDms8TnyQ+Prb/cmA72Dxlv1k5m/uwakN+5Shmn55btz8E3vfokWDPESiX50rnYEp78+ve2PTkJtYnwPvLP6zalS+djSka667cvrfKph5KlDz/n+b/lDzReKgRLPqNeO/ChrMVdfMrYlzyYjrFUHNh9ZmKurUFUe6sR8H0DQdEDQdEc/tPYAZOgG7WyD7wlIHz+CR0J8GEW25D0OctMDPxBWZvR3y78F6DoWveDN//mTa8HUf4l8DHCN10yt/D1eMJURy+nUDIghMLbm75onPYehNIMtq2zGqd9bzoc/DXJmdsuZm6uRVMzQRXlCsH7IhSzOOPWCwzH5o53Wy+r8KUArsUW594EgMnYMzNarXOKAPRxCvDYtnRkkKssQJfSknpjDJFsLUC2AKa2GSa/FmYMOjB5YnR9eqODtWaQEC1umP2OnUsulad71Cu9qvpLWY5Cn30242XHmGKQmJhXKORxKNiMf6Q4giGE/oXu5dQ+cr9QJ2e1x0OzxGYjL3ccEjQazYLe6OhHq6eYSw9RHQJguWqqWQPBoLuckkkz7cQ80MiEPPtx7t/ogn4Xj8XtQZtZQ38gP7zWspySvmZg/mPJMxFBmKHKLYhiL6my7mcjZDcM6Azz3WJkCano0rhVfZeoPERuwUCDK/Pa7V5vT5iytf7a0vVQ01ep1C/TVLJA7/+8Ox4NfEElXKSUHP0uYfunNOLwyJhCBULg8TEInYhCopRUWiQn2okP4uvFZz1apL4Hrn2uLVcHSlA5RFsdD5/pn7mjPKZQvDg+VWtfvOU6z61VznD+ALTy+QtL8APH95rZe1hmfaCTT2MzSo6Q7WJwXiUzaCzH6ObsYXvyKaKpWPrGGDC/x5pewS8xHtXKLNZ5QqvN2LCXMwbZtrfk8dQUUwqNfrakLEslI3f0PfgqYuxTAZuMZVKKLq/wMWSjBrnCiNR4RyDkVgkklcb9XMF0aFsNKCRIeY4Ph7t7NeOZknPk9TmKTToOzYtvbrQG18jfPhDXw23rvJTnB+wc7EWLN50XYvisZIJT2gzYIDaTFwMh4/gCBI8TgZOTvcvHOMvBBumH9TR7T9ToJxePHs42TlcnP9p+kVwIob092Ei6dBfRNJfh0jE1/+6XDFcXj5UUbaivHwlKM6teWzaK8hDpb+UBdgFML72sYf+ixTPegCCHlPlYO8AvWbnkAedVWGdVWavmH4zKqM1a/yGRRgozcHt/A40LaT4viRTP/dRqL5rVPK3Poq9clVF5crKimcqKzaAc3on/4tfnAJgmkoiHCWRj5SQScQzZNLREpKxYrii3CVXlpevAlNPlmLFWFw4Kw2HZSy0E4LTFTXl1XXkmtoHddW/PVttEIr7LhjUS9geP1tW1V7dAReX0fdBJDDLLppqiT3d9jR1L1IHTgY4uCvHnBywX2tHQiQ7DB4wZu7p181cwAns4bDjz65ryF162XsPdUBD4IvFQh+f5+VHTJ1C1EvI1EVhxiQE/8Kg/QJDk2CcIq4kElYQiSsI7QxBRbIiyvwNS3yGNOtZ2vbSkuyWNe45YLyGuIJIWr7M9gsWDV43/j/SStJFvHPiQ3Kl6Urnnr5pRd+3fj+9iHGFNPwROkYc4nodBnf7uLSChT/+nWJyVkhof58YjDFeQs0hgUYXF4ojMvaDQ8O/vmDShVeIM0jE6YD3yi642uFuZp29k5ka9A4Gux70xRZvLzkVg3/mLAisku9OZ2KZwOpxm+hRy2LWE34/6/G06DHw2pwRPAaPkyfURwfW8eBq+e5M2tducBUor/U1xj07kBWkAGkFssPTGPdh/VX0Sc42US2nkFMj2sadpFf5Qb62UM2Y5AKGFFdzJhmt2LQdnyYGiE8rNb2e+NI/dm9MTN04Xz4BDnyviEo+xdWGoHUzB94eda3rYxQxRr233zarpH1r4fObxDrfelEeYXzaLhoizlr9B2/pjOMInj8ac2tfSdH3me9LiuhXSNNC9S5P6uMQDmXa0sdpHCOPaxCVhOnUmvsDDnUjTxSU8fgREmkPndZQeQi1a8p+dEMPdBEPdJMenCn3o7N9GvhQpTQEnma/HApFTJgzbFJXzPdZb69Q/cCeKqvUGfM/o1CY8ZUeHIa+xYG1Ntja6NsFNVH91CZol7e1KYiNVjE/ZW8VyuNFcblwK+szZlUULK2NVjM/YzEO7E+Z1VFcMNnk/Qxmk9mT+5KNQRCv3XAxPHJ7JAzGaunLXNwAFvRdlEckR2tmLcl80Ak2/zoTiDLO4giwilZ7FFiS/I6lSdOrLEtu6WQmn3fP8xnXxOOxdp7P7eGG7DI4tPFNEmZSp2e2JAc+1yJhtOh1jGT4Dwj4/mq7WRrYu8DlAfxM0Pa9QenffuLbo1UQl8fZ/kYLtGd3PUOuaeAL/BJm5++pHX1fLXkKgGtMA9N4eZxhtP3bxjxvFgh5CYj1q0zVKhHJIdr/mPDjR5PQ9Y/DZKEiDAvsQi7X+FgxVemRSMT+Zi5IrGD58SvnjAUSgf7as29/hwEUHxqKVThbGKctUqFgL0+4U0C2Sdq5DDjWAmrXBCVWRVQsbFSqZU2tKEA8GiZdWEWws0TM+ME9B4QfnQ7IrOtZmuKD0utPVUp8fG5IqpA0xEW6pOBdDu9dgeg+j3MDmHzPiMMCvygobyoqhFqfynK0OUOnZxEaAUW8Ps1T+lCB0je1OM23InyJo4mtUDSxxQ4+wrOmi6cqfQJU6UvztG0igwiCDCiKGlEIMopEM9hdNHonmz1Gp42DG2aZ9UWs5/eDkuvLq8T+xXhyKiX1zSI1GiFNrCLY2EJm/ODWCcpXUxnoDS73Bsr/mMP5GLz8bvZi+SmKGOP/W6cSGAZLdgc/+KjUG1u/H94Rj3Li4vsuoJPoqTu7gWA3OUSRV/BsMsVFgzs6Jf7hb1nj3yDDCgcXkjFroJBRXe0I/j4ifQb2Rm7+1uGcS05Wi9zbfpBMd0/dtXnnrJLonrE/QaXNK3DoDyPNHOlPPX65muFYwO4uctvhqA8bCqYxNA65G0Z2wbZM3+UjAvI+MmmvtuErrTL7K4zycPStGvJos2ftE28vm275aBMYvzcD813XdyUY5FvydvIFbHjygN97+eTTBtHSu1Skhcf59a8kUmceCng0TVxRQM5lhb7f9vtXWJroqrzM65Z/3Nm6HnqdowtOTalEJYLd8NMUu+mIO/uTK1cM+quVhuBT7C3hMHtLwuzgVjtj7lO9Pe7TOIOvql1qR8xzuqfXcyogXPU3YAGrPBBWh1rj3teYjdQQtZH5mnfXI4RrLocuPdr4mwubM5DLUHkzWF5d2A4+g1SzTsOjcOFkGnqcMBBXvzTZPHJzRPwkHL052jz5EiAGzgh98pqjWySLRDfXkDdQynaI94JuqTwSqdcELzm6QU5A3kEmbSdTtq/UFkPE5brZzM23ZVtn1X7c+7J2pujSNgvndsPBuV0w9uL+ceamAeJ0pTCzKiqu9px2vIbY6XD9rUB6PpSM+3hWAy1McyV9ZXAA7sR0wtVn4bI45nxBXH5wBwyKX1IIdU5qmOoAnx8ET9OVmQKY0ytXUcuVAYNUFrEY28k3EX/k3detdVtb2lrAuZ78n5wny8JvSXdfIbmbv3e9VKkgSfI1WXL1Xln01Njq5aBQBxCA/QJF633pYPDGLZbt3GS5I7/9drO5/MFR28BOvFGjHZ6l9U0+kYm1kUUxUihGKsWIT2xSPh6u2lzL4cTBUTsPwKaaD/u9E2K3Kqq0YSWh1VyKQA9d8Atd0E4XfO1dMmG7uajhFr2xmt6YT28spDeqbBSh0AU3jgbL9wU70nJ7abqDNF8mG+4Rbby7RdYci11U29GDp0FaHiFNj+pqvk/XOI7fuK3A0cQmhxMefCuk5Stkl6j5c5AWbXwu0mX9i6XlqdL0NGl+ZO++Q1mjVBA80Y5gCvMePJmk5WE9TQ8vI7gXLB/WPwBR011glfXPlJZHS9NjpPn+suEpHzY+uWbuv8GNf7MX0RwstnY6p3GquaKihZqSu57wX5yWdT5j34jGZOqdO+Vs/MQkvE1y5rdJwVukYue0HdNYqZbJXV/lYabeuUvs2BKQfK3Sy1LwfCrK5fUU+6MYrVqOJofNzciXRKKQLTrdRzV3uHr5JRySlqdL0zOl+dG5HX9yc3Dj82nW8liAK+Gm5ftyIC23l6Y7Rs03wU5Z//3S8o3S9M2pL8dQTgu+LDn4CJx339CCI+UEb7BjR4MrefHYw7lBrsn8EqwCJWAvjw0u42qXHmUch5cueGl6etT8KHwr6x/Q2XSXo8XQD85+4lM+43O+cC/ds4HQXoGv+cb1W1qMMcbDGCqhiaFZtV+2p5557oWXBrzyur05rosOnN4YeGZ8/jXYNk2DdzTyFqpyuyKU9rqDNfxK0Ouu3Pv++cbwYt0V63MaYRVOKkIkY8UZK37NNFZfZMLwNRiInk3RsJnmlkZfTPmzAQIETPEOgzKvDe6zb3Y35yDMzqX8zc62nRXR7cfeLbxg+6JzffFV+pLjvvTS3nLTfsYtU+bNjFVU9TzTXKvWvPimYHHNtmlBH0/NeU5u/aOszdpP9tbszx5+2Kv5vHUJFruYSb8YxGGH+jMHgs1LzjqIw8s4HLcdhprvD6XyENtwOnXdKZyxG/AXxKkL3qbu9gA/2kDN8ZO9Iv8z8We+xr/8hAfhUDSgZ6BnYH7KYNK4LwdlHk+FZQUrQCMNdNI9AzEDQMuGMx3DnfqPSDGm/AnJugR8A0gphcxkqSYHKC9Toowy2GiDPbTPg45XSvAlg/5PrwG94vj7h6ceI6/69dfksisv/ufBWf5ZqxYULzc8gpP/A04OB51jPu0f/StHzdsPceEbAO/+KUO7wxpuGoHhm83/PVQ0D5yA+YbV4J5qDFkyg1FpOcMp8KG5ywxmlmyooJFiLbyHAbg+fDzkhbWKGPhRm/qXaZeK92km3j4Zdi7/kZB0Vc09RSRaXo4dRRtpNQvmSahunFIv5iGKPMac5QxPt1fgsik1Zh/LpuhVcrYHvX5uCwX+JXgPQX6BhjXg7/fk8Kd+IzTWPntN/ASCbFz+1RD6PHSsbWh/75o2qwQDYUPRx7SePFyGaxHUktyzYMdVLSLL0fX2XZ32ZZHnB2lofES754DtF2rXu6fXd2rGeX5VvFLa+e69tvqHNFrvStQxzvNx7RRoefsYPGdTu2dVa23qcUuEYuLQw/z4hKA/BdZMRAzo55cIBWLE/C/y0J95uzr8Fb/yUsNQ4MceDwT5Hib1//AYUzB31k68XR12Ll8ckmtVM0sRhIOzDUVn0noWzCWYWAzqe1das6iAn8hijK4CpQQ64iB3X4aUW93SakMLau/3bCISNLylbvW80nyia5mv/IP2bEMU6IiDXARDys3fUr8hjL86m7AETaqos3S6tBVPj77y1TOiPdsQBTriMLsI80xuolK/YUX8H2UTlqDhQ9TUR9/gdms02n+utVpCDArvgzi8HvVOvIXeqA/7P54Aom+5/lSOAPPEaRfI7PqmWAEeNQy9lsKWgQKUDVXXlHYh1GAAM/iBFsh9js3a4rYLrRqdd6U09GmyJXOXLyxtqOM3DHotGHBokiVjjQI4lA65PeO0IBPB3MpcTPJh094C8ec2rGTiv+nolVgjV4peBEI/jthOtDmT9ry4GxrlEOTw7HZ/EeHnTBj/7BOAqbkYed3POHflLCMJfijniahINJi3hjzXDDCcHff80jUPvMGdsYh731cxvynvZVemn/lWejwK0gJ0rXbs/2XW8krBRco1vK7RqCZbyf2A5dwb1055qsVrtAzgPW5PC6vtpaCF8fGi7p2+yYVdAynDCutUT90vzZ7XLEA7V9fASVDDeVDDYVCCFcJh6xK/e7vSuZtg1J2HgEss/P5EXzq9DPl3hiCeAX79v800APzFhz2/+cH5/6QXP78NAkcwQOAnp8Uu/pkF+X+/oglZZ99F85iJYd45/GXauoWekuXUEwbw03m4USC6+DN43QnmJPAO/R35/34gHi27PVLTKoH8Zlbt1nv1Qhli88McyX3bF8R5bKrtFE2TrcOvr8m2GjeZWPPTZKJ/BIZ3U9JcuJn4e5pAVuhYFJBtQZPWCPu15nSrUM954Q71XhBq8Ec3PeNib1RzZnqr4txYXpIt2Rqh3WDfMvb1xYNpnwTkckP3+/PGEakMNX3qoEh+50sMJp2SXFtdpo3qXWO/w3g/YpFpVW/X/A9fOagmx9qXBWbPen4GOAATb1UbftyVgR5PMcukN/s2KqYP5GXHNsbebwje+p+Rv/I23NO6es5+Tjq6A/mxc7bgrdtLr5fgx00S0wNO/UC5FuG4oij8Gk82NW5ssWZ6EnAvRNca/nXy3zQY1ptJ5eFt9LqbTdpV+s0A7R7l10E+w/Meh25Jhsn5TcZjxLytkX+Jhqi9pwoFrKsTHFKhmkveuLoGG0MyjY3zLc1jxeC9UtDPkbhInAuU6AyYDdwixMHnMAYcYRQEQrj2GX6jSivh1E2cZD4NC34r/Q/PCbmvnM+Kh71vC+pf3tYshNFqC3C+XQghcJtH56ilz6mLLtLN3erMkOVEKXmHB19xa6jH4aDHmLjipCe6g0YvDRENgdZMEqpOReaSzQgzI9Pagx43dhmh7/H7aCGE5jt8HPD1F5+A74x0geC66XYZXLsRfgzbxZ4DTR+6OZibcd5KTqs1fHGSSRMi4GBiJfEEGTu78HkaPXOm8AO4a/SOjvKlGLTdJFpx9J9wk/VYC9EQVywHYDok2zvuH1wC8ZK+e0Twy4uY8O3BrCojt4jXKrlhwm4RFGFYBWB+kbwMjS8H7g54Pnwh3BWeA9dLPbhdHMXmvfvL7xj2lmdvjDVr9Sh+6OwxNK1qszacLdmueMmyXpzNLWZtP71BgX6jcLtqCvjup+lWMM9beo+ltFdU+xTWxA1E3wv/U+5meX6AcK+O0nJn9j5JpTiLN9WSTnHvLdEEZvQbU2Bxp00JzK6To1mZK0CjbXTTTIcRS/JpEc/+4dUDNxzKY2U8uk/fdfqV+FKQtEjwrQgCLfu+jZDTvGoUAT+fjDqkn/e8/ctNY3z/neMdTkpDLjPwRP05FV3yrIHji36RAUzAG/2UPb3ph+w972WVkgtZoC43appMrLlkas0aX2z7Bq0SA1pvRbWFkbyX10GOpk4pva/F18SvQ1Z0QGCfWVqZkW0MDR9R9wNLaoLIfqh3nZq8Y/T5umTvY9vMsTiTAlyThKQLGiOxIJknKQmEe0spwp/vzUP6pN1tSfq8rMRAz9awaH6PqT8aBOYx2eKigIeciX14WScuIKBNCOCrk/p6RGugHpO4X08ItiufjNdTRirbkeYqoQ+SszMa9Qo0v3obHG2eSpsWOZ8d1dtjSeodYRx37u5Y8BDfW3+qqyMttPelMu3e9kzHQHd9e0cu3+9NDfvn9MtpmkkJO3203d57MXNdfPJwqmceTwdivK/wVNbR20MRiflCIaqOS9vFmaxYkhYl4qbdfxH2yZAyQYjn4F0LhX3SKGW3KYWbF9fPGelbWtwLNCuX3nlkAu2DUjEDfSU+uxPpJNM4kHh+KvpiHKkXHb0fdqCNn+7tFuS0RLYqvB8bTp+XYSlr6tm+HVojPb//sFj+Ew==\"","export default \"data:font/woff2;base64,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\"","export default \"data:font/woff2;base64,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\"","export default \"data:font/woff2;base64,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\"","/// <reference types=\"vite/client\" />\n/**\n * Fuente única del CMS Bluestack: **Google Sans**. Reemplaza a Roboto y Product\n * Sans (retiradas). Está **self-hosted** dentro de la lib: los `.woff2` viven en\n * `theme/fonts/` y Vite los inlinea como data URI en el build (ver\n * `assetsInlineLimit` en `vite.config.ts`). Así cada gestor que use el provider\n * MUI hereda la fuente sin CDN ni configuración de `public/`.\n *\n * Los archivos originales eran `.ttf` con cobertura multi-idioma (~2 MB c/u);\n * se subsetearon al **subconjunto latin** (es/en/pt + puntuación/símbolos de UI)\n * y se convirtieron a woff2 (~22-24 KB c/u). Pesos: 400/500/700, normal e italic.\n */\n\n// Google Sans (woff2, subconjunto latin)\nimport GoogleSans400 from './fonts/GoogleSans-Regular.woff2';\nimport GoogleSans400Italic from './fonts/GoogleSans-Italic.woff2';\nimport GoogleSans500 from './fonts/GoogleSans-Medium.woff2';\nimport GoogleSans500Italic from './fonts/GoogleSans-MediumItalic.woff2';\nimport GoogleSans700 from './fonts/GoogleSans-Bold.woff2';\nimport GoogleSans700Italic from './fonts/GoogleSans-BoldItalic.woff2';\n\n/**\n * Reglas `@font-face` de Google Sans, listas para inyectarse como estilos\n * globales (ver el componente `CmsFontFaces`).\n */\nexport const cmsFontFaces = `\n@font-face {\n font-family: 'Google Sans';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(${GoogleSans400}) format('woff2');\n}\n@font-face {\n font-family: 'Google Sans';\n font-style: italic;\n font-weight: 400;\n font-display: swap;\n src: url(${GoogleSans400Italic}) format('woff2');\n}\n@font-face {\n font-family: 'Google Sans';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(${GoogleSans500}) format('woff2');\n}\n@font-face {\n font-family: 'Google Sans';\n font-style: italic;\n font-weight: 500;\n font-display: swap;\n src: url(${GoogleSans500Italic}) format('woff2');\n}\n@font-face {\n font-family: 'Google Sans';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(${GoogleSans700}) format('woff2');\n}\n@font-face {\n font-family: 'Google Sans';\n font-style: italic;\n font-weight: 700;\n font-display: swap;\n src: url(${GoogleSans700Italic}) format('woff2');\n}\n`;\n","// Preferencia de tema (claro/oscuro) persistida en `localStorage`.\n//\n// Mecanismo compartido: vive en la lib para que TODOS los gestores persistan y\n// lean el tema igual. El dato es por gestor (localStorage está aislado por\n// origen: elegir \"oscuro\" en un gestor NO se propaga a los demás dominios).\n//\n// Dos dimensiones, para recordar tal cual la selección del menú \"Apariencia\":\n// - `enabled`: switch \"Tema nuevo\". Apagado → se fuerza claro.\n// - `mode`: modo deseado (`light`/`dark`), se recuerda aunque `enabled` esté off.\n// El \"modo efectivo\" que se aplica al sitio = `enabled ? mode : 'light'`.\n//\n// Funciones puras que solo tocan `localStorage`/DOM (sin React ni MUI), así\n// funcionan aunque el gestor tenga su propia copia de @mui symlinkeada.\n\nexport type ThemeMode = 'light' | 'dark';\n\nexport type ThemePreference = {\n /** Switch \"Tema nuevo\" del menú Apariencia. Off → se fuerza claro. */\n enabled: boolean;\n /** Modo deseado por el usuario (se recuerda aunque `enabled` esté off). */\n mode: ThemeMode;\n};\n\n/** Clave de localStorage para el modo deseado (`light`/`dark`). */\nexport const THEME_MODE_STORAGE_KEY = 'cms-theme-mode';\n/** Clave de localStorage para el switch \"Tema nuevo\". */\nexport const THEME_ENABLED_STORAGE_KEY = 'cms-theme-enabled';\n/**\n * Atributo que MUI togglea en `<html>` (coincide con `colorSchemeSelector` de\n * `createAppTheme`). Las CSS vars `--cms-*` y `--mui-palette-*` se enganchan acá.\n */\nexport const THEME_COLOR_SCHEME_ATTRIBUTE = 'data-mui-color-scheme';\n\n/** Preferencia por defecto (sin nada guardado): tema nuevo activo, modo claro. */\nexport const DEFAULT_THEME_PREFERENCE: ThemePreference = {\n enabled: true,\n mode: 'light',\n};\n\n/** Modo efectivo aplicado al sitio a partir de la preferencia. */\nexport function getEffectiveThemeMode(pref: ThemePreference): ThemeMode {\n return pref.enabled && pref.mode === 'dark' ? 'dark' : 'light';\n}\n\n/** Lee la preferencia de `localStorage`. SSR-safe (fallback al default). */\nexport function readThemePreference(): ThemePreference {\n if (typeof window === 'undefined') return DEFAULT_THEME_PREFERENCE;\n try {\n const rawMode = window.localStorage.getItem(THEME_MODE_STORAGE_KEY);\n const rawEnabled = window.localStorage.getItem(THEME_ENABLED_STORAGE_KEY);\n return {\n mode: rawMode === 'dark' ? 'dark' : 'light',\n enabled: rawEnabled === null ? true : rawEnabled === 'true',\n };\n } catch {\n return DEFAULT_THEME_PREFERENCE;\n }\n}\n\n/** Modo efectivo leído directo de `localStorage`. SSR-safe. */\nexport function readEffectiveThemeMode(): ThemeMode {\n return getEffectiveThemeMode(readThemePreference());\n}\n\n/**\n * Guarda la preferencia y refleja el modo efectivo en el atributo de `<html>`\n * de una (para que el cambio se vea sin recargar). SSR-safe.\n */\nexport function writeThemePreference(pref: ThemePreference): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(THEME_MODE_STORAGE_KEY, pref.mode);\n window.localStorage.setItem(\n THEME_ENABLED_STORAGE_KEY,\n String(pref.enabled),\n );\n document.documentElement.setAttribute(\n THEME_COLOR_SCHEME_ATTRIBUTE,\n getEffectiveThemeMode(pref),\n );\n } catch {\n // Sin storage (modo privado / bloqueado): el tema simplemente no persiste.\n }\n}\n","import type {\n AppMessageNode,\n AppMessages,\n CmsMessages,\n ErrorPageMessageKey,\n NavigationModule,\n NetworkMessageKey,\n NewMenuMessageKey,\n NotificationsMenuMessageKey,\n PreviewMenuMessageKey,\n ProfileMenuMessageKey,\n SidebarMessageKey,\n ToastMessageKey,\n TopBarMessageKey,\n UserAvatarMessageKey,\n} from './types';\n\n/** Parámetros de interpolación para placeholders `{nombre}` en un mensaje. */\nexport type TranslationParams = Record<string, string | number>;\n\n/** Traductor genérico de claves del gestor por ruta con puntos (`ns.clave`). */\nexport type AppTranslate = (path: string, params?: TranslationParams) => string;\n\nexport type CmsTranslator = {\n messages: CmsMessages;\n /** Árbol de mensajes del gestor ya resuelto al locale activo (con fallback en). */\n appMessages: AppMessages;\n navigation: (module: NavigationModule | string) => string;\n sidebar: (key: SidebarMessageKey) => string;\n topBar: (key: TopBarMessageKey) => string;\n newMenu: (key: NewMenuMessageKey) => string;\n previewMenu: (key: PreviewMenuMessageKey) => string;\n profileMenu: (key: ProfileMenuMessageKey) => string;\n notificationsMenu: (\n key: NotificationsMenuMessageKey,\n params?: { count?: number },\n ) => string;\n toast: (key: ToastMessageKey) => string;\n network: (key: NetworkMessageKey) => string;\n userAvatar: (key: UserAvatarMessageKey) => string;\n errorPage: (key: ErrorPageMessageKey) => string;\n /**\n * Resuelve una clave propia del gestor por ruta con puntos\n * (p. ej. `t.app('usuarios.modal.deactivate.title')`). Si falta, devuelve la\n * ruta tal cual (útil para detectar claves ausentes en desarrollo).\n */\n app: AppTranslate;\n /**\n * Devuelve un traductor del gestor con un namespace fijado:\n * `const tu = t.scoped('usuarios'); tu('modal.deactivate.title')`.\n */\n scoped: (namespace: string) => AppTranslate;\n};\n\nfunction interpolate(template: string, params?: TranslationParams): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n const value = params[key];\n return value === undefined ? `{${key}}` : String(value);\n });\n}\n\n/** Navega un árbol de mensajes del gestor por ruta con puntos. */\nfunction resolveAppPath(tree: AppMessages, path: string): string | undefined {\n let node: AppMessageNode | undefined = tree;\n for (const segment of path.split('.')) {\n if (typeof node !== 'object' || node === null) return undefined;\n node = node[segment];\n }\n return typeof node === 'string' ? node : undefined;\n}\n\nexport function createTranslator(\n messages: CmsMessages,\n appMessages: AppMessages = {},\n): CmsTranslator {\n const navigationLookup = messages.navigation as Record<string, string>;\n\n const app: AppTranslate = (path, params) => {\n const value = resolveAppPath(appMessages, path);\n return value === undefined ? path : interpolate(value, params);\n };\n\n return {\n messages,\n appMessages,\n navigation: (module) => navigationLookup[module] ?? module,\n sidebar: (key) => messages.sidebar[key],\n topBar: (key) => messages.topBar[key],\n newMenu: (key) => messages.newMenu[key],\n previewMenu: (key) => messages.previewMenu[key],\n profileMenu: (key) => messages.profileMenu[key],\n notificationsMenu: (key, params) =>\n interpolate(messages.notificationsMenu[key], params),\n toast: (key) => messages.toast[key],\n network: (key) => messages.network[key],\n userAvatar: (key) => messages.userAvatar[key],\n errorPage: (key) => messages.errorPage[key],\n app,\n scoped: (namespace) => (path, params) => app(`${namespace}.${path}`, params),\n };\n}\n","export const enMessages = {\n navigation: {\n COMMENTS: 'Comments',\n POLLS: 'Polls',\n MEDIA: 'Media',\n AUDIOS: 'Audio',\n IMAGES: 'Images',\n PLAYLISTS: 'Playlist',\n VIDEOS: 'Videos',\n NEWS: 'News',\n PLANNING: 'Planning',\n ANALYTICS: 'Analytics',\n TAGS: 'Tags',\n TRIVIAS: 'Trivia',\n OTHERS: 'Other',\n NEWSWIRES: 'News Wires',\n EVENTS: 'Events',\n PAGES: 'Pages',\n FEEDS: 'Feed',\n PERSONS: 'People',\n CONTRIBUTIONS: 'Contributions',\n RECIPES: 'Recipes',\n POSTS: 'Posts',\n BANNERS: 'Banners',\n BLOCKS: 'Blocks',\n MENUS: 'Menu',\n TOPICS: 'Topics',\n ADVANCEDQUERYS: 'Advanced search',\n IMPORTS: 'Imports',\n NEWSLETTERS: 'Newsletters',\n NOTIFICATIONS: 'Notifications',\n PAYMENTS: 'Payments',\n PLANS: 'Plans',\n REPORTS: 'Reports',\n SECTIONS: 'Sections',\n TWITTERS: 'Twitter Feeds',\n USERS: 'Users',\n ZONES: 'Zones',\n IA: 'IA',\n },\n sidebar: {\n navAriaLabel: 'Main navigation',\n collapse: 'Collapse',\n expand: 'Expand',\n newBadge: 'New',\n pin: 'Pin to top',\n unpin: 'Unpin',\n },\n topBar: {\n openSidebar: 'Open sidebar menu',\n closeSidebar: 'Close sidebar menu',\n new: 'New',\n language: 'Language',\n analytics: 'Analytics',\n preview: 'Preview',\n help: 'Help',\n publication: 'Publication',\n appearance: 'Appearance',\n newTheme: 'New theme',\n newThemeSubtitle: 'Redesigned interface',\n modeLabel: 'Mode',\n modeLight: 'Light',\n modeDark: 'Dark',\n classicUnavailable: 'The classic view is not available in this prototype.',\n },\n newMenu: {\n frequentsTitle: 'Frequent',\n othersTitle: 'Others',\n videosTitle: 'Videos',\n post: 'New Post',\n trivia: 'New Trivia',\n poll: 'New Poll',\n listicle: 'New Listicle',\n tag: 'New Tag',\n gamecast: 'New Gamecast',\n liveblog: 'New LiveBlog',\n aiPost: 'New AI Post',\n aiListicle: 'New AI Listicle',\n videoNative: 'New Video Native',\n videoEmbedded: 'New Video Embedded',\n videoYoutube: 'New Video Youtube',\n },\n previewMenu: {\n desktop: 'Preview Desktop',\n mobile: 'Preview Mobile',\n tablet: 'Preview Tablet',\n },\n profileMenu: {\n ariaLabel: 'My profile',\n myProfile: 'My Profile',\n webmasterView: 'Webmaster View',\n signOff: 'Sign off',\n },\n notificationsMenu: {\n title: 'Notifications',\n unreadCount: '{count} unread',\n empty: 'No notifications',\n ariaLabel: 'Notifications',\n close: 'Close',\n today: 'Today',\n yesterday: 'Yesterday',\n assignedBefore: 'You have',\n assignedAfter: 'new assigned topics.',\n pendingBefore: 'You have',\n pendingAfter: 'assigned topics about to expire.',\n assignedToday: 'Assigned today',\n assignedYesterday: 'Assigned yesterday',\n assignedOn: 'Assigned on',\n expires: 'Due',\n unassignedText: 'You are no longer responsible for the task',\n unassignedRemovedYouFrom: 'removed you from the task',\n unassignedNoLongerResponsible: 'You are no longer responsible.',\n editorialOpportunityLabel: 'Editorial opportunity',\n editorialOpportunityText: '{count} topics require your attention',\n editorialOpportunityTop: 'Top',\n editorialOpportunityMatch: 'Match',\n editorialOpportunityTrending: 'Trending',\n editorialOpportunitySeeMoreOpportunities: 'See {count} more opportunities',\n editorialOpportunityHide: 'Hide',\n editorialOpportunityRemindLater: 'Remind me later',\n editorialOpportunitySeeMore: 'See more',\n },\n search: {\n placeholder: 'Search…',\n addPlaceholder: 'Add…',\n inputAriaLabel: 'Search',\n clearAriaLabel: 'Clear search',\n removeChipAriaLabel: 'Remove term',\n advancedAriaLabel: 'Advanced search',\n title: 'Advanced search',\n apply: 'Apply',\n reset: 'Reset',\n close: 'Close',\n noOptions: 'No matches',\n dateToday: 'Today',\n dateClear: 'Clear',\n dateOpenAriaLabel: 'Open calendar',\n prevMonthAriaLabel: 'Previous month',\n nextMonthAriaLabel: 'Next month',\n },\n searchFields: {\n text: 'Text',\n textPlaceholder: 'Title, summary or body',\n type: 'Type',\n typePlaceholder: 'All types',\n section: 'Section',\n sectionPlaceholder: 'All sections',\n category: 'Category',\n categoryPlaceholder: 'All categories',\n states: 'Statuses',\n statesPlaceholder: 'All statuses',\n creator: 'Creator',\n creatorPlaceholder: 'Type to search a creator',\n author: 'Author',\n authorPlaceholder: 'Type to search an author',\n tags: 'Tags',\n tagsPlaceholder: 'Type and press Enter',\n groups: 'Groups',\n groupsPlaceholder: 'All groups',\n amount: 'Amount to show',\n amountPlaceholder: 'e.g. 50',\n dateFrom: 'Date from',\n dateTo: 'Date to',\n sortBy: 'Sort by',\n sortByPlaceholder: 'Relevance',\n zone: 'Zone',\n zonePlaceholder: 'Any zone',\n priority: 'Priority',\n priorityPlaceholder: 'All',\n order: 'Order',\n orderPlaceholder: 'Descending',\n includeDrafts: 'Include drafts',\n includeHistory: 'Include historical content',\n },\n searchOptions: {\n typeNews: 'Article',\n typeList: 'List note',\n typeLiveblog: 'LiveBlog',\n statePublished: 'Published',\n stateDraft: 'In drafting',\n stateScheduled: 'Scheduled',\n stateReview: 'In review',\n stateDone: 'Finished',\n sortRelevance: 'Relevance',\n sortDate: 'Date',\n sortTitle: 'Title',\n orderDesc: 'Descending',\n orderAsc: 'Ascending',\n priorityHigh: 'High (1–10)',\n priorityMid: 'Medium (11–30)',\n priorityLow: 'Low (31+)',\n },\n toast: {\n close: 'Close',\n copyDetail: 'Copy error detail',\n copied: 'Copied',\n defaultSuccess: 'Operation completed successfully.',\n defaultError: 'An error occurred in the service.',\n defaultWarning: 'Please review the request.',\n defaultInfo: 'Information',\n },\n network: {\n disconnected:\n 'No connection. Check your network or Wi-Fi status. We will retry when the connection is restored.',\n retrying: 'Retrying requests.',\n restored: 'Connection restored.',\n },\n userAvatar: {\n alt: 'User avatar',\n unknownUser: 'Unknown user',\n },\n errorPage: {\n homeButton: 'Home',\n notFoundTitle: 'Sorry an error occurred.',\n notFoundSubtitle: 'This website is no longer available. Keep browsing!',\n notFoundCode: '404',\n errorLabel: 'Error',\n copyDetail: 'Copy detail.',\n copyDetailText:\n 'The route {url} you are trying to access is no longer available.',\n copied: 'Text copied to clipboard!',\n notAllowedTitle: 'Sorry.\\nYou do not have access.',\n notAllowedSubtitle:\n 'What you want to see is restricted by permissions. Keep browsing!',\n },\n} as const;\n","import type { CmsMessages } from '../types';\n\nexport const esMessages = {\n navigation: {\n COMMENTS: 'Comentarios',\n POLLS: 'Encuestas',\n MEDIA: 'Media',\n AUDIOS: 'Audio',\n IMAGES: 'Imágenes',\n PLAYLISTS: 'Playlist',\n VIDEOS: 'Videos',\n NEWS: 'Noticias',\n PLANNING: 'Planificación',\n ANALYTICS: 'Analíticas',\n TAGS: 'Tags',\n TRIVIAS: 'Trivias',\n OTHERS: 'Otros',\n NEWSWIRES: 'News Wires',\n EVENTS: 'Eventos',\n PAGES: 'Páginas',\n FEEDS: 'Feed',\n PERSONS: 'Personas',\n CONTRIBUTIONS: 'Contribuciones',\n RECIPES: 'Recetas',\n POSTS: 'Posts',\n BANNERS: 'Banners',\n BLOCKS: 'Bloques',\n MENUS: 'Menú',\n TOPICS: 'Temas',\n ADVANCEDQUERYS: 'Búsqueda avanzada',\n IMPORTS: 'Importaciones',\n NEWSLETTERS: 'Newsletters',\n NOTIFICATIONS: 'Notificaciones',\n PAYMENTS: 'Pagos',\n PLANS: 'Planes',\n REPORTS: 'Reportes',\n SECTIONS: 'Secciones',\n TWITTERS: 'Twitter Feeds',\n USERS: 'Usuarios',\n ZONES: 'Zonas',\n IA: 'IA',\n },\n sidebar: {\n navAriaLabel: 'Principal',\n collapse: 'Contraer',\n expand: 'Expandir',\n newBadge: 'Nuevo',\n pin: 'Anclar arriba',\n unpin: 'Desanclar',\n },\n topBar: {\n openSidebar: 'Abrir menú lateral',\n closeSidebar: 'Cerrar menú lateral',\n new: 'Nuevo',\n language: 'Idioma',\n analytics: 'Analíticas',\n preview: 'Previsualizar',\n help: 'Ayuda',\n publication: 'Publicación',\n appearance: 'Apariencia',\n newTheme: 'Tema nuevo',\n newThemeSubtitle: 'Interfaz rediseñada',\n modeLabel: 'Modo',\n modeLight: 'Claro',\n modeDark: 'Oscuro',\n classicUnavailable: 'La vista clásica no está disponible en este prototipo.',\n },\n newMenu: {\n frequentsTitle: 'Frecuentes',\n othersTitle: 'Otros',\n videosTitle: 'Videos',\n post: 'Nueva Nota',\n trivia: 'Nueva Trivia',\n poll: 'Nueva Encuesta',\n listicle: 'Nueva Nota Lista',\n tag: 'Nuevo Tag',\n gamecast: 'Nuevo Gamecast',\n liveblog: 'Nuevo LiveBlog',\n aiPost: 'Nueva Nota IA',\n aiListicle: 'Nueva Lista IA',\n videoNative: 'Nuevo Video Nativo',\n videoEmbedded: 'Nuevo Video Embebido',\n videoYoutube: 'Nuevo Video Youtube',\n },\n previewMenu: {\n desktop: 'Previsualizar Escritorio',\n mobile: 'Previsualizar Móvil',\n tablet: 'Previsualizar Tablet',\n },\n profileMenu: {\n ariaLabel: 'Mi perfil',\n myProfile: 'Mi perfil',\n webmasterView: 'Vista Webmaster',\n signOff: 'Cerrar sesión',\n },\n notificationsMenu: {\n title: 'Notificaciones',\n unreadCount: '{count} sin leer',\n empty: 'No hay notificaciones',\n ariaLabel: 'Notificaciones',\n close: 'Cerrar',\n today: 'Hoy',\n yesterday: 'Ayer',\n assignedBefore: 'Tienes',\n assignedAfter: 'nuevos temas asignados.',\n pendingBefore: 'Tienes',\n pendingAfter: 'temas asignados por vencer.',\n assignedToday: 'Asignado hoy',\n assignedYesterday: 'Asignado ayer',\n assignedOn: 'Asignado el',\n expires: 'Vence',\n unassignedText: 'Ya no eres responsable de la tarea',\n unassignedRemovedYouFrom: 'te quitó de la tarea',\n unassignedNoLongerResponsible: 'Ya no eres el responsable.',\n editorialOpportunityLabel: 'Oportunidad editorial',\n editorialOpportunityText: '{count} temas requieren tu atención',\n editorialOpportunityTop: 'Top',\n editorialOpportunityMatch: 'Coincidencia',\n editorialOpportunityTrending: 'Trending',\n editorialOpportunitySeeMoreOpportunities: 'Ver {count} oportunidades más',\n editorialOpportunityHide: 'Ocultar',\n editorialOpportunityRemindLater: 'Recordar luego',\n editorialOpportunitySeeMore: 'Ver más',\n },\n search: {\n placeholder: 'Buscar…',\n addPlaceholder: 'Agregar…',\n inputAriaLabel: 'Buscar',\n clearAriaLabel: 'Borrar búsqueda',\n removeChipAriaLabel: 'Quitar término',\n advancedAriaLabel: 'Búsqueda avanzada',\n title: 'Búsqueda avanzada',\n apply: 'Aplicar',\n reset: 'Restablecer',\n close: 'Cerrar',\n noOptions: 'Sin coincidencias',\n dateToday: 'Hoy',\n dateClear: 'Limpiar',\n dateOpenAriaLabel: 'Abrir calendario',\n prevMonthAriaLabel: 'Mes anterior',\n nextMonthAriaLabel: 'Mes siguiente',\n },\n searchFields: {\n text: 'Texto',\n textPlaceholder: 'Título, copete o cuerpo',\n type: 'Tipo',\n typePlaceholder: 'Todos los tipos',\n section: 'Sección',\n sectionPlaceholder: 'Todas las secciones',\n category: 'Categoría',\n categoryPlaceholder: 'Todas las categorías',\n states: 'Estados',\n statesPlaceholder: 'Todos los estados',\n creator: 'Creador',\n creatorPlaceholder: 'Escribí para buscar creador',\n author: 'Autor',\n authorPlaceholder: 'Escribí para buscar autor',\n tags: 'Etiquetas',\n tagsPlaceholder: 'Escribí y presioná Enter',\n groups: 'Grupos',\n groupsPlaceholder: 'Todos los grupos',\n amount: 'Cantidad a mostrar',\n amountPlaceholder: 'Ej: 50',\n dateFrom: 'Fecha desde',\n dateTo: 'Fecha hasta',\n sortBy: 'Ordenar por',\n sortByPlaceholder: 'Relevancia',\n zone: 'Zona',\n zonePlaceholder: 'Cualquier zona',\n priority: 'Prioridad',\n priorityPlaceholder: 'Todas',\n order: 'Orden',\n orderPlaceholder: 'Descendente',\n includeDrafts: 'Incluir borradores',\n includeHistory: 'Incluir contenido histórico',\n },\n searchOptions: {\n typeNews: 'Noticia',\n typeList: 'Nota Lista',\n typeLiveblog: 'LiveBlog',\n statePublished: 'Publicada',\n stateDraft: 'En Redacción',\n stateScheduled: 'Programada',\n stateReview: 'En Revisión',\n stateDone: 'Terminada',\n sortRelevance: 'Relevancia',\n sortDate: 'Fecha',\n sortTitle: 'Título',\n orderDesc: 'Descendente',\n orderAsc: 'Ascendente',\n priorityHigh: 'Alta (1–10)',\n priorityMid: 'Media (11–30)',\n priorityLow: 'Baja (31+)',\n },\n toast: {\n close: 'Cerrar',\n copyDetail: 'Copiar detalle del error',\n copied: 'Copiado',\n defaultSuccess: 'Operación realizada correctamente.',\n defaultError: 'Se produjo un error en el servicio.',\n defaultWarning: 'Revisá el requerimiento.',\n defaultInfo: 'Información',\n },\n network: {\n disconnected:\n 'Sin conexión. Revisa tu red o el estado del Wi-Fi. Reintentaremos cuando se restablezca.',\n retrying: 'Reintentando solicitudes.',\n restored: 'Conexión restablecida.',\n },\n userAvatar: {\n alt: 'Avatar de usuario',\n unknownUser: 'Usuario sin nombre',\n },\n errorPage: {\n homeButton: 'Inicio',\n notFoundTitle: 'Lo sentimos.\\nHa ocurrido un error.',\n notFoundSubtitle:\n 'Lo que quieres ver ya no está disponible. ¡Sigue navegando!',\n notFoundCode: '404',\n errorLabel: 'Error',\n copyDetail: 'Copiar detalle.',\n copyDetailText:\n 'La ruta {url} donde estás intentando acceder ya no está disponible.',\n copied: '¡Texto copiado en el portapapeles!',\n notAllowedTitle: 'Lo sentimos.\\nNo tienes acceso.',\n notAllowedSubtitle:\n 'Lo que quieres ver está restringido por permisos. ¡Sigue navegando!',\n },\n} satisfies CmsMessages;\n","import type { CmsMessages } from '../types';\n\nexport const ptMessages = {\n navigation: {\n COMMENTS: 'Comentários',\n POLLS: 'Enquetes',\n MEDIA: 'Mídia',\n AUDIOS: 'Áudio',\n IMAGES: 'Imagens',\n PLAYLISTS: 'Playlist',\n VIDEOS: 'Vídeos',\n NEWS: 'Notícias',\n PLANNING: 'Planejamento',\n ANALYTICS: 'Análises',\n TAGS: 'Tags',\n TRIVIAS: 'Trivias',\n OTHERS: 'Outros',\n NEWSWIRES: 'News Wires',\n EVENTS: 'Eventos',\n PAGES: 'Páginas',\n FEEDS: 'Feed',\n PERSONS: 'Pessoas',\n CONTRIBUTIONS: 'Contribuições',\n RECIPES: 'Receitas',\n POSTS: 'Posts',\n BANNERS: 'Banners',\n BLOCKS: 'Blocos',\n MENUS: 'Menu',\n TOPICS: 'Tópicos',\n ADVANCEDQUERYS: 'Busca avançada',\n IMPORTS: 'Importações',\n NEWSLETTERS: 'Newsletters',\n NOTIFICATIONS: 'Notificações',\n PAYMENTS: 'Pagamentos',\n PLANS: 'Planos',\n REPORTS: 'Relatórios',\n SECTIONS: 'Seções',\n TWITTERS: 'Twitter Feeds',\n USERS: 'Usuários',\n ZONES: 'Zonas',\n IA: 'IA',\n },\n sidebar: {\n navAriaLabel: 'Principal',\n collapse: 'Recolher',\n expand: 'Expandir',\n newBadge: 'Novo',\n pin: 'Fixar no topo',\n unpin: 'Desafixar',\n },\n topBar: {\n openSidebar: 'Abrir menu lateral',\n closeSidebar: 'Fechar menu lateral',\n new: 'Novo',\n language: 'Idioma',\n analytics: 'Análises',\n preview: 'Pré-visualizar',\n help: 'Ajuda',\n publication: 'Publicação',\n appearance: 'Aparência',\n newTheme: 'Tema novo',\n newThemeSubtitle: 'Interface redesenhada',\n modeLabel: 'Modo',\n modeLight: 'Claro',\n modeDark: 'Escuro',\n classicUnavailable: 'A visualização clássica não está disponível neste protótipo.',\n },\n newMenu: {\n frequentsTitle: 'Frequentes',\n othersTitle: 'Outros',\n videosTitle: 'Vídeos',\n post: 'Nova Matéria',\n trivia: 'Novo Quiz',\n poll: 'Nova Enquete',\n listicle: 'Nova Lista',\n tag: 'Nova Tag',\n gamecast: 'Novo Gamecast',\n liveblog: 'Novo LiveBlog',\n aiPost: 'Nova Matéria IA',\n aiListicle: 'Nova Lista IA',\n videoNative: 'Novo Vídeo Nativo',\n videoEmbedded: 'Novo Vídeo Incorporado',\n videoYoutube: 'Novo Vídeo Youtube',\n },\n previewMenu: {\n desktop: 'Pré-visualizar Desktop',\n mobile: 'Pré-visualizar Celular',\n tablet: 'Pré-visualizar Tablet',\n },\n profileMenu: {\n ariaLabel: 'Meu perfil',\n myProfile: 'Meu perfil',\n webmasterView: 'Visão Webmaster',\n signOff: 'Sair',\n },\n notificationsMenu: {\n title: 'Notificações',\n unreadCount: '{count} não lidas',\n empty: 'Nenhuma notificação',\n ariaLabel: 'Notificações',\n close: 'Fechar',\n today: 'Hoje',\n yesterday: 'Ontem',\n assignedBefore: 'Você tem',\n assignedAfter: 'novos temas atribuídos.',\n pendingBefore: 'Você tem',\n pendingAfter: 'temas atribuídos a vencer.',\n assignedToday: 'Atribuído hoje',\n assignedYesterday: 'Atribuído ontem',\n assignedOn: 'Atribuído em',\n expires: 'Vence',\n unassignedText: 'Você já não é responsável pela tarefa',\n unassignedRemovedYouFrom: 'removeu você da tarefa',\n unassignedNoLongerResponsible: 'Você já não é responsável.',\n editorialOpportunityLabel: 'Oportunidade editorial',\n editorialOpportunityText: '{count} temas exigem sua atenção',\n editorialOpportunityTop: 'Top',\n editorialOpportunityMatch: 'Correspondência',\n editorialOpportunityTrending: 'Em alta',\n editorialOpportunitySeeMoreOpportunities: 'Ver mais {count} oportunidades',\n editorialOpportunityHide: 'Ocultar',\n editorialOpportunityRemindLater: 'Lembrar depois',\n editorialOpportunitySeeMore: 'Ver mais',\n },\n search: {\n placeholder: 'Buscar…',\n addPlaceholder: 'Adicionar…',\n inputAriaLabel: 'Buscar',\n clearAriaLabel: 'Limpar busca',\n removeChipAriaLabel: 'Remover termo',\n advancedAriaLabel: 'Busca avançada',\n title: 'Busca avançada',\n apply: 'Aplicar',\n reset: 'Redefinir',\n close: 'Fechar',\n noOptions: 'Sem correspondências',\n dateToday: 'Hoje',\n dateClear: 'Limpar',\n dateOpenAriaLabel: 'Abrir calendário',\n prevMonthAriaLabel: 'Mês anterior',\n nextMonthAriaLabel: 'Mês seguinte',\n },\n searchFields: {\n text: 'Texto',\n textPlaceholder: 'Título, resumo ou corpo',\n type: 'Tipo',\n typePlaceholder: 'Todos os tipos',\n section: 'Seção',\n sectionPlaceholder: 'Todas as seções',\n category: 'Categoria',\n categoryPlaceholder: 'Todas as categorias',\n states: 'Estados',\n statesPlaceholder: 'Todos os estados',\n creator: 'Criador',\n creatorPlaceholder: 'Digite para buscar um criador',\n author: 'Autor',\n authorPlaceholder: 'Digite para buscar um autor',\n tags: 'Etiquetas',\n tagsPlaceholder: 'Digite e pressione Enter',\n groups: 'Grupos',\n groupsPlaceholder: 'Todos os grupos',\n amount: 'Quantidade a mostrar',\n amountPlaceholder: 'Ex: 50',\n dateFrom: 'Data de',\n dateTo: 'Data até',\n sortBy: 'Ordenar por',\n sortByPlaceholder: 'Relevância',\n zone: 'Zona',\n zonePlaceholder: 'Qualquer zona',\n priority: 'Prioridade',\n priorityPlaceholder: 'Todas',\n order: 'Ordem',\n orderPlaceholder: 'Decrescente',\n includeDrafts: 'Incluir rascunhos',\n includeHistory: 'Incluir conteúdo histórico',\n },\n searchOptions: {\n typeNews: 'Notícia',\n typeList: 'Nota Lista',\n typeLiveblog: 'LiveBlog',\n statePublished: 'Publicada',\n stateDraft: 'Em redação',\n stateScheduled: 'Programada',\n stateReview: 'Em revisão',\n stateDone: 'Concluída',\n sortRelevance: 'Relevância',\n sortDate: 'Data',\n sortTitle: 'Título',\n orderDesc: 'Decrescente',\n orderAsc: 'Crescente',\n priorityHigh: 'Alta (1–10)',\n priorityMid: 'Média (11–30)',\n priorityLow: 'Baixa (31+)',\n },\n toast: {\n close: 'Fechar',\n copyDetail: 'Copiar detalhe do erro',\n copied: 'Copiado',\n defaultSuccess: 'Operação realizada com sucesso.',\n defaultError: 'Ocorreu um erro no serviço.',\n defaultWarning: 'Revise a solicitação.',\n defaultInfo: 'Informação',\n },\n network: {\n disconnected:\n 'Sem conexão. Verifique sua rede ou o status do Wi-Fi. Tentaremos novamente quando a conexão for restabelecida.',\n retrying: 'Tentando pedidos novamente.',\n restored: 'Conexão restabelecida.',\n },\n userAvatar: {\n alt: 'Avatar do usuário',\n unknownUser: 'Usuário sem nome',\n },\n errorPage: {\n homeButton: 'Início',\n notFoundTitle: 'Desculpe, ocorreu um erro.',\n notFoundSubtitle: 'Este site não está mais disponível. Continue navegando!',\n notFoundCode: '404',\n errorLabel: 'Erro',\n copyDetail: 'Copiar detalhe.',\n copyDetailText:\n 'A rota {url} que você está tentando acessar não está mais disponível.',\n copied: 'Texto copiado para a área de transferência!',\n notAllowedTitle: 'Sentimos muito.\\nVocê não tem acesso.',\n notAllowedSubtitle:\n 'O que você deseja ver é restrito por permissões. Continue navegando!',\n },\n} satisfies CmsMessages;\n","import type {\n AppLocaleCatalog,\n AppMessageNode,\n AppMessages,\n CmsMessages,\n CmsMessagesOverride,\n Locale,\n LocaleCatalog,\n} from '../types';\nimport { enMessages } from './en';\nimport { esMessages } from './es';\nimport { ptMessages } from './pt';\n\nexport { enMessages, esMessages, ptMessages };\n\nexport const defaultLocaleCatalog: LocaleCatalog = {\n en: enMessages,\n es: esMessages,\n pt: ptMessages,\n};\n\nfunction mergeNamespace<T extends Record<string, string>>(\n base: T,\n override?: Partial<T>,\n): T {\n if (!override) return base;\n return { ...base, ...override };\n}\n\n/** Deep-merge custom overrides on top of the locale catalog entry. */\nexport function mergeMessages(\n locale: Locale,\n catalog: LocaleCatalog,\n overrides?: CmsMessagesOverride,\n): CmsMessages {\n const base = catalog[locale];\n const fallback = catalog.en;\n\n return {\n navigation: mergeNamespace(\n { ...fallback.navigation, ...base.navigation },\n overrides?.navigation,\n ),\n sidebar: mergeNamespace(\n { ...fallback.sidebar, ...base.sidebar },\n overrides?.sidebar,\n ),\n topBar: mergeNamespace({ ...fallback.topBar, ...base.topBar }, overrides?.topBar),\n newMenu: mergeNamespace(\n { ...fallback.newMenu, ...base.newMenu },\n overrides?.newMenu,\n ),\n previewMenu: mergeNamespace(\n { ...fallback.previewMenu, ...base.previewMenu },\n overrides?.previewMenu,\n ),\n profileMenu: mergeNamespace(\n { ...fallback.profileMenu, ...base.profileMenu },\n overrides?.profileMenu,\n ),\n notificationsMenu: mergeNamespace(\n { ...fallback.notificationsMenu, ...base.notificationsMenu },\n overrides?.notificationsMenu,\n ),\n search: mergeNamespace(\n { ...fallback.search, ...base.search },\n overrides?.search,\n ),\n searchFields: mergeNamespace(\n { ...fallback.searchFields, ...base.searchFields },\n overrides?.searchFields,\n ),\n searchOptions: mergeNamespace(\n { ...fallback.searchOptions, ...base.searchOptions },\n overrides?.searchOptions,\n ),\n toast: mergeNamespace({ ...fallback.toast, ...base.toast }, overrides?.toast),\n network: mergeNamespace(\n { ...fallback.network, ...base.network },\n overrides?.network,\n ),\n userAvatar: mergeNamespace(\n { ...fallback.userAvatar, ...base.userAvatar },\n overrides?.userAvatar,\n ),\n errorPage: mergeNamespace(\n { ...fallback.errorPage, ...base.errorPage },\n overrides?.errorPage,\n ),\n };\n}\n\n/** Deep-merge recursivo de dos árboles de mensajes del gestor (override gana). */\nfunction deepMergeAppNode(base: AppMessageNode, override: AppMessageNode): AppMessageNode {\n // Si alguno es hoja (string), el override reemplaza directamente.\n if (typeof base === 'string' || typeof override === 'string') {\n return override;\n }\n const result: Record<string, AppMessageNode> = { ...base };\n for (const key of Object.keys(override)) {\n const overrideChild = override[key];\n result[key] =\n key in base ? deepMergeAppNode(base[key], overrideChild) : overrideChild;\n }\n return result;\n}\n\n/**\n * Resuelve el árbol de mensajes del gestor para el locale activo, usando `en`\n * como fallback (igual criterio que `mergeMessages`). Devuelve `{}` si no se\n * pasó catálogo del gestor.\n */\nexport function mergeAppMessages(\n locale: Locale,\n appCatalog?: AppLocaleCatalog,\n): AppMessages {\n if (!appCatalog) return {};\n const fallback = appCatalog.en ?? {};\n const base = appCatalog[locale] ?? {};\n return deepMergeAppNode(fallback, base) as AppMessages;\n}\n","import type { enMessages } from './messages/en';\n\nexport const SUPPORTED_LOCALES = ['es', 'en', 'pt'] as const;\n\nexport type Locale = (typeof SUPPORTED_LOCALES)[number];\n\nexport const DEFAULT_LOCALE: Locale = 'en';\n\ntype DeepStringMap<T> = {\n [K in keyof T]: T[K] extends Record<string, unknown>\n ? { [K2 in keyof T[K]]: string }\n : string;\n};\n\n/** Message tree shape; values are strings, keys are inferred from `enMessages`. */\nexport type CmsMessages = DeepStringMap<typeof enMessages>;\n\nexport type NavigationModule = keyof CmsMessages['navigation'];\n\nexport type SidebarMessageKey = keyof CmsMessages['sidebar'];\n\nexport type TopBarMessageKey = keyof CmsMessages['topBar'];\n\nexport type NewMenuMessageKey = keyof CmsMessages['newMenu'];\n\nexport type PreviewMenuMessageKey = keyof CmsMessages['previewMenu'];\n\nexport type ProfileMenuMessageKey = keyof CmsMessages['profileMenu'];\n\nexport type NotificationsMenuMessageKey = keyof CmsMessages['notificationsMenu'];\n\nexport type ToastMessageKey = keyof CmsMessages['toast'];\n\nexport type NetworkMessageKey = keyof CmsMessages['network'];\n\nexport type UserAvatarMessageKey = keyof CmsMessages['userAvatar'];\n\nexport type ErrorPageMessageKey = keyof CmsMessages['errorPage'];\n\n/** Partial override tree; missing keys fall back to the active locale, then `en`. */\nexport type CmsMessagesOverride = {\n [Namespace in keyof CmsMessages]?: Partial<CmsMessages[Namespace]>;\n};\n\nexport type LocaleCatalog = Record<Locale, CmsMessages>;\n\n/**\n * Nodo de un árbol de mensajes propio de un gestor: una hoja string o un\n * sub-árbol anidable. Permite namespaces arbitrarios (`usuarios.*`, etc.)\n * que la lib desconoce.\n */\nexport type AppMessageNode = string | { [key: string]: AppMessageNode };\n\n/** Árbol de mensajes del gestor (namespaces → claves → string anidable). */\nexport type AppMessages = Record<string, AppMessageNode>;\n\n/**\n * Catálogo de mensajes del gestor por idioma. Cada gestor declara su propio\n * `en` como fuente de la forma y valida `es`/`pt` con `satisfies typeof enTree`\n * para garantizar que las tres lenguas comparten las mismas claves.\n */\nexport type AppLocaleCatalog = Record<Locale, AppMessages>;\n","import { DEFAULT_LOCALE, SUPPORTED_LOCALES, type Locale } from './types';\n\n/** Normaliza códigos BCP 47 o variantes (`es-MX`, `pt_BR`) al `Locale` soportado. */\nexport function normalizeLocale(value?: string | null): Locale {\n if (!value) return DEFAULT_LOCALE;\n\n const normalized = value.trim().toLowerCase().replace('_', '-');\n const primary = normalized.split('-')[0];\n\n if ((SUPPORTED_LOCALES as readonly string[]).includes(normalized)) {\n return normalized as Locale;\n }\n\n if ((SUPPORTED_LOCALES as readonly string[]).includes(primary)) {\n return primary as Locale;\n }\n\n return DEFAULT_LOCALE;\n}\n","'use client';\n\nimport { createContext, useMemo, type ReactNode } from 'react';\n\nimport { createTranslator, type CmsTranslator } from './createTranslator';\nimport { defaultLocaleCatalog, mergeAppMessages, mergeMessages } from './messages';\nimport { normalizeLocale } from './normalizeLocale';\nimport type {\n AppLocaleCatalog,\n CmsMessagesOverride,\n Locale,\n LocaleCatalog,\n} from './types';\n\nexport type CmsI18nContextValue = {\n locale: Locale;\n t: CmsTranslator;\n};\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CmsI18nContext = createContext<CmsI18nContextValue | null>(null);\n\nexport type CmsI18nProviderProps = {\n locale?: Locale | string;\n /** Alias de `locale` (p. ej. consumidores que pasan `language=\"es\"`). */\n language?: Locale | string;\n messages?: CmsMessagesOverride;\n catalog?: LocaleCatalog;\n /** Catálogo de mensajes propio del gestor (namespaces libres, es/en/pt). */\n appMessages?: AppLocaleCatalog;\n children: ReactNode;\n};\n\nexport function CmsI18nProvider({\n locale,\n language,\n messages,\n catalog = defaultLocaleCatalog,\n appMessages,\n children,\n}: CmsI18nProviderProps) {\n const resolvedLocale = normalizeLocale(locale ?? language);\n\n const value = useMemo<CmsI18nContextValue>(() => {\n const resolvedMessages = mergeMessages(resolvedLocale, catalog, messages);\n const resolvedAppMessages = mergeAppMessages(resolvedLocale, appMessages);\n return {\n locale: resolvedLocale,\n t: createTranslator(resolvedMessages, resolvedAppMessages),\n };\n }, [appMessages, catalog, messages, resolvedLocale]);\n\n return <CmsI18nContext.Provider value={value}>{children}</CmsI18nContext.Provider>;\n}\n","'use client';\n\nimport { useContext, useMemo } from 'react';\n\nimport { CmsI18nContext } from './CmsI18nProvider';\nimport { createTranslator } from './createTranslator';\nimport { defaultLocaleCatalog, mergeAppMessages, mergeMessages } from './messages';\nimport type {\n AppLocaleCatalog,\n CmsMessagesOverride,\n Locale,\n LocaleCatalog,\n} from './types';\nimport { DEFAULT_LOCALE } from './types';\n\nexport type UseCmsTranslationOptions = {\n locale?: Locale;\n messages?: CmsMessagesOverride;\n catalog?: LocaleCatalog;\n /** Catálogo propio del gestor cuando se usa el hook fuera del provider. */\n appMessages?: AppLocaleCatalog;\n};\n\nexport function useCmsTranslation(options?: UseCmsTranslationOptions) {\n const context = useContext(CmsI18nContext);\n\n const locale = options?.locale ?? context?.locale ?? DEFAULT_LOCALE;\n const catalog = options?.catalog ?? defaultLocaleCatalog;\n const overrides = options?.messages;\n const appCatalog = options?.appMessages;\n\n const t = useMemo(() => {\n if (!overrides && !appCatalog && context && context.locale === locale) {\n return context.t;\n }\n return createTranslator(\n mergeMessages(locale, catalog, overrides),\n mergeAppMessages(locale, appCatalog),\n );\n }, [appCatalog, catalog, context, locale, overrides]);\n\n return { locale, t };\n}\n\n/** BCP 47 tag for `Intl` / `toLocaleString` formatting. */\nexport function getIntlLocaleTag(locale: Locale): string {\n switch (locale) {\n case 'pt':\n return 'pt-BR';\n case 'en':\n return 'en-US';\n case 'es':\n default:\n return 'es-MX';\n }\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport {\n feedbackBadgeColors,\n feedbackColors,\n fontFamilies,\n radii,\n} from '../../theme/variables';\nimport type { ToastSeverity } from './types';\n\nexport const CmsToastStyles = {\n /** Contenedor fijo que apila los toasts (abajo y centrado). */\n sxStack: {\n position: 'fixed',\n bottom: 16,\n left: 0,\n right: 0,\n px: 2,\n zIndex: (theme: Theme) => theme.zIndex.snackbar,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 1.25,\n pointerEvents: 'none',\n } as SxProps<Theme>,\n\n /** Toast compacto (success / warning / info). */\n sxToast: {\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: 1.25,\n minWidth: 300,\n maxWidth: 420,\n px: 2,\n py: 1.5,\n borderRadius: radii.lg,\n bgcolor: feedbackColors.surface,\n color: feedbackColors.onSurface,\n boxShadow: '0 8px 24px rgba(0, 0, 0, 0.35)',\n } as SxProps<Theme>,\n\n /** Toast de error: más grande, en columna, con detalle copiable. */\n sxToastError: {\n pointerEvents: 'auto',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n gap: 1,\n minWidth: 360,\n maxWidth: 560,\n width: '100%',\n p: 2.5,\n borderRadius: radii.lg,\n bgcolor: feedbackColors.surface,\n color: feedbackColors.onSurface,\n boxShadow: '0 8px 24px rgba(0, 0, 0, 0.35)',\n } as SxProps<Theme>,\n\n /** Fila superior del toast de error (ícono + título + cerrar). */\n sxErrorHeader: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 1.25,\n } as SxProps<Theme>,\n\n sxTextWrap: {\n flex: 1,\n minWidth: 0,\n } as SxProps<Theme>,\n\n sxTitle: {\n fontWeight: 600,\n fontSize: 14,\n lineHeight: 1.3,\n } as SxProps<Theme>,\n\n sxMessage: {\n fontSize: 14,\n lineHeight: 1.4,\n whiteSpace: 'pre-line',\n } as SxProps<Theme>,\n\n /** Título del toast de error. */\n sxErrorTitle: {\n fontFamily: fontFamilies.googleSans,\n fontWeight: 700,\n fontSize: 16,\n lineHeight: 1.3,\n // Separa del mensaje solo cuando hay título (no siempre existe).\n mb: '10px',\n } as SxProps<Theme>,\n\n /** Descripción del toast de error (sin fondo). */\n sxErrorMessage: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n color: feedbackColors.onSurfaceSoft,\n lineHeight: 1.4,\n whiteSpace: 'pre-line',\n // La descripción no lleva margen; el respiro sobre el título lo da su mb.\n margin: '0 !important',\n } as SxProps<Theme>,\n\n /** Detalle crudo del servidor (solo si el servicio devolvió texto de error). */\n sxDetail: {\n mt: '10px',\n p: 1,\n borderRadius: radii.sm,\n bgcolor: feedbackColors.overlay,\n color: feedbackColors.onSurfaceMuted,\n fontFamily: fontFamilies.googleSans,\n fontSize: 12.5,\n lineHeight: 1.4,\n wordBreak: 'break-word',\n } as SxProps<Theme>,\n\n /** Enlace (url del recurso) sobre la superficie oscura (monoespaciada). */\n sxLink: {\n display: 'block',\n mt: '10px',\n color: feedbackColors.link,\n fontFamily: fontFamilies.mono,\n fontSize: 11.5,\n lineHeight: 1.4,\n textDecoration: 'none',\n wordBreak: 'break-all',\n '&:hover': { textDecoration: 'underline' },\n } as SxProps<Theme>,\n\n /** Fila inferior: chip de versión + punto + fecha. */\n sxFooter: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n mt: '10px',\n color: feedbackColors.onSurfaceSoft,\n fontFamily: fontFamilies.googleSans,\n fontSize: 11,\n lineHeight: 1.4,\n } as SxProps<Theme>,\n\n /** Chip con la versión (ícono de etiqueta + vX.Y.Z). */\n sxVersionChip: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n px: 0.75,\n py: 0.25,\n borderRadius: radii.pill,\n bgcolor: feedbackColors.versionChipBg,\n color: feedbackColors.onSurfaceSoft,\n fontFamily: fontFamilies.googleSans,\n fontSize: 11,\n fontWeight: 600,\n '& svg': { fontSize: 13 },\n } as SxProps<Theme>,\n\n /** Punto separador entre versión y fecha. */\n sxDot: {\n flexShrink: 0,\n width: '3px',\n height: '3px',\n borderRadius: '50%',\n bgcolor: feedbackColors.separator,\n } as SxProps<Theme>,\n\n sxClose: {\n color: feedbackColors.onSurfaceMuted,\n p: 0.5,\n '&:hover': { color: feedbackColors.onSurface },\n } as SxProps<Theme>,\n\n sxCopyButton: {\n color: feedbackColors.onSurfaceMuted,\n p: 0.5,\n flexShrink: 0,\n '&:hover': { color: feedbackColors.onSurface },\n } as SxProps<Theme>,\n};\n\n/** Estilo del círculo de ícono (contenedor tonal + ícono por severidad). */\nexport function sxIconBadge(severity: ToastSeverity): SxProps<Theme> {\n const badge = feedbackBadgeColors[severity];\n return {\n flexShrink: 0,\n width: 28,\n height: 28,\n borderRadius: '50%',\n display: 'grid',\n placeItems: 'center',\n bgcolor: badge.bg,\n color: badge.on,\n '& svg': { fontSize: 18 },\n };\n}\n","'use client';\n\nimport { useState } from 'react';\n\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport CloseIcon from '@mui/icons-material/Close';\nimport ContentCopyOutlinedIcon from '@mui/icons-material/ContentCopyOutlined';\nimport DoneIcon from '@mui/icons-material/Done';\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutlineOutlined';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\nimport LocalOfferOutlinedIcon from '@mui/icons-material/LocalOfferOutlined';\nimport ReportProblemOutlinedIcon from '@mui/icons-material/ReportProblemOutlined';\n\nimport type { CmsTranslator } from '../../i18n/createTranslator';\nimport { CmsToastStyles, sxIconBadge } from './CmsToast.styles';\nimport type { ToastItem, ToastSeverity } from './types';\n\nconst ICONS: Record<ToastSeverity, typeof DoneIcon> = {\n success: DoneIcon,\n warning: ReportProblemOutlinedIcon,\n error: ErrorOutlineIcon,\n info: InfoOutlinedIcon,\n};\n\nexport interface CmsToastProps {\n item: ToastItem;\n t: CmsTranslator;\n /** Tag BCP 47 para formatear la fecha del detalle del error. */\n localeTag: string;\n /** Versión a mostrar en el detalle del error (app o lib). */\n appVersion: string;\n onClose: (id: string) => void;\n}\n\n/**\n * Construye el texto copiable del toast de error, con el mismo formato que el\n * Angular legacy (`Message / Error / Url / Service / Params / Version`).\n */\nfunction buildCopyText(\n message: string,\n item: ToastItem,\n url: string,\n version: string,\n dateTime: string,\n): string {\n const detail = item.detail;\n return [\n `Message: ${message}`,\n detail?.error ? `Error: ${detail.error}` : null,\n `Url: ${url}`,\n detail?.service ? `Service: ${detail.service}` : null,\n detail?.params !== undefined\n ? `Params: ${JSON.stringify(detail.params)}`\n : null,\n `Version: v${version} ${dateTime}`,\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\nexport function CmsToast({\n item,\n t,\n localeTag,\n appVersion,\n onClose,\n}: CmsToastProps) {\n const Icon = ICONS[item.severity];\n const [copied, setCopied] = useState(false);\n\n // Url y fecha se capturan una vez al montar el toast (no en cada render).\n const [meta] = useState(() => ({\n url: typeof window !== 'undefined' ? window.location.href : '',\n dateTime: new Date().toLocaleString(localeTag),\n }));\n\n const handleCopy = () => {\n const text = buildCopyText(\n item.message,\n item,\n meta.url,\n appVersion,\n meta.dateTime,\n );\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(text).then(\n () => {\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1500);\n },\n () => undefined,\n );\n }\n };\n\n const badge = (\n <Box sx={sxIconBadge(item.severity)} aria-hidden>\n <Icon />\n </Box>\n );\n\n const closeButton = (\n <IconButton\n data-testid=\"btn-toast-close\"\n size=\"small\"\n aria-label={t.toast('close')}\n onClick={() => onClose(item.id)}\n sx={CmsToastStyles.sxClose}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n );\n\n const copyButton = (\n <Tooltip title={copied ? t.toast('copied') : t.toast('copyDetail')}>\n <IconButton\n data-testid=\"btn-toast-copy\"\n size=\"small\"\n aria-label={t.toast('copyDetail')}\n onClick={handleCopy}\n sx={CmsToastStyles.sxCopyButton}>\n {copied ? (\n <DoneIcon fontSize=\"small\" />\n ) : (\n <ContentCopyOutlinedIcon fontSize=\"small\" />\n )}\n </IconButton>\n </Tooltip>\n );\n\n // Toast de error: más grande, con url del recurso, versión y botón copiar.\n if (item.severity === 'error') {\n return (\n <Box\n data-testid={`toast-${item.severity}`}\n data-severity={item.severity}\n sx={CmsToastStyles.sxToastError}\n role=\"alert\">\n <Box sx={CmsToastStyles.sxErrorHeader}>\n {badge}\n <Box sx={CmsToastStyles.sxTextWrap}>\n {item.title ? (\n <Box sx={CmsToastStyles.sxErrorTitle}>{item.title}</Box>\n ) : null}\n <Box sx={CmsToastStyles.sxErrorMessage}>{item.message}</Box>\n\n {item.detail?.error ? (\n <Box sx={CmsToastStyles.sxDetail}>{item.detail.error}</Box>\n ) : null}\n\n {meta.url ? (\n <Box component=\"a\" href={meta.url} sx={CmsToastStyles.sxLink}>\n {meta.url}\n </Box>\n ) : null}\n\n <Box sx={CmsToastStyles.sxFooter}>\n <Box component=\"span\" sx={CmsToastStyles.sxVersionChip}>\n <LocalOfferOutlinedIcon />v{appVersion}\n </Box>\n <Box sx={CmsToastStyles.sxDot} />\n <Box component=\"span\">{meta.dateTime}</Box>\n </Box>\n </Box>\n {copyButton}\n {closeButton}\n </Box>\n </Box>\n );\n }\n\n // Toast compacto (success / warning / info): click en cualquier parte cierra.\n return (\n <Box\n data-testid={`toast-${item.severity}`}\n data-severity={item.severity}\n sx={{ ...CmsToastStyles.sxToast, cursor: 'pointer' }}\n role=\"status\"\n onClick={() => onClose(item.id)}>\n {badge}\n <Box sx={CmsToastStyles.sxTextWrap}>\n {item.title ? <Box sx={CmsToastStyles.sxTitle}>{item.title}</Box> : null}\n <Box sx={CmsToastStyles.sxMessage}>{item.message}</Box>\n </Box>\n {closeButton}\n </Box>\n );\n}\n","'use client';\n\nimport {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\n\nimport Box from '@mui/material/Box';\n\nimport type { CmsTranslator } from '../../i18n/createTranslator';\nimport { normalizeLocale } from '../../i18n/normalizeLocale';\nimport type { Locale } from '../../i18n/types';\nimport { useCmsTranslation } from '../../i18n/useCmsTranslation';\nimport { LIB_VERSION } from '../../version';\nimport { CmsToast } from './CmsToast';\nimport { CmsToastStyles } from './CmsToast.styles';\nimport type { ToastItem } from './types';\n\nexport interface CmsToastContextValue {\n /** Encola un toast ya normalizado. Devuelve su id. */\n enqueue: (item: Omit<ToastItem, 'id'>) => string;\n /** Cierra un toast por id; sin id, cierra todos. */\n dismiss: (id?: string) => void;\n /** Translator resuelto al locale del provider (para resolver mensajes). */\n t: CmsTranslator;\n /** Locale activo del provider. */\n locale: Locale;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CmsToastContext = createContext<CmsToastContextValue | null>(null);\n\nexport interface CmsToastProviderProps {\n children: ReactNode;\n /** Locale del usuario (sale de `profile.locale` en el gestor). */\n locale?: Locale | string;\n /** Alias de `locale`. */\n language?: Locale | string;\n /** Versión a mostrar en el detalle del toast de error. Default: `LIB_VERSION`. */\n appVersion?: string;\n /** Máximo de toasts simultáneos (se descarta el más viejo). Default: 4. */\n max?: number;\n}\n\n/**\n * Provee el sistema de toasts a toda la app. Renderiza una pila fija (abajo a\n * la izquierda) y expone `useCmsToast()` para disparar feedback de operaciones.\n *\n * El mecanismo vive en la lib; el **disparo** lo hace el gestor (catch de un\n * server action / handler de mutación).\n */\nexport function CmsToastProvider({\n children,\n locale,\n language,\n appVersion,\n max = 4,\n}: CmsToastProviderProps) {\n const resolvedLocale = normalizeLocale(locale ?? language);\n const { locale: tLocale, t } = useCmsTranslation({ locale: resolvedLocale });\n const version = appVersion ?? LIB_VERSION;\n\n const [items, setItems] = useState<ToastItem[]>([]);\n const idRef = useRef(0);\n const timers = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n const dismiss = useCallback((id?: string) => {\n if (id === undefined) {\n timers.current.forEach((tm) => clearTimeout(tm));\n timers.current.clear();\n setItems([]);\n return;\n }\n const tm = timers.current.get(id);\n if (tm) {\n clearTimeout(tm);\n timers.current.delete(id);\n }\n setItems((prev) => prev.filter((it) => it.id !== id));\n }, []);\n\n const enqueue = useCallback(\n (item: Omit<ToastItem, 'id'>) => {\n idRef.current += 1;\n const id = `toast-${idRef.current}`;\n const next: ToastItem = { ...item, id };\n setItems((prev) => {\n const merged = [...prev, next];\n return merged.length > max ? merged.slice(merged.length - max) : merged;\n });\n if (next.duration !== null && next.duration > 0) {\n const tm = setTimeout(() => dismiss(id), next.duration);\n timers.current.set(id, tm);\n }\n return id;\n },\n [dismiss, max],\n );\n\n // Limpia timers pendientes al desmontar.\n useEffect(() => {\n const map = timers.current;\n return () => {\n map.forEach((tm) => clearTimeout(tm));\n map.clear();\n };\n }, []);\n\n const value = useMemo<CmsToastContextValue>(\n () => ({ enqueue, dismiss, t, locale: tLocale }),\n [enqueue, dismiss, t, tLocale],\n );\n\n const localeTag = useMemo(() => {\n switch (tLocale) {\n case 'pt':\n return 'pt-BR';\n case 'en':\n return 'en-US';\n default:\n return 'es-MX';\n }\n }, [tLocale]);\n\n return (\n <CmsToastContext.Provider value={value}>\n {children}\n <Box sx={CmsToastStyles.sxStack}>\n {items.map((item) => (\n <CmsToast\n key={item.id}\n item={item}\n t={t}\n localeTag={localeTag}\n appVersion={version}\n onClose={dismiss}\n />\n ))}\n </Box>\n </CmsToastContext.Provider>\n );\n}\n","'use client';\n\nimport { useContext, useMemo } from 'react';\n\nimport { getCommonError, resolveErrorSeverity } from '../../errors';\nimport { CmsToastContext } from './CmsToastProvider';\nimport type {\n CmsResponseLike,\n NotifyCmsResponseOptions,\n ToastErrorOptions,\n ToastOptions,\n ToastSeverity,\n} from './types';\n\n/** Duración por defecto (ms) según severidad. Error no se autocierra. */\nconst DEFAULT_DURATION: Record<ToastSeverity, number | null> = {\n success: 5000,\n info: 5000,\n warning: 5000,\n error: null,\n};\n\nexport interface CmsToastApi {\n /** Toast de éxito (verde). */\n success: (message: string, options?: ToastOptions) => string;\n /** Toast informativo (azul). */\n info: (message: string, options?: ToastOptions) => string;\n /** Toast de advertencia (ámbar) — condición esperada/accionable. */\n warning: (message: string, options?: ToastOptions) => string;\n /** Toast de error (rojo, grande, con detalle copiable). */\n error: (message: string, options?: ToastErrorOptions) => string;\n /** Atajo genérico. */\n show: (\n severity: ToastSeverity,\n message: string,\n options?: ToastErrorOptions,\n ) => string;\n /** Cierra un toast por id; sin id, cierra todos. */\n dismiss: (id?: string) => void;\n /**\n * Interpreta un envelope `CmsResponse` y dispara el toast adecuado:\n * - `status: 'ok'` → success.\n * - fallo → severidad por código (`resolveErrorSeverity`) y mensaje legible\n * (`getCommonError` → `error` crudo → default i18n).\n */\n notifyCmsResponse: (\n response: CmsResponseLike | null | undefined,\n options?: NotifyCmsResponseOptions,\n ) => string;\n}\n\n/**\n * Hook para disparar toasts. Debe usarse dentro de `CmsToastProvider`.\n */\nexport function useCmsToast(): CmsToastApi {\n const ctx = useContext(CmsToastContext);\n if (!ctx) {\n throw new Error('useCmsToast debe usarse dentro de <CmsToastProvider>.');\n }\n const { enqueue, dismiss, t, locale } = ctx;\n\n return useMemo<CmsToastApi>(() => {\n const show: CmsToastApi['show'] = (severity, message, options) =>\n enqueue({\n severity,\n message,\n title: options?.title,\n duration:\n options?.duration === undefined\n ? DEFAULT_DURATION[severity]\n : options.duration,\n detail:\n severity === 'error'\n ? {\n errorCode: options?.errorCode,\n error: options?.error,\n service: options?.service,\n params: options?.params,\n }\n : undefined,\n });\n\n const success: CmsToastApi['success'] = (message, options) =>\n show('success', message, options);\n const info: CmsToastApi['info'] = (message, options) =>\n show('info', message, options);\n const warning: CmsToastApi['warning'] = (message, options) =>\n show('warning', message, options);\n const error: CmsToastApi['error'] = (message, options) =>\n show('error', message, options);\n\n const notifyCmsResponse: CmsToastApi['notifyCmsResponse'] = (\n response,\n options,\n ) => {\n if (response?.status === 'ok') {\n return success(options?.successMessage ?? t.toast('defaultSuccess'), {\n title: options?.successTitle,\n });\n }\n const severity = resolveErrorSeverity(response?.errorCode);\n const mapped = getCommonError(response?.errorCode, locale);\n const message =\n mapped ??\n response?.error ??\n (severity === 'warning'\n ? t.toast('defaultWarning')\n : t.toast('defaultError'));\n if (severity === 'warning') {\n return warning(message);\n }\n return error(message, {\n errorCode: response?.errorCode,\n error: response?.error,\n service: options?.service,\n params: options?.params,\n });\n };\n\n return { success, info, warning, error, show, dismiss, notifyCmsResponse };\n }, [enqueue, dismiss, t, locale]);\n}\n","'use client';\n\nimport {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\n\nimport { cmsNetworkBridge } from './networkBridge';\n\n/** Estado de conectividad del navegador. */\nexport type CmsNetworkState = 'online' | 'offline';\n\nexport interface CmsNetworkContextValue {\n /** Estado actual de la conexión. */\n status: CmsNetworkState;\n /** Atajo: `status === 'online'`. */\n isOnline: boolean;\n /**\n * Promesa que resuelve cuando la conexión vuelve a `online`. Si ya está\n * online, resuelve al instante. La usa el reintento para \"retomar el llamado\"\n * cuando vuelve internet.\n */\n waitForOnline: () => Promise<void>;\n /**\n * Fuerza una verificación por ping (útil cuando una petición falló por red\n * pero `navigator.onLine` todavía dice `true`). Resuelve a `true` si confirma\n * conexión real, `false` si confirma que no hay internet.\n */\n verifyConnectivity: () => Promise<boolean>;\n /**\n * Marca la conexión como `offline` de inmediato (dispara el toast de \"sin\n * conexión\" sin esperar al ping). Lo usa el reintento cuando el navegador ya\n * reporta que no hay internet, para que el error se vea al perder la conexión\n * y no recién al recuperarla.\n */\n reportOffline: () => void;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CmsNetworkContext = createContext<CmsNetworkContextValue | null>(\n null,\n);\n\nexport interface CmsNetworkProviderProps {\n children: ReactNode;\n /**\n * URL de ping para confirmar conectividad real (además de los eventos del\n * navegador). Debe responder rápido a un `GET` sin CORS. `null` desactiva el\n * ping y deja solo los eventos `online`/`offline`. Default: endpoint 204 de\n * Google (mismo que usa el Angular legacy).\n */\n pingUrl?: string | null;\n /** Intervalo del polling de ping mientras siga offline (ms). Default 5000. */\n pingIntervalMs?: number;\n /**\n * Timeout del ping antes de darlo por fallido (ms). Sin él, un `fetch` a un\n * host externo sin internet puede colgarse hasta que la red vuelva, y el\n * offline se detectaría tarde. Default 5000.\n */\n pingTimeoutMs?: number;\n}\n\nconst DEFAULT_PING_URL = 'https://clients3.google.com/generate_204';\nconst DEFAULT_PING_INTERVAL = 5000;\nconst DEFAULT_PING_TIMEOUT = 5000;\n\n/** Estado inicial SSR-safe: en el servidor asume `online`. */\nfunction initialState(): CmsNetworkState {\n if (typeof navigator === 'undefined') return 'online';\n return navigator.onLine ? 'online' : 'offline';\n}\n\n/**\n * Provee el estado de conectividad a toda la app y una promesa `waitForOnline`\n * para reanudar peticiones al recuperar internet.\n *\n * Replica el `NetworkService` del Angular legacy: combina `navigator.onLine`,\n * los eventos `window` `online`/`offline` y un **ping activo con polling** que\n * confirma la reconexión real (los eventos del navegador a veces mienten).\n *\n * El mecanismo vive en la lib; el **disparo** de toasts lo hace\n * `CmsNetworkToaster` (globales) y `useResilientAction` (por petición).\n */\nexport function CmsNetworkProvider({\n children,\n pingUrl = DEFAULT_PING_URL,\n pingIntervalMs = DEFAULT_PING_INTERVAL,\n pingTimeoutMs = DEFAULT_PING_TIMEOUT,\n}: CmsNetworkProviderProps) {\n const [status, setStatus] = useState<CmsNetworkState>(initialState);\n\n // Espejo síncrono del estado: `waitForOnline` y el ping necesitan el valor\n // fresco sin esperar al re-render de React.\n const statusRef = useRef<CmsNetworkState>(status);\n\n // Resolvers de las promesas `waitForOnline` pendientes.\n const onlineResolvers = useRef<Array<() => void>>([]);\n\n const flushOnline = useCallback(() => {\n const resolvers = onlineResolvers.current;\n onlineResolvers.current = [];\n resolvers.forEach((resolve) => resolve());\n }, []);\n\n // Punto único de cambio de estado: mantiene el ref sincronizado y, al volver\n // a `online`, resuelve las esperas pendientes (reanuda las peticiones).\n const updateStatus = useCallback(\n (next: CmsNetworkState) => {\n statusRef.current = next;\n setStatus(next);\n if (next === 'online') flushOnline();\n },\n [flushOnline],\n );\n\n const waitForOnline = useCallback(() => {\n // Se basa en el estado CONFIRMADO (ping/eventos), no en `navigator.onLine`:\n // el caso a cubrir es justamente \"el navegador dice online sin internet real\".\n if (statusRef.current === 'online') {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n onlineResolvers.current.push(resolve);\n });\n }, []);\n\n const verifyConnectivity = useCallback(async (): Promise<boolean> => {\n // Sin ping configurado (o sin `fetch`): cae al reporte del navegador.\n if (!pingUrl || typeof fetch === 'undefined') {\n const online = typeof navigator === 'undefined' || navigator.onLine;\n updateStatus(online ? 'online' : 'offline');\n return online;\n }\n // `ngsw-bypass` evita el service worker; el timestamp evita la caché.\n const sep = pingUrl.includes('?') ? '&' : '?';\n const url = `${pingUrl}${sep}ngsw-bypass=true&_t=${Date.now()}`;\n // Timeout: sin internet, un `fetch` a un host externo puede colgarse hasta\n // que la red vuelva; el corte evita detectar el offline recién al reconectar.\n const controller =\n typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = controller\n ? setTimeout(() => controller.abort(), pingTimeoutMs)\n : null;\n try {\n await fetch(url, {\n mode: 'no-cors',\n cache: 'no-store',\n signal: controller?.signal,\n });\n updateStatus('online');\n return true;\n } catch {\n updateStatus('offline');\n return false;\n } finally {\n if (timer) clearTimeout(timer);\n }\n }, [pingUrl, pingTimeoutMs, updateStatus]);\n\n // Marca offline de inmediato (dispara el toast sin esperar el ping).\n const reportOffline = useCallback(() => {\n updateStatus('offline');\n }, [updateStatus]);\n\n // Expone las funciones al interceptor de axios (que no puede usar hooks), para\n // que una petición fallida por red dispare el toast/ping y se reanude al\n // volver la conexión. Réplica del `NetworkService` inyectado en el Angular.\n useEffect(() => {\n cmsNetworkBridge.register({ reportOffline, waitForOnline, verifyConnectivity });\n return () => cmsNetworkBridge.unregister();\n }, [reportOffline, waitForOnline, verifyConnectivity]);\n\n // Eventos del navegador. Ante `offline`, confirma con un ping.\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const goOnline = () => updateStatus('online');\n const goOffline = () => {\n updateStatus('offline');\n void verifyConnectivity();\n };\n window.addEventListener('online', goOnline);\n window.addEventListener('offline', goOffline);\n return () => {\n window.removeEventListener('online', goOnline);\n window.removeEventListener('offline', goOffline);\n };\n }, [updateStatus, verifyConnectivity]);\n\n // Polling de ping mientras siga offline: confirma la reconexión real aunque\n // el evento `online` no llegue (redes que no lo emiten de forma fiable).\n useEffect(() => {\n if (status !== 'offline' || !pingUrl) return;\n const id = setInterval(() => {\n void verifyConnectivity();\n }, pingIntervalMs);\n return () => clearInterval(id);\n }, [status, pingUrl, pingIntervalMs, verifyConnectivity]);\n\n const value = useMemo<CmsNetworkContextValue>(\n () => ({\n status,\n isOnline: status === 'online',\n waitForOnline,\n verifyConnectivity,\n reportOffline,\n }),\n [status, waitForOnline, verifyConnectivity, reportOffline],\n );\n\n return (\n <CmsNetworkContext.Provider value={value}>\n {children}\n </CmsNetworkContext.Provider>\n );\n}\n","'use client';\n\nimport { useContext } from 'react';\n\nimport {\n CmsNetworkContext,\n type CmsNetworkContextValue,\n} from './CmsNetworkProvider';\n\n/**\n * Lee el estado de conectividad. Debe usarse dentro de `<CmsNetworkProvider>`.\n */\nexport function useCmsNetworkStatus(): CmsNetworkContextValue {\n const ctx = useContext(CmsNetworkContext);\n if (!ctx) {\n throw new Error(\n 'useCmsNetworkStatus debe usarse dentro de <CmsNetworkProvider>.',\n );\n }\n return ctx;\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\nimport { useCmsToast } from '../components/toast/useCmsToast';\nimport { useCmsTranslation } from '../i18n/useCmsTranslation';\nimport { useCmsNetworkStatus } from './useCmsNetworkStatus';\n\n/**\n * Componente sin UI que observa el estado de conexión y dispara los toasts\n * globales, replicando el Angular legacy:\n *\n * - Al perder internet → toast de error \"sin conexión\" (no se autocierra).\n * - Al recuperarla → cierra el anterior y muestra \"conexión restablecida\".\n *\n * Se monta una sola vez, dentro de `CmsNetworkProvider` + `CmsToastProvider`.\n * El reintento y \"reanudar el llamado\" por acción los maneja\n * `useResilientAction`.\n */\nexport function CmsNetworkToaster() {\n const { status } = useCmsNetworkStatus();\n const { t } = useCmsTranslation();\n const toast = useCmsToast();\n\n const prevStatus = useRef(status);\n const disconnectToastId = useRef<string | null>(null);\n\n useEffect(() => {\n const prev = prevStatus.current;\n prevStatus.current = status;\n if (status === prev) return;\n\n if (status === 'offline') {\n // Evita duplicar el toast si ya hay uno visible.\n if (disconnectToastId.current === null) {\n disconnectToastId.current = toast.error(t.network('disconnected'), {\n errorCode: 'net.offline',\n });\n }\n return;\n }\n\n // Volvió la conexión: cierra el de \"sin conexión\" y confirma.\n if (disconnectToastId.current !== null) {\n toast.dismiss(disconnectToastId.current);\n disconnectToastId.current = null;\n toast.success(t.network('restored'));\n }\n }, [status, t, toast]);\n\n return null;\n}\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { useCmsToast } from '../components/toast/useCmsToast';\nimport { useCmsTranslation } from '../i18n/useCmsTranslation';\nimport {\n NETWORK_ERROR_CODES,\n classifyNetworkError,\n getNetworkErrorCodeFromResult,\n} from './classifyNetworkError';\nimport { useCmsNetworkStatus } from './useCmsNetworkStatus';\n\nexport interface ResilientRunOptions {\n /** Servicio/endpoint (para el detalle del toast, si el resultado es error). */\n service?: string;\n /** Params de la llamada (para el detalle del toast). */\n params?: Record<string, unknown>;\n /** Máximo de reintentos con backoff (fallos de servidor/timeout). Default 3. */\n maxRetries?: number;\n /** Mostrar el toast \"reintentando\" al reanudar tras una desconexión. Default true. */\n notifyRetry?: boolean;\n}\n\nexport type ResilientRunner = <T>(\n fn: () => Promise<T>,\n options?: ResilientRunOptions,\n) => Promise<T>;\n\nconst MAX_BACKOFF_MS = 8000;\n\nconst delay = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\n/** Backoff exponencial topado: 1s, 2s, 4s, 8s (igual que el Angular legacy). */\nconst backoff = (attempt: number) => Math.min(1000 * 2 ** (attempt - 1), MAX_BACKOFF_MS);\n\n/** `true` si el navegador reporta que no hay conexión (siempre valor fresco). */\nconst isOfflineNow = () =>\n typeof navigator !== 'undefined' ? !navigator.onLine : false;\n\n/**\n * Envuelve la invocación de un server action para hacerla **resiliente a la\n * red**, replicando el comportamiento del Angular legacy:\n *\n * - **Sin internet (usuario offline):** no se pierde la acción. Se espera —sin\n * consumir reintentos— a que vuelva la conexión y entonces se **retoma el\n * llamado** automáticamente (muestra \"reintentando…\").\n * - **Backend caído / timeout / 5xx (con internet):** reintenta con backoff\n * exponencial (1s, 2s, 4s, 8s) hasta `maxRetries`; luego devuelve el\n * resultado de error para que el caller muestre el toast.\n * - **Error de negocio (4xx / `status:'fail'`):** no reintenta; devuelve el\n * resultado tal cual para que el caller decida (toast/update optimista).\n *\n * El toast global de \"sin conexión\" / \"conexión restablecida\" lo dispara\n * `CmsNetworkToaster`; este hook solo añade el \"reintentando…\" por acción.\n *\n * Uso en el gestor:\n * ```ts\n * const run = useResilientAction();\n * const res = await run(() => setUserStatus(slug, id, action),\n * { service: '/users/actions/setStatus', params: { id, action } });\n * ```\n */\nexport function useResilientAction(): ResilientRunner {\n const network = useCmsNetworkStatus();\n const toast = useCmsToast();\n const { t } = useCmsTranslation();\n\n return useCallback(\n async <T>(fn: () => Promise<T>, options?: ResilientRunOptions): Promise<T> => {\n const maxRetries = options?.maxRetries ?? 3;\n const notifyRetry = options?.notifyRetry ?? true;\n let attempt = 0;\n let announcedRetry = false;\n\n /**\n * Confirma con el ping si de verdad hay internet —aunque `navigator.onLine`\n * mienta, igual que el interceptor del Angular ante un `status 0`—.\n * Devuelve `true` si hay conexión; si no, espera la reconexión (sin gastar\n * el presupuesto de reintentos) y avisa \"reintentando…\" una sola vez.\n */\n const announceRetry = () => {\n if (notifyRetry && !announcedRetry) {\n announcedRetry = true;\n toast.info(t.network('retrying'));\n }\n };\n\n const ensureOnlineOrWait = async (): Promise<boolean> => {\n // El navegador ya sabe que no hay internet: muestra el error de\n // inmediato (no espera el ping; el ping solo detecta la reconexión).\n if (isOfflineNow()) {\n network.reportOffline();\n await network.waitForOnline();\n announceRetry();\n return false;\n }\n // El navegador dice que hay conexión: puede mentir. Lo confirma el ping.\n const online = await network.verifyConnectivity();\n if (online) return true;\n await network.waitForOnline();\n announceRetry();\n return false;\n };\n\n // Si arranca sin conexión, confirma con el ping y espera antes de intentar.\n if (isOfflineNow()) {\n await ensureOnlineOrWait();\n }\n\n while (true) {\n try {\n const result = await fn();\n\n // El server action pudo devolver un error de red (Next→OpenCms).\n const netCode = getNetworkErrorCodeFromResult(result);\n if (netCode) {\n const online = await ensureOnlineOrWait();\n if (!online) continue; // faltaba internet → ya esperó, retoma\n if (attempt < maxRetries) {\n // hay internet → era el backend → backoff acotado\n attempt += 1;\n await delay(backoff(attempt));\n continue;\n }\n }\n return result;\n } catch (error) {\n const classified = classifyNetworkError(error);\n\n // ¿Huele a falta de conexión o backend inalcanzable? Lo confirma el\n // ping, aunque `navigator.onLine` diga que sí (WiFi sin salida real,\n // Next→OpenCms caído). Un 5xx \"puro\" no pinguea: hay respuesta, hay\n // internet.\n const maybeConnectivity =\n isOfflineNow() ||\n classified?.errorCode === NETWORK_ERROR_CODES.offline ||\n classified?.errorCode === NETWORK_ERROR_CODES.timeout ||\n classified?.errorCode === NETWORK_ERROR_CODES.unavailable;\n\n if (maybeConnectivity) {\n const online = await ensureOnlineOrWait();\n if (!online) continue; // sin internet → esperó reconexión, retoma\n // hay internet → error transitorio del servidor → cae al backoff\n }\n\n // Con internet: red/timeout/5xx transitorio → backoff acotado.\n if (classified?.retryable && attempt < maxRetries) {\n attempt += 1;\n await delay(backoff(attempt));\n continue;\n }\n\n // Error de negocio o presupuesto agotado: lo maneja el caller.\n throw error;\n }\n }\n },\n [network, toast, t],\n );\n}\n","import type {\n AnchorHTMLAttributes,\n ElementType,\n ForwardedRef,\n ReactNode,\n RefAttributes,\n} from 'react';\nimport { forwardRef } from 'react';\n\nexport type CmsLinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n href: string;\n children?: ReactNode;\n};\n\nexport type CmsLinkComponent = ElementType<\n CmsLinkProps & RefAttributes<HTMLAnchorElement>\n>;\n\nexport const DefaultCmsLink = forwardRef(function DefaultCmsLink(\n { href, children, ...rest }: CmsLinkProps,\n ref: ForwardedRef<HTMLAnchorElement>,\n) {\n return (\n <a href={href} ref={ref} {...rest}>\n {children}\n </a>\n );\n});\n","/**\n * Redirección al admin viejo del CMS (JSP) replicando el `openExternalPage()` de\n * cmsmedios-ux: en vez de un enlace, se arma y envía un formulario POST oculto\n * al endpoint `auth/adminBack/login`, que re-establece la sesión en la pestaña\n * nueva y luego redirige a la ruta pedida (campo `r`).\n *\n * Es código de navegador (usa `document`): debe llamarse desde un handler de\n * cliente, no en SSR.\n */\n\n/** Datos de sesión que el form POST envía al admin viejo. */\nexport type LegacyAdminSession = {\n /** Token de autenticación (se envía en base64, igual que el Angular legacy). */\n token: string;\n browserId: string;\n siteName: string;\n publication: string | number;\n userName: string;\n /** Proyecto del CMS. Por defecto `'Offline'`. */\n project?: string;\n};\n\n/** Parámetros de dispositivo para la previsualización (protocolo/queryString). */\nexport type LegacyAdminDevice = {\n /** `'https'` (por defecto) o `'http'`. */\n protocol?: string;\n /** QueryString específico del formato de preview (viene del backend). */\n queryString?: string;\n};\n\nconst ADMIN_BACK_LOGIN_PATH =\n '/system/modules/com.tfsla.diario.webservices/auth/adminBack/login';\n\n/** Devuelve el host de una URL/origen, forzando https (como el Angular legacy). */\nfunction toHttpsOrigin(cmsBaseUrl: string): string {\n const host = cmsBaseUrl.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n return `https://${host}`;\n}\n\n/** Crea un `<input type=\"hidden\">` con nombre y valor. */\nfunction hiddenInput(name: string, value: string): HTMLInputElement {\n const input = document.createElement('input');\n input.setAttribute('type', 'hidden');\n input.setAttribute('id', name);\n input.setAttribute('name', name);\n input.setAttribute('value', value);\n return input;\n}\n\n/**\n * Arma y envía el formulario POST que abre una ruta del admin viejo en una\n * pestaña nueva, pasando la sesión del usuario (igual que cmsmedios).\n *\n * @param params.cmsBaseUrl - Origen del CMS (p. ej. `https://dev.cms-medios.com`).\n * @param params.path - Ruta destino dentro del CMS (campo `r`).\n * @param params.session - Datos de sesión a enviar (token, sitio, etc.).\n * @param params.device - Opcional: protocolo/queryString del preview.\n * @returns void\n */\nexport function submitLegacyAdminPage(params: {\n cmsBaseUrl: string;\n path: string;\n session: LegacyAdminSession;\n device?: LegacyAdminDevice;\n}): void {\n const { cmsBaseUrl, path, session, device } = params;\n const loginService = `${toHttpsOrigin(cmsBaseUrl)}${ADMIN_BACK_LOGIN_PATH}`;\n\n // Igual que el legacy: si hay queryString, se concatena a la ruta destino.\n let targetUrl = path;\n const queryString = device?.queryString ?? '';\n if (queryString.length) {\n targetUrl = queryString.includes('/')\n ? `${queryString}?path=${targetUrl}` // redirect\n : `${targetUrl}?${queryString}`; // Apache\n }\n\n const form = document.createElement('form');\n form.setAttribute('method', 'post');\n form.setAttribute('action', loginService);\n form.setAttribute('target', '_blank');\n\n form.appendChild(hiddenInput('token', btoa(session.token)));\n form.appendChild(hiddenInput('project', session.project ?? 'Offline'));\n form.appendChild(hiddenInput('browserId', session.browserId));\n form.appendChild(hiddenInput('siteName', session.siteName));\n form.appendChild(hiddenInput('publication', String(session.publication)));\n form.appendChild(hiddenInput('r', targetUrl));\n form.appendChild(hiddenInput('user', session.userName));\n\n document.body.appendChild(form);\n form.submit();\n document.body.removeChild(form);\n}\n","import type { CmsTranslator } from '../../i18n';\nimport type { NavItemPermissions, NavLinkItem } from '../../types/navigation';\n\nexport function resolveNavLabel(item: NavLinkItem, t: CmsTranslator): string {\n return item.label ?? t.navigation(item.module);\n}\n\nexport function isPathActive(pathname: string, href: string): boolean {\n if (pathname === href) return true;\n if (href !== '/' && pathname.startsWith(`${href}/`)) return true;\n return false;\n}\n\nexport function isItemActive(pathname: string, item: NavLinkItem): boolean {\n if (isPathActive(pathname, item.href)) return true;\n return item.children?.some((child) => isPathActive(pathname, child.href)) ?? false;\n}\n\n/**\n * Prefija `item.href` con `legacyBaseUrl` cuando el ítem apunta al admin legacy.\n * Si el ítem lo pide (`appendPublicationId`) y hay publicación activa, agrega el\n * id de publicación al final (rutas del Angular master `/admin/x/:idPub`).\n */\nexport function resolveNavHref(\n item: NavLinkItem,\n legacyBaseUrl?: string,\n selectedPublicationId?: string,\n): string {\n if (!item.legacy || !legacyBaseUrl) return item.href;\n const base = `${legacyBaseUrl.replace(/\\/$/, '')}${item.href}`;\n if (item.appendPublicationId && selectedPublicationId) {\n return `${base.replace(/\\/$/, '')}/${selectedPublicationId}`;\n }\n return base;\n}\n\n/**\n * Cómo debe navegar un ítem del sidebar:\n * - `jsp`: página del admin viejo (OpenCMS). Se abre con el form POST autenticado\n * (`submitLegacyAdminPage`) a `cmsBaseUrl`; `path` es la ruta destino (`r`).\n * - `link`: enlace normal. `external: true` para los `/admin/*` del Angular master\n * (abren en pestaña nueva); `external: false` para rutas internas del propio gestor.\n */\nexport type NavItemNavigation =\n | { kind: 'jsp'; path: string }\n | { kind: 'link'; href: string; external: boolean };\n\n/**\n * Resuelve el modo de navegación de un ítem según sus flags (`jsp`/`legacy`).\n * `jsp` tiene prioridad: siempre va por form POST al CMS viejo. `legacy` (sin\n * `jsp`) es un enlace externo al Angular master. El resto es navegación interna.\n * @param item - Ítem de navegación.\n * @param opts - Bases resueltas por el host y publicación activa.\n * @returns Descriptor de navegación para que el componente arme el nodo real.\n */\nexport function resolveNavNavigation(\n item: NavLinkItem,\n opts: {\n legacyBaseUrl?: string;\n cmsBaseUrl?: string;\n selectedPublicationId?: string;\n },\n): NavItemNavigation {\n if (item.jsp) {\n return { kind: 'jsp', path: item.href };\n }\n if (item.legacy) {\n return {\n kind: 'link',\n href: resolveNavHref(item, opts.legacyBaseUrl, opts.selectedPublicationId),\n external: true,\n };\n }\n return { kind: 'link', href: item.href, external: false };\n}\n\nexport function findModulePermission(\n permissions: Array<NavItemPermissions>,\n module: string,\n): NavItemPermissions | undefined {\n return permissions.find((permission) => permission.module === module);\n}\n\nexport function getVisibleChildren(\n item: NavLinkItem,\n permissions: Array<NavItemPermissions>,\n): NavLinkItem[] {\n return item.children?.filter((child) => findModulePermission(permissions, child.module)) ?? [];\n}\n","'use client';\nimport BarChartOutlinedIcon from '@mui/icons-material/BarChartOutlined';\nimport BookmarkBorderOutlinedIcon from '@mui/icons-material/BookmarkBorderOutlined';\nimport ChatBubbleOutlineOutlinedIcon from '@mui/icons-material/ChatBubbleOutlineOutlined';\nimport CreateOutlinedIcon from '@mui/icons-material/CreateOutlined';\nimport EventOutlinedIcon from '@mui/icons-material/EventOutlined';\nimport ExploreOutlinedIcon from '@mui/icons-material/ExploreOutlined';\nimport ImageOutlinedIcon from '@mui/icons-material/ImageOutlined';\nimport ImportExportOutlinedIcon from '@mui/icons-material/ImportExportOutlined';\n//import LabelOutlinedIcon from '@mui/icons-material/LabelOutlined';\nimport MailOutlineOutlinedIcon from '@mui/icons-material/MailOutlineOutlined';\nimport MoreHorizOutlinedIcon from '@mui/icons-material/MoreHorizOutlined';\nimport NotificationsNoneOutlinedIcon from '@mui/icons-material/NotificationsNoneOutlined';\nimport PeopleOutlinedIcon from '@mui/icons-material/PeopleOutlined';\n//import PermMediaOutlinedIcon from '@mui/icons-material/PermMediaOutlined';\nimport PlayCircleOutlineOutlinedIcon from '@mui/icons-material/PlayCircleOutlineOutlined';\nimport RestaurantOutlinedIcon from '@mui/icons-material/RestaurantOutlined';\nimport SearchOutlinedIcon from '@mui/icons-material/SearchOutlined';\nimport ShoppingCartOutlinedIcon from '@mui/icons-material/ShoppingCartOutlined';\nimport ManageAccountsOutlinedIcon from '@mui/icons-material/ManageAccountsOutlined';\nimport FormatAlignCenterOutlinedIcon from '@mui/icons-material/FormatAlignCenterOutlined';\nimport TimelineOutlinedIcon from '@mui/icons-material/TimelineOutlined';\n//import MessageOutlinedIcon from '@mui/icons-material/MessageOutlined';\nimport MicNoneOutlinedIcon from '@mui/icons-material/MicNoneOutlined';\nimport PlaylistPlayOutlinedIcon from '@mui/icons-material/PlaylistPlayOutlined';\nimport PendingActionsOutlinedIcon from '@mui/icons-material/PendingActionsOutlined';\nimport ForumOutlinedIcon from '@mui/icons-material/ForumOutlined';\nimport UsbOutlinedIcon from '@mui/icons-material/UsbOutlined';\nimport FormatListBulletedOutlinedIcon from '@mui/icons-material/FormatListBulletedOutlined';\nimport GridViewOutlinedIcon from '@mui/icons-material/GridViewOutlined';\nimport ViewQuiltOutlinedIcon from '@mui/icons-material/ViewQuiltOutlined';\nimport SubscriptionsOutlinedIcon from '@mui/icons-material/SubscriptionsOutlined';\nimport QuizOutlinedIcon from '@mui/icons-material/QuizOutlined';\nimport SellOutlinedIcon from '@mui/icons-material/SellOutlined';\nimport MenuOutlinedIcon from '@mui/icons-material/MenuOutlined';\nimport type { NavBlock } from '../../types/navigation';\n\n/**\n * Navegación lateral por defecto.\n * `module` debe coincidir exactamente con `module` en POST /auth/modulesAvailable\n * y con las claves en `messages.navigation`.\n *\n * Convención de destino por ítem:\n * - `jsp: true` → admin viejo (OpenCMS). Abre con form POST autenticado a\n * `cmsBaseUrl` (dev.cms-medios.com), en pestaña nueva. Tiene prioridad.\n * - `legacy: true` (sin `jsp`) → Angular master (`legacyBaseUrl`). Enlace en\n * pestaña nueva.\n * - sin flags → ruta interna del propio gestor React (misma pestaña).\n */\nexport const ACCOUNT_NAV_BLOCKS: NavBlock[] = [\n {\n href: '/admin/comments/',\n icon: ForumOutlinedIcon,\n module: 'COMMENTS',\n legacy: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/poll.jsp',\n icon: BarChartOutlinedIcon,\n module: 'POLLS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/media',\n icon: ImageOutlinedIcon,\n module: 'MEDIA',\n children: [\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/audios.jsp',\n icon: MicNoneOutlinedIcon,\n module: 'AUDIOS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/admin/images',\n icon: ImageOutlinedIcon,\n module: 'IMAGES',\n legacy: true,\n },\n {\n href: '/media/playlist',\n icon: PlaylistPlayOutlinedIcon,\n module: 'PLAYLISTS',\n },\n {\n href: '/admin/videos/',\n icon: PlayCircleOutlineOutlinedIcon,\n module: 'VIDEOS',\n legacy: true,\n },\n ],\n },\n {\n href: '/admin/posts/',\n icon: FormatAlignCenterOutlinedIcon,\n module: 'POSTS',\n legacy: true,\n },\n {\n href: '/admin/reports/',\n icon: TimelineOutlinedIcon,\n module: 'PRODUCTION',\n legacy: true,\n },\n\n {\n href: '/admin/planning',\n icon: PendingActionsOutlinedIcon,\n module: 'PLANNING',\n legacy: true,\n appendPublicationId: true,\n },\n /* {\n href: '/analiticas',\n icon: BarChartOutlinedIcon,\n module: 'ANALYTICS',\n }, */\n {\n href: '/admin/tags',\n icon: SellOutlinedIcon,\n module: 'TAGS',\n legacy: true,\n appendPublicationId: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/trivias.jsp',\n icon: QuizOutlinedIcon,\n module: 'TRIVIAS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/otros',\n icon: MoreHorizOutlinedIcon,\n module: 'OTHERS',\n children: [\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/newswires.jsp',\n icon: UsbOutlinedIcon,\n module: 'NEWSWIRES',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/event.jsp',\n icon: EventOutlinedIcon,\n module: 'EVENTS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/adminPages.jsp',\n icon: ExploreOutlinedIcon,\n module: 'PAGES',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/dashboard.jsp',\n icon: FormatListBulletedOutlinedIcon,\n module: 'FEEDS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/adminPeople.jsp',\n icon: PeopleOutlinedIcon,\n module: 'PERSONS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/adminPosts.jsp',\n icon: CreateOutlinedIcon,\n module: 'POSTS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/recipe.jsp',\n icon: RestaurantOutlinedIcon,\n module: 'RECIPES',\n legacy: true,\n jsp: true,\n },\n ],\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/banners.jsp',\n icon: ViewQuiltOutlinedIcon,\n module: 'BANNERS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/dynamicContent.jsp',\n icon: GridViewOutlinedIcon,\n module: 'BLOCKS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/menuSite.jsp',\n icon: MenuOutlinedIcon,\n module: 'MENUS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/navigationTags.jsp',\n icon: BookmarkBorderOutlinedIcon,\n module: 'TOPICS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/filterQueryList.jsp',\n icon: SearchOutlinedIcon,\n module: 'ADVANCEDQUERYS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/adminImports.jsp',\n icon: ImportExportOutlinedIcon,\n module: 'IMPORTS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/newsletter.jsp',\n icon: MailOutlineOutlinedIcon,\n module: 'NEWSLETTERS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/adminQueues.jsp',\n icon: NotificationsNoneOutlinedIcon,\n module: 'NOTIFICATIONS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/payments.jsp',\n icon: ShoppingCartOutlinedIcon,\n module: 'PAYMENTS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/subscriptions.jsp',\n icon: SubscriptionsOutlinedIcon,\n module: 'PAYMENTS',\n legacy: true,\n jsp: true,\n },\n /* {\n href: '/reportes',\n icon: BarChartOutlinedIcon,\n module: 'REPORTS',\n },\n {\n href: '/secciones',\n icon: ViewListOutlinedIcon,\n module: 'SECTIONS',\n }, */\n {\n href: '/system/modules/com.tfsla.diario.admin/templates/twitterFeeds.jsp',\n icon: ChatBubbleOutlineOutlinedIcon,\n module: 'TWITTERS',\n legacy: true,\n jsp: true,\n },\n {\n href: '/users',\n icon: ManageAccountsOutlinedIcon,\n module: 'USERS',\n },\n /* {\n href: '/zonas',\n icon: LayersOutlinedIcon,\n module: 'ZONES',\n },\n { href: '/ia', icon: ExploreOutlinedIcon, module: 'IA' }, */\n];\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport {\n cmsColors,\n fontFamilies,\n radii,\n shadows,\n stateColors,\n} from '../../theme/variables';\n\nexport const SIDEBAR_RAIL_WIDTH = 88;\n\nconst ITEM_WIDTH = 56;\nconst ITEM_HEIGHT = 32;\nconst ICON_SIZE = 20;\n\nconst scrollbarHidden = {\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n} as const;\n\nfunction activeColors(accent?: 'ai') {\n if (accent === 'ai')\n return { bg: stateColors.generating.bg, on: stateColors.generating.on };\n return { bg: cmsColors.secondary, on: cmsColors.onSecondaryContainer };\n}\n\nexport const SidebarRailStyles = {\n sxRoot: {\n width: SIDEBAR_RAIL_WIDTH,\n maxWidth: SIDEBAR_RAIL_WIDTH,\n minWidth: SIDEBAR_RAIL_WIDTH,\n flexShrink: 0,\n alignSelf: 'stretch',\n minHeight: 0,\n maxHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n bgcolor: 'm3.surfaceContainer',\n boxSizing: 'border-box',\n } as SxProps<Theme>,\n\n sxNavScroll: {\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n overflowX: 'hidden',\n width: '100%',\n boxSizing: 'border-box',\n ...scrollbarHidden,\n } as SxProps<Theme>,\n\n sxNav: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 1,\n px: 0.5,\n py: 2,\n width: '100%',\n boxSizing: 'border-box',\n } as SxProps<Theme>,\n\n sxItemWrap: {\n position: 'relative',\n width: '100%',\n '&:hover .rail-pin-btn, &:focus-within .rail-pin-btn': {\n opacity: 1,\n transform: 'none',\n },\n } as SxProps<Theme>,\n\n sxItemButton: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 0,\n width: '100%',\n py: 0.5,\n border: 0,\n background: 'transparent',\n cursor: 'pointer',\n textDecoration: 'none',\n font: 'inherit',\n } as SxProps<Theme>,\n\n sxPinButton: (pinned: boolean): SxProps<Theme> => ({\n position: 'absolute',\n top: -2,\n right: 8,\n width: 22,\n height: 22,\n minWidth: 22,\n p: 0,\n borderRadius: '50%',\n bgcolor: 'm3.surfaceContainerHigh',\n color: pinned ? cmsColors.primary : 'm3.onSurfaceVariant',\n boxShadow: shadows.button,\n opacity: pinned ? 1 : 0,\n transform: pinned ? 'none' : 'scale(0.6)',\n transition:\n 'opacity 0.12s, transform 0.12s, background-color 0.12s, color 0.12s',\n zIndex: 2,\n '&:hover': {\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n },\n '& .MuiSvgIcon-root': {\n fontSize: 15,\n },\n }),\n\n sxPinDivider: {\n width: 32,\n height: '1px',\n bgcolor: cmsColors.border,\n my: 0.5,\n } as SxProps<Theme>,\n\n sxItemIconBox: (selected: boolean, accent?: 'ai'): SxProps<Theme> => {\n const active = activeColors(accent);\n return {\n position: 'relative',\n width: ITEM_WIDTH,\n height: ITEM_HEIGHT,\n borderRadius: '16px',\n display: 'grid',\n placeItems: 'center',\n transition: 'background-color 0.15s ease, color 0.15s ease',\n bgcolor: selected ? active.bg : 'transparent',\n color: selected ? active.on : 'm3.onSurfaceVariant',\n '&:hover': {\n bgcolor: selected ? active.bg : cmsColors.surfaceHover,\n color: selected ? active.on : cmsColors.textStrong,\n },\n };\n },\n\n sxItemIcon: {\n fontSize: ICON_SIZE,\n } as SxProps<Theme>,\n\n sxItemLabel: (selected: boolean, accent?: 'ai'): SxProps<Theme> => ({\n fontSize: 12,\n fontWeight: 500,\n lineHeight: 1,\n textAlign: 'center',\n mt: '4px',\n color: selected ? activeColors(accent).on : cmsColors.textNav,\n }),\n\n sxChildrenChevron: {\n position: 'absolute',\n left: -8,\n top: '50%',\n transform: 'translateY(-50%)',\n fontSize: 14,\n color: cmsColors.textMuted,\n } as SxProps<Theme>,\n\n sxAccentDot: {\n position: 'absolute',\n top: -1,\n right: 6,\n width: 8,\n height: 8,\n borderRadius: '50%',\n bgcolor: stateColors.generating.on,\n boxShadow: `0 0 0 2px ${cmsColors.surface}`,\n } as SxProps<Theme>,\n\n sxChildrenMenuPaper: {\n mt: 0.5,\n borderRadius: radii.flyout,\n // Borde sutil (`outlineVariant`, #C4C6CF en claro) para que el flyout no se\n // pierda contra el fondo del shell, que comparte el mismo gris.\n border: '1px solid',\n borderColor: 'divider',\n bgcolor: cmsColors.menuSurface,\n boxShadow: shadows.flyout,\n // Sin padding lateral: el resaltado/hover de los ítems llega de borde a\n // borde. El radio se recorta con overflow para que el full-bleed no\n // desborde las esquinas redondeadas.\n px: 0,\n overflow: 'hidden',\n minWidth: 200,\n } as SxProps<Theme>,\n\n /**\n * Título del ítem padre (p. ej. \"MEDIA\") arriba del flyout: mayúsculas,\n * peso medio (500, no bold), 11px, color `m3.onSurfaceVariant` (#43474E en\n * claro), no interactivo.\n */\n sxChildrenMenuTitle: {\n px: 2,\n pt: 0.5,\n pb: 0.5,\n fontFamily: fontFamilies.googleSans,\n fontSize: 11,\n fontWeight: 500,\n lineHeight: 1.4,\n letterSpacing: '0.08em',\n textTransform: 'uppercase',\n color: 'm3.onSurfaceVariant',\n listStyle: 'none',\n userSelect: 'none',\n } as SxProps<Theme>,\n\n sxChildrenMenuItem: (selected: boolean): SxProps<Theme> => ({\n minHeight: 44,\n // Full-bleed: sin radio, el hover cubre todo el ancho del flyout.\n borderRadius: 0,\n px: 2,\n py: 1,\n gap: 1.25,\n color: cmsColors.textNav,\n bgcolor: selected ? cmsColors.secondary : 'transparent',\n '& .MuiListItemText-primary': {\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 400,\n },\n '&:hover': {\n bgcolor: selected ? cmsColors.secondary : cmsColors.surfaceHover,\n },\n }),\n\n sxChildrenMenuListItemIcon: {\n minWidth: 34,\n color: 'm3.onSurfaceVariant',\n '& .MuiSvgIcon-root': {\n fontSize: 22,\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport PushPinOutlinedIcon from '@mui/icons-material/PushPinOutlined';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport { useCmsTranslation } from '../../i18n';\nimport type { CmsProfileServices } from '../../services/profile';\nimport type { NavItemPermissions, NavLinkItem } from '../../types/navigation';\nimport { toTestId } from '../../utils/toTestId';\nimport {\n submitLegacyAdminPage,\n type LegacyAdminSession,\n} from '../../utils/legacy-admin';\nimport { DefaultCmsLink, type CmsLinkComponent } from '../link';\nimport {\n findModulePermission,\n getVisibleChildren,\n isItemActive,\n isPathActive,\n resolveNavLabel,\n resolveNavNavigation,\n} from './nav-helpers';\nimport { ACCOUNT_NAV_BLOCKS } from './nav-blocks';\nimport { SidebarRailStyles } from './SidebarRail.styles';\n\n/**\n * Cómo navega un ítem del sidebar (discriminado para ramificar el JSX):\n * - `jsp-post`: `.jsp` con sesión → dispara el form POST autenticado al CMS viejo.\n * - `link`: enlace normal; `external: true` abre en pestaña nueva (Angular master\n * o `.jsp` sin sesión), `false` es navegación interna del gestor (misma pestaña).\n */\ntype NavAction =\n | { mode: 'jsp-post'; onClick: () => void }\n | { mode: 'link'; href: string; external: boolean };\n\n/**\n * Decide cómo navega un ítem del sidebar según sus flags y la sesión disponible.\n * @param params - Ítem, bases resueltas por el host, sesión y publicación activa.\n * @returns Acción de navegación (form POST o enlace) para el nodo real.\n */\nfunction resolveNavAction(params: {\n item: NavLinkItem;\n legacyBaseUrl?: string;\n cmsBaseUrl?: string;\n legacySession?: LegacyAdminSession;\n selectedPublicationId?: string;\n}): NavAction {\n const { item, legacyBaseUrl, cmsBaseUrl, legacySession, selectedPublicationId } =\n params;\n const nav = resolveNavNavigation(item, {\n legacyBaseUrl,\n cmsBaseUrl,\n selectedPublicationId,\n });\n\n if (nav.kind === 'jsp') {\n if (cmsBaseUrl && legacySession) {\n return {\n mode: 'jsp-post',\n onClick: () =>\n submitLegacyAdminPage({ cmsBaseUrl, path: nav.path, session: legacySession }),\n };\n }\n // Fallback sin sesión: enlace directo al CMS viejo (probablemente pida login),\n // igual en pestaña nueva. Mejor que dejar el ítem sin destino.\n const base = (cmsBaseUrl ?? '').replace(/\\/$/, '');\n return { mode: 'link', href: `${base}${nav.path}`, external: true };\n }\n\n return { mode: 'link', href: nav.href, external: nav.external };\n}\n\n/** Servicio de pines usado por el rail: solo necesita estos tres métodos. */\nexport type SidebarRailPinService = Pick<\n CmsProfileServices,\n 'addPins' | 'deletePins' | 'getPins'\n>;\n\n/**\n * `getPins()` devuelve `pines: unknown[]` sin tipar en el backend. Se acepta\n * tanto el string plano (mismo valor enviado a `addPins`) como un objeto que\n * lo traiga en `pin`/`module`, para no romper si el envelope cambia de forma.\n */\nfunction extractPinnedModule(entry: unknown): string | undefined {\n if (typeof entry === 'string') return entry;\n if (entry && typeof entry === 'object') {\n const { pin, module } = entry as { pin?: unknown; module?: unknown };\n if (typeof pin === 'string') return pin;\n if (typeof module === 'string') return module;\n }\n return undefined;\n}\n\nfunction RailItem({\n item,\n blockIndex,\n pathname,\n permissions,\n LinkComponent,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n selectedPublicationId,\n pinned,\n onTogglePin,\n}: {\n item: NavLinkItem;\n blockIndex: number;\n pathname: string;\n permissions: Array<NavItemPermissions>;\n LinkComponent: CmsLinkComponent;\n legacyBaseUrl?: string;\n cmsBaseUrl?: string;\n legacySession?: LegacyAdminSession;\n selectedPublicationId?: string;\n pinned: boolean;\n onTogglePin: () => void;\n}) {\n // Mismo escopo que el Sidebar: `module` no es único (POSTS/PAYMENTS repetidos\n // en nav-blocks.ts) y no hay id de bloque estable, así que se usa el índice del\n // bloque para no duplicar testids cuando ambos ítems se ven a la vez.\n const blockScope = `block-${blockIndex}`;\n const { t } = useCmsTranslation();\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n const menuOpen = Boolean(anchor);\n const itemRef = useRef<HTMLDivElement | null>(null);\n\n const permission = findModulePermission(permissions, item.module);\n const visibleChildren = getVisibleChildren(item, permissions);\n const hasChildren = visibleChildren.length > 0;\n const selected = hasChildren ? isItemActive(pathname, item) : isPathActive(pathname, item.href);\n\n // Trae el ítem activo al área visible del rail al cargar o cambiar de ruta,\n // para que siempre se vea en qué sección estás aunque quede fuera del scroll.\n // `block: 'nearest'` solo desplaza el contenedor del rail lo mínimo (no la\n // ventana, que está con overflow oculto en el shell).\n useEffect(() => {\n if (selected) itemRef.current?.scrollIntoView({ block: 'nearest' });\n }, [selected]);\n\n if (!permission && !hasChildren) return null;\n\n const label = resolveNavLabel(item, t);\n const Icon = item.icon;\n // Siempre outline (regla §3): el estado \"pinned\" se distingue por el color\n // azul y la opacidad plena del botón (sxPinButton), no por rellenar el pin.\n const PinIcon = PushPinOutlinedIcon;\n\n const content = (\n <>\n <Box sx={SidebarRailStyles.sxItemIconBox(selected, item.accent)}>\n <Icon sx={SidebarRailStyles.sxItemIcon} />\n {hasChildren && <ChevronRightIcon sx={SidebarRailStyles.sxChildrenChevron} />}\n {item.accent === 'ai' && !selected && <Box sx={SidebarRailStyles.sxAccentDot} />}\n </Box>\n <Box component=\"span\" sx={SidebarRailStyles.sxItemLabel(selected, item.accent)}>\n {label}\n </Box>\n </>\n );\n\n const pinButton = (\n <IconButton\n className=\"rail-pin-btn\"\n size=\"small\"\n data-testid={`toggle-pin-${blockScope}-${toTestId(item.module)}`}\n data-action={pinned ? 'unpin' : 'pin'}\n aria-label={pinned ? t.sidebar('unpin') : t.sidebar('pin')}\n title={pinned ? t.sidebar('unpin') : t.sidebar('pin')}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onTogglePin();\n }}\n sx={SidebarRailStyles.sxPinButton(pinned)}>\n <PinIcon />\n </IconButton>\n );\n\n if (hasChildren) {\n return (\n <Box ref={itemRef} sx={SidebarRailStyles.sxItemWrap}>\n <Box\n component=\"button\"\n type=\"button\"\n data-testid={`dropdown-toggle-nav-${blockScope}-${toTestId(item.module)}`}\n aria-label={label}\n aria-haspopup=\"true\"\n aria-expanded={menuOpen ? 'true' : undefined}\n onClick={(e) => setAnchor(e.currentTarget)}\n sx={SidebarRailStyles.sxItemButton}>\n {content}\n </Box>\n {pinButton}\n <Menu\n anchorEl={anchor}\n open={menuOpen}\n onClose={() => setAnchor(null)}\n anchorOrigin={{ vertical: 'center', horizontal: 'right' }}\n transformOrigin={{ vertical: 'center', horizontal: 'left' }}\n slotProps={{\n paper: { sx: SidebarRailStyles.sxChildrenMenuPaper },\n list: { sx: { py: 1 } },\n }}>\n <Box\n component=\"li\"\n aria-hidden=\"true\"\n data-testid={`sidebar-flyout-title-${blockScope}-${toTestId(item.module)}`}\n sx={SidebarRailStyles.sxChildrenMenuTitle}>\n {label}\n </Box>\n {visibleChildren.map((child) => {\n const ChildIcon = child.icon;\n const childAction = resolveNavAction({\n item: child,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n selectedPublicationId,\n });\n const childSx = SidebarRailStyles.sxChildrenMenuItem(\n isPathActive(pathname, child.href),\n );\n const childInner = (\n <>\n <ListItemIcon sx={SidebarRailStyles.sxChildrenMenuListItemIcon}>\n <ChildIcon />\n </ListItemIcon>\n <ListItemText primary={resolveNavLabel(child, t)} />\n </>\n );\n const childTestId = `dropdown-item-nav-${toTestId(child.module)}`;\n // `.jsp` con sesión: botón que dispara el form POST autenticado.\n if (childAction.mode === 'jsp-post') {\n return (\n <MenuItem\n key={child.href}\n data-testid={childTestId}\n component=\"button\"\n type=\"button\"\n onClick={() => {\n setAnchor(null);\n childAction.onClick();\n }}\n sx={childSx}>\n {childInner}\n </MenuItem>\n );\n }\n // Enlace (master en pestaña nueva, o interno en la misma).\n return (\n <MenuItem\n key={child.href}\n data-testid={childTestId}\n component={LinkComponent}\n href={childAction.href}\n target={childAction.external ? '_blank' : undefined}\n rel={childAction.external ? 'noopener noreferrer' : undefined}\n onClick={() => setAnchor(null)}\n sx={childSx}>\n {childInner}\n </MenuItem>\n );\n })}\n </Menu>\n </Box>\n );\n }\n\n const action = resolveNavAction({\n item,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n selectedPublicationId,\n });\n const testId = `nav-${blockScope}-${toTestId(item.module)}`;\n\n return (\n <Box ref={itemRef} sx={SidebarRailStyles.sxItemWrap}>\n {action.mode === 'jsp-post' ? (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={action.onClick}\n data-testid={testId}\n sx={SidebarRailStyles.sxItemButton}>\n {content}\n </Box>\n ) : (\n <Box\n component={LinkComponent}\n href={action.href}\n target={action.external ? '_blank' : undefined}\n rel={action.external ? 'noopener noreferrer' : undefined}\n data-testid={testId}\n sx={SidebarRailStyles.sxItemButton}>\n {content}\n </Box>\n )}\n {pinButton}\n </Box>\n );\n}\n\nexport type SidebarRailProps = {\n pathname: string;\n LinkComponent?: CmsLinkComponent;\n permissions: Array<NavItemPermissions>;\n /** Dominio del Angular master para prefijar hrefs `legacy` (no `jsp`). */\n legacyBaseUrl?: string;\n /** Origen del CMS viejo (JSP) para el form POST de los ítems `jsp`. */\n cmsBaseUrl?: string;\n /** Sesión para el form POST al admin viejo (token, sitio, publicación, usuario). */\n legacySession?: LegacyAdminSession;\n /** Id de publicación activa; se agrega a los ítems legacy con `appendPublicationId`. */\n selectedPublicationId?: string;\n /** Ítems de navegación. Por defecto, `ACCOUNT_NAV_BLOCKS`. */\n items?: NavLinkItem[];\n /**\n * Servicio de pines (`CmsProfileServices`, construido por el host con su\n * `axiosApi`/`authentication`). Si se omite, el anclado es solo visual y no\n * persiste entre sesiones.\n */\n profileServices?: SidebarRailPinService;\n};\n\n/**\n * Variante compacta del sidebar: rail vertical de íconos con etiqueta debajo,\n * sin modo expandido. Los ítems con hijos abren un menú flotante a la derecha.\n * Al pasar el mouse sobre un ítem aparece un botón para anclarlo arriba del\n * todo. El anclado se identifica por `item.module` y persiste vía\n * `profileServices.addPins`/`deletePins`/`getPins` (recurso de perfil).\n */\nexport function SidebarRail({\n pathname,\n permissions,\n LinkComponent = DefaultCmsLink,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n selectedPublicationId,\n items = ACCOUNT_NAV_BLOCKS,\n profileServices,\n}: SidebarRailProps) {\n const { t } = useCmsTranslation();\n const [pinnedModules, setPinnedModules] = useState<string[]>([]);\n\n useEffect(() => {\n if (!profileServices) return;\n let cancelled = false;\n profileServices\n .getPins()\n .then((response) => {\n if (cancelled) return;\n const modules = (response.pines ?? [])\n .map(extractPinnedModule)\n .filter((module): module is string => Boolean(module));\n setPinnedModules(modules);\n })\n .catch((error: unknown) => {\n console.error('[SidebarRail] getPins', error);\n });\n return () => {\n cancelled = true;\n };\n }, [profileServices]);\n\n const togglePin = (module: string) => {\n const wasPinned = pinnedModules.includes(module);\n const next = wasPinned\n ? pinnedModules.filter((m) => m !== module)\n : [...pinnedModules, module];\n setPinnedModules(next);\n\n if (!profileServices) return;\n const request = wasPinned\n ? profileServices.deletePins([module])\n : profileServices.addPins([module]);\n request.catch((error: unknown) => {\n console.error('[SidebarRail] togglePin', error);\n setPinnedModules(pinnedModules);\n });\n };\n\n const pinnedSet = new Set(pinnedModules);\n const pinnedItems = pinnedModules\n .map((module) => items.find((item) => item.module === module))\n .filter((item): item is NavLinkItem => Boolean(item));\n const unpinnedItems = items.filter((item) => !pinnedSet.has(item.module));\n\n return (\n <Box component=\"aside\" sx={SidebarRailStyles.sxRoot}>\n <Box sx={SidebarRailStyles.sxNavScroll}>\n <Box component=\"nav\" aria-label={t.sidebar('navAriaLabel')} sx={SidebarRailStyles.sxNav}>\n {pinnedItems.map((item) => (\n <RailItem\n key={item.href}\n item={item}\n blockIndex={items.indexOf(item)}\n pathname={pathname}\n permissions={permissions}\n LinkComponent={LinkComponent}\n legacyBaseUrl={legacyBaseUrl}\n cmsBaseUrl={cmsBaseUrl}\n legacySession={legacySession}\n selectedPublicationId={selectedPublicationId}\n pinned\n onTogglePin={() => togglePin(item.module)}\n />\n ))}\n {pinnedItems.length > 0 && <Box sx={SidebarRailStyles.sxPinDivider} />}\n {unpinnedItems.map((item) => (\n <RailItem\n key={item.href}\n item={item}\n blockIndex={items.indexOf(item)}\n pathname={pathname}\n permissions={permissions}\n LinkComponent={LinkComponent}\n legacyBaseUrl={legacyBaseUrl}\n cmsBaseUrl={cmsBaseUrl}\n legacySession={legacySession}\n selectedPublicationId={selectedPublicationId}\n pinned={false}\n onTogglePin={() => togglePin(item.module)}\n />\n ))}\n </Box>\n </Box>\n </Box>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport { cmsColors, radii, shadows } from '../../theme/variables';\n\nexport const SiteSelectorMenuStyles = {\n // Nameplate del header: píldora con logo + divisor + país + flecha.\n sxTriggerButton: (open: boolean): SxProps<Theme> => ({\n height: 38,\n borderRadius: radii.pill,\n border: 'none',\n color: cmsColors.textStrong,\n bgcolor: open ? cmsColors.secondaryHover : cmsColors.menuItemActive,\n textTransform: 'none',\n px: 1.5,\n py: 0,\n gap: 0,\n flexShrink: 0,\n '&:hover': {\n border: 'none',\n bgcolor: open ? cmsColors.secondaryHover : cmsColors.surfaceHover,\n },\n }),\n\n // Logo de la publicación seleccionada en el trigger (máx 70px de ancho).\n sxTriggerLogo: {\n display: 'block',\n maxWidth: 70,\n maxHeight: 20,\n width: 'auto',\n height: 'auto',\n objectFit: 'contain',\n } as SxProps<Theme>,\n\n sxTriggerDivider: {\n width: '1px',\n height: 18,\n flexShrink: 0,\n bgcolor: cmsColors.border,\n mx: 1.25,\n } as SxProps<Theme>,\n\n sxTriggerCountry: {\n fontSize: 14,\n fontWeight: 500,\n lineHeight: 1,\n color: cmsColors.textStrong,\n whiteSpace: 'nowrap',\n } as SxProps<Theme>,\n\n sxTriggerIcon: {\n fontSize: 20,\n ml: 0.5,\n } as SxProps<Theme>,\n\n // Panel flotante: superficie elevada, redondeado y con scroll (look del nuevo diseño).\n sxMenuPaper: {\n mt: 1,\n marginTop: 0,\n bgcolor: cmsColors.menuSurface,\n border: `1px solid ${cmsColors.border}`,\n borderRadius: '20px',\n boxShadow: shadows.menuSoft,\n width: 420,\n maxWidth: '92vw',\n maxHeight: 560,\n overflow: 'hidden',\n p: 1,\n } as SxProps<Theme>,\n\n sxMenuList: {\n p: 0,\n maxHeight: 540,\n overflowY: 'auto',\n } as SxProps<Theme>,\n\n // Cada marca/sitio es una sección; separador superior salvo la primera.\n sxSection: (isFirst: boolean): SxProps<Theme> => ({\n pt: isFirst ? 0 : 0.75,\n mt: isFirst ? 0 : 0.5,\n borderTop: isFirst ? 'none' : `1px solid ${cmsColors.border}`,\n }),\n\n sxSectionTitle: {\n px: 1.5,\n pt: 1,\n pb: 0.5,\n fontSize: 12,\n fontWeight: 500,\n letterSpacing: '0.07em',\n textTransform: 'uppercase',\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n // Fila de opción (publicación). `isSub` la indenta como sub-sitio.\n sxOption: (selected: boolean, isSub: boolean): SxProps<Theme> => ({\n display: 'flex',\n alignItems: 'center',\n // 8px entre el punto/check/flecha y el nombre (NAA-4847: −2px respecto de los 10px previos).\n gap: 1,\n width: '100%',\n height: 48,\n minHeight: 48,\n boxSizing: 'border-box',\n pl: isSub ? 1.5 : 1.5,\n pr: 1.5,\n py: 0.5,\n borderRadius: '14px',\n bgcolor: selected ? cmsColors.secondary : 'transparent',\n // Hover: state layer M3 `onSurface` al 8% (#191C20), común a los desplegables.\n '&:hover': {\n bgcolor: selected ? cmsColors.secondary : cmsColors.neutralHover,\n },\n '&.Mui-selected': {\n bgcolor: cmsColors.secondary,\n '&:hover': { bgcolor: cmsColors.secondary },\n },\n }),\n\n // Zona inicial de la fila (punto / check / flecha). Más ancha en sub-filas\n // para alinear con la línea-guía vertical.\n sxLead: (isSub: boolean): SxProps<Theme> => ({\n width: isSub ? 42 : 28,\n flexShrink: 0,\n display: 'grid',\n placeItems: 'center',\n }),\n\n sxLeadDot: {\n width: 5,\n height: 5,\n borderRadius: radii.pill,\n bgcolor: cmsColors.border,\n } as SxProps<Theme>,\n\n sxLeadCheck: {\n fontSize: 20,\n color: cmsColors.onSecondaryContainer,\n } as SxProps<Theme>,\n\n // Flecha que despliega los sub-sitios; rota 90° al abrir.\n sxTwist: (open: boolean): SxProps<Theme> => ({\n width: 28,\n height: 28,\n minWidth: 0,\n p: 0,\n borderRadius: radii.pill,\n display: 'grid',\n placeItems: 'center',\n color: 'm3.onSurfaceVariant',\n transition: 'transform .15s, background-color .12s',\n transform: open ? 'rotate(90deg)' : 'none',\n '&:hover': { bgcolor: 'action.hover' },\n }),\n\n sxName: (selected: boolean, isSub: boolean): SxProps<Theme> => ({\n flex: 1,\n minWidth: 0,\n fontSize: 14,\n fontWeight: 500,\n lineHeight: 1.4,\n color: selected\n ? cmsColors.onSecondaryContainer\n : isSub\n ? 'm3.onSurfaceVariant'\n : cmsColors.textStrong,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n\n // Contador de sub-sitios (solo cuando la publicación trae hijos).\n sxCount: (selected: boolean): SxProps<Theme> => ({\n flexShrink: 0,\n fontSize: 11,\n fontWeight: 600,\n lineHeight: 1,\n px: 0.875,\n py: '3px',\n borderRadius: radii.pill,\n bgcolor: selected ? cmsColors.surface : cmsColors.menuItemActive,\n color: selected ? cmsColors.onSecondaryContainer : cmsColors.textNav,\n }),\n\n sxLogoWrap: {\n ml: 'auto',\n pl: 1.25,\n display: 'flex',\n alignItems: 'center',\n flexShrink: 0,\n } as SxProps<Theme>,\n\n sxLogoImg: {\n display: 'block',\n maxWidth: 70,\n maxHeight: 24,\n width: 'auto',\n height: 'auto',\n objectFit: 'contain',\n } as SxProps<Theme>,\n\n // Contenedor de sub-sitios con línea-guía vertical a la izquierda.\n sxKids: {\n position: 'relative',\n my: 0.25,\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: 25,\n top: 2,\n bottom: 8,\n width: '1.5px',\n bgcolor: cmsColors.border,\n borderRadius: '2px',\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Typography from '@mui/material/Typography';\nimport { useState } from 'react';\n\nimport type { Publication } from '../../types/publication';\nimport type { SiteSection } from '../../types/site';\nimport { findPublicationLabel } from '../../utils/site-selector';\nimport { toTestId } from '../../utils/toTestId';\nimport { SiteSelectorMenuStyles } from './SiteSelectorMenu.styles';\n\n/** ¿La publicación trae sub-sitios (multisitio)? */\nfunction hasChildren(publication: Publication): boolean {\n return Boolean(publication.children && publication.children.length > 0);\n}\n\n/**\n * Fila de una publicación. Si tiene hijos, muestra la flecha para desplegarlos\n * y un contador; si no, un punto (o el check cuando está seleccionada).\n */\nfunction SiteMenuItem({\n publication,\n selected,\n isSub,\n href,\n imageUrl,\n expanded,\n onToggle,\n}: {\n publication: Publication;\n selected: boolean;\n isSub: boolean;\n href: string;\n imageUrl?: string;\n expanded?: boolean;\n onToggle?: () => void;\n}) {\n const parent = hasChildren(publication);\n\n return (\n <a href={href} style={{ textDecoration: 'none', color: 'inherit' }}>\n <MenuItem\n selected={selected}\n data-testid={`link-site-${toTestId(publication.id)}`}\n sx={SiteSelectorMenuStyles.sxOption(selected, isSub)}>\n <Box sx={SiteSelectorMenuStyles.sxLead(isSub)}>\n {parent ? (\n <Box\n component=\"span\"\n role=\"button\"\n data-testid={`toggle-site-children-${toTestId(publication.id)}`}\n data-action={expanded ? 'collapse' : 'expand'}\n aria-label=\"expand\"\n onClick={(event) => {\n // Desplegar/plegar sin navegar a la publicación.\n event.preventDefault();\n event.stopPropagation();\n onToggle?.();\n }}\n sx={SiteSelectorMenuStyles.sxTwist(Boolean(expanded))}>\n <KeyboardArrowRightIcon sx={{ fontSize: 20 }} />\n </Box>\n ) : selected ? (\n <CheckIcon sx={SiteSelectorMenuStyles.sxLeadCheck} />\n ) : (\n <Box component=\"span\" sx={SiteSelectorMenuStyles.sxLeadDot} />\n )}\n </Box>\n\n <Typography sx={SiteSelectorMenuStyles.sxName(selected, isSub)}>\n {publication.description}\n </Typography>\n\n {parent ? (\n <Box component=\"span\" sx={SiteSelectorMenuStyles.sxCount(selected)}>\n {publication.children!.length}\n </Box>\n ) : null}\n\n {imageUrl ? (\n <Box sx={SiteSelectorMenuStyles.sxLogoWrap}>\n <Box\n component=\"img\"\n src={imageUrl}\n alt={publication.description}\n sx={SiteSelectorMenuStyles.sxLogoImg}\n />\n </Box>\n ) : null}\n </MenuItem>\n </a>\n );\n}\n\nexport type SiteSelectorMenuProps = {\n sites: SiteSection[];\n selectedPublicationId?: string;\n getPublicationHref: (publication: Publication) => string;\n resolvePublicationImageUrl?: (imagePath: string) => string;\n};\n\nexport function SiteSelectorMenu({\n sites,\n selectedPublicationId,\n getPublicationHref,\n resolvePublicationImageUrl,\n}: SiteSelectorMenuProps) {\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const open = Boolean(anchorEl);\n\n // Sub-sitios desplegados. Arranca con los padres del seleccionado abiertos.\n const [expandedIds, setExpandedIds] = useState<Set<number>>(() => {\n const initial = new Set<number>();\n sites.forEach((section) =>\n section.publications.forEach((publication) => {\n if (\n hasChildren(publication) &&\n publication.children!.some(\n (child) => String(child.id) === selectedPublicationId,\n )\n ) {\n initial.add(publication.id);\n }\n }),\n );\n return initial;\n });\n\n const handleOpen = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const toggleExpanded = (id: number) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const isSelected = (publication: Publication) =>\n Number(selectedPublicationId) === publication.id;\n\n const resolveImage = (publication: Publication) =>\n publication.imagePath && resolvePublicationImageUrl\n ? resolvePublicationImageUrl(publication.imagePath)\n : undefined;\n\n const labelId = selectedPublicationId ?? '';\n\n // Publicación seleccionada (incluye sub-sitios) para el nameplate del header.\n const selectedPublication = sites\n .flatMap((section) =>\n section.publications.flatMap((publication) => [\n publication,\n ...(publication.children ?? []),\n ]),\n )\n .find((publication) => String(publication.id) === labelId);\n const triggerLabel = selectedPublication?.description\n ? selectedPublication.description\n : findPublicationLabel(sites, labelId);\n const triggerLogo = selectedPublication\n ? resolveImage(selectedPublication)\n : undefined;\n\n return (\n <>\n <Button\n id=\"site-selector-button\"\n data-testid=\"dropdown-toggle-site-selector\"\n aria-controls={open ? 'site-selector-menu' : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n variant=\"outlined\"\n onClick={handleOpen}\n endIcon={\n <KeyboardArrowDownIcon sx={SiteSelectorMenuStyles.sxTriggerIcon} />\n }\n sx={SiteSelectorMenuStyles.sxTriggerButton(open)}>\n {triggerLogo ? (\n <Box\n component=\"img\"\n src={triggerLogo}\n alt=\"\"\n sx={SiteSelectorMenuStyles.sxTriggerLogo}\n />\n ) : null}\n {triggerLogo ? (\n <Box component=\"span\" sx={SiteSelectorMenuStyles.sxTriggerDivider} />\n ) : null}\n <Box component=\"span\" sx={SiteSelectorMenuStyles.sxTriggerCountry}>\n {triggerLabel}\n </Box>\n </Button>\n\n <Menu\n id=\"site-selector-menu\"\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{\n paper: {\n sx: SiteSelectorMenuStyles.sxMenuPaper,\n },\n list: {\n 'aria-labelledby': 'site-selector-button',\n disablePadding: true,\n sx: SiteSelectorMenuStyles.sxMenuList,\n },\n }}>\n {sites.map((section, sectionIndex) => (\n <Box\n key={section.title}\n sx={SiteSelectorMenuStyles.sxSection(sectionIndex === 0)}>\n <Typography sx={SiteSelectorMenuStyles.sxSectionTitle}>\n {section.title}\n </Typography>\n\n {section.publications.map((publication) => {\n const parent = hasChildren(publication);\n const expanded = expandedIds.has(publication.id);\n\n return (\n <Box key={publication.id}>\n <SiteMenuItem\n publication={publication}\n selected={isSelected(publication)}\n isSub={false}\n href={getPublicationHref(publication)}\n imageUrl={resolveImage(publication)}\n expanded={expanded}\n onToggle={() => toggleExpanded(publication.id)}\n />\n\n {parent && expanded ? (\n <Box sx={SiteSelectorMenuStyles.sxKids}>\n {publication.children!.map((child) => (\n <SiteMenuItem\n key={child.id}\n publication={child}\n selected={isSelected(child)}\n isSub\n href={getPublicationHref(child)}\n imageUrl={resolveImage(child)}\n />\n ))}\n </Box>\n ) : null}\n </Box>\n );\n })}\n </Box>\n ))}\n </Menu>\n </>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii, shadows } from '../../theme/variables';\n\n/**\n * Estilos del menú \"Apariencia\" del TopBar: switch \"Tema nuevo\" + segmentado\n * Claro/Oscuro (dos botones UNIDOS, look de píldora segmentada). Los colores\n * usan tokens mode-aware (los hexes de diseño son los de modo claro; en oscuro\n * se adaptan solos): `m3.onSurfaceVariant` (#43474E), `text.primary` (#191C20),\n * `onSecondaryContainer` (#2C4678) y `m3.outline` (#74777F).\n */\nexport const AppearanceMenuStyles = {\n /** Paper del popover — ancho FIJO (no varía al mostrar/ocultar el texto de ayuda). */\n sxPaper: {\n mt: 1,\n p: 2,\n width: 280,\n borderRadius: radii.lg,\n bgcolor: cmsColors.menuSurface,\n boxShadow: shadows.menu,\n fontFamily: fontFamilies.googleSans,\n } as SxProps<Theme>,\n\n /** Título \"Apariencia\": Google Sans 14px #43474E. */\n sxTitle: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n color: 'm3.onSurfaceVariant',\n mb: 1.5,\n } as SxProps<Theme>,\n\n /** Fila del switch (label a la izquierda, switch a la derecha). */\n sxRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n } as SxProps<Theme>,\n\n /** Label principal (\"Tema nuevo\"): Google Sans 15px #191C20. */\n sxRowLabel: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 15,\n fontWeight: 500,\n color: 'text.primary',\n lineHeight: 1.3,\n } as SxProps<Theme>,\n\n /** Subtítulo (\"Interfaz rediseñada\"): Google Sans 12px #43474E, +5px de separación del título. */\n sxRowSub: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 12,\n color: 'm3.onSurfaceVariant',\n lineHeight: 1.3,\n mt: '5px',\n } as SxProps<Theme>,\n\n /** Switch 52×25, con el azul primario del CMS al estar activo. */\n sxSwitch: {\n width: 52,\n height: 25,\n padding: 0,\n display: 'flex',\n '& .MuiSwitch-switchBase': {\n padding: 0,\n margin: '3.5px',\n '&.Mui-checked': {\n transform: 'translateX(27px)',\n color: cmsColors.white,\n '& + .MuiSwitch-track': {\n backgroundColor: cmsColors.primary,\n opacity: 1,\n },\n },\n },\n '& .MuiSwitch-thumb': { width: 18, height: 18, boxShadow: 'none' },\n '& .MuiSwitch-track': {\n borderRadius: '999px',\n backgroundColor: cmsColors.controlBorder,\n opacity: 1,\n },\n } as SxProps<Theme>,\n\n /** Separador. */\n sxDivider: {\n my: 1.5,\n borderColor: cmsColors.border,\n } as SxProps<Theme>,\n\n /** Caption \"MODO\": Google Sans 12px #43474E en mayúsculas. */\n sxCaption: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 12,\n fontWeight: 600,\n letterSpacing: '0.5px',\n textTransform: 'uppercase',\n color: 'm3.onSurfaceVariant',\n mb: 1,\n } as SxProps<Theme>,\n\n /**\n * Segmentado UNIDO: dos botones de 120×40 pegados, con extremos redondeados\n * (píldora) y un divisor central. Borde #74777F.\n */\n sxToggleGroup: {\n display: 'inline-flex',\n width: 'fit-content',\n '& .MuiToggleButtonGroup-grouped': {\n width: 120,\n height: 40,\n margin: 0,\n border: '1px solid',\n borderColor: 'm3.outline',\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n gap: '6px',\n // Label del botón inactivo (p. ej. \"Oscuro\"): #191C20.\n color: 'text.primary',\n '& .MuiSvgIcon-root': { fontSize: 18 },\n // Botón izquierdo: extremo izquierdo redondeado, sin borde derecho (el divisor lo pone el derecho).\n '&:first-of-type': {\n borderTopLeftRadius: radii.pill,\n borderBottomLeftRadius: radii.pill,\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n borderRight: 0,\n },\n // Botón derecho: extremo derecho redondeado, con el borde divisor a la izquierda.\n '&:last-of-type': {\n borderTopRightRadius: radii.pill,\n borderBottomRightRadius: radii.pill,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n borderLeft: '1px solid',\n borderColor: 'm3.outline',\n marginLeft: 0,\n },\n '&:hover': { backgroundColor: cmsColors.surfaceHover },\n // Botón activo (p. ej. \"Claro\"): texto #2C4678 sobre contenedor secundario.\n '&.Mui-selected': {\n backgroundColor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n borderColor: 'm3.outline',\n '&:hover': { backgroundColor: cmsColors.secondary },\n },\n '&.Mui-disabled': {\n opacity: 0.45,\n color: 'text.disabled',\n borderColor: 'm3.outline',\n },\n },\n } as SxProps<Theme>,\n\n /** Texto de ayuda cuando el switch está apagado. */\n sxHelper: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 12,\n color: 'm3.onSurfaceVariant',\n mt: 1.5,\n lineHeight: 1.4,\n } as SxProps<Theme>,\n};\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, radii, shadows } from '../../theme/variables';\n\nconst CLOCK_TIME_SIZE = 13;\nconst CLOCK_META_SIZE = 11;\n\nexport const ICON_SLOT_SIZE = 48;\nexport const HEADER_HEIGHT = 48;\nexport const FRAME_GAP = '15px';\nconst DIVIDER_HEIGHT = 27.6;\n\nexport const TopBarStyles = {\n sxAppBar: {\n bgcolor: 'm3.surfaceContainer',\n color: 'm3.onSurfaceVariant',\n height: HEADER_HEIGHT,\n } as SxProps<Theme>,\n\n sxToolbar: {\n minHeight: HEADER_HEIGHT,\n height: HEADER_HEIGHT,\n pl: '10px',\n pr: 2,\n gap: 1.5,\n } as SxProps<Theme>,\n\n sxMenuButton: {\n width: 40,\n height: 40,\n flexShrink: 0,\n borderRadius: '100px',\n color: 'm3.onSurfaceVariant',\n '&:hover': {\n bgcolor: cmsColors.surfaceHover,\n },\n } as SxProps<Theme>,\n\n sxMenuButtonIcon: {\n fontSize: 24,\n } as SxProps<Theme>,\n\n sxLogoBox: {\n width: 200,\n height: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n my: 'auto',\n } as SxProps<Theme>,\n\n sxActionsFrame: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: FRAME_GAP,\n flexShrink: 0,\n } as SxProps<Theme>,\n\n sxIconActionsRow: {\n display: 'flex',\n alignItems: 'center',\n height: ICON_SLOT_SIZE,\n flexShrink: 0,\n } as SxProps<Theme>,\n\n sxActionIcon: {\n width: ICON_SLOT_SIZE,\n height: ICON_SLOT_SIZE,\n color: 'm3.onSurfaceVariant',\n borderRadius: '50%',\n } as SxProps<Theme>,\n\n sxActionIconGlyph: {\n fontSize: 24,\n } as SxProps<Theme>,\n\n sxBadge: {\n '& .MuiBadge-badge': {\n // Fondo #BA1A1A y texto blanco los aporta `color=\"error\"` del Badge\n // (error.main = #BA1A1A, contrastText = onError = #FFFFFF).\n fontSize: 10,\n fontWeight: 600,\n minWidth: 16,\n height: 16,\n px: 0.5,\n top: 5,\n right: 5,\n },\n } as SxProps<Theme>,\n\n sxDivider: {\n width: '1px',\n height: DIVIDER_HEIGHT,\n flexShrink: 0,\n bgcolor: cmsColors.border,\n } as SxProps<Theme>,\n\n sxClock: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexShrink: 0,\n } as SxProps<Theme>,\n\n sxClockIcon: {\n fontSize: 20,\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n sxClockText: {\n display: 'flex',\n flexDirection: 'column',\n } as SxProps<Theme>,\n\n sxClockTime: {\n fontSize: CLOCK_TIME_SIZE,\n fontWeight: 600,\n lineHeight: 1.2,\n color: cmsColors.textStrong,\n } as SxProps<Theme>,\n\n sxClockMeta: {\n fontSize: CLOCK_META_SIZE,\n lineHeight: 1.2,\n color: cmsColors.textNav,\n } as SxProps<Theme>,\n\n sxProfileButton: {\n p: 0,\n width: 36,\n height: 36,\n flexShrink: 0,\n borderRadius: '50%',\n // Círculo gris lavanda `m3.surfaceVariant` (#E0E2EC) con el ícono en\n // `m3.onSurfaceVariant` (#43474E), en reposo. El botón es el dueño del fondo\n // (el avatar va transparente vía `transparentFallbackBg`), así el círculo\n // mide 36×36. Al hover se superpone el state layer neutro `neutralHover`\n // (M3 onSurface ~8%) SOBRE el gris —vía `backgroundImage` para no reemplazar\n // el `bgcolor`—: oscurece en claro y aclara en oscuro, feedback en ambos modos.\n bgcolor: 'm3.surfaceVariant',\n color: 'm3.onSurfaceVariant',\n '&:hover': {\n bgcolor: 'm3.surfaceVariant',\n backgroundImage: `linear-gradient(${cmsColors.neutralHover}, ${cmsColors.neutralHover})`,\n },\n } as SxProps<Theme>,\n\n sxProfileAvatar: {\n width: 34,\n height: 34,\n border: `1px solid ${cmsColors.avatarBorder}`,\n bgcolor: cmsColors.avatarBg,\n } as SxProps<Theme>,\n\n sxProfileMenuPaper: {\n mt: 1,\n minWidth: 255,\n borderRadius: radii.accountMenu,\n bgcolor: cmsColors.menuSurface,\n py: 0.5,\n boxShadow: shadows.accountMenu,\n } as SxProps<Theme>,\n\n sxProfileMenuItem: {\n // Inset lateral (`mx`) + `px` reducido: el resaltado del hover no llega a los\n // bordes del paper (queda \"flotando\"), pero el contenido sigue a 16px del\n // borde (8+8), alineado con el header. Esquinas redondeadas para el hover.\n mx: 1,\n px: 1,\n py: 1.25,\n borderRadius: radii.md,\n fontSize: 14,\n color: cmsColors.textStrong,\n // Hover: state layer M3 `onSurface` al 8% (#191C20), común a los desplegables.\n '&:hover': {\n bgcolor: cmsColors.neutralHover,\n },\n } as SxProps<Theme>,\n\n sxProfileMenuListItemIcon: {\n minWidth: 36,\n color: 'm3.onSurfaceVariant',\n '& .MuiSvgIcon-root': {\n fontSize: 20,\n },\n } as SxProps<Theme>,\n\n sxProfileMenuDivider: {\n // Sin margen vertical: el divisor queda pegado a los ítems, así el resaltado\n // del hover llega hasta la línea (sin el hueco de ~4px que dejaba `my`).\n my: 0,\n borderColor: cmsColors.border,\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport DarkModeOutlinedIcon from '@mui/icons-material/DarkModeOutlined';\nimport LightModeOutlinedIcon from '@mui/icons-material/LightModeOutlined';\nimport PaletteOutlinedIcon from '@mui/icons-material/PaletteOutlined';\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport Popover from '@mui/material/Popover';\nimport Switch from '@mui/material/Switch';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { useColorScheme } from '@mui/material/styles';\nimport { useEffect, useState, type MouseEvent } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport {\n readThemePreference,\n writeThemePreference,\n type ThemeMode,\n} from '../../theme/themePreference';\nimport { AppearanceMenuStyles } from './AppearanceMenu.styles';\nimport { TopBarStyles } from './TopBar.styles';\n\n/**\n * Menú \"Apariencia\" del TopBar (ícono de paleta). Un switch \"Tema nuevo\"\n * habilita la selección de modo; con el switch apagado se fuerza el modo claro\n * y el segmentado Claro/Oscuro queda deshabilitado. Al elegir \"Oscuro\" se\n * togglea el `data-mui-color-scheme` de MUI y todo el sitio pasa a oscuro.\n *\n * La selección se **persiste en `localStorage`** (helper `themePreference`), así\n * el menú recuerda el switch y el modo, y el gestor abre en ese tema (por\n * gestor: localStorage está aislado por origen). Solo afecta estilos: no toca\n * datos ni funcionalidad del gestor.\n */\nexport function AppearanceMenu() {\n const { t } = useCmsTranslation();\n const { setMode } = useColorScheme();\n\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n // \"Tema nuevo\": habilita la selección de modo. Apagado → se fuerza claro.\n const [enabled, setEnabled] = useState(true);\n // Modo elegido por el usuario (se recuerda aunque se apague el switch).\n const [desiredMode, setDesiredMode] = useState<ThemeMode>('light');\n\n const open = Boolean(anchorEl);\n const title = t.topBar('appearance');\n\n // Hidratar desde localStorage tras el montaje (no en el initializer de\n // useState, para no romper la hidratación server/cliente: el SSR arranca con\n // los defaults). Mismo criterio que el `locale` del login.\n useEffect(() => {\n const pref = readThemePreference();\n /* eslint-disable react-hooks/set-state-in-effect -- sync único desde localStorage en el mount (evita mismatch de hidratación) */\n setEnabled(pref.enabled);\n setDesiredMode(pref.mode);\n /* eslint-enable react-hooks/set-state-in-effect */\n }, []);\n\n // Aplicar el modo efectivo a MUI cada vez que cambie (hidratación o usuario).\n // La persistencia se hace en los handlers (no acá) para no pisar el\n // localStorage con los defaults antes de hidratar.\n useEffect(() => {\n setMode(enabled ? desiredMode : 'light');\n }, [enabled, desiredMode, setMode]);\n\n const handleEnabledChange = (checked: boolean) => {\n setEnabled(checked);\n writeThemePreference({ enabled: checked, mode: desiredMode });\n };\n\n const handleModeChange = (\n _event: MouseEvent<HTMLElement>,\n value: ThemeMode | null,\n ) => {\n if (value && enabled) {\n setDesiredMode(value);\n writeThemePreference({ enabled, mode: value });\n }\n };\n\n const selected: ThemeMode = enabled ? desiredMode : 'light';\n\n return (\n <>\n <Tooltip title={title}>\n <IconButton\n onClick={(event) => setAnchorEl(event.currentTarget)}\n aria-label={title}\n aria-haspopup=\"true\"\n aria-expanded={open}\n data-testid=\"dropdown-toggle-appearance\"\n sx={TopBarStyles.sxActionIcon}>\n <PaletteOutlinedIcon sx={TopBarStyles.sxActionIconGlyph} />\n </IconButton>\n </Tooltip>\n\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{\n paper: {\n sx: AppearanceMenuStyles.sxPaper,\n ...({ 'data-testid': 'dropdown-menu-appearance' } as object),\n },\n }}>\n <Typography sx={AppearanceMenuStyles.sxTitle}>{title}</Typography>\n\n <Box sx={AppearanceMenuStyles.sxRow}>\n <Box>\n <Typography sx={AppearanceMenuStyles.sxRowLabel}>\n {t.topBar('newTheme')}\n </Typography>\n <Typography sx={AppearanceMenuStyles.sxRowSub}>\n {t.topBar('newThemeSubtitle')}\n </Typography>\n </Box>\n <Switch\n checked={enabled}\n onChange={(event) => handleEnabledChange(event.target.checked)}\n data-testid=\"check-new-theme\"\n sx={AppearanceMenuStyles.sxSwitch}\n slotProps={{ input: { 'aria-label': t.topBar('newTheme') } }}\n />\n </Box>\n\n <Divider sx={AppearanceMenuStyles.sxDivider} />\n\n <Typography sx={AppearanceMenuStyles.sxCaption}>\n {t.topBar('modeLabel')}\n </Typography>\n\n <ToggleButtonGroup\n exclusive\n value={selected}\n onChange={handleModeChange}\n disabled={!enabled}\n aria-label={t.topBar('modeLabel')}\n sx={AppearanceMenuStyles.sxToggleGroup}>\n <ToggleButton\n value=\"light\"\n aria-label={t.topBar('modeLight')}\n data-testid=\"btn-theme-light\"\n data-action=\"light\">\n <LightModeOutlinedIcon />\n {t.topBar('modeLight')}\n </ToggleButton>\n <ToggleButton\n value=\"dark\"\n aria-label={t.topBar('modeDark')}\n data-testid=\"btn-theme-dark\"\n data-action=\"dark\">\n <DarkModeOutlinedIcon />\n {t.topBar('modeDark')}\n </ToggleButton>\n </ToggleButtonGroup>\n\n {!enabled && (\n <Typography sx={AppearanceMenuStyles.sxHelper}>\n {t.topBar('classicUnavailable')}\n </Typography>\n )}\n </Popover>\n </>\n );\n}\n","/**\n * Transforma la respuesta cruda de `POST /dashboard/notification`\n * (`newsTask` / `expireTask` / `videos`) en el feed único, ordenado por hora,\n * que consume el desplegable de la campanita (`NotificationsMenu`).\n *\n * Replica la lógica del header del CMS Angular (`cmsmedios-ux`):\n * `buildAssignedTopicsGroup`, `buildActivityNotificationsGroup`,\n * `buildSystemNote`, `buildDatetimeParts`, `parseSystemDescription`,\n * `highlightVideoFormats` y `buildDueParts`. Todas las fechas se calculan en la\n * zona de redacción de la publicación (offset GMT fijo), igual que el resto del CMS.\n */\n\nimport type { DashboardNotificationsResponse } from '../../services/dashboard';\nimport { toSiteWallClock } from '../../utils/site-time';\n\n/** Tipo de tarjeta del feed. */\nexport type NotificationFeedType =\n | 'assigned'\n | 'pending'\n | 'unassigned'\n | 'system'\n | 'editorialOpportunity';\n\n/** Tema individual dentro de una tarjeta agrupada (asignados / por vencer / copilot). */\nexport interface NotificationTopic {\n /** Id crudo del ítem. Para copilot es el `opportunity_id` (necesario en el snooze). */\n id?: string;\n title: string;\n /** Código visible del tema (`CP-<id>`), en asignados / por vencer. */\n code: string;\n /** Temas asignados: etiqueta relativa de la fecha de asignación. */\n assignedToday?: boolean;\n assignedYesterday?: boolean;\n assignedDate?: string;\n /** Temas por vencer: fecha (\"DD/MM\") y hora (\"HH:mm\") de vencimiento. */\n dueDate?: string;\n dueTime?: string;\n /** Oportunidades copilot: % de coincidencia editorial (score) y tema. */\n matchPercent?: number;\n topic?: string;\n /** Datos de navegación al planning del evento destino. */\n eventId?: string;\n eventDate?: number;\n site?: string;\n publication?: number;\n unread?: boolean;\n}\n\n/** Item del feed ya listo para renderizar. */\nexport interface NotificationFeedItem {\n id: string;\n type: NotificationFeedType;\n /** Etiquetas de fecha/hora relativas (zona de redacción). */\n isToday: boolean;\n isYesterday: boolean;\n /** Fecha \"DD/MM/AAAA\" (se muestra si no es hoy ni ayer). */\n date: string;\n /** Hora \"HH:mm\" (24h). */\n time: string;\n /** Timestamp crudo usado para ordenar el feed por hora. */\n sortTime: number;\n unread: boolean;\n\n /** Tarjetas agrupadas (asignados / por vencer). */\n count?: number;\n expirationDatetime?: string;\n children?: NotificationTopic[];\n\n /** Título de la tarea (desasignación). */\n title?: string;\n\n /** Notificación del sistema (video) / desasignación. */\n userFullName?: string;\n userLogin?: string;\n /** HTML seguro (escapado + formatos de video resaltados) para `dangerouslySetInnerHTML`. */\n preTextHtml?: string;\n pathPart?: string;\n postTextHtml?: string;\n detailHtml?: string;\n}\n\n/** Formatos de video que se resaltan (negrita + mayúscula) dentro del texto. */\nconst VIDEO_FORMATS = ['hls', 'dash', 'mp4', 'webm', 'mov', 'm3u8', 'mpd'];\n\nfunction pad(n: number): string {\n return String(n).padStart(2, '0');\n}\n\n/**\n * Normaliza un campo de timestamp del backend a epoch ms. Acepta un número, un\n * string numérico, una fecha ISO 8601 (`created_at` de copilot) o un objeto\n * `{ time }` (como `timeStamp.time`).\n */\nfunction readEpoch(value: unknown): number | null {\n if (value == null) return null;\n if (typeof value === 'object') {\n const time = (value as { time?: unknown }).time;\n return readEpoch(time);\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n // String puramente numérico → epoch; si no, se intenta como fecha ISO.\n if (/^\\d+$/.test(trimmed)) return parseInt(trimmed, 10);\n const parsed = Date.parse(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n }\n const n = Number(value);\n return Number.isNaN(n) ? null : n;\n}\n\n/**\n * Descompone un timestamp (epoch ms, UTC) en las partes de fecha/hora de la\n * zona de redacción, más los indicadores relativos hoy/ayer.\n */\nfunction buildDatetimeParts(\n value: unknown,\n gmt: string | null | undefined,\n nowWall: number,\n): {\n date: string;\n time: string;\n isToday: boolean;\n isYesterday: boolean;\n sortTime: number;\n} {\n const epoch = readEpoch(value);\n if (epoch == null) {\n return { date: '', time: '', isToday: false, isYesterday: false, sortTime: 0 };\n }\n const wall = toSiteWallClock(epoch, gmt);\n const d = new Date(wall);\n const date = `${pad(d.getUTCDate())}/${pad(d.getUTCMonth() + 1)}/${d.getUTCFullYear()}`;\n const time = `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}`;\n\n const now = new Date(nowWall);\n const yesterday = new Date(nowWall - 86_400_000);\n const sameDay = (a: Date, b: Date) =>\n a.getUTCFullYear() === b.getUTCFullYear() &&\n a.getUTCMonth() === b.getUTCMonth() &&\n a.getUTCDate() === b.getUTCDate();\n\n return {\n date,\n time,\n isToday: sameDay(d, now),\n isYesterday: sameDay(d, yesterday),\n sortTime: epoch,\n };\n}\n\n/** Fecha \"DD/MM\" y hora \"HH:mm\" de vencimiento, en zona de redacción. */\nfunction buildDueParts(\n value: unknown,\n gmt: string | null | undefined,\n): { date: string; time: string } {\n const epoch = readEpoch(value);\n if (epoch == null) return { date: '', time: '' };\n const d = new Date(toSiteWallClock(epoch, gmt));\n return {\n date: `${pad(d.getUTCDate())}/${pad(d.getUTCMonth() + 1)}`,\n time: `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}`,\n };\n}\n\n/** Escapa HTML y resalta los formatos de video conocidos en negrita + mayúscula. */\nfunction highlightVideoFormats(text: string): string {\n if (!text) return '';\n const escaped = text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n const pattern = new RegExp(`\\\\b(${VIDEO_FORMATS.join('|')})\\\\b`, 'gi');\n return escaped.replace(pattern, (match) => `<strong>${match.toUpperCase()}</strong>`);\n}\n\n/** Separa una descripción en texto previo, path (\"/algo/archivo.ext\") y texto posterior. */\nfunction parseSystemDescription(description: string): {\n preText: string;\n pathPart: string;\n postText: string;\n} {\n if (!description) return { preText: '', pathPart: '', postText: '' };\n const match = description.match(/(\\/[\\w\\-./]+\\.[\\w]+)/);\n if (match && match.index !== undefined) {\n return {\n preText: description.substring(0, match.index).trim(),\n pathPart: match[1],\n postText: description.substring(match.index + match[1].length).trim(),\n };\n }\n return { preText: description, pathPart: '', postText: '' };\n}\n\n/** Construye la card de nuevos temas asignados a partir de `newsTask`. */\nfunction buildAssignedGroup(\n tasks: DashboardNotificationsResponse['newsTask'],\n gmt: string | null | undefined,\n nowWall: number,\n): NotificationFeedItem | null {\n if (!tasks || !tasks.length) return null;\n // Hora de la card: la del delivery (`timeStamp.time`) del tema más reciente.\n const withDelivery = tasks.filter((t) => t && readEpoch(t.timeStamp) != null);\n const latest = withDelivery.length\n ? withDelivery.reduce(\n (max, t) =>\n Number(readEpoch(t.timeStamp)) > Number(readEpoch(max.timeStamp)) ? t : max,\n withDelivery[0],\n )\n : null;\n const datetime = buildDatetimeParts(\n latest ? latest.timeStamp : Date.now(),\n gmt,\n nowWall,\n );\n return {\n id: 'assigned-group',\n type: 'assigned',\n ...datetime,\n count: tasks.length,\n children: tasks.map((task) => {\n const assigned = buildDatetimeParts(task.assignedDate, gmt, nowWall);\n return {\n title: String(task.title ?? ''),\n code: `CP-${task.id}`,\n assignedToday: assigned.isToday,\n assignedYesterday: assigned.isYesterday,\n assignedDate: assigned.date,\n eventId: task.id != null ? String(task.id) : undefined,\n eventDate: task.startdate,\n site: task.site,\n publication: task.publication,\n unread: !task.isRead,\n };\n }),\n unread: tasks.some((t) => !t.isRead),\n };\n}\n\n/** Construye la card de actividades por vencer a partir de `expireTask`. */\nfunction buildPendingGroup(\n activities: DashboardNotificationsResponse['expireTask'],\n gmt: string | null | undefined,\n nowWall: number,\n now: number,\n): NotificationFeedItem | null {\n if (!activities || !activities.length) return null;\n const withDate = activities.filter((a) => a && a.startdate != null);\n const earliest = withDate.length\n ? withDate.reduce(\n (min, a) => (Number(a.startdate) < Number(min.startdate) ? a : min),\n withDate[0],\n )\n : activities[0];\n // `expireTask` no trae hora de entrega desde el back: se sella con \"ahora\"\n // para que la alerta figure como recién recibida (simplificación respecto de\n // la memoria por ids del CMS Angular). Los vencimientos reales de cada tema\n // se muestran en la lista desplegada (dueDate/dueTime).\n const datetime = buildDatetimeParts(now, gmt, nowWall);\n const earliestDue = earliest.startdate != null ? buildDueParts(earliest.startdate, gmt) : null;\n return {\n id: 'pending-group',\n type: 'pending',\n ...datetime,\n count: activities.length,\n expirationDatetime: earliestDue ? `${earliestDue.date}, ${earliestDue.time}hs` : '',\n children: activities.map((activity) => {\n const due = buildDueParts(activity.startdate, gmt);\n return {\n title: String(activity.title ?? ''),\n code: `CP-${activity.id}`,\n dueDate: due.date,\n dueTime: due.time,\n eventId: activity.id != null ? String(activity.id) : undefined,\n eventDate: activity.startdate,\n site: activity.site,\n publication: activity.publication,\n unread: !activity.isRead,\n };\n }),\n unread: activities.some((a) => !a.isRead),\n };\n}\n\n/** Construye una notificación del sistema (video) a partir de un item de `videos`. */\nfunction buildSystemNote(\n item: NonNullable<DashboardNotificationsResponse['videos']>[number],\n gmt: string | null | undefined,\n nowWall: number,\n index: number,\n): NotificationFeedItem {\n const description = String(item.description ?? '');\n const openIdx = description.indexOf('(');\n const closingIdx = description.indexOf(')');\n let userFullName: string;\n let userLogin = '';\n let bodyText = description;\n\n if (openIdx !== -1 && closingIdx !== -1 && closingIdx > openIdx) {\n userFullName = description.substring(0, openIdx).trim();\n userLogin = description.substring(openIdx, closingIdx + 1).trim();\n bodyText = description.substring(closingIdx + 1).trim();\n } else {\n userFullName = String(item.userName ?? '');\n }\n\n const parsed = parseSystemDescription(bodyText);\n const datetime = buildDatetimeParts(item.timeStamp, gmt, nowWall);\n return {\n // El índice garantiza unicidad aunque el backend repita `actionId`.\n id: `system-${item.actionId ?? 'x'}-${index}`,\n type: 'system',\n ...datetime,\n userFullName,\n userLogin,\n pathPart: parsed.pathPart,\n preTextHtml: highlightVideoFormats(parsed.preText),\n postTextHtml: highlightVideoFormats(parsed.postText),\n detailHtml: highlightVideoFormats(description),\n unread: !item.isRead,\n };\n}\n\n/**\n * Construye las notificaciones de desasignación de tarea a partir del array\n * `unassignTask` (person_remove). Una tarjeta por aviso, informativa (no navega).\n * El texto se arma con i18n en el componente; del payload solo salen el título\n * de la tarea y, opcionalmente, el autor (`userName`/`userCreation` + `userLogin`).\n * Replica `buildUnassignedNote` del header del CMS Angular.\n */\nfunction buildUnassignedNotes(\n tasks: DashboardNotificationsResponse['unassignTask'],\n gmt: string | null | undefined,\n nowWall: number,\n): NotificationFeedItem[] {\n if (!tasks || !tasks.length) return [];\n return tasks.map((task, index) => {\n const datetime = buildDatetimeParts(task.timeStamp, gmt, nowWall);\n return {\n // El índice garantiza unicidad aunque el backend repita `id`.\n id: `unassigned-${task.id ?? 'x'}-${index}`,\n type: 'unassigned' as const,\n ...datetime,\n title: String(task.title ?? ''),\n // Autor de la desasignación: opcional (nombre por `userName` o `userCreation`).\n userFullName: String(task.userName ?? task.userCreation ?? ''),\n userLogin: String(task.userLogin ?? ''),\n unread: !task.isRead,\n };\n });\n}\n\n/**\n * Construye la card agrupada de oportunidades editoriales copilot a partir del\n * array `copilot` de `dashboard/notification` (NAA-4645). El back manda hasta 3,\n * por `score` desc; la primera es la destacada (siempre visible) y el resto queda\n * tras el botón \"Ver N más\". La hora de la card es el `created_at` más reciente.\n * Se excluyen las oportunidades ya pospuestas en la sesión (`snoozedIds`).\n */\nfunction buildEditorialOpportunitiesGroup(\n opportunities: DashboardNotificationsResponse['copilot'] | null | undefined,\n gmt: string | null | undefined,\n nowWall: number,\n snoozedIds: ReadonlySet<string>,\n): NotificationFeedItem | null {\n if (!opportunities || !opportunities.length) return null;\n const visible = opportunities.filter(\n (o) => o && !(o.id != null && snoozedIds.has(String(o.id))),\n );\n if (!visible.length) return null;\n const withDelivery = visible.filter((o) => readEpoch(o.created_at) != null);\n const latest = withDelivery.length\n ? withDelivery.reduce(\n (max, o) =>\n Number(readEpoch(o.created_at)) > Number(readEpoch(max.created_at)) ? o : max,\n withDelivery[0],\n )\n : null;\n const datetime = buildDatetimeParts(\n latest ? latest.created_at : Date.now(),\n gmt,\n nowWall,\n );\n return {\n id: 'editorial-group',\n type: 'editorialOpportunity',\n ...datetime,\n count: visible.length,\n children: visible.map((opportunity) => ({\n id: opportunity.id != null ? String(opportunity.id) : undefined,\n title: String(opportunity.title ?? ''),\n code: opportunity.id != null ? `CP-${opportunity.id}` : '',\n matchPercent: opportunity.score,\n topic: opportunity.topic,\n unread: !opportunity.isRead,\n })),\n unread: visible.some((o) => !o.isRead),\n };\n}\n\n/**\n * Arma el feed completo de notificaciones, ordenado por hora descendente\n * (lo más reciente primero).\n *\n * @param response Respuesta cruda de `POST /dashboard/notification`.\n * @param opts.now Instante actual (epoch ms) — por defecto `Date.now()`.\n * @param opts.gmtRedaction Offset GMT de la publicación seleccionada.\n * @param opts.snoozedCopilotIds Ids de oportunidades copilot pospuestas (se ocultan).\n */\nexport function buildNotificationsFeed(\n response: DashboardNotificationsResponse | null | undefined,\n opts: {\n now?: number;\n gmtRedaction?: string | null;\n snoozedCopilotIds?: Iterable<string>;\n } = {},\n): NotificationFeedItem[] {\n const now = opts.now ?? Date.now();\n const gmt = opts.gmtRedaction;\n const nowWall = toSiteWallClock(now, gmt);\n const snoozedIds = new Set(opts.snoozedCopilotIds ?? []);\n\n const items: NotificationFeedItem[] = [];\n\n if (response) {\n const editorial = buildEditorialOpportunitiesGroup(\n response.copilot,\n gmt,\n nowWall,\n snoozedIds,\n );\n if (editorial) items.push(editorial);\n const assigned = buildAssignedGroup(response.newsTask, gmt, nowWall);\n if (assigned) items.push(assigned);\n const pending = buildPendingGroup(response.expireTask, gmt, nowWall, now);\n if (pending) items.push(pending);\n items.push(...buildUnassignedNotes(response.unassignTask, gmt, nowWall));\n (response.videos ?? []).forEach((video, i) => {\n items.push(buildSystemNote(video, gmt, nowWall, i));\n });\n }\n\n items.sort((a, b) => (b.sortTime || 0) - (a.sortTime || 0));\n return items;\n}\n\n/** Une el dominio de `master` (Angular) con una ruta, sin barra doble. */\nfunction joinUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n}\n\n/**\n * Construye la URL de redirección de un tema a `master` (el CMS Angular\n * desplegado), replicando la ruta interna que usa cmsmedios: el planning de la\n * publicación destino, abierto en la vista día sobre el evento.\n *\n * @param topic Tema clickeado (trae `publication`, `eventDate`, `eventId`).\n * @param masterBaseUrl Dominio de `master` (`NEXT_PUBLIC_BASE_ANGULAR`).\n * @param currentPublicationId Id de la publicación activa (fallback).\n * @returns URL absoluta a `master`, o `undefined` si no hay publicación destino.\n */\nexport function buildPlanningHref(\n topic: Pick<NotificationTopic, 'eventId' | 'eventDate' | 'publication'>,\n masterBaseUrl: string | undefined,\n currentPublicationId?: number | string,\n): string | undefined {\n const targetPub =\n topic.publication != null ? Number(topic.publication) : Number(currentPublicationId);\n if (!targetPub) return undefined;\n\n let path = `/admin/planning/${targetPub}`;\n if (topic.eventDate) {\n const params = new URLSearchParams({\n view: 'timeGridDay',\n eventDate: String(topic.eventDate),\n });\n if (topic.eventId) params.set('eventId', String(topic.eventId));\n path += `?${params.toString()}`;\n }\n return joinUrl(masterBaseUrl, path);\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport { alpha } from '@mui/material/styles';\n\nimport {\n cmsColors,\n editorialOpportunityColors,\n fontFamilies,\n notificationColors,\n radii,\n shadows,\n} from '../../theme/variables';\n\n/**\n * Estilos del centro de notificaciones (campanita del TopBar).\n * Replican el diseño del mockup \"Gestión de Noticias\" (bloque `.oe-toast`):\n * panel flotante con tarjetas por tipo, acordeones y lista de temas.\n */\nexport const NotificationsMenuStyles = {\n /**\n * Paper del desplegable de la campanita: se ancla al ícono (lo posiciona el\n * `Popover`, no `position:fixed`). Sin velo/backdrop gris sobre el gestor.\n */\n sxPanel: {\n mt: 1,\n width: 380,\n maxWidth: 'calc(100vw - 24px)',\n maxHeight: 'min(560px, calc(100vh - 96px))',\n display: 'flex',\n flexDirection: 'column',\n bgcolor: cmsColors.menuSurface,\n border: 1,\n borderColor: 'm3.outlineVariant',\n borderRadius: 4,\n boxShadow: shadows.menuSoft,\n overflow: 'hidden',\n outline: 'none',\n } as SxProps<Theme>,\n\n /** Pulso rojo del badge de no leídas sobre la campanita. */\n sxBadgePulse: (theme: Theme) => ({\n '@keyframes notifBellPulse': {\n '0%, 100%': {\n boxShadow: `0 0 0 0 ${alpha(theme.palette.error.main, 0.6)}`,\n },\n '50%': {\n boxShadow: `0 0 0 6px ${alpha(theme.palette.error.main, 0)}`,\n },\n },\n '& .MuiBadge-badge': {\n animation: 'notifBellPulse 1.6s ease-out infinite',\n },\n }),\n\n /** Contenedor scrollable de la lista de notificaciones. */\n sxScroll: {\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n px: 1.5,\n py: 1,\n } as SxProps<Theme>,\n\n /**\n * Línea divisora entre notificaciones (1px sólido `outlineVariant` = #C4C6CF).\n * Replica el `.group-divider` del dropdown del CMS Angular.\n */\n sxDivider: {\n height: '1px',\n bgcolor: 'm3.outlineVariant',\n my: 1,\n mx: 'auto',\n width: '100%',\n maxWidth: 352,\n } as SxProps<Theme>,\n\n /** Estado vacío. */\n sxEmpty: {\n px: 2,\n py: 4,\n textAlign: 'center',\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /**\n * Etiqueta de fecha/hora sobre cada notificación (\"Hoy, 14:32\").\n * 11px, peso 500, `onSurfaceVariant` (#43474E), según spec de Material (Juan).\n */\n sxTimestamp: {\n color: 'm3.onSurfaceVariant',\n fontSize: 11,\n fontWeight: 500,\n letterSpacing: '0.02em',\n px: 0.5,\n pt: 0.5,\n pb: 0.75,\n } as SxProps<Theme>,\n\n /** Fila de notificación (tarjeta). `clickable` agrega hover y cursor. */\n sxRow: (clickable: boolean): SxProps<Theme> => ({\n display: 'grid',\n gridTemplateColumns: clickable ? '36px 1fr 20px' : '36px 1fr',\n columnGap: 1.5,\n alignItems: 'start',\n p: 1.25,\n borderRadius: 3,\n bgcolor: 'm3.surface',\n textAlign: 'left',\n width: '100%',\n border: 0,\n cursor: clickable ? 'pointer' : 'default',\n transition: 'background-color .12s',\n '&:hover': clickable\n ? { bgcolor: (theme: Theme) => alpha(theme.palette.text.primary, 0.06) }\n : undefined,\n }),\n\n /** Avatar cuadrado de ícono. `type` define los colores. */\n sxAvatar: (type: keyof typeof notificationColors): SxProps<Theme> => ({\n position: 'relative',\n width: 36,\n height: 36,\n borderRadius: 3,\n display: 'grid',\n placeItems: 'center',\n bgcolor: notificationColors[type].bg,\n color: notificationColors[type].on,\n '& svg': { fontSize: 20 },\n }),\n\n /** Punto rojo de \"no leído\" sobre el avatar. */\n sxUnreadDot: {\n position: 'absolute',\n top: -5,\n right: -5,\n width: 10,\n height: 10,\n borderRadius: '50%',\n bgcolor: 'error.main',\n border: 2,\n borderColor: 'm3.surfaceContainer',\n } as SxProps<Theme>,\n\n /** Cuerpo de texto de la fila. */\n sxBody: {\n minWidth: 0,\n alignSelf: 'center',\n color: 'm3.onSurface',\n lineHeight: 1.4,\n overflowWrap: 'break-word',\n wordBreak: 'break-word',\n '& b': { fontWeight: 600 },\n '& strong': { fontWeight: 600, textTransform: 'uppercase' },\n } as SxProps<Theme>,\n\n /** Subtítulo (fecha de vencimiento de la card por vencer). */\n sxSubtitle: {\n display: 'block',\n mt: 0.25,\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /** Login del usuario (entre paréntesis, sin negrita). */\n sxUserLogin: {\n color: 'm3.onSurfaceVariant',\n fontWeight: 500,\n } as SxProps<Theme>,\n\n /** Chip monoespaciado con el path del archivo de video. */\n sxPathChip: {\n display: 'inline-block',\n fontFamily: fontFamilies.mono,\n fontSize: 12,\n bgcolor: (theme: Theme) => alpha(theme.palette.text.primary, 0.06),\n color: 'm3.onSurface',\n px: 0.75,\n py: '1px',\n borderRadius: 1.5,\n wordBreak: 'break-all',\n my: 0.25,\n lineHeight: 1.5,\n } as SxProps<Theme>,\n\n /** Chevron de acordeón (rota al abrir). */\n sxChevron: (open: boolean): SxProps<Theme> => ({\n alignSelf: 'center',\n color: 'm3.onSurfaceVariant',\n fontSize: 20,\n transition: 'transform .2s',\n transform: open ? 'rotate(180deg)' : 'none',\n }),\n\n /** Lista de temas desplegada bajo una card agrupada. */\n sxTopics: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n gap: 0.25,\n pt: 0.75,\n pb: 0.25,\n pl: '38px',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '17px',\n top: 8,\n bottom: 8,\n width: '2px',\n borderRadius: radii.pill,\n bgcolor: 'm3.outlineVariant',\n },\n } as SxProps<Theme>,\n\n /** Fila de un tema individual (navegable). */\n sxTopicRow: {\n display: 'grid',\n gridTemplateColumns: '1fr 20px',\n columnGap: 1.25,\n alignItems: 'center',\n p: 1,\n borderRadius: 2.5,\n textAlign: 'left',\n width: '100%',\n border: 0,\n bgcolor: 'transparent',\n cursor: 'pointer',\n color: 'inherit',\n textDecoration: 'none',\n transition: 'background-color .12s',\n '&:hover': {\n bgcolor: (theme: Theme) => alpha(theme.palette.text.primary, 0.08),\n },\n } as SxProps<Theme>,\n\n sxTopicTitle: {\n display: 'block',\n color: 'm3.onSurface',\n fontWeight: 500,\n lineHeight: 1.3,\n } as SxProps<Theme>,\n\n /** Meta del tema (\"CP-…\", \"Asignado el\", \"Vence\"): 11px, spec de Material (Juan). */\n sxTopicMeta: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.75,\n mt: 0.25,\n fontSize: 11,\n color: 'm3.onSurfaceVariant',\n letterSpacing: '0.02em',\n } as SxProps<Theme>,\n\n /** Punto separador entre el código y la fecha del tema. */\n sxMetaDot: {\n width: 3,\n height: 3,\n borderRadius: '50%',\n bgcolor: 'm3.outlineVariant',\n flexShrink: 0,\n } as SxProps<Theme>,\n\n /** Fecha de vencimiento resaltada (naranja). */\n sxDue: {\n color: notificationColors.pending.on,\n fontWeight: 600,\n } as SxProps<Theme>,\n\n sxTopicChevron: {\n color: 'm3.onSurfaceVariant',\n fontSize: 20,\n justifySelf: 'end',\n } as SxProps<Theme>,\n\n // ── Card de oportunidades editoriales copilot (NAA-4837) ─────────────────\n\n /** Contenedor de la card: apila encabezado, oportunidades, toggle y acciones. */\n sxOpportunityCard: {\n display: 'flex',\n flexDirection: 'column',\n gap: 1.25,\n p: 1.25,\n borderRadius: 3,\n bgcolor: 'm3.surface',\n width: '100%',\n } as SxProps<Theme>,\n\n /** Encabezado clickeable (icono + label + título + chevron). */\n sxOpportunityHeader: {\n display: 'grid',\n gridTemplateColumns: '36px 1fr 20px',\n columnGap: 1.5,\n alignItems: 'center',\n width: '100%',\n p: 0,\n border: 0,\n bgcolor: 'transparent',\n textAlign: 'left',\n cursor: 'pointer',\n color: 'inherit',\n font: 'inherit',\n } as SxProps<Theme>,\n\n /** Fila del label (\"OPORTUNIDAD EDITORIAL\" + contador). */\n sxOpportunityLabel: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n } as SxProps<Theme>,\n\n sxOpportunityLabelText: {\n fontSize: 11,\n fontWeight: 700,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n color: cmsColors.primary,\n } as SxProps<Theme>,\n\n /** Contador circular con la cantidad de oportunidades del grupo. */\n sxOpportunityCount: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: 18,\n height: 18,\n px: 0.5,\n borderRadius: radii.pill,\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n fontSize: 11,\n fontWeight: 600,\n lineHeight: 1,\n } as SxProps<Theme>,\n\n /**\n * Avatar del ícono de la card de oportunidades: fondo azul primario, ícono\n * blanco y un anillo pulsante 2px (borde animado). El anillo se anima por\n * opacidad/escala (no `alpha()`) para conservar el color como variable.\n */\n sxOpportunityAvatar: {\n position: 'relative',\n width: 36,\n height: 36,\n borderRadius: 3,\n display: 'grid',\n placeItems: 'center',\n bgcolor: cmsColors.primary,\n color: cmsColors.white,\n border: '2px solid',\n borderColor: cmsColors.primary,\n '& svg': { fontSize: 20 },\n '@keyframes opportunityIconRing': {\n '0%': { opacity: 0.6, transform: 'scale(1)' },\n '100%': { opacity: 0, transform: 'scale(1.35)' },\n },\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n inset: '-2px',\n borderRadius: 'inherit',\n border: '2px solid',\n borderColor: cmsColors.primary,\n pointerEvents: 'none',\n animation: 'opportunityIconRing 1.6s ease-out infinite',\n },\n } as SxProps<Theme>,\n\n sxOpportunityHeaderTitle: {\n display: 'block',\n mt: 0.25,\n color: 'm3.onSurface',\n fontWeight: 600,\n lineHeight: 1.3,\n } as SxProps<Theme>,\n\n /**\n * Caja de una oportunidad, con barra de acento a la izquierda (pseudo `::before`).\n * `unread` la marca como nueva/no leída: barra en degradé azul (primario →\n * Kundera). Leída: barra gris (`m3.outlineVariant`). `clickable` la vuelve\n * enlace al gestor de sugerencias (cursor + hover + reset de link).\n */\n sxOpportunityTopic: (unread: boolean, clickable = false): SxProps<Theme> => ({\n position: 'relative',\n overflow: 'hidden',\n display: 'block',\n bgcolor: editorialOpportunityColors.topicBg,\n borderRadius: 2.5,\n p: 1,\n pl: 1.5,\n color: 'inherit',\n textDecoration: 'none',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: '4px',\n ...(unread\n ? {\n backgroundImage: `linear-gradient(180deg, ${cmsColors.primary}, ${cmsColors.kundera})`,\n }\n : { backgroundColor: 'm3.outlineVariant' }),\n },\n ...(clickable\n ? {\n cursor: 'pointer',\n transition: 'filter .12s',\n '&:hover': { filter: 'brightness(0.96)' },\n }\n : {}),\n }),\n\n /**\n * Meta de la oportunidad (\"Top · 94% Coincidencia\" / \"82% Coincidencia\").\n * `unread`: azul primario (nueva/no leída); leída: `m3.onSurface` (#191C20).\n */\n sxOpportunityMeta: (unread: boolean): SxProps<Theme> => ({\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n fontSize: 11,\n fontWeight: 700,\n letterSpacing: '0.04em',\n textTransform: 'uppercase',\n color: unread ? cmsColors.primary : 'm3.onSurface',\n }),\n\n sxOpportunityMetaDot: {\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /** Etiqueta \"Trending\" (dorado) de las oportunidades en tendencia. */\n sxOpportunityTrending: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.25,\n fontSize: 11,\n fontWeight: 700,\n color: editorialOpportunityColors.trending,\n } as SxProps<Theme>,\n\n sxOpportunityTrendingIcon: {\n fontSize: 16,\n } as SxProps<Theme>,\n\n sxOpportunityTopicTitle: {\n mt: 0.5,\n color: 'm3.onSurface',\n fontWeight: 600,\n fontSize: 14,\n lineHeight: 1.35,\n overflowWrap: 'break-word',\n wordBreak: 'break-word',\n } as SxProps<Theme>,\n\n sxOpportunityCode: {\n mt: 0.5,\n fontSize: 11,\n fontWeight: 500,\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /** Botón punteado \"Ver N oportunidades más / Ocultar\". */\n sxOpportunityToggle: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 0.5,\n width: '100%',\n p: 1,\n bgcolor: 'transparent',\n border: '1px dashed',\n borderColor: 'm3.outlineVariant',\n borderRadius: 2.5,\n cursor: 'pointer',\n color: 'm3.onSurfaceVariant',\n fontSize: 14,\n fontFamily: fontFamilies.googleSans,\n transition: 'background-color .12s',\n '&:hover': {\n bgcolor: (theme: Theme) => alpha(theme.palette.text.primary, 0.06),\n },\n } as SxProps<Theme>,\n\n /** Pie: \"Recordar luego\" a la izquierda, \"Ver más\" a la derecha. */\n sxOpportunityFooter: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n // px 0: el footer abarca todo el ancho del contenido, igual que el botón\n // \"Ocultar\", para que los hover queden alineados a sus bordes.\n px: 0,\n } as SxProps<Theme>,\n\n sxOpportunityRemind: {\n bgcolor: 'transparent',\n border: 0,\n // Alineado al botón \"Ocultar\": sin margen lateral, la pastilla arranca en el\n // borde del contenido. Pastilla completa (radii.pill) y padding 10/15.\n py: '10px',\n px: '15px',\n borderRadius: radii.pill,\n cursor: 'pointer',\n color: 'm3.onSurfaceVariant',\n fontSize: 14,\n fontWeight: 500,\n fontFamily: fontFamilies.googleSans,\n transition: 'background-color .12s, color .12s',\n // Hover: pastilla gris neutra (state layer onSurface ~8%), texto oscuro.\n '&:hover': {\n bgcolor: (theme: Theme) => alpha(theme.palette.text.primary, 0.08),\n color: 'm3.onSurface',\n },\n } as SxProps<Theme>,\n\n sxOpportunitySeeMore: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n bgcolor: 'transparent',\n border: 0,\n // Alineado al botón \"Ocultar\": sin margen lateral, la pastilla arranca en el\n // borde del contenido. Pastilla completa (radii.pill) y padding 10/15.\n py: '10px',\n px: '15px',\n borderRadius: radii.pill,\n cursor: 'pointer',\n color: cmsColors.primary,\n fontSize: 14,\n fontWeight: 600,\n fontFamily: fontFamilies.googleSans,\n textDecoration: 'none',\n transition: 'background-color .12s, color .12s',\n // Hover/focus: pastilla azul claro (tonal `secondary`), texto azul primario\n // (#0067C4), sin subrayado.\n '&:hover, &:focus': {\n bgcolor: cmsColors.secondary,\n color: cmsColors.primary,\n textDecoration: 'none',\n },\n } as SxProps<Theme>,\n\n sxOpportunitySeeMoreIcon: {\n fontSize: 18,\n } as SxProps<Theme>,\n} as const;\n","'use client';\n\nimport type { SvgIconComponent } from '@mui/icons-material';\nimport ArrowForwardOutlinedIcon from '@mui/icons-material/ArrowForwardOutlined';\nimport AssignmentIndOutlinedIcon from '@mui/icons-material/AssignmentIndOutlined';\nimport AutoAwesomeOutlinedIcon from '@mui/icons-material/AutoAwesomeOutlined';\nimport ChevronRightOutlinedIcon from '@mui/icons-material/ChevronRightOutlined';\nimport ExpandMoreOutlinedIcon from '@mui/icons-material/ExpandMoreOutlined';\nimport MovieOutlinedIcon from '@mui/icons-material/MovieOutlined';\nimport NotificationsNoneOutlinedIcon from '@mui/icons-material/NotificationsNoneOutlined';\nimport PersonRemoveOutlinedIcon from '@mui/icons-material/PersonRemoveOutlined';\nimport ScheduleOutlinedIcon from '@mui/icons-material/ScheduleOutlined';\nimport TrendingUpOutlinedIcon from '@mui/icons-material/TrendingUpOutlined';\nimport Badge from '@mui/material/Badge';\nimport Box from '@mui/material/Box';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport Popover from '@mui/material/Popover';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { type MouseEvent, useMemo, useState } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport { toTestId } from '../../utils/toTestId';\nimport type { DashboardNotificationsResponse } from '../../services/dashboard';\nimport {\n buildNotificationsFeed,\n buildPlanningHref,\n type NotificationFeedItem,\n type NotificationFeedType,\n type NotificationTopic,\n} from './notificationsFeed';\nimport { NotificationsMenuStyles as S } from './NotificationsMenu.styles';\nimport { TopBarStyles } from './TopBar.styles';\n\nexport type NotificationsMenuProps = {\n /** Total de no leídas (badge de la campanita). */\n unreadCount: number;\n /** Respuesta cruda de `POST /dashboard/notification` (newsTask/expireTask/videos). */\n notificationsData?: DashboardNotificationsResponse | null;\n /** Dominio de `master` (Angular) para la redirección de los temas. */\n masterBaseUrl?: string;\n /** Id de la publicación activa (fallback de la redirección). */\n currentPublicationId?: number | string;\n /** Offset GMT de la publicación (para mostrar las fechas en zona de redacción). */\n gmtRedaction?: string | null;\n /**\n * Destino del \"Ver más\" / clic en una oportunidad copilot (página de\n * sugerencias). Lo arma el gestor: URL absoluta al deploy de sugerencias\n * (env) si estás en otro gestor → abre en pestaña nueva; ruta relativa si ya\n * estás en el gestor de sugerencias → navega en la misma. Sin valor, cae al callback.\n */\n copilotSuggestionsHref?: string;\n /** Clic en \"Ver más\" cuando no hay `copilotSuggestionsHref` (fallback). */\n onEditorialSeeMore?: () => void;\n /**\n * \"Recordar luego\" de la card de oportunidades: recibe los `opportunity_id` de\n * las oportunidades mostradas para que el gestor dispare `copilot/snooze` por\n * cada una. La card se oculta de inmediato (optimista).\n */\n onEditorialRemindLater?: (opportunityIds: string[]) => void;\n};\n\n/** Ícono de cada tipo de tarjeta. */\nconst TYPE_ICON: Record<NotificationFeedType, SvgIconComponent> = {\n assigned: AssignmentIndOutlinedIcon,\n pending: ScheduleOutlinedIcon,\n unassigned: PersonRemoveOutlinedIcon,\n system: MovieOutlinedIcon,\n editorialOpportunity: AutoAwesomeOutlinedIcon,\n};\n\nexport function NotificationsMenu({\n unreadCount,\n notificationsData,\n masterBaseUrl,\n currentPublicationId,\n gmtRedaction,\n copilotSuggestionsHref,\n onEditorialSeeMore,\n onEditorialRemindLater,\n}: NotificationsMenuProps) {\n const { t } = useCmsTranslation();\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n // Hora de apertura del menú: se captura en el handler (no en render) para las\n // etiquetas relativas hoy/ayer, y se recalcula el feed cuando cambia.\n const [openedAt, setOpenedAt] = useState<number | null>(null);\n // Oportunidades copilot pospuestas en esta sesión (update optimista del snooze):\n // se ocultan del feed hasta que el back deje de mandarlas en el próximo fetch.\n const [snoozedIds, setSnoozedIds] = useState<ReadonlySet<string>>(new Set());\n const open = Boolean(anchorEl);\n\n const badgeContent = unreadCount > 0 ? unreadCount : undefined;\n\n const feed = useMemo(\n () =>\n buildNotificationsFeed(notificationsData, {\n now: openedAt ?? undefined,\n gmtRedaction,\n snoozedCopilotIds: snoozedIds,\n }),\n [notificationsData, gmtRedaction, openedAt, snoozedIds],\n );\n\n const openMenu = (event: MouseEvent<HTMLElement>) => {\n setOpenedAt(Date.now());\n // Se restaura el estado en cada apertura: los acordeones arrancan cerrados y\n // el scroll vuelve arriba (el contenido se desmonta al cerrar el Popover).\n setExpanded({});\n setAnchorEl(event.currentTarget);\n };\n const close = () => setAnchorEl(null);\n const toggle = (id: string) =>\n setExpanded((prev) => ({ ...prev, [id]: !prev[id] }));\n\n /**\n * \"Recordar luego\": oculta la card al instante (optimista) y delega en el\n * gestor el snooze real (una llamada `copilot/snooze` por `opportunity_id`).\n */\n const remindOpportunitiesLater = (opportunityIds: string[]) => {\n if (opportunityIds.length) {\n setSnoozedIds((prev) => new Set([...prev, ...opportunityIds]));\n onEditorialRemindLater?.(opportunityIds);\n }\n };\n\n /**\n * \"Ver más\": si hay `copilotSuggestionsHref`, el enlace ya navega; si no,\n * dispara el callback del gestor. En ambos casos cierra el menú.\n */\n const seeMoreOpportunities = () => {\n if (!copilotSuggestionsHref) onEditorialSeeMore?.();\n close();\n };\n\n /** Etiqueta de fecha/hora de cabecera de una notificación (\"Hoy, 14:32\"). */\n const timestampLabel = (item: NotificationFeedItem): string => {\n const label = item.isToday\n ? t.notificationsMenu('today')\n : item.isYesterday\n ? t.notificationsMenu('yesterday')\n : item.date;\n if (!label) return item.time;\n return item.time ? `${label}, ${item.time}` : label;\n };\n\n return (\n <>\n <Tooltip title={t.notificationsMenu('title')}>\n <IconButton\n aria-label={t.notificationsMenu('ariaLabel')}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={openMenu}\n data-testid=\"dropdown-toggle-notifications\"\n sx={TopBarStyles.sxActionIcon}>\n <Badge\n badgeContent={badgeContent}\n color=\"error\"\n data-testid=\"badge-notifications-count\"\n sx={\n [\n TopBarStyles.sxBadge,\n ...(badgeContent ? [S.sxBadgePulse] : []),\n ] as SxProps<Theme>\n }>\n <NotificationsNoneOutlinedIcon sx={TopBarStyles.sxActionIconGlyph} />\n </Badge>\n </IconButton>\n </Tooltip>\n\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n marginThreshold={12}\n slotProps={{\n paper: {\n 'aria-label': t.notificationsMenu('title'),\n sx: S.sxPanel,\n // `data-testid` no está tipado en el slot del Paper; se agrega por\n // spread (se conserva en runtime) para el contrato QA (§10).\n ...({ 'data-testid': 'dropdown-notifications' } as object),\n },\n }}>\n {feed.length === 0 ? (\n <Box sx={S.sxEmpty}>\n <Typography variant=\"body2\">\n {t.notificationsMenu('empty')}\n </Typography>\n </Box>\n ) : (\n <Box sx={S.sxScroll} data-testid=\"list-notifications\">\n {feed.map((item, i) => (\n <Box\n key={item.id}\n data-testid={`dropdown-item-${toTestId(item.id)}`}>\n {i > 0 ? (\n <Box sx={S.sxDivider} data-testid={`divider-notification-${i}`} />\n ) : null}\n\n {timestampLabel(item) ? (\n <Typography component=\"div\" variant=\"caption\" sx={S.sxTimestamp}>\n {timestampLabel(item)}\n </Typography>\n ) : null}\n\n {item.type === 'editorialOpportunity' ? (\n <EditorialOpportunityCard\n item={item}\n open={!!expanded[item.id]}\n onToggle={() => toggle(item.id)}\n onRemindLater={remindOpportunitiesLater}\n onSeeMore={seeMoreOpportunities}\n seeMoreHref={copilotSuggestionsHref}\n t={t}\n />\n ) : item.type === 'unassigned' ? (\n <UnassignedRow item={item} t={t} />\n ) : item.type === 'system' ? (\n <SystemRow item={item} />\n ) : (\n <GroupRow\n item={item}\n open={!!expanded[item.id]}\n onToggle={() => toggle(item.id)}\n masterBaseUrl={masterBaseUrl}\n currentPublicationId={currentPublicationId}\n onNavigate={close}\n t={t}\n />\n )}\n </Box>\n ))}\n </Box>\n )}\n </Popover>\n </>\n );\n}\n\n/**\n * Card de oportunidades editoriales copilot (NAA-4837): encabezado con contador,\n * oportunidad destacada siempre visible, secundarias desplegables, botón de\n * despliegue y acciones \"Recordar luego\" / \"Ver más\".\n */\nfunction EditorialOpportunityCard({\n item,\n open,\n onToggle,\n onRemindLater,\n onSeeMore,\n seeMoreHref,\n t,\n}: {\n item: NotificationFeedItem;\n open: boolean;\n onToggle: () => void;\n onRemindLater: (opportunityIds: string[]) => void;\n onSeeMore: () => void;\n seeMoreHref?: string;\n t: ReturnType<typeof useCmsTranslation>['t'];\n}) {\n const topics = item.children ?? [];\n const [top, ...rest] = topics;\n const count = item.count ?? topics.length;\n // Absoluta (otro gestor) → pestaña nueva; relativa (mismo gestor) → misma pestaña.\n const seeMoreExternal = !!seeMoreHref && /^https?:\\/\\//i.test(seeMoreHref);\n // Props del enlace a sugerencias (oportunidad clickeable y \"Ver más\").\n const seeMoreLinkProps = seeMoreHref\n ? {\n href: seeMoreHref,\n onClick: onSeeMore,\n ...(seeMoreExternal ? { target: '_blank', rel: 'noopener noreferrer' } : {}),\n }\n : {};\n // \"Recordar luego\" pospone TODAS las oportunidades mostradas (una llamada al\n // snooze por cada opportunity_id) y oculta la card.\n const remindLater = () =>\n onRemindLater(\n topics.map((topic) => topic.id).filter((id): id is string => !!id),\n );\n\n return (\n <Box sx={S.sxOpportunityCard}>\n {/* Encabezado clickeable: icono + label con contador + título + chevron */}\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onToggle}\n data-testid=\"toggle-opportunity-card\"\n sx={S.sxOpportunityHeader}>\n <Box sx={S.sxOpportunityAvatar}>\n <AutoAwesomeOutlinedIcon />\n {item.unread ? <Box component=\"span\" sx={S.sxUnreadDot} /> : null}\n </Box>\n <Box sx={{ minWidth: 0 }}>\n <Box sx={S.sxOpportunityLabel}>\n <Typography component=\"span\" variant=\"caption\" sx={S.sxOpportunityLabelText}>\n {t.notificationsMenu('editorialOpportunityLabel')}\n </Typography>\n <Box component=\"span\" sx={S.sxOpportunityCount}>\n {count}\n </Box>\n </Box>\n <Typography component=\"span\" variant=\"body2\" sx={S.sxOpportunityHeaderTitle}>\n {t.notificationsMenu('editorialOpportunityText', { count })}\n </Typography>\n </Box>\n <ExpandMoreOutlinedIcon sx={S.sxChevron(open)} />\n </Box>\n\n {/* Oportunidad destacada: siempre visible (clickeable → gestor de sugerencias) */}\n {top ? (\n <Box\n component={seeMoreHref ? 'a' : 'div'}\n {...seeMoreLinkProps}\n data-testid={`link-opportunity-${toTestId(top.id || top.code || 'top')}`}\n sx={S.sxOpportunityTopic(!!top.unread, !!seeMoreHref)}>\n <Typography component=\"div\" variant=\"caption\" sx={S.sxOpportunityMeta(!!top.unread)}>\n <Box component=\"span\" sx={S.sxOpportunityTrending}>\n <TrendingUpOutlinedIcon sx={S.sxOpportunityTrendingIcon} />\n {t.notificationsMenu('editorialOpportunityTop')}\n </Box>\n <span>\n · {top.matchPercent}% {t.notificationsMenu('editorialOpportunityMatch')}\n </span>\n </Typography>\n <Box sx={S.sxOpportunityTopicTitle}>{top.title}</Box>\n {top.topic ? <Box sx={S.sxOpportunityCode}>{top.topic}</Box> : null}\n </Box>\n ) : null}\n\n {/* Oportunidades secundarias: visibles al desplegar */}\n <Collapse in={open} unmountOnExit>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n {rest.map((topic, i) => (\n <Box\n key={`${item.id}-${i + 1}`}\n component={seeMoreHref ? 'a' : 'div'}\n {...seeMoreLinkProps}\n data-testid={`link-opportunity-${toTestId(topic.id || topic.code || String(i + 1))}`}\n sx={S.sxOpportunityTopic(!!topic.unread, !!seeMoreHref)}>\n <Typography component=\"div\" variant=\"caption\" sx={S.sxOpportunityMeta(!!topic.unread)}>\n <span>\n {topic.matchPercent}% {t.notificationsMenu('editorialOpportunityMatch')}\n </span>\n </Typography>\n <Box sx={S.sxOpportunityTopicTitle}>{topic.title}</Box>\n {topic.topic ? <Box sx={S.sxOpportunityCode}>{topic.topic}</Box> : null}\n </Box>\n ))}\n </Box>\n </Collapse>\n\n {/* Botón punteado: ver N oportunidades más / ocultar */}\n {topics.length > 1 ? (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onToggle}\n data-testid=\"toggle-opportunity-topics\"\n sx={S.sxOpportunityToggle}>\n {open\n ? t.notificationsMenu('editorialOpportunityHide')\n : t.notificationsMenu('editorialOpportunitySeeMoreOpportunities', {\n count: topics.length - 1,\n })}\n <ExpandMoreOutlinedIcon sx={S.sxChevron(open)} />\n </Box>\n ) : null}\n\n {/* Acciones: recordar luego (snooze) y ver más (sugerencias copilot) */}\n <Box sx={S.sxOpportunityFooter}>\n <Box\n component=\"button\"\n type=\"button\"\n onClick={remindLater}\n data-testid=\"btn-opportunity-remind-later\"\n sx={S.sxOpportunityRemind}>\n {t.notificationsMenu('editorialOpportunityRemindLater')}\n </Box>\n <Box\n component={seeMoreHref ? 'a' : 'button'}\n {...(seeMoreHref\n ? {\n href: seeMoreHref,\n onClick: onSeeMore,\n ...(seeMoreExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {}),\n }\n : { type: 'button', onClick: onSeeMore })}\n data-testid=\"btn-opportunity-see-more\"\n sx={S.sxOpportunitySeeMore}>\n {t.notificationsMenu('editorialOpportunitySeeMore')}\n <ArrowForwardOutlinedIcon sx={S.sxOpportunitySeeMoreIcon} />\n </Box>\n </Box>\n </Box>\n );\n}\n\n/** Notificación del sistema (video): icono verde + texto con formatos resaltados. */\nfunction SystemRow({ item }: { item: NotificationFeedItem }) {\n const hasStructured =\n item.userFullName || item.userLogin || item.preTextHtml || item.pathPart || item.postTextHtml;\n return (\n <Box sx={S.sxRow(false)}>\n <Box sx={S.sxAvatar('system')}>\n <MovieOutlinedIcon />\n {item.unread ? <Box component=\"span\" sx={S.sxUnreadDot} /> : null}\n </Box>\n <Typography component=\"div\" variant=\"body2\" sx={S.sxBody}>\n {hasStructured ? (\n <>\n {item.userFullName ? <b>{item.userFullName}</b> : null}\n {item.userLogin ? (\n <Box component=\"span\" sx={S.sxUserLogin}>\n {' '}\n {item.userLogin}\n </Box>\n ) : null}\n {(item.userFullName || item.userLogin) &&\n (item.preTextHtml || item.pathPart || item.postTextHtml) ? (\n <span> — </span>\n ) : null}\n {item.preTextHtml ? (\n <Box component=\"span\" dangerouslySetInnerHTML={{ __html: item.preTextHtml }} />\n ) : null}\n {item.pathPart ? (\n <Box component=\"span\" sx={S.sxPathChip}>\n {item.pathPart}\n </Box>\n ) : null}\n {item.postTextHtml ? (\n <Box component=\"span\" dangerouslySetInnerHTML={{ __html: item.postTextHtml }} />\n ) : null}\n </>\n ) : (\n <Box component=\"span\" dangerouslySetInnerHTML={{ __html: item.detailHtml ?? '' }} />\n )}\n </Typography>\n </Box>\n );\n}\n\n/**\n * Aviso de desasignación de tarea de planning (`person_remove`). Informativo:\n * no navega. Con autor muestra \"{autor} (login) te quitó de la tarea «título».\n * Ya no eres el responsable.\"; sin autor cae al texto genérico. Replica la card\n * `--unassigned` del dropdown del CMS Angular.\n */\nfunction UnassignedRow({\n item,\n t,\n}: {\n item: NotificationFeedItem;\n t: ReturnType<typeof useCmsTranslation>['t'];\n}) {\n const hasAuthor = !!(item.userFullName || item.userLogin);\n return (\n <Box sx={S.sxRow(false)}>\n <Box sx={S.sxAvatar('unassigned')}>\n <PersonRemoveOutlinedIcon />\n {item.unread ? <Box component=\"span\" sx={S.sxUnreadDot} /> : null}\n </Box>\n <Typography\n component=\"div\"\n variant=\"body2\"\n sx={S.sxBody}\n data-testid={`text-unassigned-${toTestId(item.id)}`}>\n {hasAuthor ? (\n <>\n {item.userFullName ? <b>{item.userFullName}</b> : null}\n {item.userLogin ? (\n <Box component=\"span\" sx={S.sxUserLogin}>\n {' ('}\n {item.userLogin}\n {')'}\n </Box>\n ) : null}\n {' '}\n {t.notificationsMenu('unassignedRemovedYouFrom')}\n {' «'}\n <b>{item.title}</b>\n {'». '}\n {t.notificationsMenu('unassignedNoLongerResponsible')}\n </>\n ) : (\n <>\n {t.notificationsMenu('unassignedText')}\n {' «'}\n <b>{item.title}</b>\n {'»'}\n </>\n )}\n </Typography>\n </Box>\n );\n}\n\n/** Tarjeta agrupada (temas asignados / por vencer) con acordeón de temas. */\nfunction GroupRow({\n item,\n open,\n onToggle,\n masterBaseUrl,\n currentPublicationId,\n onNavigate,\n t,\n}: {\n item: NotificationFeedItem;\n open: boolean;\n onToggle: () => void;\n masterBaseUrl?: string;\n currentPublicationId?: number | string;\n onNavigate: () => void;\n t: ReturnType<typeof useCmsTranslation>['t'];\n}) {\n const Icon = TYPE_ICON[item.type];\n const before =\n item.type === 'assigned'\n ? t.notificationsMenu('assignedBefore')\n : t.notificationsMenu('pendingBefore');\n const after =\n item.type === 'assigned'\n ? t.notificationsMenu('assignedAfter')\n : t.notificationsMenu('pendingAfter');\n\n return (\n <>\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onToggle}\n data-testid={`toggle-notification-group-${toTestId(item.type)}`}\n data-action={item.type}\n sx={S.sxRow(true)}>\n <Box sx={S.sxAvatar(item.type)}>\n <Icon />\n {item.unread ? <Box component=\"span\" sx={S.sxUnreadDot} /> : null}\n </Box>\n <Typography component=\"div\" variant=\"body2\" sx={S.sxBody}>\n {before} <b>{item.count}</b> {after}\n {item.expirationDatetime ? (\n <Typography component=\"span\" variant=\"caption\" sx={S.sxSubtitle}>\n {item.expirationDatetime}\n </Typography>\n ) : null}\n </Typography>\n <ExpandMoreOutlinedIcon sx={S.sxChevron(open)} />\n </Box>\n\n <Collapse in={open} unmountOnExit>\n <Box sx={S.sxTopics}>\n {(item.children ?? []).map((topic, i) => (\n <TopicRow\n key={`${item.id}-${i}`}\n topic={topic}\n type={item.type}\n masterBaseUrl={masterBaseUrl}\n currentPublicationId={currentPublicationId}\n onNavigate={onNavigate}\n t={t}\n />\n ))}\n </Box>\n </Collapse>\n </>\n );\n}\n\n/** Tema individual navegable: redirige al planning en `master`. */\nfunction TopicRow({\n topic,\n type,\n masterBaseUrl,\n currentPublicationId,\n onNavigate,\n t,\n}: {\n topic: NotificationTopic;\n type: NotificationFeedType;\n masterBaseUrl?: string;\n currentPublicationId?: number | string;\n onNavigate: () => void;\n t: ReturnType<typeof useCmsTranslation>['t'];\n}) {\n const href = buildPlanningHref(topic, masterBaseUrl, currentPublicationId);\n\n const assignedLabel = topic.assignedToday\n ? t.notificationsMenu('assignedToday')\n : topic.assignedYesterday\n ? t.notificationsMenu('assignedYesterday')\n : `${t.notificationsMenu('assignedOn')} ${topic.assignedDate ?? ''}`;\n\n return (\n <Box\n component={href ? 'a' : 'div'}\n href={href}\n target={href ? '_blank' : undefined}\n rel={href ? 'noopener noreferrer' : undefined}\n onClick={href ? onNavigate : undefined}\n data-testid={`link-topic-${toTestId(topic.code)}`}\n sx={S.sxTopicRow}>\n <Box sx={{ minWidth: 0 }}>\n <Typography component=\"span\" variant=\"body2\" sx={S.sxTopicTitle}>\n {topic.title}\n </Typography>\n <Typography component=\"span\" variant=\"caption\" sx={S.sxTopicMeta}>\n <span>{topic.code}</span>\n <Box component=\"span\" sx={S.sxMetaDot} />\n {type === 'pending' ? (\n <Box component=\"span\" sx={S.sxDue}>\n {t.notificationsMenu('expires')} {topic.dueDate} · {topic.dueTime}\n </Box>\n ) : (\n <span>{assignedLabel}</span>\n )}\n </Typography>\n </Box>\n <ChevronRightOutlinedIcon sx={S.sxTopicChevron} />\n </Box>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii, shadows } from '../../theme/variables';\n\nexport const SimpleDropdownStyles = {\n sxTriggerWrap: {\n display: 'inline-flex',\n } as SxProps<Theme>,\n\n /**\n * Disparador por defecto (botón de ícono, p. ej. `more_vert`).\n * En reposo el ícono es gris; en hover/activo el fondo es `iconButtonHoverBg`\n * y el ícono pasa a `controlText` (#000).\n */\n sxIconTrigger: (open: boolean): SxProps<Theme> => ({\n borderRadius: '30px',\n color: open ? cmsColors.controlText : cmsColors.iconButtonIcon,\n bgcolor: open ? cmsColors.iconButtonHoverBg : 'transparent',\n '& .MuiSvgIcon-root': { fontSize: 22 },\n '&:hover': {\n bgcolor: cmsColors.iconButtonHoverBg,\n color: cmsColors.controlText,\n },\n }),\n\n sxMenuPaper: (\n minWidth: number | string,\n upward = false,\n ): SxProps<Theme> => ({\n // Separación con el disparador. MUI ancla el panel por `top` (medido con\n // offsetHeight, sin contar margen), así que el hueco SIEMPRE se controla con\n // `margin-top`: hacia abajo, +8px (`mt: 1`); hacia arriba, subiéndolo con\n // margen negativo (`mt: -5px`). `margin-bottom` no movería un panel anclado\n // por `top` (por eso antes quedaba pegado).\n ...(upward ? { mt: '-5px' } : { mt: 1 }),\n // Menú M3: sin padding lateral (los ítems llegan de borde a borde) y con\n // 8px arriba/abajo. `overflow: hidden` recorta las esquinas del hover.\n py: '8px',\n px: 0,\n minWidth,\n borderRadius: radii.lg,\n bgcolor: cmsColors.menuSurface,\n border: 'none',\n boxShadow: shadows.menuDropdown,\n overflow: 'hidden',\n }),\n\n sxList: {\n p: 0,\n display: 'flex',\n flexDirection: 'column',\n } as SxProps<Theme>,\n\n sxGrid: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '2px',\n } as SxProps<Theme>,\n\n sxItem: (selected: boolean): SxProps<Theme> => ({\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n px: '16px',\n py: '10px',\n // Full-bleed (sin radio): el hover llega de borde a borde (M3 por defecto).\n borderRadius: 0,\n color: cmsColors.textStrong,\n whiteSpace: 'normal',\n bgcolor: selected ? cmsColors.menuItemActive : 'transparent',\n // Hover: state layer M3 `onSurface` al 8% (#191C20).\n '&:hover': {\n bgcolor: cmsColors.neutralHover,\n },\n // Opción activa: fondo `menuItemActive` (#E1E2EB).\n '&.Mui-selected': {\n bgcolor: cmsColors.menuItemActive,\n '&:hover': { bgcolor: cmsColors.menuItemActive },\n },\n }),\n\n sxIcon: {\n minWidth: 0,\n mt: '2px',\n color: 'm3.onSurfaceVariant',\n display: 'inline-flex',\n '& .MuiSvgIcon-root': { fontSize: 20 },\n } as SxProps<Theme>,\n\n sxItemText: {\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n } as SxProps<Theme>,\n\n sxLabel: (hasDescription: boolean): SxProps<Theme> => ({\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: hasDescription ? 600 : 500,\n lineHeight: '20px',\n color: cmsColors.textStrong,\n }),\n\n sxDescription: {\n fontSize: 12,\n fontWeight: 400,\n lineHeight: '16px',\n color: 'm3.onSurfaceVariant',\n mt: '2px',\n } as SxProps<Theme>,\n\n sxSubItem: {\n pl: '44px',\n py: '8px',\n fontSize: 13,\n color: 'm3.onSurface',\n borderRadius: 0,\n '&:hover': {\n bgcolor: cmsColors.neutralHover,\n },\n } as SxProps<Theme>,\n\n sxFooter: {\n px: '12px',\n py: 1,\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport MoreVertIcon from '@mui/icons-material/MoreVert';\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Typography from '@mui/material/Typography';\nimport { Fragment, useMemo, useState } from 'react';\nimport type { MouseEvent, ReactNode } from 'react';\n\nimport { SimpleDropdownStyles } from './SimpleDropdown.styles';\nimport type { DropdownOption } from './types';\n\ntype MenuOrigin = {\n vertical: 'top' | 'center' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n};\n\nexport type SimpleDropdownProps = {\n /** Ítems del menú. */\n options: DropdownOption[];\n /**\n * Disparador del menú. Puede ser un nodo o una función que recibe el estado\n * de apertura (útil para cambiar el ícono). Solo se usa en modo no controlado.\n * Si no se pasa, se usa un botón de ícono por defecto (`triggerIcon`).\n */\n trigger?: ReactNode | ((state: { open: boolean }) => ReactNode);\n /**\n * Ícono del disparador por defecto (cuando no se pasa `trigger`).\n * Por defecto `more_vert`. El disparador del SimpleDropdown es siempre un ícono.\n */\n triggerIcon?: ReactNode;\n /** Número de columnas del menú. Por defecto `1`. */\n columns?: 1 | 2;\n /** Contenido extra al pie del menú (p. ej. un toggle). */\n footer?: ReactNode;\n /** Ancho mínimo del panel. Por defecto `220`. */\n minWidth?: number | string;\n anchorOrigin?: MenuOrigin;\n transformOrigin?: MenuOrigin;\n /** Cierra el menú al hacer clic en un ítem. Por defecto `true`. */\n closeOnSelect?: boolean;\n /** Modo controlado: elemento ancla del menú. */\n anchorEl?: HTMLElement | null;\n /** Modo controlado: si el menú está abierto. */\n open?: boolean;\n /** Modo controlado: callback de cierre. */\n onClose?: () => void;\n /** Valor para `data-testid` del panel. */\n testId?: string;\n};\n\n/**\n * Menú desplegable genérico y presentacional. Renderiza una lista de opciones\n * recibidas por props y ejecuta el `onClick` de cada una. Soporta una o dos\n * columnas, sub-ítems expandibles, separadores y un pie de menú opcional.\n *\n * Funciona en dos modos:\n * - No controlado: se le pasa `trigger` y gestiona su propio estado de apertura.\n * - Controlado: se le pasan `open`, `anchorEl` y `onClose` (p. ej. desde\n * `BtnDropdown`).\n */\nexport function SimpleDropdown({\n options,\n trigger,\n triggerIcon,\n columns = 1,\n footer,\n minWidth = 220,\n anchorOrigin = { vertical: 'bottom', horizontal: 'right' },\n transformOrigin = { vertical: 'top', horizontal: 'right' },\n closeOnSelect = true,\n anchorEl: controlledAnchorEl,\n open: controlledOpen,\n onClose,\n testId,\n}: SimpleDropdownProps) {\n const isControlled = controlledOpen !== undefined;\n const [internalAnchor, setInternalAnchor] = useState<HTMLElement | null>(\n null,\n );\n const [expandedKey, setExpandedKey] = useState<string | null>(null);\n\n const anchorEl = isControlled ? controlledAnchorEl ?? null : internalAnchor;\n const open = isControlled ? Boolean(controlledOpen) : Boolean(internalAnchor);\n\n /**\n * Cierra el menú según el modo (controlado o no) y limpia la expansión.\n * @returns void\n */\n const handleClose = () => {\n if (isControlled) onClose?.();\n else setInternalAnchor(null);\n setExpandedKey(null);\n };\n\n /**\n * Abre el menú anclándolo al disparador (solo en modo no controlado).\n * @param event - Evento de clic sobre el disparador.\n * @returns void\n */\n const handleTriggerClick = (event: MouseEvent<HTMLElement>) => {\n setInternalAnchor(event.currentTarget);\n };\n\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n\n /**\n * Maneja el clic sobre un ítem: expande sub-ítems o ejecuta su acción.\n * @param option - Ítem clickeado.\n * @param key - Clave única del ítem.\n * @returns void\n */\n const handleItemClick = (option: DropdownOption, key: string) => {\n if (option.disabled) return;\n if (option.subItems?.length) {\n setExpandedKey((current) => (current === key ? null : key));\n return;\n }\n option.onClick?.(option);\n if (closeOnSelect) handleClose();\n };\n\n /**\n * Renderiza un ítem del menú (con su ícono, sub-ítems y separador superior).\n * @param option - Ítem a renderizar.\n * @param index - Posición del ítem en la lista visible.\n * @returns Nodo del ítem.\n */\n const renderOption = (option: DropdownOption, index: number) => {\n const key = option.id ?? String(index);\n const isExpanded = expandedKey === key;\n\n return (\n <Fragment key={key}>\n {option.hasTopLine ? <Divider sx={{ my: 0.5 }} /> : null}\n <MenuItem\n disabled={option.disabled}\n selected={option.selected}\n onClick={() => handleItemClick(option, key)}\n data-testid={option.testId}\n sx={SimpleDropdownStyles.sxItem(Boolean(option.selected))}>\n {option.icon ? (\n <ListItemIcon sx={SimpleDropdownStyles.sxIcon}>\n {option.icon}\n </ListItemIcon>\n ) : null}\n <Box sx={SimpleDropdownStyles.sxItemText}>\n <Typography\n component=\"span\"\n sx={SimpleDropdownStyles.sxLabel(Boolean(option.description))}>\n {option.label}\n </Typography>\n {option.description ? (\n <Typography\n component=\"span\"\n sx={SimpleDropdownStyles.sxDescription}>\n {option.description}\n </Typography>\n ) : null}\n </Box>\n </MenuItem>\n {isExpanded\n ? option.subItems\n ?.filter((subItem) => subItem.show !== false)\n .map((subItem, subIndex) => (\n <MenuItem\n key={`${key}-${subItem.id ?? subIndex}`}\n disabled={subItem.disabled}\n data-testid={subItem.testId}\n onClick={() => {\n if (subItem.disabled) return;\n subItem.onClick?.(subItem);\n if (closeOnSelect) handleClose();\n }}\n sx={SimpleDropdownStyles.sxSubItem}>\n {subItem.label}\n </MenuItem>\n ))\n : null}\n </Fragment>\n );\n };\n\n const defaultTrigger = (\n <IconButton\n aria-haspopup=\"true\"\n sx={SimpleDropdownStyles.sxIconTrigger(open)}>\n {triggerIcon ?? <MoreVertIcon />}\n </IconButton>\n );\n const renderedTrigger =\n typeof trigger === 'function'\n ? trigger({ open })\n : (trigger ?? defaultTrigger);\n\n return (\n <>\n {!isControlled && renderedTrigger ? (\n <Box\n component=\"span\"\n onClick={handleTriggerClick}\n sx={SimpleDropdownStyles.sxTriggerWrap}>\n {renderedTrigger}\n </Box>\n ) : null}\n\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n slotProps={{\n paper: {\n sx: SimpleDropdownStyles.sxMenuPaper(\n minWidth,\n transformOrigin.vertical === 'bottom',\n ),\n },\n list: {\n sx: SimpleDropdownStyles.sxList,\n // MUI no tipa atributos data-* en el slot list; cast puntual.\n ...(testId ? ({ 'data-testid': testId } as object) : {}),\n },\n }}>\n {columns === 2 ? (\n <Box sx={SimpleDropdownStyles.sxGrid}>\n {visibleOptions.map((option, index) => renderOption(option, index))}\n </Box>\n ) : (\n visibleOptions.map((option, index) => renderOption(option, index))\n )}\n {footer ? <Divider sx={{ my: 0.5 }} /> : null}\n {footer ? <Box sx={SimpleDropdownStyles.sxFooter}>{footer}</Box> : null}\n </Menu>\n </>\n );\n}\n","import type { PreviewMenuMessageKey } from '../../i18n';\n\n/**\n * Formato de previsualización (Desktop / Mobile / Tablet…). En el CMS legacy la\n * lista es dinámica (`POST /news/previewFormats`); acá se reciben por props.\n */\nexport type PreviewFormat = {\n /** Identificador estable; lo recibe `onSelect` al hacer clic. */\n id: string;\n /** Clave i18n del namespace `previewMenu` (cuando el texto es conocido). */\n labelKey?: PreviewMenuMessageKey;\n /** Texto ya resuelto (cuando el nombre viene dinámico del backend). */\n label?: string;\n /**\n * Ruta de preview de la publicación (campo `r` del form), p. ej.\n * `/sites/<sitio>/index.html`. Viene de `POST /news/previewFormats`. Si está\n * presente (con sesión), el clic redirige al admin viejo; si no, usa `onSelect`.\n */\n path?: string;\n /** QueryString del dispositivo (de `POST /news/previewFormats`). */\n queryString?: string;\n /** Protocolo del preview (`'https'` por defecto). */\n protocol?: string;\n};\n\n/**\n * Formatos por defecto con la ruta EXACTA de cmsmedios. El redirect (form POST\n * al CMS, como Ayuda) arma el campo `r` con `submitLegacyAdminPage`:\n * - Desktop → `r = /index.html`\n * - Mobile → `r = /preview/mobile.html?path=/index.html`\n * - Tablet → `r = /preview/tablet.html?path=/index.html`\n *\n * `path` es la ruta de la publicación (`/index.html` para la principal). El\n * `queryString` del device, al contener `/`, dispara la rama \"redirect\" de\n * cmsmedios (`<queryString>?path=<path>`). El gestor puede sobrescribir estos\n * formatos con los de `POST /news/previewFormats` por publicación.\n */\nexport const DEFAULT_PREVIEW_FORMATS: PreviewFormat[] = [\n { id: 'desktop', labelKey: 'desktop', path: '/index.html' },\n {\n id: 'mobile',\n labelKey: 'mobile',\n path: '/index.html',\n queryString: '/preview/mobile.html',\n },\n {\n id: 'tablet',\n labelKey: 'tablet',\n path: '/index.html',\n queryString: '/preview/tablet.html',\n },\n];\n","'use client';\n\nimport DevicesOtherOutlinedIcon from '@mui/icons-material/DevicesOtherOutlined';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useMemo } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport {\n submitLegacyAdminPage,\n type LegacyAdminSession,\n} from '../../utils/legacy-admin';\nimport { SimpleDropdown } from '../dropdowns/SimpleDropdown';\nimport type { DropdownOption } from '../dropdowns/types';\nimport {\n DEFAULT_PREVIEW_FORMATS,\n type PreviewFormat,\n} from './previewMenu.config';\nimport { TopBarStyles } from './TopBar.styles';\n\nexport type PreviewMenuProps = {\n /** Formatos de preview. Por defecto, Desktop / Mobile / Tablet. */\n formats?: PreviewFormat[];\n /** Origen del CMS (JSP) para el redirect al admin viejo. */\n cmsBaseUrl?: string;\n /** Sesión para el form POST del redirect (token, sitio, etc.). */\n legacySession?: LegacyAdminSession;\n /**\n * Punto de integración: se invoca con el `id` del formato cuando no se puede\n * redirigir directo (falta `path`/sesión). El gestor arma la URL y redirige.\n */\n onSelect?: (formatId: string) => void;\n};\n\n/**\n * Menú desplegable del botón de previsualización (icono de dispositivos) del\n * header. Usa el `SimpleDropdown` de la lib. Igual que en cmsmedios, solo se\n * renderiza si hay al menos un formato disponible.\n */\nexport function PreviewMenu({\n formats = DEFAULT_PREVIEW_FORMATS,\n cmsBaseUrl,\n legacySession,\n onSelect,\n}: PreviewMenuProps) {\n const { t } = useCmsTranslation();\n const title = t.topBar('preview');\n\n const options = useMemo<DropdownOption[]>(\n () =>\n formats.map((format) => ({\n id: format.id,\n label: format.labelKey ? t.previewMenu(format.labelKey) : format.label,\n testId: `dropdown-item-preview-${format.id}`,\n onClick: () => {\n // Con sesión y la ruta del formato, redirige al CMS con el form POST\n // (igual que Ayuda). `submitLegacyAdminPage` arma el `r` exacto de\n // cmsmedios: con queryString que contiene `/` → `<qs>?path=<path>`.\n if (cmsBaseUrl && legacySession && format.path) {\n submitLegacyAdminPage({\n cmsBaseUrl,\n path: format.path,\n session: legacySession,\n device: {\n protocol: format.protocol,\n queryString: format.queryString,\n },\n });\n return;\n }\n onSelect?.(format.id);\n },\n })),\n [formats, cmsBaseUrl, legacySession, onSelect, t],\n );\n\n if (formats.length === 0) return null;\n\n return (\n <SimpleDropdown\n options={options}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n testId=\"dropdown-menu-preview\"\n trigger={({ open }) => (\n <Tooltip title={title}>\n <IconButton\n aria-label={title}\n aria-haspopup=\"true\"\n aria-expanded={open}\n data-testid=\"dropdown-toggle-preview\"\n sx={TopBarStyles.sxActionIcon}>\n <DevicesOtherOutlinedIcon sx={TopBarStyles.sxActionIconGlyph} />\n </IconButton>\n </Tooltip>\n )}\n />\n );\n}\n","const DEFAULT_CMS_ORIGIN = 'https://dev.cms-medios.com';\n\nexport function resolveCmsOrigin(cmsOrigin?: string): string {\n const base = cmsOrigin?.trim();\n if (!base) return DEFAULT_CMS_ORIGIN;\n return base.replace(/\\/$/, '');\n}\n\nexport function resolveCmsAssetUrl(path: string, cmsOrigin?: string): string {\n if (!path) return '';\n if (path.startsWith('http://') || path.startsWith('https://')) return path;\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return `${resolveCmsOrigin(cmsOrigin)}${normalized}`;\n}\n","import { resolveCmsAssetUrl } from './cms-asset';\nimport type { ProfileGetResponse } from '../types/profile';\n\nconst NO_PICTURE = 'noPicture';\nconst DEFAULT_FALLBACK_AVATAR = '/topbar_profile.png';\n\nexport type ProfileAvatarOptions = {\n cmsOrigin?: string;\n fallbackAvatar?: string;\n};\n\nexport function getProfileAvatarSrc(\n profile: ProfileGetResponse,\n options?: ProfileAvatarOptions,\n): string {\n const { image } = profile;\n const fallback = options?.fallbackAvatar ?? DEFAULT_FALLBACK_AVATAR;\n if (!image || image === NO_PICTURE) return fallback;\n return resolveCmsAssetUrl(image, options?.cmsOrigin);\n}\n\nexport function getProfileDisplayName(profile: ProfileGetResponse): string {\n if (profile.fullName?.trim()) return profile.fullName.trim();\n const parts = [profile.firstName, profile.lastName].filter(Boolean);\n if (parts.length > 0) return parts.join(' ');\n return profile.userName;\n}\n\n/**\n * Nombre y apellido del usuario, SIN el nickname/login. Para el título del\n * desplegable de perfil, donde no debe aparecer el nickname (a diferencia de\n * `getProfileDisplayName`, que puede caer en `fullName` —que incluye el\n * nickname— o en `userName`). Solo cae a `userName` si no hay nombre ni apellido.\n */\nexport function getProfileFullName(profile: ProfileGetResponse): string {\n const parts = [profile.firstName, profile.lastName].filter(Boolean);\n if (parts.length > 0) return parts.join(' ');\n return profile.userName;\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors } from '../../theme/variables';\n\n/** Proporción del ícono fallback respecto al diámetro del avatar (≈ 16/27). */\nconst ICON_RATIO = 0.58;\n\nexport const UserAvatarStyles = {\n /**\n * Avatar circular. Cuando no hay foto, el fondo secundario y el ícono\n * `PersonOutlined` quedan visibles (mismo look que la tabla del gestor).\n * Si `inactive`, cae a un gris apagado (usuario desactivado).\n */\n sxAvatar: (\n size: number,\n clickable: boolean,\n inactive: boolean,\n neutralFallback = false,\n transparentFallbackBg = false,\n ): SxProps<Theme> => ({\n width: size,\n height: size,\n bgcolor: inactive\n ? cmsColors.avatarInactiveBg\n : neutralFallback\n ? // El disparador del header no pinta fondo en reposo: lo hace el botón\n // contenedor al hover (ver `sxProfileButton`).\n transparentFallbackBg\n ? 'transparent'\n : 'm3.surfaceVariant'\n : cmsColors.secondary,\n color: inactive\n ? cmsColors.avatarInactiveIcon\n : neutralFallback\n ? 'm3.onSurfaceVariant'\n : cmsColors.onSecondaryContainer,\n cursor: clickable ? 'pointer' : 'default',\n }),\n\n /** Ícono fallback (persona) escalado al tamaño del avatar. */\n sxIcon: (\n size: number,\n inactive: boolean,\n neutralFallback = false,\n ): SxProps<Theme> => ({\n fontSize: Math.round(size * ICON_RATIO),\n color: inactive\n ? cmsColors.avatarInactiveIcon\n : neutralFallback\n ? 'm3.onSurfaceVariant'\n : cmsColors.onSecondaryContainer,\n }),\n\n /** Superficie oscura del tooltip del avatar (fondo + flecha + texto claro). */\n sxTooltip: {\n bgcolor: cmsColors.tooltipSurface,\n color: cmsColors.white,\n '& .MuiTooltip-arrow': {\n color: cmsColors.tooltipSurface,\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport { createContext, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\n/**\n * Estado compartido de la foto del usuario logueado.\n *\n * Es el equivalente React del `updateImageProfile` (BehaviorSubject) del CMS\n * Angular legacy: cuando el usuario cambia su foto de perfil, la pantalla de\n * edición llama a `setPhoto(...)` y todos los avatares marcados como\n * `isCurrentUser` se actualizan al instante, sin recargar ni hacer\n * prop-drilling.\n */\nexport interface CurrentUserPhotoContextValue {\n /** Foto actual del usuario logueado: ruta/URL, '' o 'noPicture'. `null` = sin valor todavía. */\n photo: string | null;\n /** Notifica una foto nueva (o '' / 'noPicture' al borrarla). */\n setPhoto: (photo: string | null) => void;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CurrentUserPhotoContext =\n createContext<CurrentUserPhotoContextValue | null>(null);\n\nexport interface CurrentUserPhotoProviderProps {\n /** Foto inicial del usuario logueado (p. ej. `profile.image`). */\n initialPhoto?: string | null;\n children: ReactNode;\n}\n\n/**\n * Provider de la foto del usuario logueado. Montarlo por encima de los avatares\n * que representan al usuario actual (típicamente en el `AppShell` o el layout de\n * la cuenta), sembrado con `profile.image`.\n */\nexport function CurrentUserPhotoProvider({\n initialPhoto = null,\n children,\n}: CurrentUserPhotoProviderProps) {\n const [photo, setPhoto] = useState<string | null>(initialPhoto);\n // Si el perfil se recarga del servidor con otra foto, resincronizamos el\n // estado ajustándolo en render (patrón recomendado por React, sin useEffect).\n const [seed, setSeed] = useState<string | null>(initialPhoto);\n if (seed !== initialPhoto) {\n setSeed(initialPhoto);\n setPhoto(initialPhoto);\n }\n\n const value = useMemo<CurrentUserPhotoContextValue>(\n () => ({ photo, setPhoto }),\n [photo],\n );\n\n return (\n <CurrentUserPhotoContext.Provider value={value}>\n {children}\n </CurrentUserPhotoContext.Provider>\n );\n}\n","'use client';\n\nimport { useContext } from 'react';\n\nimport {\n CurrentUserPhotoContext,\n type CurrentUserPhotoContextValue,\n} from './CurrentUserPhotoProvider';\n\n/**\n * Acceso al estado compartido de la foto del usuario logueado.\n *\n * Devuelve `null` si no hay provider montado: así `UserAvatar` y la pantalla de\n * perfil funcionan también sin el provider (caso tabla de usuarios, donde cada\n * avatar es otro usuario y no necesita actualización en vivo).\n */\nexport function useCurrentUserPhoto(): CurrentUserPhotoContextValue | null {\n return useContext(CurrentUserPhotoContext);\n}\n","'use client';\n\nimport PersonOutlinedIcon from '@mui/icons-material/PersonOutlined';\nimport Avatar from '@mui/material/Avatar';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useMemo } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport { resolveCmsAssetUrl } from '../../utils/cms-asset';\nimport { UserAvatarStyles } from './UserAvatar.styles';\nimport { useCurrentUserPhoto } from './useCurrentUserPhoto';\n\n/** Valor que el backend usa para \"sin foto\" (igual que en cmsmedios). */\nconst NO_PICTURE = 'noPicture';\n\nexport type UserAvatarProps = {\n /**\n * Foto del usuario: ruta relativa, URL absoluta, `''` o `'noPicture'`\n * (misma forma que el campo `photo` en cmsmedios). Si falta o es `'noPicture'`,\n * se muestra el ícono de persona sobre fondo secundario.\n */\n photo?: string | null;\n /** Nombre legible del usuario (campo `description` en cmsmedios). Tooltip + alt. */\n description?: string;\n /** Login del usuario (campo `username`). Fallback del nombre. */\n username?: string;\n /** Diámetro del avatar en px. Por defecto 32. */\n size?: number;\n /** Muestra el tooltip con el nombre al pasar el mouse. Por defecto `true`. */\n showTooltip?: boolean;\n /**\n * Marca al usuario como inactivo/desactivado: el avatar cae a un gris apagado\n * (fondo y ícono más grises). Por defecto `false`.\n */\n inactive?: boolean;\n /**\n * Usa el fallback neutro (fondo `m3.surfaceVariant` #E0E2EC + ícono\n * `m3.onSurfaceVariant` #43474E) en vez del azul tonal. Para el avatar de\n * cuenta del header/perfil. Sin efecto si hay foto o si `inactive`.\n */\n neutralFallback?: boolean;\n /**\n * Solo con `neutralFallback`: el fondo del fallback queda transparente (no\n * pinta el círculo gris en reposo). Pensado para el disparador del perfil en\n * el header, donde el botón contenedor pinta el círculo al hover.\n */\n transparentFallbackBg?: boolean;\n /** Origen del CMS para resolver rutas relativas de la foto. */\n cmsOrigin?: string;\n /**\n * `crossOrigin` del `<img>`. Sin valor por defecto (lo más seguro para mostrar).\n * El `TopBar` de la lib usa `'anonymous'`; pasarlo si el CMS lo requiere.\n */\n crossOrigin?: 'anonymous' | 'use-credentials';\n /**\n * Marca este avatar como el del usuario logueado: así reacciona al cambio de\n * foto de perfil emitido por `CurrentUserPhotoProvider` (equivalente al\n * `updateImageProfile` del Angular legacy). Sin provider, usa la prop `photo`.\n */\n isCurrentUser?: boolean;\n /** Acción al hacer clic. Si se define, el avatar muestra cursor de puntero. */\n onClick?: () => void;\n /** Base para el `data-testid` (`avatar-<testId>`). */\n testId?: string;\n};\n\n/**\n * Avatar de usuario compartible: muestra la foto del usuario y, si no tiene,\n * el ícono `PersonOutlined` sobre fondo secundario. Incluye tooltip con el\n * nombre y textos traducidos (es/en/pt). Reacciona al cambio de la prop `photo`;\n * para el usuario logueado, reacciona además al `CurrentUserPhotoProvider`.\n */\nexport function UserAvatar({\n photo,\n description,\n username,\n size = 32,\n showTooltip = true,\n inactive = false,\n neutralFallback = false,\n transparentFallbackBg = false,\n cmsOrigin,\n crossOrigin,\n isCurrentUser = false,\n onClick,\n testId,\n}: UserAvatarProps) {\n const { t } = useCmsTranslation();\n const currentUserPhoto = useCurrentUserPhoto();\n\n // Para el usuario logueado, si hay provider la foto la manda el provider\n // (se actualiza al cambiarla en el perfil); si no, usamos la prop.\n const effectivePhoto =\n isCurrentUser && currentUserPhoto ? currentUserPhoto.photo : photo;\n\n const src = useMemo(() => {\n if (!effectivePhoto || effectivePhoto === NO_PICTURE) return '';\n return resolveCmsAssetUrl(effectivePhoto, cmsOrigin);\n }, [effectivePhoto, cmsOrigin]);\n\n const name = description?.trim() || username?.trim() || '';\n const tooltipText = name || t.userAvatar('unknownUser');\n const altText = name || t.userAvatar('alt');\n\n const avatar = (\n <Avatar\n src={src || undefined}\n alt={altText}\n onClick={onClick}\n data-testid={testId ? `avatar-${testId}` : undefined}\n slotProps={crossOrigin ? { img: { crossOrigin } } : undefined}\n sx={UserAvatarStyles.sxAvatar(\n size,\n Boolean(onClick),\n inactive,\n neutralFallback,\n transparentFallbackBg,\n )}>\n <PersonOutlinedIcon\n sx={UserAvatarStyles.sxIcon(size, inactive, neutralFallback)}\n />\n </Avatar>\n );\n\n if (!showTooltip) return avatar;\n\n return (\n <Tooltip\n title={tooltipText}\n arrow\n slotProps={{ tooltip: { sx: UserAvatarStyles.sxTooltip } }}>\n {avatar}\n </Tooltip>\n );\n}\n","'use client';\n\nimport AccountCircleOutlinedIcon from '@mui/icons-material/AccountCircleOutlined';\nimport AdminPanelSettingsOutlinedIcon from '@mui/icons-material/AdminPanelSettingsOutlined';\nimport LogoutOutlinedIcon from '@mui/icons-material/LogoutOutlined';\nimport type { SvgIconComponent } from '@mui/icons-material';\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Typography from '@mui/material/Typography';\nimport { useMemo, useState } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport type { ProfileMenuMessageKey } from '../../i18n';\nimport { cmsColors } from '../../theme/variables';\nimport type { ProfileGetResponse } from '../../types/profile';\nimport {\n submitLegacyAdminPage,\n type LegacyAdminSession,\n} from '../../utils/legacy-admin';\nimport {\n getProfileDisplayName,\n getProfileFullName,\n type ProfileAvatarOptions,\n} from '../../utils/profile-avatar';\nimport { toTestId } from '../../utils/toTestId';\nimport { UserAvatar } from '../user-avatar/UserAvatar';\nimport { TopBarStyles } from './TopBar.styles';\n\n/**\n * Rutas del CMS Angular legacy (las mismas para todos los gestores). El dominio\n * base lo inyecta el gestor con la prop `legacyBaseUrl` (dato de entorno).\n */\nconst LEGACY_PROFILE_PATH = '/admin/user_profile/user-settings';\nconst LEGACY_WEBMASTER_PATH = '/system/login';\n\n/**\n * Permiso de operación que habilita la \"Vista Webmaster\" (igual que el\n * `permissionName: 'ACCESS_WEBMASTERS'` del header de cmsmedios).\n */\nconst WEBMASTER_PERMISSION = 'ACCESS_WEBMASTERS';\n\n/** Une el dominio base del Angular con una ruta, sin doble barra. */\nfunction joinLegacyUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n}\n\ntype ProfileMenuItem = {\n id: string;\n labelKey: ProfileMenuMessageKey;\n icon: SvgIconComponent;\n /** Si está, el ítem es un enlace al Angular legacy. */\n href?: string;\n /** Abre el enlace en una pestaña nueva. */\n external?: boolean;\n /** Acción de cliente (tiene prioridad sobre `href`). */\n onActivate?: () => void;\n};\n\nfunction ProfileMenuOption({\n label,\n icon: Icon,\n onSelect,\n href,\n external,\n danger,\n testId,\n}: {\n label: string;\n icon: SvgIconComponent;\n onSelect: () => void;\n href?: string;\n external?: boolean;\n /** Variante destructiva: texto e icono en rojo (p. ej. \"Cerrar sesión\"). */\n danger?: boolean;\n /** `data-testid` del ítem del menú. */\n testId?: string;\n}) {\n // Texto e icono comparten color: opciones normales `onSurface` (#191C20),\n // \"Cerrar sesión\" en rojo destructivo (#BA1A1A).\n const color = danger ? cmsColors.danger : 'text.primary';\n return (\n <MenuItem\n onClick={onSelect}\n data-testid={testId}\n sx={TopBarStyles.sxProfileMenuItem}\n {...(href\n ? {\n component: 'a',\n href,\n ...(external\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {}),\n }\n : {})}>\n <ListItemIcon sx={TopBarStyles.sxProfileMenuListItemIcon}>\n <Icon sx={{ color }} />\n </ListItemIcon>\n <ListItemText\n primary={label}\n slotProps={{\n primary: {\n sx: { fontSize: 14, fontWeight: 500, color },\n },\n }}\n />\n </MenuItem>\n );\n}\n\nexport type ProfileMenuProps = {\n profile: ProfileGetResponse;\n avatarOptions?: ProfileAvatarOptions;\n /** Dominio del CMS Angular legacy para \"Mi Perfil\" / \"Vista Webmaster\". */\n legacyBaseUrl?: string;\n /** Origen del CMS (JSP) para el POST de auto-login de \"Vista Webmaster\". */\n cmsBaseUrl?: string;\n /**\n * Sesión para el redirect al admin viejo (token, sitio, publicación, usuario).\n * Con ella, \"Vista Webmaster\" hace el form POST de cmsmedios (auto-login); sin\n * ella, cae a un enlace simple.\n */\n legacySession?: LegacyAdminSession;\n /**\n * Operaciones concedidas al usuario (`POST /auth/permissions`). Si se omite,\n * no se filtra por permisos (se muestra \"Vista Webmaster\"). Igual criterio que\n * el menú \"Nuevo\".\n */\n operationPermissions?: string[];\n /** Si el usuario es administrador (ve \"Vista Webmaster\" siempre). */\n isAdmin?: boolean;\n};\n\nexport function ProfileMenu({\n profile,\n avatarOptions,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n operationPermissions,\n isAdmin,\n}: ProfileMenuProps) {\n const { t } = useCmsTranslation();\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const displayName = getProfileDisplayName(profile);\n // Título del desplegable: solo nombre y apellido (sin el nickname/login que\n // sí puede traer `displayName` vía `fullName`/`userName`).\n const fullName = getProfileFullName(profile);\n\n // \"Vista Webmaster\" solo para usuarios con permiso `ACCESS_WEBMASTERS` (o\n // admin). Sin `operationPermissions` cableado, no se filtra (mismo criterio\n // que el menú \"Nuevo\", útil para maquetado antes de `/auth/permissions`).\n const canSeeWebmaster =\n operationPermissions === undefined ||\n Boolean(isAdmin) ||\n operationPermissions.includes(WEBMASTER_PERMISSION);\n\n const menuItems = useMemo<ProfileMenuItem[]>(() => {\n const items: ProfileMenuItem[] = [\n {\n id: 'profile',\n labelKey: 'myProfile',\n icon: AccountCircleOutlinedIcon,\n href: joinLegacyUrl(legacyBaseUrl, LEGACY_PROFILE_PATH),\n },\n ];\n if (canSeeWebmaster) {\n // Como cmsmedios (`validateCurrentToken('/system/login')`): con sesión, se\n // arma el form POST al admin viejo (auto-login) en vez de un enlace simple.\n const canPost = Boolean(cmsBaseUrl && legacySession);\n items.push({\n id: 'webmaster',\n labelKey: 'webmasterView',\n icon: AdminPanelSettingsOutlinedIcon,\n external: true,\n onActivate: canPost\n ? () =>\n submitLegacyAdminPage({\n cmsBaseUrl: cmsBaseUrl as string,\n path: LEGACY_WEBMASTER_PATH,\n session: legacySession as LegacyAdminSession,\n })\n : undefined,\n href: canPost\n ? undefined\n : joinLegacyUrl(cmsBaseUrl ?? legacyBaseUrl, LEGACY_WEBMASTER_PATH),\n });\n }\n return items;\n }, [legacyBaseUrl, cmsBaseUrl, legacySession, canSeeWebmaster]);\n\n const signOffItem = useMemo<ProfileMenuItem>(\n () => ({ id: 'sign-off', labelKey: 'signOff', icon: LogoutOutlinedIcon }),\n [],\n );\n\n const handleClose = () => setAnchorEl(null);\n\n const handleSelect = (item: ProfileMenuItem) => {\n item.onActivate?.();\n handleClose();\n };\n\n return (\n <>\n <IconButton\n id=\"profile-menu-button\"\n aria-label={t.profileMenu('ariaLabel')}\n aria-controls={open ? 'profile-menu' : undefined}\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n onClick={(e) => setAnchorEl(e.currentTarget)}\n data-testid=\"dropdown-toggle-profile\"\n sx={TopBarStyles.sxProfileButton}>\n <UserAvatar\n photo={profile.image}\n description={displayName}\n username={profile.userName}\n size={36}\n showTooltip={false}\n isCurrentUser\n neutralFallback\n transparentFallbackBg\n cmsOrigin={avatarOptions?.cmsOrigin}\n crossOrigin=\"anonymous\"\n />\n </IconButton>\n\n <Menu\n id=\"profile-menu\"\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{\n paper: {\n sx: TopBarStyles.sxProfileMenuPaper,\n ...({ 'data-testid': 'dropdown-menu-profile' } as object),\n },\n list: { disablePadding: true },\n }}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n px: 2,\n py: 1.5,\n borderBottom: 1,\n borderColor: 'divider',\n // Respiro entre la línea del header y el primer ítem: así el hover de\n // \"Mi Perfil\" no queda pegado a la línea de arriba.\n mb: 0.5,\n }}>\n <UserAvatar\n photo={profile.image}\n description={displayName}\n username={profile.userName}\n size={40}\n showTooltip={false}\n isCurrentUser\n neutralFallback\n cmsOrigin={avatarOptions?.cmsOrigin}\n crossOrigin=\"anonymous\"\n />\n <Box sx={{ minWidth: 0 }}>\n <Typography\n variant=\"subtitle2\"\n sx={{ fontSize: 14, fontWeight: 500, color: 'text.primary' }}>\n {fullName}\n </Typography>\n <Typography\n variant=\"caption\"\n sx={{ fontSize: 12, fontWeight: 400, color: 'text.secondary' }}>\n {profile.email}\n </Typography>\n </Box>\n </Box>\n {menuItems.map((item) => (\n <ProfileMenuOption\n key={item.id}\n label={t.profileMenu(item.labelKey)}\n icon={item.icon}\n href={item.href}\n external={item.external}\n testId={`dropdown-item-${toTestId(item.id)}`}\n onSelect={() => handleSelect(item)}\n />\n ))}\n <Divider sx={TopBarStyles.sxProfileMenuDivider} />\n <ProfileMenuOption\n label={t.profileMenu(signOffItem.labelKey)}\n icon={signOffItem.icon}\n testId=\"dropdown-item-sign-off\"\n onSelect={() => handleSelect(signOffItem)}\n danger\n />\n </Menu>\n </>\n );\n}\n","'use client';\n\nimport ScheduleOutlinedIcon from '@mui/icons-material/ScheduleOutlined';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { useEffect, useState } from 'react';\n\nimport { getIntlLocaleTag, useCmsTranslation } from '../../i18n';\nimport { formatSiteDateTime } from '../../utils/site-time';\nimport { TopBarStyles } from './TopBar.styles';\n\nexport type TopBarClockProps = {\n /** Offset GMT de la publicación, tal como llega del CMS (p. ej. `\"-4\"`). */\n gmtRedaction?: string;\n /** Formato horario del CMS: `\"12h\"` (AM/PM) o `\"24h\"`. */\n timeFormat?: string;\n};\n\n/**\n * Etiqueta GMT a partir del offset de la publicación:\n * `\"-4\"` → `\"GMT-4\"`, `\"5\"` → `\"GMT+5\"`, vacío → `\"GMT\"`.\n */\nfunction formatGmtLabel(gmtRedaction?: string): string {\n const raw = (gmtRedaction ?? '').trim();\n if (!raw) return 'GMT';\n return `GMT${/^[+-]/.test(raw) ? raw : `+${raw}`}`;\n}\n\n/**\n * Reloj del header: hora actual en la zona de redacción de la publicación\n * seleccionada. Equivale al `.time` del modal de calendario del CMS Angular\n * (`cmsmedios`): toma la hora del navegador y la desplaza por el offset GMT de\n * la publicación; el formato 12h/24h sale del `timeFormat` del CMS.\n */\nexport function TopBarClock({ gmtRedaction, timeFormat }: TopBarClockProps) {\n const { locale, t } = useCmsTranslation();\n const [now, setNow] = useState<number | null>(null);\n\n // La hora real se fija solo en cliente para evitar desajustes de hidratación\n // (el `Date.now()` del servidor no coincide con el del navegador).\n useEffect(() => {\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, []);\n\n if (now === null) return null;\n\n const time = formatSiteDateTime(now, gmtRedaction, getIntlLocaleTag(locale), {\n hour: 'numeric',\n minute: '2-digit',\n hour12: timeFormat !== '24h',\n });\n\n return (\n <Box sx={TopBarStyles.sxClock}>\n <ScheduleOutlinedIcon sx={TopBarStyles.sxClockIcon} />\n <Box sx={TopBarStyles.sxClockText}>\n <Typography component=\"span\" sx={TopBarStyles.sxClockTime}>\n {time}\n </Typography>\n <Typography component=\"span\" sx={TopBarStyles.sxClockMeta}>\n {`${t.topBar('publication')} · ${formatGmtLabel(gmtRedaction)}`}\n </Typography>\n </Box>\n </Box>\n );\n}\n","'use client';\n\nimport HelpOutlineOutlinedIcon from '@mui/icons-material/HelpOutlineOutlined';\nimport MenuIcon from '@mui/icons-material/Menu';\nimport AppBar from '@mui/material/AppBar';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Toolbar from '@mui/material/Toolbar';\nimport Tooltip from '@mui/material/Tooltip';\nimport type { ReactNode } from 'react';\n\nimport type { DashboardNotificationsResponse } from '../../services/dashboard';\nimport type { ProfileGetResponse } from '../../types/profile';\nimport type { Publication } from '../../types/publication';\nimport type { SiteSection } from '../../types/site';\nimport { useCmsTranslation } from '../../i18n';\nimport type { ProfileAvatarOptions } from '../../utils/profile-avatar';\nimport {\n submitLegacyAdminPage,\n type LegacyAdminSession,\n} from '../../utils/legacy-admin';\nimport { findPublicationBySlug } from '../../utils/site-selector';\nimport { SiteSelectorMenu } from '../site-selector-menu/SiteSelectorMenu';\nimport { AppearanceMenu } from './AppearanceMenu';\nimport { NotificationsMenu } from './NotificationsMenu';\nimport { PreviewMenu } from './PreviewMenu';\nimport type { PreviewFormat } from './previewMenu.config';\nimport { ProfileMenu } from './ProfileMenu';\nimport { TopBarClock } from './TopBarClock';\nimport { TopBarStyles } from './TopBar.styles';\n\n/** Une el dominio del Angular legacy con una ruta, sin barra doble. */\nfunction joinLegacyUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n}\n\nfunction TopBarDivider() {\n return (\n <Box\n component=\"span\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n sx={TopBarStyles.sxDivider}\n />\n );\n}\n\nexport type TopBarProps = {\n sites: SiteSection[];\n /** Solo aplica con un sidebar colapsable (p. ej. `Sidebar`). Omitir oculta el botón. */\n sidebarOpen?: boolean;\n onToggleSidebar?: () => void;\n notificationUnreadCount: number;\n /** Respuesta cruda de `POST /dashboard/notification` (newsTask/expireTask/videos). */\n notificationsData?: DashboardNotificationsResponse | null;\n /** Destino del \"Ver más\" / clic en una oportunidad copilot (página de sugerencias). */\n copilotSuggestionsHref?: string;\n /** Clic en \"Ver más\" cuando no hay `copilotSuggestionsHref` (fallback). */\n onEditorialSeeMore?: () => void;\n /** \"Recordar luego\": recibe los `opportunity_id` mostrados para el snooze. */\n onEditorialRemindLater?: (opportunityIds: string[]) => void;\n profile: ProfileGetResponse;\n primaryLogo: ReactNode;\n brandLogo?: ReactNode;\n selectedPublicationId?: string;\n getPublicationHref: (publication: Publication) => string;\n resolvePublicationImageUrl?: (imagePath: string) => string;\n profileAvatarOptions?: ProfileAvatarOptions;\n /** Dominio del CMS Angular legacy (deploy nuevo) para enlaces de perfil. */\n legacyBaseUrl?: string;\n /**\n * Origen del CMS (JSP), p. ej. `https://dev.cms-medios.com`. Se usa para Ayuda\n * y Preview, que redirigen al admin viejo (NO al deploy de `legacyBaseUrl`).\n */\n cmsBaseUrl?: string;\n /**\n * Sesión para el redirect al admin viejo (token, sitio, publicación, usuario).\n * Si se pasa, Ayuda/Preview usan el form POST de cmsmedios; si no, Ayuda cae a\n * un enlace simple al CMS.\n */\n legacySession?: LegacyAdminSession;\n /** Formatos del menú de previsualización. Por defecto, Desktop/Mobile/Tablet. */\n previewFormats?: PreviewFormat[];\n /**\n * Operaciones concedidas al usuario (`POST /auth/permissions`). Filtran los\n * ítems del menú de perfil según permisos.\n */\n operationPermissions?: string[];\n /** Si el usuario es administrador (ve todos los ítems restringidos por permiso). */\n isAdmin?: boolean;\n /** Integración: clic en un formato de previsualización (recibe su `id`). */\n onPreviewSelect?: (formatId: string) => void;\n};\n\nexport function TopBar({\n sites,\n sidebarOpen,\n onToggleSidebar,\n notificationUnreadCount,\n notificationsData,\n copilotSuggestionsHref,\n onEditorialSeeMore,\n onEditorialRemindLater,\n profile,\n primaryLogo,\n brandLogo,\n selectedPublicationId,\n getPublicationHref,\n resolvePublicationImageUrl,\n profileAvatarOptions,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n previewFormats,\n operationPermissions,\n isAdmin,\n onPreviewSelect,\n}: TopBarProps) {\n const { t, locale } = useCmsTranslation();\n\n const selectedPublication = selectedPublicationId\n ? findPublicationBySlug(sites, selectedPublicationId)\n : undefined;\n\n // Mismo armado de URL que el `openManual()` del Angular legacy: ruta del\n // manual de ayuda por idioma sobre el ORIGEN DEL CMS (no el deploy nuevo).\n const helpTitle = t.topBar('help');\n const helpBase = cmsBaseUrl ?? legacyBaseUrl;\n const helpPath = `/system/modules/com.tfsla.diario.help/${locale}/index.html`;\n\n /**\n * Abre el manual de ayuda. Con sesión, usa el form POST de cmsmedios (pasa el\n * token al admin viejo); sin sesión, cae a un enlace simple al CMS.\n * @returns void\n */\n const handleHelpClick = () => {\n if (cmsBaseUrl && legacySession) {\n submitLegacyAdminPage({\n cmsBaseUrl,\n path: helpPath,\n session: legacySession,\n });\n return;\n }\n if (typeof window !== 'undefined') {\n window.open(joinLegacyUrl(helpBase, helpPath), '_blank', 'noopener');\n }\n };\n\n return (\n <AppBar position=\"static\" elevation={0} sx={TopBarStyles.sxAppBar}>\n <Toolbar disableGutters variant=\"dense\" sx={TopBarStyles.sxToolbar}>\n {onToggleSidebar && (\n <IconButton\n aria-label={\n sidebarOpen ? t.topBar('closeSidebar') : t.topBar('openSidebar')\n }\n aria-expanded={sidebarOpen}\n onClick={onToggleSidebar}\n sx={TopBarStyles.sxMenuButton}\n data-testid=\"icon-btn-sidebar-toggle\">\n <MenuIcon sx={TopBarStyles.sxMenuButtonIcon} />\n </IconButton>\n )}\n\n <Box sx={TopBarStyles.sxLogoBox}>{primaryLogo}</Box>\n\n <Box sx={{ flex: 1 }} />\n\n <Box sx={TopBarStyles.sxActionsFrame}>\n <Box sx={TopBarStyles.sxIconActionsRow}>\n <AppearanceMenu />\n\n <NotificationsMenu\n unreadCount={notificationUnreadCount}\n notificationsData={notificationsData}\n masterBaseUrl={legacyBaseUrl}\n currentPublicationId={selectedPublication?.id}\n gmtRedaction={selectedPublication?.gmtRedaction}\n copilotSuggestionsHref={copilotSuggestionsHref}\n onEditorialSeeMore={onEditorialSeeMore}\n onEditorialRemindLater={onEditorialRemindLater}\n />\n\n <PreviewMenu\n formats={previewFormats}\n cmsBaseUrl={cmsBaseUrl}\n legacySession={legacySession}\n onSelect={onPreviewSelect}\n />\n\n <Tooltip title={helpTitle}>\n <IconButton\n onClick={handleHelpClick}\n aria-label={helpTitle}\n sx={TopBarStyles.sxActionIcon}\n data-testid=\"icon-btn-help\">\n <HelpOutlineOutlinedIcon sx={TopBarStyles.sxActionIconGlyph} />\n </IconButton>\n </Tooltip>\n </Box>\n\n <TopBarDivider />\n\n {brandLogo}\n\n <SiteSelectorMenu\n sites={sites}\n selectedPublicationId={selectedPublicationId}\n getPublicationHref={getPublicationHref}\n resolvePublicationImageUrl={resolvePublicationImageUrl}\n />\n\n <TopBarDivider />\n\n <TopBarClock\n gmtRedaction={selectedPublication?.gmtRedaction}\n timeFormat={selectedPublication?.timeFormat}\n />\n\n <TopBarDivider />\n\n <ProfileMenu\n profile={profile}\n avatarOptions={profileAvatarOptions}\n legacyBaseUrl={legacyBaseUrl}\n cmsBaseUrl={cmsBaseUrl}\n legacySession={legacySession}\n operationPermissions={operationPermissions}\n isAdmin={isAdmin}\n />\n </Box>\n </Toolbar>\n </AppBar>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nexport const AppShellStyles = {\n sxRoot: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n height: '100%',\n minHeight: 0,\n overflow: 'hidden',\n bgcolor: 'm3.surfaceContainer',\n } as SxProps<Theme>,\n\n sxHeader: {\n flexShrink: 0,\n } as SxProps<Theme>,\n\n sxBody: {\n display: 'flex',\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n } as SxProps<Theme>,\n\n sxMain: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n minWidth: 0,\n minHeight: 0,\n overflowY: 'auto',\n overflowX: 'hidden',\n mt: '10px',\n pt: 1,\n // Sin margen inferior: el contenido (tabla/footer) llega al borde de abajo,\n // como pidió el diseño. Antes había 24px (pb:3) que dejaban un hueco visible.\n pb: 0,\n pr: 3,\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport Box from '@mui/material/Box';\nimport type { ReactNode } from 'react';\nimport { CmsI18nProvider } from '../../i18n';\nimport type { AppLocaleCatalog, CmsMessagesOverride, Locale } from '../../i18n';\nimport type { NavItemPermissions } from '../../types/navigation';\nimport type { DashboardNotificationsResponse } from '../../services/dashboard';\nimport type { ProfileGetResponse } from '../../types/profile';\nimport type { Publication } from '../../types/publication';\nimport type { SiteSection } from '../../types/site';\nimport type { ProfileAvatarOptions } from '../../utils/profile-avatar';\nimport type { LegacyAdminSession } from '../../utils/legacy-admin';\nimport type { CmsLinkComponent } from '../link';\nimport { DefaultCmsLink } from '../link';\nimport { SidebarRail, type SidebarRailPinService } from '../sidebar/SidebarRail';\nimport { TopBar } from '../top-bar/TopBar';\nimport type { PreviewFormat } from '../top-bar/previewMenu.config';\nimport { AppShellStyles } from './AppShell.styles';\n\nexport type AppShellProps = {\n pathname: string;\n sites: SiteSection[];\n children: ReactNode;\n notificationUnreadCount: number;\n /** Respuesta cruda de `POST /dashboard/notification` (newsTask/expireTask/videos). */\n notificationsData?: DashboardNotificationsResponse | null;\n /** Destino del \"Ver más\" / clic en una oportunidad copilot (página de sugerencias). */\n copilotSuggestionsHref?: string;\n /** Clic en \"Ver más\" cuando no hay `copilotSuggestionsHref` (fallback). */\n onEditorialSeeMore?: () => void;\n /** \"Recordar luego\": recibe los `opportunity_id` mostrados para el snooze. */\n onEditorialRemindLater?: (opportunityIds: string[]) => void;\n profile: ProfileGetResponse;\n primaryLogo: ReactNode;\n brandLogo?: ReactNode;\n selectedPublicationId: string;\n getPublicationHref: (publication: Publication) => string;\n resolvePublicationImageUrl?: (imagePath: string) => string;\n profileAvatarOptions?: ProfileAvatarOptions;\n /** Dominio del CMS Angular legacy (deploy nuevo) para enlaces de perfil. */\n legacyBaseUrl?: string;\n /**\n * Origen del CMS (JSP) para Ayuda/Preview. Si se omite, se usa `baseUrl`.\n */\n cmsBaseUrl?: string;\n /** Sesión para el redirect al admin viejo (token, sitio, publicación, usuario). */\n legacySession?: LegacyAdminSession;\n /** Formatos del menú de previsualización. Por defecto, Desktop/Mobile/Tablet. */\n previewFormats?: PreviewFormat[];\n /** Operaciones concedidas al usuario (`POST /auth/permissions`). */\n operationPermissions?: string[];\n /** Si el usuario es administrador (ve todos los ítems restringidos por permiso). */\n isAdmin?: boolean;\n /** Integración: clic en un formato de previsualización (recibe su `id`). */\n onPreviewSelect?: (formatId: string) => void;\n LinkComponent?: CmsLinkComponent;\n permissions: Array<NavItemPermissions>;\n locale?: Locale | string;\n /** Alias de `locale`. */\n language?: Locale | string;\n messages?: CmsMessagesOverride;\n /** Catálogo de mensajes propio del gestor (namespaces libres, es/en/pt). */\n appMessages?: AppLocaleCatalog;\n\n baseUrl: string;\n /**\n * Servicio de pines del sidebar (`CmsProfileServices`, construido por el\n * host con su `axiosApi`/`authentication`). Si se omite, el anclado de\n * accesos es solo visual y no persiste entre sesiones.\n */\n profileServices?: SidebarRailPinService;\n};\n\nexport function AppShell({\n pathname,\n sites,\n children,\n notificationUnreadCount,\n notificationsData,\n copilotSuggestionsHref,\n onEditorialSeeMore,\n onEditorialRemindLater,\n profile,\n primaryLogo,\n brandLogo,\n selectedPublicationId,\n getPublicationHref,\n resolvePublicationImageUrl,\n profileAvatarOptions,\n legacyBaseUrl,\n cmsBaseUrl,\n legacySession,\n previewFormats,\n operationPermissions,\n isAdmin,\n onPreviewSelect,\n LinkComponent = DefaultCmsLink,\n permissions,\n locale,\n language,\n messages,\n appMessages,\n baseUrl,\n profileServices,\n}: AppShellProps) {\n return (\n <CmsI18nProvider\n locale={locale}\n language={language}\n messages={messages}\n appMessages={appMessages}>\n <Box sx={AppShellStyles.sxRoot}>\n <Box component=\"header\" sx={AppShellStyles.sxHeader}>\n <TopBar\n sites={sites}\n notificationUnreadCount={notificationUnreadCount}\n notificationsData={notificationsData}\n copilotSuggestionsHref={copilotSuggestionsHref}\n onEditorialSeeMore={onEditorialSeeMore}\n onEditorialRemindLater={onEditorialRemindLater}\n profile={profile}\n primaryLogo={primaryLogo}\n brandLogo={brandLogo}\n selectedPublicationId={selectedPublicationId}\n getPublicationHref={getPublicationHref}\n resolvePublicationImageUrl={resolvePublicationImageUrl}\n profileAvatarOptions={profileAvatarOptions}\n legacyBaseUrl={legacyBaseUrl}\n cmsBaseUrl={cmsBaseUrl ?? baseUrl}\n legacySession={legacySession}\n previewFormats={previewFormats}\n operationPermissions={operationPermissions}\n isAdmin={isAdmin}\n onPreviewSelect={onPreviewSelect}\n />\n </Box>\n <Box sx={AppShellStyles.sxBody}>\n <SidebarRail\n pathname={pathname}\n LinkComponent={LinkComponent}\n permissions={permissions}\n legacyBaseUrl={legacyBaseUrl}\n cmsBaseUrl={cmsBaseUrl ?? baseUrl}\n legacySession={legacySession}\n selectedPublicationId={selectedPublicationId}\n profileServices={profileServices}\n />\n <Box component=\"main\" sx={AppShellStyles.sxMain}>\n {children}\n </Box>\n </Box>\n </Box>\n </CmsI18nProvider>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, radii, shadows } from '../../theme/variables';\n\nconst ACTIVE_BG = cmsColors.secondary;\nconst HOVER_BG = cmsColors.surfaceHover;\nconst NAV_TEXT = cmsColors.textNav;\n\nexport const SIDEBAR_WIDTH_EXPANDED = 195;\nexport const SIDEBAR_WIDTH_COLLAPSED = 96;\n\nconst ICON_SIZE_EXPANDED = 24;\nconst ICON_SIZE_COLLAPSED = 24;\n\nconst scrollbarHidden = {\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n} as const;\n\nexport const SidebarStyles = {\n sxRoot: (open: boolean): SxProps<Theme> => {\n const width = open ? SIDEBAR_WIDTH_EXPANDED : SIDEBAR_WIDTH_COLLAPSED;\n return {\n width,\n maxWidth: width,\n minWidth: width,\n flexShrink: 0,\n alignSelf: 'stretch',\n minHeight: 0,\n maxHeight: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n bgcolor: 'm3.surfaceContainer',\n paddingTop: open ? '1rem' : '1.5rem',\n boxSizing: 'border-box',\n transition: 'width 0.2s ease, min-width 0.2s ease, max-width 0.2s ease',\n };\n },\n\n sxNavScroll: {\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n overflowX: 'hidden',\n width: '100%',\n boxSizing: 'border-box',\n ...scrollbarHidden,\n } as SxProps<Theme>,\n\n sxNav: (open: boolean): SxProps<Theme> => ({\n display: 'flex',\n flexDirection: 'column',\n py: 1.5,\n gap: open ? 0.25 : 0.5,\n width: '100%',\n maxWidth: '100%',\n minWidth: 0,\n boxSizing: 'border-box',\n position: 'relative',\n px: open ? '1rem' : 0.75,\n alignItems: open ? 'stretch' : 'start',\n }),\n\n sxNavGroup: (open: boolean): SxProps<Theme> => ({\n position: 'relative',\n minWidth: 0,\n maxWidth: open ? '100%' : 'none',\n overflow: 'visible',\n width: open ? '100%' : 'auto',\n gap: 0,\n }),\n\n /** Wrapper del Tooltip: ancho completo expandido, auto en rail colapsado */\n sxTooltipWrap: (open: boolean): SxProps<Theme> => ({\n display: 'flex',\n width: open ? '100%' : 'auto',\n alignItems: 'flex-start',\n }),\n\n sxDivider: {\n my: 1,\n borderColor: cmsColors.border,\n } as SxProps<Theme>,\n\n sxItem: (\n selected: boolean,\n nested = false,\n hasChildren = false,\n collapsed = false,\n ): SxProps<Theme> => {\n if (collapsed) {\n return {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 48,\n minWidth: 0,\n width: 'auto',\n maxWidth: 'none',\n boxSizing: 'border-box',\n overflow: 'hidden',\n px: 0,\n py: 0,\n borderRadius: '100px',\n color: NAV_TEXT,\n textDecoration: 'none',\n bgcolor: selected ? ACTIVE_BG : 'transparent',\n '&:hover': {\n bgcolor: selected ? ACTIVE_BG : 'action.hover',\n },\n };\n }\n\n return {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n gap: '15px', // separación ícono → texto\n minHeight: 40,\n minWidth: 0,\n maxWidth: 'none',\n // Para que el hover/active se vea igual al diseño: el fondo llega al borde izquierdo\n width: 'calc(100% + 1rem)',\n boxSizing: 'border-box',\n overflow: hasChildren ? 'visible' : 'hidden',\n px: nested ? 1.5 : 0,\n pl: nested ? 4.5 : 3,\n py: 0.75,\n ml: '-1rem',\n mr: 0,\n // Sub-items: píldora completa; top-level: píldora pegada a la izquierda\n borderRadius: nested ? '100px' : '0 100px 100px 0',\n color: NAV_TEXT,\n textDecoration: 'none',\n bgcolor: selected ? ACTIVE_BG : 'transparent',\n '&:hover': {\n bgcolor: selected ? ACTIVE_BG : HOVER_BG,\n },\n };\n },\n\n sxItemIcon: (selected: boolean, collapsed = false): SxProps<Theme> => ({\n fontSize: collapsed ? ICON_SIZE_COLLAPSED : ICON_SIZE_EXPANDED,\n color: selected ? 'secondary.dark' : 'm3.onSurfaceVariant',\n width: collapsed ? 48 : 'auto',\n flexShrink: 0,\n }),\n\n sxItemLabel: (selected: boolean): SxProps<Theme> => ({\n flex: 1,\n minWidth: 0,\n fontSize: 14,\n fontWeight: selected ? 600 : 400,\n lineHeight: 1.43,\n color: NAV_TEXT,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n\n sxExpandButton: {\n pl: '1.5rem',\n position: 'absolute',\n left: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n p: 0.25,\n color: 'm3.onSurfaceVariant',\n zIndex: 1,\n } as SxProps<Theme>,\n\n sxChildrenMenuPaper: {\n mt: 0.5,\n borderRadius: radii.flyout,\n // Borde sutil (`outlineVariant`, #C4C6CF en claro) para que el flyout no se\n // pierda contra el fondo del shell, que comparte el mismo gris.\n border: '1px solid',\n borderColor: 'divider',\n bgcolor: cmsColors.menuSurface,\n boxShadow: shadows.flyout,\n // Menú M3: sin padding lateral (ítems de borde a borde) y 8px arriba/abajo.\n py: '8px',\n px: 0,\n overflow: 'hidden',\n } as SxProps<Theme>,\n\n sxChildrenMenuItem: (selected: boolean): SxProps<Theme> => ({\n minHeight: 44,\n // Full-bleed (sin radio): el hover llega de borde a borde (M3 por defecto).\n borderRadius: 0,\n px: 2,\n py: 1,\n gap: 1.25,\n color: NAV_TEXT,\n bgcolor: selected ? ACTIVE_BG : 'transparent',\n // Hover: state layer M3 `onSurface` al 8% (#191C20).\n '&:hover': {\n bgcolor: selected ? ACTIVE_BG : cmsColors.neutralHover,\n },\n '&.Mui-selected': {\n bgcolor: ACTIVE_BG,\n '&:hover': { bgcolor: ACTIVE_BG },\n },\n }),\n\n sxChildrenMenuListItemIcon: {\n minWidth: 34,\n color: 'm3.onSurfaceVariant',\n '& .MuiSvgIcon-root': {\n fontSize: 22,\n },\n } as SxProps<Theme>,\n\n sxBetaChip: (open = false): SxProps<Theme> => ({\n height: 15,\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: '0.04em',\n bgcolor: 'primary.main',\n color: 'primary.contrastText',\n borderRadius: '.625rem',\n px: 0.75,\n mr: open ? 1 : 0,\n lineHeight: 1,\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }),\n};\n","'use client';\n\nimport { useMemo, useState, type ReactElement } from 'react';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport Box from '@mui/material/Box';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { useCmsTranslation } from '../../i18n';\nimport type { CmsTranslator } from '../../i18n';\nimport { cmsColors } from '../../theme/variables';\nimport type { NavItemPermissions, NavLinkItem } from '../../types/navigation';\nimport { toTestId } from '../../utils/toTestId';\nimport { DefaultCmsLink, type CmsLinkComponent } from '../link';\nimport { SidebarStyles } from './Sidebar.styles';\nimport { ACCOUNT_NAV_BLOCKS } from './nav-blocks';\nimport {\n findModulePermission,\n getVisibleChildren,\n isItemActive,\n isPathActive,\n resolveNavHref,\n resolveNavLabel,\n} from './nav-helpers';\n\nfunction wrapWithTooltip(open: boolean, label: string, node: ReactElement) {\n if (open) return node;\n return (\n <Tooltip title={label} placement=\"right\" arrow>\n <Box component=\"span\" sx={SidebarStyles.sxTooltipWrap(open)}>\n {node}\n </Box>\n </Tooltip>\n );\n}\n\nfunction NavRow({\n item,\n blockIndex,\n nested = false,\n open = true,\n expanded,\n onToggleExpand,\n LinkComponent,\n pathname,\n permissions,\n t,\n legacyBaseUrl,\n selectedPublicationId,\n}: {\n item: NavLinkItem;\n blockIndex: number;\n nested?: boolean;\n open?: boolean;\n expanded?: boolean;\n onToggleExpand?: () => void;\n LinkComponent: CmsLinkComponent;\n pathname: string;\n permissions: Array<NavItemPermissions>;\n t: CmsTranslator;\n legacyBaseUrl?: string;\n selectedPublicationId: string;\n}) {\n // Los testids de navegación se escopan por el índice del bloque padre: `module`\n // no es único (POSTS y PAYMENTS se repiten en nav-blocks.ts) y no hay id de\n // bloque estable, así que sin el escopo habría testids duplicados en pantalla.\n const blockScope = `block-${blockIndex}`;\n const label = resolveNavLabel(item, t);\n const permission = findModulePermission(permissions, item.module);\n const visibleChildren = getVisibleChildren(item, permissions);\n const collapsed = !open;\n const selected = isPathActive(pathname, item.href);\n const parentSelected = isItemActive(pathname, item);\n const hasChildren = visibleChildren.length > 0;\n const Icon = item.icon;\n const iconSelected = nested ? selected : selected || parentSelected;\n const [childMenuAnchor, setChildMenuAnchor] = useState<HTMLElement | null>(null);\n const childMenuOpen = Boolean(childMenuAnchor);\n if (!permission && !hasChildren) return null;\n const content = (\n <>\n {hasChildren && !collapsed ? (\n <IconButton\n size=\"small\"\n data-testid={`toggle-nav-${blockScope}-${toTestId(item.module)}`}\n data-action={expanded ? 'collapse' : 'expand'}\n aria-label={expanded ? t.sidebar('collapse') : t.sidebar('expand')}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onToggleExpand?.();\n }}\n sx={SidebarStyles.sxExpandButton}>\n {expanded ? (\n <ExpandMoreIcon sx={{ fontSize: 20 }} />\n ) : (\n <ChevronRightIcon sx={{ fontSize: 20 }} />\n )}\n </IconButton>\n ) : null}\n <Icon sx={SidebarStyles.sxItemIcon(iconSelected, collapsed)} />\n {!collapsed ? (\n <Typography component=\"span\" sx={SidebarStyles.sxItemLabel(selected)}>\n {label}\n </Typography>\n ) : null}\n {permission?.isnew && (\n <Box component=\"span\" sx={SidebarStyles.sxBetaChip(open)}>\n {t.sidebar('newBadge')}\n </Box>\n )}\n </>\n );\n\n if (hasChildren && !collapsed) {\n return (\n <Box sx={SidebarStyles.sxNavGroup(open)}>\n <Box\n component=\"div\"\n data-testid={`nav-${blockScope}-${toTestId(item.module)}`}\n onClick={onToggleExpand}\n sx={{\n ...SidebarStyles.sxItem(parentSelected, nested, true, false),\n cursor: 'pointer',\n }}>\n {content}\n </Box>\n <Collapse in={expanded} timeout=\"auto\" unmountOnExit>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 0.25,\n mt: 0.25,\n minWidth: 0,\n maxWidth: '100%',\n overflow: 'hidden',\n }}>\n {visibleChildren.map((child) => (\n <NavRow\n key={child.href}\n item={child}\n blockIndex={blockIndex}\n nested\n open={open}\n LinkComponent={LinkComponent}\n pathname={pathname}\n permissions={permissions}\n t={t}\n legacyBaseUrl={legacyBaseUrl}\n selectedPublicationId={selectedPublicationId}\n />\n ))}\n </Box>\n </Collapse>\n </Box>\n );\n }\n\n // Sidebar colapsado + item con hijos: mostrar menú flotante (como en la imagen)\n if (hasChildren && collapsed) {\n const row = (\n <Box\n component=\"button\"\n type=\"button\"\n data-testid={`dropdown-toggle-nav-${blockScope}-${toTestId(item.module)}`}\n aria-label={label}\n aria-controls={childMenuOpen ? `sidebar-children-${item.href}` : undefined}\n aria-haspopup=\"true\"\n aria-expanded={childMenuOpen ? 'true' : undefined}\n onClick={(e) => setChildMenuAnchor(e.currentTarget)}\n onMouseEnter={(e) => setChildMenuAnchor(e.currentTarget)}\n sx={{\n ...SidebarStyles.sxItem(parentSelected, nested, hasChildren, true),\n border: 0,\n background: 'transparent',\n cursor: 'pointer',\n }}>\n {content}\n </Box>\n );\n\n // En colapsado + hijos: solo menú flotante (sin tooltip)\n return (\n <>\n {row}\n <Menu\n id={`sidebar-children-${item.href}`}\n anchorEl={childMenuAnchor}\n open={childMenuOpen}\n onClose={() => setChildMenuAnchor(null)}\n anchorOrigin={{ vertical: 'center', horizontal: 'right' }}\n transformOrigin={{ vertical: 'center', horizontal: 'left' }}\n slotProps={{\n paper: { sx: SidebarStyles.sxChildrenMenuPaper },\n list: {\n onMouseLeave: () => setChildMenuAnchor(null),\n sx: { py: 1 },\n },\n }}>\n {visibleChildren.map((child) => {\n const ChildIcon = child.icon;\n return (\n <MenuItem\n key={child.href}\n data-testid={`dropdown-item-nav-${toTestId(child.module)}`}\n component={LinkComponent}\n href={resolveNavHref(child, legacyBaseUrl, selectedPublicationId)}\n onClick={() => setChildMenuAnchor(null)}\n sx={SidebarStyles.sxChildrenMenuItem(isPathActive(pathname, child.href))}>\n <ListItemIcon sx={SidebarStyles.sxChildrenMenuListItemIcon}>\n <ChildIcon />\n </ListItemIcon>\n <ListItemText\n primary={resolveNavLabel(child, t)}\n slotProps={{\n primary: {\n sx: {\n fontSize: 14,\n fontWeight: 400,\n color: cmsColors.textStrong,\n },\n },\n }}\n />\n </MenuItem>\n );\n })}\n </Menu>\n </>\n );\n }\n\n const row = (\n <Box\n component={LinkComponent}\n href={resolveNavHref(item, legacyBaseUrl, selectedPublicationId)}\n data-testid={`nav-${blockScope}-${toTestId(item.module)}`}\n sx={SidebarStyles.sxItem(\n collapsed ? parentSelected : selected,\n nested,\n hasChildren,\n collapsed,\n )}>\n {content}\n </Box>\n );\n\n return wrapWithTooltip(open, label, row);\n}\n\nfunction NavSection({\n items,\n open = true,\n LinkComponent,\n pathname,\n permissions,\n t,\n legacyBaseUrl,\n selectedPublicationId,\n}: {\n items: NavLinkItem[];\n open: boolean;\n LinkComponent: CmsLinkComponent;\n pathname: string;\n permissions: Array<NavItemPermissions>;\n t: CmsTranslator;\n legacyBaseUrl?: string;\n selectedPublicationId: string;\n}) {\n\n const initialOpen = useMemo(() => {\n const state: Record<string, boolean> = {};\n for (const item of items) {\n if (item.children) {\n state[item.href] =\n item.defaultOpen ?? item.children.some((c) => isPathActive(pathname, c.href));\n }\n }\n return state;\n }, [items, pathname]);\n\n const [openGroups, setOpenGroups] = useState(initialOpen);\n\n const toggleGroup = (href: string) => {\n setOpenGroups((prev) => ({ ...prev, [href]: !prev[href] }));\n };\n\n return (\n <>\n {items.map((item, blockIndex) => (\n <NavRow\n key={item.href}\n item={item}\n blockIndex={blockIndex}\n open={open}\n permissions={permissions}\n expanded={openGroups[item.href]}\n onToggleExpand={\n getVisibleChildren(item, permissions).length > 0\n ? () => toggleGroup(item.href)\n : undefined\n }\n LinkComponent={LinkComponent}\n pathname={pathname}\n t={t}\n legacyBaseUrl={legacyBaseUrl}\n selectedPublicationId={selectedPublicationId}\n />\n ))}\n </>\n );\n}\n\nexport type SidebarProps = {\n open?: boolean;\n pathname: string;\n LinkComponent?: CmsLinkComponent;\n permissions: Array<NavItemPermissions>;\n /** Dominio del admin legacy (JSP/Angular) para prefijar hrefs con `item.legacy`. */\n legacyBaseUrl?: string;\n selectedPublicationId: string;\n};\n\nexport function Sidebar({\n open = true,\n pathname,\n permissions,\n LinkComponent = DefaultCmsLink,\n legacyBaseUrl,\n selectedPublicationId,\n}: SidebarProps) {\n const { t } = useCmsTranslation();\n\n return (\n <Box component=\"aside\" sx={SidebarStyles.sxRoot(open)}>\n <Box sx={SidebarStyles.sxNavScroll}>\n <Box\n component=\"nav\"\n aria-label={t.sidebar('navAriaLabel')}\n sx={SidebarStyles.sxNav(open)}>\n <NavSection\n permissions={permissions}\n items={ACCOUNT_NAV_BLOCKS}\n open={open}\n LinkComponent={LinkComponent}\n pathname={pathname}\n t={t}\n legacyBaseUrl={legacyBaseUrl}\n selectedPublicationId={selectedPublicationId}\n />\n </Box>\n </Box>\n </Box>\n );\n}\n","import type { NewMenuMessageKey } from '../../i18n';\n\n/**\n * Ítem del menú \"Nuevo\" (botón \"+\"). Replica la estructura del header del CMS\n * Angular legacy (`newContent` de cmsmedios): cada ítem declara su clave i18n y\n * el/los permiso(s) de operación que habilitan su visibilidad.\n */\nexport type NewContentItem = {\n /** Identificador estable; lo recibe `onNewContentSelect` al hacer clic. */\n id: string;\n /** Clave i18n del namespace `newMenu`. */\n labelKey: NewMenuMessageKey;\n /**\n * Permiso(s) de operación requeridos (p. ej. `NEWS_CREATE`). Si es un array,\n * se exigen TODOS (criterio NAA-4038 del Angular legacy). Si se omite, el ítem\n * no requiere permiso.\n */\n permission?: string | string[];\n};\n\n/** Columna del menú \"Nuevo\" (Frecuentes / Otros / Videos). */\nexport type NewContentGroup = {\n /** Clave i18n del título de la columna (namespace `newMenu`). */\n titleKey: NewMenuMessageKey;\n items: NewContentItem[];\n};\n\n/**\n * Estructura por defecto del menú \"Nuevo\", equivalente al `newContent` del\n * header de cmsmedios (frecuentes / otros / videos) con sus permisos. El gestor\n * puede sobreescribirla por props si su producto difiere.\n */\nexport const DEFAULT_NEW_CONTENT_GROUPS: NewContentGroup[] = [\n {\n titleKey: 'frequentsTitle',\n items: [\n { id: 'trivias', labelKey: 'trivia', permission: 'TRIVIAS_CREATE' },\n { id: 'polls', labelKey: 'poll', permission: 'POLLS_CREATE' },\n { id: 'listas', labelKey: 'listicle', permission: 'NEWS_CREATE' },\n ],\n },\n {\n titleKey: 'othersTitle',\n items: [\n { id: 'tag', labelKey: 'tag', permission: 'TAGS_CREATE' },\n { id: 'gamecast', labelKey: 'gamecast', permission: 'NEWS_CREATE' },\n { id: 'liveblog', labelKey: 'liveblog', permission: 'NEWS_CREATE' },\n { id: 'aiPost', labelKey: 'aiPost', permission: 'IA_NEWS_CREATE' },\n { id: 'aiListicle', labelKey: 'aiListicle', permission: 'IA_NEWS_CREATE' },\n ],\n },\n {\n titleKey: 'videosTitle',\n items: [\n {\n id: 'videoNative',\n labelKey: 'videoNative',\n permission: ['VIDEOS_UPLOAD', 'VIDEOS_NATIVE'],\n },\n { id: 'videoEmbedded', labelKey: 'videoEmbedded', permission: 'VIDEOS_UPLOAD' },\n { id: 'videoYoutube', labelKey: 'videoYoutube', permission: 'VIDEOS_UPLOAD' },\n ],\n },\n];\n\n/**\n * Decide si un ítem es visible según los permisos de operación del usuario.\n *\n * - Si `operationPermissions` es `undefined`, no hay gating (se muestra todo);\n * útil para maquetado/mock antes de cablear `/auth/permissions`.\n * - Si el usuario es admin, ve todo.\n * - Si el ítem no declara permiso, se muestra.\n * - Con un array de permisos, se exigen todos.\n *\n * @param item - Ítem a evaluar.\n * @param operationPermissions - Nombres de operaciones concedidas al usuario.\n * @param isAdmin - Si el usuario es administrador.\n * @returns `true` si el ítem debe mostrarse.\n */\nexport function isNewContentItemVisible(\n item: NewContentItem,\n operationPermissions: string[] | undefined,\n isAdmin: boolean | undefined,\n): boolean {\n if (operationPermissions === undefined) return true;\n if (isAdmin) return true;\n if (!item.permission) return true;\n const required = Array.isArray(item.permission)\n ? item.permission\n : [item.permission];\n return required.every((name) => operationPermissions.includes(name));\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, shadows } from '../../theme/variables';\n\nexport const NewContentMenuStyles = {\n sxMenuPaper: {\n mt: 1,\n borderRadius: 2,\n bgcolor: cmsColors.menuSurface,\n py: 2,\n px: 1,\n boxShadow: shadows.menu,\n } as SxProps<Theme>,\n\n sxContainer: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: 4,\n px: 2,\n } as SxProps<Theme>,\n\n sxColumn: {\n display: 'flex',\n flexDirection: 'column',\n minWidth: 132,\n } as SxProps<Theme>,\n\n // Mismo estilo que el título del flyout del menú lateral colapsado\n // (`SidebarRailStyles.sxChildrenMenuTitle`): mayúsculas, Google Sans, 12px.\n sxColumnTitle: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 12,\n fontWeight: 600,\n lineHeight: 1.4,\n letterSpacing: '0.4px',\n textTransform: 'uppercase',\n color: 'm3.onSurfaceVariant',\n mb: 1,\n } as SxProps<Theme>,\n\n sxItem: {\n fontSize: 14,\n color: cmsColors.textStrong,\n py: 1,\n px: 1,\n borderRadius: '10px',\n cursor: 'pointer',\n textDecoration: 'none',\n display: 'block',\n // Hover: state layer M3 `onSurface` al 8% (#191C20), común a los desplegables.\n '&:hover': {\n bgcolor: cmsColors.neutralHover,\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport AddOutlinedIcon from '@mui/icons-material/AddOutlined';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Menu from '@mui/material/Menu';\nimport Typography from '@mui/material/Typography';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useMemo, useState } from 'react';\nimport type { MouseEvent } from 'react';\n\nimport { useCmsTranslation } from '../../i18n';\nimport {\n DEFAULT_NEW_CONTENT_GROUPS,\n isNewContentItemVisible,\n type NewContentGroup,\n type NewContentItem,\n} from './newContentMenu.config';\nimport { NewContentMenuStyles } from './NewContentMenu.styles';\nimport { TopBarStyles } from './TopBar.styles';\n\nexport type NewContentMenuProps = {\n /** Columnas e ítems del menú. Por defecto, la estructura del CMS legacy. */\n groups?: NewContentGroup[];\n /**\n * Nombres de operaciones concedidas al usuario (de `POST /auth/permissions`).\n * Si se omite, no hay filtrado por permisos (se muestran todos los ítems).\n */\n operationPermissions?: string[];\n /** Si el usuario es administrador (ve todos los ítems). */\n isAdmin?: boolean;\n /**\n * Dominio del deploy nuevo (master) al que se redirige, p. ej.\n * `https://master.d1c5iid93veq15.amplifyapp.com`. Se navega a\n * `<legacyBaseUrl><getRedirectPath(id)>` en una pestaña nueva.\n */\n legacyBaseUrl?: string;\n /**\n * Ruta/parámetro por ítem que se concatena a `legacyBaseUrl`. Por defecto\n * `/?new=<id>`: el deploy destino lee `new` y dispara la creación.\n */\n getRedirectPath?: (itemId: string) => string;\n /**\n * Fallback cuando no hay `legacyBaseUrl`: se invoca con el `id` del ítem\n * (punto de integración para maquetado).\n */\n onSelect?: (itemId: string) => void;\n};\n\n/** Ruta destino por defecto: el deploy leerá `?new=<id>` y disparará la acción. */\nfunction defaultNewRedirectPath(itemId: string): string {\n return `/?new=${encodeURIComponent(itemId)}`;\n}\n\n/** Une dominio + ruta sin barra doble. */\nfunction joinUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n}\n\n/**\n * Menú desplegable del botón \"Nuevo\" (+) del header. Replica las tres columnas\n * del header de cmsmedios (Frecuentes / Otros / Videos) con visibilidad por\n * permisos. El comportamiento de cada ítem lo resuelve el gestor.\n */\nexport function NewContentMenu({\n groups = DEFAULT_NEW_CONTENT_GROUPS,\n operationPermissions,\n isAdmin,\n legacyBaseUrl,\n getRedirectPath = defaultNewRedirectPath,\n onSelect,\n}: NewContentMenuProps) {\n const { t } = useCmsTranslation();\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const handleClose = () => setAnchorEl(null);\n\n /** Filtra ítems por permiso y descarta columnas que quedan vacías. */\n const visibleGroups = useMemo(\n () =>\n groups\n .map((group) => ({\n ...group,\n items: group.items.filter((item) =>\n isNewContentItemVisible(item, operationPermissions, isAdmin),\n ),\n }))\n .filter((group) => group.items.length > 0),\n [groups, operationPermissions, isAdmin],\n );\n\n /**\n * Ejecuta la acción del ítem: navega al deploy master con el parámetro\n * (`<legacyBaseUrl>/?new=<id>`) en pestaña nueva; sin `legacyBaseUrl`, delega\n * en `onSelect`. Cierra el menú.\n * @param item - Ítem clickeado.\n * @returns void\n */\n const handleItemClick = (item: NewContentItem) => {\n if (legacyBaseUrl && typeof window !== 'undefined') {\n window.open(\n joinUrl(legacyBaseUrl, getRedirectPath(item.id)),\n '_blank',\n 'noopener',\n );\n } else {\n onSelect?.(item.id);\n }\n handleClose();\n };\n\n const title = t.topBar('new');\n\n return (\n <>\n <Tooltip title={title}>\n <IconButton\n aria-label={title}\n aria-haspopup=\"true\"\n aria-expanded={open}\n onClick={(event: MouseEvent<HTMLElement>) =>\n setAnchorEl(event.currentTarget)\n }\n data-testid=\"dropdown-toggle-new-content\"\n sx={TopBarStyles.sxActionIcon}>\n <AddOutlinedIcon sx={TopBarStyles.sxActionIconGlyph} />\n </IconButton>\n </Tooltip>\n\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{\n paper: { sx: NewContentMenuStyles.sxMenuPaper },\n list: {\n sx: { p: 0 },\n ...({ 'data-testid': 'dropdown-menu-new-content' } as object),\n },\n }}>\n <Box sx={NewContentMenuStyles.sxContainer}>\n {visibleGroups.map((group) => (\n <Box key={group.titleKey} sx={NewContentMenuStyles.sxColumn}>\n <Typography\n component=\"span\"\n sx={NewContentMenuStyles.sxColumnTitle}>\n {t.newMenu(group.titleKey)}\n </Typography>\n {group.items.map((item) => (\n <Box\n key={item.id}\n component=\"span\"\n role=\"menuitem\"\n tabIndex={0}\n onClick={() => handleItemClick(item)}\n data-testid={`dropdown-item-new-${item.id}`}\n sx={NewContentMenuStyles.sxItem}>\n {t.newMenu(item.labelKey)}\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n </Menu>\n </>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors } from '../../theme/variables';\n\n/**\n * Estilos de la página de error compartida (404 / sin permisos).\n * Replica el layout de cmsmedios: ilustración + bloque de texto.\n * Solo variables del theme: nada de colores quemados.\n */\nexport const CmsErrorPageStyles = {\n // Cubre toda la ventana (por encima del shell), como en cmsmedios.\n // Ilustración e info en fila (columna en móvil).\n sxRoot: {\n position: 'fixed',\n inset: 0,\n zIndex: 1300,\n overflow: 'auto',\n display: 'flex',\n flexDirection: { xs: 'column', md: 'row' },\n alignItems: 'center',\n justifyContent: 'center',\n gap: { xs: 4, md: 8 },\n px: { xs: 3, md: 6 },\n py: { xs: 6, md: 8 },\n bgcolor: cmsColors.avatarBg,\n } as SxProps<Theme>,\n\n // Ilustración de marca (PNG servido desde el `public/` del gestor).\n sxIllustration: {\n width: { xs: 220, sm: 300, md: 420 },\n maxWidth: '100%',\n height: 'auto',\n flexShrink: 0,\n } as SxProps<Theme>,\n\n // Bloque de texto: alineado a la izquierda en desktop, centrado en móvil.\n sxContent: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: { xs: 'center', md: 'flex-start' },\n textAlign: { xs: 'center', md: 'left' },\n maxWidth: 520,\n } as SxProps<Theme>,\n\n // Título grande (respeta saltos de línea `\\n` de la traducción).\n sxTitle: {\n fontSize: { xs: 32, md: 46 },\n fontWeight: 700,\n lineHeight: 1.1,\n color: cmsColors.textStrong,\n whiteSpace: 'pre-line',\n } as SxProps<Theme>,\n\n // Subtítulo.\n sxSubtitle: {\n mt: 2,\n fontSize: { xs: 16, md: 18 },\n color: cmsColors.textNav,\n } as SxProps<Theme>,\n\n // Botón HOME (sobre el pill de la lib: separación y mayúsculas).\n sxButton: {\n mt: 3,\n textTransform: 'uppercase',\n px: 4,\n } as SxProps<Theme>,\n\n // Línea \"Error 404. Copiar detalle.\" (solo en 404).\n sxErrorLine: {\n mt: 3,\n fontSize: 14,\n color: cmsColors.textMuted,\n } as SxProps<Theme>,\n\n // Enlace \"Copiar detalle.\" clicable.\n sxCopyLink: {\n ml: 0.5,\n color: cmsColors.link,\n fontWeight: 500,\n cursor: 'pointer',\n userSelect: 'none',\n '&:hover': { textDecoration: 'underline' },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport type { ElementType } from 'react';\nimport { useState } from 'react';\n\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\n\nimport { useCmsTranslation } from '../../i18n';\nimport { sxPillButton } from '../../theme/buttonStyles';\nimport { DefaultCmsLink, type CmsLinkComponent } from '../link';\nimport { CmsErrorPageStyles } from './CmsErrorPage.styles';\n\n/** Variante de error a mostrar: 404 (no encontrado) o sin permisos. */\nexport type CmsErrorPageVariant = 'not-found' | 'not-allowed';\n\nexport type CmsErrorPageProps = {\n /** Tipo de error a mostrar. */\n variant: CmsErrorPageVariant;\n /** Destino del botón HOME. Por defecto la raíz del gestor (`/`). */\n homeHref?: string;\n /** Componente de enlace del host (p. ej. `next/link`). Por defecto un `<a>`. */\n LinkComponent?: CmsLinkComponent;\n /**\n * Ruta de la ilustración (servida desde el `public/` del gestor). Por defecto\n * `/errors/notfound.png` o `/errors/not-allowed.png` según la variante.\n */\n illustrationSrc?: string;\n};\n\n/**\n * Página de error compartida por todos los gestores (mecanismo en la lib).\n * Replica la de cmsmedios: ilustración + título + subtítulo + botón HOME, y en\n * el 404 la línea \"Error 404. Copiar detalle.\" que copia la URL al portapapeles.\n * Los textos salen del i18n de la lib (namespace `errorPage`, es/en/pt), así que\n * ningún gestor los duplica.\n */\nexport function CmsErrorPage({\n variant,\n homeHref = '/',\n LinkComponent = DefaultCmsLink,\n illustrationSrc,\n}: CmsErrorPageProps) {\n const { t } = useCmsTranslation();\n const [copied, setCopied] = useState(false);\n const isNotAllowed = variant === 'not-allowed';\n\n const title = t.errorPage(isNotAllowed ? 'notAllowedTitle' : 'notFoundTitle');\n const subtitle = t.errorPage(\n isNotAllowed ? 'notAllowedSubtitle' : 'notFoundSubtitle',\n );\n const imageSrc =\n illustrationSrc ??\n (isNotAllowed ? '/errors/not-allowed.png' : '/errors/notfound.png');\n\n // Copia al portapapeles el detalle del error (la ruta a la que se intentó\n // acceder), replicando el \"Copiar detalle\" de cmsmedios.\n const handleCopy = async () => {\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const detail = t.errorPage('copyDetailText').replace('{url}', url);\n try {\n await navigator.clipboard.writeText(detail);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 2500);\n } catch {\n // Si el navegador bloquea el portapapeles, no hacemos nada.\n }\n };\n\n return (\n <Box\n data-testid=\"panel-error\"\n data-variant={variant}\n sx={CmsErrorPageStyles.sxRoot}>\n <Box\n component=\"img\"\n src={imageSrc}\n alt=\"\"\n aria-hidden\n sx={CmsErrorPageStyles.sxIllustration}\n />\n <Box sx={CmsErrorPageStyles.sxContent}>\n <Typography component=\"h1\" sx={CmsErrorPageStyles.sxTitle}>\n {title}\n </Typography>\n <Typography component=\"p\" sx={CmsErrorPageStyles.sxSubtitle}>\n {subtitle}\n </Typography>\n <Button\n data-testid=\"btn-error-home\"\n component={LinkComponent as ElementType}\n href={homeHref}\n sx={{\n ...(sxPillButton('cta') as object),\n ...(CmsErrorPageStyles.sxButton as object),\n }}>\n {t.errorPage('homeButton')}\n </Button>\n {!isNotAllowed && (\n <Typography component=\"p\" sx={CmsErrorPageStyles.sxErrorLine}>\n {t.errorPage('errorLabel')} {t.errorPage('notFoundCode')}.\n <Box\n data-testid=\"btn-error-copy\"\n component=\"span\"\n role=\"button\"\n tabIndex={0}\n onClick={handleCopy}\n sx={CmsErrorPageStyles.sxCopyLink}>\n {copied ? t.errorPage('copied') : t.errorPage('copyDetail')}\n </Box>\n </Typography>\n )}\n </Box>\n </Box>\n );\n}\n","'use client';\n\nimport GlobalStyles from '@mui/material/GlobalStyles';\n\nimport { buildCmsColorSchemeVars } from '../../theme/variables';\n\nconst { light, dark } = buildCmsColorSchemeVars();\n\n/**\n * Inyecta las CSS variables `--cms-*` de la paleta mode-aware.\n *\n * - `:root` → valores claros (base; aplican siempre).\n * - `:root[data-mui-color-scheme=\"dark\"]` → valores oscuros (mayor\n * especificidad; ganan cuando MUI pone el atributo en <html>).\n *\n * Va montado dentro de los providers MUI, así todos los gestores y el showroom\n * obtienen el modo oscuro sin cambios adicionales.\n */\nexport function CmsColorSchemeVars() {\n return (\n <GlobalStyles\n styles={{\n ':root': light,\n ':root[data-mui-color-scheme=\"dark\"]': dark,\n }}\n />\n );\n}\n","'use client';\n\nimport GlobalStyles from '@mui/material/GlobalStyles';\n\nimport { cmsFontFaces } from '../../theme/fonts';\n\n/**\n * Inyecta los `@font-face` de Google Sans (fuente única del CMS) como estilos\n * globales. Va montado dentro de los providers MUI de la lib, así cada gestor que\n * los use tiene la fuente disponible sin configurar nada.\n */\nexport function CmsFontFaces() {\n return <GlobalStyles styles={cmsFontFaces} />;\n}\n","import {\n THEME_COLOR_SCHEME_ATTRIBUTE,\n THEME_ENABLED_STORAGE_KEY,\n THEME_MODE_STORAGE_KEY,\n} from '../../theme/themePreference';\n\n// Script inline que corre ANTES del primer pintado: lee la preferencia de\n// `localStorage` y aplica el modo efectivo al atributo de `<html>`. Sin esto el\n// primer render saldría en claro (defaultMode) y luego saltaría a oscuro →\n// parpadeo. Es JS plano (no React), así que funciona igual en cualquier gestor.\n//\n// Va montado dentro de los providers MUI (primer hijo), así todos los gestores\n// y el login lo obtienen sin cablear nada por app.\nconst INIT_SCRIPT = `(function(){try{var m=localStorage.getItem('${THEME_MODE_STORAGE_KEY}');var e=localStorage.getItem('${THEME_ENABLED_STORAGE_KEY}');var on=e===null?true:e==='true';var eff=on&&m==='dark'?'dark':'light';document.documentElement.setAttribute('${THEME_COLOR_SCHEME_ATTRIBUTE}',eff);}catch(_){}})();`;\n\n/** Anti-flash de tema: aplica el modo guardado antes de pintar. */\nexport function CmsThemeInitScript() {\n return (\n <script\n suppressHydrationWarning\n dangerouslySetInnerHTML={{ __html: INIT_SCRIPT }}\n />\n );\n}\n","'use client';\n\nimport { useColorScheme } from '@mui/material/styles';\nimport { useEffect } from 'react';\n\nimport { readEffectiveThemeMode } from '../../theme/themePreference';\n\n// Al montar (solo cliente), sincroniza el estado de color de MUI con la\n// preferencia guardada en `localStorage`. El atributo `<html>` ya lo aplica el\n// `CmsThemeInitScript` (anti-flash, vía CSS), pero MUI arranca su contexto React\n// en `defaultMode=\"light\"`; este sync alinea `theme.palette.mode` para los\n// componentes que lo leen en JS. Va dentro del ThemeProvider de la lib.\nexport function CmsThemeModeSync() {\n const { setMode } = useColorScheme();\n\n useEffect(() => {\n setMode(readEffectiveThemeMode());\n }, [setMode]);\n\n return null;\n}\n","'use client';\n\nimport CssBaseline from '@mui/material/CssBaseline';\nimport { ThemeProvider } from '@mui/material/styles';\nimport type { ReactNode } from 'react';\n\nimport { createAppTheme } from '../../theme/createAppTheme';\nimport { CmsColorSchemeVars } from './CmsColorSchemeVars';\nimport { CmsFontFaces } from './CmsFontFaces';\nimport { CmsThemeInitScript } from './CmsThemeInitScript';\nimport { CmsThemeModeSync } from './CmsThemeModeSync';\n\nconst theme = createAppTheme();\n\nexport type CmsMuiProviderProps = {\n children: ReactNode;\n};\n\n/** Provider MUI sin integración Next.js (playground Vite u otros frameworks). */\nexport function CmsMuiProvider({ children }: CmsMuiProviderProps) {\n return (\n <ThemeProvider theme={theme} defaultMode=\"light\" storageManager={null}>\n {/* Anti-flash + sincronización del modo con la preferencia guardada. */}\n <CmsThemeInitScript />\n <CmsThemeModeSync />\n <CssBaseline enableColorScheme />\n <CmsColorSchemeVars />\n <CmsFontFaces />\n {children}\n </ThemeProvider>\n );\n}\n","'use client';\n\nimport Box from '@mui/material/Box';\nimport CssBaseline from '@mui/material/CssBaseline';\nimport { ThemeProvider } from '@mui/material/styles';\nimport { AppRouterCacheProvider } from '@mui/material-nextjs/v16-appRouter';\nimport type { ReactNode } from 'react';\n\nimport { createAppTheme } from '../../theme/createAppTheme';\nimport { CmsColorSchemeVars } from './CmsColorSchemeVars';\nimport { CmsFontFaces } from './CmsFontFaces';\nimport { CmsThemeInitScript } from './CmsThemeInitScript';\nimport { CmsThemeModeSync } from './CmsThemeModeSync';\n\nconst theme = createAppTheme();\n\nexport type NextCmsMuiProviderProps = {\n children: ReactNode;\n};\n\nexport function NextCmsMuiProvider({ children }: NextCmsMuiProviderProps) {\n return (\n <AppRouterCacheProvider options={{ enableCssLayer: true }}>\n {/* Anti-flash: aplica el tema guardado antes de pintar. */}\n <CmsThemeInitScript />\n <ThemeProvider theme={theme} defaultMode=\"light\" storageManager={null}>\n {/* Alinea el modo de MUI con la preferencia persistida. */}\n <CmsThemeModeSync />\n <CssBaseline enableColorScheme />\n <CmsColorSchemeVars />\n <CmsFontFaces />\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n minHeight: '100dvh',\n }}>\n {children}\n </Box>\n </ThemeProvider>\n </AppRouterCacheProvider>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport {\n cmsButtonDivider,\n cmsButtonHoverBg,\n cmsButtonSurface,\n type CmsButtonVariant,\n} from '../../theme/buttonStyles';\nimport { cmsColors, fontFamilies, shadows, sizes } from '../../theme/variables';\n\nconst variantOf = (whiteBtn: boolean): CmsButtonVariant =>\n whiteBtn ? 'white' : 'cta';\n\nexport const BtnDropdownStyles = {\n sxGroup: {\n display: 'inline-flex',\n alignItems: 'stretch',\n // Sin separación: los dos segmentos se tocan y la división la marca un\n // divisor fino dibujado en la flecha (ver sxArrowButton). Antes había un\n // gap que dejaba ver el fondo (blanco en el footer) como una línea gruesa.\n } as SxProps<Theme>,\n\n sxMainButton: (whiteBtn: boolean, fullPill: boolean): SxProps<Theme> => {\n const variant = variantOf(whiteBtn);\n return {\n height: sizes.buttonHeight,\n px: '20px',\n pr: fullPill ? '20px' : '14px',\n // Esquinas externas redondas; la interna (junto a la flecha) recta para\n // que el divisor quede como una línea limpia de alto completo.\n borderRadius: fullPill ? '999px' : '999px 0 0 999px',\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 15,\n fontWeight: 600,\n minWidth: 0,\n gap: 1,\n boxShadow: shadows.button,\n ...(cmsButtonSurface(variant) as object),\n '& .MuiSvgIcon-root': { fontSize: 18 },\n '&:hover': {\n boxShadow: shadows.button,\n bgcolor: cmsButtonHoverBg(variant),\n },\n '&.Mui-disabled': {\n bgcolor: whiteBtn\n ? 'm3.surfaceContainerLowest'\n : cmsColors.primaryDisabled,\n color: 'action.disabled',\n },\n };\n },\n\n sxArrowButton: (whiteBtn: boolean, open: boolean): SxProps<Theme> => {\n const variant = variantOf(whiteBtn);\n return {\n height: sizes.buttonHeight,\n minWidth: 38,\n width: 38,\n px: 0,\n // Esquina interna (junto al botón principal) recta; externa redonda.\n borderRadius: '0 999px 999px 0',\n boxShadow: shadows.button,\n ...(cmsButtonSurface(variant) as object),\n // Divisor fino entre el botón principal y la flecha (blanco translúcido en\n // la variante CTA, borde gris en la blanca). Reemplaza al viejo gap.\n borderLeft: `1px solid ${cmsButtonDivider(variant)}`,\n '& .MuiSvgIcon-root': {\n fontSize: 22,\n transition: 'transform 0.15s',\n transform: open ? 'rotate(180deg)' : 'none',\n },\n '&:hover': {\n boxShadow: shadows.button,\n bgcolor: cmsButtonHoverBg(variant),\n },\n '&.Mui-disabled': {\n bgcolor: whiteBtn\n ? 'm3.surfaceContainerLowest'\n : cmsColors.primaryDisabled,\n color: 'action.disabled',\n },\n };\n },\n};\n","'use client';\n\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport { useMemo, useState } from 'react';\nimport type { MouseEvent, ReactNode } from 'react';\n\nimport { BtnDropdownStyles } from './BtnDropdown.styles';\nimport { SimpleDropdown } from './SimpleDropdown';\nimport type { DropdownOption } from './types';\n\nexport type BtnDropdownProps = {\n /** Texto o nodo (ya traducido) del botón principal. */\n titleButton: ReactNode;\n /** Opciones del menú desplegable. */\n options: DropdownOption[];\n /** Ícono opcional a la izquierda del texto del botón principal. */\n icon?: ReactNode;\n /** Acción del botón principal. */\n onAction?: () => void;\n /** Deshabilita el botón y el menú completo. */\n disabled?: boolean;\n /** Habilita o deshabilita solo el botón principal. Por defecto `true`. */\n enableButton?: boolean;\n /** Variante visual de botón blanco. */\n whiteBtn?: boolean;\n /** Muestra u oculta la flecha del desplegable. Por defecto `true`. */\n showDropdownOptions?: boolean;\n /**\n * Abre el menú hacia arriba (útil cuando el botón vive al pie de un footer o\n * pegado al margen inferior). Por defecto `false` (abre hacia abajo).\n */\n openUpward?: boolean;\n /** Valor base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Botón primario con menú desplegable integrado, en forma de píldora dividida.\n * Combina un botón principal de acción (emite `onAction`) con una flecha que\n * despliega opciones adicionales. Si no hay opciones visibles, la flecha se\n * oculta automáticamente.\n */\nexport function BtnDropdown({\n titleButton,\n options,\n icon,\n onAction,\n disabled = false,\n enableButton = true,\n whiteBtn = false,\n showDropdownOptions = true,\n openUpward = false,\n testId,\n}: BtnDropdownProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n /**\n * Alterna la apertura del menú anclándolo al botón de la flecha.\n * @param event - Evento de clic sobre la flecha.\n * @returns void\n */\n const handleToggle = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl((current) => (current ? null : event.currentTarget));\n };\n\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n const hasOptions = visibleOptions.length > 0;\n const showArrow = showDropdownOptions && hasOptions;\n\n return (\n <>\n <Box sx={BtnDropdownStyles.sxGroup}>\n <Button\n disableElevation\n startIcon={icon}\n onClick={onAction}\n disabled={disabled || !enableButton}\n data-testid={testId ? `btn-${testId}` : undefined}\n sx={BtnDropdownStyles.sxMainButton(whiteBtn, !showArrow)}>\n {titleButton}\n </Button>\n {showArrow ? (\n <Button\n disableElevation\n aria-haspopup=\"true\"\n aria-expanded={open ? 'true' : undefined}\n onClick={handleToggle}\n disabled={disabled}\n data-testid={testId ? `dropdown-toggle-${testId}` : undefined}\n sx={BtnDropdownStyles.sxArrowButton(whiteBtn, open)}>\n <ArrowDropDownIcon />\n </Button>\n ) : null}\n </Box>\n\n <SimpleDropdown\n options={options}\n anchorEl={anchorEl}\n open={open}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{\n vertical: openUpward ? 'top' : 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: openUpward ? 'bottom' : 'top',\n horizontal: 'right',\n }}\n testId={testId ? `dropdown-menu-${testId}` : undefined}\n />\n </>\n );\n}\n","'use client';\n\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { cloneElement, isValidElement, useMemo, useState } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport { SelectStyles } from '../../theme/selectStyles';\n\n/** Tamaño fijo (px) de los íconos de las opciones, en trigger y menú. */\nconst ICON_SIZE = 18;\n\n/**\n * Fuerza el ícono de una opción a {@link ICON_SIZE}×{@link ICON_SIZE}px. El\n * tamaño se aplica con `sx` sobre el **propio** ícono (no con un selector del\n * contenedor): así gana al tamaño por defecto de MUI (24px) sin depender de la\n * especificidad CSS. El `sx` del consumidor se respeta salvo el tamaño.\n */\nfunction withIconSize(icon: ReactNode): ReactNode {\n if (!isValidElement(icon)) return icon;\n const el = icon as ReactElement<{ sx?: SxProps<Theme> }>;\n return cloneElement(el, {\n sx: [\n el.props.sx,\n { fontSize: ICON_SIZE, width: ICON_SIZE, height: ICON_SIZE },\n ] as SxProps<Theme>,\n });\n}\n\n/** Opción de un `SelectDropdown`. */\nexport type SelectOption = {\n /** Valor que se emite en `onChange` y se compara con `value`. */\n value: string;\n /** Texto o nodo (ya traducido) a mostrar. */\n label: ReactNode;\n /** Ícono opcional a la izquierda del label. */\n icon?: ReactNode;\n /**\n * Color del ícono de esta opción (en el disparador y en el menú). Acepta un\n * valor de variable del theme (`cmsColors.*`, `feedbackColors.*`) o un path\n * del tema MUI (p. ej. `'m3.onSurfaceVariant'`). Si se omite, el ícono usa el\n * gris por defecto (`m3.onSurfaceVariant`).\n */\n iconColor?: string;\n /** Si es `false` la opción no se renderiza. Por defecto `true`. */\n show?: boolean;\n};\n\nexport type SelectDropdownProps = {\n /** Valor seleccionado actualmente. */\n value: string;\n /** Opciones disponibles. */\n options: SelectOption[];\n /** Callback al elegir una opción. */\n onChange: (value: string) => void;\n /**\n * Resalta el disparador con el color de acento (`secondary`).\n * Útil para señalar que hay un filtro activo distinto del valor por defecto.\n */\n highlighted?: boolean;\n /**\n * Muestra los íconos de las opciones (en el disparador y en el menú).\n * `true` → variante con ícono; `false` → variante solo texto. Por defecto `true`.\n */\n showIcons?: boolean;\n /** Ancho mínimo del menú. Por defecto `200`. */\n minWidth?: number | string;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Texto a mostrar cuando ningún valor coincide. */\n placeholder?: ReactNode;\n /**\n * Prefijo fijo antes del valor seleccionado en el disparador (p. ej.\n * \"Estado:\"). Solo aparece en el trigger, no en el menú. El prefijo va en peso\n * normal y el valor seleccionado en negrita.\n */\n prefix?: ReactNode;\n /** `aria-label` del disparador (accesibilidad). */\n ariaLabel?: string;\n /** Valor base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Selector de una sola opción con la estética \"vista/filtro\" del CMS: un\n * disparador outlined con label + chevron y un menú cuyo ítem activo se resalta\n * en `secondaryContainer`. Es presentacional y controlado: el consumidor pasa\n * `value` y `onChange`.\n *\n * Pensado para filtros de listado (p. ej. \"Últimas Noticias\" o\n * \"Todos / Activos / Inactivos\"), reutilizable desde cualquier app que consuma\n * la librería.\n */\nexport function SelectDropdown({\n value,\n options,\n onChange,\n highlighted = false,\n showIcons = true,\n minWidth = 200,\n disabled = false,\n placeholder,\n prefix,\n ariaLabel,\n testId,\n}: SelectDropdownProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n const active = useMemo(\n () => visibleOptions.find((option) => option.value === value),\n [visibleOptions, value],\n );\n\n /**\n * Aplica la selección y cierra el menú.\n * @param next - Valor de la opción elegida.\n * @returns void\n */\n const handleSelect = (next: string) => {\n onChange(next);\n setAnchorEl(null);\n };\n\n /** Renderiza una opción del menú. */\n const renderOption = (option: SelectOption) => {\n const selected = option.value === value;\n return (\n <MenuItem\n key={option.value}\n selected={selected}\n onClick={() => handleSelect(option.value)}\n data-testid={testId ? `${testId}-option-${option.value}` : undefined}\n sx={SelectStyles.sxItem(selected)}>\n {showIcons && option.icon ? (\n <ListItemIcon\n sx={{ color: option.iconColor ?? 'm3.onSurfaceVariant' }}>\n {withIconSize(option.icon)}\n </ListItemIcon>\n ) : null}\n {option.label}\n </MenuItem>\n );\n };\n\n return (\n <>\n <Button\n type=\"button\"\n disableElevation\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open ? 'true' : undefined}\n aria-label={ariaLabel}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n data-testid={testId}\n sx={SelectStyles.sxTrigger(highlighted, open)}>\n {showIcons && active?.icon ? (\n <Box\n component=\"span\"\n className=\"sel-lead\"\n sx={{ color: active.iconColor ?? 'inherit' }}>\n {withIconSize(active.icon)}\n </Box>\n ) : null}\n <Box\n component=\"span\"\n sx={{ flex: 1, textAlign: 'left', whiteSpace: 'nowrap' }}>\n {prefix != null ? (\n <>\n <Box component=\"span\" sx={{ fontWeight: 400, mr: 0.5 }}>\n {prefix}\n </Box>\n <Box component=\"span\" sx={{ fontWeight: 600 }}>\n {active?.label ?? placeholder}\n </Box>\n </>\n ) : (\n (active?.label ?? placeholder)\n )}\n </Box>\n <Box component=\"span\" className=\"sel-chevron\">\n <ExpandMoreIcon />\n </Box>\n </Button>\n\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{\n paper: { sx: SelectStyles.sxMenuPaper(minWidth) },\n list: {\n sx: SelectStyles.sxList,\n role: 'listbox',\n ...(testId ? ({ 'data-testid': `${testId}-menu` } as object) : {}),\n },\n }}>\n {visibleOptions.map(renderOption)}\n </Menu>\n </>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii, sizes } from '../../theme/variables';\n\n/**\n * Estilos del `CmsSearchField` — el buscador del CMS (equivale al `app-search`\n * del Angular legacy). Caja redondeada sobre `surfaceContainerHigh`, con lupa\n * opcional a la izquierda, input que puede crecer/colapsar, chips de términos\n * confirmados (modo chips) y un botón de \"opciones avanzadas\" (tres puntos)\n * opcional a la derecha.\n */\nexport const CmsSearchFieldStyles = {\n /** Caja contenedora del buscador (con hover y estado de foco). */\n sxRoot: (opts: { collapsed: boolean; focused: boolean }): SxProps<Theme> => ({\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n // Alto mínimo igual al del filtro (`buttonHeight`); crece si los chips\n // envuelven a varias líneas.\n minHeight: sizes.searchHeight,\n pl: '16px',\n pr: '6px',\n // Borde reservado (2px transparente en reposo) para que el foco no desplace el layout.\n border: '2px solid transparent',\n borderRadius: radii.md,\n bgcolor: 'm3.surfaceContainerHigh',\n color: 'm3.onSurfaceVariant',\n transition:\n 'width 0.16s cubic-bezier(0.4, 0, 0.2, 1), flex-basis 0.16s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.12s, border-color 0.12s',\n overflow: 'hidden',\n cursor: opts.collapsed ? 'pointer' : 'text',\n // Hover (sin foco): gris algo más oscuro.\n '&:hover': { bgcolor: cmsColors.searchHoverBg },\n ...(opts.collapsed ? { width: sizes.buttonHeight } : {}),\n // Foco (mientras se escribe): fondo gris lavanda + borde primario 2px.\n ...(opts.focused && !opts.collapsed\n ? {\n bgcolor: cmsColors.searchFocusBg,\n borderColor: cmsColors.primary,\n '&:hover': { bgcolor: cmsColors.searchFocusBg },\n }\n : {}),\n }),\n\n /** Zona de contenido (chips + input): fluye y envuelve si hay muchos chips. */\n sxContent: {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: '6px',\n flex: 1,\n minWidth: 0,\n py: '5px',\n } as SxProps<Theme>,\n\n /** Chip de un término de búsqueda confirmado (color secundario/tonal). */\n sxChip: {\n height: 24,\n maxWidth: '100%',\n borderRadius: radii.sm,\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n fontFamily: fontFamilies.googleSans,\n fontWeight: 500,\n '& .MuiChip-deleteIcon': {\n fontSize: 16,\n color: cmsColors.onSecondaryContainer,\n opacity: 0.7,\n '&:hover': { opacity: 1, color: cmsColors.onSecondaryContainer },\n },\n } as SxProps<Theme>,\n\n /** Lupa principal (toma el color primario al enfocar). */\n sxLeadIcon: (focused: boolean): SxProps<Theme> => ({\n color: focused ? cmsColors.primary : 'm3.onSurfaceVariant',\n fontSize: 20,\n flex: 'none',\n transition: 'color 0.12s',\n }),\n\n /** Input de texto. */\n sxInput: {\n flex: 1,\n minWidth: 60,\n border: 0,\n outline: 0,\n background: 'transparent',\n fontFamily: fontFamilies.googleSans,\n fontSize: 16,\n fontWeight: 400,\n color: cmsColors.textNav,\n '&::placeholder': {\n color: cmsColors.textNav,\n opacity: 1,\n },\n } as SxProps<Theme>,\n\n /** Botón redondo de opciones avanzadas (tres puntos). */\n sxIconBtn: {\n width: 28,\n height: 28,\n p: 0,\n flex: 'none',\n color: 'm3.onSurfaceVariant',\n '&:hover': {\n bgcolor: 'action.hover',\n color: 'm3.onSurface',\n },\n '& .MuiSvgIcon-root': { fontSize: 20 },\n } as SxProps<Theme>,\n\n /**\n * Botón limpiar (X): con foco toma el color primario; al perder el foco vuelve\n * a gris oscuro (`onSurfaceVariant`) —feedback pedido en NAA-4820—. Hover neutro.\n */\n sxClearBtn: (focused: boolean): SxProps<Theme> => ({\n width: 28,\n height: 28,\n p: 0,\n flex: 'none',\n color: focused ? cmsColors.primary : 'm3.onSurfaceVariant',\n transition: 'color 0.12s',\n '&:hover': {\n bgcolor: cmsColors.searchClearHoverBg,\n color: focused ? cmsColors.primary : 'm3.onSurfaceVariant',\n },\n '& .MuiSvgIcon-root': { fontSize: 20 },\n }),\n\n /** Botón de opciones avanzadas cuando hay filtros activos. */\n sxAdvancedActive: {\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n '&:hover': {\n bgcolor: cmsColors.secondaryHover,\n color: cmsColors.onSecondaryContainer,\n },\n } as SxProps<Theme>,\n\n /** Punto indicador de filtros activos sobre el botón de avanzadas. */\n sxDot: {\n position: 'absolute',\n top: 2,\n right: 2,\n width: 8,\n height: 8,\n borderRadius: radii.pill,\n bgcolor: cmsColors.primary,\n border: '1.5px solid',\n borderColor: 'm3.surfaceContainerHigh',\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';\nimport MoreVertOutlinedIcon from '@mui/icons-material/MoreVertOutlined';\nimport SearchOutlinedIcon from '@mui/icons-material/SearchOutlined';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport IconButton from '@mui/material/IconButton';\nimport { useRef, useState } from 'react';\nimport type { CSSProperties, KeyboardEvent } from 'react';\n\nimport { useCmsTranslation } from '../../i18n/useCmsTranslation';\nimport { toTestId } from '../../utils/toTestId';\nimport { CmsSearchFieldStyles } from './CmsSearchField.styles';\n\n/**\n * Transición de la expansión del buscador (modo `grow`): rápida y con easing\n * estándar de Material para que el crecer/encoger sea fluido (NAA-4820).\n */\nconst GROW_TRANSITION = '0.16s cubic-bezier(0.4, 0, 0.2, 1)';\n\n/**\n * Tope amplio del ancho al enfocar en modo `grow` (cuando no se pasa `maxWidth`).\n * `flex-grow` llena el espacio disponible; este tope solo evita animar hacia un\n * valor infinito y cubre cualquier ancho de toolbar realista.\n */\nconst GROW_MAX = 2400;\n\nexport type CmsSearchFieldProps = {\n /** Valor del texto de búsqueda en curso (controlado). */\n value: string;\n /** Callback en cada cambio del texto. */\n onChange: (value: string) => void;\n /**\n * Callback al ejecutar la búsqueda. En modo texto simple recibe el `value`\n * (string) al presionar Enter. En modo chips recibe la **lista de chips\n * vigente** (string[]) cuando hay que aplicar la búsqueda: al presionar Enter,\n * al quitar un chip y al limpiar. Con `;` NO se dispara (los chips se agregan y\n * esperan; ver §NAA-4820).\n */\n onSearch?: (value: string | string[]) => void;\n /** Callback al limpiar el campo. Si no se pasa, igual limpia `value` (y chips). */\n onClear?: () => void;\n /** Placeholder del input (ya traducido y modificable por el consumidor). */\n placeholder?: string;\n /**\n * Modo \"chips\": lista controlada de términos de búsqueda ya confirmados. Si se\n * pasa (aunque sea `[]`), el buscador funciona como buscador de chips: cada\n * término escrito se confirma como chip con `;` (sin buscar) o con Enter (que\n * además ejecuta la búsqueda). Los chips se muestran dentro del campo, cada uno\n * con su \"x\" para quitarlo. Sin esta prop, el campo es un buscador de texto simple.\n */\n chips?: string[];\n /** Callback con la nueva lista de chips (al agregar o quitar). */\n onChipsChange?: (chips: string[]) => void;\n /** Tecla que confirma un chip sin ejecutar la búsqueda. Por defecto `;`. */\n chipSeparator?: string;\n /** Placeholder cuando ya hay chips (ya traducido). Por defecto el de la lib (\"Agregar…\"). */\n addPlaceholder?: string;\n /** `aria-label` del botón de quitar un chip. */\n removeChipAriaLabel?: string;\n /** Muestra la lupa a la izquierda. Por defecto `true`. */\n showIcon?: boolean;\n /** Muestra el botón de opciones avanzadas (tres puntos). Por defecto `false`. */\n showAdvanced?: boolean;\n /** Marca el botón de avanzadas como activo (hay filtros aplicados). */\n advancedActive?: boolean;\n /** Callback al hacer clic en opciones avanzadas (abre modal o panel). */\n onAdvancedClick?: () => void;\n /**\n * Modo \"crece/colapsa\" como el `app-search` del Angular: arranca como un botón\n * con lupa y se expande al hacer foco; colapsa al perder foco si está vacío.\n * Por defecto `false` (input siempre expandido).\n */\n collapsible?: boolean;\n /** Ancho del input cuando está expandido. */\n width?: number | string;\n /**\n * Crece al enfocar hasta llenar el espacio disponible del contenedor (como el\n * buscador clásico del CMS), dejando `endGap` px antes del borde. En reposo\n * queda alineado a la derecha con ancho `width`. Por defecto `false`.\n */\n grow?: boolean;\n /** Ancho máximo opcional cuando `grow` está activo (por defecto sin tope). */\n maxWidth?: number | string;\n /** Espacio mínimo a la derecha cuando `grow` está activo. Por defecto `40`. */\n endGap?: number;\n /**\n * Separación mínima a la izquierda (px) que el buscador deja respecto del\n * control previo (p. ej. un filtro) **al crecer** en modo `grow`. En reposo\n * mantiene el ancho `width` alineado a la derecha; al enfocar crece hasta el\n * espacio disponible dejando este hueco a la izquierda. Por defecto sin hueco.\n */\n startGap?: number;\n /** `aria-label` del botón de avanzadas. */\n advancedAriaLabel?: string;\n /** `aria-label` del botón de limpiar. */\n clearAriaLabel?: string;\n /** `aria-label` del input. */\n ariaLabel?: string;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Buscador del CMS: input con lupa opcional, botón de limpiar y botón opcional\n * de \"opciones avanzadas\" (tres puntos) que el consumidor cablea a un modal o\n * panel lateral. Replica el comportamiento del `app-search` del Angular legacy\n * (incluido el modo `collapsible` que crece al enfocar y colapsa al vaciarse).\n *\n * Con la prop `chips` pasa a **buscador de chips**: cada término escrito se\n * confirma como chip con `;` (sin buscar) o con Enter (que además ejecuta la\n * búsqueda), y cada chip se muestra dentro del campo con su \"x\" para quitarlo\n * (NAA-4820). Es presentacional y controlado: el texto, los chips y los textos\n * visibles vienen por props; la decisión de qué abrir en \"avanzadas\" y cómo\n * filtrar vive en el gestor.\n */\nexport function CmsSearchField({\n value,\n onChange,\n onSearch,\n onClear,\n placeholder,\n chips,\n onChipsChange,\n chipSeparator = ';',\n addPlaceholder,\n removeChipAriaLabel,\n showIcon = true,\n showAdvanced = false,\n advancedActive = false,\n onAdvancedClick,\n collapsible = false,\n width = 320,\n grow = false,\n maxWidth,\n endGap = 40,\n startGap,\n advancedAriaLabel,\n clearAriaLabel,\n ariaLabel,\n testId,\n}: CmsSearchFieldProps) {\n // Textos por defecto desde la lib (resueltos al idioma del provider). Si el\n // consumidor pasa el prop, manda el suyo.\n const { t } = useCmsTranslation();\n const s = t.messages.search;\n const resolvedAriaLabel = ariaLabel ?? s.inputAriaLabel;\n const resolvedClearAria = clearAriaLabel ?? s.clearAriaLabel;\n const resolvedAdvancedAria = advancedAriaLabel ?? s.advancedAriaLabel;\n const resolvedRemoveChipAria = removeChipAriaLabel ?? s.removeChipAriaLabel;\n\n // Modo chips: activo cuando el consumidor pasa la prop `chips`.\n const chipMode = chips !== undefined;\n const chipList = chips ?? [];\n // Placeholder: \"Agregar…\" cuando ya hay chips; el normal en caso contrario.\n const resolvedPlaceholder =\n chipMode && chipList.length > 0\n ? (addPlaceholder ?? s.addPlaceholder)\n : (placeholder ?? s.placeholder);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [focused, setFocused] = useState(false);\n\n // En modo collapsible la caja colapsa solo si no hay foco, texto ni chips.\n const collapsed =\n collapsible && !focused && value.trim() === '' && chipList.length === 0;\n // Hay algo que limpiar: texto en curso o chips confirmados.\n const hasContent = value.length > 0 || chipList.length > 0;\n\n /**\n * Confirma el texto en curso como chip (dedupe + trim) SIN ejecutar la\n * búsqueda. Devuelve la nueva lista de chips para que Enter pueda, además,\n * dispararla con `onSearch`.\n */\n const commitChip = (): string[] => {\n const term = value.trim();\n const next =\n term && !chipList.includes(term) ? [...chipList, term] : chipList;\n if (next !== chipList) onChipsChange?.(next);\n if (term) onChange('');\n return next;\n };\n\n /** Quita un chip y re-ejecuta la búsqueda (quitar un filtro actualiza al toque). */\n const removeChip = (term: string) => {\n const next = chipList.filter((chip) => chip !== term);\n onChipsChange?.(next);\n onSearch?.(next);\n inputRef.current?.focus();\n };\n\n /** Maneja `;` (agrega chip y espera), Enter (agrega + busca) y Backspace (quita el último). */\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (!chipMode) {\n if (event.key === 'Enter') onSearch?.(value);\n return;\n }\n if (event.key === chipSeparator) {\n // `;` agrega el chip y espera: NO ejecuta la búsqueda todavía.\n event.preventDefault();\n commitChip();\n } else if (event.key === 'Enter') {\n // Enter agrega el texto pendiente y ejecuta la búsqueda con todos los chips.\n event.preventDefault();\n onSearch?.(commitChip());\n } else if (\n event.key === 'Backspace' &&\n value === '' &&\n chipList.length > 0\n ) {\n // Backspace con el input vacío quita el último chip (y re-ejecuta la búsqueda).\n event.preventDefault();\n const next = chipList.slice(0, -1);\n onChipsChange?.(next);\n onSearch?.(next);\n }\n };\n\n /**\n * Limpia el texto y los chips, ejecuta la búsqueda vacía y **colapsa** el\n * buscador (lo desenfoca para que vuelva al ancho de reposo), en vez de\n * mantener el foco. Pedido en NAA-4820: al tocar la X debe colapsarse y limpiarse.\n */\n const handleClear = () => {\n if (onClear) onClear();\n else onChange('');\n if (chipMode) {\n onChipsChange?.([]);\n onSearch?.([]);\n }\n inputRef.current?.blur();\n };\n\n /** Expande el buscador colapsado al hacer clic en la caja. */\n const handleRootClick = () => {\n if (collapsed) inputRef.current?.focus();\n };\n\n let rootStyle: CSSProperties | undefined;\n if (collapsed) {\n rootStyle = undefined;\n } else if (grow) {\n // En reposo queda a la derecha con ancho `width`; al enfocar crece hasta\n // llenar el espacio disponible dejando `endGap` px antes del borde. Se anima\n // SIEMPRE `flex-basis` (misma propiedad en ambos estados, con `flex-shrink`\n // acotando al espacio real) para que la expansión sea fluida y no un salto.\n // Crece con `flex-grow` (fiable en cualquier contenedor) y se anima el\n // `max-width`: en reposo el tope es `width` (queda compacto y alineado a la\n // derecha vía margen automático); al enfocar el tope se abre y el buscador\n // llena el espacio disponible. Si se pasó `startGap`, al crecer deja ese\n // hueco a la izquierda respecto del control previo (p. ej. los filtros).\n rootStyle = {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: 0,\n // Permite encoger por debajo del contenido para caber junto a otros\n // controles en la misma fila (toolbars angostos).\n minWidth: 0,\n maxWidth: focused ? (maxWidth ?? GROW_MAX) : width,\n marginLeft: focused && startGap != null ? startGap : 'auto',\n marginRight: endGap,\n transition: `max-width ${GROW_TRANSITION}`,\n };\n } else {\n rootStyle = { flexBasis: width, maxWidth: '100%' };\n }\n\n return (\n <Box\n sx={CmsSearchFieldStyles.sxRoot({ collapsed, focused })}\n style={rootStyle}\n onClick={handleRootClick}\n data-testid={testId}>\n {showIcon && (\n <SearchOutlinedIcon sx={CmsSearchFieldStyles.sxLeadIcon(focused)} />\n )}\n\n {!collapsed && (\n <Box sx={CmsSearchFieldStyles.sxContent}>\n {chipMode &&\n chipList.map((chip) => (\n <Chip\n key={chip}\n label={chip}\n size=\"small\"\n onDelete={() => removeChip(chip)}\n deleteIcon={\n <CloseOutlinedIcon\n aria-label={resolvedRemoveChipAria}\n data-testid={\n testId\n ? `${testId}-chip-${toTestId(chip)}-remove`\n : undefined\n }\n />\n }\n sx={CmsSearchFieldStyles.sxChip}\n data-testid={\n testId ? `${testId}-chip-${toTestId(chip)}` : undefined\n }\n />\n ))}\n\n <Box\n component=\"input\"\n ref={inputRef}\n type=\"text\"\n autoComplete=\"off\"\n aria-label={resolvedAriaLabel}\n placeholder={resolvedPlaceholder}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n sx={CmsSearchFieldStyles.sxInput}\n data-testid={testId ? `${testId}-input` : undefined}\n />\n </Box>\n )}\n\n {!collapsed && hasContent && (\n <IconButton\n size=\"small\"\n aria-label={resolvedClearAria}\n onClick={handleClear}\n sx={CmsSearchFieldStyles.sxClearBtn(focused)}\n data-testid={testId ? `${testId}-icon-btn-clear` : undefined}>\n <CloseOutlinedIcon />\n </IconButton>\n )}\n\n {!collapsed && showAdvanced && (\n <IconButton\n size=\"small\"\n aria-label={resolvedAdvancedAria}\n aria-haspopup=\"dialog\"\n onClick={(event) => {\n event.stopPropagation();\n onAdvancedClick?.();\n }}\n sx={{\n ...(CmsSearchFieldStyles.sxIconBtn as object),\n position: 'relative',\n ...(advancedActive\n ? (CmsSearchFieldStyles.sxAdvancedActive as object)\n : {}),\n }}\n data-testid={testId ? `${testId}-icon-btn-advanced` : undefined}>\n <MoreVertOutlinedIcon />\n {advancedActive && <Box component=\"span\" sx={CmsSearchFieldStyles.sxDot} />}\n </IconButton>\n )}\n </Box>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies } from '../../theme/variables';\n\n/**\n * Estilos del `CmsEmptyState` — bloque centrado de \"sin resultados\" para\n * listados y tablas (icono + título + subtítulo). El color del icono usa la\n * variable `actionIcon` (#43474E) para mantener el gris del sistema.\n */\nexport const CmsEmptyStateStyles = {\n /** Contenedor centrado en columna. */\n sxRoot: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n gap: '6px',\n py: 8,\n px: 3,\n } as SxProps<Theme>,\n\n /** Icono ilustrativo (por defecto `search_off`), en gris `actionIcon` (rgb 67,71,78). */\n sxIcon: {\n color: cmsColors.actionIcon,\n mb: '2px',\n '& .MuiSvgIcon-root': { fontSize: 40, color: cmsColors.actionIcon },\n } as SxProps<Theme>,\n\n /** Título del estado vacío. */\n sxTitle: {\n fontFamily: fontFamilies.googleSans,\n fontWeight: 600,\n fontSize: 16,\n color: cmsColors.textStrong,\n } as SxProps<Theme>,\n\n /** Subtítulo / ayuda. */\n sxDescription: {\n fontFamily: fontFamilies.googleSans,\n fontWeight: 400,\n fontSize: 14,\n color: cmsColors.textNav,\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport SearchOffOutlinedIcon from '@mui/icons-material/SearchOffOutlined';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { ReactNode } from 'react';\n\nimport { CmsEmptyStateStyles } from './CmsEmptyState.styles';\n\nexport type CmsEmptyStateProps = {\n /** Título principal (ya traducido). */\n title: string;\n /** Subtítulo / ayuda opcional (ya traducido). */\n description?: string;\n /** Icono a mostrar. Por defecto `search_off` (SearchOffOutlined). */\n icon?: ReactNode;\n /** Base para los `data-testid` (p. ej. `panel-users-empty`). */\n testId?: string;\n};\n\n/**\n * Bloque de \"sin resultados\" para listados y tablas: icono + título + subtítulo,\n * centrado. Presentacional; los textos vienen por props (i18n del gestor).\n * Replica el estado vacío del CMS Angular legacy.\n */\nexport function CmsEmptyState({\n title,\n description,\n icon,\n testId,\n}: CmsEmptyStateProps) {\n return (\n <Box sx={CmsEmptyStateStyles.sxRoot} data-testid={testId}>\n <Box sx={CmsEmptyStateStyles.sxIcon}>\n {icon ?? <SearchOffOutlinedIcon />}\n </Box>\n <Typography\n sx={CmsEmptyStateStyles.sxTitle}\n data-testid={testId ? `${testId}-title` : undefined}>\n {title}\n </Typography>\n {description ? (\n <Typography\n sx={CmsEmptyStateStyles.sxDescription}\n data-testid={testId ? `${testId}-description` : undefined}>\n {description}\n </Typography>\n ) : null}\n </Box>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii } from '../../theme/variables';\n\n/**\n * Estilos del `CmsFilterBar` — la barra de filtros activos que aparece bajo la\n * toolbar del listado (label \"Filtros:\" + chips removibles + \"Limpiar todo\").\n *\n * Colores (todos con variables de `variables.ts`):\n * - Label + icono `filter_alt`: `actionIcon` (#43474E), 14px.\n * - Chip: fondo `secondary` (#D8E2FF); icono/texto `onSecondaryContainer`\n * (#2C4678), peso 400, 14px; X `onSecondaryContainer` con hover `secondaryHover`.\n * - \"Limpiar todo\": `primary` (#0067C4), 14px; X 18px.\n */\nexport const CmsFilterBarStyles = {\n /** Fila con label + chips + limpiar todo (envuelve si no entra). */\n sxRoot: {\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '10px',\n } as SxProps<Theme>,\n\n /** Grupo \"icono filter_alt + Filtros:\". */\n sxLabel: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n color: cmsColors.actionIcon,\n } as SxProps<Theme>,\n\n sxLabelIcon: {\n fontSize: 18,\n } as SxProps<Theme>,\n\n sxLabelText: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n color: cmsColors.actionIcon,\n } as SxProps<Theme>,\n\n /** Chip de un filtro activo (fondo secundario). */\n sxChip: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n height: 32,\n pl: '10px',\n pr: '4px',\n borderRadius: radii.sm,\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n } as SxProps<Theme>,\n\n /** Icono opcional a la izquierda del label del chip (p. ej. `search`). */\n sxChipIcon: {\n display: 'inline-flex',\n color: cmsColors.onSecondaryContainer,\n '& .MuiSvgIcon-root': { fontSize: 18 },\n } as SxProps<Theme>,\n\n sxChipLabel: {\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 400,\n color: cmsColors.onSecondaryContainer,\n whiteSpace: 'nowrap',\n } as SxProps<Theme>,\n\n /** Botón X del chip: quita ese filtro. */\n sxChipRemove: {\n width: 24,\n height: 24,\n p: 0,\n flex: 'none',\n color: cmsColors.onSecondaryContainer,\n '&:hover': {\n bgcolor: cmsColors.secondaryHover,\n color: cmsColors.onSecondaryContainer,\n },\n '& .MuiSvgIcon-root': { fontSize: 18 },\n } as SxProps<Theme>,\n\n /** \"Limpiar todo\": link de acción primario con X de 18px. */\n sxClearAll: {\n minWidth: 0,\n px: '8px',\n height: 32,\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n color: cmsColors.primary,\n '&:hover': { bgcolor: cmsColors.neutralHover },\n '& .MuiButton-startIcon': { mr: '4px' },\n '& .MuiButton-startIcon .MuiSvgIcon-root': { fontSize: 18 },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';\nimport FilterAltOutlinedIcon from '@mui/icons-material/FilterAltOutlined';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport type { ReactNode } from 'react';\n\nimport { CmsFilterBarStyles } from './CmsFilterBar.styles';\n\n/** Chip de un filtro activo dentro del `CmsFilterBar`. */\nexport type CmsFilterChip = {\n /** Id estable del chip (para la key y el `data-testid`). */\n id: string;\n /** Texto o nodo a mostrar (ya traducido / formateado). */\n label: ReactNode;\n /** Icono opcional a la izquierda del label (p. ej. `search`). */\n icon?: ReactNode;\n /** Callback al quitar este filtro (clic en la X del chip). */\n onRemove: () => void;\n /** `aria-label` de la X del chip. */\n removeAriaLabel?: string;\n /** `data-testid` base del chip (la X será `${testId}-icon-btn-remove`). */\n testId?: string;\n};\n\nexport type CmsFilterBarProps = {\n /** Texto del prefijo (p. ej. \"Filtros:\"). */\n label: string;\n /** Chips de filtros activos. Si está vacío, la barra no se renderiza. */\n chips: CmsFilterChip[];\n /** Callback de \"Limpiar todo\" (limpia todos los filtros). Si se omite, no se muestra. */\n onClearAll?: () => void;\n /** Texto del botón \"Limpiar todo\" (ya traducido). */\n clearAllLabel?: string;\n /** `data-testid` base de la barra. */\n testId?: string;\n};\n\n/**\n * Barra de filtros activos: aparece bajo la toolbar del listado con el label\n * \"Filtros:\", un chip removible por cada filtro aplicado y un botón\n * \"Limpiar todo\". Presentacional y controlado: los chips y los callbacks los\n * arma el gestor (dominio del producto); la lib solo aporta la estética común.\n *\n * No renderiza nada si no hay chips activos.\n */\nexport function CmsFilterBar({\n label,\n chips,\n onClearAll,\n clearAllLabel,\n testId,\n}: CmsFilterBarProps) {\n if (chips.length === 0) return null;\n\n return (\n <Box sx={CmsFilterBarStyles.sxRoot} data-testid={testId}>\n <Box sx={CmsFilterBarStyles.sxLabel}>\n <FilterAltOutlinedIcon sx={CmsFilterBarStyles.sxLabelIcon} />\n <Typography component=\"span\" sx={CmsFilterBarStyles.sxLabelText}>\n {label}\n </Typography>\n </Box>\n\n {chips.map((chip) => (\n <Box\n key={chip.id}\n sx={CmsFilterBarStyles.sxChip}\n data-testid={chip.testId}>\n {chip.icon ? (\n <Box sx={CmsFilterBarStyles.sxChipIcon}>{chip.icon}</Box>\n ) : null}\n <Box component=\"span\" sx={CmsFilterBarStyles.sxChipLabel}>\n {chip.label}\n </Box>\n <IconButton\n size=\"small\"\n aria-label={chip.removeAriaLabel}\n onClick={chip.onRemove}\n sx={CmsFilterBarStyles.sxChipRemove}\n data-testid={\n chip.testId ? `${chip.testId}-icon-btn-remove` : undefined\n }>\n <CloseOutlinedIcon />\n </IconButton>\n </Box>\n ))}\n\n {onClearAll ? (\n <Button\n onClick={onClearAll}\n startIcon={<CloseOutlinedIcon />}\n sx={CmsFilterBarStyles.sxClearAll}\n data-testid={testId ? `${testId}-btn-clear-all` : undefined}>\n {clearAllLabel}\n </Button>\n ) : null}\n </Box>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, radii, shadows } from '../../theme/variables';\n\n/**\n * Estilos compartidos de los campos de formulario del CMS.\n *\n * Replican la estética \"Material 3 standard\" del diseño de referencia\n * (etiqueta arriba en gris, control con subrayado inferior; el subrayado pasa a\n * `primary` al enfocar). Viven juntos para que todos los campos\n * (`CmsTextField`, `CmsSelectField`, etc.) compartan exactamente el mismo look y\n * puedan reutilizarse en cualquier formulario de cualquier gestor.\n */\nexport const fieldStyles = {\n /** Contenedor vertical: etiqueta + control + ayuda. */\n sxField: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n minWidth: 0,\n } as SxProps<Theme>,\n\n /** Etiqueta superior (gris, label-medium). */\n sxLabel: {\n font: 'inherit',\n fontSize: 12,\n fontWeight: 500,\n lineHeight: '16px',\n letterSpacing: '0.02em',\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /** Texto de ayuda bajo el control. */\n sxHint: {\n fontSize: 11,\n lineHeight: '16px',\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /**\n * `sx` para los controles basados en `TextField variant=\"standard\"`\n * (texto, número, fecha, select) y para el `renderInput` de los\n * `Autocomplete` (combobox, tags, multiselect). Unifica subrayado,\n * tipografía y color del placeholder.\n */\n sxStandard: {\n '& .MuiInputBase-root': {\n fontSize: 14,\n color: 'm3.onSurface',\n },\n '& .MuiInputBase-input': {\n paddingTop: '6px',\n paddingBottom: '6px',\n },\n // Subrayado en reposo / hover / foco.\n '& .MuiInputBase-root::before': {\n borderBottom: `1px solid ${cmsColors.border}`,\n },\n '& .MuiInputBase-root:hover:not(.Mui-disabled, .Mui-error)::before': {\n borderBottom: `1px solid ${cmsColors.controlBorder}`,\n },\n '& .MuiInputBase-root::after': {\n borderBottomColor: cmsColors.primary,\n },\n // Placeholder atenuado.\n '& input::placeholder, & textarea::placeholder': {\n color: 'm3.onSurfaceVariant',\n opacity: 0.6,\n },\n } as SxProps<Theme>,\n\n /**\n * Chips de los campos multiselección / etiquetas: fondo secundario, texto\n * sobre contenedor secundario y radio \"redondo cuadrado\".\n */\n sxChip: {\n height: 26,\n borderRadius: radii.sm,\n bgcolor: cmsColors.secondary,\n color: cmsColors.onSecondaryContainer,\n fontWeight: 500,\n '& .MuiChip-deleteIcon': {\n color: cmsColors.onSecondaryContainer,\n opacity: 0.7,\n '&:hover': { opacity: 1, color: cmsColors.onSecondaryContainer },\n },\n } as SxProps<Theme>,\n\n /** Paper del desplegable de los `Autocomplete` (con aire vertical). */\n sxAutocompletePaper: {\n borderRadius: radii.lg,\n border: '1px solid',\n borderColor: 'm3.outlineVariant',\n py: '6px',\n } as SxProps<Theme>,\n\n /**\n * Listbox de los `Autocomplete`: opciones \"embutidas\" (con aire lateral y\n * radio), hover en `secondaryHover` y opción activa en `secondary`.\n */\n sxAutocompleteListbox: {\n '& .MuiAutocomplete-option': {\n borderRadius: radii.sm,\n mx: '6px',\n my: '2px',\n minHeight: 40,\n },\n '& .MuiAutocomplete-option.Mui-focused': {\n bgcolor: cmsColors.secondaryHover,\n },\n '& .MuiAutocomplete-option[aria-selected=\"true\"]': {\n bgcolor: cmsColors.secondary,\n },\n '& .MuiAutocomplete-option[aria-selected=\"true\"].Mui-focused': {\n bgcolor: cmsColors.secondaryHover,\n },\n } as SxProps<Theme>,\n\n /**\n * Paper del menú de `CmsSelectField`. Menú M3 común a todos los desplegables:\n * fondo `menuSurface` (#ECEDF6), sin padding lateral (ítems de borde a borde) y\n * 8px arriba/abajo; `overflow: hidden` recorta las esquinas del hover.\n */\n sxSelectMenuPaper: {\n mt: '4px',\n py: '8px',\n px: 0,\n borderRadius: radii.lg,\n bgcolor: cmsColors.menuSurface,\n border: '1px solid',\n borderColor: 'm3.outlineVariant',\n boxShadow: shadows.menuSoft,\n overflow: 'hidden',\n } as SxProps<Theme>,\n\n /** Lista del menú del select (sin padding ni gap: los ítems van full-bleed). */\n sxSelectList: {\n p: 0,\n display: 'flex',\n flexDirection: 'column',\n } as SxProps<Theme>,\n\n /**\n * Opción del menú del select: full-bleed (sin radio), hover en `neutralHover`\n * (state layer M3 `onSurface` al 8%, #191C20), activa en `secondary`. El check\n * va a la derecha.\n */\n sxSelectItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n borderRadius: 0,\n px: '16px',\n py: '8px',\n fontSize: 14,\n color: cmsColors.controlText,\n '&:hover': { bgcolor: cmsColors.neutralHover },\n '&.Mui-selected': {\n bgcolor: cmsColors.secondary,\n '&:hover': { bgcolor: cmsColors.secondary },\n },\n '&.Mui-focusVisible': { bgcolor: cmsColors.neutralHover },\n } as SxProps<Theme>,\n\n /** Check de la opción activa del select. */\n sxSelectCheck: {\n fontSize: 18,\n color: cmsColors.primary,\n flex: 'none',\n } as SxProps<Theme>,\n\n /** Etiqueta del checkbox (alineada al control). */\n sxCheckboxLabel: {\n m: 0,\n gap: '4px',\n '& .MuiFormControlLabel-label': {\n fontSize: 14,\n color: 'm3.onSurface',\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport Checkbox from '@mui/material/Checkbox';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport { useId } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { cmsColors } from '../../theme/variables';\nimport { fieldStyles } from './fieldStyles';\n\nexport type CmsCheckboxFieldProps = {\n /** Estado actual (controlado). */\n value: boolean;\n /** Callback con el nuevo estado. */\n onChange: (value: boolean) => void;\n /** Etiqueta a la derecha del checkbox (ya traducida). */\n label?: ReactNode;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Checkbox con etiqueta. Activo = cuadro relleno con el color primario y check\n * blanco (íconos por defecto de MUI, sin override). Controlado y reutilizable.\n */\nexport function CmsCheckboxField({\n value,\n onChange,\n label,\n disabled = false,\n testId,\n}: CmsCheckboxFieldProps) {\n const id = useId();\n return (\n <FormControlLabel\n sx={fieldStyles.sxCheckboxLabel}\n disabled={disabled}\n control={\n <Checkbox\n id={id}\n checked={value}\n onChange={(event) => onChange(event.target.checked)}\n data-testid={testId}\n sx={{\n color: cmsColors.controlBorder,\n '&.Mui-checked': { color: cmsColors.primary },\n }}\n />\n }\n label={label}\n />\n );\n}\n","'use client';\n\nimport Box from '@mui/material/Box';\nimport type { ReactNode } from 'react';\n\nimport { fieldStyles } from './fieldStyles';\n\nexport type FieldShellProps = {\n /** Etiqueta superior (ya traducida). Si se omite no se renderiza. */\n label?: ReactNode;\n /** `htmlFor` para asociar la etiqueta al control. */\n htmlFor?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** El control del campo. */\n children: ReactNode;\n};\n\n/**\n * Envoltorio común de un campo: etiqueta arriba + control + ayuda abajo.\n *\n * Centraliza la disposición vertical y la tipografía de la etiqueta para que\n * todos los campos del CMS se vean idénticos. Se exporta para poder construir\n * campos a medida que respeten el mismo layout.\n */\nexport function FieldShell({ label, htmlFor, hint, children }: FieldShellProps) {\n return (\n <Box sx={fieldStyles.sxField}>\n {label != null && (\n <Box component=\"label\" htmlFor={htmlFor} sx={fieldStyles.sxLabel}>\n {label}\n </Box>\n )}\n {children}\n {hint != null && <Box sx={fieldStyles.sxHint}>{hint}</Box>}\n </Box>\n );\n}\n","'use client';\n\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport { useId, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { useCmsTranslation } from '../../i18n/useCmsTranslation';\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\nimport type { FieldOption } from './types';\n\nexport type CmsComboboxFieldProps = {\n /** Valor seleccionado (value de la opción; vacío = ninguno). */\n value: string;\n /** Callback con el nuevo value (o '' al limpiar). */\n onChange: (value: string) => void;\n /** Opciones disponibles. */\n options: FieldOption[];\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Texto cuando no hay coincidencias (ya traducido). */\n noOptionsText?: ReactNode;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Combobox de una sola opción con búsqueda escribiendo (equivale al campo\n * \"Creador\" / \"Autor\" del diseño). Internamente usa `Autocomplete` de MUI pero\n * expone una API por `value: string`. Controlado y reutilizable.\n */\nexport function CmsComboboxField({\n value,\n onChange,\n options,\n label,\n placeholder,\n hint,\n noOptionsText,\n disabled = false,\n testId,\n}: CmsComboboxFieldProps) {\n const id = useId();\n const { t } = useCmsTranslation();\n const resolvedNoOptions = noOptionsText ?? t.messages.search.noOptions;\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n const selected = useMemo(\n () => visibleOptions.find((option) => option.value === value) ?? null,\n [visibleOptions, value],\n );\n\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <Autocomplete\n id={id}\n data-testid={testId}\n options={visibleOptions}\n value={selected}\n disabled={disabled}\n noOptionsText={resolvedNoOptions}\n getOptionLabel={(option) =>\n typeof option.label === 'string' ? option.label : option.value\n }\n getOptionDisabled={(option) => Boolean(option.disabled)}\n isOptionEqualToValue={(option, current) =>\n option.value === current.value\n }\n onChange={(_event, next) => onChange(next ? next.value : '')}\n slotProps={{\n paper: { sx: fieldStyles.sxAutocompletePaper },\n listbox: { sx: fieldStyles.sxAutocompleteListbox },\n }}\n renderInput={(params) => (\n <TextField\n {...params}\n variant=\"standard\"\n placeholder={placeholder}\n sx={fieldStyles.sxStandard}\n />\n )}\n />\n </FieldShell>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, shadows } from '../../theme/variables';\n\n/**\n * Estilos del calendario M3 propio de `CmsDateField` (reemplaza al selector\n * nativo del navegador). Superficie gris, día seleccionado y botones en color\n * primario, ancho cómodo y sombra suave, igual que el diseño de referencia.\n */\nexport const datePickerStyles = {\n /** Paper del popover del calendario. */\n sxPaper: {\n width: 312,\n p: '12px 12px 8px',\n borderRadius: '16px',\n bgcolor: 'm3.surfaceContainer',\n backgroundImage: 'none',\n boxShadow: shadows.menu,\n } as SxProps<Theme>,\n\n /** Cabecera: mes/año + navegación. */\n sxHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n px: '6px',\n pb: '8px',\n } as SxProps<Theme>,\n\n sxMonthLabel: {\n fontSize: 14,\n fontWeight: 600,\n color: 'm3.onSurface',\n textTransform: 'capitalize',\n } as SxProps<Theme>,\n\n sxNav: { display: 'inline-flex', gap: '2px' } as SxProps<Theme>,\n\n sxNavBtn: {\n width: 36,\n height: 36,\n color: 'm3.onSurfaceVariant',\n '&:hover': { bgcolor: cmsColors.surfaceHover, color: 'm3.onSurface' },\n } as SxProps<Theme>,\n\n sxGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: '2px',\n } as SxProps<Theme>,\n\n sxDow: {\n height: 32,\n display: 'grid',\n placeItems: 'center',\n fontSize: 11,\n fontWeight: 500,\n color: 'm3.onSurfaceVariant',\n } as SxProps<Theme>,\n\n /** Celda de día, con sus variantes (otro mes / hoy / seleccionado). */\n sxDay: (opts: {\n other: boolean;\n today: boolean;\n selected: boolean;\n }): SxProps<Theme> => ({\n height: 40,\n border: 0,\n p: 0,\n borderRadius: '999px',\n display: 'grid',\n placeItems: 'center',\n fontSize: 14,\n cursor: 'pointer',\n bgcolor: 'transparent',\n color: 'm3.onSurface',\n transition: 'background-color 0.12s, color 0.12s',\n '&:hover': { bgcolor: cmsColors.surfaceHover },\n ...(opts.other ? { color: 'm3.onSurfaceVariant', opacity: 0.55 } : {}),\n ...(opts.today\n ? { boxShadow: `inset 0 0 0 1px ${cmsColors.primary}`, color: cmsColors.primary }\n : {}),\n ...(opts.selected\n ? {\n bgcolor: cmsColors.primary,\n color: cmsColors.white,\n fontWeight: 600,\n '&:hover': { bgcolor: cmsColors.primaryHover },\n }\n : {}),\n }),\n\n sxFooter: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '4px',\n pt: '6px',\n } as SxProps<Theme>,\n\n sxFooterBtn: {\n height: 36,\n px: '14px',\n borderRadius: '999px',\n textTransform: 'none',\n fontWeight: 500,\n color: cmsColors.primary,\n '&:hover': {\n bgcolor: `color-mix(in oklab, ${cmsColors.primary} 10%, transparent)`,\n },\n } as SxProps<Theme>,\n};\n","'use client';\n\nimport CalendarTodayOutlinedIcon from '@mui/icons-material/CalendarTodayOutlined';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Popover from '@mui/material/Popover';\nimport TextField from '@mui/material/TextField';\nimport { useId, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\nimport {\n getIntlLocaleTag,\n useCmsTranslation,\n} from '../../i18n/useCmsTranslation';\nimport { datePickerStyles } from './CmsDateField.styles';\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\n\nexport type CmsDateFieldProps = {\n /** Valor en formato ISO `AAAA-MM-DD` (controlado; vacío = sin fecha). */\n value: string;\n /** Callback con la nueva fecha ISO (o '' al limpiar). */\n onChange: (value: string) => void;\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : `${n}`;\n}\n\n/** Parsea un ISO `AAAA-MM-DD` a sus partes; `null` si no es válido. */\nfunction parseISO(value: string): { y: number; m: number; d: number } | null {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n if (!match) return null;\n return { y: +match[1], m: +match[2] - 1, d: +match[3] };\n}\n\nfunction toISO(y: number, m: number, d: number): string {\n return `${y}-${pad(m + 1)}-${pad(d)}`;\n}\n\n/**\n * Campo de fecha con calendario Material 3 propio (no el selector nativo del\n * navegador, que no se puede estilar). El valor se maneja en ISO `AAAA-MM-DD` y\n * se muestra como `dd/mm/aaaa`. Los meses y días se rotulan según el idioma del\n * provider. Controlado y reutilizable.\n */\nexport function CmsDateField({\n value,\n onChange,\n label,\n hint,\n disabled = false,\n testId,\n}: CmsDateFieldProps) {\n const id = useId();\n const { t, locale } = useCmsTranslation();\n const s = t.messages.search;\n const localeTag = getIntlLocaleTag(locale);\n\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const [open, setOpen] = useState(false);\n\n const selected = parseISO(value);\n const today = new Date();\n\n // Mes en vista: arranca en la fecha seleccionada o en el mes actual.\n const [view, setView] = useState(() =>\n selected\n ? { y: selected.y, m: selected.m }\n : { y: today.getFullYear(), m: today.getMonth() },\n );\n\n const display = selected\n ? `${pad(selected.d)}/${pad(selected.m + 1)}/${selected.y}`\n : '';\n\n // Nombres de los días (orden lunes→domingo) según el idioma.\n const weekdays = useMemo(() => {\n const fmt = new Intl.DateTimeFormat(localeTag, { weekday: 'short' });\n const monday = new Date(2023, 0, 2); // lunes de referencia\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(monday.getFullYear(), monday.getMonth(), monday.getDate() + i);\n return fmt.format(d).replace('.', '').slice(0, 2);\n });\n }, [localeTag]);\n\n const monthLabel = useMemo(\n () =>\n new Intl.DateTimeFormat(localeTag, {\n month: 'long',\n year: 'numeric',\n }).format(new Date(view.y, view.m, 1)),\n [localeTag, view],\n );\n\n // 42 celdas (6 semanas) empezando en lunes.\n const cells = useMemo(() => {\n const first = new Date(view.y, view.m, 1);\n const startDow = (first.getDay() + 6) % 7;\n return Array.from({ length: 42 }, (_, i) => {\n const date = new Date(view.y, view.m, 1 + (i - startDow));\n return { y: date.getFullYear(), m: date.getMonth(), d: date.getDate() };\n });\n }, [view]);\n\n const openPicker = (event: React.MouseEvent) => {\n if (disabled) return;\n event.preventDefault();\n const host = (event.currentTarget as HTMLElement).closest(\n '[data-cms-datefield]',\n ) as HTMLElement | null;\n setAnchorEl(host);\n setView(\n selected\n ? { y: selected.y, m: selected.m }\n : { y: today.getFullYear(), m: today.getMonth() },\n );\n setOpen(true);\n };\n\n const prevMonth = () =>\n setView((v) => (v.m === 0 ? { y: v.y - 1, m: 11 } : { y: v.y, m: v.m - 1 }));\n const nextMonth = () =>\n setView((v) => (v.m === 11 ? { y: v.y + 1, m: 0 } : { y: v.y, m: v.m + 1 }));\n\n const pickDay = (cell: { y: number; m: number; d: number }) => {\n onChange(toISO(cell.y, cell.m, cell.d));\n setOpen(false);\n };\n\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <Box data-cms-datefield>\n <TextField\n id={id}\n variant=\"standard\"\n value={display}\n placeholder=\"dd/mm/aaaa\"\n disabled={disabled}\n fullWidth\n onClick={openPicker}\n sx={fieldStyles.sxStandard}\n slotProps={{\n input: {\n readOnly: true,\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n edge=\"end\"\n disabled={disabled}\n aria-label={s.dateOpenAriaLabel}\n onClick={openPicker}>\n <CalendarTodayOutlinedIcon sx={{ fontSize: 18 }} />\n </IconButton>\n </InputAdornment>\n ),\n },\n htmlInput: { 'data-testid': testId, style: { cursor: 'pointer' } },\n }}\n />\n </Box>\n\n <Popover\n open={open && Boolean(anchorEl)}\n anchorEl={anchorEl}\n onClose={() => setOpen(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{ paper: { sx: datePickerStyles.sxPaper } }}>\n <Box sx={datePickerStyles.sxHeader}>\n <Box sx={datePickerStyles.sxMonthLabel}>{monthLabel}</Box>\n <Box sx={datePickerStyles.sxNav}>\n <IconButton\n size=\"small\"\n aria-label={s.prevMonthAriaLabel}\n onClick={prevMonth}\n sx={datePickerStyles.sxNavBtn}>\n <ChevronLeftIcon />\n </IconButton>\n <IconButton\n size=\"small\"\n aria-label={s.nextMonthAriaLabel}\n onClick={nextMonth}\n sx={datePickerStyles.sxNavBtn}>\n <ChevronRightIcon />\n </IconButton>\n </Box>\n </Box>\n\n <Box sx={datePickerStyles.sxGrid}>\n {weekdays.map((day, i) => (\n <Box key={`dow-${i}`} sx={datePickerStyles.sxDow}>\n {day}\n </Box>\n ))}\n {cells.map((cell, i) => {\n const other = cell.m !== view.m;\n const isToday =\n cell.y === today.getFullYear() &&\n cell.m === today.getMonth() &&\n cell.d === today.getDate();\n const isSelected =\n !!selected &&\n cell.y === selected.y &&\n cell.m === selected.m &&\n cell.d === selected.d;\n return (\n <Box\n key={`day-${i}`}\n component=\"button\"\n type=\"button\"\n onClick={() => pickDay(cell)}\n sx={datePickerStyles.sxDay({\n other,\n today: isToday,\n selected: isSelected,\n })}>\n {cell.d}\n </Box>\n );\n })}\n </Box>\n\n <Box sx={datePickerStyles.sxFooter}>\n <Button\n sx={datePickerStyles.sxFooterBtn}\n onClick={() => {\n onChange('');\n setOpen(false);\n }}>\n {s.dateClear}\n </Button>\n <Button\n sx={datePickerStyles.sxFooterBtn}\n onClick={() => {\n onChange(toISO(today.getFullYear(), today.getMonth(), today.getDate()));\n setOpen(false);\n }}>\n {s.dateToday}\n </Button>\n </Box>\n </Popover>\n </FieldShell>\n );\n}\n","'use client';\n\nimport Autocomplete from '@mui/material/Autocomplete';\nimport Box from '@mui/material/Box';\nimport Checkbox from '@mui/material/Checkbox';\nimport Chip from '@mui/material/Chip';\nimport TextField from '@mui/material/TextField';\nimport { useId, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { cmsColors } from '../../theme/variables';\nimport { useCmsTranslation } from '../../i18n/useCmsTranslation';\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\nimport type { FieldOption } from './types';\n\nexport type CmsMultiSelectFieldProps = {\n /** Valores seleccionados (controlado). */\n value: string[];\n /** Callback con los nuevos valores. */\n onChange: (value: string[]) => void;\n /** Opciones disponibles. */\n options: FieldOption[];\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder cuando no hay selección (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Texto cuando no hay coincidencias (ya traducido). */\n noOptionsText?: ReactNode;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Campo de selección múltiple con chips y checkboxes en el desplegable\n * (equivale al campo \"Estados\" del diseño). Internamente usa `Autocomplete`\n * múltiple de MUI pero expone una API por `value: string[]`. Reutilizable.\n */\nexport function CmsMultiSelectField({\n value,\n onChange,\n options,\n label,\n placeholder,\n hint,\n noOptionsText,\n disabled = false,\n testId,\n}: CmsMultiSelectFieldProps) {\n const id = useId();\n const { t } = useCmsTranslation();\n const resolvedNoOptions = noOptionsText ?? t.messages.search.noOptions;\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n const selected = useMemo(\n () => visibleOptions.filter((option) => value.includes(option.value)),\n [visibleOptions, value],\n );\n\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <Autocomplete\n id={id}\n data-testid={testId}\n multiple\n disableCloseOnSelect\n options={visibleOptions}\n value={selected}\n disabled={disabled}\n noOptionsText={resolvedNoOptions}\n getOptionLabel={(option) =>\n typeof option.label === 'string' ? option.label : option.value\n }\n getOptionDisabled={(option) => Boolean(option.disabled)}\n isOptionEqualToValue={(option, current) =>\n option.value === current.value\n }\n onChange={(_event, next) => onChange(next.map((option) => option.value))}\n slotProps={{\n paper: { sx: fieldStyles.sxAutocompletePaper },\n listbox: { sx: fieldStyles.sxAutocompleteListbox },\n }}\n renderValue={(items, getItemProps) =>\n items.map((option, index) => {\n const { key, ...chipProps } = getItemProps({ index });\n return (\n <Chip\n key={key}\n label={option.label}\n size=\"small\"\n sx={fieldStyles.sxChip}\n icon={\n option.color ? (\n <Box\n component=\"span\"\n sx={{\n width: 9,\n height: 9,\n borderRadius: '999px',\n bgcolor: option.color,\n ml: '6px',\n flex: 'none',\n }}\n />\n ) : undefined\n }\n {...chipProps}\n />\n );\n })\n }\n renderOption={(props, option, { selected: isSelected }) => {\n const { key, ...liProps } = props;\n return (\n <li key={key} {...liProps}>\n <Checkbox\n checked={isSelected}\n sx={{\n mr: 1,\n p: 0.5,\n color: cmsColors.controlBorder,\n '&.Mui-checked': { color: cmsColors.primary },\n }}\n />\n {option.color && (\n <Box\n component=\"span\"\n sx={{\n width: 9,\n height: 9,\n borderRadius: '999px',\n bgcolor: option.color,\n mr: '8px',\n flex: 'none',\n }}\n />\n )}\n {option.label}\n </li>\n );\n }}\n renderInput={(params) => (\n <TextField\n {...params}\n variant=\"standard\"\n placeholder={selected.length === 0 ? placeholder : undefined}\n sx={fieldStyles.sxStandard}\n />\n )}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport TextField from '@mui/material/TextField';\nimport { useId } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\n\nexport type CmsNumberFieldProps = {\n /** Valor actual como string (controlado; vacío = sin valor). */\n value: string;\n /** Callback con el nuevo valor (string para permitir el campo vacío). */\n onChange: (value: string) => void;\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Valor mínimo permitido. */\n min?: number;\n /** Valor máximo permitido. */\n max?: number;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Campo numérico con la estética estándar del CMS. Mantiene el valor como string\n * para permitir el estado vacío. Controlado y reutilizable.\n */\nexport function CmsNumberField({\n value,\n onChange,\n label,\n placeholder,\n hint,\n min,\n max,\n disabled = false,\n testId,\n}: CmsNumberFieldProps) {\n const id = useId();\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <TextField\n id={id}\n variant=\"standard\"\n type=\"number\"\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n fullWidth\n onChange={(event) => onChange(event.target.value)}\n sx={fieldStyles.sxStandard}\n slotProps={{\n htmlInput: { min, max, inputMode: 'numeric', 'data-testid': testId },\n }}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport Box from '@mui/material/Box';\nimport MenuItem from '@mui/material/MenuItem';\nimport TextField from '@mui/material/TextField';\nimport { useId, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\nimport type { FieldOption } from './types';\n\nexport type CmsSelectFieldProps = {\n /** Valor seleccionado (controlado; vacío = ninguno). */\n value: string;\n /** Callback con el nuevo valor. */\n onChange: (value: string) => void;\n /** Opciones disponibles. */\n options: FieldOption[];\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder mostrado cuando no hay valor (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Muestra el check en la opción activa. Por defecto `true`. */\n showCheck?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Selector de una sola opción tipo formulario (subrayado M3). A diferencia de\n * `SelectDropdown` (píldora para filtros de listado), este es un campo de\n * formulario con etiqueta arriba. El menú resalta la opción activa en\n * `secondary`, hace hover en `secondaryHover`, deja aire entre el borde del\n * contenedor y el resaltado, y marca la activa con un check. Controlado y\n * reutilizable.\n */\nexport function CmsSelectField({\n value,\n onChange,\n options,\n label,\n placeholder,\n hint,\n disabled = false,\n showCheck = true,\n testId,\n}: CmsSelectFieldProps) {\n const id = useId();\n const visibleOptions = useMemo(\n () => options.filter((option) => option.show !== false),\n [options],\n );\n\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <TextField\n id={id}\n select\n variant=\"standard\"\n value={value}\n disabled={disabled}\n fullWidth\n onChange={(event) => onChange(event.target.value)}\n sx={fieldStyles.sxStandard}\n slotProps={{\n select: {\n displayEmpty: true,\n renderValue: (selected) => {\n const current = visibleOptions.find(\n (option) => option.value === (selected as string),\n );\n if (current) return current.label;\n return <span style={{ opacity: 0.6 }}>{placeholder ?? ''}</span>;\n },\n MenuProps: {\n anchorOrigin: { vertical: 'bottom', horizontal: 'left' },\n transformOrigin: { vertical: 'top', horizontal: 'left' },\n slotProps: {\n paper: { sx: fieldStyles.sxSelectMenuPaper },\n list: { sx: fieldStyles.sxSelectList },\n },\n },\n },\n htmlInput: { 'data-testid': testId },\n }}>\n {placeholder != null && (\n <MenuItem value=\"\" sx={fieldStyles.sxSelectItem}>\n <Box component=\"span\" sx={{ flex: 1, opacity: 0.6 }}>\n {placeholder}\n </Box>\n </MenuItem>\n )}\n {visibleOptions.map((option) => (\n <MenuItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n sx={fieldStyles.sxSelectItem}>\n <Box component=\"span\" sx={{ flex: 1 }}>\n {option.label}\n </Box>\n {showCheck && value === option.value && (\n <CheckIcon sx={fieldStyles.sxSelectCheck} />\n )}\n </MenuItem>\n ))}\n </TextField>\n </FieldShell>\n );\n}\n","'use client';\n\nimport Autocomplete from '@mui/material/Autocomplete';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport TextField from '@mui/material/TextField';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { useId } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\n\nexport type CmsTagsFieldProps = {\n /** Etiquetas actuales (controlado). */\n value: string[];\n /** Callback con las nuevas etiquetas. */\n onChange: (value: string[]) => void;\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder cuando no hay etiquetas (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Sugerencias opcionales para el autocompletado. */\n suggestions?: string[];\n /** Ícono opcional a la izquierda del control (p. ej. una etiqueta/lupa). */\n startIcon?: ReactNode;\n /**\n * `sx` de los chips de etiqueta. Si se pasa, **reemplaza** el estilo por\n * defecto (`fieldStyles.sxChip`, primario tenue), permitiendo p. ej. usar el\n * color secundario.\n */\n chipSx?: SxProps<Theme>;\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Campo de etiquetas libres: se escribe y se presiona Enter para agregar chips\n * (equivale al campo \"Etiquetas\" del diseño). Internamente usa `Autocomplete`\n * `freeSolo` múltiple. Controlado y reutilizable.\n */\nexport function CmsTagsField({\n value,\n onChange,\n label,\n placeholder,\n hint,\n suggestions = [],\n startIcon,\n chipSx,\n disabled = false,\n testId,\n}: CmsTagsFieldProps) {\n const id = useId();\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <Autocomplete\n id={id}\n data-testid={testId}\n multiple\n freeSolo\n options={suggestions}\n value={value}\n disabled={disabled}\n onChange={(_event, next) =>\n onChange(\n next\n .map((item) => (typeof item === 'string' ? item.trim() : ''))\n .filter((item, index, all) => item && all.indexOf(item) === index),\n )\n }\n slotProps={{ paper: { sx: fieldStyles.sxAutocompletePaper } }}\n renderValue={(items, getItemProps) =>\n items.map((item, index) => {\n const { key, ...chipProps } = getItemProps({ index });\n return (\n <Chip\n key={key}\n label={item}\n size=\"small\"\n sx={chipSx ?? fieldStyles.sxChip}\n {...chipProps}\n />\n );\n })\n }\n renderInput={(params) => (\n <TextField\n {...params}\n variant=\"standard\"\n placeholder={value.length === 0 ? placeholder : undefined}\n sx={fieldStyles.sxStandard}\n slotProps={\n startIcon\n ? {\n ...params.slotProps,\n input: {\n ...params.slotProps.input,\n startAdornment: (\n <>\n <Box\n component=\"span\"\n sx={{\n display: 'inline-flex',\n color: 'm3.onSurfaceVariant',\n mr: 0.5,\n }}>\n {startIcon}\n </Box>\n {params.slotProps.input.startAdornment}\n </>\n ),\n },\n }\n : params.slotProps\n }\n />\n )}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport TextField from '@mui/material/TextField';\nimport { useId } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { FieldShell } from './FieldShell';\nimport { fieldStyles } from './fieldStyles';\n\nexport type CmsTextFieldProps = {\n /** Valor actual (controlado). */\n value: string;\n /** Callback con el nuevo texto. */\n onChange: (value: string) => void;\n /** Etiqueta superior (ya traducida). */\n label?: ReactNode;\n /** Placeholder (ya traducido). */\n placeholder?: string;\n /** Texto de ayuda bajo el control. */\n hint?: ReactNode;\n /** Tipo HTML del input. Por defecto `text`. */\n type?: 'text' | 'email' | 'url';\n /** Deshabilita el control. */\n disabled?: boolean;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/**\n * Campo de texto de una línea con la estética estándar del CMS (etiqueta arriba,\n * subrayado inferior). Controlado: el consumidor pasa `value` y `onChange`.\n * Reutilizable en cualquier formulario.\n */\nexport function CmsTextField({\n value,\n onChange,\n label,\n placeholder,\n hint,\n type = 'text',\n disabled = false,\n testId,\n}: CmsTextFieldProps) {\n const id = useId();\n return (\n <FieldShell label={label} htmlFor={id} hint={hint}>\n <TextField\n id={id}\n variant=\"standard\"\n type={type}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n fullWidth\n onChange={(event) => onChange(event.target.value)}\n sx={fieldStyles.sxStandard}\n slotProps={{ htmlInput: { 'data-testid': testId } }}\n />\n </FieldShell>\n );\n}\n","'use client';\n\nimport { CmsCheckboxField } from './CmsCheckboxField';\nimport { CmsComboboxField } from './CmsComboboxField';\nimport { CmsDateField } from './CmsDateField';\nimport { CmsMultiSelectField } from './CmsMultiSelectField';\nimport { CmsNumberField } from './CmsNumberField';\nimport { CmsSelectField } from './CmsSelectField';\nimport { CmsTagsField } from './CmsTagsField';\nimport { CmsTextField } from './CmsTextField';\nimport type { FieldConfig, FieldValue } from './types';\n\nexport type FieldRendererProps = {\n /** Configuración del campo a renderizar. */\n field: FieldConfig;\n /** Valor actual del campo. */\n value: FieldValue | undefined;\n /** Callback con el nuevo valor del campo. */\n onChange: (value: FieldValue) => void;\n};\n\n/**\n * Renderiza el componente de campo que corresponde a una `FieldConfig`,\n * resolviendo el tipo de valor por cada `kind`. Es el puente entre la\n * configuración declarativa del modal y los componentes de campo concretos.\n */\nexport function FieldRenderer({ field, value, onChange }: FieldRendererProps) {\n const asString = typeof value === 'string' ? value : '';\n const asArray = Array.isArray(value) ? value : [];\n const asBool = value === true;\n\n switch (field.kind) {\n case 'text':\n return (\n <CmsTextField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n type={field.type}\n disabled={field.disabled}\n testId={field.testId}\n value={asString}\n onChange={onChange}\n />\n );\n case 'number':\n return (\n <CmsNumberField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n min={field.min}\n max={field.max}\n disabled={field.disabled}\n testId={field.testId}\n value={asString}\n onChange={onChange}\n />\n );\n case 'date':\n return (\n <CmsDateField\n label={field.label}\n hint={field.hint}\n disabled={field.disabled}\n testId={field.testId}\n value={asString}\n onChange={onChange}\n />\n );\n case 'select':\n return (\n <CmsSelectField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n options={field.options}\n disabled={field.disabled}\n showCheck={field.showCheck}\n testId={field.testId}\n value={asString}\n onChange={onChange}\n />\n );\n case 'combobox':\n return (\n <CmsComboboxField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n options={field.options}\n disabled={field.disabled}\n testId={field.testId}\n value={asString}\n onChange={onChange}\n />\n );\n case 'multiselect':\n return (\n <CmsMultiSelectField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n options={field.options}\n disabled={field.disabled}\n testId={field.testId}\n value={asArray}\n onChange={onChange}\n />\n );\n case 'tags':\n return (\n <CmsTagsField\n label={field.label}\n placeholder={field.placeholder}\n hint={field.hint}\n disabled={field.disabled}\n testId={field.testId}\n value={asArray}\n onChange={onChange}\n />\n );\n case 'checkbox':\n return (\n <CmsCheckboxField\n label={field.label}\n disabled={field.disabled}\n testId={field.testId}\n value={asBool}\n onChange={onChange}\n />\n );\n default:\n return null;\n }\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, radii, shadows, sizes } from '../../theme/variables';\n\n/**\n * Estilos del `CmsAdvancedSearch` — el contenedor de \"Búsqueda avanzada\" en sus\n * dos presentaciones: modal centrado (como el gestor de Noticias) y panel\n * lateral derecho (como Imágenes/Videos). Comparten cabecera, cuerpo en grilla y\n * pie con Restablecer + Aplicar.\n */\nexport const CmsAdvancedSearchStyles = {\n /** Paper del modal centrado. */\n sxModalPaper: {\n width: 'min(1080px, calc(100vw - 48px))',\n maxWidth: 'none',\n borderRadius: radii.xl,\n bgcolor: 'm3.surfaceContainerLowest',\n backgroundImage: 'none',\n } as SxProps<Theme>,\n\n /** Paper del panel lateral. */\n sxDrawerPaper: (drawerWidth: number | string): SxProps<Theme> => ({\n width: drawerWidth,\n maxWidth: '100vw',\n bgcolor: 'm3.surfaceContainerLow',\n backgroundImage: 'none',\n display: 'flex',\n flexDirection: 'column',\n }),\n\n /** Layout vertical interno (cabecera / cuerpo / pie). */\n sxContainer: {\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n maxHeight: '100%',\n } as SxProps<Theme>,\n\n /** Cabecera con ícono + título + cerrar. */\n sxHead: {\n flex: 'none',\n display: 'flex',\n alignItems: 'center',\n gap: '14px',\n px: '24px',\n py: '18px',\n borderBottom: '1px solid',\n borderColor: 'm3.outlineVariant',\n } as SxProps<Theme>,\n\n /** Ícono de la cabecera (cuadro con tinte primario). */\n sxHeadIcon: {\n width: 44,\n height: 44,\n flex: 'none',\n display: 'grid',\n placeItems: 'center',\n borderRadius: radii.lg,\n bgcolor: `color-mix(in oklab, ${cmsColors.primary} 14%, transparent)`,\n color: cmsColors.primary,\n '& .MuiSvgIcon-root': { fontSize: 24 },\n } as SxProps<Theme>,\n\n /** Título. */\n sxTitle: {\n flex: 1,\n minWidth: 0,\n fontSize: 22,\n fontWeight: 500,\n lineHeight: '28px',\n color: 'm3.onSurface',\n } as SxProps<Theme>,\n\n /** Botón cerrar. */\n sxClose: {\n flex: 'none',\n color: 'm3.onSurfaceVariant',\n '&:hover': { bgcolor: cmsColors.surfaceHover },\n } as SxProps<Theme>,\n\n /** Cuerpo desplazable. */\n sxBody: {\n flex: '1 1 auto',\n minHeight: 0,\n overflowY: 'auto',\n px: '24px',\n py: '24px',\n } as SxProps<Theme>,\n\n /** Grilla de campos. `columns` controla el modal; el drawer fuerza 1 columna. */\n sxGrid: (columns: number, single: boolean): SxProps<Theme> => ({\n display: 'grid',\n gap: '18px 22px',\n alignItems: 'start',\n gridTemplateColumns: single ? '1fr' : `repeat(${columns}, minmax(0, 1fr))`,\n }),\n\n /** Pie con acciones. */\n sxFoot: {\n flex: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: '12px',\n px: '24px',\n py: '16px',\n borderTop: '1px solid',\n borderColor: 'm3.outlineVariant',\n bgcolor: 'm3.surfaceContainer',\n } as SxProps<Theme>,\n\n /** Botón \"Restablecer\" (texto). */\n sxReset: {\n height: sizes.buttonHeight,\n px: '16px',\n borderRadius: radii.pill,\n textTransform: 'none',\n fontWeight: 500,\n color: cmsColors.primary,\n '&:hover': {\n bgcolor: `color-mix(in oklab, ${cmsColors.primary} 8%, transparent)`,\n },\n '&.Mui-disabled': { color: 'm3.onSurface', opacity: 0.38 },\n } as SxProps<Theme>,\n\n /** Botón \"Aplicar\" (relleno primario). */\n sxApply: {\n height: sizes.buttonHeight,\n px: '24px',\n borderRadius: radii.pill,\n textTransform: 'none',\n fontWeight: 600,\n gap: '8px',\n bgcolor: cmsColors.primary,\n color: cmsColors.white,\n boxShadow: shadows.button,\n '&:hover': { bgcolor: cmsColors.primaryHover },\n '& .MuiSvgIcon-root': { fontSize: 18 },\n } as SxProps<Theme>,\n};\n","import type { CmsTranslator } from '../../i18n/createTranslator';\nimport type { FieldConfig } from '../fields/types';\n\n/**\n * Construye el catálogo estándar de campos de \"Búsqueda avanzada\" del CMS con\n * los textos por defecto de la librería (resueltos al idioma activo). Es lo que\n * usa `CmsAdvancedSearch` cuando el consumidor no pasa `fields`.\n *\n * Los campos de datos (sección, categoría, creador, autor, grupos, zona) traen\n * `options: []`: sus etiquetas/placeholder vienen traducidos de la lib, pero las\n * opciones reales las inyecta cada gestor (son datos del backend). Los campos de\n * enum fijo (tipo, estados, orden, prioridad, dirección) sí traen sus opciones\n * por defecto, también traducidas.\n *\n * @param t - Traductor de la lib (`useCmsTranslation().t`).\n * @returns Lista de campos lista para `CmsAdvancedSearch`.\n */\nexport function buildDefaultSearchFields(t: CmsTranslator): FieldConfig[] {\n const f = t.messages.searchFields;\n const o = t.messages.searchOptions;\n\n return [\n { kind: 'text', name: 'text', label: f.text, placeholder: f.textPlaceholder, span: 3 },\n {\n kind: 'select',\n name: 'type',\n label: f.type,\n placeholder: f.typePlaceholder,\n options: [\n { value: 'news', label: o.typeNews },\n { value: 'list', label: o.typeList },\n { value: 'liveblog', label: o.typeLiveblog },\n ],\n },\n {\n kind: 'select',\n name: 'section',\n label: f.section,\n placeholder: f.sectionPlaceholder,\n options: [],\n },\n {\n kind: 'select',\n name: 'category',\n label: f.category,\n placeholder: f.categoryPlaceholder,\n options: [],\n },\n {\n kind: 'multiselect',\n name: 'states',\n label: f.states,\n placeholder: f.statesPlaceholder,\n options: [\n { value: 'published', label: o.statePublished },\n { value: 'draft', label: o.stateDraft },\n { value: 'scheduled', label: o.stateScheduled },\n { value: 'review', label: o.stateReview },\n { value: 'done', label: o.stateDone },\n ],\n },\n {\n kind: 'combobox',\n name: 'creator',\n label: f.creator,\n placeholder: f.creatorPlaceholder,\n options: [],\n },\n {\n kind: 'combobox',\n name: 'author',\n label: f.author,\n placeholder: f.authorPlaceholder,\n options: [],\n },\n { kind: 'tags', name: 'tags', label: f.tags, placeholder: f.tagsPlaceholder },\n {\n kind: 'select',\n name: 'groups',\n label: f.groups,\n placeholder: f.groupsPlaceholder,\n options: [],\n },\n {\n kind: 'number',\n name: 'amount',\n label: f.amount,\n placeholder: f.amountPlaceholder,\n min: 1,\n },\n { kind: 'date', name: 'dateFrom', label: f.dateFrom },\n { kind: 'date', name: 'dateTo', label: f.dateTo },\n {\n kind: 'select',\n name: 'sortBy',\n label: f.sortBy,\n placeholder: f.sortByPlaceholder,\n options: [\n { value: 'relevance', label: o.sortRelevance },\n { value: 'date', label: o.sortDate },\n { value: 'title', label: o.sortTitle },\n ],\n },\n {\n kind: 'select',\n name: 'zone',\n label: f.zone,\n placeholder: f.zonePlaceholder,\n options: [],\n },\n {\n kind: 'select',\n name: 'priority',\n label: f.priority,\n placeholder: f.priorityPlaceholder,\n options: [\n { value: 'high', label: o.priorityHigh },\n { value: 'mid', label: o.priorityMid },\n { value: 'low', label: o.priorityLow },\n ],\n },\n {\n kind: 'select',\n name: 'order',\n label: f.order,\n placeholder: f.orderPlaceholder,\n options: [\n { value: 'desc', label: o.orderDesc },\n { value: 'asc', label: o.orderAsc },\n ],\n },\n { kind: 'checkbox', name: 'includeDrafts', label: f.includeDrafts, span: 1 },\n { kind: 'checkbox', name: 'includeHistory', label: f.includeHistory, span: 2 },\n ];\n}\n","'use client';\n\nimport CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';\nimport FilterAltOutlinedIcon from '@mui/icons-material/FilterAltOutlined';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport Drawer from '@mui/material/Drawer';\nimport IconButton from '@mui/material/IconButton';\nimport { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { useCmsTranslation } from '../../i18n/useCmsTranslation';\nimport { FieldRenderer } from '../fields/FieldRenderer';\nimport type { FieldConfig, FieldValue, FieldValues } from '../fields/types';\nimport { CmsAdvancedSearchStyles } from './CmsAdvancedSearch.styles';\nimport { buildDefaultSearchFields } from './defaultFields';\n\n/** Presentación del contenedor de búsqueda avanzada. */\nexport type CmsAdvancedSearchVariant = 'modal' | 'drawer';\n\nexport type CmsAdvancedSearchProps = {\n /** Si el contenedor está abierto. */\n open: boolean;\n /** Callback al cerrar (botón X, scrim o Escape). */\n onClose: () => void;\n /** Modal centrado o panel lateral derecho. Por defecto `modal`. */\n variant?: CmsAdvancedSearchVariant;\n /** Título. Por defecto el de la lib (\"Búsqueda avanzada\", según idioma). */\n title?: ReactNode;\n /** Ícono de la cabecera. Por defecto un embudo de filtro. */\n titleIcon?: ReactNode;\n /**\n * Campos a mostrar. Si se omite, usa el catálogo estándar de la lib\n * (`buildDefaultSearchFields`) ya traducido. Cada gestor puede pasar solo los\n * campos que necesita o partir del catálogo por defecto y ajustar opciones.\n */\n fields?: FieldConfig[];\n /** Valores iniciales (al abrir se sincroniza el borrador con estos). */\n initialValues?: FieldValues;\n /** Callback al aplicar, con los valores del formulario. */\n onApply: (values: FieldValues) => void;\n /** Callback al restablecer (luego de limpiar el borrador). */\n onReset?: () => void;\n /** Texto del botón aplicar. Por defecto el de la lib. */\n applyLabel?: ReactNode;\n /** Texto del botón restablecer. Por defecto el de la lib. */\n resetLabel?: ReactNode;\n /** `aria-label` del botón cerrar. Por defecto el de la lib. */\n closeAriaLabel?: string;\n /** Columnas de la grilla en variante modal. Por defecto `3`. */\n columns?: number;\n /** Ancho del panel lateral. Por defecto `360`. */\n drawerWidth?: number | string;\n /** Base para los `data-testid`. */\n testId?: string;\n};\n\n/** Devuelve el valor vacío que corresponde a cada tipo de campo. */\nfunction emptyValueFor(field: FieldConfig): FieldValue {\n switch (field.kind) {\n case 'multiselect':\n case 'tags':\n return [];\n case 'checkbox':\n return false;\n default:\n return '';\n }\n}\n\n/**\n * Contenedor de \"Búsqueda avanzada\" reutilizable y declarativo. Recibe una lista\n * de `fields` y los renderiza en una grilla, manejando el estado del formulario\n * internamente. Se presenta como modal centrado o panel lateral derecho según\n * `variant`. El mismo componente sirve a cualquier gestor: solo cambian los\n * campos que se le pasan.\n */\nexport function CmsAdvancedSearch({\n open,\n onClose,\n variant = 'modal',\n title,\n titleIcon,\n fields,\n initialValues,\n onApply,\n onReset,\n applyLabel,\n resetLabel,\n closeAriaLabel,\n columns = 3,\n drawerWidth = 360,\n testId,\n}: CmsAdvancedSearchProps) {\n // Defaults desde la lib (resueltos al idioma del provider): campos, título y\n // textos de los botones. El consumidor puede sobrescribir cualquiera por prop.\n const { t } = useCmsTranslation();\n const s = t.messages.search;\n const resolvedFields = useMemo(\n () => fields ?? buildDefaultSearchFields(t),\n [fields, t],\n );\n const resolvedTitle = title ?? s.title;\n const resolvedApply = applyLabel ?? s.apply;\n const resolvedReset = resetLabel ?? s.reset;\n const resolvedCloseAria = closeAriaLabel ?? s.close;\n\n /** Borrador con los valores por defecto de cada campo + los iniciales. */\n const defaults = useMemo(() => {\n const base: FieldValues = {};\n for (const field of resolvedFields) base[field.name] = emptyValueFor(field);\n return { ...base, ...initialValues };\n }, [resolvedFields, initialValues]);\n\n const [draft, setDraft] = useState<FieldValues>(defaults);\n\n // Al abrir, reinicia el borrador con los valores iniciales vigentes. Se ajusta\n // el estado durante el render (patrón de React para \"estado derivado de un\n // cambio de prop\"), evitando un efecto con setState.\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setDraft(defaults);\n }\n\n /** Actualiza el valor de un campo del borrador. */\n const handleChange = (name: string, value: FieldValue) => {\n setDraft((prev) => ({ ...prev, [name]: value }));\n };\n\n /** Limpia todos los campos y notifica el restablecimiento. */\n const handleReset = () => {\n const cleared: FieldValues = {};\n for (const field of resolvedFields) cleared[field.name] = emptyValueFor(field);\n setDraft(cleared);\n onReset?.();\n };\n\n /** Aplica el borrador y cierra. */\n const handleApply = () => {\n onApply(draft);\n onClose();\n };\n\n const single = variant === 'drawer';\n\n const content = (\n <Box sx={CmsAdvancedSearchStyles.sxContainer} data-testid={testId}>\n <Box sx={CmsAdvancedSearchStyles.sxHead}>\n <Box sx={CmsAdvancedSearchStyles.sxHeadIcon}>\n {titleIcon ?? <FilterAltOutlinedIcon />}\n </Box>\n <Box component=\"h2\" sx={CmsAdvancedSearchStyles.sxTitle}>\n {resolvedTitle}\n </Box>\n <IconButton\n aria-label={resolvedCloseAria}\n onClick={onClose}\n sx={CmsAdvancedSearchStyles.sxClose}\n data-testid={testId ? `${testId}-icon-btn-close` : undefined}>\n <CloseOutlinedIcon />\n </IconButton>\n </Box>\n\n <Box sx={CmsAdvancedSearchStyles.sxBody}>\n <Box sx={CmsAdvancedSearchStyles.sxGrid(columns, single)}>\n {resolvedFields.map((field) => (\n <Box\n key={field.name}\n sx={{\n gridColumn:\n !single && field.span && field.span > 1\n ? `span ${field.span}`\n : undefined,\n }}>\n <FieldRenderer\n field={field}\n value={draft[field.name]}\n onChange={(value) => handleChange(field.name, value)}\n />\n </Box>\n ))}\n </Box>\n </Box>\n\n <Box sx={CmsAdvancedSearchStyles.sxFoot}>\n <Button\n type=\"button\"\n disableElevation\n onClick={handleReset}\n sx={CmsAdvancedSearchStyles.sxReset}\n data-testid={testId ? `${testId}-btn-reset` : undefined}>\n {resolvedReset}\n </Button>\n <Button\n type=\"button\"\n disableElevation\n onClick={handleApply}\n startIcon={<FilterAltOutlinedIcon />}\n sx={CmsAdvancedSearchStyles.sxApply}\n data-testid={testId ? `${testId}-btn-apply` : undefined}>\n {resolvedApply}\n </Button>\n </Box>\n </Box>\n );\n\n if (variant === 'drawer') {\n return (\n <Drawer\n anchor=\"right\"\n open={open}\n onClose={onClose}\n slotProps={{\n paper: { sx: CmsAdvancedSearchStyles.sxDrawerPaper(drawerWidth) },\n }}>\n {content}\n </Drawer>\n );\n }\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n maxWidth={false}\n slotProps={{ paper: { sx: CmsAdvancedSearchStyles.sxModalPaper } }}>\n {content}\n </Dialog>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\nimport { cmsColors, fontFamilies, radii } from '../../theme/variables';\n\n/**\n * Estilos del `CmsConfirmDialog` — modal de confirmación con ícono, título,\n * descripción y botones, todo opcional. Contenido alineado a la izquierda y\n * acciones a la derecha. Réplica funcional del `confirm-modal` del Angular\n * legacy (`cmsmedios-ux`) construida con MUI + variables del theme.\n */\nexport const CmsConfirmDialogStyles = {\n /**\n * Paper del modal: por defecto crece con el contenido respetando los mínimos\n * (ancho 420, alto 280). Si se pasa `width`, el ancho queda fijo.\n */\n sxPaper: (\n width: number | string | undefined,\n minWidth: number | string,\n minHeight: number | string,\n ): SxProps<Theme> => ({\n position: 'relative',\n width: width ?? 'auto',\n minWidth,\n maxWidth: 'calc(100vw - 32px)',\n minHeight,\n m: 2,\n px: '32px',\n py: '32px',\n borderRadius: radii.dialog,\n bgcolor: 'm3.surfaceContainerHigh',\n backgroundImage: 'none',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n justifyContent: 'flex-start',\n gap: '16px',\n }),\n\n /** Botón \"X\" de cerrar (dentro, esquina superior derecha). 14×14. */\n sxClose: {\n position: 'absolute',\n top: 16,\n right: 16,\n p: 0.5,\n color: cmsColors.textNav,\n '& .MuiSvgIcon-root': { width: 14, height: 14, fontSize: 14 },\n } as SxProps<Theme>,\n\n /** Badge circular del ícono opcional, tintado con el color de acento. */\n sxIcon: (accent: string): SxProps<Theme> => ({\n width: 48,\n height: 48,\n flex: 'none',\n display: 'grid',\n placeItems: 'center',\n borderRadius: '50%',\n bgcolor: `color-mix(in oklab, ${accent} 16%, transparent)`,\n color: accent,\n '& .MuiSvgIcon-root': { fontSize: 24 },\n }),\n\n /** Título: M3 title-large — Google Sans 500 22/28, texto fuerte. Respeta saltos de línea. */\n sxTitle: {\n m: 0,\n fontFamily: fontFamilies.googleSans,\n fontSize: 22,\n fontWeight: 500,\n lineHeight: '28px',\n color: cmsColors.textStrong,\n whiteSpace: 'pre-line',\n } as SxProps<Theme>,\n\n /** Descripción: Google Sans 14/400. Admite negrita (`b`/`strong`) y enlaces (`a`). */\n sxDescription: {\n m: 0,\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 400,\n lineHeight: 1.5,\n color: cmsColors.textStrong,\n whiteSpace: 'pre-line',\n '& b, & strong': { fontWeight: 700 },\n '& a': {\n color: cmsColors.link,\n fontWeight: 700,\n textDecoration: 'underline',\n cursor: 'pointer',\n },\n } as SxProps<Theme>,\n\n /** Contenedor de la fila de botones (empuja al fondo del modal). */\n sxActions: {\n width: '100%',\n mt: 'auto',\n pt: '8px',\n } as SxProps<Theme>,\n};\n","import type { SxProps, Theme } from '@mui/material/styles';\nimport type { SystemStyleObject } from '@mui/system';\n\nimport { cmsColors, fontFamilies, radii, sizes } from '../../theme/variables';\n\n/** Alineación horizontal de la fila de botones. */\nexport type CmsDialogActionsAlign = 'start' | 'center' | 'end' | 'between';\n\n/** Color del botón \"Confirmar/Enviar\": CTA primario (azul) o destructivo (rojo). */\nexport type CmsConfirmColor = 'primary' | 'danger';\n\nconst JUSTIFY: Record<CmsDialogActionsAlign, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n};\n\n/**\n * Estilos de `CmsDialogActions` — la fila de botones (cancelar + confirmar) del\n * modal de confirmación. El \"cancelar\" es un botón tipo texto (transparente, con\n * hover secundario) y el \"confirmar\" es un CTA relleno (primario o destructivo).\n * Ambos pueden crecer para repartir el ancho disponible del padre (`sxGrow`).\n */\nexport const CmsDialogActionsStyles = {\n /** Contenedor flex de los botones (10px de separación). */\n sxRoot: (align: CmsDialogActionsAlign): SxProps<Theme> => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: JUSTIFY[align],\n gap: '10px',\n width: '100%',\n }),\n\n /** Hace que un botón crezca y reparta el ancho del contenedor. */\n sxGrow: { flex: 1 } as SxProps<Theme>,\n\n /** Botón \"Cancelar\": transparente, label primario, hover state layer primario 8%. */\n sxCancel: {\n height: sizes.buttonHeight,\n px: '16px',\n borderRadius: radii.pill,\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n color: cmsColors.primary,\n bgcolor: 'transparent',\n boxShadow: 'none',\n // Hover según Material: primario al 8% sobre transparente (state layer).\n '&:hover': {\n bgcolor: `color-mix(in oklab, ${cmsColors.primary} 8%, transparent)`,\n boxShadow: 'none',\n },\n '&.Mui-disabled': { color: cmsColors.primary, opacity: 0.38 },\n } as SxProps<Theme>,\n\n /** Botón \"Cancelar\" con `flex: 1` opcional para repartir ancho. */\n sxCancelButton: (fullWidth: boolean): SystemStyleObject<Theme> => ({\n ...(CmsDialogActionsStyles.sxCancel as SystemStyleObject<Theme>),\n ...(fullWidth ? (CmsDialogActionsStyles.sxGrow as SystemStyleObject<Theme>) : {}),\n }),\n\n /** Botón \"Confirmar/Enviar\" con `flex: 1` opcional para repartir ancho. */\n sxConfirmButton: (\n color: CmsConfirmColor,\n fullWidth: boolean,\n ): SystemStyleObject<Theme> => ({\n ...(CmsDialogActionsStyles.sxConfirm(color) as SystemStyleObject<Theme>),\n ...(fullWidth ? (CmsDialogActionsStyles.sxGrow as SystemStyleObject<Theme>) : {}),\n }),\n\n /** Botón \"Confirmar/Enviar\": relleno, label blanco, con su hover por color. */\n sxConfirm: (color: CmsConfirmColor): SxProps<Theme> => {\n const bg = color === 'danger' ? cmsColors.danger : cmsColors.primary;\n const hover = color === 'danger' ? cmsColors.dangerHover : cmsColors.primaryHover;\n return {\n height: sizes.buttonHeight,\n px: '24px',\n borderRadius: radii.pill,\n textTransform: 'none',\n fontFamily: fontFamilies.googleSans,\n fontSize: 14,\n fontWeight: 500,\n color: cmsColors.white,\n bgcolor: bg,\n boxShadow: 'none',\n '& .MuiButton-startIcon': { mr: '6px' },\n '& .MuiSvgIcon-root': { fontSize: 18 },\n '&:hover': { bgcolor: hover, boxShadow: 'none' },\n '&.Mui-disabled': { bgcolor: bg, color: cmsColors.white, opacity: 0.5 },\n };\n },\n};\n","'use client';\n\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport type { ReactNode } from 'react';\n\nimport {\n CmsDialogActionsStyles,\n type CmsConfirmColor,\n type CmsDialogActionsAlign,\n} from './CmsDialogActions.styles';\n\nexport type { CmsConfirmColor, CmsDialogActionsAlign };\n\nexport type CmsDialogActionsProps = {\n /** Label del botón \"Cancelar\". Si se omite, ese botón no se muestra. */\n cancelLabel?: ReactNode;\n /** Acción del botón \"Cancelar\". */\n onCancel?: () => void;\n /** Label del botón \"Confirmar/Enviar\". Si se omite, ese botón no se muestra. */\n confirmLabel?: ReactNode;\n /** Acción del botón \"Confirmar/Enviar\". */\n onConfirm?: () => void;\n /** Ícono opcional al inicio del botón \"Confirmar/Enviar\". */\n confirmIcon?: ReactNode;\n /** Color del botón \"Confirmar/Enviar\": `primary` (azul) o `danger` (rojo). */\n confirmColor?: CmsConfirmColor;\n /** Deshabilita el botón \"Cancelar\". */\n cancelDisabled?: boolean;\n /** Deshabilita el botón \"Confirmar/Enviar\". */\n confirmDisabled?: boolean;\n /**\n * Si los botones crecen para repartir el ancho del contenedor padre. Por\n * defecto `true`. Con un solo botón, ocupa todo el ancho disponible.\n */\n fullWidth?: boolean;\n /** Alineación horizontal de los botones. Por defecto `end`. */\n align?: CmsDialogActionsAlign;\n /**\n * Base para los `data-testid`. El contenedor usa `testId`; el botón cancelar\n * emite `${testId}-btn-cancel` y el de confirmar `${testId}-btn-confirm`\n * (cada uno con su `data-action` `cancel` / `confirm` como atributo extra).\n */\n testId?: string;\n};\n\n/**\n * Fila de acciones del modal de confirmación. Muestra 1 o 2 botones según los\n * labels que reciba: el de \"Cancelar\" (tipo texto) y/o el de \"Confirmar/Enviar\"\n * (CTA primario o destructivo, con ícono opcional). Reutilizable de forma\n * independiente del modal.\n */\nexport function CmsDialogActions({\n cancelLabel,\n onCancel,\n confirmLabel,\n onConfirm,\n confirmIcon,\n confirmColor = 'primary',\n cancelDisabled,\n confirmDisabled,\n fullWidth = true,\n align = 'end',\n testId,\n}: CmsDialogActionsProps) {\n const hasCancel = cancelLabel != null;\n const hasConfirm = confirmLabel != null;\n if (!hasCancel && !hasConfirm) return null;\n\n return (\n <Box sx={CmsDialogActionsStyles.sxRoot(align)} data-testid={testId}>\n {hasCancel && (\n <Button\n type=\"button\"\n disableElevation\n onClick={onCancel}\n disabled={cancelDisabled}\n sx={CmsDialogActionsStyles.sxCancelButton(fullWidth)}\n data-testid={testId ? `${testId}-btn-cancel` : undefined}\n data-action=\"cancel\">\n {cancelLabel}\n </Button>\n )}\n {hasConfirm && (\n <Button\n type=\"button\"\n disableElevation\n onClick={onConfirm}\n disabled={confirmDisabled}\n startIcon={confirmIcon ?? undefined}\n sx={CmsDialogActionsStyles.sxConfirmButton(confirmColor, fullWidth)}\n data-testid={testId ? `${testId}-btn-confirm` : undefined}\n data-action=\"confirm\">\n {confirmLabel}\n </Button>\n )}\n </Box>\n );\n}\n","'use client';\n\nimport CloseIcon from '@mui/icons-material/Close';\nimport Box from '@mui/material/Box';\nimport Dialog from '@mui/material/Dialog';\nimport IconButton from '@mui/material/IconButton';\nimport type { PaperProps } from '@mui/material/Paper';\nimport type { ReactNode } from 'react';\n\nimport { cmsColors } from '../../theme/variables';\nimport { CmsConfirmDialogStyles } from './CmsConfirmDialog.styles';\nimport { CmsDialogActions } from './CmsDialogActions';\nimport type {\n CmsConfirmColor,\n CmsDialogActionsAlign,\n} from './CmsDialogActions.styles';\n\nexport type CmsConfirmDialogProps = {\n /** Si el modal está abierto. */\n open: boolean;\n /** Callback al cerrar (botón X, scrim o Escape). */\n onClose: () => void;\n /** Ícono opcional (se muestra en un badge circular sobre el título). */\n icon?: ReactNode;\n /** Color de acento del badge del ícono. Por defecto el texto de navegación. */\n iconColor?: string;\n /** Título opcional. M3 title-large (Google Sans 500 22/28). Admite `\\n` para saltos de línea. */\n title?: ReactNode;\n /**\n * Descripción opcional. Google Sans 14/400. Puede incluir negrita (`<b>`/`<strong>`)\n * y enlaces (`<a>`); ambos se estilan según el diseño.\n */\n description?: ReactNode;\n /** Muestra el botón \"X\" de cerrar (dentro, arriba a la derecha). Por defecto `true`. */\n showClose?: boolean;\n /** `aria-label` del botón cerrar. */\n closeAriaLabel?: string;\n /** Label del botón \"Cancelar\". Si se omite, no se muestra. */\n cancelLabel?: ReactNode;\n /** Acción del botón \"Cancelar\". Por defecto cierra el modal (`onClose`). */\n onCancel?: () => void;\n /** Label del botón \"Confirmar/Enviar\". Si se omite, no se muestra. */\n confirmLabel?: ReactNode;\n /** Acción del botón \"Confirmar/Enviar\". */\n onConfirm?: () => void;\n /** Ícono opcional al inicio del botón \"Confirmar/Enviar\". */\n confirmIcon?: ReactNode;\n /** Color del botón \"Confirmar/Enviar\": `primary` (azul) o `danger` (rojo). */\n confirmColor?: CmsConfirmColor;\n /** Deshabilita el botón \"Cancelar\". */\n cancelDisabled?: boolean;\n /** Deshabilita el botón \"Confirmar/Enviar\". */\n confirmDisabled?: boolean;\n /** Los botones reparten el ancho del modal. Por defecto `false`. */\n fullWidthActions?: boolean;\n /** Alineación de los botones. Por defecto `end` (a la derecha). */\n actionsAlign?: CmsDialogActionsAlign;\n /** Ancho fijo del modal. Si se omite, crece con el contenido (respetando `minWidth`). */\n width?: number | string;\n /** Ancho mínimo del modal. Por defecto `420`. */\n minWidth?: number | string;\n /** Alto mínimo del modal (crece con el contenido). Por defecto `280`. */\n minHeight?: number | string;\n /** Evita cerrar al hacer clic fuera o con Escape (p. ej. mientras carga). */\n disableBackdropClose?: boolean;\n /**\n * Base para los `data-testid`. Emite: `${testId}` (modal),\n * `${testId}-icon-btn-close` (botón X), `${testId}-actions` (fila de botones)\n * y los botones `${testId}-actions-btn-cancel` y `${testId}-actions-btn-confirm`.\n */\n testId?: string;\n};\n\n/**\n * Modal de confirmación reutilizable: ícono, título, descripción y 1–2 botones,\n * todo opcional. Contenido alineado a la izquierda, acciones a la derecha y \"X\"\n * de cerrar dentro del modal. Réplica funcional del `confirm-modal` del Angular\n * legacy (`cmsmedios-ux`) con MUI + el theme de la lib. Los textos (i18n) los\n * pasa el gestor; este componente solo presenta.\n */\nexport function CmsConfirmDialog({\n open,\n onClose,\n icon,\n iconColor = cmsColors.textNav,\n title,\n description,\n showClose = true,\n closeAriaLabel,\n cancelLabel,\n onCancel,\n confirmLabel,\n onConfirm,\n confirmIcon,\n confirmColor = 'primary',\n cancelDisabled,\n confirmDisabled,\n fullWidthActions = false,\n actionsAlign = 'end',\n width,\n minWidth = 420,\n minHeight = 280,\n disableBackdropClose,\n testId,\n}: CmsConfirmDialogProps) {\n const hasActions = cancelLabel != null || confirmLabel != null;\n\n return (\n <Dialog\n open={open}\n onClose={(_event, reason) => {\n if (\n disableBackdropClose &&\n (reason === 'backdropClick' || reason === 'escapeKeyDown')\n )\n return;\n onClose();\n }}\n maxWidth={false}\n slotProps={{\n paper: {\n sx: CmsConfirmDialogStyles.sxPaper(width, minWidth, minHeight),\n ...(testId != null ? { 'data-testid': testId } : {}),\n } as PaperProps,\n }}>\n {showClose && (\n <IconButton\n aria-label={closeAriaLabel ?? 'Close'}\n onClick={onClose}\n sx={CmsConfirmDialogStyles.sxClose}\n data-testid={testId ? `${testId}-icon-btn-close` : undefined}>\n <CloseIcon />\n </IconButton>\n )}\n\n {icon != null && (\n <Box sx={CmsConfirmDialogStyles.sxIcon(iconColor)}>{icon}</Box>\n )}\n\n {title != null && (\n <Box component=\"h2\" sx={CmsConfirmDialogStyles.sxTitle}>\n {title}\n </Box>\n )}\n\n {description != null && (\n <Box component=\"p\" sx={CmsConfirmDialogStyles.sxDescription}>\n {description}\n </Box>\n )}\n\n {hasActions && (\n <Box sx={CmsConfirmDialogStyles.sxActions}>\n <CmsDialogActions\n cancelLabel={cancelLabel}\n onCancel={onCancel ?? onClose}\n confirmLabel={confirmLabel}\n onConfirm={onConfirm}\n confirmIcon={confirmIcon}\n confirmColor={confirmColor}\n cancelDisabled={cancelDisabled}\n confirmDisabled={confirmDisabled}\n fullWidth={fullWidthActions}\n align={actionsAlign}\n testId={testId ? `${testId}-actions` : undefined}\n />\n </Box>\n )}\n </Dialog>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport {\n formatRelativeTime,\n type RelativeTimeStyle,\n} from '../../utils/site-time';\n\nexport type CmsRelativeTimeProps = {\n /** Instante a mostrar, en milisegundos (epoch UTC). */\n epochMs: number;\n /** Tag BCP 47 (p. ej. `\"es-AR\"`); usar `getIntlLocaleTag(locale)`. */\n localeTag: string;\n /** Estilo del texto: `\"long\"` (por defecto) → \"hace 18 minutos\". */\n style?: RelativeTimeStyle;\n /**\n * Texto para el `title` (tooltip nativo) y para el primer render/SSR: conviene\n * pasar la fecha absoluta ya formateada (p. ej. `formatSiteDateTime(...)`), así\n * el usuario ve el instante exacto al pasar el mouse y no hay salto vacío.\n */\n title?: string;\n /** Base para el `data-testid` (p. ej. `row-<id>-time`). */\n testId?: string;\n /** Clase opcional para estilar el `<span>` desde el gestor. */\n className?: string;\n};\n\n/**\n * Muestra un instante como tiempo transcurrido (\"hace 3 días\") que se recalcula\n * solo cada minuto. El cálculo relativo corre únicamente en el cliente (usa\n * `Date.now()`): en SSR y en el primer render muestra `title` (la fecha absoluta),\n * evitando el desajuste de hidratación de Next.\n */\nexport function CmsRelativeTime({\n epochMs,\n localeTag,\n style = 'long',\n title,\n testId,\n className,\n}: CmsRelativeTimeProps) {\n // Arranca en null para que SSR y el primer render del cliente coincidan; el\n // relativo aparece recién tras montar y se refresca cada 60 s.\n const [now, setNow] = useState<number | null>(null);\n useEffect(() => {\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 60_000);\n return () => clearInterval(id);\n }, []);\n\n const label =\n now == null\n ? (title ?? '')\n : formatRelativeTime(epochMs, localeTag, { nowMs: now, style });\n\n return (\n <span\n className={className}\n title={title}\n data-testid={testId}\n suppressHydrationWarning>\n {label}\n </span>\n );\n}\n"],"mappings":"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"}
|