diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 19dca42c..3707fa36 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -11,7 +11,13 @@ "mcp__github__search_repositories", "WebFetch(domain:stag.analisisdepreciosunitarios.com)", "Bash(curl:*)", - "Bash(grep:*)" + "Bash(grep:*)", + "Bash(awk:*)", + "mcp__serena__search_for_pattern", + "mcp__playwright__browser_navigate", + "mcp__playwright__browser_evaluate", + "mcp__playwright__browser_take_screenshot", + "mcp__serena__list_dir" ], "deny": [], "ask": [] diff --git a/.playwright-mcp/.playwright-mcp/staging-footer-comparison.png b/.playwright-mcp/.playwright-mcp/staging-footer-comparison.png new file mode 100644 index 00000000..cd7d17d4 Binary files /dev/null and b/.playwright-mcp/.playwright-mcp/staging-footer-comparison.png differ diff --git a/.playwright-mcp/.playwright-mcp/staging-footer-final-comparison.png b/.playwright-mcp/.playwright-mcp/staging-footer-final-comparison.png new file mode 100644 index 00000000..440bb7eb Binary files /dev/null and b/.playwright-mcp/.playwright-mcp/staging-footer-final-comparison.png differ diff --git a/.playwright-mcp/.playwright-mcp/staging-footer-post-cache-clear.png b/.playwright-mcp/.playwright-mcp/staging-footer-post-cache-clear.png new file mode 100644 index 00000000..d83f622e Binary files /dev/null and b/.playwright-mcp/.playwright-mcp/staging-footer-post-cache-clear.png differ diff --git a/.playwright-mcp/.playwright-mcp/staging-footer-post.png b/.playwright-mcp/.playwright-mcp/staging-footer-post.png new file mode 100644 index 00000000..1e012cf0 Binary files /dev/null and b/.playwright-mcp/.playwright-mcp/staging-footer-post.png differ diff --git a/.playwright-mcp/.playwright-mcp/template-footer-comparison.png b/.playwright-mcp/.playwright-mcp/template-footer-comparison.png new file mode 100644 index 00000000..bfec5a10 Binary files /dev/null and b/.playwright-mcp/.playwright-mcp/template-footer-comparison.png differ diff --git a/.playwright-mcp/.playwright-mcp/template-footer-local.png b/.playwright-mcp/.playwright-mcp/template-footer-local.png new file mode 100644 index 00000000..bfec5a10 Binary files /dev/null and b/.playwright-mcp/.playwright-mcp/template-footer-local.png differ diff --git a/.playwright-mcp/footer-contacto-final.png b/.playwright-mcp/footer-contacto-final.png new file mode 100644 index 00000000..b058301f Binary files /dev/null and b/.playwright-mcp/footer-contacto-final.png differ diff --git a/.playwright-mcp/footer-final.png b/.playwright-mcp/footer-final.png new file mode 100644 index 00000000..a2508544 Binary files /dev/null and b/.playwright-mcp/footer-final.png differ diff --git a/.playwright-mcp/no.png b/.playwright-mcp/no.png new file mode 100644 index 00000000..923020ec Binary files /dev/null and b/.playwright-mcp/no.png differ diff --git a/.playwright-mcp/ok.png b/.playwright-mcp/ok.png new file mode 100644 index 00000000..ff5b1cc5 Binary files /dev/null and b/.playwright-mcp/ok.png differ diff --git a/.playwright-mcp/staging-footer-final-v2.png b/.playwright-mcp/staging-footer-final-v2.png new file mode 100644 index 00000000..440bb7eb Binary files /dev/null and b/.playwright-mcp/staging-footer-final-v2.png differ diff --git a/.playwright-mcp/template-footer.png b/.playwright-mcp/template-footer.png new file mode 100644 index 00000000..bfec5a10 Binary files /dev/null and b/.playwright-mcp/template-footer.png differ diff --git a/.serena/.gitignore b/.serena/.gitignore new file mode 100644 index 00000000..14d86ad6 --- /dev/null +++ b/.serena/.gitignore @@ -0,0 +1 @@ +/cache diff --git a/.serena/project.yml b/.serena/project.yml new file mode 100644 index 00000000..d52267a2 --- /dev/null +++ b/.serena/project.yml @@ -0,0 +1,84 @@ +# list of languages for which language servers are started; choose from: +# al bash clojure cpp csharp csharp_omnisharp +# dart elixir elm erlang fortran go +# haskell java julia kotlin lua markdown +# nix perl php python python_jedi r +# rego ruby ruby_solargraph rust scala swift +# terraform typescript typescript_vts zig +# Note: +# - For C, use cpp +# - For JavaScript, use typescript +# Special requirements: +# - csharp: Requires the presence of a .sln file in the project folder. +# When using multiple languages, the first language server that supports a given file will be used for that file. +# The first language is the default language and the respective language server will be used as a fallback. +# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored. +languages: +- php + +# the encoding used by text files in the project +# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings +encoding: "utf-8" + +# whether to use the project's gitignore file to ignore files +# Added on 2025-04-07 +ignore_all_files_in_gitignore: true + +# list of additional paths to ignore +# same syntax as gitignore, so you can use * and ** +# Was previously called `ignored_dirs`, please update your config if you are using that. +# Added (renamed) on 2025-04-07 +ignored_paths: [] + +# whether the project is in read-only mode +# If set to true, all editing tools will be disabled and attempts to use them will result in an error +# Added on 2025-04-18 +read_only: false + +# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details. +# Below is the complete list of tools for convenience. +# To make sure you have the latest list of tools, and to view their descriptions, +# execute `uv run scripts/print_tool_overview.py`. +# +# * `activate_project`: Activates a project by name. +# * `check_onboarding_performed`: Checks whether project onboarding was already performed. +# * `create_text_file`: Creates/overwrites a file in the project directory. +# * `delete_lines`: Deletes a range of lines within a file. +# * `delete_memory`: Deletes a memory from Serena's project-specific memory store. +# * `execute_shell_command`: Executes a shell command. +# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced. +# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type). +# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type). +# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes. +# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file. +# * `initial_instructions`: Gets the initial instructions for the current project. +# Should only be used in settings where the system prompt cannot be set, +# e.g. in clients you have no control over, like Claude Desktop. +# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol. +# * `insert_at_line`: Inserts content at a given line in a file. +# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol. +# * `list_dir`: Lists files and directories in the given directory (optionally with recursion). +# * `list_memories`: Lists memories in Serena's project-specific memory store. +# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building). +# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context). +# * `read_file`: Reads a file within the project directory. +# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store. +# * `remove_project`: Removes a project from the Serena configuration. +# * `replace_lines`: Replaces a range of lines within a file with new content. +# * `replace_symbol_body`: Replaces the full definition of a symbol. +# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen. +# * `search_for_pattern`: Performs a search for a pattern in the project. +# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase. +# * `switch_modes`: Activates modes by providing a list of their names +# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information. +# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task. +# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed. +# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store. +excluded_tools: [] + +# initial prompt for the project. It will always be given to the LLM upon activating the project +# (contrary to the memories, which are loaded on demand). +initial_prompt: "" + +project_name: "analisisdepreciosunitarios.com" +included_optional_tools: [] diff --git a/wp-content/themes/apus-theme/assets/css/footer-contact.css b/wp-content/themes/apus-theme/assets/css/footer-contact.css deleted file mode 100644 index d5da8ddf..00000000 --- a/wp-content/themes/apus-theme/assets/css/footer-contact.css +++ /dev/null @@ -1,347 +0,0 @@ -/** - * Footer Contact Form Styles (Issue #37) - * - * Estilos para el formulario de contacto que aparece antes del footer principal. - * Incluye estilos para validaciones, estados de botones y responsive design. - * - * @package Apus_Theme - * @since 1.0.0 - */ - -/* ==================================================================== - Footer Contact Section - ==================================================================== */ - -.footer-contact-section { - position: relative; -} - -/* Color naranja principal para iconos */ -.text-primary-orange { - color: #FF8600 !important; -} - -/* ==================================================================== - Contact Info Styles - ==================================================================== */ - -/* NOTA: NO sobrescribimos h6 ni .text-muted para mantener estilos Bootstrap default del template */ - -.contact-info i { - flex-shrink: 0; - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; -} - -/* ==================================================================== - Form Styles - ==================================================================== */ - -#footerContactForm .form-control { - border: 1px solid #dee2e6; - border-radius: 0.375rem; - padding: 0.75rem 1rem; - font-size: 0.95rem; - transition: all 0.2s ease-in-out; - background-color: #fff; -} - -#footerContactForm .form-control:focus { - border-color: #FF8600; - box-shadow: 0 0 0 0.25rem rgba(255, 134, 0, 0.15); - outline: 0; -} - -#footerContactForm .form-control::placeholder { - color: #adb5bd; - opacity: 1; -} - -#footerContactForm textarea.form-control { - resize: vertical; - min-height: 100px; -} - -/* ==================================================================== - Form Validation States - ==================================================================== */ - -#footerContactForm .form-control.is-invalid { - border-color: #dc3545; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); - padding-right: calc(1.5em + 0.75rem); -} - -#footerContactForm .form-control.is-valid { - border-color: #198754; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); - padding-right: calc(1.5em + 0.75rem); -} - -#footerContactForm textarea.form-control.is-invalid, -#footerContactForm textarea.form-control.is-valid { - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -#footerContactForm .form-control.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.15); -} - -#footerContactForm .form-control.is-valid:focus { - border-color: #198754; - box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.15); -} - -/* ==================================================================== - Submit Button - ==================================================================== */ - -.btn-contact-submit { - background-color: #FF8600; - border-color: #FF8600; - color: #fff; - font-weight: 600; - padding: 0.75rem 1.5rem; - font-size: 1rem; - border-radius: 0.375rem; - transition: all 0.3s ease; - display: inline-flex; - align-items: center; - justify-content: center; - border: 2px solid #FF8600; -} - -.btn-contact-submit:hover { - background-color: #e67800; - border-color: #e67800; - color: #fff; - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(255, 134, 0, 0.3); -} - -.btn-contact-submit:active { - background-color: #cc6a00; - border-color: #cc6a00; - transform: translateY(0); - box-shadow: 0 2px 6px rgba(255, 134, 0, 0.2); -} - -.btn-contact-submit:focus { - background-color: #e67800; - border-color: #e67800; - box-shadow: 0 0 0 0.25rem rgba(255, 134, 0, 0.25); - outline: 0; -} - -.btn-contact-submit:disabled { - background-color: #6c757d; - border-color: #6c757d; - cursor: not-allowed; - opacity: 0.65; - transform: none; -} - -/* Loading State */ -.btn-contact-submit.loading { - position: relative; - color: transparent; - pointer-events: none; -} - -.btn-contact-submit.loading::after { - content: ""; - position: absolute; - width: 20px; - height: 20px; - top: 50%; - left: 50%; - margin-left: -10px; - margin-top: -10px; - border: 3px solid rgba(255, 255, 255, 0.3); - border-top-color: #fff; - border-radius: 50%; - animation: spinner-border 0.75s linear infinite; -} - -@keyframes spinner-border { - to { - transform: rotate(360deg); - } -} - -/* ==================================================================== - Form Messages - ==================================================================== */ - -#footerFormMessage { - border-radius: 0.375rem; - padding: 1rem; - margin-top: 1rem; - font-size: 0.95rem; - display: none; -} - -#footerFormMessage.show { - display: block; -} - -#footerFormMessage.alert-success { - background-color: #d1e7dd; - border-color: #badbcc; - color: #0f5132; -} - -#footerFormMessage.alert-danger { - background-color: #f8d7da; - border-color: #f5c2c7; - color: #842029; -} - -#footerFormMessage.alert-info { - background-color: #cff4fc; - border-color: #b6effb; - color: #055160; -} - -/* ==================================================================== - Responsive Design - ==================================================================== */ - -@media (max-width: 991.98px) { - .footer-contact-section { - padding: 3rem 0 !important; - } - - .footer-contact-section h2 { - font-size: 1.5rem; - } - - .contact-info { - margin-bottom: 1.5rem; - } - - #footerContactForm .form-control { - font-size: 1rem; - } -} - -@media (max-width: 767.98px) { - .footer-contact-section { - padding: 2rem 0 !important; - margin-top: 2rem !important; - } - - .footer-contact-section h2 { - font-size: 1.35rem; - margin-bottom: 1rem !important; - } - - .footer-contact-section p { - font-size: 0.95rem; - } - - /* ELIMINADO: sobrescrituras de h6 y .text-muted para mantener Bootstrap default */ - - .contact-info i { - font-size: 1.1rem !important; - } - - .btn-contact-submit { - padding: 0.65rem 1.25rem; - font-size: 0.95rem; - } - - #footerContactForm .form-control { - padding: 0.65rem 0.85rem; - font-size: 0.95rem; - } -} - -@media (max-width: 575.98px) { - .footer-contact-section { - padding: 1.5rem 0 !important; - margin-top: 1.5rem !important; - } - - .footer-contact-section .col-lg-10 { - padding-left: 0.75rem; - padding-right: 0.75rem; - } - - .contact-info .d-flex { - margin-bottom: 1rem !important; - } - - .contact-info .d-flex:last-child { - margin-bottom: 0 !important; - } -} - -/* ==================================================================== - Accessibility - ==================================================================== */ - -@media (prefers-reduced-motion: reduce) { - .btn-contact-submit, - #footerContactForm .form-control { - transition: none; - } - - .btn-contact-submit:hover { - transform: none; - } - - .btn-contact-submit.loading::after { - animation: none; - } -} - -/* High Contrast Mode */ -@media (prefers-contrast: high) { - #footerContactForm .form-control { - border-width: 2px; - } - - .btn-contact-submit { - border-width: 3px; - } - - #footerContactForm .form-control:focus { - outline: 3px solid #FF8600; - outline-offset: 2px; - } -} - -/* Dark Mode Support (future-proofing) */ -@media (prefers-color-scheme: dark) { - .footer-contact-section { - background-color: rgba(33, 37, 41, 0.15) !important; - } - - /* ELIMINADO: sobrescritura de h6 para mantener Bootstrap default */ - - #footerContactForm .form-control { - background-color: #212529; - border-color: #495057; - color: #f8f9fa; - } - - #footerContactForm .form-control::placeholder { - color: #6c757d; - } - - #footerContactForm .form-control:focus { - background-color: #212529; - border-color: #FF8600; - } -} diff --git a/wp-content/themes/apus-theme/assets/css/footer.css b/wp-content/themes/apus-theme/assets/css/footer.css deleted file mode 100644 index a50ba149..00000000 --- a/wp-content/themes/apus-theme/assets/css/footer.css +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Footer Styles - Template RDash - * - * Estilos para el footer que replica EXACTAMENTE el template RDash (líneas 1093-1151). - * Este footer es simple: 3 columnas de navegación + newsletter solo con email. - * - * IMPORTANTE: El template usa Bootstrap bg-dark (#212529), NO --color-navy-dark - * - * @package Apus_Theme - * @since 1.0.0 - * @see template: apus-theme-template/index.html líneas 1093-1151 - * @see documentation: theme-documentation/16-componente-footer-contact-form - */ - -/* ========================================================================== - Footer Main Container - ========================================================================== */ - -footer { - background-color: #212529 !important; - color: rgba(255, 255, 255, 0.8); - padding: 3rem 0; -} - -footer h5 { - color: #ffffff; - font-weight: 600; - margin-bottom: 1rem; - font-family: Poppins, sans-serif; -} - -footer a { - color: rgba(255, 255, 255, 0.8); - text-decoration: none; - transition: color 0.3s ease; -} - -footer a:hover { - color: var(--color-orange-primary); -} - -footer .btn-primary { - background-color: var(--color-orange-primary); - border-color: var(--color-orange-primary); -} - -footer .btn-primary:hover { - background-color: var(--color-orange-hover); - border-color: var(--color-orange-hover); -} - -/* ========================================================================== - Contact Info Styles (Pre-footer section) - ========================================================================== */ - -.contact-info i { - color: var(--color-orange-primary); -} - -/* ELIMINADO: .contact-info h6 para mantener Bootstrap default del template */ diff --git a/wp-content/themes/apus-theme/inc/enqueue-scripts.php b/wp-content/themes/apus-theme/inc/enqueue-scripts.php index 37999bc0..6ed1701c 100644 --- a/wp-content/themes/apus-theme/inc/enqueue-scripts.php +++ b/wp-content/themes/apus-theme/inc/enqueue-scripts.php @@ -227,19 +227,10 @@ function apus_remove_defer_from_main_js($tag, $handle) { add_filter('script_loader_tag', 'apus_remove_defer_from_main_js', 20, 2); /** - * Enqueue footer styles + * ELIMINADO: apus_enqueue_footer_styles + * Motivo: footer.css NO está documentado - CSS debe estar en style.css + * Ver: theme-documentation/16-componente-footer-contact-form/CSS-ESPECIFICO.md */ -function apus_enqueue_footer_styles() { - wp_enqueue_style( - 'apus-footer', - get_template_directory_uri() . '/assets/css/footer.css', - array('apus-bootstrap'), - filemtime(get_template_directory() . '/assets/css/footer.css'), - 'all' - ); -} - -add_action('wp_enqueue_scripts', 'apus_enqueue_footer_styles', 12); /** * Enqueue accessibility styles and scripts @@ -497,37 +488,12 @@ function apus_enqueue_cta_box_sidebar_assets() { add_action('wp_enqueue_scripts', 'apus_enqueue_cta_box_sidebar_assets', 17); /** - * Enqueue Footer Contact Form styles and scripts (Issue #37) + * ELIMINADO: apus_enqueue_footer_contact_assets + * Motivo: footer-contact.css NO está documentado - CSS debe estar en style.css + * Ver: theme-documentation/16-componente-footer-contact-form/CSS-ESPECIFICO.md + * + * NOTA: footer-contact.js SÍ existe y es correcto - se carga desde otro lado */ -function apus_enqueue_footer_contact_assets() { - // Solo enqueue si el widget está activo - if (!is_active_sidebar('footer-contact')) { - return; - } - - // Footer Contact CSS - wp_enqueue_style( - 'apus-footer-contact', - get_template_directory_uri() . '/assets/css/footer-contact.css', - array('apus-bootstrap'), - APUS_VERSION, - 'all' - ); - - // Footer Contact JS - wp_enqueue_script( - 'apus-footer-contact-js', - get_template_directory_uri() . '/assets/js/footer-contact.js', - array(), - APUS_VERSION, - array( - 'in_footer' => true, - 'strategy' => 'defer', - ) - ); -} - -add_action('wp_enqueue_scripts', 'apus_enqueue_footer_contact_assets', 19); /** * Enqueue Hero Section styles (Issue #40)