buildHeader($componentId); // Layout 2 columnas $html .= '
'; $html .= '
'; $html .= $this->buildVisibilityGroup($componentId); $html .= $this->buildContentGroup($componentId); $html .= $this->buildBehaviorGroup($componentId); $html .= '
'; $html .= '
'; $html .= $this->buildTypographyGroup($componentId); $html .= $this->buildColorsGroup($componentId); $html .= $this->buildSpacingGroup($componentId); $html .= $this->buildVisualEffectsGroup($componentId); $html .= '
'; $html .= '
'; return $html; } private function buildHeader(string $componentId): string { $html = '
renderer->getFieldValue($componentId, 'visibility', 'is_enabled', true); $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; $html .= '
'; // Switch: Show on Desktop $showDesktop = $this->renderer->getFieldValue($componentId, 'visibility', 'show_on_desktop', true); $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; $html .= '
'; // Switch: Show on Mobile $showMobile = $this->renderer->getFieldValue($componentId, 'visibility', 'show_on_mobile', false); $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; $html .= '
'; // ============================================= // Checkboxes de visibilidad por tipo de página // Grupo especial: _page_visibility // ============================================= $html .= '
'; $html .= '

'; $html .= ' '; $html .= ' Mostrar en tipos de pagina'; $html .= '

'; $showOnHome = $this->renderer->getFieldValue($componentId, '_page_visibility', 'show_on_home', true); $showOnPosts = $this->renderer->getFieldValue($componentId, '_page_visibility', 'show_on_posts', true); $showOnPages = $this->renderer->getFieldValue($componentId, '_page_visibility', 'show_on_pages', true); $showOnArchives = $this->renderer->getFieldValue($componentId, '_page_visibility', 'show_on_archives', false); $showOnSearch = $this->renderer->getFieldValue($componentId, '_page_visibility', 'show_on_search', false); $html .= '
'; $html .= '
'; $html .= $this->buildPageVisibilityCheckbox('ctaLetsTalkVisibilityHome', 'Home', 'bi-house', $showOnHome); $html .= '
'; $html .= '
'; $html .= $this->buildPageVisibilityCheckbox('ctaLetsTalkVisibilityPosts', 'Posts', 'bi-file-earmark-text', $showOnPosts); $html .= '
'; $html .= '
'; $html .= $this->buildPageVisibilityCheckbox('ctaLetsTalkVisibilityPages', 'Paginas', 'bi-file-earmark', $showOnPages); $html .= '
'; $html .= '
'; $html .= $this->buildPageVisibilityCheckbox('ctaLetsTalkVisibilityArchives', 'Archivos', 'bi-archive', $showOnArchives); $html .= '
'; $html .= '
'; $html .= $this->buildPageVisibilityCheckbox('ctaLetsTalkVisibilitySearch', 'Busqueda', 'bi-search', $showOnSearch); $html .= '
'; $html .= '
'; $html .= '
'; $html .= ''; return $html; } private function buildContentGroup(string $componentId): string { $html = '
'; $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' Contenido'; $html .= '
'; // Text: Button Text $buttonText = $this->renderer->getFieldValue($componentId, 'content', 'button_text', "Let's Talk"); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Switch: Show Icon $showIcon = $this->renderer->getFieldValue($componentId, 'content', 'show_icon', true); $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; $html .= '
'; // Text: Icon Class $iconClass = $this->renderer->getFieldValue($componentId, 'content', 'icon_class', 'bi-lightning-charge-fill'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= ' Usa clases de Bootstrap Icons (ej: bi-chat-dots)'; $html .= '
'; // Text: Modal Target $modalTarget = $this->renderer->getFieldValue($componentId, 'content', 'modal_target', '#contactModal'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Text: ARIA Label $ariaLabel = $this->renderer->getFieldValue($componentId, 'content', 'aria_label', 'Abrir formulario de contacto'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; $html .= '
'; $html .= '
'; return $html; } private function buildBehaviorGroup(string $componentId): string { $html = '
'; $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' Comportamiento'; $html .= '
'; // Switch: Enable Modal $enableModal = $this->renderer->getFieldValue($componentId, 'behavior', 'enable_modal', true); $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; $html .= ' Si está desactivado, usará la URL personalizada'; $html .= '
'; // URL: Custom URL $customUrl = $this->renderer->getFieldValue($componentId, 'behavior', 'custom_url', ''); $html .= '
'; $html .= ' '; $html .= ' '; $html .= ' Solo se usa si "Abrir modal" está desactivado'; $html .= '
'; // Switch: Open in New Tab $openNewTab = $this->renderer->getFieldValue($componentId, 'behavior', 'open_in_new_tab', false); $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; $html .= '
'; $html .= '
'; $html .= '
'; return $html; } private function buildTypographyGroup(string $componentId): string { $html = '
'; $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' Tipografía'; $html .= '
'; // Text: Font Size $fontSize = $this->renderer->getFieldValue($componentId, 'typography', 'font_size', '1rem'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Select: Font Weight $fontWeight = $this->renderer->getFieldValue($componentId, 'typography', 'font_weight', '600'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Select: Text Transform $textTransform = $this->renderer->getFieldValue($componentId, 'typography', 'text_transform', 'none'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; $html .= '
'; $html .= '
'; return $html; } private function buildColorsGroup(string $componentId): string { $html = '
'; $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' Colores'; $html .= '
'; // Color: Background $bgColor = $this->renderer->getFieldValue($componentId, 'colors', 'background_color', '#FF8600'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Color: Background Hover $bgHoverColor = $this->renderer->getFieldValue($componentId, 'colors', 'background_hover_color', '#FF6B35'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Color: Text $textColor = $this->renderer->getFieldValue($componentId, 'colors', 'text_color', '#FFFFFF'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Color: Text Hover $textHoverColor = $this->renderer->getFieldValue($componentId, 'colors', 'text_hover_color', '#FFFFFF'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Text: Border Color (permite transparent) $borderColor = $this->renderer->getFieldValue($componentId, 'colors', 'border_color', 'transparent'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= ' Usa "transparent" para sin borde visible'; $html .= '
'; $html .= '
'; $html .= '
'; return $html; } private function buildSpacingGroup(string $componentId): string { $html = '
'; $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' Espaciado'; $html .= '
'; // Text: Padding Top/Bottom $paddingTB = $this->renderer->getFieldValue($componentId, 'spacing', 'padding_top_bottom', '0.5rem'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Text: Padding Left/Right $paddingLR = $this->renderer->getFieldValue($componentId, 'spacing', 'padding_left_right', '1.5rem'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Text: Margin Left $marginLeft = $this->renderer->getFieldValue($componentId, 'spacing', 'margin_left', '1rem'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= ' Separación del menú en pantallas ≥992px'; $html .= '
'; // Text: Icon Spacing $iconSpacing = $this->renderer->getFieldValue($componentId, 'spacing', 'icon_spacing', '0.5rem'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; $html .= '
'; $html .= '
'; return $html; } private function buildVisualEffectsGroup(string $componentId): string { $html = '
'; $html .= '
'; $html .= '
'; $html .= ' '; $html .= ' Efectos Visuales'; $html .= '
'; // Text: Border Radius $borderRadius = $this->renderer->getFieldValue($componentId, 'visual_effects', 'border_radius', '6px'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Text: Border Width $borderWidth = $this->renderer->getFieldValue($componentId, 'visual_effects', 'border_width', '0'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; // Text: Box Shadow $boxShadow = $this->renderer->getFieldValue($componentId, 'visual_effects', 'box_shadow', 'none'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= ' Ej: 0 2px 4px rgba(0,0,0,0.1)'; $html .= '
'; // Text: Transition Duration $transitionDuration = $this->renderer->getFieldValue($componentId, 'visual_effects', 'transition_duration', '0.3s'); $html .= '
'; $html .= ' '; $html .= ' '; $html .= '
'; $html .= '
'; $html .= '
'; return $html; } private function buildPageVisibilityCheckbox(string $id, string $label, string $icon, mixed $checked): string { $checked = $checked === true || $checked === '1' || $checked === 1; $html = '
'; $html .= sprintf( ' ', esc_attr($id), $checked ? 'checked' : '' ); $html .= sprintf( ' '; $html .= '
'; return $html; } }