@qite/tide-components 1.0.9 → 1.0.10

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.
Files changed (75) hide show
  1. package/build/build-cjs/index.js +290 -280
  2. package/build/build-cjs/src/search-results/types.d.ts +12 -0
  3. package/build/build-esm/index.js +290 -280
  4. package/build/build-esm/src/search-results/types.d.ts +12 -0
  5. package/package.json +2 -2
  6. package/styles/abstracts/_mixins.scss +74 -74
  7. package/styles/abstracts/_variables.scss +57 -57
  8. package/styles/base/_fonts.scss +2 -2
  9. package/styles/base/_normalize.scss +227 -227
  10. package/styles/base/_typography.scss +35 -35
  11. package/styles/booking-joker-variables.scss +596 -596
  12. package/styles/booking-product-variables.scss +330 -330
  13. package/styles/booking-product.scss +438 -438
  14. package/styles/booking-qsm-variables.scss +501 -501
  15. package/styles/booking-qsm.scss +52 -52
  16. package/styles/booking-search-results-variables.scss +734 -734
  17. package/styles/booking-search-results.scss +53 -53
  18. package/styles/booking-wizard-variables.scss +603 -603
  19. package/styles/booking-wizard.scss +61 -61
  20. package/styles/components/_accordion.scss +67 -67
  21. package/styles/components/_animations.scss +39 -39
  22. package/styles/components/_base.scss +107 -107
  23. package/styles/components/_booking.scss +906 -906
  24. package/styles/components/_breadcrumb.scss +92 -92
  25. package/styles/components/_button.scss +238 -238
  26. package/styles/components/_checkbox.scss +230 -230
  27. package/styles/components/_contact.scss +255 -255
  28. package/styles/components/_content.scss +336 -336
  29. package/styles/components/_cta.scss +238 -238
  30. package/styles/components/_date-list.scss +41 -41
  31. package/styles/components/_date-range-picker.scss +223 -223
  32. package/styles/components/_decrement-increment.scss +35 -35
  33. package/styles/components/_dropdown.scss +77 -77
  34. package/styles/components/_error.scss +50 -50
  35. package/styles/components/_faq.scss +30 -30
  36. package/styles/components/_flight-option.scss +1432 -1432
  37. package/styles/components/_flyin.scss +830 -830
  38. package/styles/components/_footer.scss +135 -135
  39. package/styles/components/_form.scss +1693 -1693
  40. package/styles/components/_gallery.scss +317 -317
  41. package/styles/components/_header.scss +113 -113
  42. package/styles/components/_image-with-text.scss +206 -206
  43. package/styles/components/_img-slider.scss +175 -175
  44. package/styles/components/_info-message.scss +75 -75
  45. package/styles/components/_input.scss +35 -35
  46. package/styles/components/_list.scss +185 -185
  47. package/styles/components/_loader.scss +152 -152
  48. package/styles/components/_login.scss +140 -140
  49. package/styles/components/_map-view.scss +1100 -1100
  50. package/styles/components/_mixins.scss +579 -579
  51. package/styles/components/_navbar.scss +765 -765
  52. package/styles/components/_passenger-picker.scss +306 -306
  53. package/styles/components/_phone-input.scss +8 -8
  54. package/styles/components/_placeholders.scss +165 -165
  55. package/styles/components/_pricing-summary.scss +163 -163
  56. package/styles/components/_qsm.scss +17 -17
  57. package/styles/components/_radiobutton.scss +170 -170
  58. package/styles/components/_search.scss +2197 -2197
  59. package/styles/components/_select-wrapper.scss +81 -81
  60. package/styles/components/_slider.scss +128 -128
  61. package/styles/components/_spinner.scss +29 -29
  62. package/styles/components/_step-indicators.scss +187 -187
  63. package/styles/components/_table.scss +81 -81
  64. package/styles/components/_tide-form.scss +578 -578
  65. package/styles/components/_tree.scss +648 -648
  66. package/styles/components/_typeahead.scss +275 -275
  67. package/styles/components/_variables.scss +89 -89
  68. package/styles/content-blocks-variables.scss +543 -543
  69. package/styles/content-blocks.scss +66 -66
  70. package/styles/font.scss +2 -2
  71. package/styles/qsm/_calendar.scss +274 -274
  72. package/styles/qsm/_qsm.scss +1097 -1097
  73. package/styles/search.scss +1200 -1200
  74. package/styles/tide-form-variables.scss +275 -275
  75. package/styles/tide-form.scss +56 -56
@@ -1,1100 +1,1100 @@
1
- @use '../components/mixins' as mixins;
2
-
3
- .map-view {
4
- display: flex;
5
- flex-direction: column;
6
- font-family: var(--tide-booking-font-body);
7
- font-size: var(--tide-booking-font-size-body);
8
- color: var(--tide-booking-gray-dark);
9
-
10
- @include mixins.media-md {
11
- flex-direction: row;
12
- height: calc(100dvh - 120px);
13
- overflow: hidden;
14
- }
15
-
16
- // ── Panel (left sidebar) ────────────────────────────────────────────────
17
-
18
- &__panel {
19
- display: flex;
20
- flex-direction: column;
21
- background-color: var(--tide-booking-map-view-panel-bg);
22
- width: 100%;
23
-
24
- @include mixins.media-md {
25
- width: var(--tide-booking-map-view-panel-width);
26
- min-width: var(--tide-booking-map-view-panel-width);
27
- height: 100%;
28
- box-shadow: var(--tide-booking-map-view-panel-shadow);
29
- z-index: 100;
30
- }
31
- }
32
-
33
- &__panel-head {
34
- flex-shrink: 0;
35
- }
36
-
37
- &__panel-inner {
38
- flex: 1;
39
- overflow-y: auto;
40
- @extend %scrollbar-thin;
41
- }
42
-
43
- // ── Intro: title + subtitle ─────────────────────────────────────────────
44
-
45
- &__intro {
46
- padding: 20px 20px 16px;
47
- border-bottom: var(--tide-booking-map-view-destination-border);
48
- }
49
-
50
- &__title {
51
- margin: 0;
52
- font-family: var(--tide-booking-font-body);
53
- font-size: var(--tide-booking-h3);
54
- font-weight: 700;
55
- color: var(--tide-booking-black);
56
- line-height: 1.2;
57
- letter-spacing: -0.02em;
58
-
59
- @include mixins.media-md {
60
- font-size: var(--tide-booking-h3-sm);
61
- }
62
- }
63
-
64
- &__subtitle {
65
- margin: 6px 0 0;
66
- font-size: var(--tide-booking-small-font-size--mobile);
67
- color: var(--tide-booking-gray-dark);
68
- line-height: 1.5;
69
-
70
- @include mixins.media-md {
71
- font-size: var(--tide-booking-small-font-size--desktop);
72
- }
73
- }
74
-
75
- // ── Meta chip: dates · nights · adults ─────────────────────────────────
76
-
77
- &__meta {
78
- display: flex;
79
- align-items: center;
80
- gap: 8px;
81
- margin: 14px 20px;
82
- padding: 10px 12px;
83
- background-color: var(--tide-booking-map-view-dates-bg);
84
- border: var(--tide-booking-map-view-destination-border);
85
- border-radius: 12px;
86
- font-size: var(--tide-booking-small-font-size--mobile);
87
- color: var(--tide-booking-gray-dark);
88
- }
89
-
90
- &__meta-dates {
91
- font-weight: 600;
92
- color: var(--tide-booking-black);
93
- }
94
-
95
- &__meta-dot {
96
- width: 4px;
97
- height: 4px;
98
- border-radius: 50%;
99
- background-color: var(--tide-booking-gray-medium);
100
- flex-shrink: 0;
101
- }
102
-
103
- &__meta-item {
104
- color: var(--tide-booking-gray-dark);
105
- }
106
-
107
- &__meta-pax {
108
- margin-left: auto;
109
- display: flex;
110
- align-items: center;
111
- gap: 5px;
112
- font-weight: 600;
113
- color: var(--tide-booking-black);
114
- }
115
-
116
- &__meta-edit {
117
- width: 28px;
118
- height: 28px;
119
- border-radius: 8px;
120
- border: var(--tide-booking-map-view-destination-border);
121
- background-color: var(--tide-booking-white);
122
- display: flex;
123
- align-items: center;
124
- justify-content: center;
125
- cursor: pointer;
126
- color: var(--tide-booking-gray-dark);
127
- flex-shrink: 0;
128
- transition: border-color 0.15s ease, color 0.15s ease;
129
-
130
- &:hover {
131
- border-color: var(--tide-booking-color-primary);
132
- color: var(--tide-booking-color-primary);
133
- }
134
- }
135
-
136
- // ── Mobile map peek strip ────────────────────────────────────────────────
137
-
138
- &__map-peek {
139
- position: relative;
140
- height: 130px;
141
- background-color: #e8f0e0;
142
- overflow: hidden;
143
- flex-shrink: 0;
144
-
145
- background-image: linear-gradient(rgba(0, 0, 0, 0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(0, 0, 0, 0.04) 1px, transparent 1px);
146
- background-size: 40px 40px;
147
-
148
- @include mixins.media-md {
149
- display: none;
150
- }
151
- }
152
-
153
- &__see-map {
154
- position: absolute;
155
- top: 50%;
156
- left: 50%;
157
- transform: translate(-50%, -50%);
158
- background-color: var(--tide-booking-color-primary);
159
- color: var(--tide-booking-white);
160
- border: none;
161
- border-radius: var(--tide-booking-input-border-radius);
162
- padding: 1rem 2.8rem;
163
- font-family: var(--tide-booking-font-body);
164
- font-size: var(--tide-booking-font-size-body);
165
- font-weight: 500;
166
- cursor: pointer;
167
- white-space: nowrap;
168
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
169
- transition: background-color 0.2s ease;
170
-
171
- &:hover {
172
- background-color: var(--tide-booking-color-primary-dark);
173
- }
174
-
175
- @include mixins.media-md {
176
- display: none;
177
- }
178
- }
179
-
180
- // ── Shared icon button ──────────────────────────────────────────────────
181
-
182
- &__icon-btn {
183
- display: flex;
184
- align-items: center;
185
- justify-content: center;
186
- background: none;
187
- border: none;
188
- cursor: pointer;
189
- padding: 5px;
190
- color: var(--tide-booking-gray-medium);
191
- border-radius: 8px;
192
- transition: color 0.15s ease, background-color 0.15s ease;
193
- flex-shrink: 0;
194
-
195
- &:hover {
196
- color: var(--tide-booking-black);
197
- background-color: var(--tide-booking-gray-light);
198
- }
199
- }
200
-
201
- // ── Spine: the vertical timeline ────────────────────────────────────────
202
- // Pins + cards are flex rows; the ::before creates the dashed connector line.
203
-
204
- &__spine {
205
- position: relative;
206
- padding: 5px 20px 5px;
207
-
208
- &::before {
209
- content: '';
210
- position: absolute;
211
- // Horizontally centred on the 26 px pins which sit at left:20px
212
- left: calc(20px + 13px);
213
- top: 48px;
214
- bottom: 34px;
215
- border-left: 2px dashed var(--tide-booking-map-view-connector-color);
216
- pointer-events: none;
217
- }
218
- }
219
-
220
- // ── Node: a single destination (start / stop / end) ─────────────────────
221
-
222
- &__node {
223
- display: flex;
224
- align-items: flex-start;
225
- gap: 12px;
226
- margin-bottom: 8px;
227
- position: relative;
228
- z-index: 1;
229
-
230
- &--menu-open {
231
- z-index: 300;
232
- }
233
- }
234
-
235
- &__node-pin {
236
- width: 26px;
237
- min-width: 26px;
238
- height: 26px;
239
- border-radius: 50%;
240
- display: flex;
241
- align-items: center;
242
- justify-content: center;
243
- flex-shrink: 0;
244
- margin-top: 14px;
245
- background-color: var(--tide-booking-white);
246
- border: var(--tide-booking-map-view-destination-border);
247
-
248
- &--flag {
249
- border-color: var(--tide-booking-color-primary);
250
- color: var(--tide-booking-color-primary);
251
- }
252
-
253
- &--number {
254
- background-color: var(--tide-booking-map-view-dot-stop-bg);
255
- color: var(--tide-booking-map-view-dot-stop-color);
256
- border-color: transparent;
257
- font-weight: 700;
258
- font-size: 12px;
259
- box-shadow: 0 3px 10px rgba(0, 0, 0, 0.18);
260
- }
261
- }
262
-
263
- &__node-card {
264
- flex: 1;
265
- min-width: 0;
266
- background-color: var(--tide-booking-white);
267
- border: var(--tide-booking-map-view-destination-border);
268
- border-radius: 12px;
269
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
270
-
271
- &:hover {
272
- border-color: var(--tide-booking-gray-background-light);
273
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.07);
274
- }
275
- }
276
-
277
- &__node-row {
278
- display: flex;
279
- align-items: center;
280
- gap: 8px;
281
- padding: 12px 14px;
282
- }
283
-
284
- &__node-info {
285
- flex: 1;
286
- min-width: 0;
287
- display: flex;
288
- flex-direction: column;
289
- gap: 2px;
290
- }
291
-
292
- &__node-place {
293
- font-size: var(--tide-booking-font-size-body);
294
- font-weight: 700;
295
- color: var(--tide-booking-black);
296
- white-space: nowrap;
297
- overflow: hidden;
298
- text-overflow: ellipsis;
299
-
300
- @include mixins.media-md {
301
- font-size: var(--tide-booking-font-size-body-lg);
302
- }
303
- }
304
-
305
- &__node-date {
306
- font-size: var(--tide-booking-small-font-size--mobile);
307
- color: var(--tide-booking-gray-dark);
308
- }
309
-
310
- &__node-tag {
311
- flex-shrink: 0;
312
- font-size: 11px;
313
- font-weight: 700;
314
- text-transform: uppercase;
315
- letter-spacing: 0.06em;
316
- padding: 3px 8px;
317
- border-radius: 6px;
318
-
319
- &--start,
320
- &--end {
321
- background-color: var(--tide-booking-color-primary-fade);
322
- color: var(--tide-booking-color-primary);
323
- }
324
- }
325
-
326
- // ── Reorder mode ────────────────────────────────────────────────────────
327
-
328
- &__reorder-banner {
329
- display: flex;
330
- align-items: center;
331
- gap: 8px;
332
- padding: 9px 12px;
333
- margin: 10px 20px 0;
334
- background-color: var(--tide-booking-color-primary-fade);
335
- border: 1px solid var(--tide-booking-color-primary-fade);
336
- border-radius: 10px;
337
- font-size: var(--tide-booking-small-font-size--mobile);
338
- color: var(--tide-booking-color-primary);
339
-
340
- span {
341
- flex: 1;
342
- }
343
- }
344
-
345
- &__reorder-done {
346
- padding: 4px 12px;
347
- border-radius: 7px;
348
- background-color: var(--tide-booking-white);
349
- border: 1px solid var(--tide-booking-color-primary);
350
- color: var(--tide-booking-color-primary);
351
- font-family: var(--tide-booking-font-body);
352
- font-size: var(--tide-booking-small-font-size--mobile);
353
- font-weight: 600;
354
- cursor: pointer;
355
- white-space: nowrap;
356
- transition: background-color 0.15s ease;
357
-
358
- &:hover {
359
- background-color: var(--tide-booking-color-primary-fade);
360
- }
361
- }
362
-
363
- &__drag-handle {
364
- display: flex;
365
- align-items: center;
366
- justify-content: center;
367
- width: 20px;
368
- min-width: 20px;
369
- margin-top: 14px;
370
- color: var(--tide-booking-gray-medium);
371
- cursor: grab;
372
- flex-shrink: 0;
373
- border-radius: 6px;
374
- padding: 4px 2px;
375
- transition: color 0.15s ease, background-color 0.15s ease;
376
-
377
- &:hover {
378
- color: var(--tide-booking-black);
379
- background-color: var(--tide-booking-gray-light);
380
- }
381
-
382
- &:active {
383
- cursor: grabbing;
384
- }
385
- }
386
-
387
- &__node--reorder-locked {
388
- opacity: 0.4;
389
- pointer-events: none;
390
- }
391
-
392
- &__node--drag-over > .map-view__node-card {
393
- border-color: var(--tide-booking-color-primary);
394
- box-shadow: 0 0 0 3px var(--tide-booking-color-primary-extra-fade);
395
- }
396
-
397
- // ── Node action menu (stop cards) ──────────────────────────────────────
398
-
399
- &__node-menu {
400
- position: relative;
401
- flex-shrink: 0;
402
- }
403
-
404
- &__node-dropdown {
405
- position: absolute;
406
- top: calc(100% + 10px);
407
- right: -7px;
408
- z-index: 200;
409
- min-width: 210px;
410
- background-color: var(--tide-booking-white);
411
- border: var(--tide-booking-map-view-destination-border);
412
- border-radius: 10px;
413
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
414
-
415
- // Arrow pointing up — border layer
416
- &::before {
417
- content: '';
418
- position: absolute;
419
- top: -8px;
420
- right: 12px;
421
- border-left: 7px solid transparent;
422
- border-right: 7px solid transparent;
423
- border-bottom: 7px solid var(--tide-booking-gray-background-light);
424
- z-index: 1;
425
- }
426
-
427
- // Arrow pointing up — white fill layer on top
428
- &::after {
429
- content: '';
430
- position: absolute;
431
- top: -6px;
432
- right: 13px;
433
- border-left: 6px solid transparent;
434
- border-right: 6px solid transparent;
435
- border-bottom: 6px solid var(--tide-booking-white);
436
- z-index: 2;
437
- }
438
- }
439
-
440
- &__node-dropdown-item {
441
- display: flex;
442
- align-items: center;
443
- gap: 10px;
444
- width: 100%;
445
- padding: 11px 16px;
446
- background: none;
447
- border: none;
448
- cursor: pointer;
449
- font-family: var(--tide-booking-font-body);
450
- font-size: var(--tide-booking-font-size-body);
451
- color: var(--tide-booking-black);
452
- text-align: left;
453
- transition: background-color 0.12s ease;
454
-
455
- &:first-child {
456
- border-radius: 10px 10px 0 0;
457
- }
458
-
459
- &:last-child {
460
- border-radius: 0 0 10px 10px;
461
- }
462
-
463
- & + & {
464
- border-top: var(--tide-booking-map-view-destination-border);
465
- }
466
-
467
- &:hover {
468
- background-color: var(--tide-booking-gray-light);
469
- }
470
-
471
- &--danger {
472
- color: var(--tide-booking-invalid);
473
- }
474
- }
475
-
476
- // ── Accommodation row (inside stop card) ────────────────────────────────
477
-
478
- &__stay {
479
- display: flex;
480
- align-items: center;
481
- gap: 10px;
482
- padding: 10px 14px;
483
- border-top: var(--tide-booking-map-view-destination-border);
484
- background-color: var(--tide-booking-gray-xlight);
485
- flex-wrap: wrap;
486
- border-radius: 0 0 12px 12px;
487
- }
488
-
489
- &__stay-icon {
490
- width: 32px;
491
- min-width: 32px;
492
- height: 32px;
493
- border-radius: 50%;
494
- background-color: orangered;
495
- color: var(--tide-booking-white);
496
- display: flex;
497
- align-items: center;
498
- justify-content: center;
499
- flex-shrink: 0;
500
-
501
- &--off {
502
- background-color: var(--tide-booking-gray--medium-light);
503
- color: var(--tide-booking-gray-dark);
504
- }
505
- }
506
-
507
- &__stay-info {
508
- display: flex;
509
- flex-direction: column;
510
- gap: 1px;
511
- flex: 1;
512
- min-width: 0;
513
- }
514
-
515
- &__stay-label {
516
- font-size: var(--tide-booking-font-size-body);
517
- font-weight: 600;
518
- color: var(--tide-booking-black);
519
- }
520
-
521
- &__stay-sublabel {
522
- font-size: var(--tide-booking-small-font-size--mobile);
523
- color: var(--tide-booking-gray-dark);
524
- }
525
-
526
- &__stay-stepper {
527
- display: flex;
528
- align-items: center;
529
- gap: 4px;
530
- flex-shrink: 0;
531
- background-color: var(--tide-booking-gray-light);
532
- border-radius: 8px;
533
- padding: 4px;
534
- }
535
-
536
- &__stay-btn {
537
- width: 24px;
538
- height: 24px;
539
- border-radius: 6px;
540
- border: none;
541
- background-color: var(--tide-booking-white);
542
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
543
- display: flex;
544
- align-items: center;
545
- justify-content: center;
546
- cursor: pointer;
547
- color: var(--tide-booking-gray-dark);
548
- padding: 0;
549
- transition: color 0.15s ease;
550
-
551
- &:hover {
552
- color: var(--tide-booking-color-primary);
553
- }
554
- }
555
-
556
- &__stay-value {
557
- min-width: 22px;
558
- text-align: center;
559
- font-weight: 700;
560
- font-size: var(--tide-booking-font-size-body);
561
- color: var(--tide-booking-black);
562
- }
563
-
564
- &__stay-nights {
565
- font-size: var(--tide-booking-small-font-size--mobile);
566
- color: var(--tide-booking-gray-dark);
567
- margin-left: 2px;
568
- margin-right: 4px;
569
- }
570
-
571
- // ── Leg: transport row between destinations ─────────────────────────────
572
-
573
- &__leg {
574
- display: flex;
575
- align-items: center;
576
- gap: 12px;
577
- margin-bottom: 8px;
578
- padding: 6px 0;
579
- position: relative;
580
- z-index: 0;
581
- }
582
-
583
- &__leg-pin {
584
- width: 26px;
585
- min-width: 26px;
586
- height: 26px;
587
- border-radius: 50%;
588
- display: flex;
589
- align-items: center;
590
- justify-content: center;
591
- flex-shrink: 0;
592
- background-color: var(--tide-booking-white);
593
- border: var(--tide-booking-map-view-destination-border);
594
- color: var(--tide-booking-color-primary);
595
- }
596
-
597
- &__leg-text {
598
- flex: 1;
599
- font-size: var(--tide-booking-small-font-size--mobile);
600
- color: var(--tide-booking-gray-dark);
601
- transition: color 0.2s ease;
602
-
603
- .map-view__leg--on & {
604
- color: var(--tide-booking-black);
605
- }
606
-
607
- @include mixins.media-md {
608
- font-size: var(--tide-booking-small-font-size--desktop);
609
- }
610
- }
611
-
612
- // ── Toggle switch ───────────────────────────────────────────────────────
613
-
614
- &__toggle {
615
- position: relative;
616
- flex-shrink: 0;
617
- width: 40px;
618
- height: 22px;
619
- background-color: var(--tide-booking-map-view-toggle-off-bg);
620
- border-radius: 11px;
621
- border: none;
622
- cursor: pointer;
623
- transition: background-color 0.25s ease;
624
-
625
- &::after {
626
- content: '';
627
- position: absolute;
628
- width: 16px;
629
- height: 16px;
630
- border-radius: 50%;
631
- background-color: var(--tide-booking-white);
632
- top: 3px;
633
- left: 3px;
634
- transition: transform 0.25s ease;
635
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
636
- }
637
-
638
- &--on {
639
- background-color: var(--tide-booking-map-view-toggle-on-bg);
640
-
641
- &::after {
642
- transform: translateX(18px);
643
- }
644
- }
645
- }
646
-
647
- // ── Add destination search ───────────────────────────────────────────────
648
-
649
- &__add {
650
- padding: 14px 20px 28px;
651
- }
652
-
653
- &__add-wrap {
654
- position: relative;
655
- }
656
-
657
- &__add-results {
658
- position: absolute;
659
- bottom: calc(100% + 6px);
660
- left: 0;
661
- right: 0;
662
- z-index: 200;
663
- list-style: none;
664
- margin: 0;
665
- padding: 4px 0;
666
- background-color: var(--tide-booking-white);
667
- border: var(--tide-booking-map-view-destination-border);
668
- border-radius: 12px;
669
- box-shadow: 0 -6px 24px rgba(0, 0, 0, 0.1);
670
- overflow: hidden;
671
- }
672
-
673
- &__add-result {
674
- display: flex;
675
- align-items: center;
676
- gap: 10px;
677
- padding: 10px 14px;
678
- cursor: pointer;
679
- transition: background-color 0.12s ease;
680
-
681
- & + & {
682
- border-top: var(--tide-booking-map-view-destination-border);
683
- }
684
-
685
- &:hover {
686
- background-color: var(--tide-booking-gray-light);
687
- }
688
- }
689
-
690
- &__add-result-icon {
691
- width: 28px;
692
- min-width: 28px;
693
- height: 28px;
694
- border-radius: 50%;
695
- background-color: var(--tide-booking-gray-light);
696
- display: flex;
697
- align-items: center;
698
- justify-content: center;
699
- flex-shrink: 0;
700
- color: var(--tide-booking-color-primary);
701
- }
702
-
703
- &__add-result-info {
704
- display: flex;
705
- flex-direction: column;
706
- gap: 2px;
707
- min-width: 0;
708
- }
709
-
710
- &__add-result-name {
711
- font-size: var(--tide-booking-font-size-body);
712
- font-weight: 600;
713
- color: var(--tide-booking-black);
714
- white-space: nowrap;
715
- overflow: hidden;
716
- text-overflow: ellipsis;
717
- }
718
-
719
- &__add-result-sub {
720
- font-size: var(--tide-booking-small-font-size--mobile);
721
- color: var(--tide-booking-gray-dark);
722
- }
723
-
724
- &__add-label {
725
- margin: 0 0 8px;
726
- font-size: var(--tide-booking-font-size-body);
727
- font-weight: 600;
728
- color: var(--tide-booking-black);
729
- }
730
-
731
- &__add-field {
732
- display: flex;
733
- align-items: center;
734
- gap: 10px;
735
- padding: 0 14px;
736
- background-color: var(--tide-booking-gray-light);
737
- border: 1.5px solid transparent;
738
- border-radius: 12px;
739
- min-height: var(--tide-booking-input-height);
740
- color: var(--tide-booking-gray-dark);
741
- transition: background-color 0.15s ease, border-color 0.15s ease;
742
-
743
- &:focus-within {
744
- background-color: var(--tide-booking-gray--medium-light);
745
- border-color: var(--tide-booking-color-primary);
746
- }
747
- }
748
-
749
- &__add-input {
750
- flex: 1;
751
- border: none;
752
- outline: 0;
753
- box-shadow: none;
754
- -webkit-appearance: none;
755
- appearance: none;
756
-
757
- &:hover,
758
- &:focus {
759
- border: none;
760
- outline: 0;
761
- box-shadow: none;
762
- }
763
- font-family: var(--tide-booking-font-body);
764
- font-size: var(--tide-booking-font-size-body);
765
- color: var(--tide-booking-input-color);
766
- background: none;
767
- padding: 0;
768
-
769
- &::placeholder {
770
- color: var(--tide-booking-input-placeholder-color);
771
- font-style: var(--tide-booking-input-placeholder-font-style);
772
- }
773
- }
774
-
775
- // ── Footer: price estimate + continue button ─────────────────────────────
776
-
777
- &__footer {
778
- border-top: var(--tide-booking-map-view-destination-border);
779
- flex-shrink: 0;
780
- display: flex;
781
- align-items: center;
782
- flex-direction: row-reverse;
783
- justify-content: space-between;
784
- gap: 14px;
785
- padding: 16px 20px;
786
- }
787
-
788
- &__price {
789
- flex: 1;
790
- min-width: 0;
791
- display: flex;
792
- flex-direction: column;
793
- gap: 2px;
794
- }
795
-
796
- &__price-label {
797
- font-size: var(--tide-booking-small-font-size--mobile);
798
- color: var(--tide-booking-gray-dark);
799
- }
800
-
801
- &__price-value {
802
- font-size: var(--tide-booking-h5);
803
- font-weight: 700;
804
- color: var(--tide-booking-black);
805
- white-space: nowrap;
806
-
807
- @include mixins.media-md {
808
- font-size: var(--tide-booking-h5-xl);
809
- }
810
- }
811
-
812
- &__continue {
813
- display: inline-flex;
814
- align-items: center;
815
- gap: 8px;
816
- padding: 12px 22px;
817
- background: var(--tide-booking-map-view-continue-bg);
818
- color: var(--tide-booking-map-view-continue-color);
819
- border: var(--tide-booking-cta-border);
820
- border-radius: 10px;
821
- cursor: pointer;
822
- font-family: var(--tide-booking-font-body);
823
- font-size: var(--tide-booking-map-view-continue-font-size);
824
- font-weight: var(--tide-booking-map-view-continue-font-weight);
825
- white-space: nowrap;
826
- letter-spacing: 0.02em;
827
- transition: background 0.2s ease, transform 0.15s ease, box-shadow 0.15s ease;
828
- box-shadow: 0 4px 14px rgba(0, 0, 0, 0.14);
829
-
830
- &:hover {
831
- background: var(--tide-booking-map-view-continue-bg-hover);
832
- transform: translateY(-1px);
833
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
834
- }
835
- }
836
-
837
- // ── Map wrap ─────────────────────────────────────────────────────────────
838
-
839
- &__map-wrap {
840
- position: fixed;
841
- inset: 0;
842
- visibility: hidden;
843
- z-index: -1;
844
-
845
- @include mixins.media-md {
846
- position: relative;
847
- flex: 1;
848
- visibility: visible;
849
- z-index: auto;
850
- inset: auto;
851
- }
852
-
853
- &--expanded {
854
- visibility: visible;
855
- z-index: 9999;
856
- }
857
- }
858
-
859
- &__map {
860
- width: 100%;
861
- height: 100%;
862
- position: absolute;
863
- inset: 0;
864
- }
865
-
866
- // ── Close button (mobile full-screen map) ─────────────────────────────────
867
-
868
- &__map-close {
869
- position: absolute;
870
- top: 1.5rem;
871
- right: 1.5rem;
872
- z-index: 1001;
873
- background-color: var(--tide-booking-white);
874
- border: none;
875
- border-radius: 50%;
876
- width: 4rem;
877
- height: 4rem;
878
- display: flex;
879
- align-items: center;
880
- justify-content: center;
881
- cursor: pointer;
882
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
883
- transition: background-color 0.2s ease;
884
-
885
- &:hover {
886
- background-color: var(--tide-booking-gray-light);
887
- }
888
-
889
- @include mixins.media-md {
890
- display: none;
891
- }
892
- }
893
-
894
- // ── Leaflet tooltip ───────────────────────────────────────────────────────
895
-
896
- &__leaflet-tooltip {
897
- font-family: var(--tide-booking-font-body);
898
- font-size: var(--tide-booking-small-font-size--mobile);
899
- border-radius: var(--tide-booking-input-border-radius);
900
- border: none;
901
- box-shadow: var(--tide-booking-nav-box-shadow);
902
- padding: 0.5rem 0.8rem;
903
- }
904
-
905
- // ── Map markers ───────────────────────────────────────────────────────────
906
-
907
- &__marker {
908
- width: var(--tide-booking-map-view-marker-size);
909
- height: var(--tide-booking-map-view-marker-size);
910
- border-radius: 50%;
911
- display: flex;
912
- align-items: center;
913
- justify-content: center;
914
- border: 3px solid var(--tide-booking-map-view-marker-border-color);
915
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
916
- cursor: pointer;
917
- transition: transform 0.15s ease, box-shadow 0.15s ease;
918
-
919
- &:hover {
920
- transform: scale(1.08);
921
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.28);
922
- }
923
-
924
- &--plane {
925
- background-color: var(--tide-booking-map-view-marker-plane-bg);
926
- color: var(--tide-booking-map-view-marker-plane-color);
927
- }
928
-
929
- &--stop {
930
- background-color: var(--tide-booking-gray-light);
931
- background-size: cover;
932
- background-position: center;
933
- position: relative;
934
- overflow: visible;
935
- }
936
- }
937
-
938
- &__marker-number {
939
- font-size: 18px;
940
- font-weight: 700;
941
- color: var(--tide-booking-map-view-dot-stop-bg);
942
- }
943
-
944
- &__marker-badge {
945
- position: absolute;
946
- bottom: -4px;
947
- right: -4px;
948
- width: 20px;
949
- height: 20px;
950
- background-color: var(--tide-booking-map-view-marker-badge-bg);
951
- color: var(--tide-booking-map-view-marker-badge-color);
952
- border-radius: 50%;
953
- display: flex;
954
- align-items: center;
955
- justify-content: center;
956
- font-size: 11px;
957
- font-weight: 700;
958
- border: 2px solid var(--tide-booking-white);
959
- }
960
-
961
- // ── Popup overlay ─────────────────────────────────────────────────────────
962
-
963
- &__popup {
964
- position: absolute;
965
- z-index: 1000;
966
- width: var(--tide-booking-map-view-popup-width);
967
- background-color: var(--tide-booking-map-view-popup-bg);
968
- border-radius: var(--tide-booking-map-view-popup-border-radius);
969
- box-shadow: var(--tide-booking-map-view-popup-shadow);
970
- transform: translate(-50%, calc(-100% - 28px));
971
- overflow: hidden;
972
- pointer-events: auto;
973
-
974
- &::after {
975
- content: '';
976
- position: absolute;
977
- bottom: -7px;
978
- left: 50%;
979
- transform: translateX(-50%);
980
- width: 0;
981
- height: 0;
982
- border-left: 7px solid transparent;
983
- border-right: 7px solid transparent;
984
- border-top: 7px solid var(--tide-booking-map-view-popup-bg);
985
- filter: drop-shadow(0 2px 2px rgba(0, 0, 0, 0.06));
986
- }
987
- }
988
-
989
- &__popup-close {
990
- position: absolute;
991
- top: 7px;
992
- right: 7px;
993
- z-index: 10;
994
- background-color: rgba(255, 255, 255, 0.92);
995
- border: none;
996
- border-radius: 50%;
997
- width: 24px;
998
- height: 24px;
999
- display: flex;
1000
- align-items: center;
1001
- justify-content: center;
1002
- cursor: pointer;
1003
- transition: background-color 0.2s ease;
1004
-
1005
- &:hover {
1006
- background-color: var(--tide-booking-white);
1007
- }
1008
- }
1009
-
1010
- &__popup-image {
1011
- width: 100%;
1012
- height: var(--tide-booking-map-view-popup-image-height);
1013
- background-size: cover;
1014
- background-position: center;
1015
- background-color: var(--tide-booking-gray-light);
1016
- }
1017
-
1018
- &__popup-body {
1019
- padding: 1.2rem 1.4rem;
1020
- }
1021
-
1022
- &__popup-meta {
1023
- display: flex;
1024
- align-items: flex-start;
1025
- justify-content: space-between;
1026
- gap: 0.8rem;
1027
- margin-bottom: 1rem;
1028
- }
1029
-
1030
- &__popup-name {
1031
- margin: 0;
1032
- font-size: var(--tide-booking-h6);
1033
- font-weight: 700;
1034
- color: var(--tide-booking-black);
1035
- line-height: 1.25;
1036
- }
1037
-
1038
- &__popup-country {
1039
- margin: 3px 0 0;
1040
- font-size: var(--tide-booking-small-font-size--mobile);
1041
- color: var(--tide-booking-gray-dark);
1042
- }
1043
-
1044
- &__popup-link {
1045
- flex-shrink: 0;
1046
- font-size: var(--tide-booking-small-font-size--mobile);
1047
- color: var(--tide-booking-map-view-popup-link-color);
1048
- text-decoration: var(--tide-booking-a-text-decoration);
1049
- font-weight: 500;
1050
-
1051
- &:hover {
1052
- color: var(--tide-booking-map-view-popup-link-color-hover);
1053
- }
1054
- }
1055
-
1056
- &__popup-nights {
1057
- border-top: var(--tide-booking-map-view-destination-border);
1058
- padding-top: 1rem;
1059
- }
1060
-
1061
- &__popup-nights-label {
1062
- margin: 0 0 0.8rem;
1063
- font-size: var(--tide-booking-small-font-size--mobile);
1064
- color: var(--tide-booking-gray-dark);
1065
- }
1066
-
1067
- &__popup-nights-row {
1068
- display: flex;
1069
- align-items: center;
1070
- gap: 0.6rem;
1071
- }
1072
-
1073
- &__popup-nights-btn {
1074
- background-color: var(--tide-booking-gray-light);
1075
- border: var(--tide-booking-map-view-destination-border);
1076
- border-radius: var(--tide-booking-input-border-radius);
1077
- width: 30px;
1078
- height: 30px;
1079
- display: flex;
1080
- align-items: center;
1081
- justify-content: center;
1082
- cursor: pointer;
1083
- font-size: var(--tide-booking-font-size-body);
1084
- color: var(--tide-booking-gray-dark);
1085
- transition: background-color 0.15s ease, color 0.15s ease;
1086
-
1087
- &:hover {
1088
- background-color: var(--tide-booking-gray--medium-light);
1089
- color: var(--tide-booking-black);
1090
- }
1091
- }
1092
-
1093
- &__popup-nights-value {
1094
- min-width: 30px;
1095
- text-align: center;
1096
- font-size: var(--tide-booking-font-size-body-lg);
1097
- font-weight: 700;
1098
- color: var(--tide-booking-black);
1099
- }
1100
- }
1
+ @use '../components/mixins' as mixins;
2
+
3
+ .map-view {
4
+ display: flex;
5
+ flex-direction: column;
6
+ font-family: var(--tide-booking-font-body);
7
+ font-size: var(--tide-booking-font-size-body);
8
+ color: var(--tide-booking-gray-dark);
9
+
10
+ @include mixins.media-md {
11
+ flex-direction: row;
12
+ height: calc(100dvh - 120px);
13
+ overflow: hidden;
14
+ }
15
+
16
+ // ── Panel (left sidebar) ────────────────────────────────────────────────
17
+
18
+ &__panel {
19
+ display: flex;
20
+ flex-direction: column;
21
+ background-color: var(--tide-booking-map-view-panel-bg);
22
+ width: 100%;
23
+
24
+ @include mixins.media-md {
25
+ width: var(--tide-booking-map-view-panel-width);
26
+ min-width: var(--tide-booking-map-view-panel-width);
27
+ height: 100%;
28
+ box-shadow: var(--tide-booking-map-view-panel-shadow);
29
+ z-index: 100;
30
+ }
31
+ }
32
+
33
+ &__panel-head {
34
+ flex-shrink: 0;
35
+ }
36
+
37
+ &__panel-inner {
38
+ flex: 1;
39
+ overflow-y: auto;
40
+ @extend %scrollbar-thin;
41
+ }
42
+
43
+ // ── Intro: title + subtitle ─────────────────────────────────────────────
44
+
45
+ &__intro {
46
+ padding: 20px 20px 16px;
47
+ border-bottom: var(--tide-booking-map-view-destination-border);
48
+ }
49
+
50
+ &__title {
51
+ margin: 0;
52
+ font-family: var(--tide-booking-font-body);
53
+ font-size: var(--tide-booking-h3);
54
+ font-weight: 700;
55
+ color: var(--tide-booking-black);
56
+ line-height: 1.2;
57
+ letter-spacing: -0.02em;
58
+
59
+ @include mixins.media-md {
60
+ font-size: var(--tide-booking-h3-sm);
61
+ }
62
+ }
63
+
64
+ &__subtitle {
65
+ margin: 6px 0 0;
66
+ font-size: var(--tide-booking-small-font-size--mobile);
67
+ color: var(--tide-booking-gray-dark);
68
+ line-height: 1.5;
69
+
70
+ @include mixins.media-md {
71
+ font-size: var(--tide-booking-small-font-size--desktop);
72
+ }
73
+ }
74
+
75
+ // ── Meta chip: dates · nights · adults ─────────────────────────────────
76
+
77
+ &__meta {
78
+ display: flex;
79
+ align-items: center;
80
+ gap: 8px;
81
+ margin: 14px 20px;
82
+ padding: 10px 12px;
83
+ background-color: var(--tide-booking-map-view-dates-bg);
84
+ border: var(--tide-booking-map-view-destination-border);
85
+ border-radius: 12px;
86
+ font-size: var(--tide-booking-small-font-size--mobile);
87
+ color: var(--tide-booking-gray-dark);
88
+ }
89
+
90
+ &__meta-dates {
91
+ font-weight: 600;
92
+ color: var(--tide-booking-black);
93
+ }
94
+
95
+ &__meta-dot {
96
+ width: 4px;
97
+ height: 4px;
98
+ border-radius: 50%;
99
+ background-color: var(--tide-booking-gray-medium);
100
+ flex-shrink: 0;
101
+ }
102
+
103
+ &__meta-item {
104
+ color: var(--tide-booking-gray-dark);
105
+ }
106
+
107
+ &__meta-pax {
108
+ margin-left: auto;
109
+ display: flex;
110
+ align-items: center;
111
+ gap: 5px;
112
+ font-weight: 600;
113
+ color: var(--tide-booking-black);
114
+ }
115
+
116
+ &__meta-edit {
117
+ width: 28px;
118
+ height: 28px;
119
+ border-radius: 8px;
120
+ border: var(--tide-booking-map-view-destination-border);
121
+ background-color: var(--tide-booking-white);
122
+ display: flex;
123
+ align-items: center;
124
+ justify-content: center;
125
+ cursor: pointer;
126
+ color: var(--tide-booking-gray-dark);
127
+ flex-shrink: 0;
128
+ transition: border-color 0.15s ease, color 0.15s ease;
129
+
130
+ &:hover {
131
+ border-color: var(--tide-booking-color-primary);
132
+ color: var(--tide-booking-color-primary);
133
+ }
134
+ }
135
+
136
+ // ── Mobile map peek strip ────────────────────────────────────────────────
137
+
138
+ &__map-peek {
139
+ position: relative;
140
+ height: 130px;
141
+ background-color: #e8f0e0;
142
+ overflow: hidden;
143
+ flex-shrink: 0;
144
+
145
+ background-image: linear-gradient(rgba(0, 0, 0, 0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(0, 0, 0, 0.04) 1px, transparent 1px);
146
+ background-size: 40px 40px;
147
+
148
+ @include mixins.media-md {
149
+ display: none;
150
+ }
151
+ }
152
+
153
+ &__see-map {
154
+ position: absolute;
155
+ top: 50%;
156
+ left: 50%;
157
+ transform: translate(-50%, -50%);
158
+ background-color: var(--tide-booking-color-primary);
159
+ color: var(--tide-booking-white);
160
+ border: none;
161
+ border-radius: var(--tide-booking-input-border-radius);
162
+ padding: 1rem 2.8rem;
163
+ font-family: var(--tide-booking-font-body);
164
+ font-size: var(--tide-booking-font-size-body);
165
+ font-weight: 500;
166
+ cursor: pointer;
167
+ white-space: nowrap;
168
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
169
+ transition: background-color 0.2s ease;
170
+
171
+ &:hover {
172
+ background-color: var(--tide-booking-color-primary-dark);
173
+ }
174
+
175
+ @include mixins.media-md {
176
+ display: none;
177
+ }
178
+ }
179
+
180
+ // ── Shared icon button ──────────────────────────────────────────────────
181
+
182
+ &__icon-btn {
183
+ display: flex;
184
+ align-items: center;
185
+ justify-content: center;
186
+ background: none;
187
+ border: none;
188
+ cursor: pointer;
189
+ padding: 5px;
190
+ color: var(--tide-booking-gray-medium);
191
+ border-radius: 8px;
192
+ transition: color 0.15s ease, background-color 0.15s ease;
193
+ flex-shrink: 0;
194
+
195
+ &:hover {
196
+ color: var(--tide-booking-black);
197
+ background-color: var(--tide-booking-gray-light);
198
+ }
199
+ }
200
+
201
+ // ── Spine: the vertical timeline ────────────────────────────────────────
202
+ // Pins + cards are flex rows; the ::before creates the dashed connector line.
203
+
204
+ &__spine {
205
+ position: relative;
206
+ padding: 5px 20px 5px;
207
+
208
+ &::before {
209
+ content: '';
210
+ position: absolute;
211
+ // Horizontally centred on the 26 px pins which sit at left:20px
212
+ left: calc(20px + 13px);
213
+ top: 48px;
214
+ bottom: 34px;
215
+ border-left: 2px dashed var(--tide-booking-map-view-connector-color);
216
+ pointer-events: none;
217
+ }
218
+ }
219
+
220
+ // ── Node: a single destination (start / stop / end) ─────────────────────
221
+
222
+ &__node {
223
+ display: flex;
224
+ align-items: flex-start;
225
+ gap: 12px;
226
+ margin-bottom: 8px;
227
+ position: relative;
228
+ z-index: 1;
229
+
230
+ &--menu-open {
231
+ z-index: 300;
232
+ }
233
+ }
234
+
235
+ &__node-pin {
236
+ width: 26px;
237
+ min-width: 26px;
238
+ height: 26px;
239
+ border-radius: 50%;
240
+ display: flex;
241
+ align-items: center;
242
+ justify-content: center;
243
+ flex-shrink: 0;
244
+ margin-top: 14px;
245
+ background-color: var(--tide-booking-white);
246
+ border: var(--tide-booking-map-view-destination-border);
247
+
248
+ &--flag {
249
+ border-color: var(--tide-booking-color-primary);
250
+ color: var(--tide-booking-color-primary);
251
+ }
252
+
253
+ &--number {
254
+ background-color: var(--tide-booking-map-view-dot-stop-bg);
255
+ color: var(--tide-booking-map-view-dot-stop-color);
256
+ border-color: transparent;
257
+ font-weight: 700;
258
+ font-size: 12px;
259
+ box-shadow: 0 3px 10px rgba(0, 0, 0, 0.18);
260
+ }
261
+ }
262
+
263
+ &__node-card {
264
+ flex: 1;
265
+ min-width: 0;
266
+ background-color: var(--tide-booking-white);
267
+ border: var(--tide-booking-map-view-destination-border);
268
+ border-radius: 12px;
269
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
270
+
271
+ &:hover {
272
+ border-color: var(--tide-booking-gray-background-light);
273
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.07);
274
+ }
275
+ }
276
+
277
+ &__node-row {
278
+ display: flex;
279
+ align-items: center;
280
+ gap: 8px;
281
+ padding: 12px 14px;
282
+ }
283
+
284
+ &__node-info {
285
+ flex: 1;
286
+ min-width: 0;
287
+ display: flex;
288
+ flex-direction: column;
289
+ gap: 2px;
290
+ }
291
+
292
+ &__node-place {
293
+ font-size: var(--tide-booking-font-size-body);
294
+ font-weight: 700;
295
+ color: var(--tide-booking-black);
296
+ white-space: nowrap;
297
+ overflow: hidden;
298
+ text-overflow: ellipsis;
299
+
300
+ @include mixins.media-md {
301
+ font-size: var(--tide-booking-font-size-body-lg);
302
+ }
303
+ }
304
+
305
+ &__node-date {
306
+ font-size: var(--tide-booking-small-font-size--mobile);
307
+ color: var(--tide-booking-gray-dark);
308
+ }
309
+
310
+ &__node-tag {
311
+ flex-shrink: 0;
312
+ font-size: 11px;
313
+ font-weight: 700;
314
+ text-transform: uppercase;
315
+ letter-spacing: 0.06em;
316
+ padding: 3px 8px;
317
+ border-radius: 6px;
318
+
319
+ &--start,
320
+ &--end {
321
+ background-color: var(--tide-booking-color-primary-fade);
322
+ color: var(--tide-booking-color-primary);
323
+ }
324
+ }
325
+
326
+ // ── Reorder mode ────────────────────────────────────────────────────────
327
+
328
+ &__reorder-banner {
329
+ display: flex;
330
+ align-items: center;
331
+ gap: 8px;
332
+ padding: 9px 12px;
333
+ margin: 10px 20px 0;
334
+ background-color: var(--tide-booking-color-primary-fade);
335
+ border: 1px solid var(--tide-booking-color-primary-fade);
336
+ border-radius: 10px;
337
+ font-size: var(--tide-booking-small-font-size--mobile);
338
+ color: var(--tide-booking-color-primary);
339
+
340
+ span {
341
+ flex: 1;
342
+ }
343
+ }
344
+
345
+ &__reorder-done {
346
+ padding: 4px 12px;
347
+ border-radius: 7px;
348
+ background-color: var(--tide-booking-white);
349
+ border: 1px solid var(--tide-booking-color-primary);
350
+ color: var(--tide-booking-color-primary);
351
+ font-family: var(--tide-booking-font-body);
352
+ font-size: var(--tide-booking-small-font-size--mobile);
353
+ font-weight: 600;
354
+ cursor: pointer;
355
+ white-space: nowrap;
356
+ transition: background-color 0.15s ease;
357
+
358
+ &:hover {
359
+ background-color: var(--tide-booking-color-primary-fade);
360
+ }
361
+ }
362
+
363
+ &__drag-handle {
364
+ display: flex;
365
+ align-items: center;
366
+ justify-content: center;
367
+ width: 20px;
368
+ min-width: 20px;
369
+ margin-top: 14px;
370
+ color: var(--tide-booking-gray-medium);
371
+ cursor: grab;
372
+ flex-shrink: 0;
373
+ border-radius: 6px;
374
+ padding: 4px 2px;
375
+ transition: color 0.15s ease, background-color 0.15s ease;
376
+
377
+ &:hover {
378
+ color: var(--tide-booking-black);
379
+ background-color: var(--tide-booking-gray-light);
380
+ }
381
+
382
+ &:active {
383
+ cursor: grabbing;
384
+ }
385
+ }
386
+
387
+ &__node--reorder-locked {
388
+ opacity: 0.4;
389
+ pointer-events: none;
390
+ }
391
+
392
+ &__node--drag-over > .map-view__node-card {
393
+ border-color: var(--tide-booking-color-primary);
394
+ box-shadow: 0 0 0 3px var(--tide-booking-color-primary-extra-fade);
395
+ }
396
+
397
+ // ── Node action menu (stop cards) ──────────────────────────────────────
398
+
399
+ &__node-menu {
400
+ position: relative;
401
+ flex-shrink: 0;
402
+ }
403
+
404
+ &__node-dropdown {
405
+ position: absolute;
406
+ top: calc(100% + 10px);
407
+ right: -7px;
408
+ z-index: 200;
409
+ min-width: 210px;
410
+ background-color: var(--tide-booking-white);
411
+ border: var(--tide-booking-map-view-destination-border);
412
+ border-radius: 10px;
413
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
414
+
415
+ // Arrow pointing up — border layer
416
+ &::before {
417
+ content: '';
418
+ position: absolute;
419
+ top: -8px;
420
+ right: 12px;
421
+ border-left: 7px solid transparent;
422
+ border-right: 7px solid transparent;
423
+ border-bottom: 7px solid var(--tide-booking-gray-background-light);
424
+ z-index: 1;
425
+ }
426
+
427
+ // Arrow pointing up — white fill layer on top
428
+ &::after {
429
+ content: '';
430
+ position: absolute;
431
+ top: -6px;
432
+ right: 13px;
433
+ border-left: 6px solid transparent;
434
+ border-right: 6px solid transparent;
435
+ border-bottom: 6px solid var(--tide-booking-white);
436
+ z-index: 2;
437
+ }
438
+ }
439
+
440
+ &__node-dropdown-item {
441
+ display: flex;
442
+ align-items: center;
443
+ gap: 10px;
444
+ width: 100%;
445
+ padding: 11px 16px;
446
+ background: none;
447
+ border: none;
448
+ cursor: pointer;
449
+ font-family: var(--tide-booking-font-body);
450
+ font-size: var(--tide-booking-font-size-body);
451
+ color: var(--tide-booking-black);
452
+ text-align: left;
453
+ transition: background-color 0.12s ease;
454
+
455
+ &:first-child {
456
+ border-radius: 10px 10px 0 0;
457
+ }
458
+
459
+ &:last-child {
460
+ border-radius: 0 0 10px 10px;
461
+ }
462
+
463
+ & + & {
464
+ border-top: var(--tide-booking-map-view-destination-border);
465
+ }
466
+
467
+ &:hover {
468
+ background-color: var(--tide-booking-gray-light);
469
+ }
470
+
471
+ &--danger {
472
+ color: var(--tide-booking-invalid);
473
+ }
474
+ }
475
+
476
+ // ── Accommodation row (inside stop card) ────────────────────────────────
477
+
478
+ &__stay {
479
+ display: flex;
480
+ align-items: center;
481
+ gap: 10px;
482
+ padding: 10px 14px;
483
+ border-top: var(--tide-booking-map-view-destination-border);
484
+ background-color: var(--tide-booking-gray-xlight);
485
+ flex-wrap: wrap;
486
+ border-radius: 0 0 12px 12px;
487
+ }
488
+
489
+ &__stay-icon {
490
+ width: 32px;
491
+ min-width: 32px;
492
+ height: 32px;
493
+ border-radius: 50%;
494
+ background-color: orangered;
495
+ color: var(--tide-booking-white);
496
+ display: flex;
497
+ align-items: center;
498
+ justify-content: center;
499
+ flex-shrink: 0;
500
+
501
+ &--off {
502
+ background-color: var(--tide-booking-gray--medium-light);
503
+ color: var(--tide-booking-gray-dark);
504
+ }
505
+ }
506
+
507
+ &__stay-info {
508
+ display: flex;
509
+ flex-direction: column;
510
+ gap: 1px;
511
+ flex: 1;
512
+ min-width: 0;
513
+ }
514
+
515
+ &__stay-label {
516
+ font-size: var(--tide-booking-font-size-body);
517
+ font-weight: 600;
518
+ color: var(--tide-booking-black);
519
+ }
520
+
521
+ &__stay-sublabel {
522
+ font-size: var(--tide-booking-small-font-size--mobile);
523
+ color: var(--tide-booking-gray-dark);
524
+ }
525
+
526
+ &__stay-stepper {
527
+ display: flex;
528
+ align-items: center;
529
+ gap: 4px;
530
+ flex-shrink: 0;
531
+ background-color: var(--tide-booking-gray-light);
532
+ border-radius: 8px;
533
+ padding: 4px;
534
+ }
535
+
536
+ &__stay-btn {
537
+ width: 24px;
538
+ height: 24px;
539
+ border-radius: 6px;
540
+ border: none;
541
+ background-color: var(--tide-booking-white);
542
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
543
+ display: flex;
544
+ align-items: center;
545
+ justify-content: center;
546
+ cursor: pointer;
547
+ color: var(--tide-booking-gray-dark);
548
+ padding: 0;
549
+ transition: color 0.15s ease;
550
+
551
+ &:hover {
552
+ color: var(--tide-booking-color-primary);
553
+ }
554
+ }
555
+
556
+ &__stay-value {
557
+ min-width: 22px;
558
+ text-align: center;
559
+ font-weight: 700;
560
+ font-size: var(--tide-booking-font-size-body);
561
+ color: var(--tide-booking-black);
562
+ }
563
+
564
+ &__stay-nights {
565
+ font-size: var(--tide-booking-small-font-size--mobile);
566
+ color: var(--tide-booking-gray-dark);
567
+ margin-left: 2px;
568
+ margin-right: 4px;
569
+ }
570
+
571
+ // ── Leg: transport row between destinations ─────────────────────────────
572
+
573
+ &__leg {
574
+ display: flex;
575
+ align-items: center;
576
+ gap: 12px;
577
+ margin-bottom: 8px;
578
+ padding: 6px 0;
579
+ position: relative;
580
+ z-index: 0;
581
+ }
582
+
583
+ &__leg-pin {
584
+ width: 26px;
585
+ min-width: 26px;
586
+ height: 26px;
587
+ border-radius: 50%;
588
+ display: flex;
589
+ align-items: center;
590
+ justify-content: center;
591
+ flex-shrink: 0;
592
+ background-color: var(--tide-booking-white);
593
+ border: var(--tide-booking-map-view-destination-border);
594
+ color: var(--tide-booking-color-primary);
595
+ }
596
+
597
+ &__leg-text {
598
+ flex: 1;
599
+ font-size: var(--tide-booking-small-font-size--mobile);
600
+ color: var(--tide-booking-gray-dark);
601
+ transition: color 0.2s ease;
602
+
603
+ .map-view__leg--on & {
604
+ color: var(--tide-booking-black);
605
+ }
606
+
607
+ @include mixins.media-md {
608
+ font-size: var(--tide-booking-small-font-size--desktop);
609
+ }
610
+ }
611
+
612
+ // ── Toggle switch ───────────────────────────────────────────────────────
613
+
614
+ &__toggle {
615
+ position: relative;
616
+ flex-shrink: 0;
617
+ width: 40px;
618
+ height: 22px;
619
+ background-color: var(--tide-booking-map-view-toggle-off-bg);
620
+ border-radius: 11px;
621
+ border: none;
622
+ cursor: pointer;
623
+ transition: background-color 0.25s ease;
624
+
625
+ &::after {
626
+ content: '';
627
+ position: absolute;
628
+ width: 16px;
629
+ height: 16px;
630
+ border-radius: 50%;
631
+ background-color: var(--tide-booking-white);
632
+ top: 3px;
633
+ left: 3px;
634
+ transition: transform 0.25s ease;
635
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
636
+ }
637
+
638
+ &--on {
639
+ background-color: var(--tide-booking-map-view-toggle-on-bg);
640
+
641
+ &::after {
642
+ transform: translateX(18px);
643
+ }
644
+ }
645
+ }
646
+
647
+ // ── Add destination search ───────────────────────────────────────────────
648
+
649
+ &__add {
650
+ padding: 14px 20px 28px;
651
+ }
652
+
653
+ &__add-wrap {
654
+ position: relative;
655
+ }
656
+
657
+ &__add-results {
658
+ position: absolute;
659
+ bottom: calc(100% + 6px);
660
+ left: 0;
661
+ right: 0;
662
+ z-index: 200;
663
+ list-style: none;
664
+ margin: 0;
665
+ padding: 4px 0;
666
+ background-color: var(--tide-booking-white);
667
+ border: var(--tide-booking-map-view-destination-border);
668
+ border-radius: 12px;
669
+ box-shadow: 0 -6px 24px rgba(0, 0, 0, 0.1);
670
+ overflow: hidden;
671
+ }
672
+
673
+ &__add-result {
674
+ display: flex;
675
+ align-items: center;
676
+ gap: 10px;
677
+ padding: 10px 14px;
678
+ cursor: pointer;
679
+ transition: background-color 0.12s ease;
680
+
681
+ & + & {
682
+ border-top: var(--tide-booking-map-view-destination-border);
683
+ }
684
+
685
+ &:hover {
686
+ background-color: var(--tide-booking-gray-light);
687
+ }
688
+ }
689
+
690
+ &__add-result-icon {
691
+ width: 28px;
692
+ min-width: 28px;
693
+ height: 28px;
694
+ border-radius: 50%;
695
+ background-color: var(--tide-booking-gray-light);
696
+ display: flex;
697
+ align-items: center;
698
+ justify-content: center;
699
+ flex-shrink: 0;
700
+ color: var(--tide-booking-color-primary);
701
+ }
702
+
703
+ &__add-result-info {
704
+ display: flex;
705
+ flex-direction: column;
706
+ gap: 2px;
707
+ min-width: 0;
708
+ }
709
+
710
+ &__add-result-name {
711
+ font-size: var(--tide-booking-font-size-body);
712
+ font-weight: 600;
713
+ color: var(--tide-booking-black);
714
+ white-space: nowrap;
715
+ overflow: hidden;
716
+ text-overflow: ellipsis;
717
+ }
718
+
719
+ &__add-result-sub {
720
+ font-size: var(--tide-booking-small-font-size--mobile);
721
+ color: var(--tide-booking-gray-dark);
722
+ }
723
+
724
+ &__add-label {
725
+ margin: 0 0 8px;
726
+ font-size: var(--tide-booking-font-size-body);
727
+ font-weight: 600;
728
+ color: var(--tide-booking-black);
729
+ }
730
+
731
+ &__add-field {
732
+ display: flex;
733
+ align-items: center;
734
+ gap: 10px;
735
+ padding: 0 14px;
736
+ background-color: var(--tide-booking-gray-light);
737
+ border: 1.5px solid transparent;
738
+ border-radius: 12px;
739
+ min-height: var(--tide-booking-input-height);
740
+ color: var(--tide-booking-gray-dark);
741
+ transition: background-color 0.15s ease, border-color 0.15s ease;
742
+
743
+ &:focus-within {
744
+ background-color: var(--tide-booking-gray--medium-light);
745
+ border-color: var(--tide-booking-color-primary);
746
+ }
747
+ }
748
+
749
+ &__add-input {
750
+ flex: 1;
751
+ border: none;
752
+ outline: 0;
753
+ box-shadow: none;
754
+ -webkit-appearance: none;
755
+ appearance: none;
756
+
757
+ &:hover,
758
+ &:focus {
759
+ border: none;
760
+ outline: 0;
761
+ box-shadow: none;
762
+ }
763
+ font-family: var(--tide-booking-font-body);
764
+ font-size: var(--tide-booking-font-size-body);
765
+ color: var(--tide-booking-input-color);
766
+ background: none;
767
+ padding: 0;
768
+
769
+ &::placeholder {
770
+ color: var(--tide-booking-input-placeholder-color);
771
+ font-style: var(--tide-booking-input-placeholder-font-style);
772
+ }
773
+ }
774
+
775
+ // ── Footer: price estimate + continue button ─────────────────────────────
776
+
777
+ &__footer {
778
+ border-top: var(--tide-booking-map-view-destination-border);
779
+ flex-shrink: 0;
780
+ display: flex;
781
+ align-items: center;
782
+ flex-direction: row-reverse;
783
+ justify-content: space-between;
784
+ gap: 14px;
785
+ padding: 16px 20px;
786
+ }
787
+
788
+ &__price {
789
+ flex: 1;
790
+ min-width: 0;
791
+ display: flex;
792
+ flex-direction: column;
793
+ gap: 2px;
794
+ }
795
+
796
+ &__price-label {
797
+ font-size: var(--tide-booking-small-font-size--mobile);
798
+ color: var(--tide-booking-gray-dark);
799
+ }
800
+
801
+ &__price-value {
802
+ font-size: var(--tide-booking-h5);
803
+ font-weight: 700;
804
+ color: var(--tide-booking-black);
805
+ white-space: nowrap;
806
+
807
+ @include mixins.media-md {
808
+ font-size: var(--tide-booking-h5-xl);
809
+ }
810
+ }
811
+
812
+ &__continue {
813
+ display: inline-flex;
814
+ align-items: center;
815
+ gap: 8px;
816
+ padding: 12px 22px;
817
+ background: var(--tide-booking-map-view-continue-bg);
818
+ color: var(--tide-booking-map-view-continue-color);
819
+ border: var(--tide-booking-cta-border);
820
+ border-radius: 10px;
821
+ cursor: pointer;
822
+ font-family: var(--tide-booking-font-body);
823
+ font-size: var(--tide-booking-map-view-continue-font-size);
824
+ font-weight: var(--tide-booking-map-view-continue-font-weight);
825
+ white-space: nowrap;
826
+ letter-spacing: 0.02em;
827
+ transition: background 0.2s ease, transform 0.15s ease, box-shadow 0.15s ease;
828
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.14);
829
+
830
+ &:hover {
831
+ background: var(--tide-booking-map-view-continue-bg-hover);
832
+ transform: translateY(-1px);
833
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
834
+ }
835
+ }
836
+
837
+ // ── Map wrap ─────────────────────────────────────────────────────────────
838
+
839
+ &__map-wrap {
840
+ position: fixed;
841
+ inset: 0;
842
+ visibility: hidden;
843
+ z-index: -1;
844
+
845
+ @include mixins.media-md {
846
+ position: relative;
847
+ flex: 1;
848
+ visibility: visible;
849
+ z-index: auto;
850
+ inset: auto;
851
+ }
852
+
853
+ &--expanded {
854
+ visibility: visible;
855
+ z-index: 9999;
856
+ }
857
+ }
858
+
859
+ &__map {
860
+ width: 100%;
861
+ height: 100%;
862
+ position: absolute;
863
+ inset: 0;
864
+ }
865
+
866
+ // ── Close button (mobile full-screen map) ─────────────────────────────────
867
+
868
+ &__map-close {
869
+ position: absolute;
870
+ top: 1.5rem;
871
+ right: 1.5rem;
872
+ z-index: 1001;
873
+ background-color: var(--tide-booking-white);
874
+ border: none;
875
+ border-radius: 50%;
876
+ width: 4rem;
877
+ height: 4rem;
878
+ display: flex;
879
+ align-items: center;
880
+ justify-content: center;
881
+ cursor: pointer;
882
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
883
+ transition: background-color 0.2s ease;
884
+
885
+ &:hover {
886
+ background-color: var(--tide-booking-gray-light);
887
+ }
888
+
889
+ @include mixins.media-md {
890
+ display: none;
891
+ }
892
+ }
893
+
894
+ // ── Leaflet tooltip ───────────────────────────────────────────────────────
895
+
896
+ &__leaflet-tooltip {
897
+ font-family: var(--tide-booking-font-body);
898
+ font-size: var(--tide-booking-small-font-size--mobile);
899
+ border-radius: var(--tide-booking-input-border-radius);
900
+ border: none;
901
+ box-shadow: var(--tide-booking-nav-box-shadow);
902
+ padding: 0.5rem 0.8rem;
903
+ }
904
+
905
+ // ── Map markers ───────────────────────────────────────────────────────────
906
+
907
+ &__marker {
908
+ width: var(--tide-booking-map-view-marker-size);
909
+ height: var(--tide-booking-map-view-marker-size);
910
+ border-radius: 50%;
911
+ display: flex;
912
+ align-items: center;
913
+ justify-content: center;
914
+ border: 3px solid var(--tide-booking-map-view-marker-border-color);
915
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
916
+ cursor: pointer;
917
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
918
+
919
+ &:hover {
920
+ transform: scale(1.08);
921
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.28);
922
+ }
923
+
924
+ &--plane {
925
+ background-color: var(--tide-booking-map-view-marker-plane-bg);
926
+ color: var(--tide-booking-map-view-marker-plane-color);
927
+ }
928
+
929
+ &--stop {
930
+ background-color: var(--tide-booking-gray-light);
931
+ background-size: cover;
932
+ background-position: center;
933
+ position: relative;
934
+ overflow: visible;
935
+ }
936
+ }
937
+
938
+ &__marker-number {
939
+ font-size: 18px;
940
+ font-weight: 700;
941
+ color: var(--tide-booking-map-view-dot-stop-bg);
942
+ }
943
+
944
+ &__marker-badge {
945
+ position: absolute;
946
+ bottom: -4px;
947
+ right: -4px;
948
+ width: 20px;
949
+ height: 20px;
950
+ background-color: var(--tide-booking-map-view-marker-badge-bg);
951
+ color: var(--tide-booking-map-view-marker-badge-color);
952
+ border-radius: 50%;
953
+ display: flex;
954
+ align-items: center;
955
+ justify-content: center;
956
+ font-size: 11px;
957
+ font-weight: 700;
958
+ border: 2px solid var(--tide-booking-white);
959
+ }
960
+
961
+ // ── Popup overlay ─────────────────────────────────────────────────────────
962
+
963
+ &__popup {
964
+ position: absolute;
965
+ z-index: 1000;
966
+ width: var(--tide-booking-map-view-popup-width);
967
+ background-color: var(--tide-booking-map-view-popup-bg);
968
+ border-radius: var(--tide-booking-map-view-popup-border-radius);
969
+ box-shadow: var(--tide-booking-map-view-popup-shadow);
970
+ transform: translate(-50%, calc(-100% - 28px));
971
+ overflow: hidden;
972
+ pointer-events: auto;
973
+
974
+ &::after {
975
+ content: '';
976
+ position: absolute;
977
+ bottom: -7px;
978
+ left: 50%;
979
+ transform: translateX(-50%);
980
+ width: 0;
981
+ height: 0;
982
+ border-left: 7px solid transparent;
983
+ border-right: 7px solid transparent;
984
+ border-top: 7px solid var(--tide-booking-map-view-popup-bg);
985
+ filter: drop-shadow(0 2px 2px rgba(0, 0, 0, 0.06));
986
+ }
987
+ }
988
+
989
+ &__popup-close {
990
+ position: absolute;
991
+ top: 7px;
992
+ right: 7px;
993
+ z-index: 10;
994
+ background-color: rgba(255, 255, 255, 0.92);
995
+ border: none;
996
+ border-radius: 50%;
997
+ width: 24px;
998
+ height: 24px;
999
+ display: flex;
1000
+ align-items: center;
1001
+ justify-content: center;
1002
+ cursor: pointer;
1003
+ transition: background-color 0.2s ease;
1004
+
1005
+ &:hover {
1006
+ background-color: var(--tide-booking-white);
1007
+ }
1008
+ }
1009
+
1010
+ &__popup-image {
1011
+ width: 100%;
1012
+ height: var(--tide-booking-map-view-popup-image-height);
1013
+ background-size: cover;
1014
+ background-position: center;
1015
+ background-color: var(--tide-booking-gray-light);
1016
+ }
1017
+
1018
+ &__popup-body {
1019
+ padding: 1.2rem 1.4rem;
1020
+ }
1021
+
1022
+ &__popup-meta {
1023
+ display: flex;
1024
+ align-items: flex-start;
1025
+ justify-content: space-between;
1026
+ gap: 0.8rem;
1027
+ margin-bottom: 1rem;
1028
+ }
1029
+
1030
+ &__popup-name {
1031
+ margin: 0;
1032
+ font-size: var(--tide-booking-h6);
1033
+ font-weight: 700;
1034
+ color: var(--tide-booking-black);
1035
+ line-height: 1.25;
1036
+ }
1037
+
1038
+ &__popup-country {
1039
+ margin: 3px 0 0;
1040
+ font-size: var(--tide-booking-small-font-size--mobile);
1041
+ color: var(--tide-booking-gray-dark);
1042
+ }
1043
+
1044
+ &__popup-link {
1045
+ flex-shrink: 0;
1046
+ font-size: var(--tide-booking-small-font-size--mobile);
1047
+ color: var(--tide-booking-map-view-popup-link-color);
1048
+ text-decoration: var(--tide-booking-a-text-decoration);
1049
+ font-weight: 500;
1050
+
1051
+ &:hover {
1052
+ color: var(--tide-booking-map-view-popup-link-color-hover);
1053
+ }
1054
+ }
1055
+
1056
+ &__popup-nights {
1057
+ border-top: var(--tide-booking-map-view-destination-border);
1058
+ padding-top: 1rem;
1059
+ }
1060
+
1061
+ &__popup-nights-label {
1062
+ margin: 0 0 0.8rem;
1063
+ font-size: var(--tide-booking-small-font-size--mobile);
1064
+ color: var(--tide-booking-gray-dark);
1065
+ }
1066
+
1067
+ &__popup-nights-row {
1068
+ display: flex;
1069
+ align-items: center;
1070
+ gap: 0.6rem;
1071
+ }
1072
+
1073
+ &__popup-nights-btn {
1074
+ background-color: var(--tide-booking-gray-light);
1075
+ border: var(--tide-booking-map-view-destination-border);
1076
+ border-radius: var(--tide-booking-input-border-radius);
1077
+ width: 30px;
1078
+ height: 30px;
1079
+ display: flex;
1080
+ align-items: center;
1081
+ justify-content: center;
1082
+ cursor: pointer;
1083
+ font-size: var(--tide-booking-font-size-body);
1084
+ color: var(--tide-booking-gray-dark);
1085
+ transition: background-color 0.15s ease, color 0.15s ease;
1086
+
1087
+ &:hover {
1088
+ background-color: var(--tide-booking-gray--medium-light);
1089
+ color: var(--tide-booking-black);
1090
+ }
1091
+ }
1092
+
1093
+ &__popup-nights-value {
1094
+ min-width: 30px;
1095
+ text-align: center;
1096
+ font-size: var(--tide-booking-font-size-body-lg);
1097
+ font-weight: 700;
1098
+ color: var(--tide-booking-black);
1099
+ }
1100
+ }