PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / trunk
MailPoet – Newsletters, Email Marketing, and Automation vtrunk
5.37.0 5.36.1 5.36.0 5.35.1 5.35.0 5.34.3 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 1 month 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