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 / feature-preview-modal.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
feature-preview-modal.css
990 lines
1 /**
2 * EmbedPress — "What's New" Feature Preview Modal
3 *
4 * Split-panel post-update announcement modal shown on EmbedPress admin pages
5 * after a version bump. Left = animated feature preview in faux browser chrome;
6 * right = copy + CTA. Adapts between a single feature (no nav) and a carousel
7 * (dots + Back/Next) automatically — the JS toggles `.epwn--multi`.
8 *
9 * Themed with the real EmbedPress design tokens (mirrored from the Analytics UI
10 * + EmbedDetailsModal): brand purple #5945b0, navy ink #25396F, slate muted
11 * #7C8DB5, soft panel #F5F7FD, coral accent #FE504F, 24px modal radius, DMSans.
12 *
13 * Source file: static/css/feature-preview-modal.css
14 * Build output: assets/css/feature-preview-modal.css (mirror until vite build).
15 */
16
17 .epwn {
18 /* ===== EmbedPress design tokens ===== */
19 --epwn-brand: #5945b0;
20 --epwn-brand-hover: #4a3a9a;
21 --epwn-brand-light: #f3f1fc;
22 --epwn-brand-2: #7c3aed;
23 --epwn-ink: #25396f;
24 /* navy — headings */
25 --epwn-muted: #7c8db5;
26 /* slate — secondary text */
27 --epwn-soft: #f5f7fd;
28 /* soft lavender panel bg */
29 --epwn-accent: #fe504f;
30 /* coral accent */
31 --epwn-line: #eef1f8;
32 --epwn-dark: #0f1014;
33 --epwn-font: "DMSans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
34
35 position: fixed;
36 inset: 0;
37 z-index: 100000;
38 /* above wp-admin chrome */
39 display: flex;
40 align-items: center;
41 justify-content: center;
42 padding: 24px;
43 background: rgba(15, 16, 20, .6);
44 font-family: var(--epwn-font);
45 color: var(--epwn-ink);
46 opacity: 0;
47 visibility: hidden;
48 transition: opacity .22s ease, visibility .22s ease;
49 }
50
51 .epwn.is-open {
52 opacity: 1;
53 visibility: visible;
54 }
55
56 /* ===== modal shell ===== */
57 .epwn__modal {
58 width: 820px;
59 max-width: 100%;
60 max-height: calc(100vh - 48px);
61 background: #fff;
62 border-radius: 24px;
63 overflow: hidden;
64 box-shadow: 0 24px 60px rgba(37, 57, 111, .22);
65 position: relative;
66 display: flex;
67 min-height: 392px;
68 transform: translateY(10px) scale(.985);
69 transition: transform .22s ease;
70 }
71
72 .epwn.is-open .epwn__modal {
73 transform: translateY(0) scale(1);
74 }
75
76 .epwn__close {
77 position: absolute;
78 top: 16px;
79 right: 16px;
80 width: 32px;
81 height: 32px;
82 border: none;
83 border-radius: 50%;
84 background: rgba(255, 255, 255, .92);
85 box-shadow: 0 2px 8px rgba(37, 57, 111, .14);
86 display: flex;
87 align-items: center;
88 justify-content: center;
89 color: #64748b;
90 font-size: 14px;
91 line-height: 1;
92 cursor: pointer;
93 z-index: 6;
94 padding: 0;
95 transition: var(--epwn-trans, all .15s ease);
96 }
97
98 .epwn__close:hover {
99 background: var(--epwn-accent);
100 color: #fff;
101 }
102
103 .epwn__close:focus, .epwn__close:focus-visible {
104 outline: none;
105 }
106
107
108 /* ===== left: preview panel (light) ===== */
109 .epwn__left {
110 width: 54%;
111 background: var(--epwn-soft, #f5f7fd);
112 display: flex;
113 align-items: center;
114 justify-content: center;
115 padding: 26px;
116 position: relative;
117 }
118
119 .epwn__demo {
120 width: 100%;
121 background: #fff;
122 border: 1px solid #e7ebf3;
123 border-radius: 14px;
124 overflow: hidden;
125 position: relative;
126 z-index: 1;
127 box-shadow: 0 12px 30px rgba(37, 57, 111, .12);
128 height: 100%;
129 }
130
131 .epwn__bar {
132 height: 30px;
133 background: #f3f5fa;
134 border-bottom: 1px solid #e7ebf3;
135 display: flex;
136 align-items: center;
137 gap: 6px;
138 padding: 0 13px;
139 }
140
141 .epwn__bar i {
142 width: 9px;
143 height: 9px;
144 border-radius: 50%;
145 background: #d3d8e4;
146 }
147
148 .epwn__bar i:nth-child(1) {
149 background: #fe504f;
150 }
151
152 .epwn__bar i:nth-child(2) {
153 background: #ffa53c;
154 }
155
156 .epwn__bar i:nth-child(3) {
157 background: #00cc76;
158 }
159
160 .epwn__badge {
161 position: absolute;
162 top: 38px;
163 right: 38px;
164 background: var(--epwn-accent);
165 color: #fff;
166 font-size: 9px;
167 font-weight: 700;
168 letter-spacing: .1em;
169 padding: 4px 9px;
170 border-radius: 6px;
171 z-index: 3;
172 box-shadow: 0 2px 8px rgba(254, 80, 79, .4);
173 }
174
175 .epwn__stage {
176 padding: 16px;
177 display: flex;
178 align-items: center;
179 justify-content: center;
180 min-height: 180px;
181 background: #fff;
182 height: 100%;
183 }
184
185 /* File media (image/gif/video, e.g. the PDF-flipbook slide) sizes to its
186 content instead of stretching the panel to full column height — the parent
187 .epwn__left centers the compact panel, removing the gap above a landscape
188 clip. html demos keep height:100% so they fill as designed. */
189 .epwn__demo--flat,
190 .epwn__demo--flat .epwn__stage {
191 height: auto;
192 }
193
194 .epwn__stage img,
195 .epwn__stage video {
196 max-width: 100%;
197 max-height: 240px;
198 border-radius: 10px;
199 display: block;
200 }
201
202 /* While a large image/GIF/video is still loading, show a soft shimmer on the
203 stage instead of a blank white box; the media fades in once ready. */
204 .epwn__stage img,
205 .epwn__stage video {
206 opacity: 1;
207 transition: opacity .25s ease;
208 }
209
210 .epwn__stage--loading {
211 position: relative;
212 background:
213 linear-gradient(100deg, #f3f4fa 30%, #e9ebf5 45%, #f3f4fa 60%) #f3f4fa;
214 background-size: 200% 100%;
215 border-radius: 10px;
216 animation: epwn-shimmer 1.2s ease-in-out infinite;
217 }
218
219 .epwn__stage--loading img,
220 .epwn__stage--loading video {
221 opacity: 0;
222 }
223
224 @keyframes epwn-shimmer {
225 0% {
226 background-position: 150% 0;
227 }
228
229 100% {
230 background-position: -50% 0;
231 }
232 }
233
234 @media (prefers-reduced-motion: reduce) {
235 .epwn__stage--loading {
236 animation: none;
237 }
238 }
239
240 /* ===== right: copy panel ===== */
241 .epwn__right {
242 width: 46%;
243 padding: 30px 32px 26px;
244 display: flex;
245 flex-direction: column;
246 overflow-y: auto;
247 background: #fff;
248 }
249
250 /* brand header: EmbedPress logo */
251 .epwn__header {
252 display: flex;
253 align-items: center;
254 margin-bottom: 18px;
255 }
256
257 .epwn__logo {
258 height: 26px;
259 width: auto;
260 display: block;
261 }
262
263 .epwn__eyebrow {
264 font-size: 12px;
265 font-weight: 700;
266 letter-spacing: .06em;
267 text-transform: uppercase;
268 color: var(--epwn-brand);
269 min-height: 14px;
270 }
271
272 .epwn__title {
273 font-size: 26px;
274 font-weight: 700;
275 letter-spacing: -.02em;
276 line-height: 1.16;
277 margin: 10px 0 11px;
278 color: var(--epwn-ink);
279 }
280
281 .epwn__desc {
282 font-size: 14px;
283 color: var(--epwn-muted);
284 line-height: 1.6;
285 margin: 0;
286 }
287
288 .epwn__grow {
289 flex: 1;
290 min-height: 14px;
291 }
292
293 /* fade animation applied to the right copy on step change */
294 .epwn__fade {
295 animation: epwn-fade .3s ease;
296 }
297
298 @keyframes epwn-fade {
299 from {
300 opacity: 0;
301 transform: translateY(7px);
302 }
303
304 to {
305 opacity: 1;
306 transform: translateY(0);
307 }
308 }
309
310 .epwn__cta {
311 font-family: var(--epwn-font);
312 font-size: 14px;
313 font-weight: 600;
314 border-radius: 10px;
315 padding: 13px 18px;
316 cursor: pointer;
317 border: none;
318 background: var(--epwn-brand);
319 color: #fff;
320 margin-top: 22px;
321 text-align: center;
322 text-decoration: none;
323 display: block;
324 transition: background .15s ease;
325 }
326
327 .epwn__cta:hover {
328 background: var(--epwn-brand-hover);
329 color: #fff;
330 }
331
332 .epwn__cta:focus-visible {
333 outline: 2px solid var(--epwn-brand);
334 outline-offset: 2px;
335 }
336
337 /* ===== nav (multi only) ===== */
338 .epwn__nav {
339 display: none;
340 align-items: center;
341 margin-top: 16px;
342 height: 24px;
343 }
344
345 .epwn--multi .epwn__nav {
346 display: flex;
347 }
348
349 .epwn__back,
350 .epwn__next {
351 font-family: var(--epwn-font);
352 font-size: 13px;
353 background: none;
354 border: none;
355 cursor: pointer;
356 padding: 4px 2px;
357 }
358
359 .epwn__back {
360 font-weight: 600;
361 color: var(--epwn-muted);
362 visibility: hidden;
363 }
364
365 .epwn__next {
366 font-weight: 700;
367 color: var(--epwn-brand);
368 }
369
370 .epwn__back:focus-visible,
371 .epwn__next:focus-visible {
372 outline: 2px solid var(--epwn-brand);
373 outline-offset: 2px;
374 border-radius: 4px;
375 }
376
377 .epwn__dots {
378 display: flex;
379 gap: 6px;
380 margin: 0 auto;
381 align-items: center;
382 }
383
384 .epwn__dot {
385 width: 7px;
386 height: 7px;
387 border-radius: 50%;
388 background: #d7daea;
389 transition: .2s;
390 padding: 0;
391 border: none;
392 cursor: pointer;
393 }
394
395 .epwn__dot.is-on {
396 background: var(--epwn-accent);
397 width: 22px;
398 border-radius: 5px;
399 }
400
401 .epwn__chglink {
402 margin-top: 18px;
403 text-align: left;
404 }
405
406 .epwn__chglink a {
407 font-size: 12.5px;
408 color: var(--epwn-muted);
409 text-decoration: none;
410 border-bottom: 1px dashed #c7cee2;
411 transition: color .15s ease;
412 }
413
414 .epwn__chglink a:hover {
415 color: var(--epwn-brand);
416 border-bottom-color: var(--epwn-brand);
417 }
418
419 /* ===== Google Reviews animated demo (light) =====
420 A single light card that cross-fades between TWO phases on a 7s loop:
421 Phase A — our place-search picker (type a name → suggestion → click);
422 Phase B — the reviews our block renders (summary + cards).
423 Only one phase is visible at a time (both absolutely stacked). Inline
424 markup carries .ep-grdemo-* classes — the modal kses-strips <style>, so all
425 motion lives here. */
426 .ep-grdemo {
427 /* Mirror the real Google Reviews block's tokens (google-reviews.css). */
428 /* Review cards mirror the real Google Reviews block; the search field uses
429 the EmbedPress admin field style (brand purple). */
430 --grd-heading: #202124;
431 --grd-text: #202124;
432 --grd-muted: #5f6368;
433 --grd-border: #eef1f6;
434 --grd-star: #fbbc05;
435 --grd-blue: #1a73e8;
436 /* EmbedPress admin field tokens (from google-reviews.scss). */
437 --ep-field-border: #d7d7ea;
438 --ep-field-text: #2c3e66;
439 --ep-field-muted: #7f8bb2;
440 --ep-brand: #5b4e96;
441 --grd-font: "Google Sans", Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
442
443 width: 100%;
444 height: 100%;
445 min-height: 248px;
446 background: #fff;
447 border-radius: 12px;
448 font-family: var(--grd-font);
449 color: var(--grd-text);
450 position: relative;
451 overflow: hidden;
452 }
453
454 .ep-grdemo-stars {
455 color: var(--grd-star);
456 font-size: 13px;
457 letter-spacing: 1px;
458 white-space: nowrap;
459 }
460
461 .ep-grdemo-stars span {
462 display: inline;
463 }
464
465 /* Both phases share the same box; cross-faded via opacity. Children sit at
466 the top at their natural height (the search box must NOT stretch to fill). */
467 .ep-grdemo,
468 .ep-grdemo * {
469 box-sizing: border-box;
470 }
471
472 .ep-grdemo-phase {
473 position: absolute;
474 inset: 0;
475 display: flex;
476 flex-direction: column;
477 justify-content: flex-start;
478 padding: 16px;
479 opacity: 0;
480 }
481
482 .ep-grdemo-phase--search {
483 animation: ep-grdemo-phaseA 7s infinite;
484 }
485
486 .ep-grdemo-phase--reviews {
487 animation: ep-grdemo-phaseB 7s infinite;
488 }
489
490 /* ── Phase A: search picker — matches the EmbedPress admin search field ── */
491 .ep-grdemo-label {
492 font-size: 12px;
493 font-weight: 600;
494 color: var(--ep-field-text);
495 margin-bottom: 6px;
496 }
497
498 .ep-grdemo-search {
499 flex: 0 0 auto;
500 display: flex;
501 align-items: center;
502 gap: 8px;
503 height: 40px;
504 border: 1px solid var(--ep-field-border);
505 border-radius: 8px;
506 padding: 0 12px;
507 font-size: 14px;
508 color: var(--ep-field-text);
509 box-shadow: 0 0 0 2px rgba(91, 78, 150, .1);
510 /* focus-ring while "typing", removed once the result is picked */
511 animation: ep-grdemo-focus 7s infinite;
512 }
513
514 .ep-grdemo-search-ico {
515 color: var(--ep-field-muted);
516 flex-shrink: 0;
517 display: block;
518 }
519
520 .ep-grdemo-label {
521 flex: 0 0 auto;
522 }
523
524 .ep-grdemo-typed {
525 overflow: hidden;
526 white-space: nowrap;
527 width: 0;
528 flex-shrink: 0;
529 animation: ep-grdemo-type 7s infinite steps(18, end);
530 }
531
532 .ep-grdemo-caret {
533 width: 1.5px;
534 height: 16px;
535 flex-shrink: 0;
536 background: var(--ep-brand);
537 animation: ep-grdemo-blink 1s infinite step-end, ep-grdemo-caret-hide 7s infinite;
538 }
539
540 /* suggestion dropdown */
541 .ep-grdemo-suggest {
542 flex: 0 0 auto;
543 margin-top: 8px;
544 border: 1px solid var(--grd-border);
545 border-radius: 10px;
546 box-shadow: 0 8px 20px rgba(60, 64, 67, .12);
547 overflow: hidden;
548 opacity: 0;
549 transform: translateY(-6px);
550 animation: ep-grdemo-suggest 7s infinite;
551 }
552
553 .ep-grdemo-result {
554 display: flex;
555 align-items: center;
556 gap: 10px;
557 padding: 11px 12px;
558 background: #fff;
559 animation: ep-grdemo-hl 7s infinite;
560 }
561
562 .ep-grdemo-pin {
563 color: var(--ep-brand);
564 flex-shrink: 0;
565 display: block;
566 }
567
568 .ep-grdemo-result-text {
569 display: flex;
570 flex-direction: column;
571 line-height: 1.35;
572 min-width: 0;
573 }
574
575 .ep-grdemo-result-text strong {
576 font-size: 13px;
577 font-weight: 600;
578 color: var(--ep-field-text);
579 }
580
581 .ep-grdemo-result-text small {
582 font-size: 11px;
583 color: var(--ep-field-muted);
584 }
585
586 /* a little click-cursor that taps the result */
587 .ep-grdemo-cursor {
588 margin-left: auto;
589 width: 14px;
590 height: 14px;
591 border: 2px solid var(--ep-field-muted);
592 border-radius: 50%;
593 flex-shrink: 0;
594 opacity: 0;
595 animation: ep-grdemo-tap 7s infinite;
596 }
597
598 /* ── Phase B: reviews (matches the real block's summary + cards) ── */
599 .ep-grdemo-summary {
600 display: flex;
601 align-items: center;
602 gap: 8px;
603 margin-bottom: 10px;
604 }
605
606 .ep-grdemo-summary b {
607 font-size: 22px;
608 font-weight: 500;
609 color: var(--grd-heading);
610 line-height: 1;
611 }
612
613 .ep-grdemo-count {
614 margin-left: auto;
615 font-size: 12px;
616 color: var(--grd-muted);
617 }
618
619 .ep-grdemo-review {
620 border: 1px solid var(--grd-border);
621 border-radius: 10px;
622 padding: 9px 11px;
623 margin-bottom: 7px;
624 opacity: 0;
625 transform: translateY(8px);
626 animation: ep-grdemo-card 7s infinite;
627 }
628
629 .ep-grdemo-review:last-child {
630 margin-bottom: 0;
631 }
632
633 /* Stagger via adjacent-sibling chains (kses strips inline animation-delay).
634 1st review = base; 2nd = preceded by one; 3rd = preceded by two. */
635 .ep-grdemo-review+.ep-grdemo-review {
636 animation: ep-grdemo-card2 7s infinite;
637 }
638
639 .ep-grdemo-review+.ep-grdemo-review+.ep-grdemo-review {
640 animation: ep-grdemo-card3 7s infinite;
641 }
642
643 .ep-grdemo-review-head {
644 display: flex;
645 align-items: center;
646 gap: 8px;
647 margin-bottom: 4px;
648 }
649
650 .ep-grdemo-avatar {
651 width: 22px;
652 height: 22px;
653 border-radius: 50%;
654 background: var(--ep-brand);
655 color: #fff;
656 display: inline-flex;
657 align-items: center;
658 justify-content: center;
659 font-size: 11px;
660 font-weight: 500;
661 flex-shrink: 0;
662 }
663
664 .ep-grdemo-name {
665 font-size: 12.5px;
666 font-weight: 600;
667 color: var(--grd-heading);
668 }
669
670 .ep-grdemo-review-head .ep-grdemo-stars {
671 margin-left: auto;
672 font-size: 10px;
673 }
674
675 .ep-grdemo-text {
676 font-size: 12.5px;
677 line-height: 1.45;
678 color: var(--grd-text);
679 }
680
681 /* ── Timeline (0–100% of 7s) ──
682 Phase A visible 0–52%: type 5–35%, dropdown 38%, tap 46%.
683 cross-fade 52–58%.
684 Phase B visible 58–100%: cards stagger in 62–74%, hold, fade at loop. */
685 @keyframes ep-grdemo-phaseA {
686 0%, 50% {
687 opacity: 1;
688 }
689
690 57%, 100% {
691 opacity: 0;
692 }
693 }
694
695 @keyframes ep-grdemo-phaseB {
696 0%, 52% {
697 opacity: 0;
698 }
699
700 60%, 96% {
701 opacity: 1;
702 }
703
704 100% {
705 opacity: 0;
706 }
707 }
708
709 @keyframes ep-grdemo-type {
710 0%, 5% {
711 width: 0;
712 }
713
714 34%, 100% {
715 /* Wide enough for the full "Sydney Opera House" string at 14px. */
716 width: 168px;
717 }
718 }
719
720 @keyframes ep-grdemo-blink {
721 0%, 50% {
722 opacity: 1;
723 }
724
725 51%, 100% {
726 opacity: 0;
727 }
728 }
729
730 @keyframes ep-grdemo-caret-hide {
731 0%, 35% {
732 opacity: 1;
733 }
734
735 36%, 100% {
736 opacity: 0;
737 }
738 }
739
740 @keyframes ep-grdemo-suggest {
741 0%, 35% {
742 opacity: 0;
743 transform: translateY(-6px);
744 }
745
746 40%, 50% {
747 opacity: 1;
748 transform: translateY(0);
749 }
750
751 57%, 100% {
752 opacity: 0;
753 transform: translateY(-6px);
754 }
755 }
756
757 @keyframes ep-grdemo-hl {
758 0%, 44% {
759 background: #fff;
760 }
761
762 47%, 50% {
763 background: rgba(91, 78, 150, .08);
764 }
765
766 57%, 100% {
767 background: #fff;
768 }
769 }
770
771 /* Search field focus ring while typing; drops once the result is picked. */
772 @keyframes ep-grdemo-focus {
773 0%, 50% {
774 box-shadow: 0 0 0 2px rgba(91, 78, 150, .1);
775 border-color: var(--ep-brand);
776 }
777
778 57%, 100% {
779 box-shadow: none;
780 border-color: var(--ep-field-border);
781 }
782 }
783
784 @keyframes ep-grdemo-tap {
785 0%, 42% {
786 opacity: 0;
787 transform: scale(1);
788 }
789
790 44% {
791 opacity: 1;
792 transform: scale(1);
793 }
794
795 47% {
796 opacity: 1;
797 transform: scale(.7);
798 }
799
800 50%, 100% {
801 opacity: 0;
802 transform: scale(1);
803 }
804 }
805
806 @keyframes ep-grdemo-card {
807 0%, 60% {
808 opacity: 0;
809 transform: translateY(8px);
810 }
811
812 68%, 96% {
813 opacity: 1;
814 transform: translateY(0);
815 }
816
817 100% {
818 opacity: 0;
819 transform: translateY(8px);
820 }
821 }
822
823 @keyframes ep-grdemo-card2 {
824 0%, 64% {
825 opacity: 0;
826 transform: translateY(8px);
827 }
828
829 72%, 96% {
830 opacity: 1;
831 transform: translateY(0);
832 }
833
834 100% {
835 opacity: 0;
836 transform: translateY(8px);
837 }
838 }
839
840 @keyframes ep-grdemo-card3 {
841 0%, 68% {
842 opacity: 0;
843 transform: translateY(8px);
844 }
845
846 76%, 96% {
847 opacity: 1;
848 transform: translateY(0);
849 }
850
851 100% {
852 opacity: 0;
853 transform: translateY(8px);
854 }
855 }
856
857 @media (prefers-reduced-motion: reduce) {
858
859 .ep-grdemo-phase, .ep-grdemo-typed, .ep-grdemo-caret, .ep-grdemo-suggest,
860 .ep-grdemo-result, .ep-grdemo-cursor, .ep-grdemo-review {
861 animation: none;
862 }
863
864 /* Reduced motion → just show the reviews phase. */
865 .ep-grdemo-phase--search {
866 display: none;
867 }
868
869 .ep-grdemo-phase--reviews {
870 opacity: 1;
871 }
872
873 .ep-grdemo-review {
874 opacity: 1;
875 transform: none;
876 }
877 }
878
879 /* ===== responsive ===== */
880 @media (max-width: 760px) {
881 .epwn {
882 padding: 14px;
883 }
884
885 .epwn__modal {
886 flex-direction: column;
887 min-height: 0;
888 max-height: calc(100vh - 28px);
889 overflow-y: auto;
890 }
891
892 .epwn__left,
893 .epwn__right {
894 width: 100%;
895 }
896
897 .epwn__left {
898 padding: 18px;
899 }
900
901 .epwn__title {
902 font-size: 21px;
903 }
904
905 /* keep the PREVIEW badge clear of the close button when stacked */
906 .epwn__badge {
907 top: 28px;
908 right: 14px;
909 }
910
911 /* tighten nav so Back/Next don't clip at narrow widths */
912 .epwn__nav {
913 margin-top: 14px;
914 }
915
916 .epwn__back,
917 .epwn__next {
918 font-size: 12px;
919 }
920 }
921
922 @media (prefers-reduced-motion: reduce) {
923
924 .epwn,
925 .epwn__modal,
926 .epwn__fade,
927 .epwn__cta {
928 transition: none;
929 animation: none;
930 }
931 }
932 /* =========================================================================
933 * Menu "New" indicator — the blinking bubble on the EmbedPress admin menu.
934 *
935 * NOTE: this stylesheet only loads on EmbedPress pages, but the bubble shows on
936 * EVERY admin page. FeaturePreviewModal::print_menu_indicator_style() prints an
937 * identical rule inline in <head> so the blink works globally; this copy keeps
938 * the source of truth here and covers EmbedPress pages where the modal CSS is
939 * already enqueued. Keep the two in sync.
940 * ========================================================================= */
941 #adminmenu li.menu-top:has(.ep-whatsnew-badge) .wp-menu-name {
942 white-space: nowrap;
943 }
944 /* Inline red "NEW" pill with a sweeping white-gradient shine. */
945 #adminmenu .ep-whatsnew-badge {
946 position: relative;
947 overflow: hidden;
948 display: inline-flex;
949 align-items: center;
950 justify-content: center;
951 vertical-align: middle;
952 width: 28px;
953 height: 18px;
954 margin: -2px 0 0 0;
955 padding: 0;
956 border-radius: 9px;
957 background: #d63637;
958 color: #fff;
959 font-size: 8px;
960 font-weight: 700;
961 line-height: 1.6;
962 letter-spacing: .04em;
963 text-transform: uppercase;
964 text-align: center;
965 box-shadow: none !important;
966 animation: ep-whatsnew-glow 1.8s ease-in-out infinite;
967 }
968 #adminmenu .ep-whatsnew-badge::after {
969 content: "";
970 position: absolute;
971 top: 0;
972 left: 0;
973 width: 45%;
974 height: 100%;
975 background: linear-gradient(100deg, transparent 0%, rgba(255, 255, 255, .85) 50%, transparent 100%);
976 animation: ep-whatsnew-shine 1.8s ease-in-out infinite;
977 }
978 @keyframes ep-whatsnew-shine {
979 0% { transform: translateX(-160%) skewX(-18deg); }
980 55%, 100% { transform: translateX(320%) skewX(-18deg); }
981 }
982 @keyframes ep-whatsnew-glow {
983 0%, 100% { box-shadow: 0 1px 4px rgba(0, 185, 105, .5); }
984 50% { box-shadow: 0 1px 9px rgba(0, 185, 105, .85); }
985 }
986 @media (prefers-reduced-motion: reduce) {
987 #adminmenu .ep-whatsnew-badge { animation: none; }
988 #adminmenu .ep-whatsnew-badge::after { display: none; }
989 }
990