| 1 |
/** |
| 2 |
* mlsimport-multiselect — dropdown multi-select styling (front end + admin). |
| 3 |
* Enhances <select multiple class="mlsimport-multiselect">; the native select is |
| 4 |
* visually removed but kept for form submission. Modeled on the WPResidence search |
| 5 |
* dropdowns: a chip control, a searchable checkbox panel. |
| 6 |
*/ |
| 7 |
|
| 8 |
.mlsimport-ms { |
| 9 |
position: relative; |
| 10 |
} |
| 11 |
|
| 12 |
/* Keep a search field locked to its flex basis: a flex item defaults to |
| 13 |
min-width:auto (its content width), so wide chips would widen the column and |
| 14 |
shift the whole form. min-width:0 lets the control clip instead of grow. */ |
| 15 |
.mlsimport-search__field, |
| 16 |
.mlsimport-search-form__field { |
| 17 |
min-width: 0; |
| 18 |
} |
| 19 |
|
| 20 |
/* Shown in place of the chips when they don't fit — keeps the control one line. */ |
| 21 |
.mlsimport-ms__summary { |
| 22 |
color: inherit; |
| 23 |
white-space: nowrap; |
| 24 |
overflow: hidden; |
| 25 |
text-overflow: ellipsis; |
| 26 |
} |
| 27 |
|
| 28 |
.mlsimport-ms__native { |
| 29 |
position: absolute; |
| 30 |
width: 1px; |
| 31 |
height: 1px; |
| 32 |
margin: -1px; |
| 33 |
padding: 0; |
| 34 |
overflow: hidden; |
| 35 |
clip: rect(0 0 0 0); |
| 36 |
border: 0; |
| 37 |
opacity: 0; |
| 38 |
pointer-events: none; |
| 39 |
} |
| 40 |
|
| 41 |
/* Before the JS enhances it (data-ms-init is set in enhance()), a native |
| 42 |
<select multiple> paints its option rows — the flash on a cold load. Hide it |
| 43 |
outright; the 40px box keeps the enhanced control's footprint so nothing |
| 44 |
shifts when the widget replaces it. */ |
| 45 |
select.mlsimport-multiselect:not( [data-ms-init] ) { |
| 46 |
visibility: hidden; |
| 47 |
display: block; |
| 48 |
width: 100%; |
| 49 |
height: 40px; |
| 50 |
box-sizing: border-box; |
| 51 |
} |
| 52 |
|
| 53 |
/* :hover/:focus repeat the resting selector so an aggressive theme button reset |
| 54 |
(Hello Elementor's reset.css paints `button:hover`/`:focus` pink #c36 at 0,2,0) |
| 55 |
can't repaint the control on those states. The plugin's own state rules below |
| 56 |
(accent border on :focus / .is-open) are declared later and still win. */ |
| 57 |
.mlsimport-ms__control, |
| 58 |
.mlsimport-ms__control:hover, |
| 59 |
.mlsimport-ms__control:focus { |
| 60 |
display: flex; |
| 61 |
flex-wrap: nowrap; |
| 62 |
align-items: center; |
| 63 |
gap: 4px; |
| 64 |
width: 100%; |
| 65 |
height: 40px; |
| 66 |
margin: 0; |
| 67 |
padding: 5px 30px 5px 10px; |
| 68 |
border: 1px solid #e2e2e2; |
| 69 |
border-radius: 6px; |
| 70 |
background: #fff; |
| 71 |
font: inherit; |
| 72 |
line-height: 1.4; |
| 73 |
color: inherit; |
| 74 |
text-align: left; |
| 75 |
cursor: pointer; |
| 76 |
box-sizing: border-box; |
| 77 |
position: relative; |
| 78 |
overflow: hidden; |
| 79 |
} |
| 80 |
|
| 81 |
/* Chips stay on one line; the control's fixed height never grows. When they run |
| 82 |
past the edge they're clipped, and this fade signals there are more (it sits over |
| 83 |
white when nothing overflows, so it's invisible until chips reach it). */ |
| 84 |
.mlsimport-ms__control::after { |
| 85 |
content: ''; |
| 86 |
position: absolute; |
| 87 |
top: 1px; |
| 88 |
bottom: 1px; |
| 89 |
right: 24px; |
| 90 |
width: 24px; |
| 91 |
background: linear-gradient( to right, rgba( 255, 255, 255, 0 ), #fff 75% ); |
| 92 |
pointer-events: none; |
| 93 |
} |
| 94 |
|
| 95 |
/* 2px accent border on focus, matching every other field — see the focus block in |
| 96 |
mlsimport-listings.css. Set here too so it wins regardless of stylesheet order. |
| 97 |
|
| 98 |
`.is-open` is in the selector because clicking this control opens the dropdown and |
| 99 |
moves focus into the search input inside it, so :focus alone stops matching and |
| 100 |
the border dropped straight back to grey the moment you clicked. */ |
| 101 |
.mlsimport-ms__control:focus, |
| 102 |
.mlsimport-ms.is-open .mlsimport-ms__control { |
| 103 |
outline: none; |
| 104 |
border-color: var(--mli-accent); |
| 105 |
} |
| 106 |
|
| 107 |
.mlsimport-ms__placeholder { |
| 108 |
color: #8a8a8a; |
| 109 |
} |
| 110 |
|
| 111 |
.mlsimport-ms__chip { |
| 112 |
display: inline-flex; |
| 113 |
align-items: center; |
| 114 |
flex: 0 0 auto; |
| 115 |
gap: 6px; |
| 116 |
padding: 2px 7px 2px 10px; |
| 117 |
background: #eef1f5; |
| 118 |
border-radius: 12px; |
| 119 |
font-size: 13px; |
| 120 |
line-height: 1.7; |
| 121 |
white-space: nowrap; |
| 122 |
} |
| 123 |
|
| 124 |
.mlsimport-ms__chip-x { |
| 125 |
display: inline-flex; |
| 126 |
cursor: pointer; |
| 127 |
color: #8a8a8a; |
| 128 |
font-size: 15px; |
| 129 |
line-height: 1; |
| 130 |
} |
| 131 |
|
| 132 |
.mlsimport-ms__chip-x:hover { |
| 133 |
color: #c0392b; |
| 134 |
} |
| 135 |
|
| 136 |
/* Keep in sync with .mlsimport-range__toggle::after / .mlsimport-bedsbaths__toggle::after |
| 137 |
in mlsimport-search-popups.css — every closed search control carries the same caret. */ |
| 138 |
.mlsimport-ms__caret { |
| 139 |
position: absolute; |
| 140 |
right: 12px; |
| 141 |
top: 50%; |
| 142 |
width: 5px; |
| 143 |
height: 5px; |
| 144 |
border-right: 1.5px solid #8a8a8a; |
| 145 |
border-bottom: 1.5px solid #8a8a8a; |
| 146 |
transform: translateY( -65% ) rotate( 45deg ); |
| 147 |
pointer-events: none; |
| 148 |
} |
| 149 |
|
| 150 |
.mlsimport-ms__dropdown { |
| 151 |
display: none; |
| 152 |
position: absolute; |
| 153 |
z-index: 60; |
| 154 |
left: 0; |
| 155 |
right: 0; |
| 156 |
top: calc( 100% + 4px ); |
| 157 |
background: #fff; |
| 158 |
border: 1px solid #e2e2e2; |
| 159 |
border-radius: 6px; |
| 160 |
box-shadow: 0 6px 22px rgba( 0, 0, 0, 0.13 ); |
| 161 |
overflow: hidden; |
| 162 |
} |
| 163 |
|
| 164 |
.mlsimport-ms.is-open .mlsimport-ms__dropdown { |
| 165 |
display: block; |
| 166 |
} |
| 167 |
|
| 168 |
.mlsimport-ms__search { |
| 169 |
width: 100%; |
| 170 |
box-sizing: border-box; |
| 171 |
padding: 9px 11px; |
| 172 |
border: 0; |
| 173 |
border-bottom: 1px solid #eee; |
| 174 |
font: inherit; |
| 175 |
outline: none; |
| 176 |
} |
| 177 |
|
| 178 |
.mlsimport-ms__options { |
| 179 |
max-height: 240px; |
| 180 |
overflow-y: auto; |
| 181 |
} |
| 182 |
|
| 183 |
.mlsimport-ms__option { |
| 184 |
display: flex; |
| 185 |
align-items: center; |
| 186 |
gap: 9px; |
| 187 |
padding: 8px 11px; |
| 188 |
cursor: pointer; |
| 189 |
font-size: 14px; |
| 190 |
} |
| 191 |
|
| 192 |
.mlsimport-ms__option:hover { |
| 193 |
background: #f3f5f8; |
| 194 |
} |
| 195 |
|
| 196 |
.mlsimport-ms__check { |
| 197 |
flex: 0 0 16px; |
| 198 |
width: 16px; |
| 199 |
height: 16px; |
| 200 |
border: 1px solid #c4c4c4; |
| 201 |
border-radius: 4px; |
| 202 |
background: #fff; |
| 203 |
position: relative; |
| 204 |
} |
| 205 |
|
| 206 |
.mlsimport-ms__option.is-selected .mlsimport-ms__check { |
| 207 |
background: var(--mli-accent); |
| 208 |
border-color: var(--mli-accent); |
| 209 |
} |
| 210 |
|
| 211 |
.mlsimport-ms__option.is-selected .mlsimport-ms__check::after { |
| 212 |
content: ''; |
| 213 |
position: absolute; |
| 214 |
left: 5px; |
| 215 |
top: 2px; |
| 216 |
width: 4px; |
| 217 |
height: 8px; |
| 218 |
border: solid #fff; |
| 219 |
border-width: 0 2px 2px 0; |
| 220 |
transform: rotate( 45deg ); |
| 221 |
} |
| 222 |
|