@qite/tide-booking-component 1.4.93 → 1.4.95

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 (181) hide show
  1. package/.prettierrc +9 -9
  2. package/.vs/ProjectSettings.json +3 -3
  3. package/.vs/VSWorkspaceState.json +5 -5
  4. package/build/build-cjs/index.js +81 -27
  5. package/build/build-cjs/src/booking-wizard/features/booking/booking-slice.d.ts +2 -1
  6. package/build/build-cjs/src/booking-wizard/features/booking/selectors.d.ts +4 -3
  7. package/build/build-cjs/src/booking-wizard/features/price-details/price-details-slice.d.ts +1 -0
  8. package/build/build-cjs/src/booking-wizard/features/price-details/selectors.d.ts +1 -0
  9. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar.d.ts +1 -0
  10. package/build/build-cjs/src/booking-wizard/types.d.ts +1 -0
  11. package/build/build-cjs/src/shared/utils/localization-util.d.ts +1 -0
  12. package/build/build-esm/index.js +81 -27
  13. package/build/build-esm/src/booking-wizard/features/booking/booking-slice.d.ts +2 -1
  14. package/build/build-esm/src/booking-wizard/features/booking/selectors.d.ts +4 -3
  15. package/build/build-esm/src/booking-wizard/features/price-details/price-details-slice.d.ts +1 -0
  16. package/build/build-esm/src/booking-wizard/features/price-details/selectors.d.ts +1 -0
  17. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar.d.ts +1 -0
  18. package/build/build-esm/src/booking-wizard/types.d.ts +1 -0
  19. package/build/build-esm/src/shared/utils/localization-util.d.ts +1 -0
  20. package/package.json +83 -83
  21. package/src/booking-product/components/age-select.tsx +35 -35
  22. package/src/booking-product/components/amount-input.tsx +51 -51
  23. package/src/booking-product/components/date-range-picker/calendar.tsx +155 -155
  24. package/src/booking-product/components/footer.tsx +54 -54
  25. package/src/booking-product/components/header.tsx +57 -57
  26. package/src/booking-product/components/icon.tsx +200 -200
  27. package/src/booking-product/components/list-view.tsx +54 -54
  28. package/src/booking-product/components/rating.tsx +21 -21
  29. package/src/booking-product/components/rooms.tsx +171 -171
  30. package/src/booking-product/constants.ts +1 -1
  31. package/src/booking-product/index.tsx +21 -21
  32. package/src/booking-product/settings-context.ts +16 -16
  33. package/src/booking-product/types.ts +30 -30
  34. package/src/booking-product/utils/api.ts +26 -26
  35. package/src/booking-product/utils/price.ts +28 -28
  36. package/src/booking-wizard/api-settings-slice.ts +24 -24
  37. package/src/booking-wizard/components/icon.tsx +398 -398
  38. package/src/booking-wizard/components/labeled-input.tsx +56 -56
  39. package/src/booking-wizard/components/labeled-select.tsx +54 -54
  40. package/src/booking-wizard/components/message.tsx +21 -21
  41. package/src/booking-wizard/components/multi-range-filter.tsx +99 -99
  42. package/src/booking-wizard/components/phone-input.tsx +146 -146
  43. package/src/booking-wizard/components/print-offer-button.tsx +53 -53
  44. package/src/booking-wizard/components/product-card.tsx +23 -23
  45. package/src/booking-wizard/declarations.d.ts +4 -4
  46. package/src/booking-wizard/features/booking/booking-self-contained.tsx +16 -1
  47. package/src/booking-wizard/features/booking/booking-slice.ts +9 -1
  48. package/src/booking-wizard/features/booking/booking.tsx +16 -1
  49. package/src/booking-wizard/features/booking/selectors.ts +5 -0
  50. package/src/booking-wizard/features/flight-options/flight-filter.tsx +371 -371
  51. package/src/booking-wizard/features/flight-options/flight-option-flight.tsx +354 -354
  52. package/src/booking-wizard/features/flight-options/flight-option-modal.tsx +211 -211
  53. package/src/booking-wizard/features/flight-options/flight-option.tsx +57 -57
  54. package/src/booking-wizard/features/flight-options/flight-utils.ts +423 -423
  55. package/src/booking-wizard/features/price-details/price-details-api.ts +20 -20
  56. package/src/booking-wizard/features/price-details/price-details-slice.ts +2 -0
  57. package/src/booking-wizard/features/price-details/selectors.ts +1 -0
  58. package/src/booking-wizard/features/price-details/util.ts +115 -115
  59. package/src/booking-wizard/features/product-options/no-options.tsx +18 -18
  60. package/src/booking-wizard/features/product-options/none-option.tsx +73 -73
  61. package/src/booking-wizard/features/product-options/option-booking-airline-group.tsx +53 -53
  62. package/src/booking-wizard/features/product-options/option-booking-group.tsx +152 -152
  63. package/src/booking-wizard/features/product-options/option-item.tsx +236 -236
  64. package/src/booking-wizard/features/product-options/option-pax-card.tsx +159 -159
  65. package/src/booking-wizard/features/product-options/option-pax-group.tsx +122 -122
  66. package/src/booking-wizard/features/product-options/option-room.tsx +226 -226
  67. package/src/booking-wizard/features/product-options/option-unit-group.tsx +138 -138
  68. package/src/booking-wizard/features/room-options/room-utils.ts +154 -154
  69. package/src/booking-wizard/features/room-options/room.tsx +123 -123
  70. package/src/booking-wizard/features/room-options/traveler-rooms.tsx +64 -64
  71. package/src/booking-wizard/features/sidebar/index.tsx +2 -0
  72. package/src/booking-wizard/features/sidebar/sidebar-flight.tsx +66 -66
  73. package/src/booking-wizard/features/sidebar/sidebar.tsx +17 -1
  74. package/src/booking-wizard/features/summary/summary-booking-option-pax.tsx +23 -23
  75. package/src/booking-wizard/features/summary/summary-booking-option-unit.tsx +23 -23
  76. package/src/booking-wizard/features/summary/summary-flight.tsx +36 -36
  77. package/src/booking-wizard/features/summary/summary-per-booking-option-group.tsx +60 -60
  78. package/src/booking-wizard/features/summary/summary-per-pax-option-group.tsx +56 -56
  79. package/src/booking-wizard/features/summary/summary-per-unit-option-group.tsx +58 -58
  80. package/src/booking-wizard/features/summary/summary-slice.ts +27 -27
  81. package/src/booking-wizard/features/travelers-form/travelers-form-slice.ts +157 -157
  82. package/src/booking-wizard/features/travelers-form/travelers-form-util.ts +10 -10
  83. package/src/booking-wizard/features/travelers-form/type-ahead-input.tsx +85 -85
  84. package/src/booking-wizard/features/travelers-form/validate-form.ts +178 -178
  85. package/src/booking-wizard/index.tsx +27 -27
  86. package/src/booking-wizard/store.ts +26 -26
  87. package/src/booking-wizard/types.ts +1 -0
  88. package/src/booking-wizard/use-offer-printer.ts +108 -108
  89. package/src/content/components/LanguageSwitcher.tsx +158 -158
  90. package/src/content/components/accordion.tsx +30 -30
  91. package/src/content/components/contact.tsx +211 -211
  92. package/src/content/components/personal-contact-form.tsx +809 -809
  93. package/src/content/header/index.tsx +43 -43
  94. package/src/content/header/types.ts +26 -26
  95. package/src/qsm/components/date-picker/index.tsx +152 -152
  96. package/src/qsm/components/date-range-picker/calendar-day.tsx +49 -49
  97. package/src/qsm/components/date-range-picker/calendar.tsx +211 -211
  98. package/src/qsm/components/date-range-picker/index.tsx +404 -404
  99. package/src/qsm/index.tsx +26 -26
  100. package/src/qsm/store/qsm-store.ts +13 -13
  101. package/src/search-results/components/flight/flight-card.tsx +38 -38
  102. package/src/search-results/components/flight/flight-leg.tsx +61 -61
  103. package/src/search-results/components/flight/flight-path.tsx +23 -23
  104. package/src/search-results/components/multi-range-filter.tsx +104 -104
  105. package/src/search-results/components/search-results-container/search-results-container.tsx +2 -2
  106. package/src/search-results/index.tsx +24 -24
  107. package/src/search-results/search-results-configuration-context.ts +6 -6
  108. package/src/search-results/store/search-results-store.ts +13 -13
  109. package/src/shared/components/loader.tsx +16 -16
  110. package/src/shared/translations/ar-SA.json +2 -1
  111. package/src/shared/translations/da-DK.json +2 -1
  112. package/src/shared/translations/de-DE.json +2 -1
  113. package/src/shared/translations/en-GB.json +2 -1
  114. package/src/shared/translations/es-ES.json +2 -1
  115. package/src/shared/translations/fr-BE.json +2 -1
  116. package/src/shared/translations/fr-FR.json +2 -1
  117. package/src/shared/translations/is-IS.json +2 -1
  118. package/src/shared/translations/it-IT.json +2 -1
  119. package/src/shared/translations/ja-JP.json +2 -1
  120. package/src/shared/translations/nl-BE.json +2 -1
  121. package/src/shared/translations/nl-NL.json +2 -1
  122. package/src/shared/translations/no-NO.json +2 -1
  123. package/src/shared/translations/pl-PL.json +2 -1
  124. package/src/shared/translations/pt-PT.json +2 -1
  125. package/src/shared/translations/sv-SE.json +2 -1
  126. package/src/shared/utils/class-util.ts +7 -7
  127. package/src/shared/utils/query-string-util.ts +91 -91
  128. package/src/shared/utils/tide-api-utils.ts +34 -34
  129. package/src/shared/utils/use-media-query-util.ts +19 -19
  130. package/styles/abstracts/_mixins.scss +74 -74
  131. package/styles/abstracts/_variables.scss +57 -57
  132. package/styles/base/_fonts.scss +2 -2
  133. package/styles/base/_normalize.scss +227 -227
  134. package/styles/base/_typography.scss +35 -35
  135. package/styles/booking-joker-variables.scss +596 -596
  136. package/styles/booking-product-variables.scss +330 -330
  137. package/styles/booking-product.scss +438 -438
  138. package/styles/booking-qsm-variables.scss +501 -501
  139. package/styles/booking-qsm.scss +52 -52
  140. package/styles/booking-wizard-variables.scss +603 -603
  141. package/styles/booking-wizard.scss +61 -61
  142. package/styles/components/_accordion.scss +67 -67
  143. package/styles/components/_animations.scss +39 -39
  144. package/styles/components/_base.scss +107 -107
  145. package/styles/components/_breadcrumb.scss +92 -92
  146. package/styles/components/_button.scss +238 -238
  147. package/styles/components/_checkbox.scss +230 -230
  148. package/styles/components/_contact.scss +239 -239
  149. package/styles/components/_cta.scss +238 -238
  150. package/styles/components/_date-list.scss +41 -41
  151. package/styles/components/_date-range-picker.scss +223 -223
  152. package/styles/components/_decrement-increment.scss +35 -35
  153. package/styles/components/_dropdown.scss +72 -72
  154. package/styles/components/_faq.scss +27 -27
  155. package/styles/components/_flight-option.scss +1419 -1419
  156. package/styles/components/_gallery.scss +314 -314
  157. package/styles/components/_header.scss +113 -113
  158. package/styles/components/_img-slider.scss +175 -175
  159. package/styles/components/_info-message.scss +75 -75
  160. package/styles/components/_input.scss +35 -35
  161. package/styles/components/_list.scss +185 -185
  162. package/styles/components/_loader.scss +70 -70
  163. package/styles/components/_mixins.scss +579 -579
  164. package/styles/components/_passenger-picker.scss +306 -306
  165. package/styles/components/_phone-input.scss +8 -8
  166. package/styles/components/_placeholders.scss +165 -165
  167. package/styles/components/_qsm.scss +17 -17
  168. package/styles/components/_radiobutton.scss +170 -170
  169. package/styles/components/_select-wrapper.scss +76 -76
  170. package/styles/components/_slider.scss +128 -128
  171. package/styles/components/_spinner.scss +29 -29
  172. package/styles/components/_step-indicators.scss +161 -161
  173. package/styles/components/_table.scss +81 -81
  174. package/styles/components/_typeahead.scss +275 -275
  175. package/styles/components/_variables.scss +89 -89
  176. package/styles/content-blocks-variables.scss +507 -507
  177. package/styles/font.scss +2 -2
  178. package/styles/qsm/_calendar.scss +274 -274
  179. package/styles/qsm/_qsm.scss +1094 -1094
  180. package/styles/search.scss +1200 -1200
  181. package/tsconfig.json +24 -24
@@ -1,314 +1,314 @@
1
- @use '../components/mixins' as mixins;
2
-
3
- .gallery {
4
- width: 100%;
5
-
6
- &__header {
7
- display: flex;
8
- align-items: baseline;
9
- justify-content: space-between;
10
- gap: 1rem;
11
- margin-bottom: 1rem;
12
- }
13
-
14
- &__title {
15
- font-size: 1.25rem;
16
- font-weight: 700;
17
- margin: 0;
18
- }
19
-
20
- &__count {
21
- font-size: 0.95rem;
22
- opacity: 0.75;
23
- }
24
-
25
- &__empty {
26
- opacity: 0.75;
27
- padding: 1rem 0;
28
- }
29
-
30
- &__layout {
31
- display: grid;
32
- gap: 0.9rem;
33
- }
34
-
35
- &__big {
36
- appearance: none;
37
- border: 0;
38
- padding: 0;
39
- cursor: pointer;
40
-
41
- border-radius: 16px;
42
- overflow: hidden;
43
- background: rgba(0, 0, 0, 0.04);
44
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
45
-
46
- &__img {
47
- width: 100%;
48
- height: auto;
49
- display: block;
50
- aspect-ratio: 16 / 9;
51
- object-fit: cover;
52
- }
53
- }
54
-
55
- &__thumbs {
56
- display: grid;
57
- gap: 0.9rem;
58
- grid-template-columns: repeat(5, minmax(0, 1fr));
59
- }
60
-
61
- &__thumb {
62
- appearance: none;
63
- border: 0;
64
- padding: 0;
65
- cursor: pointer;
66
-
67
- border-radius: 16px;
68
- overflow: hidden;
69
- position: relative;
70
- background: rgba(0, 0, 0, 0.04);
71
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
72
-
73
- &__img {
74
- width: 100%;
75
- height: 100%;
76
- display: block;
77
- aspect-ratio: 1 / 1;
78
- object-fit: cover;
79
- }
80
-
81
- &__overlay {
82
- position: absolute;
83
- inset: 0;
84
- display: grid;
85
- place-items: center;
86
-
87
- font-size: 2rem;
88
- font-weight: 700;
89
- color: #fff;
90
- background: rgba(0, 0, 0, 0.55);
91
- }
92
- }
93
-
94
- &__grid {
95
- display: grid;
96
- gap: 0.9rem;
97
- grid-template-columns: repeat(2, minmax(0, 1fr));
98
-
99
- @include mixins.media-sm {
100
- grid-template-columns: repeat(3, minmax(0, 1fr));
101
- }
102
-
103
- @include mixins.media-md {
104
- grid-template-columns: repeat(4, minmax(0, 1fr));
105
- }
106
- }
107
-
108
- &__card {
109
- appearance: none;
110
- border: 0;
111
- padding: 0;
112
- background: transparent;
113
- text-align: left;
114
- cursor: pointer;
115
-
116
- border-radius: 16px;
117
- overflow: hidden;
118
- position: relative;
119
-
120
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
121
- transform: translateZ(0);
122
- transition: transform 180ms ease, box-shadow 180ms ease;
123
-
124
- &:hover,
125
- &:focus-visible {
126
- transform: translateY(-2px);
127
- box-shadow: 0 10px 26px rgba(0, 0, 0, 0.12);
128
-
129
- .gallery__card__meta {
130
- opacity: 1;
131
- transform: translateY(0);
132
- }
133
- }
134
-
135
- &:focus-visible {
136
- outline: 3px solid rgba(70, 130, 255, 0.6);
137
- outline-offset: 3px;
138
- }
139
-
140
- &__media {
141
- aspect-ratio: 1 / 1;
142
- background: rgba(0, 0, 0, 0.04);
143
-
144
- .gallery__card__img {
145
- width: 100%;
146
- height: 100%;
147
- object-fit: cover;
148
- display: block;
149
- transform: scale(1);
150
- transition: transform 220ms ease;
151
- }
152
- }
153
-
154
- &:hover .gallery__card__img {
155
- transform: scale(1.03);
156
- }
157
-
158
- &__meta {
159
- position: absolute;
160
- left: 0;
161
- right: 0;
162
- bottom: 0;
163
-
164
- padding: 0.75rem 0.85rem;
165
- background: linear-gradient(to top, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
166
-
167
- opacity: 0;
168
- transform: translateY(8px);
169
- transition: opacity 180ms ease, transform 180ms ease;
170
- }
171
-
172
- &__caption {
173
- display: block;
174
- color: #fff;
175
- font-size: 0.9rem;
176
- line-height: 1.25;
177
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
178
- }
179
-
180
- &--featured {
181
- grid-column: span 2;
182
-
183
- @include mixins.media-sm {
184
- grid-column: span 2;
185
- grid-row: span 2;
186
-
187
- .gallery__card__media {
188
- aspect-ratio: 1 / 1;
189
- }
190
- }
191
-
192
- @include mixins.media-md {
193
- grid-column: span 2;
194
- }
195
- }
196
- }
197
-
198
- &__lightbox {
199
- position: fixed;
200
- inset: 0;
201
- background: rgba(10, 10, 12, 0.72);
202
- backdrop-filter: blur(6px);
203
-
204
- display: grid;
205
- place-items: center;
206
- padding: 1rem;
207
- z-index: 9999;
208
-
209
- &__panel {
210
- // width: min(1100px, 100%);
211
- border-radius: 18px;
212
- overflow: hidden;
213
- // background: #0f1115;
214
- color: #fff;
215
- box-shadow: 0 18px 60px rgba(0, 0, 0, 0.45);
216
- // position: relative;
217
- }
218
-
219
- &__media {
220
- background: #0b0d10;
221
- display: grid;
222
- place-items: center;
223
- max-height: min(72vh, 720px);
224
- }
225
-
226
- &__img {
227
- width: 100%;
228
- height: 100%;
229
- max-height: min(72vh, 720px);
230
- object-fit: contain;
231
- display: block;
232
- }
233
-
234
- &__footer {
235
- display: flex;
236
- align-items: center;
237
- justify-content: space-between;
238
- gap: 1rem;
239
- padding: 0.9rem 1rem;
240
- border-top: 1px solid rgba(255, 255, 255, 0.08);
241
- }
242
-
243
- &__info {
244
- display: grid;
245
- gap: 0.25rem;
246
- min-width: 0;
247
- }
248
-
249
- &__index {
250
- font-size: 0.85rem;
251
- opacity: 0.8;
252
- }
253
-
254
- &__caption {
255
- font-size: 0.95rem;
256
- opacity: 0.95;
257
- white-space: nowrap;
258
- overflow: hidden;
259
- text-overflow: ellipsis;
260
- max-width: min(70vw, 760px);
261
- }
262
-
263
- &__controls {
264
- display: flex;
265
- gap: 0.5rem;
266
- flex-shrink: 0;
267
- }
268
- }
269
-
270
- &__btn {
271
- border: 1px solid rgba(255, 255, 255, 0.22);
272
- background: rgba(255, 255, 255, 0.06);
273
- color: #fff;
274
- padding: 0.5rem 0.75rem;
275
- border-radius: 12px;
276
- cursor: pointer;
277
- transition: transform 160ms ease, background 160ms ease;
278
-
279
- &:hover {
280
- background: rgba(255, 255, 255, 0.12);
281
- transform: translateY(-1px);
282
- }
283
-
284
- &:active {
285
- transform: translateY(0);
286
- }
287
-
288
- &__icon {
289
- border: 0;
290
- background: rgba(255, 255, 255, 0.08);
291
- color: #fff;
292
- width: 40px;
293
- height: 40px;
294
- border-radius: 999px;
295
- cursor: pointer;
296
-
297
- display: grid;
298
- place-items: center;
299
-
300
- transition: background 160ms ease, transform 160ms ease;
301
-
302
- &:hover {
303
- background: rgba(255, 255, 255, 0.14);
304
- transform: translateY(-1px);
305
- }
306
-
307
- &--close {
308
- position: absolute;
309
- top: 15px;
310
- right: 15px;
311
- }
312
- }
313
- }
314
- }
1
+ @use '../components/mixins' as mixins;
2
+
3
+ .gallery {
4
+ width: 100%;
5
+
6
+ &__header {
7
+ display: flex;
8
+ align-items: baseline;
9
+ justify-content: space-between;
10
+ gap: 1rem;
11
+ margin-bottom: 1rem;
12
+ }
13
+
14
+ &__title {
15
+ font-size: 1.25rem;
16
+ font-weight: 700;
17
+ margin: 0;
18
+ }
19
+
20
+ &__count {
21
+ font-size: 0.95rem;
22
+ opacity: 0.75;
23
+ }
24
+
25
+ &__empty {
26
+ opacity: 0.75;
27
+ padding: 1rem 0;
28
+ }
29
+
30
+ &__layout {
31
+ display: grid;
32
+ gap: 0.9rem;
33
+ }
34
+
35
+ &__big {
36
+ appearance: none;
37
+ border: 0;
38
+ padding: 0;
39
+ cursor: pointer;
40
+
41
+ border-radius: 16px;
42
+ overflow: hidden;
43
+ background: rgba(0, 0, 0, 0.04);
44
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
45
+
46
+ &__img {
47
+ width: 100%;
48
+ height: auto;
49
+ display: block;
50
+ aspect-ratio: 16 / 9;
51
+ object-fit: cover;
52
+ }
53
+ }
54
+
55
+ &__thumbs {
56
+ display: grid;
57
+ gap: 0.9rem;
58
+ grid-template-columns: repeat(5, minmax(0, 1fr));
59
+ }
60
+
61
+ &__thumb {
62
+ appearance: none;
63
+ border: 0;
64
+ padding: 0;
65
+ cursor: pointer;
66
+
67
+ border-radius: 16px;
68
+ overflow: hidden;
69
+ position: relative;
70
+ background: rgba(0, 0, 0, 0.04);
71
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
72
+
73
+ &__img {
74
+ width: 100%;
75
+ height: 100%;
76
+ display: block;
77
+ aspect-ratio: 1 / 1;
78
+ object-fit: cover;
79
+ }
80
+
81
+ &__overlay {
82
+ position: absolute;
83
+ inset: 0;
84
+ display: grid;
85
+ place-items: center;
86
+
87
+ font-size: 2rem;
88
+ font-weight: 700;
89
+ color: #fff;
90
+ background: rgba(0, 0, 0, 0.55);
91
+ }
92
+ }
93
+
94
+ &__grid {
95
+ display: grid;
96
+ gap: 0.9rem;
97
+ grid-template-columns: repeat(2, minmax(0, 1fr));
98
+
99
+ @include mixins.media-sm {
100
+ grid-template-columns: repeat(3, minmax(0, 1fr));
101
+ }
102
+
103
+ @include mixins.media-md {
104
+ grid-template-columns: repeat(4, minmax(0, 1fr));
105
+ }
106
+ }
107
+
108
+ &__card {
109
+ appearance: none;
110
+ border: 0;
111
+ padding: 0;
112
+ background: transparent;
113
+ text-align: left;
114
+ cursor: pointer;
115
+
116
+ border-radius: 16px;
117
+ overflow: hidden;
118
+ position: relative;
119
+
120
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
121
+ transform: translateZ(0);
122
+ transition: transform 180ms ease, box-shadow 180ms ease;
123
+
124
+ &:hover,
125
+ &:focus-visible {
126
+ transform: translateY(-2px);
127
+ box-shadow: 0 10px 26px rgba(0, 0, 0, 0.12);
128
+
129
+ .gallery__card__meta {
130
+ opacity: 1;
131
+ transform: translateY(0);
132
+ }
133
+ }
134
+
135
+ &:focus-visible {
136
+ outline: 3px solid rgba(70, 130, 255, 0.6);
137
+ outline-offset: 3px;
138
+ }
139
+
140
+ &__media {
141
+ aspect-ratio: 1 / 1;
142
+ background: rgba(0, 0, 0, 0.04);
143
+
144
+ .gallery__card__img {
145
+ width: 100%;
146
+ height: 100%;
147
+ object-fit: cover;
148
+ display: block;
149
+ transform: scale(1);
150
+ transition: transform 220ms ease;
151
+ }
152
+ }
153
+
154
+ &:hover .gallery__card__img {
155
+ transform: scale(1.03);
156
+ }
157
+
158
+ &__meta {
159
+ position: absolute;
160
+ left: 0;
161
+ right: 0;
162
+ bottom: 0;
163
+
164
+ padding: 0.75rem 0.85rem;
165
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
166
+
167
+ opacity: 0;
168
+ transform: translateY(8px);
169
+ transition: opacity 180ms ease, transform 180ms ease;
170
+ }
171
+
172
+ &__caption {
173
+ display: block;
174
+ color: #fff;
175
+ font-size: 0.9rem;
176
+ line-height: 1.25;
177
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
178
+ }
179
+
180
+ &--featured {
181
+ grid-column: span 2;
182
+
183
+ @include mixins.media-sm {
184
+ grid-column: span 2;
185
+ grid-row: span 2;
186
+
187
+ .gallery__card__media {
188
+ aspect-ratio: 1 / 1;
189
+ }
190
+ }
191
+
192
+ @include mixins.media-md {
193
+ grid-column: span 2;
194
+ }
195
+ }
196
+ }
197
+
198
+ &__lightbox {
199
+ position: fixed;
200
+ inset: 0;
201
+ background: rgba(10, 10, 12, 0.72);
202
+ backdrop-filter: blur(6px);
203
+
204
+ display: grid;
205
+ place-items: center;
206
+ padding: 1rem;
207
+ z-index: 9999;
208
+
209
+ &__panel {
210
+ // width: min(1100px, 100%);
211
+ border-radius: 18px;
212
+ overflow: hidden;
213
+ // background: #0f1115;
214
+ color: #fff;
215
+ box-shadow: 0 18px 60px rgba(0, 0, 0, 0.45);
216
+ // position: relative;
217
+ }
218
+
219
+ &__media {
220
+ background: #0b0d10;
221
+ display: grid;
222
+ place-items: center;
223
+ max-height: min(72vh, 720px);
224
+ }
225
+
226
+ &__img {
227
+ width: 100%;
228
+ height: 100%;
229
+ max-height: min(72vh, 720px);
230
+ object-fit: contain;
231
+ display: block;
232
+ }
233
+
234
+ &__footer {
235
+ display: flex;
236
+ align-items: center;
237
+ justify-content: space-between;
238
+ gap: 1rem;
239
+ padding: 0.9rem 1rem;
240
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
241
+ }
242
+
243
+ &__info {
244
+ display: grid;
245
+ gap: 0.25rem;
246
+ min-width: 0;
247
+ }
248
+
249
+ &__index {
250
+ font-size: 0.85rem;
251
+ opacity: 0.8;
252
+ }
253
+
254
+ &__caption {
255
+ font-size: 0.95rem;
256
+ opacity: 0.95;
257
+ white-space: nowrap;
258
+ overflow: hidden;
259
+ text-overflow: ellipsis;
260
+ max-width: min(70vw, 760px);
261
+ }
262
+
263
+ &__controls {
264
+ display: flex;
265
+ gap: 0.5rem;
266
+ flex-shrink: 0;
267
+ }
268
+ }
269
+
270
+ &__btn {
271
+ border: 1px solid rgba(255, 255, 255, 0.22);
272
+ background: rgba(255, 255, 255, 0.06);
273
+ color: #fff;
274
+ padding: 0.5rem 0.75rem;
275
+ border-radius: 12px;
276
+ cursor: pointer;
277
+ transition: transform 160ms ease, background 160ms ease;
278
+
279
+ &:hover {
280
+ background: rgba(255, 255, 255, 0.12);
281
+ transform: translateY(-1px);
282
+ }
283
+
284
+ &:active {
285
+ transform: translateY(0);
286
+ }
287
+
288
+ &__icon {
289
+ border: 0;
290
+ background: rgba(255, 255, 255, 0.08);
291
+ color: #fff;
292
+ width: 40px;
293
+ height: 40px;
294
+ border-radius: 999px;
295
+ cursor: pointer;
296
+
297
+ display: grid;
298
+ place-items: center;
299
+
300
+ transition: background 160ms ease, transform 160ms ease;
301
+
302
+ &:hover {
303
+ background: rgba(255, 255, 255, 0.14);
304
+ transform: translateY(-1px);
305
+ }
306
+
307
+ &--close {
308
+ position: absolute;
309
+ top: 15px;
310
+ right: 15px;
311
+ }
312
+ }
313
+ }
314
+ }