From 885276aad181853b3c852697556712691bbd38f0 Mon Sep 17 00:00:00 2001 From: FrankZamora Date: Sat, 6 Dec 2025 18:11:04 -0600 Subject: [PATCH] chore: purgar archivos legacy (plan 101 fase 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- Assets/Js/apu-tables-auto-class.js | 99 ------- Assets/Js/header.js | 342 ------------------------- TemplateParts/content-cta-box.php | 22 -- TemplateParts/content-toc.php | 42 --- TemplateParts/cta-box-sidebar.php | 21 -- TemplateParts/modal-contact.php | 61 ----- TemplateParts/top-notification-bar.php | 20 -- 7 files changed, 607 deletions(-) delete mode 100644 Assets/Js/apu-tables-auto-class.js delete mode 100644 Assets/Js/header.js delete mode 100644 TemplateParts/content-cta-box.php delete mode 100644 TemplateParts/content-toc.php delete mode 100644 TemplateParts/cta-box-sidebar.php delete mode 100644 TemplateParts/modal-contact.php delete mode 100644 TemplateParts/top-notification-bar.php diff --git a/Assets/Js/apu-tables-auto-class.js b/Assets/Js/apu-tables-auto-class.js deleted file mode 100644 index 1d7c6483..00000000 --- a/Assets/Js/apu-tables-auto-class.js +++ /dev/null @@ -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(); - } - -})(); diff --git a/Assets/Js/header.js b/Assets/Js/header.js deleted file mode 100644 index d2d1aa7b..00000000 --- a/Assets/Js/header.js +++ /dev/null @@ -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(); - } - -})(); diff --git a/TemplateParts/content-cta-box.php b/TemplateParts/content-cta-box.php deleted file mode 100644 index 352b1eee..00000000 --- a/TemplateParts/content-cta-box.php +++ /dev/null @@ -1,22 +0,0 @@ - - - - -
-
¿Listo para potenciar tus proyectos?
-

Accede a nuestra biblioteca completa de APUs y herramientas profesionales.

- -
- diff --git a/TemplateParts/content-toc.php b/TemplateParts/content-toc.php deleted file mode 100644 index 59cc45f8..00000000 --- a/TemplateParts/content-toc.php +++ /dev/null @@ -1,42 +0,0 @@ -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('/]*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 -?> -
-

Tabla de Contenido

-
    - $id) : ?> - -
  1. - -
-
diff --git a/TemplateParts/cta-box-sidebar.php b/TemplateParts/cta-box-sidebar.php deleted file mode 100644 index d8609516..00000000 --- a/TemplateParts/cta-box-sidebar.php +++ /dev/null @@ -1,21 +0,0 @@ - - -
-
¿Listo para potenciar tus proyectos?
-

Accede a nuestra biblioteca completa de APUs y herramientas profesionales.

- -
diff --git a/TemplateParts/modal-contact.php b/TemplateParts/modal-contact.php deleted file mode 100644 index cdd8e335..00000000 --- a/TemplateParts/modal-contact.php +++ /dev/null @@ -1,61 +0,0 @@ - - - - diff --git a/TemplateParts/top-notification-bar.php b/TemplateParts/top-notification-bar.php deleted file mode 100644 index 4fffb2da..00000000 --- a/TemplateParts/top-notification-bar.php +++ /dev/null @@ -1,20 +0,0 @@ - - -
-
-
- - Nuevo: Accede a más de 200,000 Análisis de Precios Unitarios actualizados para 2025. - Ver Catálogo -
-
-