@braudypedrosa/bp-listings 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,891 @@
1
+ /* ============================================
2
+ ListingsMap - Airbnb-style Listings + Map Widget
3
+ Standalone CSS - No dependencies required
4
+ ============================================ */
5
+
6
+ /* Reset & Base */
7
+ .lm-widget *,
8
+ .lm-widget *::before,
9
+ .lm-widget *::after {
10
+ box-sizing: border-box;
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+
15
+ .lm-widget {
16
+ --lm-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
17
+ --lm-color-text: #222222;
18
+ --lm-color-text-secondary: #717171;
19
+ --lm-color-border: #dddddd;
20
+ --lm-color-bg: #ffffff;
21
+ --lm-color-heart: #ff385c;
22
+ --lm-color-badge-bg: #ffffff;
23
+ --lm-color-badge-text: #222222;
24
+ --lm-color-star: #222222;
25
+ --lm-color-superhost-bg: #222222;
26
+ --lm-color-superhost-text: #ffffff;
27
+ --lm-color-price-marker-bg: #ffffff;
28
+ --lm-color-price-marker-text: #222222;
29
+ --lm-color-price-marker-hover-bg: #222222;
30
+ --lm-color-price-marker-hover-text: #ffffff;
31
+ --lm-color-price-marker-active-bg: #222222;
32
+ --lm-color-price-marker-active-text: #ffffff;
33
+ --lm-radius: 12px;
34
+ --lm-radius-sm: 8px;
35
+
36
+ font-family: var(--lm-font);
37
+ color: var(--lm-color-text);
38
+ background: var(--lm-color-bg);
39
+ width: 100%;
40
+ height: 100%;
41
+ min-height: 600px; /* Ensure map has space when parent height is not set */
42
+ display: flex;
43
+ position: relative;
44
+ overflow: hidden;
45
+ min-width: 0;
46
+ }
47
+
48
+ /* ---- Layout ---- */
49
+ .lm-listings-panel {
50
+ flex: 0 0 58%;
51
+ max-width: 58%;
52
+ min-width: 0;
53
+ height: 100%;
54
+ overflow-y: auto;
55
+ padding: 24px;
56
+ scrollbar-width: none; /* Firefox */
57
+ -ms-overflow-style: none; /* IE / Edge */
58
+ position: relative;
59
+ z-index: 10; /* Above map so calendar/datepicker popup is not overlapped */
60
+ }
61
+
62
+ .lm-listings-panel::-webkit-scrollbar {
63
+ display: none; /* Chrome, Safari, Opera */
64
+ }
65
+
66
+ .lm-listings-grid {
67
+ display: grid;
68
+ grid-template-columns: repeat(2, minmax(0, 1fr));
69
+ gap: 24px;
70
+ align-items: start;
71
+ min-width: 0;
72
+ }
73
+
74
+ /* Prevent grid items from overflowing their cell (fixes overlap) */
75
+ .lm-listings-grid > * {
76
+ min-width: 0;
77
+ overflow: hidden;
78
+ }
79
+
80
+ .lm-map-panel {
81
+ flex: 1;
82
+ height: 100%;
83
+ position: relative;
84
+ z-index: 1; /* Below listings panel so calendar popup stays on top */
85
+ border-left: 1px solid var(--lm-color-border);
86
+ }
87
+
88
+ .lm-map-panel .lm-map-container {
89
+ width: 100%;
90
+ height: 100%;
91
+ min-height: 400px; /* Leaflet needs non-zero height; fallback if flex height fails */
92
+ }
93
+
94
+ /* ---- Search Slot ---- */
95
+ .lm-search-slot {
96
+ margin-bottom: 16px;
97
+ }
98
+
99
+ /* ---- Toolbar ---- */
100
+ .lm-toolbar {
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: space-between;
104
+ gap: 12px;
105
+ padding-bottom: 16px;
106
+ }
107
+
108
+ .lm-toolbar-left {
109
+ display: flex;
110
+ align-items: center;
111
+ gap: 10px;
112
+ }
113
+
114
+ .lm-toolbar-right {
115
+ display: flex;
116
+ align-items: center;
117
+ gap: 10px;
118
+ }
119
+
120
+ /* Sort Dropdown */
121
+ .lm-sort-wrapper {
122
+ position: relative;
123
+ }
124
+
125
+ .lm-sort-select {
126
+ appearance: none;
127
+ -webkit-appearance: none;
128
+ background: var(--lm-color-bg);
129
+ border: 1px solid var(--lm-color-border);
130
+ border-radius: 24px;
131
+ padding: 8px 36px 8px 16px;
132
+ font-size: 14px;
133
+ font-weight: 500;
134
+ font-family: var(--lm-font);
135
+ color: var(--lm-color-text);
136
+ cursor: pointer;
137
+ outline: none;
138
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
139
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' fill='none' stroke='%23222' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpolyline points='3 6 8 11 13 6'/%3E%3C/svg%3E");
140
+ background-repeat: no-repeat;
141
+ background-position: right 12px center;
142
+ background-size: 14px;
143
+ }
144
+
145
+ .lm-sort-select:hover {
146
+ border-color: #222222;
147
+ }
148
+
149
+ .lm-sort-select:focus {
150
+ border-color: #222222;
151
+ box-shadow: 0 0 0 2px rgba(34, 34, 34, 0.1);
152
+ }
153
+
154
+ /* Map Toggle Button */
155
+ .lm-toggle-map-btn {
156
+ display: inline-flex;
157
+ align-items: center;
158
+ gap: 6px;
159
+ appearance: none;
160
+ background: var(--lm-color-bg);
161
+ border: 1px solid var(--lm-color-border);
162
+ border-radius: 24px;
163
+ padding: 8px 18px;
164
+ font-size: 14px;
165
+ font-weight: 500;
166
+ font-family: var(--lm-font);
167
+ color: var(--lm-color-text);
168
+ cursor: pointer;
169
+ outline: none;
170
+ transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
171
+ white-space: nowrap;
172
+ }
173
+
174
+ .lm-toggle-map-btn svg {
175
+ width: 16px;
176
+ height: 16px;
177
+ flex-shrink: 0;
178
+ }
179
+
180
+ .lm-toggle-map-btn:hover {
181
+ border-color: #222222;
182
+ }
183
+
184
+ .lm-toggle-map-btn:focus-visible {
185
+ border-color: #222222;
186
+ box-shadow: 0 0 0 2px rgba(34, 34, 34, 0.1);
187
+ }
188
+
189
+ .lm-widget.lm-map-hidden .lm-toggle-map-btn {
190
+ background: var(--lm-color-text);
191
+ color: var(--lm-color-bg);
192
+ border-color: var(--lm-color-text);
193
+ }
194
+
195
+ .lm-widget.lm-map-hidden .lm-toggle-map-btn svg {
196
+ stroke: var(--lm-color-bg);
197
+ }
198
+
199
+ /* ---- Map Hidden State ---- */
200
+ .lm-widget.lm-map-hidden .lm-map-panel {
201
+ display: none;
202
+ }
203
+
204
+ .lm-widget.lm-map-hidden .lm-listings-panel {
205
+ flex: 1 1 0%;
206
+ max-width: 100%;
207
+ }
208
+
209
+ .lm-widget.lm-map-hidden .lm-listings-grid {
210
+ grid-template-columns: repeat(3, 1fr);
211
+ }
212
+
213
+ /* ---- Pagination ---- */
214
+ .lm-pagination {
215
+ display: flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+ gap: 4px;
219
+ padding: 24px 0 8px;
220
+ }
221
+
222
+ .lm-pagination:empty {
223
+ display: none;
224
+ }
225
+
226
+ .lm-pagination-btn {
227
+ display: inline-flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ min-width: 36px;
231
+ height: 36px;
232
+ border-radius: 50%;
233
+ background: transparent;
234
+ border: none;
235
+ font-size: 14px;
236
+ font-weight: 500;
237
+ font-family: var(--lm-font);
238
+ color: var(--lm-color-text);
239
+ cursor: pointer;
240
+ transition: background 0.15s ease;
241
+ padding: 0 4px;
242
+ }
243
+
244
+ .lm-pagination-btn:hover:not([disabled]):not(.lm-pagination-btn-active) {
245
+ background: #f0f0f0;
246
+ }
247
+
248
+ .lm-pagination-btn-active {
249
+ background: var(--lm-color-text);
250
+ color: var(--lm-color-bg);
251
+ }
252
+
253
+ .lm-pagination-btn-active:hover {
254
+ background: var(--lm-color-text);
255
+ color: var(--lm-color-bg);
256
+ }
257
+
258
+ .lm-pagination-btn[disabled] {
259
+ opacity: 0.3;
260
+ cursor: not-allowed;
261
+ }
262
+
263
+ .lm-pagination-btn-arrow {
264
+ border-radius: 50%;
265
+ }
266
+
267
+ .lm-pagination-btn-arrow svg {
268
+ width: 14px;
269
+ height: 14px;
270
+ stroke: currentColor;
271
+ stroke-width: 2.5;
272
+ fill: none;
273
+ stroke-linecap: round;
274
+ stroke-linejoin: round;
275
+ }
276
+
277
+ .lm-pagination-ellipsis {
278
+ display: inline-flex;
279
+ align-items: center;
280
+ justify-content: center;
281
+ width: 36px;
282
+ height: 36px;
283
+ font-size: 14px;
284
+ color: var(--lm-color-text-secondary);
285
+ user-select: none;
286
+ }
287
+
288
+ /* ---- Listing Card ---- */
289
+ .lm-card {
290
+ cursor: pointer;
291
+ position: relative;
292
+ transition: opacity 0.15s ease;
293
+ min-width: 0;
294
+ overflow: hidden;
295
+ }
296
+
297
+ .lm-card:hover {
298
+ opacity: 0.92;
299
+ }
300
+
301
+ .lm-card-active {
302
+ opacity: 1 !important;
303
+ }
304
+
305
+ /* ---- Image Carousel (square, full width of card, no side gaps) ---- */
306
+ .lm-carousel {
307
+ position: relative;
308
+ width: 100%;
309
+ border-radius: var(--lm-radius);
310
+ overflow: hidden;
311
+ background: #f0f0f0;
312
+ aspect-ratio: 1 / 1;
313
+ }
314
+
315
+ /* Fallback when aspect-ratio not supported: square via padding-bottom */
316
+ @supports not (aspect-ratio: 1 / 1) {
317
+ .lm-carousel {
318
+ height: 0;
319
+ padding-bottom: 100%;
320
+ }
321
+ }
322
+
323
+ .lm-carousel-track {
324
+ display: flex;
325
+ position: absolute;
326
+ top: 0;
327
+ left: 0;
328
+ width: 100%;
329
+ height: 100%;
330
+ transition: transform 0.3s cubic-bezier(0.25, 0.1, 0.25, 1);
331
+ will-change: transform;
332
+ }
333
+
334
+ .lm-carousel-slide {
335
+ flex: 0 0 100%;
336
+ width: 100%;
337
+ height: 100%;
338
+ min-width: 0;
339
+ overflow: hidden;
340
+ }
341
+
342
+ .lm-carousel-slide img {
343
+ width: 100%;
344
+ height: 100%;
345
+ object-fit: cover;
346
+ object-position: center;
347
+ display: block;
348
+ -webkit-user-drag: none;
349
+ user-select: none;
350
+ }
351
+
352
+ .lm-carousel-btn {
353
+ position: absolute;
354
+ top: 50%;
355
+ transform: translateY(-50%);
356
+ width: 32px;
357
+ height: 32px;
358
+ border-radius: 50%;
359
+ background: rgba(255, 255, 255, 0.9);
360
+ border: none;
361
+ cursor: pointer;
362
+ display: flex;
363
+ align-items: center;
364
+ justify-content: center;
365
+ z-index: 2;
366
+ opacity: 0;
367
+ transition: opacity 0.2s ease, transform 0.15s ease, box-shadow 0.15s ease;
368
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12);
369
+ }
370
+
371
+ .lm-carousel:hover .lm-carousel-btn {
372
+ opacity: 1;
373
+ }
374
+
375
+ .lm-carousel-btn:hover {
376
+ background: #ffffff;
377
+ transform: translateY(-50%) scale(1.05);
378
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);
379
+ }
380
+
381
+ .lm-carousel-btn:active {
382
+ transform: translateY(-50%) scale(0.97);
383
+ }
384
+
385
+ .lm-carousel-btn-prev {
386
+ left: 8px;
387
+ }
388
+
389
+ .lm-carousel-btn-next {
390
+ right: 8px;
391
+ }
392
+
393
+ .lm-carousel-btn svg {
394
+ width: 12px;
395
+ height: 12px;
396
+ stroke: #222222;
397
+ stroke-width: 3;
398
+ fill: none;
399
+ stroke-linecap: round;
400
+ stroke-linejoin: round;
401
+ }
402
+
403
+ .lm-carousel-btn[disabled] {
404
+ opacity: 0 !important;
405
+ pointer-events: none;
406
+ }
407
+
408
+ /* Carousel Dots (inside container, not cut off by border-radius) */
409
+ .lm-carousel-dots {
410
+ position: absolute;
411
+ bottom: 14px;
412
+ left: 50%;
413
+ transform: translateX(-50%);
414
+ display: flex;
415
+ gap: 5px;
416
+ z-index: 2;
417
+ padding: 0 8px;
418
+ max-width: 100%;
419
+ box-sizing: border-box;
420
+ }
421
+
422
+ .lm-carousel-dot {
423
+ width: 6px;
424
+ height: 6px;
425
+ border-radius: 50%;
426
+ background: rgba(255, 255, 255, 0.6);
427
+ border: none;
428
+ cursor: pointer;
429
+ padding: 0;
430
+ transition: background 0.2s ease, transform 0.15s ease;
431
+ }
432
+
433
+ .lm-carousel-dot:hover {
434
+ background: rgba(255, 255, 255, 0.85);
435
+ }
436
+
437
+ .lm-carousel-dot-active {
438
+ background: #ffffff;
439
+ transform: scale(1.15);
440
+ }
441
+
442
+ /* ---- Badge ---- */
443
+ .lm-badge {
444
+ position: absolute;
445
+ top: 12px;
446
+ left: 12px;
447
+ z-index: 2;
448
+ padding: 4px 10px;
449
+ border-radius: 20px;
450
+ font-size: 12px;
451
+ font-weight: 600;
452
+ line-height: 1.4;
453
+ display: inline-flex;
454
+ align-items: center;
455
+ gap: 4px;
456
+ pointer-events: none;
457
+ }
458
+
459
+ .lm-badge-guest-favorite {
460
+ background: var(--lm-color-badge-bg);
461
+ color: var(--lm-color-badge-text);
462
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12);
463
+ }
464
+
465
+ .lm-badge-guest-favorite .lm-badge-icon {
466
+ font-size: 11px;
467
+ line-height: 1;
468
+ }
469
+
470
+ .lm-badge-superhost {
471
+ background: var(--lm-color-superhost-bg);
472
+ color: var(--lm-color-superhost-text);
473
+ }
474
+
475
+ .lm-badge-minstay {
476
+ background: #ff385c;
477
+ color: #ffffff;
478
+ }
479
+
480
+ /* ---- Heart / Favorite Button ---- */
481
+ .lm-heart-btn {
482
+ position: absolute;
483
+ top: 12px;
484
+ right: 12px;
485
+ z-index: 2;
486
+ width: 32px;
487
+ height: 32px;
488
+ border-radius: 50%;
489
+ background: transparent;
490
+ border: none;
491
+ cursor: pointer;
492
+ display: flex;
493
+ align-items: center;
494
+ justify-content: center;
495
+ transition: transform 0.2s ease;
496
+ }
497
+
498
+ .lm-heart-btn:hover {
499
+ transform: scale(1.1);
500
+ }
501
+
502
+ .lm-heart-btn:active {
503
+ transform: scale(0.9);
504
+ }
505
+
506
+ .lm-heart-btn svg {
507
+ width: 24px;
508
+ height: 24px;
509
+ transition: fill 0.15s ease;
510
+ }
511
+
512
+ .lm-heart-btn .lm-heart-outline {
513
+ stroke: #ffffff;
514
+ stroke-width: 2;
515
+ fill: rgba(0, 0, 0, 0.5);
516
+ }
517
+
518
+ .lm-heart-btn-active .lm-heart-outline {
519
+ fill: var(--lm-color-heart);
520
+ stroke: var(--lm-color-heart);
521
+ }
522
+
523
+ /* ---- Card Info ---- */
524
+ .lm-card-info {
525
+ padding: 10px 0 0;
526
+ }
527
+
528
+ .lm-card-header {
529
+ display: flex;
530
+ justify-content: space-between;
531
+ align-items: flex-start;
532
+ gap: 8px;
533
+ }
534
+
535
+ .lm-card-title {
536
+ font-size: 15px;
537
+ font-weight: 600;
538
+ line-height: 1.3;
539
+ color: var(--lm-color-text);
540
+ overflow: hidden;
541
+ text-overflow: ellipsis;
542
+ white-space: nowrap;
543
+ flex: 1;
544
+ min-width: 0;
545
+ }
546
+
547
+ .lm-card-rating {
548
+ display: flex;
549
+ align-items: center;
550
+ gap: 3px;
551
+ font-size: 14px;
552
+ font-weight: 400;
553
+ white-space: nowrap;
554
+ flex-shrink: 0;
555
+ }
556
+
557
+ .lm-card-rating svg {
558
+ width: 12px;
559
+ height: 12px;
560
+ fill: var(--lm-color-star);
561
+ }
562
+
563
+ .lm-card-rating-count {
564
+ color: var(--lm-color-text-secondary);
565
+ }
566
+
567
+ .lm-card-subtitle {
568
+ font-size: 14px;
569
+ color: var(--lm-color-text-secondary);
570
+ line-height: 1.4;
571
+ overflow: hidden;
572
+ text-overflow: ellipsis;
573
+ white-space: nowrap;
574
+ margin-top: 2px;
575
+ }
576
+
577
+ .lm-card-details {
578
+ font-size: 14px;
579
+ color: var(--lm-color-text-secondary);
580
+ line-height: 1.4;
581
+ margin-top: 1px;
582
+ }
583
+
584
+ .lm-card-dates {
585
+ font-size: 14px;
586
+ color: var(--lm-color-text-secondary);
587
+ line-height: 1.4;
588
+ margin-top: 1px;
589
+ }
590
+
591
+ .lm-card-price {
592
+ margin-top: 6px;
593
+ font-size: 14px;
594
+ line-height: 1.4;
595
+ }
596
+
597
+ .lm-card-price-value {
598
+ font-weight: 600;
599
+ text-decoration: underline;
600
+ color: var(--lm-color-text);
601
+ }
602
+
603
+ .lm-card-price-period {
604
+ font-weight: 400;
605
+ color: var(--lm-color-text);
606
+ }
607
+
608
+ .lm-card-tag {
609
+ font-size: 13px;
610
+ color: var(--lm-color-text-secondary);
611
+ margin-top: 2px;
612
+ line-height: 1.4;
613
+ }
614
+
615
+ /* ---- Map Price Markers ---- */
616
+ .lm-price-marker {
617
+ background: var(--lm-color-price-marker-bg);
618
+ color: var(--lm-color-price-marker-text);
619
+ padding: 4px 8px;
620
+ border-radius: 20px;
621
+ font-size: 13px;
622
+ font-weight: 600;
623
+ font-family: var(--lm-font);
624
+ white-space: nowrap;
625
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.16);
626
+ border: 1px solid rgba(0, 0, 0, 0.08);
627
+ cursor: pointer;
628
+ transition: background 0.15s ease, color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
629
+ user-select: none;
630
+ line-height: 1.3;
631
+ }
632
+
633
+ .lm-price-marker:hover {
634
+ background: var(--lm-color-price-marker-hover-bg);
635
+ color: var(--lm-color-price-marker-hover-text);
636
+ transform: scale(1.06);
637
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
638
+ z-index: 10 !important;
639
+ }
640
+
641
+ .lm-price-marker-active {
642
+ background: var(--lm-color-price-marker-active-bg) !important;
643
+ color: var(--lm-color-price-marker-active-text) !important;
644
+ transform: scale(1.1);
645
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
646
+ z-index: 10 !important;
647
+ }
648
+
649
+ /* ---- Map Popup ---- */
650
+ .lm-map-popup .leaflet-popup-content-wrapper {
651
+ border-radius: var(--lm-radius);
652
+ padding: 0;
653
+ overflow: hidden;
654
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.16);
655
+ }
656
+
657
+ .lm-map-popup .leaflet-popup-content {
658
+ margin: 0;
659
+ width: 260px !important;
660
+ }
661
+
662
+ .lm-map-popup .leaflet-popup-tip-container {
663
+ display: none;
664
+ }
665
+
666
+ .lm-popup-img {
667
+ width: 100%;
668
+ height: 170px!important;
669
+ object-fit: cover;
670
+ display: block;
671
+ }
672
+
673
+ .lm-popup-body {
674
+ padding: 10px 12px 12px;
675
+ }
676
+
677
+ .lm-popup-title {
678
+ font-size: 14px;
679
+ font-weight: 600;
680
+ color: var(--lm-color-text);
681
+ line-height: 1.3;
682
+ }
683
+
684
+ .lm-popup-price {
685
+ font-size: 13px;
686
+ color: var(--lm-color-text);
687
+ margin-top: 4px;
688
+ }
689
+
690
+ .lm-popup-price strong {
691
+ font-weight: 600;
692
+ }
693
+
694
+ /* ---- Map Controls (Leaflet overrides) ---- */
695
+ .lm-map-panel .leaflet-control-zoom {
696
+ border: none !important;
697
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15) !important;
698
+ border-radius: 8px !important;
699
+ overflow: hidden;
700
+ }
701
+
702
+ .lm-map-panel .leaflet-control-zoom a {
703
+ width: 36px !important;
704
+ height: 36px !important;
705
+ line-height: 36px !important;
706
+ font-size: 18px !important;
707
+ color: #222 !important;
708
+ border-bottom-color: #e0e0e0 !important;
709
+ }
710
+
711
+ .lm-map-panel .leaflet-control-zoom a:hover {
712
+ background: #f5f5f5 !important;
713
+ }
714
+
715
+ /* ---- Expand Map Button ---- */
716
+ .lm-map-expand-btn {
717
+ position: absolute;
718
+ top: 12px;
719
+ left: 12px;
720
+ z-index: 1000;
721
+ width: 36px;
722
+ height: 36px;
723
+ border-radius: 8px;
724
+ background: var(--lm-color-bg);
725
+ border: none;
726
+ cursor: pointer;
727
+ display: flex;
728
+ align-items: center;
729
+ justify-content: center;
730
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
731
+ transition: background 0.15s ease;
732
+ }
733
+
734
+ .lm-map-expand-btn:hover {
735
+ background: #f5f5f5;
736
+ }
737
+
738
+ .lm-map-expand-btn svg {
739
+ width: 16px;
740
+ height: 16px;
741
+ stroke: #222;
742
+ stroke-width: 2;
743
+ fill: none;
744
+ }
745
+
746
+ /* ---- Responsive ---- */
747
+ @media (max-width: 960px) {
748
+ .lm-widget {
749
+ flex-direction: column;
750
+ }
751
+
752
+ .lm-listings-panel {
753
+ flex: 0 0 auto;
754
+ max-width: 100%;
755
+ width: 100%;
756
+ height: auto;
757
+ max-height: 55vh;
758
+ overflow-y: auto;
759
+ scrollbar-width: none;
760
+ -ms-overflow-style: none;
761
+ }
762
+
763
+ .lm-listings-panel::-webkit-scrollbar {
764
+ display: none;
765
+ }
766
+
767
+ .lm-listings-grid {
768
+ grid-template-columns: repeat(2, 1fr);
769
+ gap: 16px;
770
+ }
771
+
772
+ .lm-map-panel {
773
+ flex: 1 1 0%;
774
+ min-height: 45vh;
775
+ border-left: none;
776
+ border-top: 1px solid var(--lm-color-border);
777
+ }
778
+
779
+ .lm-widget.lm-map-hidden .lm-listings-grid {
780
+ grid-template-columns: repeat(2, 1fr);
781
+ }
782
+ }
783
+
784
+ @media (max-width: 640px) {
785
+ .lm-listings-panel {
786
+ padding: 16px;
787
+ max-height: 50vh;
788
+ }
789
+
790
+ .lm-toolbar {
791
+ padding-bottom: 12px;
792
+ margin-bottom: 2px;
793
+ flex-wrap: wrap;
794
+ gap: 8px;
795
+ }
796
+
797
+ .lm-sort-select {
798
+ font-size: 13px;
799
+ padding: 6px 32px 6px 12px;
800
+ }
801
+
802
+ .lm-toggle-map-btn {
803
+ font-size: 13px;
804
+ padding: 6px 14px;
805
+ }
806
+
807
+ .lm-listings-grid {
808
+ grid-template-columns: 1fr;
809
+ gap: 20px;
810
+ }
811
+
812
+ .lm-widget.lm-map-hidden .lm-listings-grid {
813
+ grid-template-columns: 1fr;
814
+ }
815
+
816
+ .lm-map-panel {
817
+ min-height: 50vh;
818
+ }
819
+
820
+ .lm-card-title {
821
+ font-size: 14px;
822
+ }
823
+
824
+ .lm-card-subtitle,
825
+ .lm-card-details,
826
+ .lm-card-dates,
827
+ .lm-card-price,
828
+ .lm-card-tag {
829
+ font-size: 13px;
830
+ }
831
+
832
+ .lm-pagination {
833
+ padding: 16px 0 4px;
834
+ gap: 2px;
835
+ }
836
+
837
+ .lm-pagination-btn {
838
+ min-width: 32px;
839
+ height: 32px;
840
+ font-size: 13px;
841
+ }
842
+ }
843
+
844
+ /* ---- Loading skeleton ---- */
845
+ .lm-skeleton {
846
+ background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 37%, #f0f0f0 63%);
847
+ background-size: 200% 100%;
848
+ animation: lm-skeleton-pulse 1.5s ease infinite;
849
+ border-radius: var(--lm-radius);
850
+ }
851
+
852
+ @keyframes lm-skeleton-pulse {
853
+ 0% { background-position: 200% 0; }
854
+ 100% { background-position: -200% 0; }
855
+ }
856
+
857
+ .lm-skeleton-card .lm-skeleton-image {
858
+ width: 100%;
859
+ aspect-ratio: 1 / 1;
860
+ border-radius: var(--lm-radius);
861
+ }
862
+
863
+ .lm-skeleton-card .lm-skeleton-line {
864
+ height: 14px;
865
+ border-radius: 4px;
866
+ margin-top: 10px;
867
+ }
868
+
869
+ .lm-skeleton-card .lm-skeleton-line-short {
870
+ width: 60%;
871
+ }
872
+
873
+ .lm-skeleton-card .lm-skeleton-line-medium {
874
+ width: 80%;
875
+ }
876
+
877
+ /* ---- No results ---- */
878
+ .lm-no-results {
879
+ grid-column: 1 / -1;
880
+ text-align: center;
881
+ padding: 60px 20px;
882
+ color: var(--lm-color-text-secondary);
883
+ font-size: 16px;
884
+ }
885
+
886
+ .lm-no-results-title {
887
+ font-size: 20px;
888
+ font-weight: 600;
889
+ color: var(--lm-color-text);
890
+ margin-bottom: 8px;
891
+ }