PluginProbe
404 Solution / 4.3.0
404 Solution v4.3.0
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 4.3.0, at includes/html/404solutionStyles.css

3,941 lines 93.9 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 /* Hits Cell */
1568 .abj404-hits-cell {
1569 text-align: right;
1570 font-weight: 600;
1571 color: var(--abj404-text);
1572 }
1573
1574 /* Date Cell */
1575 .abj404-date-cell {
1576 color: var(--abj404-text-muted);
1577 font-size: 12px;
1578 white-space: nowrap;
1579 }
1580
1581 /* Destination Cell */
1582 .abj404-dest-cell {
1583 word-break: break-word;
1584 }
1585
1586 .abj404-dest-cell a {
1587 display: block;
1588 }
1589
1590 /* ============================================
1591 Status & Type Badges
1592 ============================================ */
1593
1594 /* Native bordered-label pattern: 1px border carries semantic, no fill,
1595 regular text weight. Mirrors WP Site Health Security/Performance badges
1596 (wp-admin/css/edit.css ~L925). Colors come from --abj404-* custom
1597 properties defined in adminThemes.css so admin-theme plugins (Dark Mode,
1598 etc.) can recolor by overriding the variables. */
1599 .abj404-badge {
1600 display: inline-block;
1601 padding: 2px 8px;
1602 border: 1px solid var(--abj404-border);
1603 border-radius: 2px;
1604 background: transparent;
1605 color: inherit;
1606 font-size: 11px;
1607 font-weight: 400;
1608 line-height: 1.5;
1609 white-space: nowrap;
1610 }
1611
1612 .abj404-badge-auto { border-color: var(--abj404-info); }
1613 .abj404-badge-manual { border-color: var(--abj404-border); }
1614 .abj404-badge-regex { border-color: var(--abj404-info); }
1615 .abj404-badge-301 { border-color: var(--abj404-success); }
1616 .abj404-badge-302 { border-color: var(--abj404-warning); }
1617 .abj404-badge-307 { border-color: var(--abj404-info); }
1618 .abj404-badge-308 { border-color: var(--abj404-info); }
1619 .abj404-badge-410 { border-color: var(--abj404-danger); }
1620 .abj404-badge-451 { border-color: var(--abj404-danger); }
1621 .abj404-badge-meta { border-color: var(--abj404-border); }
1622 .abj404-badge-captured { border-color: var(--abj404-warning); }
1623 .abj404-badge-ignored { border-color: var(--abj404-border); }
1624 .abj404-badge-later { border-color: var(--abj404-info); }
1625 .abj404-badge-trash { border-color: var(--abj404-danger); }
1626 .abj404-badge-404 { border-color: var(--abj404-danger); }
1627 .abj404-badge-redirect { border-color: var(--abj404-success); }
1628
1629 .abj404-type-badge {
1630 display: inline-block;
1631 padding: 2px 8px;
1632 border: 1px solid var(--abj404-border);
1633 border-radius: 2px;
1634 background: transparent;
1635 color: inherit;
1636 font-size: 11px;
1637 font-weight: 400;
1638 line-height: 1.5;
1639 }
1640
1641 .abj404-never-used {
1642 color: var(--abj404-danger-text);
1643 font-style: italic;
1644 font-size: 13px;
1645 }
1646
1647 /* ============================================
1648 Row Actions (WordPress-style under URL)
1649 ============================================ */
1650
1651 .abj404-row-actions {
1652 display: none;
1653 position: absolute;
1654 left: 0;
1655 top: calc(100% - 18px);
1656 margin-top: 0;
1657 padding: 4px 6px;
1658 border-radius: 4px;
1659 border: 1px solid var(--abj404-border);
1660 background: var(--abj404-card-bg);
1661 box-shadow: var(--abj404-shadow-md);
1662 font-size: 12px;
1663 color: var(--abj404-text-muted);
1664 white-space: nowrap;
1665 z-index: 2;
1666 pointer-events: auto;
1667 }
1668
1669 .abj404-table tbody tr:hover .abj404-row-actions,
1670 .abj404-url-cell:hover .abj404-row-actions,
1671 .abj404-url-cell:focus-within .abj404-row-actions,
1672 .abj404-row-actions:hover,
1673 .abj404-row-actions:focus-within {
1674 display: block;
1675 }
1676
1677 .abj404-table tbody tr:focus-within .abj404-row-actions {
1678 display: block;
1679 }
1680
1681 .abj404-table tbody tr {
1682 position: relative;
1683 z-index: 0;
1684 }
1685
1686 .abj404-table tbody tr:hover,
1687 .abj404-table tbody tr:focus-within {
1688 z-index: 1;
1689 }
1690
1691 /* Always show actions on touch devices */
1692 @media (hover: none) {
1693 .abj404-row-actions {
1694 display: block;
1695 position: static;
1696 margin-top: 4px;
1697 padding: 0;
1698 border: 0;
1699 background: transparent;
1700 box-shadow: none;
1701 }
1702 }
1703
1704 .abj404-row-actions a {
1705 color: var(--abj404-accent);
1706 text-decoration: none;
1707 }
1708
1709 .abj404-row-actions a:hover {
1710 color: var(--abj404-accent-hover);
1711 text-decoration: underline;
1712 }
1713
1714 .abj404-row-actions a.danger,
1715 .abj404-row-actions a.abj404-action-trash {
1716 color: var(--abj404-danger-text);
1717 }
1718
1719 .abj404-row-actions a.danger:hover,
1720 .abj404-row-actions a.abj404-action-trash:hover {
1721 color: var(--abj404-danger);
1722 }
1723
1724 /* Action links with icons */
1725 .abj404-action-link {
1726 display: inline-flex;
1727 align-items: center;
1728 gap: 3px;
1729 }
1730
1731 .abj404-action-link svg {
1732 width: 12px;
1733 height: 12px;
1734 flex-shrink: 0;
1735 }
1736
1737 /* Legacy button style - for backwards compatibility */
1738 .abj404-action-btn {
1739 color: var(--abj404-accent);
1740 text-decoration: none;
1741 display: inline-flex;
1742 align-items: center;
1743 }
1744
1745 .abj404-action-btn svg {
1746 width: 14px;
1747 height: 14px;
1748 }
1749
1750
1751 /* ============================================
1752 Modern Pagination
1753 ============================================ */
1754
1755 /* The pagination strip (count + First/Prev/Next/Last nav) is a flex item
1756 inside the .abj404-filter-bar tablenav row, which already supplies the row's
1757 horizontal padding and border. The strip itself must stay padding- and
1758 border-free, otherwise it renders as a second indented, bordered block that
1759 doubles the vertical gap above the table (top strip) and below the last row
1760 (bottom strip). The search filter and rows-per-page controls live in the
1761 static filter bar, not here. */
1762 .abj404-pagination {
1763 display: flex;
1764 align-items: center;
1765 flex-wrap: wrap;
1766 gap: 4px;
1767 padding: 0;
1768 }
1769
1770 /* Right-justify the count + nav at the end of the tablenav row, matching the
1771 native Posts list table where pagination sits hard-right. The descendant
1772 selector is required to outrank WordPress core's
1773 `.tablenav .tablenav-pages { margin-left: 0 }` (load-styles.php), which the
1774 strip also matches via its tablenav-pages class. */
1775 .abj404-filter-bar .abj404-pagination {
1776 margin-left: auto;
1777 }
1778
1779 /* WordPress core gives .tablenav a fixed 30px height and .tablenav-pages a
1780 fixed 28px height. Our filter/pagination bars reuse those classes but hold
1781 taller, wrapping content (the search box; the refresh-status badge; the
1782 pagination controls, which wrap to a second line while a background refresh
1783 is running). A fixed-height box cannot grow for that second line, so it
1784 overflowed downward and overlapped the footer/credits. Let the bars size to
1785 their content instead. */
1786 .abj404-filter-bar.tablenav,
1787 .abj404-pagination.tablenav-pages {
1788 height: auto;
1789 }
1790
1791 .abj404-pagination-info {
1792 color: var(--abj404-text-muted);
1793 font-size: 13px;
1794 }
1795
1796 /*
1797 * Inline progress badge shown by the page-redirects AJAX pipeline while a
1798 * cold-cache build is running (case-a). The same `.abj404-refresh-status`
1799 * span sits in both the filter row and the bottom pagination strip and is
1800 * populated by view_updater_build_advance.js / view_updater_table_warmup.js
1801 * via jQuery.text(). When empty it stays out of the layout so the existing
1802 * case-b toast (which collapses to a 28px spinner after 2s) remains the
1803 * dominant signal once the table is already visible.
1804 */
1805 .abj404-refresh-status {
1806 display: inline-flex;
1807 align-items: center;
1808 gap: 6px;
1809 padding: 4px 10px;
1810 background: var(--abj404-info-bg);
1811 color: var(--abj404-info-text);
1812 border: 1px solid var(--abj404-info-border);
1813 border-radius: 12px;
1814 font-size: 13px;
1815 font-weight: 500;
1816 line-height: 1.4;
1817 vertical-align: middle;
1818 max-width: 100%;
1819 overflow: hidden;
1820 text-overflow: ellipsis;
1821 white-space: nowrap;
1822 }
1823
1824 .abj404-refresh-status:empty {
1825 display: none;
1826 }
1827
1828 .abj404-refresh-status::before {
1829 content: "";
1830 width: 12px;
1831 height: 12px;
1832 flex: 0 0 auto;
1833 border: 2px solid var(--abj404-info-border);
1834 border-top-color: var(--abj404-info-text);
1835 border-radius: 50%;
1836 animation: abj404-spin 0.8s linear infinite;
1837 }
1838
1839 .abj404-pagination-controls {
1840 display: flex;
1841 gap: 2px;
1842 align-items: center;
1843 }
1844
1845 /* Compact, square-ish page buttons matching WordPress core's .tablenav-pages
1846 navigation so pagination does not eat horizontal room on the tablenav row.
1847 WP core uses ~24px square chevrons. */
1848 .abj404-page-btn {
1849 padding: 0 2px;
1850 min-width: 24px;
1851 height: 24px;
1852 line-height: 22px;
1853 border: 1px solid var(--abj404-border);
1854 background: var(--abj404-surface);
1855 border-radius: 4px;
1856 cursor: pointer;
1857 font-size: 13px;
1858 color: var(--abj404-accent);
1859 transition: all 0.15s;
1860 text-align: center;
1861 text-decoration: none;
1862 display: inline-block;
1863 }
1864
1865 .abj404-page-btn:hover {
1866 background: var(--abj404-bg);
1867 border-color: var(--abj404-accent);
1868 text-decoration: none;
1869 }
1870
1871 .abj404-page-btn.active {
1872 background: var(--abj404-accent);
1873 color: var(--abj404-on-accent);
1874 border-color: var(--abj404-accent);
1875 }
1876
1877 .abj404-page-btn:disabled,
1878 .abj404-page-btn.disabled {
1879 opacity: 0.5;
1880 cursor: not-allowed;
1881 pointer-events: none;
1882 }
1883
1884 .abj404-page-ellipsis {
1885 padding: 8px 4px;
1886 color: var(--abj404-text-muted);
1887 }
1888
1889 .abj404-pagination-text {
1890 padding: 0 4px;
1891 color: var(--abj404-text-muted);
1892 font-size: 13px;
1893 white-space: nowrap;
1894 }
1895
1896 /* ============================================
1897 Table Loading Overlay
1898 ============================================ */
1899
1900 .abj404-table-wrapper {
1901 position: relative;
1902 }
1903
1904 .abj404-loading-overlay {
1905 position: absolute;
1906 top: 0;
1907 left: 0;
1908 right: 0;
1909 bottom: 0;
1910 background: var(--abj404-loading-overlay-bg);
1911 z-index: 10;
1912 border-radius: 8px;
1913 animation: abj404-fade-in 0.2s ease-out;
1914 overflow: hidden;
1915 pointer-events: none;
1916 }
1917
1918 @keyframes abj404-fade-in {
1919 from { opacity: 0; }
1920 to { opacity: 1; }
1921 }
1922
1923 .abj404-spinner-container {
1924 position: sticky;
1925 top: 50vh;
1926 display: flex;
1927 justify-content: center;
1928 transform: translateY(-50%);
1929 pointer-events: none;
1930 }
1931
1932 .abj404-spinner {
1933 width: 40px;
1934 height: 40px;
1935 border: 3px solid var(--abj404-border);
1936 border-top-color: var(--abj404-accent);
1937 border-radius: 50%;
1938 animation: abj404-spin 0.8s linear infinite;
1939 }
1940
1941 @keyframes abj404-spin {
1942 to { transform: rotate(360deg); }
1943 }
1944
1945 /* ============================================
1946 Regex Explanation Toggle
1947 ============================================ */
1948
1949 .abj404-regex-toggle {
1950 font-size: 12px;
1951 color: var(--abj404-accent);
1952 text-decoration: none;
1953 cursor: pointer;
1954 }
1955
1956 .abj404-regex-toggle:hover {
1957 text-decoration: underline;
1958 }
1959
1960 .abj404-regex-info {
1961 margin-top: 12px;
1962 padding: 12px 16px;
1963 background: var(--abj404-bg);
1964 border-left: 3px solid var(--abj404-accent);
1965 border-radius: 0 4px 4px 0;
1966 font-size: 13px;
1967 line-height: 1.5;
1968 }
1969
1970 .abj404-regex-info code {
1971 background: var(--abj404-surface);
1972 padding: 2px 6px;
1973 border-radius: 3px;
1974 font-family: monospace;
1975 }
1976
1977 .abj404-regex-info p {
1978 margin: 0 0 8px 0;
1979 }
1980
1981 .abj404-regex-info p:last-child {
1982 margin-bottom: 0;
1983 }
1984
1985 /* ============================================
1986 Modal Styles
1987 ============================================ */
1988
1989 .abj404-modal {
1990 display: none;
1991 position: fixed;
1992 top: 0;
1993 left: 0;
1994 width: 100%;
1995 height: 100%;
1996 background: var(--abj404-overlay-bg);
1997 z-index: 100000;
1998 align-items: center;
1999 justify-content: center;
2000 }
2001
2002 .abj404-modal.active {
2003 display: flex;
2004 }
2005
2006 .abj404-modal-content {
2007 background: var(--abj404-surface);
2008 border-radius: 8px;
2009 width: 90%;
2010 max-width: 600px;
2011 max-height: 90vh;
2012 overflow-y: auto;
2013 box-shadow: var(--abj404-shadow-lg);
2014 animation: abj404-modal-slideUp 0.3s ease;
2015 }
2016
2017 @keyframes abj404-modal-slideUp {
2018 from {
2019 transform: translateY(50px);
2020 opacity: 0;
2021 }
2022 to {
2023 transform: translateY(0);
2024 opacity: 1;
2025 }
2026 }
2027
2028 .abj404-modal-header {
2029 padding: 20px 24px;
2030 border-bottom: 1px solid var(--abj404-border);
2031 display: flex;
2032 justify-content: space-between;
2033 align-items: center;
2034 }
2035
2036 .abj404-modal-header h2 {
2037 font-size: 20px;
2038 font-weight: 600;
2039 margin: 0;
2040 color: var(--abj404-text);
2041 }
2042
2043 .abj404-modal-close {
2044 background: none;
2045 border: none;
2046 font-size: 24px;
2047 color: var(--abj404-text-muted);
2048 cursor: pointer;
2049 padding: 0;
2050 width: 32px;
2051 height: 32px;
2052 display: flex;
2053 align-items: center;
2054 justify-content: center;
2055 border-radius: 4px;
2056 transition: background 0.15s;
2057 }
2058
2059 .abj404-modal-close:hover {
2060 background: var(--abj404-bg);
2061 }
2062
2063 .abj404-modal-body {
2064 padding: 24px;
2065 }
2066
2067 .abj404-modal-footer {
2068 padding: 16px 24px;
2069 border-top: 1px solid var(--abj404-border);
2070 display: flex;
2071 justify-content: flex-end;
2072 gap: 12px;
2073 }
2074
2075 /* Modal redirect-to field structure */
2076 .abj404-modal .abj404-redirect-to-field {
2077 margin-bottom: 0;
2078 }
2079
2080 .abj404-modal .abj404-input-row {
2081 display: block;
2082 }
2083
2084 /* Modal autocomplete field styling */
2085 .abj404-modal #redirect_to_user_field {
2086 width: 100% !important;
2087 padding: 8px 12px;
2088 border: 1px solid var(--abj404-border);
2089 border-radius: 4px;
2090 font-size: 14px;
2091 background: var(--abj404-surface);
2092 box-sizing: border-box;
2093 }
2094
2095 .abj404-modal #redirect_to_user_field:focus {
2096 border-color: var(--abj404-primary);
2097 outline: none;
2098 box-shadow: 0 0 0 1px var(--abj404-primary);
2099 }
2100
2101 /* Loading spinner for modal autocomplete */
2102 .abj404-modal #redirect_to_user_field.ui-autocomplete-loading {
2103 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");
2104 background-color: var(--abj404-surface);
2105 background-repeat: no-repeat;
2106 background-position: right 10px center;
2107 background-size: 16px 16px;
2108 padding-right: 36px;
2109 }
2110
2111 /* Hide legacy tooltip in modal - label already present */
2112 .abj404-modal .lefty-tooltip {
2113 display: none;
2114 }
2115
2116 /* Style explanation text in modal */
2117 .abj404-modal #redirect_to_user_field_explanation {
2118 display: block;
2119 margin-top: 8px;
2120 font-size: 13px;
2121 color: var(--abj404-text-muted);
2122 font-style: italic;
2123 }
2124
2125 .abj404-modal #redirect_to_user_field_warning {
2126 display: block;
2127 margin-top: 4px;
2128 font-size: 13px;
2129 font-style: italic;
2130 font-weight: bold;
2131 color: var(--abj404-danger-text);
2132 }
2133
2134 /* Hide template label since we have our own */
2135 .abj404-modal .add_a_redirect_label {
2136 display: none;
2137 }
2138
2139 /* Modal: button-grid and form inputs fill modal width */
2140 .abj404-modal .abj404-form-input,
2141 .abj404-modal .abj404-form-select {
2142 max-width: 100%;
2143 }
2144
2145 /* Modal: advanced options section needs a bit more room */
2146 .abj404-modal .abj404-advanced-options {
2147 margin: 0 0 16px 0;
2148 }
2149
2150 /* Autocomplete input wrapper */
2151 .abj404-input-with-spinner {
2152 display: inline;
2153 }
2154
2155 /* Hide the separate spinner element - we use background-image instead */
2156 .abj404-loading-spinner {
2157 display: none !important;
2158 }
2159
2160 /* Show loading spinner inside input as background-image when loading */
2161 #redirect_to_user_field.ui-autocomplete-loading {
2162 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");
2163 background-repeat: no-repeat;
2164 background-position: right 8px center;
2165 background-size: 16px 16px;
2166 padding-right: 32px !important;
2167 }
2168
2169 /* ============================================
2170 Edit Redirect Page
2171 ============================================ */
2172
2173 .abj404-edit-page {
2174 margin: 20px 20px 20px 0;
2175 }
2176
2177 .abj404-edit-container {
2178 background: var(--abj404-surface);
2179 border: 1px solid var(--abj404-border);
2180 border-radius: 8px;
2181 padding: 24px 32px;
2182 max-width: 520px;
2183 }
2184
2185 .abj404-edit-container h2 {
2186 font-size: 20px;
2187 font-weight: 600;
2188 color: var(--abj404-text);
2189 margin: 0 0 24px 0;
2190 padding-bottom: 16px;
2191 border-bottom: 1px solid var(--abj404-border);
2192 }
2193
2194 /* Edit page header row: title + back link */
2195 .abj404-edit-page-header {
2196 display: flex;
2197 align-items: center;
2198 justify-content: space-between;
2199 margin-bottom: 24px;
2200 padding-bottom: 16px;
2201 border-bottom: 1px solid var(--abj404-border);
2202 }
2203
2204 .abj404-edit-page-header h2 {
2205 font-size: 20px;
2206 font-weight: 600;
2207 color: var(--abj404-text);
2208 margin: 0;
2209 border: none;
2210 padding: 0;
2211 }
2212
2213 .abj404-back-link {
2214 font-size: 13px;
2215 color: var(--abj404-accent);
2216 text-decoration: none;
2217 display: flex;
2218 align-items: center;
2219 gap: 4px;
2220 white-space: nowrap;
2221 }
2222
2223 .abj404-back-link:hover {
2224 text-decoration: underline;
2225 color: var(--abj404-accent-hover);
2226 }
2227
2228 /* Redirect type button grid */
2229 .abj404-redirect-type-grid {
2230 display: grid;
2231 grid-template-columns: repeat(3, 1fr);
2232 gap: 8px;
2233 margin-bottom: 8px;
2234 }
2235
2236 .abj404-redirect-type-btn {
2237 display: flex;
2238 flex-direction: column;
2239 align-items: center;
2240 justify-content: center;
2241 padding: 10px 8px;
2242 border: 1px solid var(--abj404-border);
2243 border-radius: 4px;
2244 background: var(--abj404-surface);
2245 cursor: pointer;
2246 transition: border-color 0.15s, background 0.15s;
2247 text-align: center;
2248 color: var(--abj404-text);
2249 line-height: 1.3;
2250 font-family: inherit;
2251 }
2252
2253 .abj404-redirect-type-btn strong {
2254 font-size: 15px;
2255 font-weight: 700;
2256 display: block;
2257 }
2258
2259 .abj404-redirect-type-btn span {
2260 font-size: 11px;
2261 color: var(--abj404-text-muted);
2262 display: block;
2263 }
2264
2265 .abj404-redirect-type-btn:hover {
2266 border-color: var(--abj404-accent);
2267 background: var(--abj404-info-bg);
2268 }
2269
2270 .abj404-redirect-type-btn--active {
2271 border-color: var(--abj404-accent);
2272 background: var(--abj404-accent);
2273 color: var(--abj404-on-accent);
2274 }
2275
2276 .abj404-redirect-type-btn--active strong {
2277 color: var(--abj404-on-accent);
2278 }
2279
2280 .abj404-redirect-type-btn--active span {
2281 color: var(--abj404-on-accent);
2282 }
2283
2284 .abj404-redirect-type-btn--active:hover {
2285 background: var(--abj404-accent-hover);
2286 border-color: var(--abj404-accent-hover);
2287 }
2288
2289 /* Meta Refresh button spans full width */
2290 .abj404-redirect-type-btn--full {
2291 grid-column: 1 / -1;
2292 }
2293
2294 /* URL list for bulk editing */
2295 .abj404-url-list {
2296 background: var(--abj404-bg);
2297 border: 1px solid var(--abj404-border);
2298 border-radius: 4px;
2299 padding: 12px 16px;
2300 max-height: 200px;
2301 overflow-y: auto;
2302 }
2303
2304 .abj404-url-list ul {
2305 margin: 0;
2306 padding: 0;
2307 list-style: none;
2308 }
2309
2310 .abj404-url-list li {
2311 padding: 4px 0;
2312 font-size: 13px;
2313 color: var(--abj404-text);
2314 border-bottom: 1px solid var(--abj404-border);
2315 }
2316
2317 .abj404-url-list li:last-child {
2318 border-bottom: none;
2319 }
2320
2321 .abj404-url-list code {
2322 background: transparent;
2323 padding: 0;
2324 font-size: 13px;
2325 }
2326
2327 /* Button group for form actions */
2328 .abj404-button-group {
2329 display: flex;
2330 gap: 12px;
2331 margin-top: 24px;
2332 padding-top: 20px;
2333 border-top: 1px solid var(--abj404-border);
2334 }
2335
2336 /* Edit page: inputs fill the narrower card */
2337 .abj404-edit-container .abj404-form-input,
2338 .abj404-edit-container .abj404-form-select {
2339 max-width: 100%;
2340 }
2341
2342 /* Redirect-to field wrapper structure */
2343 .abj404-edit-container .abj404-redirect-to-field {
2344 margin-bottom: 20px;
2345 }
2346
2347 .abj404-edit-container .abj404-input-row {
2348 display: flex;
2349 align-items: center;
2350 gap: 8px;
2351 }
2352
2353 /* Style the template label to match form labels */
2354 .abj404-edit-container .add_a_redirect_label {
2355 display: block;
2356 font-weight: 600;
2357 color: var(--abj404-text);
2358 margin-bottom: 8px;
2359 font-size: 14px;
2360 }
2361
2362 /* Style the autocomplete field on edit page */
2363 .abj404-edit-container #redirect_to_user_field {
2364 width: 100%;
2365 max-width: 100%;
2366 padding: 10px 12px;
2367 border: 1px solid var(--abj404-border);
2368 border-radius: 4px;
2369 font-size: 14px;
2370 background: var(--abj404-surface);
2371 box-sizing: border-box;
2372 }
2373
2374 .abj404-edit-container #redirect_to_user_field:focus {
2375 border-color: var(--abj404-accent);
2376 outline: none;
2377 box-shadow: 0 0 0 1px var(--abj404-accent);
2378 }
2379
2380 /* Loading spinner for edit page autocomplete */
2381 .abj404-edit-container #redirect_to_user_field.ui-autocomplete-loading {
2382 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");
2383 background-color: var(--abj404-surface);
2384 background-repeat: no-repeat;
2385 background-position: right 10px center;
2386 background-size: 16px 16px;
2387 padding-right: 36px;
2388 }
2389
2390 /* Style the explanation text */
2391 .abj404-edit-container #redirect_to_user_field_explanation {
2392 display: block;
2393 margin-top: 8px;
2394 font-size: 13px;
2395 color: var(--abj404-text-muted);
2396 font-style: italic;
2397 }
2398
2399 /* Style the warning text */
2400 .abj404-edit-container #redirect_to_user_field_warning {
2401 display: block;
2402 margin-top: 4px;
2403 font-size: 13px;
2404 font-style: italic;
2405 font-weight: bold;
2406 color: var(--abj404-danger-text);
2407 }
2408
2409 /* Style the tooltip inline with the input */
2410 .abj404-edit-container .lefty-tooltip {
2411 display: inline-flex;
2412 align-items: center;
2413 justify-content: center;
2414 font-size: 13px;
2415 color: var(--abj404-text-muted);
2416 cursor: help;
2417 }
2418
2419 /* ============================================
2420 Empty State
2421 ============================================ */
2422
2423 .abj404-empty-state {
2424 text-align: center;
2425 padding: 60px 20px;
2426 color: var(--abj404-text-muted);
2427 }
2428
2429 .abj404-empty-state-icon {
2430 font-size: 48px;
2431 margin-bottom: 16px;
2432 opacity: 0.5;
2433 }
2434
2435 .abj404-empty-state h3 {
2436 font-size: 18px;
2437 font-weight: 600;
2438 color: var(--abj404-text);
2439 margin: 0 0 8px 0;
2440 }
2441
2442 .abj404-empty-state p {
2443 margin: 0;
2444 font-size: 14px;
2445 }
2446
2447 /* ============================================
2448 Destination with Warning
2449 ============================================ */
2450
2451 .abj404-dest-warning {
2452 color: var(--abj404-danger-text);
2453 font-weight: 600;
2454 }
2455
2456 .abj404-dest-tooltip {
2457 position: relative;
2458 display: inline-block;
2459 }
2460
2461 .abj404-dest-tooltip .abj404-tooltip-text {
2462 visibility: hidden;
2463 background-color: var(--abj404-tooltip-bg);
2464 color: var(--abj404-on-accent);
2465 text-align: center;
2466 border-radius: 4px;
2467 padding: 8px 12px;
2468 position: absolute;
2469 z-index: 1000;
2470 bottom: 125%;
2471 left: 50%;
2472 transform: translateX(-50%);
2473 white-space: nowrap;
2474 font-size: 12px;
2475 font-weight: normal;
2476 opacity: 0;
2477 transition: opacity 0.2s;
2478 }
2479
2480 .abj404-dest-tooltip .abj404-tooltip-text::after {
2481 content: "";
2482 position: absolute;
2483 top: 100%;
2484 left: 50%;
2485 margin-left: -5px;
2486 border-width: 5px;
2487 border-style: solid;
2488 border-color: var(--abj404-tooltip-bg) transparent transparent transparent;
2489 }
2490
2491 .abj404-dest-tooltip:hover .abj404-tooltip-text {
2492 visibility: visible;
2493 opacity: 1;
2494 }
2495
2496 /* Keep top-row destination tooltips readable: show below the row instead of under sticky headers. */
2497 .abj404-table tbody tr:nth-child(-n+2) .abj404-dest-tooltip .abj404-tooltip-text {
2498 top: 125%;
2499 bottom: auto;
2500 }
2501
2502 .abj404-table tbody tr:nth-child(-n+2) .abj404-dest-tooltip .abj404-tooltip-text::after {
2503 top: auto;
2504 bottom: 100%;
2505 border-color: transparent transparent var(--abj404-tooltip-bg) transparent;
2506 }
2507
2508 /* ============================================
2509 URL with Regex Warning
2510 ============================================ */
2511
2512 .url-looks-like-regex {
2513 background-color: var(--abj404-warning-bg);
2514 }
2515
2516 .abj404-url-warning {
2517 color: var(--abj404-warning-text);
2518 font-weight: 600;
2519 }
2520
2521 .abj404-url-tooltip {
2522 position: relative;
2523 display: inline-block;
2524 }
2525
2526 .abj404-url-tooltip .abj404-tooltip-text {
2527 visibility: hidden;
2528 background-color: var(--abj404-tooltip-bg);
2529 color: var(--abj404-on-accent);
2530 text-align: left;
2531 border-radius: 4px;
2532 padding: 10px 14px;
2533 position: absolute;
2534 z-index: 1000;
2535 bottom: 100%;
2536 left: 0;
2537 margin-bottom: 8px;
2538 font-size: 13px;
2539 font-weight: normal;
2540 opacity: 0;
2541 transition: opacity 0.2s;
2542 width: 320px;
2543 line-height: 1.5;
2544 box-shadow: var(--abj404-shadow-md);
2545 }
2546
2547 .abj404-url-tooltip .abj404-tooltip-text::after {
2548 content: "";
2549 position: absolute;
2550 top: 100%;
2551 left: 20px;
2552 border-width: 6px;
2553 border-style: solid;
2554 border-color: var(--abj404-tooltip-bg) transparent transparent transparent;
2555 }
2556
2557 .abj404-url-tooltip:hover .abj404-tooltip-text {
2558 visibility: visible;
2559 opacity: 1;
2560 }
2561
2562 /* ============================================
2563 Mobile Responsiveness for Tables
2564 ============================================ */
2565
2566 @media screen and (max-width: 782px) {
2567 .abj404-table-header,
2568 .abj404-filter-bar,
2569 .abj404-table-container,
2570 .abj404-pagination {
2571 padding-left: 16px;
2572 padding-right: 16px;
2573 }
2574
2575 .abj404-table-header {
2576 flex-direction: column;
2577 align-items: flex-start;
2578 }
2579
2580 .abj404-filter-bar {
2581 flex-direction: column;
2582 align-items: stretch;
2583 }
2584
2585 .abj404-search-box {
2586 min-width: auto;
2587 max-width: none;
2588 }
2589
2590 .abj404-list-top {
2591 flex-direction: column;
2592 align-items: stretch;
2593 padding-left: 16px;
2594 padding-right: 16px;
2595 }
2596
2597 .abj404-list-top .abj404-search-box {
2598 margin-left: 0;
2599 }
2600
2601 .abj404-list-top .abj404-search-box input {
2602 width: 100%;
2603 }
2604
2605 .abj404-rows-per-page {
2606 margin-left: 0;
2607 justify-content: flex-start;
2608 }
2609
2610 .abj404-pagination {
2611 flex-direction: column;
2612 align-items: center;
2613 text-align: center;
2614 }
2615
2616 .abj404-filter-bar .abj404-pagination {
2617 margin-left: 0;
2618 }
2619
2620 .abj404-table th,
2621 .abj404-table td {
2622 padding: 12px 8px;
2623 }
2624
2625 /* Hide less important columns on mobile */
2626 .abj404-table .hide-on-mobile {
2627 display: none;
2628 }
2629
2630 .abj404-row-actions {
2631 opacity: 1;
2632 flex-wrap: wrap;
2633 }
2634 }
2635
2636 /* Tablets - hide Created column (Last Used is more useful) */
2637 @media screen and (max-width: 960px) {
2638 .abj404-table .hide-on-tablet {
2639 display: none;
2640 }
2641
2642 /* Smaller badges on tablet */
2643 .abj404-badge,
2644 .abj404-type-badge {
2645 padding: 2px 6px;
2646 font-size: 10px;
2647 }
2648 }
2649
2650 /* Small tablets / large phones */
2651 @media screen and (max-width: 600px) {
2652 .abj404-table th,
2653 .abj404-table td {
2654 padding: 10px 6px;
2655 font-size: 12px;
2656 }
2657
2658 .abj404-url-cell {
2659 font-size: 11px;
2660 }
2661
2662 .abj404-date-cell {
2663 font-size: 11px;
2664 }
2665
2666 /* Stack bulk actions */
2667 .abj404-bulk-actions {
2668 flex-direction: column;
2669 gap: 8px;
2670 }
2671
2672 .abj404-bulk-actions select,
2673 .abj404-bulk-actions .button {
2674 width: 100%;
2675 }
2676 }
2677
2678 /* ============================================
2679 Dark Theme Support for Table Pages
2680 ============================================ */
2681
2682 html[data-theme="neon"] .abj404-table-page,
2683 html[data-theme="obsidian"] .abj404-table-page {
2684 background: var(--abj404-surface);
2685 }
2686
2687 html[data-theme="neon"] .abj404-table tbody tr:nth-child(even),
2688 html[data-theme="obsidian"] .abj404-table tbody tr:nth-child(even) {
2689 background: var(--abj404-row-stripe-soft);
2690 }
2691
2692 html[data-theme="neon"] .abj404-table tbody tr:hover,
2693 html[data-theme="obsidian"] .abj404-table tbody tr:hover {
2694 background: var(--abj404-row-stripe-med);
2695 }
2696
2697 html[data-theme="neon"] .abj404-filter-bar,
2698 html[data-theme="obsidian"] .abj404-filter-bar {
2699 background: var(--abj404-bg);
2700 }
2701
2702 /* ============================================
2703 Logs Page Specific Styles
2704 ============================================ */
2705
2706 .abj404-logs-table {
2707 table-layout: fixed;
2708 }
2709
2710 /* Fixed column widths for the logs table (6 columns: toggle, URL, IP, Referrer, Action, Date) */
2711 .abj404-logs-table thead th:nth-child(1) { width: 32px; } /* Trace toggle */
2712 .abj404-logs-table thead th:nth-child(2) { width: 28%; } /* URL */
2713 .abj404-logs-table thead th:nth-child(3) { width: 10%; } /* IP Address */
2714 .abj404-logs-table thead th:nth-child(4) { width: 22%; } /* Referrer */
2715 .abj404-logs-table thead th:nth-child(5) { width: 22%; } /* Action */
2716 .abj404-logs-table thead th:nth-child(6) { width: auto; } /* Date (takes remaining) */
2717
2718 /* Override the generic first-child 40px checkbox width for the narrow trace toggle */
2719 .abj404-logs-table th:first-child,
2720 .abj404-logs-table td:first-child {
2721 width: 32px;
2722 min-width: 32px;
2723 max-width: 32px;
2724 }
2725
2726 /* Prevent URL/Referrer/Action text from overflowing into adjacent columns */
2727 .abj404-logs-table td {
2728 overflow: hidden;
2729 text-overflow: ellipsis;
2730 }
2731
2732 .abj404-logs-table .abj404-url-cell {
2733 overflow: hidden;
2734 text-overflow: ellipsis;
2735 white-space: nowrap;
2736 }
2737
2738 .abj404-logs-table .abj404-url-cell:hover {
2739 white-space: normal;
2740 word-break: break-all;
2741 }
2742
2743 /* Logs table URL cells use same word-break as regular tables */
2744
2745 .abj404-logs-search-form {
2746 display: flex;
2747 align-items: center;
2748 gap: 8px;
2749 margin: 0;
2750 flex: 1;
2751 min-width: 0;
2752 }
2753
2754 .abj404-logs-search-form input[type="text"],
2755 .abj404-logs-search-form input.ui-autocomplete-input {
2756 flex: 1;
2757 min-width: 120px;
2758 line-height: normal;
2759 }
2760
2761 .abj404-logs-search-form label {
2762 font-weight: 500;
2763 color: var(--abj404-text);
2764 white-space: nowrap;
2765 }
2766
2767 .abj404-ip-cell {
2768 font-family: monospace;
2769 font-size: 12px;
2770 color: var(--abj404-text-muted);
2771 }
2772
2773 .abj404-url-detail {
2774 color: var(--abj404-text-muted);
2775 font-size: 12px;
2776 }
2777
2778 .abj404-action-url {
2779 max-width: 200px;
2780 display: inline-block;
2781 overflow: hidden;
2782 text-overflow: ellipsis;
2783 white-space: nowrap;
2784 vertical-align: bottom;
2785 }
2786
2787 .abj404-text-muted {
2788 color: var(--abj404-text-muted);
2789 }
2790
2791 .abj404-engine-label {
2792 font-size: 11px;
2793 color: var(--abj404-text-muted);
2794 font-style: italic;
2795 }
2796
2797 /* Pipeline trace detail row */
2798 .abj404-trace-th {
2799 width: 28px;
2800 padding: 4px 2px;
2801 }
2802
2803 .abj404-trace-toggle-cell {
2804 width: 28px;
2805 padding: 4px 2px;
2806 text-align: center;
2807 }
2808
2809 .abj404-trace-toggle {
2810 background: none;
2811 border: 1px solid var(--abj404-border);
2812 border-radius: 3px;
2813 cursor: pointer;
2814 font-size: 10px;
2815 padding: 1px 4px;
2816 color: var(--abj404-text-muted);
2817 line-height: 1;
2818 }
2819
2820 .abj404-trace-toggle:disabled {
2821 opacity: 0.3;
2822 cursor: default;
2823 }
2824
2825 .abj404-trace-toggle:not(:disabled):hover {
2826 background: var(--abj404-bg-hover);
2827 }
2828
2829 .abj404-trace-detail td.abj404-trace-detail-cell {
2830 background: var(--abj404-bg-subtle);
2831 padding: 10px 16px;
2832 border-top: none;
2833 }
2834
2835 .abj404-trace-steps {
2836 margin: 0;
2837 padding-left: 0;
2838 list-style: none;
2839 font-size: 13px;
2840 color: var(--abj404-text);
2841 line-height: 1.5;
2842 }
2843
2844 .abj404-trace-steps li {
2845 display: flex;
2846 align-items: baseline;
2847 gap: 8px;
2848 margin-bottom: 4px;
2849 padding: 3px 0;
2850 border-bottom: 1px solid var(--abj404-bg-hover);
2851 }
2852
2853 .abj404-trace-steps li:last-child {
2854 border-bottom: none;
2855 }
2856
2857 .abj404-trace-step-name {
2858 flex: 0 0 auto;
2859 min-width: 180px;
2860 font-weight: 600;
2861 color: var(--abj404-text);
2862 }
2863
2864 .abj404-trace-outcome {
2865 flex: 0 0 auto;
2866 display: inline-block;
2867 padding: 1px 8px;
2868 border-radius: 3px;
2869 font-size: 12px;
2870 font-weight: 500;
2871 }
2872
2873 .abj404-trace-outcome-pass {
2874 background: var(--abj404-success-bg);
2875 color: var(--abj404-success-text);
2876 }
2877
2878 .abj404-trace-outcome-fail {
2879 background: var(--abj404-danger-bg);
2880 color: var(--abj404-danger-text);
2881 }
2882
2883 .abj404-trace-outcome-neutral {
2884 background: var(--abj404-bg-hover);
2885 color: var(--abj404-text-muted);
2886 }
2887
2888 .abj404-trace-outcome-result {
2889 background: var(--abj404-info-bg);
2890 color: var(--abj404-info-text);
2891 }
2892
2893 .abj404-trace-detail-text {
2894 flex: 1 1 auto;
2895 color: var(--abj404-text-muted);
2896 font-size: 12px;
2897 }
2898
2899 .abj404-suggestion-type {
2900 display: inline-block;
2901 font-size: 12px;
2902 color: var(--abj404-text-muted);
2903 margin-left: 6px;
2904 }
2905
2906 .abj404-score-badge {
2907 display: inline-block;
2908 padding: 2px 8px;
2909 border: 1px solid var(--abj404-border);
2910 border-radius: 2px;
2911 background: transparent;
2912 color: inherit;
2913 font-size: 11px;
2914 font-weight: 400;
2915 line-height: 1.5;
2916 }
2917
2918 .abj404-score-high { border-color: var(--abj404-success); }
2919 .abj404-score-medium { border-color: var(--abj404-warning); }
2920 .abj404-score-low { border-color: var(--abj404-danger); }
2921
2922 .abj404-score-manual {
2923 color: var(--abj404-text-muted);
2924 font-size: 14px;
2925 }
2926
2927 .abj404-confidence-cell {
2928 text-align: center;
2929 white-space: nowrap;
2930 }
2931
2932 .abj404-username-label {
2933 font-size: 11px;
2934 color: var(--abj404-accent);
2935 }
2936
2937 /* Empty trash button - use higher specificity to override WordPress .button */
2938 .button.abj404-empty-trash-btn,
2939 a.abj404-empty-trash-btn {
2940 margin-left: auto;
2941 background: var(--abj404-danger-bg) !important;
2942 color: var(--abj404-danger-text) !important;
2943 border-color: var(--abj404-danger-text) !important;
2944 }
2945
2946 .button.abj404-empty-trash-btn:hover,
2947 a.abj404-empty-trash-btn:hover {
2948 background: var(--abj404-danger-text) !important;
2949 color: var(--abj404-on-accent) !important;
2950 border-color: var(--abj404-danger-text) !important;
2951 }
2952
2953 /* ============================================
2954 Options Page Content Styling
2955 ============================================ */
2956
2957 /* Form field rows - each paragraph is a form field group */
2958 .abj404-accordion-content p {
2959 display: flex;
2960 flex-wrap: wrap;
2961 align-items: flex-start;
2962 gap: 8px;
2963 padding: 16px 20px;
2964 margin: 0;
2965 border-bottom: 1px solid var(--abj404-border-light);
2966 background: var(--abj404-surface);
2967 }
2968
2969 .abj404-accordion-content p:last-child {
2970 border-bottom: none;
2971 }
2972
2973 /* Alternate row coloring for better readability */
2974 .abj404-accordion-content p:nth-child(even) {
2975 background: var(--abj404-surface-alt);
2976 }
2977
2978 /* Labels in form fields */
2979 .abj404-accordion-content p > label:first-child,
2980 .abj404-accordion-content p > label[for] {
2981 flex: 0 0 280px;
2982 font-weight: 600;
2983 color: var(--abj404-text);
2984 padding-top: 4px;
2985 }
2986
2987 /* Inputs and selects */
2988 .abj404-accordion-content input[type="text"],
2989 .abj404-accordion-content input[type="number"],
2990 .abj404-accordion-content select {
2991 padding: 6px 10px;
2992 border: 1px solid var(--abj404-border);
2993 border-radius: 4px;
2994 background: var(--abj404-input-bg);
2995 color: var(--abj404-text);
2996 font-size: 14px;
2997 transition: border-color 0.2s ease, box-shadow 0.2s ease;
2998 }
2999
3000 .abj404-accordion-content input[type="text"]:focus,
3001 .abj404-accordion-content input[type="number"]:focus,
3002 .abj404-accordion-content select:focus {
3003 border-color: var(--abj404-primary);
3004 box-shadow: 0 0 0 1px var(--abj404-primary);
3005 outline: none;
3006 }
3007
3008 /* Checkboxes - align better */
3009 .abj404-accordion-content input[type="checkbox"] {
3010 margin-top: 5px;
3011 width: 18px;
3012 height: 18px;
3013 cursor: pointer;
3014 }
3015
3016 /* Help text styling - target BR followed by text */
3017 .abj404-accordion-content p br {
3018 display: none;
3019 }
3020
3021 /* Style inline help text that follows inputs */
3022 .abj404-accordion-content p > br + text,
3023 .abj404-accordion-content p::after {
3024 flex-basis: 100%;
3025 font-size: 13px;
3026 color: var(--abj404-text-muted);
3027 line-height: 1.5;
3028 padding-left: 288px;
3029 margin-top: 4px;
3030 }
3031
3032 /* Tables in options - modernize the old border=1 tables */
3033 .abj404-accordion-content table {
3034 width: 100%;
3035 border-collapse: separate;
3036 border-spacing: 0;
3037 border: 1px solid var(--abj404-border);
3038 border-radius: 4px;
3039 overflow: hidden;
3040 margin: 0;
3041 }
3042
3043 .abj404-accordion-content table tr {
3044 background: var(--abj404-surface);
3045 }
3046
3047 .abj404-accordion-content table tr:nth-child(even) {
3048 background: var(--abj404-surface-alt);
3049 }
3050
3051 .abj404-accordion-content table td {
3052 padding: 16px 20px;
3053 vertical-align: top;
3054 border-bottom: 1px solid var(--abj404-border-light);
3055 border-right: 1px solid var(--abj404-border-light);
3056 }
3057
3058 .abj404-accordion-content table tr:last-child td {
3059 border-bottom: none;
3060 }
3061
3062 .abj404-accordion-content table td:last-child {
3063 border-right: none;
3064 }
3065
3066 /* First column (labels) in table */
3067 .abj404-accordion-content table td:first-child {
3068 width: 45%;
3069 font-weight: 500;
3070 color: var(--abj404-text);
3071 background: var(--abj404-surface-alt);
3072 }
3073
3074 /* Second column (inputs) in table */
3075 .abj404-accordion-content table td:last-child {
3076 width: 55%;
3077 }
3078
3079 /* Textareas in tables */
3080 .abj404-accordion-content textarea {
3081 width: 100%;
3082 min-height: 120px;
3083 padding: 12px;
3084 border: 1px solid var(--abj404-border);
3085 border-radius: 4px;
3086 background: var(--abj404-input-bg);
3087 color: var(--abj404-text);
3088 font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
3089 font-size: 13px;
3090 line-height: 1.5;
3091 resize: vertical;
3092 transition: border-color 0.2s ease, box-shadow 0.2s ease;
3093 }
3094
3095 .abj404-accordion-content textarea:focus {
3096 border-color: var(--abj404-primary);
3097 box-shadow: 0 0 0 1px var(--abj404-primary);
3098 outline: none;
3099 }
3100
3101 /* Lists in options (bullet points) */
3102 .abj404-accordion-content ul {
3103 margin: 8px 0;
3104 padding-left: 20px;
3105 list-style-type: disc;
3106 }
3107
3108 .abj404-accordion-content ul li {
3109 margin-bottom: 4px;
3110 color: var(--abj404-text-muted);
3111 font-size: 13px;
3112 line-height: 1.5;
3113 }
3114
3115 .abj404-accordion-content ul li.closeLI {
3116 margin-bottom: 2px;
3117 }
3118
3119 /* Warning text (red warnings) */
3120 .abj404-accordion-content div[style*="color: red"],
3121 .abj404-accordion-content div[style*="color:red"] {
3122 background: var(--abj404-danger-bg) !important;
3123 color: var(--abj404-danger-text) !important;
3124 padding: 12px 16px !important;
3125 border-radius: 4px !important;
3126 border-left: 4px solid var(--abj404-danger-text) !important;
3127 margin: 12px 0 !important;
3128 font-weight: 500 !important;
3129 }
3130
3131 /* Note text */
3132 .abj404-accordion-content td br + text,
3133 .abj404-accordion-content p br + text {
3134 font-size: 13px;
3135 color: var(--abj404-text-muted);
3136 }
3137
3138 /* Info/help section at top of sections */
3139 .abj404-accordion-content > p:first-child {
3140 background: var(--abj404-surface-alt);
3141 border-left: 4px solid var(--abj404-primary);
3142 }
3143
3144 /* Horizontal rule/separator styling */
3145 .abj404-accordion-content hr {
3146 border: none;
3147 border-top: 1px solid var(--abj404-border-light);
3148 margin: 16px 0;
3149 }
3150
3151 /* DB version info and similar technical info */
3152 .abj404-accordion-content p:has(> label:empty),
3153 .abj404-accordion-content p:first-of-type:not(:has(label[for])) {
3154 font-size: 13px;
3155 color: var(--abj404-text-muted);
3156 background: var(--abj404-surface-alt);
3157 padding: 12px 20px;
3158 border-radius: 4px;
3159 margin-bottom: 16px;
3160 }
3161
3162 /* Mobile responsive adjustments */
3163 @media screen and (max-width: 782px) {
3164 .abj404-accordion-content p {
3165 flex-direction: column;
3166 padding: 12px 16px;
3167 }
3168
3169 .abj404-accordion-content p > label:first-child,
3170 .abj404-accordion-content p > label[for] {
3171 flex: none;
3172 width: 100%;
3173 margin-bottom: 8px;
3174 }
3175
3176 .abj404-accordion-content table td {
3177 display: block;
3178 width: 100% !important;
3179 padding: 12px 16px;
3180 }
3181
3182 .abj404-accordion-content table td:first-child {
3183 border-bottom: none;
3184 padding-bottom: 8px;
3185 }
3186
3187 .abj404-accordion-content textarea {
3188 min-height: 100px;
3189 }
3190 }
3191
3192 /* Dark theme adjustments for options */
3193 html[data-theme="neon"] .abj404-accordion-content p:nth-child(even),
3194 html[data-theme="obsidian"] .abj404-accordion-content p:nth-child(even) {
3195 background: var(--abj404-row-stripe-soft);
3196 }
3197
3198 html[data-theme="neon"] .abj404-accordion-content table td:first-child,
3199 html[data-theme="obsidian"] .abj404-accordion-content table td:first-child {
3200 background: var(--abj404-cell-stripe);
3201 }
3202
3203 html[data-theme="neon"] .abj404-accordion-content table tr:nth-child(even),
3204 html[data-theme="obsidian"] .abj404-accordion-content table tr:nth-child(even) {
3205 background: var(--abj404-row-stripe-soft);
3206 }
3207
3208 html[data-theme="neon"] .abj404-accordion-content textarea,
3209 html[data-theme="obsidian"] .abj404-accordion-content textarea,
3210 html[data-theme="neon"] .abj404-accordion-content input[type="text"],
3211 html[data-theme="obsidian"] .abj404-accordion-content input[type="text"],
3212 html[data-theme="neon"] .abj404-accordion-content select,
3213 html[data-theme="obsidian"] .abj404-accordion-content select {
3214 background: var(--abj404-input-bg);
3215 border-color: var(--abj404-border);
3216 }
3217
3218 /* Autocomplete dropdown field (redirect to) styling */
3219 /* Redirect field wrapper in accordion */
3220 .abj404-accordion-content .abj404-redirect-to-field {
3221 padding: 0 20px;
3222 }
3223
3224 .abj404-accordion-content .abj404-input-row {
3225 display: flex;
3226 align-items: center;
3227 gap: 8px;
3228 margin-bottom: 8px;
3229 }
3230
3231 .abj404-accordion-content label.add_a_redirect_label,
3232 .abj404-accordion-content label.add_exclude_page_field_label {
3233 display: block;
3234 font-weight: 600;
3235 color: var(--abj404-text);
3236 margin-bottom: 8px;
3237 padding: 16px 20px 0;
3238 }
3239
3240 .abj404-accordion-content #redirect_to_user_field,
3241 .abj404-accordion-content input#add_exclude_page_field {
3242 padding: 8px 12px;
3243 border: 1px solid var(--abj404-border);
3244 border-radius: 4px;
3245 font-size: 14px;
3246 width: 50% !important;
3247 max-width: 400px;
3248 }
3249
3250 .abj404-accordion-content #redirect_to_user_field:focus,
3251 .abj404-accordion-content input#add_exclude_page_field:focus {
3252 border-color: var(--abj404-primary);
3253 box-shadow: 0 0 0 1px var(--abj404-primary);
3254 outline: none;
3255 }
3256
3257 /* Loading spinner for accordion autocomplete */
3258 .abj404-accordion-content #redirect_to_user_field.ui-autocomplete-loading {
3259 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");
3260 background-color: var(--abj404-surface);
3261 background-repeat: no-repeat;
3262 background-position: right 10px center;
3263 background-size: 16px 16px;
3264 padding-right: 36px;
3265 }
3266
3267 /* Tooltip styling for autocomplete field */
3268 .abj404-accordion-content .lefty-tooltip {
3269 display: inline-flex;
3270 align-items: center;
3271 justify-content: center;
3272 width: 20px;
3273 height: 20px;
3274 background: var(--abj404-surface-alt);
3275 border: 1px solid var(--abj404-border);
3276 border-radius: 50%;
3277 font-size: 12px;
3278 font-weight: 600;
3279 color: var(--abj404-text-muted);
3280 cursor: help;
3281 vertical-align: middle;
3282 }
3283
3284 /* Explanation text below autocomplete */
3285 .abj404-accordion-content #redirect_to_user_field_explanation {
3286 display: block;
3287 font-size: 13px;
3288 color: var(--abj404-text-muted);
3289 margin-bottom: 16px;
3290 font-style: italic;
3291 }
3292
3293 /* Warning text styling */
3294 .abj404-accordion-content #redirect_to_user_field_warning {
3295 display: block;
3296 font-size: 13px;
3297 font-style: italic;
3298 font-weight: bold;
3299 color: var(--abj404-danger-text);
3300 margin-bottom: 8px;
3301 }
3302
3303 /* Section title styling for text without labels */
3304 .abj404-accordion-content > label[for] > br:first-of-type {
3305 display: block;
3306 margin-bottom: 8px;
3307 }
3308
3309 /* Make table label cells have better typography */
3310 .abj404-accordion-content table td:first-child label {
3311 font-weight: 600;
3312 font-size: 14px;
3313 color: var(--abj404-text);
3314 display: block;
3315 margin-bottom: 8px;
3316 }
3317
3318 /* Style the explanation paragraph in 404 Page Suggestions */
3319 .abj404-accordion-content > p:first-child:not(:has(label)) {
3320 background: var(--abj404-info-bg);
3321 border-left: 4px solid var(--abj404-primary);
3322 padding: 16px 20px;
3323 margin: 0 0 16px;
3324 line-height: 1.6;
3325 font-size: 14px;
3326 color: var(--abj404-text);
3327 }
3328
3329 /* Add bottom border to first row intro text */
3330 .abj404-accordion-content > p:first-child {
3331 border-bottom: 1px solid var(--abj404-border-light);
3332 }
3333
3334 /* Make inline styles in table cells less prominent */
3335 .abj404-accordion-content table td div[style*="display: inline"] {
3336 color: var(--abj404-text-muted);
3337 }
3338
3339 /* Note text below textareas in table cells */
3340 .abj404-accordion-content table td:last-child > br + text,
3341 .abj404-accordion-content table td:last-child > textarea + br + text {
3342 display: block;
3343 margin-top: 8px;
3344 font-size: 13px;
3345 color: var(--abj404-text-muted);
3346 }
3347
3348 /* Closeable list items for exclude pages */
3349 .abj404-accordion-content .closeable-ul {
3350 list-style: none;
3351 padding: 0;
3352 margin: 0;
3353 }
3354
3355 .abj404-accordion-content .closeable-ul li {
3356 display: inline-flex;
3357 align-items: center;
3358 gap: 4px;
3359 background: var(--abj404-surface-alt);
3360 padding: 4px 8px;
3361 border-radius: 4px;
3362 margin: 4px;
3363 font-size: 13px;
3364 }
3365
3366 /* Better styling for button groups */
3367 .abj404-accordion-content button,
3368 .abj404-accordion-content input[type="button"] {
3369 padding: 6px 12px;
3370 border: 1px solid var(--abj404-border);
3371 border-radius: 4px;
3372 background: var(--abj404-surface);
3373 color: var(--abj404-text);
3374 font-size: 13px;
3375 cursor: pointer;
3376 transition: all 0.2s ease;
3377 }
3378
3379 .abj404-accordion-content button:hover,
3380 .abj404-accordion-content input[type="button"]:hover {
3381 background: var(--abj404-surface-hover);
3382 border-color: var(--abj404-primary);
3383 }
3384
3385 /* Delete Debug File button - danger styling */
3386 .abj404-accordion-content input#deleteDebugFile,
3387 #deleteDebugFile {
3388 background: var(--abj404-danger-bg) !important;
3389 border: 1px solid var(--abj404-danger) !important;
3390 color: var(--abj404-danger) !important;
3391 font-weight: 500 !important;
3392 padding: 8px 16px !important;
3393 border-radius: 4px !important;
3394 cursor: pointer !important;
3395 }
3396
3397 .abj404-accordion-content input#deleteDebugFile:hover,
3398 #deleteDebugFile:hover {
3399 background: var(--abj404-danger) !important;
3400 color: var(--abj404-on-accent) !important;
3401 border-color: var(--abj404-danger) !important;
3402 }
3403
3404 /* Links inside card content - style as action links */
3405 .abj404-card-content p a,
3406 .abj404-card-content td a {
3407 color: var(--abj404-primary) !important;
3408 text-decoration: none !important;
3409 font-weight: 500 !important;
3410 padding: 6px 12px !important;
3411 border: 1px solid var(--abj404-primary) !important;
3412 border-radius: 4px !important;
3413 background: var(--abj404-info-bg) !important;
3414 transition: all 0.2s ease !important;
3415 display: inline-block !important;
3416 margin-right: 8px !important;
3417 }
3418
3419 .abj404-card-content p a:hover,
3420 .abj404-card-content td a:hover {
3421 background: var(--abj404-primary) !important;
3422 color: var(--abj404-on-accent) !important;
3423 }
3424
3425 /* ============================================
3426 Accessibility: Link-styled Buttons
3427 ============================================ */
3428
3429 .abj404-link-button {
3430 background: none;
3431 border: none;
3432 padding: 0;
3433 font: inherit;
3434 color: var(--abj404-accent);
3435 text-decoration: none;
3436 cursor: pointer;
3437 }
3438
3439 .abj404-link-button:hover {
3440 text-decoration: underline;
3441 color: var(--abj404-accent-hover);
3442 }
3443
3444 .abj404-link-button:focus {
3445 outline: 2px solid var(--abj404-accent);
3446 outline-offset: 2px;
3447 border-radius: 2px;
3448 }
3449
3450 /* ============================================
3451 Accessibility: Focus Indicators
3452 ============================================ */
3453
3454 /* Visible focus indicators for all interactive elements */
3455 a:focus-visible,
3456 button:focus-visible,
3457 input:focus-visible,
3458 select:focus-visible,
3459 textarea:focus-visible,
3460 [tabindex]:focus-visible,
3461 .abj404-tab:focus-visible,
3462 .abj404-page-btn:focus-visible,
3463 .abj404-btn:focus-visible,
3464 .abj404-action-link:focus-visible {
3465 outline: 2px solid var(--abj404-accent);
3466 outline-offset: 2px;
3467 }
3468
3469 /* Remove focus outline removal for tabs - they should have visible focus */
3470 .abj404-tab:focus {
3471 outline: 2px solid var(--abj404-accent);
3472 outline-offset: -2px;
3473 box-shadow: none;
3474 }
3475
3476 /* Ensure checkboxes have visible focus */
3477 input[type="checkbox"]:focus-visible {
3478 outline: 2px solid var(--abj404-accent);
3479 outline-offset: 2px;
3480 }
3481
3482 /* Table header links focus */
3483 .abj404-table th a:focus-visible {
3484 outline: 2px solid var(--abj404-accent);
3485 outline-offset: 2px;
3486 border-radius: 2px;
3487 }
3488
3489 /* Modal close button focus */
3490 .abj404-modal-close:focus-visible {
3491 outline: 2px solid var(--abj404-accent);
3492 outline-offset: 2px;
3493 }
3494
3495 /* ============================================
3496 Accessibility: Screen Reader Utilities
3497 ============================================ */
3498
3499 /* Visually hidden but accessible to screen readers */
3500 .screen-reader-text,
3501 .abj404-sr-only {
3502 position: absolute;
3503 width: 1px;
3504 height: 1px;
3505 padding: 0;
3506 margin: -1px;
3507 overflow: hidden;
3508 clip: rect(0, 0, 0, 0);
3509 white-space: nowrap;
3510 border: 0;
3511 }
3512
3513 /* Skip link styles - visible when focused */
3514 .abj404-skip-link {
3515 position: absolute;
3516 top: -40px;
3517 left: 0;
3518 background: var(--abj404-accent);
3519 color: var(--abj404-on-accent);
3520 padding: 8px 16px;
3521 z-index: 100001;
3522 text-decoration: none;
3523 font-weight: 500;
3524 }
3525
3526 .abj404-skip-link:focus {
3527 top: 0;
3528 }
3529
3530 /* Live region for announcements */
3531 .abj404-live-region {
3532 position: absolute;
3533 width: 1px;
3534 height: 1px;
3535 padding: 0;
3536 margin: -1px;
3537 overflow: hidden;
3538 clip: rect(0, 0, 0, 0);
3539 white-space: nowrap;
3540 border: 0;
3541 }
3542
3543 /* ============================================
3544 Accessibility: Reduced Motion
3545 ============================================ */
3546
3547 @media (prefers-reduced-motion: reduce) {
3548 *,
3549 *::before,
3550 *::after {
3551 animation-duration: 0.01ms !important;
3552 animation-iteration-count: 1 !important;
3553 transition-duration: 0.01ms !important;
3554 scroll-behavior: auto !important;
3555 }
3556
3557 /* Disable specific animations */
3558 .abj404-toast,
3559 .abj404-modal-content,
3560 .abj404-spinner,
3561 .abj404-collapse-icon,
3562 .abj404-accordion-toggle {
3563 animation: none !important;
3564 transition: none !important;
3565 }
3566
3567 /* jQuery slideUp/slideDown alternatives - instant show/hide */
3568 .abj404-accordion-content {
3569 transition: none !important;
3570 }
3571 }
3572
3573 /* ============================================
3574 Accessibility: High Contrast Mode Support
3575 ============================================ */
3576
3577 @media (forced-colors: active) {
3578 .abj404-badge,
3579 .abj404-type-badge {
3580 border: 1px solid currentColor;
3581 }
3582
3583 .abj404-btn,
3584 .abj404-page-btn {
3585 border: 2px solid currentColor;
3586 }
3587
3588 .abj404-table th,
3589 .abj404-table td {
3590 border: 1px solid currentColor;
3591 }
3592 }
3593
3594 /* ============================================
3595 Tools Diagnostics
3596 ============================================ */
3597
3598 .abj404-diagnostics-summary table td {
3599 vertical-align: middle;
3600 }
3601
3602 .abj404-status-pill {
3603 display: inline-block;
3604 padding: 2px 8px;
3605 border: 1px solid var(--abj404-border);
3606 border-radius: 2px;
3607 background: transparent;
3608 color: inherit;
3609 font-size: 11px;
3610 font-weight: 400;
3611 line-height: 1.5;
3612 }
3613
3614 .abj404-pill-success { border-color: var(--abj404-success); }
3615 .abj404-pill-warning { border-color: var(--abj404-warning); }
3616 .abj404-pill-info { border-color: var(--abj404-info); }
3617
3618 /* ── Advanced Options collapsible (Edit Redirect page) ─────────────────── */
3619
3620 .abj404-advanced-options {
3621 margin: 16px 0;
3622 border: 1px solid var(--abj404-border);
3623 border-radius: 4px;
3624 background: var(--abj404-bg);
3625 }
3626
3627 .abj404-advanced-options__summary {
3628 padding: 10px 16px;
3629 font-weight: 600;
3630 font-size: 13px;
3631 cursor: pointer;
3632 user-select: none;
3633 list-style: none;
3634 display: flex;
3635 align-items: center;
3636 gap: 6px;
3637 }
3638
3639 .abj404-advanced-options__summary::-webkit-details-marker {
3640 display: none;
3641 }
3642
3643 .abj404-advanced-options__summary::before {
3644 content: '';
3645 font-size: 10px;
3646 transition: transform 0.15s ease;
3647 display: inline-block;
3648 }
3649
3650 .abj404-advanced-options[open] > .abj404-advanced-options__summary::before {
3651 transform: rotate(90deg);
3652 }
3653
3654 .abj404-advanced-options__body {
3655 padding: 20px 28px 24px;
3656 border-top: 1px solid var(--abj404-border);
3657 }
3658
3659 /* ── GSC Guided Setup UI ──────────────────────────────────────────────── */
3660
3661 /* Wizard steps list */
3662 .abj404-wizard-steps {
3663 margin: 12px 0 16px 0;
3664 padding-left: 20px;
3665 }
3666 .abj404-wizard-steps li {
3667 margin-bottom: 10px;
3668 line-height: 1.5;
3669 }
3670
3671 /* Copy-URI widget */
3672 .abj404-copy-uri-wrap {
3673 display: flex;
3674 align-items: center;
3675 gap: 8px;
3676 margin-top: 6px;
3677 }
3678 .abj404-copy-uri-wrap code {
3679 flex: 1;
3680 padding: 5px 8px;
3681 background: var(--abj404-bg-muted);
3682 border: 1px solid var(--abj404-border);
3683 border-radius: 3px;
3684 font-size: 12px;
3685 word-break: break-all;
3686 }
3687 .abj404-copy-btn {
3688 padding: 4px 10px;
3689 font-size: 12px;
3690 cursor: pointer;
3691 white-space: nowrap;
3692 }
3693 .abj404-copy-btn--done {
3694 color: var(--abj404-success);
3695 border-color: var(--abj404-success);
3696 }
3697
3698 /* GSC status: native bordered-label pattern */
3699 .abj404-gsc-status {
3700 display: inline-flex;
3701 align-items: center;
3702 gap: 6px;
3703 padding: 2px 8px;
3704 border: 1px solid var(--abj404-border);
3705 border-radius: 2px;
3706 background: transparent;
3707 color: inherit;
3708 font-size: 11px;
3709 font-weight: 400;
3710 line-height: 1.5;
3711 margin-bottom: 12px;
3712 }
3713 .abj404-gsc-status--green { border-color: var(--abj404-success); }
3714 .abj404-gsc-status--amber { border-color: var(--abj404-warning); }
3715
3716 /* Error box */
3717 .abj404-gsc-error-box {
3718 background: var(--abj404-danger-bg);
3719 border: 1px solid var(--abj404-danger-border);
3720 border-radius: 4px;
3721 padding: 12px 16px;
3722 margin-bottom: 16px;
3723 color: var(--abj404-danger-text);
3724 }
3725 .abj404-gsc-error-box p {
3726 margin: 0 0 8px;
3727 }
3728 .abj404-gsc-error-box p:last-child {
3729 margin-bottom: 0;
3730 }
3731
3732 /* ============================================
3733 Behavior Tiles (404 Destination)
3734 ============================================ */
3735
3736 .abj404-behavior-tiles {
3737 margin: 0;
3738 }
3739
3740 .abj404-tiles-grid {
3741 display: grid;
3742 grid-template-columns: 1fr 1fr;
3743 gap: 12px;
3744 }
3745
3746 @media (max-width: 600px) {
3747 .abj404-tiles-grid {
3748 grid-template-columns: 1fr;
3749 }
3750 }
3751
3752 .abj404-tile {
3753 position: relative;
3754 border: 2px solid var(--abj404-border);
3755 border-radius: 8px;
3756 padding: 20px 16px 16px;
3757 cursor: pointer;
3758 transition: border-color 0.15s, background-color 0.15s, box-shadow 0.15s;
3759 background: var(--abj404-surface);
3760 text-align: center;
3761 }
3762
3763 .abj404-tile:hover {
3764 border-color: var(--abj404-primary);
3765 box-shadow: 0 0 0 1px var(--abj404-primary);
3766 }
3767
3768 .abj404-tile:focus {
3769 outline: 2px solid var(--abj404-primary);
3770 outline-offset: 2px;
3771 }
3772
3773 .abj404-tile.selected {
3774 border-color: var(--abj404-primary);
3775 background: color-mix(in srgb, var(--abj404-primary) 6%, var(--abj404-surface));
3776 box-shadow: 0 0 0 1px var(--abj404-primary);
3777 }
3778
3779 .abj404-tile-badge {
3780 display: none;
3781 position: absolute;
3782 top: -10px;
3783 right: 12px;
3784 padding: 2px 8px;
3785 border: 1px solid var(--abj404-primary);
3786 border-radius: 2px;
3787 background: var(--abj404-surface);
3788 color: inherit;
3789 font-size: 11px;
3790 font-weight: 400;
3791 line-height: 1.5;
3792 text-transform: uppercase;
3793 letter-spacing: 0.5px;
3794 }
3795
3796 .abj404-tile[data-behavior="suggest"] .abj404-tile-badge {
3797 display: block;
3798 }
3799
3800 .abj404-tile-icon {
3801 margin-bottom: 8px;
3802 color: var(--abj404-text-secondary);
3803 }
3804
3805 .abj404-tile.selected .abj404-tile-icon {
3806 color: var(--abj404-primary);
3807 }
3808
3809 .abj404-tile-title {
3810 font-size: 14px;
3811 font-weight: 600;
3812 margin: 0 0 4px;
3813 color: var(--abj404-text);
3814 }
3815
3816 .abj404-tile-desc {
3817 font-size: 12px;
3818 line-height: 1.4;
3819 margin: 0;
3820 color: var(--abj404-text-secondary);
3821 }
3822
3823 .abj404-custom-page-picker {
3824 margin-top: 12px;
3825 padding: 12px 16px;
3826 background: var(--abj404-bg-subtle);
3827 border-radius: 6px;
3828 border: 1px solid var(--abj404-border);
3829 }
3830
3831 /* Health status bar on Redirects landing page */
3832 .abj404-health-bar {
3833 display: flex;
3834 align-items: center;
3835 gap: 8px;
3836 padding: 10px 16px;
3837 margin-bottom: 12px;
3838 background: var(--abj404-bg-subtle);
3839 border: 1px solid var(--abj404-border);
3840 border-radius: 6px;
3841 font-size: 13px;
3842 color: var(--abj404-text);
3843 }
3844
3845 .abj404-health-bar a {
3846 margin-left: 4px;
3847 }
3848
3849 .abj404-health-dot {
3850 display: inline-block;
3851 width: 10px;
3852 height: 10px;
3853 border-radius: 50%;
3854 flex-shrink: 0;
3855 }
3856
3857 .abj404-health-green {
3858 background: var(--abj404-success);
3859 }
3860
3861 .abj404-health-yellow {
3862 background: var(--abj404-warning);
3863 }
3864
3865 /* Used while the logs_hits rollup is being rebuilt: we don't know whether
3866 captured URLs need attention yet, so render an intentional muted dot
3867 instead of an uncolored (visually broken) circle. WordPress admin gray. */
3868 .abj404-health-gray {
3869 background: var(--abj404-text-muted);
3870 }
3871
3872 /* Header text wrapper — heading + guidance on same line */
3873 .abj404-table-header-text {
3874 display: flex;
3875 align-items: baseline;
3876 gap: 24px;
3877 }
3878
3879 /* Guidance text next to page headings (Simple mode) */
3880 .abj404-guidance-subtitle {
3881 font-size: 13px;
3882 color: var(--abj404-text);
3883 font-weight: 400;
3884 line-height: 1.5;
3885 margin: 0;
3886 padding: 6px 12px;
3887 background: var(--abj404-bg-subtle);
3888 border-left: 3px solid var(--abj404-accent);
3889 border-radius: 2px;
3890 }
3891
3892 /* Suggested destination block on edit page */
3893 .abj404-hidden {
3894 display: none !important;
3895 }
3896
3897 .abj404-suggestion-block {
3898 padding: 16px;
3899 margin-bottom: 16px;
3900 background: var(--abj404-info-bg);
3901 border: 1px solid var(--abj404-border);
3902 border-radius: 6px;
3903 }
3904
3905 .abj404-suggestion-label {
3906 font-size: 12px;
3907 font-weight: 600;
3908 text-transform: uppercase;
3909 letter-spacing: 0.5px;
3910 color: var(--abj404-text-muted);
3911 margin-bottom: 8px;
3912 }
3913
3914 .abj404-suggestion-content {
3915 display: flex;
3916 align-items: center;
3917 gap: 10px;
3918 margin-bottom: 12px;
3919 font-size: 15px;
3920 }
3921
3922 .abj404-suggestion-actions {
3923 display: flex;
3924 gap: 8px;
3925 }
3926
3927 body.abj404-dark-mode .abj404-guidance-subtitle {
3928 color: var(--abj404-dark-text-soft);
3929 background: var(--abj404-bg-subtle);
3930 border-left-color: var(--abj404-dark-accent-border);
3931 }
3932
3933 body.abj404-dark-mode .abj404-suggestion-block {
3934 background: var(--abj404-dark-surface-deep);
3935 border-color: var(--abj404-dark-border-deep);
3936 }
3937
3938 body.abj404-dark-mode .abj404-suggestion-label {
3939 color: var(--abj404-dark-text-muted);
3940 }
3941