t’s applied to all text in email notifications.', 'wpforms-lite' ), 'class' => [ 'hide-for-template-none', 'has-preview-changes', 'email-typography', 'email-light-mode', $this->has_education, $this->has_legacy_template ], 'education_badge' => $this->get_pro_education_badge(), 'data_attributes' => $this->has_education ? array_merge( [ 'name' => esc_html__( 'Typography', 'wpforms-lite' ) ], $education_args ) : [], 'type' => 'select', 'is_hidden' => $this->plain_text, 'choicesjs' => true, 'default' => 'sans-serif', 'options' => [ 'sans-serif' => esc_html__( 'Sans Serif', 'wpforms-lite' ), 'serif' => esc_html__( 'Serif', 'wpforms-lite' ), ], ], ]; // Add background color control if the Pro version is not active or Legacy template is selected. $new_setting = $this->maybe_add_background_color_control( $new_setting ); return wpforms_array_insert( $settings, $this->add_appearance_dark_mode_controls( $new_setting ), 'email-appearance' ); } /** * Add appearance dark mode controls. * * This function will duplicate the default "Light" color * controls to create corresponding controls for dark mode. * * @since 1.8.6 * * @param array $settings Email settings. * * @return array */ private function add_appearance_dark_mode_controls( $settings ) { // Duplicate and modify each item for dark mode. foreach ( $settings as $key => $item ) { // Duplicate the item with '-dark' added to the key. $dark_key = "{$key}-dark"; $settings[ $dark_key ] = $item; // Modify the 'name' within the duplicated item. if ( isset( $settings[ $dark_key ]['id'] ) ) { $settings[ $dark_key ]['id'] .= '-dark'; $classes = &$settings[ $dark_key ]['class']; $classes[] = 'email-dark-mode'; $classes[] = 'wpforms-hide'; // Remove classes related to light mode. $classes = array_filter( $classes, static function ( $class_name ) { return $class_name !== 'email-light-mode' && $class_name !== 'has-external-image-url'; } ); } // Override the description for the header image control. if ( $key === 'email-header-image' ) { $settings[ $dark_key ]['desc'] = esc_html__( 'Upload or choose a logo to be displayed at the top of email notifications. Light mode image will be used if not set.', 'wpforms-lite' ); } // Override the background color control attributes. if ( $key === 'email-background-color' ) { $settings[ $dark_key ]['default'] = sanitize_hex_color( $this->style_overrides['email_background_color_dark'] ); $settings[ $dark_key ]['data']['fallback-color'] = sanitize_hex_color( $this->style_overrides['email_background_color_dark'] ); } // Override the color scheme control attributes. if ( $key === 'email-color-scheme' ) { $settings[ $dark_key ]['colors'] = $this->get_color_scheme_controls( true ); } } return $settings; } /** * Get Email settings heading content. * * @since 1.8.5 * * @return string */ private function get_heading_content() { return wpforms_render( 'admin/settings/email-heading' ); } /** * Get Email settings education badge. * This is only available in the free version. * * @since 1.8.6 * * @return string */ private function get_pro_education_badge() { // Leave early if the user has the Lite version. if ( empty( $this->has_education ) ) { return ''; } // Output the education badge. return EducationHelpers::get_badge( 'Pro' ); } /** * Generate color scheme controls for the color picker. * * @since 1.8.6 * * @param bool $is_dark_mode Whether the color scheme is for dark mode. * * @return array */ private function get_color_scheme_controls( $is_dark_mode = false ) { // Append '_dark' to keys if it's for dark mode. $is_dark_mode_suffix = $is_dark_mode ? '_dark' : ''; // Data attributes to disable extensions from appearing in the input field. $color_scheme_data = [ '1p-ignore' => 'true', // 1Password ignore. 'lp-ignore' => 'true', // LastPass ignore. ]; $colors = []; $controls = [ "email_background_color{$is_dark_mode_suffix}" => esc_html__( 'Background', 'wpforms-lite' ), "email_body_color{$is_dark_mode_suffix}" => esc_html__( 'Body', 'wpforms-lite' ), "email_text_color{$is_dark_mode_suffix}" => esc_html__( 'Text', 'wpforms-lite' ), "email_links_color{$is_dark_mode_suffix}" => esc_html__( 'Links', 'wpforms-lite' ), ]; foreach ( $controls as $key => $label ) { // Construct the color controls array. $colors[ $key ] = [ 'name' => $label, 'data' => array_merge( [ 'fallback-color' => $this->style_overrides[ $key ], ], $color_scheme_data ), ]; } return $colors; } /** * Get current email template hyperlink. * * @since 1.8.5 * * @return string */ private function get_current_template_preview_link() { // Leave if the user has the legacy template is set or the user doesn't have the capability. if ( ! wpforms_current_user_can() || Helpers::is_legacy_html_template() ) { return ''; } $template_name = Helpers::get_current_template_name(); $current_template = Notifications::get_available_templates( $template_name ); // Return empty string if the current template is not found. // Leave early if the preview link is empty. if ( ! isset( $current_template['path'] ) || ! class_exists( $current_template['path'] ) || empty( $current_template['preview'] ) ) { return ''; } return sprintf( wp_kses( /* translators: %1$s - Email template preview URL. */ __( 'Preview Email Template', 'wpforms-lite' ), [ 'a' => [ 'class' => true, 'href' => true, 'target' => true, 'rel' => true, ], ] ), esc_url( $current_template['preview'] ) ); } /** * Maybe add the background color control to the email settings. * This is only available in the free version. * * @since 1.8.5 * * @param array $settings Email settings. * * @return array */ private function maybe_add_background_color_control( $settings ) { // Leave as is if the Pro version is active and no legacy template available. if ( ! Helpers::is_legacy_html_template() && wpforms()->is_pro() ) { return $settings; } // Add the background color control after the header image. return wpforms_array_insert( $settings, [ 'email-background-color' => [ 'id' => 'email-background-color', 'name' => esc_html__( 'Background Color', 'wpforms-lite' ), 'desc' => esc_html__( 'Customize the background color of the email template.', 'wpforms-lite' ), 'class' => [ 'email-background-color', 'has-preview-changes', 'email-light-mode' ], 'type' => 'color', 'is_hidden' => $this->plain_text, 'default' => '#e9eaec', 'data' => [ 'fallback-color' => $this->style_overrides['email_background_color'], '1p-ignore' => 'true', // 1Password ignore. 'lp-ignore' => 'true', // LastPass ignore. ], ], ], 'email-color-scheme', 'before' ); } /** * Gets the class for the header image control. * * This is used to determine if the header image is external. * Legacy header image control was allowing external URLs. * * Note that this evaluation is only available for the "Light" mode, * as the "Dark" mode is a new feature and doesn't have the legacy header image control. * * @since 1.8.5 * * @return string */ private function get_external_header_image_class() { $header_image_url = wpforms_setting( 'email-header-image', '' ); // If the header image URL is empty, return an empty string. if ( empty( $header_image_url ) ) { return ''; } $site_url = home_url(); // Get the current site's URL. // Get the hosts of the site URL and the header image URL. $site_url_host = wp_parse_url( $site_url, PHP_URL_HOST ); $header_image_url_host = wp_parse_url( $header_image_url, PHP_URL_HOST ); // Check if the header image URL host is different from the site URL host. if ( $header_image_url_host && $site_url_host && $header_image_url_host !== $site_url_host ) { return 'has-external-image-url'; } return ''; // If none of the conditions match, return an empty string. } /** * Determine if the current page is the "Email" settings page. * * @since 1.8.5 * * @return bool */ private function is_settings_page() { return wpforms_is_admin_page( 'settings', 'email' ); } }