PluginProbe
MLSImport: IDX Plugin & MLS Plugin for Real Estate Listings / 7.1
MLSImport: IDX Plugin & MLS Plugin for Real Estate Listings v7.1
7.2 7.1.2 7.1.1 7.1 7.0.4 7.0.6 7.0.7 6.3.8 6.3.7 6.3.6 6.3.5 6.3.4 6.3.3 6.3.1 trunk 5.7.3 5.7.5 5.8.1 5.8.2 5.8.3 5.8.4 5.8.6 6.0.4 6.0.5 6.0.7 All 35 releases
mlsimport / admin / css / mlsimport-admin.css

mlsimport-admin.css in MLSImport: IDX Plugin & MLS Plugin for Real Estate Listings 7.1, at admin/css/mlsimport-admin.css

1,628 lines 44.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1
2 /*
3 * mlsimport-admin.css
4 * ---------------------------------------------------------------------------
5 * Main admin stylesheet for the MLSImport plugin. Styles the wp-admin screens:
6 * the import-task metaboxes, plugin settings/tools UI, field-mapping fieldsets,
7 * progress bars and log viewer, the 2025 card/tab layout, custom form controls
8 * (switches, styled checkboxes, pill buttons), the deactivation exit-survey
9 * modal, and the activity-log / import-history banners.
10 * Also carries a few per-theme admin tweaks (WpResidence, WpEstate, Houzez,
11 * Real Homes) grouped under their own section headers below.
12 * CSS custom properties (design tokens) live in the :root block.
13 */
14
15 /* Base styling */
16 /* Design tokens: "Sunny Bento" palette shared with the mlsimport.com portal —
17 warm near-black primary, orange accent, cream/warm-grey surfaces, pastel
18 status colours (mint/butter/soft-red), soft shadows and rounded radii. */
19 :root {
20 --primary-color: #1c1917;
21 --primary-hover: #33302b;
22 --accent-color: #e85d3c;
23 --accent-soft: #fde4d8;
24 --success-color: #2faa6a;
25 --success-soft: #b8e6cc;
26 --success-deep: #1c5c3a;
27 --error-color: #c02617;
28 --error-soft: #fbe6e3;
29 --error-hover: #9a1e12;
30 --warning-color: #dd9211;
31 --warning-soft: #fae39a;
32 --warning-deep: #7a5410;
33 --text-primary: #1c1917;
34 --text-secondary: #6b6358;
35 --text-light: #9a9285;
36 --border-color: rgba(28,25,23,0.12);
37 --background-light: #faf8f3;
38 --background-soft: #f3efe7;
39 --background-white: #FFFFFF;
40 --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
41 --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
42 --border-radius: 10px;
43 --radius-card: 18px;
44 --radius-pill: 999px;
45 --transition-speed: 0.2s;
46 }
47
48 /* Cream page canvas on the plugin's own admin screens only (menu/submenu pages
49 whose body class contains "_page_mlsimport", plus the Import Tasks CPT list).
50 Other wp-admin screens keep the core grey background. */
51 body.wp-admin[class*="_page_mlsimport"],
52 body.wp-admin.post-type-mlsimport_item {
53 background: var(--background-light);
54 }
55
56
57
58
59 /*Real Homes admin adjusments*/
60
61 /* Constrain the thumbnail column image on the Real Homes property list table. */
62 .post-type-property .column-property-thumbnail img{
63 width: 130px;
64 height: auto;
65 }
66
67
68
69 /*Plugin CSS*/
70
71
72
73
74
75
76
77 /* Field-mapping row title. */
78 .mlsfield_import_title {
79 margin: 0px 0px 10px 0px;
80 font-size: 15px;
81 }
82
83 .mandatory_fields_wrapper_exp,
84 .mls_mandatory_fields{
85 margin: 10px 0px 5px 0px;
86 }
87
88 .mls_mandatory_fields{
89 color: #6b6358;
90 margin-bottom: 10px;
91 max-width: 600px;
92 }
93 .mandatory_fields_wrapper_exp{
94 color: #6b6358;
95 max-width: 600px;
96 }
97
98 /* Form field label (note: overridden later by the 2025 .mlsimport-label rule). */
99 .mlsimport-label{
100 font-weight: 600;
101 display: inline-block;
102 float: left;
103 width: 100%;
104 line-height: 1.6em;
105 font-size: 14px;
106 }
107
108 /* Helper / explanation text under fields. */
109 .mls_explanations{
110 line-height: 1.6em;
111 }
112
113 .mlsimport-fieldset.mlsfield_map_post_meta,
114 .mlsimport-fieldset.mlsfield_label{
115 margin: 0px;
116 }
117
118 .mlsimport-fieldset select.mlsfield_map_post_tax_select{
119 max-width: 200px;
120 min-width: 200px;
121 padding: 0px 12px
122 }
123
124 input.mlsimport_select_import_all,
125 input.mlsimport_select_import_admin_all{
126 margin-top: 5px;
127 }
128
129 .mlsimport-exp{
130 margin: 0px;
131 font-size: 14px;
132 line-height: 1.6em;
133 margin-bottom: 5px;
134 max-width: 450px;
135 }
136
137
138 .mlsimport_hidden_field_button{
139
140 }
141
142 .mlsimport-input-wrapper{
143 clear: both;
144 }
145
146
147 #mlsimport_mls_name_front{
148 border-color: rgba(28,25,23,0.18);
149 min-width: 450px;
150 padding: 5px 12px;
151 }
152
153
154
155
156 /* Styled dropdown used in field mapping/settings: bordered, rounded, subtle shadow. */
157 .wp-admin select.mlsimport-select{
158 max-width: 450px;
159 padding: 5px 12px;
160 width: 100%;
161 box-sizing: border-box;
162 display: inline-flex;
163 flex-direction: column;
164 align-items: flex-start;
165 isolation: isolate;
166 border: 1px solid rgba(28,25,23,0.18);
167 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
168 border-radius: 8px;
169 flex: none;
170 align-self: stretch;
171 }
172 .wp-admin select.mlsimport-select option{
173 padding: 3px 0px;
174 }
175
176 /* Grey rounded panel wrapping a group of import parameters. */
177 .mlsimport_param_wrapper{
178 background-color: #f3efe7;
179 padding:20px;
180 border-radius: 14px;
181 }
182
183 .postbox .inside .mlsimport_param_wrapper h2{
184 font-size: 20px!important;
185 font-weight: 600;
186 padding-left: 0px!important;
187 padding-bottom: 19px!important;
188 }
189
190
191 /* Field-mapping layout: each item is a vertical column; wrapper lays items in a
192 horizontal flex row with spacing. */
193 .mlsimport-fieldset-item{
194 display: flex;
195 flex-direction: column;
196 }
197 .mlsimport-fieldset-wrapper{
198 display: flex;
199 gap:30px;
200 }
201
202 .mlsimport-fieldset{
203 margin: 20px 0px;
204 position: relative;
205 }
206
207 .mandatory_fields_wrapper fieldset.mlsimport-fieldset{
208 padding: 10px 20px;
209 margin: 0px;
210 }
211
212 /* Zebra-stripe alternating fieldsets in the mandatory-fields list. */
213 .mandatory_fields_wrapper .mlsimport-fieldset:nth-child(even){
214 background-color: #f3efe7;
215 }
216
217 .mlsimport_auto_switch{
218 margin: 0px;
219 padding: 10px;
220 }
221
222 /* "Select all" pill button (pink); darker on hover. */
223 .mls_import_selec_all_class {
224 background-color: var(--primary-color);
225 color: #fff;
226 display: inline-block;
227 padding: 5px;
228 margin-right: 10px;
229 margin-bottom: 5px;
230 cursor: pointer;
231 padding: 7px 14px;
232 border-radius: var(--radius-pill);
233 }
234
235 .mls_import_selec_all_class:hover {
236 background-color: #33302b;
237 }
238
239 /* ===== Import progress bar + transfer controls + live log ===== */
240
241 /* Outer progress wrapper (this selector is declared again below). */
242 #mlsimport_myProgress_wrapper{
243 width:800px;
244 margin-top: 10px;
245 /* display:none;*/
246 }
247
248 /* "Stop transfer" button (red); note a later rule overrides display to none. */
249 #mlsimport_transfer_stop{
250 padding: 7px 16px;
251 background: #c02617;
252 color: #fff;
253 border-radius: var(--radius-pill);
254 display: inline-block;
255 margin-top: 10px;
256 cursor: pointer;
257 }
258
259 /* Progress fill bar — width is animated from 0% via JS as items import. */
260 #mlsimport_myBar{
261 width: 0%;
262 height: 20px;
263 background-color: #e85d3c;
264 }
265
266 #mlsimport_myProgress_wrapper{
267 width:800px;
268 margin-top: 10px;
269 /* display:none;*/
270 }
271
272 /* Track background for the "monster" (full-width) progress bar. */
273 #mlsimport_monster_myProgress {
274 width: 100%;
275 background-color: #efe7dc;
276 }
277 /* Hide the stop button by default (JS shows it while a transfer runs). */
278 #mlsimport_transfer_stop{
279 display: none;
280 }
281
282 /* Scrollable live import log panel. */
283 #log_container{
284 width: 750px;
285 background: #f3efe7;
286 border-radius: var(--border-radius);
287 padding: 15px;
288 margin-top: 15px;
289 max-height: 500px;
290 overflow-y: auto;
291 }
292
293
294 .mlsimport_import_no{
295 font-size: 14px;
296 max-width: 775px;
297 margin-bottom: 10px;
298 }
299
300 #mlsimport_stop_item,
301 #mlsimport-start_item{
302 display: inline-block;
303 margin: 0px 10px 30px 0px;
304 line-height: normal;
305 }
306
307 .mlsimport_hidden_field_button {
308 max-width: 450px;
309 }
310 .mlsimport_param_wrapper input{
311 max-width: 450px;
312 }
313
314 .cron_job_explainin{
315 max-width: 800px;
316 margin-top: 5px;
317 }
318
319 /* Tools-tab blocks are defined at the end of this file, so they win ties
320 against the later 2025 overrides. */
321
322
323
324
325
326
327
328
329
330
331
332 /*==WpResidence*/
333 /* Cap uploaded property thumbnail preview size (selector name is misspelled
334 "thumb_wrapepr" to match the markup). */
335 #property_uploaded_thumb_wrapepr img{
336 max-width: 200px;
337 max-height: 200px;
338 }
339
340 table.media .column-title .media-icon img {
341 width:60px;
342 }
343 /* Admin message banners (notification / validated / warning). Base is a pink
344 box; individual variants below re-colour it. */
345 .mlsimport_notification,
346 .mlsimport_validated,
347 .mlsimport_warning{
348 background: var(--error-soft);
349 color: var(--error-color);
350 padding: 12px 16px;
351 margin-bottom: 10px;
352 border-radius: var(--border-radius);
353 }
354
355
356 /* Indigo "populate" info banner. */
357 .mlsimport_populate_warning{
358 background: var(--primary-color);
359 color: #fff;
360 padding: 12px 16px;
361 margin-bottom: 10px;
362 border-radius: var(--border-radius);
363 }
364
365
366 /* "Validated" variant: amber-tinted background with a warning left border. */
367 .mlsimport_validated{
368 padding: 0.75rem 1rem;
369 margin-bottom: 1rem;
370 border-radius: var(--border-radius);
371 background-color: rgba(250, 227, 154, 0.4);
372 border-left: 4px solid var(--warning-color);
373 color: var(--text-primary);
374 }
375
376
377 .mlsimport_notification{
378 background: var(--warning-soft);
379 color: var(--warning-deep);
380 }
381
382
383 #mlsimport_item_metaboxes-sectionid .mlsimport_notification{
384 background: var(--warning-soft);
385 color: var(--warning-deep);
386 max-width: 500px;
387 }
388
389
390 /* Scrollable status/output box inside the import-task metabox. */
391 #mlsimport_item_status{
392 width: auto;
393 background-color: #f3efe7;
394 overflow-y: scroll;
395 padding: 10px;
396 border-radius: var(--border-radius);
397 margin-bottom: 15px;
398 }
399
400
401 /* ===== iOS-style on/off toggle switch =====
402 Absolutely positioned track; the real checkbox is hidden and a .slider
403 pseudo-element renders the knob, translated on :checked. */
404 label.mlsimport_switch {
405 position: absolute;
406 display: inline-block;
407 width: 53px!important;
408 height: 25px;
409 top: 7px;
410 left: 205px;
411 }
412
413 .mlsimport_switch input {
414 opacity: 0;
415 width: 0;
416 height: 0;
417 }
418
419 .slider {
420 position: absolute;
421 cursor: pointer;
422 top: 0;
423 left: 0;
424 right: 0;
425 bottom: 0;
426 background-color: rgba(28,25,23,0.18);
427 -webkit-transition: .4s;
428 transition: .4s;
429 }
430
431 .slider:before {
432 position: absolute;
433 content: "";
434 height: 18px;
435 width: 18px;
436 left: 4px;
437 bottom: 4px;
438 background-color: white;
439 -webkit-transition: .4s;
440 transition: .4s;
441 }
442
443 /* Checked state: blue track, and the knob slides right (translateX below). */
444 .mlsimport_switch input:checked + .slider {
445 background-color: #e85d3c;
446 }
447
448 .mlsimport_switch input:focus + .slider {
449 box-shadow: 0 0 1px #e85d3c;
450 }
451
452 .mlsimport_switch input:checked + .slider:before {
453 -webkit-transform: translateX(26px);
454 -ms-transform: translateX(26px);
455 transform: translateX(26px);
456 }
457
458
459
460
461 /* Rounded (pill) variant of the toggle track and knob. */
462 .slider.round {
463 border-radius: 25px;
464 }
465 .slider.round:before {
466 border-radius: 50%;
467 }
468
469
470 #mlsimport-delete-notification{
471 margin-bottom: 10px;
472 }
473
474 #mlsimport-delete-prop{
475 margin-top: 15px;
476 }
477
478 /* Provider-specific credential fieldsets are shown/hidden per selected MLS by
479 PHP at render time (inline display:none in the credentials partials) and by
480 mlsimport_token_on_load() on in-page MLS changes. No CSS default-hide here:
481 a stylesheet rule would fight the server-rendered visibility. */
482
483
484
485
486 .mlsimport_param_wrapper input[type=text]{
487 min-width: 450px;
488 border-color: rgba(28,25,23,0.18);
489 padding: 5px 12px;
490 }
491
492 #mlsimport_item_min_price,
493 #mlsimport_item_max_price{
494 min-width: 210px;
495 max-width: 210px;
496 }
497
498
499 /* Sign-up / account CTA box shown when no account is connected. */
500 .mlsimport_signup{
501 display: inline-block;
502 background-color: #f3efe7;
503 border-radius: 14px;
504 padding: 20px;
505 font-size: 15px;
506 margin-bottom: 15px;
507 }
508 .mlsimport_signup p{
509 font-size: 15px;
510 }
511 .mlsimport_signup_button{
512 float:left;
513 clear:left;
514 }
515
516
517 /*==WpEstate*/
518
519 /*==Houzez*/
520
521 /* Houzez property list thumbnail column sizing. */
522 .column-thumbnail img {
523 max-width: 100%;
524 height: auto;
525 min-width:
526 102px ;
527 }
528
529 /*==RealHomes*/
530
531
532
533 /*==2025*/
534 /* 2025 redesign: tabbed card UI. Tab panels are hidden by default and shown
535 when the active class is applied by the tab JS. */
536
537 /* Tab content panel — hidden until activated. */
538 .content-nav-tab{
539 display:none;
540 padding: 30px 15px;
541 background: #fff;
542 border: 1px solid rgba(28,25,23,0.18);
543 border-top: 0px;
544 }
545
546 /* Active tab panel becomes a visible flex container. */
547 .content-nav-tab-active{
548 display: flex;
549 }
550
551
552 .content-nav-tab.mlsimport_2025_card{
553 width: auto;
554 }
555
556 /* White rounded card with layered shadow (2025 card container). */
557 .mlsimport_2025_card{
558 flex-direction: column;
559 align-items: center;
560 padding: 0px;
561
562 background: #FFFFFF;
563 box-shadow: 0px 0px 0px 1px rgba(28, 25, 23, 0.05), 0px 5px 22px rgba(28, 25, 23, 0.05);
564 border-radius: var(--radius-card);
565 flex: none;
566 order: 0;
567 flex-grow: 1;
568
569 }
570
571 .mlsimport_2025_card_left_oriented{
572 flex-direction: column;
573 align-content: flex-start;
574 align-items: flex-start;
575 justify-content: flex-start;
576 padding: 30px;
577 }
578
579
580 /* Tab strip container (overrides WP core nav-tab-wrapper border). */
581 .nav-tab-wrapper.mlsimport-tab-wrapper{
582 border: none;
583 padding: 0px 15px;
584 margin-top: 50px;
585 }
586
587
588 .nav-tab-wrapper.mlsimport-tab-wrapper .nav-tab {
589
590 text-transform: uppercase;
591 color: var(--text-secondary);
592 padding: 15px 25px;
593 background: #f3efe7;
594 border-top-right-radius: 12px;
595 border-top-left-radius: 12px;
596
597 padding: 15px 30px;
598 background: #fff;
599 border: 1px solid var(--border-color);
600 font-weight: 500;
601 letter-spacing: 0.04em;
602 transition: color var(--transition-speed), background var(--transition-speed);
603 }
604
605 .nav-tab-wrapper.mlsimport-tab-wrapper .nav-tab:hover {
606 color: var(--text-primary);
607 background: var(--background-soft);
608 }
609
610 /* Active tab: warm near-black background, white text (portal "seg" pattern). */
611 .nav-tab-wrapper.mlsimport-tab-wrapper .nav-tab.nav-tab-active{
612 background-color: var(--primary-color);
613 color: #fff;
614 border-color: var(--primary-color);
615 font-weight: 600;
616 }
617
618 .content-nav-tab.mlsimport_2025_card form{
619 max-width: 500px;
620 }
621
622 .mlsimport_2025_card_admin_options {
623 display: flex;
624 flex-direction: row;
625 }
626
627 .mlsimport_2025_card_admin_options:empty{
628 display: none;
629 }
630 /* ===== Numbered "steps" list =====
631 Uses a CSS counter to render circular numbered badges before each <li>
632 (see ::before rule) instead of native list markers. */
633 .mlsimport-steps{
634 font-size: 16px;
635 display: flex;
636 flex-direction: column;
637 gap: 10px;
638 margin-left: 74px;
639 }
640
641 .mlsimport-steps ol {
642 list-style: none;
643 counter-reset: step-counter;
644 padding: 0;
645 }
646
647 .mlsimport-steps li {
648 counter-increment: step-counter;
649 position: relative;
650 padding-left: 44px;
651 margin-bottom: 20px;
652 line-height: 27px;
653 }
654
655 /* Circular numbered badge rendered from the CSS counter value. */
656 .mlsimport-steps li::before {
657 content: counter(step-counter);
658 position: absolute;
659 left: 0;
660 top: 0;
661 width: 30px;
662 height: 30px;
663 background-color: var(--accent-color);
664 color: white;
665 border-radius: 50%;
666 display: flex;
667 align-items: center;
668 justify-content: center;
669 font-weight: 500;
670 }
671
672
673 /*==2025 Inputs*/
674 /* Shared styling for text/password/select inputs in the 2025 UI:
675 bordered, rounded, subtle shadow, inline-flex layout. */
676
677 input[type=password].mlsimport-input.mlsimport-2025-input,
678 input[type=text].mlsimport-input.mlsimport-2025-input,
679 .mlsimport-input.mlsimport-2025-input{
680 padding: 5px 12px;
681 box-sizing: border-box;
682 display: flex;
683 flex-direction: column;
684 align-items: flex-start;
685 isolation: isolate;
686 background: #FFFFFF;
687 border: 1px solid rgba(28,25,23,0.18);
688 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
689 border-radius: 8px;
690 flex: none;
691 order: 1;
692 align-self: stretch;
693 flex-grow: 0;
694 display: inline-flex;
695 }
696 /* 2025 label override (later in the file, so it wins over the earlier
697 .mlsimport-label float rule for these screens). */
698 .mlsimport-label {
699 display: block;
700 margin-bottom: 0px;
701 font-weight: 500;
702 color: var(--text-primary);
703 }
704
705 select.mlsimport-2025-select{
706 padding: 5px 24px 5px 12px;
707 width: 100%;
708 max-width: 100%;
709 box-sizing: border-box;
710 display: inline-flex;
711 flex-direction: column;
712 align-items: flex-start;
713 isolation: isolate;
714 border: 1px solid rgba(28,25,23,0.18);
715 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
716 border-radius: 8px;
717 flex: none;
718 align-self: stretch;
719 flex-grow: 0;
720 }
721
722
723
724
725 /* Default bordered look for fieldset inputs and the import "select all" boxes. */
726 .mlsimport-fieldset-wrapper input,
727 input[type=checkbox].mlsimport_select_import_admin_all,
728 input[type=checkbox].mlsimport_select_import_all {
729 border: 1px solid rgba(28,25,23,0.18);
730 border-radius: 2px;
731 background-color: #fff!important;
732 }
733
734
735 /* ===== Pill action buttons (Sunny Bento) =====
736 Portal button standard: dark solid primary, pastel intents on top of it —
737 save_data (mint), secondary (white + border), warning_action (butter) and
738 error_action (solid red that darkens on hover). All are full pills. */
739
740 /* Primary button: solid warm near-black pill. */
741 .button.mlsimport_button{
742 font-size: 14px;
743 position: relative;
744 display: flex;
745 flex-direction: column;
746 justify-content: center;
747 align-items: center;
748 padding: 9px 24px;
749 line-height: 1.5;
750 min-height: 0;
751 background: var(--primary-color);
752 border: 1px solid var(--primary-color);
753 border-radius: var(--radius-pill);
754 color:#fff;
755 flex: none;
756 order: 1;
757 flex-grow: 0;
758 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
759 transition: background var(--transition-speed), box-shadow var(--transition-speed);
760 }
761
762 .button.mlsimport_button:hover {
763 background: var(--primary-hover);
764 color:#fff;
765 border: 1px solid var(--primary-hover);
766 box-shadow: 0 10px 24px -10px rgba(0, 0, 0, 0.45);
767 }
768
769 /* Save button: mint pill with deep-green text. */
770 .button.save_data,
771 .wp-core-ui .button.mlsimport_button.save_data {
772 background: var(--success-soft);
773 border: 1px solid var(--success-soft);
774 color: var(--success-deep);
775 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.06);
776 }
777
778 .button.save_data:hover,
779 .wp-core-ui .button.mlsimport_button.save_data:hover {
780 background: #a5dfc0;
781 border: 1px solid #a5dfc0;
782 color: var(--success-deep);
783 box-shadow: 0 8px 20px -10px rgba(28, 92, 58, 0.5);
784 }
785
786
787 /* Secondary button: white surface pill with hairline border. */
788 .button.secondary,
789 .wp-core-ui .button.mlsimport_button.secondary {
790 background: var(--background-white);
791 border: 1px solid var(--border-color);
792 /* !important needed: wpresidence-core/css/wpresidence2025.css line 817-818
793 forces white text + inset shadow with !important on .button.secondary. */
794 color: var(--text-primary) !important;
795 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05) !important;
796 border-radius: var(--radius-pill);
797 }
798
799 .button.secondary:hover,
800 .wp-core-ui .button.mlsimport_button.secondary:hover {
801 background: var(--background-soft);
802 border: 1px solid var(--border-color);
803 color: var(--text-primary) !important;
804 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05) !important;
805 border-radius: var(--radius-pill);
806 }
807
808 /* Field-selector bulk bar: only "Select all" stays the dark primary; the
809 "Select none" twin (same classes in markup) is demoted to the white
810 secondary look via its ID so the toolbar has a single primary action. */
811 #mlsimport-select-none-import.button.mlsimport_button {
812 background: var(--background-white);
813 border: 1px solid var(--border-color);
814 color: var(--text-primary);
815 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05);
816 }
817 #mlsimport-select-none-import.button.mlsimport_button:hover {
818 background: var(--background-soft);
819 border: 1px solid var(--border-color);
820 color: var(--text-primary);
821 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05);
822 }
823
824
825
826 /* Warning button: butter pill with deep-amber text. */
827 .button.warning_action,
828 .wp-core-ui .button.mlsimport_button.warning_action {
829 background: var(--warning-soft);
830 border: 1px solid var(--warning-soft);
831 color: var(--warning-deep);
832 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.06);
833 }
834
835 .button.warning_action:hover,
836 .wp-core-ui .button.mlsimport_button.warning_action:hover {
837 background: #f3d87c;
838 border: 1px solid #f3d87c;
839 color: var(--warning-deep);
840 box-shadow: 0 8px 20px -10px rgba(122, 84, 16, 0.45);
841 }
842
843
844 /* Error/danger button: solid red pill with white text, darkening on hover -
845 the same shape as the primary button (solid -> darker + lifted shadow), just
846 in the danger colour. It reads as a real action at rest instead of waiting
847 for a hover to look like one. */
848 .button.error_action,
849 .wp-core-ui .button.mlsimport_button.error_action {
850 background: var(--error-color);
851 border: 1px solid var(--error-color);
852 color: #fff;
853 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
854 }
855
856 .button.error_action:hover,
857 .wp-core-ui .button.mlsimport_button.error_action:hover {
858 background: var(--error-hover);
859 border: 1px solid var(--error-hover);
860 color: #fff;
861 box-shadow: 0 10px 24px -10px rgba(192, 38, 23, 0.55);
862 }
863
864
865
866
867
868
869 #mlsimport_item_how_many{
870 max-width: 450px;
871 }
872
873
874
875
876
877
878 /* ===== Custom SVG checkboxes =====
879 Native appearance is removed; a :before pseudo-element paints an inline
880 SVG (unchecked = grey outline, checked = filled indigo box with a tick),
881 both embedded as data: URIs below. */
882 input[type=checkbox].mlsimport-import-checkbox,
883 input[type=checkbox].mlsimport-admin-checkbox {
884 appearance: none;
885 -webkit-appearance: none;
886 background: transparent;
887 border: none;
888 box-shadow: none;
889 width: 24px;
890 height: 24px;
891 position: relative;
892 display: inline-block;
893 vertical-align: middle;
894 }
895
896 input[type=checkbox].mlsimport-import-checkbox:before,
897 input[type=checkbox].mlsimport-admin-checkbox:before {
898 content: "";
899 position: absolute;
900 top: 0;
901 left: 0;
902 width: 24px;
903 height: 24px;
904 background-image: url("data:image/svg+xml;utf8,<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='M8 2C4.68629 2 2 4.68629 2 8V16C2 19.3137 4.68629 22 8 22H16C19.3137 22 22 19.3137 22 16V8C22 4.68629 19.3137 2 16 2H8ZM8 4C5.79086 4 4 5.79086 4 8V16C4 18.2091 5.79086 20 8 20H16C18.2091 20 20 18.2091 20 16V8C20 5.79086 18.2091 4 16 4H8Z' fill='%23D8D2C6' fill-rule='evenodd'></path></svg>");
905 background-size: 24px 24px;
906 background-position: center;
907 background-repeat: no-repeat;
908 margin: 0px;
909 }
910
911 /* Checked state swaps in the filled indigo box + white tick SVG. */
912 input[type=checkbox].mlsimport-import-checkbox:checked:before,
913 input[type=checkbox].mlsimport-admin-checkbox:checked:before {
914 background-image: url("data:image/svg+xml;utf8,<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><rect fill='%23e85d3c' height='20' rx='6' width='20' x='2' y='2'></rect><path d='M7.55566 11.7222L10.5186 14.7778L16.4446 8.66669' stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'></path></svg>");
915 }
916
917
918
919 /* Initial save progress overlay */
920 /* Fixed, viewport-centered modal card (translate(-50%,-50%) trick); high
921 z-index keeps it above the admin UI while the initial save runs. */
922 .mlsimport-save-progress {
923 position: fixed;
924 top: 50%;
925 left: 50%;
926 transform: translate(-50%, -50%);
927 z-index: 9999;
928 background: #fff;
929 padding: 40px;
930 border-radius: var(--radius-card);
931 /* border: 1px solid #ddd; */
932 box-shadow: 0 7px 54px rgba(0, 0, 0, 0.15);
933 width: 500px;
934 min-height: 200px;
935 text-align: center;
936 font-size: 17px;
937 display: flex;
938 align-content: center;
939 justify-content: center;
940 align-items: center;
941 line-height: 1.8em;
942 }
943
944 .mlsimport-save-progress-text {
945 margin-bottom: 10px;
946 }
947
948 .mlsimport-save-progress-bar {
949 height: 10px;
950 background: #f3efe7;
951 margin-top: 5px;
952 border-radius: 5px;
953 overflow: hidden;
954 }
955
956 /* Animated fill inside the save progress bar (width driven by JS). */
957 .mlsimport-save-progress-bar .progress-fill {
958 width: 0%;
959 height: 100%;
960 background: var(--accent-color);
961 border-radius: 5px;
962 transition: width 0.3s;
963 }
964
965 /* Deactivation exit survey modal */
966 /* Full-screen overlay (inset:0) centering the survey card; very high z-index
967 sits above the plugins-list deactivate flow. .mlsimport-es-hidden toggles it. */
968 #mlsimport-exit-survey-modal {
969 position: fixed;
970 inset: 0;
971 z-index: 100000;
972 display: flex;
973 align-items: center;
974 justify-content: center;
975 }
976 #mlsimport-exit-survey-modal.mlsimport-es-hidden {
977 display: none;
978 }
979 /* Semi-transparent dim layer behind the survey card. */
980 .mlsimport-es-backdrop {
981 position: absolute;
982 inset: 0;
983 background: rgba(0, 0, 0, 0.6);
984 }
985 .mlsimport-es-card {
986 position: relative;
987 background: #fff;
988 border-radius: var(--radius-card);
989 padding: 26px 28px;
990 width: 460px;
991 max-width: 92vw;
992 box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
993 }
994 .mlsimport-es-title {
995 margin: 0 0 6px;
996 font-size: 18px;
997 }
998 .mlsimport-es-intro {
999 margin: 0 0 16px;
1000 color: #6b6358;
1001 }
1002 /* Selectable reason row in the exit survey. */
1003 .mlsimport-es-option {
1004 display: block;
1005 padding: 8px 10px;
1006 margin: 4px 0;
1007 border: 1px solid rgba(28,25,23,0.18);
1008 border-radius: var(--border-radius);
1009 cursor: pointer;
1010 }
1011 .mlsimport-es-option:hover {
1012 background: #f3efe7;
1013 }
1014 .mlsimport-es-other {
1015 width: 100%;
1016 margin-top: 10px;
1017 box-sizing: border-box;
1018 }
1019 .mlsimport-es-actions {
1020 margin-top: 18px;
1021 display: flex;
1022 align-items: center;
1023 gap: 16px;
1024 }
1025 .mlsimport-es-skip {
1026 color: #9a9285;
1027 text-decoration: underline;
1028 }
1029 .mlsimport-es-hidden {
1030 display: none;
1031 }
1032
1033 /* -------------------------------------------------------
1034 Activity log — sync-status banner (Task 02 / Build 2)
1035 ------------------------------------------------------- */
1036
1037 .mlsimport-activity-banner {
1038 padding: 12px 14px;
1039 /* Re-chrome the core .notice.notice-info wrapper to Sunny Bento: warm
1040 hairline border, accent-orange status edge, rounded corners. */
1041 border: 1px solid var(--border-color);
1042 border-left: 4px solid var(--accent-color);
1043 border-radius: var(--border-radius);
1044 }
1045
1046 .mlsimport-activity-banner__counts {
1047 display: flex;
1048 flex-wrap: wrap;
1049 align-items: center;
1050 gap: 8px 14px;
1051 margin: 0 0 10px;
1052 }
1053
1054 .mlsimport-activity-banner__title {
1055 display: inline-flex;
1056 align-items: center;
1057 gap: 7px;
1058 font-size: 14px;
1059 font-weight: 700;
1060 color: #1c1917;
1061 }
1062
1063 .mlsimport-activity-banner__title::before {
1064 content: "";
1065 width: 9px;
1066 height: 9px;
1067 border-radius: 50%;
1068 background: #1c1917;
1069 }
1070
1071 .mlsimport-activity-banner__period {
1072 font-weight: 500;
1073 font-size: 11px;
1074 color: #9a9285;
1075 text-transform: uppercase;
1076 letter-spacing: .05em;
1077 }
1078
1079 .mlsimport-activity-banner__totals {
1080 display: inline-flex;
1081 flex-wrap: wrap;
1082 gap: 6px;
1083 }
1084
1085 .mlsimport-activity-stat {
1086 display: inline-flex;
1087 align-items: baseline;
1088 gap: 4px;
1089 padding: 3px 11px;
1090 border-radius: 999px;
1091 font-size: 12px;
1092 font-weight: 500;
1093 line-height: 1.5;
1094 }
1095
1096 .mlsimport-activity-stat strong {
1097 font-size: 13px;
1098 font-weight: 700;
1099 }
1100
1101 /* Per-action tinted stat pills: added (green), edited (amber), deleted (red). */
1102 .mlsimport-activity-stat--added { background: #b8e6cc; color: #1c5c3a; }
1103 .mlsimport-activity-stat--edited { background: #fae39a; color: #7a5410; }
1104 .mlsimport-activity-stat--deleted { background: #fbe6e3; color: #c02617; }
1105
1106 .mlsimport-activity-banner__breakdown {
1107 margin: 0 0 10px;
1108 padding: 0;
1109 list-style: none;
1110 max-width: 900px;
1111 border: 1px solid rgba(28,25,23,0.12);
1112 border-radius: var(--border-radius);
1113 overflow: hidden;
1114 }
1115
1116 .mlsimport-activity-banner__breakdown li {
1117 display: flex;
1118 flex-wrap: nowrap;
1119 align-items: center;
1120 justify-content: space-between;
1121 gap: 8px;
1122 margin: 0;
1123 padding: 7px 12px;
1124 font-size: 13px;
1125 background: #fff;
1126 }
1127
1128 .mlsimport-activity-banner__breakdown li:nth-child(even) {
1129 background: #f3efe7;
1130 }
1131
1132 /* Per-task name cell: grows to fill, truncates with an ellipsis when long
1133 (min-width:0 lets the flex item shrink below its content width). */
1134 .mlsimport-activity-banner__task {
1135 flex: 1 1 auto;
1136 min-width: 0;
1137 font-weight: 600;
1138 color: #1c1917;
1139 overflow: hidden;
1140 text-overflow: ellipsis;
1141 white-space: nowrap;
1142 }
1143
1144 .mlsimport-activity-banner__chips {
1145 display: inline-flex;
1146 flex: 0 0 auto;
1147 flex-wrap: nowrap;
1148 gap: 5px;
1149 }
1150
1151 .mlsimport-activity-chip {
1152 display: inline-block;
1153 padding: 2px 8px;
1154 border-radius: 4px;
1155 font-size: 11px;
1156 font-weight: 600;
1157 line-height: 1.6;
1158 white-space: nowrap;
1159 color: #ffffff;
1160 border-radius: var(--radius-pill);
1161 }
1162
1163 /* Pastel per-action count chips: added/edited/deleted colours. */
1164 .mlsimport-activity-chip--added { background: var(--success-soft); color: var(--success-deep); }
1165 .mlsimport-activity-chip--edited { background: var(--warning-soft); color: var(--warning-deep); }
1166 .mlsimport-activity-chip--deleted { background: var(--error-soft); color: var(--error-color); }
1167
1168 /* Muted styling for a zero-count chip. */
1169 .mlsimport-activity-chip.is-zero {
1170 background: #f3efe7;
1171 color: #9a9285;
1172 }
1173
1174 .mlsimport-activity-banner__actions {
1175 margin: 0;
1176 }
1177
1178 .mlsimport-activity-banner__link {
1179 display: inline-flex;
1180 align-items: center;
1181 gap: 5px;
1182 padding: 5px 15px;
1183 background: #1c1917;
1184 color: #ffffff !important;
1185 text-decoration: none !important;
1186 font-size: 13px;
1187 font-weight: 600;
1188 border-radius: var(--radius-pill);
1189 }
1190
1191 .mlsimport-activity-banner__link:hover,
1192 .mlsimport-activity-banner__link:focus {
1193 background: #33302b;
1194 color: #ffffff !important;
1195 }
1196
1197 /* -------------------------------------------------------
1198 Import History — filter form (styled like the activity banner)
1199 Uses core .notice .notice-info for the card chrome (white box,
1200 blue left border); the rules below handle layout + controls.
1201 ------------------------------------------------------- */
1202
1203 .mlsimport-history-filters {
1204 display: flex;
1205 flex-wrap: wrap;
1206 align-items: center;
1207 gap: 8px 12px;
1208 padding: 12px 14px;
1209 margin: 16px 0;
1210 /* Same Sunny Bento re-chrome as the activity banner (core .notice). */
1211 border: 1px solid var(--border-color);
1212 border-left: 4px solid var(--accent-color);
1213 border-radius: var(--border-radius);
1214 }
1215
1216 .mlsimport-history-filters label {
1217 font-size: 13px;
1218 font-weight: 600;
1219 color: #1c1917;
1220 }
1221
1222 .mlsimport-history-filters input[type="search"],
1223 .mlsimport-history-filters select {
1224 height: 32px;
1225 border-radius: 8px;
1226 border-color: rgba(28,25,23,0.12);
1227 }
1228
1229 .mlsimport-history-filters .button {
1230 background: #1c1917;
1231 border-color: #1c1917;
1232 color: #ffffff;
1233 border-radius: var(--radius-pill);
1234 height: 32px;
1235 padding: 0 14px;
1236 font-weight: 600;
1237 }
1238
1239 .mlsimport-history-filters .button:hover,
1240 .mlsimport-history-filters .button:focus {
1241 background: #33302b;
1242 border-color: #33302b;
1243 color: #ffffff;
1244 }
1245
1246 /* -------------------------------------------------------
1247 Activity log — action column badges (Task 02 / Build 2)
1248 ------------------------------------------------------- */
1249
1250 .mlsimport-activity-action {
1251 display: inline-block;
1252 padding: 2px 8px;
1253 border-radius: 12px;
1254 font-size: 11px;
1255 font-weight: 600;
1256 line-height: 1.6;
1257 text-transform: capitalize;
1258 white-space: nowrap;
1259 }
1260
1261 /* Added-action badge (mint). */
1262 .mlsimport-activity-action--added {
1263 background-color: var(--success-soft);
1264 color: var(--success-deep);
1265 }
1266
1267 .mlsimport-activity-action--edited {
1268 background-color: var(--warning-soft);
1269 color: var(--warning-deep);
1270 }
1271
1272 .mlsimport-activity-action--deleted {
1273 background-color: var(--error-soft);
1274 color: var(--error-color);
1275 }
1276
1277 /* Searchable City/County multi-select — filter input above the native list. */
1278 .mlsimport-2025-select.mlsimport-searchable-select,
1279 .mlsimport-select-search {
1280 max-width: 450px;
1281 }
1282 .mlsimport-select-search {
1283 display: block;
1284 width: 100%;
1285 box-sizing: border-box;
1286 margin-bottom: 6px;
1287 padding: 6px 12px;
1288 border: 1px solid rgba(28,25,23,0.18);
1289 border-radius: 8px;
1290 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
1291 }
1292 /* Chip tray showing currently selected City/County values. */
1293 .mlsimport-selected-chips {
1294 display: flex;
1295 flex-wrap: wrap;
1296 gap: 6px;
1297 max-width: 450px;
1298 margin: 6px 0;
1299 }
1300 /* Collapse the tray when nothing is selected. */
1301 .mlsimport-selected-chips:empty {
1302 display: none;
1303 }
1304 .mlsimport-chip {
1305 display: inline-flex;
1306 align-items: center;
1307 gap: 4px;
1308 padding: 2px 4px 2px 10px;
1309 background: #1c1917;
1310 color: #ffffff;
1311 border-radius: 12px;
1312 font-size: 12px;
1313 line-height: 1.8;
1314 }
1315 /* Round "x" remove button inside a selected chip. */
1316 .mlsimport-chip-remove {
1317 display: inline-flex;
1318 align-items: center;
1319 justify-content: center;
1320 width: 16px;
1321 height: 16px;
1322 padding: 0;
1323 border: 0;
1324 border-radius: 50%;
1325 background: rgba(255, 255, 255, 0.25);
1326 color: #ffffff;
1327 font-size: 14px;
1328 line-height: 1;
1329 cursor: pointer;
1330 }
1331 .mlsimport-chip-remove:hover {
1332 background: rgba(255, 255, 255, 0.45);
1333 }
1334
1335 /* ============================================================
1336 Import Tasks list — Status column health badge (issue #200)
1337 Pill badge showing the task's run health: green = healthy,
1338 amber = sync overdue, red = failed/stuck, gray = neutral.
1339 ============================================================ */
1340 .mlsimport-task-health {
1341 display: inline-block;
1342 padding: 3px 12px;
1343 border-radius: var(--radius-pill);
1344 font-size: 12px;
1345 font-weight: 600;
1346 line-height: 1.6;
1347 color: var(--text-secondary);
1348 background: var(--background-soft);
1349 }
1350 .mlsimport-task-health--ok {
1351 background: var(--success-soft);
1352 color: var(--success-deep);
1353 }
1354 .mlsimport-task-health--warning {
1355 background: var(--warning-soft);
1356 color: var(--warning-deep);
1357 }
1358 .mlsimport-task-health--error {
1359 background: var(--error-soft);
1360 color: var(--error-color);
1361 }
1362 /* Explanation line under the badge (progress, error, or last sync time). */
1363 .mlsimport-task-health__message {
1364 margin: 6px 0 0;
1365 font-size: 12px;
1366 color: #9a9285;
1367 }
1368
1369
1370 /* ===== Tools tab (Sunny Bento) =====
1371 admin.php?page=mlsimport_plugin_options&tab=administrative_options
1372
1373 This tab predates the restyle: three of its six blocks carried hardcoded inline
1374 styles (#eee / padding 10px / radius 5px) and the other three carried none, so
1375 half the tab rendered as a grey card and half as bare text. Spacing lived in
1376 per-element margins and <br> tags and drifted out of step.
1377
1378 Two classes:
1379 .mlsimport_tool_block every block - shared width and vertical rhythm
1380 .mlsimport_tool_card adds the card surface, for ACTION tools only
1381
1382 The two settings behind the single Save Changes button (logs, history) and the
1383 Cron Jobs guidance stay plain, so a card always means "this block acts on its
1384 own".
1385
1386 Three gaps, by role - the same everywhere on the tab:
1387 TIGHT 8px a control under its own label, a hint under its control
1388 NORMAL 16px ordinary siblings
1389 HEADING 20px anything directly under a heading */
1390 .mlsimport_tool_block{
1391 margin: 0 0 20px 0;
1392 max-width: 800px;
1393 box-sizing: border-box;
1394 }
1395
1396 /* Reset every child, then space them with one top margin, so a single rule owns
1397 the rhythm and no child can drift on its own. */
1398 .mlsimport_tool_block > *{
1399 margin: 0;
1400 }
1401 .mlsimport_tool_block > * + *{
1402 margin-top: 16px;
1403 }
1404 .mlsimport_tool_block > h3 + *,
1405 .mlsimport_tool_block > h4 + *{
1406 margin-top: 20px;
1407 }
1408 /* Buttons need the .wp-core-ui prefix to outrank core's `.wp-core-ui .button
1409 { margin: 0 }` (0,2,0), which otherwise flattens the gap under a heading. */
1410 .wp-core-ui .mlsimport_tool_block > h3 + .button,
1411 .wp-core-ui .mlsimport_tool_block > h4 + .button,
1412 .wp-core-ui .mlsimport_tool_block > h3 + input[type="button"],
1413 .wp-core-ui .mlsimport_tool_block > h4 + input[type="button"]{
1414 margin-top: 20px;
1415 }
1416 /* Same reason for the ordinary 16px step and the side-by-side button gap. */
1417 .wp-core-ui .mlsimport_tool_block > * + .button,
1418 .wp-core-ui .mlsimport_tool_block > * + input[type="button"]{
1419 margin-top: 16px;
1420 }
1421 .wp-core-ui .mlsimport_tool_block input[type="button"] + input[type="button"]{
1422 margin-top: 16px;
1423 margin-left: 10px;
1424 }
1425 .mlsimport_tool_block > .mlsimport-label + select,
1426 .mlsimport_tool_block > select + .mlsimport-exp{
1427 margin-top: 8px;
1428 }
1429
1430 /* Card surface - action tools only. */
1431 .mlsimport_tool_card{
1432 background-color: var(--background-soft);
1433 border: 1px solid var(--border-color);
1434 border-radius: var(--border-radius);
1435 padding: 20px;
1436 }
1437
1438 .mlsimport_tool_block h3,
1439 .mlsimport_tool_block h4{
1440 font-weight: 600;
1441 color: var(--text-primary);
1442 line-height: 1.3;
1443 }
1444
1445 .mlsimport_tool_block .mlsimport-label{
1446 font-weight: 500;
1447 color: var(--text-primary);
1448 }
1449
1450 .mlsimport_tool_block .mlsimport-exp{
1451 color: var(--text-secondary);
1452 }
1453
1454 /* One width for every field on this tab. Select Terms used to be capped at
1455 max-width:400px inline while Select Taxonomy above it inherited
1456 width:100%/max-width:100% and ran the full width of its container. */
1457 .mlsimport_tool_block select.mlsimport-2025-select{
1458 width: 100%;
1459 max-width: 100%;
1460 box-sizing: border-box;
1461 }
1462 .mlsimport_tool_block select[multiple]{
1463 min-height: 120px;
1464 }
1465
1466 /* Action buttons keep their content width and sit on one row. */
1467 .mlsimport_tool_block input[type="button"] + input[type="button"]{
1468 margin-left: 10px;
1469 }
1470
1471 /* Delete progress bar, on the palette instead of wp-admin blue (#0073aa).
1472 The bar's own width stays inline: mlsimport-admin.js animates it. */
1473 .mlsimport-delete-progress-track{
1474 background: var(--background-white);
1475 border: 1px solid var(--border-color);
1476 border-radius: var(--radius-pill);
1477 overflow: hidden;
1478 height: 20px;
1479 margin-bottom: 8px;
1480 }
1481 #mlsimport-delete-progress-bar{
1482 background: var(--accent-color);
1483 height: 100%;
1484 transition: width var(--transition-speed) ease;
1485 }
1486
1487
1488 /* ===== Field height parity (2025 controls) =====
1489 A dropdown must be exactly as tall as a text input beside it. wp-admin core
1490 (load-styles.php) sets `select { line-height: 2.71429; min-height: 40px }`,
1491 which at 14px is a 38px line box; with our 5px padding and 1px border that
1492 rendered every .mlsimport-2025-select at 50px next to a 40px
1493 .mlsimport-2025-input. 40px is wp-admin's own control height, so the select
1494 is the one corrected. Multi-selects are excluded - they size to their rows. */
1495 select.mlsimport-2025-select:not([multiple]){
1496 height: 40px;
1497 min-height: 40px;
1498 padding-top: 0;
1499 padding-bottom: 0;
1500 }
1501
1502
1503 /* Save Changes on the Tools tab belongs to the two dropdowns above it, so it gets
1504 no gap of its own on top; the space goes underneath, before the next block.
1505 wp-admin's default .submit padding (1.5em 0) put air on both sides. */
1506 form[name="cleanup_options"] p.submit{
1507 margin: 0 0 20px 0;
1508 padding: 0;
1509 }
1510
1511
1512 /* Focus ring on the palette. wp-admin core (forms.css) focuses controls with
1513 admin blue - `select:focus { border-color: #2271b1; box-shadow: 0 0 0 1px
1514 #2271b1 }` - which clashes with the warm neutrals. Same visual weight as
1515 core's (1px border + 1px ring), so the focus affordance stays as obvious as
1516 it was; only the hue changes. */
1517 /* The selectors below repeat the full base-rule specificity plus :focus. The
1518 base rule is `input[type=text].mlsimport-input.mlsimport-2025-input` (0,3,1),
1519 which outranks core's `input:focus` (0,1,1) - so until now a focused text
1520 field kept its resting border and showed NO focus state at all, core's
1521 included. A field being typed into has to look different from one that is
1522 not. */
1523 input[type=text].mlsimport-input.mlsimport-2025-input:focus,
1524 input[type=password].mlsimport-input.mlsimport-2025-input:focus,
1525 .mlsimport-input.mlsimport-2025-input:focus,
1526 select.mlsimport-2025-select:focus,
1527 /* #mlsimport_mls_name_front sets border-color from an ID (1,0,0), which outranks
1528 the class selectors above (0,4,1). Without naming the ID here the MLS search
1529 box keeps its resting border and shows no focus state at all. */
1530 #mlsimport_mls_name_front:focus{
1531 border-color: var(--primary-color);
1532 /* An actual border, not a glow. Width stays 1px so the padding box does not
1533 shrink on focus and the text never jiggles; the contrast jump from the
1534 rgba(28,25,23,0.18) hairline to solid near-black carries the state on its
1535 own. Both controls are border-box, so the 40px height is unaffected. */
1536 box-shadow: none;
1537 outline: none;
1538 }
1539
1540
1541 /* ===== One accent for every active state =====
1542 The plugin screens were showing three different "active" colours at once: the
1543 dark resting hairline, the accent focus ring, and wp-admin/browser blue on the
1544 open dropdown's highlighted row. Everything that signals focus or selection
1545 now uses --accent-color; the neutral hairline stays neutral, because a resting
1546 border is not a state.
1547
1548 Focus and selection are BLACK (--primary-color), matching hover, so a control
1549 never shows two different "active" colours. accent-color still fills checked
1550 checkboxes and radios - that is a checked state, not a focus state.
1551
1552 The open <select> popup is NOT styled here. It used to carry
1553
1554 .mlsimport-2025-select option:checked { background: linear-gradient(...);
1555 color: #fff }
1556
1557 on the belief that the gradient was the one declaration Chrome honours inside
1558 a native popup. It is not: Chrome applies the colour and drops the gradient,
1559 so the already-selected row rendered white-on-white and read as a blank line
1560 in the list - e.g. "logs enabled" vanishing from the Tools dropdown. A
1561 stylesheet cannot guarantee the pair, and half the pair is worse than none,
1562 so the popup keeps the browser's own highlight. That is the one place on
1563 these screens where a native blue row can still appear; it is legible, which
1564 the override was not. */
1565 body.wp-admin[class*="_page_mlsimport"],
1566 body.wp-admin.post-type-mlsimport_item{
1567 accent-color: var(--accent-color);
1568 }
1569
1570
1571 /* No wp-admin blue anywhere on the plugin's own screens. Core links are
1572 #2271b1; on this warm palette they were the last blue left once the focus
1573 ring and the dropdown highlight moved to the accent.
1574
1575 Scoped to #wpbody-content on purpose: that is the plugin's content area only.
1576 Body-level scoping would repaint the admin sidebar and the footer too, which
1577 belong to WordPress, not to us. */
1578 /* Body text links only. Tabs and buttons are EXCLUDED - they carry their own
1579 colour scheme (dark tab = white label), and recolouring them turned every tab
1580 label red. */
1581 body.wp-admin[class*="_page_mlsimport"] #wpbody-content a:not(.nav-tab):not(.button):not(.button-primary):not(.button-secondary),
1582 body.wp-admin.post-type-mlsimport_item #wpbody-content a:not(.nav-tab):not(.button):not(.button-primary):not(.button-secondary){
1583 color: var(--primary-color);
1584 }
1585 body.wp-admin[class*="_page_mlsimport"] #wpbody-content a:not(.nav-tab):not(.button):not(.button-primary):not(.button-secondary):hover,
1586 body.wp-admin.post-type-mlsimport_item #wpbody-content a:not(.nav-tab):not(.button):not(.button-primary):not(.button-secondary):hover{
1587 color: var(--primary-hover);
1588 }
1589
1590 /* Keyboard/click focus ring on links, tabs and buttons. wp-admin core focuses
1591 these with `box-shadow: 0 0 0 1px #2271b1` plus a blue outline - that is the
1592 blue box that appears around a tab after clicking it. Same weight, accent
1593 hue, and the label colour is left alone so a dark tab keeps its white text. */
1594 body.wp-admin[class*="_page_mlsimport"] #wpbody-content a:focus,
1595 body.wp-admin[class*="_page_mlsimport"] #wpbody-content .nav-tab:focus,
1596 body.wp-admin[class*="_page_mlsimport"] #wpbody-content .button:focus,
1597 body.wp-admin.post-type-mlsimport_item #wpbody-content a:focus,
1598 body.wp-admin.post-type-mlsimport_item #wpbody-content .button:focus{
1599 box-shadow: 0 0 0 2px rgba(28,25,23,0.15);
1600 border-color: var(--primary-color);
1601 outline: 2px solid transparent; /* stays visible in forced-colours mode */
1602 outline-offset: 0;
1603 }
1604
1605 /* ...but not on the pastel intent pills. Each of those borders in its own
1606 colour, so the near-black border-color above drew a stray black outline
1607 around the mint Save Changes and the red delete the moment they were
1608 clicked - the one thing the near-black was introduced to stop happening in
1609 admin blue. They keep their own border and take the focus halo in their own
1610 hue, so the affordance is as obvious as before without a foreign line. */
1611 body.wp-admin[class*="_page_mlsimport"] #wpbody-content .button.save_data:focus,
1612 body.wp-admin.post-type-mlsimport_item #wpbody-content .button.save_data:focus{
1613 border-color: var(--success-soft);
1614 box-shadow: 0 0 0 2px rgba(28, 92, 58, 0.28);
1615 }
1616
1617 body.wp-admin[class*="_page_mlsimport"] #wpbody-content .button.warning_action:focus,
1618 body.wp-admin.post-type-mlsimport_item #wpbody-content .button.warning_action:focus{
1619 border-color: var(--warning-soft);
1620 box-shadow: 0 0 0 2px rgba(122, 84, 16, 0.28);
1621 }
1622
1623 body.wp-admin[class*="_page_mlsimport"] #wpbody-content .button.error_action:focus,
1624 body.wp-admin.post-type-mlsimport_item #wpbody-content .button.error_action:focus{
1625 border-color: var(--error-color);
1626 box-shadow: 0 0 0 2px rgba(192, 38, 23, 0.30);
1627 }
1628