'aicom', 'title' => 'AICOM — AI Commander', 'description' => 'Use your AI subscription to manage WordPress: create Elementor pages, update content, automate tasks, and stay fully in control.', 'plugin_file' => 'aicom/aicom.php', 'link' => admin_url( 'plugin-install.php?s=aicom&tab=search&type=term' ), 'link_target' => '_self', 'bg' => '#efffdb', ], [ 'id' => 'widget_finder', 'title' => 'Widget Finder for Elementor', 'description' => 'Search and install Elementor widgets without leaving the editor. Discover thousands of widgets from WordPress.org in a single click.', 'plugin_file' => 'widget-finder-for-elementor/widget-finder-for-elementor.php', 'link' => 'https://github.com/dudaster/widget-finder-for-elementor/releases/latest', 'link_target' => '_blank', 'bg' => '#fff3e0', ], [ 'id' => 'ele_conditions', 'title' => 'Ele Conditions', 'description' => 'Trigger actions on any Elementor element: show, hide, animate, or redirect on click, scroll, hover, or exit — no code needed.', 'plugin_file' => 'ele-conditions/ele-conditions.php', 'link' => admin_url( 'plugin-install.php?s=ele+conditions&tab=search&type=term' ), 'link_target' => '_self', 'bg' => '#e0f8f8', ], ]; $manager = ECS_Core::instance()->modules(); $pro_active = defined( 'ELECSP_VER' ); $pro_installed = $pro_active || file_exists( WP_PLUGIN_DIR . '/ele-custom-skin-pro/ele-custom-skin-pro.php' ); $pro_activate_url = admin_url( 'plugins.php?action=activate&plugin=' . urlencode( 'ele-custom-skin-pro/ele-custom-skin-pro.php' ) . '&_wpnonce=' . wp_create_nonce( 'activate-plugin_ele-custom-skin-pro/ele-custom-skin-pro.php' ) ); // Static list of Pro modules — shown as locked placeholders when Pro is not installed. $pro_stubs = [ [ 'id' => 'dynamic_repeater', 'title' => __( 'Dynamic Repeater Builder', 'ele-custom-skin' ), 'description' => __( 'Populate any Elementor repeater from Posts, Terms, ACF, or JSON. Supports one-time generation and runtime data binding.', 'ele-custom-skin' ), ], [ 'id' => 'container_responsive', 'title' => __( 'Responsive Container Layout', 'ele-custom-skin' ), 'description' => __( 'Set a different container type (Flexbox, Grid, Slider, Custom Layout) for each breakpoint — desktop, tablet, and mobile independently.', 'ele-custom-skin' ), ], [ 'id' => 'color_schemes', 'title' => __( 'Color Schemes', 'ele-custom-skin' ), 'description' => __( 'Save named colour palettes and switch them globally or per page — same concept as Global Colors but switchable on the fly.', 'ele-custom-skin' ), ], [ 'id' => 'font_schemes', 'title' => __( 'Font Schemes', 'ele-custom-skin' ), 'description' => __( 'Save named typography sets and switch them globally or per page — the same concept as Color Schemes but for fonts.', 'ele-custom-skin' ), ], [ 'id' => 'alt_logos', 'title' => __( 'Alternative Site Logos', 'ele-custom-skin' ), 'description' => __( 'Define multiple logos and serve a different one based on page conditions or time of day — useful for seasonal branding or per-section identity.', 'ele-custom-skin' ), ], [ 'id' => 'custom_look_feel', 'title' => __( 'Custom Look & Feel', 'ele-custom-skin' ), 'description' => __( 'Build conditional "looks" that activate a colour scheme, font scheme, CSS snippets, and a logo based on page conditions and time intervals.', 'ele-custom-skin' ), ], [ 'id' => 'legacy_pro', 'title' => __( 'Legacy Pro', 'ele-custom-skin' ), 'description' => __( 'Original ECS Pro functionality kept for backward compatibility.', 'ele-custom-skin' ), ], ]; // Split registered modules into free / pro. $free_modules = []; $pro_modules = []; // only populated when Pro is installed foreach ( $manager->get_all() as $module ) { if ( $module->is_pro() ) { $pro_modules[] = $module; } else { $free_modules[] = $module; } } // Legacy/deprecated modules go last in both lists. $push_deprecated_last = fn( $a, $b ) => $a->is_deprecated() <=> $b->is_deprecated(); usort( $free_modules, $push_deprecated_last ); usort( $pro_modules, $push_deprecated_last ); // For card rendering: "locked" means pro not active (installed but inactive, or not installed at all). $pro_locked_global = ! $pro_active; /** * Render a single module card from a real module object. */ $render_card = function ( $module ) use ( $manager, $pro_active ) { $is_active = $manager->is_active( $module->get_id() ); $is_pro = $module->is_pro(); $is_deprecated = $module->is_deprecated(); $pro_locked = $is_pro && ! $pro_active; $preview_file = ECS_PATH . 'assets/module-previews/' . $module->get_id() . '.gif'; $preview_url = file_exists( $preview_file ) ? ECS_URL . 'assets/module-previews/' . $module->get_id() . '.gif' : ''; $card_classes = implode( ' ', array_filter( [ 'ecs-module-card', $is_active ? 'is-active' : '', $is_pro ? 'is-pro' : '', $pro_locked ? 'is-locked' : '', $is_deprecated ? 'is-deprecated' : '', ] ) ); ?>
get_description() ); ?>
get_deprecated_notice() : ''; ?>