PluginProbe
Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner… / 2.11.6
Vigilant – 100% Free Security Suite: Firewall, 2FA, Login, Headers, Scanner… v2.11.6
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 2.9.4 2.9.3 All 86 releases
vigilante / assets / css / admin.css

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

3,605 lines 70.3 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 }