@isavia-sut/dd-cdn-npm 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/CSS/base-style.css +2664 -0
  2. package/LICENSE +43 -0
  3. package/README.md +82 -0
  4. package/Resources/Flags/Denmark.svg +14 -0
  5. package/Resources/Flags/Germany.svg +12 -0
  6. package/Resources/Flags/Greece.svg +15 -0
  7. package/Resources/Flags/Iceland.svg +15 -0
  8. package/Resources/Flags/Ireland.svg +12 -0
  9. package/Resources/Flags/Italy.svg +12 -0
  10. package/Resources/Flags/Netherlands.svg +12 -0
  11. package/Resources/Flags/Poland.svg +11 -0
  12. package/Resources/Flags/Portugal.svg +14 -0
  13. package/Resources/Flags/Spain.svg +12 -0
  14. package/Resources/Flags/United Kingdom.svg +23 -0
  15. package/Resources/Flags/United States.svg +15 -0
  16. package/Resources/Fonts/KefFont.woff2 +0 -0
  17. package/Resources/Icons/icon-svg-arrivals-alt.svg +4 -0
  18. package/Resources/Icons/icon-svg-arrivals-bold.svg +4 -0
  19. package/Resources/Icons/icon-svg-arrivals-large.svg +4 -0
  20. package/Resources/Icons/icon-svg-arrivals.svg +4 -0
  21. package/Resources/Icons/icon-svg-at-the-airport.svg +4 -0
  22. package/Resources/Icons/icon-svg-atm.svg +4 -0
  23. package/Resources/Icons/icon-svg-autopay-app.svg +4 -0
  24. package/Resources/Icons/icon-svg-autopay.svg +4 -0
  25. package/Resources/Icons/icon-svg-brightness.svg +4 -0
  26. package/Resources/Icons/icon-svg-bus.svg +4 -0
  27. package/Resources/Icons/icon-svg-calendar.svg +4 -0
  28. package/Resources/Icons/icon-svg-camera.svg +4 -0
  29. package/Resources/Icons/icon-svg-car-rates.svg +4 -0
  30. package/Resources/Icons/icon-svg-car.svg +4 -0
  31. package/Resources/Icons/icon-svg-chat.svg +4 -0
  32. package/Resources/Icons/icon-svg-check-filled.svg +4 -0
  33. package/Resources/Icons/icon-svg-check-in.svg +4 -0
  34. package/Resources/Icons/icon-svg-check.svg +4 -0
  35. package/Resources/Icons/icon-svg-checklist.svg +4 -0
  36. package/Resources/Icons/icon-svg-children.svg +4 -0
  37. package/Resources/Icons/icon-svg-clock.svg +4 -0
  38. package/Resources/Icons/icon-svg-close.svg +4 -0
  39. package/Resources/Icons/icon-svg-cloud.svg +4 -0
  40. package/Resources/Icons/icon-svg-contact.svg +4 -0
  41. package/Resources/Icons/icon-svg-cookie.svg +4 -0
  42. package/Resources/Icons/icon-svg-copy.svg +4 -0
  43. package/Resources/Icons/icon-svg-cross.svg +4 -0
  44. package/Resources/Icons/icon-svg-departures-alt.svg +4 -0
  45. package/Resources/Icons/icon-svg-departures-large.svg +4 -0
  46. package/Resources/Icons/icon-svg-departures.svg +4 -0
  47. package/Resources/Icons/icon-svg-devices.svg +4 -0
  48. package/Resources/Icons/icon-svg-download-small.svg +4 -0
  49. package/Resources/Icons/icon-svg-download.svg +4 -0
  50. package/Resources/Icons/icon-svg-drop-off.svg +4 -0
  51. package/Resources/Icons/icon-svg-facebook.svg +4 -0
  52. package/Resources/Icons/icon-svg-flight-domestic.svg +4 -0
  53. package/Resources/Icons/icon-svg-flight-globe.svg +4 -0
  54. package/Resources/Icons/icon-svg-flight-tracker.svg +4 -0
  55. package/Resources/Icons/icon-svg-flight.svg +4 -0
  56. package/Resources/Icons/icon-svg-flights.svg +4 -0
  57. package/Resources/Icons/icon-svg-globe.svg +4 -0
  58. package/Resources/Icons/icon-svg-info-filled.svg +4 -0
  59. package/Resources/Icons/icon-svg-info.svg +4 -0
  60. package/Resources/Icons/icon-svg-instagram.svg +4 -0
  61. package/Resources/Icons/icon-svg-link.svg +4 -0
  62. package/Resources/Icons/icon-svg-lost-and-found.svg +4 -0
  63. package/Resources/Icons/icon-svg-lounge.svg +4 -0
  64. package/Resources/Icons/icon-svg-luggage-and-security.svg +4 -0
  65. package/Resources/Icons/icon-svg-mail-filled.svg +4 -0
  66. package/Resources/Icons/icon-svg-mail.svg +4 -0
  67. package/Resources/Icons/icon-svg-map-pin.svg +4 -0
  68. package/Resources/Icons/icon-svg-map.svg +4 -0
  69. package/Resources/Icons/icon-svg-meet-and-greet.svg +4 -0
  70. package/Resources/Icons/icon-svg-parking.svg +4 -0
  71. package/Resources/Icons/icon-svg-pen.svg +4 -0
  72. package/Resources/Icons/icon-svg-phone-car.svg +4 -0
  73. package/Resources/Icons/icon-svg-phone-message.svg +4 -0
  74. package/Resources/Icons/icon-svg-phone-pay.svg +4 -0
  75. package/Resources/Icons/icon-svg-phone.svg +4 -0
  76. package/Resources/Icons/icon-svg-plus.svg +4 -0
  77. package/Resources/Icons/icon-svg-rain.svg +4 -0
  78. package/Resources/Icons/icon-svg-reset.svg +4 -0
  79. package/Resources/Icons/icon-svg-runway.svg +4 -0
  80. package/Resources/Icons/icon-svg-search.svg +4 -0
  81. package/Resources/Icons/icon-svg-secure.svg +4 -0
  82. package/Resources/Icons/icon-svg-security.svg +4 -0
  83. package/Resources/Icons/icon-svg-services.svg +4 -0
  84. package/Resources/Icons/icon-svg-shop-and-eat.svg +4 -0
  85. package/Resources/Icons/icon-svg-sms.svg +4 -0
  86. package/Resources/Icons/icon-svg-snow.svg +4 -0
  87. package/Resources/Icons/icon-svg-special-assistance.svg +4 -0
  88. package/Resources/Icons/icon-svg-sun.svg +4 -0
  89. package/Resources/Icons/icon-svg-taxi-queue.svg +4 -0
  90. package/Resources/Icons/icon-svg-tiktok.svg +4 -0
  91. package/Resources/Icons/icon-svg-time-filled.svg +4 -0
  92. package/Resources/Icons/icon-svg-time.svg +4 -0
  93. package/Resources/Icons/icon-svg-transfer.svg +4 -0
  94. package/Resources/Icons/icon-svg-trash.svg +4 -0
  95. package/Resources/Icons/icon-svg-vimeo.svg +4 -0
  96. package/Resources/Icons/icon-svg-walk-filled.svg +4 -0
  97. package/Resources/Icons/icon-svg-walk.svg +4 -0
  98. package/Resources/Icons/icon-svg-warning-filled.svg +4 -0
  99. package/Resources/Icons/icon-svg-warning.svg +4 -0
  100. package/Resources/Icons/icon-svg-wifi.svg +4 -0
  101. package/Resources/Icons/icon-svg-x.svg +4 -0
  102. package/Resources/Icons/icon-svg-youtube.svg +4 -0
  103. package/Resources/Icons/kef-icons-sprite.svg +260 -0
  104. package/Resources/KEF_logos/KEFENsvart.svg +29 -0
  105. package/Resources/KEF_logos/KEFISsvart.svg +36 -0
  106. package/Resources/KEF_logos/KEFsvart.svg +13 -0
  107. package/Resources/KEF_logos/README.md +55 -0
  108. package/Tokens/tokens.json +156 -0
  109. package/package.json +39 -0
@@ -0,0 +1,2664 @@
1
+ /* =============================================================================
2
+ KEF BRAND STYLE SYSTEM
3
+ Design Tokens · Typography · Grid · Components
4
+ =============================================================================
5
+
6
+ TABLE OF CONTENTS
7
+ ─────────────────────────────────────────────────────────────────────────────
8
+ 1. DESIGN TOKENS
9
+ 1a. Color Primitives
10
+ 1b. Brand Color Aliases
11
+ 1c. Semantic Tokens — Background
12
+ 1d. Semantic Tokens — Foreground
13
+ 1e. Semantic Tokens — Border
14
+ 1f. Semantic Tokens — Form
15
+ 1g. Semantic Tokens — Overlay
16
+ 1h. Spacing & Size
17
+ 1i. Border Radius
18
+ 1j. Transition & Motion
19
+ 1k. Shadows
20
+ 1l. Typography
21
+ 1m. Grid
22
+ 1n. Z-Index
23
+
24
+ 2. TYPOGRAPHY UTILITIES
25
+
26
+ 3. SHADOW UTILITIES
27
+
28
+ 4. GRID & LAYOUT
29
+
30
+ 5. BUTTONS
31
+ Base · Primary · Hero · Utility · Link
32
+ Icon · Nav · Play · Square · History · Chat · Share
33
+
34
+ 6. FORMS
35
+ Form Group · Input · Textarea · Select
36
+ Checkbox · Radio · Search · Switch · File Upload
37
+ Date Select · Date Picker
38
+ Flight Lookup · Newsletter · reCAPTCHA
39
+
40
+ 7. FEEDBACK
41
+ Alert (+ Small, Banner variants)
42
+ Progress Bar · Status Label · Badge
43
+
44
+ 8. MODAL
45
+
46
+ 9. CARDS
47
+ Standard · Compact · Overlay
48
+ Merchant Card · Flight Card · Micro Card
49
+
50
+ 10. TAGS
51
+
52
+ 11. NAVIGATION
53
+ Nav Menu · Secondary Nav · Language Selector
54
+ Breadcrumbs · Tabs · Filter · Accordion
55
+
56
+ 12. TABLE
57
+
58
+ 13. SECTION HEADING
59
+
60
+ 14. SITE HEADER
61
+
62
+ 15. SITE FOOTER
63
+ ─────────────────────────────────────────────────────────────────────────────
64
+ */
65
+
66
+
67
+ /* =============================================================================
68
+ FONT
69
+ ============================================================================= */
70
+
71
+ @font-face {
72
+ font-family: 'KEF Oasis';
73
+ src: url('../Resources/Fonts/KefFont.woff2') format('woff2');
74
+ font-weight: 300 700;
75
+ font-style: normal;
76
+ font-display: swap;
77
+ }
78
+
79
+
80
+ /* =============================================================================
81
+ 1. DESIGN TOKENS
82
+ ============================================================================= */
83
+
84
+ :root {
85
+
86
+ /* ── 1a. Color Primitives ── */
87
+
88
+ /* Leifur Black */
89
+ --color-leifur-black-900: #101010;
90
+ --color-leifur-black-800: #232323;
91
+ --color-leifur-black-700: #353535;
92
+ --color-leifur-black-600: #484848;
93
+ --color-leifur-black-500: #404040;
94
+ --color-leifur-black-400: #5f5f5f;
95
+ --color-leifur-black-300: #919191;
96
+ --color-leifur-black-200: #b5b5b5;
97
+ --color-leifur-black-100: #e7e7e7;
98
+
99
+ /* Hrímfaxi White */
100
+ --color-hrimfaxi-white-900: #ffffff;
101
+ --color-hrimfaxi-white-800: #f5f5f5;
102
+ --color-hrimfaxi-white-700: #ebebeb;
103
+ --color-hrimfaxi-white-600: #e0e0e0;
104
+ --color-hrimfaxi-white-500: #d6d6d6;
105
+ --color-hrimfaxi-white-400: #cccccc;
106
+ --color-hrimfaxi-white-300: #c2c2c2;
107
+ --color-hrimfaxi-white-200: #b8b8b8;
108
+ --color-hrimfaxi-white-100: #adadad;
109
+
110
+ /* Geysir Blue */
111
+ --color-geysir-blue-900: #0037ad;
112
+ --color-geysir-blue-800: #002e94;
113
+ --color-geysir-blue-700: #003ea0;
114
+ --color-geysir-blue-600: #0044c6;
115
+ --color-geysir-blue-500: #004df4;
116
+ --color-geysir-blue-400: #4d80f6;
117
+ --color-geysir-blue-300: #85aafc;
118
+ --color-geysir-blue-200: #b3cafd;
119
+ --color-geysir-blue-100: #e6edfe;
120
+
121
+ /* Gullfaxi Gold */
122
+ --color-gullfaxi-gold-900: #5c4220;
123
+ --color-gullfaxi-gold-800: #6b4e27;
124
+ --color-gullfaxi-gold-700: #85632d;
125
+ --color-gullfaxi-gold-600: #a0752f;
126
+ --color-gullfaxi-gold-500: #bb8b3f;
127
+ --color-gullfaxi-gold-400: #d4a65a;
128
+ --color-gullfaxi-gold-300: #e8c98e;
129
+ --color-gullfaxi-gold-200: #f2ddb4;
130
+ --color-gullfaxi-gold-100: #faf2e2;
131
+
132
+ /* Gljáfaxi Green */
133
+ --color-gljafaxi-green-900: #075e1a;
134
+ --color-gljafaxi-green-800: #0a7c22;
135
+ --color-gljafaxi-green-700: #0d9935;
136
+ --color-gljafaxi-green-600: #3aad49;
137
+ --color-gljafaxi-green-500: #68c070;
138
+ --color-gljafaxi-green-400: #96d49a;
139
+ --color-gljafaxi-green-300: #bde4bf;
140
+ --color-gljafaxi-green-200: #d9f0da;
141
+ --color-gljafaxi-green-100: #f0faf0;
142
+
143
+ /* Hekla Red */
144
+ --color-hekla-red-900: #7a0f05;
145
+ --color-hekla-red-800: #9c1508;
146
+ --color-hekla-red-700: #b81c0c;
147
+ --color-hekla-red-600: #c9220f;
148
+ --color-hekla-red-500: #db2a12;
149
+ --color-hekla-red-400: #e55238;
150
+ --color-hekla-red-300: #ef8070;
151
+ --color-hekla-red-200: #fbeae7;
152
+ --color-hekla-red-100: #fdf4f3;
153
+
154
+ /* ── 1b. Brand Color Aliases ── */
155
+
156
+ --color-leifur-black: var(--color-leifur-black-900);
157
+ --color-hrimfaxi-white: var(--color-hrimfaxi-white-900);
158
+ --color-geysir-blue: var(--color-geysir-blue-500);
159
+ --color-gullfaxi-gold: var(--color-gullfaxi-gold-500);
160
+ --color-gljafaxi-green: var(--color-gljafaxi-green-500);
161
+ --color-hekla-red: var(--color-hekla-red-500);
162
+ --color-amber: #db8112;
163
+
164
+ --color-primary: var(--color-geysir-blue);
165
+ --color-primary-active: var(--color-geysir-blue-900);
166
+ --color-secondary: var(--color-leifur-black-900);
167
+
168
+ /* ── 1c. Semantic Tokens — Background ── */
169
+
170
+ --bg: var(--color-hrimfaxi-white-900); /* page / app background */
171
+ --bg-surface: var(--color-hrimfaxi-white-900); /* card / panel surface */
172
+ --bg-surface-brand: var(--color-geysir-blue-500); /* branded surface */
173
+
174
+ --bg-fill: var(--color-hrimfaxi-white-900);
175
+ --bg-fill-inverse: var(--color-leifur-black-900);
176
+ --bg-fill-brand: var(--color-geysir-blue-500);
177
+ --bg-fill-brand-minimal: var(--color-geysir-blue-100);
178
+ --bg-fill-brand-contrast: var(--color-geysir-blue-900);
179
+ --bg-fill-emphasis: var(--color-gullfaxi-gold-500);
180
+ --bg-fill-emphasis-contrast: var(--color-gullfaxi-gold-700);
181
+ --bg-fill-warning: var(--color-amber);
182
+ --bg-fill-urgent: var(--color-hekla-red);
183
+ --bg-fill-urgent-minimal: var(--color-hekla-red-200);
184
+ --bg-fill-success: var(--color-gljafaxi-green);
185
+ --bg-fill-neutral: var(--color-leifur-black-100);
186
+ --bg-fill-light: var(--color-hrimfaxi-white-800);
187
+
188
+ /* ── 1d. Semantic Tokens — Foreground ── */
189
+
190
+ --fg: var(--color-leifur-black-900); /* primary text */
191
+ --fg-secondary: var(--color-leifur-black-500); /* secondary text */
192
+ --fg-tertiary: var(--color-leifur-black-400); /* placeholder / hint */
193
+ --fg-invert: var(--color-hrimfaxi-white-900); /* text on dark backgrounds */
194
+ --fg-brand: var(--color-geysir-blue-500); /* brand-coloured text */
195
+ --fg-urgent: var(--color-hekla-red); /* error / urgent text */
196
+ --fg-neutral: var(--color-leifur-black-300); /* muted text */
197
+
198
+ /* ── 1e. Semantic Tokens — Border ── */
199
+
200
+ --border: var(--color-leifur-black-100);
201
+ --border-brand: var(--color-geysir-blue-500);
202
+ --border-brand-contrast: var(--color-geysir-blue-900);
203
+ --border-contrast: var(--color-leifur-black-900);
204
+ --border-inverse: var(--color-hrimfaxi-white-900);
205
+
206
+ /* ── 1f. Semantic Tokens — Form ── */
207
+
208
+ --form-bg-surface: var(--color-hrimfaxi-white-800);
209
+ --form-bg-surface-active: var(--color-hrimfaxi-white-900);
210
+ --form-border: var(--color-leifur-black-100);
211
+ --form-border-active: var(--color-leifur-black-200);
212
+ --form-border-error: var(--color-hekla-red);
213
+
214
+ /* ── 1g. Semantic Tokens — Overlay ── */
215
+
216
+ --overlay: rgba(0, 0, 0, 0.25);
217
+
218
+ /* ── 1h. Spacing & Size ── */
219
+
220
+ --space-050: 4px;
221
+ --space-100: 8px;
222
+ --space-150: 12px;
223
+ --space-200: 16px;
224
+ --space-250: 20px;
225
+ --space-300: 24px;
226
+ --space-400: 32px;
227
+ --space-500: 40px;
228
+ --space-600: 48px;
229
+ --space-700: 56px;
230
+ --space-800: 64px;
231
+ --space-900: 72px;
232
+ --space-1000: 80px;
233
+
234
+ --size-100: 8px;
235
+ --size-200: 16px;
236
+ --size-300: 24px;
237
+ --size-400: 32px;
238
+ --size-500: 40px;
239
+ --size-600: 48px;
240
+ --size-700: 56px;
241
+ --size-800: 64px;
242
+ --size-tag: 26px;
243
+ --size-badge: 18px;
244
+
245
+ /* ── 1i. Border Radius ── */
246
+
247
+ --radius-025: 2px;
248
+ --radius-050: 4px;
249
+ --radius-100: 8px;
250
+ --radius-150: 12px;
251
+ --radius-200: 16px;
252
+ --radius-full: 360px;
253
+
254
+ /* ── 1j. Transition & Motion ── */
255
+
256
+ --duration-fast: 0.15s;
257
+ --duration-normal: 0.2s;
258
+ --duration-slow: 0.3s;
259
+ --ease: ease;
260
+ --ease-in: ease-in;
261
+ --ease-out: ease-out;
262
+ --ease-in-out: ease-in-out;
263
+
264
+ /* ── 1k. Shadows ── */
265
+
266
+ --shadow-large: 0px 26px 40px 0px rgba(0, 0, 0, 0.12);
267
+ --shadow-medium: 0px 2px 10px 0px rgba(0, 0, 0, 0.10),
268
+ 0px 12px 40px 0px rgba(0, 0, 0, 0.08);
269
+ --shadow-sm: 0 1px 4px rgba(0, 0, 0, 0.08);
270
+ --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.10);
271
+ --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.12);
272
+ --shadow-xl: 0 16px 56px rgba(0, 0, 0, 0.14);
273
+
274
+ /* ── 1l. Typography ── */
275
+
276
+ --font-family-main: 'KEF Oasis', Arial, sans-serif;
277
+
278
+ --font-header-1-size: 96px;
279
+ --font-header-1-weight: 700;
280
+ --font-header-1-lineheight: 100px;
281
+
282
+ --font-header-2-size: 76px;
283
+ --font-header-2-weight: 700;
284
+ --font-header-2-lineheight: 78px;
285
+
286
+ --font-header-3-size: 58px;
287
+ --font-header-3-weight: 700;
288
+ --font-header-3-lineheight: 61px;
289
+
290
+ --font-header-4-size: 44px;
291
+ --font-header-4-weight: 700;
292
+ --font-header-4-lineheight: 50px;
293
+
294
+ --font-header-5-size: 32px;
295
+ --font-header-5-weight: 700;
296
+ --font-header-5-lineheight: 34px;
297
+
298
+ --font-header-6-size: 20px;
299
+ --font-header-6-weight: 700;
300
+ --font-header-6-lineheight: 24px;
301
+
302
+ --font-intro-size: 32px;
303
+ --font-intro-weight: 300;
304
+ --font-intro-lineheight: 40px;
305
+
306
+ --font-callout-bold-size: 24px;
307
+ --font-callout-bold-weight: 700;
308
+ --font-callout-bold-lineheight: 32px;
309
+
310
+ --font-callout-regular-size: 24px;
311
+ --font-callout-regular-weight: 300;
312
+ --font-callout-regular-lineheight: 32px;
313
+
314
+ --font-body-large-size: 18px;
315
+ --font-body-large-weight: 400;
316
+ --font-body-large-lineheight: 24px;
317
+ --font-body-large-bold-weight: 700;
318
+ --font-body-large-light-weight: 300;
319
+
320
+ --font-body-normal-size: 16px;
321
+ --font-body-normal-weight: 400;
322
+ --font-body-normal-lineheight: 22px;
323
+
324
+ --font-body-small-size: 14px;
325
+ --font-body-small-weight: 400;
326
+ --font-body-small-lineheight: 18px;
327
+
328
+ --font-body-tiny-size: 11px;
329
+ --font-body-tiny-weight: 400;
330
+ --font-body-tiny-lineheight: 15px;
331
+ --font-badge-size: 10px;
332
+
333
+ /* ── 1m. Grid ── */
334
+
335
+ --grid-columns: 12;
336
+ --grid-gutter: 32px;
337
+ --grid-margin: 32px;
338
+ --grid-max-width: 1512px;
339
+
340
+ /* ── 1n. Z-Index ── */
341
+
342
+ --z-base: 0; /* normal document flow */
343
+ --z-raised: 100; /* sticky tabs, slightly raised elements */
344
+ --z-dropdown: 200; /* nav dropdowns */
345
+ --z-popup: 300; /* date pickers, language selectors */
346
+ --z-floating: 400; /* floating action buttons */
347
+ --z-header: 500; /* sticky site header */
348
+ --z-modal: 1000; /* modal overlays */
349
+ }
350
+
351
+
352
+ /* =============================================================================
353
+ DARK THEME TOKENS
354
+ The same overrides apply when the page is in dark mode (html[data-theme])
355
+ or when an element is explicitly placed inside a `.ds-context--dark` scope
356
+ (used by the style-guide token table to render dark swatches in light mode).
357
+ ============================================================================= */
358
+
359
+ html[data-theme="dark"],
360
+ .ds-context--dark {
361
+ color-scheme: dark;
362
+
363
+ /* Comfortable dark surfaces inspired by editor UI, avoiding near-black. */
364
+ --bg: var(--color-leifur-black-800);
365
+ --bg-surface: var(--color-leifur-black-700);
366
+ --bg-surface-brand: var(--color-geysir-blue-800);
367
+
368
+ --bg-fill: var(--color-leifur-black-700);
369
+ --bg-fill-inverse: var(--color-hrimfaxi-white-800);
370
+ --bg-fill-brand: var(--color-geysir-blue-500);
371
+ --bg-fill-brand-minimal: var(--color-geysir-blue-900);
372
+ --bg-fill-brand-contrast: var(--color-geysir-blue-300);
373
+ --bg-fill-emphasis: var(--color-gullfaxi-gold-500);
374
+ --bg-fill-emphasis-contrast: var(--color-gullfaxi-gold-300);
375
+ --bg-fill-warning: var(--color-amber);
376
+ --bg-fill-urgent: var(--color-hekla-red-500);
377
+ --bg-fill-urgent-minimal: var(--color-hekla-red-900);
378
+ --bg-fill-success: var(--color-gljafaxi-green-500);
379
+ --bg-fill-neutral: var(--color-leifur-black-600);
380
+ --bg-fill-light: var(--color-leifur-black-600);
381
+
382
+ --fg: var(--color-hrimfaxi-white-800);
383
+ --fg-secondary: var(--color-hrimfaxi-white-500);
384
+ --fg-tertiary: var(--color-hrimfaxi-white-300);
385
+ --fg-invert: var(--color-leifur-black-900);
386
+ --fg-brand: var(--color-hrimfaxi-white-900);
387
+ --fg-urgent: var(--color-hekla-red-500);
388
+ --fg-neutral: var(--color-hrimfaxi-white-200);
389
+
390
+ --border: var(--color-leifur-black-500);
391
+ --border-brand: var(--color-geysir-blue-400);
392
+ --border-brand-contrast: var(--color-geysir-blue-300);
393
+ --border-contrast: var(--color-hrimfaxi-white-100);
394
+ --border-inverse: var(--color-hrimfaxi-white-900);
395
+
396
+ --form-bg-surface: var(--color-leifur-black-700);
397
+ --form-bg-surface-active: var(--color-leifur-black-600);
398
+ --form-border: var(--color-leifur-black-500);
399
+ --form-border-active: var(--color-leifur-black-400);
400
+ --form-border-error: var(--color-hekla-red-400);
401
+
402
+ --overlay: rgba(0, 0, 0, 0.45);
403
+ }
404
+
405
+
406
+ /* =============================================================================
407
+ LIGHT CONTEXT SCOPE
408
+ Mirror of the :root light tokens, applied via class. Lets the style-guide
409
+ token table render light swatches even when the page is in dark mode.
410
+ ============================================================================= */
411
+
412
+ .ds-context--light {
413
+ color-scheme: light;
414
+
415
+ --bg: var(--color-hrimfaxi-white-900);
416
+ --bg-surface: var(--color-hrimfaxi-white-900);
417
+ --bg-surface-brand: var(--color-geysir-blue-500);
418
+
419
+ --bg-fill: var(--color-hrimfaxi-white-900);
420
+ --bg-fill-inverse: var(--color-leifur-black-900);
421
+ --bg-fill-brand: var(--color-geysir-blue-500);
422
+ --bg-fill-brand-minimal: var(--color-geysir-blue-100);
423
+ --bg-fill-brand-contrast: var(--color-geysir-blue-900);
424
+ --bg-fill-emphasis: var(--color-gullfaxi-gold-500);
425
+ --bg-fill-emphasis-contrast: var(--color-gullfaxi-gold-700);
426
+ --bg-fill-warning: var(--color-amber);
427
+ --bg-fill-urgent: var(--color-hekla-red);
428
+ --bg-fill-urgent-minimal: var(--color-hekla-red-200);
429
+ --bg-fill-success: var(--color-gljafaxi-green);
430
+ --bg-fill-neutral: var(--color-leifur-black-100);
431
+ --bg-fill-light: var(--color-hrimfaxi-white-800);
432
+
433
+ --fg: var(--color-leifur-black-900);
434
+ --fg-secondary: var(--color-leifur-black-500);
435
+ --fg-tertiary: var(--color-leifur-black-400);
436
+ --fg-invert: var(--color-hrimfaxi-white-900);
437
+ --fg-brand: var(--color-geysir-blue-500);
438
+ --fg-urgent: var(--color-hekla-red);
439
+ --fg-neutral: var(--color-leifur-black-300);
440
+
441
+ --border: var(--color-leifur-black-100);
442
+ --border-brand: var(--color-geysir-blue-500);
443
+ --border-brand-contrast: var(--color-geysir-blue-900);
444
+ --border-contrast: var(--color-leifur-black-900);
445
+ --border-inverse: var(--color-hrimfaxi-white-900);
446
+
447
+ --form-bg-surface: var(--color-hrimfaxi-white-800);
448
+ --form-bg-surface-active: var(--color-hrimfaxi-white-900);
449
+ --form-border: var(--color-leifur-black-100);
450
+ --form-border-active: var(--color-leifur-black-200);
451
+ --form-border-error: var(--color-hekla-red);
452
+
453
+ --overlay: rgba(0, 0, 0, 0.25);
454
+ }
455
+
456
+
457
+ /* =============================================================================
458
+ 2. TYPOGRAPHY UTILITIES
459
+ ============================================================================= */
460
+
461
+ .header-1 {
462
+ font-family: var(--font-family-main);
463
+ font-size: var(--font-header-1-size);
464
+ font-weight: var(--font-header-1-weight);
465
+ line-height: var(--font-header-1-lineheight);
466
+ }
467
+
468
+ .header-2 {
469
+ font-family: var(--font-family-main);
470
+ font-size: var(--font-header-2-size);
471
+ font-weight: var(--font-header-2-weight);
472
+ line-height: var(--font-header-2-lineheight);
473
+ }
474
+
475
+ .header-3 {
476
+ font-family: var(--font-family-main);
477
+ font-size: var(--font-header-3-size);
478
+ font-weight: var(--font-header-3-weight);
479
+ line-height: var(--font-header-3-lineheight);
480
+ }
481
+
482
+ .header-4 {
483
+ font-family: var(--font-family-main);
484
+ font-size: var(--font-header-4-size);
485
+ font-weight: var(--font-header-4-weight);
486
+ line-height: var(--font-header-4-lineheight);
487
+ }
488
+
489
+ .header-5 {
490
+ font-family: var(--font-family-main);
491
+ font-size: var(--font-header-5-size);
492
+ font-weight: var(--font-header-5-weight);
493
+ line-height: var(--font-header-5-lineheight);
494
+ }
495
+
496
+ .header-6 {
497
+ font-family: var(--font-family-main);
498
+ font-size: var(--font-header-6-size);
499
+ font-weight: var(--font-header-6-weight);
500
+ line-height: var(--font-header-6-lineheight);
501
+ }
502
+
503
+ .intro {
504
+ font-family: var(--font-family-main);
505
+ font-size: var(--font-intro-size);
506
+ font-weight: var(--font-intro-weight);
507
+ line-height: var(--font-intro-lineheight);
508
+ }
509
+
510
+ .callout-bold {
511
+ font-family: var(--font-family-main);
512
+ font-size: var(--font-callout-bold-size);
513
+ font-weight: var(--font-callout-bold-weight);
514
+ line-height: var(--font-callout-bold-lineheight);
515
+ }
516
+
517
+ .callout-regular {
518
+ font-family: var(--font-family-main);
519
+ font-size: var(--font-callout-regular-size);
520
+ font-weight: var(--font-callout-regular-weight);
521
+ line-height: var(--font-callout-regular-lineheight);
522
+ }
523
+
524
+ .body-large {
525
+ font-family: var(--font-family-main);
526
+ font-size: var(--font-body-large-size);
527
+ font-weight: var(--font-body-large-weight);
528
+ line-height: var(--font-body-large-lineheight);
529
+ }
530
+
531
+ .body-large-bold {
532
+ font-family: var(--font-family-main);
533
+ font-size: var(--font-body-large-size);
534
+ font-weight: var(--font-body-large-bold-weight);
535
+ line-height: var(--font-body-large-lineheight);
536
+ }
537
+
538
+ .body-large-light {
539
+ font-family: var(--font-family-main);
540
+ font-size: var(--font-body-large-size);
541
+ font-weight: var(--font-body-large-light-weight);
542
+ line-height: var(--font-body-large-lineheight);
543
+ }
544
+
545
+ .body-normal {
546
+ font-family: var(--font-family-main);
547
+ font-size: var(--font-body-normal-size);
548
+ font-weight: var(--font-body-normal-weight);
549
+ line-height: var(--font-body-normal-lineheight);
550
+ }
551
+
552
+ .body-small {
553
+ font-family: var(--font-family-main);
554
+ font-size: var(--font-body-small-size);
555
+ font-weight: var(--font-body-small-weight);
556
+ line-height: var(--font-body-small-lineheight);
557
+ }
558
+
559
+ .body-tiny {
560
+ font-family: var(--font-family-main);
561
+ font-size: var(--font-body-tiny-size);
562
+ font-weight: var(--font-body-tiny-weight);
563
+ line-height: var(--font-body-tiny-lineheight);
564
+ }
565
+
566
+ /* Mobile — typography (scales down to Figma mobile spec) */
567
+ @media (max-width: 600px) {
568
+ .header-1 { font-size: 52px; line-height: normal; }
569
+ .header-2 { font-size: 44px; line-height: 46px; }
570
+ .header-3 { font-size: 38px; line-height: 40px; }
571
+ .header-4 { font-size: 32px; line-height: 34px; }
572
+ .header-5 { font-size: 26px; line-height: 28px; }
573
+ .header-6 { font-size: 18px; line-height: 22px; }
574
+ .intro { font-size: 28px; line-height: 32px; }
575
+ .callout-bold { font-size: 20px; line-height: 28px; }
576
+ .callout-regular { font-size: 20px; line-height: 28px; }
577
+ .body-large, .body-large-bold,
578
+ .body-large-light { font-size: 16px; line-height: 22px; }
579
+ .body-normal { font-size: 14px; line-height: 22px; }
580
+ .body-small { font-size: 14px; line-height: 18px; }
581
+ .body-tiny { font-size: 11px; line-height: 15px; }
582
+ }
583
+
584
+
585
+ /* =============================================================================
586
+ 3. SHADOW UTILITIES
587
+ ============================================================================= */
588
+
589
+ .shadow-large { box-shadow: var(--shadow-large); }
590
+ .shadow-medium { box-shadow: var(--shadow-medium); }
591
+
592
+
593
+ /* =============================================================================
594
+ 4. GRID & LAYOUT
595
+ ============================================================================= */
596
+
597
+ .container {
598
+ width: 100%;
599
+ max-width: var(--grid-max-width);
600
+ margin-inline: auto;
601
+ padding-inline: var(--grid-margin);
602
+ box-sizing: border-box;
603
+ }
604
+
605
+ .grid {
606
+ display: grid;
607
+ grid-template-columns: repeat(var(--grid-columns), 1fr);
608
+ gap: var(--grid-gutter);
609
+ }
610
+
611
+ .col-1 { grid-column: span 1; }
612
+ .col-2 { grid-column: span 2; }
613
+ .col-3 { grid-column: span 3; }
614
+ .col-4 { grid-column: span 4; }
615
+ .col-5 { grid-column: span 5; }
616
+ .col-6 { grid-column: span 6; }
617
+ .col-7 { grid-column: span 7; }
618
+ .col-8 { grid-column: span 8; }
619
+ .col-9 { grid-column: span 9; }
620
+ .col-10 { grid-column: span 10; }
621
+ .col-11 { grid-column: span 11; }
622
+ .col-12 { grid-column: span 12; }
623
+
624
+ /* Mobile — 4-column grid */
625
+ @media (max-width: 768px) {
626
+ :root {
627
+ --grid-columns: 4;
628
+ --grid-gutter: 20px;
629
+ --grid-margin: 20px;
630
+ }
631
+
632
+ .col-1, .col-2, .col-3 { grid-column: span 2; }
633
+
634
+ .col-4, .col-5, .col-6,
635
+ .col-7, .col-8, .col-9,
636
+ .col-10, .col-11, .col-12 { grid-column: span 4; }
637
+ }
638
+
639
+
640
+ /* =============================================================================
641
+ 5. BUTTONS
642
+ ============================================================================= */
643
+
644
+ /* Base */
645
+ .btn {
646
+ display: inline-flex;
647
+ align-items: center;
648
+ justify-content: center;
649
+ gap: var(--space-100);
650
+ height: var(--size-600);
651
+ padding-inline: var(--space-300);
652
+ border: none;
653
+ border-radius: var(--radius-full);
654
+ font-family: var(--font-family-main);
655
+ font-size: var(--font-body-large-size);
656
+ font-weight: var(--font-body-large-bold-weight);
657
+ line-height: 1;
658
+ text-decoration: none;
659
+ white-space: nowrap;
660
+ cursor: pointer;
661
+ transition: background-color var(--duration-fast) var(--ease),
662
+ color var(--duration-fast) var(--ease),
663
+ box-shadow var(--duration-fast) var(--ease);
664
+ }
665
+
666
+ .btn:disabled,
667
+ .btn[aria-disabled="true"] {
668
+ opacity: 0.4;
669
+ cursor: not-allowed;
670
+ pointer-events: none;
671
+ }
672
+
673
+ /* Primary */
674
+ .btn.primary { background-color: var(--color-primary); color: var(--fg-invert); }
675
+ .btn.primary:hover { background-color: var(--color-primary-active); }
676
+ .btn.primary:active { background-color: var(--color-primary-active); }
677
+
678
+ /* Optional left-arrow helper variants for text buttons.
679
+ .arrow: always visible
680
+ .arrow-hover: appears on hover/focus */
681
+ .btn.arrow,
682
+ .btn.arrow-hover {
683
+ position: relative;
684
+ overflow: hidden;
685
+ transition: padding-left var(--duration-fast) var(--ease),
686
+ background-color var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease),
687
+ box-shadow var(--duration-fast) var(--ease);
688
+ }
689
+
690
+ .btn.arrow::before,
691
+ .btn.arrow-hover::before {
692
+ content: "\2192";
693
+ position: absolute;
694
+ left: var(--space-200);
695
+ top: 50%;
696
+ transform: translate(0, -50%);
697
+ opacity: 1;
698
+ transition: transform var(--duration-fast) var(--ease), opacity var(--duration-fast) var(--ease);
699
+ }
700
+
701
+ .btn.arrow-hover::before {
702
+ transform: translate(-8px, -50%);
703
+ opacity: 0;
704
+ }
705
+
706
+ .btn.arrow-hover:hover::before,
707
+ .btn.arrow-hover:focus-visible::before {
708
+ opacity: 1;
709
+ transform: translate(0, -50%);
710
+ }
711
+
712
+ .btn.arrow,
713
+ .btn.arrow-hover:hover,
714
+ .btn.arrow-hover:focus-visible {
715
+ padding-left: calc(var(--space-300) + 16px);
716
+ }
717
+
718
+ /* Hero */
719
+ .btn.hero {
720
+ background-color: var(--bg-fill-brand);
721
+ color: var(--fg-invert);
722
+ height: var(--size-600);
723
+ font-size: var(--font-callout-bold-size);
724
+ font-weight: var(--font-callout-bold-weight);
725
+ padding-inline: var(--space-400);
726
+ border-radius: 0;
727
+ }
728
+
729
+ .btn.hero:hover { background-color: var(--bg-fill-brand-contrast); }
730
+ .btn.hero:active { background-color: var(--color-primary-active); }
731
+
732
+ /* Utility (outlined) */
733
+ .btn.utility {
734
+ background-color: var(--color-hrimfaxi-white);
735
+ color: var(--color-leifur-black);
736
+ border: 1.5px solid var(--border-contrast);
737
+ }
738
+
739
+ .btn.utility:hover { background-color: var(--bg-fill-light); }
740
+ .btn.utility:active { background-color: var(--bg-fill-neutral); }
741
+
742
+ /* Link */
743
+ .btn.link {
744
+ background-color: transparent;
745
+ color: var(--fg-brand);
746
+ border-radius: var(--radius-050);
747
+ padding-inline: var(--space-100);
748
+ height: auto;
749
+ text-decoration: underline;
750
+ text-underline-offset: 3px;
751
+ }
752
+
753
+ .btn.link:hover { color: var(--color-geysir-blue-700); }
754
+ .btn.link:active { color: var(--color-geysir-blue-800); }
755
+
756
+ /* Size modifiers (apply to .btn and the independent icon/play shapes) */
757
+ .btn.large { height: var(--size-700); }
758
+ .btn.small { height: var(--size-500); }
759
+ .btn-icon.small { width: var(--size-500); height: var(--size-500); }
760
+ .btn-icon.large { width: var(--size-800); height: var(--size-800); }
761
+ .btn-play.small { width: 70px; height: 70px; }
762
+ .btn-play.large { width: 160px; height: 160px; }
763
+
764
+ /* Icon (circular) */
765
+ .btn-icon {
766
+ position: relative;
767
+ width: var(--size-700);
768
+ height: var(--size-700);
769
+ padding: 0;
770
+ border-radius: var(--radius-full);
771
+ background-color: var(--color-leifur-black);
772
+ color: var(--fg-invert);
773
+ }
774
+
775
+ .btn-icon:hover { background-color: var(--color-leifur-black-700); }
776
+ .btn-icon:active { background-color: var(--color-leifur-black-800); }
777
+
778
+ .btn-icon svg,
779
+ .btn-icon img {
780
+ width: var(--size-300);
781
+ height: var(--size-300);
782
+ display: block;
783
+ }
784
+
785
+ /* Nav */
786
+ .btn-nav {
787
+ background-color: transparent;
788
+ color: var(--fg);
789
+ border-radius: var(--radius-050);
790
+ padding-inline: var(--space-150);
791
+ font-weight: var(--font-body-normal-weight);
792
+ position: relative;
793
+ block-size: 100%;
794
+ }
795
+
796
+ .btn-nav::before {
797
+ content: "";
798
+ position: absolute;
799
+ inset-block-start: 0;
800
+ inset-inline: 0;
801
+ block-size: 8px;
802
+ opacity: 0;
803
+ background-color: var(--color-geysir-blue);
804
+ transition: opacity .3s cubic-bezier(.5,1,.89,1);
805
+ }
806
+
807
+ .btn-nav:hover::before, .btn-nav[aria-current="page"]::before { opacity: 1; }
808
+
809
+ .btn-nav.active,
810
+ .btn-nav[aria-current="page"] {
811
+ font-weight: var(--font-body-large-bold-weight);
812
+ color: var(--color-secondary);
813
+ }
814
+
815
+ /* Play (circular media button — 120px default, 70px mobile, .small/.large modifiers) */
816
+ .btn-play {
817
+ display: inline-flex;
818
+ align-items: center;
819
+ justify-content: center;
820
+ width: 120px;
821
+ height: 120px;
822
+ border-radius: var(--radius-full);
823
+ background-color: var(--bg-fill-brand);
824
+ color: var(--fg-invert);
825
+ border: none;
826
+ cursor: pointer;
827
+ flex-shrink: 0;
828
+ transition: background-color var(--duration-fast) var(--ease), transform var(--duration-fast) var(--ease);
829
+ }
830
+
831
+ .btn-play:hover { background-color: var(--bg-fill-brand-contrast); transform: scale(1.05); }
832
+ .btn-play:active { transform: scale(0.97); }
833
+
834
+ .btn-play svg,
835
+ .btn-play img {
836
+ width: var(--size-600);
837
+ height: var(--size-600);
838
+ display: block;
839
+ }
840
+
841
+ @media (max-width: 600px) {
842
+ .btn-play { width: 70px; height: 70px; }
843
+ .btn-play svg,
844
+ .btn-play img { width: var(--size-400); height: var(--size-400); }
845
+ }
846
+
847
+ /* Square tile (icon + label shortcut) */
848
+ .btn-square {
849
+ display: inline-flex;
850
+ flex-direction: column;
851
+ align-items: center;
852
+ justify-content: center;
853
+ gap: 6px;
854
+ width: 72px;
855
+ height: 80px;
856
+ border-radius: var(--radius-100);
857
+ background-color: var(--bg-fill-light);
858
+ border: 1px solid var(--border);
859
+ color: var(--fg);
860
+ cursor: pointer;
861
+ flex-shrink: 0;
862
+ transition: background-color var(--duration-fast) var(--ease), border-color var(--duration-fast) var(--ease);
863
+ }
864
+
865
+ .btn-square:hover { background-color: var(--bg-fill-neutral); border-color: var(--border-contrast); }
866
+ .btn-square:active { background-color: var(--bg-fill-neutral); }
867
+
868
+ .btn-square svg,
869
+ .btn-square img {
870
+ width: var(--size-300);
871
+ height: var(--size-300);
872
+ display: block;
873
+ flex-shrink: 0;
874
+ }
875
+
876
+ .btn-square span {
877
+ font-family: var(--font-family-main);
878
+ font-size: var(--font-body-tiny-size);
879
+ font-weight: var(--font-body-normal-weight);
880
+ color: var(--fg);
881
+ line-height: 1;
882
+ text-align: center;
883
+ }
884
+
885
+ /* History (back navigation) */
886
+ .btn-history {
887
+ display: inline-flex;
888
+ align-items: center;
889
+ gap: var(--space-100);
890
+ height: var(--size-500);
891
+ padding-inline: var(--space-150);
892
+ border-radius: var(--radius-050);
893
+ background-color: transparent;
894
+ border: none;
895
+ font-family: var(--font-family-main);
896
+ font-size: var(--font-body-normal-size);
897
+ color: var(--fg-secondary);
898
+ cursor: pointer;
899
+ transition: color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease);
900
+ }
901
+
902
+ .btn-history:hover { color: var(--fg); background-color: var(--bg-fill-light); }
903
+
904
+ .btn-history svg,
905
+ .btn-history img {
906
+ width: var(--size-300);
907
+ height: var(--size-300);
908
+ flex-shrink: 0;
909
+ }
910
+
911
+ /* Chat (fixed floating action button) */
912
+ .btn-chat {
913
+ position: fixed;
914
+ bottom: var(--space-400);
915
+ right: var(--space-400);
916
+ z-index: var(--z-floating);
917
+ display: flex;
918
+ align-items: center;
919
+ justify-content: center;
920
+ width: var(--size-700);
921
+ height: var(--size-700);
922
+ border-radius: var(--radius-full);
923
+ background-color: var(--color-leifur-black);
924
+ color: var(--fg-invert);
925
+ border: none;
926
+ box-shadow: var(--shadow-large);
927
+ cursor: pointer;
928
+ transition: background-color var(--duration-fast) var(--ease), transform var(--duration-fast) var(--ease);
929
+ }
930
+
931
+ .btn-chat:hover { background-color: var(--color-leifur-black-700); transform: scale(1.06); }
932
+
933
+ .btn-chat svg,
934
+ .btn-chat img {
935
+ width: var(--size-300);
936
+ height: var(--size-300);
937
+ display: block;
938
+ }
939
+
940
+ /* ── Dark-mode override: buttons with filled/dark backgrounds always use white text ── */
941
+ html[data-theme="dark"] .btn.primary,
942
+ html[data-theme="dark"] .btn.hero,
943
+ html[data-theme="dark"] .btn-icon,
944
+ html[data-theme="dark"] .btn-play,
945
+ html[data-theme="dark"] .btn-chat { color: #ffffff; }
946
+
947
+ /* Share */
948
+ .btn-share {
949
+ display: inline-flex;
950
+ align-items: center;
951
+ gap: var(--space-100);
952
+ height: var(--size-500);
953
+ padding-inline: var(--space-200);
954
+ border-radius: var(--radius-full);
955
+ background-color: transparent;
956
+ border: 1.5px solid var(--border);
957
+ font-family: var(--font-family-main);
958
+ font-size: var(--font-body-normal-size);
959
+ color: var(--fg);
960
+ cursor: pointer;
961
+ transition: border-color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease);
962
+ }
963
+
964
+ .btn-share:hover { border-color: var(--border-contrast); background-color: var(--bg-fill-light); }
965
+
966
+ .share-sheet {
967
+ display: flex;
968
+ align-items: center;
969
+ gap: var(--space-150);
970
+ flex-wrap: wrap;
971
+ }
972
+
973
+ .share-link {
974
+ display: inline-flex;
975
+ align-items: center;
976
+ justify-content: center;
977
+ width: var(--size-500);
978
+ height: var(--size-500);
979
+ border-radius: var(--radius-full);
980
+ background-color: var(--bg-fill-neutral);
981
+ color: var(--fg);
982
+ text-decoration: none;
983
+ transition: background-color var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease);
984
+ }
985
+
986
+ .share-link:hover { background-color: var(--color-leifur-black); color: var(--fg-invert); }
987
+
988
+ .share-link svg,
989
+ .share-link img {
990
+ width: 20px;
991
+ height: 20px;
992
+ display: block;
993
+ }
994
+
995
+
996
+ /* =============================================================================
997
+ 6. FORMS
998
+ ============================================================================= */
999
+
1000
+ /* Form Group — wraps a label, control, helper, and error */
1001
+ .form-group {
1002
+ display: flex;
1003
+ flex-direction: column;
1004
+ gap: var(--space-100);
1005
+ }
1006
+
1007
+ .form-label {
1008
+ font-family: var(--font-family-main);
1009
+ font-size: var(--font-body-normal-size);
1010
+ font-weight: var(--font-body-large-bold-weight);
1011
+ color: var(--fg);
1012
+ line-height: var(--font-body-normal-lineheight);
1013
+ }
1014
+
1015
+ .form-helper {
1016
+ font-family: var(--font-family-main);
1017
+ font-size: var(--font-body-small-size);
1018
+ color: var(--fg-secondary);
1019
+ line-height: var(--font-body-small-lineheight);
1020
+ }
1021
+
1022
+ .form-error {
1023
+ font-family: var(--font-family-main);
1024
+ font-size: var(--font-body-small-size);
1025
+ color: var(--fg-urgent);
1026
+ line-height: var(--font-body-small-lineheight);
1027
+ }
1028
+
1029
+ /* Input */
1030
+ .input {
1031
+ width: 100%;
1032
+ height: var(--size-700);
1033
+ padding-inline: var(--space-300);
1034
+ background-color: var(--form-bg-surface);
1035
+ border: 1.5px solid var(--form-border);
1036
+ border-radius: var(--radius-100);
1037
+ font-family: var(--font-family-main);
1038
+ font-size: var(--font-body-large-size);
1039
+ color: var(--fg);
1040
+ box-sizing: border-box;
1041
+ outline: none;
1042
+ transition: border-color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease);
1043
+ }
1044
+
1045
+ .input::placeholder { color: var(--fg-tertiary); }
1046
+ .input:focus { background-color: var(--form-bg-surface-active); border-color: var(--form-border-active); }
1047
+ .input:disabled { opacity: 0.4; cursor: not-allowed; }
1048
+ .input.error { border-color: var(--form-border-error); }
1049
+
1050
+ /* Textarea */
1051
+ .textarea {
1052
+ width: 100%;
1053
+ min-height: 120px;
1054
+ padding: var(--space-300);
1055
+ background-color: var(--form-bg-surface);
1056
+ border: 1.5px solid var(--form-border);
1057
+ border-radius: var(--radius-100);
1058
+ font-family: var(--font-family-main);
1059
+ font-size: var(--font-body-large-size);
1060
+ color: var(--fg);
1061
+ box-sizing: border-box;
1062
+ resize: vertical;
1063
+ outline: none;
1064
+ transition: border-color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease);
1065
+ }
1066
+
1067
+ .textarea::placeholder { color: var(--fg-tertiary); }
1068
+ .textarea:focus { background-color: var(--form-bg-surface-active); border-color: var(--form-border-active); }
1069
+ .textarea:disabled { opacity: 0.4; cursor: not-allowed; }
1070
+ .textarea.error { border-color: var(--form-border-error); }
1071
+
1072
+ /* Select */
1073
+ .select {
1074
+ width: 100%;
1075
+ height: var(--size-700);
1076
+ padding-inline: var(--space-300) var(--space-600);
1077
+ background-color: var(--form-bg-surface);
1078
+ border: 1.5px solid var(--form-border);
1079
+ border-radius: var(--radius-100);
1080
+ font-family: var(--font-family-main);
1081
+ font-size: var(--font-body-large-size);
1082
+ color: var(--fg);
1083
+ box-sizing: border-box;
1084
+ appearance: none;
1085
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23232323' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
1086
+ background-repeat: no-repeat;
1087
+ background-position: right var(--space-300) center;
1088
+ cursor: pointer;
1089
+ outline: none;
1090
+ transition: border-color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease);
1091
+ }
1092
+
1093
+ .select:focus { background-color: var(--form-bg-surface-active); border-color: var(--form-border-active); }
1094
+ .select:disabled { opacity: 0.4; cursor: not-allowed; }
1095
+ .select.error { border-color: var(--form-border-error); }
1096
+
1097
+ /* Checkbox */
1098
+ .checkbox-group {
1099
+ display: flex;
1100
+ flex-direction: column;
1101
+ align-items: flex-start;
1102
+ gap: var(--space-150);
1103
+ cursor: pointer;
1104
+ }
1105
+
1106
+ .checkbox-group input[type="checkbox"] {
1107
+ appearance: none;
1108
+ width: var(--size-300);
1109
+ height: var(--size-300);
1110
+ min-width: var(--size-300);
1111
+ border: 1.5px solid var(--form-border-active);
1112
+ border-radius: var(--radius-050);
1113
+ background-color: var(--form-bg-surface);
1114
+ cursor: pointer;
1115
+ position: relative;
1116
+ transition: background-color var(--duration-fast) var(--ease), border-color var(--duration-fast) var(--ease);
1117
+ }
1118
+
1119
+ .checkbox-group input[type="checkbox"]:checked {
1120
+ background-color: var(--color-leifur-black);
1121
+ border-color: var(--color-leifur-black);
1122
+ }
1123
+
1124
+ .checkbox-group input[type="checkbox"]:checked::after {
1125
+ content: "";
1126
+ position: absolute;
1127
+ left: 5px;
1128
+ top: 2px;
1129
+ width: 5px;
1130
+ height: 9px;
1131
+ border: 2px solid var(--fg-invert);
1132
+ border-top: none;
1133
+ border-left: none;
1134
+ transform: rotate(45deg);
1135
+ }
1136
+
1137
+ .checkbox-group input[type="checkbox"]:focus-visible {
1138
+ outline: 2px solid var(--border-brand);
1139
+ outline-offset: 2px;
1140
+ }
1141
+
1142
+ .checkbox-group input[type="checkbox"]:disabled { opacity: 0.4; cursor: not-allowed; }
1143
+
1144
+ .checkbox-label {
1145
+ display: inline-flex;
1146
+ align-items: center;
1147
+ font-family: var(--font-family-main);
1148
+ font-size: var(--font-body-normal-size);
1149
+ color: var(--fg);
1150
+ line-height: var(--font-body-normal-lineheight);
1151
+ }
1152
+
1153
+ /* Radio */
1154
+ .radio-group {
1155
+ display: flex;
1156
+ flex-direction: column;
1157
+ align-items: flex-start;
1158
+ gap: var(--space-150);
1159
+ cursor: pointer;
1160
+ }
1161
+
1162
+ .radio-group input[type="radio"] {
1163
+ appearance: none;
1164
+ width: var(--size-300);
1165
+ height: var(--size-300);
1166
+ min-width: var(--size-300);
1167
+ border: 1.5px solid var(--form-border-active);
1168
+ border-radius: var(--radius-full);
1169
+ background-color: var(--form-bg-surface);
1170
+ cursor: pointer;
1171
+ position: relative;
1172
+ transition: background-color var(--duration-fast) var(--ease), border-color var(--duration-fast) var(--ease);
1173
+ }
1174
+
1175
+ .radio-group input[type="radio"]:checked {
1176
+ border-color: var(--color-leifur-black);
1177
+ border-width: 5px;
1178
+ background-color: var(--form-bg-surface-active);
1179
+ }
1180
+
1181
+ .radio-group input[type="radio"]:focus-visible {
1182
+ outline: 2px solid var(--border-brand);
1183
+ outline-offset: 2px;
1184
+ }
1185
+
1186
+ .radio-group input[type="radio"]:disabled { opacity: 0.4; cursor: not-allowed; }
1187
+
1188
+ .radio-label {
1189
+ display: inline-flex;
1190
+ align-items: center;
1191
+ font-family: var(--font-family-main);
1192
+ font-size: var(--font-body-normal-size);
1193
+ color: var(--fg);
1194
+ line-height: var(--font-body-normal-lineheight);
1195
+ }
1196
+
1197
+ /* Search */
1198
+ .search-wrapper {
1199
+ position: relative;
1200
+ display: flex;
1201
+ align-items: center;
1202
+ }
1203
+
1204
+ .search-wrapper .search-icon {
1205
+ position: absolute;
1206
+ left: var(--space-200);
1207
+ width: var(--size-300);
1208
+ height: var(--size-300);
1209
+ color: var(--fg-secondary);
1210
+ pointer-events: none;
1211
+ }
1212
+
1213
+ .search-input {
1214
+ width: 100%;
1215
+ height: var(--size-700);
1216
+ padding-inline: var(--space-300) var(--space-200);
1217
+ background-color: var(--form-bg-surface);
1218
+ border: 1.5px solid var(--form-border);
1219
+ border-radius: var(--radius-full);
1220
+ font-family: var(--font-family-main);
1221
+ font-size: var(--font-body-large-size);
1222
+ color: var(--fg);
1223
+ box-sizing: border-box;
1224
+ outline: none;
1225
+ transition: border-color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease);
1226
+ }
1227
+
1228
+ .search-input::placeholder { color: var(--fg-tertiary); }
1229
+ .search-input:focus { background-color: var(--form-bg-surface-active); border-color: var(--form-border-active); }
1230
+
1231
+ /* Switch */
1232
+ .switch-group {
1233
+ display: flex;
1234
+ align-items: center;
1235
+ gap: var(--space-150);
1236
+ cursor: pointer;
1237
+ }
1238
+
1239
+ .switch {
1240
+ position: relative;
1241
+ display: inline-block;
1242
+ width: 48px;
1243
+ height: var(--size-300);
1244
+ flex-shrink: 0;
1245
+ }
1246
+
1247
+ .switch input {
1248
+ opacity: 0;
1249
+ width: 0;
1250
+ height: 0;
1251
+ position: absolute;
1252
+ }
1253
+
1254
+ .switch-track {
1255
+ position: absolute;
1256
+ inset: 0;
1257
+ background-color: var(--border);
1258
+ border-radius: var(--radius-full);
1259
+ transition: background-color var(--duration-normal) var(--ease);
1260
+ }
1261
+
1262
+ .switch input:checked + .switch-track { background-color: var(--color-leifur-black); }
1263
+ .switch input:disabled + .switch-track { opacity: 0.4; cursor: not-allowed; }
1264
+ .switch input:focus-visible + .switch-track { outline: 2px solid var(--border-brand); outline-offset: 2px; }
1265
+
1266
+ .switch-track::before {
1267
+ content: "";
1268
+ position: absolute;
1269
+ width: 18px;
1270
+ height: 18px;
1271
+ left: 3px;
1272
+ top: 3px;
1273
+ background-color: var(--fg-invert);
1274
+ border-radius: var(--radius-full);
1275
+ transition: transform var(--duration-normal) var(--ease);
1276
+ }
1277
+
1278
+ .switch input:checked + .switch-track::before { transform: translateX(24px); }
1279
+
1280
+ .switch-label {
1281
+ font-family: var(--font-family-main);
1282
+ font-size: var(--font-body-normal-size);
1283
+ color: var(--fg);
1284
+ line-height: var(--font-body-normal-lineheight);
1285
+ }
1286
+
1287
+ /* File Upload */
1288
+ .file-upload {
1289
+ display: flex;
1290
+ flex-direction: column;
1291
+ align-items: center;
1292
+ justify-content: center;
1293
+ gap: var(--space-100);
1294
+ width: 100%;
1295
+ min-height: 120px;
1296
+ padding: var(--space-400);
1297
+ background-color: var(--form-bg-surface);
1298
+ border: 1.5px dashed var(--form-border);
1299
+ border-radius: var(--radius-100);
1300
+ box-sizing: border-box;
1301
+ text-align: center;
1302
+ cursor: pointer;
1303
+ transition: border-color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease);
1304
+ }
1305
+
1306
+ .file-upload:hover { border-color: var(--form-border-active); background-color: var(--form-bg-surface-active); }
1307
+
1308
+ .file-upload-label { font-family: var(--font-family-main); font-size: var(--font-body-normal-size); color: var(--fg-secondary); }
1309
+ .file-upload-link { color: var(--fg-brand); text-decoration: underline; cursor: pointer; }
1310
+
1311
+ /* Date Select (select with calendar icon) */
1312
+ .date-select-wrapper {
1313
+ position: relative;
1314
+ display: flex;
1315
+ flex-direction: column;
1316
+ gap: var(--space-100);
1317
+ }
1318
+
1319
+ .date-select {
1320
+ width: 100%;
1321
+ height: var(--size-700);
1322
+ padding-inline: var(--space-200) var(--space-600);
1323
+ background-color: var(--form-bg-surface);
1324
+ border: 1.5px solid var(--form-border);
1325
+ border-radius: var(--radius-100);
1326
+ font-family: var(--font-family-main);
1327
+ font-size: var(--font-body-large-size);
1328
+ color: var(--fg);
1329
+ box-sizing: border-box;
1330
+ appearance: none;
1331
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23232323' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2'/%3E%3Cline x1='16' y1='2' x2='16' y2='6'/%3E%3Cline x1='8' y1='2' x2='8' y2='6'/%3E%3Cline x1='3' y1='10' x2='21' y2='10'/%3E%3C/svg%3E");
1332
+ background-repeat: no-repeat;
1333
+ background-position: right var(--space-200) center;
1334
+ cursor: pointer;
1335
+ outline: none;
1336
+ transition: border-color var(--duration-fast) var(--ease);
1337
+ }
1338
+
1339
+ .date-select:focus { background-color: var(--form-bg-surface-active); border-color: var(--form-border-active); }
1340
+ .date-select:disabled { opacity: 0.4; cursor: not-allowed; }
1341
+ .date-select.error { border-color: var(--form-border-error); }
1342
+
1343
+ /* Date Picker (calendar popup) */
1344
+ .date-picker {
1345
+ min-width: 320px;
1346
+ background-color: var(--bg-surface);
1347
+ border: 1px solid var(--border);
1348
+ border-radius: var(--radius-200);
1349
+ box-shadow: var(--shadow-medium);
1350
+ z-index: var(--z-popup);
1351
+ box-sizing: border-box;
1352
+ }
1353
+
1354
+ .date-picker-header {
1355
+ display: flex;
1356
+ align-items: center;
1357
+ justify-content: space-between;
1358
+ margin-bottom: var(--space-200);
1359
+ }
1360
+
1361
+ .date-picker-month {
1362
+ font-family: var(--font-family-main);
1363
+ font-size: var(--font-body-large-size);
1364
+ font-weight: var(--font-body-large-bold-weight);
1365
+ color: var(--fg);
1366
+ }
1367
+
1368
+ .date-picker-nav {
1369
+ display: inline-flex;
1370
+ align-items: center;
1371
+ justify-content: center;
1372
+ width: var(--size-400);
1373
+ height: var(--size-400);
1374
+ border-radius: var(--radius-050);
1375
+ background: transparent;
1376
+ border: none;
1377
+ color: var(--fg-secondary);
1378
+ cursor: pointer;
1379
+ transition: background-color var(--duration-fast) var(--ease);
1380
+ }
1381
+
1382
+ .date-picker-nav:hover { background-color: var(--bg-fill-light); }
1383
+
1384
+ .date-picker-grid {
1385
+ display: grid;
1386
+ grid-template-columns: repeat(7, 1fr);
1387
+ gap: var(--space-050);
1388
+ }
1389
+
1390
+ .date-picker-weekday {
1391
+ display: flex;
1392
+ align-items: center;
1393
+ justify-content: center;
1394
+ height: var(--size-400);
1395
+ font-family: var(--font-family-main);
1396
+ font-size: var(--font-body-small-size);
1397
+ font-weight: var(--font-body-large-bold-weight);
1398
+ color: var(--fg-secondary);
1399
+ }
1400
+
1401
+ .date-picker-day {
1402
+ display: flex;
1403
+ align-items: center;
1404
+ justify-content: center;
1405
+ height: var(--size-500);
1406
+ border-radius: var(--radius-050);
1407
+ font-family: var(--font-family-main);
1408
+ font-size: var(--font-body-normal-size);
1409
+ color: var(--fg);
1410
+ cursor: pointer;
1411
+ background: transparent;
1412
+ border: none;
1413
+ transition: background-color var(--duration-fast) var(--ease);
1414
+ }
1415
+
1416
+ .date-picker-day:hover { background-color: var(--bg-fill-light); }
1417
+ .date-picker-day.today { font-weight: var(--font-body-large-bold-weight); border: 1.5px solid var(--border-contrast); }
1418
+ .date-picker-day.selected { background-color: var(--color-leifur-black); color: var(--fg-invert); }
1419
+ .date-picker-day.selected:hover { background-color: var(--color-leifur-black-700); }
1420
+ .date-picker-day:disabled,
1421
+ .date-picker-day.disabled { color: var(--fg-neutral); cursor: not-allowed; pointer-events: none; }
1422
+
1423
+ /* Range selection states */
1424
+ .date-picker-day.in-range { background-color: var(--color-geysir-blue-100); border-radius: 0; }
1425
+ .date-picker-day.range-start,
1426
+ .date-picker-day.range-end { background-color: var(--color-leifur-black); color: var(--fg-invert); border-radius: var(--radius-050); }
1427
+
1428
+ /* Flight Lookup (KEF-specific flight search form) */
1429
+ .flight-lookup {
1430
+ display: flex;
1431
+ flex-direction: column;
1432
+ gap: var(--space-200);
1433
+ padding: var(--space-400);
1434
+ background-color: var(--bg-surface);
1435
+ border-radius: var(--radius-200);
1436
+ box-shadow: var(--shadow-medium);
1437
+ }
1438
+
1439
+ .flight-lookup-row {
1440
+ display: flex;
1441
+ gap: var(--space-200);
1442
+ align-items: flex-end;
1443
+ }
1444
+
1445
+ .flight-lookup-field {
1446
+ flex: 1;
1447
+ display: flex;
1448
+ flex-direction: column;
1449
+ gap: var(--space-100);
1450
+ min-width: 0;
1451
+ }
1452
+
1453
+ .flight-lookup-direction { display: flex; gap: var(--space-150); }
1454
+
1455
+ .flight-lookup-direction .radio-group {
1456
+ flex: 1;
1457
+ justify-content: center;
1458
+ padding: var(--space-150) var(--space-200);
1459
+ border: 1.5px solid var(--form-border);
1460
+ border-radius: var(--radius-100);
1461
+ cursor: pointer;
1462
+ transition: border-color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease);
1463
+ }
1464
+
1465
+ .flight-lookup-direction .radio-group:has(input:checked) {
1466
+ border-color: var(--color-leifur-black);
1467
+ background-color: var(--bg-fill-neutral);
1468
+ }
1469
+
1470
+ .flight-lookup-swap {
1471
+ display: inline-flex;
1472
+ align-items: center;
1473
+ justify-content: center;
1474
+ width: var(--size-500);
1475
+ height: var(--size-700);
1476
+ flex-shrink: 0;
1477
+ border: none;
1478
+ background: transparent;
1479
+ color: var(--fg-secondary);
1480
+ cursor: pointer;
1481
+ transition: color var(--duration-fast) var(--ease);
1482
+ }
1483
+
1484
+ .flight-lookup-swap:hover { color: var(--fg); }
1485
+
1486
+ @media (max-width: 768px) {
1487
+ .flight-lookup-row { flex-direction: column; }
1488
+ .flight-lookup-swap { transform: rotate(90deg); align-self: center; height: var(--size-500); }
1489
+ }
1490
+
1491
+ /* Newsletter */
1492
+ .newsletter {
1493
+ display: flex;
1494
+ flex-direction: column;
1495
+ gap: var(--space-300);
1496
+ }
1497
+
1498
+ .newsletter-title {
1499
+ font-family: var(--font-family-main);
1500
+ font-size: var(--font-header-5-size);
1501
+ font-weight: var(--font-header-5-weight);
1502
+ line-height: var(--font-header-5-lineheight);
1503
+ color: var(--fg);
1504
+ }
1505
+
1506
+ .newsletter-description {
1507
+ font-family: var(--font-family-main);
1508
+ font-size: var(--font-body-normal-size);
1509
+ color: var(--fg-secondary);
1510
+ line-height: var(--font-body-normal-lineheight);
1511
+ }
1512
+
1513
+ .newsletter-form {
1514
+ display: flex;
1515
+ gap: var(--space-150);
1516
+ }
1517
+
1518
+ .newsletter-input {
1519
+ flex: 1;
1520
+ height: var(--size-700);
1521
+ padding-inline: var(--space-300);
1522
+ background-color: var(--form-bg-surface);
1523
+ border: 1.5px solid var(--form-border);
1524
+ border-radius: var(--radius-100);
1525
+ font-family: var(--font-family-main);
1526
+ font-size: var(--font-body-large-size);
1527
+ color: var(--fg);
1528
+ min-width: 0;
1529
+ box-sizing: border-box;
1530
+ outline: none;
1531
+ transition: border-color var(--duration-fast) var(--ease);
1532
+ }
1533
+
1534
+ .newsletter-input::placeholder { color: var(--fg-tertiary); }
1535
+ .newsletter-input:focus { border-color: var(--form-border-active); }
1536
+
1537
+ .newsletter-consent {
1538
+ display: flex;
1539
+ align-items: flex-start;
1540
+ gap: var(--space-150);
1541
+ font-family: var(--font-family-main);
1542
+ font-size: var(--font-body-small-size);
1543
+ color: var(--fg-secondary);
1544
+ line-height: var(--font-body-small-lineheight);
1545
+ }
1546
+
1547
+ @media (max-width: 600px) {
1548
+ .newsletter-form { flex-direction: column; }
1549
+ }
1550
+
1551
+ /* reCAPTCHA */
1552
+ .recaptcha-wrapper {
1553
+ display: flex;
1554
+ flex-direction: column;
1555
+ gap: var(--space-100);
1556
+ }
1557
+
1558
+ .recaptcha-container {
1559
+ display: inline-flex;
1560
+ align-items: center;
1561
+ gap: var(--space-150);
1562
+ padding: var(--space-200) var(--space-300);
1563
+ background-color: var(--form-bg-surface);
1564
+ border: 1.5px solid var(--form-border);
1565
+ border-radius: var(--radius-100);
1566
+ min-height: 78px;
1567
+ box-sizing: border-box;
1568
+ }
1569
+
1570
+ .recaptcha-container > div { overflow: hidden; border-radius: var(--radius-050); }
1571
+
1572
+ .recaptcha-helper {
1573
+ font-family: var(--font-family-main);
1574
+ font-size: var(--font-body-small-size);
1575
+ color: var(--fg-tertiary);
1576
+ line-height: var(--font-body-small-lineheight);
1577
+ }
1578
+
1579
+ .recaptcha-notice {
1580
+ font-family: var(--font-family-main);
1581
+ font-size: var(--font-body-tiny-size);
1582
+ color: var(--fg-neutral);
1583
+ line-height: 1.4;
1584
+ }
1585
+
1586
+ .recaptcha-notice a { color: var(--fg-brand); text-decoration: underline; }
1587
+
1588
+
1589
+ /* =============================================================================
1590
+ 7. FEEDBACK
1591
+ ============================================================================= */
1592
+
1593
+ /* Alert */
1594
+ .alert {
1595
+ display: flex;
1596
+ align-items: flex-start;
1597
+ gap: var(--space-200);
1598
+ padding: var(--space-200) var(--space-300);
1599
+ border-radius: var(--radius-100);
1600
+ border-top-left-radius: 0;
1601
+ border-bottom-left-radius: 0;
1602
+ border-left: var(--space-050) solid transparent;
1603
+ font-family: var(--font-family-main);
1604
+ }
1605
+
1606
+ .alert-icon {
1607
+ flex-shrink: 0;
1608
+ width: var(--size-300);
1609
+ height: var(--size-300);
1610
+ }
1611
+
1612
+ .alert-content {
1613
+ display: flex;
1614
+ flex-direction: column;
1615
+ gap: var(--space-050);
1616
+ }
1617
+
1618
+ .alert-title {
1619
+ font-size: var(--font-body-large-size);
1620
+ font-weight: var(--font-body-large-bold-weight);
1621
+ line-height: var(--font-body-large-lineheight);
1622
+ }
1623
+
1624
+ .alert-body {
1625
+ font-size: var(--font-body-normal-size);
1626
+ font-weight: var(--font-body-normal-weight);
1627
+ line-height: var(--font-body-normal-lineheight);
1628
+ }
1629
+
1630
+ /* Alert — colour variants */
1631
+ .alert.info { background-color: var(--color-geysir-blue-100); border-left-color: var(--border-brand); color: var(--color-geysir-blue-700); }
1632
+ .alert.success { background-color: var(--color-gljafaxi-green-100); border-left-color: var(--color-gljafaxi-green); color: var(--color-gljafaxi-green-800); }
1633
+ .alert.warning { background-color: var(--bg-fill-warning); border-left-color: var(--color-amber); color: var(--color-leifur-black); }
1634
+ .alert.error { background-color: var(--color-hekla-red-200); border-left-color: var(--color-hekla-red); color: var(--color-hekla-red-700); }
1635
+ .alert.neutral { background-color: var(--bg-fill-light); border-left-color: var(--border); color: var(--fg); }
1636
+
1637
+ /* Alert — small size (max 620px, from Figma) */
1638
+ .alert.small { padding: var(--space-100) var(--space-200); max-width: 620px; }
1639
+ .alert.small .alert-title { font-size: var(--font-body-normal-size); }
1640
+ .alert.small .alert-body { font-size: var(--font-body-small-size); }
1641
+
1642
+ /* Alert — dismissible (flex row with close button) */
1643
+ .alert.dismissible {
1644
+ align-items: center;
1645
+ justify-content: space-between;
1646
+ }
1647
+
1648
+ /* Alert — full-width banner (56px, no left border, coloured bottom border) */
1649
+ .alert.banner {
1650
+ width: 100%;
1651
+ min-height: var(--size-700);
1652
+ padding: 0 var(--space-400);
1653
+ margin: 0;
1654
+ border-radius: 0;
1655
+ border-left: none;
1656
+ border-bottom: 3px solid transparent;
1657
+ justify-content: center;
1658
+ align-items: center;
1659
+ }
1660
+
1661
+ .alert.banner.info { border-bottom-color: var(--border-brand); }
1662
+ .alert.banner.success { border-bottom-color: var(--bg-fill-success); }
1663
+ .alert.banner.warning { border-bottom-color: var(--bg-fill-warning); }
1664
+ .alert.banner.error { border-bottom-color: var(--bg-fill-urgent); }
1665
+
1666
+ /* Progress Bar */
1667
+ .progress-bar {
1668
+ width: 100%;
1669
+ height: var(--size-100);
1670
+ background-color: var(--bg-fill-neutral);
1671
+ border-radius: var(--radius-full);
1672
+ overflow: hidden;
1673
+ }
1674
+
1675
+ .progress-bar-fill {
1676
+ height: 100%;
1677
+ background-color: var(--color-leifur-black);
1678
+ border-radius: var(--radius-full);
1679
+ transition: width var(--duration-slow) var(--ease);
1680
+ }
1681
+
1682
+ .progress-bar.brand .progress-bar-fill { background-color: var(--bg-fill-brand); }
1683
+ .progress-bar.success .progress-bar-fill { background-color: var(--bg-fill-success); }
1684
+ .progress-bar.warning .progress-bar-fill { background-color: var(--bg-fill-warning); }
1685
+ .progress-bar.urgent .progress-bar-fill { background-color: var(--bg-fill-urgent); }
1686
+
1687
+ /* Status */
1688
+ .status {
1689
+ display: inline-flex;
1690
+ align-items: center;
1691
+ gap: var(--space-100);
1692
+ font-family: var(--font-family-main);
1693
+ font-size: var(--font-body-normal-size);
1694
+ font-weight: var(--font-body-large-bold-weight);
1695
+ line-height: var(--font-body-normal-lineheight);
1696
+ }
1697
+
1698
+ .status::before {
1699
+ content: "";
1700
+ display: block;
1701
+ width: var(--size-100);
1702
+ height: var(--size-100);
1703
+ border-radius: var(--radius-full);
1704
+ flex-shrink: 0;
1705
+ }
1706
+
1707
+ .status.default::before { background-color: var(--fg-neutral); }
1708
+ .status.active::before { background-color: var(--bg-fill-success); }
1709
+ .status.warning::before { background-color: var(--bg-fill-warning); }
1710
+ .status.error::before { background-color: var(--bg-fill-urgent); }
1711
+ .status.inactive::before { background-color: var(--fg-tertiary); }
1712
+
1713
+ /* Badge */
1714
+ .badge {
1715
+ position: absolute;
1716
+ top: 0;
1717
+ right: 0;
1718
+ transform: translate(35%, -35%);
1719
+ display: inline-flex;
1720
+ align-items: center;
1721
+ justify-content: center;
1722
+ min-width: var(--size-badge);
1723
+ height: var(--size-badge);
1724
+ padding-inline: var(--space-050);
1725
+ border-radius: var(--radius-full);
1726
+ background-color: var(--bg-fill-urgent);
1727
+ color: var(--fg-invert);
1728
+ font-family: var(--font-family-main);
1729
+ font-size: var(--font-badge-size);
1730
+ font-weight: var(--font-body-large-bold-weight);
1731
+ line-height: 1;
1732
+ pointer-events: none;
1733
+ white-space: nowrap;
1734
+ }
1735
+
1736
+
1737
+ /* =============================================================================
1738
+ 8. MODAL
1739
+ ============================================================================= */
1740
+
1741
+ .modal-overlay {
1742
+ position: fixed;
1743
+ inset: 0;
1744
+ background-color: var(--overlay);
1745
+ display: flex;
1746
+ align-items: center;
1747
+ justify-content: center;
1748
+ z-index: var(--z-modal);
1749
+ padding: var(--space-400);
1750
+ box-sizing: border-box;
1751
+ }
1752
+
1753
+ .modal {
1754
+ background-color: var(--bg-surface);
1755
+ border-radius: var(--radius-200);
1756
+ box-shadow: var(--shadow-large);
1757
+ width: 100%;
1758
+ max-width: 560px;
1759
+ max-height: 90vh;
1760
+ overflow-y: auto;
1761
+ box-sizing: border-box;
1762
+ display: flex;
1763
+ flex-direction: column;
1764
+ }
1765
+
1766
+ .modal-header {
1767
+ display: flex;
1768
+ align-items: center;
1769
+ justify-content: space-between;
1770
+ padding: var(--space-300) var(--space-400);
1771
+ border-bottom: 1px solid var(--border);
1772
+ }
1773
+
1774
+ .modal-title {
1775
+ font-family: var(--font-family-main);
1776
+ font-size: var(--font-header-5-size);
1777
+ font-weight: var(--font-header-5-weight);
1778
+ line-height: var(--font-header-5-lineheight);
1779
+ color: var(--fg);
1780
+ }
1781
+
1782
+ .modal-close {
1783
+ display: flex;
1784
+ align-items: center;
1785
+ justify-content: center;
1786
+ width: var(--size-500);
1787
+ height: var(--size-500);
1788
+ border: none;
1789
+ background: transparent;
1790
+ border-radius: var(--radius-050);
1791
+ cursor: pointer;
1792
+ color: var(--fg-secondary);
1793
+ transition: background-color var(--duration-fast) var(--ease);
1794
+ }
1795
+
1796
+ .modal-close:hover { background-color: var(--bg-fill-light); }
1797
+
1798
+ .modal-body {
1799
+ padding: var(--space-400);
1800
+ flex: 1;
1801
+ font-family: var(--font-family-main);
1802
+ font-size: var(--font-body-normal-size);
1803
+ color: var(--fg);
1804
+ line-height: var(--font-body-normal-lineheight);
1805
+ }
1806
+
1807
+ .modal-footer {
1808
+ display: flex;
1809
+ align-items: center;
1810
+ justify-content: flex-end;
1811
+ gap: var(--space-150);
1812
+ padding: var(--space-300) var(--space-400);
1813
+ border-top: 1px solid var(--border);
1814
+ }
1815
+
1816
+ /* Mobile — bottom sheet */
1817
+ @media (max-width: 600px) {
1818
+ .modal-overlay { align-items: flex-end; padding: 0; }
1819
+ .modal { max-width: 100%; border-radius: var(--radius-200) var(--radius-200) 0 0; max-height: 85vh; }
1820
+ }
1821
+
1822
+
1823
+ /* =============================================================================
1824
+ 9. CARDS
1825
+ ============================================================================= */
1826
+
1827
+ /* Standard Card */
1828
+ .card {
1829
+ background-color: var(--bg-surface);
1830
+ border-radius: var(--radius-200);
1831
+ box-shadow: var(--shadow-medium);
1832
+ overflow: hidden;
1833
+ display: flex;
1834
+ flex-direction: column;
1835
+ transition: box-shadow var(--duration-normal) var(--ease), transform var(--duration-normal) var(--ease);
1836
+ }
1837
+
1838
+ .card:hover { box-shadow: var(--shadow-large); transform: translateY(-2px); }
1839
+
1840
+ .card-image {
1841
+ width: 100%;
1842
+ aspect-ratio: 16 / 9;
1843
+ object-fit: cover;
1844
+ display: block;
1845
+ }
1846
+
1847
+ .card-body {
1848
+ padding: var(--space-300);
1849
+ display: flex;
1850
+ flex-direction: column;
1851
+ gap: var(--space-100);
1852
+ flex: 1;
1853
+ }
1854
+
1855
+ .card-title {
1856
+ font-family: var(--font-family-main);
1857
+ font-size: var(--font-header-6-size);
1858
+ font-weight: var(--font-header-6-weight);
1859
+ line-height: var(--font-header-6-lineheight);
1860
+ color: var(--fg);
1861
+ }
1862
+
1863
+ .card-description {
1864
+ font-family: var(--font-family-main);
1865
+ font-size: var(--font-body-normal-size);
1866
+ color: var(--fg-secondary);
1867
+ line-height: var(--font-body-normal-lineheight);
1868
+ }
1869
+
1870
+ .card-footer {
1871
+ padding: var(--space-200) var(--space-300);
1872
+ border-top: 1px solid var(--border);
1873
+ display: flex;
1874
+ align-items: center;
1875
+ justify-content: space-between;
1876
+ gap: var(--space-200);
1877
+ }
1878
+
1879
+ /* Compact Card */
1880
+ .card.compact .card-body { padding: var(--space-200); }
1881
+ .card.compact .card-image { aspect-ratio: 4 / 3; }
1882
+
1883
+ /* Overlay Card (3:4 portrait with gradient overlay) */
1884
+ .card.overlay {
1885
+ position: relative;
1886
+ border-radius: var(--radius-200);
1887
+ overflow: hidden;
1888
+ transition: box-shadow var(--duration-normal) var(--ease);
1889
+ }
1890
+
1891
+ .card.overlay:hover { box-shadow: var(--shadow-large); }
1892
+
1893
+ .card-overlay-image {
1894
+ width: 100%;
1895
+ aspect-ratio: 3 / 4;
1896
+ object-fit: cover;
1897
+ display: block;
1898
+ }
1899
+
1900
+ .card-overlay-content {
1901
+ position: absolute;
1902
+ bottom: 0;
1903
+ left: 0;
1904
+ right: 0;
1905
+ padding: var(--space-300);
1906
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.7) 0%, transparent 100%);
1907
+ color: var(--fg-invert);
1908
+ display: flex;
1909
+ flex-direction: column;
1910
+ gap: var(--space-050);
1911
+ }
1912
+
1913
+ .card-overlay-title {
1914
+ font-family: var(--font-family-main);
1915
+ font-size: var(--font-header-6-size);
1916
+ font-weight: var(--font-header-6-weight);
1917
+ line-height: var(--font-header-6-lineheight);
1918
+ }
1919
+
1920
+ .card-overlay-description {
1921
+ font-family: var(--font-family-main);
1922
+ font-size: var(--font-body-normal-size);
1923
+ opacity: 0.85;
1924
+ line-height: var(--font-body-normal-lineheight);
1925
+ }
1926
+
1927
+ /* Merchant Card (391 × 587 desktop / 280 × 420 mobile) */
1928
+ .card.merchant {
1929
+ position: relative;
1930
+ border-radius: var(--radius-200);
1931
+ overflow: hidden;
1932
+ transition: box-shadow var(--duration-normal) var(--ease);
1933
+ }
1934
+
1935
+ .card.merchant:hover { box-shadow: var(--shadow-large); }
1936
+
1937
+ .card-merchant-image {
1938
+ width: 100%;
1939
+ aspect-ratio: 391 / 587;
1940
+ object-fit: cover;
1941
+ display: block;
1942
+ }
1943
+
1944
+ .card-merchant-content {
1945
+ position: absolute;
1946
+ bottom: 0;
1947
+ left: 0;
1948
+ right: 0;
1949
+ padding: var(--space-300);
1950
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.75) 0%, transparent 100%);
1951
+ color: var(--fg-invert);
1952
+ display: flex;
1953
+ flex-direction: column;
1954
+ gap: var(--space-100);
1955
+ }
1956
+
1957
+ /* Merchant Card Compact (391 × 487 desktop / 280 × 362 mobile) */
1958
+ .card.merchant.compact .card-merchant-image { aspect-ratio: 391 / 487; }
1959
+
1960
+ /* Flight Card (square 1:1 — 391px desktop / 280px mobile) */
1961
+ .card.flight {
1962
+ position: relative;
1963
+ border-radius: var(--radius-200);
1964
+ overflow: hidden;
1965
+ aspect-ratio: 1 / 1;
1966
+ transition: box-shadow var(--duration-normal) var(--ease);
1967
+ }
1968
+
1969
+ .card.flight:hover { box-shadow: var(--shadow-large); }
1970
+
1971
+ .card-flight-image {
1972
+ width: 100%;
1973
+ height: 100%;
1974
+ object-fit: cover;
1975
+ display: block;
1976
+ }
1977
+
1978
+ .card-flight-content {
1979
+ position: absolute;
1980
+ bottom: 0;
1981
+ left: 0;
1982
+ right: 0;
1983
+ padding: var(--space-300);
1984
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.75) 0%, transparent 100%);
1985
+ color: var(--fg-invert);
1986
+ display: flex;
1987
+ flex-direction: column;
1988
+ gap: var(--space-050);
1989
+ }
1990
+
1991
+ .card-flight-airline {
1992
+ display: flex;
1993
+ align-items: center;
1994
+ gap: var(--space-150);
1995
+ margin-bottom: var(--space-100);
1996
+ }
1997
+
1998
+ .card-flight-airline-logo {
1999
+ width: var(--size-400);
2000
+ height: var(--size-400);
2001
+ object-fit: contain;
2002
+ border-radius: var(--radius-050);
2003
+ background-color: var(--bg);
2004
+ padding: 2px;
2005
+ box-sizing: border-box;
2006
+ }
2007
+
2008
+ .card-flight-route {
2009
+ font-family: var(--font-family-main);
2010
+ font-size: var(--font-header-6-size);
2011
+ font-weight: var(--font-header-6-weight);
2012
+ line-height: var(--font-header-6-lineheight);
2013
+ }
2014
+
2015
+ .card-flight-info {
2016
+ font-family: var(--font-family-main);
2017
+ font-size: var(--font-body-normal-size);
2018
+ opacity: 0.85;
2019
+ }
2020
+
2021
+ /* Micro Card */
2022
+ .card.micro {
2023
+ display: flex;
2024
+ align-items: center;
2025
+ gap: var(--space-200);
2026
+ padding: var(--space-200);
2027
+ background-color: var(--bg-surface);
2028
+ border: 1px solid var(--border);
2029
+ border-radius: var(--radius-100);
2030
+ transition: border-color var(--duration-fast) var(--ease), box-shadow var(--duration-fast) var(--ease);
2031
+ }
2032
+
2033
+ .card.micro:hover { border-color: var(--border-brand); box-shadow: var(--shadow-medium); }
2034
+
2035
+ .card-micro-image {
2036
+ width: var(--size-700);
2037
+ height: var(--size-700);
2038
+ object-fit: cover;
2039
+ border-radius: var(--radius-100);
2040
+ flex-shrink: 0;
2041
+ }
2042
+
2043
+ .card-micro-body {
2044
+ display: flex;
2045
+ flex-direction: column;
2046
+ gap: var(--space-050);
2047
+ flex: 1;
2048
+ min-width: 0;
2049
+ }
2050
+
2051
+ .card-micro-title {
2052
+ font-family: var(--font-family-main);
2053
+ font-size: var(--font-body-normal-size);
2054
+ font-weight: var(--font-body-large-bold-weight);
2055
+ color: var(--fg);
2056
+ white-space: nowrap;
2057
+ overflow: hidden;
2058
+ text-overflow: ellipsis;
2059
+ }
2060
+
2061
+ .card-micro-description {
2062
+ font-family: var(--font-family-main);
2063
+ font-size: var(--font-body-small-size);
2064
+ color: var(--fg-secondary);
2065
+ }
2066
+
2067
+
2068
+ /* =============================================================================
2069
+ 10. TAGS
2070
+ ============================================================================= */
2071
+
2072
+ .tag {
2073
+ display: inline-flex;
2074
+ align-items: center;
2075
+ gap: var(--space-050);
2076
+ height: var(--size-tag);
2077
+ padding-inline: var(--space-150);
2078
+ border-radius: var(--radius-full);
2079
+ font-family: var(--font-family-main);
2080
+ font-size: var(--font-body-tiny-size);
2081
+ font-weight: var(--font-body-large-bold-weight);
2082
+ line-height: 1;
2083
+ white-space: nowrap;
2084
+ }
2085
+
2086
+ .tag.large {
2087
+ height: var(--size-800);
2088
+ padding-inline: var(--space-300);
2089
+ font-size: var(--font-body-large-size);
2090
+ }
2091
+
2092
+ @media (max-width: 600px) {
2093
+ .tag.large { height: var(--size-600); font-size: var(--font-body-normal-size); }
2094
+ }
2095
+
2096
+ /* Tag colour variants */
2097
+ .tag.default { background-color: var(--bg-fill-neutral); color: var(--fg); }
2098
+ .tag.light { background-color: var(--bg-fill-light); color: var(--fg-secondary); border: 1px solid var(--border); }
2099
+ .tag.gold { background-color: var(--bg-fill-emphasis); color: var(--color-leifur-black); }
2100
+ .tag.white { background-color: var(--bg); color: var(--fg); border: 1px solid var(--border); }
2101
+ .tag.brand { background-color: var(--bg-fill-brand); color: var(--fg-invert); }
2102
+ .tag.warning { background-color: var(--bg-fill-warning); color: var(--color-leifur-black); }
2103
+ .tag.urgent { background-color: var(--bg-fill-urgent); color: var(--fg-invert); }
2104
+ .tag.black { background-color: var(--color-leifur-black); color: var(--fg-invert); }
2105
+ .tag.success { background-color: var(--color-gljafaxi-green-100); color: var(--color-gljafaxi-green-800); }
2106
+
2107
+
2108
+ /* =============================================================================
2109
+ 11. NAVIGATION
2110
+ ============================================================================= */
2111
+
2112
+ /* Nav Menu (primary horizontal nav) */
2113
+ .nav-menu {
2114
+ display: flex;
2115
+ align-items: center;
2116
+ gap: var(--space-050);
2117
+ }
2118
+
2119
+ .nav-menu-item { position: relative; }
2120
+
2121
+ .nav-menu-link {
2122
+ display: flex;
2123
+ align-items: center;
2124
+ gap: var(--space-100);
2125
+ height: var(--size-500);
2126
+ padding-inline: var(--space-200);
2127
+ font-family: var(--font-family-main);
2128
+ font-size: var(--font-body-normal-size);
2129
+ font-weight: var(--font-body-normal-weight);
2130
+ color: var(--fg);
2131
+ text-decoration: none;
2132
+ border-radius: var(--radius-050);
2133
+ white-space: nowrap;
2134
+ transition: background-color var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease);
2135
+ }
2136
+
2137
+ .nav-menu-link:hover { background-color: var(--bg-fill-light); }
2138
+
2139
+ .nav-menu-link.active,
2140
+ .nav-menu-link[aria-current="page"] { font-weight: var(--font-body-large-bold-weight); }
2141
+
2142
+ .nav-menu-dropdown {
2143
+ position: absolute;
2144
+ top: calc(100% + var(--space-100));
2145
+ left: 0;
2146
+ background-color: var(--bg-surface);
2147
+ border: 1px solid var(--border);
2148
+ border-radius: var(--radius-100);
2149
+ box-shadow: var(--shadow-medium);
2150
+ min-width: 200px;
2151
+ padding: var(--space-100) 0;
2152
+ z-index: var(--z-dropdown);
2153
+ }
2154
+
2155
+ .nav-menu-dropdown-item {
2156
+ display: flex;
2157
+ align-items: center;
2158
+ gap: var(--space-150);
2159
+ padding: var(--space-150) var(--space-200);
2160
+ font-family: var(--font-family-main);
2161
+ font-size: var(--font-body-normal-size);
2162
+ color: var(--fg);
2163
+ text-decoration: none;
2164
+ transition: background-color var(--duration-fast) var(--ease);
2165
+ }
2166
+
2167
+ .nav-menu-dropdown-item:hover { background-color: var(--bg-fill-light); }
2168
+
2169
+ /* Secondary Navigation (icon-only bar, 32px items) */
2170
+ .nav-secondary {
2171
+ display: flex;
2172
+ align-items: center;
2173
+ gap: var(--space-100);
2174
+ }
2175
+
2176
+ .nav-secondary-item {
2177
+ display: inline-flex;
2178
+ align-items: center;
2179
+ justify-content: center;
2180
+ width: var(--size-400);
2181
+ height: var(--size-400);
2182
+ border-radius: var(--radius-050);
2183
+ background-color: transparent;
2184
+ border: none;
2185
+ color: var(--fg-secondary);
2186
+ cursor: pointer;
2187
+ text-decoration: none;
2188
+ transition: background-color var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease);
2189
+ }
2190
+
2191
+ .nav-secondary-item:hover { background-color: var(--bg-fill-light); color: var(--fg); }
2192
+ .nav-secondary-item.active,
2193
+ .nav-secondary-item[aria-current="page"] { background-color: var(--bg-fill-neutral); color: var(--fg); }
2194
+
2195
+ .nav-secondary-item svg,
2196
+ .nav-secondary-item img {
2197
+ width: var(--size-300);
2198
+ height: var(--size-300);
2199
+ display: block;
2200
+ }
2201
+
2202
+ /* Language Selector */
2203
+ .nav-language { position: relative; }
2204
+
2205
+ .nav-language-trigger {
2206
+ display: inline-flex;
2207
+ align-items: center;
2208
+ gap: var(--space-100);
2209
+ height: var(--size-400);
2210
+ padding-inline: var(--space-150);
2211
+ border-radius: var(--radius-050);
2212
+ background-color: transparent;
2213
+ border: none;
2214
+ font-family: var(--font-family-main);
2215
+ font-size: var(--font-body-normal-size);
2216
+ color: var(--fg);
2217
+ cursor: pointer;
2218
+ transition: background-color var(--duration-fast) var(--ease);
2219
+ }
2220
+
2221
+ .nav-language-trigger:hover { background-color: var(--bg-fill-light); }
2222
+
2223
+ .nav-language-flag {
2224
+ width: 20px;
2225
+ height: 14px;
2226
+ object-fit: cover;
2227
+ border-radius: 2px;
2228
+ display: block;
2229
+ }
2230
+
2231
+ .nav-language-dropdown {
2232
+ position: absolute;
2233
+ top: calc(100% + var(--space-100));
2234
+ right: 0;
2235
+ width: 140px;
2236
+ background-color: var(--bg-surface);
2237
+ border: 1px solid var(--border);
2238
+ border-radius: var(--radius-100);
2239
+ box-shadow: var(--shadow-medium);
2240
+ padding: var(--space-100) 0;
2241
+ z-index: var(--z-popup);
2242
+ }
2243
+
2244
+ .nav-language-option {
2245
+ display: flex;
2246
+ align-items: center;
2247
+ gap: var(--space-150);
2248
+ padding: var(--space-150) var(--space-200);
2249
+ font-family: var(--font-family-main);
2250
+ font-size: var(--font-body-normal-size);
2251
+ color: var(--fg);
2252
+ text-decoration: none;
2253
+ transition: background-color var(--duration-fast) var(--ease);
2254
+ }
2255
+
2256
+ .nav-language-option:hover { background-color: var(--bg-fill-light); }
2257
+ .nav-language-option.active { font-weight: var(--font-body-large-bold-weight); }
2258
+
2259
+ /* Breadcrumbs */
2260
+ .breadcrumbs {
2261
+ display: flex;
2262
+ align-items: center;
2263
+ flex-wrap: wrap;
2264
+ gap: var(--space-100);
2265
+ list-style: none;
2266
+ padding: 0;
2267
+ margin: 0;
2268
+ }
2269
+
2270
+ .breadcrumb-item {
2271
+ display: flex;
2272
+ align-items: center;
2273
+ gap: var(--space-100);
2274
+ font-family: var(--font-family-main);
2275
+ font-size: var(--font-body-small-size);
2276
+ color: var(--fg-secondary);
2277
+ line-height: var(--font-body-small-lineheight);
2278
+ }
2279
+
2280
+ .breadcrumb-item a { color: var(--fg-secondary); text-decoration: none; transition: color var(--duration-fast) var(--ease); }
2281
+ .breadcrumb-item a:hover { color: var(--fg); text-decoration: underline; }
2282
+
2283
+ .breadcrumb-item:last-child,
2284
+ .breadcrumb-item[aria-current="page"] {
2285
+ color: var(--fg);
2286
+ font-weight: var(--font-body-large-bold-weight);
2287
+ pointer-events: none;
2288
+ }
2289
+
2290
+ .breadcrumb-separator { color: var(--fg-neutral); font-size: 12px; }
2291
+
2292
+ /* Tabs */
2293
+ .tabs { display: flex; flex-direction: row; }
2294
+
2295
+ .tabs-list {
2296
+ display: flex;
2297
+ gap: 0;
2298
+ border-bottom: 1px solid var(--border);
2299
+ overflow-x: auto;
2300
+ scrollbar-width: none;
2301
+ }
2302
+
2303
+ .tabs-list::-webkit-scrollbar { display: none; }
2304
+
2305
+ .tabs-list-sticky {
2306
+ position: sticky;
2307
+ top: 0;
2308
+ z-index: var(--z-raised);
2309
+ background-color: var(--bg-surface);
2310
+ }
2311
+
2312
+ .tab {
2313
+ display: flex;
2314
+ align-items: center;
2315
+ gap: var(--space-100);
2316
+ height: 92px;
2317
+ padding-inline: var(--space-300);
2318
+ font-family: var(--font-family-main);
2319
+ font-size: var(--font-body-normal-size);
2320
+ font-weight: var(--font-body-normal-weight);
2321
+ color: var(--fg-secondary);
2322
+ white-space: nowrap;
2323
+ background: transparent;
2324
+ border: none;
2325
+ border-bottom: 2px solid transparent;
2326
+ margin-bottom: -1px;
2327
+ cursor: pointer;
2328
+ transition: color var(--duration-fast) var(--ease), border-color var(--duration-fast) var(--ease);
2329
+ }
2330
+
2331
+ .tab:hover { color: var(--fg); }
2332
+
2333
+ .tab.active,
2334
+ .tab[aria-selected="true"] {
2335
+ color: var(--fg);
2336
+ font-weight: var(--font-body-large-bold-weight);
2337
+ border-bottom-color: var(--color-leifur-black);
2338
+ }
2339
+
2340
+ .tab-panel { padding-top: var(--space-300); }
2341
+
2342
+ @media (max-width: 768px) {
2343
+ .tab { height: 72px; }
2344
+ }
2345
+
2346
+ /* Filter Bar */
2347
+ .filter-bar {
2348
+ display: flex;
2349
+ align-items: center;
2350
+ gap: var(--space-150);
2351
+ flex-wrap: wrap;
2352
+ }
2353
+
2354
+ .filter-chip {
2355
+ display: inline-flex;
2356
+ align-items: center;
2357
+ gap: var(--space-100);
2358
+ height: var(--size-500);
2359
+ padding-inline: var(--space-200);
2360
+ background-color: var(--bg);
2361
+ border: 1.5px solid var(--border);
2362
+ border-radius: var(--radius-full);
2363
+ font-family: var(--font-family-main);
2364
+ font-size: var(--font-body-normal-size);
2365
+ color: var(--fg);
2366
+ cursor: pointer;
2367
+ white-space: nowrap;
2368
+ transition: border-color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease);
2369
+ }
2370
+
2371
+ .filter-chip:hover { border-color: var(--border-contrast); }
2372
+ .filter-chip.active { background-color: var(--color-leifur-black); border-color: var(--color-leifur-black); color: var(--fg-invert); }
2373
+
2374
+ /* Accordion */
2375
+
2376
+ .accordion {
2377
+ display: flex;
2378
+ flex-direction: column;
2379
+ gap: var(--space-100);
2380
+ }
2381
+
2382
+ .accordion-item {
2383
+ border: 1px solid var(--border);
2384
+ border-radius: var(--radius-100);
2385
+ overflow: hidden;
2386
+ }
2387
+
2388
+ .accordion-item:hover > summary { color: var(--color-primary); }
2389
+
2390
+ .accordion-item > summary {
2391
+ display: flex;
2392
+ align-items: center;
2393
+ justify-content: space-between;
2394
+ gap: 0.5rem;
2395
+ padding: var(--space-200) var(--space-300);
2396
+ cursor: pointer;
2397
+ list-style: none;
2398
+ font-weight: var(--font-body-large-bold-weight);
2399
+ background: var(--bg-surface);
2400
+ }
2401
+
2402
+ /* Custom marker on the right */
2403
+ .accordion-item > summary::after {
2404
+ content: "↓";
2405
+ font-size: 1.2em;
2406
+ flex-shrink: 0;
2407
+ transition: transform 0.2s ease;
2408
+ }
2409
+
2410
+ /* Rotate when open */
2411
+ .accordion-item[open] > summary::after {
2412
+ transform: rotate(-180deg);
2413
+ }
2414
+
2415
+ .accordion-item[open] > summary {
2416
+ border-bottom: 1px solid var(--border);
2417
+ }
2418
+
2419
+ .accordion-body {
2420
+ padding: var(--space-200) var(--space-300);
2421
+ }
2422
+
2423
+ /* Accordion — Airline Logo variant (88px row height, from Figma) */
2424
+ .accordion-airline > .accordion-item > summary {
2425
+ gap: var(--space-300);
2426
+ height: 88px;
2427
+ padding-inline: var(--space-300);
2428
+ }
2429
+
2430
+ .accordion-airline-logo {
2431
+ flex-shrink: 0;
2432
+ width: var(--size-700);
2433
+ height: var(--size-500);
2434
+ object-fit: contain;
2435
+ }
2436
+
2437
+ @media (max-width: 768px) {
2438
+ .accordion-airline > .accordion-item > summary { height: 124px; }
2439
+ }
2440
+
2441
+
2442
+ /* =============================================================================
2443
+ 12. TABLE
2444
+ ============================================================================= */
2445
+
2446
+ .table-wrapper {
2447
+ width: 100%;
2448
+ overflow-x: auto;
2449
+ border-radius: var(--radius-100);
2450
+ border: 1px solid var(--border);
2451
+ }
2452
+
2453
+ .table {
2454
+ width: 100%;
2455
+ border-collapse: collapse;
2456
+ font-family: var(--font-family-main);
2457
+ font-size: var(--font-body-normal-size);
2458
+ }
2459
+
2460
+ .table thead { background-color: var(--bg-fill-light); border-bottom: 1px solid var(--border); }
2461
+
2462
+ .table th {
2463
+ padding: var(--space-150) var(--space-200);
2464
+ text-align: left;
2465
+ font-weight: var(--font-body-large-bold-weight);
2466
+ color: var(--fg);
2467
+ white-space: nowrap;
2468
+ }
2469
+
2470
+ .table td {
2471
+ padding: var(--space-150) var(--space-200);
2472
+ color: var(--fg-secondary);
2473
+ border-bottom: 1px solid var(--border);
2474
+ vertical-align: middle;
2475
+ }
2476
+
2477
+ .table tbody tr:last-child td { border-bottom: none; }
2478
+ .table tbody tr:hover td { background-color: var(--bg-fill-light); }
2479
+
2480
+
2481
+ /* =============================================================================
2482
+ 13. SECTION HEADING
2483
+ ============================================================================= */
2484
+
2485
+ .section-heading {
2486
+ display: flex;
2487
+ flex-direction: column;
2488
+ gap: var(--space-100);
2489
+ }
2490
+
2491
+ .section-heading-eyebrow {
2492
+ font-family: var(--font-family-main);
2493
+ font-size: var(--font-body-small-size);
2494
+ font-weight: var(--font-body-large-bold-weight);
2495
+ color: var(--fg-brand);
2496
+ text-transform: uppercase;
2497
+ letter-spacing: 0.08em;
2498
+ line-height: var(--font-body-small-lineheight);
2499
+ }
2500
+
2501
+ .section-heading-title {
2502
+ font-family: var(--font-family-main);
2503
+ font-size: var(--font-header-3-size);
2504
+ font-weight: var(--font-header-3-weight);
2505
+ line-height: var(--font-header-3-lineheight);
2506
+ color: var(--fg);
2507
+ }
2508
+
2509
+ .section-heading-description {
2510
+ font-family: var(--font-family-main);
2511
+ font-size: var(--font-intro-size);
2512
+ font-weight: var(--font-intro-weight);
2513
+ line-height: var(--font-intro-lineheight);
2514
+ color: var(--fg-secondary);
2515
+ }
2516
+
2517
+ @media (max-width: 600px) {
2518
+ .section-heading-title { font-size: var(--font-header-4-size); line-height: var(--font-header-4-lineheight); }
2519
+ .section-heading-description { font-size: var(--font-body-large-size); }
2520
+ }
2521
+
2522
+
2523
+ /* =============================================================================
2524
+ 14. SITE HEADER
2525
+ ============================================================================= */
2526
+
2527
+ .site-header {
2528
+ position: sticky;
2529
+ top: 0;
2530
+ z-index: var(--z-header);
2531
+ width: 100%;
2532
+ background-color: var(--bg-surface);
2533
+ border-bottom: 1px solid var(--border);
2534
+ }
2535
+
2536
+ .site-header-inner {
2537
+ display: flex;
2538
+ align-items: center;
2539
+ justify-content: space-between;
2540
+ padding-inline: var(--grid-margin);
2541
+ max-width: var(--grid-max-width);
2542
+ margin-inline: auto;
2543
+ box-sizing: border-box;
2544
+ }
2545
+
2546
+ .site-header-logo {
2547
+ display: flex;
2548
+ align-items: center;
2549
+ flex-shrink: 0;
2550
+ }
2551
+
2552
+ .site-header-logo img { height: var(--size-400); display: block; }
2553
+
2554
+ .site-header-nav {
2555
+ display: flex;
2556
+ align-items: center;
2557
+ gap: var(--space-050);
2558
+ block-size: clamp(75px, 10vh, 100px);
2559
+ }
2560
+
2561
+ .site-header-actions {
2562
+ display: flex;
2563
+ align-items: center;
2564
+ gap: var(--space-150);
2565
+ }
2566
+
2567
+ @media (max-width: 768px) {
2568
+ .site-header-nav { display: none; }
2569
+ }
2570
+
2571
+
2572
+ /* =============================================================================
2573
+ 15. SITE FOOTER
2574
+ ============================================================================= */
2575
+
2576
+ .site-footer {
2577
+ width: 100%;
2578
+ background-color: var(--color-leifur-black);
2579
+ color: var(--fg-invert);
2580
+ padding-block: var(--space-800);
2581
+ }
2582
+
2583
+ .site-footer-inner {
2584
+ max-width: var(--grid-max-width);
2585
+ margin-inline: auto;
2586
+ padding-inline: var(--grid-margin);
2587
+ box-sizing: border-box;
2588
+ }
2589
+
2590
+ .site-footer-grid {
2591
+ display: grid;
2592
+ grid-template-columns: repeat(4, 1fr);
2593
+ gap: var(--space-400);
2594
+ }
2595
+
2596
+ .site-footer-logo { display: flex; align-items: center; margin-bottom: var(--space-300); }
2597
+ .site-footer-logo img { height: var(--size-400); display: block; filter: brightness(0) invert(1); }
2598
+
2599
+ .site-footer-heading {
2600
+ font-family: var(--font-family-main);
2601
+ font-size: var(--font-body-normal-size);
2602
+ font-weight: var(--font-body-large-bold-weight);
2603
+ color: var(--fg-invert);
2604
+ margin-bottom: var(--space-150);
2605
+ text-transform: uppercase;
2606
+ letter-spacing: 0.06em;
2607
+ }
2608
+
2609
+ .site-footer-links {
2610
+ list-style: none;
2611
+ padding: 0;
2612
+ margin: 0;
2613
+ display: flex;
2614
+ flex-direction: column;
2615
+ gap: var(--space-100);
2616
+ }
2617
+
2618
+ .site-footer-link {
2619
+ font-family: var(--font-family-main);
2620
+ font-size: var(--font-body-normal-size);
2621
+ color: var(--color-leifur-black-300);
2622
+ text-decoration: none;
2623
+ transition: color var(--duration-fast) var(--ease);
2624
+ }
2625
+
2626
+ .site-footer-link:hover { color: var(--fg-invert); }
2627
+
2628
+ .site-footer-divider {
2629
+ border: none;
2630
+ border-top: 1px solid var(--color-leifur-black-700);
2631
+ margin-block: var(--space-400);
2632
+ }
2633
+
2634
+ .site-footer-bottom {
2635
+ display: flex;
2636
+ align-items: center;
2637
+ justify-content: space-between;
2638
+ gap: var(--space-200);
2639
+ flex-wrap: wrap;
2640
+ font-family: var(--font-family-main);
2641
+ font-size: var(--font-body-small-size);
2642
+ color: var(--color-leifur-black-300);
2643
+ }
2644
+
2645
+ @media (max-width: 768px) {
2646
+ .site-footer-grid { grid-template-columns: 1fr 1fr; gap: var(--space-300); }
2647
+ }
2648
+
2649
+ @media (max-width: 480px) {
2650
+ .site-footer-grid { grid-template-columns: 1fr; }
2651
+ }
2652
+
2653
+
2654
+ /* =============================================================================
2655
+ REDUCED MOTION
2656
+ ============================================================================= */
2657
+
2658
+ @media (prefers-reduced-motion: reduce) {
2659
+ *, *::before, *::after {
2660
+ transition-duration: 0.01ms !important;
2661
+ animation-duration: 0.01ms !important;
2662
+ animation-iteration-count: 1 !important;
2663
+ }
2664
+ }