PluginProbe ʕ •ᴥ•ʔ
ECS – Ele Custom Skin for Elementor / 4.3.9
ECS – Ele Custom Skin for Elementor v4.3.9
4.3.11 4.3.10 4.3.9 4.3.8 4.3.7 4.3.6 4.3.5 4.3.4 4.3.3 4.3.2 4.3.1 4.3.0 4.2.0 4.1.11 4.1.10 4.1.9 4.1.8 4.1.6 4.1.7 4.1.5 4.1.4 4.1.1 4.1.2 trunk 1.0.0 1.0.1 1.0.9 1.1.3 1.1.4 1.1.5 1.2.0 1.2.1 1.2.4 1.2.5 1.3.10 1.3.11 1.3.3 1.3.4 1.3.6 1.3.7 1.3.9 1.4.0 2.0.2 2.1.0 2.2.0 2.2.1 2.2.2 3.0.0 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 4.1.0
ele-custom-skin / modules / container-layout / assets / css / ecs-container-layout.css
ele-custom-skin / modules / container-layout / assets / css Last commit date
ecs-container-layout.css 4 months ago
ecs-container-layout.css
543 lines
1 /* ============================================================
2 ECS Container Layout Module
3 ============================================================ */
4
5 /* ── Fix --display for ECS modes ─────────────────────────── */
6 /*
7 * ecs_container_type responsive control uses prefix_class 'e-ecs%s-'.
8 * Desktop: e-ecs-slider, e-ecs-custom, e-ecs-flex, e-ecs-grid
9 * Tablet: e-ecs-tablet-flex, e-ecs-tablet-grid, etc.
10 * Mobile: e-ecs-mobile-flex, e-ecs-mobile-grid, etc.
11 *
12 * Elementor's --display CSS var must be overridden for ECS modes.
13 * Two-class specificity (0-0-2-0) beats Elementor's single-class rule.
14 */
15 .e-con.e-ecs-slider,
16 .e-con.e-ecs-custom {
17 --display: flex;
18 }
19
20 /* Desktop flex/grid classes from our responsive control */
21 /* :not() prevents overriding Elementor's elementor-hidden-* display:none rules */
22 .e-con.e-ecs-flex:not([class*="elementor-hidden-"]) {
23 --display: flex;
24 display: flex;
25 }
26 .e-con.e-ecs-grid:not([class*="elementor-hidden-"]) {
27 --display: grid;
28 display: grid;
29 }
30
31 /* ── Slider mode (Swiper) ─────────────────────────────────── */
32
33 /*
34 * Prevents the outer container from wrapping slides horizontally.
35 * On editor (before JS runs), overflow-x:auto gives a scrollable preview.
36 * On live, .ecs-swiper clips slides with overflow:hidden — the container
37 * itself stays visible so absolutely-positioned arrows/dots are not clipped.
38 */
39 .e-con.e-ecs-slider {
40 overflow: visible;
41 flex-wrap: nowrap !important;
42 }
43
44 /* Editor: children still inside .e-con-inner before JS moves them */
45 .e-con.e-ecs-slider > .e-con-inner {
46 overflow-x: auto;
47 flex-wrap: nowrap !important;
48 }
49
50 /*
51 * Editor: real children are moved into swiper slides. Hide the now-empty
52 * .e-con-inner (Boxed containers) so it doesn't occupy space or show
53 * Elementor's "drag widget here" placeholder.
54 * Full Width containers have no .e-con-inner — no rule needed.
55 */
56 .ecs-editor-slider-active > .e-con-inner {
57 display: none !important;
58 }
59
60 .ecs-swiper {
61 width: 100%;
62 overflow: hidden;
63 position: relative;
64 }
65
66 /* ── Custom Layout mode ───────────────────────────────────── */
67
68 .e-con.e-ecs-custom > .e-con-inner {
69 display: contents;
70 }
71
72 /*
73 * Live mode: wrapper emitted by after_container_render() around all cycling
74 * template instances. flex-direction is set inline from the ecs_direction
75 * control; width:100% + flex-wrap:wrap ensure correct block behaviour.
76 */
77 .ecs-custom-layout-wrap {
78 width: 100%;
79 flex-wrap: wrap;
80 }
81
82 /* ── Dual-render show/hide ────────────────────────────────────
83 * When responsive overrides exist, PHP emits two versions:
84 * .ecs-custom-version — desktop: template with children in slots
85 * .ecs-responsive-version — tablet/mobile: children as grid or slider
86 * CSS shows one at a time based on active breakpoint.
87 * ──────────────────────────────────────────────────────────── */
88
89 .ecs-custom-version,
90 .ecs-responsive-version {
91 width: 100%;
92 }
93
94 /* Desktop: show template version, hide responsive */
95 .ecs-responsive-version {
96 display: none;
97 }
98
99 /* Tablet: swap when any tablet override is active (768px–1024px only) */
100 @media (min-width: 768px) and (max-width: 1024px) {
101 .e-con.e-ecs-custom.e-ecs-tablet-flex > .ecs-custom-version,
102 .e-con.e-ecs-custom.e-ecs-tablet-grid > .ecs-custom-version,
103 .e-con.e-ecs-custom.e-ecs-tablet-slider > .ecs-custom-version {
104 display: none;
105 }
106 .e-con.e-ecs-custom.e-ecs-tablet-flex > .ecs-responsive-version,
107 .e-con.e-ecs-custom.e-ecs-tablet-grid > .ecs-responsive-version,
108 .e-con.e-ecs-custom.e-ecs-tablet-slider > .ecs-responsive-version {
109 display: block;
110 }
111
112 /* tablet=grid: CSS grid on the swiper-wrapper */
113 .e-con.e-ecs-custom.e-ecs-tablet-grid > .ecs-responsive-version > .ecs-swiper > .swiper-wrapper {
114 display: grid !important;
115 grid-template-columns: repeat(2, 1fr) !important;
116 transform: none !important;
117 transition: none !important;
118 width: 100%;
119 }
120 .e-con.e-ecs-custom.e-ecs-tablet-grid > .ecs-responsive-version > .ecs-swiper > .swiper-slide {
121 width: auto !important;
122 height: auto !important;
123 margin-right: 0 !important;
124 }
125 .e-con.e-ecs-custom.e-ecs-tablet-grid > .ecs-responsive-version > .ecs-swiper > .elementor-swiper-button,
126 .e-con.e-ecs-custom.e-ecs-tablet-grid > .ecs-responsive-version > .ecs-swiper > .swiper-pagination {
127 display: none !important;
128 }
129
130 /* tablet=flex with .ecs-resp-children (tablet=flex, no mobile slider) */
131 .e-con.e-ecs-custom.e-ecs-tablet-flex > .ecs-responsive-version > .ecs-resp-children {
132 display: flex;
133 flex-direction: column;
134 }
135 .e-con.e-ecs-custom.e-ecs-tablet-flex > .ecs-responsive-version > .ecs-resp-children > * {
136 width: 100% !important;
137 }
138
139 /* tablet=flex when responsive-version contains a swiper (mobile=slider) — reset slides to flex column */
140 .e-con.e-ecs-custom.e-ecs-tablet-flex > .ecs-responsive-version > .ecs-swiper {
141 overflow: visible;
142 }
143 .e-con.e-ecs-custom.e-ecs-tablet-flex > .ecs-responsive-version > .ecs-swiper > .swiper-wrapper {
144 flex-wrap: wrap;
145 transform: none !important;
146 transition: none !important;
147 width: 100%;
148 }
149 .e-con.e-ecs-custom.e-ecs-tablet-flex > .ecs-responsive-version > .ecs-swiper > .swiper-wrapper > .swiper-slide {
150 width: 100% !important;
151 height: auto !important;
152 margin-right: 0 !important;
153 }
154 .e-con.e-ecs-custom.e-ecs-tablet-flex > .ecs-responsive-version > .ecs-swiper > .elementor-swiper-button,
155 .e-con.e-ecs-custom.e-ecs-tablet-flex > .ecs-responsive-version > .ecs-swiper > .swiper-pagination {
156 display: none !important;
157 }
158 }
159
160 /* Tablet show/hide also at mobile when no mobile override (fallback) */
161 @media (max-width: 767px) {
162 .e-con.e-ecs-custom.e-ecs-tablet-flex:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-slider) > .ecs-custom-version,
163 .e-con.e-ecs-custom.e-ecs-tablet-grid:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-slider) > .ecs-custom-version,
164 .e-con.e-ecs-custom.e-ecs-tablet-slider:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-slider) > .ecs-custom-version {
165 display: none;
166 }
167 .e-con.e-ecs-custom.e-ecs-tablet-flex:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-slider) > .ecs-responsive-version,
168 .e-con.e-ecs-custom.e-ecs-tablet-grid:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-slider) > .ecs-responsive-version,
169 .e-con.e-ecs-custom.e-ecs-tablet-slider:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-slider) > .ecs-responsive-version {
170 display: block;
171 }
172 }
173
174 /* Mobile: swap when any mobile override is active */
175 @media (max-width: 767px) {
176 .e-con.e-ecs-custom.e-ecs-mobile-flex > .ecs-custom-version,
177 .e-con.e-ecs-custom.e-ecs-mobile-grid > .ecs-custom-version,
178 .e-con.e-ecs-custom.e-ecs-mobile-slider > .ecs-custom-version {
179 display: none;
180 }
181 .e-con.e-ecs-custom.e-ecs-mobile-flex > .ecs-responsive-version,
182 .e-con.e-ecs-custom.e-ecs-mobile-grid > .ecs-responsive-version,
183 .e-con.e-ecs-custom.e-ecs-mobile-slider > .ecs-responsive-version {
184 display: block;
185 }
186
187 /* mobile=grid */
188 .e-con.e-ecs-custom.e-ecs-mobile-grid > .ecs-responsive-version > .ecs-swiper > .swiper-wrapper {
189 display: grid !important;
190 grid-template-columns: repeat(2, 1fr) !important;
191 transform: none !important;
192 transition: none !important;
193 width: 100%;
194 }
195 .e-con.e-ecs-custom.e-ecs-mobile-grid > .ecs-responsive-version > .ecs-swiper > .elementor-swiper-button,
196 .e-con.e-ecs-custom.e-ecs-mobile-grid > .ecs-responsive-version > .ecs-swiper > .swiper-pagination {
197 display: none !important;
198 }
199
200 /* mobile=flex with .ecs-resp-children */
201 .e-con.e-ecs-custom.e-ecs-mobile-flex > .ecs-responsive-version > .ecs-resp-children {
202 display: flex;
203 flex-direction: column;
204 }
205 .e-con.e-ecs-custom.e-ecs-mobile-flex > .ecs-responsive-version > .ecs-resp-children > * {
206 width: 100% !important;
207 }
208
209 /* mobile=flex when responsive-version contains a swiper (tablet=slider) — reset slides to flex column */
210 .e-con.e-ecs-custom.e-ecs-mobile-flex > .ecs-responsive-version > .ecs-swiper {
211 overflow: visible;
212 }
213 .e-con.e-ecs-custom.e-ecs-mobile-flex > .ecs-responsive-version > .ecs-swiper > .swiper-wrapper {
214 flex-wrap: wrap;
215 transform: none !important;
216 transition: none !important;
217 width: 100%;
218 }
219 .e-con.e-ecs-custom.e-ecs-mobile-flex > .ecs-responsive-version > .ecs-swiper > .swiper-wrapper > .swiper-slide {
220 width: 100% !important;
221 height: auto !important;
222 margin-right: 0 !important;
223 }
224 .e-con.e-ecs-custom.e-ecs-mobile-flex > .ecs-responsive-version > .ecs-swiper > .elementor-swiper-button,
225 .e-con.e-ecs-custom.e-ecs-mobile-flex > .ecs-responsive-version > .ecs-swiper > .swiper-pagination {
226 display: none !important;
227 }
228 }
229
230 /* ── Desktop=flex/grid with tablet/mobile responsive overrides ───────────────
231 * PHP emits .ecs-responsive-version (tablet+mobile share same type),
232 * .ecs-tablet-version (tablet-only), or .ecs-mobile-version (mobile-only).
233 * .ecs-desktop-inner wraps Full Width container children (no .e-con-inner).
234 * ──────────────────────────────────────────────────────────────────────────── */
235
236 .ecs-tablet-version,
237 .ecs-mobile-version,
238 .ecs-desktop-inner { width: 100%; }
239
240 .ecs-tablet-version,
241 .ecs-mobile-version { display: none; }
242
243 /* Tablet (768–1024px): hide desktop content, show tablet/shared responsive version */
244 @media (min-width: 768px) and (max-width: 1024px) {
245 .e-con.e-ecs-flex.e-ecs-tablet-custom > .e-con-inner,
246 .e-con.e-ecs-flex.e-ecs-tablet-custom > .ecs-desktop-inner,
247 .e-con.e-ecs-flex.e-ecs-tablet-slider > .e-con-inner,
248 .e-con.e-ecs-flex.e-ecs-tablet-slider > .ecs-desktop-inner,
249 .e-con.e-ecs-grid.e-ecs-tablet-custom > .e-con-inner,
250 .e-con.e-ecs-grid.e-ecs-tablet-custom > .ecs-desktop-inner,
251 .e-con.e-ecs-grid.e-ecs-tablet-slider > .e-con-inner,
252 .e-con.e-ecs-grid.e-ecs-tablet-slider > .ecs-desktop-inner { display: none !important; }
253
254 .e-con.e-ecs-flex.e-ecs-tablet-custom > .ecs-responsive-version,
255 .e-con.e-ecs-flex.e-ecs-tablet-slider > .ecs-responsive-version,
256 .e-con.e-ecs-grid.e-ecs-tablet-custom > .ecs-responsive-version,
257 .e-con.e-ecs-grid.e-ecs-tablet-slider > .ecs-responsive-version,
258 .e-con.e-ecs-flex.e-ecs-tablet-custom > .ecs-tablet-version,
259 .e-con.e-ecs-flex.e-ecs-tablet-slider > .ecs-tablet-version,
260 .e-con.e-ecs-grid.e-ecs-tablet-custom > .ecs-tablet-version,
261 .e-con.e-ecs-grid.e-ecs-tablet-slider > .ecs-tablet-version { display: block; }
262 }
263
264 /* Mobile (<768px): hide desktop content, show mobile/shared responsive version */
265 @media (max-width: 767px) {
266 /* Explicit mobile override */
267 .e-con.e-ecs-flex.e-ecs-mobile-custom > .e-con-inner,
268 .e-con.e-ecs-flex.e-ecs-mobile-custom > .ecs-desktop-inner,
269 .e-con.e-ecs-flex.e-ecs-mobile-slider > .e-con-inner,
270 .e-con.e-ecs-flex.e-ecs-mobile-slider > .ecs-desktop-inner,
271 .e-con.e-ecs-grid.e-ecs-mobile-custom > .e-con-inner,
272 .e-con.e-ecs-grid.e-ecs-mobile-custom > .ecs-desktop-inner,
273 .e-con.e-ecs-grid.e-ecs-mobile-slider > .e-con-inner,
274 .e-con.e-ecs-grid.e-ecs-mobile-slider > .ecs-desktop-inner { display: none !important; }
275
276 .e-con.e-ecs-flex.e-ecs-mobile-custom > .ecs-mobile-version,
277 .e-con.e-ecs-flex.e-ecs-mobile-slider > .ecs-mobile-version,
278 .e-con.e-ecs-grid.e-ecs-mobile-custom > .ecs-mobile-version,
279 .e-con.e-ecs-grid.e-ecs-mobile-slider > .ecs-mobile-version { display: block; }
280
281 /* Tablet has override, mobile inherits → show shared responsive version */
282 .e-con.e-ecs-flex.e-ecs-tablet-custom:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .e-con-inner,
283 .e-con.e-ecs-flex.e-ecs-tablet-custom:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .ecs-desktop-inner,
284 .e-con.e-ecs-flex.e-ecs-tablet-slider:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .e-con-inner,
285 .e-con.e-ecs-flex.e-ecs-tablet-slider:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .ecs-desktop-inner,
286 .e-con.e-ecs-grid.e-ecs-tablet-custom:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .e-con-inner,
287 .e-con.e-ecs-grid.e-ecs-tablet-custom:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .ecs-desktop-inner,
288 .e-con.e-ecs-grid.e-ecs-tablet-slider:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .e-con-inner,
289 .e-con.e-ecs-grid.e-ecs-tablet-slider:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .ecs-desktop-inner { display: none !important; }
290
291 .e-con.e-ecs-flex.e-ecs-tablet-custom:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .ecs-responsive-version,
292 .e-con.e-ecs-flex.e-ecs-tablet-slider:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .ecs-responsive-version,
293 .e-con.e-ecs-grid.e-ecs-tablet-custom:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .ecs-responsive-version,
294 .e-con.e-ecs-grid.e-ecs-tablet-slider:not(.e-ecs-mobile-flex):not(.e-ecs-mobile-grid):not(.e-ecs-mobile-custom):not(.e-ecs-mobile-slider) > .ecs-responsive-version { display: block; }
295 }
296
297 /* ── Missing placeholder fallback ────────────────────────── */
298
299 .ecs-missing-placeholder {
300 outline: 2px dashed #d63638;
301 }
302
303 .ecs-missing-placeholder::after {
304 content: 'ECS: missing placeholder';
305 display: block;
306 background: #d63638;
307 color: #fff;
308 font-size: 11px;
309 padding: 2px 6px;
310 text-align: center;
311 }
312
313 /* ── Editor: Placeholder hint ────────────────────────────── */
314
315 .ecs-placeholder-editor-hint {
316 min-height: 60px;
317 display: flex;
318 align-items: center;
319 justify-content: center;
320 }
321
322 /* ── Hide empty slot containers ──────────────────────────── */
323 /*
324 * .e-ecs-hide-empty-slots appears in two contexts:
325 * - Editor: on the .e-con container itself (Elementor applies prefix_class)
326 * - Live: on a display:contents wrapper div emitted by after_container_render
327 * Both cases work with this selector (no .e-con requirement on the ancestor).
328 */
329
330 /* Boxed mode: slot container wraps e-con-inner > widget */
331 .e-ecs-hide-empty-slots .e-con:has(
332 > .e-con-inner
333 > .elementor-widget-ecs_container_placeholder
334 > .elementor-widget-container
335 > .ecs-slot-empty
336 ) {
337 display: none;
338 }
339
340 /* Full Width mode: slot container wraps widget directly */
341 .e-ecs-hide-empty-slots .e-con:has(
342 > .elementor-widget-ecs_container_placeholder
343 > .elementor-widget-container
344 > .ecs-slot-empty
345 ) {
346 display: none;
347 }
348
349 /* ── Editor: override container display when JS slider is active ─────────── */
350 /*
351 * Desktop grid/flex classes (e.g. e-ecs-grid) apply display:grid globally.
352 * When the editor JS builds a slider for a non-desktop breakpoint, the container
353 * must be flex so the swiper renders correctly rather than as a grid item.
354 * ecs-editor-slider-active is only added by ecs-slider.js in edit mode.
355 */
356 .e-con.ecs-editor-slider-active {
357 display: flex !important;
358 }
359
360 /* ── Editor: AJAX preview injection ──────────────────────── */
361
362 /*
363 * The injected template structure sits inside .e-con-inner alongside the
364 * live child elements that have been moved into its slots.
365 * width: 100% + min-width: 0 ensure it fills a flex parent correctly.
366 */
367 .ecs-injected-structure {
368 width: 100%;
369 min-width: 0;
370 }
371
372 /* ── Responsive Layout Override ──────────────────────────── */
373 /*
374 * When ecs_layout_tablet / ecs_layout_mobile is set to 'flex' or 'grid',
375 * the container gets e-ecs-tablet-{value} / e-ecs-mobile-{value} classes.
376 * Swiper has enabled:false at those breakpoints via JS breakpoints config.
377 * CSS resets the Swiper wrapper so slides behave as normal block elements.
378 */
379
380 /* ── Tablet overrides (≤1024px) ──────────────────────────── */
381
382 @media (max-width: 1024px) {
383
384 /* Flexbox/Grid → Slider on tablet (desktop is NOT slider) */
385 .e-con.e-ecs-tablet-slider {
386 overflow-x: auto;
387 flex-wrap: nowrap !important;
388 }
389 .e-con.e-ecs-tablet-slider > .e-con-inner {
390 flex-wrap: nowrap !important;
391 }
392
393 /* Slider → Flexbox on tablet */
394 .e-con.e-ecs-slider.e-ecs-tablet-flex {
395 overflow: visible;
396 }
397 .e-con.e-ecs-slider.e-ecs-tablet-flex > .ecs-swiper {
398 overflow: visible;
399 }
400 .e-con.e-ecs-slider.e-ecs-tablet-flex > .ecs-swiper > .swiper-wrapper {
401 flex-wrap: wrap;
402 transform: none !important;
403 transition: none !important;
404 width: 100%;
405 }
406 .e-con.e-ecs-slider.e-ecs-tablet-flex > .ecs-swiper > .swiper-wrapper > .swiper-slide {
407 width: 100% !important;
408 height: auto !important;
409 margin-right: 0 !important;
410 }
411 .e-con.e-ecs-tablet-flex:not(.ecs-editor-slider-active) > .ecs-swiper > .elementor-swiper-button,
412 .e-con.e-ecs-tablet-flex:not(.ecs-editor-slider-active) > .ecs-swiper > .swiper-pagination {
413 display: none !important;
414 }
415
416 /* Slider → Grid on tablet */
417 .e-con.e-ecs-slider.e-ecs-tablet-grid > .ecs-swiper {
418 overflow: visible;
419 }
420 .e-con.e-ecs-slider.e-ecs-tablet-grid > .ecs-swiper > .swiper-wrapper {
421 display: grid !important;
422 grid-template-columns: repeat(var(--ecs-slider-columns, 2), 1fr) !important;
423 transform: none !important;
424 transition: none !important;
425 width: 100%;
426 }
427 .e-con.e-ecs-slider.e-ecs-tablet-grid > .ecs-swiper > .swiper-wrapper > .swiper-slide {
428 width: auto !important;
429 height: auto !important;
430 margin-right: 0 !important;
431 }
432 .e-con.e-ecs-tablet-grid:not(.ecs-editor-slider-active) > .ecs-swiper > .elementor-swiper-button,
433 .e-con.e-ecs-tablet-grid:not(.ecs-editor-slider-active) > .ecs-swiper > .swiper-pagination {
434 display: none !important;
435 }
436
437 /* Custom Layout → Flexbox on tablet */
438 .e-con.e-ecs-custom.e-ecs-tablet-flex .ecs-injected-structure {
439 display: flex !important;
440 flex-direction: column !important;
441 width: 100%;
442 }
443 .e-con.e-ecs-custom.e-ecs-tablet-flex .ecs-injected-structure > * {
444 width: 100% !important;
445 position: static !important;
446 grid-area: unset !important;
447 }
448
449 /* Custom Layout → Grid on tablet */
450 .e-con.e-ecs-custom.e-ecs-tablet-grid .ecs-injected-structure {
451 display: grid !important;
452 grid-template-columns: repeat(2, 1fr) !important;
453 width: 100%;
454 }
455 .e-con.e-ecs-custom.e-ecs-tablet-grid .ecs-injected-structure > * {
456 width: 100% !important;
457 position: static !important;
458 grid-area: unset !important;
459 }
460 }
461
462 /* ── Mobile overrides (≤767px) ───────────────────────────── */
463
464 @media (max-width: 767px) {
465
466 /* Flexbox/Grid → Slider on mobile (desktop is NOT slider) */
467 .e-con.e-ecs-mobile-slider {
468 overflow-x: auto;
469 flex-wrap: nowrap !important;
470 }
471 .e-con.e-ecs-mobile-slider > .e-con-inner {
472 flex-wrap: nowrap !important;
473 }
474
475 /* Slider → Flexbox on mobile */
476 .e-con.e-ecs-slider.e-ecs-mobile-flex {
477 overflow: visible;
478 }
479 .e-con.e-ecs-slider.e-ecs-mobile-flex > .ecs-swiper {
480 overflow: visible;
481 }
482 .e-con.e-ecs-slider.e-ecs-mobile-flex > .ecs-swiper > .swiper-wrapper {
483 flex-wrap: wrap;
484 transform: none !important;
485 transition: none !important;
486 width: 100%;
487 }
488 .e-con.e-ecs-slider.e-ecs-mobile-flex > .ecs-swiper > .swiper-wrapper > .swiper-slide {
489 width: 100% !important;
490 height: auto !important;
491 margin-right: 0 !important;
492 }
493 .e-con.e-ecs-mobile-flex:not(.ecs-editor-slider-active) > .ecs-swiper > .elementor-swiper-button,
494 .e-con.e-ecs-mobile-flex:not(.ecs-editor-slider-active) > .ecs-swiper > .swiper-pagination {
495 display: none !important;
496 }
497
498 /* Slider → Grid on mobile */
499 .e-con.e-ecs-slider.e-ecs-mobile-grid > .ecs-swiper {
500 overflow: visible;
501 }
502 .e-con.e-ecs-slider.e-ecs-mobile-grid > .ecs-swiper > .swiper-wrapper {
503 display: grid !important;
504 grid-template-columns: repeat(var(--ecs-slider-columns, 2), 1fr) !important;
505 transform: none !important;
506 transition: none !important;
507 width: 100%;
508 }
509 .e-con.e-ecs-slider.e-ecs-mobile-grid > .ecs-swiper > .swiper-wrapper > .swiper-slide {
510 width: auto !important;
511 height: auto !important;
512 margin-right: 0 !important;
513 }
514 .e-con.e-ecs-mobile-grid:not(.ecs-editor-slider-active) > .ecs-swiper > .elementor-swiper-button,
515 .e-con.e-ecs-mobile-grid:not(.ecs-editor-slider-active) > .ecs-swiper > .swiper-pagination {
516 display: none !important;
517 }
518
519 /* Custom Layout → Flexbox on mobile */
520 .e-con.e-ecs-custom.e-ecs-mobile-flex .ecs-injected-structure {
521 display: flex !important;
522 flex-direction: column !important;
523 width: 100%;
524 }
525 .e-con.e-ecs-custom.e-ecs-mobile-flex .ecs-injected-structure > * {
526 width: 100% !important;
527 position: static !important;
528 grid-area: unset !important;
529 }
530
531 /* Custom Layout → Grid on mobile */
532 .e-con.e-ecs-custom.e-ecs-mobile-grid .ecs-injected-structure {
533 display: grid !important;
534 grid-template-columns: repeat(2, 1fr) !important;
535 width: 100%;
536 }
537 .e-con.e-ecs-custom.e-ecs-mobile-grid .ecs-injected-structure > * {
538 width: 100% !important;
539 position: static !important;
540 grid-area: unset !important;
541 }
542 }
543