iobroker.jetframe 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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +357 -0
  3. package/admin/SF-Pro.ttf +0 -0
  4. package/admin/admin.d.ts +65 -0
  5. package/admin/frame.html +982 -0
  6. package/admin/frame.html.bak-aircraft-card-real-row-20260518-1608 +1236 -0
  7. package/admin/frame.html.bak-aircraft-card-structure-20260518-1517 +1236 -0
  8. package/admin/frame.html.bak-aircraft-logo-id-fix-20260518-1639 +1239 -0
  9. package/admin/frame.html.bak-shortcut-test +1236 -0
  10. package/admin/frame.html.bak-tablet-class-20260518-1729 +1239 -0
  11. package/admin/heatmap.html +216 -0
  12. package/admin/index.html +268 -0
  13. package/admin/index_m.html +1749 -0
  14. package/admin/jetframe.css +1260 -0
  15. package/admin/jetframe.css.bak-airbus-landscape-fix +4630 -0
  16. package/admin/jetframe.css.bak-aircraft-card-clean-equal-20260518-1438 +4899 -0
  17. package/admin/jetframe.css.bak-aircraft-card-real-row-20260518-1608 +4814 -0
  18. package/admin/jetframe.css.bak-aircraft-card-row-left-20260518-1525 +4604 -0
  19. package/admin/jetframe.css.bak-aircraft-card-slim-equal-20260518-1446 +4647 -0
  20. package/admin/jetframe.css.bak-aircraft-card-structure-20260518-1517 +4646 -0
  21. package/admin/jetframe.css.bak-aircraft-inline-final-20260518-1527 +4654 -0
  22. package/admin/jetframe.css.bak-aircraft-row-compact-fix-20260518-1639 +4763 -0
  23. package/admin/jetframe.css.bak-before-aircrafttype-purge +4818 -0
  24. package/admin/jetframe.css.bak-before-cleanup +4670 -0
  25. package/admin/jetframe.css.bak-before-remove-tablet-only-20260518-1711 +4896 -0
  26. package/admin/jetframe.css.bak-before-tablet-layout-rework-20260518-1650 +4914 -0
  27. package/admin/jetframe.css.bak-clean-duplicate-fonts-20260518-1340 +4975 -0
  28. package/admin/jetframe.css.bak-clean-old-index-fix-20260518-1937 +5167 -0
  29. package/admin/jetframe.css.bak-hardleft-airbus +4751 -0
  30. package/admin/jetframe.css.bak-index-iphone-landscape-20260518-1931 +5030 -0
  31. package/admin/jetframe.css.bak-index-landscape-final-20260518-1941 +5167 -0
  32. package/admin/jetframe.css.bak-index-landscape-real-20260518-1936 +5186 -0
  33. package/admin/jetframe.css.bak-landscape-compact-jumbo-bold-20260518-1343 +4802 -0
  34. package/admin/jetframe.css.bak-logo-align-final +4551 -0
  35. package/admin/jetframe.css.bak-logo-final2 +4551 -0
  36. package/admin/jetframe.css.bak-narrowbody-font-fix +4992 -0
  37. package/admin/jetframe.css.bak-nuke-airbus-align +4790 -0
  38. package/admin/jetframe.css.bak-pill-balance-20260518-1603 +4773 -0
  39. package/admin/jetframe.css.bak-pill-balance-fix +4910 -0
  40. package/admin/jetframe.css.bak-radar-fix-fonts +4710 -0
  41. package/admin/jetframe.css.bak-shortcut-test +4899 -0
  42. package/admin/jetframe.css.bak-smaller-aircraft-card-fonts-20260518-1345 +4897 -0
  43. package/admin/jetframe.css.bak-tablet-fix-real-20260518-1748 +4945 -0
  44. package/admin/jetframe.css.bak-tablet-fullscreen-fix-20260518-1804 +4972 -0
  45. package/admin/jetframe.css.bak-tablet-landscape-layout-20260518-1645 +4802 -0
  46. package/admin/jetframe.css.bak-tablet-layout-final-20260518-1839 +4802 -0
  47. package/admin/jetframe.css.bak-tablet-layout-v3-20260518-1729 +4802 -0
  48. package/admin/jetframe.css.bak-tablet-layout-v4-20260518-1801 +4957 -0
  49. package/admin/jetframe.css.bak-tablet-layout-v5-20260518-1843 +4970 -0
  50. package/admin/jetframe.css.bak-tablet-layout-v6-20260518-1848 +4958 -0
  51. package/admin/jetframe.css.bak-tablet-layout-v7-20260518-1909 +4985 -0
  52. package/admin/jetframe.css.bak-tablet-only-landscape-v2-20260518-1707 +4802 -0
  53. package/admin/jetframe.css.bak-tablet-pages-final-20260519-1857 +5188 -0
  54. package/admin/jetframe.css.bak-tablet-pages-final-20260519-1859 +5347 -0
  55. package/admin/jetframe.css.bak-tablet-pages-v2-20260519-190807 +5349 -0
  56. package/admin/jetframe.css.bak-typography-align-final +4818 -0
  57. package/admin/jetframe.png +0 -0
  58. package/admin/manifest.webmanifest +15 -0
  59. package/admin/src/app.tsx +58 -0
  60. package/admin/src/components/settings.tsx +97 -0
  61. package/admin/src/i18n/de.json +11 -0
  62. package/admin/src/i18n/en.json +11 -0
  63. package/admin/src/i18n/es.json +11 -0
  64. package/admin/src/i18n/fr.json +11 -0
  65. package/admin/src/i18n/i18n.d.ts +28 -0
  66. package/admin/src/i18n/it.json +11 -0
  67. package/admin/src/i18n/nl.json +11 -0
  68. package/admin/src/i18n/pl.json +11 -0
  69. package/admin/src/i18n/pt.json +11 -0
  70. package/admin/src/i18n/ru.json +11 -0
  71. package/admin/src/i18n/uk.json +11 -0
  72. package/admin/src/i18n/zh-cn.json +11 -0
  73. package/admin/src/index.tsx +25 -0
  74. package/admin/stats.html +228 -0
  75. package/admin/style.css +32 -0
  76. package/admin/tsconfig.json +11 -0
  77. package/admin/words.js +46 -0
  78. package/build/lib/adsb.js +218 -0
  79. package/build/lib/adsb.js.map +7 -0
  80. package/build/lib/airportNamesDe.js +131 -0
  81. package/build/lib/airportNamesDe.js.map +7 -0
  82. package/build/lib/airports.js +281 -0
  83. package/build/lib/airports.js.map +7 -0
  84. package/build/lib/classify.js +339 -0
  85. package/build/lib/classify.js.map +7 -0
  86. package/build/lib/config.js +103 -0
  87. package/build/lib/config.js.map +7 -0
  88. package/build/lib/flightInfo.js +1409 -0
  89. package/build/lib/flightInfo.js.map +7 -0
  90. package/build/lib/geo.js +84 -0
  91. package/build/lib/geo.js.map +7 -0
  92. package/build/lib/images.js +422 -0
  93. package/build/lib/images.js.map +7 -0
  94. package/build/lib/specialLiveries.js +342 -0
  95. package/build/lib/specialLiveries.js.map +7 -0
  96. package/build/lib/states.js +971 -0
  97. package/build/lib/states.js.map +7 -0
  98. package/build/lib/staticFiles.js +73 -0
  99. package/build/lib/staticFiles.js.map +7 -0
  100. package/build/lib/types.js +17 -0
  101. package/build/lib/types.js.map +7 -0
  102. package/build/lib/visConfig.js +52 -0
  103. package/build/lib/visConfig.js.map +7 -0
  104. package/build/main.js +1454 -0
  105. package/build/main.js.map +7 -0
  106. package/io-package.json +169 -0
  107. package/package.json +82 -0
@@ -0,0 +1,4970 @@
1
+ /* ==================================================
2
+ JetFrame Unified Clean CSS
3
+ ================================================== */
4
+
5
+ :root {
6
+ --bg: #05060a;
7
+ --muted: rgba(255,255,255,.62);
8
+ --green: #35e66b;
9
+ --blue: #56a8ff;
10
+ --yellow: #ffd84d;
11
+ --red: #ff5a5a;
12
+ }
13
+
14
+ * {
15
+ box-sizing: border-box;
16
+ -webkit-tap-highlight-color: transparent;
17
+ }
18
+
19
+ html,
20
+ body {
21
+ margin: 0;
22
+ width: 100%;
23
+ height: 100%;
24
+ min-height: 100dvh;
25
+ overflow: hidden;
26
+ background: var(--bg);
27
+ color: white;
28
+ font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Helvetica Neue", Arial, sans-serif;
29
+ }
30
+
31
+ html,
32
+ body{
33
+ touch-action:pan-x pan-y;
34
+ overscroll-behavior:none;
35
+ }
36
+
37
+ body {
38
+ background:
39
+ radial-gradient(circle at 18% 8%, rgba(70,110,180,.38), transparent 38%),
40
+ radial-gradient(circle at 85% 22%, rgba(255,150,60,.18), transparent 34%),
41
+ linear-gradient(145deg, #090b11, #020306 72%);
42
+ }
43
+
44
+ #app {
45
+ width: 100vw;
46
+ height: 100dvh;
47
+ padding:
48
+ calc(10px + env(safe-area-inset-top))
49
+ calc(10px + env(safe-area-inset-right))
50
+ calc(10px + env(safe-area-inset-bottom))
51
+ calc(10px + env(safe-area-inset-left));
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ overflow: hidden;
56
+ }
57
+
58
+ .card,
59
+ .wall,
60
+ .jf-shell {
61
+ width: min(1280px, 96vw);
62
+ height: min(820px, calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom) - 20px));
63
+ border-radius: 32px;
64
+ padding: 16px;
65
+ background: linear-gradient(145deg, rgba(62,70,90,.58), rgba(18,18,20,.80));
66
+ border: 1px solid rgba(255,255,255,.18);
67
+ box-shadow:
68
+ 0 35px 100px rgba(0,0,0,.58),
69
+ inset 0 1px 0 rgba(255,255,255,.22);
70
+ backdrop-filter: blur(24px);
71
+ -webkit-backdrop-filter: blur(24px);
72
+ overflow: hidden;
73
+ position: relative;
74
+ }
75
+
76
+ @media (orientation: portrait) {
77
+ .card,
78
+ .wall,
79
+ .jf-shell {
80
+ width: 96vw;
81
+ height: calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom) - 20px);
82
+ border-radius: 30px;
83
+ }
84
+ }
85
+
86
+ /* ==================================================
87
+ Common
88
+ ================================================== */
89
+
90
+ .backBtn {
91
+ position: fixed;
92
+ top: calc(env(safe-area-inset-top) + 10px);
93
+ left: calc(env(safe-area-inset-left) + 10px);
94
+ width: 34px;
95
+ height: 34px;
96
+ border-radius: 999px;
97
+ display: flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ background: rgba(0,0,0,.22);
101
+ backdrop-filter: blur(16px);
102
+ -webkit-backdrop-filter: blur(16px);
103
+ border: 1px solid rgba(255,255,255,.10);
104
+ color: rgba(255,255,255,.86);
105
+ font-size: 24px;
106
+ font-weight: 900;
107
+ text-decoration: none;
108
+ z-index: 9999;
109
+ opacity: .72;
110
+ }
111
+
112
+ .simpleApiWarning {
113
+ position: fixed;
114
+ left: 50%;
115
+ bottom: calc(env(safe-area-inset-bottom) + 18px);
116
+ transform: translateX(-50%) translateY(12px);
117
+ z-index: 99999;
118
+ max-width: min(92vw, 560px);
119
+ padding: 12px 16px;
120
+ border-radius: 18px;
121
+ background: rgba(255,90,90,.18);
122
+ border: 1px solid rgba(255,90,90,.34);
123
+ color: rgba(255,235,235,.96);
124
+ box-shadow: 0 18px 50px rgba(0,0,0,.45);
125
+ backdrop-filter: blur(18px);
126
+ -webkit-backdrop-filter: blur(18px);
127
+ font-size: 14px;
128
+ font-weight: 800;
129
+ line-height: 1.25;
130
+ text-align: center;
131
+ opacity: 0;
132
+ pointer-events: none;
133
+ transition: opacity .25s ease, transform .25s ease;
134
+ }
135
+
136
+ .simpleApiWarning.visible {
137
+ opacity: 1;
138
+ transform: translateX(-50%) translateY(0);
139
+ }
140
+
141
+ /* ==================================================
142
+ Frame / Live
143
+ ================================================== */
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+ /* ==================================================
188
+ Heatmap
189
+ ================================================== */
190
+
191
+ body.jf-page-heatmap .jf-shell {
192
+ display: grid;
193
+ grid-template-rows: auto auto auto minmax(0, 1fr) 160px;
194
+ gap: 9px;
195
+ }
196
+
197
+ body.jf-page-heatmap .header {
198
+ display: grid;
199
+ grid-template-columns: minmax(0,1fr) auto;
200
+ align-items: center;
201
+ gap: 12px;
202
+ }
203
+
204
+ body.jf-page-heatmap .title {
205
+ font-size: clamp(25px, 5vw, 42px);
206
+ font-weight: 950;
207
+ letter-spacing: -.055em;
208
+ line-height: .95;
209
+ }
210
+
211
+ body.jf-page-heatmap .sub {
212
+ margin-top: 4px;
213
+ color: var(--muted);
214
+ font-size: clamp(12px, 1.6vw, 16px);
215
+ font-weight: 700;
216
+ }
217
+
218
+ body.jf-page-heatmap .livePill {
219
+ padding: 7px 13px;
220
+ border-radius: 999px;
221
+ background: rgba(53,230,107,.13);
222
+ border: 1px solid rgba(53,230,107,.28);
223
+ color: rgba(210,255,225,.92);
224
+ font-size: 12px;
225
+ font-weight: 900;
226
+ white-space: nowrap;
227
+ }
228
+
229
+ body.jf-page-heatmap .stats {
230
+ display: grid;
231
+ grid-template-columns: repeat(4, minmax(0, 1fr));
232
+ gap: 8px;
233
+ }
234
+
235
+ body.jf-page-heatmap .stat {
236
+ min-height: 44px;
237
+ border-radius: 18px;
238
+ background: rgba(255,255,255,.07);
239
+ border: 1px solid rgba(255,255,255,.12);
240
+ display: flex;
241
+ flex-direction: column;
242
+ align-items: center;
243
+ justify-content: center;
244
+ padding: 5px 6px;
245
+ overflow: hidden;
246
+ }
247
+
248
+ body.jf-page-heatmap .value {
249
+ font-size: clamp(24px, 5vw, 38px);
250
+ font-weight: 950;
251
+ letter-spacing: -.05em;
252
+ line-height: .9;
253
+ }
254
+
255
+ body.jf-page-heatmap .label {
256
+ margin-top: 4px;
257
+ font-size: 7px;
258
+ letter-spacing: .13em;
259
+ color: var(--muted);
260
+ font-weight: 850;
261
+ white-space: nowrap;
262
+ }
263
+
264
+ body.jf-page-heatmap .rush {
265
+ min-height: 38px;
266
+ max-height: 42px;
267
+ border-radius: 18px;
268
+ padding: 7px 12px;
269
+ background: rgba(255,216,77,.10);
270
+ border: 1px solid rgba(255,216,77,.22);
271
+ color: rgba(255,240,170,.94);
272
+ font-size: clamp(13px, 2.4vw, 18px);
273
+ font-weight: 900;
274
+ display: flex;
275
+ align-items: center;
276
+ justify-content: space-between;
277
+ gap: 10px;
278
+ white-space: nowrap;
279
+ overflow: hidden;
280
+ }
281
+
282
+ body.jf-page-heatmap .rush span {
283
+ min-width: 0;
284
+ overflow: hidden;
285
+ text-overflow: ellipsis;
286
+ }
287
+
288
+ body.jf-page-heatmap .scroller {
289
+ min-height: 0;
290
+ height: 100%;
291
+ display: flex;
292
+ align-items: stretch;
293
+ gap: 12px;
294
+ overflow-x: auto;
295
+ overflow-y: hidden;
296
+ scroll-snap-type: x mandatory;
297
+ padding: 0 4px 4px;
298
+ -webkit-overflow-scrolling: touch;
299
+ }
300
+
301
+ body.jf-page-heatmap .scroller::-webkit-scrollbar {
302
+ display: none;
303
+ }
304
+
305
+ body.jf-page-heatmap .hourCard {
306
+ scroll-snap-align: center;
307
+ flex: 0 0 min(430px, 74vw);
308
+ height: 100%;
309
+ min-height: 0;
310
+ border-radius: 26px;
311
+ padding: 16px;
312
+ background: rgba(255,255,255,.075);
313
+ border: 1px solid rgba(255,255,255,.12);
314
+ position: relative;
315
+ overflow: hidden;
316
+ display: flex;
317
+ align-items: stretch;
318
+ }
319
+
320
+ body.jf-page-heatmap .hourCard::before {
321
+ content: "";
322
+ position: absolute;
323
+ inset: 0;
324
+ opacity: var(--heat, .08);
325
+ background:
326
+ radial-gradient(circle at 50% 0%, rgba(53,230,107,.9), transparent 62%),
327
+ linear-gradient(145deg, rgba(86,168,255,.7), rgba(255,216,77,.6));
328
+ pointer-events: none;
329
+ }
330
+
331
+ body.jf-page-heatmap .hourCard.now {
332
+ border-color: rgba(53,230,107,.4);
333
+ box-shadow: 0 0 28px rgba(53,230,107,.16);
334
+ }
335
+
336
+ body.jf-page-heatmap .hourInner {
337
+ position: relative;
338
+ z-index: 2;
339
+ width: 100%;
340
+ display: flex;
341
+ flex-direction: column;
342
+ }
343
+
344
+ body.jf-page-heatmap .hourTop {
345
+ display: flex;
346
+ justify-content: space-between;
347
+ align-items: center;
348
+ gap: 12px;
349
+ }
350
+
351
+ body.jf-page-heatmap .hour {
352
+ font-size: clamp(34px, 8vw, 66px);
353
+ font-weight: 950;
354
+ letter-spacing: -.055em;
355
+ line-height: .95;
356
+ }
357
+
358
+ body.jf-page-heatmap .badge {
359
+ padding: 5px 9px;
360
+ border-radius: 999px;
361
+ background: rgba(0,0,0,.22);
362
+ border: 1px solid rgba(255,255,255,.13);
363
+ color: rgba(255,255,255,.78);
364
+ font-size: clamp(10px, 1.7vw, 14px);
365
+ font-weight: 850;
366
+ white-space: nowrap;
367
+ }
368
+
369
+ body.jf-page-heatmap .hourTotal {
370
+ font-size: clamp(78px, 17vw, 138px);
371
+ line-height: .82;
372
+ font-weight: 950;
373
+ letter-spacing: -.075em;
374
+ margin-top: auto;
375
+ }
376
+
377
+ body.jf-page-heatmap .hourSub {
378
+ margin-top: 8px;
379
+ color: var(--muted);
380
+ font-size: clamp(16px, 3.2vw, 26px);
381
+ font-weight: 800;
382
+ }
383
+
384
+ body.jf-page-heatmap .bars {
385
+ display: grid;
386
+ grid-template-columns: repeat(3, 1fr);
387
+ gap: 8px;
388
+ margin-top: auto;
389
+ }
390
+
391
+ body.jf-page-heatmap .bar {
392
+ height: 42px;
393
+ border-radius: 14px;
394
+ background: rgba(255,255,255,.10);
395
+ border: 1px solid rgba(255,255,255,.12);
396
+ display: flex;
397
+ align-items: center;
398
+ justify-content: center;
399
+ font-weight: 900;
400
+ font-size: clamp(12px, 2.2vw, 18px);
401
+ }
402
+
403
+ body.jf-page-heatmap .rankings {
404
+ min-height: 0;
405
+ display: grid;
406
+ grid-template-columns: 1fr 1fr;
407
+ gap: 10px;
408
+ }
409
+
410
+ body.jf-page-heatmap .panel {
411
+ min-height: 0;
412
+ height: 100%;
413
+ border-radius: 20px;
414
+ background: rgba(255,255,255,.075);
415
+ border: 1px solid rgba(255,255,255,.12);
416
+ padding: 12px 14px;
417
+ overflow: hidden;
418
+ }
419
+
420
+ body.jf-page-heatmap .panel h3 {
421
+ margin: 0 0 8px;
422
+ font-size: clamp(13px, 2vw, 17px);
423
+ letter-spacing: .10em;
424
+ color: var(--muted);
425
+ text-transform: uppercase;
426
+ }
427
+
428
+ body.jf-page-heatmap .panel pre {
429
+ margin: 0;
430
+ white-space: pre-wrap;
431
+ font-family: inherit;
432
+ font-size: clamp(12px, 1.8vw, 16px);
433
+ line-height: 1.18;
434
+ font-weight: 800;
435
+ color: rgba(255,255,255,.90);
436
+ }
437
+
438
+ body.jf-page-heatmap .footer {
439
+ display: none;
440
+ }
441
+
442
+ @media (orientation: landscape) {
443
+ body.jf-page-heatmap .jf-shell {
444
+ padding: 14px 26px !important;
445
+ grid-template-rows: auto auto auto minmax(0, 1fr) 108px !important;
446
+ gap: 8px !important;
447
+ }
448
+
449
+ body.jf-page-heatmap .stats {
450
+ grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
451
+ gap: 10px !important;
452
+ }
453
+
454
+ body.jf-page-heatmap .stat {
455
+ min-height: 48px !important;
456
+ border-radius: 17px !important;
457
+ padding: 4px 8px !important;
458
+ }
459
+
460
+ body.jf-page-heatmap .value {
461
+ font-size: clamp(24px, 3.1vw, 34px) !important;
462
+ }
463
+
464
+ body.jf-page-heatmap .rush {
465
+ min-height: 34px !important;
466
+ max-height: 36px !important;
467
+ padding: 6px 14px !important;
468
+ font-size: clamp(13px, 1.55vw, 18px) !important;
469
+ }
470
+
471
+ body.jf-page-heatmap .hourCard {
472
+ flex: 0 0 min(340px, 32vw) !important;
473
+ border-radius: 22px !important;
474
+ padding: 15px 18px !important;
475
+ }
476
+
477
+ body.jf-page-heatmap .hour {
478
+ font-size: clamp(30px, 3.8vw, 50px) !important;
479
+ }
480
+
481
+ body.jf-page-heatmap .hourTotal {
482
+ font-size: clamp(58px, 6.8vw, 92px) !important;
483
+ }
484
+
485
+ body.jf-page-heatmap .hourSub {
486
+ font-size: clamp(14px, 1.7vw, 20px) !important;
487
+ }
488
+
489
+ body.jf-page-heatmap .bar {
490
+ height: 34px !important;
491
+ border-radius: 12px !important;
492
+ font-size: 13px !important;
493
+ }
494
+
495
+ body.jf-page-heatmap .rankings {
496
+ height: 108px !important;
497
+ }
498
+
499
+ body.jf-page-heatmap .panel {
500
+ border-radius: 18px !important;
501
+ padding: 10px 14px !important;
502
+ }
503
+
504
+ body.jf-page-heatmap .panel h3 {
505
+ font-size: 12px !important;
506
+ margin-bottom: 5px !important;
507
+ }
508
+
509
+ body.jf-page-heatmap .panel pre {
510
+ font-size: clamp(11px, 1.25vw, 14px) !important;
511
+ line-height: 1.12 !important;
512
+ }
513
+ }
514
+
515
+
516
+ /* ==================================================
517
+ Stats
518
+ ================================================== */
519
+
520
+ body.jf-page-stats .jf-shell {
521
+ display: grid;
522
+ grid-template-rows: auto auto 1fr;
523
+ gap: 10px;
524
+ }
525
+
526
+ body.jf-page-stats .header {
527
+ display: flex;
528
+ align-items: flex-start;
529
+ justify-content: space-between;
530
+ gap: 12px;
531
+ }
532
+
533
+ body.jf-page-stats .title {
534
+ font-size: clamp(24px, 4.5vw, 42px);
535
+ font-weight: 950;
536
+ letter-spacing: -.055em;
537
+ line-height: .95;
538
+ }
539
+
540
+ body.jf-page-stats .sub {
541
+ margin-top: 4px;
542
+ color: var(--muted);
543
+ font-size: clamp(12px, 1.6vw, 16px);
544
+ font-weight: 700;
545
+ }
546
+
547
+ body.jf-page-stats .grid {
548
+ display: grid;
549
+ grid-template-columns: repeat(3, 1fr);
550
+ gap: 10px;
551
+ }
552
+
553
+ body.jf-page-stats .stat {
554
+ min-height: 78px;
555
+ border-radius: 22px;
556
+ background: rgba(255,255,255,.075);
557
+ border: 1px solid rgba(255,255,255,.12);
558
+ padding: 12px;
559
+ display: flex;
560
+ flex-direction: column;
561
+ justify-content: center;
562
+ overflow: hidden;
563
+ }
564
+
565
+ body.jf-page-stats .stat.big {
566
+ background: linear-gradient(145deg, rgba(86,168,255,.20), rgba(53,230,107,.11));
567
+ }
568
+
569
+ body.jf-page-stats .stat.warn {
570
+ background: linear-gradient(145deg, rgba(255,216,77,.20), rgba(255,90,90,.10));
571
+ }
572
+
573
+ body.jf-page-stats .label {
574
+ color: var(--muted);
575
+ font-size: 10px;
576
+ font-weight: 850;
577
+ letter-spacing: .13em;
578
+ text-transform: uppercase;
579
+ white-space: nowrap;
580
+ }
581
+
582
+ body.jf-page-stats .value {
583
+ margin-top: 5px;
584
+ font-size: clamp(24px, 4vw, 42px);
585
+ font-weight: 950;
586
+ line-height: .9;
587
+ letter-spacing: -.055em;
588
+ white-space: nowrap;
589
+ overflow: hidden;
590
+ text-overflow: ellipsis;
591
+ }
592
+
593
+ body.jf-page-stats .small {
594
+ margin-top: 4px;
595
+ color: var(--muted);
596
+ font-size: 12px;
597
+ font-weight: 700;
598
+ white-space: nowrap;
599
+ overflow: hidden;
600
+ text-overflow: ellipsis;
601
+ }
602
+
603
+ body.jf-page-stats .panels {
604
+ min-height: 0;
605
+ display: grid;
606
+ grid-template-columns: 1fr 1fr;
607
+ grid-template-rows: 1fr 1fr;
608
+ gap: 10px;
609
+ }
610
+
611
+ body.jf-page-stats .panel {
612
+ min-height: 0;
613
+ border-radius: 22px;
614
+ background: rgba(255,255,255,.07);
615
+ border: 1px solid rgba(255,255,255,.11);
616
+ padding: 12px;
617
+ overflow: hidden;
618
+ }
619
+
620
+ body.jf-page-stats .panel h3 {
621
+ margin: 0 0 8px;
622
+ color: var(--muted);
623
+ font-size: 12px;
624
+ font-weight: 900;
625
+ letter-spacing: .12em;
626
+ text-transform: uppercase;
627
+ }
628
+
629
+ body.jf-page-stats .panel pre {
630
+ margin: 0;
631
+ font-family: inherit;
632
+ font-size: clamp(10px, 1.4vw, 15px);
633
+ line-height: 1.22;
634
+ font-weight: 760;
635
+ color: rgba(255,255,255,.9);
636
+ white-space: pre-wrap;
637
+ }
638
+
639
+ @media (orientation: portrait) {
640
+ body.jf-page-stats .grid {
641
+ grid-template-columns: repeat(2, 1fr);
642
+ }
643
+
644
+ body.jf-page-stats .panels {
645
+ grid-template-columns: 1fr;
646
+ grid-template-rows: repeat(4, 1fr);
647
+ }
648
+ }
649
+
650
+
651
+
652
+ /* ==================================================
653
+ Home
654
+ ================================================== */
655
+
656
+ body.jf-page-home .jf-shell {
657
+ display: flex;
658
+ flex-direction: column;
659
+ gap: 18px;
660
+ }
661
+
662
+ body.jf-page-home .hero {
663
+ flex: 1 1 auto;
664
+ display: flex;
665
+ flex-direction: column;
666
+ justify-content: center;
667
+ min-height: 0;
668
+ }
669
+
670
+ body.jf-page-home .logo {
671
+ font-size: clamp(54px, 14vw, 96px);
672
+ line-height: .9;
673
+ margin-bottom: 14px;
674
+ }
675
+
676
+ body.jf-page-home h1 {
677
+ margin: 0;
678
+ font-size: clamp(42px, 11vw, 76px);
679
+ line-height: .88;
680
+ letter-spacing: -.07em;
681
+ font-weight: 950;
682
+ }
683
+
684
+ body.jf-page-home .sub {
685
+ margin-top: 14px;
686
+ color: var(--muted);
687
+ font-size: clamp(17px, 4vw, 28px);
688
+ font-weight: 750;
689
+ }
690
+
691
+ body.jf-page-home .status,
692
+ body.jf-page-home [id="statusText"] {
693
+ display: inline-flex;
694
+ align-items: center;
695
+ justify-content: center;
696
+ width: fit-content;
697
+ max-width: 92%;
698
+ margin: 18px auto 0 auto;
699
+ padding: 9px 18px;
700
+ border-radius: 999px;
701
+ background: rgba(53,230,107,.13);
702
+ border: 1px solid rgba(53,230,107,.28);
703
+ color: rgba(210,255,225,.94);
704
+ font-size: clamp(11px, 2vw, 15px);
705
+ font-weight: 850;
706
+ line-height: 1;
707
+ white-space: nowrap;
708
+ overflow: hidden;
709
+ text-overflow: ellipsis;
710
+ }
711
+
712
+ body.jf-page-home .buttons {
713
+ display: grid;
714
+ grid-template-columns: 1fr;
715
+ gap: 12px;
716
+ }
717
+
718
+ body.jf-page-home a {
719
+ text-decoration: none;
720
+ color: white;
721
+ }
722
+
723
+ body.jf-page-home .btn {
724
+ border-radius: 26px;
725
+ padding: 20px;
726
+ background: rgba(255,255,255,.085);
727
+ border: 1px solid rgba(255,255,255,.14);
728
+ display: flex;
729
+ align-items: center;
730
+ justify-content: space-between;
731
+ gap: 14px;
732
+ box-shadow: inset 0 1px 0 rgba(255,255,255,.12);
733
+ }
734
+
735
+ body.jf-page-home .btn.primary {
736
+ background: linear-gradient(145deg, rgba(86,168,255,.40), rgba(53,230,107,.24));
737
+ border-color: rgba(86,168,255,.34);
738
+ }
739
+
740
+ body.jf-page-home .btn.heat {
741
+ background: linear-gradient(145deg, rgba(255,216,77,.32), rgba(255,90,90,.20));
742
+ border-color: rgba(255,216,77,.30);
743
+ }
744
+
745
+ body.jf-page-home .btnTitle {
746
+ font-size: clamp(22px, 5vw, 34px);
747
+ font-weight: 920;
748
+ letter-spacing: -.035em;
749
+ }
750
+
751
+ body.jf-page-home .btnSub {
752
+ margin-top: 4px;
753
+ color: var(--muted);
754
+ font-size: clamp(12px, 2.8vw, 16px);
755
+ font-weight: 700;
756
+ }
757
+
758
+ body.jf-page-home .arrow {
759
+ font-size: 28px;
760
+ font-weight: 700;
761
+ color: rgba(255,255,255,.82);
762
+ }
763
+
764
+ body.jf-page-home .stats {
765
+ display: grid;
766
+ grid-template-columns: repeat(3, 1fr);
767
+ gap: 10px;
768
+ }
769
+
770
+ body.jf-page-home .stat {
771
+ min-height: 70px;
772
+ border-radius: 20px;
773
+ background: rgba(255,255,255,.075);
774
+ border: 1px solid rgba(255,255,255,.12);
775
+ display: flex;
776
+ flex-direction: column;
777
+ align-items: center;
778
+ justify-content: center;
779
+ }
780
+
781
+ body.jf-page-home .value {
782
+ font-size: clamp(28px, 6vw, 46px);
783
+ font-weight: 950;
784
+ line-height: .9;
785
+ letter-spacing: -.05em;
786
+ }
787
+
788
+ body.jf-page-home .label {
789
+ margin-top: 5px;
790
+ font-size: 10px;
791
+ letter-spacing: .16em;
792
+ color: var(--muted);
793
+ font-weight: 850;
794
+ }
795
+
796
+ body.jf-page-home .footer {
797
+ color: rgba(255,255,255,.86);
798
+ font-size: 14px;
799
+ font-weight: 600;
800
+ }
801
+
802
+ @media (orientation: landscape) {
803
+ body.jf-page-home .jf-shell {
804
+ display: grid;
805
+ grid-template-columns: 40% 60%;
806
+ grid-template-rows: 1fr auto;
807
+ gap: 14px;
808
+ padding: 18px;
809
+ }
810
+
811
+ body.jf-page-home .hero {
812
+ grid-column: 1;
813
+ grid-row: 1 / span 2;
814
+ justify-content: center;
815
+ align-items: flex-start;
816
+ }
817
+
818
+ body.jf-page-home .buttons {
819
+ grid-column: 2;
820
+ grid-row: 1;
821
+ align-self: center;
822
+ gap: 10px;
823
+ }
824
+
825
+ body.jf-page-home .btn {
826
+ min-height: 72px;
827
+ padding: 14px 18px;
828
+ border-radius: 22px;
829
+ }
830
+
831
+ body.jf-page-home .btnTitle {
832
+ font-size: clamp(24px, 3.2vw, 40px);
833
+ }
834
+
835
+ body.jf-page-home .btnSub {
836
+ font-size: clamp(12px, 1.5vw, 18px);
837
+ }
838
+
839
+ body.jf-page-home .stats {
840
+ grid-column: 2;
841
+ grid-row: 2;
842
+ }
843
+
844
+ body.jf-page-home .stat {
845
+ min-height: 44px;
846
+ border-radius: 16px;
847
+ }
848
+
849
+ body.jf-page-home .value {
850
+ font-size: clamp(24px, 3.2vw, 38px);
851
+ }
852
+
853
+ body.jf-page-home .label {
854
+ font-size: 8px;
855
+ }
856
+
857
+ body.jf-page-home .status,
858
+ body.jf-page-home [id="statusText"] {
859
+ margin: 12px 0 0 0;
860
+ padding: 7px 14px;
861
+ font-size: clamp(8px, 1.15vw, 12px);
862
+ max-width: 100%;
863
+ }
864
+
865
+ body.jf-page-home .footer {
866
+ position: absolute;
867
+ left: 22px;
868
+ bottom: 16px;
869
+ margin: 0;
870
+ font-size: 12px;
871
+ }
872
+ }
873
+
874
+ @keyframes radarSpin {
875
+ to { transform: rotate(360deg); }
876
+ }
877
+
878
+ @keyframes idleFloat {
879
+ 0%,100% { transform: translateY(0) rotate(-8deg); }
880
+ 50% { transform: translateY(-9px) rotate(-2deg); }
881
+ }
882
+
883
+
884
+ /* ==================================================
885
+ Home final shell layout
886
+ ================================================== */
887
+
888
+ body.jf-page-home .jf-shell {
889
+ display: flex;
890
+ flex-direction: column;
891
+ gap: 18px;
892
+ }
893
+
894
+ body.jf-page-home .hero {
895
+ flex: 1 1 auto;
896
+ display: flex;
897
+ flex-direction: column;
898
+ justify-content: center;
899
+ min-height: 0;
900
+ }
901
+
902
+ body.jf-page-home .logo {
903
+ font-size: clamp(54px, 14vw, 96px);
904
+ line-height: .9;
905
+ margin-bottom: 14px;
906
+ }
907
+
908
+ body.jf-page-home h1 {
909
+ margin: 0;
910
+ font-size: clamp(42px, 11vw, 76px);
911
+ line-height: .88;
912
+ letter-spacing: -.07em;
913
+ font-weight: 950;
914
+ }
915
+
916
+ body.jf-page-home .sub {
917
+ margin-top: 14px;
918
+ color: var(--muted);
919
+ font-size: clamp(17px, 4vw, 28px);
920
+ font-weight: 750;
921
+ }
922
+
923
+ body.jf-page-home .status,
924
+ body.jf-page-home [id="statusText"] {
925
+ display: inline-flex;
926
+ align-items: center;
927
+ justify-content: center;
928
+ width: fit-content;
929
+ max-width: 92%;
930
+ margin: 18px auto 0 auto;
931
+ padding: 9px 18px;
932
+ border-radius: 999px;
933
+ background: rgba(53,230,107,.13);
934
+ border: 1px solid rgba(53,230,107,.28);
935
+ color: rgba(210,255,225,.94);
936
+ font-size: clamp(11px, 2vw, 15px);
937
+ font-weight: 850;
938
+ line-height: 1;
939
+ white-space: nowrap;
940
+ overflow: hidden;
941
+ text-overflow: ellipsis;
942
+ }
943
+
944
+ body.jf-page-home .buttons {
945
+ display: grid;
946
+ grid-template-columns: 1fr;
947
+ gap: 12px;
948
+ }
949
+
950
+ body.jf-page-home a {
951
+ text-decoration: none;
952
+ color: white;
953
+ }
954
+
955
+ body.jf-page-home .btn {
956
+ border-radius: 26px;
957
+ padding: 20px;
958
+ background: rgba(255,255,255,.085);
959
+ border: 1px solid rgba(255,255,255,.14);
960
+ display: flex;
961
+ align-items: center;
962
+ justify-content: space-between;
963
+ gap: 14px;
964
+ box-shadow: inset 0 1px 0 rgba(255,255,255,.12);
965
+ }
966
+
967
+ body.jf-page-home .btn.primary {
968
+ background: linear-gradient(145deg, rgba(86,168,255,.40), rgba(53,230,107,.24));
969
+ border-color: rgba(86,168,255,.34);
970
+ }
971
+
972
+ body.jf-page-home .btn.heat {
973
+ background: linear-gradient(145deg, rgba(255,216,77,.32), rgba(255,90,90,.20));
974
+ border-color: rgba(255,216,77,.30);
975
+ }
976
+
977
+ body.jf-page-home .btnTitle {
978
+ font-size: clamp(22px, 5vw, 34px);
979
+ font-weight: 920;
980
+ letter-spacing: -.035em;
981
+ }
982
+
983
+ body.jf-page-home .btnSub {
984
+ margin-top: 4px;
985
+ color: var(--muted);
986
+ font-size: clamp(12px, 2.8vw, 16px);
987
+ font-weight: 700;
988
+ }
989
+
990
+ body.jf-page-home .arrow {
991
+ font-size: 28px;
992
+ font-weight: 700;
993
+ color: rgba(255,255,255,.82);
994
+ }
995
+
996
+ body.jf-page-home .stats {
997
+ display: grid;
998
+ grid-template-columns: repeat(3, 1fr);
999
+ gap: 10px;
1000
+ }
1001
+
1002
+ body.jf-page-home .stat {
1003
+ min-height: 70px;
1004
+ border-radius: 20px;
1005
+ background: rgba(255,255,255,.075);
1006
+ border: 1px solid rgba(255,255,255,.12);
1007
+ display: flex;
1008
+ flex-direction: column;
1009
+ align-items: center;
1010
+ justify-content: center;
1011
+ }
1012
+
1013
+ body.jf-page-home .value {
1014
+ font-size: clamp(28px, 6vw, 46px);
1015
+ font-weight: 950;
1016
+ line-height: .9;
1017
+ letter-spacing: -.05em;
1018
+ }
1019
+
1020
+ body.jf-page-home .label {
1021
+ margin-top: 5px;
1022
+ font-size: 10px;
1023
+ letter-spacing: .16em;
1024
+ color: var(--muted);
1025
+ font-weight: 850;
1026
+ }
1027
+
1028
+ body.jf-page-home .footer {
1029
+ color: rgba(255,255,255,.86);
1030
+ font-size: 14px;
1031
+ font-weight: 600;
1032
+ }
1033
+
1034
+ @media (orientation: landscape) {
1035
+ body.jf-page-home .jf-shell {
1036
+ display: grid;
1037
+ grid-template-columns: 40% 60%;
1038
+ grid-template-rows: 1fr auto;
1039
+ gap: 14px;
1040
+ padding: 18px;
1041
+ }
1042
+
1043
+ body.jf-page-home .hero {
1044
+ grid-column: 1;
1045
+ grid-row: 1 / span 2;
1046
+ justify-content: center;
1047
+ align-items: flex-start;
1048
+ }
1049
+
1050
+ body.jf-page-home .buttons {
1051
+ grid-column: 2;
1052
+ grid-row: 1;
1053
+ align-self: center;
1054
+ gap: 10px;
1055
+ }
1056
+
1057
+ body.jf-page-home .stats {
1058
+ grid-column: 2;
1059
+ grid-row: 2;
1060
+ }
1061
+
1062
+ body.jf-page-home .btn {
1063
+ min-height: 72px;
1064
+ padding: 14px 18px;
1065
+ border-radius: 22px;
1066
+ }
1067
+
1068
+ body.jf-page-home .stat {
1069
+ min-height: 44px;
1070
+ border-radius: 16px;
1071
+ }
1072
+
1073
+ body.jf-page-home .status,
1074
+ body.jf-page-home [id="statusText"] {
1075
+ margin: 12px 0 0 0;
1076
+ padding: 7px 14px;
1077
+ font-size: clamp(8px, 1.15vw, 12px);
1078
+ max-width: 100%;
1079
+ }
1080
+
1081
+ body.jf-page-home .footer {
1082
+ position: absolute;
1083
+ left: 22px;
1084
+ bottom: 16px;
1085
+ margin: 0;
1086
+ font-size: 12px;
1087
+ }
1088
+ }
1089
+
1090
+ /* ==================================================
1091
+ HOME LANDSCAPE STATS FINAL
1092
+ ================================================== */
1093
+
1094
+ @media (orientation: landscape) {
1095
+ body.jf-page-home .jf-shell {
1096
+ grid-template-rows: minmax(0, 1fr) 54px !important;
1097
+ gap: 10px !important;
1098
+ padding-bottom: 12px !important;
1099
+ }
1100
+
1101
+ body.jf-page-home .stats {
1102
+ align-self: end !important;
1103
+ height: 54px !important;
1104
+ }
1105
+
1106
+ body.jf-page-home .stat {
1107
+ min-height: 54px !important;
1108
+ height: 54px !important;
1109
+ padding: 4px 8px !important;
1110
+ }
1111
+
1112
+ body.jf-page-home .value {
1113
+ font-size: clamp(24px, 3vw, 34px) !important;
1114
+ line-height: .9 !important;
1115
+ }
1116
+
1117
+ body.jf-page-home .label {
1118
+ margin-top: 3px !important;
1119
+ font-size: 7px !important;
1120
+ line-height: 1 !important;
1121
+ }
1122
+
1123
+ body.jf-page-home .footer {
1124
+ bottom: 10px !important;
1125
+ }
1126
+ }
1127
+
1128
+
1129
+
1130
+
1131
+ /* ==================================================
1132
+ HEATMAP FINAL MICRO REPLACE
1133
+ ================================================== */
1134
+
1135
+ /* Backbutton wirklich in die Header-Reihe */
1136
+ body.jf-page-heatmap .header {
1137
+ display: grid !important;
1138
+ grid-template-columns: 34px minmax(0, 1fr) auto !important;
1139
+ align-items: center !important;
1140
+ gap: 10px !important;
1141
+ padding-left: 0 !important;
1142
+ position: relative !important;
1143
+ }
1144
+
1145
+ body.jf-page-heatmap .backBtn {
1146
+ position: static !important;
1147
+ width: 34px !important;
1148
+ height: 34px !important;
1149
+ flex: 0 0 34px !important;
1150
+ margin: 0 !important;
1151
+ z-index: 10 !important;
1152
+ }
1153
+
1154
+ @media (orientation: portrait) {
1155
+ body.jf-page-heatmap .header {
1156
+ grid-template-columns: 34px minmax(0, 1fr) auto !important;
1157
+ }
1158
+
1159
+ body.jf-page-heatmap .title {
1160
+ font-size: clamp(24px, 6vw, 34px) !important;
1161
+ }
1162
+
1163
+ body.jf-page-heatmap .sub {
1164
+ font-size: clamp(12px, 3vw, 15px) !important;
1165
+ }
1166
+ }
1167
+
1168
+ /* Querformat: links Swipe groß, rechts Ranking klein passend */
1169
+ @media (orientation: landscape) {
1170
+ body.jf-page-heatmap .jf-shell {
1171
+ display: grid !important;
1172
+ grid-template-columns: minmax(0, 58%) minmax(0, 42%) !important;
1173
+ grid-template-rows: auto 48px 34px minmax(0, 1fr) !important;
1174
+ gap: 8px 14px !important;
1175
+ padding: 14px 26px !important;
1176
+ }
1177
+
1178
+ body.jf-page-heatmap .header {
1179
+ grid-column: 1 / 3 !important;
1180
+ grid-row: 1 !important;
1181
+ grid-template-columns: 34px minmax(0, 1fr) auto !important;
1182
+ min-height: 36px !important;
1183
+ }
1184
+
1185
+ body.jf-page-heatmap .stats {
1186
+ grid-column: 1 / 3 !important;
1187
+ grid-row: 2 !important;
1188
+ }
1189
+
1190
+ body.jf-page-heatmap .rush {
1191
+ grid-column: 1 / 3 !important;
1192
+ grid-row: 3 !important;
1193
+ height: 34px !important;
1194
+ min-height: 34px !important;
1195
+ max-height: 34px !important;
1196
+ padding: 5px 14px !important;
1197
+ font-size: clamp(13px, 1.45vw, 17px) !important;
1198
+ }
1199
+
1200
+ body.jf-page-heatmap .scroller {
1201
+ grid-column: 1 !important;
1202
+ grid-row: 4 !important;
1203
+ height: 100% !important;
1204
+ min-height: 0 !important;
1205
+ }
1206
+
1207
+ body.jf-page-heatmap .rankings {
1208
+ grid-column: 2 !important;
1209
+ grid-row: 4 !important;
1210
+ display: grid !important;
1211
+ grid-template-columns: 1fr !important;
1212
+ grid-template-rows: 1fr 1fr !important;
1213
+ gap: 10px !important;
1214
+ height: 100% !important;
1215
+ min-height: 0 !important;
1216
+ }
1217
+
1218
+ body.jf-page-heatmap .rankings .panel {
1219
+ padding: 10px 13px !important;
1220
+ overflow: hidden !important;
1221
+ }
1222
+
1223
+ body.jf-page-heatmap .rankings .panel h3 {
1224
+ font-size: 10px !important;
1225
+ line-height: 1 !important;
1226
+ margin: 0 0 5px !important;
1227
+ letter-spacing: 1.8px !important;
1228
+ }
1229
+
1230
+ body.jf-page-heatmap #airlineRanking,
1231
+ body.jf-page-heatmap #routeRanking {
1232
+ font-size: 10px !important;
1233
+ line-height: 1.08 !important;
1234
+ font-weight: 800 !important;
1235
+ letter-spacing: 0 !important;
1236
+ }
1237
+ }
1238
+
1239
+
1240
+ /* ==================================================
1241
+ JETFRAME DESIGN SYSTEM CLEAN V1
1242
+ Einheitliche Header / Pills / Boxen / responsive Text
1243
+ ================================================== */
1244
+
1245
+ @font-face {
1246
+ font-family: "JetFrameSF";
1247
+ src: url("SF-Pro.ttf") format("truetype");
1248
+ font-weight: 100 1000;
1249
+ font-style: normal;
1250
+ font-display: swap;
1251
+ }
1252
+
1253
+ :root {
1254
+ --jf-font: "JetFrameSF", -apple-system, BlinkMacSystemFont, "SF Pro Display", "Helvetica Neue", Arial, sans-serif;
1255
+
1256
+ --jf-text-xs: clamp(8px, 1.05cqw, 12px);
1257
+ --jf-text-sm: clamp(10px, 1.35cqw, 15px);
1258
+ --jf-text-md: clamp(13px, 1.75cqw, 20px);
1259
+ --jf-text-lg: clamp(20px, 3.2cqw, 38px);
1260
+ --jf-text-xl: clamp(30px, 5.2cqw, 64px);
1261
+
1262
+ --jf-radius-shell: clamp(26px, 4cqw, 34px);
1263
+ --jf-radius-box: clamp(18px, 3cqw, 28px);
1264
+
1265
+ --jf-gap: clamp(8px, 1.35cqw, 16px);
1266
+ --jf-pad: clamp(14px, 2.2cqw, 26px);
1267
+
1268
+ --jf-box-bg: rgba(255,255,255,.075);
1269
+ --jf-box-border: 1px solid rgba(255,255,255,.13);
1270
+ }
1271
+
1272
+ html,
1273
+ body,
1274
+ button,
1275
+ input,
1276
+ textarea,
1277
+ select {
1278
+ font-family: var(--jf-font) !important;
1279
+ }
1280
+
1281
+ .card,
1282
+ .wall,
1283
+ .jf-shell {
1284
+ container-type: size;
1285
+ border-radius: var(--jf-radius-shell) !important;
1286
+ padding: var(--jf-pad) !important;
1287
+ overflow: hidden !important;
1288
+ }
1289
+
1290
+ /* ---------- Einheitlicher Header auf allen Unterseiten ---------- */
1291
+
1292
+ body:not(.jf-page-home) .header {
1293
+ display: grid !important;
1294
+ grid-template-columns: clamp(30px, 4cqw, 42px) minmax(0, 1fr) auto !important;
1295
+ grid-template-rows: auto auto !important;
1296
+ column-gap: clamp(8px, 1.3cqw, 14px) !important;
1297
+ align-items: center !important;
1298
+
1299
+ height: clamp(48px, 8cqh, 74px) !important;
1300
+ min-height: clamp(48px, 8cqh, 74px) !important;
1301
+ margin: 0 0 var(--jf-gap) 0 !important;
1302
+ padding: 0 !important;
1303
+ overflow: visible !important;
1304
+ }
1305
+
1306
+ body:not(.jf-page-home) .backBtn {
1307
+ position: static !important;
1308
+ grid-column: 1 !important;
1309
+ grid-row: 1 / span 2 !important;
1310
+ width: clamp(30px, 4cqw, 42px) !important;
1311
+ height: clamp(30px, 4cqw, 42px) !important;
1312
+ margin: 0 !important;
1313
+ align-self: center !important;
1314
+ }
1315
+
1316
+ body:not(.jf-page-home) .header > div:not(.livePill):not(.frameHeaderActions),
1317
+ body:not(.jf-page-home) .headerTitleBlock {
1318
+ grid-column: 2 !important;
1319
+ grid-row: 1 / span 2 !important;
1320
+ min-width: 0 !important;
1321
+ align-self: center !important;
1322
+ overflow: visible !important;
1323
+ }
1324
+
1325
+ body:not(.jf-page-home) .title {
1326
+ margin: 0 !important;
1327
+ padding: 0 !important;
1328
+ font-size: clamp(25px, 4.1cqw, 44px) !important;
1329
+ font-weight: 950 !important;
1330
+ line-height: .98 !important;
1331
+ letter-spacing: -.06em !important;
1332
+ color: #fff !important;
1333
+ white-space: nowrap !important;
1334
+ overflow: visible !important;
1335
+ text-overflow: clip !important;
1336
+ }
1337
+
1338
+ body:not(.jf-page-home) .sub {
1339
+ margin: 1px 0 0 0 !important;
1340
+ font-size: clamp(12px, 1.7cqw, 18px) !important;
1341
+ font-weight: 760 !important;
1342
+ line-height: 1.08 !important;
1343
+ color: rgba(255,255,255,.62) !important;
1344
+ white-space: nowrap !important;
1345
+ overflow: hidden !important;
1346
+ text-overflow: ellipsis !important;
1347
+ }
1348
+
1349
+ /* ---------- Einheitliche Live-Pille ---------- */
1350
+
1351
+ body:not(.jf-page-home) .livePill,
1352
+ body:not(.jf-page-home) .frameLivePill {
1353
+ grid-column: 3 !important;
1354
+ grid-row: 1 / span 2 !important;
1355
+ justify-self: end !important;
1356
+ align-self: center !important;
1357
+
1358
+ display: inline-flex !important;
1359
+ align-items: center !important;
1360
+ justify-content: center !important;
1361
+ gap: .55em !important;
1362
+
1363
+ height: clamp(32px, 4.5cqw, 44px) !important;
1364
+ min-width: clamp(74px, 10cqw, 104px) !important;
1365
+ padding: 0 clamp(12px, 1.7cqw, 18px) !important;
1366
+
1367
+ border-radius: 999px !important;
1368
+ background: rgba(53,230,107,.13) !important;
1369
+ border: 1px solid rgba(53,230,107,.32) !important;
1370
+ box-shadow: 0 0 22px rgba(53,230,107,.14) !important;
1371
+
1372
+ color: rgba(210,255,225,.96) !important;
1373
+ font-size: clamp(13px, 1.75cqw, 18px) !important;
1374
+ font-weight: 900 !important;
1375
+ line-height: 1 !important;
1376
+ }
1377
+
1378
+ body:not(.jf-page-home) .livePill::before,
1379
+ body:not(.jf-page-home) .frameLivePill::before {
1380
+ content: "";
1381
+ width: clamp(8px, 1.2cqw, 12px);
1382
+ height: clamp(8px, 1.2cqw, 12px);
1383
+ border-radius: 50%;
1384
+ background: var(--green);
1385
+ box-shadow: 0 0 14px rgba(53,230,107,.75);
1386
+ }
1387
+
1388
+ body:not(.jf-page-home) .livePill .dot,
1389
+ body:not(.jf-page-home) .frameLivePill .dot {
1390
+ display: none !important;
1391
+ }
1392
+
1393
+ /* Live-Frame: Speaker links neben Live-Pille */
1394
+
1395
+
1396
+
1397
+ /* ---------- Grundbausteine ---------- */
1398
+
1399
+ .jf-box,
1400
+ .stat,
1401
+ .metric,
1402
+ .panel,
1403
+ .hourCard {
1404
+ border-radius: var(--jf-radius-box) !important;
1405
+ background: var(--jf-box-bg) !important;
1406
+ border: var(--jf-box-border) !important;
1407
+ }
1408
+
1409
+ .value,
1410
+ .metricValue,
1411
+ .hourTotal,
1412
+ .iataCallsign {
1413
+ font-weight: 950 !important;
1414
+ line-height: .9 !important;
1415
+ letter-spacing: -.055em !important;
1416
+ }
1417
+
1418
+ .label,
1419
+ .metricLabel,
1420
+ .panel h3 {
1421
+ font-size: var(--jf-text-xs) !important;
1422
+ font-weight: 850 !important;
1423
+ letter-spacing: .16em !important;
1424
+ color: rgba(255,255,255,.62) !important;
1425
+ text-transform: uppercase !important;
1426
+ }
1427
+
1428
+ /* ---------- Live Frame ---------- */
1429
+
1430
+
1431
+
1432
+
1433
+
1434
+
1435
+
1436
+
1437
+ /* Warte-Ansicht ruhiger */
1438
+
1439
+
1440
+ /* ---------- Heatmap ---------- */
1441
+
1442
+ body.jf-page-heatmap .rush {
1443
+ display: grid !important;
1444
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) !important;
1445
+ align-items: center !important;
1446
+ gap: clamp(8px, 1.6cqw, 18px) !important;
1447
+ min-height: clamp(32px, 4.6cqh, 44px) !important;
1448
+ padding: 0 clamp(12px, 2cqw, 22px) !important;
1449
+ font-size: clamp(11px, 1.65cqw, 18px) !important;
1450
+ line-height: 1 !important;
1451
+ white-space: nowrap !important;
1452
+ overflow: hidden !important;
1453
+ }
1454
+
1455
+ body.jf-page-heatmap .rush span {
1456
+ min-width: 0 !important;
1457
+ overflow: hidden !important;
1458
+ text-overflow: ellipsis !important;
1459
+ white-space: nowrap !important;
1460
+ }
1461
+
1462
+ body.jf-page-heatmap .rush span:last-child {
1463
+ text-align: right !important;
1464
+ }
1465
+
1466
+ body.jf-page-heatmap .stat {
1467
+ min-height: clamp(50px, 7.5cqh, 76px) !important;
1468
+ }
1469
+
1470
+ body.jf-page-heatmap .value {
1471
+ font-size: clamp(24px, 5cqw, 42px) !important;
1472
+ }
1473
+
1474
+ body.jf-page-heatmap .hour {
1475
+ font-size: clamp(30px, 5.5cqw, 58px) !important;
1476
+ }
1477
+
1478
+ body.jf-page-heatmap .hourTotal {
1479
+ font-size: clamp(62px, 13cqw, 120px) !important;
1480
+ }
1481
+
1482
+ body.jf-page-heatmap .hourSub {
1483
+ font-size: clamp(14px, 2.4cqw, 24px) !important;
1484
+ }
1485
+
1486
+ body.jf-page-heatmap .panel pre {
1487
+ font-size: clamp(10px, 1.65cqw, 15px) !important;
1488
+ line-height: 1.08 !important;
1489
+ }
1490
+
1491
+ /* ---------- Statistik ---------- */
1492
+
1493
+ body.jf-page-stats .value {
1494
+ font-size: clamp(30px, 5.4cqw, 64px) !important;
1495
+ }
1496
+
1497
+ body.jf-page-stats .small {
1498
+ font-size: clamp(11px, 1.85cqw, 17px) !important;
1499
+ line-height: 1.12 !important;
1500
+ }
1501
+
1502
+ body.jf-page-stats .panel pre {
1503
+ font-size: clamp(9px, 1.45cqw, 14px) !important;
1504
+ line-height: 1.08 !important;
1505
+ overflow: hidden !important;
1506
+ }
1507
+
1508
+ /* ---------- Portrait ---------- */
1509
+
1510
+ @media (orientation: portrait) {
1511
+ .card,
1512
+ .wall,
1513
+ .jf-shell {
1514
+ width: 96vw !important;
1515
+ height: calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom) - 20px) !important;
1516
+ }
1517
+
1518
+ body.jf-page-heatmap .card,
1519
+ body.jf-page-heatmap .jf-shell {
1520
+ display: grid !important;
1521
+ grid-template-rows:
1522
+ auto
1523
+ auto
1524
+ auto
1525
+ minmax(0, 1fr)
1526
+ clamp(132px, 18cqh, 210px) !important;
1527
+ gap: var(--jf-gap) !important;
1528
+ }
1529
+
1530
+ body.jf-page-heatmap .stats {
1531
+ grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
1532
+ gap: clamp(6px, 1.2cqw, 10px) !important;
1533
+ }
1534
+
1535
+ body.jf-page-heatmap .hourCard {
1536
+ flex: 0 0 clamp(250px, 78cqw, 580px) !important;
1537
+ height: 100% !important;
1538
+ }
1539
+
1540
+ body.jf-page-heatmap .rankings {
1541
+ grid-template-columns: 1fr 1fr !important;
1542
+ gap: var(--jf-gap) !important;
1543
+ }
1544
+
1545
+ body.jf-page-stats .grid {
1546
+ grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
1547
+ gap: var(--jf-gap) !important;
1548
+ }
1549
+
1550
+ body.jf-page-stats .panels {
1551
+ grid-template-columns: 1fr !important;
1552
+ grid-template-rows: 1.05fr 1.15fr 1.25fr 1.25fr !important;
1553
+ gap: var(--jf-gap) !important;
1554
+ min-height: 0 !important;
1555
+ }
1556
+
1557
+ body.jf-page-stats .panel {
1558
+ min-height: 0 !important;
1559
+ overflow: hidden !important;
1560
+ }
1561
+ }
1562
+
1563
+ /* ---------- Landscape ---------- */
1564
+
1565
+ @media (orientation: landscape) {
1566
+ .card,
1567
+ .wall,
1568
+ .jf-shell {
1569
+ width: min(1280px, 92vw) !important;
1570
+ height: calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom) - 18px) !important;
1571
+ }
1572
+
1573
+ body:not(.jf-page-home) .header {
1574
+ height: clamp(44px, 9cqh, 66px) !important;
1575
+ min-height: clamp(44px, 9cqh, 66px) !important;
1576
+ }
1577
+
1578
+ body:not(.jf-page-home) .title {
1579
+ font-size: clamp(26px, 3.8cqw, 48px) !important;
1580
+ }
1581
+
1582
+ body:not(.jf-page-home) .sub {
1583
+ font-size: clamp(11px, 1.25cqw, 17px) !important;
1584
+ }
1585
+
1586
+ body.jf-page-heatmap .card,
1587
+ body.jf-page-heatmap .jf-shell {
1588
+ display: grid !important;
1589
+ grid-template-columns: minmax(0, .56fr) minmax(250px, .44fr) !important;
1590
+ grid-template-rows: auto auto auto minmax(0, 1fr) !important;
1591
+ gap: clamp(7px, 1.2cqh, 12px) clamp(12px, 1.5cqw, 20px) !important;
1592
+ }
1593
+
1594
+ body.jf-page-heatmap .header,
1595
+ body.jf-page-heatmap .stats,
1596
+ body.jf-page-heatmap .rush {
1597
+ grid-column: 1 / -1 !important;
1598
+ }
1599
+
1600
+ body.jf-page-heatmap .stats {
1601
+ grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
1602
+ }
1603
+
1604
+ body.jf-page-heatmap .scroller {
1605
+ grid-column: 1 !important;
1606
+ grid-row: 4 !important;
1607
+ min-height: 0 !important;
1608
+ height: 100% !important;
1609
+ }
1610
+
1611
+ body.jf-page-heatmap .hourCard {
1612
+ flex: 0 0 clamp(210px, 25cqw, 340px) !important;
1613
+ height: 100% !important;
1614
+ }
1615
+
1616
+ body.jf-page-heatmap .hourTotal {
1617
+ font-size: clamp(48px, 6cqw, 88px) !important;
1618
+ }
1619
+
1620
+ body.jf-page-heatmap .rankings {
1621
+ grid-column: 2 !important;
1622
+ grid-row: 4 !important;
1623
+ grid-template-columns: 1fr !important;
1624
+ grid-template-rows: 1fr 1fr !important;
1625
+ min-height: 0 !important;
1626
+ }
1627
+
1628
+ body.jf-page-heatmap .panel pre {
1629
+ font-size: clamp(8px, .95cqw, 13px) !important;
1630
+ }
1631
+
1632
+ body.jf-page-stats .card,
1633
+ body.jf-page-stats .jf-shell {
1634
+ display: grid !important;
1635
+ grid-template-columns: minmax(0, .57fr) minmax(280px, .43fr) !important;
1636
+ grid-template-rows: auto minmax(0, 1fr) !important;
1637
+ gap: clamp(8px, 1.25cqh, 12px) clamp(12px, 1.6cqw, 20px) !important;
1638
+ }
1639
+
1640
+ body.jf-page-stats .header {
1641
+ grid-column: 1 / -1 !important;
1642
+ }
1643
+
1644
+ body.jf-page-stats .grid {
1645
+ grid-column: 1 !important;
1646
+ grid-row: 2 !important;
1647
+ grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
1648
+ grid-template-rows: repeat(3, minmax(0, 1fr)) !important;
1649
+ min-height: 0 !important;
1650
+ gap: var(--jf-gap) !important;
1651
+ }
1652
+
1653
+ body.jf-page-stats .panels {
1654
+ grid-column: 2 !important;
1655
+ grid-row: 2 !important;
1656
+ grid-template-columns: 1fr !important;
1657
+ grid-template-rows: repeat(4, minmax(0, 1fr)) !important;
1658
+ min-height: 0 !important;
1659
+ gap: var(--jf-gap) !important;
1660
+ }
1661
+
1662
+ body.jf-page-stats .panel {
1663
+ min-height: 0 !important;
1664
+ overflow: hidden !important;
1665
+ }
1666
+
1667
+ body.jf-page-stats .value {
1668
+ font-size: clamp(28px, 4cqw, 56px) !important;
1669
+ }
1670
+
1671
+ body.jf-page-stats .panel pre {
1672
+ font-size: clamp(7px, .8cqw, 11px) !important;
1673
+ line-height: 1.02 !important;
1674
+ }
1675
+ }
1676
+
1677
+ /* ==================================================
1678
+ LIVE TITLE STRONGER
1679
+ ================================================== */
1680
+
1681
+ .liveDirection,
1682
+ .flightDirection,
1683
+ .approachLabel{
1684
+ font-size: clamp(26px, 2.1cqw, 42px) !important;
1685
+ font-weight: 700 !important;
1686
+ line-height: 1.05 !important;
1687
+ letter-spacing: -.01em !important;
1688
+ }
1689
+
1690
+
1691
+ /* ==================================================
1692
+ NO FLIGHT CLEANUP 2026-05-17
1693
+ ================================================== */
1694
+
1695
+ /* Kein Flug: Flight-Überschrift, Logo-Kreis und Airline-Zeile weg */
1696
+
1697
+ /* Kein Flug: Info-Bereich nicht künstlich mit leerem Content füllen */
1698
+
1699
+ /* Runway-Text unten in Info-Bereich als grüne Pille */
1700
+
1701
+
1702
+ /* gelbe Fenster-Pille bei kein Flug weg */
1703
+
1704
+ /* Runway Text IM Bild ausblenden, damit er nicht doppelt ist */
1705
+
1706
+ /* Warte-Text im Bild alleine mittig unten */
1707
+
1708
+ /* Wenn Flug da ist: Placeholder/Radar komplett aus */
1709
+ body:not(.jf-no-flight) #placeholder,
1710
+ body:not(.jf-no-flight) .placeholder,
1711
+ body:not(.jf-no-flight) .radarCircle,
1712
+ body:not(.jf-no-flight) .radarSweep,
1713
+ body:not(.jf-no-flight) .idlePlane,
1714
+ body:not(.jf-no-flight) .idleText,
1715
+ body:not(.jf-no-flight) .idleRunwayText{
1716
+ display:none !important;
1717
+ opacity:0 !important;
1718
+ pointer-events:none !important;
1719
+ }
1720
+
1721
+
1722
+ /* ======================================================
1723
+ HEATMAP FINAL: Top Airlines / Top Routen größer
1724
+ ====================================================== */
1725
+
1726
+ body.jf-page-heatmap .topBox,
1727
+ body.jf-page-heatmap .topListBox,
1728
+ body.jf-page-heatmap .summaryBox{
1729
+ container-type:inline-size;
1730
+ }
1731
+
1732
+ body.jf-page-heatmap .topBox h3,
1733
+ body.jf-page-heatmap .topListBox h3,
1734
+ body.jf-page-heatmap .summaryBox h3{
1735
+ font-size:clamp(18px, 5.4cqw, 26px) !important;
1736
+ line-height:1.05 !important;
1737
+ }
1738
+
1739
+ body.jf-page-heatmap .topBox,
1740
+ body.jf-page-heatmap .topBox *,
1741
+ body.jf-page-heatmap .topListBox,
1742
+ body.jf-page-heatmap .topListBox *,
1743
+ body.jf-page-heatmap .summaryBox,
1744
+ body.jf-page-heatmap .summaryBox *{
1745
+ font-size:clamp(17px, 5.0cqw, 24px) !important;
1746
+ line-height:1.18 !important;
1747
+ }
1748
+
1749
+ @media (orientation:landscape){
1750
+ body.jf-page-heatmap .topBox h3,
1751
+ body.jf-page-heatmap .topListBox h3,
1752
+ body.jf-page-heatmap .summaryBox h3{
1753
+ font-size:clamp(16px, 2.0cqw, 24px) !important;
1754
+ }
1755
+
1756
+ body.jf-page-heatmap .topBox,
1757
+ body.jf-page-heatmap .topBox *,
1758
+ body.jf-page-heatmap .topListBox,
1759
+ body.jf-page-heatmap .topListBox *,
1760
+ body.jf-page-heatmap .summaryBox,
1761
+ body.jf-page-heatmap .summaryBox *{
1762
+ font-size:clamp(15px, 1.7cqw, 22px) !important;
1763
+ line-height:1.16 !important;
1764
+ }
1765
+ }
1766
+
1767
+ /* ======================================================
1768
+ STATS FINAL: echte Textspalten stabil
1769
+ ====================================================== */
1770
+
1771
+ .panel.jf-split-panel pre{
1772
+ display:grid !important;
1773
+ grid-template-columns:repeat(2, minmax(0, 1fr)) !important;
1774
+ column-gap:22px !important;
1775
+ row-gap:2px !important;
1776
+
1777
+ margin:0 !important;
1778
+ white-space:normal !important;
1779
+
1780
+ font-size:clamp(13px, 1.55cqw, 19px) !important;
1781
+ line-height:1.14 !important;
1782
+ font-weight:800 !important;
1783
+ }
1784
+
1785
+ .panel.jf-split-panel pre .jf-line{
1786
+ display:block !important;
1787
+ min-width:0 !important;
1788
+ white-space:nowrap !important;
1789
+ overflow:hidden !important;
1790
+ text-overflow:ellipsis !important;
1791
+ }
1792
+
1793
+ @media (orientation:landscape){
1794
+ .panel.jf-split-panel pre{
1795
+ grid-template-columns:repeat(3, minmax(0, 1fr)) !important;
1796
+ column-gap:24px !important;
1797
+ font-size:clamp(10px, .9cqw, 14px) !important;
1798
+ line-height:1.08 !important;
1799
+ }
1800
+ }
1801
+
1802
+
1803
+
1804
+ /* ======================================================
1805
+ FRAME PAGE CLEAN V1
1806
+ Nur frame.html. Globale JetFrame-Basis bleibt erhalten.
1807
+ ====================================================== */
1808
+
1809
+ html,
1810
+ body.jf-page-frame{
1811
+ width:100%;
1812
+ height:100%;
1813
+ margin:0;
1814
+ overflow:hidden;
1815
+ }
1816
+
1817
+ body.jf-page-frame{
1818
+ min-height:100dvh;
1819
+ background:
1820
+ radial-gradient(circle at 18% 8%, rgba(50,120,255,.22), transparent 34%),
1821
+ radial-gradient(circle at 86% 12%, rgba(255,130,55,.13), transparent 30%),
1822
+ linear-gradient(180deg,#111827 0%,#05060a 76%);
1823
+ }
1824
+
1825
+ body.jf-page-frame #app{
1826
+ width:100vw;
1827
+ height:100dvh;
1828
+ padding:calc(env(safe-area-inset-top) + clamp(8px, 1.8vmin, 18px))
1829
+ calc(env(safe-area-inset-right) + clamp(8px, 1.8vmin, 18px))
1830
+ calc(env(safe-area-inset-bottom) + clamp(8px, 1.8vmin, 18px))
1831
+ calc(env(safe-area-inset-left) + clamp(8px, 1.8vmin, 18px));
1832
+ overflow:hidden;
1833
+ }
1834
+
1835
+ body.jf-page-frame #wall.jf-shell{
1836
+ width:100%;
1837
+ height:100%;
1838
+ max-width:none;
1839
+ max-height:none;
1840
+ margin:0;
1841
+ overflow:hidden;
1842
+ border-radius:clamp(26px, 4vmin, 44px);
1843
+ display:grid;
1844
+ grid-template-rows:auto minmax(0, 1fr);
1845
+ gap:clamp(10px, 1.5vmin, 18px);
1846
+ padding:clamp(12px, 1.8vmin, 24px);
1847
+ }
1848
+
1849
+ body.jf-page-frame .header{
1850
+ min-height:auto;
1851
+ display:grid;
1852
+ grid-template-columns:auto minmax(0, 1fr) auto;
1853
+ align-items:center;
1854
+ gap:clamp(10px, 1.4vmin, 18px);
1855
+ }
1856
+
1857
+ body.jf-page-frame .headerTitleBlock{
1858
+ min-width:0;
1859
+ }
1860
+
1861
+ body.jf-page-frame .title{
1862
+ white-space:nowrap;
1863
+ line-height:.95;
1864
+ }
1865
+
1866
+ body.jf-page-frame .sub{
1867
+ white-space:nowrap;
1868
+ }
1869
+
1870
+ body.jf-page-frame .frameHeaderActions{
1871
+ display:flex;
1872
+ align-items:center;
1873
+ justify-content:flex-end;
1874
+ gap:clamp(8px, 1.2vmin, 14px);
1875
+ }
1876
+
1877
+ body.jf-page-frame #toggleBtn,
1878
+ body.jf-page-frame .jfHiddenToggle{
1879
+ display:none !important;
1880
+ }
1881
+
1882
+ body.jf-page-frame .jfFrameMain{
1883
+ position:relative;
1884
+ min-height:0;
1885
+ height:100%;
1886
+ display:grid;
1887
+ gap:clamp(10px, 1.5vmin, 18px);
1888
+ grid-template-areas:
1889
+ "photo"
1890
+ "info"
1891
+ "metrics";
1892
+ grid-template-rows:minmax(230px, 42%) minmax(0, 1fr) auto;
1893
+ }
1894
+
1895
+ body.jf-page-frame .photoWrap{
1896
+ grid-area:photo;
1897
+ position:relative;
1898
+ min-height:0;
1899
+ overflow:hidden;
1900
+ border-radius:clamp(22px, 3vmin, 36px);
1901
+ border:1px solid rgba(255,255,255,.18);
1902
+ background:rgba(255,255,255,.06);
1903
+ }
1904
+
1905
+ body.jf-page-frame #planePhoto{
1906
+ width:100%;
1907
+ height:100%;
1908
+ object-fit:cover;
1909
+ display:none;
1910
+ }
1911
+
1912
+ body.jf-page-frame #placeholder{
1913
+ position:absolute;
1914
+ inset:0;
1915
+ display:grid;
1916
+ place-items:center;
1917
+ overflow:hidden;
1918
+ }
1919
+
1920
+ body.jf-page-frame .info{
1921
+ grid-area:info;
1922
+ min-height:0;
1923
+ overflow:hidden;
1924
+ display:flex;
1925
+ flex-direction:column;
1926
+ align-items:flex-start;
1927
+ gap:clamp(5px, .9vmin, 11px);
1928
+ }
1929
+
1930
+ body.jf-page-frame .mode{
1931
+ font-size:clamp(22px, 3.4vmin, 42px);
1932
+ font-weight:900;
1933
+ line-height:1;
1934
+ }
1935
+
1936
+ body.jf-page-frame .flightInfoPillRow{
1937
+ display:flex;
1938
+ align-items:center;
1939
+ gap:clamp(8px, 1.2vmin, 14px);
1940
+ flex-wrap:wrap;
1941
+ }
1942
+
1943
+ body.jf-page-frame .windowInfo,
1944
+ body.jf-page-frame .runwayInfo{
1945
+ display:none;
1946
+ align-items:center;
1947
+ gap:8px;
1948
+ border-radius:999px;
1949
+ padding:clamp(7px, 1vmin, 11px) clamp(12px, 1.6vmin, 20px);
1950
+ font-size:clamp(14px, 2vmin, 24px);
1951
+ font-weight:900;
1952
+ white-space:nowrap;
1953
+ }
1954
+
1955
+ body.jf-page-frame .runwayInfo.visible,
1956
+ body.jf-page-frame .windowInfo.visible{
1957
+ display:inline-flex;
1958
+ }
1959
+
1960
+ body.jf-page-frame .iataCallsign{
1961
+ font-size:clamp(42px, 7vmin, 82px);
1962
+ font-weight:950;
1963
+ letter-spacing:-.07em;
1964
+ line-height:.92;
1965
+ white-space:nowrap;
1966
+ }
1967
+
1968
+ body.jf-page-frame .operatorCallsign,
1969
+ body.jf-page-frame .routeCodes,
1970
+ body.jf-page-frame .reg{
1971
+ font-size:clamp(18px, 2.7vmin, 32px);
1972
+ font-weight:700;
1973
+ color:rgba(255,255,255,.62);
1974
+ letter-spacing:-.035em;
1975
+ }
1976
+
1977
+ body.jf-page-frame .routeCities{
1978
+ font-size:clamp(32px, 5.3vmin, 66px);
1979
+ font-weight:950;
1980
+ letter-spacing:-.07em;
1981
+ line-height:.98;
1982
+ white-space:nowrap;
1983
+ max-width:100%;
1984
+ overflow:hidden;
1985
+ text-overflow:ellipsis;
1986
+ }
1987
+
1988
+ body.jf-page-frame #aircraftCard.aircraftCard{
1989
+ margin-top:clamp(5px, .9vmin, 12px);
1990
+ display:grid;
1991
+ grid-template-columns:auto 1px auto auto auto;
1992
+ align-items:center;
1993
+ gap:clamp(8px, 1.15vmin, 15px);
1994
+ max-width:100%;
1995
+ border-radius:clamp(22px, 3vmin, 34px);
1996
+ border:1px solid rgba(255,255,255,.16);
1997
+ background:rgba(255,255,255,.075);
1998
+ padding:clamp(9px, 1.35vmin, 16px) clamp(12px, 1.8vmin, 22px);
1999
+ }
2000
+
2001
+ body.jf-page-frame #airlineMini,
2002
+ body.jf-page-frame #manufacturerLogo{
2003
+ display:inline-flex;
2004
+ align-items:center;
2005
+ gap:clamp(8px, 1.1vmin, 13px);
2006
+ min-width:0;
2007
+ }
2008
+
2009
+ body.jf-page-frame #airlineLogoImg,
2010
+ body.jf-page-frame #manufacturerLogoImg,
2011
+ body.jf-page-frame #manufacturerLogoText{
2012
+ width:clamp(28px, 4vmin, 46px);
2013
+ height:clamp(28px, 4vmin, 46px);
2014
+ border-radius:999px;
2015
+ object-fit:contain;
2016
+ flex:0 0 auto;
2017
+ }
2018
+
2019
+
2020
+
2021
+ body.jf-page-frame #aircraftSize{
2022
+ color:#ffe77a;
2023
+ }
2024
+
2025
+ body.jf-page-frame .aircraftSep{
2026
+ width:1px;
2027
+ height:clamp(28px, 4vmin, 48px);
2028
+ background:rgba(255,255,255,.16);
2029
+ }
2030
+
2031
+ body.jf-page-frame .special{
2032
+ display:none;
2033
+ }
2034
+
2035
+ body.jf-page-frame .metrics{
2036
+ grid-area:metrics;
2037
+ display:grid;
2038
+ grid-template-columns:repeat(4, minmax(0, 1fr));
2039
+ gap:clamp(8px, 1.3vmin, 16px);
2040
+ min-height:clamp(58px, 8.8vmin, 96px);
2041
+ }
2042
+
2043
+ body.jf-page-frame .metric{
2044
+ min-width:0;
2045
+ }
2046
+
2047
+ body.jf-page-frame .metricValue{
2048
+ font-size:clamp(27px, 4.8vmin, 56px);
2049
+ line-height:.9;
2050
+ white-space:nowrap;
2051
+ }
2052
+
2053
+ body.jf-page-frame .metricLabel{
2054
+ white-space:nowrap;
2055
+ }
2056
+
2057
+ /* Idle Runway Pill */
2058
+ body.jf-page-frame #idleRunwayText.idleRunwayText{
2059
+ display:none;
2060
+ position:absolute;
2061
+ left:50%;
2062
+ bottom:clamp(12px, 2.2vmin, 28px);
2063
+ transform:translateX(-50%);
2064
+ max-width:90%;
2065
+ border-radius:999px;
2066
+ padding:clamp(8px, 1.2vmin, 13px) clamp(14px, 1.8vmin, 22px);
2067
+ background:rgba(50,232,121,.15);
2068
+ border:1px solid rgba(50,232,121,.32);
2069
+ color:#dffff0;
2070
+ font-weight:850;
2071
+ white-space:nowrap;
2072
+ z-index:4;
2073
+ }
2074
+
2075
+ body.jf-page-frame #idleRunwayText.idleRunwayText.visible{
2076
+ display:inline-flex;
2077
+ }
2078
+
2079
+ /* No Flight */
2080
+ body.jf-page-frame.jf-no-flight .info .callsigns,
2081
+ body.jf-page-frame.jf-no-flight .routeBig,
2082
+ body.jf-page-frame.jf-no-flight #aircraftCard,
2083
+ body.jf-page-frame.jf-no-flight .reg,
2084
+ body.jf-page-frame.jf-no-flight .flightInfoPillRow{
2085
+ display:none !important;
2086
+ }
2087
+
2088
+ /* Preload Overlay */
2089
+ body.jf-page-frame .jfPreloadOverlay{
2090
+ position:absolute;
2091
+ inset:0;
2092
+ z-index:30;
2093
+ pointer-events:none;
2094
+ display:grid;
2095
+ gap:clamp(10px, 1.5vmin, 18px);
2096
+ grid-template-areas:
2097
+ "prePhoto"
2098
+ "preInfo"
2099
+ "preMetrics";
2100
+ grid-template-rows:minmax(230px, 42%) minmax(0, 1fr) auto;
2101
+ opacity:0;
2102
+ visibility:hidden;
2103
+ transition:opacity .18s ease, visibility .18s ease;
2104
+ }
2105
+
2106
+ body.jf-page-frame.jf-preload .jfPreloadOverlay{
2107
+ opacity:1;
2108
+ visibility:visible;
2109
+ }
2110
+
2111
+ body.jf-page-frame.jf-preload .photoWrap > *,
2112
+ body.jf-page-frame.jf-preload .info > *,
2113
+ body.jf-page-frame.jf-preload .metrics > *{
2114
+ opacity:0 !important;
2115
+ }
2116
+
2117
+ body.jf-page-frame .prePhoto{
2118
+ grid-area:prePhoto;
2119
+ border-radius:clamp(22px, 3vmin, 36px);
2120
+ border:1px solid rgba(255,255,255,.18);
2121
+ background:rgba(255,255,255,.06);
2122
+ }
2123
+
2124
+ body.jf-page-frame .preInfo{
2125
+ grid-area:preInfo;
2126
+ display:flex;
2127
+ flex-direction:column;
2128
+ align-items:flex-start;
2129
+ gap:clamp(8px, 1.05vmin, 13px);
2130
+ overflow:hidden;
2131
+ }
2132
+
2133
+ body.jf-page-frame .preMetrics{
2134
+ grid-area:preMetrics;
2135
+ display:grid;
2136
+ grid-template-columns:repeat(4, minmax(0, 1fr));
2137
+ gap:clamp(8px, 1.3vmin, 16px);
2138
+ min-height:clamp(58px, 8.8vmin, 96px);
2139
+ }
2140
+
2141
+ body.jf-page-frame .sk{
2142
+ display:block;
2143
+ border-radius:999px;
2144
+ background:linear-gradient(110deg, rgba(255,255,255,.10), rgba(255,255,255,.35), rgba(255,255,255,.10));
2145
+ background-size:240% 100%;
2146
+ animation:jfFrameSkeleton 1.12s ease-in-out infinite;
2147
+ }
2148
+
2149
+ body.jf-page-frame .skMode{width:min(360px,46%);height:clamp(26px,3.4vmin,42px)}
2150
+ body.jf-page-frame .prePillRow{display:flex;gap:clamp(8px,1.2vmin,14px)}
2151
+ body.jf-page-frame .skPillA{width:clamp(190px,28vmin,320px);height:clamp(34px,4.8vmin,52px)}
2152
+ body.jf-page-frame .skPillB{width:clamp(120px,17vmin,190px);height:clamp(34px,4.8vmin,52px)}
2153
+ body.jf-page-frame .skCall{width:min(340px,42%);height:clamp(42px,6.8vmin,82px)}
2154
+ body.jf-page-frame .skSmall{width:min(230px,28%);height:clamp(19px,2.8vmin,34px)}
2155
+ body.jf-page-frame .skRoute{width:min(720px,86%);height:clamp(34px,5.2vmin,66px)}
2156
+ body.jf-page-frame .skCodes{width:min(260px,35%);height:clamp(18px,2.8vmin,34px)}
2157
+ body.jf-page-frame .skReg{width:min(380px,48%);height:clamp(18px,2.7vmin,32px)}
2158
+
2159
+ body.jf-page-frame .preCard{
2160
+ width:min(620px,70%);
2161
+ border-radius:clamp(22px,3vmin,34px);
2162
+ border:1px solid rgba(255,255,255,.16);
2163
+ background:rgba(255,255,255,.075);
2164
+ padding:clamp(9px, 1.35vmin, 16px) clamp(12px, 1.8vmin, 22px);
2165
+ display:grid;
2166
+ gap:clamp(8px,1.15vmin,14px);
2167
+ }
2168
+
2169
+ body.jf-page-frame .preCardRow{
2170
+ display:grid;
2171
+ grid-template-columns:clamp(28px,4vmin,46px) minmax(0,1fr) auto;
2172
+ align-items:center;
2173
+ gap:clamp(8px,1.15vmin,15px);
2174
+ }
2175
+
2176
+ body.jf-page-frame .preLogo{
2177
+ width:clamp(28px,4vmin,46px);
2178
+ height:clamp(28px,4vmin,46px);
2179
+ border-radius:999px;
2180
+ background:rgba(255,255,255,.22);
2181
+ }
2182
+
2183
+ body.jf-page-frame .preDivider{
2184
+ height:1px;
2185
+ background:rgba(255,255,255,.16);
2186
+ }
2187
+
2188
+ body.jf-page-frame .skAirline{width:55%;height:clamp(16px,2.6vmin,32px)}
2189
+ body.jf-page-frame .skType{width:70%;height:clamp(16px,2.6vmin,32px)}
2190
+ body.jf-page-frame .skSize{width:clamp(90px,12vmin,150px);height:clamp(16px,2.4vmin,28px)}
2191
+
2192
+ body.jf-page-frame .preMetric{
2193
+ border-radius:clamp(19px,2.8vmin,30px);
2194
+ border:1px solid rgba(255,255,255,.18);
2195
+ background:rgba(255,255,255,.075);
2196
+ display:grid;
2197
+ place-items:center;
2198
+ align-content:center;
2199
+ }
2200
+
2201
+ body.jf-page-frame .preMetric .sk{
2202
+ width:48%;
2203
+ height:clamp(14px,2.1vmin,24px);
2204
+ }
2205
+
2206
+ @media (orientation:landscape){
2207
+ body.jf-page-frame .jfFrameMain,
2208
+ body.jf-page-frame .jfPreloadOverlay{
2209
+ grid-template-columns:minmax(0, 47%) minmax(0, 1fr);
2210
+ grid-template-rows:minmax(0, 1fr) auto;
2211
+ grid-template-areas:
2212
+ "photo info"
2213
+ "metrics metrics";
2214
+ }
2215
+
2216
+ body.jf-page-frame .jfPreloadOverlay{
2217
+ grid-template-areas:
2218
+ "prePhoto preInfo"
2219
+ "preMetrics preMetrics";
2220
+ }
2221
+
2222
+ body.jf-page-frame .info,
2223
+ body.jf-page-frame .preInfo{
2224
+ padding-top:clamp(2px,.5vmin,8px);
2225
+ }
2226
+
2227
+ body.jf-page-frame #aircraftCard.aircraftCard{
2228
+ width:max-content;
2229
+ max-width:100%;
2230
+ }
2231
+ }
2232
+
2233
+ @keyframes jfFrameSkeleton{
2234
+ 0%{background-position:120% 0;opacity:.55}
2235
+ 50%{opacity:1}
2236
+ 100%{background-position:-120% 0;opacity:.55}
2237
+ }
2238
+
2239
+
2240
+
2241
+ /* ======================================================
2242
+ FRAME PATCH: Window/Runway Pills + Special Pill
2243
+ ====================================================== */
2244
+
2245
+ body.jf-page-frame .windowInfo,
2246
+ body.jf-page-frame .runwayInfo{
2247
+ display:inline-flex;
2248
+ align-items:center;
2249
+ gap:8px;
2250
+ border-radius:999px;
2251
+ padding:clamp(7px, 1vmin, 11px) clamp(13px, 1.7vmin, 21px);
2252
+ font-weight:900;
2253
+ white-space:nowrap;
2254
+ border:1px solid rgba(255,255,255,.18);
2255
+ background:rgba(255,255,255,.08);
2256
+ color:rgba(255,255,255,.78);
2257
+ }
2258
+
2259
+ body.jf-page-frame .windowInfo{
2260
+ border-color:rgba(255,231,122,.34);
2261
+ background:rgba(255,231,122,.13);
2262
+ color:#fff0a2;
2263
+ }
2264
+
2265
+ body.jf-page-frame .runwayInfo{
2266
+ border-color:rgba(255,255,255,.18);
2267
+ background:rgba(255,255,255,.08);
2268
+ color:rgba(255,255,255,.78);
2269
+ }
2270
+
2271
+ body.jf-page-frame .special{
2272
+ display:none;
2273
+ margin-top:clamp(4px, .8vmin, 10px);
2274
+ border-radius:999px;
2275
+ padding:clamp(8px, 1.1vmin, 12px) clamp(14px, 1.8vmin, 22px);
2276
+ border:1px solid rgba(255,231,122,.36);
2277
+ background:rgba(255,231,122,.14);
2278
+ color:#fff0a2;
2279
+ font-size:clamp(15px, 2.1vmin, 25px);
2280
+ font-weight:900;
2281
+ white-space:nowrap;
2282
+ }
2283
+
2284
+ body.jf-page-frame .special:not(:empty){
2285
+ display:inline-flex;
2286
+ align-items:center;
2287
+ }
2288
+
2289
+ body.jf-page-frame .special.emergency{
2290
+ border-color:rgba(255,77,94,.42);
2291
+ background:rgba(255,77,94,.16);
2292
+ color:#ffd2d7;
2293
+ }
2294
+
2295
+
2296
+ /* ======================================================
2297
+ FRAME PATCH: Speaker rund + Metrics zentriert
2298
+ ====================================================== */
2299
+
2300
+ body.jf-page-frame #speechBtn.speechBtn{
2301
+ width:clamp(42px, 5.2vmin, 58px) !important;
2302
+ min-width:clamp(42px, 5.2vmin, 58px) !important;
2303
+ height:clamp(42px, 5.2vmin, 58px) !important;
2304
+ padding:0 !important;
2305
+ border-radius:999px !important;
2306
+ display:grid !important;
2307
+ place-items:center !important;
2308
+ line-height:1 !important;
2309
+ aspect-ratio:1 / 1 !important;
2310
+ background:rgba(255,255,255,.08) !important;
2311
+ border:1px solid rgba(255,255,255,.18) !important;
2312
+ }
2313
+
2314
+ body.jf-page-frame #speechBtn.speechBtn.on{
2315
+ background:rgba(255,255,255,.08) !important;
2316
+ border-color:rgba(255,255,255,.18) !important;
2317
+ }
2318
+
2319
+ body.jf-page-frame .metrics{
2320
+ align-items:stretch !important;
2321
+ }
2322
+
2323
+ body.jf-page-frame .metric{
2324
+ display:grid !important;
2325
+ place-items:center !important;
2326
+ align-content:center !important;
2327
+ justify-items:center !important;
2328
+ text-align:center !important;
2329
+ padding:clamp(7px, 1.1vmin, 12px) !important;
2330
+ }
2331
+
2332
+ body.jf-page-frame .metricValue{
2333
+ width:100% !important;
2334
+ text-align:center !important;
2335
+ justify-self:center !important;
2336
+ align-self:center !important;
2337
+ margin:0 auto !important;
2338
+ }
2339
+
2340
+ body.jf-page-frame .metricLabel{
2341
+ width:100% !important;
2342
+ text-align:center !important;
2343
+ justify-self:center !important;
2344
+ margin-left:0 !important;
2345
+ margin-right:0 !important;
2346
+ }
2347
+
2348
+
2349
+ /* ======================================================
2350
+ FRAME PATCH: kompakter + Speaker rund + Metrics sauber
2351
+ ====================================================== */
2352
+
2353
+ /* alles etwas kleiner, damit Special noch Platz hat */
2354
+ body.jf-page-frame .jfFrameMain{
2355
+ grid-template-rows:minmax(210px, 39%) minmax(0, 1fr) auto !important;
2356
+ gap:clamp(8px, 1.15vmin, 14px) !important;
2357
+ }
2358
+
2359
+ body.jf-page-frame .photoWrap{
2360
+ border-radius:clamp(20px, 2.6vmin, 32px) !important;
2361
+ }
2362
+
2363
+ body.jf-page-frame .info{
2364
+ gap:clamp(3px, .65vmin, 8px) !important;
2365
+ }
2366
+
2367
+ body.jf-page-frame .mode{
2368
+ font-size:clamp(20px, 3.0vmin, 36px) !important;
2369
+ }
2370
+
2371
+ body.jf-page-frame .iataCallsign{
2372
+ font-size:clamp(36px, 6.1vmin, 70px) !important;
2373
+ line-height:.9 !important;
2374
+ }
2375
+
2376
+ body.jf-page-frame .routeCities{
2377
+ font-size:clamp(28px, 4.7vmin, 56px) !important;
2378
+ line-height:.94 !important;
2379
+ }
2380
+
2381
+ body.jf-page-frame .operatorCallsign,
2382
+ body.jf-page-frame .routeCodes,
2383
+ body.jf-page-frame .reg{
2384
+ font-size:clamp(16px, 2.35vmin, 28px) !important;
2385
+ }
2386
+
2387
+ body.jf-page-frame .windowInfo,
2388
+ body.jf-page-frame .runwayInfo{
2389
+ font-size:clamp(13px, 1.75vmin, 21px) !important;
2390
+ padding:clamp(6px, .85vmin, 9px) clamp(11px, 1.45vmin, 17px) !important;
2391
+ }
2392
+
2393
+ body.jf-page-frame #aircraftCard.aircraftCard{
2394
+ width:min(560px, 70%) !important;
2395
+ padding:clamp(8px, 1.1vmin, 13px) clamp(12px, 1.5vmin, 18px) !important;
2396
+ border-radius:clamp(20px, 2.6vmin, 30px) !important;
2397
+ }
2398
+
2399
+
2400
+
2401
+ body.jf-page-frame #airlineLogoImg,
2402
+ body.jf-page-frame #manufacturerLogoImg,
2403
+ body.jf-page-frame #manufacturerLogoText{
2404
+ width:clamp(25px, 3.5vmin, 40px) !important;
2405
+ height:clamp(25px, 3.5vmin, 40px) !important;
2406
+ }
2407
+
2408
+ body.jf-page-frame .special{
2409
+ font-size:clamp(14px, 1.9vmin, 23px) !important;
2410
+ padding:clamp(6px, .85vmin, 10px) clamp(12px, 1.5vmin, 18px) !important;
2411
+ }
2412
+
2413
+ /* Speaker komplett unabhängig vom Toggle-Button */
2414
+ body.jf-page-frame #speechBtn,
2415
+ body.jf-page-frame #speechBtn.toggleBtn,
2416
+ body.jf-page-frame #speechBtn.speechBtn,
2417
+ body.jf-page-frame #speechBtn.toggleBtn.on,
2418
+ body.jf-page-frame #speechBtn.speechBtn.on{
2419
+ width:clamp(40px, 4.7vmin, 52px) !important;
2420
+ min-width:clamp(40px, 4.7vmin, 52px) !important;
2421
+ height:clamp(40px, 4.7vmin, 52px) !important;
2422
+ min-height:clamp(40px, 4.7vmin, 52px) !important;
2423
+ padding:0 !important;
2424
+ border-radius:999px !important;
2425
+ aspect-ratio:1 / 1 !important;
2426
+ display:grid !important;
2427
+ place-items:center !important;
2428
+ background:rgba(255,255,255,.08) !important;
2429
+ border:1px solid rgba(255,255,255,.18) !important;
2430
+ box-shadow:none !important;
2431
+ color:#fff !important;
2432
+ font-size:clamp(18px, 2.35vmin, 26px) !important;
2433
+ line-height:1 !important;
2434
+ }
2435
+
2436
+ /* Metrics kleiner und Inhalt wirklich mittig */
2437
+ body.jf-page-frame .metrics{
2438
+ min-height:clamp(54px, 7.8vmin, 84px) !important;
2439
+ gap:clamp(7px, 1.05vmin, 13px) !important;
2440
+ }
2441
+
2442
+ body.jf-page-frame .metric{
2443
+ min-height:clamp(54px, 7.8vmin, 84px) !important;
2444
+ padding:clamp(5px, .8vmin, 9px) !important;
2445
+ display:flex !important;
2446
+ flex-direction:column !important;
2447
+ align-items:center !important;
2448
+ justify-content:center !important;
2449
+ text-align:center !important;
2450
+ }
2451
+
2452
+ body.jf-page-frame .metricValue{
2453
+ font-size:clamp(24px, 4.1vmin, 46px) !important;
2454
+ line-height:.88 !important;
2455
+ width:100% !important;
2456
+ text-align:center !important;
2457
+ margin:0 !important;
2458
+ letter-spacing:-.06em !important;
2459
+ }
2460
+
2461
+ body.jf-page-frame .metricLabel{
2462
+ font-size:clamp(8px, 1.05vmin, 12px) !important;
2463
+ line-height:1 !important;
2464
+ letter-spacing:.22em !important;
2465
+ width:100% !important;
2466
+ text-align:center !important;
2467
+ margin-top:clamp(3px, .45vmin, 5px) !important;
2468
+ padding-left:.22em !important;
2469
+ }
2470
+
2471
+ /* Portrait noch etwas Luft unten */
2472
+ @media (orientation:portrait){
2473
+ body.jf-page-frame #wall.jf-shell{
2474
+ padding-bottom:clamp(14px, 2vmin, 24px) !important;
2475
+ }
2476
+
2477
+ body.jf-page-frame .jfFrameMain{
2478
+ grid-template-rows:minmax(200px, 38%) minmax(0, 1fr) auto !important;
2479
+ }
2480
+ }
2481
+
2482
+
2483
+ /* ======================================================
2484
+ FRAME PATCH: Speaker wie Live-Höhe + Preload synchron
2485
+ ====================================================== */
2486
+
2487
+ /* Speaker exakt gleiche Höhe wie Live-Pill, aber rund */
2488
+ body.jf-page-frame #speechBtn,
2489
+ body.jf-page-frame #speechBtn.toggleBtn,
2490
+ body.jf-page-frame #speechBtn.speechBtn,
2491
+ body.jf-page-frame #speechBtn.toggleBtn.on,
2492
+ body.jf-page-frame #speechBtn.speechBtn.on{
2493
+ width:clamp(38px, 4.2vmin, 48px) !important;
2494
+ min-width:clamp(38px, 4.2vmin, 48px) !important;
2495
+ height:clamp(38px, 4.2vmin, 48px) !important;
2496
+ min-height:clamp(38px, 4.2vmin, 48px) !important;
2497
+ padding:0 !important;
2498
+ border-radius:999px !important;
2499
+ aspect-ratio:1 / 1 !important;
2500
+ display:grid !important;
2501
+ place-items:center !important;
2502
+ font-size:clamp(17px, 2.05vmin, 23px) !important;
2503
+ line-height:1 !important;
2504
+ }
2505
+
2506
+ /* Preload bekommt exakt die gleiche neue Kompakt-Aufteilung wie echtes Layout */
2507
+ body.jf-page-frame .jfPreloadOverlay{
2508
+ grid-template-rows:minmax(200px, 38%) minmax(0, 1fr) auto !important;
2509
+ gap:clamp(8px, 1.15vmin, 14px) !important;
2510
+ }
2511
+
2512
+ body.jf-page-frame .prePhoto{
2513
+ border-radius:clamp(20px, 2.6vmin, 32px) !important;
2514
+ }
2515
+
2516
+ body.jf-page-frame .preInfo{
2517
+ gap:clamp(3px, .65vmin, 8px) !important;
2518
+ }
2519
+
2520
+ body.jf-page-frame .skMode{
2521
+ height:clamp(20px, 3.0vmin, 36px) !important;
2522
+ width:min(330px, 46%) !important;
2523
+ }
2524
+
2525
+ body.jf-page-frame .skPillA,
2526
+ body.jf-page-frame .skPillB{
2527
+ height:clamp(30px, 4.0vmin, 44px) !important;
2528
+ }
2529
+
2530
+ body.jf-page-frame .skPillA{ width:clamp(180px, 25vmin, 290px) !important; }
2531
+ body.jf-page-frame .skPillB{ width:clamp(110px, 15vmin, 170px) !important; }
2532
+
2533
+ body.jf-page-frame .skCall{
2534
+ height:clamp(36px, 6.1vmin, 70px) !important;
2535
+ width:min(310px, 42%) !important;
2536
+ }
2537
+
2538
+ body.jf-page-frame .skRoute{
2539
+ height:clamp(28px, 4.7vmin, 56px) !important;
2540
+ width:min(640px, 86%) !important;
2541
+ }
2542
+
2543
+ body.jf-page-frame .skSmall,
2544
+ body.jf-page-frame .skCodes,
2545
+ body.jf-page-frame .skReg{
2546
+ height:clamp(16px, 2.35vmin, 28px) !important;
2547
+ }
2548
+
2549
+ body.jf-page-frame .preCard{
2550
+ width:min(560px, 70%) !important;
2551
+ padding:clamp(8px, 1.1vmin, 13px) clamp(12px, 1.5vmin, 18px) !important;
2552
+ border-radius:clamp(20px, 2.6vmin, 30px) !important;
2553
+ }
2554
+
2555
+ body.jf-page-frame .preLogo{
2556
+ width:clamp(25px, 3.5vmin, 40px) !important;
2557
+ height:clamp(25px, 3.5vmin, 40px) !important;
2558
+ }
2559
+
2560
+ body.jf-page-frame .skAirline,
2561
+ body.jf-page-frame .skType{
2562
+ height:clamp(16px, 2.25vmin, 27px) !important;
2563
+ }
2564
+
2565
+ body.jf-page-frame .skSize{
2566
+ height:clamp(16px, 2.25vmin, 27px) !important;
2567
+ width:clamp(80px, 11vmin, 130px) !important;
2568
+ }
2569
+
2570
+ body.jf-page-frame .preMetrics{
2571
+ min-height:clamp(54px, 7.8vmin, 84px) !important;
2572
+ gap:clamp(7px, 1.05vmin, 13px) !important;
2573
+ }
2574
+
2575
+ body.jf-page-frame .preMetric{
2576
+ min-height:clamp(54px, 7.8vmin, 84px) !important;
2577
+ }
2578
+
2579
+ body.jf-page-frame .preMetric .sk{
2580
+ height:clamp(12px, 1.8vmin, 20px) !important;
2581
+ width:45% !important;
2582
+ }
2583
+
2584
+ @media (orientation:portrait){
2585
+ body.jf-page-frame .jfPreloadOverlay{
2586
+ grid-template-rows:minmax(200px, 38%) minmax(0, 1fr) auto !important;
2587
+ }
2588
+ }
2589
+
2590
+
2591
+
2592
+ /* ======================================================
2593
+ FRAME PATCH: Warte-auf-Flug sauber V2
2594
+ ====================================================== */
2595
+
2596
+ body.jf-page-frame .frameIdleRunwaySlot{
2597
+ grid-area:info;
2598
+ display:none;
2599
+ align-items:center;
2600
+ justify-content:center;
2601
+ width:100%;
2602
+ margin:0 0 clamp(6px, .9vmin, 10px) 0;
2603
+ z-index:4;
2604
+ }
2605
+
2606
+ body.jf-page-frame.jf-no-flight .frameIdleRunwaySlot{
2607
+ display:flex !important;
2608
+ }
2609
+
2610
+ body.jf-page-frame #idleRunwayText.idleRunwayText{
2611
+ position:relative !important;
2612
+ left:auto !important;
2613
+ right:auto !important;
2614
+ top:auto !important;
2615
+ bottom:auto !important;
2616
+ transform:none !important;
2617
+ display:none;
2618
+ max-width:92%;
2619
+ border-radius:999px;
2620
+ padding:clamp(8px, 1.1vmin, 13px) clamp(16px, 1.9vmin, 24px);
2621
+ background:rgba(50,232,121,.16);
2622
+ border:1px solid rgba(50,232,121,.36);
2623
+ color:#dffff0;
2624
+ font-weight:900;
2625
+ white-space:nowrap;
2626
+ text-align:center;
2627
+ }
2628
+
2629
+ body.jf-page-frame.jf-no-flight #idleRunwayText.idleRunwayText.visible{
2630
+ display:inline-flex !important;
2631
+ align-items:center;
2632
+ justify-content:center;
2633
+ }
2634
+
2635
+ /* Wartezustand: keine leeren Fake-Daten */
2636
+ body.jf-page-frame.jf-no-flight .info{
2637
+ align-items:center !important;
2638
+ text-align:center !important;
2639
+ justify-content:flex-start !important;
2640
+ }
2641
+
2642
+ body.jf-page-frame.jf-no-flight .info > :not(#mode){
2643
+ display:none !important;
2644
+ }
2645
+
2646
+ body.jf-page-frame.jf-no-flight .metrics{
2647
+ display:none !important;
2648
+ }
2649
+
2650
+ body.jf-page-frame.jf-no-flight #mode{
2651
+ margin-top:clamp(6px, 1vmin, 12px) !important;
2652
+ font-size:clamp(24px, 3.5vmin, 42px) !important;
2653
+ }
2654
+
2655
+ /* Wartezustand: Foto bleibt Radar/Animation */
2656
+ body.jf-page-frame.jf-no-flight #planePhoto{
2657
+ display:none !important;
2658
+ opacity:0 !important;
2659
+ visibility:hidden !important;
2660
+ }
2661
+
2662
+ body.jf-page-frame.jf-no-flight #placeholder{
2663
+ display:grid !important;
2664
+ opacity:1 !important;
2665
+ visibility:visible !important;
2666
+ background:
2667
+ radial-gradient(circle at 50% 45%, rgba(255,255,255,.08), transparent 34%),
2668
+ linear-gradient(135deg, rgba(255,255,255,.07), rgba(255,255,255,.025)) !important;
2669
+ }
2670
+
2671
+ body.jf-page-frame.jf-no-flight .radarCircle{
2672
+ position:absolute;
2673
+ width:min(48vmin, 360px);
2674
+ aspect-ratio:1;
2675
+ border-radius:999px;
2676
+ border:1px solid rgba(255,255,255,.15);
2677
+ box-shadow:
2678
+ 0 0 0 11vmin rgba(255,255,255,.018),
2679
+ 0 0 0 22vmin rgba(255,255,255,.012);
2680
+ }
2681
+
2682
+ body.jf-page-frame.jf-no-flight .radarSweep{
2683
+ position:absolute;
2684
+ width:min(48vmin, 360px);
2685
+ aspect-ratio:1;
2686
+ border-radius:999px;
2687
+ background:conic-gradient(from 0deg, rgba(50,232,121,.30), transparent 18%, transparent);
2688
+ animation:jfRadarSpin2 2.8s linear infinite;
2689
+ opacity:.42;
2690
+ }
2691
+
2692
+ body.jf-page-frame.jf-no-flight .idlePlane{
2693
+ position:relative;
2694
+ z-index:3;
2695
+ font-size:clamp(42px, 7vmin, 78px);
2696
+ filter:drop-shadow(0 10px 24px rgba(0,0,0,.35));
2697
+ }
2698
+
2699
+ body.jf-page-frame .idleFlyers{
2700
+ display:none;
2701
+ }
2702
+
2703
+ body.jf-page-frame.jf-no-flight .idleFlyers{
2704
+ display:block;
2705
+ position:absolute;
2706
+ inset:0;
2707
+ pointer-events:none;
2708
+ overflow:hidden;
2709
+ z-index:2;
2710
+ }
2711
+
2712
+ body.jf-page-frame.jf-no-flight .idleFlyers span{
2713
+ position:absolute;
2714
+ left:-14%;
2715
+ font-size:clamp(20px, 3.2vmin, 34px);
2716
+ opacity:0;
2717
+ filter:drop-shadow(0 8px 18px rgba(0,0,0,.35));
2718
+ animation:jfIdleFly2 5.8s ease-in-out infinite;
2719
+ }
2720
+
2721
+ body.jf-page-frame.jf-no-flight .idleFlyers span:nth-child(1){ top:30%; animation-delay:.2s; }
2722
+ body.jf-page-frame.jf-no-flight .idleFlyers span:nth-child(2){ top:58%; animation-delay:1.8s; }
2723
+ body.jf-page-frame.jf-no-flight .idleFlyers span:nth-child(3){ top:44%; animation-delay:3.4s; }
2724
+
2725
+ body.jf-page-frame.jf-no-flight .idleText{
2726
+ position:absolute;
2727
+ left:50%;
2728
+ bottom:clamp(16px, 2.5vmin, 32px);
2729
+ transform:translateX(-50%);
2730
+ font-weight:850;
2731
+ font-size:clamp(18px, 2.5vmin, 28px);
2732
+ color:rgba(255,255,255,.72);
2733
+ white-space:nowrap;
2734
+ z-index:3;
2735
+ }
2736
+
2737
+ @keyframes jfRadarSpin2{
2738
+ to{ transform:rotate(360deg); }
2739
+ }
2740
+
2741
+ @keyframes jfIdleFly2{
2742
+ 0%{ transform:translateX(0) translateY(20px) rotate(8deg); opacity:0; }
2743
+ 12%{ opacity:.85; }
2744
+ 82%{ opacity:.85; }
2745
+ 100%{ transform:translateX(115vw) translateY(-38px) rotate(8deg); opacity:0; }
2746
+ }
2747
+
2748
+ /* ======================================================
2749
+ FRAME PATCH: sauberer Übergang Warteanimation -> Flug
2750
+ ====================================================== */
2751
+
2752
+ /* Sobald echter Flug erkannt:
2753
+ Radar sofort weg
2754
+ aber Skeleton darf bleiben */
2755
+ body.jf-page-frame.jf-preload:not(.jf-no-flight) #placeholder{
2756
+ opacity:0 !important;
2757
+ visibility:hidden !important;
2758
+ pointer-events:none !important;
2759
+ transition:
2760
+ opacity .22s ease,
2761
+ visibility .22s ease !important;
2762
+ }
2763
+
2764
+ /* Flugfoto schon weich einblenden während Skeleton noch sichtbar */
2765
+ body.jf-page-frame.jf-preload:not(.jf-no-flight) #planePhoto{
2766
+ display:block !important;
2767
+ opacity:.22 !important;
2768
+ filter:blur(3px) saturate(.9);
2769
+ transform:scale(1.01);
2770
+ transition:
2771
+ opacity .28s ease,
2772
+ filter .35s ease,
2773
+ transform .35s ease !important;
2774
+ }
2775
+
2776
+ /* Nach preload echtes Bild vollständig */
2777
+ body.jf-page-frame.jf-loaded #planePhoto{
2778
+ opacity:1 !important;
2779
+ filter:none !important;
2780
+ transform:none !important;
2781
+ }
2782
+
2783
+ /* Skeleton etwas transparenter sobald echte Flugdaten da sind */
2784
+ body.jf-page-frame.jf-preload:not(.jf-no-flight) .jfPreloadOverlay{
2785
+ background:
2786
+ linear-gradient(
2787
+ 180deg,
2788
+ rgba(5,6,10,.10),
2789
+ rgba(5,6,10,.18)
2790
+ ) !important;
2791
+
2792
+ backdrop-filter:blur(2px);
2793
+ }
2794
+
2795
+ /* Skeleton nicht mehr komplett dominant */
2796
+ body.jf-page-frame.jf-preload:not(.jf-no-flight) .sk{
2797
+ opacity:.72 !important;
2798
+ }
2799
+
2800
+ /* Warteanimation NUR wenn wirklich jf-no-flight */
2801
+ body.jf-page-frame:not(.jf-no-flight) .idlePlane,
2802
+ body.jf-page-frame:not(.jf-no-flight) .idleFlyers,
2803
+ body.jf-page-frame:not(.jf-no-flight) .radarCircle,
2804
+ body.jf-page-frame:not(.jf-no-flight) .radarSweep,
2805
+ body.jf-page-frame:not(.jf-no-flight) .idleText{
2806
+ display:none !important;
2807
+ }
2808
+
2809
+
2810
+ /* ======================================================
2811
+ FRAME PATCH: Querformat getrennt iPad / iPhone
2812
+ ====================================================== */
2813
+
2814
+ /* ------------------------------------------------------
2815
+ iPad / Tablet Querformat
2816
+ Ziel: Layout behalten, aber Metrics unten flacher
2817
+ ------------------------------------------------------ */
2818
+ @media (orientation:landscape) and (min-width: 900px) and (min-height: 600px){
2819
+
2820
+ body.jf-page-frame #wall.jf-shell{
2821
+ gap:clamp(8px, 1.1vmin, 14px) !important;
2822
+ }
2823
+
2824
+ body.jf-page-frame .jfFrameMain,
2825
+ body.jf-page-frame .jfPreloadOverlay{
2826
+ grid-template-columns:minmax(0, 47%) minmax(0, 1fr) !important;
2827
+ grid-template-rows:minmax(0, 1fr) clamp(54px, 8vh, 74px) !important;
2828
+ gap:clamp(8px, 1.1vmin, 14px) !important;
2829
+ }
2830
+
2831
+ body.jf-page-frame .metrics,
2832
+ body.jf-page-frame .preMetrics{
2833
+ min-height:clamp(54px, 8vh, 74px) !important;
2834
+ height:clamp(54px, 8vh, 74px) !important;
2835
+ gap:clamp(8px, 1.1vmin, 14px) !important;
2836
+ }
2837
+
2838
+ body.jf-page-frame .metric,
2839
+ body.jf-page-frame .preMetric{
2840
+ min-height:clamp(54px, 8vh, 74px) !important;
2841
+ height:clamp(54px, 8vh, 74px) !important;
2842
+ border-radius:clamp(16px, 2.1vmin, 24px) !important;
2843
+ padding:clamp(4px, .7vmin, 8px) !important;
2844
+ }
2845
+
2846
+ body.jf-page-frame .metricValue{
2847
+ font-size:clamp(24px, 4.2vmin, 42px) !important;
2848
+ line-height:.86 !important;
2849
+ }
2850
+
2851
+ body.jf-page-frame .metricLabel{
2852
+ font-size:clamp(7px, .95vmin, 11px) !important;
2853
+ letter-spacing:.20em !important;
2854
+ margin-top:clamp(2px, .35vmin, 4px) !important;
2855
+ }
2856
+
2857
+ body.jf-page-frame .preMetric .sk{
2858
+ height:clamp(10px, 1.4vmin, 16px) !important;
2859
+ }
2860
+ }
2861
+
2862
+
2863
+ /* ------------------------------------------------------
2864
+ iPhone Querformat / sehr niedrige Höhe
2865
+ Ziel: rechte Info-Spalte deutlich kompakter
2866
+ ------------------------------------------------------ */
2867
+ @media (orientation:landscape) and (max-height: 520px){
2868
+
2869
+ body.jf-page-frame #app{
2870
+ padding:calc(env(safe-area-inset-top) + 6px)
2871
+ calc(env(safe-area-inset-right) + 8px)
2872
+ calc(env(safe-area-inset-bottom) + 6px)
2873
+ calc(env(safe-area-inset-left) + 8px) !important;
2874
+ }
2875
+
2876
+ body.jf-page-frame #wall.jf-shell{
2877
+ padding:clamp(8px, 1.6vmin, 14px) !important;
2878
+ gap:clamp(6px, 1vmin, 10px) !important;
2879
+ border-radius:clamp(22px, 3.2vmin, 32px) !important;
2880
+ }
2881
+
2882
+ body.jf-page-frame .header{
2883
+ gap:clamp(7px, 1.1vmin, 12px) !important;
2884
+ }
2885
+
2886
+ body.jf-page-frame .title{
2887
+ font-size:clamp(23px, 5.1vmin, 36px) !important;
2888
+ line-height:.88 !important;
2889
+ }
2890
+
2891
+ body.jf-page-frame .sub{
2892
+ font-size:clamp(12px, 2.5vmin, 18px) !important;
2893
+ line-height:1 !important;
2894
+ }
2895
+
2896
+ body.jf-page-frame .backBtn,
2897
+ body.jf-page-frame #speechBtn,
2898
+ body.jf-page-frame #speechBtn.toggleBtn,
2899
+ body.jf-page-frame #speechBtn.speechBtn{
2900
+ width:clamp(32px, 6.2vmin, 42px) !important;
2901
+ min-width:clamp(32px, 6.2vmin, 42px) !important;
2902
+ height:clamp(32px, 6.2vmin, 42px) !important;
2903
+ min-height:clamp(32px, 6.2vmin, 42px) !important;
2904
+ font-size:clamp(15px, 3vmin, 21px) !important;
2905
+ }
2906
+
2907
+ body.jf-page-frame .livePill{
2908
+ height:clamp(32px, 6.2vmin, 42px) !important;
2909
+ padding:0 clamp(10px, 2vmin, 16px) !important;
2910
+ font-size:clamp(14px, 2.8vmin, 20px) !important;
2911
+ }
2912
+
2913
+ body.jf-page-frame .jfFrameMain,
2914
+ body.jf-page-frame .jfPreloadOverlay{
2915
+ grid-template-columns:minmax(0, 48%) minmax(0, 1fr) !important;
2916
+ grid-template-rows:minmax(0, 1fr) clamp(44px, 12vh, 58px) !important;
2917
+ gap:clamp(6px, 1vmin, 10px) !important;
2918
+ }
2919
+
2920
+ body.jf-page-frame .photoWrap,
2921
+ body.jf-page-frame .prePhoto{
2922
+ border-radius:clamp(16px, 3vmin, 24px) !important;
2923
+ }
2924
+
2925
+ body.jf-page-frame .info,
2926
+ body.jf-page-frame .preInfo{
2927
+ gap:clamp(2px, .65vmin, 5px) !important;
2928
+ padding-top:0 !important;
2929
+ }
2930
+
2931
+ body.jf-page-frame .mode{
2932
+ font-size:clamp(17px, 3.3vmin, 24px) !important;
2933
+ line-height:.95 !important;
2934
+ }
2935
+
2936
+ body.jf-page-frame .windowInfo,
2937
+ body.jf-page-frame .runwayInfo{
2938
+ font-size:clamp(10px, 2.15vmin, 15px) !important;
2939
+ padding:clamp(4px, .8vmin, 6px) clamp(8px, 1.5vmin, 12px) !important;
2940
+ }
2941
+
2942
+ body.jf-page-frame .iataCallsign{
2943
+ font-size:clamp(28px, 6.2vmin, 44px) !important;
2944
+ line-height:.82 !important;
2945
+ }
2946
+
2947
+ body.jf-page-frame .operatorCallsign,
2948
+ body.jf-page-frame .routeCodes,
2949
+ body.jf-page-frame .reg{
2950
+ font-size:clamp(12px, 2.45vmin, 17px) !important;
2951
+ line-height:1 !important;
2952
+ }
2953
+
2954
+ body.jf-page-frame .routeCities{
2955
+ font-size:clamp(22px, 5.1vmin, 36px) !important;
2956
+ line-height:.86 !important;
2957
+ }
2958
+
2959
+ body.jf-page-frame #aircraftCard.aircraftCard{
2960
+ width:min(440px, 92%) !important;
2961
+ padding:clamp(5px, 1vmin, 8px) clamp(8px, 1.5vmin, 12px) !important;
2962
+ border-radius:clamp(15px, 2.8vmin, 22px) !important;
2963
+ margin-top:clamp(2px, .45vmin, 4px) !important;
2964
+ }
2965
+
2966
+ body.jf-page-frame #aircraftCard .aircraftSep{
2967
+ margin:clamp(4px, .75vmin, 6px) 0 !important;
2968
+ }
2969
+
2970
+ body.jf-page-frame #airlineLogoImg,
2971
+ body.jf-page-frame #manufacturerLogoImg,
2972
+ body.jf-page-frame #manufacturerLogoText{
2973
+ width:clamp(20px, 4.2vmin, 28px) !important;
2974
+ height:clamp(20px, 4.2vmin, 28px) !important;
2975
+ }
2976
+
2977
+
2978
+
2979
+
2980
+
2981
+ body.jf-page-frame .special{
2982
+ font-size:clamp(11px, 2.25vmin, 16px) !important;
2983
+ padding:clamp(4px, .8vmin, 6px) clamp(8px, 1.5vmin, 12px) !important;
2984
+ }
2985
+
2986
+ body.jf-page-frame .metrics,
2987
+ body.jf-page-frame .preMetrics{
2988
+ min-height:clamp(44px, 12vh, 58px) !important;
2989
+ height:clamp(44px, 12vh, 58px) !important;
2990
+ gap:clamp(6px, 1vmin, 10px) !important;
2991
+ }
2992
+
2993
+ body.jf-page-frame .metric,
2994
+ body.jf-page-frame .preMetric{
2995
+ min-height:clamp(44px, 12vh, 58px) !important;
2996
+ height:clamp(44px, 12vh, 58px) !important;
2997
+ border-radius:clamp(14px, 2.6vmin, 20px) !important;
2998
+ padding:3px !important;
2999
+ }
3000
+
3001
+ body.jf-page-frame .metricValue{
3002
+ font-size:clamp(19px, 4.7vmin, 32px) !important;
3003
+ line-height:.82 !important;
3004
+ }
3005
+
3006
+ body.jf-page-frame .metricLabel{
3007
+ font-size:clamp(6px, 1.35vmin, 9px) !important;
3008
+ letter-spacing:.18em !important;
3009
+ margin-top:2px !important;
3010
+ }
3011
+ }
3012
+
3013
+
3014
+ /* ======================================================
3015
+ FRAME PATCH: Warteanzeige erst nach Preload
3016
+ ====================================================== */
3017
+
3018
+ /* zweites "Warte auf Flug" unter dem Bild entfernen */
3019
+ body.jf-page-frame.jf-no-flight .info,
3020
+ body.jf-page-frame.jf-no-flight #mode{
3021
+ display:none !important;
3022
+ }
3023
+
3024
+ /* grüne Runway-Pille ebenfalls erst nach Preload zeigen */
3025
+ body.jf-page-frame.jf-preload .frameIdleRunwaySlot,
3026
+ body.jf-page-frame.jf-preload #idleRunwayText{
3027
+ display:none !important;
3028
+ }
3029
+
3030
+ /* während Preload KEINE Radar-/Warteanimation anzeigen */
3031
+ body.jf-page-frame.jf-preload.jf-no-flight #placeholder,
3032
+ body.jf-page-frame.jf-preload.jf-no-flight .radarCircle,
3033
+ body.jf-page-frame.jf-preload.jf-no-flight .radarSweep,
3034
+ body.jf-page-frame.jf-preload.jf-no-flight .idlePlane,
3035
+ body.jf-page-frame.jf-preload.jf-no-flight .idleFlyers,
3036
+ body.jf-page-frame.jf-preload.jf-no-flight .idleText{
3037
+ opacity:0 !important;
3038
+ visibility:hidden !important;
3039
+ }
3040
+
3041
+ /* nach Preload darf die Warteanimation sichtbar sein */
3042
+ body.jf-page-frame.jf-loaded.jf-no-flight #placeholder{
3043
+ opacity:1 !important;
3044
+ visibility:visible !important;
3045
+ }
3046
+
3047
+
3048
+ /* ======================================================
3049
+ FRAME PATCH: Querformat luftiger + Speaker kleiner
3050
+ ====================================================== */
3051
+
3052
+ /* Speaker wirklich passend zur Live-Pill */
3053
+ body.jf-page-frame #speechBtn,
3054
+ body.jf-page-frame #speechBtn.toggleBtn,
3055
+ body.jf-page-frame #speechBtn.speechBtn{
3056
+ width:clamp(34px, 4.0vmin, 44px) !important;
3057
+ min-width:clamp(34px, 4.0vmin, 44px) !important;
3058
+ height:clamp(34px, 4.0vmin, 44px) !important;
3059
+ min-height:clamp(34px, 4.0vmin, 44px) !important;
3060
+ padding:0 !important;
3061
+ border-radius:999px !important;
3062
+ font-size:clamp(15px, 1.9vmin, 21px) !important;
3063
+ display:grid !important;
3064
+ place-items:center !important;
3065
+ }
3066
+
3067
+ /* Querformat allgemein luftiger */
3068
+ @media (orientation:landscape){
3069
+
3070
+ body.jf-page-frame .jfFrameMain,
3071
+ body.jf-page-frame .jfPreloadOverlay{
3072
+ grid-template-columns:minmax(0, 46%) minmax(0, 1fr) !important;
3073
+ gap:clamp(14px, 2.2vmin, 26px) !important;
3074
+ }
3075
+
3076
+ body.jf-page-frame .info,
3077
+ body.jf-page-frame .preInfo{
3078
+ padding-left:clamp(4px, .8vmin, 12px) !important;
3079
+ gap:clamp(4px, .8vmin, 9px) !important;
3080
+ }
3081
+
3082
+ body.jf-page-frame .photoWrap,
3083
+ body.jf-page-frame .prePhoto{
3084
+ align-self:start !important;
3085
+ }
3086
+
3087
+ body.jf-page-frame #aircraftCard.aircraftCard{
3088
+ width:min(620px, 92%) !important;
3089
+ }
3090
+
3091
+ body.jf-page-frame .metrics,
3092
+ body.jf-page-frame .preMetrics{
3093
+ height:clamp(48px, 10vh, 68px) !important;
3094
+ min-height:clamp(48px, 10vh, 68px) !important;
3095
+ }
3096
+
3097
+ body.jf-page-frame .metric,
3098
+ body.jf-page-frame .preMetric{
3099
+ height:clamp(48px, 10vh, 68px) !important;
3100
+ min-height:clamp(48px, 10vh, 68px) !important;
3101
+ }
3102
+
3103
+ body.jf-page-frame .metricValue{
3104
+ font-size:clamp(22px, 4.1vmin, 38px) !important;
3105
+ }
3106
+
3107
+ body.jf-page-frame .metricLabel{
3108
+ font-size:clamp(7px, 1.05vmin, 10px) !important;
3109
+ }
3110
+ }
3111
+
3112
+ /* iPhone quer: nicht mehr so brutal zusammenpressen */
3113
+ @media (orientation:landscape) and (max-height: 520px){
3114
+
3115
+ body.jf-page-frame .jfFrameMain,
3116
+ body.jf-page-frame .jfPreloadOverlay{
3117
+ grid-template-columns:minmax(0, 47%) minmax(0, 1fr) !important;
3118
+ gap:clamp(10px, 1.8vmin, 18px) !important;
3119
+ }
3120
+
3121
+ body.jf-page-frame .mode{
3122
+ font-size:clamp(18px, 3.7vmin, 26px) !important;
3123
+ }
3124
+
3125
+ body.jf-page-frame .iataCallsign{
3126
+ font-size:clamp(30px, 6.6vmin, 46px) !important;
3127
+ }
3128
+
3129
+ body.jf-page-frame .routeCities{
3130
+ font-size:clamp(23px, 5.3vmin, 38px) !important;
3131
+ }
3132
+
3133
+ body.jf-page-frame #aircraftCard.aircraftCard{
3134
+ width:min(520px, 94%) !important;
3135
+ }
3136
+ }
3137
+
3138
+
3139
+ /* ======================================================
3140
+ FRAME PATCH: Querformat Höhe / Speaker final
3141
+ ====================================================== */
3142
+
3143
+ /* Speaker nochmal kleiner + optisch exakt Live-Pill */
3144
+ body.jf-page-frame #speechBtn,
3145
+ body.jf-page-frame #speechBtn.toggleBtn,
3146
+ body.jf-page-frame #speechBtn.speechBtn{
3147
+ width:clamp(30px, 3.5vmin, 40px) !important;
3148
+ min-width:clamp(30px, 3.5vmin, 40px) !important;
3149
+ height:clamp(30px, 3.5vmin, 40px) !important;
3150
+ min-height:clamp(30px, 3.5vmin, 40px) !important;
3151
+ font-size:clamp(13px, 1.55vmin, 18px) !important;
3152
+ padding:0 !important;
3153
+ border-radius:999px !important;
3154
+ display:grid !important;
3155
+ place-items:center !important;
3156
+ }
3157
+
3158
+ /* ------------------------------------------------------
3159
+ Querformat allgemein
3160
+ ------------------------------------------------------ */
3161
+ @media (orientation:landscape){
3162
+
3163
+ /* Bild wieder höher */
3164
+ body.jf-page-frame .jfFrameMain,
3165
+ body.jf-page-frame .jfPreloadOverlay{
3166
+ grid-template-rows:minmax(0, 1fr) clamp(54px, 9vh, 72px) !important;
3167
+ }
3168
+
3169
+ body.jf-page-frame .photoWrap,
3170
+ body.jf-page-frame .prePhoto{
3171
+ min-height:clamp(260px, 56vh, 560px) !important;
3172
+ max-height:none !important;
3173
+ }
3174
+
3175
+ /* Textspalte etwas entspannter */
3176
+ body.jf-page-frame .info,
3177
+ body.jf-page-frame .preInfo{
3178
+ padding-top:clamp(4px, .8vmin, 10px) !important;
3179
+ }
3180
+
3181
+ /* Route-Zeile NICHT mehr abschneiden */
3182
+ body.jf-page-frame .routeCities{
3183
+ line-height:1.02 !important;
3184
+ padding-bottom:.08em !important;
3185
+ overflow:visible !important;
3186
+ }
3187
+
3188
+ /* Callsign ebenfalls etwas luftiger */
3189
+ body.jf-page-frame .iataCallsign{
3190
+ line-height:.92 !important;
3191
+ padding-bottom:.03em !important;
3192
+ }
3193
+
3194
+ /* Aircraft Card minimal tiefer */
3195
+ body.jf-page-frame #aircraftCard.aircraftCard{
3196
+ margin-top:clamp(4px, .7vmin, 8px) !important;
3197
+ }
3198
+
3199
+ /* Metrics weiterhin kompakt */
3200
+ body.jf-page-frame .metrics,
3201
+ body.jf-page-frame .preMetrics{
3202
+ height:clamp(50px, 9vh, 68px) !important;
3203
+ min-height:clamp(50px, 9vh, 68px) !important;
3204
+ }
3205
+ }
3206
+
3207
+ /* ------------------------------------------------------
3208
+ iPhone Querformat
3209
+ ------------------------------------------------------ */
3210
+ @media (orientation:landscape) and (max-height: 520px){
3211
+
3212
+ /* Bild nochmal sichtbar höher */
3213
+ body.jf-page-frame .photoWrap,
3214
+ body.jf-page-frame .prePhoto{
3215
+ min-height:clamp(210px, 60vh, 360px) !important;
3216
+ }
3217
+
3218
+ /* Bangkok/Frankfurt etc sauber */
3219
+ body.jf-page-frame .routeCities{
3220
+ line-height:1.04 !important;
3221
+ padding-bottom:.10em !important;
3222
+ font-size:clamp(24px, 5.5vmin, 40px) !important;
3223
+ }
3224
+
3225
+ /* etwas mehr Luft unter Callsign */
3226
+ body.jf-page-frame .iataCallsign{
3227
+ line-height:.94 !important;
3228
+ margin-bottom:2px !important;
3229
+ }
3230
+
3231
+ /* Info insgesamt weniger gequetscht */
3232
+ body.jf-page-frame .info,
3233
+ body.jf-page-frame .preInfo{
3234
+ gap:clamp(5px, .9vmin, 10px) !important;
3235
+ }
3236
+
3237
+ /* Metrics unten etwas niedriger */
3238
+ body.jf-page-frame .metric,
3239
+ body.jf-page-frame .preMetric{
3240
+ height:clamp(46px, 10vh, 60px) !important;
3241
+ min-height:clamp(46px, 10vh, 60px) !important;
3242
+ }
3243
+ }
3244
+
3245
+
3246
+ /* ======================================================
3247
+ FRAME PATCH: Landscape Bild/Route/Speaker/Card
3248
+ ====================================================== */
3249
+
3250
+ /* Speaker exakt Live-Pill-Höhe */
3251
+ body.jf-page-frame #speechBtn,
3252
+ body.jf-page-frame #speechBtn.toggleBtn,
3253
+ body.jf-page-frame #speechBtn.speechBtn{
3254
+ height:var(--jf-live-pill-h, 44px) !important;
3255
+ min-height:var(--jf-live-pill-h, 44px) !important;
3256
+ width:var(--jf-live-pill-h, 44px) !important;
3257
+ min-width:var(--jf-live-pill-h, 44px) !important;
3258
+ padding:0 !important;
3259
+ border-radius:999px !important;
3260
+ aspect-ratio:1 / 1 !important;
3261
+ display:grid !important;
3262
+ place-items:center !important;
3263
+ font-size:calc(var(--jf-live-pill-h, 44px) * .43) !important;
3264
+ line-height:1 !important;
3265
+ }
3266
+
3267
+ body.jf-page-frame .livePill{
3268
+ --jf-live-pill-h: clamp(34px, 4.0vmin, 44px);
3269
+ height:var(--jf-live-pill-h) !important;
3270
+ }
3271
+
3272
+ /* Querformat */
3273
+ @media (orientation:landscape){
3274
+
3275
+ /* Bildbereich stärker strecken */
3276
+ body.jf-page-frame .jfFrameMain,
3277
+ body.jf-page-frame .jfPreloadOverlay{
3278
+ grid-template-columns:minmax(0, 48%) minmax(0, 1fr) !important;
3279
+ grid-template-rows:minmax(0, 1fr) clamp(48px, 8.5vh, 64px) !important;
3280
+ }
3281
+
3282
+ body.jf-page-frame .photoWrap,
3283
+ body.jf-page-frame .prePhoto{
3284
+ height:100% !important;
3285
+ min-height:clamp(280px, 62vh, 620px) !important;
3286
+ }
3287
+
3288
+ body.jf-page-frame #planePhoto{
3289
+ width:100% !important;
3290
+ height:100% !important;
3291
+ object-fit:cover !important;
3292
+ }
3293
+
3294
+ /* Route-Zeile sauber, kein abgeschnittenes g mehr */
3295
+ body.jf-page-frame .routeCities{
3296
+ line-height:1.16 !important;
3297
+ padding-bottom:.14em !important;
3298
+ margin-bottom:-.04em !important;
3299
+ overflow:visible !important;
3300
+ }
3301
+
3302
+ body.jf-page-frame .routeCodes{
3303
+ margin-top:-.10em !important;
3304
+ }
3305
+
3306
+ /* Aircraft-Card kompakter und weniger breit */
3307
+ body.jf-page-frame #aircraftCard.aircraftCard{
3308
+ width:max-content !important;
3309
+ min-width:min(360px, 76%) !important;
3310
+ max-width:min(520px, 82%) !important;
3311
+ padding-left:clamp(10px, 1.35vmin, 16px) !important;
3312
+ padding-right:clamp(10px, 1.35vmin, 16px) !important;
3313
+ }
3314
+
3315
+
3316
+
3317
+ body.jf-page-frame #aircraftCard #aircraftSize{
3318
+ margin-left:clamp(12px, 1.8vmin, 22px) !important;
3319
+ }
3320
+ }
3321
+
3322
+ /* iPhone Querformat extra */
3323
+ @media (orientation:landscape) and (max-height:520px){
3324
+
3325
+ body.jf-page-frame .photoWrap,
3326
+ body.jf-page-frame .prePhoto{
3327
+ min-height:clamp(220px, 64vh, 380px) !important;
3328
+ }
3329
+
3330
+ body.jf-page-frame .routeCities{
3331
+ line-height:1.18 !important;
3332
+ padding-bottom:.16em !important;
3333
+ }
3334
+
3335
+ body.jf-page-frame #aircraftCard.aircraftCard{
3336
+ min-width:min(330px, 74%) !important;
3337
+ max-width:min(470px, 84%) !important;
3338
+ }
3339
+ }
3340
+
3341
+
3342
+ /* ======================================================
3343
+ FRAME PATCH: Speaker kleiner + Radar-Flieger dynamischer
3344
+ ====================================================== */
3345
+
3346
+ /* Speaker bewusst kleiner als Live-Pille */
3347
+ body.jf-page-frame #speechBtn,
3348
+ body.jf-page-frame #speechBtn.toggleBtn,
3349
+ body.jf-page-frame #speechBtn.speechBtn{
3350
+ width:clamp(30px, 3.4vmin, 38px) !important;
3351
+ min-width:clamp(30px, 3.4vmin, 38px) !important;
3352
+ height:clamp(30px, 3.4vmin, 38px) !important;
3353
+ min-height:clamp(30px, 3.4vmin, 38px) !important;
3354
+ font-size:clamp(13px, 1.55vmin, 17px) !important;
3355
+ padding:0 !important;
3356
+ border-radius:999px !important;
3357
+ display:grid !important;
3358
+ place-items:center !important;
3359
+ }
3360
+
3361
+ /* Live-Pille bleibt größer */
3362
+ body.jf-page-frame .livePill{
3363
+ min-height:clamp(34px, 4vmin, 44px) !important;
3364
+ }
3365
+
3366
+ /* mittleres Radar-Flugzeug lebendiger */
3367
+ body.jf-page-frame.jf-loaded.jf-no-flight .idlePlane{
3368
+ animation:jfIdlePlaneFloat 3.2s ease-in-out infinite !important;
3369
+ transform-origin:50% 55%;
3370
+ }
3371
+
3372
+ @keyframes jfIdlePlaneFloat{
3373
+ 0%{
3374
+ transform:translateY(0) rotate(-7deg) scale(1);
3375
+ }
3376
+ 35%{
3377
+ transform:translateY(-7px) rotate(-2deg) scale(1.04);
3378
+ }
3379
+ 70%{
3380
+ transform:translateY(4px) rotate(-10deg) scale(.99);
3381
+ }
3382
+ 100%{
3383
+ transform:translateY(0) rotate(-7deg) scale(1);
3384
+ }
3385
+ }
3386
+
3387
+ /* Radar-Sweep etwas lebendiger */
3388
+ body.jf-page-frame.jf-loaded.jf-no-flight .radarSweep{
3389
+ animation:jfRadarSpin2 2.35s linear infinite !important;
3390
+ opacity:.48 !important;
3391
+ }
3392
+
3393
+
3394
+ /* ======================================================
3395
+ FRAME PATCH: Portrait unten sicher + Special kürzen
3396
+ ====================================================== */
3397
+
3398
+ /* Special-Pille nie aus dem Frame laufen lassen */
3399
+ body.jf-page-frame .special{
3400
+ max-width:100% !important;
3401
+ overflow:hidden !important;
3402
+ text-overflow:ellipsis !important;
3403
+ white-space:nowrap !important;
3404
+ box-sizing:border-box !important;
3405
+ }
3406
+
3407
+ /* Portrait: alles minimal kompakter, damit Metrics unten nicht abgeschnitten werden */
3408
+ @media (orientation:portrait){
3409
+
3410
+ body.jf-page-frame #wall.jf-shell{
3411
+ padding-bottom:clamp(18px, 2.8vmin, 30px) !important;
3412
+ }
3413
+
3414
+ body.jf-page-frame .jfFrameMain,
3415
+ body.jf-page-frame .jfPreloadOverlay{
3416
+ grid-template-rows:minmax(190px, 34%) minmax(0, 1fr) clamp(54px, 7.6vh, 76px) !important;
3417
+ gap:clamp(6px, .9vmin, 10px) !important;
3418
+ }
3419
+
3420
+ body.jf-page-frame .photoWrap,
3421
+ body.jf-page-frame .prePhoto{
3422
+ max-height:clamp(250px, 34vh, 360px) !important;
3423
+ }
3424
+
3425
+ body.jf-page-frame .info,
3426
+ body.jf-page-frame .preInfo{
3427
+ gap:clamp(2px, .45vmin, 6px) !important;
3428
+ }
3429
+
3430
+ body.jf-page-frame .mode{
3431
+ font-size:clamp(20px, 2.8vmin, 34px) !important;
3432
+ }
3433
+
3434
+ body.jf-page-frame .iataCallsign{
3435
+ font-size:clamp(34px, 5.5vmin, 64px) !important;
3436
+ line-height:.88 !important;
3437
+ }
3438
+
3439
+ body.jf-page-frame .routeCities{
3440
+ font-size:clamp(27px, 4.4vmin, 52px) !important;
3441
+ line-height:1.02 !important;
3442
+ padding-bottom:.08em !important;
3443
+ }
3444
+
3445
+ body.jf-page-frame .operatorCallsign,
3446
+ body.jf-page-frame .routeCodes,
3447
+ body.jf-page-frame .reg{
3448
+ font-size:clamp(15px, 2.15vmin, 25px) !important;
3449
+ }
3450
+
3451
+ body.jf-page-frame #aircraftCard.aircraftCard{
3452
+ width:min(540px, 70%) !important;
3453
+ padding:clamp(7px, .95vmin, 11px) clamp(11px, 1.3vmin, 16px) !important;
3454
+ }
3455
+
3456
+
3457
+
3458
+ body.jf-page-frame .special{
3459
+ max-width:min(680px, 92%) !important;
3460
+ font-size:clamp(13px, 1.75vmin, 21px) !important;
3461
+ padding:clamp(6px, .8vmin, 9px) clamp(12px, 1.4vmin, 18px) !important;
3462
+ margin-top:clamp(3px, .45vmin, 6px) !important;
3463
+ }
3464
+
3465
+ body.jf-page-frame .metrics,
3466
+ body.jf-page-frame .preMetrics{
3467
+ height:clamp(54px, 7.6vh, 76px) !important;
3468
+ min-height:clamp(54px, 7.6vh, 76px) !important;
3469
+ }
3470
+
3471
+ body.jf-page-frame .metric,
3472
+ body.jf-page-frame .preMetric{
3473
+ height:clamp(54px, 7.6vh, 76px) !important;
3474
+ min-height:clamp(54px, 7.6vh, 76px) !important;
3475
+ }
3476
+
3477
+ body.jf-page-frame .metricValue{
3478
+ font-size:clamp(23px, 3.7vmin, 42px) !important;
3479
+ }
3480
+
3481
+ body.jf-page-frame .metricLabel{
3482
+ font-size:clamp(7px, .95vmin, 11px) !important;
3483
+ }
3484
+ }
3485
+
3486
+
3487
+ /* ======================================================
3488
+ FRAME PATCH: Landscape Grid + Preload Sync
3489
+ ====================================================== */
3490
+
3491
+ @media (orientation:landscape){
3492
+
3493
+ body.jf-page-frame .jfFrameMain,
3494
+ body.jf-page-frame .jfPreloadOverlay{
3495
+ grid-template-rows:minmax(0, 1fr) clamp(54px, 9vh, 72px) !important;
3496
+ align-items:stretch !important;
3497
+ }
3498
+
3499
+ body.jf-page-frame .photoWrap,
3500
+ body.jf-page-frame .prePhoto{
3501
+ height:100% !important;
3502
+ min-height:0 !important;
3503
+ max-height:100% !important;
3504
+ align-self:stretch !important;
3505
+ overflow:hidden !important;
3506
+ }
3507
+
3508
+ body.jf-page-frame #planePhoto{
3509
+ width:100% !important;
3510
+ height:100% !important;
3511
+ object-fit:cover !important;
3512
+ display:block !important;
3513
+ }
3514
+
3515
+ body.jf-page-frame .metrics,
3516
+ body.jf-page-frame .preMetrics{
3517
+ height:clamp(54px, 9vh, 72px) !important;
3518
+ min-height:clamp(54px, 9vh, 72px) !important;
3519
+ align-self:end !important;
3520
+ z-index:5 !important;
3521
+ }
3522
+
3523
+ body.jf-page-frame .metric,
3524
+ body.jf-page-frame .preMetric{
3525
+ height:100% !important;
3526
+ min-height:0 !important;
3527
+ }
3528
+
3529
+ /* Preload-Info exakt an die echten kompakteren Textzeilen angleichen */
3530
+ body.jf-page-frame .preInfo{
3531
+ gap:clamp(4px, .8vmin, 9px) !important;
3532
+ padding-left:clamp(4px, .8vmin, 12px) !important;
3533
+ padding-top:clamp(4px, .8vmin, 10px) !important;
3534
+ overflow:hidden !important;
3535
+ }
3536
+
3537
+ body.jf-page-frame .skMode{
3538
+ height:clamp(18px, 3.2vmin, 30px) !important;
3539
+ width:min(330px, 46%) !important;
3540
+ }
3541
+
3542
+ body.jf-page-frame .prePillRow{
3543
+ gap:clamp(8px, 1.2vmin, 14px) !important;
3544
+ }
3545
+
3546
+ body.jf-page-frame .skPillA,
3547
+ body.jf-page-frame .skPillB{
3548
+ height:clamp(27px, 4.2vmin, 38px) !important;
3549
+ }
3550
+
3551
+ body.jf-page-frame .skPillA{
3552
+ width:clamp(180px, 23vw, 300px) !important;
3553
+ }
3554
+
3555
+ body.jf-page-frame .skPillB{
3556
+ width:clamp(110px, 12vw, 170px) !important;
3557
+ }
3558
+
3559
+ body.jf-page-frame .skCall{
3560
+ height:clamp(32px, 5.8vmin, 50px) !important;
3561
+ width:min(300px, 40%) !important;
3562
+ }
3563
+
3564
+ body.jf-page-frame .skSmall,
3565
+ body.jf-page-frame .skCodes,
3566
+ body.jf-page-frame .skReg{
3567
+ height:clamp(14px, 2.2vmin, 22px) !important;
3568
+ }
3569
+
3570
+ body.jf-page-frame .skRoute{
3571
+ height:clamp(28px, 5vmin, 44px) !important;
3572
+ width:min(620px, 82%) !important;
3573
+ }
3574
+
3575
+ body.jf-page-frame .preCard{
3576
+ width:max-content !important;
3577
+ min-width:min(360px, 76%) !important;
3578
+ max-width:min(520px, 82%) !important;
3579
+ padding:clamp(7px, 1vmin, 11px) clamp(10px, 1.35vmin, 16px) !important;
3580
+ border-radius:clamp(16px, 2.3vmin, 24px) !important;
3581
+ gap:clamp(5px, .8vmin, 9px) !important;
3582
+ }
3583
+
3584
+ body.jf-page-frame .preCardRow{
3585
+ grid-template-columns:clamp(22px, 3.6vmin, 34px) minmax(0, 1fr) auto !important;
3586
+ gap:clamp(8px, 1.1vmin, 12px) !important;
3587
+ }
3588
+
3589
+ body.jf-page-frame .preLogo{
3590
+ width:clamp(22px, 3.6vmin, 34px) !important;
3591
+ height:clamp(22px, 3.6vmin, 34px) !important;
3592
+ }
3593
+
3594
+ body.jf-page-frame .skAirline,
3595
+ body.jf-page-frame .skType{
3596
+ height:clamp(14px, 2.3vmin, 22px) !important;
3597
+ }
3598
+
3599
+ body.jf-page-frame .skAirline{
3600
+ width:clamp(150px, 22vw, 280px) !important;
3601
+ }
3602
+
3603
+ body.jf-page-frame .skType{
3604
+ width:clamp(140px, 20vw, 260px) !important;
3605
+ }
3606
+
3607
+ body.jf-page-frame .skSize{
3608
+ width:clamp(80px, 10vw, 130px) !important;
3609
+ height:clamp(14px, 2.3vmin, 22px) !important;
3610
+ }
3611
+
3612
+ body.jf-page-frame .preMetric .sk{
3613
+ width:45% !important;
3614
+ height:clamp(10px, 1.8vmin, 18px) !important;
3615
+ }
3616
+ }
3617
+
3618
+ @media (orientation:landscape) and (max-height:520px){
3619
+
3620
+ body.jf-page-frame .jfFrameMain,
3621
+ body.jf-page-frame .jfPreloadOverlay{
3622
+ grid-template-rows:minmax(0, 1fr) clamp(46px, 10vh, 60px) !important;
3623
+ }
3624
+
3625
+ body.jf-page-frame .metrics,
3626
+ body.jf-page-frame .preMetrics{
3627
+ height:clamp(46px, 10vh, 60px) !important;
3628
+ min-height:clamp(46px, 10vh, 60px) !important;
3629
+ }
3630
+
3631
+ body.jf-page-frame .preInfo{
3632
+ gap:clamp(3px, .65vmin, 7px) !important;
3633
+ }
3634
+
3635
+ body.jf-page-frame .skMode{
3636
+ height:clamp(16px, 3.1vmin, 24px) !important;
3637
+ }
3638
+
3639
+ body.jf-page-frame .skPillA,
3640
+ body.jf-page-frame .skPillB{
3641
+ height:clamp(23px, 4.4vmin, 32px) !important;
3642
+ }
3643
+
3644
+ body.jf-page-frame .skCall{
3645
+ height:clamp(28px, 5.5vmin, 42px) !important;
3646
+ }
3647
+
3648
+ body.jf-page-frame .skRoute{
3649
+ height:clamp(24px, 4.8vmin, 36px) !important;
3650
+ }
3651
+
3652
+ body.jf-page-frame .preCard{
3653
+ min-width:min(330px, 74%) !important;
3654
+ max-width:min(470px, 84%) !important;
3655
+ padding:clamp(5px, .9vmin, 8px) clamp(8px, 1.3vmin, 12px) !important;
3656
+ }
3657
+ }
3658
+
3659
+
3660
+
3661
+ /* ======================================================
3662
+ FRAME MINI FIX: Logo Badges final
3663
+ ====================================================== */
3664
+
3665
+ body.jf-page-frame #airlineLogoImg,
3666
+ body.jf-page-frame #manufacturerLogoImg{
3667
+ width:30px !important;
3668
+ height:30px !important;
3669
+ min-width:30px !important;
3670
+ min-height:30px !important;
3671
+ border-radius:999px !important;
3672
+ background:#fff !important;
3673
+ padding:0 !important;
3674
+ object-fit:contain !important;
3675
+ box-sizing:border-box !important;
3676
+ box-shadow:
3677
+ inset 0 0 0 1px rgba(0,0,0,.10),
3678
+ 0 2px 8px rgba(0,0,0,.16) !important;
3679
+ }
3680
+
3681
+ /* Fallback-Kreis standardmäßig AUS, sonst entsteht der dritte Kreis */
3682
+ body.jf-page-frame #manufacturerLogoText{
3683
+ display:none !important;
3684
+ }
3685
+
3686
+ body.jf-page-frame #manufacturerLogoText.isFallback{
3687
+ width:30px !important;
3688
+ height:30px !important;
3689
+ min-width:30px !important;
3690
+ min-height:30px !important;
3691
+ border-radius:999px !important;
3692
+ background:#fff !important;
3693
+ padding:0 !important;
3694
+ box-sizing:border-box !important;
3695
+ box-shadow:
3696
+ inset 0 0 0 1px rgba(0,0,0,.10),
3697
+ 0 2px 8px rgba(0,0,0,.16) !important;
3698
+ color:#132238 !important;
3699
+ font-weight:900 !important;
3700
+ font-size:13px !important;
3701
+ line-height:1 !important;
3702
+ display:grid !important;
3703
+ place-items:center !important;
3704
+ }
3705
+
3706
+
3707
+ /* ======================================================
3708
+ FRAME: Flight Switch Animation V2
3709
+ Mehrere kleine Flugzeuge mit Kurvenbahnen
3710
+ ====================================================== */
3711
+
3712
+ body.jf-page-frame .jfFlightSwitch{
3713
+ position:absolute;
3714
+ inset:0;
3715
+ z-index:29;
3716
+ pointer-events:none;
3717
+ display:grid;
3718
+ place-items:center;
3719
+ opacity:0;
3720
+ visibility:hidden;
3721
+ border-radius:inherit;
3722
+ overflow:hidden;
3723
+ background:
3724
+ radial-gradient(circle at 50% 44%, rgba(50,232,121,.16), transparent 34%),
3725
+ linear-gradient(135deg, rgba(255,255,255,.07), rgba(5,6,10,.20));
3726
+ backdrop-filter:blur(9px) saturate(135%);
3727
+ }
3728
+
3729
+ body.jf-page-frame.jf-flight-switch .jfFlightSwitch{
3730
+ visibility:visible;
3731
+ animation:jfSwitchV2Fade 1.75s ease forwards;
3732
+ }
3733
+
3734
+ body.jf-page-frame .jfSwitchRadar{
3735
+ position:absolute;
3736
+ width:min(48vmin, 380px);
3737
+ aspect-ratio:1;
3738
+ border-radius:999px;
3739
+ border:1px solid rgba(255,255,255,.18);
3740
+ box-shadow:
3741
+ 0 0 0 11vmin rgba(255,255,255,.018),
3742
+ 0 0 0 22vmin rgba(255,255,255,.012);
3743
+ opacity:.82;
3744
+ }
3745
+
3746
+ body.jf-page-frame .jfSwitchRadar::before,
3747
+ body.jf-page-frame .jfSwitchRadar::after{
3748
+ content:"";
3749
+ position:absolute;
3750
+ inset:0;
3751
+ border-radius:999px;
3752
+ }
3753
+
3754
+ body.jf-page-frame .jfSwitchRadar::before{
3755
+ border:1px solid rgba(255,255,255,.10);
3756
+ transform:scale(.58);
3757
+ }
3758
+
3759
+ body.jf-page-frame .jfSwitchRadar::after{
3760
+ background:conic-gradient(from 0deg, rgba(50,232,121,.36), transparent 18%, transparent);
3761
+ animation:jfSwitchV2Radar 1.15s linear infinite;
3762
+ }
3763
+
3764
+ body.jf-page-frame .jfSwitchPlane{
3765
+ position:absolute;
3766
+ left:-14%;
3767
+ top:50%;
3768
+ opacity:0;
3769
+ filter:drop-shadow(0 10px 22px rgba(0,0,0,.42));
3770
+ will-change:transform, opacity;
3771
+ }
3772
+
3773
+ body.jf-page-frame .jfSwitchPlaneA{
3774
+ font-size:clamp(28px, 5.2vmin, 56px);
3775
+ }
3776
+
3777
+ body.jf-page-frame .jfSwitchPlaneB{
3778
+ font-size:clamp(22px, 4.1vmin, 44px);
3779
+ }
3780
+
3781
+ body.jf-page-frame .jfSwitchPlaneC{
3782
+ font-size:clamp(20px, 3.7vmin, 40px);
3783
+ }
3784
+
3785
+ body.jf-page-frame .jfSwitchPlaneD{
3786
+ font-size:clamp(18px, 3.3vmin, 36px);
3787
+ }
3788
+
3789
+ body.jf-page-frame.jf-flight-switch .jfSwitchPlaneA{
3790
+ animation:jfSwitchV2FlyA 1.45s cubic-bezier(.22,.8,.22,1) forwards;
3791
+ }
3792
+
3793
+ body.jf-page-frame.jf-flight-switch .jfSwitchPlaneB{
3794
+ animation:jfSwitchV2FlyB 1.55s cubic-bezier(.22,.8,.22,1) .08s forwards;
3795
+ }
3796
+
3797
+ body.jf-page-frame.jf-flight-switch .jfSwitchPlaneC{
3798
+ animation:jfSwitchV2FlyC 1.62s cubic-bezier(.22,.8,.22,1) .16s forwards;
3799
+ }
3800
+
3801
+ body.jf-page-frame.jf-flight-switch .jfSwitchPlaneD{
3802
+ animation:jfSwitchV2FlyD 1.35s cubic-bezier(.22,.8,.22,1) .28s forwards;
3803
+ }
3804
+
3805
+ body.jf-page-frame .jfSwitchText{
3806
+ position:absolute;
3807
+ left:50%;
3808
+ bottom:clamp(42px, 7.5vmin, 86px);
3809
+ transform:translateX(-50%);
3810
+ text-align:center;
3811
+ opacity:0;
3812
+ }
3813
+
3814
+ body.jf-page-frame.jf-flight-switch .jfSwitchText{
3815
+ animation:jfSwitchV2Text 1.55s ease .08s forwards;
3816
+ }
3817
+
3818
+ body.jf-page-frame .jfSwitchLabel{
3819
+ font-size:clamp(15px, 2.2vmin, 26px);
3820
+ font-weight:900;
3821
+ color:rgba(255,255,255,.68);
3822
+ letter-spacing:-.03em;
3823
+ }
3824
+
3825
+ body.jf-page-frame .jfSwitchRoute{
3826
+ margin-top:3px;
3827
+ max-width:86vw;
3828
+ overflow:hidden;
3829
+ text-overflow:ellipsis;
3830
+ white-space:nowrap;
3831
+ font-size:clamp(24px, 4.1vmin, 50px);
3832
+ font-weight:950;
3833
+ color:#fff;
3834
+ letter-spacing:-.06em;
3835
+ text-shadow:0 12px 28px rgba(0,0,0,.45);
3836
+ }
3837
+
3838
+ @keyframes jfSwitchV2Fade{
3839
+ 0%{ opacity:0; }
3840
+ 14%{ opacity:1; }
3841
+ 82%{ opacity:1; }
3842
+ 100%{ opacity:0; }
3843
+ }
3844
+
3845
+ @keyframes jfSwitchV2Radar{
3846
+ to{ transform:rotate(360deg); }
3847
+ }
3848
+
3849
+ @keyframes jfSwitchV2Text{
3850
+ 0%{
3851
+ opacity:0;
3852
+ transform:translateX(-50%) translateY(18px) scale(.96);
3853
+ }
3854
+ 22%{
3855
+ opacity:1;
3856
+ transform:translateX(-50%) translateY(0) scale(1);
3857
+ }
3858
+ 78%{
3859
+ opacity:1;
3860
+ transform:translateX(-50%) translateY(0) scale(1);
3861
+ }
3862
+ 100%{
3863
+ opacity:0;
3864
+ transform:translateX(-50%) translateY(-10px) scale(.98);
3865
+ }
3866
+ }
3867
+
3868
+ @keyframes jfSwitchV2FlyA{
3869
+ 0%{
3870
+ transform:translate(0, 34px) rotate(13deg) scale(.72);
3871
+ opacity:0;
3872
+ }
3873
+ 12%{ opacity:.95; }
3874
+ 48%{
3875
+ transform:translate(48vw, -38px) rotate(-8deg) scale(1.02);
3876
+ opacity:1;
3877
+ }
3878
+ 100%{
3879
+ transform:translate(126vw, -4px) rotate(10deg) scale(.88);
3880
+ opacity:0;
3881
+ }
3882
+ }
3883
+
3884
+ @keyframes jfSwitchV2FlyB{
3885
+ 0%{
3886
+ transform:translate(0, -44px) rotate(-12deg) scale(.62);
3887
+ opacity:0;
3888
+ }
3889
+ 14%{ opacity:.78; }
3890
+ 52%{
3891
+ transform:translate(42vw, 26px) rotate(9deg) scale(.9);
3892
+ opacity:.9;
3893
+ }
3894
+ 100%{
3895
+ transform:translate(118vw, -34px) rotate(-7deg) scale(.72);
3896
+ opacity:0;
3897
+ }
3898
+ }
3899
+
3900
+ @keyframes jfSwitchV2FlyC{
3901
+ 0%{
3902
+ transform:translate(0, 5px) rotate(4deg) scale(.50);
3903
+ opacity:0;
3904
+ }
3905
+ 20%{ opacity:.65; }
3906
+ 55%{
3907
+ transform:translate(54vw, 58px) rotate(15deg) scale(.72);
3908
+ opacity:.78;
3909
+ }
3910
+ 100%{
3911
+ transform:translate(124vw, 34px) rotate(2deg) scale(.58);
3912
+ opacity:0;
3913
+ }
3914
+ }
3915
+
3916
+ @keyframes jfSwitchV2FlyD{
3917
+ 0%{
3918
+ transform:translate(0, -12px) rotate(18deg) scale(.42);
3919
+ opacity:0;
3920
+ }
3921
+ 22%{ opacity:.55; }
3922
+ 62%{
3923
+ transform:translate(38vw, -70px) rotate(-18deg) scale(.62);
3924
+ opacity:.7;
3925
+ }
3926
+ 100%{
3927
+ transform:translate(105vw, -44px) rotate(8deg) scale(.48);
3928
+ opacity:0;
3929
+ }
3930
+ }
3931
+
3932
+
3933
+ /* ======================================================
3934
+ FRAME MINI FIX: Switch-Reihenfolge + Portrait Luft + Header Buttons
3935
+ ====================================================== */
3936
+
3937
+ /* Header: Speaker exakt gleiche Höhe wie Live-Pille */
3938
+ body.jf-page-frame .frameHeaderActions{
3939
+ --jfHeaderPillH: clamp(38px, 4.8vmin, 50px);
3940
+ align-items:center !important;
3941
+ }
3942
+
3943
+ body.jf-page-frame .frameHeaderActions .livePill{
3944
+ height:var(--jfHeaderPillH) !important;
3945
+ min-height:var(--jfHeaderPillH) !important;
3946
+ }
3947
+
3948
+ body.jf-page-frame #speechBtn,
3949
+ body.jf-page-frame #speechBtn.toggleBtn,
3950
+ body.jf-page-frame #speechBtn.speechBtn,
3951
+ body.jf-page-frame #speechBtn.toggleBtn.on,
3952
+ body.jf-page-frame #speechBtn.speechBtn.on{
3953
+ width:var(--jfHeaderPillH) !important;
3954
+ min-width:var(--jfHeaderPillH) !important;
3955
+ height:var(--jfHeaderPillH) !important;
3956
+ min-height:var(--jfHeaderPillH) !important;
3957
+ padding:0 !important;
3958
+ border-radius:999px !important;
3959
+ display:grid !important;
3960
+ place-items:center !important;
3961
+ font-size:calc(var(--jfHeaderPillH) * .42) !important;
3962
+ line-height:1 !important;
3963
+ }
3964
+
3965
+ /* Hochkant: etwas luftiger, Preload synchron */
3966
+ @media (orientation:portrait){
3967
+ body.jf-page-frame .jfFrameMain,
3968
+ body.jf-page-frame .jfPreloadOverlay{
3969
+ grid-template-rows:minmax(185px, 31.5%) minmax(0, 1fr) clamp(54px, 7.3vh, 74px) !important;
3970
+ gap:clamp(11px, 1.45vmin, 17px) !important;
3971
+ }
3972
+
3973
+ body.jf-page-frame .info,
3974
+ body.jf-page-frame .preInfo{
3975
+ gap:clamp(7px, 1.05vmin, 13px) !important;
3976
+ }
3977
+
3978
+ body.jf-page-frame .flightInfoPillRow,
3979
+ body.jf-page-frame .prePillRow{
3980
+ margin-top:clamp(1px, .35vmin, 4px) !important;
3981
+ margin-bottom:clamp(1px, .35vmin, 4px) !important;
3982
+ }
3983
+
3984
+ body.jf-page-frame .routeCities{
3985
+ line-height:1.18 !important;
3986
+ padding-bottom:.14em !important;
3987
+ }
3988
+
3989
+ body.jf-page-frame .routeCodes{
3990
+ margin-top:-.05em !important;
3991
+ }
3992
+
3993
+ body.jf-page-frame #aircraftCard.aircraftCard,
3994
+ body.jf-page-frame .preCard{
3995
+ margin-top:clamp(8px, 1.1vmin, 14px) !important;
3996
+ }
3997
+
3998
+ body.jf-page-frame .reg{
3999
+ margin-top:clamp(2px, .45vmin, 6px) !important;
4000
+ }
4001
+
4002
+ body.jf-page-frame .special{
4003
+ margin-top:clamp(5px, .7vmin, 9px) !important;
4004
+ }
4005
+
4006
+ body.jf-page-frame .metrics,
4007
+ body.jf-page-frame .preMetrics{
4008
+ height:clamp(54px, 7.3vh, 74px) !important;
4009
+ min-height:clamp(54px, 7.3vh, 74px) !important;
4010
+ }
4011
+ }
4012
+
4013
+ /* Flight-Switch etwas deutlicher, damit er vor Flug 2 wahrgenommen wird */
4014
+ body.jf-page-frame.jf-flight-switch .jfFlightSwitch{
4015
+ z-index:80 !important;
4016
+ }
4017
+
4018
+ /* ======================================================
4019
+ FRAME MINI FIX: Flight-Switch Overlay umfasst Metrics
4020
+ ====================================================== */
4021
+
4022
+ /* Overlay deutlich größer als sichtbarer Frame, damit keine harte Kante entsteht */
4023
+ body.jf-page-frame .jfFlightSwitch{
4024
+ inset:-36px !important;
4025
+ border-radius:calc(clamp(26px, 4vmin, 44px) + 36px) !important;
4026
+ background:
4027
+ radial-gradient(circle at 50% 48%, rgba(50,232,121,.18), transparent 40%),
4028
+ linear-gradient(180deg, rgba(8,10,18,.22), rgba(8,10,18,.64)) !important;
4029
+ backdrop-filter:blur(12px) saturate(135%) !important;
4030
+ -webkit-backdrop-filter:blur(12px) saturate(135%) !important;
4031
+
4032
+ mask-image:radial-gradient(
4033
+ ellipse at center,
4034
+ #000 72%,
4035
+ rgba(0,0,0,.88) 84%,
4036
+ rgba(0,0,0,.35) 94%,
4037
+ transparent 100%
4038
+ );
4039
+ -webkit-mask-image:radial-gradient(
4040
+ ellipse at center,
4041
+ #000 72%,
4042
+ rgba(0,0,0,.88) 84%,
4043
+ rgba(0,0,0,.35) 94%,
4044
+ transparent 100%
4045
+ );
4046
+ }
4047
+
4048
+ /* Metrics NICHT ausblenden, sondern bewusst mit in den Glas-Effekt nehmen */
4049
+ body.jf-page-frame.jf-flight-switch .metrics{
4050
+ opacity:.42 !important;
4051
+ filter:blur(3px) saturate(.85) !important;
4052
+ transition:opacity .28s ease, filter .28s ease !important;
4053
+ }
4054
+
4055
+ /* Foto + Text ebenfalls weich darunter sichtbar */
4056
+ body.jf-page-frame.jf-flight-switch .photoWrap,
4057
+ body.jf-page-frame.jf-flight-switch .info{
4058
+ opacity:.36 !important;
4059
+ filter:blur(4px) saturate(.82) !important;
4060
+ transition:opacity .28s ease, filter .28s ease !important;
4061
+ }
4062
+
4063
+ /* weicher Fade statt harter Kasten */
4064
+ body.jf-page-frame.jf-flight-switch .jfFlightSwitch{
4065
+ animation:jfSwitchSoftFade2 1.75s ease forwards !important;
4066
+ }
4067
+
4068
+ @keyframes jfSwitchSoftFade2{
4069
+ 0%{ opacity:0; }
4070
+ 18%{ opacity:1; }
4071
+ 76%{ opacity:1; }
4072
+ 100%{ opacity:0; }
4073
+ }
4074
+
4075
+
4076
+ /* ======================================================
4077
+ FRAME MINI FIX: Overlay oben tiefer wegen Statusbar
4078
+ ====================================================== */
4079
+
4080
+ /* Overlay etwas weiter nach unten */
4081
+ body.jf-page-frame .jfFlightSwitch{
4082
+ top:42px !important;
4083
+ left:-36px !important;
4084
+ right:-36px !important;
4085
+ bottom:-36px !important;
4086
+ }
4087
+
4088
+ /* Radar ebenfalls minimal tiefer */
4089
+ body.jf-page-frame .jfFlightSwitchRadar{
4090
+ transform:translateY(22px) scale(1.02) !important;
4091
+ }
4092
+
4093
+ /* Text unten stabil */
4094
+ body.jf-page-frame .jfFlightSwitchNext{
4095
+ bottom:72px !important;
4096
+ }
4097
+
4098
+ /* weicher Verlauf oben */
4099
+ body.jf-page-frame .jfFlightSwitch::before{
4100
+ content:"";
4101
+ position:absolute;
4102
+ inset:-60px;
4103
+ background:
4104
+ linear-gradient(
4105
+ 180deg,
4106
+ transparent 0%,
4107
+ rgba(8,10,18,.10) 12%,
4108
+ rgba(8,10,18,.28) 22%,
4109
+ rgba(8,10,18,.52) 100%
4110
+ );
4111
+ pointer-events:none;
4112
+ }
4113
+
4114
+
4115
+
4116
+ /* ======================================================
4117
+ INDEX: Global Power Button
4118
+ ====================================================== */
4119
+
4120
+ html,
4121
+ body{
4122
+ touch-action:pan-x pan-y;
4123
+ overscroll-behavior:none;
4124
+ -webkit-text-size-adjust:100%;
4125
+ }
4126
+
4127
+ body.jf-page-home #globalPowerBtn.power{
4128
+ cursor:pointer;
4129
+ border-color:rgba(50,232,121,.28);
4130
+ background:
4131
+ linear-gradient(135deg, rgba(50,232,121,.18), rgba(255,255,255,.07));
4132
+ }
4133
+
4134
+ body.jf-page-home #globalPowerBtn.power.off{
4135
+ border-color:rgba(255,77,94,.32);
4136
+ background:
4137
+ linear-gradient(135deg, rgba(255,77,94,.18), rgba(255,255,255,.06));
4138
+ }
4139
+
4140
+ body.jf-page-home .powerState{
4141
+ min-width:58px;
4142
+ height:38px;
4143
+ border-radius:999px;
4144
+ display:grid;
4145
+ place-items:center;
4146
+ font-weight:950;
4147
+ letter-spacing:.03em;
4148
+ background:rgba(50,232,121,.18);
4149
+ border:1px solid rgba(50,232,121,.36);
4150
+ color:#dffff0;
4151
+ }
4152
+
4153
+ body.jf-page-home #globalPowerBtn.off .powerState{
4154
+ background:rgba(255,77,94,.18);
4155
+ border-color:rgba(255,77,94,.38);
4156
+ color:#ffd2d7;
4157
+ }
4158
+
4159
+ /* ======================================================
4160
+ FRAME MINI FIX: Airline/Manufacturer Row Alignment
4161
+ ====================================================== */
4162
+
4163
+ body.jf-page-frame #aircraftCard.aircraftCard{
4164
+ --jfLogoSize: 34px;
4165
+ --jfLogoGap: 14px;
4166
+ }
4167
+
4168
+ /* beide Zeilen identisch aufbauen */
4169
+ body.jf-page-frame #airlineMini,
4170
+ body.jf-page-frame #manufacturerLogo{
4171
+ display:grid !important;
4172
+ grid-template-columns:var(--jfLogoSize) minmax(0, 1fr) !important;
4173
+ align-items:center !important;
4174
+ column-gap:var(--jfLogoGap) !important;
4175
+ }
4176
+
4177
+ /* Logo-Kreise exakt gleich groß */
4178
+ body.jf-page-frame #airlineLogoImg,
4179
+ body.jf-page-frame #manufacturerLogoImg,
4180
+ body.jf-page-frame #manufacturerLogoText{
4181
+ width:var(--jfLogoSize) !important;
4182
+ height:var(--jfLogoSize) !important;
4183
+ min-width:var(--jfLogoSize) !important;
4184
+ min-height:var(--jfLogoSize) !important;
4185
+ max-width:var(--jfLogoSize) !important;
4186
+ max-height:var(--jfLogoSize) !important;
4187
+ border-radius:999px !important;
4188
+ object-fit:contain !important;
4189
+ box-sizing:border-box !important;
4190
+ }
4191
+
4192
+ /* Textstart bei Airline und Hersteller exakt gleich */
4193
+ body.jf-page-frame #airline{
4194
+ grid-column:2 !important;
4195
+ align-self:center !important;
4196
+ }
4197
+
4198
+
4199
+
4200
+ /* Größen harmonisieren */
4201
+
4202
+
4203
+ /* Size rechts sauber mittig */
4204
+ body.jf-page-frame #aircraftSize{
4205
+ align-self:center !important;
4206
+ justify-self:end !important;
4207
+ }
4208
+
4209
+ /* Querformat minimal kompakter, aber gleiches Raster */
4210
+ @media (orientation:landscape){
4211
+ body.jf-page-frame #aircraftCard.aircraftCard{
4212
+ --jfLogoSize: 30px;
4213
+ --jfLogoGap: 12px;
4214
+ }
4215
+
4216
+
4217
+ }
4218
+
4219
+
4220
+
4221
+ /* ======================================================
4222
+ LANDSCAPE: alles etwas kleiner, damit Special reinpasst
4223
+ ====================================================== */
4224
+
4225
+ @media (orientation:landscape){
4226
+ body.jf-page-frame #aircraftCard.aircraftCard{
4227
+ --jfLogoSize: clamp(24px, 3.1vmin, 30px);
4228
+ --jfLogoGap: clamp(8px, 1.1vmin, 12px);
4229
+
4230
+ width:min(58%, 520px) !important;
4231
+ max-width:520px !important;
4232
+ row-gap:clamp(4px, .65vmin, 7px) !important;
4233
+ padding-top:clamp(7px, 1vmin, 10px) !important;
4234
+ padding-bottom:clamp(7px, 1vmin, 10px) !important;
4235
+ }
4236
+
4237
+
4238
+
4239
+ body.jf-page-frame .reg{
4240
+ font-size:clamp(12px, 1.75vmin, 17px) !important;
4241
+ margin-top:clamp(3px, .55vmin, 6px) !important;
4242
+ }
4243
+
4244
+ body.jf-page-frame .special{
4245
+ max-width:min(44%, 390px) !important;
4246
+ font-size:clamp(11px, 1.75vmin, 16px) !important;
4247
+ line-height:1.05 !important;
4248
+ padding:clamp(5px, .75vmin, 8px) clamp(10px, 1.2vmin, 14px) !important;
4249
+ margin-top:clamp(4px, .6vmin, 7px) !important;
4250
+ }
4251
+
4252
+ body.jf-page-frame .info{
4253
+ gap:clamp(3px, .55vmin, 7px) !important;
4254
+ }
4255
+
4256
+ body.jf-page-frame .routeCities{
4257
+ line-height:1.13 !important;
4258
+ padding-bottom:.08em !important;
4259
+ }
4260
+
4261
+ body.jf-page-frame .routeCodes{
4262
+ margin-top:-.08em !important;
4263
+ }
4264
+ }
4265
+
4266
+ /* ======================================================
4267
+ PRELOAD: Card-Blöcke an neue echte Card-Größe angleichen
4268
+ ====================================================== */
4269
+
4270
+ body.jf-page-frame.jf-preload .preCard,
4271
+ body.jf-page-frame.jf-preload .sk-card{
4272
+ width:min(70%, 560px) !important;
4273
+ max-width:560px !important;
4274
+ }
4275
+
4276
+ @media (orientation:landscape){
4277
+ body.jf-page-frame.jf-preload .preCard,
4278
+ body.jf-page-frame.jf-preload .sk-card{
4279
+ width:min(58%, 520px) !important;
4280
+ max-width:520px !important;
4281
+ }
4282
+
4283
+ body.jf-page-frame.jf-preload .preInfo,
4284
+ body.jf-page-frame.jf-preload .jfInfoSkeleton{
4285
+ gap:clamp(3px, .55vmin, 7px) !important;
4286
+ }
4287
+ }
4288
+
4289
+
4290
+
4291
+
4292
+ /* ======================================================
4293
+ FRAME MINI FIX: Manufacturer/Airline Logos nicht abschneiden
4294
+ ====================================================== */
4295
+
4296
+ body.jf-page-frame:not(.jf-preload) #aircraftCard.aircraftCard{
4297
+ --jfCardLogo: clamp(34px, 4.1vmin, 42px) !important;
4298
+ row-gap:clamp(8px, 1vmin, 12px) !important;
4299
+ }
4300
+
4301
+ /* Logo-Zellen etwas Luft geben, damit runde Badges nicht beschnitten werden */
4302
+ body.jf-page-frame:not(.jf-preload) #airlineMini,
4303
+ body.jf-page-frame:not(.jf-preload) #manufacturerLogo{
4304
+ overflow:visible !important;
4305
+ }
4306
+
4307
+ body.jf-page-frame:not(.jf-preload) #manufacturerLogo{
4308
+ width:var(--jfCardLogo) !important;
4309
+ height:var(--jfCardLogo) !important;
4310
+ min-width:var(--jfCardLogo) !important;
4311
+ min-height:var(--jfCardLogo) !important;
4312
+ }
4313
+
4314
+ /* Bilder kleiner IN den Kreis setzen, Kreis bleibt gleich groß */
4315
+ body.jf-page-frame:not(.jf-preload) #airlineLogoImg,
4316
+ body.jf-page-frame:not(.jf-preload) #manufacturerLogoImg,
4317
+ body.jf-page-frame:not(.jf-preload) #manufacturerLogoText{
4318
+ width:var(--jfCardLogo) !important;
4319
+ height:var(--jfCardLogo) !important;
4320
+ min-width:var(--jfCardLogo) !important;
4321
+ min-height:var(--jfCardLogo) !important;
4322
+ max-width:var(--jfCardLogo) !important;
4323
+ max-height:var(--jfCardLogo) !important;
4324
+ padding:3px !important;
4325
+ object-fit:contain !important;
4326
+ object-position:center !important;
4327
+ overflow:hidden !important;
4328
+ }
4329
+
4330
+ /* Text bleibt sauber hinter dem Logo */
4331
+
4332
+
4333
+ body.jf-page-frame:not(.jf-preload) #airline{
4334
+ line-height:1.12 !important;
4335
+ }
4336
+
4337
+ /* Landscape wieder kompakter, aber nicht abschneiden */
4338
+ @media (orientation:landscape){
4339
+ body.jf-page-frame:not(.jf-preload) #aircraftCard.aircraftCard{
4340
+ --jfCardLogo: clamp(28px, 3.15vmin, 32px) !important;
4341
+ row-gap:clamp(5px, .7vmin, 8px) !important;
4342
+ }
4343
+
4344
+ body.jf-page-frame:not(.jf-preload) #airlineLogoImg,
4345
+ body.jf-page-frame:not(.jf-preload) #manufacturerLogoImg,
4346
+ body.jf-page-frame:not(.jf-preload) #manufacturerLogoText{
4347
+ padding:2px !important;
4348
+ }
4349
+
4350
+
4351
+ }
4352
+
4353
+
4354
+
4355
+
4356
+
4357
+ /* gleiche Kreisgröße wie die weißen Kreise */
4358
+ :root{
4359
+ --jfLogoCircle: 54px;
4360
+ }
4361
+
4362
+ /* Reihen sauber */
4363
+ .airlineMini,
4364
+
4365
+
4366
+ /* Logos exakt gleich */
4367
+ #airlineLogoImg,
4368
+ #manufacturerLogoImg,
4369
+ #manufacturerLogoText{
4370
+ width:var(--jfLogoCircle) !important;
4371
+ height:var(--jfLogoCircle) !important;
4372
+ min-width:var(--jfLogoCircle) !important;
4373
+ min-height:var(--jfLogoCircle) !important;
4374
+ max-width:var(--jfLogoCircle) !important;
4375
+ max-height:var(--jfLogoCircle) !important;
4376
+
4377
+ border-radius:999px !important;
4378
+ object-fit:contain !important;
4379
+ object-position:center !important;
4380
+
4381
+ display:flex !important;
4382
+ align-items:center !important;
4383
+ justify-content:center !important;
4384
+
4385
+ overflow:hidden !important;
4386
+ flex-shrink:0 !important;
4387
+ box-sizing:border-box !important;
4388
+ }
4389
+
4390
+ /* Airbus/Text NICHT verrutschen */
4391
+
4392
+
4393
+ /* Airline ebenfalls */
4394
+ #airline{
4395
+ margin-left:0 !important;
4396
+ padding-left:0 !important;
4397
+ align-self:center !important;
4398
+ }
4399
+
4400
+ /* Landscape kompakter */
4401
+ @media (orientation:landscape){
4402
+
4403
+ :root{
4404
+ --jfLogoCircle: 44px;
4405
+ }
4406
+
4407
+ .airlineMini,
4408
+
4409
+
4410
+ #aircraftTypeText,
4411
+ #airline{
4412
+ font-size:.92em !important;
4413
+ line-height:1.05 !important;
4414
+ }
4415
+ }
4416
+
4417
+
4418
+
4419
+
4420
+
4421
+ @media (orientation:landscape){
4422
+
4423
+ /* Zweite Reihe sauber */
4424
+
4425
+
4426
+ /* Airbus Text NICHT mittig/rechts */
4427
+
4428
+
4429
+ /* Widebody rechts halten */
4430
+
4431
+ }
4432
+
4433
+
4434
+
4435
+ /* ======================================================
4436
+ RADAR TRANSITION FIX
4437
+ ====================================================== */
4438
+
4439
+ .waitRadar,
4440
+ .radarWrap,
4441
+ .radarContainer{
4442
+ overflow:hidden !important;
4443
+ border-radius:34px !important;
4444
+ isolation:isolate !important;
4445
+ }
4446
+
4447
+ .waitRadar::before,
4448
+ .radarWrap::before,
4449
+ .radarContainer::before{
4450
+ content:'' !important;
4451
+ position:absolute !important;
4452
+ inset:0 !important;
4453
+
4454
+ background:
4455
+ radial-gradient(
4456
+ circle at center,
4457
+ rgba(15,255,140,.12) 0%,
4458
+ rgba(15,255,140,.05) 35%,
4459
+ rgba(0,0,0,0) 72%
4460
+ ) !important;
4461
+
4462
+ pointer-events:none !important;
4463
+ z-index:1 !important;
4464
+ }
4465
+
4466
+ /* harte obere Kante killen */
4467
+ .waitRadar::after,
4468
+ .radarWrap::after,
4469
+ .radarContainer::after{
4470
+ content:'' !important;
4471
+ position:absolute !important;
4472
+
4473
+ left:0 !important;
4474
+ right:0 !important;
4475
+ top:0 !important;
4476
+ height:90px !important;
4477
+
4478
+ background:
4479
+ linear-gradient(
4480
+ to bottom,
4481
+ rgba(24,28,42,.96) 0%,
4482
+ rgba(24,28,42,.72) 30%,
4483
+ rgba(24,28,42,0) 100%
4484
+ ) !important;
4485
+
4486
+ pointer-events:none !important;
4487
+ z-index:2 !important;
4488
+ }
4489
+
4490
+
4491
+
4492
+
4493
+
4494
+
4495
+
4496
+
4497
+
4498
+
4499
+
4500
+ /* ======================================================
4501
+ AIRCRAFT CARD REAL ROW FIX
4502
+ ====================================================== */
4503
+
4504
+ body.jf-page-frame:not(.jf-preload) #aircraftCard.aircraftCard{
4505
+ --acLogo: clamp(32px, 3.65vmin, 40px);
4506
+ --acLogoInner: calc(var(--acLogo) - 5px);
4507
+ --acText: clamp(15px, 1.75vmin, 21px);
4508
+ --acGap: clamp(10px, 1.25vmin, 15px);
4509
+
4510
+ display:flex !important;
4511
+ flex-direction:column !important;
4512
+ justify-content:center !important;
4513
+
4514
+ width:min(70%, 560px) !important;
4515
+ max-width:560px !important;
4516
+
4517
+ padding:clamp(9px, 1vmin, 12px) clamp(14px, 1.5vmin, 19px) !important;
4518
+ gap:clamp(6px, .7vmin, 8px) !important;
4519
+
4520
+ box-sizing:border-box !important;
4521
+ overflow:hidden !important;
4522
+ }
4523
+
4524
+ /* echte Zeilen: Logo -> Text */
4525
+ body.jf-page-frame:not(.jf-preload) #aircraftCard .acRow{
4526
+ display:grid !important;
4527
+ align-items:center !important;
4528
+
4529
+ width:100% !important;
4530
+ height:var(--acLogo) !important;
4531
+ min-height:var(--acLogo) !important;
4532
+ max-height:var(--acLogo) !important;
4533
+
4534
+ column-gap:var(--acGap) !important;
4535
+
4536
+ margin:0 !important;
4537
+ padding:0 !important;
4538
+ box-sizing:border-box !important;
4539
+ }
4540
+
4541
+ body.jf-page-frame:not(.jf-preload) #aircraftCard .acRowAirline{
4542
+ grid-template-columns:var(--acLogo) minmax(0,1fr) !important;
4543
+ }
4544
+
4545
+ body.jf-page-frame:not(.jf-preload) #aircraftCard .acRowAircraft{
4546
+ grid-template-columns:var(--acLogo) minmax(0,1fr) auto !important;
4547
+ }
4548
+
4549
+ /* Trennlinie exakt zwischen beiden Zeilen */
4550
+ body.jf-page-frame:not(.jf-preload) #aircraftCard .aircraftSep{
4551
+ width:100% !important;
4552
+ height:1px !important;
4553
+ background:rgba(255,255,255,.15) !important;
4554
+ margin:0 !important;
4555
+ padding:0 !important;
4556
+ }
4557
+
4558
+ /* weißer Kreis etwas größer, Logo innen etwas kleiner */
4559
+ body.jf-page-frame:not(.jf-preload) #aircraftCard .acLogo,
4560
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #manufacturerLogo{
4561
+ width:var(--acLogo) !important;
4562
+ height:var(--acLogo) !important;
4563
+ min-width:var(--acLogo) !important;
4564
+ min-height:var(--acLogo) !important;
4565
+
4566
+ display:grid !important;
4567
+ place-items:center !important;
4568
+
4569
+ margin:0 !important;
4570
+ padding:0 !important;
4571
+
4572
+ border-radius:999px !important;
4573
+ background:#fff !important;
4574
+ overflow:hidden !important;
4575
+ box-sizing:border-box !important;
4576
+ }
4577
+
4578
+ /* Logo-Bild IM weißen Kreis */
4579
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #airlineLogoImg,
4580
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #manufacturerLogoImg,
4581
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #manufacturerLogoText{
4582
+ width:var(--acLogoInner) !important;
4583
+ height:var(--acLogoInner) !important;
4584
+ min-width:var(--acLogoInner) !important;
4585
+ min-height:var(--acLogoInner) !important;
4586
+ max-width:var(--acLogoInner) !important;
4587
+ max-height:var(--acLogoInner) !important;
4588
+
4589
+ border-radius:999px !important;
4590
+ object-fit:contain !important;
4591
+ object-position:center !important;
4592
+
4593
+ margin:0 !important;
4594
+ padding:0 !important;
4595
+ box-sizing:border-box !important;
4596
+ }
4597
+
4598
+ /* Texte kleiner, aber fett */
4599
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #airline,
4600
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #aircraftTypeText,
4601
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #aircraftSize{
4602
+ font-family:inherit !important;
4603
+ font-size:var(--acText) !important;
4604
+ font-weight:900 !important;
4605
+ font-style:normal !important;
4606
+ line-height:1 !important;
4607
+ letter-spacing:-.02em !important;
4608
+ white-space:nowrap !important;
4609
+
4610
+ margin:0 !important;
4611
+ padding:0 !important;
4612
+
4613
+ -webkit-font-smoothing:antialiased !important;
4614
+ text-rendering:geometricPrecision !important;
4615
+ }
4616
+
4617
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #airline,
4618
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #aircraftTypeText{
4619
+ min-width:0 !important;
4620
+ overflow:hidden !important;
4621
+ text-overflow:ellipsis !important;
4622
+ text-align:left !important;
4623
+ justify-self:start !important;
4624
+ align-self:center !important;
4625
+ }
4626
+
4627
+ /* Klasse rechts, gleiche Größe/Fettung, nur gelb */
4628
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #aircraftSize{
4629
+ color:#f2d76b !important;
4630
+ justify-self:end !important;
4631
+ align-self:center !important;
4632
+ text-align:right !important;
4633
+ margin-left:clamp(8px, 1vmin, 14px) !important;
4634
+ }
4635
+
4636
+ /* Fallback-Kreis nicht zusätzlich verschieben */
4637
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #manufacturerLogoText{
4638
+ display:none;
4639
+ place-items:center !important;
4640
+ color:#0b2558 !important;
4641
+ font-size:calc(var(--acLogoInner) * .55) !important;
4642
+ line-height:1 !important;
4643
+ font-weight:900 !important;
4644
+ }
4645
+
4646
+ body.jf-page-frame:not(.jf-preload) #aircraftCard #manufacturerLogoText.isFallback{
4647
+ display:grid !important;
4648
+ }
4649
+
4650
+ /* Querformat kompakt */
4651
+ @media (orientation:landscape){
4652
+ body.jf-page-frame:not(.jf-preload) #aircraftCard.aircraftCard{
4653
+ --acLogo: clamp(25px, 2.6vmin, 31px);
4654
+ --acLogoInner: calc(var(--acLogo) - 4px);
4655
+ --acText: clamp(12px, 1.35vmin, 16px);
4656
+ --acGap: clamp(8px, .9vmin, 11px);
4657
+
4658
+ width:min(46%, 460px) !important;
4659
+ max-width:460px !important;
4660
+
4661
+ padding:clamp(6px, .7vmin, 8px) clamp(10px, 1vmin, 13px) !important;
4662
+ gap:clamp(4px, .45vmin, 6px) !important;
4663
+ }
4664
+ }
4665
+
4666
+
4667
+ /* =========================================================
4668
+ FINAL AIRLINE / TYPE PILL FIX
4669
+ - gleichmäßige Hälften
4670
+ - Logo links + Text rechts
4671
+ - keine zentrierten Elemente
4672
+ - kleiner/fetter Text
4673
+ - sauberer Kreis-Hintergrund
4674
+ ========================================================= */
4675
+
4676
+ body.jf-page-frame .aircraftMetaCard,
4677
+ body.jf-page-frame #aircraftCard .aircraftMetaCard{
4678
+ display:flex !important;
4679
+ flex-direction:column !important;
4680
+ overflow:hidden !important;
4681
+ }
4682
+
4683
+ /* beide Reihen IDENTISCH */
4684
+ body.jf-page-frame .manufacturerRow,
4685
+ body.jf-page-frame .aircraftTypeRow,
4686
+ body.jf-page-frame #aircraftCard .manufacturerRow,
4687
+ body.jf-page-frame #aircraftCard .aircraftTypeRow{
4688
+ display:flex !important;
4689
+ align-items:center !important;
4690
+ justify-content:flex-start !important;
4691
+
4692
+ min-height:72px !important;
4693
+ height:72px !important;
4694
+
4695
+ padding:0 22px !important;
4696
+ box-sizing:border-box !important;
4697
+
4698
+ gap:18px !important;
4699
+ }
4700
+
4701
+ /* Mittellinie */
4702
+ body.jf-page-frame .manufacturerRow{
4703
+ border-bottom:1px solid rgba(255,255,255,.16) !important;
4704
+ }
4705
+
4706
+ /* Logo-Kreis */
4707
+ body.jf-page-frame .manufacturerLogoWrap,
4708
+ body.jf-page-frame .aircraftTypeIconWrap,
4709
+ body.jf-page-frame #aircraftCard .manufacturerLogoWrap,
4710
+ body.jf-page-frame #aircraftCard .aircraftTypeIconWrap{
4711
+ width:54px !important;
4712
+ height:54px !important;
4713
+ min-width:54px !important;
4714
+
4715
+ border-radius:999px !important;
4716
+
4717
+ background:rgba(255,255,255,.96) !important;
4718
+
4719
+ display:flex !important;
4720
+ align-items:center !important;
4721
+ justify-content:center !important;
4722
+
4723
+ overflow:hidden !important;
4724
+ }
4725
+
4726
+ /* Logos */
4727
+ body.jf-page-frame .manufacturerLogo,
4728
+ body.jf-page-frame .aircraftTypeIcon,
4729
+ body.jf-page-frame #aircraftCard .manufacturerLogo,
4730
+ body.jf-page-frame #aircraftCard .aircraftTypeIcon{
4731
+ width:72% !important;
4732
+ height:72% !important;
4733
+ object-fit:contain !important;
4734
+ }
4735
+
4736
+ /* Airline + Flugzeug Text */
4737
+ body.jf-page-frame .manufacturerName,
4738
+ body.jf-page-frame #aircraftTypeText,
4739
+ body.jf-page-frame #aircraftCard .manufacturerName,
4740
+ body.jf-page-frame #aircraftCard #aircraftTypeText{
4741
+ font-size:17px !important;
4742
+ line-height:1.05 !important;
4743
+ font-weight:800 !important;
4744
+ letter-spacing:-0.02em !important;
4745
+
4746
+ color:#ffffff !important;
4747
+
4748
+ white-space:nowrap !important;
4749
+ overflow:hidden !important;
4750
+ text-overflow:ellipsis !important;
4751
+
4752
+ flex:1 !important;
4753
+ }
4754
+
4755
+ /* Kategorie rechts */
4756
+ body.jf-page-frame #aircraftClass,
4757
+ body.jf-page-frame #aircraftCard #aircraftClass{
4758
+ font-size:17px !important;
4759
+ line-height:1.05 !important;
4760
+ font-weight:800 !important;
4761
+ letter-spacing:-0.02em !important;
4762
+
4763
+ color:#f2da72 !important;
4764
+
4765
+ white-space:nowrap !important;
4766
+
4767
+ margin-left:auto !important;
4768
+ text-align:right !important;
4769
+ }
4770
+
4771
+ /* Querformat etwas kompakter */
4772
+ @media (orientation:landscape){
4773
+
4774
+ body.jf-page-frame .manufacturerRow,
4775
+ body.jf-page-frame .aircraftTypeRow,
4776
+ body.jf-page-frame #aircraftCard .manufacturerRow,
4777
+ body.jf-page-frame #aircraftCard .aircraftTypeRow{
4778
+ min-height:62px !important;
4779
+ height:62px !important;
4780
+
4781
+ padding:0 18px !important;
4782
+ gap:14px !important;
4783
+ }
4784
+
4785
+ body.jf-page-frame .manufacturerLogoWrap,
4786
+ body.jf-page-frame .aircraftTypeIconWrap,
4787
+ body.jf-page-frame #aircraftCard .manufacturerLogoWrap,
4788
+ body.jf-page-frame #aircraftCard .aircraftTypeIconWrap{
4789
+ width:46px !important;
4790
+ height:46px !important;
4791
+ min-width:46px !important;
4792
+ }
4793
+
4794
+ body.jf-page-frame .manufacturerName,
4795
+ body.jf-page-frame #aircraftTypeText,
4796
+ body.jf-page-frame #aircraftClass,
4797
+ body.jf-page-frame #aircraftCard .manufacturerName,
4798
+ body.jf-page-frame #aircraftCard #aircraftTypeText,
4799
+ body.jf-page-frame #aircraftCard #aircraftClass{
4800
+ font-size:15px !important;
4801
+ }
4802
+ }
4803
+
4804
+
4805
+ /* ======================================================
4806
+ TABLET LANDSCAPE FINAL
4807
+ NUR iPad / Tablet quer
4808
+ ====================================================== */
4809
+
4810
+ @media only screen
4811
+ and (orientation: landscape)
4812
+ and (min-width: 1000px)
4813
+ and (min-height: 600px)
4814
+ and (pointer: coarse) {
4815
+
4816
+ body.jf-page-frame #app{
4817
+ width:100vw !important;
4818
+ height:100dvh !important;
4819
+ padding:10px 14px !important;
4820
+ box-sizing:border-box !important;
4821
+ overflow:hidden !important;
4822
+ }
4823
+
4824
+ body.jf-page-frame #wall.jf-shell{
4825
+ width:100% !important;
4826
+ height:100% !important;
4827
+ max-width:none !important;
4828
+ max-height:none !important;
4829
+
4830
+ padding:18px !important;
4831
+ box-sizing:border-box !important;
4832
+
4833
+ display:grid !important;
4834
+ grid-template-rows:auto minmax(0, 1fr) !important;
4835
+ gap:14px !important;
4836
+ }
4837
+
4838
+ body.jf-page-frame .header{
4839
+ grid-row:1 !important;
4840
+ width:100% !important;
4841
+ margin:0 !important;
4842
+ }
4843
+
4844
+ body.jf-page-frame .jfFrameMain{
4845
+ grid-row:2 !important;
4846
+
4847
+ width:100% !important;
4848
+ height:100% !important;
4849
+ min-height:0 !important;
4850
+
4851
+ display:grid !important;
4852
+ grid-template-columns:52% 48% !important;
4853
+ grid-template-rows:minmax(0, 1fr) auto !important;
4854
+
4855
+ grid-template-areas:
4856
+ "photo info"
4857
+ "metrics metrics" !important;
4858
+
4859
+ column-gap:22px !important;
4860
+ row-gap:14px !important;
4861
+ align-items:start !important;
4862
+ }
4863
+
4864
+ /* Bild links groß und richtiges Querformat */
4865
+ body.jf-page-frame .photoWrap{
4866
+ grid-area:photo !important;
4867
+
4868
+ width:100% !important;
4869
+ height:auto !important;
4870
+ aspect-ratio:16 / 9 !important;
4871
+
4872
+ align-self:start !important;
4873
+ justify-self:stretch !important;
4874
+
4875
+ max-height:calc(100dvh - 170px) !important;
4876
+ }
4877
+
4878
+ body.jf-page-frame #planePhoto{
4879
+ width:100% !important;
4880
+ height:100% !important;
4881
+ object-fit:cover !important;
4882
+ object-position:center center !important;
4883
+ }
4884
+
4885
+ /* Infos rechts */
4886
+ body.jf-page-frame .info{
4887
+ grid-area:info !important;
4888
+
4889
+ width:100% !important;
4890
+ max-width:none !important;
4891
+ height:auto !important;
4892
+
4893
+ display:flex !important;
4894
+ flex-direction:column !important;
4895
+ align-items:flex-start !important;
4896
+ justify-content:flex-start !important;
4897
+
4898
+ gap:7px !important;
4899
+ overflow:visible !important;
4900
+ }
4901
+
4902
+ body.jf-page-frame .mode{
4903
+ font-size:30px !important;
4904
+ line-height:1 !important;
4905
+ }
4906
+
4907
+ body.jf-page-frame .windowInfo,
4908
+ body.jf-page-frame .runwayInfo{
4909
+ font-size:14px !important;
4910
+ padding:6px 12px !important;
4911
+ }
4912
+
4913
+ body.jf-page-frame .iataCallsign{
4914
+ font-size:56px !important;
4915
+ line-height:.9 !important;
4916
+ }
4917
+
4918
+ body.jf-page-frame .operatorCallsign,
4919
+ body.jf-page-frame .routeCodes,
4920
+ body.jf-page-frame .reg{
4921
+ font-size:18px !important;
4922
+ line-height:1.05 !important;
4923
+ }
4924
+
4925
+ body.jf-page-frame .routeCities{
4926
+ font-size:42px !important;
4927
+ line-height:.98 !important;
4928
+ max-width:100% !important;
4929
+ }
4930
+
4931
+ body.jf-page-frame #aircraftCard.aircraftCard{
4932
+ width:100% !important;
4933
+ max-width:520px !important;
4934
+ margin-top:4px !important;
4935
+ }
4936
+
4937
+ body.jf-page-frame .special{
4938
+ max-width:520px !important;
4939
+ white-space:nowrap !important;
4940
+ overflow:hidden !important;
4941
+ text-overflow:ellipsis !important;
4942
+ }
4943
+
4944
+ /* Metriken unten vollflächig */
4945
+ body.jf-page-frame .metrics{
4946
+ grid-area:metrics !important;
4947
+
4948
+ width:100% !important;
4949
+ min-height:72px !important;
4950
+
4951
+ display:grid !important;
4952
+ grid-template-columns:repeat(4, minmax(0, 1fr)) !important;
4953
+ gap:14px !important;
4954
+
4955
+ margin:0 !important;
4956
+ }
4957
+
4958
+ body.jf-page-frame .metric{
4959
+ min-height:72px !important;
4960
+ }
4961
+
4962
+ body.jf-page-frame .metricValue{
4963
+ font-size:40px !important;
4964
+ line-height:.9 !important;
4965
+ }
4966
+
4967
+ body.jf-page-frame .metricLabel{
4968
+ font-size:10px !important;
4969
+ }
4970
+ }