1024,
'mobile' => 767,
];
public function __construct() {
add_action( 'elementor/frontend/after_enqueue_scripts', [ $this, 'ACCE_enqueue_scripts' ], 20 );
add_action( 'elementor/element/after_section_end', [ $this, 'ACCE_add_custom_css_controls' ], 20, 2 );
add_action( 'elementor/element/parse_css', [ $this, 'ACCE_add_post_css' ], 20, 2 );
add_action( 'elementor/editor/after_enqueue_styles', [ $this, 'ACCE_enqueue_editor_styles' ] );
// Elementor Atomic Elements (Elementor 4+).
if ( class_exists( 'ACCE_Atomic_Support' ) ) {
new ACCE_Atomic_Support();
}
}
/**
* Breakpoints used for the tablet/mobile CSS, filterable via ACCE_custom_css_breakpoints.
*/
public function ACCE_get_breakpoints() {
$breakpoints = apply_filters( 'ACCE_custom_css_breakpoints', $this->ACCE_breakpoints );
if ( ! is_array( $breakpoints ) ) {
$breakpoints = $this->ACCE_breakpoints;
}
return [
'tablet' => (int) ( $breakpoints['tablet'] ?? $this->ACCE_breakpoints['tablet'] ),
'mobile' => (int) ( $breakpoints['mobile'] ?? $this->ACCE_breakpoints['mobile'] ),
];
}
/**
* Enqueues a small editor-only stylesheet that lightens the
* placeholder text color in the ACCE Custom CSS fields, so it
* reads clearly as a hint rather than as real entered text.
*/
public function ACCE_enqueue_editor_styles() {
wp_register_style( 'acce-editor-style', false, [], ACCE_VERSION );
wp_enqueue_style( 'acce-editor-style' );
$css = '
.elementor-control-acce_custom_css_desktop textarea::placeholder,
.elementor-control-acce_custom_css_tablet textarea::placeholder,
.elementor-control-acce_custom_css_mobile textarea::placeholder {
color: #9a9a9a !important;
opacity: 1 !important;
font-style: italic;
}
';
wp_add_inline_style( 'acce-editor-style', $css );
}
public function ACCE_enqueue_scripts() {
if ( \Elementor\Plugin::$instance->preview->is_preview_mode() || \Elementor\Plugin::$instance->editor->is_edit_mode() ) {
wp_enqueue_script(
'acce-live-preview-script',
ACCE_PLUGIN_URL . 'assets/js/acce-live-preview-script.js',
array( 'elementor-frontend' ),
ACCE_VERSION,
true
);
wp_localize_script(
'acce-live-preview-script',
'acceModelData',
[
'postID' => absint( get_the_ID() ),
'breakpoints' => $this->ACCE_get_breakpoints(),
]
);
}
}
public function ACCE_add_custom_css_controls( $element, $section_id ) {
if ( $section_id !== '_section_style' ) {
return;
}
$element->start_controls_section(
'acce_custom_css_section',
[
'label' => __( 'ACCE Custom CSS', 'advanced-custom-css-for-elementor' ),
'tab' => \Elementor\Controls_Manager::TAB_ADVANCED,
]
);
$element->add_control(
'acce_custom_css_tabs',
[
'type' => \Elementor\Controls_Manager::RAW_HTML,
'raw' => '' . __( 'Use "selector" to target this widget. CSS will be rendered per device.', 'advanced-custom-css-for-elementor' ) . '',
'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
]
);
$element->start_controls_tabs( 'acce_custom_css_device_tabs' );
// === Desktop Tab ===
$element->start_controls_tab(
'acce_custom_css_tab_desktop',
[
'label' => '',
]
);
$element->add_control(
'acce_custom_css_desktop',
[
'type' => \Elementor\Controls_Manager::TEXTAREA,
'label' => esc_html__( 'Desktop CSS', 'advanced-custom-css-for-elementor' ),
'rows' => 10,
'placeholder' => "selector {\n background: #000;\n color: #fff;\n}\n\nselector:hover {\n transform: scale(1.05);\n}\n\nselector img {\n border-radius: 20px;\n}",
]
);
$element->end_controls_tab();
// === Tablet Tab ===
$element->start_controls_tab(
'acce_custom_css_tab_tablet',
[
'label' => '',
]
);
$element->add_control(
'acce_custom_css_tablet',
[
'type' => \Elementor\Controls_Manager::TEXTAREA,
'label' => esc_html__( 'Tablet CSS', 'advanced-custom-css-for-elementor' ),
'rows' => 10,
'placeholder' => "selector {\n background: #000;\n color: #fff;\n}\n\nselector:hover {\n transform: scale(1.05);\n}\n\nselector img {\n border-radius: 20px;\n}",
]
);
$element->end_controls_tab();
// === Mobile Tab ===
$element->start_controls_tab(
'acce_custom_css_tab_mobile',
[
'label' => '',
]
);
$element->add_control(
'acce_custom_css_mobile',
[
'type' => \Elementor\Controls_Manager::TEXTAREA,
'label' => esc_html__( 'Mobile CSS', 'advanced-custom-css-for-elementor' ),
'rows' => 10,
'placeholder' => "selector {\n background: #000;\n color: #fff;\n}\n\nselector:hover {\n transform: scale(1.05);\n}\n\nselector img {\n border-radius: 20px;\n}",
]
);
$element->end_controls_tab();
$element->end_controls_tabs();
$element->end_controls_section();
}
public function ACCE_add_post_css( $post_css, $element ) {
if ( $post_css instanceof \Elementor\Core\Files\CSS\Dynamic_CSS ) {
return;
}
$settings = $element->get_settings();
$devices = [
'desktop' => ACCE_Atomic_Support::sanitize_css( $settings['acce_custom_css_desktop'] ?? '' ),
'tablet' => ACCE_Atomic_Support::sanitize_css( $settings['acce_custom_css_tablet'] ?? '' ),
'mobile' => ACCE_Atomic_Support::sanitize_css( $settings['acce_custom_css_mobile'] ?? '' ),
];
if ( '' === implode( '', $devices ) ) {
return;
}
$post_id = (int) $post_css->get_post_id(); // not get_the_ID()
$element_id = preg_replace( '/[^A-Za-z0-9_-]/', '', (string) $element->get_id() );
$selector = ".elementor-{$post_id} .elementor-element.elementor-element-{$element_id}";
$bp = $this->ACCE_get_breakpoints();
$css = '';
if ( '' !== $devices['desktop'] ) {
$css .= ACCE_Atomic_Support::replace_selector( $devices['desktop'], $selector ) . "\n";
}
if ( '' !== $devices['tablet'] ) {
$css .= sprintf( "@media (max-width: %dpx) {\n%s\n}\n", $bp['tablet'], ACCE_Atomic_Support::replace_selector( $devices['tablet'], $selector ) );
}
if ( '' !== $devices['mobile'] ) {
$css .= sprintf( "@media (max-width: %dpx) {\n%s\n}\n", $bp['mobile'], ACCE_Atomic_Support::replace_selector( $devices['mobile'], $selector ) );
}
$post_css->get_stylesheet()->add_raw_css(
sprintf( "/* Start ACCE custom CSS for %s */\n%s/* End ACCE custom CSS */\n", esc_html( $element->get_name() ), $css )
);
}
}
}
?>