PluginProbe
MLSImport: IDX Plugin & MLS Plugin for Real Estate Listings / 7.2.1
MLSImport: IDX Plugin & MLS Plugin for Real Estate Listings v7.2.1
7.2.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 All 36 releases
mlsimport / admin / css / mlsimport-admin.css

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

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