/** * Critical Bootstrap CSS Subset * * Contiene SOLO las clases Bootstrap usadas en componentes above-the-fold: * - TopNotificationBar * - Navbar * - Hero * * Esto permite diferir la carga del Bootstrap completo (31KB) * mientras se renderiza el contenido crítico inmediatamente. * * @version 5.3.2-subset * @see Inc/enqueue-scripts.php - Bootstrap diferido * @see Shared/Infrastructure/Services/CriticalBootstrapService.php */ /* ========================================================================== CRITICAL FONTS (Poppins - LCP optimization) ========================================================================== */ @font-face { font-family: 'Poppins Fallback'; src: local('Arial'), local('Helvetica Neue'), local('sans-serif'); size-adjust: 106%; ascent-override: 105%; descent-override: 35%; line-gap-override: 10%; } @font-face { font-family: 'Poppins'; src: url('/wp-content/themes/roi-theme/Assets/Fonts/poppins-v24-latin-regular.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: 'Poppins'; src: url('/wp-content/themes/roi-theme/Assets/Fonts/poppins-v24-latin-600.woff2') format('woff2'); font-weight: 600; font-style: normal; font-display: swap; } @font-face { font-family: 'Poppins'; src: url('/wp-content/themes/roi-theme/Assets/Fonts/poppins-v24-latin-700.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; } :root { /* Fonts */ --font-primary: 'Poppins', 'Poppins Fallback', sans-serif; --bs-body-font-family: 'Poppins', 'Poppins Fallback', sans-serif; /* Theme Colors (críticos para above-the-fold) */ --color-navy-dark: #0E2337; --color-navy-medium: #1e3a5f; --color-orange-primary: #FF8600; --color-orange-hover: #e67a00; --bs-primary: #0d6efd; --bs-white: #fff; --bs-body-color: #212529; --bs-body-bg: #fff; --bs-link-color: #0d6efd; --bs-link-hover-color: #0a58ca; /* Spacing */ --bs-gutter-x: 1.5rem; } /* ========================================================================== BOX SIZING & RESETS (Bootstrap Reboot crítico) ========================================================================== */ *, *::before, *::after { box-sizing: border-box; } body { margin: 0; font-family: var(--bs-body-font-family, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif); font-size: var(--bs-body-font-size, 1rem); font-weight: var(--bs-body-font-weight, 400); line-height: var(--bs-body-line-height, 1.5); color: var(--bs-body-color, #212529); background-color: var(--bs-body-bg, #fff); -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: transparent; } a { color: var(--bs-link-color, #0d6efd); text-decoration: underline; } a:hover { color: var(--bs-link-hover-color, #0a58ca); } img, svg { vertical-align: middle; } button { border-radius: 0; } button:focus:not(:focus-visible) { outline: 0; } /* ========================================================================== CONTAINER (Layout crítico) ========================================================================== */ .container, .container-fluid { --bs-gutter-x: 1.5rem; --bs-gutter-y: 0; width: 100%; padding-right: calc(var(--bs-gutter-x) * 0.5); padding-left: calc(var(--bs-gutter-x) * 0.5); margin-right: auto; margin-left: auto; } @media (min-width: 576px) { .container { max-width: 540px; } } @media (min-width: 768px) { .container { max-width: 720px; } } @media (min-width: 992px) { .container { max-width: 960px; } } @media (min-width: 1200px) { .container { max-width: 1140px; } } @media (min-width: 1400px) { .container { max-width: 1320px; } } /* ========================================================================== GRID SYSTEM (Layout crítico - Previene CLS) ========================================================================== */ .row { --bs-gutter-x: 1.5rem; --bs-gutter-y: 0; display: flex; flex-wrap: wrap; margin-top: calc(-1 * var(--bs-gutter-y)); margin-right: calc(-0.5 * var(--bs-gutter-x)); margin-left: calc(-0.5 * var(--bs-gutter-x)); } .row > * { flex-shrink: 0; width: 100%; max-width: 100%; padding-right: calc(var(--bs-gutter-x) * 0.5); padding-left: calc(var(--bs-gutter-x) * 0.5); margin-top: var(--bs-gutter-y); } .col { flex: 1 0 0%; } .col-auto { flex: 0 0 auto; width: auto; } .col-1 { flex: 0 0 auto; width: 8.33333333%; } .col-2 { flex: 0 0 auto; width: 16.66666667%; } .col-3 { flex: 0 0 auto; width: 25%; } .col-4 { flex: 0 0 auto; width: 33.33333333%; } .col-5 { flex: 0 0 auto; width: 41.66666667%; } .col-6 { flex: 0 0 auto; width: 50%; } .col-7 { flex: 0 0 auto; width: 58.33333333%; } .col-8 { flex: 0 0 auto; width: 66.66666667%; } .col-9 { flex: 0 0 auto; width: 75%; } .col-10 { flex: 0 0 auto; width: 83.33333333%; } .col-11 { flex: 0 0 auto; width: 91.66666667%; } .col-12 { flex: 0 0 auto; width: 100%; } @media (min-width: 768px) { .col-md-1 { flex: 0 0 auto; width: 8.33333333%; } .col-md-2 { flex: 0 0 auto; width: 16.66666667%; } .col-md-3 { flex: 0 0 auto; width: 25%; } .col-md-4 { flex: 0 0 auto; width: 33.33333333%; } .col-md-5 { flex: 0 0 auto; width: 41.66666667%; } .col-md-6 { flex: 0 0 auto; width: 50%; } .col-md-7 { flex: 0 0 auto; width: 58.33333333%; } .col-md-8 { flex: 0 0 auto; width: 66.66666667%; } .col-md-9 { flex: 0 0 auto; width: 75%; } .col-md-10 { flex: 0 0 auto; width: 83.33333333%; } .col-md-11 { flex: 0 0 auto; width: 91.66666667%; } .col-md-12 { flex: 0 0 auto; width: 100%; } } @media (min-width: 992px) { .col-lg-1 { flex: 0 0 auto; width: 8.33333333%; } .col-lg-2 { flex: 0 0 auto; width: 16.66666667%; } .col-lg-3 { flex: 0 0 auto; width: 25%; } .col-lg-4 { flex: 0 0 auto; width: 33.33333333%; } .col-lg-5 { flex: 0 0 auto; width: 41.66666667%; } .col-lg-6 { flex: 0 0 auto; width: 50%; } .col-lg-7 { flex: 0 0 auto; width: 58.33333333%; } .col-lg-8 { flex: 0 0 auto; width: 66.66666667%; } .col-lg-9 { flex: 0 0 auto; width: 75%; } .col-lg-10 { flex: 0 0 auto; width: 83.33333333%; } .col-lg-11 { flex: 0 0 auto; width: 91.66666667%; } .col-lg-12 { flex: 0 0 auto; width: 100%; } } /* Gutter utilities */ .g-0, .gx-0 { --bs-gutter-x: 0; } .g-0, .gy-0 { --bs-gutter-y: 0; } .g-3, .gx-3 { --bs-gutter-x: 1rem; } .g-3, .gy-3 { --bs-gutter-y: 1rem; } /* ========================================================================== FLEXBOX UTILITIES (Layout crítico) ========================================================================== */ .d-flex { display: flex !important; } .d-none { display: none !important; } .d-block { display: block !important; } .d-inline-block { display: inline-block !important; } /* Responsive Display Utilities - Previene CLS en TopNotificationBar */ @media (min-width: 992px) { .d-lg-none { display: none !important; } .d-lg-block { display: block !important; } .d-lg-flex { display: flex !important; } } .flex-wrap { flex-wrap: wrap !important; } .flex-column { flex-direction: column !important; } .justify-content-center { justify-content: center !important; } .justify-content-between { justify-content: space-between !important; } .justify-content-start { justify-content: flex-start !important; } .justify-content-end { justify-content: flex-end !important; } .align-items-center { align-items: center !important; } .align-items-start { align-items: flex-start !important; } .align-items-end { align-items: flex-end !important; } .gap-2 { gap: 0.5rem !important; } .gap-3 { gap: 1rem !important; } /* ========================================================================== SPACING UTILITIES (Margin/Padding críticos) ========================================================================== */ .m-0 { margin: 0 !important; } .m-auto { margin: auto !important; } .mb-0 { margin-bottom: 0 !important; } .mb-1 { margin-bottom: 0.25rem !important; } .mb-2 { margin-bottom: 0.5rem !important; } .mb-3 { margin-bottom: 1rem !important; } .mb-4 { margin-bottom: 1.5rem !important; } .mt-0 { margin-top: 0 !important; } .mt-2 { margin-top: 0.5rem !important; } .mt-3 { margin-top: 1rem !important; } .me-1 { margin-right: 0.25rem !important; } .me-2 { margin-right: 0.5rem !important; } .me-3 { margin-right: 1rem !important; } .ms-2 { margin-left: 0.5rem !important; } .ms-3 { margin-left: 1rem !important; } .mx-auto { margin-left: auto !important; margin-right: auto !important; } .p-0 { padding: 0 !important; } .p-2 { padding: 0.5rem !important; } .p-3 { padding: 1rem !important; } .py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .py-3 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .py-4 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .px-3 { padding-left: 1rem !important; padding-right: 1rem !important; } .px-4 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } /* ========================================================================== SIZING UTILITIES (Width/Height críticos) ========================================================================== */ .w-100 { width: 100% !important; } .w-auto { width: auto !important; } .h-100 { height: 100% !important; } .h-auto { height: auto !important; } /* ========================================================================== TEXT UTILITIES (Críticos para layout) ========================================================================== */ .text-center { text-align: center !important; } .text-start { text-align: left !important; } .text-end { text-align: right !important; } .text-white { color: #fff !important; } .text-muted { color: var(--bs-secondary-color, #6c757d) !important; } .fw-normal { font-weight: 400 !important; } .fw-medium { font-weight: 500 !important; } .fw-semibold { font-weight: 600 !important; } .fw-bold { font-weight: 700 !important; } .fs-5 { font-size: 1.25rem !important; } .fs-6 { font-size: 1rem !important; } .small { font-size: 0.875em !important; } @media (min-width: 768px) { .text-md-start { text-align: left !important; } .text-md-center { text-align: center !important; } .text-md-end { text-align: right !important; } } /* ========================================================================== NAVBAR COMPONENT (Crítico - Above the fold) ========================================================================== */ .navbar { --bs-navbar-padding-x: 0; --bs-navbar-padding-y: 0.5rem; --bs-navbar-color: rgba(255, 255, 255, 0.55); --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); --bs-navbar-active-color: #fff; --bs-navbar-brand-padding-y: 0.3125rem; --bs-navbar-brand-margin-end: 1rem; --bs-navbar-brand-font-size: 1.25rem; --bs-navbar-brand-color: #fff; --bs-navbar-brand-hover-color: #fff; --bs-navbar-nav-link-padding-x: 0.5rem; --bs-navbar-toggler-padding-y: 0.25rem; --bs-navbar-toggler-padding-x: 0.75rem; --bs-navbar-toggler-font-size: 1.25rem; --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); --bs-navbar-toggler-border-radius: var(--bs-border-radius, 0.375rem); --bs-navbar-toggler-focus-width: 0.25rem; --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; position: relative; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); } .navbar > .container, .navbar > .container-fluid { display: flex; flex-wrap: inherit; align-items: center; justify-content: space-between; } .navbar-brand { padding-top: var(--bs-navbar-brand-padding-y); padding-bottom: var(--bs-navbar-brand-padding-y); margin-right: var(--bs-navbar-brand-margin-end); font-size: var(--bs-navbar-brand-font-size); color: var(--bs-navbar-brand-color); text-decoration: none; white-space: nowrap; } .navbar-brand:hover, .navbar-brand:focus { color: var(--bs-navbar-brand-hover-color); } .navbar-nav { --bs-nav-link-padding-x: 0; --bs-nav-link-padding-y: 0.5rem; --bs-nav-link-color: var(--bs-navbar-color); --bs-nav-link-hover-color: var(--bs-navbar-hover-color); --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); display: flex; flex-direction: column; padding-left: 0; margin-bottom: 0; list-style: none; } .navbar-nav .nav-link { padding-right: 0; padding-left: 0; color: var(--bs-nav-link-color); } .navbar-nav .nav-link:hover, .navbar-nav .nav-link:focus { color: var(--bs-nav-link-hover-color); } .navbar-nav .nav-link.active { color: var(--bs-navbar-active-color); } .nav-link { display: block; padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); font-size: var(--bs-nav-link-font-size); font-weight: var(--bs-nav-link-font-weight); color: var(--bs-nav-link-color); text-decoration: none; background: 0 0; border: 0; transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; } .nav-item { margin-bottom: 0; } .navbar-toggler { padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); font-size: var(--bs-navbar-toggler-font-size); line-height: 1; color: var(--bs-navbar-color); background-color: transparent; border: var(--bs-border-width, 1px) solid var(--bs-navbar-toggler-border-color); border-radius: var(--bs-navbar-toggler-border-radius); transition: var(--bs-navbar-toggler-transition); } .navbar-toggler:hover { text-decoration: none; } .navbar-toggler:focus { text-decoration: none; outline: 0; box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); } .navbar-toggler-icon { display: inline-block; width: 1.5em; height: 1.5em; vertical-align: middle; background-image: var(--bs-navbar-toggler-icon-bg); background-repeat: no-repeat; background-position: center; background-size: 100%; } .navbar-dark, .navbar[data-bs-theme="dark"] { --bs-navbar-color: rgba(255, 255, 255, 0.55); --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); --bs-navbar-active-color: #fff; --bs-navbar-brand-color: #fff; --bs-navbar-brand-hover-color: #fff; --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } /* ========================================================================== COLLAPSE COMPONENT (Navbar mobile) ========================================================================== */ .collapse:not(.show) { display: none; } .navbar-collapse { flex-basis: 100%; flex-grow: 1; align-items: center; } /* ========================================================================== DROPDOWN COMPONENT (Navbar submenus) ========================================================================== */ .dropdown { position: relative; } .dropdown-toggle { white-space: nowrap; } .dropdown-toggle::after { display: inline-block; margin-left: 0.255em; vertical-align: 0.255em; content: ""; border-top: 0.3em solid; border-right: 0.3em solid transparent; border-bottom: 0; border-left: 0.3em solid transparent; } .dropdown-menu { --bs-dropdown-zindex: 1000; --bs-dropdown-min-width: 10rem; --bs-dropdown-padding-x: 0; --bs-dropdown-padding-y: 0.5rem; --bs-dropdown-spacer: 0.125rem; --bs-dropdown-font-size: 1rem; --bs-dropdown-color: var(--bs-body-color, #212529); --bs-dropdown-bg: var(--bs-body-bg, #fff); --bs-dropdown-border-color: var(--bs-border-color-translucent, rgba(0,0,0,.175)); --bs-dropdown-border-radius: var(--bs-border-radius, 0.375rem); --bs-dropdown-border-width: var(--bs-border-width, 1px); --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius, 0.375rem) - var(--bs-border-width, 1px)); --bs-dropdown-divider-bg: var(--bs-border-color-translucent, rgba(0,0,0,.175)); --bs-dropdown-divider-margin-y: 0.5rem; --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); --bs-dropdown-link-color: var(--bs-body-color, #212529); --bs-dropdown-link-hover-color: var(--bs-body-color, #212529); --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg, #f8f9fa); --bs-dropdown-link-active-color: #fff; --bs-dropdown-link-active-bg: #0d6efd; --bs-dropdown-link-disabled-color: var(--bs-tertiary-color, #adb5bd); --bs-dropdown-item-padding-x: 1rem; --bs-dropdown-item-padding-y: 0.25rem; --bs-dropdown-header-color: #6c757d; --bs-dropdown-header-padding-x: 1rem; --bs-dropdown-header-padding-y: 0.5rem; position: absolute; z-index: var(--bs-dropdown-zindex); display: none; min-width: var(--bs-dropdown-min-width); padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); margin: 0; font-size: var(--bs-dropdown-font-size); color: var(--bs-dropdown-color); text-align: left; list-style: none; background-color: var(--bs-dropdown-bg); background-clip: padding-box; border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); border-radius: var(--bs-dropdown-border-radius); } .dropdown-menu.show { display: block; } .dropdown-item { display: block; width: 100%; padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); clear: both; font-weight: 400; color: var(--bs-dropdown-link-color); text-align: inherit; text-decoration: none; white-space: nowrap; background-color: transparent; border: 0; } .dropdown-item:hover, .dropdown-item:focus { color: var(--bs-dropdown-link-hover-color); background-color: var(--bs-dropdown-link-hover-bg); } .dropdown-item.active, .dropdown-item:active { color: var(--bs-dropdown-link-active-color); text-decoration: none; background-color: var(--bs-dropdown-link-active-bg); } /* ========================================================================== TEXT UTILITIES ========================================================================== */ .text-decoration-underline { text-decoration: underline !important; } .text-decoration-none { text-decoration: none !important; } /* ========================================================================== IMAGE UTILITIES ========================================================================== */ .img-fluid { max-width: 100%; height: auto; } /* ========================================================================== ALERT COMPONENT (Above-the-fold notifications) ========================================================================== */ .alert { --bs-alert-padding-x: 1rem; --bs-alert-padding-y: 1rem; --bs-alert-margin-bottom: 1rem; --bs-alert-border-radius: 0.375rem; position: relative; padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); margin-bottom: var(--bs-alert-margin-bottom); border: 1px solid transparent; border-radius: var(--bs-alert-border-radius); } .alert-warning { --bs-alert-color: #664d03; --bs-alert-bg: #fff3cd; --bs-alert-border-color: #ffecb5; color: var(--bs-alert-color); background-color: var(--bs-alert-bg); border-color: var(--bs-alert-border-color); } .alert-info { --bs-alert-color: #055160; --bs-alert-bg: #cff4fc; --bs-alert-border-color: #b6effb; color: var(--bs-alert-color); background-color: var(--bs-alert-bg); border-color: var(--bs-alert-border-color); } /* ========================================================================== BUTTON COMPONENT (Above-the-fold - Navbar CTA) ========================================================================== */ .btn { --bs-btn-padding-x: 0.75rem; --bs-btn-padding-y: 0.375rem; --bs-btn-font-size: 1rem; --bs-btn-font-weight: 400; --bs-btn-line-height: 1.5; --bs-btn-color: var(--bs-body-color); --bs-btn-bg: transparent; --bs-btn-border-width: var(--bs-border-width, 1px); --bs-btn-border-color: transparent; --bs-btn-border-radius: var(--bs-border-radius, 0.375rem); --bs-btn-hover-border-color: transparent; --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); --bs-btn-disabled-opacity: 0.65; --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), 0.5); display: inline-block; padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); font-family: var(--bs-btn-font-family); font-size: var(--bs-btn-font-size); font-weight: var(--bs-btn-font-weight); line-height: var(--bs-btn-line-height); color: var(--bs-btn-color); text-align: center; text-decoration: none; vertical-align: middle; cursor: pointer; user-select: none; border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); border-radius: var(--bs-btn-border-radius); background-color: var(--bs-btn-bg); transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } .btn:hover { color: var(--bs-btn-hover-color); background-color: var(--bs-btn-hover-bg); border-color: var(--bs-btn-hover-border-color); } .btn:focus-visible { color: var(--bs-btn-hover-color); background-color: var(--bs-btn-hover-bg); border-color: var(--bs-btn-hover-border-color); outline: 0; box-shadow: var(--bs-btn-focus-box-shadow); } .btn:disabled, .btn.disabled { pointer-events: none; opacity: var(--bs-btn-disabled-opacity); } /* ========================================================================== BUTTON CLOSE (Dismiss notification) ========================================================================== */ .btn-close { --bs-btn-close-color: #000; --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e"); --bs-btn-close-opacity: 0.5; --bs-btn-close-hover-opacity: 0.75; --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); --bs-btn-close-focus-opacity: 1; --bs-btn-close-disabled-opacity: 0.25; --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); box-sizing: content-box; width: 1em; height: 1em; padding: 0.25em 0.25em; color: var(--bs-btn-close-color); background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; border: 0; border-radius: 0.375rem; opacity: var(--bs-btn-close-opacity); } .btn-close:hover { color: var(--bs-btn-close-color); text-decoration: none; opacity: var(--bs-btn-close-hover-opacity); } .btn-close:focus { outline: 0; box-shadow: var(--bs-btn-close-focus-shadow); opacity: var(--bs-btn-close-focus-opacity); } .btn-close-white { filter: var(--bs-btn-close-white-filter); } /* ========================================================================== RESPONSIVE BREAKPOINTS (navbar-expand-lg) ========================================================================== */ @media (min-width: 992px) { .navbar-expand-lg { flex-wrap: nowrap; justify-content: flex-start; } .navbar-expand-lg .navbar-nav { flex-direction: row; } .navbar-expand-lg .navbar-nav .dropdown-menu { position: absolute; } .navbar-expand-lg .navbar-nav .nav-link { padding-right: var(--bs-navbar-nav-link-padding-x); padding-left: var(--bs-navbar-nav-link-padding-x); } .navbar-expand-lg .navbar-collapse { display: flex !important; flex-basis: auto; } .navbar-expand-lg .navbar-toggler { display: none; } .d-lg-block { display: block !important; } .d-lg-none { display: none !important; } .mb-lg-0 { margin-bottom: 0 !important; } } @media (max-width: 991.98px) { .navbar-expand-lg > .container, .navbar-expand-lg > .container-fluid { padding-right: 0; padding-left: 0; } } /* ========================================================================== RESPONSIVE DISPLAY UTILITIES (md breakpoint) ========================================================================== */ @media (min-width: 768px) { .d-md-block { display: block !important; } .d-md-none { display: none !important; } } /* ========================================================================== SITE STRUCTURE (Layout crítico) ========================================================================== */ .site { display: flex; flex-direction: column; min-height: 100vh; } .site-main { flex-grow: 1; } /* ========================================================================== ACCESSIBILITY (Critical - above-the-fold) ========================================================================== */ .screen-reader-text { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; clip: rect(1px, 1px, 1px, 1px); clip-path: inset(50%); white-space: nowrap; } .skip-link { position: absolute; top: -40px; left: 0; background: #000; color: #fff; padding: 0.5rem 1rem; z-index: 100000; text-decoration: none; } .skip-link:focus { top: 0; } /* ========================================================================== TYPOGRAPHY BASE (Critical) ========================================================================== */ p { margin-top: 0; margin-bottom: 1rem; } h1, h2, h3, h4, h5, h6 { margin-top: 0; margin-bottom: 0.5rem; font-weight: 500; line-height: 1.2; } h1 { font-size: calc(1.375rem + 1.5vw); } h2 { font-size: calc(1.325rem + 0.9vw); } h3 { font-size: calc(1.3rem + 0.6vw); } h4 { font-size: calc(1.275rem + 0.3vw); } h5 { font-size: 1.25rem; } h6 { font-size: 1rem; } @media (min-width: 1200px) { h1 { font-size: 2.5rem; } h2 { font-size: 2rem; } h3 { font-size: 1.75rem; } h4 { font-size: 1.5rem; } } /* ========================================================================== CLS PREVENTION - Tables APU (Critical Column Widths) Previene CLS al definir anchos de columna ANTES de que cargue css-tablas-apu.css ========================================================================== */ /* Contenedor con overflow para scroll horizontal */ .analisis, .desglose { margin: 2rem 0; overflow-x: auto; } /* Tabla base con table-layout: fixed */ .analisis table, .desglose table, table.table { table-layout: fixed; width: 100%; border-collapse: collapse; background: #fff; } /* Anchos de columna fijos - CRITICO para prevenir CLS */ .analisis table td:nth-child(1), .analisis table th:nth-child(1), .desglose table td:nth-child(1), .desglose table th:nth-child(1) { width: 150px; min-width: 100px; } .analisis table td:nth-child(2), .analisis table th:nth-child(2), .desglose table td:nth-child(2), .desglose table th:nth-child(2) { width: auto; min-width: 300px; } .analisis table td:nth-child(3), .analisis table th:nth-child(3), .desglose table td:nth-child(3), .desglose table th:nth-child(3) { width: 80px; min-width: 60px; } .analisis table td:nth-child(4), .analisis table th:nth-child(4), .desglose table td:nth-child(4), .desglose table th:nth-child(4) { width: 110px; min-width: 90px; } .analisis table td:nth-child(5), .analisis table th:nth-child(5), .desglose table td:nth-child(5), .desglose table th:nth-child(5) { width: 120px; min-width: 100px; } .analisis table td:nth-child(6), .analisis table th:nth-child(6), .desglose table td:nth-child(6), .desglose table th:nth-child(6) { width: 120px; min-width: 100px; } /* Filas con altura mínima */ .analisis table tr, .desglose table tr, table.table tr { min-height: 40px; } /* Celdas base */ .analisis table td, .analisis table th, .desglose table td, .desglose table th, table.table td, table.table th { padding: 0.75rem 1rem; vertical-align: middle; border: none; } /* Filas especiales - estilos base para prevenir CLS */ .analisis table tr.section-header, .desglose table tr.section-header { background-color: #e9ecef; } .analisis table tr.subtotal-row, .desglose table tr.subtotal-row { background-color: rgba(255, 133, 0, 0.15); } .analisis table tr.total-row, .desglose table tr.total-row { background: linear-gradient(135deg, #1e3a5f 0%, #2c5282 100%); } .analisis table tr.total-row td, .desglose table tr.total-row td { color: #fff; } /* Responsive - móvil */ @media (max-width: 767px) { .analisis table td:nth-child(1), .desglose table td:nth-child(1) { width: 80px; min-width: 60px; } .analisis table td:nth-child(2), .desglose table td:nth-child(2) { min-width: 150px; } .analisis table td:nth-child(3), .analisis table td:nth-child(4), .analisis table td:nth-child(5), .analisis table td:nth-child(6), .desglose table td:nth-child(3), .desglose table td:nth-child(4), .desglose table td:nth-child(5), .desglose table td:nth-child(6) { min-width: 70px; } } /* Site main ya tiene flex-grow: 1 arriba - no forzar min-height */ /* ========================================================================== CLS PREVENTION - AdSense Ads PageSpeed Issue: body CLS 1.000 en desktop, 0.226 en móvil Causa: AdSense inyecta style="height: auto !important" al main-content Solución: Reservar espacio mínimo para ads antes de que se carguen ========================================================================== */ /* Reservar espacio para contenedores de AdSense */ ins.adsbygoogle { display: block; min-height: 100px; /* Altura mínima mientras carga */ background: transparent; } /* Ads en contenido (entre párrafos) - más espacio */ .post-content ins.adsbygoogle, article ins.adsbygoogle { min-height: 250px; margin: 1.5rem 0; } /* Ads en sidebar - menos espacio */ .sidebar ins.adsbygoogle, .col-lg-3 ins.adsbygoogle { min-height: 200px; } /* ========================================================================== CLS PREVENTION - Navbar Collapse (Mobile) PageSpeed Issue: navbar-collapse CLS 0.245 en móvil Causa: Menú sin dimensiones reservadas al colapsar Solución: Reservar espacio para el menú colapsado ========================================================================== */ /* En desktop: navbar-collapse visible con altura auto */ @media (min-width: 992px) { .navbar-collapse { display: flex !important; flex-basis: auto; } } /* En móvil: cuando está colapsado, no debe afectar layout */ @media (max-width: 991.98px) { .navbar-collapse { position: absolute; top: 100%; left: 0; right: 0; background: #1e3a5f; /* Navy dark - mismo que navbar */ z-index: 1000; padding: 1rem; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .navbar-collapse:not(.show) { display: none; } /* Menú vertical en móvil */ .navbar-collapse .navbar-nav { flex-direction: column; width: 100%; } .navbar-collapse .nav-item { width: 100%; } .navbar-collapse .nav-link { padding: 0.75rem 1rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1); } } /* ========================================================================== CLS PREVENTION - Hero Section PageSpeed Issue: hero-section CLS 0.033 en móvil Solución: Altura mínima para hero ========================================================================== */ .hero-section { min-height: 120px; } @media (max-width: 767.98px) { .hero-section { min-height: 100px; } }