@qite/tide-components 1.0.13 → 1.0.14

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 (73) hide show
  1. package/build/build-cjs/index.js +11 -11
  2. package/build/build-esm/index.js +11 -11
  3. package/package.json +1 -1
  4. package/styles/abstracts/_mixins.scss +74 -74
  5. package/styles/abstracts/_variables.scss +57 -57
  6. package/styles/base/_fonts.scss +2 -2
  7. package/styles/base/_normalize.scss +227 -227
  8. package/styles/base/_typography.scss +35 -35
  9. package/styles/booking-joker-variables.scss +596 -596
  10. package/styles/booking-product-variables.scss +330 -330
  11. package/styles/booking-product.scss +438 -438
  12. package/styles/booking-qsm-variables.scss +501 -501
  13. package/styles/booking-qsm.scss +52 -52
  14. package/styles/booking-search-results-variables.scss +734 -734
  15. package/styles/booking-search-results.scss +53 -53
  16. package/styles/booking-wizard-variables.scss +603 -603
  17. package/styles/booking-wizard.scss +61 -61
  18. package/styles/components/_accordion.scss +67 -67
  19. package/styles/components/_animations.scss +39 -39
  20. package/styles/components/_base.scss +107 -107
  21. package/styles/components/_booking.scss +906 -906
  22. package/styles/components/_breadcrumb.scss +92 -92
  23. package/styles/components/_button.scss +238 -238
  24. package/styles/components/_checkbox.scss +230 -230
  25. package/styles/components/_contact.scss +255 -255
  26. package/styles/components/_content.scss +336 -336
  27. package/styles/components/_cta.scss +238 -238
  28. package/styles/components/_date-list.scss +41 -41
  29. package/styles/components/_date-range-picker.scss +223 -223
  30. package/styles/components/_decrement-increment.scss +35 -35
  31. package/styles/components/_dropdown.scss +77 -77
  32. package/styles/components/_error.scss +50 -50
  33. package/styles/components/_faq.scss +30 -30
  34. package/styles/components/_flight-option.scss +1444 -1444
  35. package/styles/components/_flyin.scss +830 -830
  36. package/styles/components/_footer.scss +135 -135
  37. package/styles/components/_form.scss +1704 -1704
  38. package/styles/components/_gallery.scss +317 -317
  39. package/styles/components/_header.scss +113 -113
  40. package/styles/components/_image-with-text.scss +206 -206
  41. package/styles/components/_img-slider.scss +175 -175
  42. package/styles/components/_info-message.scss +75 -75
  43. package/styles/components/_input.scss +35 -35
  44. package/styles/components/_list.scss +185 -185
  45. package/styles/components/_loader.scss +152 -152
  46. package/styles/components/_login.scss +140 -140
  47. package/styles/components/_map-view.scss +1100 -1100
  48. package/styles/components/_mixins.scss +579 -579
  49. package/styles/components/_navbar.scss +765 -765
  50. package/styles/components/_passenger-picker.scss +306 -306
  51. package/styles/components/_phone-input.scss +8 -8
  52. package/styles/components/_placeholders.scss +165 -165
  53. package/styles/components/_pricing-summary.scss +163 -163
  54. package/styles/components/_qsm.scss +17 -17
  55. package/styles/components/_radiobutton.scss +170 -170
  56. package/styles/components/_search.scss +2197 -2197
  57. package/styles/components/_select-wrapper.scss +81 -81
  58. package/styles/components/_slider.scss +120 -120
  59. package/styles/components/_spinner.scss +29 -29
  60. package/styles/components/_step-indicators.scss +187 -187
  61. package/styles/components/_table.scss +81 -81
  62. package/styles/components/_tide-form.scss +578 -578
  63. package/styles/components/_tree.scss +648 -648
  64. package/styles/components/_typeahead.scss +275 -275
  65. package/styles/components/_variables.scss +89 -89
  66. package/styles/content-blocks-variables.scss +543 -543
  67. package/styles/content-blocks.scss +66 -66
  68. package/styles/font.scss +2 -2
  69. package/styles/qsm/_calendar.scss +274 -274
  70. package/styles/qsm/_qsm.scss +1097 -1097
  71. package/styles/search.scss +1200 -1200
  72. package/styles/tide-form-variables.scss +275 -275
  73. package/styles/tide-form.scss +56 -56
@@ -1,578 +1,578 @@
1
- .tide-form__layout {
2
- display: flex;
3
- gap: var(--tide-form-sidebar-gap, 2rem);
4
- align-items: flex-start;
5
-
6
- &--sidebar-right {
7
- flex-direction: row;
8
- }
9
- &--sidebar-left {
10
- flex-direction: row-reverse;
11
- }
12
-
13
- .tide-form__content {
14
- flex: 1;
15
- min-width: 0;
16
- }
17
- .tide-form__sidebar {
18
- flex: 0 0 var(--tide-form-sidebar-width, 320px);
19
- }
20
- }
21
-
22
- .tide-form {
23
- display: flex;
24
- flex-direction: column;
25
- gap: 20px;
26
- @include container-small();
27
-
28
- &__groups {
29
- display: flex;
30
- flex-direction: column;
31
- gap: var(--tide-form-groups-gap);
32
- }
33
-
34
- &__group {
35
- display: flex;
36
- flex-direction: column;
37
- gap: 20px;
38
- background-color: var(--tide-form-group-background);
39
- border: var(--tide-form-group-border);
40
- box-shadow: var(--tide-form-group-shadow);
41
- border-radius: var(--tide-form-group-border-radius);
42
- padding: var(--tide-form-group-padding);
43
-
44
- @include media-sm {
45
- padding: var(--tide-form-group-padding-sm);
46
- }
47
- }
48
-
49
- &__group-title {
50
- color: var(--tide-form-group-title-color);
51
- margin: 0;
52
- // font-size: var(--tide-form-group-title-font-size);
53
- font-weight: 500;
54
- }
55
-
56
- &__fields {
57
- display: flex;
58
- flex-wrap: wrap;
59
- column-gap: var(--tide-form-fields-gap, 20px);
60
- row-gap: var(--tide-form-fields-row-gap, 25px);
61
- }
62
-
63
- // ─── Field wrapper ─────────────────────────────────────────────────────────
64
-
65
- &__field {
66
- position: relative;
67
- display: flex;
68
- flex-direction: column;
69
- flex: 1 1 100%;
70
- margin-bottom: 10px;
71
-
72
- &--width-75 {
73
- @include media-sm {
74
- flex: 1 1 calc(75% - 20px);
75
- }
76
- }
77
-
78
- &--width-66 {
79
- @include media-sm {
80
- flex: 1 1 calc(66.666% - 20px);
81
- }
82
- }
83
-
84
- &--width-50 {
85
- @include media-sm {
86
- flex: 1 1 calc(50% - 10px);
87
- }
88
- }
89
-
90
- &--width-33 {
91
- @include media-sm {
92
- flex: 1 1 calc(50% - 10px);
93
- }
94
-
95
- @include media-lg {
96
- flex: 1 1 calc(33.333% - 14px);
97
- }
98
- }
99
-
100
- &--width-25 {
101
- @include media-sm {
102
- flex: 1 1 calc(50% - 10px);
103
- }
104
-
105
- @include media-lg {
106
- flex: 1 1 calc(25% - 15px);
107
- }
108
- }
109
-
110
- // Error state — tint the input background when an error is visible
111
- &:has(.tide-form__field-error) {
112
- input,
113
- textarea {
114
- background: var(--tide-booking-invalid-light);
115
-
116
- &::placeholder {
117
- color: var(--tide-booking-invalid-dark);
118
- }
119
- }
120
- }
121
- }
122
-
123
- // ─── Field internals ───────────────────────────────────────────────────────
124
-
125
- &__field-label {
126
- margin-bottom: 10px;
127
- color: var(--tide-booking-input-label-color);
128
- font-weight: var(--tide-booking-input-label-font-weight);
129
- font-style: var(--tide-booking-input-label-font-style);
130
-
131
- &--checkbox {
132
- display: flex;
133
- align-items: cente;
134
- gap: 10px;
135
- margin-bottom: 0;
136
- cursor: pointer;
137
- line-height: 1.5;
138
- }
139
- }
140
-
141
- &__field-required {
142
- margin-left: 2px;
143
- color: var(--tide-form-field-required-color);
144
- }
145
-
146
- &__field-help {
147
- position: relative;
148
- display: inline-flex;
149
- align-items: center;
150
- margin-left: 6px;
151
- vertical-align: middle;
152
- }
153
-
154
- &__field-help-trigger {
155
- display: inline-flex;
156
- align-items: center;
157
- justify-content: center;
158
- padding: 0;
159
- background: none;
160
- border: none;
161
- cursor: pointer;
162
- color: var(--tide-form-help-color, currentColor);
163
- opacity: 0.6;
164
- line-height: 1;
165
-
166
- &:hover,
167
- &:focus-visible {
168
- opacity: 1;
169
- outline: none;
170
- }
171
- }
172
-
173
- &__field-help-tooltip {
174
- position: absolute;
175
- bottom: calc(100% + 6px);
176
- left: 50%;
177
- transform: translateX(-50%);
178
- z-index: 10;
179
- min-width: 180px;
180
- max-width: 280px;
181
- padding: 8px 10px;
182
- background: var(--tide-form-help-tooltip-bg, #333);
183
- color: var(--tide-form-help-tooltip-color, #fff);
184
- font-size: 0.8em;
185
- font-weight: normal;
186
- border-radius: 4px;
187
- pointer-events: none;
188
- white-space: normal;
189
- line-height: 1.4;
190
-
191
- &::after {
192
- content: '';
193
- position: absolute;
194
- top: 100%;
195
- left: 50%;
196
- transform: translateX(-50%);
197
- border: 5px solid transparent;
198
- border-top-color: var(--tide-form-help-tooltip-bg, #333);
199
- }
200
- }
201
-
202
- &__field-input {
203
- width: 100%;
204
- box-sizing: border-box;
205
-
206
- @include input;
207
-
208
- &--multiline {
209
- @include textarea;
210
- }
211
- }
212
-
213
- &__field-checkbox {
214
- flex-shrink: 0;
215
- width: 18px;
216
- height: 18px;
217
- min-height: 18px;
218
- margin: 0;
219
- margin-top: 5px;
220
- cursor: pointer;
221
- accent-color: var(--tide-booking-color-primary);
222
- }
223
-
224
- &__field-error {
225
- position: absolute;
226
- bottom: -18px;
227
- left: 0;
228
- margin: 0;
229
- font-size: var(--tide-form-field-error-font-size);
230
- color: var(--tide-form-field-error-color);
231
- transition: opacity 0.2s ease;
232
- }
233
-
234
- // ─── Radio / Checkbox options ──────────────────────────────────────────────
235
-
236
- &__options {
237
- display: flex;
238
- flex-direction: column;
239
- // gap: 8px;
240
-
241
- &--multi {
242
- gap: 8px;
243
- }
244
- }
245
-
246
- &__option {
247
- display: flex;
248
- align-items: center;
249
- gap: 8px;
250
- cursor: pointer;
251
- user-select: none;
252
- }
253
-
254
- &__option-input {
255
- flex-shrink: 0;
256
- width: 16px;
257
- height: 16px;
258
- margin: 0;
259
- cursor: pointer;
260
- accent-color: var(--tide-booking-color-primary);
261
-
262
- &::placeholder {
263
- color: #e65100;
264
- }
265
- }
266
-
267
- &__option-label {
268
- font-size: var(--tide-booking-font-size-body);
269
- color: var(--tide-booking-black);
270
- line-height: 1.4;
271
-
272
- @include media-lg {
273
- font-size: var(--tide-booking-font-size-body-lg);
274
- }
275
- }
276
-
277
- // ─── Dropdown ──────────────────────────────────────────────────────────────
278
-
279
- &__dropdown {
280
- position: relative;
281
-
282
- &--error {
283
- .tide-form__dropdown__trigger {
284
- background: var(--tide-booking-invalid-light);
285
- color: var(--tide-booking-invalid-dark);
286
- }
287
- }
288
-
289
- &__trigger {
290
- width: 100%;
291
- min-height: var(--tide-booking-input-height);
292
- padding: 0 12px;
293
- color: var(--tide-booking-dropdown-color);
294
- background: var(--tide-booking-dropdown-background);
295
- border: var(--tide-booking-dropdown-border);
296
- border-radius: var(--tide-booking-dropdown-border-radius);
297
- display: flex;
298
- align-items: center;
299
- justify-content: space-between;
300
- gap: 8px;
301
- cursor: pointer;
302
- font-family: var(--tide-booking-font-body);
303
- font-size: var(--tide-booking-font-size-body);
304
- line-height: 1;
305
- transition: border 0.2s ease, color 0.2s ease, background 0.2s ease;
306
-
307
- @include media-lg {
308
- font-size: var(--tide-booking-font-size-body-lg);
309
- min-height: var(--tide-booking-input-height-lg);
310
- }
311
-
312
- &:hover {
313
- border: var(--tide-booking-dropdown-border-hover);
314
- color: var(--tide-booking-dropdown-color-hover);
315
- background: var(--tide-booking-dropdown-background-hover);
316
- }
317
-
318
- &:focus {
319
- outline: none;
320
- border: var(--tide-booking-dropdown-border-focus);
321
- color: var(--tide-booking-dropdown-color-focus);
322
- background: var(--tide-booking-dropdown-background-focus);
323
- }
324
-
325
- .icon svg {
326
- fill: var(--tide-booking-dropdown-arrow-color);
327
- transition: fill 0.2s ease;
328
- }
329
-
330
- &:hover .icon svg {
331
- fill: var(--tide-booking-dropdown-arrow-color-hover);
332
- }
333
- }
334
-
335
- &__menu {
336
- position: absolute;
337
- z-index: 10;
338
- top: calc(100% + 4px);
339
- left: 0;
340
- right: 0;
341
- background: var(--tide-booking-white);
342
- border: 1px solid var(--tide-booking-gray-background-light);
343
- border-radius: 4px;
344
- max-height: 220px;
345
- overflow-y: auto;
346
- padding: 0;
347
- margin: 0;
348
- list-style: none;
349
- }
350
-
351
- &__option {
352
- width: 100%;
353
- padding: 12px 15px;
354
- background: none;
355
- border: none;
356
- text-align: left;
357
- cursor: pointer;
358
- font-family: var(--tide-booking-font-body);
359
- font-size: var(--tide-booking-font-size-body);
360
- line-height: 1.5;
361
- color: var(--tide-booking-black);
362
-
363
- @include media-lg {
364
- font-size: var(--tide-booking-font-size-body-lg);
365
- }
366
-
367
- &:hover,
368
- &--active {
369
- background: var(--tide-booking-gray-light);
370
- }
371
-
372
- &:focus {
373
- outline: none;
374
- background: var(--tide-booking-gray--medium-light);
375
- }
376
-
377
- // Multi-select variant — aligns checkmark and label
378
- &--checkbox {
379
- display: flex;
380
- align-items: center;
381
- gap: 10px;
382
- }
383
- }
384
-
385
- &__option-check {
386
- flex-shrink: 0;
387
- width: 16px;
388
- font-size: 12px;
389
- color: var(--tide-booking-color-primary);
390
- font-weight: 700;
391
- }
392
-
393
- // Overflow-safe trigger label for multi-select
394
- &__trigger-text {
395
- overflow: hidden;
396
- text-overflow: ellipsis;
397
- white-space: nowrap;
398
- }
399
- }
400
-
401
- // ─── Rating (Number field, Rating display style) ──────────────────────────
402
-
403
- &__rating {
404
- display: inline-flex;
405
- gap: 4px;
406
- border-radius: 4px;
407
-
408
- &:focus-visible {
409
- outline: 2px solid var(--tide-booking-color-primary);
410
- outline-offset: 4px;
411
- }
412
-
413
- &--error {
414
- .tide-form__rating__star {
415
- color: var(--tide-booking-invalid-dark);
416
- }
417
- }
418
- }
419
-
420
- &__rating__star {
421
- padding: 0;
422
- background: none;
423
- border: none;
424
- cursor: pointer;
425
- line-height: 0;
426
- color: var(--tide-booking-gray-background-light);
427
- transition: color 0.15s ease, transform 0.1s ease;
428
-
429
- &:hover {
430
- transform: scale(1.1);
431
- }
432
-
433
- &--filled {
434
- color: var(--tide-booking-color-primary);
435
- }
436
- }
437
-
438
- // ─── Date picker ───────────────────────────────────────────────────────────
439
-
440
- &__date-picker {
441
- position: relative;
442
-
443
- &--error {
444
- .tide-form__date-picker__input {
445
- background: var(--tide-booking-invalid-light);
446
- color: var(--tide-booking-invalid-dark);
447
- }
448
- }
449
-
450
- &__input-row {
451
- position: relative;
452
- display: flex;
453
- }
454
-
455
- &__input {
456
- flex: 1;
457
- min-width: 0;
458
- padding-right: 42px;
459
- box-sizing: border-box;
460
-
461
- @include input;
462
- }
463
-
464
- &__toggle {
465
- position: absolute;
466
- right: 0;
467
- top: 0;
468
- height: 100%;
469
- width: 42px;
470
- display: flex;
471
- align-items: center;
472
- justify-content: center;
473
- background: none;
474
- border: none;
475
- cursor: pointer;
476
- color: var(--tide-booking-dropdown-arrow-color);
477
-
478
- .icon svg {
479
- fill: var(--tide-booking-dropdown-arrow-color);
480
- transition: fill 0.2s ease;
481
- }
482
-
483
- &:hover .icon svg {
484
- fill: var(--tide-booking-dropdown-arrow-color-hover);
485
- }
486
- }
487
-
488
- &__panel {
489
- position: absolute;
490
- z-index: 20;
491
- top: calc(100% + 4px);
492
- left: 0;
493
- background: var(--tide-booking-datepicker-container-background, #fff);
494
- border: var(--tide-booking-datepicker-container-border, 1.5px solid #f3f3f3);
495
- border-radius: var(--tide-booking-dropdown-border-radius);
496
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
497
- padding: 15px;
498
- min-width: 320px;
499
- box-sizing: border-box;
500
- }
501
- }
502
-
503
- // ─── Actions row ───────────────────────────────────────────────────────────
504
-
505
- &__actions {
506
- display: flex;
507
- justify-content: flex-end;
508
- align-items: center;
509
- gap: 15px;
510
- }
511
-
512
- // ─── Info text block (InfoText field type) ────────────────────────────────
513
-
514
- &__info-text {
515
- padding: 0px 0px 14px;
516
- border-radius: var(--tide-form-group-border-radius, 8px);
517
- font-size: var(--tide-booking-font-size-body);
518
- line-height: 1.5;
519
-
520
- p {
521
- margin: 0 0 8px;
522
- }
523
- p:last-child {
524
- margin-bottom: 0;
525
- }
526
- a {
527
- color: inherit;
528
- text-decoration: underline;
529
- }
530
-
531
- &--info {
532
- background: var(--tide-form-info-background, #e8f4fd);
533
- border-left: 4px solid var(--tide-form-info-border-color, #2196f3);
534
- color: var(--tide-form-info-color, #1565c0);
535
- }
536
-
537
- &--warning {
538
- background: var(--tide-form-warning-background, #fff8e1);
539
- border-left: 4px solid var(--tide-form-warning-border-color, #ff9800);
540
- color: var(--tide-form-warning-color, #e65100);
541
- }
542
-
543
- &--danger {
544
- background: var(--tide-form-danger-background, var(--tide-booking-invalid-light));
545
- border-left: 4px solid var(--tide-form-danger-border-color, var(--tide-booking-invalid));
546
- color: var(--tide-form-danger-color, var(--tide-booking-invalid-dark));
547
- }
548
- }
549
-
550
- // ─── API-level error and success ───────────────────────────────────────────
551
-
552
- &__error-message {
553
- margin: 0;
554
- color: var(--tide-booking-invalid-dark);
555
- font-size: 14px;
556
- }
557
-
558
- &__success {
559
- padding: var(--tide-form-success-padding, 30px 40px);
560
- background: var(--tide-form-success-background, var(--tide-booking-color-primary-extra-fade));
561
- border: 1px solid var(--tide-form-success-border-color, var(--tide-booking-color-primary-light));
562
- border-radius: var(--tide-form-group-border-radius, 24px);
563
- color: var(--tide-form-success-color, var(--tide-booking-color-primary-dark));
564
- font-size: var(--tide-booking-font-size-body);
565
- line-height: 1.6;
566
-
567
- p {
568
- margin: 0 0 10px;
569
- }
570
- p:last-child {
571
- margin-bottom: 0;
572
- }
573
- a {
574
- color: inherit;
575
- text-decoration: underline;
576
- }
577
- }
578
- }
1
+ .tide-form__layout {
2
+ display: flex;
3
+ gap: var(--tide-form-sidebar-gap, 2rem);
4
+ align-items: flex-start;
5
+
6
+ &--sidebar-right {
7
+ flex-direction: row;
8
+ }
9
+ &--sidebar-left {
10
+ flex-direction: row-reverse;
11
+ }
12
+
13
+ .tide-form__content {
14
+ flex: 1;
15
+ min-width: 0;
16
+ }
17
+ .tide-form__sidebar {
18
+ flex: 0 0 var(--tide-form-sidebar-width, 320px);
19
+ }
20
+ }
21
+
22
+ .tide-form {
23
+ display: flex;
24
+ flex-direction: column;
25
+ gap: 20px;
26
+ @include container-small();
27
+
28
+ &__groups {
29
+ display: flex;
30
+ flex-direction: column;
31
+ gap: var(--tide-form-groups-gap);
32
+ }
33
+
34
+ &__group {
35
+ display: flex;
36
+ flex-direction: column;
37
+ gap: 20px;
38
+ background-color: var(--tide-form-group-background);
39
+ border: var(--tide-form-group-border);
40
+ box-shadow: var(--tide-form-group-shadow);
41
+ border-radius: var(--tide-form-group-border-radius);
42
+ padding: var(--tide-form-group-padding);
43
+
44
+ @include media-sm {
45
+ padding: var(--tide-form-group-padding-sm);
46
+ }
47
+ }
48
+
49
+ &__group-title {
50
+ color: var(--tide-form-group-title-color);
51
+ margin: 0;
52
+ // font-size: var(--tide-form-group-title-font-size);
53
+ font-weight: 500;
54
+ }
55
+
56
+ &__fields {
57
+ display: flex;
58
+ flex-wrap: wrap;
59
+ column-gap: var(--tide-form-fields-gap, 20px);
60
+ row-gap: var(--tide-form-fields-row-gap, 25px);
61
+ }
62
+
63
+ // ─── Field wrapper ─────────────────────────────────────────────────────────
64
+
65
+ &__field {
66
+ position: relative;
67
+ display: flex;
68
+ flex-direction: column;
69
+ flex: 1 1 100%;
70
+ margin-bottom: 10px;
71
+
72
+ &--width-75 {
73
+ @include media-sm {
74
+ flex: 1 1 calc(75% - 20px);
75
+ }
76
+ }
77
+
78
+ &--width-66 {
79
+ @include media-sm {
80
+ flex: 1 1 calc(66.666% - 20px);
81
+ }
82
+ }
83
+
84
+ &--width-50 {
85
+ @include media-sm {
86
+ flex: 1 1 calc(50% - 10px);
87
+ }
88
+ }
89
+
90
+ &--width-33 {
91
+ @include media-sm {
92
+ flex: 1 1 calc(50% - 10px);
93
+ }
94
+
95
+ @include media-lg {
96
+ flex: 1 1 calc(33.333% - 14px);
97
+ }
98
+ }
99
+
100
+ &--width-25 {
101
+ @include media-sm {
102
+ flex: 1 1 calc(50% - 10px);
103
+ }
104
+
105
+ @include media-lg {
106
+ flex: 1 1 calc(25% - 15px);
107
+ }
108
+ }
109
+
110
+ // Error state — tint the input background when an error is visible
111
+ &:has(.tide-form__field-error) {
112
+ input,
113
+ textarea {
114
+ background: var(--tide-booking-invalid-light);
115
+
116
+ &::placeholder {
117
+ color: var(--tide-booking-invalid-dark);
118
+ }
119
+ }
120
+ }
121
+ }
122
+
123
+ // ─── Field internals ───────────────────────────────────────────────────────
124
+
125
+ &__field-label {
126
+ margin-bottom: 10px;
127
+ color: var(--tide-booking-input-label-color);
128
+ font-weight: var(--tide-booking-input-label-font-weight);
129
+ font-style: var(--tide-booking-input-label-font-style);
130
+
131
+ &--checkbox {
132
+ display: flex;
133
+ align-items: cente;
134
+ gap: 10px;
135
+ margin-bottom: 0;
136
+ cursor: pointer;
137
+ line-height: 1.5;
138
+ }
139
+ }
140
+
141
+ &__field-required {
142
+ margin-left: 2px;
143
+ color: var(--tide-form-field-required-color);
144
+ }
145
+
146
+ &__field-help {
147
+ position: relative;
148
+ display: inline-flex;
149
+ align-items: center;
150
+ margin-left: 6px;
151
+ vertical-align: middle;
152
+ }
153
+
154
+ &__field-help-trigger {
155
+ display: inline-flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ padding: 0;
159
+ background: none;
160
+ border: none;
161
+ cursor: pointer;
162
+ color: var(--tide-form-help-color, currentColor);
163
+ opacity: 0.6;
164
+ line-height: 1;
165
+
166
+ &:hover,
167
+ &:focus-visible {
168
+ opacity: 1;
169
+ outline: none;
170
+ }
171
+ }
172
+
173
+ &__field-help-tooltip {
174
+ position: absolute;
175
+ bottom: calc(100% + 6px);
176
+ left: 50%;
177
+ transform: translateX(-50%);
178
+ z-index: 10;
179
+ min-width: 180px;
180
+ max-width: 280px;
181
+ padding: 8px 10px;
182
+ background: var(--tide-form-help-tooltip-bg, #333);
183
+ color: var(--tide-form-help-tooltip-color, #fff);
184
+ font-size: 0.8em;
185
+ font-weight: normal;
186
+ border-radius: 4px;
187
+ pointer-events: none;
188
+ white-space: normal;
189
+ line-height: 1.4;
190
+
191
+ &::after {
192
+ content: '';
193
+ position: absolute;
194
+ top: 100%;
195
+ left: 50%;
196
+ transform: translateX(-50%);
197
+ border: 5px solid transparent;
198
+ border-top-color: var(--tide-form-help-tooltip-bg, #333);
199
+ }
200
+ }
201
+
202
+ &__field-input {
203
+ width: 100%;
204
+ box-sizing: border-box;
205
+
206
+ @include input;
207
+
208
+ &--multiline {
209
+ @include textarea;
210
+ }
211
+ }
212
+
213
+ &__field-checkbox {
214
+ flex-shrink: 0;
215
+ width: 18px;
216
+ height: 18px;
217
+ min-height: 18px;
218
+ margin: 0;
219
+ margin-top: 5px;
220
+ cursor: pointer;
221
+ accent-color: var(--tide-booking-color-primary);
222
+ }
223
+
224
+ &__field-error {
225
+ position: absolute;
226
+ bottom: -18px;
227
+ left: 0;
228
+ margin: 0;
229
+ font-size: var(--tide-form-field-error-font-size);
230
+ color: var(--tide-form-field-error-color);
231
+ transition: opacity 0.2s ease;
232
+ }
233
+
234
+ // ─── Radio / Checkbox options ──────────────────────────────────────────────
235
+
236
+ &__options {
237
+ display: flex;
238
+ flex-direction: column;
239
+ // gap: 8px;
240
+
241
+ &--multi {
242
+ gap: 8px;
243
+ }
244
+ }
245
+
246
+ &__option {
247
+ display: flex;
248
+ align-items: center;
249
+ gap: 8px;
250
+ cursor: pointer;
251
+ user-select: none;
252
+ }
253
+
254
+ &__option-input {
255
+ flex-shrink: 0;
256
+ width: 16px;
257
+ height: 16px;
258
+ margin: 0;
259
+ cursor: pointer;
260
+ accent-color: var(--tide-booking-color-primary);
261
+
262
+ &::placeholder {
263
+ color: #e65100;
264
+ }
265
+ }
266
+
267
+ &__option-label {
268
+ font-size: var(--tide-booking-font-size-body);
269
+ color: var(--tide-booking-black);
270
+ line-height: 1.4;
271
+
272
+ @include media-lg {
273
+ font-size: var(--tide-booking-font-size-body-lg);
274
+ }
275
+ }
276
+
277
+ // ─── Dropdown ──────────────────────────────────────────────────────────────
278
+
279
+ &__dropdown {
280
+ position: relative;
281
+
282
+ &--error {
283
+ .tide-form__dropdown__trigger {
284
+ background: var(--tide-booking-invalid-light);
285
+ color: var(--tide-booking-invalid-dark);
286
+ }
287
+ }
288
+
289
+ &__trigger {
290
+ width: 100%;
291
+ min-height: var(--tide-booking-input-height);
292
+ padding: 0 12px;
293
+ color: var(--tide-booking-dropdown-color);
294
+ background: var(--tide-booking-dropdown-background);
295
+ border: var(--tide-booking-dropdown-border);
296
+ border-radius: var(--tide-booking-dropdown-border-radius);
297
+ display: flex;
298
+ align-items: center;
299
+ justify-content: space-between;
300
+ gap: 8px;
301
+ cursor: pointer;
302
+ font-family: var(--tide-booking-font-body);
303
+ font-size: var(--tide-booking-font-size-body);
304
+ line-height: 1;
305
+ transition: border 0.2s ease, color 0.2s ease, background 0.2s ease;
306
+
307
+ @include media-lg {
308
+ font-size: var(--tide-booking-font-size-body-lg);
309
+ min-height: var(--tide-booking-input-height-lg);
310
+ }
311
+
312
+ &:hover {
313
+ border: var(--tide-booking-dropdown-border-hover);
314
+ color: var(--tide-booking-dropdown-color-hover);
315
+ background: var(--tide-booking-dropdown-background-hover);
316
+ }
317
+
318
+ &:focus {
319
+ outline: none;
320
+ border: var(--tide-booking-dropdown-border-focus);
321
+ color: var(--tide-booking-dropdown-color-focus);
322
+ background: var(--tide-booking-dropdown-background-focus);
323
+ }
324
+
325
+ .icon svg {
326
+ fill: var(--tide-booking-dropdown-arrow-color);
327
+ transition: fill 0.2s ease;
328
+ }
329
+
330
+ &:hover .icon svg {
331
+ fill: var(--tide-booking-dropdown-arrow-color-hover);
332
+ }
333
+ }
334
+
335
+ &__menu {
336
+ position: absolute;
337
+ z-index: 10;
338
+ top: calc(100% + 4px);
339
+ left: 0;
340
+ right: 0;
341
+ background: var(--tide-booking-white);
342
+ border: 1px solid var(--tide-booking-gray-background-light);
343
+ border-radius: 4px;
344
+ max-height: 220px;
345
+ overflow-y: auto;
346
+ padding: 0;
347
+ margin: 0;
348
+ list-style: none;
349
+ }
350
+
351
+ &__option {
352
+ width: 100%;
353
+ padding: 12px 15px;
354
+ background: none;
355
+ border: none;
356
+ text-align: left;
357
+ cursor: pointer;
358
+ font-family: var(--tide-booking-font-body);
359
+ font-size: var(--tide-booking-font-size-body);
360
+ line-height: 1.5;
361
+ color: var(--tide-booking-black);
362
+
363
+ @include media-lg {
364
+ font-size: var(--tide-booking-font-size-body-lg);
365
+ }
366
+
367
+ &:hover,
368
+ &--active {
369
+ background: var(--tide-booking-gray-light);
370
+ }
371
+
372
+ &:focus {
373
+ outline: none;
374
+ background: var(--tide-booking-gray--medium-light);
375
+ }
376
+
377
+ // Multi-select variant — aligns checkmark and label
378
+ &--checkbox {
379
+ display: flex;
380
+ align-items: center;
381
+ gap: 10px;
382
+ }
383
+ }
384
+
385
+ &__option-check {
386
+ flex-shrink: 0;
387
+ width: 16px;
388
+ font-size: 12px;
389
+ color: var(--tide-booking-color-primary);
390
+ font-weight: 700;
391
+ }
392
+
393
+ // Overflow-safe trigger label for multi-select
394
+ &__trigger-text {
395
+ overflow: hidden;
396
+ text-overflow: ellipsis;
397
+ white-space: nowrap;
398
+ }
399
+ }
400
+
401
+ // ─── Rating (Number field, Rating display style) ──────────────────────────
402
+
403
+ &__rating {
404
+ display: inline-flex;
405
+ gap: 4px;
406
+ border-radius: 4px;
407
+
408
+ &:focus-visible {
409
+ outline: 2px solid var(--tide-booking-color-primary);
410
+ outline-offset: 4px;
411
+ }
412
+
413
+ &--error {
414
+ .tide-form__rating__star {
415
+ color: var(--tide-booking-invalid-dark);
416
+ }
417
+ }
418
+ }
419
+
420
+ &__rating__star {
421
+ padding: 0;
422
+ background: none;
423
+ border: none;
424
+ cursor: pointer;
425
+ line-height: 0;
426
+ color: var(--tide-booking-gray-background-light);
427
+ transition: color 0.15s ease, transform 0.1s ease;
428
+
429
+ &:hover {
430
+ transform: scale(1.1);
431
+ }
432
+
433
+ &--filled {
434
+ color: var(--tide-booking-color-primary);
435
+ }
436
+ }
437
+
438
+ // ─── Date picker ───────────────────────────────────────────────────────────
439
+
440
+ &__date-picker {
441
+ position: relative;
442
+
443
+ &--error {
444
+ .tide-form__date-picker__input {
445
+ background: var(--tide-booking-invalid-light);
446
+ color: var(--tide-booking-invalid-dark);
447
+ }
448
+ }
449
+
450
+ &__input-row {
451
+ position: relative;
452
+ display: flex;
453
+ }
454
+
455
+ &__input {
456
+ flex: 1;
457
+ min-width: 0;
458
+ padding-right: 42px;
459
+ box-sizing: border-box;
460
+
461
+ @include input;
462
+ }
463
+
464
+ &__toggle {
465
+ position: absolute;
466
+ right: 0;
467
+ top: 0;
468
+ height: 100%;
469
+ width: 42px;
470
+ display: flex;
471
+ align-items: center;
472
+ justify-content: center;
473
+ background: none;
474
+ border: none;
475
+ cursor: pointer;
476
+ color: var(--tide-booking-dropdown-arrow-color);
477
+
478
+ .icon svg {
479
+ fill: var(--tide-booking-dropdown-arrow-color);
480
+ transition: fill 0.2s ease;
481
+ }
482
+
483
+ &:hover .icon svg {
484
+ fill: var(--tide-booking-dropdown-arrow-color-hover);
485
+ }
486
+ }
487
+
488
+ &__panel {
489
+ position: absolute;
490
+ z-index: 20;
491
+ top: calc(100% + 4px);
492
+ left: 0;
493
+ background: var(--tide-booking-datepicker-container-background, #fff);
494
+ border: var(--tide-booking-datepicker-container-border, 1.5px solid #f3f3f3);
495
+ border-radius: var(--tide-booking-dropdown-border-radius);
496
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
497
+ padding: 15px;
498
+ min-width: 320px;
499
+ box-sizing: border-box;
500
+ }
501
+ }
502
+
503
+ // ─── Actions row ───────────────────────────────────────────────────────────
504
+
505
+ &__actions {
506
+ display: flex;
507
+ justify-content: flex-end;
508
+ align-items: center;
509
+ gap: 15px;
510
+ }
511
+
512
+ // ─── Info text block (InfoText field type) ────────────────────────────────
513
+
514
+ &__info-text {
515
+ padding: 0px 0px 14px;
516
+ border-radius: var(--tide-form-group-border-radius, 8px);
517
+ font-size: var(--tide-booking-font-size-body);
518
+ line-height: 1.5;
519
+
520
+ p {
521
+ margin: 0 0 8px;
522
+ }
523
+ p:last-child {
524
+ margin-bottom: 0;
525
+ }
526
+ a {
527
+ color: inherit;
528
+ text-decoration: underline;
529
+ }
530
+
531
+ &--info {
532
+ background: var(--tide-form-info-background, #e8f4fd);
533
+ border-left: 4px solid var(--tide-form-info-border-color, #2196f3);
534
+ color: var(--tide-form-info-color, #1565c0);
535
+ }
536
+
537
+ &--warning {
538
+ background: var(--tide-form-warning-background, #fff8e1);
539
+ border-left: 4px solid var(--tide-form-warning-border-color, #ff9800);
540
+ color: var(--tide-form-warning-color, #e65100);
541
+ }
542
+
543
+ &--danger {
544
+ background: var(--tide-form-danger-background, var(--tide-booking-invalid-light));
545
+ border-left: 4px solid var(--tide-form-danger-border-color, var(--tide-booking-invalid));
546
+ color: var(--tide-form-danger-color, var(--tide-booking-invalid-dark));
547
+ }
548
+ }
549
+
550
+ // ─── API-level error and success ───────────────────────────────────────────
551
+
552
+ &__error-message {
553
+ margin: 0;
554
+ color: var(--tide-booking-invalid-dark);
555
+ font-size: 14px;
556
+ }
557
+
558
+ &__success {
559
+ padding: var(--tide-form-success-padding, 30px 40px);
560
+ background: var(--tide-form-success-background, var(--tide-booking-color-primary-extra-fade));
561
+ border: 1px solid var(--tide-form-success-border-color, var(--tide-booking-color-primary-light));
562
+ border-radius: var(--tide-form-group-border-radius, 24px);
563
+ color: var(--tide-form-success-color, var(--tide-booking-color-primary-dark));
564
+ font-size: var(--tide-booking-font-size-body);
565
+ line-height: 1.6;
566
+
567
+ p {
568
+ margin: 0 0 10px;
569
+ }
570
+ p:last-child {
571
+ margin-bottom: 0;
572
+ }
573
+ a {
574
+ color: inherit;
575
+ text-decoration: underline;
576
+ }
577
+ }
578
+ }