/* 直播面板：固定 1280×720 舞台。
   两套配色，按太阳高度自动切换（main.js）：
     day   白天：浅水蓝数据面板 + 深海军蓝文字（用户：白 / 浅灰刺眼，灰色压抑、和青色海面不搭），
           地图参考 Google 的青蓝海面，陆地用柔和的米黄（近白太亮），和亮的天空画面协调；
     night 夜间：深石板色（不用纯黑），深色地图。
   品牌黄 #ffe600 只做色块（配黑字），不做文字颜色——在浅底上黄字看不清。
   风格：新闻直播 + 真实控制室大屏。扁平面板、1px 分隔线；不用发光、扫描线、装饰性动画。 */

:root, [data-theme="day"] {
  --ib-bg: rgba(255, 255, 255, .80);
  --ib-line: rgba(29, 79, 156, .35);
  --ib-head: #1d4f9c;
  --ib-head-ink: #ffffff;
  --ib-rule: rgba(11, 31, 43, .12);
  --ib-late: #a84800;
  --ib-gate: #1d4f9c;
  --bg: #a7c4cf;
  --panel: #d3e4ea;
  --panel-2: #e0edf1;
  --head: #c2d8e0;
  --line: #a5c2cd;
  --line-soft: #bcd3dc;
  --text: #0b1f2b;
  --text-2: #24404f;
  --text-3: #43606f;
  --accent: #ffe600;
  --accent-ink: #111111;
  --alert: #d7261e;
  --early: #13803d;
  /* 紧急情况（2026-09-30 用户更正）：飞机紧急事件一律用 --alert 红（卡片、地图、横幅、机场框）；琥珀色只给机场运营问题（机场框） */
  --inc-amber: #f2a900;
  --inc-amber-ink: #111111;
  --ops: #7a5212;
  --map-sea: #92d3e8;
  --map-land: #e6e1d3;
  --map-coast: #2f7ea3;   /* 海面地名（TASMAN SEA 等） */
  --map-road: #c6bda9;
  --map-aero-fill: #d8dde4;
  --map-aero: #aab5c4;
  --map-key-fill: #ccd5e4;
  --map-key-line: #6e7d96;
  /* 塔台频道色（底栏标签 + 地图对应区域）：避开品牌黄和飞机的三种阶段色（降落暗红、起飞深绿、巡航深蓝） */
  --ch-1205: #b0820a;   /* 暗金：起飞飞机改用橙色后，120.5 不再用橙 */
  --ch-1247: #c2359e;
  --ch-1217: #1f9d57;
  --ch-1265: #6a4fd8;
  /* 进近 / Director / 离场（动态收听）：只用在底栏标签上，地图上没有对应区域 */
  --ch-1244: #0f8a8a;
  --ch-1253: #d9480f;   /* Director 东（管进港）：橙红，和降落飞机的橙色同一色系 */
  --ch-1261: #9a6a2f;
  --ch-1230: #2e6bd1;   /* 离场：蓝，和起飞飞机的蓝色同一色系 */
  --map-rwy: #4f5866;
  /* 飞机按飞行阶段（不分机场）：降落深橙、起飞深蓝、巡航 / 路过近黑的墨色；摄像机目标用红色瞄准圈。
     2026-09-29 第三次：用户要求降落 / 起飞颜色对调（降落深橙、起飞深蓝）。
     2026-09-29 第二次：用户分不清深蓝和深绿（两者亮度接近 L* 35 / 42，蓝黄色弱模拟下色差只有 17）→ 起飞改深橙：
     蓝 / 橙在正常和三种色弱模拟下色差都 ≥ 92，亮度也拉开（L* 35 / 49）。
     2026-09-29 用户：降落用红色总误以为出了问题 → 红色只留给紧急情况和瞄准圈。实测（WCAG 对比度、Lab 色差、
     Machado 色弱模拟）：墨色在米黄陆地 / 青蓝海面上对比度 12.1 / 9.6，和其它所有类别色差 ≥ 46，色弱下也最好分；
     剩下的空位颜色（青绿、棕、靛蓝、深洋红）不是海面上太淡，就是和起飞绿 / 警用橙 / 军机紫 / 救护玫红太近 */
  --map-arr: #c25400;
  --map-dep: #1d4f9c;
  --map-ac: #1c232d;
  --map-arr-text: #a84800;
  --map-dep-text: #1a4589;
  --map-ac-text: #1c232d;
  /* 只在 adsb.lol 上有的飞机：图标照常按阶段上色，只有数据块用灰框灰字 */
  --map-net-text: #59616c;
  /* 特殊飞机（不按阶段）：军机紫、警用青绿（起飞改成橙色后，警用从橙改青绿）、空中救护玫红、森林消防金 */
  --map-mil: #7b2cbf;   --map-mil-text: #6a22a8;
  --map-pol: #00838a;   --map-pol-text: #006d75;
  --map-med: #d1147a;   --map-med-text: #b0106a;
  --map-fire: #b8860b;  --map-fire-text: #946c00;
  /* 摄像机目标的瞄准圈（2026-10-01 用户：红色太有攻击性）：品牌黄 + 深色描边，和目标的黄色数据块一致；地图上的红色只留给紧急情况 */
  --map-reticle: #ffe600;
  --map-reticle-edge: #1c232d;
  --map-trail: #6f7a8a;
  --map-halo: rgba(255, 255, 255, .85);
  --map-label: #1f2a3a;
  --map-label-2: #4a5566;
  --map-scale: #4a5566;
  --logo-tile: #ffffff;
  --logo-line: #d5dbe2;
}
[data-theme="night"] {
  --ib-bg: rgba(21, 26, 34, .84);
  --ib-line: rgba(255, 230, 0, .35);
  --ib-head: #ffe600;
  --ib-head-ink: #111111;
  --ib-rule: rgba(255, 255, 255, .10);
  --ib-late: #f2a900;
  --ib-gate: #8fb4ff;
  --bg: #0c1016;
  --panel: #151a22;
  --panel-2: #1b212b;
  --head: #1a2029;
  --line: #2b3340;
  --line-soft: #222933;
  --text: #eef1f5;
  --text-2: #a5adb9;
  --text-3: #717b89;
  --accent: #ffe600;
  --accent-ink: #111111;
  --alert: #ff3b2f;
  --early: #3fcf73;
  --inc-amber: #f5b21a;
  --inc-amber-ink: #111111;
  --ops: #8a5f16;
  --map-sea: #0a1a2e;
  --map-land: #262b33;
  --map-coast: #4a6784;
  --map-road: #353b46;
  --map-aero-fill: #30353e;
  --map-aero: #4a515d;
  --map-key-fill: #3e4552;
  --map-key-line: #8b95a5;
  --ch-1205: #e3b43c;
  --ch-1247: #f065cf;
  --ch-1217: #3ccf7e;
  --ch-1265: #9b85ff;
  --ch-1244: #3cc9c9;
  --ch-1253: #ff7a45;
  --ch-1261: #d6a15e;
  --ch-1230: #6aa0ff;
  --map-rwy: #a9afb8;
  --map-arr: #ffa040;
  --map-dep: #6aa6ff;
  --map-ac: #dfe4ec;
  --map-arr-text: #ffb466;
  --map-dep-text: #8dbaff;
  --map-ac-text: #dfe4ec;
  --map-net-text: #8a93a0;
  --map-mil: #c592ff;   --map-mil-text: #d2a8ff;
  --map-pol: #3cc9c9;   --map-pol-text: #5fd8d8;
  --map-med: #ff5fae;   --map-med-text: #ff85c2;
  --map-fire: #f2c94c;  --map-fire-text: #f5d56e;
  --map-reticle: #ffe600;
  --map-reticle-edge: #0c1016;
  --map-trail: #5c6676;
  --map-halo: rgba(12, 16, 22, .8);
  --map-label: #e6e9ee;
  --map-label-2: #a5adb9;
  --map-scale: #8a93a0;
  --logo-tile: #ffffff;
  --logo-line: transparent;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body { width: 100%; height: 100%; overflow: hidden; background: var(--bg); }
html.obs, html.obs body { background: transparent; }
body {
  font-family: "IBM Plex Sans", "Segoe UI", sans-serif;
  color: var(--text);
  -webkit-font-smoothing: antialiased;
  font-feature-settings: "tnum" 1;
}
.mono { font-family: "IBM Plex Mono", Consolas, monospace; }

#stage {
  position: absolute; left: 0; top: 0;
  width: 1280px; height: 720px;
  transform-origin: 0 0;
  background: var(--bg);
  overflow: hidden;
}
body.obs #stage { background: transparent; }

/* ---------- 互换的两个窗口 ---------- */
#camera, #map { position: absolute; overflow: hidden; }
.layout-cam #camera, .layout-map #map { left: 0; top: 0; width: 960px; height: 540px; }
.layout-cam #map, .layout-map #camera { left: 960px; top: 0; width: 320px; height: 180px; border-left: 1px solid var(--line); border-bottom: 1px solid var(--line); }
#map { background: var(--map-sea); }
#map-canvas, #map-base { position: absolute; left: 0; top: 0; width: 100%; height: 100%; display: block; }
/* 叠放：底图 → 统计表 / 数据浮窗 → 飞机和数据块（只在地图大画面显示统计表和浮窗） */
#map-base { z-index: 0; }
#map #stats { z-index: 2; }
#map #infobox { z-index: 2; }
#map-canvas { z-index: 3; transition: opacity .8s; }
/* 全澳 / 新州视图（用户 2026-10-01：统计表、航班表浮窗照常显示）：盖住悉尼底图，在统计表 / 浮窗下面；
   这时悉尼的飞机和数据块淡出，比例尺上面的单位说明隐藏 */
#wide-canvas { position: absolute; left: 0; top: 0; width: 100%; height: 100%; display: block; z-index: 1; opacity: 0; transition: opacity .8s; pointer-events: none; }
#wide-canvas.show { opacity: 1; }
#map.wide-on #map-canvas { opacity: 0; }
#map.wide-on #units { visibility: hidden; }
.layout-cam #wide-canvas { display: none; }
.layout-cam #map #stats, .layout-cam #map #infobox { display: none; }
#camera { background: #050608; }
body.obs #camera { background: transparent; }
#camera.placeholder::after {
  content: "CAMERA"; position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  color: var(--text-3); font: 500 13px "IBM Plex Mono", monospace; letter-spacing: .3em;
}
#cam-status {
  position: absolute; right: 12px; bottom: 10px;
  font: 500 11px "IBM Plex Mono", monospace; letter-spacing: .12em; text-transform: uppercase;
  color: var(--text); background: rgba(10, 11, 14, .72); padding: 4px 8px; border-radius: 2px;
}
#cam-status .dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); margin-right: 6px; vertical-align: 1px; }

/* ---------- 台标 ---------- */
#brand {
  position: absolute; left: 18px; top: 14px; z-index: 5;
  pointer-events: none;
}
#brand .brand-row { display: flex; align-items: center; gap: 8px; }
#brand img { height: 30px; width: auto; }
#brand span { font: 600 17px "IBM Plex Sans", sans-serif; letter-spacing: .02em; color: #fff; text-shadow: 0 1px 2px rgba(0,0,0,.55); }
.layout-map #brand span { color: var(--text); text-shadow: none; }
/* 当前时间（悉尼）：卡片右上角，和 IN VIEW / NEXT / AROUND SYD 标签同一行，字体、字号、字距、上下内边距和 .chip 完全一样（盒子和基线对齐），颜色同空心标签；top 197 = 实测 .chip 的位置（行内块排在 .card-state 的基线上，比卡片内边距低 3px）；精确到秒（用户要求，用来判断直播延迟） */
/* 时钟：直播名称的第三行（悉尼日期 + 时间，等宽数字），宽度不超过上面那一行（main.js renderClock 缩放） */
#title #clock { display: inline-block; margin-top: 6px; font: 600 15px/1 "IBM Plex Mono", monospace; font-style: normal; letter-spacing: .02em; white-space: nowrap; }

/* ---------- 面板通用 ---------- */
.panel { position: absolute; background: var(--panel); overflow: hidden; }
.panel > header, .ap > header {
  height: 28px; padding: 0 14px;
  display: flex; align-items: center; justify-content: space-between;
  font: 600 11px "IBM Plex Sans", sans-serif; letter-spacing: .1em; text-transform: uppercase;
  color: var(--text-2); background: var(--head); border-bottom: 1px solid var(--line-soft);
}
.chip { display: inline-block; font: 600 10.5px/1 "IBM Plex Sans", sans-serif; letter-spacing: .1em; text-transform: uppercase; padding: 4px 7px 3px; border-radius: 2px; background: var(--accent); color: var(--accent-ink); }
.chip.hollow { background: transparent; color: var(--text-2); box-shadow: inset 0 0 0 1px var(--line); }
/* 特殊飞机的类别标签（卡片）：类别色底 + 白字 */
.chip.sp { color: #fff; margin-left: 6px; }
.chip.onfreq { background: var(--ch); color: #fff; margin-left: 6px; }
.chip.sp-mil { background: var(--map-mil); } .chip.sp-pol { background: var(--map-pol); }
.chip.sp-med { background: var(--map-med); } .chip.sp-fire { background: var(--map-fire); }
.logo-tile.sp { color: #fff; font: 700 13px "IBM Plex Mono", monospace; letter-spacing: .04em; box-shadow: none; }
.logo-tile.sp-mil { background: var(--map-mil); } .logo-tile.sp-pol { background: var(--map-pol); }
.logo-tile.sp-med { background: var(--map-med); } .logo-tile.sp-fire { background: var(--map-fire); }
.label { font: 500 10.5px "IBM Plex Sans", sans-serif; letter-spacing: .1em; text-transform: uppercase; color: var(--text-3); }
.muted { color: var(--text-2); }
.dim { color: var(--text-3); }

#card { left: 960px; top: 180px; width: 320px; height: 360px; border-left: 1px solid var(--line); padding: 14px 16px 12px; }
/* 2026-09-28 布局：右列 = 小窗 / 航班卡片 / Coming up（同宽 320）；底栏 = 机场信息（左，270）+ 塔台音频（中，690） */
#next  { left: 960px; top: 540px; width: 320px; height: 180px; border-top: 1px solid var(--line); border-left: 1px solid var(--line); }
#audio { left: 270px; top: 540px; width: 690px; height: 180px; border-top: 1px solid var(--line); border-left: 1px solid var(--line); }
#wx    { left: 0;     top: 540px; width: 270px; height: 180px; border-top: 1px solid var(--line); }

/* ---------- 航司 logo 方块 ---------- */
.logo-tile {
  flex: none; background: var(--logo-tile); border-radius: 3px; box-shadow: inset 0 0 0 1px var(--logo-line);
  display: flex; align-items: center; justify-content: center; overflow: hidden;
}
.logo-tile img { max-width: 88%; max-height: 88%; object-fit: contain; }
.logo-tile.text { background: var(--panel-2); border: 1px solid var(--line); color: var(--text-2); font: 600 12px "IBM Plex Mono", monospace; }

/* ---------- 航班卡片 ---------- */
.card-state { height: 18px; margin-bottom: 10px; }
.card-head { display: flex; gap: 12px; align-items: center; }
.card-head .logo-tile { width: 50px; height: 50px; }
.card-id { min-width: 0; }
.card-id .flt { font: 600 25px/1.05 "IBM Plex Sans", sans-serif; letter-spacing: .01em; }
.card-id .flt .cs { font: 400 13px "IBM Plex Mono", monospace; color: var(--text-3); margin-left: 8px; letter-spacing: 0; }
.card-id .airline { font-size: 13.5px; line-height: 18px; height: 18px; color: var(--text-2); margin-top: 3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.card-route { margin-top: 12px; display: grid; grid-template-columns: 1fr auto 1fr; align-items: start; column-gap: 8px; }
.card-route .code { font: 500 22px/1 "IBM Plex Mono", monospace; }
/* 航站楼·登机口、早点晚点：和前面的大字底部对齐（用户 2026-09-30） */
/* 航站楼·登机口：固定留 7 个字符宽（"T2·Q14A"），没有也占位，机场代码的位置就不随它变 */
.card-route .tg { font: 500 11px "IBM Plex Mono", monospace; color: var(--text-2); margin-left: 6px; vertical-align: baseline; display: inline-block; min-width: 7ch; text-align: left; }
/* 每边固定 4 行：代码 22 / 城市 19 / 时间 23 / 登机时间 16（缺了也占位，用户 2026-09-30） */
.card-route .from, .card-route .to { display: grid; grid-template-rows: 22px 19px 23px 16px; align-items: end; min-width: 0; }
.card-route .r1 { height: 22px; white-space: nowrap; }
.card-route .tm { font: 500 15px/19px "IBM Plex Mono", monospace; white-space: nowrap; }
.card-route .dl { font: 500 11px "IBM Plex Mono", monospace; color: var(--text-3); margin-left: 7px; vertical-align: baseline; }
.card-route .bd { font: 500 11px/14px "IBM Plex Mono", monospace; color: var(--text-3); }
.card-route .cc { font: 500 10.5px "IBM Plex Mono", monospace; color: var(--text-3); margin-left: 6px; flex: none; }
.card-route .tm.early, .card-route .dl.early { color: var(--early); }
.card-route .tm.late, .card-route .dl.late { color: var(--alert); }
.card-route .city { font-size: 12px; line-height: 16px; color: var(--text-2); white-space: nowrap; display: flex; align-items: baseline; min-width: 0; }
.card-route .city .cn { overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.card-route .to .city { justify-content: flex-end; }
.card-route .to { text-align: right; }
/* 粗线箭头（代替细箭头和 FlightAware 进度条，用户 2026-09-30），和机场代码同一行居中 */
.card-route .arrow { color: var(--text-3); align-self: start; height: 22px; display: flex; align-items: center; }
.card-route .arrow svg { display: block; }
/* 千位逗号只占半格 */
.cm { margin: 0 -.15em; }
.card-id .codeshare { color: var(--text-3); }
.card-noroute { margin-top: 12px; height: 80px; font-size: 13.5px; color: var(--text-3); }
.card-type { margin-top: 11px; font-size: 13.5px; line-height: 18px; height: 18px; color: var(--text-2); display: flex; justify-content: space-between; gap: 8px; }
.card-type .reg { font-family: "IBM Plex Mono", monospace; color: var(--text); }
.card-grid { margin-top: 11px; display: grid; grid-template-columns: 1fr 1fr; row-gap: 9px; column-gap: 12px; border-top: 1px solid var(--line-soft); padding-top: 10px; }
.card-grid .label { font-weight: 700; color: var(--text); letter-spacing: .08em; }
.card-grid .v { font: 500 17px/20px "IBM Plex Mono", monospace; height: 20px; margin-top: 2px; white-space: nowrap; }
.card-grid .v .u { font-size: 11px; font-weight: 400; margin-left: 1px; color: var(--text-2); }
.card-grid .v2 { font: 400 11.5px/15px "IBM Plex Mono", monospace; height: 15px; color: var(--text-3); }
.card-grid .pos .v { font-family: "IBM Plex Sans", sans-serif; font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.card-alert { margin-top: 8px; background: var(--alert); color: #fff; font: 600 12px "IBM Plex Mono", monospace; letter-spacing: .08em; padding: 4px 8px; display: inline-block; }
.card-when { margin-top: 6px; font: 500 12.5px "IBM Plex Mono", monospace; color: var(--text-2); }
.card-big { font: 600 22px/1.2 "IBM Plex Sans", sans-serif; margin-top: 4px; }
.card-sub { font-size: 13.5px; color: var(--text-2); margin-top: 6px; }
.card-empty { color: var(--text-3); font-size: 14px; margin-top: 120px; text-align: center; }

/* ---------- 接下来的目标 ---------- */
#next-rows { padding: 3px 14px 0; }
.nrow { display: grid; grid-template-columns: 26px 1fr auto; column-gap: 10px; align-items: center; height: 37px; border-bottom: 1px solid var(--line-soft); }
.nrow:last-child { border-bottom: 0; }
.nrow .logo-tile { width: 26px; height: 26px; }
.nrow .l1 { font: 500 14px "IBM Plex Mono", monospace; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nrow .l1 .rt { color: var(--text-2); margin-left: 10px; font-weight: 400; }
.nrow .l2 { font-size: 11.5px; color: var(--text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nrow .rcol { text-align: right; min-width: 64px; }
.nrow .eta { display: inline-block; font: 600 14px/1 "IBM Plex Mono", monospace; background: var(--accent); color: var(--accent-ink); padding: 3px 6px 2px; border-radius: 2px; }
.nrow .rv { font: 500 14px/1.1 "IBM Plex Mono", monospace; color: var(--text); }
.nrow .rl { font: 500 9.5px/1.3 "IBM Plex Sans", sans-serif; letter-spacing: .1em; color: var(--text-3); margin-top: 2px; }
.nrow .altr { font: 500 15px "IBM Plex Mono", monospace; color: var(--text-2); }
.none { color: var(--text-3); font-size: 13px; padding: 14px 0; }

/* ---------- 塔台音频：每行 = 频率 + 名称（通话中这块变黄）| 该频率最近一条转录，行之间细分隔线 ---------- */
#audio-rows { padding: 2px 14px 0; }
.ach { display: flex; align-items: center; gap: 14px; height: 37px; border-bottom: 1px solid var(--line-soft); }
.ach:last-child { border-bottom: 0; }
/* 色块：左边大字 TWR / GND，右边上面小字频率、下面跑道或区域（用户 2026-09-29）；宽度按最长的 "16R/34L·07/25" 定 */
/* 频道色块（用户 2026-09-30：缩窄，136 → 122） */
.ach .id { flex: none; width: 122px; height: 27px; display: flex; align-items: center; gap: 7px; padding: 0 6px 0 9px; border-radius: 2px; box-shadow: inset 3px 0 0 var(--ch); }
/* 这段通话叫到的航班号：频道色的空心框，和频道色块分开（gap），固定宽度的位置 */
.ach .fl { flex: none; width: 68px; margin: 0 -6px 0 -4px; }
/* 航班号框：固定 68×22、文字居中（用户 2026-10-01：原来按文字宽度自适应、上下内边距不对称，框的大小和文字位置看起来很随机） */
.ach .fl b { display: none; box-sizing: border-box; width: 68px; height: 22px; align-items: center; justify-content: center; padding: 0 3px;
  font: 600 12px/1 "IBM Plex Mono", monospace; color: var(--text); border: 1.5px solid var(--ch); border-radius: 2px; background: transparent;
  white-space: nowrap; overflow: hidden; }
.ach .fl.has b { display: flex; }
.ach .fl.na b { color: var(--text-3); }   /* N/A 灰色，字重、字号和航班号一样 */
.ach .role { flex: none; font: 600 15px/1 "IBM Plex Mono", monospace; color: var(--text); }
.ach .nm { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ach .nm b { font: 600 10px/1 "IBM Plex Mono", monospace; color: var(--text-2); white-space: nowrap; }
.ach .nm i { font: 500 9.5px/1 "IBM Plex Mono", monospace; font-style: normal; color: var(--text-3); white-space: nowrap; letter-spacing: -.02em; }
/* 通话中：标签块填频道色（和地图上亮起的跑道 / 区域同色） */
.ach.on .id { background: var(--ch); box-shadow: none; }
.ach.on .role, .ach.on .nm b, .ach.on .nm i { color: #fff; }
.ach .tx { flex: 1; min-width: 0; font: 400 13.5px "IBM Plex Sans", sans-serif; color: var(--text); white-space: nowrap; overflow: hidden; }
.ach .tx .in { display: inline-block; transition: transform .35s ease-out; }
/* 已经播过的词：频道色（文字用的深一档，浅色面板上看得清；夜间浅一档） */
.ach { --cht: color-mix(in oklab, var(--ch) 78%, #000); }
[data-theme="night"] .ach { --cht: color-mix(in oklab, var(--ch) 62%, #fff); }
.ach .tx .w.pl { color: var(--cht); }
/* 最新那一行：念到的词频道色底、白字，没念到的黑字无底色 */
.ach .tx { line-height: 22px; }
.ach.last .tx .w.pl { background: var(--ch); color: #fff; padding: 2px 0; }
.ach.last .tx .w.pl:first-child { padding-left: 4px; margin-left: -4px; border-radius: 2px 0 0 2px; }

/* ---------- 直播名称：大画面右上角（配色同水印） ---------- */
#title { position: absolute; z-index: 5; right: 332px; top: 14px; text-align: right; pointer-events: none;
  color: #fff; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); }
#title b { display: block; font: 600 13px/1.2 "IBM Plex Sans", sans-serif; letter-spacing: .14em; text-transform: uppercase; }
#title span { display: block; margin-top: 3px; font: 500 10px/1 "IBM Plex Mono", monospace; letter-spacing: .08em; opacity: .8; }
.layout-map #title, .layout-map #stats { color: var(--map-label); text-shadow: 0 0 3px var(--map-halo), 0 0 3px var(--map-halo); }
/* 飞行器统计（SYD 150 km 内，adsb.lol ∪ 本地去重） */
/* 用户 2026-09-29：放在大画面右下角、数据署名水印上方（原来在直播名称下面）；配色同直播名称 */
#stats { position: absolute; z-index: 5; right: 12px; bottom: 26px; width: 158px; pointer-events: none;
  color: #fff; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); font: 500 10.5px/1 "IBM Plex Mono", monospace; letter-spacing: .06em; text-transform: uppercase; }
#stats:empty { display: none; }
#stats .cap { font: 500 9px/1 "IBM Plex Mono", monospace; letter-spacing: .08em; opacity: .75; padding-bottom: 4px; text-align: left; }
#stats .row { display: flex; justify-content: space-between; align-items: baseline; padding: 3px 0; border-top: 1px solid currentColor; border-top-color: color-mix(in srgb, currentColor 22%, transparent); }
#stats .row.sub span:first-child { padding-left: 10px; }
#stats .row.sub span.tag { padding-left: 5px; margin-left: 10px; }   /* 带底色的子项：整个色块缩进，不是色块内部留空 */
/* 分类行（降落 / 起飞 / 巡航 / 军 / 警 / 救护 / 消防）：名称加该类飞机的底色 + 白字；日夜都用深色底，白字对比度 ≥ 4.5 */
#stats .tag { display: inline-block; padding: 2px 5px 1px; margin: -2px 0 -1px; border-radius: 2px; color: #fff; text-shadow: none; }
#stats .tag.t-arr { background: #c25400; } #stats .tag.t-dep { background: #1d4f9c; } #stats .tag.t-cru { background: #1c232d; }
#stats .tag.t-mil { background: #7b2cbf; } #stats .tag.t-pol { background: #00808a; }
#stats .tag.t-med { background: #c2126f; } #stats .tag.t-fire { background: #8a6500; }
#stats b { display: inline; font: 600 12px/1 "IBM Plex Mono", monospace; letter-spacing: 0; }

/* ---------- 数据署名：大画面右下角的水印（地图 / 摄像机上都看得清，跟随日 / 夜配色） ---------- */
#credits { position: absolute; z-index: 5; right: 332px; top: 522px; max-width: 700px; text-align: right;
  font: 400 9.5px "IBM Plex Sans", sans-serif; letter-spacing: .02em; white-space: nowrap; pointer-events: none;
  color: rgba(255, 255, 255, .72); text-shadow: 0 1px 2px rgba(0, 0, 0, .6); }
.layout-map #credits { color: var(--map-label-2); text-shadow: 0 0 3px var(--map-halo), 0 0 3px var(--map-halo); opacity: .85; }

/* ---------- 机场信息（上下两块，各 90 px；270 宽） ---------- */
#wx .ap { height: 90px; }
#wx .ap + .ap { border-top: 1px solid var(--line); }
#wx .ap > header { height: 28px; }   /* 和塔台音频等面板的标题栏同高，顶部对齐 */
.ap-body { padding: 6px 14px 0; }
.ap-body .r1 { display: grid; grid-template-columns: 104px 34px 40px 1fr; column-gap: 6px; }
.ap-body .k { font: 500 9px/1 "IBM Plex Sans", sans-serif; letter-spacing: .1em; text-transform: uppercase; color: var(--text-3); }
.ap-body .v { font: 500 12px/1.25 "IBM Plex Mono", monospace; color: var(--text); white-space: nowrap; margin-top: 3px; display: flex; align-items: center; gap: 4px; }
.ap-body .r2 { display: flex; align-items: baseline; margin-top: 8px; overflow: hidden; font: 500 12px/1 "IBM Plex Mono", monospace; color: var(--text); white-space: nowrap; }
.ap-body .r2 .k { margin-right: 4px; }
.ap-body .nodata { color: var(--text-3); font-size: 12px; margin-top: 4px; }
.wind-arrow { width: 12px; height: 12px; flex: none; }

/* 塔台音频标题旁的说明：不是实时（用户 2026-09-30） */
/* 塔台音频标题旁：天线已断开（Telegram 里按了"已断开馈线"，2026-10-03 用户）：品牌黄色块配黑字，紧跟标题 */
#audio-notice { margin-left: 12px; margin-right: auto; padding: 3px 7px 2px; font-size: 9.5px; }
#audio-notice[hidden] { display: none; }
#audio > header .note { margin-left: 10px; font: 500 9.5px "IBM Plex Mono", monospace; letter-spacing: .04em; text-transform: none; color: var(--text-3); }

/* ---------- 紧急情况（flightd incident/，2026-09-30）---------- */
/* 横幅：直播名称和时钟下面，右对齐，红色 */
#banner { position: absolute; z-index: 6; right: 332px; top: 84px; display: flex; flex-direction: column; align-items: flex-end; gap: 6px; pointer-events: none; }
#banner:empty { display: none; }
.bn { padding: 6px 10px 5px; border-radius: 2px; text-align: right; max-width: 360px; }
.bn-amber { background: var(--inc-amber); color: var(--inc-amber-ink); }
.bn-red { background: var(--alert); color: #fff; }
.bn .l1 { font: 700 15px/1.15 "IBM Plex Sans", sans-serif; letter-spacing: .08em; text-transform: uppercase; }
.bn .l1 span { font-family: "IBM Plex Mono", monospace; letter-spacing: .02em; margin-left: 9px; }
.bn .l2 { font: 600 12.5px/1.3 "IBM Plex Mono", monospace; margin-top: 2px; }
.bn .l3 { font: 500 9.5px/1.3 "IBM Plex Mono", monospace; opacity: .85; margin-top: 3px; white-space: nowrap; }
/* 卡片上的紧急情况标签 */
.chip.inc { margin-left: 6px; max-width: 214px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: top; }
#card .card-state { white-space: nowrap; overflow: hidden; }
.chip.inc-amber { background: var(--inc-amber); color: var(--inc-amber-ink); }
.chip.inc-red { background: var(--alert); color: #fff; }
/* 卡片显示的是紧急情况的飞机：整张卡片红色 */
#card.inc-amber { background: var(--inc-amber); --text: #111111; --text-2: #2b2100; --text-3: #4a3a08; --line: rgba(0, 0, 0, .28); --line-soft: rgba(0, 0, 0, .2); --early: #0b5d2a; --alert: #9e1208; }
#card.inc-red { background: var(--alert); --text: #ffffff; --text-2: rgba(255, 255, 255, .9); --text-3: rgba(255, 255, 255, .78); --line: rgba(255, 255, 255, .45); --line-soft: rgba(255, 255, 255, .32); --early: #c8ffd9; }
#card.inc-red .tm.late, #card.inc-red .dl.late { color: #ffe0dc; }
#card.inc-amber .chip.inc-amber { background: #111111; color: var(--inc-amber); }
#card.inc-red .chip.inc-red { background: #ffffff; color: var(--alert); }
#card.inc-amber .chip.hollow, #card.inc-red .chip.hollow { box-shadow: inset 0 0 0 1px var(--line); }
/* Coming up 里紧急情况的飞机：整行红色 */
.nrow.inc-amber, .nrow.inc-red { margin: 0 -14px; padding: 0 14px; }
.nrow.inc-amber { background: var(--inc-amber); --text: #111111; --text-2: #2b2100; --text-3: #4a3a08; }
.nrow.inc-red { background: var(--alert); --text: #ffffff; --text-2: rgba(255, 255, 255, .9); --text-3: rgba(255, 255, 255, .78); }
.nrow.inc-amber .l1, .nrow.inc-red .l1 { color: var(--text); }
/* 悉尼机场框：红 = 飞机紧急事件 / 机场事故，琥珀 = 运营问题（停电、大量取消……）；标题 + 一行说明 */
#wx .ap.alert-red { background: var(--alert); }
#wx .ap.alert-red > header { background: rgba(0, 0, 0, .16); color: #fff; border-bottom-color: rgba(255, 255, 255, .3); }
#wx .ap.alert-ops { background: var(--inc-amber); }
#wx .ap.alert-ops > header { background: rgba(0, 0, 0, .1); color: var(--inc-amber-ink); border-bottom-color: rgba(0, 0, 0, .2); }
#wx .ap.alert-ops .alert-t { color: var(--inc-amber-ink); }
#wx .ap.alert-ops .alert-x { color: #2b2100; }
.ap-body .alert-t { font: 700 17px/1.15 "IBM Plex Sans", sans-serif; letter-spacing: .06em; color: #fff; margin-top: 3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ap-body .alert-x { font: 500 11.5px/1.3 "IBM Plex Mono", monospace; color: rgba(255, 255, 255, .92); margin-top: 5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* ---------- 地图大画面：数据浮窗（2026-10-01 用户）：时间下面定时弹出，航班表 / 半小时总结（js/infobox.js） ---------- */
#infobox { position: absolute; z-index: 6; right: 12px; top: 84px; width: 284px; opacity: 0; transition: opacity .5s; pointer-events: none;
  background: var(--ib-bg); border: 1px solid var(--ib-line); border-radius: 3px; color: var(--text); overflow: hidden;
  box-shadow: 0 1px 4px rgba(0, 0, 0, .18); }
#infobox.show { opacity: 1; }
.layout-cam #infobox { display: none; }
#infobox header { display: flex; justify-content: space-between; align-items: baseline; padding: 5px 8px 4px; background: var(--ib-head); color: var(--ib-head-ink); }
#infobox header b { font: 600 10.5px/1.2 "IBM Plex Sans", sans-serif; letter-spacing: .1em; text-transform: uppercase; }
#infobox header span { font: 500 10px/1 "IBM Plex Mono", monospace; letter-spacing: .04em; }
/* 航班表（用户 2026-10-01：状态要靠右、每行没有上下居中、g 显示不全、字体不统一）：
   全部等宽体、同一字号；每行固定 20 px、文字垂直居中，行高 14 px（原来行高 = 字号又裁掉超出部分，g / y 的下伸部分被切）；
   表头和数据同一套对齐：登机口居中、状态靠右 */
#infobox .cols, #infobox .fr { display: grid; grid-template-columns: 34px 46px 1fr 26px 54px; column-gap: 6px; align-items: center; padding: 0 8px;
  font-family: "IBM Plex Mono", monospace; }
#infobox .cols { height: 18px; font-size: 8.5px; font-weight: 500; line-height: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--text-3); }
#infobox .fr { height: 20px; font-size: 10.5px; font-weight: 500; line-height: 14px; border-top: 1px solid var(--ib-rule); }
#infobox .cols span, #infobox .fr span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#infobox .fr .f { font-weight: 600; }
#infobox .fr .g.na { color: var(--text-3); }   /* 还没分配 / 还没查到登机口 */
#infobox .cols span:nth-child(4), #infobox .fr .g { text-align: center; }
#infobox .cols span:nth-child(5), #infobox .fr .s { text-align: right; }
#infobox .k-done span { color: var(--text-3); }
#infobox .k-late .s { color: var(--ib-late); font-weight: 600; }
#infobox .k-cxl .s { color: var(--alert); font-weight: 600; }
#infobox .k-early .s { color: var(--early); }
#infobox .k-gate .s { color: var(--ib-gate); }
#infobox ul { margin: 0; padding: 2px 8px 4px; list-style: none; }
#infobox li { position: relative; font: 500 10.5px/1.3 "IBM Plex Sans", sans-serif; padding: 4px 0 4px 10px; border-top: 1px solid var(--ib-rule); }
#infobox li:first-child { border-top: 0; }
#infobox li::before { content: ''; position: absolute; left: 0; top: 9px; width: 4px; height: 4px; background: var(--ib-head); }

/* 地图大画面：比例尺上面的数据块单位说明（和地图数据块一样：字母淡色，A = 高度米、S = 地速 km/h） */
#units { display: none; position: absolute; z-index: 2; left: 18px; bottom: 37px; pointer-events: none;
  font: 500 10.5px/1.4 "IBM Plex Mono", monospace; color: var(--map-label); text-shadow: 0 0 3px var(--map-halo), 0 0 3px var(--map-halo); }
.layout-map #map #units { display: block; }
#units span { display: block; }
#units i { font-style: normal; color: var(--map-label-2); margin-right: 5px; }

/* 公开网页版（flight.elfradio.net，2026-10-03）：满员提示、点一下出声的提示——页面最上层，居中，不挡数据 */
#full, #tap {
  position: fixed; left: 50%; transform: translateX(-50%); z-index: 1000;
  padding: 6px 12px; border-radius: 3px; background: rgba(17, 17, 17, .82); color: #fff;
  font: 500 12px "IBM Plex Mono", monospace; letter-spacing: .03em; pointer-events: none;
}
#full { top: 40%; background: var(--accent); color: var(--accent-ink); font-size: 14px; }
#full[hidden] { display: none; }
#tap { bottom: 12px; }
