PluginProbe
Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner… / 3.0.0
Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner… v3.0.0
3.0.0 2.11.12 2.11.11 2.11.10 2.11.9 2.11.7 2.11.8 2.11.6 2.11.5 2.11.4 2.11.3 2.11.1 2.11.2 2.11.0 2.10.5 2.10.4 2.10.3 2.10.2 2.10.1 2.10.0 2.9.9 2.9.8 2.9.6 2.9.7 2.9.5 All 88 releases
vigilante / assets / css / admin.css

admin.css in Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner… 3.0.0, at assets/css/admin.css

3,978 lines 78.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * Vigilante Admin Styles
3 *
4 * @package Vigilante
5 */
6
7 /* General Layout */
8 .vigilante-admin-wrap {
9 /* Full width - no max-width restriction */
10 }
11
12 .vigilante-page-title {
13 display: flex;
14 align-items: center;
15 gap: 10px;
16 margin-bottom: 20px;
17 }
18
19 .vigilante-page-title .dashicons {
20 font-size: 30px;
21 width: 30px;
22 height: 30px;
23 color: #4caf50;
24 }
25
26 /* Title icon (PNG) */
27 .vigilante-title-icon {
28 width: 32px;
29 height: 32px;
30 vertical-align: middle;
31 }
32
33 /* Activation notice */
34 .vigilante-activation-notice p {
35 display: flex;
36 align-items: center;
37 gap: 10px;
38 }
39
40 .vigilante-notice-icon {
41 color: #4caf50;
42 font-size: 20px;
43 width: 20px;
44 height: 20px;
45 }
46
47 .vigilante-version {
48 font-size: 12px;
49 font-weight: normal;
50 color: #666;
51 background: #f0f0f0;
52 padding: 2px 8px;
53 border-radius: 3px;
54 }
55
56 /* Header row with inline search */
57 .vigilante-header-row {
58 display: flex;
59 align-items: center;
60 gap: 20px;
61 flex-wrap: wrap;
62 margin-bottom: 20px;
63 }
64
65 .vigilante-header-row .vigilante-page-title {
66 margin-bottom: 0;
67 }
68
69 .vigilante-search-wrapper {
70 position: relative;
71 flex: 0 1 480px;
72 min-width: 320px;
73 max-width: 520px;
74 }
75
76 .vigilante-search-input-wrap {
77 position: relative;
78 display: flex;
79 align-items: center;
80 }
81
82 .vigilante-search-input-wrap .vigilante-search-icon {
83 position: absolute;
84 left: 12px;
85 top: 50%;
86 transform: translateY(-50%);
87 color: #6c7781;
88 pointer-events: none;
89 font-size: 18px;
90 width: 18px;
91 height: 18px;
92 line-height: 1;
93 z-index: 1;
94 }
95
96 .vigilante-search-input-wrap .vigilante-settings-search {
97 width: 100%;
98 height: 36px;
99 padding: 0 72px 0 40px;
100 font-size: 13px;
101 line-height: 36px;
102 border: 1px solid #c3c4c7;
103 border-radius: 6px;
104 background: #fff;
105 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
106 transition: border-color 0.15s ease, box-shadow 0.15s ease;
107 box-sizing: border-box;
108 }
109
110 .vigilante-settings-search:focus {
111 border-color: #2271b1;
112 box-shadow: 0 0 0 2px rgba(34, 113, 177, 0.25);
113 outline: 0;
114 }
115
116 .vigilante-settings-search::-webkit-search-cancel-button {
117 cursor: pointer;
118 }
119
120 .vigilante-search-shortcut {
121 position: absolute;
122 right: 10px;
123 top: 50%;
124 transform: translateY(-50%);
125 font-size: 11px;
126 line-height: 1;
127 color: #6c7781;
128 background: #f0f0f1;
129 border: 1px solid #dcdcde;
130 border-radius: 3px;
131 padding: 3px 6px;
132 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Menlo, Consolas, monospace;
133 pointer-events: none;
134 transition: opacity 0.15s ease;
135 white-space: nowrap;
136 }
137
138 .vigilante-settings-search:focus ~ .vigilante-search-shortcut,
139 .vigilante-settings-search:not(:placeholder-shown) ~ .vigilante-search-shortcut {
140 opacity: 0;
141 }
142
143 .vigilante-search-results {
144 position: absolute;
145 top: calc(100% + 6px);
146 right: 0;
147 left: 0;
148 max-height: 60vh;
149 overflow-y: auto;
150 background: #fff;
151 border: 1px solid #c3c4c7;
152 border-radius: 6px;
153 box-shadow: 0 8px 24px rgba(0, 0, 0, 0.14);
154 z-index: 9999;
155 }
156
157 .vigilante-search-results[hidden] {
158 display: none;
159 }
160
161 .vigilante-search-group {
162 border-bottom: 1px solid #f0f0f1;
163 }
164
165 .vigilante-search-group:last-child {
166 border-bottom: none;
167 }
168
169 .vigilante-search-group-title {
170 font-size: 11px;
171 font-weight: 600;
172 text-transform: uppercase;
173 letter-spacing: 0.04em;
174 color: #646970;
175 padding: 8px 12px 4px;
176 background: #f6f7f7;
177 }
178
179 .vigilante-search-item {
180 display: flex;
181 flex-direction: column;
182 gap: 2px;
183 padding: 8px 12px;
184 text-decoration: none;
185 color: #1d2327;
186 border-top: 1px solid #f6f7f7;
187 }
188
189 .vigilante-search-item:first-of-type {
190 border-top: none;
191 }
192
193 .vigilante-search-item:hover,
194 .vigilante-search-item:focus,
195 .vigilante-search-item-active {
196 background: #f0f6fc;
197 color: #2271b1;
198 text-decoration: none;
199 outline: none;
200 }
201
202 .vigilante-search-item-active .vigilante-search-item-label {
203 font-weight: 600;
204 }
205
206 .vigilante-search-item-label {
207 font-size: 13px;
208 font-weight: 500;
209 }
210
211 .vigilante-search-item-section {
212 font-size: 11px;
213 color: #646970;
214 }
215
216 .vigilante-search-empty {
217 padding: 12px 14px;
218 font-size: 13px;
219 color: #646970;
220 text-align: center;
221 }
222
223 .vigilante-search-more {
224 padding: 12px 14px;
225 font-size: 13px;
226 color: #646970;
227 text-align: center;
228 border-top: 1px solid #dcdcde;
229 }
230
231 /* Tabs */
232 .vigilante-nav-tabs {
233 margin-bottom: 20px;
234 }
235
236 .vigilante-nav-tabs .vigilante-tab-disabled {
237 opacity: 0.6;
238 position: relative;
239 }
240
241 .vigilante-nav-tabs .vigilante-tab-disabled .vigilante-tab-off {
242 font-size: 9px;
243 background: #dc3232;
244 color: #fff;
245 padding: 1px 4px;
246 border-radius: 2px;
247 margin-left: 5px;
248 text-transform: uppercase;
249 font-weight: 600;
250 }
251
252 /* Disabled Module Notice */
253 .vigilante-module-disabled-notice {
254 margin: 0 20px 20px 20px !important;
255 }
256
257 /* Disabled Form */
258 .vigilante-form-disabled {
259 pointer-events: none;
260 opacity: 0.5;
261 filter: grayscale(50%);
262 }
263
264 .vigilante-form-disabled * {
265 cursor: not-allowed !important;
266 }
267
268 /* Content Layout */
269 .vigilante-content {
270 display: grid;
271 grid-template-columns: 1fr 300px;
272 gap: 20px;
273 align-items: start;
274 }
275
276 @media screen and (max-width: 1200px) {
277 .vigilante-content {
278 grid-template-columns: 1fr;
279 }
280 }
281
282 .vigilante-main {
283 background: #fff;
284 border: 1px solid #c3c4c7;
285 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
286 }
287
288 /* Settings Sections */
289 .vigilante-settings-section {
290 padding: 20px;
291 border-bottom: 1px solid #e5e5e5;
292 }
293
294 .vigilante-settings-section:last-child {
295 border-bottom: none;
296 }
297
298 /* Remove border when submit buttons follow */
299 .vigilante-settings-section:last-of-type {
300 border-bottom: none;
301 }
302
303 .vigilante-settings-section h2 {
304 margin-top: 0;
305 padding-bottom: 10px;
306 border-bottom: 1px solid #eee;
307 }
308
309 .vigilante-settings-section h3 {
310 margin-top: 20px;
311 margin-bottom: 10px;
312 }
313
314 /* Dashboard */
315 .vigilante-dashboard {
316 padding: 20px;
317 }
318
319 .vigilante-status-card,
320 .vigilante-modules-grid,
321 .vigilante-quick-stats,
322 .vigilante-presets-card {
323 background: #fff;
324 border: 1px solid #e5e5e5;
325 border-radius: 4px;
326 padding: 20px;
327 margin-bottom: 20px;
328 }
329
330 .vigilante-status-card h2,
331 .vigilante-modules-grid h2,
332 .vigilante-quick-stats h2,
333 .vigilante-presets-card h2 {
334 margin-top: 0;
335 margin-bottom: 15px;
336 font-size: 16px;
337 }
338
339 /* Security Score */
340 .vigilante-security-score {
341 text-align: center;
342 padding: 20px;
343 }
344
345 .vigilante-score-circle {
346 width: 120px;
347 height: 120px;
348 border-radius: 50%;
349 display: inline-flex;
350 flex-direction: column;
351 align-items: center;
352 justify-content: center;
353 margin-bottom: 10px;
354 border: 4px solid;
355 }
356
357 .vigilante-score-circle.vigilante-grade-a {
358 background: #e8f5e9;
359 border-color: #4caf50;
360 color: #2e7d32;
361 }
362
363 .vigilante-score-circle.vigilante-grade-b {
364 background: #e3f2fd;
365 border-color: #2196f3;
366 color: #1565c0;
367 }
368
369 .vigilante-score-circle.vigilante-grade-c {
370 background: #fff3e0;
371 border-color: #ff9800;
372 color: #e65100;
373 }
374
375 .vigilante-score-circle.vigilante-grade-d {
376 background: #ffebee;
377 border-color: #f44336;
378 color: #c62828;
379 }
380
381 .vigilante-score-circle.vigilante-grade-e {
382 background: #fce4ec;
383 border-color: #c2185b;
384 color: #880e4f;
385 }
386
387 .vigilante-grade {
388 font-size: 48px;
389 font-weight: bold;
390 line-height: 1;
391 }
392
393 .vigilante-score-text {
394 font-size: 14px;
395 }
396
397 /* Configuration Status Badge */
398 .vigilante-config-status {
399 margin-top: 15px;
400 }
401
402 .vigilante-preset-badge {
403 display: inline-block;
404 padding: 5px 12px;
405 border-radius: 20px;
406 font-size: 12px;
407 font-weight: 600;
408 text-transform: uppercase;
409 letter-spacing: 0.5px;
410 }
411
412 .vigilante-preset-badge.vigilante-preset-standard {
413 background: #e3f2fd;
414 color: #1565c0;
415 }
416
417 .vigilante-preset-badge.vigilante-preset-maximum {
418 background: #e8f5e9;
419 color: #2e7d32;
420 }
421
422 .vigilante-preset-badge.vigilante-preset-custom {
423 background: #fff3e0;
424 color: #e65100;
425 }
426
427 .vigilante-preset-badge.vigilante-preset-under-attack {
428 background: #fce4ec;
429 color: #c62828;
430 animation: vigilante-ua-pulse 2s ease-in-out infinite;
431 }
432
433 @keyframes vigilante-ua-pulse {
434 0%, 100% { opacity: 1; }
435 50% { opacity: 0.7; }
436 }
437
438 /* Recommendations List */
439 .vigilante-recommendations {
440 margin-top: 20px;
441 padding-top: 15px;
442 border-top: 1px solid #eee;
443 text-align: left;
444 }
445
446 .vigilante-recommendations h4 {
447 margin: 0 0 12px;
448 font-size: 14px;
449 font-weight: 600;
450 color: #1d2327;
451 text-transform: uppercase;
452 letter-spacing: 0.5px;
453 }
454
455 .vigilante-recommendations ul {
456 margin: 0;
457 padding: 0;
458 list-style: none;
459 }
460
461 .vigilante-recommendations ul.vigilante-recommendations-grid {
462 display: grid;
463 grid-template-columns: repeat(2, 1fr);
464 gap: 8px 20px;
465 }
466
467 .vigilante-recommendations li {
468 display: flex;
469 align-items: flex-start;
470 gap: 8px;
471 margin-bottom: 8px;
472 font-size: 13px;
473 color: #50575e;
474 line-height: 1.4;
475 }
476
477 .vigilante-recommendations-grid li {
478 margin-bottom: 0;
479 }
480
481 .vigilante-rec-link {
482 display: inline-flex;
483 align-items: center;
484 justify-content: center;
485 width: 18px;
486 height: 18px;
487 border-radius: 50%;
488 background: #f0f0f1;
489 text-decoration: none;
490 margin-left: 4px;
491 vertical-align: middle;
492 flex-shrink: 0;
493 }
494
495 .vigilante-rec-link .dashicons {
496 font-size: 14px;
497 width: 14px;
498 height: 14px;
499 color: #2271b1;
500 }
501
502 .vigilante-rec-link:hover {
503 background: #2271b1;
504 }
505
506 .vigilante-rec-link:hover .dashicons {
507 color: #fff;
508 }
509
510 .vigilante-more-recommendations {
511 margin: 10px 0 0;
512 font-size: 12px;
513 color: #787c82;
514 font-style: italic;
515 }
516
517 .vigilante-recommendations li .dashicons {
518 flex-shrink: 0;
519 font-size: 16px;
520 width: 16px;
521 height: 16px;
522 }
523
524 /* Icon colors by priority class */
525 .vigilante-recommendations li span.vigilante-priority-critical,
526 .vigilante-recommendations li span.vigilante-priority-critical::before {
527 color: #d63638 !important;
528 }
529
530 .vigilante-recommendations li span.vigilante-priority-high,
531 .vigilante-recommendations li span.vigilante-priority-high::before {
532 color: #dba617 !important;
533 }
534
535 .vigilante-recommendations li span.vigilante-priority-medium,
536 .vigilante-recommendations li span.vigilante-priority-medium::before,
537 .vigilante-recommendations li span.vigilante-priority-low,
538 .vigilante-recommendations li span.vigilante-priority-low::before {
539 color: #72aee6 !important;
540 }
541
542 /* Responsive: 1 column on smaller screens */
543 @media screen and (max-width: 1200px) {
544 .vigilante-recommendations ul.vigilante-recommendations-grid {
545 grid-template-columns: 1fr;
546 }
547 }
548
549 /* Active Preset Card */
550 .vigilante-preset-card.vigilante-preset-active {
551 position: relative;
552 border-color: var(--vigilante-brand, #4caf50);
553 background: #f8fff8;
554 }
555
556 .vigilante-active-indicator {
557 position: absolute;
558 top: -8px;
559 right: 15px;
560 background: var(--vigilante-brand, #4caf50);
561 color: #fff;
562 font-size: 10px;
563 font-weight: 600;
564 text-transform: uppercase;
565 padding: 3px 10px;
566 border-radius: 10px;
567 }
568
569 /* Modules Grid */
570 .vigilante-modules-list {
571 display: grid;
572 grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
573 gap: 15px;
574 }
575
576 .vigilante-module-item {
577 display: flex;
578 flex-direction: column;
579 padding: 15px;
580 background: #f9f9f9;
581 border-radius: 6px;
582 border: 1px solid #e0e0e0;
583 }
584
585 .vigilante-module-item.enabled {
586 background: #e8f5e9;
587 border-color: #a5d6a7;
588 }
589
590 .vigilante-module-item.disabled {
591 background: #fafafa;
592 border-color: #e0e0e0;
593 }
594
595 .vigilante-module-header {
596 display: flex;
597 align-items: center;
598 gap: 10px;
599 }
600
601 .vigilante-module-desc {
602 margin: 10px 0 0 20px;
603 font-size: 12px;
604 color: #666;
605 line-height: 1.4;
606 }
607
608 .vigilante-module-status {
609 width: 10px;
610 height: 10px;
611 border-radius: 50%;
612 flex-shrink: 0;
613 }
614
615 .vigilante-module-item.enabled .vigilante-module-status {
616 background: #4caf50;
617 }
618
619 .vigilante-module-item.disabled .vigilante-module-status {
620 background: #9e9e9e;
621 }
622
623 .vigilante-module-item.vigilante-loading {
624 opacity: 0.7;
625 pointer-events: none;
626 }
627
628 .vigilante-module-item.vigilante-loading .vigilante-module-status {
629 background: #ff9800;
630 animation: pulse 0.5s infinite;
631 }
632
633 @keyframes pulse {
634 0%, 100% { opacity: 1; }
635 50% { opacity: 0.5; }
636 }
637
638 .vigilante-module-name {
639 flex: 1;
640 font-weight: 600;
641 font-size: 14px;
642 }
643
644 /* Toggle Switch */
645 .vigilante-toggle {
646 position: relative;
647 display: inline-block;
648 width: 44px;
649 height: 24px;
650 }
651
652 .vigilante-toggle input {
653 opacity: 0;
654 width: 0;
655 height: 0;
656 }
657
658 .vigilante-toggle-slider {
659 position: absolute;
660 cursor: pointer;
661 top: 0;
662 left: 0;
663 right: 0;
664 bottom: 0;
665 background-color: #ccc;
666 transition: 0.3s;
667 border-radius: 24px;
668 }
669
670 .vigilante-toggle-slider:before {
671 position: absolute;
672 content: "";
673 height: 18px;
674 width: 18px;
675 left: 3px;
676 bottom: 3px;
677 background-color: white;
678 transition: 0.3s;
679 border-radius: 50%;
680 }
681
682 .vigilante-toggle input:checked + .vigilante-toggle-slider {
683 background-color: #2196f3;
684 }
685
686 .vigilante-toggle input:checked + .vigilante-toggle-slider:before {
687 transform: translateX(20px);
688 }
689
690 /* Quick Stats */
691 .vigilante-stats-grid {
692 display: grid;
693 grid-template-columns: repeat(4, 1fr);
694 gap: 15px;
695 }
696
697 @media screen and (max-width: 768px) {
698 .vigilante-stats-grid {
699 grid-template-columns: repeat(2, 1fr);
700 }
701 }
702
703 .vigilante-stat-item {
704 text-align: center;
705 padding: 15px;
706 background: #f9f9f9;
707 border-radius: 4px;
708 }
709
710 .vigilante-stat-number {
711 display: block;
712 font-size: 28px;
713 font-weight: bold;
714 color: #333;
715 }
716
717 .vigilante-stat-label {
718 font-size: 12px;
719 color: #666;
720 text-transform: uppercase;
721 }
722
723 /* Presets */
724 .vigilante-presets-grid {
725 display: grid;
726 grid-template-columns: repeat(3, 1fr);
727 gap: 15px;
728 margin-top: 15px;
729 }
730
731 @media screen and (max-width: 960px) {
732 .vigilante-presets-grid {
733 grid-template-columns: repeat(2, 1fr);
734 }
735 }
736
737 @media screen and (max-width: 600px) {
738 .vigilante-presets-grid {
739 grid-template-columns: 1fr;
740 }
741 }
742
743 .vigilante-preset-card {
744 display: flex;
745 flex-direction: column;
746 background: #f9f9f9;
747 border: 1px solid #e0e0e0;
748 border-radius: 6px;
749 padding: 20px;
750 }
751
752 .vigilante-preset-card h3 {
753 margin: 0 0 10px 0;
754 font-size: 16px;
755 color: #1d2327;
756 }
757
758 .vigilante-preset-card p {
759 margin: 0 0 15px 0;
760 font-size: 13px;
761 color: #666;
762 line-height: 1.5;
763 }
764
765 .vigilante-preset-card .button {
766 width: 100%;
767 margin-top: auto;
768 flex: none;
769 }
770
771 .vigilante-presets-buttons {
772 display: flex;
773 gap: 10px;
774 margin-bottom: 15px;
775 }
776
777 .vigilante-preset-btn {
778 flex: 1;
779 padding: 12px 20px !important;
780 height: auto !important;
781 }
782
783 /* Under Attack card */
784 .vigilante-under-attack-card {
785 border: 2px dashed #e8a317;
786 background: #fffcf5;
787 }
788
789 .vigilante-under-attack-card h3 {
790 display: flex;
791 align-items: center;
792 gap: 6px;
793 }
794
795 .vigilante-under-attack-card h3 .dashicons {
796 color: #e8a317;
797 font-size: 18px;
798 width: 18px;
799 height: 18px;
800 }
801
802 .vigilante-under-attack-active {
803 border-style: solid;
804 border-color: #d63638;
805 background: #fef7f7;
806 }
807
808 .vigilante-under-attack-active h3 .dashicons {
809 color: #d63638;
810 }
811
812 .vigilante-ua-countdown {
813 display: flex;
814 align-items: center;
815 gap: 6px;
816 margin-bottom: 12px;
817 font-size: 14px;
818 font-weight: 600;
819 color: #8b6914;
820 }
821
822 .vigilante-under-attack-active .vigilante-ua-countdown {
823 color: #b32d2e;
824 }
825
826 .vigilante-ua-countdown .dashicons {
827 font-size: 16px;
828 width: 16px;
829 height: 16px;
830 }
831
832 .vigilante-ua-btn {
833 width: 100%;
834 margin-top: auto;
835 flex: none;
836 padding: 10px 20px !important;
837 height: auto !important;
838 }
839
840 .vigilante-ua-activate {
841 border-color: #e8a317 !important;
842 color: #8b6914 !important;
843 background: #fff !important;
844 }
845
846 .vigilante-ua-activate:hover {
847 background: #fef8ee !important;
848 border-color: #d09912 !important;
849 }
850
851 .vigilante-ua-deactivate {
852 border-color: #d63638 !important;
853 color: #d63638 !important;
854 background: #fff !important;
855 }
856
857 .vigilante-ua-deactivate:hover {
858 background: #d63638 !important;
859 color: #fff !important;
860 }
861
862 /* Under Attack admin notice */
863 .vigilante-ua-notice {
864 border-left-color: #e8a317;
865 }
866
867 .vigilante-ua-notice .dashicons {
868 color: #e8a317;
869 margin-right: 4px;
870 vertical-align: middle;
871 }
872
873 /* Inline Under Attack warning shown above Tools cards.
874 * Match the cards grid below: same horizontal padding, no wider/narrower. */
875 .vigilante-ua-tools-notice-wrap {
876 margin: 0 0 16px 0;
877 padding: 0 20px;
878 box-sizing: border-box;
879 }
880
881 .vigilante-ua-tools-notice {
882 border-left-color: #e8a317;
883 margin: 0;
884 padding: 10px 12px;
885 box-sizing: border-box;
886 }
887
888 .vigilante-ua-tools-notice p {
889 margin: 0;
890 }
891
892 /* Sidebar */
893 .vigilante-sidebar-widget {
894 background: #fff;
895 border: 1px solid #c3c4c7;
896 padding: 15px;
897 margin-bottom: 20px;
898 }
899
900 .vigilante-sidebar-widget h3 {
901 margin-top: 0;
902 margin-bottom: 10px;
903 padding-bottom: 10px;
904 border-bottom: 1px solid #eee;
905 }
906
907 .vigilante-sidebar-widget ul {
908 margin: 10px 0;
909 padding-left: 20px;
910 }
911
912 .vigilante-sidebar-widget ul li {
913 margin-bottom: 5px;
914 }
915
916 /* Promo widgets with icons */
917 .vigilante-promo-widget > .dashicons {
918 font-size: 24px;
919 width: 24px;
920 height: 24px;
921 color: #4caf50;
922 margin-bottom: 10px;
923 }
924
925 .vigilante-promo-widget .button {
926 margin-top: 5px;
927 width: 100%;
928 text-align: center;
929 }
930
931 /* Activity Log */
932 .vigilante-log-filters {
933 display: flex;
934 gap: 10px;
935 margin-bottom: 15px;
936 flex-wrap: wrap;
937 align-items: center;
938 }
939
940 /* Pagination controls */
941 .vigilante-pagination {
942 display: inline-flex;
943 align-items: center;
944 gap: 4px;
945 margin-left: auto;
946 white-space: nowrap;
947 }
948
949 .vigilante-pagination button {
950 background: none;
951 border: 1px solid #c3c4c7;
952 border-radius: 3px;
953 color: #2271b1;
954 cursor: pointer;
955 font-size: 16px;
956 line-height: 1;
957 padding: 2px 6px;
958 min-width: 28px;
959 text-align: center;
960 }
961
962 .vigilante-pagination button:hover:not(:disabled) {
963 border-color: #2271b1;
964 color: #135e96;
965 }
966
967 .vigilante-pagination button:disabled {
968 color: #a7aaad;
969 border-color: #dcdcde;
970 cursor: default;
971 }
972
973 .vigilante-page-info {
974 font-size: 13px;
975 color: #50575e;
976 padding: 0 6px;
977 }
978
979 /* File integrity pagination wrapper */
980 .vigilante-fi-pagination-wrap {
981 display: flex;
982 justify-content: flex-end;
983 margin-bottom: 8px;
984 min-height: 28px;
985 }
986
987 /* File integrity bulk action bar (above each scan results table) */
988 .vigilante-fi-bulk-bar {
989 display: flex;
990 align-items: center;
991 gap: 10px;
992 margin: 8px 0;
993 }
994
995 .vigilante-fi-bulk-count {
996 color: #50575e;
997 font-size: 13px;
998 }
999
1000 /* Tighten the checkbox column to match WP core list-table look */
1001 .vigilante-fi-paginated th.check-column,
1002 .vigilante-fi-paginated td.check-column {
1003 width: 2.2em;
1004 padding: 6px 0 6px 8px;
1005 vertical-align: middle;
1006 }
1007
1008 .vigilante-log-filters select,
1009 .vigilante-log-filters input[type="text"] {
1010 min-width: 150px;
1011 }
1012
1013 /* Search input in activity log */
1014 .vigilante-log-search-input {
1015 min-width: 240px;
1016 box-sizing: border-box;
1017 }
1018
1019 /* Activity log table wrapper - horizontal scroll on narrow screens */
1020 .vigilante-log-table-wrap {
1021 overflow-x: auto;
1022 -webkit-overflow-scrolling: touch;
1023 }
1024
1025 /* Activity log table - auto layout lets browser distribute space */
1026 #vigilante-activity-log-table {
1027 table-layout: auto;
1028 min-width: 800px;
1029 }
1030
1031 #vigilante-activity-log-table .column-date { width: 140px; white-space: nowrap; }
1032 #vigilante-activity-log-table .column-type { width: 90px; }
1033 #vigilante-activity-log-table .column-method { width: 55px; white-space: nowrap; }
1034 #vigilante-activity-log-table .column-severity { width: auto; white-space: nowrap; }
1035 #vigilante-activity-log-table .column-message { min-width: 200px; }
1036 #vigilante-activity-log-table .column-user { width: 90px; }
1037 #vigilante-activity-log-table .column-ip { width: 120px; white-space: nowrap; }
1038 #vigilante-activity-log-table .column-details { width: 60px; white-space: nowrap; }
1039
1040 /* IPv6 addresses (and long hashes) are single unbreakable tokens: colons are
1041 not break opportunities and WP core's word-wrap:break-word does not lower a
1042 cell's min-content. Under table-layout:auto that pushes the IP cell — and the
1043 whole table — past the viewport on mid-width screens, so the page scrolls
1044 horizontally and slides under the fixed admin menu. Let the value wrap (same
1045 technique as the log-details modal). IPv4 is short and unaffected. */
1046 #vigilante-activity-log-table td code { word-break: break-all; }
1047
1048 /* Badges */
1049 .vigilante-badge {
1050 display: inline-block;
1051 padding: 2px 8px;
1052 border-radius: 3px;
1053 font-size: 11px;
1054 font-weight: 600;
1055 text-transform: uppercase;
1056 white-space: nowrap;
1057 }
1058
1059 .vigilante-badge-info {
1060 background: #e3f2fd;
1061 color: #1565c0;
1062 }
1063
1064 .vigilante-badge-warning {
1065 background: #fff3e0;
1066 color: #e65100;
1067 }
1068
1069 .vigilante-badge-critical {
1070 background: #ffebee;
1071 color: #c62828;
1072 }
1073
1074 /* Notification status indicators */
1075 .vigilante-status-active {
1076 display: inline-block;
1077 padding: 2px 8px;
1078 border-radius: 3px;
1079 font-size: 11px;
1080 font-weight: 600;
1081 background: #edfaef;
1082 color: #00a32a;
1083 }
1084
1085 .vigilante-status-inactive {
1086 display: inline-block;
1087 padding: 2px 8px;
1088 border-radius: 3px;
1089 font-size: 11px;
1090 font-weight: 600;
1091 background: #f0f0f1;
1092 color: #787c82;
1093 }
1094
1095 /* Notification settings two-column layout */
1096 .vigilante-notification-section {
1097 margin-bottom: 30px;
1098 }
1099
1100 .vigilante-notification-layout {
1101 display: grid;
1102 grid-template-columns: 1fr 1fr;
1103 gap: 24px;
1104 margin-top: 16px;
1105 }
1106
1107 @media (max-width: 1200px) {
1108 .vigilante-notification-layout {
1109 grid-template-columns: 1fr;
1110 }
1111 }
1112
1113 .vigilante-notification-settings .vigilante-compact-form th {
1114 width: 140px;
1115 padding: 10px 10px 10px 0;
1116 }
1117
1118 .vigilante-notification-settings .vigilante-compact-form td {
1119 padding: 10px 0;
1120 }
1121
1122 .vigilante-notification-submit {
1123 /* Flex + gap so the "Send test email" button keeps a gap from "Save
1124 Settings" even when a longer translated label wraps it to the next line
1125 (inline whitespace collapses on wrap and glues them together otherwise). */
1126 display: flex;
1127 flex-wrap: wrap;
1128 gap: 10px;
1129 align-items: center;
1130 margin: 8px 0 0 !important;
1131 padding: 0 !important;
1132 background: none !important;
1133 border: none !important;
1134 }
1135
1136 .vigilante-notification-submit .button {
1137 margin: 0 !important;
1138 }
1139
1140 .vigilante-notification-summary h3 {
1141 margin-top: 0;
1142 margin-bottom: 12px;
1143 }
1144
1145 .vigilante-notification-summary .widefat td,
1146 .vigilante-notification-summary .widefat th {
1147 padding: 6px 8px;
1148 font-size: 13px;
1149 }
1150
1151 /* Tools heading */
1152 .vigilante-tools-heading {
1153 padding: 0 20px;
1154 margin: 10px 0 0;
1155 }
1156
1157 /* Severity rows in log */
1158 .vigilante-severity-warning {
1159 background: #fff8e1 !important;
1160 }
1161
1162 .vigilante-severity-critical {
1163 background: #ffebee !important;
1164 }
1165
1166 /* Tools Grid */
1167 .vigilante-tools-grid {
1168 display: grid;
1169 grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
1170 gap: 20px;
1171 padding: 20px;
1172 }
1173
1174 .vigilante-tool-card {
1175 background: #fff;
1176 border: 1px solid #e5e5e5;
1177 border-radius: 4px;
1178 padding: 20px;
1179 }
1180
1181 .vigilante-tool-card h3 {
1182 margin-top: 0;
1183 margin-bottom: 10px;
1184 }
1185
1186 .vigilante-tool-card p {
1187 color: #666;
1188 margin-bottom: 15px;
1189 }
1190
1191 .vigilante-tool-card ul {
1192 margin: 0 0 15px 20px;
1193 padding: 0;
1194 }
1195
1196 /* Forms */
1197 .vigilante-settings-form .submit {
1198 padding: 15px 20px;
1199 background: #f6f7f7;
1200 border-top: 1px solid #c3c4c7;
1201 margin: 0;
1202 }
1203
1204 .vigilante-save-btn {
1205 min-width: 200px;
1206 }
1207
1208 /* Headers Test Results */
1209 #vigilante-headers-result {
1210 margin-top: 15px;
1211 padding: 15px;
1212 background: #f9f9f9;
1213 border-radius: 4px;
1214 display: none;
1215 }
1216
1217 #vigilante-headers-result.visible {
1218 display: block;
1219 }
1220
1221 #vigilante-headers-result .vigilante-security-score {
1222 text-align: center;
1223 padding: 20px 0;
1224 }
1225
1226 #vigilante-headers-result .vigilante-score-circle {
1227 margin: 0 auto 10px auto;
1228 display: flex;
1229 }
1230
1231 #vigilante-headers-result .vigilante-grade {
1232 font-size: 36px;
1233 }
1234
1235 #vigilante-headers-result ul {
1236 margin: 10px 0;
1237 padding-left: 20px;
1238 }
1239
1240 #vigilante-headers-result .enabled {
1241 color: #4caf50;
1242 }
1243
1244 #vigilante-headers-result .missing {
1245 color: #f44336;
1246 }
1247
1248 #vigilante-headers-result .warning {
1249 color: #ff9800;
1250 }
1251
1252 /* Loading States */
1253 .vigilante-loading {
1254 opacity: 0.6;
1255 pointer-events: none;
1256 }
1257
1258 .vigilante-spinner {
1259 display: inline-block;
1260 width: 16px;
1261 height: 16px;
1262 border: 2px solid #f3f3f3;
1263 border-top: 2px solid #3498db;
1264 border-radius: 50%;
1265 animation: vigilante-spin 1s linear infinite;
1266 margin-left: 5px;
1267 vertical-align: middle;
1268 }
1269
1270 @keyframes vigilante-spin {
1271 0% { transform: rotate(0deg); }
1272 100% { transform: rotate(360deg); }
1273 }
1274
1275 /* Notices */
1276 .vigilante-notice {
1277 padding: 10px 15px;
1278 border-radius: 4px;
1279 margin-bottom: 15px;
1280 }
1281
1282 .vigilante-notice-success {
1283 background: #e8f5e9;
1284 border-left: 4px solid #4caf50;
1285 color: #2e7d32;
1286 }
1287
1288 .vigilante-notice-error {
1289 background: #ffebee;
1290 border-left: 4px solid #f44336;
1291 color: #c62828;
1292 }
1293
1294 .vigilante-notice-warning {
1295 background: #fff3e0;
1296 border-left: 4px solid #ff9800;
1297 color: #e65100;
1298 }
1299
1300 /* Responsive - Activity log filters (WordPress admin standard breakpoint) */
1301 @media screen and (max-width: 782px) {
1302 .vigilante-log-filters {
1303 flex-direction: column;
1304 }
1305
1306 .vigilante-log-filters select,
1307 .vigilante-log-filters input[type="text"] {
1308 width: 100%;
1309 max-width: 100%;
1310 min-width: 0 !important;
1311 box-sizing: border-box;
1312 }
1313
1314 #vigilante-log-search {
1315 height: 36px !important;
1316 max-height: 36px !important;
1317 padding: 6px 8px !important;
1318 min-width: 0 !important;
1319 }
1320
1321 .vigilante-log-filters .vigilante-pagination {
1322 margin-left: 0;
1323 justify-content: flex-start;
1324 }
1325 }
1326
1327 /* Responsive - General */
1328 @media screen and (max-width: 600px) {
1329 .vigilante-presets-buttons {
1330 flex-direction: column;
1331 }
1332 }
1333
1334 /* Modal Styles */
1335 .vigilante-modal {
1336 display: none;
1337 position: fixed;
1338 z-index: 100000;
1339 left: 0;
1340 top: 0;
1341 width: 100%;
1342 height: 100%;
1343 overflow: auto;
1344 background-color: rgba(0, 0, 0, 0.5);
1345 }
1346
1347 .vigilante-modal-content {
1348 background-color: #fff;
1349 margin: 5% auto;
1350 padding: 25px;
1351 border-radius: 8px;
1352 width: 90%;
1353 max-width: 700px;
1354 max-height: 80vh;
1355 overflow-y: auto;
1356 position: relative;
1357 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
1358 }
1359
1360 .vigilante-modal-close {
1361 position: absolute;
1362 right: 15px;
1363 top: 10px;
1364 color: #666;
1365 font-size: 28px;
1366 font-weight: bold;
1367 cursor: pointer;
1368 }
1369
1370 .vigilante-modal-close:hover {
1371 color: #000;
1372 }
1373
1374 .vigilante-modal-content h3 {
1375 margin-top: 0;
1376 padding-bottom: 10px;
1377 border-bottom: 1px solid #eee;
1378 }
1379
1380 #vigilante-log-details-content table {
1381 width: 100%;
1382 border-collapse: collapse;
1383 }
1384
1385 #vigilante-log-details-content th,
1386 #vigilante-log-details-content td {
1387 padding: 8px 12px;
1388 border-bottom: 1px solid #eee;
1389 text-align: left;
1390 vertical-align: top;
1391 }
1392
1393 #vigilante-log-details-content th {
1394 width: 120px;
1395 font-weight: 600;
1396 color: #555;
1397 }
1398
1399 #vigilante-log-details-content code {
1400 word-break: break-all;
1401 }
1402
1403 #vigilante-log-details-content pre {
1404 background: #f5f5f5;
1405 padding: 10px;
1406 border-radius: 4px;
1407 overflow-x: auto;
1408 font-size: 12px;
1409 margin: 5px 0;
1410 }
1411
1412 /* Log popup sections */
1413 .vigilante-popup-section {
1414 margin-bottom: 16px;
1415 padding-bottom: 12px;
1416 border-bottom: 1px solid #eee;
1417 }
1418
1419 .vigilante-popup-section:last-of-type {
1420 border-bottom: none;
1421 }
1422
1423 .vigilante-popup-section .vigilante-details-table tr:last-child td {
1424 border-bottom: none;
1425 }
1426
1427 .vigilante-popup-section-title {
1428 font-size: 12px;
1429 font-weight: 600;
1430 color: #999;
1431 text-transform: uppercase;
1432 letter-spacing: 0.05em;
1433 margin: 0 0 8px 0;
1434 padding: 0;
1435 }
1436
1437 .vigilante-popup-actions {
1438 display: flex;
1439 flex-wrap: wrap;
1440 align-items: center;
1441 gap: 6px;
1442 margin-top: 10px;
1443 padding-top: 8px;
1444 border-top: 1px dashed #e0e0e0;
1445 }
1446
1447 .vigilante-popup-actions-label {
1448 font-weight: 600;
1449 font-size: 12px;
1450 color: #666;
1451 min-width: 25px;
1452 }
1453
1454 .vigilante-popup-actions .button-small {
1455 font-size: 11px;
1456 line-height: 1.4;
1457 padding: 2px 8px;
1458 }
1459
1460 .vigilante-popup-actions .button-small .dashicons {
1461 font-size: 14px;
1462 width: 14px;
1463 height: 14px;
1464 vertical-align: text-bottom;
1465 }
1466
1467 .vigilante-btn-danger {
1468 color: #a00 !important;
1469 border-color: #a00 !important;
1470 }
1471
1472 .vigilante-btn-danger:hover {
1473 color: #fff !important;
1474 background: #a00 !important;
1475 }
1476
1477 .vigilante-btn-added {
1478 color: #46b450 !important;
1479 border-color: #46b450 !important;
1480 cursor: default;
1481 }
1482
1483 .vigilante-ip-lookup {
1484 text-decoration: none;
1485 color: #2271b1;
1486 vertical-align: middle;
1487 }
1488
1489 .vigilante-ip-lookup .dashicons {
1490 font-size: 16px;
1491 width: 16px;
1492 height: 16px;
1493 vertical-align: text-bottom;
1494 }
1495
1496 .vigilante-ua-cell {
1497 word-break: break-all;
1498 max-width: 400px;
1499 }
1500
1501 .vigilante-popup-footer {
1502 text-align: right;
1503 padding-top: 8px;
1504 margin-top: 4px;
1505 }
1506
1507 .vigilante-popup-id {
1508 font-size: 11px;
1509 color: #aaa;
1510 }
1511
1512 .vigilante-popup-feedback {
1513 margin-top: 8px;
1514 }
1515
1516 .vigilante-popup-msg {
1517 display: block;
1518 padding: 6px 10px;
1519 border-radius: 4px;
1520 font-size: 12px;
1521 line-height: 1.4;
1522 }
1523
1524 .vigilante-popup-msg-success {
1525 background: #e7f5ea;
1526 color: #1a7431;
1527 border-left: 3px solid #46b450;
1528 }
1529
1530 .vigilante-popup-msg-warning {
1531 background: #fef3c7;
1532 color: #92400e;
1533 border-left: 3px solid #dba617;
1534 }
1535
1536 .vigilante-popup-msg-error {
1537 background: #fde8e8;
1538 color: #9b1c1c;
1539 border-left: 3px solid #dc3232;
1540 }
1541
1542 /* HTTP Method labels */
1543 .vigilante-method-label {
1544 display: inline-block;
1545 font-size: 10px;
1546 font-weight: 600;
1547 padding: 1px 6px;
1548 border-radius: 3px;
1549 text-transform: uppercase;
1550 letter-spacing: 0.03em;
1551 }
1552
1553 .vigilante-method-get {
1554 background: #e7f5ea;
1555 color: #1a7431;
1556 }
1557
1558 .vigilante-method-post {
1559 background: #e8f0fe;
1560 color: #1a56db;
1561 }
1562
1563 .vigilante-method-put {
1564 background: #fef3c7;
1565 color: #92400e;
1566 }
1567
1568 .vigilante-method-patch {
1569 background: #fef3c7;
1570 color: #92400e;
1571 }
1572
1573 .vigilante-method-delete {
1574 background: #fde8e8;
1575 color: #9b1c1c;
1576 }
1577
1578 .vigilante-method-options,
1579 .vigilante-method-head {
1580 background: #f3f4f6;
1581 color: #6b7280;
1582 }
1583
1584 /* File Integrity Scan Results */
1585 #vigilante-scan-results {
1586 margin-top: 20px;
1587 background: #fff;
1588 border: 1px solid #c3c4c7;
1589 box-shadow: 0 1px 1px rgba(0,0,0,.04);
1590 }
1591
1592 #vigilante-scan-results h2 {
1593 margin: 0 0 15px 0;
1594 padding-bottom: 10px;
1595 border-bottom: 1px solid #eee;
1596 }
1597
1598 #vigilante-scan-results .vigilante-scan-summary {
1599 margin-top: 0;
1600 }
1601
1602 .vigilante-scan-summary {
1603 display: flex;
1604 gap: 15px;
1605 margin-bottom: 25px;
1606 flex-wrap: wrap;
1607 justify-content: center;
1608 }
1609
1610 .vigilante-scan-stat {
1611 background: #f5f5f5;
1612 padding: 15px 20px;
1613 border-radius: 8px;
1614 text-align: center;
1615 min-width: 90px;
1616 border: 1px solid #ddd;
1617 }
1618
1619 .vigilante-stat-number {
1620 display: block;
1621 font-size: 24px;
1622 font-weight: bold;
1623 color: #333;
1624 line-height: 1.2;
1625 }
1626
1627 .vigilante-stat-label {
1628 display: block;
1629 font-size: 10px;
1630 color: #666;
1631 text-transform: uppercase;
1632 margin-top: 4px;
1633 }
1634
1635 .vigilante-stat-ok .vigilante-stat-number {
1636 color: #00a32a;
1637 }
1638
1639 .vigilante-stat-modified .vigilante-stat-number {
1640 color: #dba617;
1641 }
1642
1643 .vigilante-stat-suspicious .vigilante-stat-number {
1644 color: #d63638;
1645 }
1646
1647 .vigilante-stat-extra .vigilante-stat-number {
1648 color: #b32d2e;
1649 }
1650
1651 .vigilante-stat-ignored .vigilante-stat-number {
1652 color: #826eb4;
1653 }
1654
1655 .vigilante-file-list {
1656 margin-top: 20px;
1657 }
1658
1659 .vigilante-file-list h3 {
1660 margin: 0 0 5px 0;
1661 font-size: 14px;
1662 }
1663
1664 .vigilante-file-list .description {
1665 margin: 0 0 10px 0;
1666 color: #666;
1667 }
1668
1669 .vigilante-suspicious-files {
1670 background: #fff5f5;
1671 padding: 15px;
1672 border-radius: 6px;
1673 border: 1px solid #f5c6c6;
1674 margin-top: 20px;
1675 }
1676
1677 .vigilante-suspicious-files h3 {
1678 margin: 0 0 5px 0;
1679 }
1680
1681 .vigilante-suspicious-files .description {
1682 margin: 0 0 10px 0;
1683 }
1684
1685 .vigilante-extra-files {
1686 background: #fff8f5;
1687 padding: 15px;
1688 border-radius: 6px;
1689 border: 1px solid #e8c6b6;
1690 margin-top: 20px;
1691 }
1692
1693 .vigilante-extra-files h3 {
1694 margin: 0 0 5px 0;
1695 }
1696
1697 .vigilante-extra-files .description {
1698 margin: 0 0 10px 0;
1699 }
1700
1701 .vigilante-suspicious-files .wp-list-table,
1702 .vigilante-file-list .wp-list-table {
1703 margin-top: 10px;
1704 width: 100%;
1705 table-layout: fixed;
1706 }
1707
1708 .vigilante-file-list .wp-list-table td code {
1709 word-break: break-all;
1710 }
1711
1712 .vigilante-all-clear {
1713 padding: 20px;
1714 background: #f0fff0;
1715 border-radius: 8px;
1716 text-align: center;
1717 font-size: 16px;
1718 color: #00a32a;
1719 }
1720
1721 .vigilante-all-clear .dashicons {
1722 font-size: 24px;
1723 width: 24px;
1724 height: 24px;
1725 vertical-align: middle;
1726 margin-right: 8px;
1727 }
1728
1729 /* Submit buttons row */
1730 .vigilante-submit-buttons {
1731 display: flex;
1732 gap: 10px;
1733 align-items: center;
1734 flex-wrap: wrap;
1735 margin-bottom: 0;
1736 }
1737
1738 .vigilante-submit-buttons .button {
1739 margin: 0 !important;
1740 }
1741
1742 .vigilante-buttons-separator {
1743 display: inline-block;
1744 width: 1px;
1745 height: 28px;
1746 background: #c3c4c7;
1747 margin: 0 5px;
1748 }
1749
1750 .vigilante-reset-section-btn {
1751 color: #d63638 !important;
1752 border-color: #d63638 !important;
1753 }
1754
1755 .vigilante-reset-section-btn:hover {
1756 background: #d63638 !important;
1757 color: #fff !important;
1758 }
1759
1760 .vigilante-clear-scan-btn {
1761 color: #d63638 !important;
1762 border-color: #d63638 !important;
1763 }
1764
1765 .vigilante-clear-scan-btn:hover {
1766 background: #d63638 !important;
1767 color: #fff !important;
1768 }
1769
1770 /* =========================================================================
1771 LOGIN PROTECTION STATUS SECTION
1772 ========================================================================= */
1773
1774 .vigilante-lockout-section {
1775 border-top: 1px solid #c3c4c7;
1776 }
1777
1778 .vigilante-lockout-section h2 {
1779 margin: 0 0 15px 0;
1780 padding: 0;
1781 background: none;
1782 border-bottom: none;
1783 font-size: 14px;
1784 font-weight: 600;
1785 }
1786
1787 .vigilante-lockout-section h3 {
1788 margin: 20px 0 15px;
1789 padding: 0;
1790 font-size: 13px;
1791 }
1792
1793 /* Info box explaining how lockout works */
1794 .vigilante-lockout-info-box {
1795 background: #f0f6fc;
1796 border-left: 4px solid #2271b1;
1797 margin: 20px;
1798 padding: 15px 20px;
1799 border-radius: 0 4px 4px 0;
1800 }
1801
1802 .vigilante-lockout-info-box h4 {
1803 margin: 0 0 12px;
1804 font-size: 13px;
1805 color: #1d2327;
1806 }
1807
1808 .vigilante-lockout-info-box ul {
1809 margin: 0;
1810 padding: 0;
1811 list-style: none;
1812 }
1813
1814 .vigilante-lockout-info-box li {
1815 position: relative;
1816 padding-left: 20px;
1817 margin-bottom: 8px;
1818 font-size: 13px;
1819 line-height: 1.5;
1820 color: #50575e;
1821 }
1822
1823 .vigilante-lockout-info-box li:last-child {
1824 margin-bottom: 0;
1825 }
1826
1827 .vigilante-lockout-info-box li::before {
1828 content: "ââ�
1829 ¡Ã‚¬Ã‚¢";
1830 position: absolute;
1831 left: 6px;
1832 color: #2271b1;
1833 font-weight: bold;
1834 }
1835
1836 .vigilante-lockout-info-box li strong {
1837 color: #1d2327;
1838 }
1839
1840 /* Lockouts table */
1841 .vigilante-lockouts-table {
1842 margin: 0 20px 15px;
1843 width: calc(100% - 40px);
1844 }
1845
1846 .vigilante-lockouts-table code {
1847 background: #f0f0f1;
1848 padding: 3px 6px;
1849 border-radius: 3px;
1850 font-size: 12px;
1851 }
1852
1853 .vigilante-lockout-time {
1854 font-weight: 500;
1855 color: #1d2327;
1856 }
1857
1858 .vigilante-lockout-remaining {
1859 color: #d63638;
1860 font-style: italic;
1861 }
1862
1863 .vigilante-lockout-actions {
1864 padding: 0 20px 20px;
1865 margin: 0;
1866 display: flex;
1867 align-items: center;
1868 flex-wrap: wrap;
1869 gap: 10px;
1870 }
1871
1872 /* No lockouts state */
1873 .vigilante-no-lockouts {
1874 text-align: center;
1875 padding: 30px 20px;
1876 color: #50575e;
1877 }
1878
1879 .vigilante-no-lockouts .dashicons {
1880 font-size: 48px;
1881 width: 48px;
1882 height: 48px;
1883 color: #00a32a;
1884 margin-bottom: 10px;
1885 }
1886
1887 .vigilante-no-lockouts p {
1888 margin: 0;
1889 font-size: 14px;
1890 color: #1d2327;
1891 }
1892
1893 /* Unblock buttons */
1894 .vigilante-clear-lockout,
1895 .vigilante-clear-all-lockouts {
1896 transition: all 0.2s ease;
1897 }
1898
1899 .vigilante-clear-all-lockouts {
1900 color: #d63638 !important;
1901 border-color: #d63638 !important;
1902 }
1903
1904 .vigilante-clear-all-lockouts:hover {
1905 background: #d63638 !important;
1906 color: #fff !important;
1907 }
1908
1909 /* Method indicator badges */
1910 .vigilante-method-badge {
1911 display: inline-block;
1912 background: #dcdcde;
1913 color: #1d2327;
1914 padding: 2px 8px;
1915 border-radius: 3px;
1916 font-size: 11px;
1917 font-weight: 500;
1918 text-transform: uppercase;
1919 margin-left: 8px;
1920 vertical-align: middle;
1921 }
1922
1923 .vigilante-method-badge.php {
1924 background: #8b5cf6;
1925 color: #fff;
1926 }
1927
1928 .vigilante-method-badge.database {
1929 background: #3b82f6;
1930 color: #fff;
1931 }
1932
1933 .vigilante-method-badge.htaccess {
1934 background: #10b981;
1935 color: #fff;
1936 }
1937
1938 .vigilante-method-badge.filter {
1939 background: #f59e0b;
1940 color: #fff;
1941 }
1942
1943 .vigilante-method-badge.rewrite {
1944 background: #ec4899;
1945 color: #fff;
1946 }
1947
1948 .vigilante-method-badge.email {
1949 background: #06b6d4;
1950 color: #fff;
1951 }
1952
1953 .vigilante-method-badge.config {
1954 background: #ea580c;
1955 color: #fff;
1956 }
1957
1958 .vigilante-method-badge.settings {
1959 background: #64748b;
1960 color: #fff;
1961 }
1962
1963 .vigilante-method-badge.wpconfig {
1964 background: #ea580c;
1965 color: #fff;
1966 }
1967
1968 /* ==========================================================================
1969 Force Password Reset Section
1970 ========================================================================== */
1971
1972 .vigilante-password-reset-section {
1973 margin-top: 30px;
1974 padding-top: 20px;
1975 border-top: 1px solid #ddd;
1976 }
1977
1978 .vigilante-password-reset-box {
1979 margin-bottom: 15px;
1980 }
1981
1982 .vigilante-password-reset-box h3 {
1983 margin-top: 0;
1984 margin-bottom: 10px;
1985 }
1986
1987 /* User search */
1988 .vigilante-user-search-wrapper {
1989 position: relative;
1990 max-width: 400px;
1991 }
1992
1993 .vigilante-user-search-results {
1994 position: absolute;
1995 top: 100%;
1996 left: 0;
1997 right: 0;
1998 background: #fff;
1999 border: 1px solid #ddd;
2000 border-top: none;
2001 max-height: 300px;
2002 overflow-y: auto;
2003 z-index: 100;
2004 box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
2005 }
2006
2007 .vigilante-user-search-list {
2008 margin: 0;
2009 padding: 0;
2010 list-style: none;
2011 }
2012
2013 .vigilante-user-search-list li {
2014 display: flex;
2015 align-items: center;
2016 gap: 10px;
2017 padding: 10px;
2018 border-bottom: 1px solid #eee;
2019 cursor: pointer;
2020 transition: background 0.2s;
2021 }
2022
2023 .vigilante-user-search-list li:hover {
2024 background: #f5f5f5;
2025 }
2026
2027 .vigilante-user-search-list li.selected {
2028 background: #e8f4fd;
2029 }
2030
2031 .vigilante-user-search-list li:last-child {
2032 border-bottom: none;
2033 }
2034
2035 .vigilante-user-avatar {
2036 width: 32px;
2037 height: 32px;
2038 border-radius: 50%;
2039 }
2040
2041 .vigilante-user-info {
2042 flex: 1;
2043 line-height: 1.3;
2044 }
2045
2046 .vigilante-user-roles {
2047 color: #666;
2048 }
2049
2050 .vigilante-no-results {
2051 padding: 15px;
2052 margin: 0;
2053 color: #666;
2054 text-align: center;
2055 }
2056
2057 /* Selected users */
2058 .vigilante-selected-users {
2059 margin-top: 15px;
2060 padding: 15px;
2061 background: #f9f9f9;
2062 border: 1px solid #ddd;
2063 }
2064
2065 .vigilante-selected-users h4 {
2066 margin: 0 0 10px 0;
2067 }
2068
2069 .vigilante-selected-users-list {
2070 margin: 0;
2071 padding: 0;
2072 list-style: none;
2073 display: flex;
2074 flex-wrap: wrap;
2075 gap: 8px;
2076 }
2077
2078 .vigilante-selected-users-list li {
2079 display: inline-flex;
2080 align-items: center;
2081 gap: 5px;
2082 background: #fff;
2083 border: 1px solid #ddd;
2084 padding: 5px 10px;
2085 border-radius: 3px;
2086 }
2087
2088 .vigilante-selected-users-list .vigilante-remove-user {
2089 background: none;
2090 border: none;
2091 color: #d63638;
2092 cursor: pointer;
2093 font-size: 16px;
2094 line-height: 1;
2095 padding: 0 2px;
2096 }
2097
2098 .vigilante-selected-users-list .vigilante-remove-user:hover {
2099 color: #a00;
2100 }
2101
2102 /* Password reset options */
2103 .vigilante-password-reset-options {
2104 margin-top: 15px;
2105 }
2106
2107 .vigilante-password-reset-options label {
2108 display: flex;
2109 align-items: flex-start;
2110 gap: 8px;
2111 }
2112
2113 .vigilante-password-reset-options input[type="checkbox"] {
2114 margin-top: 2px;
2115 }
2116
2117 /* Badge for pending status */
2118 .vigilante-badge {
2119 display: inline-block;
2120 padding: 2px 6px;
2121 font-size: 10px;
2122 font-weight: 600;
2123 border-radius: 3px;
2124 text-transform: uppercase;
2125 white-space: nowrap;
2126 }
2127
2128 .vigilante-badge-warning {
2129 background: #f0ad4e;
2130 color: #fff;
2131 }
2132
2133 /* ==========================================================================
2134 Pending Users Section
2135 ========================================================================== */
2136
2137 .vigilante-pending-users-section {
2138 margin-top: 30px;
2139 padding-top: 20px;
2140 border-top: 1px solid #ddd;
2141 }
2142
2143 .vigilante-pending-users-section h2 {
2144 display: flex;
2145 align-items: center;
2146 gap: 10px;
2147 }
2148
2149 .vigilante-pending-users-table td {
2150 vertical-align: middle;
2151 }
2152
2153 .vigilante-pending-users-table td img {
2154 vertical-align: middle;
2155 margin-right: 8px;
2156 border-radius: 50%;
2157 }
2158
2159 .vigilante-pending-users-table td strong {
2160 vertical-align: middle;
2161 }
2162
2163 /* ==========================================================================
2164 Session Management Section
2165 ========================================================================== */
2166
2167 .vigilante-session-management-section {
2168 margin-top: 30px;
2169 padding-top: 20px;
2170 border-top: 1px solid #ddd;
2171 }
2172
2173 .vigilante-sessions-table td {
2174 vertical-align: middle;
2175 }
2176
2177 .vigilante-sessions-table code {
2178 background: #f0f0f1;
2179 padding: 2px 6px;
2180 border-radius: 3px;
2181 font-size: 12px;
2182 }
2183
2184 #vigilante-user-sessions-container {
2185 background: #f9f9f9;
2186 border: 1px solid #ddd;
2187 padding: 15px;
2188 border-radius: 4px;
2189 }
2190
2191 #vigilante-user-sessions-container h4 {
2192 margin-top: 0;
2193 margin-bottom: 15px;
2194 }
2195
2196 /* ==========================================================================
2197 Tools Section - Actions and utilities
2198 ========================================================================== */
2199
2200 .vigilante-tools-section {
2201 padding: 20px;
2202 border-top: 1px solid #c3c4c7;
2203 }
2204
2205 .vigilante-tools-header {
2206 margin: 0 0 20px 0;
2207 padding: 0 0 10px 0;
2208 border-bottom: 1px solid #eee;
2209 font-size: 16px;
2210 font-weight: 600;
2211 color: #1d2327;
2212 }
2213
2214 .vigilante-tool-box {
2215 padding: 20px;
2216 margin-bottom: 20px;
2217 border: 1px solid #dcdcde;
2218 background: #f6f7f7;
2219 }
2220
2221 .vigilante-tool-box:last-child {
2222 margin-bottom: 0;
2223 }
2224
2225 .vigilante-tool-box h3 {
2226 margin: 0 0 10px 0;
2227 padding: 0;
2228 border: none;
2229 font-size: 14px;
2230 font-weight: 600;
2231 color: #1d2327;
2232 }
2233
2234 .vigilante-tool-box h4 {
2235 margin: 20px 0 10px 0;
2236 padding: 0;
2237 border: none;
2238 font-size: 13px;
2239 font-weight: 600;
2240 color: #1d2327;
2241 }
2242
2243 .vigilante-tool-box h4:first-child {
2244 margin-top: 0;
2245 }
2246
2247 .vigilante-tool-box > p.description:first-of-type {
2248 margin-top: 0;
2249 margin-bottom: 15px;
2250 }
2251
2252 /* Submit buttons inside tool-boxes */
2253 .vigilante-tool-box .submit {
2254 margin: 15px 0 0 0;
2255 padding: 0;
2256 background: none;
2257 border: none;
2258 }
2259
2260 /* Role checkboxes in compact layout */
2261 .vigilante-settings-form .form-table td label[style*="display: block"] {
2262 margin-bottom: 4px;
2263 }
2264
2265 /* ==========================================================================
2266 Responsive adjustments
2267 ========================================================================== */
2268
2269 @media screen and (max-width: 782px) {
2270 .vigilante-pending-users-table td,
2271 .vigilante-sessions-table td {
2272 padding: 8px 10px;
2273 }
2274
2275 .vigilante-pending-users-table .button,
2276 .vigilante-sessions-table .button {
2277 margin-bottom: 5px;
2278 }
2279
2280 .vigilante-tools-section {
2281 padding: 15px;
2282 }
2283
2284 .vigilante-tool-box {
2285 padding: 15px;
2286 }
2287 }
2288
2289 /* Menu badge colors - override WordPress defaults */
2290 #adminmenu .vigilante-badge-warning {
2291 background-color: #dba617 !important;
2292 }
2293
2294 /* Menu badge colors - override WordPress defaults */
2295 #adminmenu .vigilante-badge-warning {
2296 background-color: #dba617 !important;
2297 }
2298
2299 /* Fix badge number centering */
2300 #adminmenu #toplevel_page_vigilante .update-plugins .pending-count {
2301 display: flex;
2302 align-items: center;
2303 justify-content: center;
2304 }
2305
2306 /* ==========================================================================
2307 DATABASE BACKUP - Tools tab
2308 ========================================================================== */
2309
2310 /* Wide tool card spans full grid width */
2311 .vigilante-tool-card-wide {
2312 grid-column: 1 / -1;
2313 }
2314
2315 .vigilante-db-backup-panel {
2316 margin-top: 15px;
2317 padding-top: 15px;
2318 border-top: 1px solid #e5e5e5;
2319 }
2320
2321 .vigilante-db-tables-loading {
2322 display: flex;
2323 align-items: center;
2324 gap: 8px;
2325 padding: 10px 0;
2326 color: #666;
2327 }
2328
2329 .vigilante-db-tables-loading .spinner {
2330 float: none;
2331 margin: 0;
2332 }
2333
2334 .vigilante-db-tables-controls {
2335 display: flex;
2336 align-items: center;
2337 justify-content: space-between;
2338 margin-bottom: 12px;
2339 padding-bottom: 10px;
2340 border-bottom: 1px solid #f0f0f0;
2341 }
2342
2343 .vigilante-db-tables-info {
2344 color: #999;
2345 font-size: 13px;
2346 }
2347
2348 .vigilante-db-tables-group {
2349 margin-bottom: 15px;
2350 }
2351
2352 .vigilante-db-tables-group h4 {
2353 margin: 0 0 8px;
2354 font-size: 13px;
2355 color: #555;
2356 text-transform: uppercase;
2357 letter-spacing: 0.5px;
2358 }
2359
2360 .vigilante-db-tables-list {
2361 display: grid;
2362 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
2363 gap: 2px 12px;
2364 max-height: 400px;
2365 overflow-y: auto;
2366 border: 1px solid #dcdcde;
2367 border-radius: 4px;
2368 padding: 4px;
2369 background: #fff;
2370 }
2371
2372 .vigilante-db-table-label {
2373 display: flex;
2374 align-items: center;
2375 gap: 6px;
2376 padding: 6px 10px;
2377 border-radius: 3px;
2378 cursor: pointer;
2379 font-size: 13px;
2380 transition: background-color 0.15s;
2381 }
2382
2383 .vigilante-db-table-label:nth-child(odd) {
2384 background: #f9f9f9;
2385 }
2386
2387 .vigilante-db-table-label:hover {
2388 background: #e8f0fe;
2389 }
2390
2391 .vigilante-db-table-name {
2392 font-family: Consolas, Monaco, monospace;
2393 font-size: 12px;
2394 overflow: hidden;
2395 text-overflow: ellipsis;
2396 white-space: nowrap;
2397 min-width: 0;
2398 }
2399
2400 .vigilante-db-table-meta {
2401 color: #999;
2402 font-size: 11px;
2403 margin-left: auto;
2404 white-space: nowrap;
2405 flex-shrink: 0;
2406 }
2407
2408 .vigilante-db-backup-actions {
2409 margin-top: 15px;
2410 padding-top: 15px;
2411 border-top: 1px solid #f0f0f0;
2412 }
2413
2414 /* ==========================================================================
2415 DATABASE PREFIX - WP Hardening tab
2416 ========================================================================== */
2417
2418 .vigilante-db-current-prefix,
2419 .vigilante-db-new-prefix {
2420 display: inline-block;
2421 padding: 4px 10px;
2422 font-size: 14px;
2423 font-family: Consolas, Monaco, monospace;
2424 background: #f6f7f7;
2425 border: 1px solid #ddd;
2426 border-radius: 3px;
2427 }
2428
2429 .vigilante-db-prefix-row {
2430 display: flex;
2431 align-items: center;
2432 gap: 8px;
2433 }
2434
2435 .vigilante-db-regenerate-prefix {
2436 display: inline-flex !important;
2437 align-items: center;
2438 justify-content: center;
2439 min-width: 30px;
2440 height: 30px;
2441 padding: 0 !important;
2442 }
2443
2444 .vigilante-db-regenerate-prefix .dashicons {
2445 width: 16px;
2446 height: 16px;
2447 font-size: 16px;
2448 line-height: 1;
2449 }
2450
2451 .vigilante-db-prefix-confirm {
2452 margin-bottom: 12px;
2453 padding: 12px 15px;
2454 background: #fff8e5;
2455 border: 1px solid #ffcc00;
2456 border-left: 4px solid #dba617;
2457 border-radius: 3px;
2458 }
2459
2460 .vigilante-db-prefix-confirm label {
2461 display: flex;
2462 align-items: flex-start;
2463 gap: 6px;
2464 font-weight: 600;
2465 cursor: pointer;
2466 }
2467
2468 .vigilante-db-prefix-confirm .description {
2469 margin-top: 6px;
2470 margin-left: 22px;
2471 }
2472
2473 .vigilante-inline-warning {
2474 display: inline-flex;
2475 align-items: center;
2476 gap: 4px;
2477 color: #d63638;
2478 font-size: 13px;
2479 margin-left: 8px;
2480 }
2481
2482 .vigilante-inline-warning .dashicons {
2483 font-size: 16px;
2484 width: 16px;
2485 height: 16px;
2486 color: #dba617;
2487 }
2488
2489 .vigilante-inline-ok {
2490 display: inline-flex;
2491 align-items: center;
2492 gap: 4px;
2493 color: #00a32a;
2494 font-size: 13px;
2495 margin-left: 8px;
2496 }
2497
2498 .vigilante-inline-ok .dashicons {
2499 font-size: 16px;
2500 width: 16px;
2501 height: 16px;
2502 }
2503
2504 .vigilante-inline-notice {
2505 display: flex;
2506 align-items: flex-start;
2507 gap: 8px;
2508 background: #f0f6fc;
2509 border-left: 4px solid #72aee6;
2510 padding: 10px 14px;
2511 margin: 10px 0 16px;
2512 font-size: 12px;
2513 color: #50575e;
2514 line-height: 1.5;
2515 }
2516
2517 .vigilante-inline-notice .dashicons {
2518 flex-shrink: 0;
2519 font-size: 16px;
2520 width: 16px;
2521 height: 16px;
2522 color: #72aee6;
2523 margin-top: 1px;
2524 }
2525
2526 /* Responsive adjustments */
2527 @media (max-width: 782px) {
2528 .vigilante-db-tables-list {
2529 grid-template-columns: 1fr;
2530 }
2531
2532 .vigilante-db-tables-controls {
2533 flex-direction: column;
2534 align-items: flex-start;
2535 gap: 6px;
2536 }
2537
2538 .vigilante-inline-warning,
2539 .vigilante-inline-ok {
2540 display: flex;
2541 margin-left: 0;
2542 margin-top: 6px;
2543 }
2544 }
2545
2546 /* Login URL notification status */
2547 .vigilante-login-url-notify-status {
2548 display: inline-block;
2549 margin-left: 12px;
2550 font-style: italic;
2551 }
2552
2553 .vigilante-login-url-notify-status.success {
2554 color: #00a32a;
2555 }
2556
2557 .vigilante-login-url-notify-status.error {
2558 color: #d63638;
2559 }
2560
2561 /* Login URL notification wrapper */
2562 .vigilante-login-url-notify-disabled {
2563 opacity: 0.6;
2564 pointer-events: none;
2565 }
2566
2567 /* =========================================================================
2568 Security Analyzer (Dashboard widget) — 2.1.0
2569 ========================================================================= */
2570
2571 .vigilante-analyzer {
2572 background: #fff;
2573 border: 1px solid #dcdcde;
2574 border-radius: 8px;
2575 margin: 20px 0;
2576 padding: 20px 24px 16px;
2577 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
2578 }
2579
2580 /* -------- Header (title + description + last-scan + action button) -------- */
2581
2582 .vigilante-analyzer-header {
2583 display: flex;
2584 align-items: flex-start;
2585 justify-content: space-between;
2586 flex-wrap: wrap;
2587 gap: 12px 16px;
2588 margin-bottom: 18px;
2589 }
2590
2591 .vigilante-analyzer-title {
2592 flex: 1 1 260px;
2593 min-width: 0;
2594 }
2595
2596 .vigilante-analyzer-title h2 {
2597 margin: 0 0 4px;
2598 font-size: 18px;
2599 line-height: 1.3;
2600 display: inline-flex;
2601 align-items: center;
2602 gap: 8px;
2603 }
2604
2605 .vigilante-analyzer-title h2 .dashicons {
2606 color: #2271b1;
2607 font-size: 22px;
2608 width: 22px;
2609 height: 22px;
2610 }
2611
2612 .vigilante-analyzer-title .description {
2613 margin: 0 0 6px;
2614 color: #50575e;
2615 font-size: 13px;
2616 line-height: 1.4;
2617 }
2618
2619 .vigilante-analyzer-last-scan {
2620 margin: 0;
2621 font-size: 12px;
2622 color: #646970;
2623 display: inline-flex;
2624 align-items: center;
2625 gap: 4px;
2626 }
2627
2628 .vigilante-analyzer-last-scan .dashicons {
2629 font-size: 14px;
2630 width: 14px;
2631 height: 14px;
2632 color: #8c8f94;
2633 }
2634
2635 .vigilante-analyzer-actions {
2636 display: flex;
2637 align-items: center;
2638 gap: 8px;
2639 flex-shrink: 0;
2640 }
2641
2642 .vigilante-analyzer-actions .button {
2643 display: inline-flex;
2644 align-items: center;
2645 justify-content: center;
2646 gap: 6px;
2647 line-height: 1;
2648 }
2649
2650 .vigilante-analyzer-actions .button .dashicons {
2651 font-size: 16px;
2652 width: 16px;
2653 height: 16px;
2654 line-height: 1;
2655 margin: 0;
2656 }
2657
2658 /* -------- Summary (score card + counts + sparkline) -------- */
2659
2660 .vigilante-analyzer-summary {
2661 display: grid;
2662 grid-template-columns: minmax(220px, 1fr) minmax(220px, 1fr) minmax(220px, 1.2fr);
2663 gap: 14px;
2664 align-items: stretch;
2665 margin-bottom: 18px;
2666 }
2667
2668 .vigilante-analyzer-score-card,
2669 .vigilante-analyzer-counts,
2670 .vigilante-analyzer-sparkline-wrap {
2671 background: #f6f7f7;
2672 border: 1px solid #e2e4e7;
2673 border-radius: 8px;
2674 padding: 14px 16px;
2675 min-height: 110px;
2676 display: flex;
2677 align-items: center;
2678 }
2679
2680 /* Score card: circle + meta, centered as a single block */
2681 .vigilante-analyzer-score-card {
2682 gap: 16px;
2683 justify-content: center;
2684 }
2685
2686 .vigilante-analyzer-score-card .vigilante-score-circle {
2687 flex-shrink: 0;
2688 }
2689
2690 .vigilante-analyzer-score-meta {
2691 display: flex;
2692 flex-direction: column;
2693 gap: 6px;
2694 min-width: 0;
2695 }
2696
2697 .vigilante-analyzer-score-label {
2698 margin: 0;
2699 font-size: 11px;
2700 font-weight: 600;
2701 text-transform: uppercase;
2702 letter-spacing: 0.5px;
2703 color: #646970;
2704 }
2705
2706 /* Quality tag pill (Excellent/Good/Fair/Poor/Critical) */
2707 .vigilante-analyzer-quality-tag {
2708 display: inline-block;
2709 padding: 3px 10px;
2710 border-radius: 999px;
2711 font-size: 12px;
2712 font-weight: 600;
2713 line-height: 1.4;
2714 width: fit-content;
2715 border: 1px solid transparent;
2716 }
2717
2718 .vigilante-analyzer-quality-a {
2719 background: #e8f5e9;
2720 border-color: #a5d6a7;
2721 color: #2e7d32;
2722 }
2723
2724 .vigilante-analyzer-quality-b {
2725 background: #e3f2fd;
2726 border-color: #90caf9;
2727 color: #1565c0;
2728 }
2729
2730 .vigilante-analyzer-quality-c {
2731 background: #fff3e0;
2732 border-color: #ffcc80;
2733 color: #e65100;
2734 }
2735
2736 .vigilante-analyzer-quality-d {
2737 background: #ffebee;
2738 border-color: #ef9a9a;
2739 color: #c62828;
2740 }
2741
2742 .vigilante-analyzer-quality-e {
2743 background: #fce4ec;
2744 border-color: #f48fb1;
2745 color: #880e4f;
2746 }
2747
2748 /* Counts: 3 inline pass/warn/fail stats */
2749 .vigilante-analyzer-counts {
2750 justify-content: space-around;
2751 flex-wrap: wrap;
2752 gap: 8px;
2753 }
2754
2755 .vigilante-analyzer-count {
2756 display: flex;
2757 flex-direction: column;
2758 align-items: center;
2759 gap: 2px;
2760 min-width: 60px;
2761 padding: 4px 6px;
2762 }
2763
2764 .vigilante-analyzer-count .dashicons {
2765 font-size: 22px;
2766 width: 22px;
2767 height: 22px;
2768 line-height: 1;
2769 }
2770
2771 .vigilante-analyzer-count strong {
2772 font-size: 22px;
2773 font-weight: 700;
2774 line-height: 1.1;
2775 color: #1d2327;
2776 font-variant-numeric: tabular-nums;
2777 }
2778
2779 .vigilante-analyzer-count-label {
2780 font-size: 11px;
2781 text-transform: uppercase;
2782 letter-spacing: 0.5px;
2783 color: #646970;
2784 font-weight: 600;
2785 }
2786
2787 .vigilante-analyzer-count--pass .dashicons {
2788 color: #2e7d32;
2789 }
2790
2791 .vigilante-analyzer-count--warn .dashicons {
2792 color: #ff9800;
2793 }
2794
2795 .vigilante-analyzer-count--fail .dashicons {
2796 color: #c62828;
2797 }
2798
2799 /* Sparkline (trend) */
2800 .vigilante-analyzer-sparkline-wrap {
2801 flex-direction: column;
2802 align-items: stretch;
2803 gap: 6px;
2804 justify-content: center;
2805 }
2806
2807 .vigilante-analyzer-sparkline-head {
2808 display: flex;
2809 align-items: center;
2810 justify-content: space-between;
2811 gap: 8px;
2812 flex-wrap: wrap;
2813 }
2814
2815 .vigilante-analyzer-sparkline-label {
2816 font-size: 11px;
2817 font-weight: 600;
2818 color: #646970;
2819 text-transform: uppercase;
2820 letter-spacing: 0.5px;
2821 }
2822
2823 /* Score delta chip next to the label */
2824 .vigilante-analyzer-delta {
2825 display: inline-flex;
2826 align-items: center;
2827 gap: 2px;
2828 font-size: 12px;
2829 font-weight: 600;
2830 font-variant-numeric: tabular-nums;
2831 padding: 1px 6px;
2832 border-radius: 999px;
2833 line-height: 1.4;
2834 background: #f0f0f1;
2835 color: #50575e;
2836 }
2837
2838 .vigilante-analyzer-delta .dashicons {
2839 font-size: 14px;
2840 width: 14px;
2841 height: 14px;
2842 line-height: 1;
2843 }
2844
2845 .vigilante-analyzer-delta--up {
2846 background: #e8f5e9;
2847 color: #2e7d32;
2848 }
2849
2850 .vigilante-analyzer-delta--down {
2851 background: #ffebee;
2852 color: #c62828;
2853 }
2854
2855 .vigilante-analyzer-delta--flat {
2856 background: #f0f0f1;
2857 color: #646970;
2858 }
2859
2860 /* Placeholder variant shown when we don't yet have 3+ scans */
2861 .vigilante-analyzer-sparkline-wrap--placeholder {
2862 gap: 8px;
2863 }
2864
2865 .vigilante-analyzer-sparkline-hint {
2866 margin: 0;
2867 font-size: 12px;
2868 color: #646970;
2869 display: inline-flex;
2870 align-items: center;
2871 gap: 6px;
2872 line-height: 1.45;
2873 }
2874
2875 .vigilante-analyzer-sparkline-hint .dashicons {
2876 font-size: 16px;
2877 width: 16px;
2878 height: 16px;
2879 color: #8c8f94;
2880 }
2881
2882 .vigilante-analyzer-sparkline {
2883 display: block;
2884 position: relative;
2885 width: 100%;
2886 height: 60px;
2887 color: #2271b1;
2888 }
2889
2890 .vigilante-analyzer-sparkline > svg {
2891 display: block;
2892 width: 100%;
2893 height: 100%;
2894 }
2895
2896 .vigilante-analyzer-sparkline path {
2897 fill: none;
2898 stroke: currentColor;
2899 stroke-width: 1.5;
2900 }
2901
2902 .vigilante-analyzer-sparkline .vigilante-analyzer-sparkline-fill {
2903 fill: currentColor;
2904 opacity: 0.08;
2905 stroke: none;
2906 }
2907
2908 .vigilante-analyzer-sparkline circle {
2909 fill: currentColor;
2910 }
2911
2912 .vigilante-analyzer-sparkline-dot {
2913 position: absolute;
2914 width: 14px;
2915 height: 14px;
2916 margin: -7px 0 0 -7px;
2917 padding: 0;
2918 border: 0;
2919 background: transparent;
2920 border-radius: 50%;
2921 cursor: pointer;
2922 appearance: none;
2923 }
2924
2925 .vigilante-analyzer-sparkline-dot::before {
2926 content: '';
2927 position: absolute;
2928 top: 50%;
2929 left: 50%;
2930 width: 7px;
2931 height: 7px;
2932 margin: -3.5px 0 0 -3.5px;
2933 border-radius: 50%;
2934 background: currentColor;
2935 opacity: 0;
2936 transition: opacity 0.12s ease;
2937 }
2938
2939 .vigilante-analyzer-sparkline-dot:hover::before,
2940 .vigilante-analyzer-sparkline-dot:focus::before {
2941 opacity: 1;
2942 }
2943
2944 .vigilante-analyzer-sparkline-dot:focus {
2945 outline: none;
2946 box-shadow: 0 0 0 2px rgba(34, 113, 177, 0.4);
2947 }
2948
2949 .vigilante-analyzer-sparkline-tooltip {
2950 position: absolute;
2951 transform: translate(-50%, calc(-100% - 10px));
2952 padding: 3px 8px;
2953 background: #1d2327;
2954 color: #fff;
2955 font-size: 12px;
2956 font-weight: 600;
2957 line-height: 1.3;
2958 border-radius: 3px;
2959 white-space: nowrap;
2960 pointer-events: none;
2961 opacity: 0;
2962 transition: opacity 0.12s ease;
2963 z-index: 10;
2964 }
2965
2966 .vigilante-analyzer-sparkline-tooltip::after {
2967 content: '';
2968 position: absolute;
2969 top: 100%;
2970 left: 50%;
2971 margin-left: -4px;
2972 border: 4px solid transparent;
2973 border-top-color: #1d2327;
2974 }
2975
2976 .vigilante-analyzer-sparkline-tooltip.is-visible {
2977 opacity: 1;
2978 }
2979
2980 /* -------- Toggle to show detailed breakdown -------- */
2981
2982 .vigilante-analyzer-toggle-row {
2983 display: flex;
2984 justify-content: flex-end;
2985 margin-bottom: 8px;
2986 }
2987
2988 .vigilante-analyzer-toggle {
2989 background: none;
2990 border: none;
2991 color: #2271b1;
2992 cursor: pointer;
2993 font-size: 13px;
2994 padding: 4px 6px;
2995 display: inline-flex;
2996 align-items: center;
2997 gap: 6px;
2998 font-weight: 500;
2999 }
3000
3001 .vigilante-analyzer-toggle:hover {
3002 color: #135e96;
3003 text-decoration: underline;
3004 }
3005
3006 .vigilante-analyzer-toggle-chevron {
3007 display: inline-block;
3008 width: 8px;
3009 height: 8px;
3010 border-right: 1.5px solid currentColor;
3011 border-bottom: 1.5px solid currentColor;
3012 transform: rotate(45deg);
3013 transition: transform 0.2s ease;
3014 margin-bottom: 2px;
3015 }
3016
3017 .vigilante-analyzer-toggle[aria-expanded="true"] .vigilante-analyzer-toggle-chevron {
3018 transform: rotate(-135deg);
3019 margin-bottom: -2px;
3020 }
3021
3022 /* -------- Details (categories + weekly settings) -------- */
3023
3024 .vigilante-analyzer-details {
3025 border-top: 1px solid #e2e4e7;
3026 padding-top: 16px;
3027 margin-top: 4px;
3028 }
3029
3030 .vigilante-analyzer-details[hidden] {
3031 display: none;
3032 }
3033
3034 /* -------- Category accordion (<details> / <summary>) -------- */
3035
3036 .vigilante-analyzer-category {
3037 margin: 0 0 10px;
3038 border: 1px solid #e2e4e7;
3039 border-radius: 8px;
3040 background: #fdfdfd;
3041 overflow: hidden;
3042 }
3043
3044 .vigilante-analyzer-category[open] {
3045 background: #fff;
3046 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
3047 }
3048
3049 .vigilante-analyzer-category-summary {
3050 list-style: none;
3051 cursor: pointer;
3052 padding: 12px 14px;
3053 display: grid;
3054 grid-template-columns:
3055 16px /* chevron */
3056 minmax(120px, 1fr) /* label */
3057 auto /* quality pill */
3058 auto /* state counts */
3059 auto /* score */
3060 140px; /* bar */
3061 align-items: center;
3062 gap: 12px;
3063 user-select: none;
3064 }
3065
3066 .vigilante-analyzer-category-summary::-webkit-details-marker {
3067 display: none;
3068 }
3069
3070 .vigilante-analyzer-category-chevron {
3071 display: inline-block;
3072 width: 7px;
3073 height: 7px;
3074 border-right: 1.5px solid #646970;
3075 border-bottom: 1.5px solid #646970;
3076 transform: rotate(-45deg);
3077 transition: transform 0.15s ease;
3078 margin-left: 2px;
3079 }
3080
3081 .vigilante-analyzer-category[open] .vigilante-analyzer-category-chevron {
3082 transform: rotate(45deg);
3083 }
3084
3085 .vigilante-analyzer-category-label {
3086 font-weight: 600;
3087 color: #1d2327;
3088 font-size: 13px;
3089 min-width: 0;
3090 overflow: hidden;
3091 text-overflow: ellipsis;
3092 white-space: nowrap;
3093 }
3094
3095 .vigilante-analyzer-category-quality {
3096 font-size: 11px;
3097 padding: 2px 8px;
3098 font-weight: 600;
3099 white-space: nowrap;
3100 display: inline-flex;
3101 align-items: center;
3102 gap: 4px;
3103 }
3104
3105 .vigilante-analyzer-category-quality-sep {
3106 opacity: 0.55;
3107 font-weight: 400;
3108 }
3109
3110 .vigilante-analyzer-category-tests {
3111 font-variant-numeric: tabular-nums;
3112 font-weight: 600;
3113 }
3114
3115 /* Chips for info-only categories (Reputation / Blacklists). They live
3116 outside the quality pill so semantic colors stay readable. */
3117 .vigilante-analyzer-category-states {
3118 display: inline-flex;
3119 align-items: center;
3120 gap: 6px;
3121 white-space: nowrap;
3122 }
3123
3124 .vigilante-analyzer-category-state {
3125 display: inline-flex;
3126 align-items: center;
3127 gap: 2px;
3128 font-size: 12px;
3129 font-variant-numeric: tabular-nums;
3130 color: #50575e;
3131 }
3132
3133 .vigilante-analyzer-category-state .dashicons {
3134 font-size: 16px;
3135 width: 16px;
3136 height: 16px;
3137 line-height: 1;
3138 }
3139
3140 .vigilante-analyzer-category-score {
3141 font-variant-numeric: tabular-nums;
3142 color: #1d2327;
3143 font-size: 13px;
3144 font-weight: 600;
3145 white-space: nowrap;
3146 }
3147
3148 .vigilante-analyzer-category-score-sep {
3149 color: #8c8f94;
3150 font-weight: 400;
3151 margin: 0 1px;
3152 }
3153
3154 .vigilante-analyzer-category-score-unit {
3155 font-size: 11px;
3156 text-transform: uppercase;
3157 color: #8c8f94;
3158 font-weight: 600;
3159 letter-spacing: 0.3px;
3160 margin-left: 2px;
3161 }
3162
3163 /* Category progress bar */
3164 .vigilante-analyzer-category-bar {
3165 display: block;
3166 height: 8px;
3167 background: #eaeaec;
3168 border-radius: 4px;
3169 overflow: hidden;
3170 width: 100%;
3171 }
3172
3173 .vigilante-analyzer-category-bar-fill {
3174 display: block;
3175 height: 100%;
3176 background: #8c8f94;
3177 transition: width 0.3s ease, background 0.2s ease;
3178 }
3179
3180 .vigilante-analyzer-category-bar-fill--a {
3181 background: #4caf50;
3182 }
3183
3184 .vigilante-analyzer-category-bar-fill--b {
3185 background: #2196f3;
3186 }
3187
3188 .vigilante-analyzer-category-bar-fill--c {
3189 background: #ff9800;
3190 }
3191
3192 .vigilante-analyzer-category-bar-fill--d {
3193 background: #f44336;
3194 }
3195
3196 .vigilante-analyzer-category-bar-fill--e {
3197 background: #c2185b;
3198 }
3199
3200 /* Informational category (Reputation / DNSBL): no score, no colored bar */
3201 .vigilante-analyzer-category--info {
3202 background: #fafbfe;
3203 border-color: #d3e0ee;
3204 }
3205
3206 .vigilante-analyzer-category--info[open] {
3207 background: #fff;
3208 }
3209
3210 .vigilante-analyzer-quality-info {
3211 background: #e3f2fd;
3212 border-color: #90caf9;
3213 color: #1565c0;
3214 display: inline-flex;
3215 align-items: center;
3216 gap: 4px;
3217 }
3218
3219 .vigilante-analyzer-quality-info .dashicons {
3220 font-size: 14px;
3221 width: 14px;
3222 height: 14px;
3223 line-height: 1;
3224 }
3225
3226 .vigilante-analyzer-category-state--info .dashicons {
3227 color: #2271b1;
3228 }
3229
3230 .vigilante-analyzer-category-score--info {
3231 font-size: 11px;
3232 text-transform: uppercase;
3233 letter-spacing: 0.3px;
3234 font-weight: 600;
3235 color: #8c8f94;
3236 }
3237
3238 /* Info-only category state label: "All clear" / "N findings" (replaces the old
3239 dashed empty bar so the widget reads positively when nothing is wrong). */
3240 .vigilante-analyzer-category-status {
3241 display: inline-flex;
3242 align-items: center;
3243 gap: 6px;
3244 font-size: 12px;
3245 font-weight: 600;
3246 padding: 4px 10px;
3247 border-radius: 999px;
3248 justify-self: end;
3249 grid-column: 6 / 7; /* span the slot where the progress bar lives */
3250 white-space: nowrap;
3251 line-height: 1.4;
3252 }
3253
3254 .vigilante-analyzer-category-status .dashicons {
3255 font-size: 16px;
3256 width: 16px;
3257 height: 16px;
3258 line-height: 1;
3259 }
3260
3261 .vigilante-analyzer-category-status--clear {
3262 background: #e8f5e9;
3263 color: #2e7d32;
3264 border: 1px solid #a5d6a7;
3265 }
3266
3267 .vigilante-analyzer-category-status--clear .dashicons {
3268 color: #2e7d32;
3269 }
3270
3271 .vigilante-analyzer-category-status--attention {
3272 background: #fff3e0;
3273 color: #ad5b00;
3274 border: 1px solid #ffcc80;
3275 }
3276
3277 .vigilante-analyzer-category-status--attention .dashicons {
3278 color: #ff9800;
3279 }
3280
3281 .vigilante-analyzer-check--info .vigilante-analyzer-check-icon {
3282 color: #2271b1;
3283 }
3284
3285 /* -------- Check rows inside a category -------- */
3286
3287 .vigilante-analyzer-check-list {
3288 margin: 0;
3289 padding: 0 14px 12px;
3290 list-style: none;
3291 border-top: 1px dashed #e2e4e7;
3292 }
3293
3294 .vigilante-analyzer-check-empty {
3295 padding: 16px 0;
3296 text-align: center;
3297 color: #646970;
3298 font-size: 13px;
3299 font-style: italic;
3300 }
3301
3302 .vigilante-analyzer-check {
3303 display: grid;
3304 grid-template-columns: 22px 1fr auto;
3305 gap: 10px;
3306 padding: 10px 0;
3307 border-bottom: 1px solid #f1f1f2;
3308 align-items: start;
3309 }
3310
3311 .vigilante-analyzer-check:last-child {
3312 border-bottom: 0;
3313 }
3314
3315 .vigilante-analyzer-check-icon {
3316 width: 20px;
3317 height: 20px;
3318 font-size: 20px;
3319 line-height: 20px;
3320 text-align: center;
3321 }
3322
3323 .vigilante-analyzer-check--pass .vigilante-analyzer-check-icon {
3324 color: #2e7d32;
3325 }
3326
3327 .vigilante-analyzer-check--warn .vigilante-analyzer-check-icon {
3328 color: #ff9800;
3329 }
3330
3331 .vigilante-analyzer-check--fail .vigilante-analyzer-check-icon {
3332 color: #c62828;
3333 }
3334
3335 .vigilante-analyzer-check--info .vigilante-analyzer-check-icon {
3336 color: #2271b1;
3337 }
3338
3339 .vigilante-analyzer-check--skip .vigilante-analyzer-check-icon {
3340 color: #8c8f94;
3341 }
3342
3343 .vigilante-analyzer-check-body {
3344 min-width: 0;
3345 }
3346
3347 .vigilante-analyzer-check-label {
3348 font-weight: 600;
3349 color: #1d2327;
3350 display: flex;
3351 flex-wrap: wrap;
3352 align-items: baseline;
3353 gap: 8px;
3354 font-size: 13px;
3355 }
3356
3357 .vigilante-analyzer-check-detail {
3358 margin: 3px 0 0;
3359 color: #50575e;
3360 font-size: 13px;
3361 line-height: 1.45;
3362 }
3363
3364 .vigilante-analyzer-check-score {
3365 font-variant-numeric: tabular-nums;
3366 color: #8c8f94;
3367 font-size: 11px;
3368 font-weight: 600;
3369 white-space: nowrap;
3370 text-transform: uppercase;
3371 letter-spacing: 0.3px;
3372 }
3373
3374 .vigilante-analyzer-check-score-unit {
3375 margin-left: 1px;
3376 }
3377
3378 /* Subtle inline "Go to setting →" (replaces old pill style) */
3379 .vigilante-analyzer-fix-link {
3380 display: inline-flex;
3381 align-items: center;
3382 gap: 4px;
3383 font-size: 12px;
3384 color: #2271b1;
3385 text-decoration: none;
3386 line-height: 1.4;
3387 margin-top: 4px;
3388 font-weight: 500;
3389 }
3390
3391 .vigilante-analyzer-fix-link:hover,
3392 .vigilante-analyzer-fix-link:focus {
3393 color: #135e96;
3394 text-decoration: underline;
3395 }
3396
3397 .vigilante-analyzer-fix-arrow {
3398 font-size: 14px;
3399 line-height: 1;
3400 transition: transform 0.15s ease;
3401 }
3402
3403 .vigilante-analyzer-fix-link:hover .vigilante-analyzer-fix-arrow {
3404 transform: translateX(2px);
3405 }
3406
3407 /* -------- Weekly scan settings -------- */
3408
3409 .vigilante-analyzer-weekly {
3410 margin-top: 16px;
3411 padding: 14px 16px;
3412 background: #f6f7f7;
3413 border: 1px solid #dcdcde;
3414 border-radius: 8px;
3415 }
3416
3417 .vigilante-analyzer-weekly h3 {
3418 font-weight: 600;
3419 margin: 0 0 4px;
3420 font-size: 14px;
3421 color: #1d2327;
3422 }
3423
3424 .vigilante-analyzer-weekly .description {
3425 margin: 0 0 10px;
3426 font-size: 13px;
3427 color: #50575e;
3428 line-height: 1.5;
3429 }
3430
3431 .vigilante-analyzer-toggle-option {
3432 display: flex;
3433 align-items: center;
3434 gap: 8px;
3435 margin: 4px 0;
3436 font-size: 13px;
3437 cursor: pointer;
3438 }
3439
3440 .vigilante-analyzer-toggle-option + .vigilante-analyzer-toggle-option {
3441 margin-top: 8px;
3442 }
3443
3444 .vigilante-analyzer-status-msg {
3445 margin: 10px 0 0;
3446 font-size: 12px;
3447 color: #646970;
3448 min-height: 16px;
3449 }
3450
3451 .vigilante-analyzer-status-msg.is-error {
3452 color: #c62828;
3453 }
3454
3455 .vigilante-analyzer-status-msg.is-success {
3456 color: #2e7d32;
3457 }
3458
3459 /* -------- Empty state (before first scan) -------- */
3460
3461 .vigilante-analyzer-empty {
3462 padding: 18px 14px;
3463 text-align: center;
3464 color: #646970;
3465 background: #fbfbfc;
3466 border: 1px dashed #dcdcde;
3467 border-radius: 6px;
3468 margin: 4px 0 12px;
3469 font-size: 13px;
3470 }
3471
3472 /* -------- Scan button spinner + focus flash -------- */
3473
3474 .vigilante-analyzer-spin {
3475 animation: vigilante-analyzer-rotate 1s linear infinite;
3476 display: inline-block;
3477 vertical-align: middle;
3478 }
3479
3480 @keyframes vigilante-analyzer-rotate {
3481 from { transform: rotate(0deg); }
3482 to { transform: rotate(360deg); }
3483 }
3484
3485 .vigilante-focus-flash {
3486 animation: vigilante-focus-pulse 1.5s ease-out 1;
3487 border-radius: 4px;
3488 }
3489
3490 @keyframes vigilante-focus-pulse {
3491 0% {
3492 background-color: rgba(255, 193, 7, 0);
3493 box-shadow: 0 0 0 0 rgba(255, 193, 7, 0);
3494 }
3495 20% {
3496 background-color: rgba(255, 193, 7, 0.35);
3497 box-shadow: 0 0 0 6px rgba(255, 193, 7, 0.25);
3498 }
3499 60% {
3500 background-color: rgba(255, 193, 7, 0.18);
3501 box-shadow: 0 0 0 4px rgba(255, 193, 7, 0.12);
3502 }
3503 100% {
3504 background-color: rgba(255, 193, 7, 0);
3505 box-shadow: 0 0 0 0 rgba(255, 193, 7, 0);
3506 }
3507 }
3508
3509 /* -------- Responsive -------- */
3510
3511 @media (max-width: 1100px) {
3512 .vigilante-analyzer-summary {
3513 grid-template-columns: 1fr 1fr;
3514 }
3515
3516 .vigilante-analyzer-sparkline-wrap {
3517 grid-column: 1 / -1;
3518 min-height: 80px;
3519 }
3520
3521 .vigilante-analyzer-sparkline {
3522 height: 50px;
3523 }
3524 }
3525
3526 @media (max-width: 900px) {
3527 .vigilante-analyzer-category-summary {
3528 grid-template-columns:
3529 16px /* chevron */
3530 minmax(0, 1fr) /* label */
3531 auto; /* score */
3532 grid-template-rows: auto auto;
3533 gap: 6px 10px;
3534 }
3535
3536 .vigilante-analyzer-category-quality {
3537 grid-column: 2 / 3;
3538 grid-row: 2;
3539 justify-self: start;
3540 }
3541
3542 .vigilante-analyzer-category-states {
3543 grid-column: 3 / 4;
3544 grid-row: 2;
3545 justify-self: end;
3546 }
3547
3548 .vigilante-analyzer-category-bar {
3549 grid-column: 1 / -1;
3550 grid-row: 3;
3551 }
3552
3553 .vigilante-analyzer-category-status {
3554 grid-column: 3 / 4;
3555 grid-row: 1;
3556 justify-self: end;
3557 }
3558 }
3559
3560 @media (max-width: 720px) {
3561 .vigilante-analyzer {
3562 padding: 16px 14px 12px;
3563 }
3564
3565 .vigilante-analyzer-summary {
3566 grid-template-columns: 1fr;
3567 }
3568
3569 .vigilante-analyzer-sparkline-wrap {
3570 grid-column: auto;
3571 }
3572
3573 .vigilante-analyzer-header {
3574 flex-direction: column;
3575 align-items: stretch;
3576 }
3577
3578 .vigilante-analyzer-actions {
3579 justify-content: flex-start;
3580 }
3581 }
3582
3583 @media (max-width: 600px) {
3584 .vigilante-analyzer-score-card {
3585 flex-direction: column;
3586 text-align: center;
3587 gap: 10px;
3588 }
3589
3590 .vigilante-analyzer-score-meta {
3591 align-items: center;
3592 }
3593
3594 .vigilante-analyzer-counts {
3595 justify-content: space-between;
3596 }
3597
3598 .vigilante-analyzer-check {
3599 grid-template-columns: 20px 1fr;
3600 }
3601
3602 .vigilante-analyzer-check-score {
3603 grid-column: 2 / -1;
3604 }
3605 }
3606 /* ---------------------------------------------------------------------------
3607 Self-protection (File Integrity, first block of the results)
3608
3609 Two shapes, on purpose. With nothing to do it is one line, because a card
3610 with an icon and folded sections for "everything is fine" is furniture. With
3611 something to do it is a card with one row per case, the shape of Site Health,
3612 which is what holds up when there are four findings at once. Colour lives in
3613 the icon, the severity word and a thin edge: never a filled background behind
3614 the text.
3615 --------------------------------------------------------------------------- */
3616 /*
3617 * A card of the same family as the rest of the page (the counters use
3618 * border 1px #ddd and radius 8px), not a notice bar: this block belongs to the
3619 * results, it is not something pinned on top of them.
3620 */
3621 .vigilante-self-card {
3622 background: #fff;
3623 border: 1px solid #ddd;
3624 border-radius: 8px;
3625 padding: 16px 20px;
3626 }
3627
3628 .vigilante-self-card--quiet {
3629 padding: 12px 20px;
3630 }
3631
3632 .vigilante-self-box--critical .vigilante-self-card {
3633 border-color: #d63638;
3634 }
3635
3636 .vigilante-self-box--warning .vigilante-self-card {
3637 border-color: #dba617;
3638 }
3639
3640 /* --- one line, when there is nothing to act on --- */
3641 .vigilante-self-line {
3642 display: flex;
3643 align-items: center;
3644 flex-wrap: wrap;
3645 gap: 8px;
3646 margin: 0;
3647 }
3648
3649 .vigilante-self-line .dashicons {
3650 color: #50575e;
3651 }
3652
3653 .vigilante-self-box--ok .vigilante-self-line .dashicons {
3654 color: #00a32a;
3655 }
3656
3657 .vigilante-self-box--info .vigilante-self-line .dashicons {
3658 color: #2271b1;
3659 }
3660
3661 .vigilante-self-line-meta {
3662 color: #646970;
3663 }
3664
3665 .vigilante-self-line-help {
3666 margin: 6px 0 0 28px;
3667 }
3668
3669 /* --- card, when something needs attention --- */
3670 .vigilante-self-head {
3671 display: flex;
3672 align-items: flex-start;
3673 gap: 12px;
3674 }
3675
3676 .vigilante-self-icon {
3677 flex: none;
3678 width: 34px;
3679 height: 34px;
3680 border-radius: 50%;
3681 display: flex;
3682 align-items: center;
3683 justify-content: center;
3684 background: #f0f0f1;
3685 }
3686
3687 .vigilante-self-icon .dashicons {
3688 color: #50575e;
3689 }
3690
3691 .vigilante-self-box--critical .vigilante-self-icon {
3692 background: #fcf0f1;
3693 }
3694
3695 .vigilante-self-box--critical .vigilante-self-icon .dashicons {
3696 color: #d63638;
3697 }
3698
3699 .vigilante-self-box--warning .vigilante-self-icon {
3700 background: #fcf9e8;
3701 }
3702
3703 .vigilante-self-box--warning .vigilante-self-icon .dashicons {
3704 color: #996800;
3705 }
3706
3707 .vigilante-self-head-text h2 {
3708 margin: 0;
3709 padding: 0;
3710 border: 0;
3711 font-size: 15px;
3712 line-height: 1.4;
3713 }
3714
3715 .vigilante-self-meta {
3716 margin: 2px 0 0;
3717 color: #646970;
3718 }
3719
3720 .vigilante-self-cases {
3721 margin-top: 14px;
3722 border-top: 1px solid #e0e0e0;
3723 }
3724
3725 .vigilante-self-case {
3726 border-bottom: 1px solid #e0e0e0;
3727 }
3728
3729 .vigilante-self-case > summary {
3730 display: flex;
3731 align-items: center;
3732 gap: 10px;
3733 padding: 10px 2px;
3734 cursor: pointer;
3735 list-style: none;
3736 }
3737
3738 .vigilante-self-case > summary::-webkit-details-marker {
3739 display: none;
3740 }
3741
3742 .vigilante-self-case > summary::before {
3743 content: "\f139";
3744 font-family: dashicons;
3745 font-size: 18px;
3746 line-height: 1;
3747 color: #646970;
3748 }
3749
3750 .vigilante-self-case[open] > summary::before {
3751 content: "\f140";
3752 }
3753
3754 .vigilante-self-case-title {
3755 font-weight: 600;
3756 }
3757
3758 .vigilante-self-case-count {
3759 color: #646970;
3760 }
3761
3762 .vigilante-self-case-severity {
3763 margin-left: auto;
3764 font-size: 12px;
3765 text-transform: lowercase;
3766 color: #646970;
3767 }
3768
3769 .vigilante-self-case--critical .vigilante-self-case-severity {
3770 color: #d63638;
3771 }
3772
3773 .vigilante-self-case--warning .vigilante-self-case-severity {
3774 color: #996800;
3775 }
3776
3777 .vigilante-self-case-body {
3778 padding: 0 2px 12px 28px;
3779 }
3780
3781 .vigilante-self-paths {
3782 margin: 0 0 8px 18px;
3783 list-style: disc;
3784 }
3785
3786 .vigilante-self-paths code {
3787 background: rgba(0, 0, 0, 0.05);
3788 }
3789
3790 .vigilante-self-meaning,
3791 .vigilante-self-todo {
3792 margin: 6px 0 0;
3793 }
3794
3795 .vigilante-self-steps {
3796 margin: 4px 0 0 20px;
3797 }
3798
3799 .vigilante-self-steps li {
3800 margin-bottom: 6px;
3801 }
3802
3803 .vigilante-self-actions {
3804 display: flex;
3805 align-items: center;
3806 flex-wrap: wrap;
3807 gap: 10px;
3808 margin: 14px 0 0;
3809 }
3810
3811 /* ---------------------------------------------------------------------------
3812 Self-protection on the Dashboard tab: the same card as the ones below it
3813 (white, 1px border, 4px radius, 20px padding), not a notice bar pinned on
3814 top. Its content is centred, like the score cards it sits above.
3815 --------------------------------------------------------------------------- */
3816 .vigilante-self-strip {
3817 display: flex;
3818 align-items: center;
3819 justify-content: center;
3820 flex-wrap: wrap;
3821 gap: 10px;
3822 background: #fff;
3823 border: 1px solid #e5e5e5;
3824 border-radius: 4px;
3825 padding: 16px 20px;
3826 margin-bottom: 20px;
3827 text-align: center;
3828 }
3829
3830 .vigilante-self-strip--critical {
3831 border-color: #d63638;
3832 }
3833
3834 .vigilante-self-strip--warning {
3835 border-color: #dba617;
3836 }
3837
3838 .vigilante-self-strip .dashicons {
3839 color: #50575e;
3840 }
3841
3842 .vigilante-self-strip--critical .dashicons {
3843 color: #d63638;
3844 }
3845
3846 .vigilante-self-strip--warning .dashicons {
3847 color: #996800;
3848 }
3849
3850 .vigilante-self-strip--ok .dashicons {
3851 color: #00a32a;
3852 }
3853
3854 .vigilante-self-strip-state {
3855 color: #1d2327;
3856 }
3857
3858 .vigilante-self-strip--critical .vigilante-self-strip-state {
3859 color: #d63638;
3860 font-weight: 600;
3861 }
3862
3863 .vigilante-self-strip--warning .vigilante-self-strip-state {
3864 color: #996800;
3865 font-weight: 600;
3866 }
3867
3868 .vigilante-self-strip-count {
3869 color: #646970;
3870 }
3871
3872 .vigilante-self-notice .dashicons {
3873 vertical-align: text-bottom;
3874 }
3875
3876 .vigilante-analyzer-capped {
3877 margin: 0 0 12px;
3878 padding: 10px 14px;
3879 border-left: 4px solid #d63638;
3880 border-radius: 3px;
3881 background: #fcf0f1;
3882 }
3883
3884 .vigilante-analyzer-capped .dashicons {
3885 color: #d63638;
3886 vertical-align: text-bottom;
3887 }
3888
3889 /* Notice: what happened on one line, the explanation on another, the actions at
3890 the end. All of it inline was a wall nobody reads at a glance. */
3891 /* Two lines and not one pixel more than they need: a notice that takes a
3892 quarter of the screen is a notice that pushes the page down every time. */
3893 .vigilante-self-notice {
3894 padding: 6px 12px;
3895 }
3896
3897 .vigilante-self-notice p {
3898 margin: 3px 0;
3899 line-height: 1.5;
3900 }
3901
3902 .vigilante-self-notice-title {
3903 display: flex;
3904 align-items: center;
3905 gap: 6px;
3906 font-size: 13px;
3907 }
3908
3909 .vigilante-self-notice-title .dashicons {
3910 font-size: 17px;
3911 width: 17px;
3912 height: 17px;
3913 }
3914
3915 .vigilante-self-notice-text {
3916 display: flex;
3917 align-items: center;
3918 flex-wrap: wrap;
3919 gap: 10px;
3920 max-width: 75em;
3921 color: #3c434a;
3922 }
3923
3924 /*
3925 * On the Vigilant screens the notice lands inside the header row, where
3926 * WordPress drops it after the first h1. It goes after the search box and
3927 * takes the space that is left, in two lines: what happened, and the
3928 * explanation with its button.
3929 */
3930 .vigilante-header-row .vigilante-page-title {
3931 order: 1;
3932 }
3933
3934 .vigilante-header-row .vigilante-search-wrapper {
3935 order: 2;
3936 }
3937
3938 .vigilante-header-row .vigilante-self-notice {
3939 order: 3;
3940 /* Only as wide as what it says: a notice is block level and would take the
3941 rest of the row, which on a wide screen is a band of colour with a line
3942 of text lost in it. Outside the Vigilant screens it keeps the full width
3943 of any WordPress notice, because there it is the alarm. */
3944 flex: 0 1 auto;
3945 max-width: 100%;
3946 margin: 0;
3947 }
3948
3949 /* The submenu counter of File Integrity: the core bubble is small and low on
3950 contrast down there, and a counter nobody can read is a counter that is not
3951 there. */
3952 #adminmenu .toplevel_page_vigilante .wp-submenu .awaiting-mod,
3953 #adminmenu .toplevel_page_vigilante .wp-submenu .update-plugins {
3954 background: #d63638;
3955 color: #fff;
3956 font-size: 11px;
3957 font-weight: 600;
3958 line-height: 18px;
3959 min-width: 18px;
3960 padding: 0 6px;
3961 border-radius: 9px;
3962 margin-left: 6px;
3963 }
3964
3965 #adminmenu .toplevel_page_vigilante .wp-submenu .update-plugins.vigilante-badge-warning {
3966 background: #dba617;
3967 color: #1d2327;
3968 }
3969
3970 #adminmenu .toplevel_page_vigilante .wp-submenu .awaiting-mod .pending-count,
3971 #adminmenu .toplevel_page_vigilante .wp-submenu .update-plugins .pending-count {
3972 background: transparent;
3973 color: inherit;
3974 font-size: inherit;
3975 font-weight: inherit;
3976 padding: 0;
3977 }
3978