(meta, OG, polices locales)
* Contenu principal (logo, titre, message, Lottie, vidéo, parallax)
* Panneau latéral repliable + compte à rebours
* Modales (notification email + accès visiteur)
* JavaScript (compte à rebours, panneau, AJAX abonnement/connexion)
* Helpers PHP (darken_color, hex_to_rgb, hex_to_rgba)
*/
class MGENIUS_Frontend {
private $settings;
/**
* L'animation Lottie peut-elle etre servie dans le contexte courant ?
*
* Le lecteur lui-meme est heberge dans le plugin : il ne pose aucun probleme
* de confidentialite. Seule l'ORIGINE de l'animation en pose un. En mode
* RGPD, on refuse donc les URL pointant vers un domaine tiers, mais on
* accepte les fichiers televerses sur le site.
*
* @return bool
*/
private function lottie_src_allowed() {
$url = $this->settings['lottie_url'] ?? '';
if ('' === $url) {
return false;
}
if (empty($this->settings['rgpd_mode'])) {
return true;
}
$host = wp_parse_url($url, PHP_URL_HOST);
if (empty($host)) {
return true; // chemin relatif : forcement local
}
$site_host = wp_parse_url(home_url(), PHP_URL_HOST);
return strtolower($host) === strtolower((string) $site_host);
}
public function __construct($settings) {
$this->settings = $settings;
// v2.9.175 — un titre jamais modifié suit le mode affiché.
$mgenius_mode = isset( $this->settings['page_mode'] ) ? $this->settings['page_mode'] : 'maintenance';
$mgenius_title = isset( $this->settings['title'] ) ? (string) $this->settings['title'] : '';
$mgenius_en = MGENIUS_Settings::untouched_english_defaults();
if ( '' === $mgenius_title || in_array( $mgenius_title, array( MGENIUS_Settings::default_title_for( 'maintenance' ), MGENIUS_Settings::default_title_for( 'coming_soon' ) ), true ) || in_array( trim( $mgenius_title ), $mgenius_en['title'], true ) ) {
$this->settings['title'] = MGENIUS_Settings::default_title_for( $mgenius_mode );
}
// v2.9.181 — message par défaut anglais jamais modifié : texte traduit.
$mgenius_msg = isset( $this->settings['message'] ) ? trim( wp_strip_all_tags( (string) $this->settings['message'] ) ) : '';
if ( in_array( $mgenius_msg, $mgenius_en['message'], true ) ) {
$this->settings['message'] = __( 'We are updating our website. We will be back very soon.', '1001web-maintenance-launch-pages' );
}
}
/**
* Afficher la page de maintenance
*/
public function render() {
$page_mode = $this->settings['page_mode'] ?? 'maintenance';
if ( $page_mode === 'coming_soon' || empty( $this->settings['seo_503_enabled'] ) ) {
// Page affichee = 200, meme sur une URL inexistante.
status_header( 200 );
} else {
status_header(503);
if (!empty($this->settings['retry_after_hours'])) {
$retry_seconds = intval($this->settings['retry_after_hours']) * 3600;
// v2.9.174 — when the end is known (countdown that ends the
// maintenance, or scheduled end), Retry-After says when to
// come back instead of a fixed 24 h.
$known_end = 0;
if (!empty($this->settings['countdown_enabled']) && !empty($this->settings['countdown_auto_disable'])) {
$known_end = MGENIUS_Main::countdown_target_timestamp($this->settings);
}
if (!$known_end && !empty($this->settings['schedule_enabled']) && !empty($this->settings['schedule_auto_on'])) {
$window = MGENIUS_Main::schedule_window($this->settings);
$known_end = $window ? (int) $window['end'] : 0;
}
if ($known_end > time()) {
$retry_seconds = max(60, min($retry_seconds, $known_end - time()));
}
header('Retry-After: ' . $retry_seconds);
}
}
// No « Visitor Access » button without a password: the form would
// always answer « Visitor access is disabled ».
$show_visitor_button = !empty($this->settings['visitor_access_enabled']) && !empty($this->settings['visitor_password']);
$show_admin_button = !empty($this->settings['show_admin_button']);
$bg_color_1 = $this->settings['bg_color_1'] ?? '#D4BADD';
$bg_color_1_opacity = intval($this->settings['bg_color_1_opacity'] ?? 100);
$bg_color_2 = $this->settings['bg_color_2'] ?? '#E4EFC5';
$bg_color_2_opacity = intval($this->settings['bg_color_2_opacity'] ?? 100);
$title_color = $this->settings['title_color'] ?? '#F97316';
$title_opacity = intval($this->settings['title_opacity'] ?? 100);
$message_color = $this->settings['message_color'] ?? '#555555';
$message_opacity = intval($this->settings['message_opacity'] ?? 100);
$button_color = $this->settings['button_color'] ?? '#F97316';
$button_opacity = intval($this->settings['button_opacity'] ?? 100);
$bg_image_enabled = $this->settings['bg_image_enabled'] ?? false;
$bg_image_url = $this->settings['bg_image_url'] ?? '';
$bg_overlay = intval($this->settings['bg_overlay_opacity'] ?? 50);
$container_bg = $this->settings['container_bg_color'] ?? '#ffffff';
$container_opacity = intval($this->settings['container_bg_opacity'] ?? 95);
$container_shadow = $this->settings['container_shadow_enabled'] ?? true;
$container_shadow_intensity = intval($this->settings['container_shadow_intensity'] ?? 30);
$title_font = $this->settings['title_font'] ?? 'Poppins';
$message_font = $this->settings['message_font'] ?? 'Open Sans';
$mgenius_font_whitelist = MGENIUS_Settings::get_fonts();
if ( ! isset( $mgenius_font_whitelist[ $title_font ] ) ) { $title_font = 'Poppins'; }
if ( ! isset( $mgenius_font_whitelist[ $message_font ] ) ) { $message_font = 'Open Sans'; }
// Polices par defaut hebergees dans le plugin (licence OFL) :
// aucune requete externe, donc affichees aussi en mode RGPD.
// Les 10 polices proposees sont fournies avec le plugin
// (paquets Fontsource 5.3.0, licence OFL) : plus aucun appel a Google.
$mgenius_local_fonts = array(
'Poppins' => 'poppins',
'Open Sans' => 'open-sans',
'Roboto' => 'roboto',
'Lato' => 'lato',
'Montserrat' => 'montserrat',
'Playfair Display' => 'playfair-display',
'Raleway' => 'raleway',
'Inter' => 'inter',
'Nunito' => 'nunito',
'Merriweather' => 'merriweather',
);
$title_size = intval($this->settings['title_size'] ?? 42);
$message_size = intval($this->settings['message_size'] ?? 18);
$logo_size = intval($this->settings['logo_size'] ?? 150);
$sidebar_tab_color = $this->settings['sidebar_tab_color'] ?? '#F97316';
$container_max_width = intval($this->settings['container_max_width'] ?? 600);
$container_padding = intval($this->settings['container_padding'] ?? 60);
$container_border_radius = intval($this->settings['container_border_radius'] ?? 20);
$animation_enabled = $this->settings['animation_enabled'] ?? true;
$logo_animation = $this->settings['logo_animation'] ?? 'pulse';
$text_animation = $this->settings['text_animation'] ?? 'fadeIn';
$button_animation = $this->settings['button_animation'] ?? 'slideUp';
$animation_duration = intval($this->settings['animation_duration'] ?? 1000);
$rgpd_mode = !empty($this->settings['rgpd_mode']);
$system_fonts = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif';
$sidebar_enabled = !empty($this->settings['sidebar_enabled']);
// v2.9.174 — pas de volet vide : sans aucun lien ni contact, il n'est pas affiché.
if ($sidebar_enabled) {
$sidebar_has_content = false;
foreach (['social_facebook', 'social_twitter', 'social_instagram', 'social_linkedin', 'social_youtube', 'social_tiktok', 'contact_email', 'contact_phone', 'contact_whatsapp'] as $sidebar_key) {
if (!empty($this->settings[$sidebar_key])) { $sidebar_has_content = true; break; }
}
$sidebar_enabled = $sidebar_has_content;
}
$sidebar_position = $this->settings['sidebar_position'] ?? 'right';
$sidebar_tab_color = $this->settings['sidebar_tab_color'] ?? '#F97316';
$logo_size = intval($this->settings['logo_size'] ?? 150);
$bg1_rgba = $this->hex_to_rgba($bg_color_1, $bg_color_1_opacity);
$container_bg_rgba = $this->hex_to_rgba($container_bg, $container_opacity);
$bg2_rgba = $this->hex_to_rgba($bg_color_2, $bg_color_2_opacity);
$title_rgba = $this->hex_to_rgba($title_color, $title_opacity);
$message_rgba = $this->hex_to_rgba($message_color, $message_opacity);
$button_rgba = $this->hex_to_rgba($button_color, $button_opacity);
$button_border = $this->darken_color($button_color, 10);
$button_rgb = $this->hex_to_rgb($button_color);
// Lisibilite automatique des boutons. Le texte du bouton
// plein prend blanc ou noir selon sa couleur ; le bouton « Visitor
// Access » (contour) prend la couleur du bouton seulement si elle se
// lit sur la carte, sinon celle du titre, sinon blanc ou noir.
$mgenius_box_hex = MGENIUS_Settings::color_mix($container_bg, $bg_color_1, $container_opacity / 100);
$mgenius_button_text = MGENIUS_Settings::readable_text_on($button_color);
if (MGENIUS_Settings::color_contrast($button_color, $mgenius_box_hex) >= 4.5) {
$mgenius_visitor_color = $button_rgba;
} elseif (MGENIUS_Settings::color_contrast($title_color, $mgenius_box_hex) >= 4.5) {
$mgenius_visitor_color = $title_rgba;
} else {
$mgenius_visitor_color = MGENIUS_Settings::readable_text_on($mgenius_box_hex);
}
if ($bg_image_enabled && !empty($bg_image_url)) {
$bg_overlay_value = floatval($bg_overlay) / 100.0;
$bg_overlay_rgba = 'rgba(0, 0, 0, ' . $bg_overlay_value . ')';
$background_css = "
background-image:
linear-gradient({$bg_overlay_rgba}, {$bg_overlay_rgba}),
url('" . esc_url($bg_image_url) . "');
background-size: cover;
background-position: center;
background-attachment: fixed;
";
} else {
$background_css = "background: linear-gradient(135deg, {$bg1_rgba} 0%, {$bg2_rgba} 100%);";
}
// CRITIQUE : on utilise $bg1_rgba et $bg2_rgba (avec opacités utilisateur) au lieu de
// valeurs hardcoded, sinon les sliders d'opacité sont ignorés.
$is_genius_preset = (
strtolower($bg_color_1) === '#1f2937' &&
strtolower($bg_color_2) === '#0f172a'
);
if ( $is_genius_preset && !($bg_image_enabled && !empty($bg_image_url)) ) {
// Background Geometric Grid Tech respectant les opacités custom.
// Les grilles orange (alpha 0.08) restent fixes — elles font partie de l'identité
// visuelle du preset, pas un paramètre user.
$background_css = "
background-color: {$bg2_rgba};
background-image:
repeating-linear-gradient(0deg, transparent 0, transparent 39px, rgba(249,115,22,0.18) 40px),
repeating-linear-gradient(90deg, transparent 0, transparent 39px, rgba(249,115,22,0.18) 40px),
radial-gradient(ellipse at center, {$bg1_rgba} 0%, {$bg2_rgba} 100%);
";
}
?>
settings['noindex_enabled'])): ?>
settings['title']); ?>
settings['title'] ?? MGENIUS_Settings::default_title();
$mm_description = wp_trim_words( wp_strip_all_tags( $this->settings['message'] ?? '' ), 30, '…' );
if ( empty( $mm_description ) ) {
/* translators: %s: site name */
$mm_description = sprintf( __( '%s is currently performing scheduled maintenance. We will be back shortly.', '1001web-maintenance-launch-pages' ), $site_name );
}
$mm_image = ! empty( $this->settings['logo_url'] ) ? $this->settings['logo_url'] : ( ! empty( $bg_image_url ) ? $bg_image_url : '' );
$mm_image = esc_url( $mm_image );
?>
'https://schema.org',
'@type' => 'SpecialAnnouncement',
'name' => $mm_title,
'text' => $mm_description,
'datePosted' => gmdate( 'c' ),
'expires' => gmdate( 'c', time() + DAY_IN_SECONDS ),
'category' => 'Scheduled maintenance', // Texte libre valide (l'URL schema.org/MaintenanceAnnouncement n'existe pas)
'spatialCoverage' => [
'@type' => 'WebSite',
'name' => $site_name,
'url' => $site_url,
],
'publisher' => [
'@type' => 'Organization',
'name' => $site_name,
'url' => $site_url,
],
], $mgenius_jsonld_flags ), array( 'type' => 'application/ld+json' ) );
wp_print_inline_script_tag( wp_json_encode( [
'@context' => 'https://schema.org',
'@type' => 'WebSite',
'name' => $site_name,
'url' => $site_url,
], $mgenius_jsonld_flags ), array( 'type' => 'application/ld+json' ) );
?>
settings['turnstile_enabled']);
$turnstile_site_key = $this->settings['turnstile_site_key'] ?? '';
$turnstile_secret_key = $this->settings['turnstile_secret_key'] ?? '';
$turnstile_on_notification = !empty($this->settings['turnstile_on_notification']);
$turnstile_on_visitor = !empty($this->settings['turnstile_on_visitor']);
if ($turnstile_enabled && !empty($turnstile_site_key)) {
// Turnstile enfilé puis imprimé explicitement : la page de maintenance
// est un document autonome et n'appelle pas wp_head().
//
// Le script est servi par Cloudflare et ne peut pas etre heberge
// localement : le widget verifie l'origine de son propre code. Ce
// service tiers est declare dans la section External Services du
// readme.txt, avec ses conditions et sa politique de confidentialite.
// phpcs:disable PluginCheck.CodeAnalysis.EnqueuedResourceOffloading.OffloadedContent -- Service tiers documente au readme.txt, non hebergeable localement.
wp_register_script(
'mgenius-turnstile',
'https://challenges.cloudflare.com/turnstile/v0/api.js',
array(),
MGENIUS_VERSION,
array( 'strategy' => 'defer', 'in_footer' => false )
);
// phpcs:enable PluginCheck.CodeAnalysis.EnqueuedResourceOffloading.OffloadedContent
wp_script_add_data( 'mgenius-turnstile', 'async', true );
wp_enqueue_script( 'mgenius-turnstile' );
wp_print_scripts( 'mgenius-turnstile' );
}
$mgenius_dyn_css = '';
$mgenius_ranges = array(
'latin' => 'U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD',
'latin-ext' => 'U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF',
);
foreach ( array_unique( array( $title_font, $message_font ) ) as $mgenius_family ) {
if ( ! isset( $mgenius_local_fonts[ $mgenius_family ] ) ) {
continue;
}
foreach ( array( 400, 700 ) as $mgenius_weight ) {
foreach ( $mgenius_ranges as $mgenius_subset => $mgenius_range ) {
$mgenius_font_url = MGENIUS_PLUGIN_URL . 'assets/fonts/' . $mgenius_local_fonts[ $mgenius_family ] . '-' . $mgenius_subset . '-' . $mgenius_weight . '-normal.woff2';
$mgenius_dyn_css .= "@font-face{font-family:'" . $mgenius_family . "';font-style:normal;font-weight:" . (int) $mgenius_weight . ";font-display:swap;src:url(" . esc_url( $mgenius_font_url ) . ") format('woff2');unicode-range:" . esc_html( $mgenius_range ) . ";}\n";
}
}
}
// Couleurs, tailles et polices des reglages : proprietes CSS lues par
// assets/css/page.css. Polices : liste blanche get_fonts() / pile systeme
// codee en dur (esc_attr() encoderait les guillemets).
if ( $container_shadow ) {
// Ombre proportionnelle a l'intensite, visible meme sur fond sombre.
$shadow_alpha = floatval( $container_shadow_intensity ) / 100;
$shadow_blur = 20 + intval( $container_shadow_intensity ) / 2; // 20px -> 70px
$shadow_spread = intval( $container_shadow_intensity ) / 10; // 0 -> 10px
$mgenius_shadow = '0 ' . esc_attr( $shadow_spread + 10 ) . 'px ' . esc_attr( $shadow_blur ) . 'px ' . esc_attr( $shadow_spread ) . 'px rgba(0, 0, 0, ' . esc_attr( $shadow_alpha * 0.85 ) . ')';
} else {
$mgenius_shadow = 'none';
}
$mgenius_vars = array(
'--mg-container-shadow' => $mgenius_shadow,
'--mg-container-radius' => esc_attr( $container_border_radius ) . 'px',
'--mg-container-max-width' => esc_attr( $container_max_width ) . 'px',
'--mg-container-padding' => esc_attr( $container_padding ) . 'px',
'--mg-subtitle-size' => esc_attr( max( 18, intval( $title_size ) - 16 ) ) . 'px',
'--mg-container-radius-sm' => esc_attr( max( 12, intval( $container_border_radius * 0.6 ) ) ) . 'px',
'--mg-message-size-sm' => esc_attr( max( 14, intval( $message_size * 0.85 ) ) ) . 'px',
'--mg-title-size-xs' => esc_attr( max( 20, intval( $title_size * 0.6 ) ) ) . 'px',
'--mg-title-size-sm' => esc_attr( max( 22, intval( $title_size * 0.7 ) ) ) . 'px',
'--mg-logo-size-sm' => esc_attr( min( 150, intval( $logo_size * 0.7 ) ) ) . 'px',
'--mg-logo-size' => esc_attr( $logo_size ) . 'px',
'--mg-message-size' => esc_attr( $message_size ) . 'px',
'--mg-title-size' => esc_attr( $title_size ) . 'px',
'--mg-button-rgb' => esc_attr( $button_rgb ),
'--mg-button-border' => esc_attr( $button_border ),
'--mg-button-bg' => esc_attr( $button_rgba ),
'--mg-container-bg' => esc_attr( $container_bg_rgba ),
'--mg-message-color' => esc_attr( $message_rgba ),
'--mg-button-text' => esc_attr( $mgenius_button_text ),
'--mg-visitor-color' => esc_attr( $mgenius_visitor_color ),
'--mg-sidebar-tab' => esc_attr( $sidebar_tab_color ),
'--mg-sidebar-tab-dark' => esc_attr( $this->darken_color( $sidebar_tab_color, 15 ) ),
'--mg-title-color' => esc_attr( $title_rgba ),
'--mg-message-font' => isset( $mgenius_local_fonts[ $message_font ] ) ? "'" . $message_font . "', " . $system_fonts : ( $rgpd_mode ? $system_fonts : "'" . $message_font . "', sans-serif" ),
'--mg-title-font' => isset( $mgenius_local_fonts[ $title_font ] ) ? "'" . $title_font . "', " . $system_fonts : ( $rgpd_mode ? $system_fonts : "'" . $title_font . "', sans-serif" ),
);
$mgenius_dyn_css .= ':root{';
foreach ( $mgenius_vars as $mgenius_var => $mgenius_val ) {
$mgenius_dyn_css .= $mgenius_var . ':' . $mgenius_val . ';';
}
$mgenius_dyn_css .= "}\n";
// Fond (image, degrade ou motif GENIUS), deja assaini plus haut.
$mgenius_dyn_css .= 'body{' . $background_css . "}\n";
if ( $animation_enabled ) {
$mgenius_dyn_css .= '/* Appliquer les animations */ .maintenance-logo { animation: ' . esc_attr( $logo_animation ) . ' ' . esc_attr( $animation_duration ) . 'ms ease-out; } .maintenance-title, .maintenance-message { animation: ' . esc_attr( $text_animation ) . ' ' . esc_attr( $animation_duration ) . 'ms ease-out; } .maintenance-title { animation-delay: 0.2s; animation-fill-mode: both; } .maintenance-message { animation-delay: 0.4s; animation-fill-mode: both; } .maintenance-buttons { animation: ' . esc_attr( $button_animation ) . ' ' . esc_attr( $animation_duration ) . 'ms ease-out; animation-delay: 0.6s; animation-fill-mode: both; }' . "\n";
}
// Feuille statique + CSS genere : imprimes explicitement, la page de
// maintenance n'appelant pas wp_head().
wp_register_style( 'mgenius-mm-styles', MGENIUS_PLUGIN_URL . 'assets/css/page.css', array(), MGENIUS_VERSION );
wp_add_inline_style( 'mgenius-mm-styles', $mgenius_dyn_css );
wp_print_styles( 'mgenius-mm-styles' );
?>
etait rendu,
// mais le composant jamais defini — d'ou un emplacement vide.
// Ce qui releve du RGPD, c'est l'URL de l'animation lorsqu'elle est externe :
// filtree par MGENIUS_Frontend::lottie_src_allowed().
$lottie_enabled = !empty($this->settings['lottie_enabled']) && !empty($this->settings['lottie_url']) && $this->lottie_src_allowed();
if ($lottie_enabled):
?>
below carries « light »: the player then loads
// the lottie-web build without expressions, so JavaScript contained in an
// animation file is never run.
wp_enqueue_script(
'mgenius-dotlottie',
MGENIUS_PLUGIN_URL . 'assets/js/vendor/dotlottie/dotlottie-player.mjs',
array(),
MGENIUS_VERSION,
false
);
add_filter( 'script_loader_tag', array( __CLASS__, 'dotlottie_module_tag' ), 10, 2 );
wp_print_scripts( 'mgenius-dotlottie' );
remove_filter( 'script_loader_tag', array( __CLASS__, 'dotlottie_module_tag' ), 10 );
?>
settings['lottie_enabled']) && !empty($this->settings['lottie_url']) && $this->lottie_src_allowed();
$lottie_position = $this->settings['lottie_position'] ?? 'above-title';
$lottie_size = $this->settings['lottie_size'] ?? 200;
// Décalage : transform translate() plutôt que position absolue — n'affecte
// pas le flux des autres éléments, accéléré par le GPU, et remettre à zéro
// rétablit exactement la position d'origine.
$lottie_ox = (int) ( $this->settings['lottie_offset_x'] ?? 0 );
$lottie_oy = (int) ( $this->settings['lottie_offset_y'] ?? 0 );
// En arrière-plan l'animation couvre déjà l'écran : le décalage n'a pas de sens.
if ( ( $this->settings['lottie_position'] ?? '' ) === 'background' ) {
$lottie_ox = 0;
$lottie_oy = 0;
}
// Variables CSS plutot qu'un transform inline : un style inline ne peut pas
// etre module par une media query, alors qu'une variable si. C'est ce qui
// permet de reduire le decalage de moitie sur petit ecran.
$lottie_shift = ( $lottie_ox || $lottie_oy )
? sprintf( '--mgenius-ox:%dpx; --mgenius-oy:%dpx;', $lottie_ox, $lottie_oy )
: '';
$lottie_url = $this->settings['lottie_url'] ?? '';
$lottie_loop = $this->settings['lottie_loop'] ?? true;
$lottie_autoplay = $this->settings['lottie_autoplay'] ?? true;
$lottie_speed = $this->settings['lottie_speed'] ?? 1;
if ($lottie_enabled && $lottie_position === 'background'):
?>
>
settings['video_bg_enabled']) && !empty($this->settings['video_bg_url']);
$lottie_bg_active = $lottie_enabled && $lottie_position === 'background';
if ($video_bg_enabled && !$lottie_bg_active):
$video_url = $this->settings['video_bg_url'];
$video_opacity = intval($this->settings['video_bg_opacity'] ?? 30);
$video_muted = $this->settings['video_bg_muted'] ?? true;
$video_id = '';
$video_type = '';
if (preg_match('/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/', $video_url, $matches)) {
$video_id = $matches[1];
$video_type = 'youtube';
}
elseif (preg_match('/(?:vimeo\.com\/)(\d+)/', $video_url, $matches)) {
$video_id = $matches[1];
$video_type = 'vimeo';
}
if ($video_id):
?>
VIDEO
>
settings['logo_url'])): ?>
settings['title']); ?>
settings['subtitle'] ) ) : ?>
settings['subtitle']); ?>
>
>
settings['message'])); ?>
settings['countdown_enabled']);
$countdown_date = $this->settings['countdown_date'] ?? '';
// End of the countdown in the site's time zone; 0 when the stored date
// or time cannot be read (malformed import, edited database): no
// countdown is shown instead of a fatal error halfway through the page.
$target_timestamp = MGENIUS_Main::countdown_target_timestamp($this->settings);
if ($countdown_enabled && !empty($countdown_date) && $target_timestamp > 0):
$countdown_title = $this->settings['countdown_title'] ?? __('Launching in', '1001web-maintenance-launch-pages');
// v2.9.174 — the default « Launching in » suits a launch, not a
// maintenance: in Maintenance mode it reads « Back in ».
if ('coming_soon' !== ($this->settings['page_mode'] ?? 'maintenance') && __('Launching in', '1001web-maintenance-launch-pages') === $countdown_title) {
$countdown_title = __('Back in', '1001web-maintenance-launch-pages');
}
$countdown_end_text = $this->settings['countdown_end_text'] ?? __('The site is now online!', '1001web-maintenance-launch-pages');
$countdown_style = $this->settings['countdown_style'] ?? 'boxes';
$show_days = $this->settings['countdown_show_days'] ?? true;
$show_hours = $this->settings['countdown_show_hours'] ?? true;
$show_minutes = $this->settings['countdown_show_minutes'] ?? true;
$show_seconds = $this->settings['countdown_show_seconds'] ?? true;
$now_timestamp = time();
$diff = $target_timestamp - $now_timestamp;
$auto_disable = !empty($this->settings['countdown_auto_disable']);
?>
settings['notification_enabled']);
if ($mgenius_any_button) :
?>
settings['notification_enabled']);
if ($notification_enabled):
?>
📧 settings['notification_button_text'] ?? __('Notify me', '1001web-maintenance-launch-pages')); ?>
>
settings['notification_enabled'])): ?>
admin_url( 'admin-ajax.php' ),
'i18n' => array(
'send' => __( 'Send', '1001web-maintenance-launch-pages' ),
'enter' => __( 'Enter', '1001web-maintenance-launch-pages' ),
'verifying' => __( 'Verifying...', '1001web-maintenance-launch-pages' ),
'error' => __( 'Server error. Please try again.', '1001web-maintenance-launch-pages' ),
'connectionError' => __( 'Connection error', '1001web-maintenance-launch-pages' ),
'turnstileRequired' => __( 'Please complete the security verification', '1001web-maintenance-launch-pages' ),
'closePanel' => __( 'Close contact panel', '1001web-maintenance-launch-pages' ),
'openPanel' => __( 'Open contact panel', '1001web-maintenance-launch-pages' ),
'redirectingHtml' => esc_html__( 'Redirecting...', '1001web-maintenance-launch-pages' ),
'showPassword' => __( 'Show password', '1001web-maintenance-launch-pages' ),
'hidePassword' => __( 'Hide password', '1001web-maintenance-launch-pages' ),
),
) ) . ';',
'before'
);
wp_print_scripts( 'mgenius-mm-core' );
?>
settings['parallax_enabled']);
if ($parallax_enabled):
$parallax_intensity = intval($this->settings['parallax_intensity'] ?? 50);
?>
$parallax_intensity ) ) . ';', 'before' );
wp_print_scripts( 'mgenius-mm-extra' );
?>
settings['stats_enabled']);
if ($stats_enabled):
?>
settings['show_powered_by'] ) ) :
?>
1001Web™'
);
?>
generee par WordPress.
* @param string $handle Handle du script.
* @return string
*/
public static function dotlottie_module_tag( $tag, $handle ) {
if ( 'mgenius-dotlottie' !== $handle ) {
return $tag;
}
return str_replace( '