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

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

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