PluginProbe ʕ •ᴥ•ʔ
Reviews Feed – Add Testimonials and Customer Reviews From Google Reviews, Yelp, TripAdvisor, and More / 2.8.0
Reviews Feed – Add Testimonials and Customer Reviews From Google Reviews, Yelp, TripAdvisor, and More v2.8.0
2.11.0 2.10.0 2.9.0 2.8.0 2.7.0 2.6.7 2.6.8 2.6.5 2.6.4 2.6.3 2.6.2 2.6.0 2.5.5 2.5.4 2.5.3 2.5.2 trunk 1.0 1.0.1 1.0.2 1.0.3 1.1 1.1.1 1.1.2 1.2.0 2.0 2.1.0 2.1.1 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.5.0 2.5.1
reviews-feed / assets / css / review-alert-themes.css
reviews-feed / assets / css Last commit date
admin-notifications.css 1 month ago review-alert-themes.css 1 month ago sbr-review-alert-themes.css 1 month ago sbr-review-alerts-frontend.css 1 month ago sbr-styles.css 1 month ago sbr-styles.min.css 1 month ago
review-alert-themes.css
2444 lines
1 /**
2 * Review Alert Themes CSS
3 *
4 * This is the SOURCE file. Edit styles here.
5 * See: .claude/docs/REVIEW-ALERTS-CSS-FLOW.md for build/loading documentation.
6 *
7 * Matches prototype design from 2025-11-19-review-notification-popup-v2:
8 * - Horizontal layout with avatar left, content right
9 * - Accent-colored wrapper with white inner card
10 * - Hover scale effect on wrapper
11 * - "View All Reviews" link with hover fill effect
12 * - Powered by footer in accent color
13 *
14 * @since 2.5.0
15 */
16
17 /* ==========================================================================
18 CSS Custom Properties (Design Tokens)
19 ========================================================================== */
20
21 :root {
22 /* Neutral Colors - Zinc scale (static, not hue-dependent) */
23 --sbr-popup-white: #FFFFFF;
24 --sbr-popup-zinc-50: #fafafa;
25 --sbr-popup-zinc-100: #f4f4f5;
26 --sbr-popup-zinc-200: #e4e4e7;
27 --sbr-popup-zinc-300: #d4d4d8;
28 --sbr-popup-zinc-400: #a1a1aa;
29 --sbr-popup-zinc-500: #71717a;
30 --sbr-popup-zinc-600: #52525b;
31 --sbr-popup-zinc-700: #3f3f46;
32 --sbr-popup-zinc-800: #27272a;
33 --sbr-popup-zinc-900: #18181b;
34 --sbr-popup-zinc-950: #09090b;
35
36 /* Typography */
37 --sbr-popup-font: "Inter", -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", Roboto, sans-serif;
38
39 /* Border Radius */
40 --sbr-popup-radius-outer: 16px;
41 --sbr-popup-radius-inner: 12px;
42
43 /* Shadows */
44 --sbr-popup-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
45
46 /* Component Sizes */
47 --sbr-popup-width: 408px;
48 --sbr-popup-avatar-size: 56px;
49 --sbr-popup-provider-badge-size: 28px;
50 --sbr-popup-star-size: 20px;
51
52 /* Animation */
53 --sbr-popup-transition: 200ms ease;
54 }
55
56 /* ==========================================================================
57 Fallback for browsers that don't support OKLCH (~5% of users)
58
59 STRATEGY:
60 1. Base tokens use static blue hex values as default
61 2. For elements using accent color (stars, close button, links),
62 we use --sbr-popup-accent-fallback if set, otherwise fallback to hex
63 3. This ensures custom accent colors work in legacy browsers
64 ========================================================================== */
65 @supports not (color: oklch(0.5 0.2 250)) {
66 .sbr-review-alert {
67 /* Static blue palette for legacy browsers */
68 --sbr-popup-accent-50: #f5f7ff;
69 --sbr-popup-accent-100: #e8edff;
70 --sbr-popup-accent-200: #c9d5ff;
71 --sbr-popup-accent-300: #a3b8ff;
72 --sbr-popup-accent-400: #7090ff;
73 --sbr-popup-accent-500: #4169e1;
74 --sbr-popup-accent-600: #3355cc;
75 --sbr-popup-accent-700: #2944a3;
76 --sbr-popup-accent-800: #1f3380;
77 --sbr-popup-accent-900: #14225c;
78 --sbr-popup-accent-950: #0a1133;
79
80 --sbr-popup-accent-muted-50: #f8f9fc;
81 --sbr-popup-accent-muted-100: #eef1f7;
82 --sbr-popup-accent-muted-200: #dde3ef;
83 --sbr-popup-accent-muted-300: #c5cee0;
84 --sbr-popup-accent-muted-400: #9aa8c7;
85 --sbr-popup-accent-muted-500: #7282a8;
86 --sbr-popup-accent-muted-600: #5a6a8c;
87 --sbr-popup-accent-muted-700: #455270;
88 --sbr-popup-accent-muted-800: #333d54;
89 --sbr-popup-accent-muted-900: #232a3a;
90 --sbr-popup-accent-muted-950: #141820;
91 }
92
93 /* Use custom accent fallback hex for key accent elements (legacy browsers only) */
94 .sbr-review-alert .sbr-review-alert__star {
95 color: var(--sbr-popup-accent-fallback, var(--sbr-popup-accent-500));
96 }
97
98 .sbr-review-alert .sbr-review-alert__close-btn {
99 background-color: var(--sbr-popup-accent-fallback, var(--sbr-popup-accent-600));
100 }
101
102 .sbr-review-alert .sbr-review-alert__link:hover {
103 color: var(--sbr-popup-accent-fallback, var(--sbr-popup-accent-600));
104 }
105
106 .sbr-review-alert .sbr-review-alert__powered-by-wrapper {
107 background-color: var(--sbr-popup-accent-fallback, var(--sbr-popup-accent-600));
108 }
109 }
110
111 /* ==========================================================================
112 Base Popup Styles
113 ========================================================================== */
114
115 .sbr-review-alert {
116 font-family: var(--sbr-popup-font);
117 font-size: 14px;
118 line-height: 1.5;
119 box-sizing: border-box;
120 -webkit-font-smoothing: antialiased;
121 -moz-osx-font-smoothing: grayscale;
122
123 /* Default accent hue (250 = blue in OKLCH color space)
124 * OKLCH provides perceptually uniform colors - green/yellow won't wash out
125 * Hue values: Red=15, Orange=40, Yellow=70, Green=145, Teal=180, Blue=250, Purple=280, Pink=330
126 * This is defined here (not :root) so inline style --sbr-popup-accent-hue is inherited */
127 --sbr-popup-accent-hue: 250;
128
129 /* ========================================================================
130 OKLCH Accent Color Palette (22 tokens)
131 Perceptually uniform - consistent brightness across all hues
132 Browser support: ~95% (Chrome 111+, Firefox 113+, Safari 15.4+)
133 Defined here to inherit --sbr-popup-accent-hue from inline styles
134
135 FALLBACK STRATEGY:
136 - First value: hex fallback (default blue hue=250) for older browsers
137 - Second value: OKLCH with dynamic hue for modern browsers
138 - Browsers that don't support OKLCH ignore the second declaration
139 ======================================================================== */
140
141 /* Accent color shades - hex fallback + OKLCH (11 tokens) */
142 --sbr-popup-accent-50: #f5f7ff;
143 --sbr-popup-accent-50: oklch(0.99 0.01 var(--sbr-popup-accent-hue));
144 --sbr-popup-accent-100: #e0e7ff;
145 --sbr-popup-accent-100: oklch(0.95 0.05 var(--sbr-popup-accent-hue));
146 --sbr-popup-accent-200: #c7d2fe;
147 --sbr-popup-accent-200: oklch(0.9 0.1 var(--sbr-popup-accent-hue));
148 --sbr-popup-accent-300: #a5b4fc;
149 --sbr-popup-accent-300: oklch(0.85 0.15 var(--sbr-popup-accent-hue));
150 --sbr-popup-accent-400: #818cf8;
151 --sbr-popup-accent-400: oklch(0.75 0.2 var(--sbr-popup-accent-hue));
152 --sbr-popup-accent-500: #6366f1;
153 --sbr-popup-accent-500: oklch(0.65 0.25 var(--sbr-popup-accent-hue));
154 --sbr-popup-accent-600: #4f46e5;
155 --sbr-popup-accent-600: oklch(0.55 0.25 var(--sbr-popup-accent-hue));
156 --sbr-popup-accent-700: #4338ca;
157 --sbr-popup-accent-700: oklch(0.45 0.2 var(--sbr-popup-accent-hue));
158 --sbr-popup-accent-800: #3730a3;
159 --sbr-popup-accent-800: oklch(0.35 0.15 var(--sbr-popup-accent-hue));
160 --sbr-popup-accent-900: #312e81;
161 --sbr-popup-accent-900: oklch(0.25 0.1 var(--sbr-popup-accent-hue));
162 --sbr-popup-accent-950: #1e1b4b;
163 --sbr-popup-accent-950: oklch(0.15 0.05 var(--sbr-popup-accent-hue));
164
165 /* Muted accent color shades - hex fallback + OKLCH (11 tokens) */
166 --sbr-popup-accent-muted-50: #fafafa;
167 --sbr-popup-accent-muted-50: oklch(0.99 0.005 var(--sbr-popup-accent-hue));
168 --sbr-popup-accent-muted-100: #f1f2f9;
169 --sbr-popup-accent-muted-100: oklch(0.95 0.025 var(--sbr-popup-accent-hue));
170 --sbr-popup-accent-muted-200: #e2e4f0;
171 --sbr-popup-accent-muted-200: oklch(0.9 0.05 var(--sbr-popup-accent-hue));
172 --sbr-popup-accent-muted-300: #d0d4e8;
173 --sbr-popup-accent-muted-300: oklch(0.85 0.075 var(--sbr-popup-accent-hue));
174 --sbr-popup-accent-muted-400: #a8aed4;
175 --sbr-popup-accent-muted-400: oklch(0.75 0.1 var(--sbr-popup-accent-hue));
176 --sbr-popup-accent-muted-500: #8087c0;
177 --sbr-popup-accent-muted-500: oklch(0.65 0.125 var(--sbr-popup-accent-hue));
178 --sbr-popup-accent-muted-600: #6269a8;
179 --sbr-popup-accent-muted-600: oklch(0.55 0.125 var(--sbr-popup-accent-hue));
180 --sbr-popup-accent-muted-700: #4d5390;
181 --sbr-popup-accent-muted-700: oklch(0.45 0.1 var(--sbr-popup-accent-hue));
182 --sbr-popup-accent-muted-800: #3a3f74;
183 --sbr-popup-accent-muted-800: oklch(0.35 0.075 var(--sbr-popup-accent-hue));
184 --sbr-popup-accent-muted-900: #2a2e58;
185 --sbr-popup-accent-muted-900: oklch(0.25 0.05 var(--sbr-popup-accent-hue));
186 --sbr-popup-accent-muted-950: #1a1d3c;
187 --sbr-popup-accent-muted-950: oklch(0.15 0.025 var(--sbr-popup-accent-hue));
188
189 /* ========================================================================
190 SEMANTIC TOKENS - Theme-aware design tokens
191 These are the ONLY tokens that should be used in component styles.
192 Themes override these values to change the entire look in one place.
193 ======================================================================== */
194
195 /* Text colors */
196 --sbr-popup-text: var(--sbr-popup-zinc-900);
197 --sbr-popup-text-muted: var(--sbr-popup-zinc-600);
198 --sbr-popup-text-meta: var(--sbr-popup-zinc-500);
199
200 /* Background colors */
201 --sbr-popup-bg-card: var(--sbr-popup-white);
202 --sbr-popup-bg-inner: var(--sbr-popup-accent-700);
203 --sbr-popup-bg-inner-hover: var(--sbr-popup-accent-800);
204
205 /* Star colors */
206 --sbr-popup-star-fill: var(--sbr-popup-accent-600);
207 --sbr-popup-star-empty: var(--sbr-popup-zinc-200);
208
209 /* Avatar */
210 --sbr-popup-avatar-bg: var(--sbr-popup-zinc-200);
211
212 /* Provider badge */
213 --sbr-popup-badge-bg: var(--sbr-popup-white);
214 --sbr-popup-badge-border: var(--sbr-popup-white);
215 --sbr-popup-badge-icon: var(--sbr-popup-accent-600);
216
217 /* Links and interactive elements */
218 --sbr-popup-link-text: var(--sbr-popup-zinc-800);
219 --sbr-popup-link-hover-text: var(--sbr-popup-white);
220 --sbr-popup-link-hover-bg: var(--sbr-popup-accent-600);
221
222 /* Powered by footer */
223 --sbr-popup-powered-text: var(--sbr-popup-white);
224 --sbr-popup-powered-bg: transparent;
225
226 /* Close button */
227 --sbr-popup-close-bg: var(--sbr-popup-accent-600);
228 --sbr-popup-close-bg-hover: var(--sbr-popup-accent-700);
229 }
230
231 .sbr-review-alert *,
232 .sbr-review-alert *::before,
233 .sbr-review-alert *::after {
234 box-sizing: border-box;
235 }
236
237 /* ==========================================================================
238 Popup Container for Preview
239 ========================================================================== */
240
241 .sbr-review-alert-container {
242 position: absolute;
243 bottom: 24px;
244 right: 24px;
245 display: flex;
246 flex-direction: column;
247 align-items: flex-end;
248 }
249
250 .sbr-review-alert--bottom-left + .sbr-review-alert-container,
251 .sbr-review-alert-container:has(.sbr-review-alert--bottom-left) {
252 right: auto;
253 left: 24px;
254 align-items: flex-start;
255 }
256
257 /* Main popup container - ensure right alignment */
258 .sbr-review-alert {
259 display: flex;
260 flex-direction: column;
261 align-items: flex-end;
262 transition: all 300ms ease;
263 }
264
265 .sbr-review-alert--bottom-left {
266 align-items: flex-start;
267 }
268
269 /* Keyboard focus styles for expand trigger */
270 .sbr-review-alert:focus-visible {
271 outline: 2px solid var(--sbr-popup-accent-600);
272 outline-offset: 4px;
273 border-radius: var(--sbr-popup-radius-outer);
274 }
275
276 /* ==========================================================================
277 Wrapper - Hover Effect Container
278 ========================================================================== */
279
280 .sbr-review-alert__wrapper {
281 border-radius: var(--sbr-popup-radius-outer);
282 transition: transform var(--sbr-popup-transition), opacity 300ms ease, filter 300ms ease;
283 animation: sbr-popup-slide-in 300ms ease;
284 /* No transform-origin here - hover scale should grow from center (default) */
285 }
286
287 @keyframes sbr-popup-slide-in {
288 from {
289 opacity: 0;
290 transform: translateY(64px);
291 filter: blur(4px);
292 }
293 to {
294 opacity: 1;
295 transform: translateY(0);
296 filter: blur(0);
297 }
298 }
299
300 .sbr-review-alert__wrapper:hover {
301 transform: scale(1.02);
302 }
303
304 .sbr-review-alert__wrapper:active {
305 transform: scale(0.98);
306 }
307
308 /* Note: When collapsing from expanded state, the expanded content plays exit animation.
309 After 300ms, React re-renders the collapsed content which has the entrance animation
310 automatically via .sbr-review-alert__wrapper's animation property. */
311
312 /* ==========================================================================
313 Inner Container - Accent Border Card
314 ========================================================================== */
315
316 .sbr-review-alert__inner {
317 width: var(--sbr-popup-width);
318 max-width: 100%;
319 border-radius: var(--sbr-popup-radius-outer);
320 box-shadow: var(--sbr-popup-shadow);
321 padding: 4px;
322 overflow: hidden;
323 /* Note: Avoid "transition: all" here - it animates width changes during
324 expand/collapse state switches, causing a left-shift glitch */
325 transition: background-color var(--sbr-popup-transition), box-shadow var(--sbr-popup-transition);
326 backdrop-filter: blur(12px);
327 -webkit-backdrop-filter: blur(12px);
328 cursor: pointer;
329 }
330
331 /* With Powered By - solid accent background */
332 .sbr-review-alert--has-powered-by .sbr-review-alert__inner {
333 background-color: var(--sbr-popup-bg-inner);
334 }
335
336 .sbr-review-alert--has-powered-by .sbr-review-alert__wrapper:hover .sbr-review-alert__inner {
337 background-color: var(--sbr-popup-bg-inner-hover);
338 }
339
340 /* Without Powered By - semi-transparent accent */
341 .sbr-review-alert:not(.sbr-review-alert--has-powered-by) .sbr-review-alert__inner {
342 background-color: color-mix(in oklch, var(--sbr-popup-accent-700) 30%, transparent);
343 }
344
345 /* ==========================================================================
346 Close Button - Collapsed View Dismiss
347 ========================================================================== */
348
349 .sbr-review-alert__close {
350 position: absolute;
351 top: 8px;
352 right: 8px;
353 width: 24px;
354 height: 24px;
355 padding: 0;
356 border: none;
357 border-radius: 9999px;
358 background-color: transparent;
359 cursor: pointer;
360 display: flex;
361 align-items: center;
362 justify-content: center;
363 opacity: 0;
364 transition: opacity 200ms, background-color 200ms, transform 200ms;
365 z-index: 10;
366 }
367
368 .sbr-review-alert__close svg {
369 width: 14px;
370 height: 14px;
371 color: var(--sbr-popup-text-muted);
372 }
373
374 /* Show on hover/focus of the popup */
375 .sbr-review-alert:hover .sbr-review-alert__close,
376 .sbr-review-alert:focus-within .sbr-review-alert__close,
377 .sbr-review-alert__close:focus {
378 opacity: 1;
379 }
380
381 .sbr-review-alert__close:hover {
382 background-color: var(--sbr-popup-close-bg-subtle, rgba(0, 0, 0, 0.1));
383 transform: scale(1.1);
384 }
385
386 .sbr-review-alert__close:hover svg {
387 color: var(--sbr-popup-text);
388 }
389
390 .sbr-review-alert__close:active {
391 transform: scale(0.95);
392 }
393
394 .sbr-review-alert__close:focus-visible {
395 opacity: 1;
396 outline: 2px solid var(--sbr-popup-accent);
397 outline-offset: 2px;
398 }
399
400 /* Hide close button when expanded (expanded view has its own close) */
401 .sbr-review-alert--expanded-state .sbr-review-alert__close {
402 display: none;
403 }
404
405 /* ==========================================================================
406 Main Card - White Content Container
407 ========================================================================== */
408
409 .sbr-review-alert__card {
410 background-color: var(--sbr-popup-bg-card);
411 padding: 16px 32px 16px 24px;
412 border-radius: var(--sbr-popup-radius-inner);
413 position: relative;
414 }
415
416 /* ==========================================================================
417 Date Label - Top Right Position
418 ========================================================================== */
419
420 .sbr-review-alert__date {
421 position: absolute;
422 top: 20px;
423 right: 20px;
424 font-weight: 600;
425 font-size: 14px;
426 line-height: 20px;
427 color: var(--sbr-popup-text-meta);
428 }
429
430 /* ==========================================================================
431 Content Row - Horizontal Layout
432 ========================================================================== */
433
434 .sbr-review-alert__content-row {
435 display: flex;
436 align-items: flex-start;
437 gap: 24px;
438 }
439
440 /* Aggregate View - Center align content */
441 .sbr-review-alert__content-row--aggregate {
442 align-items: flex-start;
443 }
444
445 /* ==========================================================================
446 Aggregate View - Specific Inner Container
447 Narrower width for aggregate view as per design
448 ========================================================================== */
449
450 .sbr-review-alert--aggregate .sbr-review-alert__inner {
451 width: auto;
452 min-width: 304px; /* 19rem - matches prototype */
453 }
454
455 /* Aggregate Card - Simpler padding and centered content */
456 .sbr-review-alert--aggregate .sbr-review-alert__card {
457 padding: 16px;
458 display: flex;
459 justify-content: center;
460 }
461
462 /* ==========================================================================
463 Aggregate View - Rating Number (replaces avatar)
464 ========================================================================== */
465
466 .sbr-review-alert__rating-number {
467 flex-shrink: 0;
468 display: flex;
469 align-items: flex-start;
470 justify-content: center;
471 }
472
473 .sbr-review-alert__rating-value {
474 font-family: var(--sbr-popup-font);
475 font-size: 36px; /* 2.25rem - matches prototype */
476 font-weight: 600; /* semibold - matches prototype */
477 line-height: 1;
478 color: var(--sbr-popup-text);
479 }
480
481 /* SMASH-782: Booking native 0-10 score — shown INSTEAD of stars for Booking
482 reviews in the compact card and expanded view. Byte-for-byte the same look as
483 the single feed's per-card score (.sb-item-rating-score / -badge / -label):
484 blue badge + grey word label, with Booking's signature square-bottom-left
485 badge corner. Blue is Booking's brand (not the theme accent) so it reads as a
486 Booking score across Light/Dark/Minimal. */
487 .sbr-review-alert__score {
488 display: flex;
489 align-self: flex-start; /* hug content in the flex-column layout, don't stretch */
490 align-items: center;
491 gap: 8px;
492 }
493
494 .sbr-review-alert__score-badge {
495 display: inline-flex;
496 align-items: center;
497 justify-content: center;
498 padding: 6px 4px;
499 border-radius: 6px 6px 6px 0; /* Booking signature: square bottom-left */
500 font-family: var(--sbr-popup-font);
501 font-weight: 400;
502 font-size: 14px;
503 line-height: 14px;
504 color: #fff;
505 }
506
507 .sbr-review-alert__score-badge--booking {
508 background-color: #003580; /* Booking.com brand blue */
509 }
510
511 .sbr-review-alert__score-label {
512 font-family: var(--sbr-popup-font);
513 font-size: 14px;
514 font-weight: 400;
515 line-height: 1.3;
516 color: #8c8f9a; /* matches feed .sb-item-rating-score-label */
517 }
518
519 .sbr-review-alert__expanded-score {
520 margin-bottom: 6px;
521 }
522
523 /* Dark theme rating value - now handled by semantic tokens */
524
525 /* ==========================================================================
526 Aggregate View - Stars and Count Section
527 ========================================================================== */
528
529 .sbr-review-alert__stars-and-count {
530 flex: 1;
531 display: flex;
532 flex-direction: column;
533 gap: 12px;
534 padding-top: 8px; /* 0.5rem - matches prototype */
535 }
536
537 /* Aggregate content - match prototype styling */
538 .sbr-review-alert--aggregate .sbr-review-alert__content {
539 padding-top: 8px; /* 0.5rem - matches prototype */
540 gap: 12px; /* 0.75rem - matches prototype */
541 }
542
543 /* Remove padding-top when rating is hidden */
544 .sbr-review-alert--aggregate .sbr-review-alert__content--no-rating {
545 padding-top: 0;
546 }
547
548 /* Aggregate view stars - no extra margin (handled by gap) */
549 .sbr-review-alert--aggregate .sbr-review-alert__stars {
550 margin-bottom: 0;
551 }
552
553 /* Aggregate view all link - remove margins since content uses gap */
554 .sbr-review-alert--aggregate .sbr-review-alert__view-all-link {
555 margin-top: 0;
556 margin-bottom: 0;
557 }
558
559 /* Aggregate text - "X Total Reviews" with hover fill effect */
560 .sbr-review-alert__aggregate-text {
561 position: relative;
562 width: fit-content;
563 display: flex;
564 align-items: center;
565 gap: 4px;
566 font-family: var(--sbr-popup-font);
567 font-size: 14px;
568 font-weight: 600;
569 color: var(--sbr-popup-link-text);
570 line-height: 1.25;
571 z-index: 1;
572 transition: all 200ms;
573 cursor: pointer;
574 }
575
576 /* Hover fill background for aggregate text */
577 .sbr-review-alert__aggregate-text::before {
578 content: "";
579 position: absolute;
580 top: -6px;
581 bottom: -6px;
582 left: -6px;
583 right: -6px;
584 border-radius: 8px;
585 background-color: var(--sbr-popup-link-hover-bg);
586 transform: scale(0.9);
587 opacity: 0;
588 filter: blur(4px);
589 transition: all 200ms;
590 z-index: -1;
591 }
592
593 /* Hover states - trigger on inner hover */
594 .sbr-review-alert__inner:hover .sbr-review-alert__aggregate-text {
595 color: var(--sbr-popup-link-hover-text);
596 }
597
598 .sbr-review-alert__inner:hover .sbr-review-alert__aggregate-text::before {
599 transform: scaleX(1);
600 opacity: 1;
601 filter: blur(0);
602 }
603
604 /* Aggregate text chevron */
605 .sbr-review-alert__aggregate-text .sbr-review-alert__chevron {
606 width: 12px;
607 height: 12px;
608 }
609
610 /* Dark theme aggregate text - now handled by semantic tokens */
611
612 /* ==========================================================================
613 Avatar with Provider Badge
614 ========================================================================== */
615
616 .sbr-review-alert__avatar-wrapper {
617 position: relative;
618 flex-shrink: 0;
619 }
620
621 .sbr-review-alert__avatar {
622 width: var(--sbr-popup-avatar-size);
623 height: var(--sbr-popup-avatar-size);
624 border-radius: 9999px;
625 overflow: hidden;
626 background-color: var(--sbr-popup-avatar-bg);
627 object-fit: cover;
628 }
629
630 /* Provider Badge - Bottom-right of avatar */
631 .sbr-review-alert__provider-badge {
632 position: absolute;
633 bottom: -2px;
634 right: -2px;
635 width: var(--sbr-popup-provider-badge-size);
636 height: var(--sbr-popup-provider-badge-size);
637 background-color: var(--sbr-popup-badge-bg);
638 border-radius: 9999px;
639 display: flex;
640 align-items: center;
641 justify-content: center;
642 border: 2px solid var(--sbr-popup-badge-border);
643 overflow: hidden; /* clip full-color square logos (Booking/AliExpress) to the round badge */
644 }
645
646 .sbr-review-alert__provider-badge img,
647 .sbr-review-alert__provider-badge svg,
648 .sbr-review-alert__provider-badge span {
649 width: 22px;
650 height: 22px;
651 color: var(--sbr-popup-badge-icon);
652 }
653
654 /* ==========================================================================
655 Provider Badge Icons - Theme-aware coloring
656
657 All provider SVG icons should match the star rating colors per theme:
658 - Light/Minimal: Uses accent/muted colors (same as stars)
659 - Dark/Minimal-Dark: Uses white (same as stars)
660
661 Force SVG paths to inherit the semantic --sbr-popup-badge-icon token
662 which is already theme-aware and matches star colors.
663 ========================================================================== */
664
665 /* Force provider badge SVG paths to use theme-aware color.
666 Background elements (rects, circles) are hidden to ensure single-color icons
667 work properly across all themes. This prevents multi-layer icons (e.g., WooCommerce,
668 Facebook, TripAdvisor, Zomato) from having invisible foregrounds when both
669 background and foreground are forced to the same color.
670
671 Exception: providers whose icon is a full-color brand TILE (colored background
672 + contrasting foreground) must keep their original colors and NOT have their
673 background stripped — the flatten collapses bg+fg to one color, hiding the
674 logo:
675 - Booking.com — <path> blue tile + white "B".
676 - AliExpress — single <rect> filled with an embedded image pattern.
677 - Facebook — blue circle + white "f" (was a solid blue blob on light).
678 - Zomato — red <rect> tile + white wordmark (was faint/invisible).
679 All excluded so their real logos render (matching the feed), clipped to the
680 round badge via overflow:hidden above. Monochrome/line icons (google, yelp,
681 tripadvisor, trustpilot, woocommerce, edd, wordpress.org, airbnb) still get
682 the theme-aware single-color treatment. */
683 .sbr-review-alert__provider-badge:not([data-provider="booking"]):not([data-provider="aliexpress"]):not([data-provider="facebook"]):not([data-provider="zomato"]) svg,
684 .sbr-review-alert__provider-badge:not([data-provider="booking"]):not([data-provider="aliexpress"]):not([data-provider="facebook"]):not([data-provider="zomato"]) svg path,
685 .sbr-review-alert__provider-badge:not([data-provider="booking"]):not([data-provider="aliexpress"]):not([data-provider="facebook"]):not([data-provider="zomato"]) svg g {
686 fill: var(--sbr-popup-badge-icon) !important;
687 }
688
689 /* Hide background elements in provider badges - many icons have colored
690 backgrounds (rects, circles) that conflict with single-color theming.
691 Booking / AliExpress / Facebook / Zomato excluded (full-color logos kept). */
692 .sbr-review-alert__provider-badge:not([data-provider="booking"]):not([data-provider="aliexpress"]):not([data-provider="facebook"]):not([data-provider="zomato"]) svg > rect,
693 .sbr-review-alert__provider-badge:not([data-provider="booking"]):not([data-provider="aliexpress"]):not([data-provider="facebook"]):not([data-provider="zomato"]) svg > circle,
694 .sbr-review-alert__provider-badge:not([data-provider="booking"]):not([data-provider="aliexpress"]):not([data-provider="facebook"]):not([data-provider="zomato"]) svg g > rect:first-child,
695 .sbr-review-alert__provider-badge:not([data-provider="booking"]):not([data-provider="aliexpress"]):not([data-provider="facebook"]):not([data-provider="zomato"]) svg g > circle:first-child {
696 fill: transparent !important;
697 }
698
699 /* ==========================================================================
700 Content Section - Right Side
701 ========================================================================== */
702
703 .sbr-review-alert__content {
704 flex: 1;
705 display: flex;
706 flex-direction: column;
707 gap: 8px;
708 padding-top: 4px;
709 }
710
711 /* Recent Reviews: Add padding when rating is hidden to avoid overlap with date */
712 .sbr-review-alert__content--no-rating {
713 padding-top: 20px;
714 }
715
716 /* ==========================================================================
717 Stars Row
718 ========================================================================== */
719
720 .sbr-review-alert__stars {
721 display: flex;
722 margin-bottom: 12px;
723 gap: 2px;
724 }
725
726 /* Remove bottom margin in aggregate view (handled by parent gap) */
727 .sbr-review-alert__stars-and-count .sbr-review-alert__stars {
728 margin-bottom: 0;
729 }
730
731 .sbr-review-alert__star {
732 display: inline-flex;
733 width: var(--sbr-popup-star-size);
734 height: var(--sbr-popup-star-size);
735 color: var(--sbr-popup-star-fill);
736 flex-shrink: 0;
737 transition: all var(--sbr-popup-transition);
738 }
739
740 .sbr-review-alert__star svg {
741 width: 100%;
742 height: 100%;
743 fill: currentColor;
744 }
745
746 .sbr-review-alert__star span {
747 display: inline-flex;
748 width: 100%;
749 height: 100%;
750 }
751
752 .sbr-review-alert__star--empty {
753 color: var(--sbr-popup-star-empty);
754 }
755
756 /* Half star (e.g. 4.5): base star empty-coloured, left 50% overlaid with fill. */
757 .sbr-review-alert__star--half {
758 position: relative;
759 color: var(--sbr-popup-star-empty);
760 }
761
762 .sbr-review-alert__star--half .sbr-review-alert__star-half {
763 position: absolute;
764 inset: 0;
765 overflow: hidden;
766 color: var(--sbr-popup-star-fill);
767 /* Reveal the left half of a FULL-SIZE star (mirrors the feed header's
768 half-star — a full star clipped to 50%, not a shrunk one). Full-size
769 overlay so the inner icon never gets flex-shrunk; clip shows the half. */
770 clip-path: inset(0 50% 0 0);
771 }
772
773 /* ==========================================================================
774 Heading - "[Name] left us a review"
775 ========================================================================== */
776
777 .sbr-review-alert__heading {
778 line-height: 1;
779 font-weight: 600;
780 color: var(--sbr-popup-text);
781 font-size: 16px;
782 margin: 0;
783 }
784
785 .sbr-review-alert__reviewer-text {
786 line-height: 1;
787 font-weight: 600;
788 color: var(--sbr-popup-text);
789 font-size: 16px;
790 }
791
792 .sbr-review-alert__reviewer-text strong {
793 font-weight: 600;
794 }
795
796 /* ==========================================================================
797 Review Text - 2-line clamp
798 ========================================================================== */
799
800 .sbr-review-alert__review-text {
801 font-size: 14px;
802 line-height: 20px;
803 color: var(--sbr-popup-text-muted);
804 letter-spacing: 0;
805 display: -webkit-box;
806 -webkit-line-clamp: 2;
807 -webkit-box-orient: vertical;
808 overflow: hidden;
809 margin: 0;
810 }
811
812 /* ==========================================================================
813 View All Link - With Hover Fill Effect
814 ========================================================================== */
815
816 .sbr-review-alert__view-all-link {
817 position: relative;
818 width: fit-content;
819 display: flex;
820 margin-top: 8px;
821 margin-bottom: 8px;
822 font-size: 14px;
823 line-height: 1;
824 font-weight: 600;
825 align-items: center;
826 gap: 4px;
827 color: var(--sbr-popup-link-text);
828 z-index: 1;
829 transition: all var(--sbr-popup-transition);
830 text-decoration: none;
831 cursor: pointer;
832 }
833
834 /* Hover fill background */
835 .sbr-review-alert__view-all-link::before {
836 content: "";
837 position: absolute;
838 top: -6px;
839 bottom: -6px;
840 left: -6px;
841 right: -6px;
842 border-radius: 8px;
843 background-color: var(--sbr-popup-link-hover-bg);
844 transform: scale(0.9);
845 opacity: 0;
846 filter: blur(4px);
847 transition: all var(--sbr-popup-transition);
848 z-index: -1;
849 }
850
851 /* Hover states - trigger on inner hover */
852 .sbr-review-alert__inner:hover .sbr-review-alert__view-all-link {
853 color: var(--sbr-popup-link-hover-text);
854 }
855
856 .sbr-review-alert__inner:hover .sbr-review-alert__view-all-link::before {
857 background-color: var(--sbr-popup-link-hover-bg);
858 transform: scaleX(1);
859 opacity: 1;
860 filter: blur(0);
861 }
862
863 .sbr-review-alert__chevron {
864 width: 12px;
865 height: 12px;
866 display: inline-flex;
867 }
868
869 .sbr-review-alert__chevron svg {
870 width: 100%;
871 height: 100%;
872 }
873
874 /* ==========================================================================
875 Powered By Footer
876 ========================================================================== */
877
878 .sbr-review-alert__powered-by {
879 padding: 8px 16px;
880 display: flex;
881 align-items: center;
882 justify-content: center;
883 gap: 8px;
884 }
885
886 .sbr-review-alert__powered-text {
887 font-size: 14px;
888 line-height: 20px;
889 color: var(--sbr-popup-powered-text);
890 }
891
892 .sbr-review-alert__powered-link {
893 display: inline-flex;
894 align-items: center;
895 gap: 4px;
896 color: var(--sbr-popup-powered-text);
897 text-decoration: none;
898 font-weight: 600;
899 font-size: 14px;
900 transition: opacity 0.15s ease;
901 }
902
903 .sbr-review-alert__powered-link:hover {
904 opacity: 0.85;
905 }
906
907 .sbr-review-alert__logo {
908 height: 24px;
909 flex-shrink: 0;
910 display: inline-flex;
911 align-items: center;
912 }
913
914 .sbr-review-alert__logo svg,
915 .sbr-review-alert__logo img {
916 height: 100%;
917 width: auto;
918 }
919
920 /* ==========================================================================
921 Theme: Light
922 ========================================================================== */
923
924 .sbr-review-alert--light {
925 /* Light theme - uses base styles (default) */
926 }
927
928 /* Light - Card with powered-by: no bottom radius */
929 /* Minimal themes: remove bottom border-radius when powered-by is visible */
930 .sbr-review-alert--minimal.sbr-review-alert--has-powered-by .sbr-review-alert__card,
931 .sbr-review-alert--minimal-dark.sbr-review-alert--has-powered-by .sbr-review-alert__card {
932 border-radius: var(--sbr-popup-radius-inner) var(--sbr-popup-radius-inner) 0 0;
933 }
934
935 /* Compact mode: restore full border-radius (powered-by is hidden in compact mode) */
936 .sbr-review-alert--compact.sbr-review-alert--minimal.sbr-review-alert--has-powered-by .sbr-review-alert__card,
937 .sbr-review-alert--compact.sbr-review-alert--minimal-dark.sbr-review-alert--has-powered-by .sbr-review-alert__card {
938 border-radius: var(--sbr-popup-radius-inner);
939 }
940
941 /* ==========================================================================
942 Theme: Minimal
943 Uses muted accent colors and translucent backgrounds
944 Hides review text, simpler hover effects
945 ========================================================================== */
946
947 .sbr-review-alert--minimal {
948 /* Minimal theme semantic token overrides */
949 --sbr-popup-text: color-mix(in oklch, var(--sbr-popup-accent-muted-950) 80%, transparent);
950 --sbr-popup-text-muted: color-mix(in oklch, var(--sbr-popup-accent-muted-950) 70%, transparent);
951 --sbr-popup-text-meta: color-mix(in oklch, var(--sbr-popup-accent-muted-900) 50%, transparent);
952 --sbr-popup-bg-card: var(--sbr-popup-white);
953 --sbr-popup-bg-inner: color-mix(in oklch, var(--sbr-popup-accent-muted-400) 50%, transparent);
954 --sbr-popup-bg-inner-hover: color-mix(in oklch, var(--sbr-popup-accent-muted-500) 50%, transparent);
955 --sbr-popup-star-fill: color-mix(in oklch, var(--sbr-popup-accent-muted-950) 80%, transparent);
956 --sbr-popup-star-empty: var(--sbr-popup-accent-muted-300);
957 --sbr-popup-avatar-bg: var(--sbr-popup-accent-muted-100);
958 --sbr-popup-badge-bg: var(--sbr-popup-white);
959 --sbr-popup-badge-border: var(--sbr-popup-white);
960 --sbr-popup-badge-icon: color-mix(in oklch, var(--sbr-popup-accent-muted-950) 80%, transparent);
961 --sbr-popup-link-text: var(--sbr-popup-accent-700);
962 --sbr-popup-link-hover-text: var(--sbr-popup-accent-muted-950);
963 --sbr-popup-link-hover-bg: transparent;
964 --sbr-popup-powered-text: var(--sbr-popup-accent-muted-900);
965 --sbr-popup-powered-bg: var(--sbr-popup-white);
966 --sbr-popup-close-bg: var(--sbr-popup-accent-900);
967 --sbr-popup-close-bg-hover: var(--sbr-popup-accent-600);
968 }
969
970 /* Minimal - Inner container uses translucent muted accent + blur */
971 .sbr-review-alert--minimal .sbr-review-alert__inner {
972 background-color: var(--sbr-popup-bg-inner);
973 backdrop-filter: saturate(4) blur(4px);
974 -webkit-backdrop-filter: saturate(4) blur(4px);
975 }
976
977 /* Minimal - Same inner bg with/without powered-by (semantic token) */
978 .sbr-review-alert--minimal.sbr-review-alert--has-powered-by .sbr-review-alert__inner {
979 background-color: var(--sbr-popup-bg-inner);
980 }
981
982 .sbr-review-alert--minimal.sbr-review-alert--has-powered-by .sbr-review-alert__wrapper:hover .sbr-review-alert__inner {
983 background-color: var(--sbr-popup-bg-inner-hover);
984 }
985
986 /* Minimal - date, avatar, stars, badge, heading, text colors now handled by semantic tokens */
987
988 /* Minimal - View all link - no fill effect (hide ::before) */
989 .sbr-review-alert--minimal .sbr-review-alert__view-all-link::before {
990 display: none;
991 }
992
993 .sbr-review-alert--minimal .sbr-review-alert__inner:hover .sbr-review-alert__view-all-link {
994 color: var(--sbr-popup-link-hover-text);
995 }
996
997 /* Minimal - Aggregate text - no fill effect (hide ::before) */
998 .sbr-review-alert--minimal .sbr-review-alert__aggregate-text::before {
999 display: none;
1000 }
1001
1002 .sbr-review-alert--minimal .sbr-review-alert__inner:hover .sbr-review-alert__aggregate-text {
1003 color: var(--sbr-popup-link-hover-text);
1004 }
1005
1006 /* Minimal - rating value, powered text/link colors now handled by semantic tokens */
1007
1008 /* Minimal - Powered by footer - white background with subtle border */
1009 .sbr-review-alert--minimal .sbr-review-alert__powered-by {
1010 background-color: var(--sbr-popup-powered-bg);
1011 border-top: 1px solid color-mix(in oklch, var(--sbr-popup-accent-muted-500) 20%, transparent);
1012 border-radius: 0 0 12px 12px;
1013 }
1014
1015 /* Minimal - powered text/link colors handled by semantic tokens */
1016
1017 /* Minimal - Logo SVG paths are white by default (smashballoon-logo-white),
1018 override to show visible colors on white background */
1019 .sbr-review-alert--minimal .sbr-review-alert__logo svg path {
1020 fill: var(--sbr-popup-accent-muted-800);
1021 }
1022
1023 /* ==========================================================================
1024 Theme: Minimal Dark
1025 Structure: Wrapper has translucent outer frame, Inner has gradient that
1026 covers both card and powered-by for seamless gradient flow
1027 ========================================================================== */
1028
1029 .sbr-review-alert--minimal-dark {
1030 /* Minimal Dark theme semantic token overrides */
1031 --sbr-popup-text: var(--sbr-popup-white);
1032 --sbr-popup-text-muted: rgba(255, 255, 255, 0.7);
1033 --sbr-popup-text-meta: rgba(255, 255, 255, 0.5);
1034 --sbr-popup-bg-card: transparent;
1035 --sbr-popup-bg-inner: color-mix(in oklch, var(--sbr-popup-accent-muted-400) 50%, transparent);
1036 --sbr-popup-bg-inner-hover: var(--sbr-popup-accent-muted-900);
1037 --sbr-popup-star-fill: var(--sbr-popup-white);
1038 --sbr-popup-star-empty: var(--sbr-popup-zinc-600);
1039 --sbr-popup-avatar-bg: rgba(255, 255, 255, 0.2);
1040 --sbr-popup-badge-bg: var(--sbr-popup-accent-muted-950);
1041 --sbr-popup-badge-border: var(--sbr-popup-accent-muted-950);
1042 --sbr-popup-badge-icon: var(--sbr-popup-white);
1043 --sbr-popup-link-text: var(--sbr-popup-accent-300);
1044 --sbr-popup-link-hover-text: var(--sbr-popup-white);
1045 --sbr-popup-link-hover-bg: transparent;
1046 --sbr-popup-powered-text: rgba(255, 255, 255, 0.7);
1047 --sbr-popup-powered-bg: transparent;
1048 --sbr-popup-close-bg: var(--sbr-popup-accent-700);
1049 --sbr-popup-close-bg-hover: var(--sbr-popup-accent-600);
1050 }
1051
1052 /* Minimal Dark - Wrapper has translucent outer frame with blur */
1053 .sbr-review-alert--minimal-dark .sbr-review-alert__wrapper {
1054 background-color: color-mix(in oklch, var(--sbr-popup-accent-muted-400) 50%, transparent);
1055 backdrop-filter: saturate(4) blur(12px);
1056 -webkit-backdrop-filter: saturate(4) blur(12px);
1057 border-radius: 16px;
1058 padding: 4px;
1059 }
1060
1061 /* Minimal Dark - Wrapper hover - subtle accent background */
1062 .sbr-review-alert--minimal-dark .sbr-review-alert__wrapper:hover {
1063 background-color: var(--sbr-popup-accent-muted-900);
1064 }
1065
1066 /* Minimal Dark - Inner carries the gradient (covers both card and powered-by) */
1067 .sbr-review-alert--minimal-dark .sbr-review-alert__inner {
1068 background: linear-gradient(
1069 to bottom,
1070 var(--sbr-popup-accent-muted-950),
1071 color-mix(in oklch, var(--sbr-popup-zinc-950) 70%, transparent)
1072 );
1073 border-radius: 12px;
1074 }
1075
1076 /* Minimal Dark - Card is transparent to show inner gradient */
1077 .sbr-review-alert--minimal-dark .sbr-review-alert__card {
1078 background: transparent;
1079 }
1080
1081 /* Minimal Dark - When has powered-by, card has no bottom radius */
1082 .sbr-review-alert--minimal-dark.sbr-review-alert--has-powered-by .sbr-review-alert__card {
1083 border-radius: 12px 12px 0 0;
1084 }
1085
1086 /* Minimal Dark - Compact mode: restore full border-radius */
1087 .sbr-review-alert--compact.sbr-review-alert--minimal-dark.sbr-review-alert--has-powered-by .sbr-review-alert__card {
1088 border-radius: 12px;
1089 }
1090
1091 /* Minimal Dark - Powered by footer - transparent to continue gradient from inner */
1092 .sbr-review-alert--minimal-dark .sbr-review-alert__powered-by {
1093 background: transparent;
1094 border-top: 1px solid color-mix(in oklch, var(--sbr-popup-accent-muted-500) 20%, transparent);
1095 border-radius: 0 0 12px 12px;
1096 }
1097
1098 /* Minimal Dark - powered text, rating, stars now handled by semantic tokens */
1099
1100 /* Minimal Dark - no fill effect for links (hide ::before) */
1101 .sbr-review-alert--minimal-dark .sbr-review-alert__aggregate-text::before,
1102 .sbr-review-alert--minimal-dark .sbr-review-alert__view-all-link::before {
1103 display: none;
1104 }
1105
1106 .sbr-review-alert--minimal-dark .sbr-review-alert__inner:hover .sbr-review-alert__aggregate-text,
1107 .sbr-review-alert--minimal-dark .sbr-review-alert__inner:hover .sbr-review-alert__view-all-link {
1108 color: var(--sbr-popup-link-hover-text);
1109 }
1110
1111 /* Minimal Dark - text, date, avatar, badge colors now handled by semantic tokens */
1112
1113 /* Minimal Dark - All SVG icons white */
1114 /* Using simple global rule with specific overrides for browser compatibility (pre-Chrome 88/Firefox 84) */
1115 .sbr-review-alert--minimal-dark svg,
1116 .sbr-review-alert--minimal-dark svg path {
1117 color: var(--sbr-popup-white);
1118 }
1119
1120 /* Minimal Dark - Empty stars use semantic token for contrast */
1121 /* Include svg and svg path targets to override the global SVG color rule above */
1122 .sbr-review-alert--minimal-dark .sbr-review-alert__star--empty,
1123 .sbr-review-alert--minimal-dark .sbr-review-alert__star--empty svg,
1124 .sbr-review-alert--minimal-dark .sbr-review-alert__star--empty svg path,
1125 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-star--empty,
1126 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-star--empty svg,
1127 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-star--empty svg path {
1128 color: var(--sbr-popup-star-empty);
1129 }
1130
1131 /* Minimal Dark - half star: dim the empty BASE the same way --empty above does
1132 (the global `--minimal-dark svg path` white rule otherwise paints the whole star),
1133 then re-assert the left-half fill overlay so 4.5/4.7 shows a real half, not 5 full. */
1134 .sbr-review-alert--minimal-dark .sbr-review-alert__star--half,
1135 .sbr-review-alert--minimal-dark .sbr-review-alert__star--half svg,
1136 .sbr-review-alert--minimal-dark .sbr-review-alert__star--half svg path {
1137 color: var(--sbr-popup-star-empty);
1138 }
1139
1140 .sbr-review-alert--minimal-dark .sbr-review-alert__star--half .sbr-review-alert__star-half,
1141 .sbr-review-alert--minimal-dark .sbr-review-alert__star--half .sbr-review-alert__star-half svg,
1142 .sbr-review-alert--minimal-dark .sbr-review-alert__star--half .sbr-review-alert__star-half svg path {
1143 color: var(--sbr-popup-star-fill);
1144 }
1145
1146 /* Minimal Dark - Chevron uses stroke, not fill */
1147 /* Override global SVG white rule - chevron should inherit text color */
1148 .sbr-review-alert--minimal-dark .sbr-review-alert__chevron svg,
1149 .sbr-review-alert--minimal-dark .sbr-review-alert__chevron svg path {
1150 fill: none;
1151 color: inherit;
1152 stroke: currentColor;
1153 }
1154
1155 /* Minimal Dark - Close button colors */
1156 .sbr-review-alert--minimal-dark .sbr-review-alert__close svg {
1157 color: var(--sbr-popup-zinc-400);
1158 }
1159
1160 .sbr-review-alert--minimal-dark .sbr-review-alert__close:hover {
1161 background-color: rgba(255, 255, 255, 0.1);
1162 }
1163
1164 .sbr-review-alert--minimal-dark .sbr-review-alert__close:hover svg {
1165 color: var(--sbr-popup-white);
1166 }
1167
1168 /* ==========================================================================
1169 Theme: Dark
1170 Dark blue outer (#041F55), lighter blue content (#175CE3), white text/icons
1171 ========================================================================== */
1172
1173 .sbr-review-alert--dark {
1174 /* Dark theme semantic token overrides */
1175 --sbr-popup-text: var(--sbr-popup-white);
1176 --sbr-popup-text-muted: var(--sbr-popup-zinc-300);
1177 --sbr-popup-text-meta: var(--sbr-popup-zinc-400);
1178 --sbr-popup-bg-card: var(--sbr-popup-accent-900);
1179 --sbr-popup-bg-inner: var(--sbr-popup-accent-muted-700);
1180 --sbr-popup-bg-inner-hover: var(--sbr-popup-accent-muted-800);
1181 --sbr-popup-star-fill: var(--sbr-popup-white);
1182 --sbr-popup-star-empty: var(--sbr-popup-zinc-600);
1183 --sbr-popup-avatar-bg: var(--sbr-popup-zinc-700);
1184 --sbr-popup-badge-bg: var(--sbr-popup-accent-900);
1185 --sbr-popup-badge-border: var(--sbr-popup-accent-900);
1186 --sbr-popup-badge-icon: var(--sbr-popup-white);
1187 --sbr-popup-link-text: var(--sbr-popup-zinc-300);
1188 --sbr-popup-link-hover-bg: var(--sbr-popup-accent-800);
1189 --sbr-popup-close-bg: var(--sbr-popup-accent-600);
1190 --sbr-popup-close-bg-hover: var(--sbr-popup-accent-700);
1191 }
1192
1193 /* Dark - Inner (outer container) now uses semantic tokens */
1194 .sbr-review-alert--dark .sbr-review-alert__inner {
1195 background-color: var(--sbr-popup-bg-inner);
1196 }
1197
1198 .sbr-review-alert--dark .sbr-review-alert__wrapper:hover .sbr-review-alert__inner {
1199 background-color: var(--sbr-popup-bg-inner-hover);
1200 }
1201
1202 /* Dark - Card (content area) now uses --sbr-popup-bg-card semantic token */
1203
1204 /* Dark - Wrapper hover - no white background */
1205 .sbr-review-alert--dark .sbr-review-alert__wrapper:hover {
1206 background-color: transparent;
1207 }
1208
1209 /* Dark - avatar, badge, date, text, stars, heading, link colors now handled by semantic tokens */
1210
1211 /* Dark - All SVG icons white */
1212 /* Using simple global rule with specific overrides for browser compatibility (pre-Chrome 88/Firefox 84) */
1213 .sbr-review-alert--dark svg,
1214 .sbr-review-alert--dark svg path {
1215 color: var(--sbr-popup-white);
1216 }
1217
1218 /* Dark - Empty stars use semantic token for contrast */
1219 /* Include svg and svg path targets to override the global SVG color rule above */
1220 .sbr-review-alert--dark .sbr-review-alert__star--empty,
1221 .sbr-review-alert--dark .sbr-review-alert__star--empty svg,
1222 .sbr-review-alert--dark .sbr-review-alert__star--empty svg path,
1223 .sbr-review-alert--dark .sbr-review-alert__expanded-star--empty,
1224 .sbr-review-alert--dark .sbr-review-alert__expanded-star--empty svg,
1225 .sbr-review-alert--dark .sbr-review-alert__expanded-star--empty svg path {
1226 color: var(--sbr-popup-star-empty);
1227 }
1228
1229 /* Dark - half star: dim the empty BASE the same way --empty above does
1230 (the global `--dark svg path` white rule otherwise paints the whole star),
1231 then re-assert the left-half fill overlay so 4.5/4.7 shows a real half, not 5 full. */
1232 .sbr-review-alert--dark .sbr-review-alert__star--half,
1233 .sbr-review-alert--dark .sbr-review-alert__star--half svg,
1234 .sbr-review-alert--dark .sbr-review-alert__star--half svg path {
1235 color: var(--sbr-popup-star-empty);
1236 }
1237
1238 .sbr-review-alert--dark .sbr-review-alert__star--half .sbr-review-alert__star-half,
1239 .sbr-review-alert--dark .sbr-review-alert__star--half .sbr-review-alert__star-half svg,
1240 .sbr-review-alert--dark .sbr-review-alert__star--half .sbr-review-alert__star-half svg path {
1241 color: var(--sbr-popup-star-fill);
1242 }
1243
1244 /* Chevron uses stroke, not fill - reset fill and set stroke for dark mode */
1245 .sbr-review-alert--dark .sbr-review-alert__chevron svg {
1246 fill: none;
1247 }
1248
1249 /* Dark - Close button colors */
1250 .sbr-review-alert--dark .sbr-review-alert__close svg {
1251 color: var(--sbr-popup-zinc-400);
1252 }
1253
1254 .sbr-review-alert--dark .sbr-review-alert__close:hover {
1255 background-color: rgba(255, 255, 255, 0.1);
1256 }
1257
1258 .sbr-review-alert--dark .sbr-review-alert__close:hover svg {
1259 color: var(--sbr-popup-white);
1260 }
1261
1262 /* ==========================================================================
1263 Custom Accent Color Support
1264
1265 NOTE: Non-OKLCH fallback is handled via duplicate CSS property declarations.
1266 Each accent color token has a hex fallback first, then OKLCH override:
1267
1268 --sbr-popup-accent-600: #4f46e5; (hex fallback for legacy browsers)
1269 --sbr-popup-accent-600: oklch(0.55 0.25 var(--sbr-popup-accent-hue));
1270
1271 Modern browsers use OKLCH, legacy browsers fall back to hex automatically.
1272 No attribute selectors needed - the CSS cascade handles it.
1273 ========================================================================== */
1274
1275 /* ==========================================================================
1276 COMPACT MODE - Near footer/bottom of page
1277 Applied when user scrolls within 200px of page bottom
1278 ========================================================================== */
1279
1280 /* Compact mode - hide review text */
1281 .sbr-review-alert--compact .sbr-review-alert__review-text {
1282 display: none;
1283 }
1284
1285 /* Compact mode - hide view all link */
1286 .sbr-review-alert--compact .sbr-review-alert__view-all-link {
1287 display: none;
1288 }
1289
1290 /* Compact mode - date inline, aligned right */
1291 .sbr-review-alert--compact .sbr-review-alert__date {
1292 position: static;
1293 order: 3;
1294 margin-left: auto;
1295 font-size: 12px;
1296 }
1297
1298 /* Compact mode - card becomes flex row to align date inline */
1299 .sbr-review-alert--compact .sbr-review-alert__card {
1300 padding: 12px;
1301 display: flex;
1302 flex-direction: row;
1303 align-items: center;
1304 gap: 12px;
1305 }
1306
1307 /* Compact mode - aggregate view inner width auto */
1308 .sbr-review-alert--compact.sbr-review-alert--aggregate .sbr-review-alert__inner {
1309 width: auto;
1310 min-width: 0;
1311 }
1312
1313 /* Compact mode - content row doesn't grow, allows date to align right */
1314 .sbr-review-alert--compact .sbr-review-alert__content-row {
1315 flex: 1;
1316 align-items: center;
1317 }
1318
1319 /* Compact mode - smaller avatar */
1320 .sbr-review-alert--compact .sbr-review-alert__avatar {
1321 width: 40px;
1322 height: 40px;
1323 }
1324
1325 /* Compact mode - smaller provider badge */
1326 .sbr-review-alert--compact .sbr-review-alert__provider-badge {
1327 width: 20px;
1328 height: 20px;
1329 bottom: -2px;
1330 right: -2px;
1331 }
1332
1333 .sbr-review-alert--compact .sbr-review-alert__provider-badge img,
1334 .sbr-review-alert--compact .sbr-review-alert__provider-badge svg {
1335 width: 14px;
1336 height: 14px;
1337 }
1338
1339 /* Compact mode - smaller stars */
1340 .sbr-review-alert--compact .sbr-review-alert__star {
1341 width: 16px;
1342 height: 16px;
1343 }
1344
1345 .sbr-review-alert--compact .sbr-review-alert__star svg {
1346 width: 16px;
1347 height: 16px;
1348 }
1349
1350 /* Compact mode - content as horizontal row (name, stars, date inline) */
1351 .sbr-review-alert--compact .sbr-review-alert__content {
1352 flex-direction: row;
1353 align-items: center;
1354 gap: 8px;
1355 padding-top: 0;
1356 }
1357
1358 /* Compact mode - name first */
1359 .sbr-review-alert--compact .sbr-review-alert__heading {
1360 order: 1;
1361 font-size: 14px;
1362 line-height: 1;
1363 }
1364
1365 /* Compact mode - stars second */
1366 .sbr-review-alert--compact .sbr-review-alert__stars {
1367 order: 2;
1368 margin-bottom: 0;
1369 }
1370
1371 /* Compact mode - hide powered by footer */
1372 .sbr-review-alert--compact .sbr-review-alert__powered-by {
1373 display: none;
1374 }
1375
1376 /* Compact mode - adjust wrapper hover */
1377 .sbr-review-alert--compact .sbr-review-alert__wrapper:hover {
1378 transform: scale(1.01);
1379 }
1380
1381 /* ==========================================================================
1382 EXPANDED STATE - Review Feed View
1383 ========================================================================== */
1384
1385 /* Expanded Container */
1386 .sbr-review-alert__expanded {
1387 display: flex;
1388 flex-direction: column;
1389 justify-content: flex-end;
1390 gap: 12px;
1391 width: 100%;
1392 height: 100%;
1393 max-width: 450px;
1394 max-height: 700px;
1395 pointer-events: auto;
1396 animation: sbr-popup-expand 300ms ease-out;
1397 }
1398
1399 @keyframes sbr-popup-expand {
1400 from {
1401 opacity: 0;
1402 transform: translateY(64px);
1403 filter: blur(4px);
1404 }
1405 to {
1406 opacity: 1;
1407 transform: translateY(0);
1408 filter: blur(0);
1409 }
1410 }
1411
1412 /* Exit animation for collapsing expanded state */
1413 @keyframes sbr-popup-collapse {
1414 from {
1415 opacity: 1;
1416 transform: translateY(0);
1417 filter: blur(0);
1418 }
1419 to {
1420 opacity: 0;
1421 transform: translateY(64px);
1422 filter: blur(4px);
1423 }
1424 }
1425
1426 /* Apply exit animation when collapsing */
1427 .sbr-review-alert--collapsing .sbr-review-alert__expanded {
1428 animation: sbr-popup-collapse 300ms ease-out forwards;
1429 }
1430
1431 .sbr-review-alert--bottom-left .sbr-review-alert__expanded {
1432 align-items: flex-start;
1433 }
1434
1435 .sbr-review-alert--bottom-right .sbr-review-alert__expanded {
1436 align-items: flex-end;
1437 }
1438
1439 /* Expanded Card - Main container with gradient background */
1440 .sbr-review-alert__expanded-card {
1441 position: relative;
1442 flex: 1;
1443 min-height: 0;
1444 width: 100%;
1445 overflow-y: auto;
1446 background: linear-gradient(to bottom, var(--sbr-popup-accent-700), var(--sbr-popup-accent-600), var(--sbr-popup-zinc-300));
1447 border-radius: 16px;
1448 box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
1449 padding: 8px;
1450 }
1451
1452 /* Header Section - Blue background with heading + CTA */
1453 .sbr-review-alert__expanded-header {
1454 padding: 24px 24px 40px;
1455 text-align: center;
1456 }
1457
1458 .sbr-review-alert__expanded-header--with-cta {
1459 padding-bottom: 40px;
1460 }
1461
1462 .sbr-review-alert__expanded-header--no-cta {
1463 padding-bottom: 32px;
1464 }
1465
1466 .sbr-review-alert__expanded-heading {
1467 font-size: 24px;
1468 line-height: 32px;
1469 font-weight: 600;
1470 letter-spacing: -0.025em;
1471 text-wrap: balance;
1472 color: var(--sbr-popup-white);
1473 margin: 0;
1474 }
1475
1476 .sbr-review-alert__expanded-heading--with-cta {
1477 margin-bottom: 24px;
1478 }
1479
1480 /* CTA Button */
1481 .sbr-review-alert__expanded-cta {
1482 display: inline-flex;
1483 align-items: center;
1484 gap: 8px;
1485 background-color: var(--sbr-popup-white);
1486 color: var(--sbr-popup-accent-700);
1487 padding: 12px 32px;
1488 border-radius: 9999px;
1489 font-weight: 600;
1490 font-size: 14px;
1491 text-decoration: none;
1492 border: none;
1493 cursor: pointer;
1494 transition: background-color 150ms, color 150ms;
1495 }
1496
1497 /* Light theme CTA hover - stronger selector to override WP admin a:hover */
1498 .sbr-review-alert .sbr-review-alert__expanded-cta:hover {
1499 background-color: var(--sbr-popup-zinc-100);
1500 color: var(--sbr-popup-accent-700);
1501 }
1502
1503 /* CTA Button Icon */
1504 .sbr-review-alert__expanded-cta-icon {
1505 width: 16px;
1506 height: 16px;
1507 flex-shrink: 0;
1508 }
1509
1510 .sbr-review-alert__expanded-cta .sbr-review-alert__expanded-cta-icon,
1511 .sbr-review-alert__expanded-cta .sbr-review-alert__expanded-cta-icon path {
1512 fill: var(--sbr-popup-accent-700);
1513 }
1514
1515 /* CTA Button with icon - icon on right side */
1516 .sbr-review-alert__expanded-cta--has-icon {
1517 flex-direction: row-reverse;
1518 }
1519
1520 /* Reviews Container - White scrollable area */
1521 .sbr-review-alert__expanded-reviews {
1522 flex: 1;
1523 min-height: 0;
1524 background-color: var(--sbr-popup-white);
1525 border-radius: 16px;
1526 padding: 0;
1527 }
1528
1529 /* Individual Review Card */
1530 .sbr-review-alert__expanded-review {
1531 padding: 24px;
1532 border-bottom: 1px solid rgba(0, 0, 0, 0.05);
1533 }
1534
1535 .sbr-review-alert__expanded-review:last-of-type {
1536 border-bottom: none;
1537 }
1538
1539 /* Review Stars Row */
1540 .sbr-review-alert__expanded-stars {
1541 display: flex;
1542 gap: 2px;
1543 margin-bottom: 12px;
1544 }
1545
1546 .sbr-review-alert__expanded-star {
1547 display: inline-flex;
1548 width: var(--sbr-popup-star-size);
1549 height: var(--sbr-popup-star-size);
1550 color: var(--sbr-popup-accent-600);
1551 flex-shrink: 0;
1552 }
1553
1554 .sbr-review-alert__expanded-star svg {
1555 width: 100%;
1556 height: 100%;
1557 fill: currentColor;
1558 }
1559
1560 .sbr-review-alert__expanded-star span {
1561 display: inline-flex;
1562 width: 100%;
1563 height: 100%;
1564 }
1565
1566 .sbr-review-alert__expanded-star--empty {
1567 color: var(--sbr-popup-zinc-300);
1568 }
1569
1570 /* Review Title */
1571 .sbr-review-alert__expanded-review-title {
1572 font-size: 16px;
1573 line-height: 24px;
1574 font-weight: 600;
1575 color: var(--sbr-popup-zinc-900);
1576 margin: 0 0 8px 0;
1577 }
1578
1579 /* Review Text/Content */
1580 .sbr-review-alert__expanded-review-text {
1581 font-size: 14px;
1582 line-height: 20px;
1583 color: var(--sbr-popup-zinc-600);
1584 margin: 0 0 16px 0;
1585 }
1586
1587 /* Review Meta - Author + Date */
1588 .sbr-review-alert__expanded-review-meta {
1589 display: flex;
1590 align-items: center;
1591 justify-content: space-between;
1592 font-size: 14px;
1593 line-height: 20px;
1594 color: var(--sbr-popup-zinc-700);
1595 }
1596
1597 .sbr-review-alert__expanded-review-author {
1598 font-weight: 600;
1599 }
1600
1601 .sbr-review-alert__expanded-review-date {
1602 color: var(--sbr-popup-zinc-500);
1603 }
1604
1605 /* See All Reviews Button */
1606 .sbr-review-alert__expanded-see-all {
1607 padding: 8px 24px 24px;
1608 }
1609
1610 .sbr-review-alert__expanded-see-all-btn {
1611 width: 100%;
1612 background-color: var(--sbr-popup-accent-muted-100);
1613 color: var(--sbr-popup-accent-700);
1614 cursor: pointer;
1615 padding: 12px 24px;
1616 border-radius: 9999px;
1617 font-weight: 600;
1618 font-size: 14px;
1619 font-family: inherit;
1620 border: 1px solid transparent;
1621 transition: all 200ms;
1622 display: flex;
1623 align-items: center;
1624 justify-content: center;
1625 gap: 8px;
1626 text-decoration: none;
1627 }
1628
1629 .sbr-review-alert__expanded-see-all-btn:hover {
1630 background-color: var(--sbr-popup-accent-50);
1631 border-color: var(--sbr-popup-accent-300);
1632 transform: scale(1.01);
1633 }
1634
1635 .sbr-review-alert__expanded-see-all-btn:active {
1636 transform: scale(0.98);
1637 }
1638
1639 .sbr-review-alert__expanded-see-all-btn .sbr-review-alert__chevron {
1640 width: 16px;
1641 height: 16px;
1642 }
1643
1644 /* Powered By - Sticky pill */
1645 .sbr-review-alert__expanded-powered-wrapper {
1646 width: 100%;
1647 display: flex;
1648 justify-content: flex-end;
1649 padding: 16px 16px 8px;
1650 position: sticky;
1651 bottom: 0;
1652 }
1653
1654 .sbr-review-alert__expanded-powered-pill {
1655 background-color: var(--sbr-popup-white);
1656 backdrop-filter: blur(12px);
1657 -webkit-backdrop-filter: blur(12px);
1658 border: 1px solid rgba(0, 0, 0, 0.1);
1659 box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
1660 border-radius: 9999px;
1661 padding: 8px 16px;
1662 display: flex;
1663 align-items: center;
1664 gap: 8px;
1665 text-decoration: none;
1666 }
1667
1668 .sbr-review-alert__expanded-powered-text {
1669 font-size: 14px;
1670 line-height: 20px;
1671 color: var(--sbr-popup-zinc-700);
1672 }
1673
1674 .sbr-review-alert__expanded-powered-logo {
1675 height: 24px;
1676 }
1677
1678 .sbr-review-alert__expanded-powered-logo svg {
1679 height: 100%;
1680 width: auto;
1681 }
1682
1683 /* ==========================================================================
1684 Close Button
1685 ========================================================================== */
1686
1687 .sbr-review-alert__close-row {
1688 display: flex;
1689 }
1690
1691 .sbr-review-alert--bottom-left .sbr-review-alert__close-row {
1692 justify-content: flex-start;
1693 }
1694
1695 .sbr-review-alert--bottom-right .sbr-review-alert__close-row {
1696 justify-content: flex-end;
1697 }
1698
1699 .sbr-review-alert__close-btn {
1700 width: 56px;
1701 height: 56px;
1702 flex-shrink: 0;
1703 cursor: pointer;
1704 border-radius: 9999px;
1705 background-color: var(--sbr-popup-close-bg);
1706 display: flex;
1707 align-items: center;
1708 justify-content: center;
1709 transition: all 200ms;
1710 box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
1711 border: none;
1712 padding: 0;
1713 }
1714
1715 .sbr-review-alert__close-btn:hover {
1716 background-color: var(--sbr-popup-close-bg-hover);
1717 transform: scale(1.04);
1718 }
1719
1720 .sbr-review-alert__close-btn:active {
1721 transform: scale(0.98);
1722 }
1723
1724 .sbr-review-alert__close-btn:focus-visible {
1725 outline: 2px solid var(--sbr-popup-white);
1726 outline-offset: 2px;
1727 }
1728
1729 .sbr-review-alert__close-icon {
1730 width: 24px;
1731 height: 24px;
1732 color: var(--sbr-popup-white);
1733 }
1734
1735 .sbr-review-alert__close-icon svg {
1736 width: 100%;
1737 height: 100%;
1738 }
1739
1740 /* ==========================================================================
1741 Expanded State - Theme Variations
1742 ========================================================================== */
1743
1744 /* Dark Theme - Expanded State (standard dark theme only) */
1745 .sbr-review-alert--dark .sbr-review-alert__expanded-card {
1746 background: linear-gradient(to bottom, var(--sbr-popup-accent-700), var(--sbr-popup-accent-muted-600), var(--sbr-popup-accent-muted-200));
1747 }
1748
1749 .sbr-review-alert--dark .sbr-review-alert__expanded-reviews {
1750 background-color: var(--sbr-popup-accent-muted-950);
1751 }
1752
1753 .sbr-review-alert--dark .sbr-review-alert__expanded-review {
1754 border-bottom-color: rgba(255, 255, 255, 0.05);
1755 }
1756
1757 .sbr-review-alert--dark .sbr-review-alert__expanded-review-title {
1758 color: var(--sbr-popup-white);
1759 }
1760
1761 .sbr-review-alert--dark .sbr-review-alert__expanded-review-text {
1762 color: var(--sbr-popup-zinc-300);
1763 }
1764
1765 .sbr-review-alert--dark .sbr-review-alert__expanded-review-meta {
1766 color: var(--sbr-popup-zinc-400);
1767 }
1768
1769 .sbr-review-alert--dark .sbr-review-alert__expanded-review-date {
1770 color: var(--sbr-popup-zinc-400);
1771 }
1772
1773 .sbr-review-alert--dark .sbr-review-alert__expanded-see-all-btn {
1774 background-color: var(--sbr-popup-accent-900);
1775 color: var(--sbr-popup-accent-50);
1776 border-color: transparent;
1777 }
1778
1779 .sbr-review-alert--dark .sbr-review-alert__expanded-see-all-btn:hover {
1780 background-color: var(--sbr-popup-accent-800);
1781 border-color: var(--sbr-popup-accent-600);
1782 }
1783
1784 .sbr-review-alert--dark .sbr-review-alert__expanded-powered-pill {
1785 background-color: var(--sbr-popup-accent-muted-900);
1786 border-color: color-mix(in oklch, var(--sbr-popup-accent-muted-500) 20%, transparent);
1787 }
1788
1789 .sbr-review-alert--dark .sbr-review-alert__expanded-powered-text {
1790 color: var(--sbr-popup-white);
1791 }
1792
1793 /* Dark theme logo - white with dark inner star */
1794 .sbr-review-alert--dark .sbr-review-alert__expanded-powered-logo svg,
1795 .sbr-review-alert--dark .sbr-review-alert__expanded-powered-logo svg path {
1796 fill: var(--sbr-popup-white) !important;
1797 color: var(--sbr-popup-white);
1798 }
1799
1800 .sbr-review-alert--dark .sbr-review-alert__expanded-powered-logo svg path:last-child {
1801 fill: var(--sbr-popup-accent-muted-900) !important;
1802 }
1803
1804 /* Dark theme CTA button - white button on dark gradient header */
1805 .sbr-review-alert--dark .sbr-review-alert__expanded-cta {
1806 background-color: var(--sbr-popup-white);
1807 color: var(--sbr-popup-accent-700);
1808 }
1809
1810 .sbr-review-alert--dark .sbr-review-alert__expanded-cta:hover {
1811 background-color: var(--sbr-popup-zinc-100);
1812 color: var(--sbr-popup-accent-700); /* Override WP admin a:hover color */
1813 }
1814
1815 /* Dark theme CTA icon - accent color to match text */
1816 .sbr-review-alert--dark .sbr-review-alert__expanded-cta .sbr-review-alert__expanded-cta-icon,
1817 .sbr-review-alert--dark .sbr-review-alert__expanded-cta .sbr-review-alert__expanded-cta-icon path {
1818 fill: var(--sbr-popup-accent-700);
1819 }
1820
1821 /* ==========================================================================
1822 Minimal (Light) Theme - Expanded State
1823 Colors from prototype: minimal/ReviewFeedTheme.module.css
1824 Key: Translucent outer frame with white gradient interior
1825 Same structure as minimal-dark: everything on expanded-card
1826 ========================================================================== */
1827
1828 /* Card wrapper - translucent accent outer frame with blur
1829 Same approach as minimal-dark but with light colors */
1830 .sbr-review-alert--minimal .sbr-review-alert__expanded-card {
1831 background: color-mix(in oklch, var(--sbr-popup-accent-muted-600) 30%, transparent);
1832 backdrop-filter: saturate(4) blur(4px);
1833 -webkit-backdrop-filter: saturate(4) blur(4px);
1834 }
1835
1836 /* Header - white gradient background (creates the light interior look) */
1837 .sbr-review-alert--minimal .sbr-review-alert__expanded-header {
1838 background: linear-gradient(to bottom, rgba(255, 255, 255, 0.9), white);
1839 border-bottom: 1px solid color-mix(in oklch, var(--sbr-popup-accent-900) 1%, transparent);
1840 border-top-left-radius: 12px;
1841 border-top-right-radius: 12px;
1842 }
1843
1844 /* Heading - dark text on light background */
1845 .sbr-review-alert--minimal .sbr-review-alert__expanded-heading {
1846 color: color-mix(in oklch, var(--sbr-popup-accent-muted-950) 80%, transparent);
1847 }
1848
1849 /* CTA button - accent colored */
1850 .sbr-review-alert--minimal .sbr-review-alert__expanded-cta {
1851 background-color: var(--sbr-popup-accent-600);
1852 color: var(--sbr-popup-white);
1853 }
1854
1855 .sbr-review-alert--minimal .sbr-review-alert__expanded-cta:hover {
1856 background-color: var(--sbr-popup-accent-800);
1857 color: var(--sbr-popup-white); /* Override WP admin a:hover color */
1858 }
1859
1860 .sbr-review-alert--minimal .sbr-review-alert__expanded-cta .sbr-review-alert__expanded-cta-icon,
1861 .sbr-review-alert--minimal .sbr-review-alert__expanded-cta .sbr-review-alert__expanded-cta-icon path {
1862 fill: var(--sbr-popup-white);
1863 }
1864
1865 /* Reviews container - white background (continues from header) */
1866 .sbr-review-alert--minimal .sbr-review-alert__expanded-reviews {
1867 background: white;
1868 border-top-left-radius: 0;
1869 border-top-right-radius: 0;
1870 border-bottom-left-radius: 12px;
1871 border-bottom-right-radius: 12px;
1872 }
1873
1874 /* Reviews container - rounded top when header is hidden */
1875 .sbr-review-alert--minimal .sbr-review-alert__expanded-reviews--no-header {
1876 border-top-left-radius: 12px;
1877 border-top-right-radius: 12px;
1878 }
1879
1880 /* Review card border - very subtle */
1881 .sbr-review-alert--minimal .sbr-review-alert__expanded-review {
1882 border-bottom-color: color-mix(in oklch, var(--sbr-popup-accent-muted-500) 20%, transparent);
1883 }
1884
1885 /* Stars - dark gray, matching text */
1886 .sbr-review-alert--minimal .sbr-review-alert__expanded-star {
1887 color: color-mix(in oklch, var(--sbr-popup-accent-muted-950) 80%, transparent);
1888 }
1889
1890 .sbr-review-alert--minimal .sbr-review-alert__expanded-star--empty {
1891 color: var(--sbr-popup-accent-muted-300);
1892 }
1893
1894 /* Review title - dark */
1895 .sbr-review-alert--minimal .sbr-review-alert__expanded-review-title {
1896 color: color-mix(in oklch, var(--sbr-popup-accent-muted-950) 80%, transparent);
1897 }
1898
1899 /* Review text - slightly lighter */
1900 .sbr-review-alert--minimal .sbr-review-alert__expanded-review-text {
1901 color: color-mix(in oklch, var(--sbr-popup-accent-muted-950) 70%, transparent);
1902 }
1903
1904 /* Review meta - same as text */
1905 .sbr-review-alert--minimal .sbr-review-alert__expanded-review-meta {
1906 color: color-mix(in oklch, var(--sbr-popup-accent-muted-950) 70%, transparent);
1907 }
1908
1909 /* See all button - light background with accent text */
1910 .sbr-review-alert--minimal .sbr-review-alert__expanded-see-all-btn {
1911 background-color: var(--sbr-popup-accent-muted-100);
1912 color: var(--sbr-popup-accent-700);
1913 border: 1px solid var(--sbr-popup-accent-muted-200);
1914 }
1915
1916 .sbr-review-alert--minimal .sbr-review-alert__expanded-see-all-btn:hover {
1917 background-color: var(--sbr-popup-accent-muted-50);
1918 }
1919
1920 /* Powered by pill - white with subtle border */
1921 .sbr-review-alert--minimal .sbr-review-alert__expanded-powered-pill {
1922 background-color: var(--sbr-popup-white);
1923 border-color: color-mix(in oklch, var(--sbr-popup-accent-muted-500) 20%, transparent);
1924 }
1925
1926 .sbr-review-alert--minimal .sbr-review-alert__expanded-powered-text {
1927 color: var(--sbr-popup-accent-muted-900);
1928 }
1929
1930 /* Close button - dark accent */
1931 .sbr-review-alert--minimal .sbr-review-alert__close-btn {
1932 background-color: var(--sbr-popup-accent-900);
1933 }
1934
1935 .sbr-review-alert--minimal .sbr-review-alert__close-btn:hover {
1936 background-color: var(--sbr-popup-accent-600);
1937 }
1938
1939 /* ==========================================================================
1940 Minimal Dark Theme - Expanded State (Override shared dark styles)
1941 Colors from prototype: minimal-dark/ReviewFeedTheme.module.css
1942 Key: Semi-transparent wrapper with dark gradient interior
1943 ========================================================================== */
1944
1945 /* Card wrapper - translucent accent outer frame (same as minimal light)
1946 Both minimal themes share the same outer frame, just different inner colors */
1947 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-card {
1948 background: color-mix(in oklch, var(--sbr-popup-accent-muted-500) 30%, transparent);
1949 backdrop-filter: saturate(4) blur(12px);
1950 -webkit-backdrop-filter: saturate(4) blur(12px);
1951 }
1952
1953 /* Header - dark gradient background (inner card look) */
1954 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-header {
1955 background: linear-gradient(
1956 to bottom,
1957 color-mix(in oklch, var(--sbr-popup-accent-muted-900) 70%, transparent),
1958 color-mix(in oklch, var(--sbr-popup-accent-muted-950) 90%, transparent)
1959 );
1960 border-bottom: 1px solid rgba(255, 255, 255, 0.1);
1961 border-top-left-radius: 12px;
1962 border-top-right-radius: 12px;
1963 }
1964
1965 /* Heading - white text */
1966 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-heading {
1967 color: var(--sbr-popup-white);
1968 }
1969
1970 /* CTA button - lighter on hover for dark theme */
1971 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-cta {
1972 background-color: var(--sbr-popup-accent-600);
1973 color: var(--sbr-popup-white);
1974 }
1975
1976 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-cta:hover {
1977 background-color: var(--sbr-popup-accent-300);
1978 color: var(--sbr-popup-white); /* Override WP admin a:hover color */
1979 }
1980
1981 /* CTA icon - white to match text */
1982 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-cta .sbr-review-alert__expanded-cta-icon,
1983 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-cta .sbr-review-alert__expanded-cta-icon path {
1984 fill: var(--sbr-popup-white);
1985 }
1986
1987 /* Reviews container - dark gradient continuing from header */
1988 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-reviews {
1989 background: linear-gradient(
1990 to bottom,
1991 color-mix(in oklch, var(--sbr-popup-accent-muted-950) 90%, transparent),
1992 var(--sbr-popup-zinc-900)
1993 );
1994 border-top-left-radius: 0;
1995 border-top-right-radius: 0;
1996 border-bottom-left-radius: 12px;
1997 border-bottom-right-radius: 12px;
1998 }
1999
2000 /* Reviews container - rounded top when header is hidden */
2001 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-reviews--no-header {
2002 border-top-left-radius: 12px;
2003 border-top-right-radius: 12px;
2004 }
2005
2006 /* Review card border */
2007 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-review {
2008 border-bottom-color: rgba(255, 255, 255, 0.1);
2009 }
2010
2011 /* Stars - white */
2012 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-star {
2013 color: var(--sbr-popup-white);
2014 }
2015
2016 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-star--empty,
2017 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-star--empty svg,
2018 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-star--empty svg path {
2019 color: var(--sbr-popup-zinc-600);
2020 }
2021
2022 /* Review title - white */
2023 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-review-title {
2024 color: var(--sbr-popup-white);
2025 }
2026
2027 /* Review text - white at 70% */
2028 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-review-text {
2029 color: rgba(255, 255, 255, 0.7);
2030 }
2031
2032 /* Review meta - white at 70% */
2033 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-review-meta {
2034 color: rgba(255, 255, 255, 0.7);
2035 }
2036
2037 /* See all button - semi-transparent with accent-300 text */
2038 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-see-all-btn {
2039 background-color: color-mix(in oklch, var(--sbr-popup-accent-muted-400) 10%, transparent);
2040 color: var(--sbr-popup-accent-300);
2041 border: 1px solid rgba(255, 255, 255, 0.2);
2042 }
2043
2044 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-see-all-btn:hover {
2045 background-color: rgba(255, 255, 255, 0.2);
2046 border-color: rgba(255, 255, 255, 0.2);
2047 }
2048
2049 /* Powered by pill - zinc-900 background */
2050 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-powered-pill {
2051 background-color: var(--sbr-popup-zinc-900);
2052 border-color: rgba(255, 255, 255, 0.1);
2053 }
2054
2055 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-powered-text {
2056 color: rgba(255, 255, 255, 0.7);
2057 }
2058
2059 /* Logo - white with dark inner star */
2060 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-powered-logo svg,
2061 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-powered-logo svg path {
2062 fill: var(--sbr-popup-white) !important;
2063 color: var(--sbr-popup-white);
2064 }
2065
2066 .sbr-review-alert--minimal-dark .sbr-review-alert__expanded-powered-logo svg path:last-child {
2067 fill: var(--sbr-popup-zinc-900) !important;
2068 }
2069
2070 /* Close button */
2071 .sbr-review-alert--minimal-dark .sbr-review-alert__close-btn {
2072 background-color: var(--sbr-popup-accent-700);
2073 }
2074
2075 .sbr-review-alert--minimal-dark .sbr-review-alert__close-btn:hover {
2076 background-color: var(--sbr-popup-accent-600);
2077 }
2078
2079 /* ==========================================================================
2080 Loading Skeleton Placeholder
2081 Animated placeholder while reviews are loading
2082 Compact size to match actual popup dimensions
2083 ========================================================================== */
2084
2085 @keyframes sbr-skeleton-shimmer {
2086 0% {
2087 background-position: -200% 0;
2088 }
2089 100% {
2090 background-position: 200% 0;
2091 }
2092 }
2093
2094 .sbr-popup-skeleton {
2095 background: linear-gradient(90deg, #e6e6eb 25%, #f0f0f3 50%, #e6e6eb 75%);
2096 background-size: 200% 100%;
2097 animation: sbr-skeleton-shimmer 1.5s ease-in-out infinite;
2098 border-radius: 4px;
2099 }
2100
2101 /* Avatar skeleton - matches popup avatar size */
2102 .sbr-popup-skeleton--avatar {
2103 width: 48px;
2104 height: 48px;
2105 border-radius: 9999px;
2106 flex-shrink: 0;
2107 }
2108
2109 /* Stars skeleton - compact row */
2110 .sbr-popup-skeleton--stars {
2111 width: 88px;
2112 height: 14px;
2113 margin-bottom: 6px;
2114 animation-delay: 0.1s;
2115 }
2116
2117 /* Heading skeleton - single line */
2118 .sbr-popup-skeleton--heading {
2119 width: 120px;
2120 height: 12px;
2121 margin-bottom: 6px;
2122 animation-delay: 0.2s;
2123 }
2124
2125 /* Text skeleton - two lines worth */
2126 .sbr-popup-skeleton--text {
2127 width: 150px;
2128 height: 24px;
2129 margin-bottom: 8px;
2130 animation-delay: 0.3s;
2131 }
2132
2133 /* Link skeleton - view all link */
2134 .sbr-popup-skeleton--link {
2135 width: 100px;
2136 height: 12px;
2137 animation-delay: 0.4s;
2138 }
2139
2140 /* Powered by skeleton */
2141 .sbr-popup-skeleton--powered-by {
2142 width: 90px;
2143 height: 14px;
2144 margin: 0 auto;
2145 animation-delay: 0.5s;
2146 }
2147
2148 /* Dark theme skeleton colors */
2149 .sbr-review-alert--dark .sbr-popup-skeleton,
2150 .sbr-review-alert--minimal-dark .sbr-popup-skeleton {
2151 background: linear-gradient(90deg, rgba(255,255,255,0.1) 25%, rgba(255,255,255,0.2) 50%, rgba(255,255,255,0.1) 75%);
2152 background-size: 200% 100%;
2153 }
2154
2155 /* ==========================================================================
2156 Empty State Styles (Admin Preview Only)
2157 ========================================================================== */
2158
2159 .sbr-review-alert__empty-state {
2160 display: flex;
2161 flex-direction: column;
2162 align-items: center;
2163 justify-content: center;
2164 padding: 24px 16px;
2165 text-align: center;
2166 min-height: 100px;
2167 }
2168
2169 .sbr-review-alert__empty-icon {
2170 width: 40px;
2171 height: 40px;
2172 margin-bottom: 12px;
2173 color: #9CA3AF;
2174 }
2175
2176 .sbr-review-alert__empty-icon svg {
2177 width: 100%;
2178 height: 100%;
2179 }
2180
2181 .sbr-review-alert__empty-icon--large {
2182 width: 64px;
2183 height: 64px;
2184 margin-bottom: 16px;
2185 }
2186
2187 .sbr-review-alert__empty-text {
2188 font-size: 14px;
2189 font-weight: 500;
2190 color: #6B7280;
2191 margin: 0;
2192 line-height: 1.4;
2193 }
2194
2195 .sbr-review-alert__expanded-empty-state {
2196 display: flex;
2197 flex-direction: column;
2198 align-items: center;
2199 justify-content: center;
2200 padding: 48px 24px;
2201 text-align: center;
2202 min-height: 200px;
2203 }
2204
2205 /* Dark theme empty state */
2206 .sbr-review-alert--dark .sbr-review-alert__empty-icon,
2207 .sbr-review-alert--minimal-dark .sbr-review-alert__empty-icon {
2208 color: rgba(255, 255, 255, 0.5);
2209 }
2210
2211 .sbr-review-alert--dark .sbr-review-alert__empty-text,
2212 .sbr-review-alert--minimal-dark .sbr-review-alert__empty-text {
2213 color: rgba(255, 255, 255, 0.7);
2214 }
2215
2216 /* ==========================================================================
2217 Review Cycling Animation
2218 Animate individual elements for smooth transition between reviews
2219 ========================================================================== */
2220
2221 .sbr-review-alert__review--cycling .sbr-review-alert__avatar {
2222 animation: sbr-element-cycle 500ms cubic-bezier(0.4, 0, 0.2, 1);
2223 }
2224
2225 .sbr-review-alert__review--cycling .sbr-review-alert__heading {
2226 animation: sbr-element-cycle 500ms cubic-bezier(0.4, 0, 0.2, 1) 30ms;
2227 }
2228
2229 .sbr-review-alert__review--cycling .sbr-review-alert__stars {
2230 animation: sbr-element-cycle 500ms cubic-bezier(0.4, 0, 0.2, 1) 60ms;
2231 }
2232
2233 .sbr-review-alert__review--cycling .sbr-review-alert__review-text {
2234 animation: sbr-element-cycle 500ms cubic-bezier(0.4, 0, 0.2, 1) 90ms;
2235 }
2236
2237 @keyframes sbr-element-cycle {
2238 0% { opacity: 1; transform: translateX(0); }
2239 40% { opacity: 0; transform: translateX(-12px); }
2240 50% { opacity: 0; transform: translateX(12px); }
2241 100% { opacity: 1; transform: translateX(0); }
2242 }
2243
2244 /* ==========================================================================
2245 Responsive Styles
2246 ========================================================================== */
2247
2248 @media (max-width: 480px) {
2249 .sbr-review-alert {
2250 --sbr-popup-avatar-size: 48px;
2251 --sbr-popup-provider-badge-size: 24px;
2252 --sbr-popup-star-size: 16px;
2253 --sbr-popup-width: calc(100vw - 16px);
2254 }
2255
2256 .sbr-review-alert__card {
2257 padding: 12px 16px 12px 16px;
2258 }
2259
2260 .sbr-review-alert__content-row {
2261 gap: 16px;
2262 }
2263
2264 .sbr-review-alert__heading,
2265 .sbr-review-alert__reviewer-text {
2266 font-size: 14px;
2267 }
2268
2269 .sbr-review-alert__review-text {
2270 font-size: 13px;
2271 }
2272
2273 .sbr-review-alert__view-all-link {
2274 font-size: 13px;
2275 }
2276
2277 .sbr-review-alert__date {
2278 font-size: 12px;
2279 top: 12px;
2280 right: 12px;
2281 }
2282
2283 .sbr-review-alert__stars {
2284 margin-bottom: 8px;
2285 }
2286 }
2287
2288 /* ==========================================================================
2289 Accessibility
2290 ========================================================================== */
2291
2292 /* Focus styles */
2293 .sbr-review-alert__view-all-link:focus,
2294 .sbr-review-alert__powered-link:focus {
2295 outline: 2px solid var(--sbr-popup-accent-600, #4f46e5);
2296 outline-offset: 2px;
2297 }
2298
2299 /* Reduced motion */
2300 @media (prefers-reduced-motion: reduce) {
2301 .sbr-review-alert,
2302 .sbr-review-alert *,
2303 .sbr-review-alert__wrapper,
2304 .sbr-review-alert__view-all-link::before {
2305 animation-duration: 0.01ms !important;
2306 animation-iteration-count: 1 !important;
2307 transition-duration: 0.01ms !important;
2308 }
2309 }
2310
2311 /* High contrast mode support */
2312 @media (forced-colors: active) {
2313 .sbr-review-alert__inner {
2314 border: 2px solid CanvasText;
2315 }
2316
2317 .sbr-review-alert__card {
2318 border: 1px solid CanvasText;
2319 }
2320 }
2321
2322 /* ─────────────────────────────────────────────────────────────────────────
2323 SMASH-782 — new-source provider body elements in the popup.
2324 Styled with the semantic --sbr-popup-* vars (remapped per theme) so Light /
2325 Dark / Minimal all inherit without per-theme blocks.
2326 ───────────────────────────────────────────────────────────────────────── */
2327 .sbr-review-alert__pros-cons {
2328 display: flex;
2329 flex-direction: column;
2330 gap: 6px;
2331 margin-top: 8px;
2332 font-size: 13px;
2333 line-height: 1.45;
2334 color: var(--sbr-popup-text);
2335 }
2336 .sbr-review-alert__pc {
2337 display: flex;
2338 align-items: flex-start;
2339 gap: 6px;
2340 }
2341 .sbr-review-alert__pc-mark {
2342 flex-shrink: 0;
2343 width: 16px;
2344 height: 16px;
2345 display: inline-flex;
2346 align-items: center;
2347 justify-content: center;
2348 border-radius: 50%;
2349 font-weight: 700;
2350 font-size: 11px;
2351 line-height: 1;
2352 margin-top: 2px;
2353 }
2354 .sbr-review-alert__pc--pro .sbr-review-alert__pc-mark { background: rgba(0, 130, 52, 0.14); color: #12a150; }
2355 .sbr-review-alert__pc--con .sbr-review-alert__pc-mark { background: var(--sbr-popup-bg-inner); color: var(--sbr-popup-text-muted); }
2356 .sbr-review-alert__helpful {
2357 margin-top: 6px;
2358 font-size: 12px;
2359 color: var(--sbr-popup-text-muted);
2360 }
2361
2362 /* SMASH-782: On dark + minimal-dark themes the booking pros/cons smiley icons
2363 (green "pro" + near-black "con") are hard to read on the dark card. Recolor
2364 both to a soft light gray so they stay visible. Shared CSS, so this covers
2365 the frontend popup AND the admin React preview.
2366 NOTE: target the __pc--pro/--con row classes (real JSX classNames) rather
2367 than the sb-item-*-icon classes — the latter live only inside inline-SVG
2368 strings and get tree-shaken out of the customizer bundle. */
2369 .sbr-review-alert--dark .sbr-review-alert__pc--pro svg path,
2370 .sbr-review-alert--dark .sbr-review-alert__pc--con svg path,
2371 .sbr-review-alert--minimal-dark .sbr-review-alert__pc--pro svg path,
2372 .sbr-review-alert--minimal-dark .sbr-review-alert__pc--con svg path {
2373 fill: #c9ccd6 !important;
2374 }
2375 .sbr-review-alert__ali-meta {
2376 display: flex;
2377 align-items: center;
2378 gap: 8px;
2379 margin-top: 6px;
2380 }
2381 .sbr-review-alert__buyer-flag { font-size: 14px; line-height: 1; }
2382 .sbr-review-alert__translated {
2383 font-size: 12px;
2384 font-style: italic;
2385 color: var(--sbr-popup-text-muted);
2386 }
2387 .sbr-review-alert__variants {
2388 display: flex;
2389 flex-wrap: wrap;
2390 gap: 6px;
2391 margin-top: 10px;
2392 margin-bottom: 8px;
2393 }
2394 /* SMASH-782: match the single-feed variant pill (.sb-item-variants-pill) so the
2395 alert reads identically to the feed — an OUTLINED box (1px border, 4px radius,
2396 transparent bg, muted text), not a filled rounded pill. The border/text derive
2397 from the popup's muted token so it stays legible on Light / Dark / Minimal. */
2398 .sbr-review-alert__variant-pill {
2399 font-size: 12px;
2400 padding: 3px 10px;
2401 border-radius: 4px;
2402 border: 1px solid color-mix(in oklch, var(--sbr-popup-text-muted) 35%, transparent);
2403 background: transparent;
2404 color: var(--sbr-popup-text-muted);
2405 }
2406 /* SMASH-782: match the single-feed host reply (.sb-item-reply, sb-common.css) —
2407 a LEFT-BORDER block, NOT a filled box. The old filled --sbr-popup-bg-inner
2408 background rendered as an unreadable accent "blob" on the accent/dark themes.
2409 Same geometry/feel as the feed; only the text + left-border colors come from
2410 the popup theme tokens so it stays readable on Light / Dark / Minimal. */
2411 .sbr-review-alert__reply {
2412 clear: both;
2413 margin-top: 12px;
2414 margin-bottom: 12px;
2415 padding: 10px 0 10px 12px;
2416 border-left: 1.5px solid color-mix(in oklch, var(--sbr-popup-text-muted) 55%, transparent);
2417 background: transparent;
2418 font-size: 12px;
2419 line-height: 1.6;
2420 color: var(--sbr-popup-text);
2421 }
2422 .sbr-review-alert__reply-label {
2423 display: inline-block;
2424 font-weight: 600;
2425 font-size: 12px;
2426 color: var(--sbr-popup-text);
2427 margin-bottom: 2px;
2428 }
2429 .sbr-review-alert__reply-text {
2430 display: block;
2431 font-size: 12px;
2432 line-height: 1.6;
2433 color: var(--sbr-popup-text);
2434 }
2435
2436 /* SMASH-782 — Booking-only aggregate header: native 0-10 score + word in place of 0-5 stars. */
2437 .sbr-review-alert__booking-word {
2438 font-size: 13px;
2439 font-weight: 600;
2440 line-height: 1.2;
2441 margin-top: 2px;
2442 color: var(--sbr-popup-text);
2443 }
2444