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
← All changes | admin/css/mlsimport-admin.css +1039 -120 6.0.47.2.1 View file →
@@ -1,29 +1,67 @@
1 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 +
2 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. */
3 21 :root {
4 - --primary-color: #4F46E5;
5 - --primary-hover: #4338CA;
6 - --success-color: #10B981;
7 - --error-color: #EF4444;
8 - --warning-color: #F59E0B;
9 - --text-primary: #111827;
10 - --text-secondary: #4B5563;
11 - --text-light: #6B7280;
12 - --border-color: #DCDFE4;
13 - --background-light: #F9FAFB;
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;
14 41 --background-white: #FFFFFF;
15 42 --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
16 43 --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
17 - --border-radius: 8px;
44 + --border-radius: 10px;
45 + --radius-card: 18px;
46 + --radius-pill: 999px;
18 47 --transition-speed: 0.2s;
19 48 }
20 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 +}
21 57
22 58
23 59
60 +
24 61 /*Real Homes admin adjusments*/
25 62
63 +/* Constrain the thumbnail column image on the Real Homes property list table. */
26 64 .post-type-property .column-property-thumbnail img{
27 65 width: 130px;
28 66 height: auto;
29 67 }
@@ -37,8 +75,9 @@
37 75
38 76
39 77
40 78
79 +/* Field-mapping row title. */
41 80 .mlsfield_import_title {
42 81 margin: 0px 0px 10px 0px;
43 82 font-size: 15px;
44 83 }
@@ -48,17 +87,18 @@
48 87 margin: 10px 0px 5px 0px;
49 88 }
50 89
51 90 .mls_mandatory_fields{
52 - color: #888;
91 + color: #6b6358;
53 92 margin-bottom: 10px;
54 93 max-width: 600px;
55 94 }
56 95 .mandatory_fields_wrapper_exp{
57 - color: #888;
96 + color: #6b6358;
58 97 max-width: 600px;
59 98 }
60 99
100 +/* Form field label (note: overridden later by the 2025 .mlsimport-label rule). */
61 101 .mlsimport-label{
62 102 font-weight: 600;
63 103 display: inline-block;
64 104 float: left;
@@ -66,8 +106,9 @@
66 106 line-height: 1.6em;
67 107 font-size: 14px;
68 108 }
69 109
110 +/* Helper / explanation text under fields. */
70 111 .mls_explanations{
71 112 line-height: 1.6em;
72 113 }
73 114
@@ -105,9 +146,9 @@
105 146 }
106 147
107 148
108 149 #mlsimport_mls_name_front{
109 - border-color: #ccc;
150 + border-color: rgba(28,25,23,0.18);
110 151 min-width: 450px;
111 152 padding: 5px 12px;
112 153 }
113 154
@@ -113,8 +154,9 @@
113 154
114 155
115 156
116 157
158 +/* Styled dropdown used in field mapping/settings: bordered, rounded, subtle shadow. */
117 159 .wp-admin select.mlsimport-select{
118 160 max-width: 450px;
119 161 padding: 5px 12px;
120 162 width: 100%;
@@ -122,9 +164,9 @@
122 164 display: inline-flex;
123 165 flex-direction: column;
124 166 align-items: flex-start;
125 167 isolation: isolate;
126 - border: 1px solid #DCDFE4;
168 + border: 1px solid rgba(28,25,23,0.18);
127 169 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
128 170 border-radius: 8px;
129 171 flex: none;
130 172 align-self: stretch;
@@ -132,12 +174,13 @@
132 174 .wp-admin select.mlsimport-select option{
133 175 padding: 3px 0px;
134 176 }
135 177
178 +/* Grey rounded panel wrapping a group of import parameters. */
136 179 .mlsimport_param_wrapper{
137 - background-color: #f5f5f5;
180 + background-color: #f3efe7;
138 181 padding:20px;
139 - border-radius: 5px;
182 + border-radius: 14px;
140 183 }
141 184
142 185 .postbox .inside .mlsimport_param_wrapper h2{
143 186 font-size: 20px!important;
@@ -146,8 +189,10 @@
146 189 padding-bottom: 19px!important;
147 190 }
148 191
149 192
193 +/* Field-mapping layout: each item is a vertical column; wrapper lays items in a
194 + horizontal flex row with spacing. */
150 195 .mlsimport-fieldset-item{
151 196 display: flex;
152 197 flex-direction: column;
153 198 }
@@ -165,10 +210,11 @@
165 210 padding: 10px 20px;
166 211 margin: 0px;
167 212 }
168 213
214 +/* Zebra-stripe alternating fieldsets in the mandatory-fields list. */
169 215 .mandatory_fields_wrapper .mlsimport-fieldset:nth-child(even){
170 - background-color: #f7f7f7;
216 + background-color: #f3efe7;
171 217 }
172 218
173 219 .mlsimport_auto_switch{
174 220 margin: 0px;
@@ -174,10 +220,11 @@
174 220 margin: 0px;
175 221 padding: 10px;
176 222 }
177 223
224 +/* "Select all" pill button (pink); darker on hover. */
178 225 .mls_import_selec_all_class {
179 - background-color: #cc3459;
226 + background-color: var(--primary-color);
180 227 color: #fff;
181 228 display: inline-block;
182 229 padding: 5px;
183 230 margin-right: 10px;
@@ -183,15 +230,18 @@
183 230 margin-right: 10px;
184 231 margin-bottom: 5px;
185 232 cursor: pointer;
186 233 padding: 7px 14px;
187 - border-radius:5px;
234 + border-radius: var(--radius-pill);
188 235 }
189 236
190 237 .mls_import_selec_all_class:hover {
191 - background-color: #a31034;
238 + background-color: #33302b;
192 239 }
193 240
241 +/* ===== Import progress bar + transfer controls + live log ===== */
242 +
243 +/* Outer progress wrapper (this selector is declared again below). */
194 244 #mlsimport_myProgress_wrapper{
195 245 width:800px;
196 246 margin-top: 10px;
197 247 /* display:none;*/
@@ -196,21 +246,24 @@
196 246 margin-top: 10px;
197 247 /* display:none;*/
198 248 }
199 249
250 +/* "Stop transfer" button (red); note a later rule overrides display to none. */
200 251 #mlsimport_transfer_stop{
201 - padding: 7px;
202 - background: #af3737;
252 + padding: 7px 16px;
253 + background: #c02617;
203 254 color: #fff;
255 + border-radius: var(--radius-pill);
204 256 display: inline-block;
205 257 margin-top: 10px;
206 258 cursor: pointer;
207 259 }
208 260
261 +/* Progress fill bar — width is animated from 0% via JS as items import. */
209 262 #mlsimport_myBar{
210 263 width: 0%;
211 264 height: 20px;
212 - background-color: green;
265 + background-color: #e85d3c;
213 266 }
214 267
215 268 #mlsimport_myProgress_wrapper{
216 269 width:800px;
@@ -217,19 +270,23 @@
217 270 margin-top: 10px;
218 271 /* display:none;*/
219 272 }
220 273
274 +/* Track background for the "monster" (full-width) progress bar. */
221 275 #mlsimport_monster_myProgress {
222 276 width: 100%;
223 - background-color: #cbc8c8;
277 + background-color: #efe7dc;
224 278 }
279 +/* Hide the stop button by default (JS shows it while a transfer runs). */
225 280 #mlsimport_transfer_stop{
226 281 display: none;
227 282 }
228 283
284 +/* Scrollable live import log panel. */
229 285 #log_container{
230 286 width: 750px;
231 - background: #f1f1f1;
287 + background: #f3efe7;
288 + border-radius: var(--border-radius);
232 289 padding: 15px;
233 290 margin-top: 15px;
234 291 max-height: 500px;
235 292 overflow-y: auto;
@@ -245,8 +302,9 @@
245 302 #mlsimport_stop_item,
246 303 #mlsimport-start_item{
247 304 display: inline-block;
248 305 margin: 0px 10px 30px 0px;
306 + line-height: normal;
249 307 }
250 308
251 309 .mlsimport_hidden_field_button {
252 310 max-width: 450px;
@@ -259,15 +317,10 @@
259 317 max-width: 800px;
260 318 margin-top: 5px;
261 319 }
262 320
263 -.mlsimport_tool_field_item_wrapper{
264 - margin-bottom: 30px;
265 -}
266 -#mlsimport-disable-history,
267 -#mlsimport-disable-logs{
268 - margin-top: 10px;
269 -}
321 +/* Tools-tab blocks are defined at the end of this file, so they win ties
322 + against the later 2025 overrides. */
270 323
271 324
272 325
273 326
@@ -278,8 +331,10 @@
278 331
279 332
280 333
281 334 /*==WpResidence*/
335 +/* Cap uploaded property thumbnail preview size (selector name is misspelled
336 + "thumb_wrapepr" to match the markup). */
282 337 #property_uploaded_thumb_wrapepr img{
283 338 max-width: 200px;
284 339 max-height: 200px;
285 340 }
@@ -286,33 +341,99 @@
286 341
287 342 table.media .column-title .media-icon img {
288 343 width:60px;
289 344 }
345 +/* Admin message banners (notification / validated / warning). Base is a pink
346 + box; individual variants below re-colour it. */
290 347 .mlsimport_notification,
291 348 .mlsimport_validated,
292 349 .mlsimport_warning{
293 - background: #cc3459;
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;
294 402 color: #fff;
295 - padding: 10px;
296 - margin-bottom: 10px;
297 - border-radius: 2px;
403 + font-size: 15px;
404 + font-weight: 700;
405 + line-height: 1.4;
406 + text-decoration: none;
298 407 }
299 408
409 +.mlsimport-account-subscription a.mlsimport-account-subscription-action:hover {
410 + background: #44403c;
411 + border-color: #44403c;
412 + color: #fff;
413 +}
300 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. */
301 421 .mlsimport_populate_warning{
302 - background: #4f46e5;
422 + background: var(--primary-color);
303 423 color: #fff;
304 - padding: 10px;
424 + padding: 12px 16px;
305 425 margin-bottom: 10px;
306 - border-radius: 2px;
426 + border-radius: var(--border-radius);
307 427 }
308 428
309 429
430 +/* "Validated" variant: amber-tinted background with a warning left border. */
310 431 .mlsimport_validated{
311 432 padding: 0.75rem 1rem;
312 433 margin-bottom: 1rem;
313 434 border-radius: var(--border-radius);
314 - background-color: rgba(245, 158, 11, 0.1);
435 + background-color: rgba(250, 227, 154, 0.4);
315 436 border-left: 4px solid var(--warning-color);
316 437 color: var(--text-primary);
317 438 }
318 439
@@ -317,28 +438,34 @@
317 438 }
318 439
319 440
320 441 .mlsimport_notification{
321 - background: #a5862b;
442 + background: var(--warning-soft);
443 + color: var(--warning-deep);
322 444 }
323 445
324 446
325 447 #mlsimport_item_metaboxes-sectionid .mlsimport_notification{
326 - background: #a5862b;
448 + background: var(--warning-soft);
449 + color: var(--warning-deep);
327 450 max-width: 500px;
328 451 }
329 452
330 453
454 +/* Scrollable status/output box inside the import-task metabox. */
331 455 #mlsimport_item_status{
332 456 width: auto;
333 - background-color: #f5f5f5;
457 + background-color: #f3efe7;
334 458 overflow-y: scroll;
335 459 padding: 10px;
336 - border-radius: 5px;
460 + border-radius: var(--border-radius);
337 461 margin-bottom: 15px;
338 462 }
339 463
340 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. */
341 468 label.mlsimport_switch {
342 469 position: absolute;
343 470 display: inline-block;
344 471 width: 53px!important;
@@ -359,9 +486,9 @@
359 486 top: 0;
360 487 left: 0;
361 488 right: 0;
362 489 bottom: 0;
363 - background-color: #ccc;
490 + background-color: rgba(28,25,23,0.18);
364 491 -webkit-transition: .4s;
365 492 transition: .4s;
366 493 }
367 494
@@ -376,14 +503,15 @@
376 503 -webkit-transition: .4s;
377 504 transition: .4s;
378 505 }
379 506
507 +/* Checked state: blue track, and the knob slides right (translateX below). */
380 508 .mlsimport_switch input:checked + .slider {
381 - background-color: #2196F3;
509 + background-color: #e85d3c;
382 510 }
383 511
384 512 .mlsimport_switch input:focus + .slider {
385 - box-shadow: 0 0 1px #2196F3;
513 + box-shadow: 0 0 1px #e85d3c;
386 514 }
387 515
388 516 .mlsimport_switch input:checked + .slider:before {
389 517 -webkit-transform: translateX(26px);
@@ -393,8 +521,9 @@
393 521
394 522
395 523
396 524
525 +/* Rounded (pill) variant of the toggle track and knob. */
397 526 .slider.round {
398 527 border-radius: 25px;
399 528 }
400 529 .slider.round:before {
@@ -409,12 +538,12 @@
409 538 #mlsimport-delete-prop{
410 539 margin-top: 15px;
411 540 }
412 541
413 -.fieldset_mlsimport_tresle_client_id,
414 -.fieldset_mlsimport_tresle_client_secret{
415 - display:none;
416 -}
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. */
417 546
418 547
419 548
420 549
@@ -419,9 +548,9 @@
419 548
420 549
421 550 .mlsimport_param_wrapper input[type=text]{
422 551 min-width: 450px;
423 - border-color: #ccc;
552 + border-color: rgba(28,25,23,0.18);
424 553 padding: 5px 12px;
425 554 }
426 555
427 556 #mlsimport_item_min_price,
@@ -430,12 +559,13 @@
430 559 max-width: 210px;
431 560 }
432 561
433 562
563 +/* Sign-up / account CTA box shown when no account is connected. */
434 564 .mlsimport_signup{
435 565 display: inline-block;
436 - background-color: #f0f0f1;
437 - border-radius: 5px;
566 + background-color: #f3efe7;
567 + border-radius: 14px;
438 568 padding: 20px;
439 569 font-size: 15px;
440 570 margin-bottom: 15px;
441 571 }
@@ -451,8 +581,9 @@
451 581 /*==WpEstate*/
452 582
453 583 /*==Houzez*/
454 584
585 +/* Houzez property list thumbnail column sizing. */
455 586 .column-thumbnail img {
456 587 max-width: 100%;
457 588 height: auto;
458 589 min-width:
@@ -463,17 +594,21 @@
463 594
464 595
465 596
466 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. */
467 600
601 +/* Tab content panel — hidden until activated. */
468 602 .content-nav-tab{
469 603 display:none;
470 604 padding: 30px 15px;
471 605 background: #fff;
472 - border: 1px solid #ccc;
606 + border: 1px solid rgba(28,25,23,0.18);
473 607 border-top: 0px;
474 608 }
475 609
610 +/* Active tab panel becomes a visible flex container. */
476 611 .content-nav-tab-active{
477 612 display: flex;
478 613 }
479 614
@@ -481,8 +616,9 @@
481 616 .content-nav-tab.mlsimport_2025_card{
482 617 width: auto;
483 618 }
484 619
620 +/* White rounded card with layered shadow (2025 card container). */
485 621 .mlsimport_2025_card{
486 622 flex-direction: column;
487 623 align-items: center;
488 624 padding: 0px;
@@ -487,10 +623,10 @@
487 623 align-items: center;
488 624 padding: 0px;
489 625
490 626 background: #FFFFFF;
491 - box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.06), 0px 5px 22px rgba(0, 0, 0, 0.04);
492 - border-radius: 10px;
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);
493 629 flex: none;
494 630 order: 0;
495 631 flex-grow: 1;
496 632
@@ -504,8 +640,9 @@
504 640 padding: 30px;
505 641 }
506 642
507 643
644 +/* Tab strip container (overrides WP core nav-tab-wrapper border). */
508 645 .nav-tab-wrapper.mlsimport-tab-wrapper{
509 646 border: none;
510 647 padding: 0px 15px;
511 648 margin-top: 50px;
@@ -514,22 +651,33 @@
514 651
515 652 .nav-tab-wrapper.mlsimport-tab-wrapper .nav-tab {
516 653
517 654 text-transform: uppercase;
518 - color: #23202c;
655 + color: var(--text-secondary);
519 656 padding: 15px 25px;
520 - background: #f1f1f1;
521 - border-top-right-radius:5px;
522 - border-top-left-radius: 5px;
657 + background: #f3efe7;
658 + border-top-right-radius: 12px;
659 + border-top-left-radius: 12px;
523 660
524 661 padding: 15px 30px;
525 662 background: #fff;
526 - border: 1px solid #ccc;
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);
527 667 }
528 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). */
529 675 .nav-tab-wrapper.mlsimport-tab-wrapper .nav-tab.nav-tab-active{
530 - background-color: #635BFF;
676 + background-color: var(--primary-color);
531 677 color: #fff;
678 + border-color: var(--primary-color);
679 + font-weight: 600;
532 680 }
533 681
534 682 .content-nav-tab.mlsimport_2025_card form{
535 683 max-width: 500px;
@@ -534,16 +682,62 @@
534 682 .content-nav-tab.mlsimport_2025_card form{
535 683 max-width: 500px;
536 684 }
537 685
538 -.content-nav-tab.mlsimport_2025_card form.mlsimport-import-fields-form{
539 - max-width: 100%;
686 +.mlsimport_2025_card_admin_options {
687 + display: flex;
688 + flex-direction: row;
540 689 }
541 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 +}
542 704
705 +.mlsimport-steps ol {
706 + list-style: none;
707 + counter-reset: step-counter;
708 + padding: 0;
709 +}
543 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 +}
544 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 +
545 737 /*==2025 Inputs*/
738 +/* Shared styling for text/password/select inputs in the 2025 UI:
739 + bordered, rounded, subtle shadow, inline-flex layout. */
546 740
547 741 input[type=password].mlsimport-input.mlsimport-2025-input,
548 742 input[type=text].mlsimport-input.mlsimport-2025-input,
549 743 .mlsimport-input.mlsimport-2025-input{
@@ -553,9 +747,9 @@
553 747 flex-direction: column;
554 748 align-items: flex-start;
555 749 isolation: isolate;
556 750 background: #FFFFFF;
557 - border: 1px solid #DCDFE4;
751 + border: 1px solid rgba(28,25,23,0.18);
558 752 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
559 753 border-radius: 8px;
560 754 flex: none;
561 755 order: 1;
@@ -562,8 +756,10 @@
562 756 align-self: stretch;
563 757 flex-grow: 0;
564 758 display: inline-flex;
565 759 }
760 +/* 2025 label override (later in the file, so it wins over the earlier
761 + .mlsimport-label float rule for these screens). */
566 762 .mlsimport-label {
567 763 display: block;
568 764 margin-bottom: 0px;
569 765 font-weight: 500;
@@ -578,9 +774,9 @@
578 774 display: inline-flex;
579 775 flex-direction: column;
580 776 align-items: flex-start;
581 777 isolation: isolate;
582 - border: 1px solid #DCDFE4;
778 + border: 1px solid rgba(28,25,23,0.18);
583 779 box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
584 780 border-radius: 8px;
585 781 flex: none;
586 782 align-self: stretch;
@@ -589,17 +785,24 @@
589 785
590 786
591 787
592 788
789 +/* Default bordered look for fieldset inputs and the import "select all" boxes. */
593 790 .mlsimport-fieldset-wrapper input,
594 791 input[type=checkbox].mlsimport_select_import_admin_all,
595 792 input[type=checkbox].mlsimport_select_import_all {
596 - border: 1px solid #ccc;
793 + border: 1px solid rgba(28,25,23,0.18);
597 794 border-radius: 2px;
598 795 background-color: #fff!important;
599 796 }
600 797
601 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. */
602 805 .button.mlsimport_button{
603 806 font-size: 14px;
604 807 position: relative;
605 808 display: flex;
@@ -605,78 +808,122 @@
605 808 display: flex;
606 809 flex-direction: column;
607 810 justify-content: center;
608 811 align-items: center;
609 - padding: 7px 30px;
610 - background: linear-gradient(180deg, #635BFF 0%, #4E36F5 100%);
611 - border: 1px solid #15B79F;
612 - border-radius: 8px;
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);
613 818 color:#fff;
614 819 flex: none;
615 820 order: 1;
616 821 flex-grow: 0;
617 - box-shadow: rgba(0, 0, 0, 0.08) 0px 1px 2px 0px, rgb(78, 54, 245) 0px 0px 0px 1px inset, rgba(255, 255, 255, 0.16) 0px 2px 0px 0px inset;
822 + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
823 + transition: background var(--transition-speed), box-shadow var(--transition-speed);
618 824 }
619 825
620 826 .button.mlsimport_button:hover {
621 - background: linear-gradient(180deg, #635BFF 0%, #4E36F5 100%);
827 + background: var(--primary-hover);
622 828 color:#fff;
623 - border: 1px solid #15B79F;
624 - box-shadow: 0px 3px 14px rgba(0, 0, 0, 0.08), inset 0px 0px 0px 1px #4e36f5,inset 0px 2px 0px 0px rgba(255, 255, 255, 0.16) , inset 0px 6px 10px 0px rgba(255, 255, 255, 0.10);
829 + border: 1px solid var(--primary-hover);
830 + box-shadow: 0 10px 24px -10px rgba(0, 0, 0, 0.45);
625 831 }
626 832
627 -.button.save_data {
628 - background: linear-gradient(180deg, var(--success-color) 0%, #0C8A61 100%);
629 - border: 1px solid var(--success-color);
630 - box-shadow: rgba(0, 0, 0, 0.08) 0px 1px 2px 0px, var(--success-color) 0px 0px 0px 1px inset, rgba(255, 255, 255, 0.16) 0px 2px 0px 0px inset;
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);
631 840 }
632 841
633 -.button.save_data:hover {
634 - background: linear-gradient(180deg, var(--success-color) 0%, #0C8A61 100%);
635 - border: 1px solid var(--success-color);
636 - box-shadow: 0px 3px 14px rgba(0, 0, 0, 0.08), inset 0px 0px 0px 1px var(--success-color), inset 0px 2px 0px 0px rgba(255, 255, 255, 0.16), inset 0px 6px 10px 0px rgba(255, 255, 255, 0.10);
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);
637 848 }
638 849
639 850
640 -.button.secondary {
641 - background: linear-gradient(180deg, #32383e 0%, #25292e 100%);
642 - border: 1px solid #32383e;
643 - color: #fff;
644 - box-shadow: rgba(0, 0, 0, 0.08) 0px 1px 2px 0px, rgb(50, 56, 62) 0px 0px 0px 1px inset, rgba(255, 255, 255, 0.16) 0px 2px 0px 0px inset;
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);
645 861 }
646 -
647 - .button.secondary:hover {
648 - background: linear-gradient(180deg, #32383e 0%, #25292e 100%);
649 - border: 1px solid #32383e;
650 - color: #fff;
651 - box-shadow: 0px 3px 14px rgba(0, 0, 0, 0.08), inset 0px 0px 0px 1px #32383e, inset 0px 2px 0px 0px rgba(255, 255, 255, 0.16), inset 0px 6px 10px 0px rgba(255, 255, 255, 0.10);
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);
652 870 }
653 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 +}
654 887
655 888
656 - .button.warning_action {
657 - background: linear-gradient(180deg, #fb9c0c 0%, #d0810a 100%);
658 - border: 1px solid #fb9c0c;
659 - box-shadow: rgba(0, 0, 0, 0.08) 0px 1px 2px 0px, #fb9c0c 0px 0px 0px 1px inset, rgba(255, 255, 255, 0.16) 0px 2px 0px 0px inset;
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);
660 897 }
661 -
662 - .button.warning_action:hover {
663 - background: linear-gradient(180deg, #fb9c0c 0%, #d0810a 100%);
664 - border: 1px solid #fb9c0c;
665 - box-shadow: 0px 3px 14px rgba(0, 0, 0, 0.08), inset 0px 0px 0px 1px #fb9c0c, inset 0px 2px 0px 0px rgba(255, 255, 255, 0.16), inset 0px 6px 10px 0px rgba(255, 255, 255, 0.10);
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);
666 905 }
667 906
668 907
669 - .button.error_action {
670 - background: linear-gradient(180deg, #bb241a 0%, #9b1e16 100%);
671 - border: 1px solid #bb241a;
672 - box-shadow: rgba(0, 0, 0, 0.08) 0px 1px 2px 0px, #bb241a 0px 0px 0px 1px inset, rgba(255, 255, 255, 0.16) 0px 2px 0px 0px inset;
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);
673 918 }
674 -
675 - .button.error_action:hover {
676 - background: linear-gradient(180deg, #bb241a 0%, #9b1e16 100%);
677 - border: 1px solid #bb241a;
678 - box-shadow: 0px 3px 14px rgba(0, 0, 0, 0.08), inset 0px 0px 0px 1px #bb241a, inset 0px 2px 0px 0px rgba(255, 255, 255, 0.16), inset 0px 6px 10px 0px rgba(255, 255, 255, 0.10);
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);
679 926 }
680 927
681 928
682 929
@@ -691,8 +938,12 @@
691 938
692 939
693 940
694 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. */
695 946 input[type=checkbox].mlsimport-import-checkbox,
696 947 input[type=checkbox].mlsimport-admin-checkbox {
697 948 appearance: none;
698 949 -webkit-appearance: none;
@@ -713,9 +964,9 @@
713 964 top: 0;
714 965 left: 0;
715 966 width: 24px;
716 967 height: 24px;
717 - 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='%23DCDFE4' fill-rule='evenodd'></path></svg>");
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>");
718 969 background-size: 24px 24px;
719 970 background-position: center;
720 971 background-repeat: no-repeat;
721 972 margin: 0px;
@@ -720,16 +971,19 @@
720 971 background-repeat: no-repeat;
721 972 margin: 0px;
722 973 }
723 974
975 + /* Checked state swaps in the filled indigo box + white tick SVG. */
724 976 input[type=checkbox].mlsimport-import-checkbox:checked:before,
725 977 input[type=checkbox].mlsimport-admin-checkbox:checked:before {
726 - 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='%23635bff' 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>");
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>");
727 979 }
728 980
729 981
730 982
731 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. */
732 986 .mlsimport-save-progress {
733 987 position: fixed;
734 988 top: 50%;
735 989 left: 50%;
@@ -736,9 +990,9 @@
736 990 transform: translate(-50%, -50%);
737 991 z-index: 9999;
738 992 background: #fff;
739 993 padding: 40px;
740 - border-radius: 10px;
994 + border-radius: var(--radius-card);
741 995 /* border: 1px solid #ddd; */
742 996 box-shadow: 0 7px 54px rgba(0, 0, 0, 0.15);
743 997 width: 500px;
744 998 min-height: 200px;
@@ -756,17 +1010,682 @@
756 1010 }
757 1011
758 1012 .mlsimport-save-progress-bar {
759 1013 height: 10px;
760 - background: #eee;
1014 + background: #f3efe7;
761 1015 margin-top: 5px;
762 1016 border-radius: 5px;
763 1017 overflow: hidden;
764 1018 }
765 1019
1020 +/* Animated fill inside the save progress bar (width driven by JS). */
766 1021 .mlsimport-save-progress-bar .progress-fill {
767 1022 width: 0%;
768 1023 height: 100%;
769 - background: #635BFF;
1024 + background: var(--accent-color);
770 1025 border-radius: 5px;
771 1026 transition: width 0.3s;
772 -}
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 +}