PluginProbe
Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner… / 3.0.5
Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner… v3.0.5
3.0.5 3.0.4 3.0.3 3.0.2 3.0.1 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 All 93 releases
vigilante / assets / css / admin.css

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

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