PluginProbe ʕ •ᴥ•ʔ
EmbedPress – PDF Embedder, 3D PDF FlipBook, Google Reviews, YouTube Videos, Upload & Embed PDF documents / 4.6.0
EmbedPress – PDF Embedder, 3D PDF FlipBook, Google Reviews, YouTube Videos, Upload & Embed PDF documents v4.6.0
4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 trunk 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.5.0 1.6.0 1.6.1 1.6.2 1.6.3 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 2.0.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.2.0 2.2.1 2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.4.0 2.4.1 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.1.3 3.2.0 3.2.1 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 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.6.8 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 3.9.1 3.9.10 3.9.11 3.9.12 3.9.13 3.9.14 3.9.15 3.9.16 3.9.17 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9 4.0.0 4.0.1 4.0.10 4.0.11 4.0.12 4.0.13 4.0.14 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1.0 4.1.1 4.1.10 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.8 4.2.9 4.3.0 4.3.1 4.4.0 4.4.1 4.4.10 4.4.11 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 4.5.0 4.5.1
embedpress / assets / css / ep-gr-elementor-picker.css
embedpress / assets / css Last commit date
fonts 9 months ago vendor 9 months ago admin-notices.css 2 months ago admin.build.css 2 months ago admin.css 8 months ago analytics.build.css 2 months ago blocks.build.css 3 days ago carousel.min.css 2 years ago custom-player.build.css 2 months ago el-icon.css 3 months ago embedpress-elementor.css 2 years ago embedpress.css 3 days ago ep-gr-elementor-picker.css 3 days ago ep-pdf-lightbox.css 3 months ago feature-notices.css 8 months ago feature-preview-modal.css 3 days ago font.css 7 years ago glider.min.css 2 years ago google-reviews.build.css 3 days ago google-reviews.css 3 days ago index.html 7 years ago instagram-shortcode-generator.css 1 month ago lazy-load.css 6 months ago meetup-events.css 8 months ago modal.css 9 months ago onboarding.build.css 2 months ago pdf-gallery.css 3 months ago plyr.css 9 months ago preview.css 6 years ago settings-icons.css 9 months ago settings.css 3 days ago
ep-gr-elementor-picker.css
764 lines
1 /* EmbedPress Google Reviews — Elementor place picker control.
2 *
3 * Scoped on .ep-gr-picker (the wrapper inside our content_template), NOT
4 * on .elementor-control-<type> — Elementor names the wrapper after the
5 * control's NAME, not its TYPE, so .elementor-control-ep_gr_place_picker
6 * never exists in the DOM.
7 *
8 * All colors use Elementor's design tokens (var(--e-a-*)) with safe
9 * fallbacks so the control follows the editor's light/dark theme.
10 */
11
12 .ep-gr-picker {
13 /* NOTE on tokens: in Elementor's editor theme `--e-a-bg-secondary` and
14 `--e-a-color-txt` resolve to the SAME grey (#515962) — using one for a
15 card background and the other for its text renders invisible (dark-on-dark).
16 So the selected card uses the DEFAULT bg + the high-contrast ACCENT text
17 token for the name, and the muted token only for the secondary ID line. */
18 --gr-bg: var(--e-a-bg-default, #fff);
19 --gr-bg-alt: var(--e-a-bg-hover, #f1f3f5);
20 --gr-bg-hover: var(--e-a-bg-hover, #e6e9ec);
21 --gr-bd: var(--e-a-border-color, #d5dadf);
22 --gr-bd-focus: var(--e-a-color-primary, #5b4e96);
23 --gr-txt: var(--e-a-color-txt-accent, #1f2733);
24 --gr-txt-muted: var(--e-a-color-txt-muted, #6d7882);
25 --gr-error: var(--e-a-color-danger, #d63638);
26 --gr-radius: 4px;
27 /* Pro/upgrade badge — must read on BOTH light + dark editor themes. The old
28 hardcoded pale-amber-on-dark-amber (#fff4d1 / #8a6d00) was unreadable in
29 Elementor's dark UI. Derive from the theme text colour so contrast holds:
30 a translucent amber wash + amber text mixed toward the current foreground. */
31 --gr-pro: #b8860b;
32 --gr-pro-bg: color-mix(in srgb, var(--gr-pro) 16%, transparent);
33 --gr-pro-txt: color-mix(in srgb, var(--gr-pro) 70%, var(--gr-txt));
34 }
35
36 /* --- Selected chip — hidden unless data-state="picked" --- */
37 .ep-gr-picker__selected {
38 display: none;
39 }
40
41 .ep-gr-picker__selected[data-state="picked"] {
42 display: flex;
43 align-items: center;
44 gap: 10px;
45 padding: 9px 11px;
46 border-radius: var(--gr-radius);
47 background: var(--gr-bg);
48 border: 1px solid var(--gr-bd);
49 }
50
51 .ep-gr-picker__selected-pin {
52 flex: 0 0 auto;
53 display: inline-flex;
54 align-items: center;
55 justify-content: center;
56 width: 28px;
57 height: 28px;
58 border-radius: 50%;
59 background: var(--gr-bg-hover);
60 color: var(--gr-bd-focus);
61 }
62
63 .ep-gr-picker__selected-info {
64 display: flex;
65 flex-direction: column;
66 gap: 1px;
67 flex: 1;
68 min-width: 0;
69 }
70
71 .ep-gr-picker__selected-name {
72 font-size: 12px;
73 font-weight: 600;
74 color: var(--gr-txt);
75 line-height: 1.3;
76 overflow: hidden;
77 text-overflow: ellipsis;
78 white-space: nowrap;
79 }
80
81 .ep-gr-picker__selected-address {
82 font-size: 11px;
83 color: var(--gr-txt-muted);
84 line-height: 1.3;
85 overflow: hidden;
86 text-overflow: ellipsis;
87 white-space: nowrap;
88 }
89
90 .ep-gr-picker__selected-id {
91 font-size: 10px;
92 color: var(--gr-txt-muted);
93 line-height: 1.3;
94 overflow: hidden;
95 text-overflow: ellipsis;
96 white-space: nowrap;
97 }
98
99 .ep-gr-picker__clear {
100 flex-shrink: 0;
101 background: transparent;
102 border: 0;
103 padding: 4px 10px;
104 color: var(--gr-bd-focus);
105 font-size: 11px;
106 font-weight: 600;
107 cursor: pointer;
108 border-radius: 3px;
109 }
110
111 .ep-gr-picker__clear:hover {
112 background: var(--gr-bg-hover);
113 }
114
115 .ep-gr-picker__clear:focus {
116 outline: none;
117 box-shadow: 0 0 0 2px color-mix(in srgb, var(--gr-bd-focus) 22%, transparent);
118 }
119
120 /* --- Search row --- */
121 .ep-gr-picker__search {
122 position: relative;
123 display: flex;
124 align-items: center;
125 }
126
127 .ep-gr-picker__search-icon {
128 position: absolute;
129 inset-inline-start: 10px;
130 top: 50%;
131 transform: translateY(-50%);
132 color: var(--gr-txt-muted);
133 line-height: 0;
134 pointer-events: none;
135 z-index: 1;
136 }
137
138 .ep-gr-picker__input {
139 width: 100%;
140 padding: 8px 32px 8px 32px;
141 border: 1px solid var(--gr-bd);
142 border-radius: var(--gr-radius);
143 background: var(--gr-bg);
144 color: var(--gr-txt);
145 font-size: 12px;
146 line-height: 1.4;
147 font-family: inherit;
148 box-shadow: none;
149 transition: border-color 0.15s ease, box-shadow 0.15s ease;
150 }
151
152 .ep-gr-picker__input:focus {
153 border-color: var(--gr-bd-focus);
154 box-shadow: 0 0 0 2px color-mix(in srgb, var(--gr-bd-focus) 22%, transparent);
155 outline: none;
156 }
157
158 .ep-gr-picker__input::placeholder {
159 color: var(--gr-txt-muted);
160 opacity: 0.7;
161 }
162
163 /* --- Spinner --- */
164 .ep-gr-picker__spinner {
165 position: absolute;
166 inset-inline-end: 10px;
167 top: 50%;
168 transform: translateY(-50%);
169 width: 14px;
170 height: 14px;
171 }
172
173 .ep-gr-picker__spinner-dot {
174 display: block;
175 width: 100%;
176 height: 100%;
177 border-radius: 50%;
178 border: 2px solid var(--gr-bd);
179 border-top-color: var(--gr-bd-focus);
180 animation: ep-gr-spin 0.7s linear infinite;
181 }
182
183 @keyframes ep-gr-spin {
184 to {
185 transform: rotate(360deg);
186 }
187 }
188
189 /* --- Suggestions dropdown --- unified with the settings + Gutenberg pickers:
190 full-width attached panel, results-first, "+ Select" affordance, upsell note
191 BELOW the results (inside the panel). */
192 .ep-gr-picker__search-wrap {
193 position: relative;
194 }
195
196 .ep-gr-picker__results-panel {
197 position: absolute;
198 top: 100%;
199 left: 0;
200 right: 0;
201 width: 100%;
202 z-index: 60;
203 margin-top: -1px;
204 /* attach flush to the input's bottom edge */
205 background: var(--gr-bg);
206 border: 1px solid var(--gr-bd);
207 border-radius: 0 0 var(--gr-radius) var(--gr-radius);
208 max-height: 320px;
209 overflow-y: auto;
210 box-shadow: 0 8px 24px rgba(0, 0, 0, 0.14);
211 }
212
213 .ep-gr-picker__results {
214 list-style: none;
215 margin: 0;
216 padding: 0;
217 }
218
219 /* Row layout for a NARROW panel (~280px in Elementor sidebar / Gutenberg
220 inspector). Two columns: [pin] [content]. The badge is NOT a third column
221 (that squeezed name+address to ~140px and wrapped every word). Instead the
222 badge lives INSIDE the content column, on its OWN line BELOW the text — so the
223 name/address get the full width and the "Upgrade to add" pill sits cleanly. */
224 .ep-gr-picker__results li {
225 display: flex;
226 flex-direction: row;
227 align-items: flex-start;
228 gap: 9px;
229 margin: 0;
230 padding: 9px 12px;
231 cursor: pointer;
232 color: var(--gr-txt);
233 }
234
235 /* Map-pin on each row — left, accent-coloured (matches admin), fixed size. */
236 .ep-gr-suggestion-pin {
237 flex: 0 0 auto;
238 margin-top: 1px;
239 color: var(--gr-bd-focus);
240 }
241
242 .ep-gr-picker__results li .ep-gr-suggestion-body {
243 display: flex;
244 flex-direction: column;
245 align-items: flex-start;
246 gap: 2px;
247 flex: 1 1 auto;
248 min-width: 0;
249 }
250
251 /* Truncate name + address to ONE line (ellipsis) like the admin picker, so a
252 long address never wraps to a messy multi-line block. Meta + badge excluded. */
253 .ep-gr-picker__results li .ep-gr-suggestion-body>strong,
254 .ep-gr-picker__results li .ep-gr-suggestion-body>span:not(.ep-gr-suggestion-meta) {
255 display: block;
256 max-width: 100%;
257 overflow: hidden;
258 text-overflow: ellipsis;
259 white-space: nowrap;
260 }
261
262 .ep-gr-picker__results li+li {
263 border-top: 1px solid var(--gr-bd);
264 }
265
266 .ep-gr-picker__results li:hover,
267 .ep-gr-picker__results li:focus {
268 background: var(--gr-bg-hover);
269 outline: none;
270 }
271
272 .ep-gr-picker__results li strong {
273 font-size: 13px;
274 font-weight: 600;
275 line-height: 1.3;
276 color: var(--gr-txt);
277 }
278
279 .ep-gr-picker__results li .ep-gr-suggestion-body span {
280 font-size: 11px;
281 line-height: 1.3;
282 color: var(--gr-txt-muted);
283 }
284
285 /* Rating + review-count line — parity with the block/admin pickers
286 (�
287 4.5 · 1,167 reviews). Works in both search + saved rows. */
288 .ep-gr-picker .ep-gr-suggestion-meta {
289 display: inline-flex;
290 flex-wrap: wrap;
291 align-items: center;
292 gap: 4px 8px;
293 margin-top: 2px;
294 font-size: 11px;
295 color: var(--gr-txt-muted);
296 }
297
298 .ep-gr-picker .ep-gr-suggestion-rating {
299 display: inline-flex;
300 align-items: center;
301 gap: 2px;
302 font-weight: 600;
303 color: var(--gr-txt);
304 }
305
306 .ep-gr-picker .ep-gr-suggestion-star {
307 color: #fbbf24;
308 font-size: 12px;
309 line-height: 1;
310 }
311
312 .ep-gr-picker .ep-gr-suggestion-count::before {
313 content: '·';
314 margin-right: 6px;
315 color: var(--gr-txt-muted);
316 }
317
318 /* Badges sit on their OWN line below the place text (block-level, left). */
319 .ep-gr-picker__results li .ep-gr-suggestion-add,
320 .ep-gr-picker__results li .ep-gr-already,
321 .ep-gr-picker__results li .ep-gr-suggestion-pro {
322 margin-top: 2px;
323 display: inline-flex;
324 align-items: center;
325 gap: 3px;
326 font-size: 11px;
327 font-weight: 600;
328 font-style: normal;
329 padding: 3px 10px;
330 border-radius: 999px;
331 white-space: nowrap;
332 }
333
334 .ep-gr-picker__results li .ep-gr-suggestion-add {
335 color: var(--gr-bd-focus);
336 background: var(--gr-bg-hover);
337 border: 1px solid transparent;
338 transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
339 }
340
341 .ep-gr-picker__results li:hover .ep-gr-suggestion-add,
342 .ep-gr-picker__results li:focus .ep-gr-suggestion-add {
343 background: var(--gr-bd-focus);
344 color: #fff;
345 border-color: var(--gr-bd-focus);
346 }
347
348 .ep-gr-picker__results li .ep-gr-already {
349 color: #15803d;
350 background: #e6f4ea;
351 }
352
353 /* Pro badge = TEXT-ONLY (no pill bg / padding) — amber crown + label below the
354 place text. */
355 .ep-gr-picker__results li .ep-gr-suggestion-pro {
356 margin-top: 5px;
357 padding: 0;
358 background: none;
359 color: var(--gr-pro-txt);
360 }
361
362 .ep-gr-picker__results li .ep-gr-suggestion-pro svg {
363 display: block;
364 }
365
366 .ep-gr-picker__results li.is-locked strong {
367 color: var(--gr-txt-muted);
368 }
369
370 .ep-gr-picker__results li.is-locked:hover,
371 .ep-gr-picker__results li.is-locked:focus {
372 background: var(--gr-bg-hover);
373 }
374
375 /* Upsell note — last row of the panel, after the results */
376 .ep-gr-picker__results-note {
377 margin: 0;
378 padding: 9px 12px;
379 border-top: 1px solid var(--gr-bd);
380 font-size: 11.5px;
381 line-height: 1.4;
382 color: var(--gr-txt-muted);
383 }
384
385 .ep-gr-picker__results-note a {
386 font-weight: 600;
387 white-space: nowrap;
388 }
389
390 /* --- Status row --- */
391 .ep-gr-picker__status {
392 font-size: 11px;
393 line-height: 1.4;
394 margin-top: 6px;
395 min-height: 14px;
396 color: var(--gr-txt-muted);
397 }
398
399 .ep-gr-picker__status[data-tone="error"] {
400 color: var(--gr-error);
401 }
402
403 .ep-gr-picker__status[data-tone="muted"] {
404 color: var(--gr-txt-muted);
405 font-style: italic;
406 }
407
408 /* --- Recent / Saved lists --- */
409 .ep-gr-picker__lists {
410 margin-top: 8px;
411 display: flex;
412 flex-direction: column;
413 gap: 8px;
414 /* Cap the saved/recent area and scroll when there are many places, so the
415 picker can't grow taller than the panel. */
416 max-height: 240px;
417 overflow-y: auto;
418 padding-right: 2px;
419 }
420
421 .ep-gr-picker__list-heading {
422 font-size: 10px;
423 font-weight: 600;
424 text-transform: uppercase;
425 letter-spacing: 0.04em;
426 color: var(--gr-txt-muted);
427 margin: 0 0 4px;
428 }
429
430 .ep-gr-picker__list-items {
431 list-style: none;
432 margin: 0;
433 padding: 0;
434 display: flex;
435 flex-direction: column;
436 gap: 2px;
437 }
438
439 .ep-gr-picker__list-items li {
440 display: flex;
441 align-items: center;
442 gap: 4px;
443 }
444
445 .ep-gr-picker__list-pick {
446 flex: 1;
447 text-align: start;
448 background: transparent;
449 border: 1px solid transparent;
450 border-radius: 3px;
451 padding: 6px 8px;
452 cursor: pointer;
453 color: var(--gr-txt);
454 /* Row: [pin] [body] — badge lives INSIDE the body (own line), matching the
455 search results, so it never squeezes the name in the narrow panel. */
456 display: flex;
457 flex-direction: row;
458 align-items: flex-start;
459 gap: 8px;
460 font-family: inherit;
461 }
462
463 .ep-gr-picker__list-pick:hover,
464 .ep-gr-picker__list-pick:focus {
465 background: var(--gr-bg-hover);
466 outline: none;
467 }
468
469 .ep-gr-picker__list-pick-body {
470 display: flex;
471 flex-direction: column;
472 gap: 2px;
473 flex: 1 1 auto;
474 min-width: 0;
475 }
476
477 .ep-gr-picker__list-pick strong {
478 font-size: 13px;
479 font-weight: 600;
480 line-height: 1.3;
481 color: var(--gr-txt);
482 }
483
484 /* Truncate the name to one line (ellipsis), matching the search rows + admin. */
485 .ep-gr-picker__list-pick-body>strong {
486 display: block;
487 max-width: 100%;
488 overflow: hidden;
489 text-overflow: ellipsis;
490 white-space: nowrap;
491 }
492
493 /* Truncate the address to one line too, so a long address (e.g. a full street
494 address) can't wrap to 2–3 lines and leave saved rows uneven. The badge is an
495 <em>, so `> span` targets only the address line. */
496 .ep-gr-picker__list-pick-body>span {
497 display: block;
498 max-width: 100%;
499 overflow: hidden;
500 text-overflow: ellipsis;
501 /* white-space: nowrap; */
502 font-size: 11px;
503 color: var(--gr-txt-muted);
504 line-height: 1.5;
505 }
506
507 .ep-gr-picker__list-pick.is-locked strong {
508 color: var(--gr-txt-muted);
509 }
510
511 .ep-gr-picker__list-pick code {
512 font-size: 10px;
513 color: var(--gr-txt-muted);
514 }
515
516 /* "Upgrade to add" on a locked saved row — TEXT-ONLY (no pill), amber, own line
517 below the name/ID. */
518 .ep-gr-picker__list-pick .ep-gr-suggestion-pro {
519 align-self: flex-start;
520 margin-top: 5px;
521 display: inline-flex;
522 align-items: center;
523 gap: 4px;
524 font-size: 10.5px;
525 font-style: normal;
526 font-weight: 600;
527 padding: 0;
528 background: none;
529 color: var(--gr-pro-txt);
530 white-space: nowrap;
531 }
532
533 .ep-gr-picker__list-pick .ep-gr-suggestion-pro svg {
534 display: block;
535 }
536
537 .ep-gr-picker__lists-note {
538 margin: 8px 4px 2px;
539 font-size: 11px;
540 line-height: 1.45;
541 color: var(--gr-txt-muted);
542 }
543
544 .ep-gr-picker__lists-note a {
545 color: var(--gr-pro-txt);
546 font-weight: 600;
547 }
548
549 /* --- Manual Place ID entry --- */
550 .ep-gr-picker__manual {
551 margin-top: 10px;
552 border-top: 1px solid var(--gr-bd);
553 padding-top: 8px;
554 }
555
556 .ep-gr-picker__manual-toggle {
557 background: transparent;
558 border: 0;
559 color: var(--gr-bd-focus);
560 cursor: pointer;
561 font-size: 11px;
562 padding: 2px 0;
563 font-family: inherit;
564 }
565
566 .ep-gr-picker__manual-toggle:hover {
567 text-decoration: underline;
568 }
569
570 .ep-gr-picker__manual-row {
571 margin-top: 6px;
572 display: flex;
573 gap: 6px;
574 }
575
576 .ep-gr-picker__manual-input {
577 flex: 1;
578 padding: 6px 8px;
579 border: 1px solid var(--gr-bd);
580 border-radius: var(--gr-radius);
581 background: var(--gr-bg);
582 color: var(--gr-txt);
583 font-size: 11px;
584 font-family: var(--gr-mono, ui-monospace, "SFMono-Regular", Menlo, monospace);
585 }
586
587 .ep-gr-picker__manual-input:focus {
588 border-color: var(--gr-bd-focus);
589 outline: none;
590 }
591
592 .ep-gr-picker__manual-apply {
593 padding: 6px 10px;
594 border: 1px solid var(--gr-bd-focus);
595 border-radius: var(--gr-radius);
596 background: var(--gr-bd-focus);
597 color: #fff;
598 font-size: 11px;
599 cursor: pointer;
600 }
601
602 /* Quick-preview hint — one short muted line with a "Fetch more" link, shown
603 under the picker once a place is selected. */
604 .ep-gr-elementor-hint {
605 font-size: 11px;
606 line-height: 1.4;
607 color: var(--gr-txt-muted);
608 }
609
610 .ep-gr-elementor-hint a {
611 color: var(--gr-bd-focus);
612 font-weight: 600;
613 text-decoration: none;
614 }
615
616 .ep-gr-elementor-hint a:hover {
617 text-decoration: underline;
618 }
619
620 /* ── Layout picker — mirror the Gutenberg block's LayoutPicker ──────────────
621 *
622 * Elementor's CHOOSE control renders inline alongside its Label, which leaves
623 * the choices wrapper only a narrow right-hand column — 10 tiles get cropped
624 * to ~3. We force the whole control to stack vertically so the 3-column grid
625 * of tiles has the full panel width to breathe in.
626 *
627 * What we change inside the ep_gr_layout control:
628 * 1. .elementor-control-field: row → column. Label sits ABOVE the tiles
629 * on its own line, choices wrapper gets the full width.
630 * 2. .elementor-control-input-wrapper: drop the inline-block width cap so
631 * the grid can claim the row.
632 * 3. .elementor-choices: row flex → 3-col grid, 8px gap.
633 * 4. .elementor-choices-label: vertical stack — LABEL on top, icon below.
634 * 5. .elementor-screen-only: un-hide the screen-reader span so the option
635 * title becomes the visible tile label (matches Gutenberg).
636 * 6. Active radio: themed border + ring; hover: subtle border lift.
637 *
638 * Scoped to .elementor-control-ep_gr_layout so this doesn't leak into other
639 * CHOOSE controls in the same widget. Uses Elementor's editor CSS variables
640 * so the picker flips correctly in both light + dark editor themes.
641 */
642 .elementor-control-ep_gr_layout .elementor-control-field {
643 /* Stack label + tiles vertically — gives the grid the full panel width. */
644 flex-direction: column;
645 align-items: stretch;
646 }
647
648 .elementor-control-ep_gr_layout .elementor-control-title {
649 /* Label gets its own row above the tiles. */
650 display: block;
651 margin-bottom: 8px;
652 width: 100%;
653 }
654
655 .elementor-control-ep_gr_layout .elementor-control-input-wrapper {
656 width: 100%;
657 max-width: 100%;
658 }
659
660 .elementor-control-ep_gr_layout .elementor-choices {
661 display: grid;
662 grid-template-columns: repeat(3, 1fr);
663 gap: 8px;
664 width: 100%;
665 /* Override Elementor's defaults that clip the tiles:
666 * .elementor-choices { height: 27px; line-height: 27px; overflow: hidden; }
667 * These force every choice strip into a single 27px row — fine for a 2-3
668 * tile alignment picker, but our grid needs to expand to multiple rows
669 * and let each tile size itself naturally. */
670 height: auto;
671 line-height: normal;
672 overflow: visible;
673 border-spacing: 0;
674 border-radius: 0;
675 background: transparent;
676 }
677
678 .elementor-control-ep_gr_layout .elementor-choices-label {
679 /* Icon-only tile — tooltip carries the layout name on hover. We use
680 * `outline` instead of `border` for the tile frame because Elementor's
681 * own rules zero out `border-inline-end` (and a few other border-* sides)
682 * across normal/hover/active states to merge adjacent tiles into a
683 * segmented strip. `outline` has no per-side properties to strip, so it
684 * always renders all four sides — no matter what Elementor does next. */
685 display: flex;
686 align-items: center;
687 justify-content: center;
688 padding: 10px 4px;
689 height: auto;
690 min-height: 44px;
691 width: 100%;
692 border: 0;
693 outline: 1px solid var(--e-a-border-color, #e0e0e0);
694 outline-offset: -1px;
695 /* sit flush inside the tile box */
696 /* Use Elementor's panel surface tokens so light + dark editor themes both
697 * get a sensible tile background + border. Fall back to the Gutenberg
698 * picker's hex values for older Elementor builds. */
699 background: var(--e-a-bg-default, #fff);
700 border: 1px solid var(--e-a-border-color, #e0e0e0);
701 border-radius: 6px;
702 color: var(--e-a-color-txt, #50575e);
703 cursor: pointer;
704 transition:
705 border-color 0.12s ease,
706 color 0.12s ease,
707 background 0.12s ease,
708 box-shadow 0.12s ease;
709 }
710
711 .elementor-control-ep_gr_layout .elementor-choices-label>i {
712 /* Same 22px target as the Gutenberg SVG icons. The option title is
713 * surfaced by the Elementor tooltip (data-tooltip on .tooltip-target);
714 * we deliberately keep the screen-reader span hidden — no duplicate text
715 * underneath the icon. */
716 font-size: 22px;
717 line-height: 1;
718 }
719
720 .elementor-control-ep_gr_layout .elementor-choices-label:hover {
721 outline-color: var(--e-a-border-color-bold, #b4b9be);
722 color: var(--e-a-color-txt-accent, #1e1e1e);
723 }
724
725 .elementor-control-ep_gr_layout input[type="radio"]:checked+.elementor-choices-label {
726 /* Selected state — primary outline on all four sides + faint tinted
727 * background. Uses outline (not border) for the same reason as the
728 * resting state: Elementor strips border-inline-end on checked too. */
729 outline-color: var(--e-a-color-primary, #3858e9);
730 background: color-mix(in srgb, var(--e-a-color-primary, #3858e9) 8%, transparent);
731 }
732
733 /* --- Pro-only layout tiles: "PRO" badge (free only) ---
734 * The PHP adds .ep-gr-layout-choose--free to the control wrapper when Pro is
735 * inactive. The 6 Pro layouts (masonry/badge/spotlight/knowledge/marquee/
736 * bubble) get a small corner pill so users see at a glance which need Pro.
737 * Pro active → wrapper class absent → no badge. */
738 .ep-gr-layout-choose--free .elementor-choices-label {
739 position: relative;
740 overflow: visible;
741 }
742
743 .ep-gr-layout-choose--free input[type="radio"][value="masonry"]+.elementor-choices-label::after,
744 .ep-gr-layout-choose--free input[type="radio"][value="badge"]+.elementor-choices-label::after,
745 .ep-gr-layout-choose--free input[type="radio"][value="spotlight"]+.elementor-choices-label::after,
746 .ep-gr-layout-choose--free input[type="radio"][value="knowledge"]+.elementor-choices-label::after,
747 .ep-gr-layout-choose--free input[type="radio"][value="marquee"]+.elementor-choices-label::after,
748 .ep-gr-layout-choose--free input[type="radio"][value="bubble"]+.elementor-choices-label::after {
749 content: "PRO";
750 position: absolute;
751 top: 5px;
752 right: 5px;
753 font-size: 8px;
754 font-weight: 700;
755 letter-spacing: 0.04em;
756 line-height: 1;
757 padding: 3px 5px;
758 border-radius: 4px;
759 color: #fff;
760 background: #b8860b;
761 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
762 pointer-events: none;
763 z-index: 2;
764 }