',
'mobile_extra' => 'eicon-device-mobile eicon-tilted',
'tablet' => 'eicon-device-tablet',
'tablet_extra' => 'eicon-device-tablet eicon-tilted',
'laptop' => 'eicon-device-laptop',
'desktop' => 'eicon-device-desktop',
'widescreen' => 'eicon-device-wide',
];
}
return self::get_items( $this->icons_map, $device );
}
/**
* Get Default Config
*
* Retrieve the default breakpoints config array. The 'selector' property is used for CSS generation (the
* Stylesheet::add_device() method).
*
* @return array
*/
public static function get_default_config() {
return [
self::BREAKPOINT_KEY_MOBILE => [
'label' => esc_html__( 'Mobile Portrait', 'elementor' ),
'default_value' => 767,
'direction' => 'max',
],
self::BREAKPOINT_KEY_MOBILE_EXTRA => [
'label' => esc_html__( 'Mobile Landscape', 'elementor' ),
'default_value' => 880,
'direction' => 'max',
],
self::BREAKPOINT_KEY_TABLET => [
'label' => esc_html__( 'Tablet Portrait', 'elementor' ),
'default_value' => 1024,
'direction' => 'max',
],
self::BREAKPOINT_KEY_TABLET_EXTRA => [
'label' => esc_html__( 'Tablet Landscape', 'elementor' ),
'default_value' => 1200,
'direction' => 'max',
],
self::BREAKPOINT_KEY_LAPTOP => [
'label' => esc_html__( 'Laptop', 'elementor' ),
'default_value' => 1366,
'direction' => 'max',
],
self::BREAKPOINT_KEY_WIDESCREEN => [
'label' => esc_html__( 'Widescreen', 'elementor' ),
'default_value' => 2400,
'direction' => 'min',
],
];
}
/**
* Get Breakpoints Config
*
* Iterates over an array of all of the system's breakpoints (both active and inactive), queries each breakpoint's
* class instance, and generates an array containing data on each breakpoint: its label, current value, direction
* ('min'/'max') and whether it is enabled or not.
*
* @return array
*/
public function get_breakpoints_config() {
$breakpoints = $this->get_breakpoints();
$config = [];
foreach ( $breakpoints as $breakpoint_name => $breakpoint ) {
$config[ $breakpoint_name ] = [
'label' => $breakpoint->get_label(),
'value' => $breakpoint->get_value(),
'default_value' => $breakpoint->get_default_value(),
'direction' => $breakpoint->get_direction(),
'is_enabled' => $breakpoint->is_enabled(),
];
}
return $config;
}
/**
* Get Responsive Control Duplication Mode
*
* Retrieve the value of the $responsive_control_duplication_mode private class variable.
* See the variable's PHPDoc for details.
*
* @since 3.4.0
* @access public
*/
public function get_responsive_control_duplication_mode() {
return $this->responsive_control_duplication_mode;
}
/**
* Set Responsive Control Duplication Mode
*
* Sets the value of the $responsive_control_duplication_mode private class variable.
* See the variable's PHPDoc for details.
*
* @since 3.4.0
*
* @access public
* @param string $mode
*/
public function set_responsive_control_duplication_mode( $mode ) {
$this->responsive_control_duplication_mode = $mode;
}
/**
* Get Stylesheet Templates Path
*
* @since 3.2.0
* @access public
* @static
*/
public static function get_stylesheet_templates_path() {
return ELEMENTOR_ASSETS_PATH . 'css/templates/';
}
/**
* Compile Stylesheet Templates
*
* @since 3.2.0
* @access public
* @static
*/
public static function compile_stylesheet_templates() {
foreach ( self::get_stylesheet_templates() as $file_name => $template_path ) {
$file = new Frontend( $file_name, $template_path );
$file->update();
}
}
/**
* Init Breakpoints
*
* Creates the breakpoints array, containing instances of each breakpoint. Returns an array of ALL breakpoints,
* both enabled and disabled.
*
* @since 3.2.0
*/
private function init_breakpoints() {
$breakpoints = [];
$setting_prefix = self::BREAKPOINT_SETTING_PREFIX;
$active_breakpoint_keys = [
$setting_prefix . self::BREAKPOINT_KEY_MOBILE,
$setting_prefix . self::BREAKPOINT_KEY_TABLET,
];
if ( Plugin::$instance->experiments->is_feature_active( 'additional_custom_breakpoints' ) ) {
$kit_active_id = Plugin::$instance->kits_manager->get_active_id();
// Get the breakpoint settings saved in the kit directly from the DB to avoid initializing the kit too early.
$raw_kit_settings = get_post_meta( $kit_active_id, '_elementor_page_settings', true );
// If there is an existing kit with an active breakpoints value saved, use it.
if ( isset( $raw_kit_settings[ Settings_Layout::ACTIVE_BREAKPOINTS_CONTROL_ID ] ) ) {
$active_breakpoint_keys = $raw_kit_settings[ Settings_Layout::ACTIVE_BREAKPOINTS_CONTROL_ID ];
}
}
$default_config = self::get_default_config();
foreach ( $default_config as $breakpoint_name => $breakpoint_config ) {
$args = [ 'name' => $breakpoint_name ] + $breakpoint_config;
// Make sure the two default breakpoints (mobile, tablet) are always enabled.
if ( self::BREAKPOINT_KEY_MOBILE === $breakpoint_name || self::BREAKPOINT_KEY_TABLET === $breakpoint_name ) {
// Make sure the default Mobile and Tablet breakpoints are always enabled.
$args['is_enabled'] = true;
} else {
// If the breakpoint is in the active breakpoints array, make sure it's instantiated as enabled.
$args['is_enabled'] = in_array( $setting_prefix . $breakpoint_name, $active_breakpoint_keys, true );
}
$breakpoints[ $breakpoint_name ] = new Breakpoint( $args );
}
$this->breakpoints = $breakpoints;
}
/**
* Init Active Breakpoints
*
* Create/Refresh the array of --enabled-- breakpoints.
*
* @since 3.2.0
*/
private function init_active_breakpoints() {
$this->active_breakpoints = array_filter( $this->get_breakpoints(), function( $breakpoint ) {
/** @var Breakpoint $breakpoint */
return $breakpoint->is_enabled();
} );
}
private function get_desktop_previous_device_key() {
$config_array_keys = array_keys( $this->get_active_breakpoints() );
$num_of_devices = count( $config_array_keys );
// If the widescreen breakpoint is active, the device that's previous to desktop is the last one before
// widescreen.
if ( self::BREAKPOINT_KEY_WIDESCREEN === $config_array_keys[ $num_of_devices - 1 ] ) {
$desktop_previous_device = $config_array_keys[ $num_of_devices - 2 ];
} else {
// If the widescreen breakpoint isn't active, we just take the last device returned by the config.
$desktop_previous_device = $config_array_keys[ $num_of_devices - 1 ];
}
return $desktop_previous_device;
}
/**
* Get Stylesheet Templates
*
* @since 3.2.0
* @access private
* @static
*/
private static function get_stylesheet_templates() {
$templates_paths = glob( self::get_stylesheet_templates_path() . '*.css' );
$templates = [];
foreach ( $templates_paths as $template_path ) {
$file_name = 'custom-' . basename( $template_path );
$templates[ $file_name ] = $template_path;
}
$deprecated_hook = 'elementor/core/responsive/get_stylesheet_templates';
$replacement_hook = 'elementor/core/breakpoints/get_stylesheet_template';
/**
* @type Deprecation $deprecation_module
*/
$deprecation_module = Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation;
// TODO: REMOVE THIS DEPRECATED HOOK IN ELEMENTOR v3.10.0/v4.0.0
$templates = $deprecation_module->apply_deprecated_filter( $deprecated_hook, [ $templates ], '3.2.0', $replacement_hook );
return apply_filters( $replacement_hook, $templates );
}
}