chore: purgar archivos legacy (plan 101 fase 2)
- eliminar 5 template parts reemplazados por renderers - eliminar header.js (90% codigo muerto) - eliminar apu-tables-auto-class.js (migrdo a php) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,99 +0,0 @@
|
|||||||
/**
|
|
||||||
* Auto-detectar y agregar clases a filas especiales de tablas APU
|
|
||||||
*
|
|
||||||
* Este script detecta automáticamente filas especiales en tablas .desglose y .analisis
|
|
||||||
* y les agrega las clases CSS correspondientes para que se apliquen los estilos correctos.
|
|
||||||
*
|
|
||||||
* Detecta:
|
|
||||||
* - Section headers: Material, Mano de Obra, Herramienta, Equipo
|
|
||||||
* - Subtotal rows: Filas que empiezan con "Suma de"
|
|
||||||
* - Total row: Costo Directo
|
|
||||||
*
|
|
||||||
* @package Apus_Theme
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Agrega clases a filas especiales de tablas APU
|
|
||||||
*/
|
|
||||||
function applyApuTableClasses() {
|
|
||||||
// Buscar todas las tablas con clase .desglose o .analisis
|
|
||||||
const tables = document.querySelectorAll('.desglose table, .analisis table');
|
|
||||||
|
|
||||||
if (tables.length === 0) {
|
|
||||||
return; // No hay tablas APU en esta página
|
|
||||||
}
|
|
||||||
|
|
||||||
let classesAdded = 0;
|
|
||||||
|
|
||||||
tables.forEach(function(table) {
|
|
||||||
const rows = table.querySelectorAll('tbody tr');
|
|
||||||
|
|
||||||
rows.forEach(function(row) {
|
|
||||||
// Evitar procesar filas que ya tienen clase
|
|
||||||
if (row.classList.contains('section-header') ||
|
|
||||||
row.classList.contains('subtotal-row') ||
|
|
||||||
row.classList.contains('total-row')) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const secondCell = row.querySelector('td:nth-child(2)');
|
|
||||||
if (!secondCell) {
|
|
||||||
return; // Fila sin segunda celda
|
|
||||||
}
|
|
||||||
|
|
||||||
const text = secondCell.textContent.trim();
|
|
||||||
|
|
||||||
// Detectar section headers
|
|
||||||
if (text === 'Material' ||
|
|
||||||
text === 'Mano de Obra' ||
|
|
||||||
text === 'Herramienta' ||
|
|
||||||
text === 'Equipo' ||
|
|
||||||
text === 'MATERIAL' ||
|
|
||||||
text === 'MANO DE OBRA' ||
|
|
||||||
text === 'HERRAMIENTA' ||
|
|
||||||
text === 'EQUIPO') {
|
|
||||||
row.classList.add('section-header');
|
|
||||||
classesAdded++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Detectar subtotales (cualquier variación de "Suma de")
|
|
||||||
if (text.toLowerCase().startsWith('suma de ') ||
|
|
||||||
text.toLowerCase().startsWith('subtotal ')) {
|
|
||||||
row.classList.add('subtotal-row');
|
|
||||||
classesAdded++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Detectar total final
|
|
||||||
if (text === 'Costo Directo' ||
|
|
||||||
text === 'COSTO DIRECTO' ||
|
|
||||||
text === 'Total' ||
|
|
||||||
text === 'TOTAL' ||
|
|
||||||
text === 'Costo directo') {
|
|
||||||
row.classList.add('total-row');
|
|
||||||
classesAdded++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Log para debugging (solo en desarrollo)
|
|
||||||
if (classesAdded > 0 && window.console) {
|
|
||||||
console.log('[APU Tables] Clases agregadas automáticamente: ' + classesAdded);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ejecutar cuando el DOM esté listo
|
|
||||||
if (document.readyState === 'loading') {
|
|
||||||
document.addEventListener('DOMContentLoaded', applyApuTableClasses);
|
|
||||||
} else {
|
|
||||||
// DOM ya está listo
|
|
||||||
applyApuTableClasses();
|
|
||||||
}
|
|
||||||
|
|
||||||
})();
|
|
||||||
@@ -1,342 +0,0 @@
|
|||||||
/**
|
|
||||||
* Header Navigation JavaScript
|
|
||||||
*
|
|
||||||
* This file handles:
|
|
||||||
* - Mobile hamburger menu toggle
|
|
||||||
* - Sticky header behavior
|
|
||||||
* - Smooth scroll to anchors (optional)
|
|
||||||
* - Accessibility features (keyboard navigation, ARIA attributes)
|
|
||||||
* - Body scroll locking when mobile menu is open
|
|
||||||
*
|
|
||||||
* @package ROI_Theme
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize on DOM ready
|
|
||||||
*/
|
|
||||||
function init() {
|
|
||||||
setupMobileMenu();
|
|
||||||
setupStickyHeader();
|
|
||||||
setupSmoothScroll();
|
|
||||||
setupKeyboardNavigation();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mobile Menu Functionality
|
|
||||||
*/
|
|
||||||
function setupMobileMenu() {
|
|
||||||
const mobileMenuToggle = document.getElementById('mobile-menu-toggle');
|
|
||||||
const mobileMenu = document.getElementById('mobile-menu');
|
|
||||||
const mobileMenuOverlay = document.getElementById('mobile-menu-overlay');
|
|
||||||
const mobileMenuClose = document.getElementById('mobile-menu-close');
|
|
||||||
|
|
||||||
if (!mobileMenuToggle || !mobileMenu || !mobileMenuOverlay) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open mobile menu
|
|
||||||
mobileMenuToggle.addEventListener('click', function() {
|
|
||||||
openMobileMenu();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Close mobile menu via close button
|
|
||||||
if (mobileMenuClose) {
|
|
||||||
mobileMenuClose.addEventListener('click', function() {
|
|
||||||
closeMobileMenu();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close mobile menu via overlay click
|
|
||||||
mobileMenuOverlay.addEventListener('click', function() {
|
|
||||||
closeMobileMenu();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Close mobile menu on Escape key
|
|
||||||
document.addEventListener('keydown', function(e) {
|
|
||||||
if (e.key === 'Escape' && mobileMenu.classList.contains('active')) {
|
|
||||||
closeMobileMenu();
|
|
||||||
mobileMenuToggle.focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Close mobile menu when clicking a menu link
|
|
||||||
const mobileMenuLinks = mobileMenu.querySelectorAll('a');
|
|
||||||
mobileMenuLinks.forEach(function(link) {
|
|
||||||
link.addEventListener('click', function() {
|
|
||||||
closeMobileMenu();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Handle window resize - close mobile menu if switching to desktop
|
|
||||||
let resizeTimer;
|
|
||||||
window.addEventListener('resize', function() {
|
|
||||||
clearTimeout(resizeTimer);
|
|
||||||
resizeTimer = setTimeout(function() {
|
|
||||||
if (window.innerWidth >= 768 && mobileMenu.classList.contains('active')) {
|
|
||||||
closeMobileMenu();
|
|
||||||
}
|
|
||||||
}, 250);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open mobile menu
|
|
||||||
*/
|
|
||||||
function openMobileMenu() {
|
|
||||||
const mobileMenuToggle = document.getElementById('mobile-menu-toggle');
|
|
||||||
const mobileMenu = document.getElementById('mobile-menu');
|
|
||||||
const mobileMenuOverlay = document.getElementById('mobile-menu-overlay');
|
|
||||||
|
|
||||||
// Add active classes
|
|
||||||
mobileMenu.classList.add('active');
|
|
||||||
mobileMenuOverlay.classList.add('active');
|
|
||||||
document.body.classList.add('mobile-menu-open');
|
|
||||||
|
|
||||||
// Update ARIA attributes
|
|
||||||
mobileMenuToggle.setAttribute('aria-expanded', 'true');
|
|
||||||
mobileMenu.setAttribute('aria-hidden', 'false');
|
|
||||||
mobileMenuOverlay.setAttribute('aria-hidden', 'false');
|
|
||||||
|
|
||||||
// Focus trap - focus first menu item
|
|
||||||
const firstMenuItem = mobileMenu.querySelector('a');
|
|
||||||
if (firstMenuItem) {
|
|
||||||
setTimeout(function() {
|
|
||||||
firstMenuItem.focus();
|
|
||||||
}, 300);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close mobile menu
|
|
||||||
*/
|
|
||||||
function closeMobileMenu() {
|
|
||||||
const mobileMenuToggle = document.getElementById('mobile-menu-toggle');
|
|
||||||
const mobileMenu = document.getElementById('mobile-menu');
|
|
||||||
const mobileMenuOverlay = document.getElementById('mobile-menu-overlay');
|
|
||||||
|
|
||||||
// Remove active classes
|
|
||||||
mobileMenu.classList.remove('active');
|
|
||||||
mobileMenuOverlay.classList.remove('active');
|
|
||||||
document.body.classList.remove('mobile-menu-open');
|
|
||||||
|
|
||||||
// Update ARIA attributes
|
|
||||||
mobileMenuToggle.setAttribute('aria-expanded', 'false');
|
|
||||||
mobileMenu.setAttribute('aria-hidden', 'true');
|
|
||||||
mobileMenuOverlay.setAttribute('aria-hidden', 'true');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sticky Header Behavior
|
|
||||||
*/
|
|
||||||
function setupStickyHeader() {
|
|
||||||
const header = document.getElementById('masthead');
|
|
||||||
|
|
||||||
if (!header) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let lastScrollTop = 0;
|
|
||||||
let scrollThreshold = 100;
|
|
||||||
|
|
||||||
window.addEventListener('scroll', function() {
|
|
||||||
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
|
|
||||||
|
|
||||||
// Add/remove scrolled class based on scroll position
|
|
||||||
if (scrollTop > scrollThreshold) {
|
|
||||||
header.classList.add('scrolled');
|
|
||||||
} else {
|
|
||||||
header.classList.remove('scrolled');
|
|
||||||
}
|
|
||||||
|
|
||||||
lastScrollTop = scrollTop;
|
|
||||||
}, { passive: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Smooth Scroll to Anchors (Optional)
|
|
||||||
*/
|
|
||||||
function setupSmoothScroll() {
|
|
||||||
// Check if user prefers reduced motion
|
|
||||||
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
||||||
|
|
||||||
if (prefersReducedMotion) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all anchor links
|
|
||||||
const anchorLinks = document.querySelectorAll('a[href^="#"]');
|
|
||||||
|
|
||||||
anchorLinks.forEach(function(link) {
|
|
||||||
link.addEventListener('click', function(e) {
|
|
||||||
const href = this.getAttribute('href');
|
|
||||||
|
|
||||||
// Skip if href is just "#"
|
|
||||||
if (href === '#') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const target = document.querySelector(href);
|
|
||||||
|
|
||||||
if (target) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
// Get header height for offset
|
|
||||||
const header = document.getElementById('masthead');
|
|
||||||
const headerHeight = header ? header.offsetHeight : 0;
|
|
||||||
const targetPosition = target.getBoundingClientRect().top + window.pageYOffset - headerHeight - 20;
|
|
||||||
|
|
||||||
window.scrollTo({
|
|
||||||
top: targetPosition,
|
|
||||||
behavior: prefersReducedMotion ? 'auto' : 'smooth'
|
|
||||||
});
|
|
||||||
|
|
||||||
// Update URL hash
|
|
||||||
if (history.pushState) {
|
|
||||||
history.pushState(null, null, href);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Focus target element for accessibility
|
|
||||||
target.setAttribute('tabindex', '-1');
|
|
||||||
target.focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Keyboard Navigation for Menus
|
|
||||||
*/
|
|
||||||
function setupKeyboardNavigation() {
|
|
||||||
const menuItems = document.querySelectorAll('.primary-menu > li, .mobile-primary-menu > li');
|
|
||||||
|
|
||||||
menuItems.forEach(function(item) {
|
|
||||||
const link = item.querySelector('a');
|
|
||||||
const submenu = item.querySelector('.sub-menu');
|
|
||||||
|
|
||||||
if (!link || !submenu) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open submenu on Enter/Space
|
|
||||||
link.addEventListener('keydown', function(e) {
|
|
||||||
if (e.key === 'Enter' || e.key === ' ') {
|
|
||||||
if (submenu) {
|
|
||||||
e.preventDefault();
|
|
||||||
toggleSubmenu(item, submenu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close submenu on Escape
|
|
||||||
if (e.key === 'Escape') {
|
|
||||||
closeSubmenu(item, submenu);
|
|
||||||
link.focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Close submenu when focus leaves
|
|
||||||
const submenuLinks = submenu.querySelectorAll('a');
|
|
||||||
if (submenuLinks.length > 0) {
|
|
||||||
const lastSubmenuLink = submenuLinks[submenuLinks.length - 1];
|
|
||||||
|
|
||||||
lastSubmenuLink.addEventListener('keydown', function(e) {
|
|
||||||
if (e.key === 'Tab' && !e.shiftKey) {
|
|
||||||
closeSubmenu(item, submenu);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toggle submenu visibility
|
|
||||||
*/
|
|
||||||
function toggleSubmenu(item, submenu) {
|
|
||||||
const isExpanded = item.classList.contains('submenu-open');
|
|
||||||
|
|
||||||
if (isExpanded) {
|
|
||||||
closeSubmenu(item, submenu);
|
|
||||||
} else {
|
|
||||||
openSubmenu(item, submenu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open submenu
|
|
||||||
*/
|
|
||||||
function openSubmenu(item, submenu) {
|
|
||||||
item.classList.add('submenu-open');
|
|
||||||
submenu.setAttribute('aria-hidden', 'false');
|
|
||||||
|
|
||||||
const firstLink = submenu.querySelector('a');
|
|
||||||
if (firstLink) {
|
|
||||||
firstLink.focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close submenu
|
|
||||||
*/
|
|
||||||
function closeSubmenu(item, submenu) {
|
|
||||||
item.classList.remove('submenu-open');
|
|
||||||
submenu.setAttribute('aria-hidden', 'true');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trap focus within mobile menu when open
|
|
||||||
*/
|
|
||||||
function setupFocusTrap() {
|
|
||||||
const mobileMenu = document.getElementById('mobile-menu');
|
|
||||||
|
|
||||||
if (!mobileMenu) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
document.addEventListener('keydown', function(e) {
|
|
||||||
if (!mobileMenu.classList.contains('active')) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.key === 'Tab') {
|
|
||||||
const focusableElements = mobileMenu.querySelectorAll(
|
|
||||||
'a, button, [tabindex]:not([tabindex="-1"])'
|
|
||||||
);
|
|
||||||
|
|
||||||
const firstElement = focusableElements[0];
|
|
||||||
const lastElement = focusableElements[focusableElements.length - 1];
|
|
||||||
|
|
||||||
if (e.shiftKey) {
|
|
||||||
// Shift + Tab
|
|
||||||
if (document.activeElement === firstElement) {
|
|
||||||
e.preventDefault();
|
|
||||||
lastElement.focus();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Tab
|
|
||||||
if (document.activeElement === lastElement) {
|
|
||||||
e.preventDefault();
|
|
||||||
firstElement.focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize focus trap
|
|
||||||
*/
|
|
||||||
setupFocusTrap();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize when DOM is ready
|
|
||||||
*/
|
|
||||||
if (document.readyState === 'loading') {
|
|
||||||
document.addEventListener('DOMContentLoaded', init);
|
|
||||||
} else {
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
})();
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Template Part: CTA Box Sidebar
|
|
||||||
*
|
|
||||||
* Caja de llamada a la acción naranja en el sidebar
|
|
||||||
* Abre el modal de contacto al hacer clic
|
|
||||||
*
|
|
||||||
* @package ROI_Theme
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
?>
|
|
||||||
|
|
||||||
<!-- DEBUG: CTA Box Template Loaded -->
|
|
||||||
<!-- CTA Box Sidebar -->
|
|
||||||
<div class="cta-box-sidebar">
|
|
||||||
<h5 class="cta-box-title">¿Listo para potenciar tus proyectos?</h5>
|
|
||||||
<p class="cta-box-text">Accede a nuestra biblioteca completa de APUs y herramientas profesionales.</p>
|
|
||||||
<button class="btn btn-cta-box w-100" data-bs-toggle="modal" data-bs-target="#contactModal">
|
|
||||||
Solicitar Información
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<!-- DEBUG: CTA Box Template End -->
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Template Part: Table of Contents (TOC)
|
|
||||||
*
|
|
||||||
* Genera automáticamente TOC desde los H2 del post
|
|
||||||
* HTML exacto del template original
|
|
||||||
*
|
|
||||||
* @package ROI_Theme
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Solo mostrar TOC si estamos en single post
|
|
||||||
if (!is_single()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obtener el contenido del post actual
|
|
||||||
global $post;
|
|
||||||
$post_content = $post->post_content;
|
|
||||||
|
|
||||||
// Aplicar filtros de WordPress al contenido
|
|
||||||
$post_content = apply_filters('the_content', $post_content);
|
|
||||||
|
|
||||||
// Buscar todos los H2 con ID en el contenido
|
|
||||||
preg_match_all('/<h2[^>]*id=["\']([^"\']*)["\'][^>]*>(.*?)<\/h2>/i', $post_content, $matches);
|
|
||||||
|
|
||||||
// Si no hay H2 con ID, no mostrar TOC
|
|
||||||
if (empty($matches[1])) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generar el TOC con el HTML del template
|
|
||||||
?>
|
|
||||||
<div class="toc-container">
|
|
||||||
<h4>Tabla de Contenido</h4>
|
|
||||||
<ol class="list-unstyled toc-list">
|
|
||||||
<?php foreach ($matches[1] as $index => $id) : ?>
|
|
||||||
<?php $title = strip_tags($matches[2][$index]); ?>
|
|
||||||
<li><a href="#<?php echo esc_attr($id); ?>"><?php echo esc_html($title); ?></a></li>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</ol>
|
|
||||||
</div>
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* CTA Box Sidebar Template
|
|
||||||
*
|
|
||||||
* Aparece debajo del TOC en single posts
|
|
||||||
*
|
|
||||||
* @package ROI_Theme
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!is_single()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
|
|
||||||
<div class="cta-box-sidebar mt-3">
|
|
||||||
<h5 class="cta-box-title">¿Listo para potenciar tus proyectos?</h5>
|
|
||||||
<p class="cta-box-text">Accede a nuestra biblioteca completa de APUs y herramientas profesionales.</p>
|
|
||||||
<button class="btn btn-cta-box w-100" data-bs-toggle="modal" data-bs-target="#contactModal">
|
|
||||||
<i class="bi bi-calendar-check me-2"></i>Solicitar Demo
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Modal de Contacto - Bootstrap 5
|
|
||||||
*
|
|
||||||
* Modal activado por botón "Let's Talk" y CTA Box Sidebar
|
|
||||||
*
|
|
||||||
* @package ROI_Theme
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
?>
|
|
||||||
|
|
||||||
<!-- Contact Modal -->
|
|
||||||
<div class="modal fade" id="contactModal" tabindex="-1" aria-labelledby="contactModalLabel" aria-hidden="true">
|
|
||||||
<div class="modal-dialog modal-dialog-centered modal-lg">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h5 class="modal-title" id="contactModalLabel">
|
|
||||||
<i class="bi bi-envelope-fill me-2" style="color: #FF8600;"></i>
|
|
||||||
<?php esc_html_e( '¿Tienes alguna pregunta?', 'roi-theme' ); ?>
|
|
||||||
</h5>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="<?php esc_attr_e( 'Cerrar', 'roi-theme' ); ?>"></button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<p class="mb-4">
|
|
||||||
<?php esc_html_e( 'Completa el formulario y nuestro equipo te responderá en menos de 24 horas.', 'roi-theme' ); ?>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<form id="modalContactForm">
|
|
||||||
<div class="row g-3">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="modalFullName" class="form-label"><?php esc_html_e( 'Nombre completo', 'roi-theme' ); ?> *</label>
|
|
||||||
<input type="text" class="form-control" id="modalFullName" name="fullName" required>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="modalCompany" class="form-label"><?php esc_html_e( 'Empresa', 'roi-theme' ); ?></label>
|
|
||||||
<input type="text" class="form-control" id="modalCompany" name="company">
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="modalWhatsapp" class="form-label"><?php esc_html_e( 'WhatsApp', 'roi-theme' ); ?> *</label>
|
|
||||||
<input type="tel" class="form-control" id="modalWhatsapp" name="whatsapp" required>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="modalEmail" class="form-label"><?php esc_html_e( 'Correo electrónico', 'roi-theme' ); ?> *</label>
|
|
||||||
<input type="email" class="form-control" id="modalEmail" name="email" required>
|
|
||||||
</div>
|
|
||||||
<div class="col-12">
|
|
||||||
<label for="modalComments" class="form-label"><?php esc_html_e( '¿En qué podemos ayudarte?', 'roi-theme' ); ?></label>
|
|
||||||
<textarea class="form-control" id="modalComments" name="comments" rows="4"></textarea>
|
|
||||||
</div>
|
|
||||||
<div class="col-12">
|
|
||||||
<button type="submit" class="btn btn-primary w-100">
|
|
||||||
<i class="bi bi-send-fill me-2"></i><?php esc_html_e( 'Enviar Mensaje', 'roi-theme' ); ?>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div id="modalFormMessage" class="col-12 mt-2 alert" style="display: none;"></div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Top Notification Bar Component
|
|
||||||
*
|
|
||||||
* Barra de notificaciones superior del sitio
|
|
||||||
*
|
|
||||||
* @package ROI_Theme
|
|
||||||
* @since 2.0.0
|
|
||||||
*/
|
|
||||||
?>
|
|
||||||
|
|
||||||
<div class="top-notification-bar">
|
|
||||||
<div class="container">
|
|
||||||
<div class="d-flex align-items-center justify-content-center">
|
|
||||||
<i class="bi bi-megaphone-fill me-2"></i>
|
|
||||||
<span><strong>Nuevo:</strong> Accede a más de 200,000 Análisis de Precios Unitarios actualizados para 2025.</span>
|
|
||||||
<a href="#" class="ms-2 text-white text-decoration-underline">Ver Catálogo</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
Reference in New Issue
Block a user