PluginProbe
404 Solution / trunk
404 Solution vtrunk
4.3.5 4.3.4 4.3.3 4.3.2 4.3.1 4.3.0 4.2.0 4.1.19 4.1.18 4.1.17 4.1.16 4.1.15 4.1.13 4.1.12 4.1.11 4.1.10 4.1.9 4.1.8 4.1.7 4.1.6 4.1.5 4.1.4 4.1.3 trunk 2.30.0 All 109 releases
404-solution / includes / html / 404solutionStyles.css

404solutionStyles.css in 404 Solution trunk, at includes/html/404solutionStyles.css

4,026 lines 95.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* ============================================
2 Container & Page Layout
3 ============================================ */
4
5 .abj404-container {
6 max-width: none;
7 margin: 0;
8 background: var(--abj404-surface);
9 border-radius: 8px;
10 box-shadow: var(--abj404-shadow-sm);
11 }
12
13 .abj404-page-header {
14 padding: 24px 32px;
15 border-bottom: 1px solid var(--abj404-border);
16 display: flex;
17 justify-content: space-between;
18 align-items: center;
19 flex-wrap: wrap;
20 gap: 16px;
21 }
22
23 .abj404-page-header h1 {
24 font-size: 24px;
25 font-weight: 600;
26 color: var(--abj404-text);
27 margin: 0;
28 }
29
30 .abj404-settings-content {
31 padding: 32px;
32 }
33
34 /* ============================================
35 Card System
36 ============================================ */
37
38 .abj404-card {
39 background: var(--abj404-card-bg);
40 border: 1px solid var(--abj404-border);
41 border-radius: 8px;
42 padding: 0;
43 margin-bottom: 24px;
44 transition: box-shadow 0.3s ease;
45 }
46
47 .abj404-card:hover {
48 box-shadow: var(--abj404-shadow-md);
49 }
50
51 .abj404-card:last-child {
52 margin-bottom: 0;
53 }
54
55 /* Cards rendered outside the main form (Engine Profiles, GSC) are direct children
56 of the settings container. Give them top margin to match the 24px gap between cards. */
57 .abj404-settings-content > .abj404-card {
58 margin-top: 24px;
59 }
60
61 /* Flow layout for stats page - cards in a flexible grid */
62 .abj404-flow-layout {
63 display: grid;
64 grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
65 gap: 20px;
66 align-items: start;
67 margin-bottom: 24px;
68 }
69
70 .abj404-flow-layout .abj404-card {
71 margin-bottom: 0;
72 }
73
74 /* For smaller cards that should stay compact */
75 .abj404-flow-layout .abj404-card-compact {
76 max-width: 400px;
77 }
78
79 .abj404-card-header {
80 display: flex;
81 justify-content: space-between;
82 align-items: center;
83 padding: 20px 24px;
84 cursor: pointer;
85 user-select: none;
86 border-bottom: 1px solid transparent;
87 transition: border-color 0.2s ease;
88 }
89
90 .abj404-card-header:hover {
91 background: var(--abj404-card-header-hover);
92 }
93
94 .abj404-card.expanded .abj404-card-header {
95 border-bottom-color: var(--abj404-border);
96 }
97
98 .abj404-card-title {
99 font-size: 18px;
100 font-weight: 600;
101 color: var(--abj404-text);
102 display: flex;
103 align-items: center;
104 gap: 10px;
105 margin: 0;
106 }
107
108 .abj404-card-icon {
109 width: 22px;
110 height: 22px;
111 color: var(--abj404-accent);
112 flex-shrink: 0;
113 }
114
115 .abj404-collapse-icon {
116 color: var(--abj404-text-muted);
117 transition: transform 0.3s ease;
118 flex-shrink: 0;
119 }
120
121 .abj404-card.expanded .abj404-collapse-icon {
122 transform: rotate(180deg);
123 }
124
125 .abj404-card-content {
126 padding: 24px;
127 display: none;
128 }
129
130 .abj404-card.expanded .abj404-card-content {
131 display: block;
132 }
133
134 /* ============================================
135 Info Badge
136 ============================================ */
137
138 .abj404-info-badge {
139 display: inline-block;
140 padding: 2px 8px;
141 border: 1px solid var(--abj404-info);
142 border-radius: 2px;
143 background: transparent;
144 color: inherit;
145 font-size: 11px;
146 font-weight: 400;
147 line-height: 1.5;
148 margin-left: 8px;
149 }
150
151 /* ============================================
152 Warning & Danger Boxes
153 ============================================ */
154
155 .abj404-warning-box {
156 background: var(--abj404-warning-bg);
157 border-left: 4px solid var(--abj404-warning-border);
158 padding: 12px 16px;
159 border-radius: 4px;
160 margin-top: 12px;
161 font-size: 13px;
162 color: var(--abj404-warning-text);
163 }
164
165 .abj404-danger-box {
166 background: var(--abj404-danger-bg);
167 border-left: 4px solid var(--abj404-danger-border);
168 padding: 12px 16px;
169 border-radius: 4px;
170 margin-top: 12px;
171 font-size: 13px;
172 color: var(--abj404-danger-text);
173 }
174
175 .abj404-warning-box strong,
176 .abj404-danger-box strong {
177 display: inline;
178 }
179
180 /* ============================================
181 Sticky Save Bar
182 ============================================ */
183
184 .abj404-sticky-save-bar {
185 position: sticky;
186 bottom: 0;
187 background: var(--abj404-surface);
188 border-top: 1px solid var(--abj404-border);
189 padding: 16px 32px;
190 display: flex;
191 justify-content: space-between;
192 align-items: center;
193 box-shadow: var(--abj404-shadow-up);
194 margin: 32px -32px -32px -32px;
195 border-radius: 0 0 8px 8px;
196 z-index: 10;
197 }
198
199 .abj404-save-bar-status {
200 color: var(--abj404-text-muted);
201 font-size: 13px;
202 }
203
204 .abj404-save-bar-actions {
205 display: flex;
206 gap: 12px;
207 }
208
209 /* ============================================
210 Success Toast Notification
211 ============================================ */
212
213 .abj404-toast {
214 background: var(--abj404-success);
215 color: var(--abj404-on-accent);
216 padding: 12px 20px;
217 position: fixed;
218 top: 50px;
219 right: 32px;
220 border-radius: 4px;
221 box-shadow: var(--abj404-shadow-md);
222 z-index: 999999;
223 display: none;
224 animation: abj404-slideIn 0.3s ease;
225 }
226
227 .abj404-toast.show {
228 display: block;
229 }
230
231 .abj404-toast.error {
232 background: var(--abj404-danger-border);
233 }
234
235 @keyframes abj404-slideIn {
236 from {
237 transform: translateX(100%);
238 opacity: 0;
239 }
240 to {
241 transform: translateX(0);
242 opacity: 1;
243 }
244 }
245
246 /* ============================================
247 Form Elements (Shared)
248 ============================================ */
249
250 .abj404-form-group {
251 margin-bottom: 24px;
252 }
253
254 .abj404-form-group:last-child {
255 margin-bottom: 0;
256 }
257
258 .abj404-form-label {
259 display: block;
260 font-weight: 600;
261 color: var(--abj404-text);
262 margin-bottom: 8px;
263 font-size: 14px;
264 }
265
266 .abj404-form-input,
267 .abj404-form-select {
268 width: 100%;
269 max-width: 500px;
270 padding: 10px 12px;
271 border: 1px solid var(--abj404-border);
272 border-radius: 4px;
273 font-size: 14px;
274 background: var(--abj404-surface);
275 color: var(--abj404-text);
276 transition: border-color 0.2s, box-shadow 0.2s;
277 }
278
279 .abj404-form-input:focus,
280 .abj404-form-select:focus {
281 outline: none;
282 border-color: var(--abj404-accent);
283 box-shadow: 0 0 0 1px var(--abj404-accent);
284 }
285
286 .abj404-form-input-small {
287 max-width: 120px;
288 }
289
290 .abj404-form-help {
291 color: var(--abj404-text-muted);
292 font-size: 13px;
293 margin-top: 6px;
294 line-height: 1.5;
295 }
296
297 .abj404-checkbox-group {
298 display: flex;
299 align-items: center;
300 gap: 10px;
301 }
302
303 .abj404-checkbox-input {
304 width: 18px;
305 height: 18px;
306 cursor: pointer;
307 accent-color: var(--abj404-accent);
308 }
309
310 .abj404-checkbox-label {
311 font-weight: 500;
312 cursor: pointer;
313 font-size: 14px;
314 color: var(--abj404-text);
315 }
316
317 .abj404-inline-fields {
318 display: flex;
319 align-items: center;
320 gap: 12px;
321 flex-wrap: wrap;
322 }
323
324 .abj404-inline-fields .abj404-form-input {
325 max-width: 200px;
326 }
327
328 .abj404-field-row {
329 display: grid;
330 grid-template-columns: 1fr 1fr;
331 gap: 20px;
332 }
333
334 @media (max-width: 768px) {
335 .abj404-field-row {
336 grid-template-columns: 1fr;
337 }
338 }
339
340 /* ============================================
341 Button Styles
342 ============================================ */
343
344 .abj404-btn {
345 padding: 10px 24px;
346 border: none;
347 border-radius: 4px;
348 font-weight: 500;
349 cursor: pointer;
350 transition: all 0.2s;
351 font-size: 14px;
352 text-decoration: none;
353 display: inline-block;
354 }
355
356 .abj404-btn-primary {
357 background: var(--abj404-accent);
358 color: var(--abj404-on-accent);
359 }
360
361 .abj404-btn-primary:hover {
362 background: var(--abj404-accent-hover);
363 color: var(--abj404-on-accent);
364 }
365
366 .abj404-btn-secondary {
367 background: var(--abj404-surface);
368 color: var(--abj404-accent);
369 border: 1px solid var(--abj404-accent);
370 }
371
372 .abj404-btn-secondary:hover {
373 background: var(--abj404-bg);
374 }
375
376 /* ============================================
377 Header Row with Inline Mode Toggle
378 ============================================ */
379
380 .abj404-header-row {
381 display: flex;
382 align-items: center;
383 justify-content: space-between;
384 flex-wrap: wrap;
385 gap: 12px;
386 }
387
388 .abj404-header-row h2 {
389 margin: 0;
390 flex-shrink: 0;
391 order: 1;
392 }
393
394 /* Header controls - groups mode toggle and expand button */
395 .abj404-header-controls {
396 display: flex;
397 align-items: center;
398 gap: 12px;
399 flex-wrap: wrap;
400 margin-left: auto;
401 order: 2;
402 }
403
404 /* Notices moved into header-row by WordPress JS - force to own row */
405 .abj404-header-row .notice {
406 order: 3;
407 flex-basis: 100%;
408 margin: 8px 0 0 0;
409 }
410
411 /* Review notice in plugin header areas */
412 .abj404-review-notice {
413 box-sizing: border-box;
414 position: relative;
415 width: 100%;
416 margin: 8px 0 0 0;
417 padding-right: 40px;
418 }
419
420 .abj404-review-notice p {
421 margin-right: 4px;
422 }
423
424 .abj404-review-notice-close {
425 position: absolute;
426 top: 8px;
427 right: 10px;
428 line-height: 1;
429 font-size: 18px;
430 font-weight: 700;
431 color: var(--abj404-text-muted);
432 text-decoration: none;
433 }
434
435 .abj404-review-notice-close:hover,
436 .abj404-review-notice-close:focus {
437 color: var(--abj404-text);
438 text-decoration: none;
439 }
440
441 .abj404-header-controls #abj404-expand-collapse-all {
442 white-space: nowrap;
443 }
444
445 /* ============================================
446 Simple/Advanced Mode Toggle
447 ============================================ */
448
449 .abj404-mode-toggle {
450 background: var(--abj404-surface);
451 border: 1px solid var(--abj404-border);
452 border-radius: 8px;
453 padding: 16px 20px;
454 margin-bottom: 24px;
455 }
456
457 /* Inline (compact) mode toggle in header */
458 .abj404-mode-toggle.abj404-mode-toggle-inline {
459 background: transparent;
460 border: none;
461 border-radius: 0;
462 padding: 0;
463 margin: 0;
464 }
465
466 .abj404-mode-toggle-inline .abj404-mode-toggle-buttons {
467 background: var(--abj404-bg);
468 border-radius: 4px;
469 padding: 2px;
470 gap: 2px;
471 }
472
473 .abj404-mode-toggle-inline .abj404-mode-btn {
474 padding: 6px 12px;
475 font-size: 13px;
476 gap: 0;
477 }
478
479 .abj404-mode-toggle-inline .abj404-mode-btn-icon {
480 display: none;
481 }
482
483 .abj404-mode-toggle-buttons {
484 display: inline-flex;
485 background: var(--abj404-bg);
486 border-radius: 6px;
487 padding: 4px;
488 gap: 4px;
489 }
490
491 .abj404-mode-btn {
492 display: inline-flex;
493 align-items: center;
494 gap: 8px;
495 padding: 10px 20px;
496 border: none;
497 border-radius: 4px;
498 background: transparent;
499 color: var(--abj404-text-muted);
500 font-size: 14px;
501 font-weight: 500;
502 cursor: pointer;
503 transition: all 0.2s ease;
504 }
505
506 .abj404-mode-btn:hover {
507 background: var(--abj404-surface);
508 color: var(--abj404-text);
509 }
510
511 .abj404-mode-btn.active {
512 background: var(--abj404-accent);
513 color: var(--abj404-on-accent);
514 box-shadow: var(--abj404-shadow-sm);
515 }
516
517 .abj404-mode-btn.active:hover {
518 background: var(--abj404-accent-hover);
519 color: var(--abj404-on-accent);
520 }
521
522 .abj404-mode-btn.loading {
523 opacity: 0.7;
524 cursor: wait;
525 }
526
527 .abj404-mode-btn-icon {
528 display: flex;
529 align-items: center;
530 }
531
532 .abj404-mode-btn-icon svg {
533 width: 16px;
534 height: 16px;
535 }
536
537 .abj404-mode-description {
538 margin: 12px 0 0 0;
539 color: var(--abj404-text-muted);
540 font-size: 13px;
541 }
542
543 /* ============================================
544 Simple Mode Options
545 ============================================ */
546
547 .abj404-simple-options {
548 max-width: 100%;
549 }
550
551 /* Destination field styling for the search input */
552 .abj404-dest-field .add_a_redirect_label {
553 display: none;
554 }
555
556 .abj404-dest-field #redirect_to_user_field {
557 width: 100%;
558 max-width: 400px;
559 padding: 8px 12px;
560 border: 1px solid var(--abj404-border);
561 border-radius: 4px;
562 font-size: 14px;
563 background: var(--abj404-surface);
564 color: var(--abj404-text);
565 }
566
567 .abj404-dest-field br {
568 display: none;
569 }
570
571 .abj404-dest-field #redirect_to_user_field_explanation,
572 .abj404-dest-field #redirect_to_user_field_warning {
573 display: block;
574 margin-top: 4px;
575 }
576
577 .abj404-simple-section {
578 background: var(--abj404-surface);
579 border: 1px solid var(--abj404-border);
580 border-radius: 8px;
581 padding: 24px;
582 margin-bottom: 20px;
583 }
584
585 .abj404-simple-section h3 {
586 margin: 0 0 20px 0;
587 padding: 0 0 12px 0;
588 border-bottom: 1px solid var(--abj404-border);
589 font-size: 15px;
590 font-weight: 600;
591 color: var(--abj404-text);
592 }
593
594 .abj404-simple-field {
595 margin-bottom: 20px;
596 }
597
598 .abj404-simple-field:last-child {
599 margin-bottom: 0;
600 }
601
602 .abj404-simple-field > label {
603 display: block;
604 margin-bottom: 6px;
605 font-weight: 500;
606 color: var(--abj404-text);
607 }
608
609 .abj404-simple-field > label input[type="checkbox"] {
610 margin-right: 8px;
611 }
612
613 .abj404-simple-field input[type="text"],
614 .abj404-simple-field select {
615 width: 100%;
616 max-width: 300px;
617 padding: 8px 12px;
618 border: 1px solid var(--abj404-border);
619 border-radius: 4px;
620 font-size: 14px;
621 background: var(--abj404-surface);
622 color: var(--abj404-text);
623 }
624
625 .abj404-simple-field input[type="text"]:focus,
626 .abj404-simple-field select:focus {
627 border-color: var(--abj404-accent);
628 box-shadow: 0 0 0 1px var(--abj404-accent);
629 outline: none;
630 }
631
632 .abj404-input-with-suffix {
633 display: inline-flex;
634 align-items: center;
635 gap: 8px;
636 }
637
638 .abj404-input-with-suffix input[type="text"] {
639 width: 80px;
640 text-align: right;
641 }
642
643 .abj404-input-suffix {
644 color: var(--abj404-text-muted);
645 font-size: 14px;
646 }
647
648 .abj404-field-description {
649 margin: 6px 0 0 0;
650 color: var(--abj404-text-muted);
651 font-size: 13px;
652 }
653
654 .abj404-simple-actions {
655 margin-top: 24px;
656 padding-top: 20px;
657 border-top: 1px solid var(--abj404-border);
658 }
659
660 .abj404-simple-actions .button-large {
661 padding: 8px 24px;
662 font-size: 14px;
663 }
664
665 /* Advanced Mode Hint */
666 .abj404-mode-hint {
667 display: flex;
668 align-items: center;
669 gap: 12px;
670 padding: 16px 20px;
671 background: var(--abj404-bg);
672 border: 1px solid var(--abj404-border);
673 border-radius: 8px;
674 margin-top: 24px;
675 }
676
677 .abj404-mode-hint-icon {
678 flex-shrink: 0;
679 color: var(--abj404-accent);
680 }
681
682 .abj404-mode-hint-icon svg {
683 display: block;
684 }
685
686 .abj404-mode-hint-text {
687 color: var(--abj404-text-muted);
688 font-size: 14px;
689 }
690
691 .abj404-mode-hint-text a,
692 a.abj404-switch-to-advanced {
693 color: var(--abj404-accent);
694 text-decoration: none;
695 font-weight: 500;
696 }
697
698 .abj404-mode-hint-text a:hover,
699 a.abj404-switch-to-advanced:hover {
700 color: var(--abj404-accent-hover);
701 text-decoration: underline;
702 }
703
704 /* ============================================
705 Original Styles Below
706 ============================================ */
707
708 .destination-does-not-exist {
709 background-color: var(--abj404-danger-row-bg);
710 }
711
712 .exclude-pages-page-type {
713 font-style: italic;
714 }
715 .exclude-pages-cell {
716 vertical-align: top;
717 }
718
719 .closeable-ul {
720 box-sizing: border-box;
721 max-height: 12em;
722 overflow: auto;
723 }
724 /* Style the list (remove margins and bullets, etc) */
725 .closeable-ul {
726 list-style-type: none;
727 padding: 0;
728 margin: 0;
729 }
730
731 /* Style the list items */
732 .closeable-ul li {
733 border: 1px solid var(--abj404-border);
734 margin-top: -1px; /* Prevent double borders */
735 background-color: var(--abj404-surface-muted);
736 text-decoration: none;
737 font-size: 1.2em;
738 color: black;
739 display: block;
740 position: relative;
741 }
742
743 /* Add a light grey background color on hover */
744 .closeable-ul li:hover {
745 background-color: var(--abj404-surface-hover);
746 }
747
748 /* Style the close button (span) */
749 .closeable-ul .close {
750 background: var(--abj404-surface-hover);
751 cursor: pointer;
752 position: absolute;
753 top: 50%;
754 right: 0%;
755 padding: 0px 16px;
756 transform: translate(0%, -50%);
757 }
758
759 .closeable-ul .close:hover {background: var(--abj404-border);}
760
761
762 .hide-when-true {
763 display: none;
764 }
765
766 /* Make the pagination links easier to click for steveraven */
767 .pagination-link {
768 border-radius: 0 3px 3px 0;
769 border-style: solid;
770 border-width: 1px;
771 box-sizing: border-box;
772 padding-bottom: 4px;
773 padding-left: 8px;
774 padding-right: 8px;
775 padding-top: 3px;
776 text-decoration-line: none;
777 }
778
779 .displaying-num {
780 padding-left: 10px;
781 }
782
783 /* This is for the redirect page search dropdown. */
784 .indent-depth-0.ui-menu-item {
785 padding-left: 10px;
786 width: -moz-available; /* WebKit-based browsers will ignore this. */
787 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
788 width: stretch;
789 }
790 .indent-depth-1.ui-menu-item {
791 padding-left: 20px;
792 width: -moz-available; /* WebKit-based browsers will ignore this. */
793 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
794 width: stretch;
795 }
796 .indent-depth-2.ui-menu-item {
797 padding-left: 30px;
798 width: -moz-available; /* WebKit-based browsers will ignore this. */
799 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
800 width: stretch;
801 }
802 .indent-depth-3.ui-menu-item {
803 padding-left: 40px;
804 width: -moz-available; /* WebKit-based browsers will ignore this. */
805 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
806 width: stretch;
807 }
808 .indent-depth-4.ui-menu-item {
809 padding-left: 50px;
810 width: -moz-available; /* WebKit-based browsers will ignore this. */
811 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
812 width: stretch;
813 }
814 .indent-depth-5.ui-menu-item {
815 padding-left: 60px;
816 width: -moz-available; /* WebKit-based browsers will ignore this. */
817 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
818 width: stretch;
819 }
820 .indent-depth-6.ui-menu-item {
821 padding-left: 70px;
822 width: -moz-available; /* WebKit-based browsers will ignore this. */
823 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
824 width: stretch;
825 }
826 .indent-depth-7.ui-menu-item {
827 padding-left: 80px;
828 width: -moz-available; /* WebKit-based browsers will ignore this. */
829 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
830 width: stretch;
831 }
832 .indent-depth-8.ui-menu-item {
833 padding-left: 90px;
834 width: -moz-available; /* WebKit-based browsers will ignore this. */
835 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
836 width: stretch;
837 }
838 .indent-depth-9.ui-menu-item {
839 padding-left: 100px;
840 width: -moz-available; /* WebKit-based browsers will ignore this. */
841 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
842 width: stretch;
843 }
844 .ui-autocomplete li {
845 font-family: Arial,Helvetica,sans-serif;
846 font-size: 1em;
847 padding: 0px 10px;
848 max-height: 400px;
849 overflow-y: auto;
850 /* prevent horizontal scrollbar */
851 overflow-x: hidden;
852 padding-left: 0px;
853 }
854 ul .ui-autocomplete-category {
855 font-weight: bold;
856 margin: .8em 0 .2em;
857 line-height: 1.5;
858
859 /** custom **/
860 display: flex;
861 color: gray;
862 font-weight: normal;
863 padding-left: 0px;
864 }
865
866 /* This hides the last empty element when the data is truncated and the final element is added only
867 so that the final category will be added. */
868 .hide-me-please {
869 display: none;
870 }
871 ul .ui-autocomplete-category.data-overflow-category {
872 color: black;
873 font-weight: bold;
874 font-style: italic;
875 }
876
877 /* -- - - - - -- - - - - - -- - - - - - - - - - - - - - -*/
878 .lefty-tooltip {
879 position: relative;
880 border-bottom: 1px dotted var(--abj404-text-muted);
881 cursor: help;
882 }
883
884 .abj404-header-tooltip.lefty-tooltip {
885 border-bottom: none;
886 display: inline-flex;
887 align-items: center;
888 justify-content: center;
889 width: 16px;
890 height: 16px;
891 margin-left: 6px;
892 border: 1px solid var(--abj404-border);
893 border-radius: 999px;
894 color: var(--abj404-text-muted);
895 background: var(--abj404-surface);
896 vertical-align: middle;
897 }
898
899 .abj404-header-tooltip-icon {
900 font-size: 11px;
901 font-weight: 600;
902 line-height: 1;
903 }
904
905 .abj404-header-tooltip.lefty-tooltip:hover {
906 color: var(--abj404-accent);
907 border-color: var(--abj404-accent);
908 }
909
910 .abj404-header-tooltip .lefty-tooltiptext {
911 top: calc(100% + 6px);
912 }
913
914 .lefty-tooltip .lefty-tooltiptext {
915 visibility: hidden;
916 opacity: 0;
917 background-color: var(--abj404-text);
918 color: var(--abj404-on-accent);
919 text-align: left;
920 border-radius: 6px;
921 padding: 10px 12px;
922 font-size: 13px;
923 line-height: 1.5;
924 font-weight: normal;
925 white-space: normal;
926 word-wrap: break-word;
927 text-transform: none;
928
929 /* Position the tooltip */
930 position: absolute;
931 width: max-content;
932 max-width: 300px;
933 min-width: 150px;
934 top: calc(100% - 8px);
935 left: 0;
936 transform: none;
937 z-index: 1000;
938 box-shadow: var(--abj404-shadow-md);
939
940 transition: opacity 0.15s ease-in-out, visibility 0.15s ease-in-out;
941 }
942
943 /* No arrow - tooltip appears below without pointer */
944 .lefty-tooltip .lefty-tooltiptext::before {
945 display: none;
946 }
947
948 .lefty-tooltip:hover .lefty-tooltiptext {
949 visibility: visible;
950 opacity: 1;
951 }
952
953 /* Tooltips in last columns - align right to prevent overflow */
954 th:nth-last-child(-n+3) .lefty-tooltiptext {
955 left: auto;
956 right: 0;
957 }
958 /* -- - - - - -- - - - - - -- - - - - - - - - - - - - - -*/
959
960 /* Include a space after the apply button so that the Trash button isn't right next to it. */
961 #captured_404s_bulk_apply {
962 margin-right: 10px;
963 }
964
965 /* -- - - - - -- - - - - - -- - - - - - - - - - - - - - -*/
966 .ui-autocomplete {
967 max-height: 400px;
968 overflow-y: auto;
969 /* prevent horizontal scrollbar */
970 overflow-x: hidden;
971 }
972
973 /* ============================================
974 Options Page Accordion
975 ============================================ */
976
977 /* Accordion controls (Expand All button and Save Settings) */
978 .abj404-accordion-controls {
979 display: flex;
980 align-items: center;
981 justify-content: space-between;
982 gap: 12px;
983 margin: 0 0 20px 0;
984 padding: 12px 0;
985 }
986
987 /* Make accordion controls sticky on larger screens */
988 @media (min-width: 783px) {
989 .abj404-accordion-controls {
990 position: sticky;
991 top: 75px;
992 z-index: 100;
993 background: var(--abj404-bg-muted);
994 padding: 12px 16px;
995 margin: 0 -16px 20px -16px;
996 box-shadow: var(--abj404-shadow-sm);
997 }
998
999 /* Dark theme background for sticky controls */
1000 html[data-theme="neon"] .abj404-accordion-controls,
1001 html[data-theme="obsidian"] .abj404-accordion-controls {
1002 background: var(--abj-bg-primary);
1003 }
1004 }
1005
1006 /* Accordion section container */
1007 .abj404-accordion-section {
1008 margin-bottom: 16px;
1009 }
1010
1011 /* Accordion header (clickable) */
1012 .abj404-accordion-header {
1013 display: flex;
1014 align-items: center;
1015 justify-content: space-between;
1016 margin: 0;
1017 padding: 14px 16px;
1018 background: var(--abj404-surface);
1019 border: 1px solid var(--abj404-border);
1020 border-radius: 4px;
1021 cursor: pointer;
1022 transition: all 0.2s ease;
1023 user-select: none;
1024 }
1025
1026 .abj404-accordion-header:hover {
1027 background: var(--abj404-surface-hover);
1028 border-color: var(--abj404-primary);
1029 }
1030
1031 .abj404-accordion-header:focus-visible {
1032 outline: 2px solid var(--abj404-primary);
1033 outline-offset: 2px;
1034 }
1035
1036 /* Accordion header text */
1037 .abj404-accordion-header > span:first-child {
1038 font-size: 14px;
1039 font-weight: 600;
1040 color: var(--abj404-text);
1041 }
1042
1043 /* Accordion toggle arrow */
1044 .abj404-accordion-toggle {
1045 font-size: 12px;
1046 color: var(--abj404-text-muted);
1047 transition: transform 0.3s ease;
1048 display: inline-block;
1049 }
1050
1051 /* Rotate arrow when expanded */
1052 .abj404-accordion-header[aria-expanded="true"] .abj404-accordion-toggle {
1053 transform: rotate(180deg);
1054 }
1055
1056 /* Accordion content */
1057 .abj404-accordion-content {
1058 margin-top: -1px; /* Overlap border with header */
1059 }
1060
1061 .abj404-accordion-content .postbox {
1062 border-top-left-radius: 0;
1063 border-top-right-radius: 0;
1064 }
1065
1066 /* Mobile adjustments */
1067 @media (max-width: 782px) {
1068 .abj404-accordion-header {
1069 padding: 12px 14px;
1070 }
1071
1072 .abj404-accordion-controls {
1073 flex-wrap: wrap;
1074 }
1075
1076 .abj404-accordion-controls input[type="submit"] {
1077 width: 100%;
1078 }
1079 }
1080
1081 /* ============================================
1082 Save Loading Overlay
1083 ============================================ */
1084
1085 /* Overlay backdrop */
1086 .abj404-save-overlay {
1087 position: fixed;
1088 top: 0;
1089 left: 0;
1090 width: 100%;
1091 height: 100%;
1092 background: var(--abj404-overlay-bg);
1093 z-index: 999999;
1094 display: flex;
1095 align-items: center;
1096 justify-content: center;
1097 }
1098
1099 /* Overlay content box */
1100 .abj404-save-overlay-content {
1101 background: var(--abj404-surface);
1102 padding: 32px 48px;
1103 border-radius: 8px;
1104 box-shadow: var(--abj404-shadow-lg);
1105 text-align: center;
1106 max-width: 400px;
1107 }
1108
1109 /* WordPress-style spinner */
1110 .abj404-spinner {
1111 width: 40px;
1112 height: 40px;
1113 margin: 0 auto 16px;
1114 border: 4px solid var(--abj404-border);
1115 border-top-color: var(--abj404-accent);
1116 border-radius: 50%;
1117 animation: abj404-spin 0.8s linear infinite;
1118 }
1119
1120 @keyframes abj404-spin {
1121 to { transform: rotate(360deg); }
1122 }
1123
1124 /* Save message text */
1125 .abj404-save-message {
1126 margin: 0;
1127 font-size: 16px;
1128 color: var(--abj404-text);
1129 font-weight: 500;
1130 }
1131
1132 /* Error state */
1133 .abj404-save-overlay.error .abj404-spinner {
1134 display: none;
1135 }
1136
1137 .abj404-save-overlay.error .abj404-save-overlay-content {
1138 border-left: 4px solid var(--abj404-danger);
1139 }
1140
1141 .abj404-save-overlay.error .abj404-save-message {
1142 color: var(--abj404-danger);
1143 }
1144
1145 /* ============================================
1146 Navigation Tabs (Modern Design)
1147 ============================================ */
1148
1149 /* Top sub-navigation tabs use the native WordPress .nav-tab-wrapper / .nav-tab
1150 pattern. No custom positioning, colors, icons, or branding chrome here; core
1151 admin styles apply. */
1152
1153 /* ============================================
1154 Table Page Layout (Redirects, Captured, Logs)
1155 ============================================ */
1156
1157 .abj404-table-page {
1158 background: var(--abj404-surface);
1159 border-radius: 8px;
1160 box-shadow: var(--abj404-shadow-sm);
1161 overflow-x: clip; /* Prevent tooltips from causing horizontal scroll, doesn't break sticky */
1162 }
1163
1164 /* All card-surface rows above the table (header, subsubsub list-top,
1165 filter/tablenav bar) and the table itself share the same 8px
1166 left/right gutter so the h1, subtabs, bulk actions, and table
1167 edge stack on one vertical line, matching the WordPress core
1168 Pages screen layout where everything aligns to the page wrap edge. */
1169 .abj404-table-header {
1170 padding: 4px 8px 6px;
1171 display: flex;
1172 justify-content: space-between;
1173 align-items: center;
1174 flex-wrap: wrap;
1175 gap: 12px;
1176 }
1177
1178 .abj404-table-header h1 {
1179 font-size: 23px;
1180 font-weight: 400;
1181 color: var(--abj404-text);
1182 margin: 0;
1183 padding: 9px 0 4px;
1184 line-height: 1.3;
1185 }
1186
1187 /* ============================================
1188 Content Tabs (All, Manual, Automatic, Trash)
1189 ============================================ */
1190
1191 /* Native WordPress .subsubsub markup is used for list-table filter rows.
1192 No custom tab chrome is needed; core handles pipes and active state. The only
1193 adjustment is to align the row's left edge with the card's 32px content gutter
1194 (filter bar, pagination) instead of butting against the card edge. The bottom
1195 margin is intentionally small so the gap to the .abj404-filter-bar tablenav
1196 row below stays in line with WordPress's native subsubsub-to-tablenav spacing
1197 (~6px). The .abj404-list-top wrapper provides the row's own vertical padding. */
1198 .abj404-table-page .subsubsub {
1199 margin: 4px 0 0;
1200 }
1201
1202 /* Native WP_List_Table top row: filter links (subsubsub) plus the view
1203 settings (rows-per-page, confidence) on the left, search box on the right.
1204 These view settings deliberately live here rather than on the .tablenav row
1205 so the tablenav can hold only the native bulk-actions + pagination pair and
1206 never wraps to a second line when a selection is active. */
1207 .abj404-list-top {
1208 display: flex;
1209 align-items: center;
1210 flex-wrap: wrap;
1211 gap: 16px;
1212 padding: 2px 8px 6px;
1213 }
1214
1215 .abj404-list-top .subsubsub {
1216 margin: 0;
1217 }
1218
1219 .abj404-view-settings {
1220 display: flex;
1221 align-items: center;
1222 flex-wrap: wrap;
1223 gap: 16px;
1224 }
1225
1226 .abj404-list-top .abj404-search-box {
1227 flex: 0 0 auto;
1228 min-width: 0;
1229 max-width: 100%;
1230 margin-left: auto;
1231 }
1232
1233 .abj404-list-top .abj404-search-box input {
1234 width: 280px;
1235 max-width: 100%;
1236 }
1237
1238 /* ============================================
1239 Filter Bar
1240 ============================================ */
1241
1242 .abj404-filter-bar {
1243 padding: 6px 8px;
1244 background: var(--abj404-bg);
1245 border-bottom: 1px solid var(--abj404-border);
1246 display: flex;
1247 gap: 12px;
1248 align-items: center;
1249 flex-wrap: wrap;
1250 }
1251
1252 .abj404-search-box {
1253 flex: 1;
1254 min-width: 250px;
1255 max-width: 400px;
1256 position: relative;
1257 }
1258
1259 .abj404-search-box input {
1260 width: 100%;
1261 padding: 10px 12px;
1262 border: 1px solid var(--abj404-border);
1263 border-radius: 4px;
1264 font-size: 14px;
1265 line-height: normal;
1266 background: var(--abj404-surface);
1267 color: var(--abj404-text);
1268 }
1269
1270 .abj404-search-box input:focus {
1271 outline: none;
1272 border-color: var(--abj404-accent);
1273 box-shadow: 0 0 0 1px var(--abj404-accent);
1274 }
1275
1276 .abj404-filter-select {
1277 padding: 10px 12px;
1278 border: 1px solid var(--abj404-border);
1279 border-radius: 4px;
1280 font-size: 14px;
1281 line-height: normal;
1282 background: var(--abj404-surface);
1283 color: var(--abj404-text);
1284 cursor: pointer;
1285 min-width: 120px;
1286 }
1287
1288 .abj404-filter-select:focus {
1289 outline: none;
1290 border-color: var(--abj404-accent);
1291 box-shadow: 0 0 0 1px var(--abj404-accent);
1292 }
1293
1294 .abj404-rows-per-page {
1295 display: flex;
1296 align-items: center;
1297 gap: 8px;
1298 font-size: 14px;
1299 color: var(--abj404-text-muted);
1300 }
1301
1302 .abj404-rows-per-page select {
1303 padding: 8px 12px;
1304 border: 1px solid var(--abj404-border);
1305 border-radius: 4px;
1306 font-size: 14px;
1307 line-height: normal;
1308 background: var(--abj404-surface);
1309 cursor: pointer;
1310 }
1311
1312 /* The rows-per-page select only ever shows a small number; it does not need
1313 the 120px min-width the other filter selects use. */
1314 .abj404-rows-per-page select.perpage {
1315 min-width: 0;
1316 width: auto;
1317 }
1318
1319 /* ============================================
1320 Bulk Actions Bar
1321 ============================================ */
1322
1323 /* Bulk actions sit inline on the tablenav row, always visible (matching the
1324 native WordPress Posts/Pages layout where "Bulk actions" + "Apply" are shown
1325 even with no selection). When nothing is selected, dim the container so the
1326 row visually reads as inactive without the layout shifting when a selection
1327 appears. The .active class is added by tableInteractions.js when the user
1328 checks at least one row. */
1329 .abj404-bulk-actions {
1330 display: flex;
1331 align-items: center;
1332 gap: 8px;
1333 flex-wrap: wrap;
1334 }
1335
1336 .abj404-bulk-actions:not(.active) {
1337 opacity: 0.55;
1338 }
1339
1340 .abj404-selection-info {
1341 font-weight: 500;
1342 color: var(--abj404-text-muted);
1343 font-size: 13px;
1344 }
1345
1346 .abj404-selection-info strong {
1347 font-weight: 700;
1348 }
1349
1350 .abj404-bulk-actions .abj404-btn {
1351 padding: 4px 10px;
1352 font-size: 13px;
1353 }
1354
1355 /* ============================================
1356 Modern Table Styling
1357 ============================================ */
1358
1359 .abj404-table-container {
1360 margin: 0;
1361 padding: 0 8px;
1362 }
1363
1364 .abj404-table {
1365 width: 100%;
1366 border-collapse: collapse;
1367 table-layout: auto;
1368 }
1369
1370 /* Checkbox column: match WP core .check-column. No explicit width;
1371 let the cell size to its 2.2em content + the asymmetric padding
1372 in the override block below (8px left, 0 right). */
1373 .abj404-table th:first-child,
1374 .abj404-table td:first-child {
1375 width: 2.2em;
1376 min-width: 2.2em;
1377 box-sizing: border-box;
1378 }
1379
1380
1381 .abj404-table thead {
1382 background: var(--abj404-bg);
1383 border-bottom: 1px solid var(--abj404-border);
1384 }
1385
1386 /* Column header row matches WP core's .wp-list-table th but tighter:
1387 4px vertical padding. white-space: nowrap on the th alone is not
1388 enough when the cell contains a sibling tooltip span the browser
1389 may wrap; the .abj404-th-inner wrapper below pins title + tooltip
1390 into one inline-flex line so the header is single-row even when
1391 the Hits/Last Used columns carry a "?" tooltip icon. */
1392 .abj404-table th {
1393 text-align: left;
1394 padding: 4px 10px;
1395 font-weight: 600;
1396 font-size: 13px;
1397 color: var(--abj404-text);
1398 white-space: nowrap;
1399 position: sticky;
1400 top: 32px; /* WordPress admin bar; the nav tabs scroll away (not fixed) */
1401 z-index: 10;
1402 background: var(--abj404-bg);
1403 }
1404
1405 /* The checkbox column on both the Page Redirects and Captured 404s
1406 tabs uses class="manage-column column-cb check-column". WordPress
1407 admin loads .check-column rules from common.css that can override
1408 our left padding; pin 10px here so both tabs are visually
1409 identical regardless of WP-core CSS load order. */
1410 .abj404-table th.check-column,
1411 .abj404-table td.check-column,
1412 .abj404-table th:first-child,
1413 .abj404-table td:first-child {
1414 padding-left: 8px;
1415 padding-right: 0;
1416 }
1417
1418 .abj404-table th .abj404-th-inner {
1419 display: inline-flex;
1420 align-items: center;
1421 gap: 6px;
1422 white-space: nowrap;
1423 }
1424
1425 /* Each sticky th (z-index:10, opaque background) is its own stacking context,
1426 so a header tooltip's z-index:1000 only ranks WITHIN its own th and is
1427 painted over by later sibling th cells (the dropped-down tooltip lands behind
1428 the next columns). Raise the active header above its siblings while its
1429 tooltip is open so the popup escapes over the adjacent headers. :focus-within
1430 covers keyboard access to the "?" affordance. */
1431 .abj404-table th:hover,
1432 .abj404-table th:focus-within {
1433 z-index: 11;
1434 }
1435
1436 @media screen and (max-width: 782px) {
1437 .abj404-table th {
1438 top: 46px; /* taller mobile admin bar */
1439 }
1440 }
1441
1442 .abj404-table th.sortable {
1443 cursor: pointer;
1444 user-select: none;
1445 }
1446
1447 .abj404-table th.sortable:hover {
1448 color: var(--abj404-accent);
1449 }
1450
1451 .abj404-table th.sorted {
1452 color: var(--abj404-accent);
1453 }
1454
1455 .abj404-table th .sorting-indicator,
1456 .abj404-table th .sort-indicator {
1457 display: inline-block;
1458 margin-left: 4px;
1459 opacity: 0.5;
1460 min-width: 0.8em;
1461 text-align: center;
1462 }
1463
1464 .abj404-table th .sorting-indicator::before,
1465 .abj404-table th .sort-indicator::before {
1466 content: "";
1467 font-size: 12px;
1468 line-height: 1;
1469 }
1470
1471 .abj404-table th.sorted .sorting-indicator,
1472 .abj404-table th.sorted .sort-indicator {
1473 opacity: 1;
1474 }
1475
1476 .abj404-table th.sorted.asc .sorting-indicator::before,
1477 .abj404-table th.sorted.asc .sort-indicator::before {
1478 content: "";
1479 }
1480
1481 .abj404-table th.sorted.desc .sorting-indicator::before,
1482 .abj404-table th.sorted.desc .sort-indicator::before {
1483 content: "";
1484 }
1485
1486 .abj404-table th input[type="checkbox"] {
1487 cursor: pointer;
1488 }
1489
1490 .abj404-table tbody tr {
1491 border-bottom: 1px solid var(--abj404-border);
1492 transition: background-color 0.15s;
1493 }
1494
1495 .abj404-table tbody tr:hover {
1496 background: var(--abj404-bg);
1497 }
1498
1499 .abj404-table tbody tr:nth-child(even) {
1500 background: var(--abj404-row-stripe);
1501 }
1502
1503 .abj404-table tbody tr:nth-child(even):hover {
1504 background: var(--abj404-row-stripe-hover);
1505 }
1506
1507 .abj404-table tbody tr.destination-does-not-exist,
1508 .abj404-table tbody tr.destination-does-not-exist:nth-child(even) {
1509 background: var(--abj404-danger-row-bg);
1510 }
1511
1512 .abj404-table tbody tr.destination-does-not-exist:hover,
1513 .abj404-table tbody tr.destination-does-not-exist:nth-child(even):hover {
1514 background: var(--abj404-danger-row-bg-hover);
1515 }
1516
1517 .abj404-table tbody tr.destination-does-not-exist .abj404-dest-warning {
1518 color: var(--abj404-danger-row-text);
1519 font-weight: 600;
1520 }
1521
1522 .abj404-table td {
1523 padding: 12px 8px;
1524 font-size: 13px;
1525 vertical-align: middle;
1526 overflow: visible;
1527 }
1528
1529 .abj404-table td input[type="checkbox"] {
1530 cursor: pointer;
1531 width: 18px;
1532 height: 18px;
1533 }
1534
1535 /* URL Cell */
1536 .abj404-url-cell {
1537 font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
1538 color: var(--abj404-accent);
1539 word-break: break-word;
1540 position: relative;
1541 }
1542
1543 .abj404-url-cell::after {
1544 content: '';
1545 position: absolute;
1546 left: 0;
1547 top: 100%;
1548 width: 100%;
1549 height: 28px;
1550 display: none;
1551 }
1552
1553 .abj404-url-cell:hover::after,
1554 .abj404-url-cell:focus-within::after {
1555 display: block;
1556 }
1557
1558 .abj404-url-cell a {
1559 color: inherit;
1560 text-decoration: none;
1561 }
1562
1563 .abj404-url-cell a:hover {
1564 text-decoration: underline;
1565 }
1566
1567 .abj404-captured-url-line {
1568 display: flex;
1569 align-items: baseline;
1570 gap: 8px;
1571 }
1572
1573 .abj404-captured-url-line > a {
1574 min-width: 0;
1575 }
1576
1577 .abj404-source-trigger {
1578 margin-left: auto;
1579 padding: 0;
1580 border: 0;
1581 background: transparent;
1582 color: var(--abj404-text-muted);
1583 cursor: pointer;
1584 font: inherit;
1585 font-family: inherit;
1586 font-size: 12px;
1587 text-decoration: none;
1588 white-space: nowrap;
1589 }
1590
1591 .abj404-source-trigger:hover,
1592 .abj404-source-trigger:focus {
1593 color: var(--abj404-accent);
1594 text-decoration: underline;
1595 }
1596
1597 .abj404-source-panel {
1598 margin-top: 8px;
1599 padding: 8px 10px;
1600 border: 1px solid var(--abj404-border);
1601 background: var(--abj404-bg);
1602 color: var(--abj404-text);
1603 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
1604 max-width: 560px;
1605 }
1606
1607 .abj404-source-heading {
1608 margin-bottom: 6px;
1609 font-weight: 600;
1610 }
1611
1612 .abj404-source-list {
1613 margin: 0;
1614 padding: 0;
1615 list-style: none;
1616 }
1617
1618 .abj404-source-row {
1619 display: grid;
1620 grid-template-columns: minmax(0, 1fr) max-content max-content;
1621 gap: 10px;
1622 align-items: baseline;
1623 margin: 0;
1624 padding: 3px 0;
1625 }
1626
1627 .abj404-source-label {
1628 min-width: 0;
1629 overflow-wrap: anywhere;
1630 }
1631
1632 .abj404-source-count,
1633 .abj404-source-truncation {
1634 color: var(--abj404-text-muted);
1635 }
1636
1637 .abj404-source-edit {
1638 color: var(--abj404-accent);
1639 text-decoration: none;
1640 }
1641
1642 .abj404-source-edit:hover,
1643 .abj404-source-edit:focus {
1644 text-decoration: underline;
1645 }
1646
1647 .abj404-source-truncation {
1648 margin: 6px 0 0;
1649 font-size: 12px;
1650 }
1651
1652 /* Hits Cell */
1653 .abj404-hits-cell {
1654 text-align: right;
1655 font-weight: 600;
1656 color: var(--abj404-text);
1657 }
1658
1659 /* Date Cell */
1660 .abj404-date-cell {
1661 color: var(--abj404-text-muted);
1662 font-size: 12px;
1663 white-space: nowrap;
1664 }
1665
1666 /* Destination Cell */
1667 .abj404-dest-cell {
1668 word-break: break-word;
1669 }
1670
1671 .abj404-dest-cell a {
1672 display: block;
1673 }
1674
1675 /* ============================================
1676 Status & Type Badges
1677 ============================================ */
1678
1679 /* Native bordered-label pattern: 1px border carries semantic, no fill,
1680 regular text weight. Mirrors WP Site Health Security/Performance badges
1681 (wp-admin/css/edit.css ~L925). Colors come from --abj404-* custom
1682 properties defined in adminThemes.css so admin-theme plugins (Dark Mode,
1683 etc.) can recolor by overriding the variables. */
1684 .abj404-badge {
1685 display: inline-block;
1686 padding: 2px 8px;
1687 border: 1px solid var(--abj404-border);
1688 border-radius: 2px;
1689 background: transparent;
1690 color: inherit;
1691 font-size: 11px;
1692 font-weight: 400;
1693 line-height: 1.5;
1694 white-space: nowrap;
1695 }
1696
1697 .abj404-badge-auto { border-color: var(--abj404-info); }
1698 .abj404-badge-manual { border-color: var(--abj404-border); }
1699 .abj404-badge-regex { border-color: var(--abj404-info); }
1700 .abj404-badge-301 { border-color: var(--abj404-success); }
1701 .abj404-badge-302 { border-color: var(--abj404-warning); }
1702 .abj404-badge-307 { border-color: var(--abj404-info); }
1703 .abj404-badge-308 { border-color: var(--abj404-info); }
1704 .abj404-badge-410 { border-color: var(--abj404-danger); }
1705 .abj404-badge-451 { border-color: var(--abj404-danger); }
1706 .abj404-badge-meta { border-color: var(--abj404-border); }
1707 .abj404-badge-captured { border-color: var(--abj404-warning); }
1708 .abj404-badge-ignored { border-color: var(--abj404-border); }
1709 .abj404-badge-later { border-color: var(--abj404-info); }
1710 .abj404-badge-trash { border-color: var(--abj404-danger); }
1711 .abj404-badge-404 { border-color: var(--abj404-danger); }
1712 .abj404-badge-redirect { border-color: var(--abj404-success); }
1713
1714 .abj404-type-badge {
1715 display: inline-block;
1716 padding: 2px 8px;
1717 border: 1px solid var(--abj404-border);
1718 border-radius: 2px;
1719 background: transparent;
1720 color: inherit;
1721 font-size: 11px;
1722 font-weight: 400;
1723 line-height: 1.5;
1724 }
1725
1726 .abj404-never-used {
1727 color: var(--abj404-danger-text);
1728 font-style: italic;
1729 font-size: 13px;
1730 }
1731
1732 /* ============================================
1733 Row Actions (WordPress-style under URL)
1734 ============================================ */
1735
1736 .abj404-row-actions {
1737 display: none;
1738 position: absolute;
1739 left: 0;
1740 top: calc(100% - 18px);
1741 margin-top: 0;
1742 padding: 4px 6px;
1743 border-radius: 4px;
1744 border: 1px solid var(--abj404-border);
1745 background: var(--abj404-card-bg);
1746 box-shadow: var(--abj404-shadow-md);
1747 font-size: 12px;
1748 color: var(--abj404-text-muted);
1749 white-space: nowrap;
1750 z-index: 2;
1751 pointer-events: auto;
1752 }
1753
1754 .abj404-table tbody tr:hover .abj404-row-actions,
1755 .abj404-url-cell:hover .abj404-row-actions,
1756 .abj404-url-cell:focus-within .abj404-row-actions,
1757 .abj404-row-actions:hover,
1758 .abj404-row-actions:focus-within {
1759 display: block;
1760 }
1761
1762 .abj404-table tbody tr:focus-within .abj404-row-actions {
1763 display: block;
1764 }
1765
1766 .abj404-table tbody tr {
1767 position: relative;
1768 z-index: 0;
1769 }
1770
1771 .abj404-table tbody tr:hover,
1772 .abj404-table tbody tr:focus-within {
1773 z-index: 1;
1774 }
1775
1776 /* Always show actions on touch devices */
1777 @media (hover: none) {
1778 .abj404-row-actions {
1779 display: block;
1780 position: static;
1781 margin-top: 4px;
1782 padding: 0;
1783 border: 0;
1784 background: transparent;
1785 box-shadow: none;
1786 }
1787 }
1788
1789 .abj404-row-actions a {
1790 color: var(--abj404-accent);
1791 text-decoration: none;
1792 }
1793
1794 .abj404-row-actions a:hover {
1795 color: var(--abj404-accent-hover);
1796 text-decoration: underline;
1797 }
1798
1799 .abj404-row-actions a.danger,
1800 .abj404-row-actions a.abj404-action-trash {
1801 color: var(--abj404-danger-text);
1802 }
1803
1804 .abj404-row-actions a.danger:hover,
1805 .abj404-row-actions a.abj404-action-trash:hover {
1806 color: var(--abj404-danger);
1807 }
1808
1809 /* Action links with icons */
1810 .abj404-action-link {
1811 display: inline-flex;
1812 align-items: center;
1813 gap: 3px;
1814 }
1815
1816 .abj404-action-link svg {
1817 width: 12px;
1818 height: 12px;
1819 flex-shrink: 0;
1820 }
1821
1822 /* Legacy button style - for backwards compatibility */
1823 .abj404-action-btn {
1824 color: var(--abj404-accent);
1825 text-decoration: none;
1826 display: inline-flex;
1827 align-items: center;
1828 }
1829
1830 .abj404-action-btn svg {
1831 width: 14px;
1832 height: 14px;
1833 }
1834
1835
1836 /* ============================================
1837 Modern Pagination
1838 ============================================ */
1839
1840 /* The pagination strip (count + First/Prev/Next/Last nav) is a flex item
1841 inside the .abj404-filter-bar tablenav row, which already supplies the row's
1842 horizontal padding and border. The strip itself must stay padding- and
1843 border-free, otherwise it renders as a second indented, bordered block that
1844 doubles the vertical gap above the table (top strip) and below the last row
1845 (bottom strip). The search filter and rows-per-page controls live in the
1846 static filter bar, not here. */
1847 .abj404-pagination {
1848 display: flex;
1849 align-items: center;
1850 flex-wrap: wrap;
1851 gap: 4px;
1852 padding: 0;
1853 }
1854
1855 /* Right-justify the count + nav at the end of the tablenav row, matching the
1856 native Posts list table where pagination sits hard-right. The descendant
1857 selector is required to outrank WordPress core's
1858 `.tablenav .tablenav-pages { margin-left: 0 }` (load-styles.php), which the
1859 strip also matches via its tablenav-pages class. */
1860 .abj404-filter-bar .abj404-pagination {
1861 margin-left: auto;
1862 }
1863
1864 /* WordPress core gives .tablenav a fixed 30px height and .tablenav-pages a
1865 fixed 28px height. Our filter/pagination bars reuse those classes but hold
1866 taller, wrapping content (the search box; the refresh-status badge; the
1867 pagination controls, which wrap to a second line while a background refresh
1868 is running). A fixed-height box cannot grow for that second line, so it
1869 overflowed downward and overlapped the footer/credits. Let the bars size to
1870 their content instead. */
1871 .abj404-filter-bar.tablenav,
1872 .abj404-pagination.tablenav-pages {
1873 height: auto;
1874 }
1875
1876 .abj404-pagination-info {
1877 color: var(--abj404-text-muted);
1878 font-size: 13px;
1879 }
1880
1881 /*
1882 * Inline status badge shown by the page-redirects AJAX pipeline. The same
1883 * `.abj404-refresh-status` span sits in both the filter row and the bottom
1884 * pagination strip and is populated by view_updater_stats.js's
1885 * setRefreshStatus()/clearRefreshStatus() via jQuery.text(). When empty it
1886 * stays out of the layout so the existing toast (which collapses to a 28px
1887 * spinner after 2s) remains the dominant signal once the table is already
1888 * visible.
1889 */
1890 .abj404-refresh-status {
1891 display: inline-flex;
1892 align-items: center;
1893 gap: 6px;
1894 padding: 4px 10px;
1895 background: var(--abj404-info-bg);
1896 color: var(--abj404-info-text);
1897 border: 1px solid var(--abj404-info-border);
1898 border-radius: 12px;
1899 font-size: 13px;
1900 font-weight: 500;
1901 line-height: 1.4;
1902 vertical-align: middle;
1903 max-width: 100%;
1904 overflow: hidden;
1905 text-overflow: ellipsis;
1906 white-space: nowrap;
1907 }
1908
1909 .abj404-refresh-status:empty {
1910 display: none;
1911 }
1912
1913 .abj404-refresh-status::before {
1914 content: "";
1915 width: 12px;
1916 height: 12px;
1917 flex: 0 0 auto;
1918 border: 2px solid var(--abj404-info-border);
1919 border-top-color: var(--abj404-info-text);
1920 border-radius: 50%;
1921 animation: abj404-spin 0.8s linear infinite;
1922 }
1923
1924 .abj404-pagination-controls {
1925 display: flex;
1926 gap: 2px;
1927 align-items: center;
1928 }
1929
1930 /* Compact, square-ish page buttons matching WordPress core's .tablenav-pages
1931 navigation so pagination does not eat horizontal room on the tablenav row.
1932 WP core uses ~24px square chevrons. */
1933 .abj404-page-btn {
1934 padding: 0 2px;
1935 min-width: 24px;
1936 height: 24px;
1937 line-height: 22px;
1938 border: 1px solid var(--abj404-border);
1939 background: var(--abj404-surface);
1940 border-radius: 4px;
1941 cursor: pointer;
1942 font-size: 13px;
1943 color: var(--abj404-accent);
1944 transition: all 0.15s;
1945 text-align: center;
1946 text-decoration: none;
1947 display: inline-block;
1948 }
1949
1950 .abj404-page-btn:hover {
1951 background: var(--abj404-bg);
1952 border-color: var(--abj404-accent);
1953 text-decoration: none;
1954 }
1955
1956 .abj404-page-btn.active {
1957 background: var(--abj404-accent);
1958 color: var(--abj404-on-accent);
1959 border-color: var(--abj404-accent);
1960 }
1961
1962 .abj404-page-btn:disabled,
1963 .abj404-page-btn.disabled {
1964 opacity: 0.5;
1965 cursor: not-allowed;
1966 pointer-events: none;
1967 }
1968
1969 .abj404-page-ellipsis {
1970 padding: 8px 4px;
1971 color: var(--abj404-text-muted);
1972 }
1973
1974 .abj404-pagination-text {
1975 padding: 0 4px;
1976 color: var(--abj404-text-muted);
1977 font-size: 13px;
1978 white-space: nowrap;
1979 }
1980
1981 /* ============================================
1982 Table Loading Overlay
1983 ============================================ */
1984
1985 .abj404-table-wrapper {
1986 position: relative;
1987 }
1988
1989 .abj404-loading-overlay {
1990 position: absolute;
1991 top: 0;
1992 left: 0;
1993 right: 0;
1994 bottom: 0;
1995 background: var(--abj404-loading-overlay-bg);
1996 z-index: 10;
1997 border-radius: 8px;
1998 animation: abj404-fade-in 0.2s ease-out;
1999 overflow: hidden;
2000 pointer-events: none;
2001 }
2002
2003 @keyframes abj404-fade-in {
2004 from { opacity: 0; }
2005 to { opacity: 1; }
2006 }
2007
2008 .abj404-spinner-container {
2009 position: sticky;
2010 top: 50vh;
2011 display: flex;
2012 justify-content: center;
2013 transform: translateY(-50%);
2014 pointer-events: none;
2015 }
2016
2017 .abj404-spinner {
2018 width: 40px;
2019 height: 40px;
2020 border: 3px solid var(--abj404-border);
2021 border-top-color: var(--abj404-accent);
2022 border-radius: 50%;
2023 animation: abj404-spin 0.8s linear infinite;
2024 }
2025
2026 @keyframes abj404-spin {
2027 to { transform: rotate(360deg); }
2028 }
2029
2030 /* ============================================
2031 Regex Explanation Toggle
2032 ============================================ */
2033
2034 .abj404-regex-toggle {
2035 font-size: 12px;
2036 color: var(--abj404-accent);
2037 text-decoration: none;
2038 cursor: pointer;
2039 }
2040
2041 .abj404-regex-toggle:hover {
2042 text-decoration: underline;
2043 }
2044
2045 .abj404-regex-info {
2046 margin-top: 12px;
2047 padding: 12px 16px;
2048 background: var(--abj404-bg);
2049 border-left: 3px solid var(--abj404-accent);
2050 border-radius: 0 4px 4px 0;
2051 font-size: 13px;
2052 line-height: 1.5;
2053 }
2054
2055 .abj404-regex-info code {
2056 background: var(--abj404-surface);
2057 padding: 2px 6px;
2058 border-radius: 3px;
2059 font-family: monospace;
2060 }
2061
2062 .abj404-regex-info p {
2063 margin: 0 0 8px 0;
2064 }
2065
2066 .abj404-regex-info p:last-child {
2067 margin-bottom: 0;
2068 }
2069
2070 /* ============================================
2071 Modal Styles
2072 ============================================ */
2073
2074 .abj404-modal {
2075 display: none;
2076 position: fixed;
2077 top: 0;
2078 left: 0;
2079 width: 100%;
2080 height: 100%;
2081 background: var(--abj404-overlay-bg);
2082 z-index: 100000;
2083 align-items: center;
2084 justify-content: center;
2085 }
2086
2087 .abj404-modal.active {
2088 display: flex;
2089 }
2090
2091 .abj404-modal-content {
2092 background: var(--abj404-surface);
2093 border-radius: 8px;
2094 width: 90%;
2095 max-width: 600px;
2096 max-height: 90vh;
2097 overflow-y: auto;
2098 box-shadow: var(--abj404-shadow-lg);
2099 animation: abj404-modal-slideUp 0.3s ease;
2100 }
2101
2102 @keyframes abj404-modal-slideUp {
2103 from {
2104 transform: translateY(50px);
2105 opacity: 0;
2106 }
2107 to {
2108 transform: translateY(0);
2109 opacity: 1;
2110 }
2111 }
2112
2113 .abj404-modal-header {
2114 padding: 20px 24px;
2115 border-bottom: 1px solid var(--abj404-border);
2116 display: flex;
2117 justify-content: space-between;
2118 align-items: center;
2119 }
2120
2121 .abj404-modal-header h2 {
2122 font-size: 20px;
2123 font-weight: 600;
2124 margin: 0;
2125 color: var(--abj404-text);
2126 }
2127
2128 .abj404-modal-close {
2129 background: none;
2130 border: none;
2131 font-size: 24px;
2132 color: var(--abj404-text-muted);
2133 cursor: pointer;
2134 padding: 0;
2135 width: 32px;
2136 height: 32px;
2137 display: flex;
2138 align-items: center;
2139 justify-content: center;
2140 border-radius: 4px;
2141 transition: background 0.15s;
2142 }
2143
2144 .abj404-modal-close:hover {
2145 background: var(--abj404-bg);
2146 }
2147
2148 .abj404-modal-body {
2149 padding: 24px;
2150 }
2151
2152 .abj404-modal-footer {
2153 padding: 16px 24px;
2154 border-top: 1px solid var(--abj404-border);
2155 display: flex;
2156 justify-content: flex-end;
2157 gap: 12px;
2158 }
2159
2160 /* Modal redirect-to field structure */
2161 .abj404-modal .abj404-redirect-to-field {
2162 margin-bottom: 0;
2163 }
2164
2165 .abj404-modal .abj404-input-row {
2166 display: block;
2167 }
2168
2169 /* Modal autocomplete field styling */
2170 .abj404-modal #redirect_to_user_field {
2171 width: 100% !important;
2172 padding: 8px 12px;
2173 border: 1px solid var(--abj404-border);
2174 border-radius: 4px;
2175 font-size: 14px;
2176 background: var(--abj404-surface);
2177 box-sizing: border-box;
2178 }
2179
2180 .abj404-modal #redirect_to_user_field:focus {
2181 border-color: var(--abj404-primary);
2182 outline: none;
2183 box-shadow: 0 0 0 1px var(--abj404-primary);
2184 }
2185
2186 /* Loading spinner for modal autocomplete */
2187 .abj404-modal #redirect_to_user_field.ui-autocomplete-loading {
2188 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='6' stroke='%23c3c4c7' stroke-width='2' fill='none'/%3E%3Cpath d='M8 2 A6 6 0 0 1 14 8' stroke='%232271b1' stroke-width='2' fill='none' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 8 8' to='360 8 8' dur='0.8s' repeatCount='indefinite'/%3E%3C/path%3E%3C/svg%3E");
2189 background-color: var(--abj404-surface);
2190 background-repeat: no-repeat;
2191 background-position: right 10px center;
2192 background-size: 16px 16px;
2193 padding-right: 36px;
2194 }
2195
2196 /* Hide legacy tooltip in modal - label already present */
2197 .abj404-modal .lefty-tooltip {
2198 display: none;
2199 }
2200
2201 /* Style explanation text in modal */
2202 .abj404-modal #redirect_to_user_field_explanation {
2203 display: block;
2204 margin-top: 8px;
2205 font-size: 13px;
2206 color: var(--abj404-text-muted);
2207 font-style: italic;
2208 }
2209
2210 .abj404-modal #redirect_to_user_field_warning {
2211 display: block;
2212 margin-top: 4px;
2213 font-size: 13px;
2214 font-style: italic;
2215 font-weight: bold;
2216 color: var(--abj404-danger-text);
2217 }
2218
2219 /* Hide template label since we have our own */
2220 .abj404-modal .add_a_redirect_label {
2221 display: none;
2222 }
2223
2224 /* Modal: button-grid and form inputs fill modal width */
2225 .abj404-modal .abj404-form-input,
2226 .abj404-modal .abj404-form-select {
2227 max-width: 100%;
2228 }
2229
2230 /* Modal: advanced options section needs a bit more room */
2231 .abj404-modal .abj404-advanced-options {
2232 margin: 0 0 16px 0;
2233 }
2234
2235 /* Autocomplete input wrapper */
2236 .abj404-input-with-spinner {
2237 display: inline;
2238 }
2239
2240 /* Hide the separate spinner element - we use background-image instead */
2241 .abj404-loading-spinner {
2242 display: none !important;
2243 }
2244
2245 /* Show loading spinner inside input as background-image when loading */
2246 #redirect_to_user_field.ui-autocomplete-loading {
2247 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='6' stroke='%23c3c4c7' stroke-width='2' fill='none'/%3E%3Cpath d='M8 2 A6 6 0 0 1 14 8' stroke='%232271b1' stroke-width='2' fill='none' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 8 8' to='360 8 8' dur='0.8s' repeatCount='indefinite'/%3E%3C/path%3E%3C/svg%3E");
2248 background-repeat: no-repeat;
2249 background-position: right 8px center;
2250 background-size: 16px 16px;
2251 padding-right: 32px !important;
2252 }
2253
2254 /* ============================================
2255 Edit Redirect Page
2256 ============================================ */
2257
2258 .abj404-edit-page {
2259 margin: 20px 20px 20px 0;
2260 }
2261
2262 .abj404-edit-container {
2263 background: var(--abj404-surface);
2264 border: 1px solid var(--abj404-border);
2265 border-radius: 8px;
2266 padding: 24px 32px;
2267 max-width: 520px;
2268 }
2269
2270 .abj404-edit-container h2 {
2271 font-size: 20px;
2272 font-weight: 600;
2273 color: var(--abj404-text);
2274 margin: 0 0 24px 0;
2275 padding-bottom: 16px;
2276 border-bottom: 1px solid var(--abj404-border);
2277 }
2278
2279 /* Edit page header row: title + back link */
2280 .abj404-edit-page-header {
2281 display: flex;
2282 align-items: center;
2283 justify-content: space-between;
2284 margin-bottom: 24px;
2285 padding-bottom: 16px;
2286 border-bottom: 1px solid var(--abj404-border);
2287 }
2288
2289 .abj404-edit-page-header h2 {
2290 font-size: 20px;
2291 font-weight: 600;
2292 color: var(--abj404-text);
2293 margin: 0;
2294 border: none;
2295 padding: 0;
2296 }
2297
2298 .abj404-back-link {
2299 font-size: 13px;
2300 color: var(--abj404-accent);
2301 text-decoration: none;
2302 display: flex;
2303 align-items: center;
2304 gap: 4px;
2305 white-space: nowrap;
2306 }
2307
2308 .abj404-back-link:hover {
2309 text-decoration: underline;
2310 color: var(--abj404-accent-hover);
2311 }
2312
2313 /* Redirect type button grid */
2314 .abj404-redirect-type-grid {
2315 display: grid;
2316 grid-template-columns: repeat(3, 1fr);
2317 gap: 8px;
2318 margin-bottom: 8px;
2319 }
2320
2321 .abj404-redirect-type-btn {
2322 display: flex;
2323 flex-direction: column;
2324 align-items: center;
2325 justify-content: center;
2326 padding: 10px 8px;
2327 border: 1px solid var(--abj404-border);
2328 border-radius: 4px;
2329 background: var(--abj404-surface);
2330 cursor: pointer;
2331 transition: border-color 0.15s, background 0.15s;
2332 text-align: center;
2333 color: var(--abj404-text);
2334 line-height: 1.3;
2335 font-family: inherit;
2336 }
2337
2338 .abj404-redirect-type-btn strong {
2339 font-size: 15px;
2340 font-weight: 700;
2341 display: block;
2342 }
2343
2344 .abj404-redirect-type-btn span {
2345 font-size: 11px;
2346 color: var(--abj404-text-muted);
2347 display: block;
2348 }
2349
2350 .abj404-redirect-type-btn:hover {
2351 border-color: var(--abj404-accent);
2352 background: var(--abj404-info-bg);
2353 }
2354
2355 .abj404-redirect-type-btn--active {
2356 border-color: var(--abj404-accent);
2357 background: var(--abj404-accent);
2358 color: var(--abj404-on-accent);
2359 }
2360
2361 .abj404-redirect-type-btn--active strong {
2362 color: var(--abj404-on-accent);
2363 }
2364
2365 .abj404-redirect-type-btn--active span {
2366 color: var(--abj404-on-accent);
2367 }
2368
2369 .abj404-redirect-type-btn--active:hover {
2370 background: var(--abj404-accent-hover);
2371 border-color: var(--abj404-accent-hover);
2372 }
2373
2374 /* Meta Refresh button spans full width */
2375 .abj404-redirect-type-btn--full {
2376 grid-column: 1 / -1;
2377 }
2378
2379 /* URL list for bulk editing */
2380 .abj404-url-list {
2381 background: var(--abj404-bg);
2382 border: 1px solid var(--abj404-border);
2383 border-radius: 4px;
2384 padding: 12px 16px;
2385 max-height: 200px;
2386 overflow-y: auto;
2387 }
2388
2389 .abj404-url-list ul {
2390 margin: 0;
2391 padding: 0;
2392 list-style: none;
2393 }
2394
2395 .abj404-url-list li {
2396 padding: 4px 0;
2397 font-size: 13px;
2398 color: var(--abj404-text);
2399 border-bottom: 1px solid var(--abj404-border);
2400 }
2401
2402 .abj404-url-list li:last-child {
2403 border-bottom: none;
2404 }
2405
2406 .abj404-url-list code {
2407 background: transparent;
2408 padding: 0;
2409 font-size: 13px;
2410 }
2411
2412 /* Button group for form actions */
2413 .abj404-button-group {
2414 display: flex;
2415 gap: 12px;
2416 margin-top: 24px;
2417 padding-top: 20px;
2418 border-top: 1px solid var(--abj404-border);
2419 }
2420
2421 /* Edit page: inputs fill the narrower card */
2422 .abj404-edit-container .abj404-form-input,
2423 .abj404-edit-container .abj404-form-select {
2424 max-width: 100%;
2425 }
2426
2427 /* Redirect-to field wrapper structure */
2428 .abj404-edit-container .abj404-redirect-to-field {
2429 margin-bottom: 20px;
2430 }
2431
2432 .abj404-edit-container .abj404-input-row {
2433 display: flex;
2434 align-items: center;
2435 gap: 8px;
2436 }
2437
2438 /* Style the template label to match form labels */
2439 .abj404-edit-container .add_a_redirect_label {
2440 display: block;
2441 font-weight: 600;
2442 color: var(--abj404-text);
2443 margin-bottom: 8px;
2444 font-size: 14px;
2445 }
2446
2447 /* Style the autocomplete field on edit page */
2448 .abj404-edit-container #redirect_to_user_field {
2449 width: 100%;
2450 max-width: 100%;
2451 padding: 10px 12px;
2452 border: 1px solid var(--abj404-border);
2453 border-radius: 4px;
2454 font-size: 14px;
2455 background: var(--abj404-surface);
2456 box-sizing: border-box;
2457 }
2458
2459 .abj404-edit-container #redirect_to_user_field:focus {
2460 border-color: var(--abj404-accent);
2461 outline: none;
2462 box-shadow: 0 0 0 1px var(--abj404-accent);
2463 }
2464
2465 /* Loading spinner for edit page autocomplete */
2466 .abj404-edit-container #redirect_to_user_field.ui-autocomplete-loading {
2467 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='6' stroke='%23c3c4c7' stroke-width='2' fill='none'/%3E%3Cpath d='M8 2 A6 6 0 0 1 14 8' stroke='%232271b1' stroke-width='2' fill='none' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 8 8' to='360 8 8' dur='0.8s' repeatCount='indefinite'/%3E%3C/path%3E%3C/svg%3E");
2468 background-color: var(--abj404-surface);
2469 background-repeat: no-repeat;
2470 background-position: right 10px center;
2471 background-size: 16px 16px;
2472 padding-right: 36px;
2473 }
2474
2475 /* Style the explanation text */
2476 .abj404-edit-container #redirect_to_user_field_explanation {
2477 display: block;
2478 margin-top: 8px;
2479 font-size: 13px;
2480 color: var(--abj404-text-muted);
2481 font-style: italic;
2482 }
2483
2484 /* Style the warning text */
2485 .abj404-edit-container #redirect_to_user_field_warning {
2486 display: block;
2487 margin-top: 4px;
2488 font-size: 13px;
2489 font-style: italic;
2490 font-weight: bold;
2491 color: var(--abj404-danger-text);
2492 }
2493
2494 /* Style the tooltip inline with the input */
2495 .abj404-edit-container .lefty-tooltip {
2496 display: inline-flex;
2497 align-items: center;
2498 justify-content: center;
2499 font-size: 13px;
2500 color: var(--abj404-text-muted);
2501 cursor: help;
2502 }
2503
2504 /* ============================================
2505 Empty State
2506 ============================================ */
2507
2508 .abj404-empty-state {
2509 text-align: center;
2510 padding: 60px 20px;
2511 color: var(--abj404-text-muted);
2512 }
2513
2514 .abj404-empty-state-icon {
2515 font-size: 48px;
2516 margin-bottom: 16px;
2517 opacity: 0.5;
2518 }
2519
2520 .abj404-empty-state h3 {
2521 font-size: 18px;
2522 font-weight: 600;
2523 color: var(--abj404-text);
2524 margin: 0 0 8px 0;
2525 }
2526
2527 .abj404-empty-state p {
2528 margin: 0;
2529 font-size: 14px;
2530 }
2531
2532 /* ============================================
2533 Destination with Warning
2534 ============================================ */
2535
2536 .abj404-dest-warning {
2537 color: var(--abj404-danger-text);
2538 font-weight: 600;
2539 }
2540
2541 .abj404-dest-tooltip {
2542 position: relative;
2543 display: inline-block;
2544 }
2545
2546 .abj404-dest-tooltip .abj404-tooltip-text {
2547 visibility: hidden;
2548 background-color: var(--abj404-tooltip-bg);
2549 color: var(--abj404-on-accent);
2550 text-align: center;
2551 border-radius: 4px;
2552 padding: 8px 12px;
2553 position: absolute;
2554 z-index: 1000;
2555 bottom: 125%;
2556 left: 50%;
2557 transform: translateX(-50%);
2558 white-space: nowrap;
2559 font-size: 12px;
2560 font-weight: normal;
2561 opacity: 0;
2562 transition: opacity 0.2s;
2563 }
2564
2565 .abj404-dest-tooltip .abj404-tooltip-text::after {
2566 content: "";
2567 position: absolute;
2568 top: 100%;
2569 left: 50%;
2570 margin-left: -5px;
2571 border-width: 5px;
2572 border-style: solid;
2573 border-color: var(--abj404-tooltip-bg) transparent transparent transparent;
2574 }
2575
2576 .abj404-dest-tooltip:hover .abj404-tooltip-text {
2577 visibility: visible;
2578 opacity: 1;
2579 }
2580
2581 /* Keep top-row destination tooltips readable: show below the row instead of under sticky headers. */
2582 .abj404-table tbody tr:nth-child(-n+2) .abj404-dest-tooltip .abj404-tooltip-text {
2583 top: 125%;
2584 bottom: auto;
2585 }
2586
2587 .abj404-table tbody tr:nth-child(-n+2) .abj404-dest-tooltip .abj404-tooltip-text::after {
2588 top: auto;
2589 bottom: 100%;
2590 border-color: transparent transparent var(--abj404-tooltip-bg) transparent;
2591 }
2592
2593 /* ============================================
2594 URL with Regex Warning
2595 ============================================ */
2596
2597 .url-looks-like-regex {
2598 background-color: var(--abj404-warning-bg);
2599 }
2600
2601 .abj404-url-warning {
2602 color: var(--abj404-warning-text);
2603 font-weight: 600;
2604 }
2605
2606 .abj404-url-tooltip {
2607 position: relative;
2608 display: inline-block;
2609 }
2610
2611 .abj404-url-tooltip .abj404-tooltip-text {
2612 visibility: hidden;
2613 background-color: var(--abj404-tooltip-bg);
2614 color: var(--abj404-on-accent);
2615 text-align: left;
2616 border-radius: 4px;
2617 padding: 10px 14px;
2618 position: absolute;
2619 z-index: 1000;
2620 bottom: 100%;
2621 left: 0;
2622 margin-bottom: 8px;
2623 font-size: 13px;
2624 font-weight: normal;
2625 opacity: 0;
2626 transition: opacity 0.2s;
2627 width: 320px;
2628 line-height: 1.5;
2629 box-shadow: var(--abj404-shadow-md);
2630 }
2631
2632 .abj404-url-tooltip .abj404-tooltip-text::after {
2633 content: "";
2634 position: absolute;
2635 top: 100%;
2636 left: 20px;
2637 border-width: 6px;
2638 border-style: solid;
2639 border-color: var(--abj404-tooltip-bg) transparent transparent transparent;
2640 }
2641
2642 .abj404-url-tooltip:hover .abj404-tooltip-text {
2643 visibility: visible;
2644 opacity: 1;
2645 }
2646
2647 /* ============================================
2648 Mobile Responsiveness for Tables
2649 ============================================ */
2650
2651 @media screen and (max-width: 782px) {
2652 .abj404-table-header,
2653 .abj404-filter-bar,
2654 .abj404-table-container,
2655 .abj404-pagination {
2656 padding-left: 16px;
2657 padding-right: 16px;
2658 }
2659
2660 .abj404-table-header {
2661 flex-direction: column;
2662 align-items: flex-start;
2663 }
2664
2665 .abj404-filter-bar {
2666 flex-direction: column;
2667 align-items: stretch;
2668 }
2669
2670 .abj404-search-box {
2671 min-width: auto;
2672 max-width: none;
2673 }
2674
2675 .abj404-list-top {
2676 flex-direction: column;
2677 align-items: stretch;
2678 padding-left: 16px;
2679 padding-right: 16px;
2680 }
2681
2682 .abj404-list-top .abj404-search-box {
2683 margin-left: 0;
2684 }
2685
2686 .abj404-list-top .abj404-search-box input {
2687 width: 100%;
2688 }
2689
2690 .abj404-rows-per-page {
2691 margin-left: 0;
2692 justify-content: flex-start;
2693 }
2694
2695 .abj404-pagination {
2696 flex-direction: column;
2697 align-items: center;
2698 text-align: center;
2699 }
2700
2701 .abj404-filter-bar .abj404-pagination {
2702 margin-left: 0;
2703 }
2704
2705 .abj404-table th,
2706 .abj404-table td {
2707 padding: 12px 8px;
2708 }
2709
2710 /* Hide less important columns on mobile */
2711 .abj404-table .hide-on-mobile {
2712 display: none;
2713 }
2714
2715 .abj404-row-actions {
2716 opacity: 1;
2717 flex-wrap: wrap;
2718 }
2719 }
2720
2721 /* Tablets - hide Created column (Last Used is more useful) */
2722 @media screen and (max-width: 960px) {
2723 .abj404-table .hide-on-tablet {
2724 display: none;
2725 }
2726
2727 /* Smaller badges on tablet */
2728 .abj404-badge,
2729 .abj404-type-badge {
2730 padding: 2px 6px;
2731 font-size: 10px;
2732 }
2733 }
2734
2735 /* Small tablets / large phones */
2736 @media screen and (max-width: 600px) {
2737 .abj404-table th,
2738 .abj404-table td {
2739 padding: 10px 6px;
2740 font-size: 12px;
2741 }
2742
2743 .abj404-url-cell {
2744 font-size: 11px;
2745 }
2746
2747 .abj404-date-cell {
2748 font-size: 11px;
2749 }
2750
2751 /* Stack bulk actions */
2752 .abj404-bulk-actions {
2753 flex-direction: column;
2754 gap: 8px;
2755 }
2756
2757 .abj404-bulk-actions select,
2758 .abj404-bulk-actions .button {
2759 width: 100%;
2760 }
2761 }
2762
2763 /* ============================================
2764 Dark Theme Support for Table Pages
2765 ============================================ */
2766
2767 html[data-theme="neon"] .abj404-table-page,
2768 html[data-theme="obsidian"] .abj404-table-page {
2769 background: var(--abj404-surface);
2770 }
2771
2772 html[data-theme="neon"] .abj404-table tbody tr:nth-child(even),
2773 html[data-theme="obsidian"] .abj404-table tbody tr:nth-child(even) {
2774 background: var(--abj404-row-stripe-soft);
2775 }
2776
2777 html[data-theme="neon"] .abj404-table tbody tr:hover,
2778 html[data-theme="obsidian"] .abj404-table tbody tr:hover {
2779 background: var(--abj404-row-stripe-med);
2780 }
2781
2782 html[data-theme="neon"] .abj404-filter-bar,
2783 html[data-theme="obsidian"] .abj404-filter-bar {
2784 background: var(--abj404-bg);
2785 }
2786
2787 /* ============================================
2788 Logs Page Specific Styles
2789 ============================================ */
2790
2791 .abj404-logs-table {
2792 table-layout: fixed;
2793 }
2794
2795 /* Fixed column widths for the logs table (6 columns: toggle, URL, IP, Referrer, Action, Date) */
2796 .abj404-logs-table thead th:nth-child(1) { width: 32px; } /* Trace toggle */
2797 .abj404-logs-table thead th:nth-child(2) { width: 28%; } /* URL */
2798 .abj404-logs-table thead th:nth-child(3) { width: 10%; } /* IP Address */
2799 .abj404-logs-table thead th:nth-child(4) { width: 22%; } /* Referrer */
2800 .abj404-logs-table thead th:nth-child(5) { width: 22%; } /* Action */
2801 .abj404-logs-table thead th:nth-child(6) { width: auto; } /* Date (takes remaining) */
2802
2803 /* Override the generic first-child 40px checkbox width for the narrow trace toggle */
2804 .abj404-logs-table th:first-child,
2805 .abj404-logs-table td:first-child {
2806 width: 32px;
2807 min-width: 32px;
2808 max-width: 32px;
2809 }
2810
2811 /* Prevent URL/Referrer/Action text from overflowing into adjacent columns */
2812 .abj404-logs-table td {
2813 overflow: hidden;
2814 text-overflow: ellipsis;
2815 }
2816
2817 .abj404-logs-table .abj404-url-cell {
2818 overflow: hidden;
2819 text-overflow: ellipsis;
2820 white-space: nowrap;
2821 }
2822
2823 .abj404-logs-table .abj404-url-cell:hover {
2824 white-space: normal;
2825 word-break: break-all;
2826 }
2827
2828 /* Logs table URL cells use same word-break as regular tables */
2829
2830 .abj404-logs-search-form {
2831 display: flex;
2832 align-items: center;
2833 gap: 8px;
2834 margin: 0;
2835 flex: 1;
2836 min-width: 0;
2837 }
2838
2839 .abj404-logs-search-form input[type="text"],
2840 .abj404-logs-search-form input.ui-autocomplete-input {
2841 flex: 1;
2842 min-width: 120px;
2843 line-height: normal;
2844 }
2845
2846 .abj404-logs-search-form label {
2847 font-weight: 500;
2848 color: var(--abj404-text);
2849 white-space: nowrap;
2850 }
2851
2852 .abj404-ip-cell {
2853 font-family: monospace;
2854 font-size: 12px;
2855 color: var(--abj404-text-muted);
2856 }
2857
2858 .abj404-url-detail {
2859 color: var(--abj404-text-muted);
2860 font-size: 12px;
2861 }
2862
2863 .abj404-action-url {
2864 max-width: 200px;
2865 display: inline-block;
2866 overflow: hidden;
2867 text-overflow: ellipsis;
2868 white-space: nowrap;
2869 vertical-align: bottom;
2870 }
2871
2872 .abj404-text-muted {
2873 color: var(--abj404-text-muted);
2874 }
2875
2876 .abj404-engine-label {
2877 font-size: 11px;
2878 color: var(--abj404-text-muted);
2879 font-style: italic;
2880 }
2881
2882 /* Pipeline trace detail row */
2883 .abj404-trace-th {
2884 width: 28px;
2885 padding: 4px 2px;
2886 }
2887
2888 .abj404-trace-toggle-cell {
2889 width: 28px;
2890 padding: 4px 2px;
2891 text-align: center;
2892 }
2893
2894 .abj404-trace-toggle {
2895 background: none;
2896 border: 1px solid var(--abj404-border);
2897 border-radius: 3px;
2898 cursor: pointer;
2899 font-size: 10px;
2900 padding: 1px 4px;
2901 color: var(--abj404-text-muted);
2902 line-height: 1;
2903 }
2904
2905 .abj404-trace-toggle:disabled {
2906 opacity: 0.3;
2907 cursor: default;
2908 }
2909
2910 .abj404-trace-toggle:not(:disabled):hover {
2911 background: var(--abj404-bg-hover);
2912 }
2913
2914 .abj404-trace-detail td.abj404-trace-detail-cell {
2915 background: var(--abj404-bg-subtle);
2916 padding: 10px 16px;
2917 border-top: none;
2918 }
2919
2920 .abj404-trace-steps {
2921 margin: 0;
2922 padding-left: 0;
2923 list-style: none;
2924 font-size: 13px;
2925 color: var(--abj404-text);
2926 line-height: 1.5;
2927 }
2928
2929 .abj404-trace-steps li {
2930 display: flex;
2931 align-items: baseline;
2932 gap: 8px;
2933 margin-bottom: 4px;
2934 padding: 3px 0;
2935 border-bottom: 1px solid var(--abj404-bg-hover);
2936 }
2937
2938 .abj404-trace-steps li:last-child {
2939 border-bottom: none;
2940 }
2941
2942 .abj404-trace-step-name {
2943 flex: 0 0 auto;
2944 min-width: 180px;
2945 font-weight: 600;
2946 color: var(--abj404-text);
2947 }
2948
2949 .abj404-trace-outcome {
2950 flex: 0 0 auto;
2951 display: inline-block;
2952 padding: 1px 8px;
2953 border-radius: 3px;
2954 font-size: 12px;
2955 font-weight: 500;
2956 }
2957
2958 .abj404-trace-outcome-pass {
2959 background: var(--abj404-success-bg);
2960 color: var(--abj404-success-text);
2961 }
2962
2963 .abj404-trace-outcome-fail {
2964 background: var(--abj404-danger-bg);
2965 color: var(--abj404-danger-text);
2966 }
2967
2968 .abj404-trace-outcome-neutral {
2969 background: var(--abj404-bg-hover);
2970 color: var(--abj404-text-muted);
2971 }
2972
2973 .abj404-trace-outcome-result {
2974 background: var(--abj404-info-bg);
2975 color: var(--abj404-info-text);
2976 }
2977
2978 .abj404-trace-detail-text {
2979 flex: 1 1 auto;
2980 color: var(--abj404-text-muted);
2981 font-size: 12px;
2982 }
2983
2984 .abj404-suggestion-type {
2985 display: inline-block;
2986 font-size: 12px;
2987 color: var(--abj404-text-muted);
2988 margin-left: 6px;
2989 }
2990
2991 .abj404-score-badge {
2992 display: inline-block;
2993 padding: 2px 8px;
2994 border: 1px solid var(--abj404-border);
2995 border-radius: 2px;
2996 background: transparent;
2997 color: inherit;
2998 font-size: 11px;
2999 font-weight: 400;
3000 line-height: 1.5;
3001 }
3002
3003 .abj404-score-high { border-color: var(--abj404-success); }
3004 .abj404-score-medium { border-color: var(--abj404-warning); }
3005 .abj404-score-low { border-color: var(--abj404-danger); }
3006
3007 .abj404-score-manual {
3008 color: var(--abj404-text-muted);
3009 font-size: 14px;
3010 }
3011
3012 .abj404-confidence-cell {
3013 text-align: center;
3014 white-space: nowrap;
3015 }
3016
3017 .abj404-username-label {
3018 font-size: 11px;
3019 color: var(--abj404-accent);
3020 }
3021
3022 /* Empty trash button - use higher specificity to override WordPress .button */
3023 .button.abj404-empty-trash-btn,
3024 a.abj404-empty-trash-btn {
3025 margin-left: auto;
3026 background: var(--abj404-danger-bg) !important;
3027 color: var(--abj404-danger-text) !important;
3028 border-color: var(--abj404-danger-text) !important;
3029 }
3030
3031 .button.abj404-empty-trash-btn:hover,
3032 a.abj404-empty-trash-btn:hover {
3033 background: var(--abj404-danger-text) !important;
3034 color: var(--abj404-on-accent) !important;
3035 border-color: var(--abj404-danger-text) !important;
3036 }
3037
3038 /* ============================================
3039 Options Page Content Styling
3040 ============================================ */
3041
3042 /* Form field rows - each paragraph is a form field group */
3043 .abj404-accordion-content p {
3044 display: flex;
3045 flex-wrap: wrap;
3046 align-items: flex-start;
3047 gap: 8px;
3048 padding: 16px 20px;
3049 margin: 0;
3050 border-bottom: 1px solid var(--abj404-border-light);
3051 background: var(--abj404-surface);
3052 }
3053
3054 .abj404-accordion-content p:last-child {
3055 border-bottom: none;
3056 }
3057
3058 /* Alternate row coloring for better readability */
3059 .abj404-accordion-content p:nth-child(even) {
3060 background: var(--abj404-surface-alt);
3061 }
3062
3063 /* Labels in form fields */
3064 .abj404-accordion-content p > label:first-child,
3065 .abj404-accordion-content p > label[for] {
3066 flex: 0 0 280px;
3067 font-weight: 600;
3068 color: var(--abj404-text);
3069 padding-top: 4px;
3070 }
3071
3072 /* Inputs and selects */
3073 .abj404-accordion-content input[type="text"],
3074 .abj404-accordion-content input[type="number"],
3075 .abj404-accordion-content select {
3076 padding: 6px 10px;
3077 border: 1px solid var(--abj404-border);
3078 border-radius: 4px;
3079 background: var(--abj404-input-bg);
3080 color: var(--abj404-text);
3081 font-size: 14px;
3082 transition: border-color 0.2s ease, box-shadow 0.2s ease;
3083 }
3084
3085 .abj404-accordion-content input[type="text"]:focus,
3086 .abj404-accordion-content input[type="number"]:focus,
3087 .abj404-accordion-content select:focus {
3088 border-color: var(--abj404-primary);
3089 box-shadow: 0 0 0 1px var(--abj404-primary);
3090 outline: none;
3091 }
3092
3093 /* Checkboxes - align better */
3094 .abj404-accordion-content input[type="checkbox"] {
3095 margin-top: 5px;
3096 width: 18px;
3097 height: 18px;
3098 cursor: pointer;
3099 }
3100
3101 /* Help text styling - target BR followed by text */
3102 .abj404-accordion-content p br {
3103 display: none;
3104 }
3105
3106 /* Style inline help text that follows inputs */
3107 .abj404-accordion-content p > br + text,
3108 .abj404-accordion-content p::after {
3109 flex-basis: 100%;
3110 font-size: 13px;
3111 color: var(--abj404-text-muted);
3112 line-height: 1.5;
3113 padding-left: 288px;
3114 margin-top: 4px;
3115 }
3116
3117 /* Tables in options - modernize the old border=1 tables */
3118 .abj404-accordion-content table {
3119 width: 100%;
3120 border-collapse: separate;
3121 border-spacing: 0;
3122 border: 1px solid var(--abj404-border);
3123 border-radius: 4px;
3124 overflow: hidden;
3125 margin: 0;
3126 }
3127
3128 .abj404-accordion-content table tr {
3129 background: var(--abj404-surface);
3130 }
3131
3132 .abj404-accordion-content table tr:nth-child(even) {
3133 background: var(--abj404-surface-alt);
3134 }
3135
3136 .abj404-accordion-content table td {
3137 padding: 16px 20px;
3138 vertical-align: top;
3139 border-bottom: 1px solid var(--abj404-border-light);
3140 border-right: 1px solid var(--abj404-border-light);
3141 }
3142
3143 .abj404-accordion-content table tr:last-child td {
3144 border-bottom: none;
3145 }
3146
3147 .abj404-accordion-content table td:last-child {
3148 border-right: none;
3149 }
3150
3151 /* First column (labels) in table */
3152 .abj404-accordion-content table td:first-child {
3153 width: 45%;
3154 font-weight: 500;
3155 color: var(--abj404-text);
3156 background: var(--abj404-surface-alt);
3157 }
3158
3159 /* Second column (inputs) in table */
3160 .abj404-accordion-content table td:last-child {
3161 width: 55%;
3162 }
3163
3164 /* Textareas in tables */
3165 .abj404-accordion-content textarea {
3166 width: 100%;
3167 min-height: 120px;
3168 padding: 12px;
3169 border: 1px solid var(--abj404-border);
3170 border-radius: 4px;
3171 background: var(--abj404-input-bg);
3172 color: var(--abj404-text);
3173 font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
3174 font-size: 13px;
3175 line-height: 1.5;
3176 resize: vertical;
3177 transition: border-color 0.2s ease, box-shadow 0.2s ease;
3178 }
3179
3180 .abj404-accordion-content textarea:focus {
3181 border-color: var(--abj404-primary);
3182 box-shadow: 0 0 0 1px var(--abj404-primary);
3183 outline: none;
3184 }
3185
3186 /* Lists in options (bullet points) */
3187 .abj404-accordion-content ul {
3188 margin: 8px 0;
3189 padding-left: 20px;
3190 list-style-type: disc;
3191 }
3192
3193 .abj404-accordion-content ul li {
3194 margin-bottom: 4px;
3195 color: var(--abj404-text-muted);
3196 font-size: 13px;
3197 line-height: 1.5;
3198 }
3199
3200 .abj404-accordion-content ul li.closeLI {
3201 margin-bottom: 2px;
3202 }
3203
3204 /* Warning text (red warnings) */
3205 .abj404-accordion-content div[style*="color: red"],
3206 .abj404-accordion-content div[style*="color:red"] {
3207 background: var(--abj404-danger-bg) !important;
3208 color: var(--abj404-danger-text) !important;
3209 padding: 12px 16px !important;
3210 border-radius: 4px !important;
3211 border-left: 4px solid var(--abj404-danger-text) !important;
3212 margin: 12px 0 !important;
3213 font-weight: 500 !important;
3214 }
3215
3216 /* Note text */
3217 .abj404-accordion-content td br + text,
3218 .abj404-accordion-content p br + text {
3219 font-size: 13px;
3220 color: var(--abj404-text-muted);
3221 }
3222
3223 /* Info/help section at top of sections */
3224 .abj404-accordion-content > p:first-child {
3225 background: var(--abj404-surface-alt);
3226 border-left: 4px solid var(--abj404-primary);
3227 }
3228
3229 /* Horizontal rule/separator styling */
3230 .abj404-accordion-content hr {
3231 border: none;
3232 border-top: 1px solid var(--abj404-border-light);
3233 margin: 16px 0;
3234 }
3235
3236 /* DB version info and similar technical info */
3237 .abj404-accordion-content p:has(> label:empty),
3238 .abj404-accordion-content p:first-of-type:not(:has(label[for])) {
3239 font-size: 13px;
3240 color: var(--abj404-text-muted);
3241 background: var(--abj404-surface-alt);
3242 padding: 12px 20px;
3243 border-radius: 4px;
3244 margin-bottom: 16px;
3245 }
3246
3247 /* Mobile responsive adjustments */
3248 @media screen and (max-width: 782px) {
3249 .abj404-accordion-content p {
3250 flex-direction: column;
3251 padding: 12px 16px;
3252 }
3253
3254 .abj404-accordion-content p > label:first-child,
3255 .abj404-accordion-content p > label[for] {
3256 flex: none;
3257 width: 100%;
3258 margin-bottom: 8px;
3259 }
3260
3261 .abj404-accordion-content table td {
3262 display: block;
3263 width: 100% !important;
3264 padding: 12px 16px;
3265 }
3266
3267 .abj404-accordion-content table td:first-child {
3268 border-bottom: none;
3269 padding-bottom: 8px;
3270 }
3271
3272 .abj404-accordion-content textarea {
3273 min-height: 100px;
3274 }
3275 }
3276
3277 /* Dark theme adjustments for options */
3278 html[data-theme="neon"] .abj404-accordion-content p:nth-child(even),
3279 html[data-theme="obsidian"] .abj404-accordion-content p:nth-child(even) {
3280 background: var(--abj404-row-stripe-soft);
3281 }
3282
3283 html[data-theme="neon"] .abj404-accordion-content table td:first-child,
3284 html[data-theme="obsidian"] .abj404-accordion-content table td:first-child {
3285 background: var(--abj404-cell-stripe);
3286 }
3287
3288 html[data-theme="neon"] .abj404-accordion-content table tr:nth-child(even),
3289 html[data-theme="obsidian"] .abj404-accordion-content table tr:nth-child(even) {
3290 background: var(--abj404-row-stripe-soft);
3291 }
3292
3293 html[data-theme="neon"] .abj404-accordion-content textarea,
3294 html[data-theme="obsidian"] .abj404-accordion-content textarea,
3295 html[data-theme="neon"] .abj404-accordion-content input[type="text"],
3296 html[data-theme="obsidian"] .abj404-accordion-content input[type="text"],
3297 html[data-theme="neon"] .abj404-accordion-content select,
3298 html[data-theme="obsidian"] .abj404-accordion-content select {
3299 background: var(--abj404-input-bg);
3300 border-color: var(--abj404-border);
3301 }
3302
3303 /* Autocomplete dropdown field (redirect to) styling */
3304 /* Redirect field wrapper in accordion */
3305 .abj404-accordion-content .abj404-redirect-to-field {
3306 padding: 0 20px;
3307 }
3308
3309 .abj404-accordion-content .abj404-input-row {
3310 display: flex;
3311 align-items: center;
3312 gap: 8px;
3313 margin-bottom: 8px;
3314 }
3315
3316 .abj404-accordion-content label.add_a_redirect_label,
3317 .abj404-accordion-content label.add_exclude_page_field_label {
3318 display: block;
3319 font-weight: 600;
3320 color: var(--abj404-text);
3321 margin-bottom: 8px;
3322 padding: 16px 20px 0;
3323 }
3324
3325 .abj404-accordion-content #redirect_to_user_field,
3326 .abj404-accordion-content input#add_exclude_page_field {
3327 padding: 8px 12px;
3328 border: 1px solid var(--abj404-border);
3329 border-radius: 4px;
3330 font-size: 14px;
3331 width: 50% !important;
3332 max-width: 400px;
3333 }
3334
3335 .abj404-accordion-content #redirect_to_user_field:focus,
3336 .abj404-accordion-content input#add_exclude_page_field:focus {
3337 border-color: var(--abj404-primary);
3338 box-shadow: 0 0 0 1px var(--abj404-primary);
3339 outline: none;
3340 }
3341
3342 /* Loading spinner for accordion autocomplete */
3343 .abj404-accordion-content #redirect_to_user_field.ui-autocomplete-loading {
3344 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='6' stroke='%23c3c4c7' stroke-width='2' fill='none'/%3E%3Cpath d='M8 2 A6 6 0 0 1 14 8' stroke='%232271b1' stroke-width='2' fill='none' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 8 8' to='360 8 8' dur='0.8s' repeatCount='indefinite'/%3E%3C/path%3E%3C/svg%3E");
3345 background-color: var(--abj404-surface);
3346 background-repeat: no-repeat;
3347 background-position: right 10px center;
3348 background-size: 16px 16px;
3349 padding-right: 36px;
3350 }
3351
3352 /* Tooltip styling for autocomplete field */
3353 .abj404-accordion-content .lefty-tooltip {
3354 display: inline-flex;
3355 align-items: center;
3356 justify-content: center;
3357 width: 20px;
3358 height: 20px;
3359 background: var(--abj404-surface-alt);
3360 border: 1px solid var(--abj404-border);
3361 border-radius: 50%;
3362 font-size: 12px;
3363 font-weight: 600;
3364 color: var(--abj404-text-muted);
3365 cursor: help;
3366 vertical-align: middle;
3367 }
3368
3369 /* Explanation text below autocomplete */
3370 .abj404-accordion-content #redirect_to_user_field_explanation {
3371 display: block;
3372 font-size: 13px;
3373 color: var(--abj404-text-muted);
3374 margin-bottom: 16px;
3375 font-style: italic;
3376 }
3377
3378 /* Warning text styling */
3379 .abj404-accordion-content #redirect_to_user_field_warning {
3380 display: block;
3381 font-size: 13px;
3382 font-style: italic;
3383 font-weight: bold;
3384 color: var(--abj404-danger-text);
3385 margin-bottom: 8px;
3386 }
3387
3388 /* Section title styling for text without labels */
3389 .abj404-accordion-content > label[for] > br:first-of-type {
3390 display: block;
3391 margin-bottom: 8px;
3392 }
3393
3394 /* Make table label cells have better typography */
3395 .abj404-accordion-content table td:first-child label {
3396 font-weight: 600;
3397 font-size: 14px;
3398 color: var(--abj404-text);
3399 display: block;
3400 margin-bottom: 8px;
3401 }
3402
3403 /* Style the explanation paragraph in 404 Page Suggestions */
3404 .abj404-accordion-content > p:first-child:not(:has(label)) {
3405 background: var(--abj404-info-bg);
3406 border-left: 4px solid var(--abj404-primary);
3407 padding: 16px 20px;
3408 margin: 0 0 16px;
3409 line-height: 1.6;
3410 font-size: 14px;
3411 color: var(--abj404-text);
3412 }
3413
3414 /* Add bottom border to first row intro text */
3415 .abj404-accordion-content > p:first-child {
3416 border-bottom: 1px solid var(--abj404-border-light);
3417 }
3418
3419 /* Make inline styles in table cells less prominent */
3420 .abj404-accordion-content table td div[style*="display: inline"] {
3421 color: var(--abj404-text-muted);
3422 }
3423
3424 /* Note text below textareas in table cells */
3425 .abj404-accordion-content table td:last-child > br + text,
3426 .abj404-accordion-content table td:last-child > textarea + br + text {
3427 display: block;
3428 margin-top: 8px;
3429 font-size: 13px;
3430 color: var(--abj404-text-muted);
3431 }
3432
3433 /* Closeable list items for exclude pages */
3434 .abj404-accordion-content .closeable-ul {
3435 list-style: none;
3436 padding: 0;
3437 margin: 0;
3438 }
3439
3440 .abj404-accordion-content .closeable-ul li {
3441 display: inline-flex;
3442 align-items: center;
3443 gap: 4px;
3444 background: var(--abj404-surface-alt);
3445 padding: 4px 8px;
3446 border-radius: 4px;
3447 margin: 4px;
3448 font-size: 13px;
3449 }
3450
3451 /* Better styling for button groups */
3452 .abj404-accordion-content button,
3453 .abj404-accordion-content input[type="button"] {
3454 padding: 6px 12px;
3455 border: 1px solid var(--abj404-border);
3456 border-radius: 4px;
3457 background: var(--abj404-surface);
3458 color: var(--abj404-text);
3459 font-size: 13px;
3460 cursor: pointer;
3461 transition: all 0.2s ease;
3462 }
3463
3464 .abj404-accordion-content button:hover,
3465 .abj404-accordion-content input[type="button"]:hover {
3466 background: var(--abj404-surface-hover);
3467 border-color: var(--abj404-primary);
3468 }
3469
3470 /* Delete Debug File button - danger styling */
3471 .abj404-accordion-content input#deleteDebugFile,
3472 #deleteDebugFile {
3473 background: var(--abj404-danger-bg) !important;
3474 border: 1px solid var(--abj404-danger) !important;
3475 color: var(--abj404-danger) !important;
3476 font-weight: 500 !important;
3477 padding: 8px 16px !important;
3478 border-radius: 4px !important;
3479 cursor: pointer !important;
3480 }
3481
3482 .abj404-accordion-content input#deleteDebugFile:hover,
3483 #deleteDebugFile:hover {
3484 background: var(--abj404-danger) !important;
3485 color: var(--abj404-on-accent) !important;
3486 border-color: var(--abj404-danger) !important;
3487 }
3488
3489 /* Links inside card content - style as action links */
3490 .abj404-card-content p a,
3491 .abj404-card-content td a {
3492 color: var(--abj404-primary) !important;
3493 text-decoration: none !important;
3494 font-weight: 500 !important;
3495 padding: 6px 12px !important;
3496 border: 1px solid var(--abj404-primary) !important;
3497 border-radius: 4px !important;
3498 background: var(--abj404-info-bg) !important;
3499 transition: all 0.2s ease !important;
3500 display: inline-block !important;
3501 margin-right: 8px !important;
3502 }
3503
3504 .abj404-card-content p a:hover,
3505 .abj404-card-content td a:hover {
3506 background: var(--abj404-primary) !important;
3507 color: var(--abj404-on-accent) !important;
3508 }
3509
3510 /* ============================================
3511 Accessibility: Link-styled Buttons
3512 ============================================ */
3513
3514 .abj404-link-button {
3515 background: none;
3516 border: none;
3517 padding: 0;
3518 font: inherit;
3519 color: var(--abj404-accent);
3520 text-decoration: none;
3521 cursor: pointer;
3522 }
3523
3524 .abj404-link-button:hover {
3525 text-decoration: underline;
3526 color: var(--abj404-accent-hover);
3527 }
3528
3529 .abj404-link-button:focus {
3530 outline: 2px solid var(--abj404-accent);
3531 outline-offset: 2px;
3532 border-radius: 2px;
3533 }
3534
3535 /* ============================================
3536 Accessibility: Focus Indicators
3537 ============================================ */
3538
3539 /* Visible focus indicators for all interactive elements */
3540 a:focus-visible,
3541 button:focus-visible,
3542 input:focus-visible,
3543 select:focus-visible,
3544 textarea:focus-visible,
3545 [tabindex]:focus-visible,
3546 .abj404-tab:focus-visible,
3547 .abj404-page-btn:focus-visible,
3548 .abj404-btn:focus-visible,
3549 .abj404-action-link:focus-visible {
3550 outline: 2px solid var(--abj404-accent);
3551 outline-offset: 2px;
3552 }
3553
3554 /* Remove focus outline removal for tabs - they should have visible focus */
3555 .abj404-tab:focus {
3556 outline: 2px solid var(--abj404-accent);
3557 outline-offset: -2px;
3558 box-shadow: none;
3559 }
3560
3561 /* Ensure checkboxes have visible focus */
3562 input[type="checkbox"]:focus-visible {
3563 outline: 2px solid var(--abj404-accent);
3564 outline-offset: 2px;
3565 }
3566
3567 /* Table header links focus */
3568 .abj404-table th a:focus-visible {
3569 outline: 2px solid var(--abj404-accent);
3570 outline-offset: 2px;
3571 border-radius: 2px;
3572 }
3573
3574 /* Modal close button focus */
3575 .abj404-modal-close:focus-visible {
3576 outline: 2px solid var(--abj404-accent);
3577 outline-offset: 2px;
3578 }
3579
3580 /* ============================================
3581 Accessibility: Screen Reader Utilities
3582 ============================================ */
3583
3584 /* Visually hidden but accessible to screen readers */
3585 .screen-reader-text,
3586 .abj404-sr-only {
3587 position: absolute;
3588 width: 1px;
3589 height: 1px;
3590 padding: 0;
3591 margin: -1px;
3592 overflow: hidden;
3593 clip: rect(0, 0, 0, 0);
3594 white-space: nowrap;
3595 border: 0;
3596 }
3597
3598 /* Skip link styles - visible when focused */
3599 .abj404-skip-link {
3600 position: absolute;
3601 top: -40px;
3602 left: 0;
3603 background: var(--abj404-accent);
3604 color: var(--abj404-on-accent);
3605 padding: 8px 16px;
3606 z-index: 100001;
3607 text-decoration: none;
3608 font-weight: 500;
3609 }
3610
3611 .abj404-skip-link:focus {
3612 top: 0;
3613 }
3614
3615 /* Live region for announcements */
3616 .abj404-live-region {
3617 position: absolute;
3618 width: 1px;
3619 height: 1px;
3620 padding: 0;
3621 margin: -1px;
3622 overflow: hidden;
3623 clip: rect(0, 0, 0, 0);
3624 white-space: nowrap;
3625 border: 0;
3626 }
3627
3628 /* ============================================
3629 Accessibility: Reduced Motion
3630 ============================================ */
3631
3632 @media (prefers-reduced-motion: reduce) {
3633 *,
3634 *::before,
3635 *::after {
3636 animation-duration: 0.01ms !important;
3637 animation-iteration-count: 1 !important;
3638 transition-duration: 0.01ms !important;
3639 scroll-behavior: auto !important;
3640 }
3641
3642 /* Disable specific animations */
3643 .abj404-toast,
3644 .abj404-modal-content,
3645 .abj404-spinner,
3646 .abj404-collapse-icon,
3647 .abj404-accordion-toggle {
3648 animation: none !important;
3649 transition: none !important;
3650 }
3651
3652 /* jQuery slideUp/slideDown alternatives - instant show/hide */
3653 .abj404-accordion-content {
3654 transition: none !important;
3655 }
3656 }
3657
3658 /* ============================================
3659 Accessibility: High Contrast Mode Support
3660 ============================================ */
3661
3662 @media (forced-colors: active) {
3663 .abj404-badge,
3664 .abj404-type-badge {
3665 border: 1px solid currentColor;
3666 }
3667
3668 .abj404-btn,
3669 .abj404-page-btn {
3670 border: 2px solid currentColor;
3671 }
3672
3673 .abj404-table th,
3674 .abj404-table td {
3675 border: 1px solid currentColor;
3676 }
3677 }
3678
3679 /* ============================================
3680 Tools Diagnostics
3681 ============================================ */
3682
3683 .abj404-diagnostics-summary table td {
3684 vertical-align: middle;
3685 }
3686
3687 .abj404-status-pill {
3688 display: inline-block;
3689 padding: 2px 8px;
3690 border: 1px solid var(--abj404-border);
3691 border-radius: 2px;
3692 background: transparent;
3693 color: inherit;
3694 font-size: 11px;
3695 font-weight: 400;
3696 line-height: 1.5;
3697 }
3698
3699 .abj404-pill-success { border-color: var(--abj404-success); }
3700 .abj404-pill-warning { border-color: var(--abj404-warning); }
3701 .abj404-pill-info { border-color: var(--abj404-info); }
3702
3703 /* ── Advanced Options collapsible (Edit Redirect page) ─────────────────── */
3704
3705 .abj404-advanced-options {
3706 margin: 16px 0;
3707 border: 1px solid var(--abj404-border);
3708 border-radius: 4px;
3709 background: var(--abj404-bg);
3710 }
3711
3712 .abj404-advanced-options__summary {
3713 padding: 10px 16px;
3714 font-weight: 600;
3715 font-size: 13px;
3716 cursor: pointer;
3717 user-select: none;
3718 list-style: none;
3719 display: flex;
3720 align-items: center;
3721 gap: 6px;
3722 }
3723
3724 .abj404-advanced-options__summary::-webkit-details-marker {
3725 display: none;
3726 }
3727
3728 .abj404-advanced-options__summary::before {
3729 content: '';
3730 font-size: 10px;
3731 transition: transform 0.15s ease;
3732 display: inline-block;
3733 }
3734
3735 .abj404-advanced-options[open] > .abj404-advanced-options__summary::before {
3736 transform: rotate(90deg);
3737 }
3738
3739 .abj404-advanced-options__body {
3740 padding: 20px 28px 24px;
3741 border-top: 1px solid var(--abj404-border);
3742 }
3743
3744 /* ── GSC Guided Setup UI ──────────────────────────────────────────────── */
3745
3746 /* Wizard steps list */
3747 .abj404-wizard-steps {
3748 margin: 12px 0 16px 0;
3749 padding-left: 20px;
3750 }
3751 .abj404-wizard-steps li {
3752 margin-bottom: 10px;
3753 line-height: 1.5;
3754 }
3755
3756 /* Copy-URI widget */
3757 .abj404-copy-uri-wrap {
3758 display: flex;
3759 align-items: center;
3760 gap: 8px;
3761 margin-top: 6px;
3762 }
3763 .abj404-copy-uri-wrap code {
3764 flex: 1;
3765 padding: 5px 8px;
3766 background: var(--abj404-bg-muted);
3767 border: 1px solid var(--abj404-border);
3768 border-radius: 3px;
3769 font-size: 12px;
3770 word-break: break-all;
3771 }
3772 .abj404-copy-btn {
3773 padding: 4px 10px;
3774 font-size: 12px;
3775 cursor: pointer;
3776 white-space: nowrap;
3777 }
3778 .abj404-copy-btn--done {
3779 color: var(--abj404-success);
3780 border-color: var(--abj404-success);
3781 }
3782
3783 /* GSC status: native bordered-label pattern */
3784 .abj404-gsc-status {
3785 display: inline-flex;
3786 align-items: center;
3787 gap: 6px;
3788 padding: 2px 8px;
3789 border: 1px solid var(--abj404-border);
3790 border-radius: 2px;
3791 background: transparent;
3792 color: inherit;
3793 font-size: 11px;
3794 font-weight: 400;
3795 line-height: 1.5;
3796 margin-bottom: 12px;
3797 }
3798 .abj404-gsc-status--green { border-color: var(--abj404-success); }
3799 .abj404-gsc-status--amber { border-color: var(--abj404-warning); }
3800
3801 /* Error box */
3802 .abj404-gsc-error-box {
3803 background: var(--abj404-danger-bg);
3804 border: 1px solid var(--abj404-danger-border);
3805 border-radius: 4px;
3806 padding: 12px 16px;
3807 margin-bottom: 16px;
3808 color: var(--abj404-danger-text);
3809 }
3810 .abj404-gsc-error-box p {
3811 margin: 0 0 8px;
3812 }
3813 .abj404-gsc-error-box p:last-child {
3814 margin-bottom: 0;
3815 }
3816
3817 /* ============================================
3818 Behavior Tiles (404 Destination)
3819 ============================================ */
3820
3821 .abj404-behavior-tiles {
3822 margin: 0;
3823 }
3824
3825 .abj404-tiles-grid {
3826 display: grid;
3827 grid-template-columns: 1fr 1fr;
3828 gap: 12px;
3829 }
3830
3831 @media (max-width: 600px) {
3832 .abj404-tiles-grid {
3833 grid-template-columns: 1fr;
3834 }
3835 }
3836
3837 .abj404-tile {
3838 position: relative;
3839 border: 2px solid var(--abj404-border);
3840 border-radius: 8px;
3841 padding: 20px 16px 16px;
3842 cursor: pointer;
3843 transition: border-color 0.15s, background-color 0.15s, box-shadow 0.15s;
3844 background: var(--abj404-surface);
3845 text-align: center;
3846 }
3847
3848 .abj404-tile:hover {
3849 border-color: var(--abj404-primary);
3850 box-shadow: 0 0 0 1px var(--abj404-primary);
3851 }
3852
3853 .abj404-tile:focus {
3854 outline: 2px solid var(--abj404-primary);
3855 outline-offset: 2px;
3856 }
3857
3858 .abj404-tile.selected {
3859 border-color: var(--abj404-primary);
3860 background: color-mix(in srgb, var(--abj404-primary) 6%, var(--abj404-surface));
3861 box-shadow: 0 0 0 1px var(--abj404-primary);
3862 }
3863
3864 .abj404-tile-badge {
3865 display: none;
3866 position: absolute;
3867 top: -10px;
3868 right: 12px;
3869 padding: 2px 8px;
3870 border: 1px solid var(--abj404-primary);
3871 border-radius: 2px;
3872 background: var(--abj404-surface);
3873 color: inherit;
3874 font-size: 11px;
3875 font-weight: 400;
3876 line-height: 1.5;
3877 text-transform: uppercase;
3878 letter-spacing: 0.5px;
3879 }
3880
3881 .abj404-tile[data-behavior="suggest"] .abj404-tile-badge {
3882 display: block;
3883 }
3884
3885 .abj404-tile-icon {
3886 margin-bottom: 8px;
3887 color: var(--abj404-text-secondary);
3888 }
3889
3890 .abj404-tile.selected .abj404-tile-icon {
3891 color: var(--abj404-primary);
3892 }
3893
3894 .abj404-tile-title {
3895 font-size: 14px;
3896 font-weight: 600;
3897 margin: 0 0 4px;
3898 color: var(--abj404-text);
3899 }
3900
3901 .abj404-tile-desc {
3902 font-size: 12px;
3903 line-height: 1.4;
3904 margin: 0;
3905 color: var(--abj404-text-secondary);
3906 }
3907
3908 .abj404-custom-page-picker {
3909 margin-top: 12px;
3910 padding: 12px 16px;
3911 background: var(--abj404-bg-subtle);
3912 border-radius: 6px;
3913 border: 1px solid var(--abj404-border);
3914 }
3915
3916 /* Health status bar on Redirects landing page */
3917 .abj404-health-bar {
3918 display: flex;
3919 align-items: center;
3920 gap: 8px;
3921 padding: 10px 16px;
3922 margin-bottom: 12px;
3923 background: var(--abj404-bg-subtle);
3924 border: 1px solid var(--abj404-border);
3925 border-radius: 6px;
3926 font-size: 13px;
3927 color: var(--abj404-text);
3928 }
3929
3930 .abj404-health-bar a {
3931 margin-left: 4px;
3932 }
3933
3934 .abj404-health-dot {
3935 display: inline-block;
3936 width: 10px;
3937 height: 10px;
3938 border-radius: 50%;
3939 flex-shrink: 0;
3940 }
3941
3942 .abj404-health-green {
3943 background: var(--abj404-success);
3944 }
3945
3946 .abj404-health-yellow {
3947 background: var(--abj404-warning);
3948 }
3949
3950 /* Used while the logs_hits rollup is being rebuilt: we don't know whether
3951 captured URLs need attention yet, so render an intentional muted dot
3952 instead of an uncolored (visually broken) circle. WordPress admin gray. */
3953 .abj404-health-gray {
3954 background: var(--abj404-text-muted);
3955 }
3956
3957 /* Header text wrapper — heading + guidance on same line */
3958 .abj404-table-header-text {
3959 display: flex;
3960 align-items: baseline;
3961 gap: 24px;
3962 }
3963
3964 /* Guidance text next to page headings (Simple mode) */
3965 .abj404-guidance-subtitle {
3966 font-size: 13px;
3967 color: var(--abj404-text);
3968 font-weight: 400;
3969 line-height: 1.5;
3970 margin: 0;
3971 padding: 6px 12px;
3972 background: var(--abj404-bg-subtle);
3973 border-left: 3px solid var(--abj404-accent);
3974 border-radius: 2px;
3975 }
3976
3977 /* Suggested destination block on edit page */
3978 .abj404-hidden {
3979 display: none !important;
3980 }
3981
3982 .abj404-suggestion-block {
3983 padding: 16px;
3984 margin-bottom: 16px;
3985 background: var(--abj404-info-bg);
3986 border: 1px solid var(--abj404-border);
3987 border-radius: 6px;
3988 }
3989
3990 .abj404-suggestion-label {
3991 font-size: 12px;
3992 font-weight: 600;
3993 text-transform: uppercase;
3994 letter-spacing: 0.5px;
3995 color: var(--abj404-text-muted);
3996 margin-bottom: 8px;
3997 }
3998
3999 .abj404-suggestion-content {
4000 display: flex;
4001 align-items: center;
4002 gap: 10px;
4003 margin-bottom: 12px;
4004 font-size: 15px;
4005 }
4006
4007 .abj404-suggestion-actions {
4008 display: flex;
4009 gap: 8px;
4010 }
4011
4012 body.abj404-dark-mode .abj404-guidance-subtitle {
4013 color: var(--abj404-dark-text-soft);
4014 background: var(--abj404-bg-subtle);
4015 border-left-color: var(--abj404-dark-accent-border);
4016 }
4017
4018 body.abj404-dark-mode .abj404-suggestion-block {
4019 background: var(--abj404-dark-surface-deep);
4020 border-color: var(--abj404-dark-border-deep);
4021 }
4022
4023 body.abj404-dark-mode .abj404-suggestion-label {
4024 color: var(--abj404-dark-text-muted);
4025 }
4026