PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Form / Util / Styles.php
mailpoet / lib / Form / Util Last commit date
CustomFonts.php 3 years ago Export.php 2 months ago FieldNameObfuscator.php 3 years ago Styles.php 3 years ago index.php 3 years ago
Styles.php
257 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Form\Util;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Entities\FormEntity;
9 use MailPoetVendor\Sabberworm\CSS\Parser as CSSParser;
10
11 class Styles {
12 public function prefixStyles($stylesheet, $prefix = '') {
13 if (!$stylesheet) return;
14 $styles = new CSSParser($stylesheet);
15 $styles = $styles->parse();
16 $formattedStyles = [];
17 foreach ($styles->getAllDeclarationBlocks() as $styleDeclaration) {
18 $selectors = array_map(function($selector) use ($prefix) {
19 $stringSelector = is_string($selector) ? $selector : $selector->__toString();
20 return sprintf('%s %s', $prefix, $stringSelector);
21 }, $styleDeclaration->getSelectors());
22 $selectors = implode(', ', $selectors);
23 $rules = array_map(function($rule) {
24 return $rule->__toString();
25 }, $styleDeclaration->getRules());
26 $rules = sprintf('{ %s }', implode(' ', $rules));
27 $formattedStyles[] = sprintf('%s %s', $selectors, $rules);
28 }
29 return implode(PHP_EOL, $formattedStyles);
30 }
31
32 public function renderFormSettingsStyles(FormEntity $form, string $selector, string $displayType): string {
33 if (!is_array($form->getSettings())) return '';
34 $formSettings = $form->getSettings();
35 // Wrapper styles
36 $styles = [];
37
38 if (isset($formSettings['border_size']) && isset($formSettings['border_color'])) {
39 $styles[] = 'border: ' . $formSettings['border_size'] . 'px solid ' . $formSettings['border_color'];
40 }
41
42 if (isset($formSettings['border_radius'])) {
43 $styles[] = 'border-radius: ' . $formSettings['border_radius'] . 'px';
44 }
45
46 $backgrounds = [];
47 $mobileBackgrounds = [];
48 if (isset($formSettings['background_image_url']) && $formSettings['background_image_url']) {
49 $backgroundPosition = 'center';
50 $backgroundRepeat = 'no-repeat';
51 $backgroundSize = 'cover';
52 if (isset($formSettings['background_image_display']) && $formSettings['background_image_display'] === 'fit') {
53 $backgroundPosition = 'center top';
54 $backgroundSize = 'contain';
55 }
56 if (isset($formSettings['background_image_display']) && $formSettings['background_image_display'] === 'tile') {
57 $backgroundRepeat = 'repeat';
58 $backgroundSize = 'auto';
59 }
60 $backgrounds[] = "url(" . trim($formSettings['background_image_url']) . ") $backgroundPosition / $backgroundSize $backgroundRepeat";
61 }
62
63 if (!empty($formSettings['gradient'])) {
64 $backgrounds[] = trim($formSettings['gradient']);
65 $mobileBackgrounds[] = trim($formSettings['gradient']);
66 }
67
68 if (!empty($formSettings['backgroundColor'])) {
69 $backgrounds[] = trim($formSettings['backgroundColor']);
70 $mobileBackgrounds[] = trim($formSettings['backgroundColor']);
71 }
72
73 if ($backgrounds) {
74 $styles[] = 'background: ' . join(', ', $backgrounds);
75 }
76
77 if (isset($formSettings['fontColor'])) {
78 $styles[] = 'color: ' . trim($formSettings['fontColor']);
79 }
80
81 if (isset($formSettings['alignment'])) {
82 $styles[] = 'text-align: ' . $formSettings['alignment'];
83 }
84 $formWrapperStyles = $selector . '{' . join(';', $styles) . ';}';
85
86 // Media styles for mobile
87 $media = $this->getMobileStyles($selector, $displayType, $mobileBackgrounds);
88
89 // Form element styles
90 $formStyles = [];
91 if (isset($formSettings['form_padding'])) {
92 if (
93 in_array(
94 $displayType,
95 [FormEntity::DISPLAY_TYPE_POPUP, FormEntity::DISPLAY_TYPE_FIXED_BAR, FormEntity::DISPLAY_TYPE_SLIDE_IN]
96 )
97 ) {
98 $padding = $formSettings['form_padding'];
99 $media .= " @media (min-width: 500px) {{$selector} {padding: {$padding}px;}} ";
100 } else {
101 $formStyles[] = 'padding: ' . $formSettings['form_padding'] . 'px';
102 }
103 }
104 $formElementStyles = '';
105 if ($formStyles) {
106 $formElementStyles = $selector . ' form.mailpoet_form {' . join(';', $formStyles) . ';}';
107 }
108
109 // Width styles
110 $widthStyles = $this->renderWidthStyles($formSettings, $selector, $displayType);
111
112 $typeSpecificStyles = $this->getFormTypeSpecificStyles($selector, $displayType);
113
114 $messagesStyles = $this->renderFormMessageStyles($form, $selector);
115
116 $additionalStyles = $selector . ' .mailpoet_paragraph.last {margin-bottom: 0} ';
117 $media .= " @media (min-width: 500px) {{$selector} .last .mailpoet_paragraph:last-child {margin-bottom: 0}} ";
118 $media .= " @media (max-width: 500px) {{$selector} .mailpoet_form_column:last-child .mailpoet_paragraph:last-child {margin-bottom: 0}} ";
119
120 return $formWrapperStyles
121 . $formElementStyles
122 . $widthStyles
123 . $messagesStyles
124 . $typeSpecificStyles
125 . $additionalStyles
126 . $media;
127 }
128
129 private function renderWidthStyles(array $formSettings, string $selector, string $displayType): string {
130 $styles = [];
131
132 if (isset($formSettings['form_placement'][$displayType]['styles']['width'])) {
133 $width = $this->getWidthValue($formSettings['form_placement'][$displayType]['styles']['width']);
134 }
135
136 if ($displayType === FormEntity::DISPLAY_TYPE_POPUP) {
137 if (isset($width)) {
138 $styles[] = "width: $width";
139 $styles[] = "max-width: 100vw";
140 } else { // BC compatibilty
141 $styles[] = 'width: 560px';
142 $styles[] = 'max-width: 560px';
143 }
144 } elseif ($displayType === FormEntity::DISPLAY_TYPE_SLIDE_IN) {
145 if (isset($width)) {
146 $styles[] = "width: $width";
147 $styles[] = "max-width: 100vw";
148 } else { // BC compatibilty
149 $styles[] = 'max-width: 600px';
150 $styles[] = 'min-width: 350px';
151 }
152 } elseif ($displayType === FormEntity::DISPLAY_TYPE_FIXED_BAR) {
153 if (isset($width)) {
154 $styles[] = "width: $width";
155 $styles[] = "max-width: 100%";
156 } else { // BC compatibilty
157 $styles[] = 'max-width: 960px';
158 }
159 } elseif ($displayType === FormEntity::DISPLAY_TYPE_BELOW_POST) {
160 if (isset($width)) {
161 $styles[] = "width: $width";
162 }
163 } elseif ($displayType === FormEntity::DISPLAY_TYPE_OTHERS) {
164 if (isset($width)) {
165 $styles[] = "width: $width";
166 }
167 }
168
169 $widthSelector = $selector;
170 $widthSelector .= $displayType === FormEntity::DISPLAY_TYPE_FIXED_BAR ? ' form.mailpoet_form' : '';
171
172 if (!$styles) {
173 return '';
174 }
175 return $widthSelector . '{' . join(';', $styles) . ';}';
176 }
177
178 private function getWidthValue(array $width) {
179 return $width['value'] . ($width['unit'] === 'percent' ? '%' : 'px');
180 }
181
182 public function renderFormMessageStyles(FormEntity $form, string $selector): string {
183 $formSettings = $form->getSettings();
184 if (!is_array($formSettings)) {
185 return '';
186 }
187 return $this->renderMessagesStyles($formSettings, $selector);
188 }
189
190 private function renderMessagesStyles(array $formSettings, string $selector): string {
191 $styles = "$selector .mailpoet_message {margin: 0; padding: 0 20px;}";
192 if (isset($formSettings['success_validation_color']) && $formSettings['success_validation_color']) {
193 $success = $formSettings['success_validation_color'];
194 $styles .= "
195 $selector .mailpoet_validate_success {color: $success}
196 $selector input.parsley-success {color: $success}
197 $selector select.parsley-success {color: $success}
198 $selector textarea.parsley-success {color: $success}
199 ";
200 }
201 if (isset($formSettings['error_validation_color']) && $formSettings['error_validation_color']) {
202 $error = $formSettings['error_validation_color'];
203 $styles .= "
204 $selector .mailpoet_validate_error {color: $error}
205 $selector input.parsley-error {color: $error}
206 $selector select.parsley-error {color: $error}
207 $selector textarea.textarea.parsley-error {color: $error}
208 $selector .parsley-errors-list {color: $error}
209 $selector .parsley-required {color: $error}
210 $selector .parsley-custom-error-message {color: $error}
211 ";
212 }
213 return $styles;
214 }
215
216 private function getFormTypeSpecificStyles(string $selector, string $displayType): string {
217 $styles = [];
218 if ($displayType === FormEntity::DISPLAY_TYPE_SLIDE_IN) {
219 $styles[] = $selector . '.mailpoet_form_slide_in { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }';
220 $styles[] = $selector . '.mailpoet_form_position_right { border-top-right-radius: 0; }';
221 $styles[] = $selector . '.mailpoet_form_position_left { border-top-left-radius: 0; }';
222 }
223 return join('', $styles);
224 }
225
226 private function getMobileStyles(string $selector, string $displayType, array $mobileBackgrounds): string {
227 $wrapperStyles = [];
228 if ($mobileBackgrounds) {
229 $wrapperStyles[] = 'background: ' . join(', ', $mobileBackgrounds) . ';';
230 } else {
231 $wrapperStyles[] = 'background-image: none;';
232 }
233 if (
234 in_array(
235 $displayType,
236 [FormEntity::DISPLAY_TYPE_POPUP, FormEntity::DISPLAY_TYPE_FIXED_BAR, FormEntity::DISPLAY_TYPE_SLIDE_IN]
237 )
238 ) {
239 $wrapperStyles = array_merge($wrapperStyles, [
240 'animation: none;',
241 'border: none;',
242 'border-radius: 0;',
243 'bottom: 0;',
244 'left: 0;',
245 'max-height: 40%;',
246 'padding: 20px;',
247 'right: 0;',
248 'top: auto;',
249 'transform: none;',
250 'width: 100%;',
251 'min-width: 100%;',
252 ]);
253 }
254 return "@media (max-width: 500px) {{$selector} {" . join('', $wrapperStyles) . "}}";
255 }
256 }
257