/* ==========================================================================
   维吾尔文智能校对系统 · 产品门户样式
   --------------------------------------------------------------------------
   设计对齐主应用（同色板 / 同圆角 / 同字体栈），但门户是**独立页面**，
   不加载 app.css —— 避免主应用样式改动意外破坏门户（反之亦然）。

   三个必须小心的点（都是本页真踩过的）：
     1. **方向**：门户必须显式 `dir="ltr"`。主应用是 dir=rtl，若门户继承
        或被浏览器判定为 RTL，整个 hero / 网格会左右镜像，中文段落里的
        标点也会跑到行首。维文片段一律用 `.uq` 局部 `dir="rtl"`。
     2. **中英切换后的行高**：英文换行点与中文完全不同（中文按字断行、
        英文按词断行），`.lede` 之类多行段落必须给足 max-width，
        否则英文会拉出很长的"一行一个字"的窄条。
     3. **截图高矮不齐**：六张截图内容高度不同，若用 `space-between`
        会让卡片内部元素错位。统一用 `object-fit: cover` +
        固定 `aspect-ratio`，保证网格横平竖直。
   ========================================================================== */

:root {
  color-scheme: light;
  /* 字体：与主应用同一套（门户是独立页面，故此处重复声明而非 @import，
     避免多一次请求；维文字体路径改为 ../fonts/ 相对门户目录） */
  /* 【全站统一使用 UKIJCJK】
     与主应用 app.css 保持**完全一致**的字体链：UKIJCJK 优先，
     维文字体次之，中文字体最后兜底。门户虽是独立页面，但用户
     从门户点进主应用时会看到同一套字形，不会"换个页面像换了个产品"。
     详见 app.css 的 --ui-ukij 注释。 */
  --ui-ukij: "UKIJCJK", "UKIJ Tuz Tom", "Alkatip Basma Tom",
             "Noto Naskh Arabic", "Scheherazade New", "Amiri",
             "PingFang SC", "Microsoft YaHei", "Segoe UI", system-ui,
             sans-serif;
  --mono-uy: "UKIJCJK", "UKIJ Tuz Tom", "Alkatip Basma Tom",
             "Noto Naskh Arabic", "Scheherazade New", "Amiri",
             "Times New Roman", serif;
  --ui: var(--ui-ukij);
  /* 维文界面整体字体：直接用正字法友好的阿拉伯字体栈，
     让整页文字（含标题/正文）在 lang=ug 时都走这一套。 */
  --ui-ug: "UKIJCJK", "UKIJ Tuz Tom", "Alkatip Basma Tom",
           "Noto Naskh Arabic", "Scheherazade New", "Amiri", serif;
  /* 代码/命令用等宽；维文绝不能用等宽（会破坏连写）。
     UKIJCJK 放在等宽字体**之后**：等宽的价值是宽度一致（路径/版本号
     对齐），而它是比例字体，放首位会让这些内容参差不齐。 */
  --mono: "SFMono-Regular", "JetBrains Mono", Consolas, "Courier New",
          "UKIJCJK", monospace;

  /* 中性色阶（与主应用 app.css 同一套值，保证两页观感一致） */
  --bg:            #f4f6f9;
  --panel:         #ffffff;
  --border:        #e4e9f0;
  --border-strong: #cfd6e0;
  --text:          #1f2430;
  --text-dim:      #6b7480;
  --text-faint:    #9aa4b2;
  --primary:       #1565c0;
  --primary-dark:  #0d47a1;
  --primary-soft:  #e8f1fd;
  --primary-line:  #c5dcf7;
  --on-primary:    #ffffff;
  /* 导航链接的悬停底色。
     原先在 `.p-nav a:hover` 里写死 #eef3fa（浅色模式的值），
     暗色模式下会变成刺眼的浅蓝色块。抽成变量后两种主题各自取值。 */
  --hover-nav:     #eef3fa;
  --error:         #e53935;
  --warning:       #fb8c00;
  --warning-dark:  #b26a00;
  --info:          #1e88e5;
  --ok:            #2e7d32;

  --radius-sm:     6px;
  --radius:        10px;
  --radius-lg:     16px;
  --radius-pill:   999px;
  --shadow-sm:     0 1px 3px rgba(20, 30, 50, .08);
  --shadow:        0 1px 3px rgba(20, 30, 50, .08), 0 4px 16px rgba(20, 30, 50, .06);
  --shadow-lg:     0 8px 32px rgba(20, 30, 50, .14);
  --shadow-focus:  0 0 0 3px rgba(21, 101, 192, .28);

  --dur-fast: .15s;
  --dur:      .18s;
  --ease:     cubic-bezier(.4, 0, .2, 1);

  --maxw: 1160px;
}

/* ==========================================================================
   深色模式（门户）
   --------------------------------------------------------------------------
   与主应用同一套规则：属性驱动（<html data-theme>），无属性时跟随系统。
   门户是"分享给客户看"的页面，深色下尤其要保证**截图**（多是浅色 UI 截图）
   仍然清晰 —— 故截图卡片在深色下保留浅色垫底（见 .p-shot-img 的 background）。
   ========================================================================== */
[data-theme="dark"] {
  color-scheme: dark;

  --bg:            #12161f;
  --panel:         #1a1f2a;
  --border:        #2c3442;
  --border-strong: #3b4553;
  --text:          #e4e8f0;
  --text-dim:      #98a3b3;
  --text-faint:    #6b7686;
  --primary:       #6fb3ff;
  --primary-dark:  #9ccbff;
  --primary-soft:  #16283f;
  --primary-line:  #2b4a6e;
  --on-primary:    #0b1220;
  --hover-nav:     #26303f;
  --error:         #ff6b6b;
  --warning:       #ffb74d;
  --warning-dark:  #ffd08a;
  --info:          #64b5f6;
  --ok:            #81c995;

  --shadow-sm:     0 1px 2px rgba(0,0,0,.4);
  --shadow:        0 1px 3px rgba(0,0,0,.45), 0 6px 20px rgba(0,0,0,.35);
  --shadow-lg:     0 10px 40px rgba(0,0,0,.55);
  --shadow-focus:  0 0 0 3px rgba(111,179,255,.4);
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) {
    color-scheme: dark;

    --bg:            #12161f;
    --panel:         #1a1f2a;
    --border:        #2c3442;
    --border-strong: #3b4553;
    --text:          #e4e8f0;
    --text-dim:      #98a3b3;
    --text-faint:    #6b7686;
    --primary:       #6fb3ff;
    --primary-dark:  #9ccbff;
    --primary-soft:  #16283f;
    --primary-line:  #2b4a6e;
    --on-primary:    #0b1220;
    --hover-nav:     #26303f;
    --error:         #ff6b6b;
    --warning:       #ffb74d;
    --warning-dark:  #ffd08a;
    --info:          #64b5f6;
    --ok:            #81c995;

    --shadow-sm:     0 1px 2px rgba(0,0,0,.4);
    --shadow:        0 1px 3px rgba(0,0,0,.45), 0 6px 20px rgba(0,0,0,.35);
    --shadow-lg:     0 10px 40px rgba(0,0,0,.55);
    --shadow-focus:  0 0 0 3px rgba(111,179,255,.4);
  }
}

* { box-sizing: border-box; }

/* 维文正文字体：与主应用同一字体文件（门户在 /static/portal/ 下，
   故字体路径上跳一级）。门户里维文只出现在少量片段（品牌名、示例行），
   但正字法渲染同样必须正确。 */
@font-face {
  font-family: "UKIJCJK";
  /* 【同时声明 woff2 与 ttf】浏览器取第一个**能解码**的源，
     故 woff2（体积小）在前、ttf（原始格式，免转换）兜底。
     与主应用 app.css 的声明保持完全一致 —— 两处若不一致，
     门户与主应用会出现不同字形。 */
  src: url("/static/fonts/UKIJCJK.woff2") format("woff2"),
       url("/static/fonts/UKIJCJK.ttf") format("truetype");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  /* 不写 unicode-range：与主应用一致，让本字体覆盖全部字符
     （含汉字），实现"全系统统一字体"。详见 app.css 同名注释。 */
}

html { scroll-behavior: smooth; }

/* 可访问性：焦点环 + 减动效 + 屏幕阅读器工具类 */
:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}
.sr-only {
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}
.skip-link {
  position: absolute; left: 50%; top: -100px;
  transform: translateX(-50%);
  z-index: 300;
  background: var(--primary); color: var(--on-primary);
  padding: 10px 20px; border-radius: 0 0 var(--radius) var(--radius);
  font-size: 14px; font-weight: 600; text-decoration: none;
  transition: top var(--dur) var(--ease);
}
.skip-link:focus { top: 0; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--ui);
  font-size: 15px;
  line-height: 1.7;
  /* 【不要把 direction 写死成 ltr】
     这里曾经是 `direction: ltr`，在双语（中/英）时代没问题。
     但 direction 是**继承属性**：在 body 上显式声明 ltr 会硬编码整页方向，
     portal.js 给 <html> 设的 dir="rtl" 到 body 这一层就被覆盖了 ——
     实测维文模式下的症状是：documentElement.dir 确实是 rtl、
     body 的 computed direction 却仍是 ltr，于是 .wrap / h1 / .p-lede
     全部左对齐，RTL 只有 <html> 一层是"对的"。

     正确做法是这里**不声明** direction，让它继承 <html> 的 dir
     （portal.js 会同步 documentElement.dir）。单独需要 LTR 的片段
     （接口路径、版本号、拉丁技术标签）再用 .uq / code 等局部覆盖。 */
}

/* 维文：局部 RTL + 用支持正字法连写的字体（不能用等宽字体） */
.uq {
  direction: rtl;
  unicode-bidi: isolate;
  font-family: var(--mono-uy);
  line-height: 2.1;
}

.wrap { max-width: var(--maxw); margin: 0 auto; padding: 0 24px; }

/* ============================================================ 顶栏 */
.p-top {
  position: sticky; top: 0; z-index: 60;
  /* 半透明毛玻璃：深浅两态都不能写死白色，故用 color-mix 派生自 --panel */
  background: color-mix(in srgb, var(--panel) 92%, transparent);
  backdrop-filter: saturate(1.6) blur(10px);
  border-bottom: 1px solid var(--border);
}

.p-top-in {
  max-width: var(--maxw);
  margin: 0 auto;
  padding: 12px 24px;
  display: flex;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
}

.p-logo { display: flex; align-items: center; gap: 11px; text-decoration: none; color: inherit; }

.p-logo-mark {
  width: 38px; height: 38px; flex: none;
  border-radius: 11px;
  background: linear-gradient(135deg, var(--primary), #4a90d9);
  color: #fff;
  display: grid; place-items: center;
  font-family: var(--mono-uy);
  font-size: 22px;
  font-weight: 700;
  box-shadow: 0 3px 10px rgba(21, 101, 192, .28);
}

.p-logo-txt { display: flex; flex-direction: column; line-height: 1.25; }
.p-logo-txt b { font-size: 15px; }
.p-logo-txt span { font-size: 11.5px; color: var(--text-dim); letter-spacing: .3px; }

.p-nav { margin-left: auto; display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }

/* 导航链接的默认样式（浅灰文字）。
   【注意特异性陷阱】这里的 `.p-nav a` 是 (0,1,1)，
   比下面 `.p-enter` 的 (0,1,0) **更高**，会覆盖后者的文字颜色。
   因此凡是长在 .p-nav 里、但自带底色的按钮（.p-enter），
   必须用同等或更高的特异性重新声明颜色，否则会出现
   「蓝底 + 灰字」——对比度不足，看起来像按钮没启用。
   实测：暗色模式下 .p-enter 的文字被这条规则改成了
   --text-dim(#98a3b3)，而它本该是 --on-primary。 */
.p-nav a {
  color: var(--text-dim);
  text-decoration: none;
  font-size: 13.5px;
  padding: 6px 11px;
  border-radius: 8px;
  white-space: nowrap;
  transition: background .15s, color .15s;
}
/* 悬停底色用变量而不是写死 #eef3fa：后者是**浅色模式**的值，
   暗色模式下它会变成刺眼的浅蓝块。 */
.p-nav a:hover { background: var(--hover-nav); color: var(--primary); }

/* 语言切换：两颗药丸，当前语言实心 */
.p-lang {
  display: inline-flex;
  border: 1px solid var(--border-strong);
  border-radius: 9px;
  overflow: hidden;
  margin-left: 6px;
}
.p-lang button {
  border: 0;
  background: var(--panel);
  color: var(--text-dim);
  font: inherit;
  font-size: 13px;
  padding: 6px 14px;
  cursor: pointer;
  transition: background .15s, color .15s;
}
.p-lang button + button { border-left: 1px solid var(--border-strong); }
.p-lang button[aria-pressed="true"] { background: var(--primary); color: var(--on-primary); font-weight: 600; }
.p-lang button:not([aria-pressed="true"]):hover { background: var(--primary-soft); }

/* 登录 / 注册：次级按钮，视觉权重低于「进入系统」，
   避免和主 CTA 抢注意力 */
/* 【特异性说明】这三个按钮都长在 <nav class="p-nav"> 里，
   而 `.p-nav a` 的特异性是 (0,1,1)，高于下面这些 (0,1,0) 的类选择器。
   若只用单类选择器，它们的 color / background 会被 `.p-nav a` 覆盖，
   表现为「按设计该有的底色还在，但文字被换成导航灰」——
   暗色模式下实测：.p-auth-in 变成"白底灰字"（几乎读不清）、
   .p-enter 变成"蓝底灰字"。因此统一加 `.p-nav a.` 前缀提升特异性，
   与 `.p-enter` 的处理保持一致。 */
.p-auth,
.p-nav a.p-auth {
  display: inline-flex;
  align-items: center;
  text-decoration: none;
  font-size: 13.5px;
  font-weight: 600;
  padding: 7px 14px;
  border-radius: 9px;
  white-space: nowrap;
  border: 1px solid var(--border-strong);
  transition: background .15s, color .15s, border-color .15s;
}
.p-auth-in,
.p-nav a.p-auth-in {              /* 登录：描边式 */
  color: var(--primary);
  /* 用 --panel 而非写死 #fff：暗色模式下白底会刺眼，
     且与页面其余面板不一致。 */
  background: var(--panel);
}
.p-auth-in:hover,
.p-nav a.p-auth-in:hover { background: var(--primary-soft); border-color: var(--primary); color: var(--primary); }

.p-auth-up,
.p-nav a.p-auth-up {              /* 注册：淡底强调 */
  color: var(--primary-dark);
  background: var(--primary-soft);
  border-color: var(--primary-line);
}
.p-auth-up:hover,
.p-nav a.p-auth-up:hover { background: var(--primary); color: var(--on-primary); border-color: var(--primary); }

/* 进入系统按钮：实心主色底 + 白字。
   【为什么写成 `.p-nav a.p-enter` 而不是 `.p-enter`】
   它位于 <nav class="p-nav"> 内，而 `.p-nav a` 的特异性 (0,1,1) 高于
   `.p-enter` (0,1,0)。若只写 `.p-enter`，其 `color: var(--on-primary)`
   会被 `.p-nav a { color: var(--text-dim) }` 压掉，按钮变成
   「蓝底灰字」—— 对比度不达标，视觉上像是禁用状态。
   加上 `.p-nav` 前缀后特异性升到 (0,2,1)，既压过 `.p-nav a`，
   又保持"只作用于导航内的入口按钮"这一原本意图。
   （保留原 `.p-enter` 规则给不在 .p-nav 内的用法兜底。） */
.p-enter,
.p-nav a.p-enter {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--primary);
  /* 白字。浅色模式下 --on-primary 就是 #ffffff；
     暗色模式下主色变浅蓝，--on-primary 会自动切成深色以保证对比度 ——
     所以这里用变量而非写死 #fff，两种主题都能读清。 */
  color: var(--on-primary);
  text-decoration: none;
  font-size: 13.5px; font-weight: 600;
  padding: 8px 16px;
  border-radius: 9px;
  margin-left: 6px;
  white-space: nowrap;
  box-shadow: 0 2px 8px rgba(21, 101, 192, .28);
  transition: background .15s, transform .15s;
}
/* 悬停同样要提到 .p-nav a:hover 的特异性之上，
   否则会继承导航链接的悬停底色（浅蓝块）而不是主色加深。 */
.p-enter:hover,
.p-nav a.p-enter:hover {
  background: var(--primary-dark);
  color: var(--on-primary);
  transform: translateY(-1px);
}

/* ============================================================ Hero */
.p-hero {
  position: relative;
  overflow: hidden;
  padding: 76px 0 64px;
  background:
    radial-gradient(1100px 420px at 12% -12%, rgba(21, 101, 192, .12), transparent 62%),
    radial-gradient(900px 380px at 92% 4%, rgba(30, 136, 229, .10), transparent 60%),
    linear-gradient(180deg, var(--panel), var(--bg));
  border-bottom: 1px solid var(--border);
}

/* 背景装饰纹样：纯 CSS，不引外部图片（离线可用） */
.p-hero::after {
  content: "";
  position: absolute; inset: 0;
  background-image:
    repeating-linear-gradient(45deg, rgba(21, 101, 192, .035) 0 1px, transparent 1px 22px);
  pointer-events: none;
}

.p-hero .wrap { position: relative; z-index: 1; }

.p-tag {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 12px; font-weight: 600; letter-spacing: .6px;
  color: var(--primary);
  background: rgba(21, 101, 192, .09);
  border: 1px solid rgba(21, 101, 192, .18);
  padding: 5px 13px;
  border-radius: 999px;
  text-transform: uppercase;
}

.p-hero h1 {
  font-size: clamp(30px, 4.4vw, 50px);
  line-height: 1.18;
  margin: 20px 0 0;
  letter-spacing: -.5px;
  font-weight: 800;
  max-width: 900px;
}

.p-lede {
  font-size: clamp(15px, 1.6vw, 17.5px);
  color: var(--text-dim);
  margin: 20px 0 0;
  /* 中英都要断得好看：中文靠 max-width 控制每行字数，
     英文靠这里控制词组密度。窄于 560px 时英文会碎成短句，故给足。 */
  max-width: 760px;
}

.p-hero-cta { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 32px; }

.p-btn {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 15px; font-weight: 600;
  padding: 13px 26px;
  border-radius: 11px;
  text-decoration: none;
  border: 1px solid transparent;
  cursor: pointer;
  transition: background .15s, transform .15s, box-shadow .15s;
}
.p-btn-1 {
  background: var(--primary); color: var(--on-primary);
  box-shadow: 0 4px 14px rgba(21, 101, 192, .3);
}
.p-btn-1:hover { background: var(--primary-dark); transform: translateY(-2px); box-shadow: 0 8px 22px rgba(21, 101, 192, .34); }
.p-btn-2 {
  background: var(--panel); color: var(--primary);
  border-color: var(--border-strong);
}
.p-btn-2:hover { background: var(--primary-soft); border-color: var(--primary); transform: translateY(-2px); }

/* 首屏注册引导：视觉权重低于两个主按钮，但要足够显眼 */
.p-hero-auth {
  margin: 22px 0 0;
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  font-size: 14px;
  color: var(--text-dim);
}
.p-hero-auth a { text-decoration: none; font-weight: 600; }
.p-hero-auth-up {
  color: var(--primary-dark);
  border-bottom: 2px solid var(--primary-line);
  padding-bottom: 1px;
  transition: border-color .15s, color .15s;
}
.p-hero-auth-up:hover { color: var(--primary); border-color: var(--primary); }
.p-hero-auth-in {
  color: var(--primary);
  border-bottom: 2px solid transparent;
  padding-bottom: 1px;
  transition: border-color .15s;
}
.p-hero-auth-in:hover { border-color: var(--primary); }

/* Hero 里的维文示例（点明产品面向的语言） */
.p-uyline {
  margin-top: 34px;
  font-size: clamp(19px, 2.4vw, 26px);
  color: var(--primary-dark);
  opacity: .92;
  max-width: 760px;
}

/* ============================================================ 统计条 */
.p-stats {
  background: var(--panel);
  border-bottom: 1px solid var(--border);
  padding: 34px 0;
}

.p-stats-head {
  display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  margin-bottom: 22px;
}
.p-stats-head h2 { font-size: 15px; margin: 0; font-weight: 700; }
.p-stats-head span { font-size: 12.5px; color: var(--text-dim); }

.p-stats-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 16px;
}

.p-stat {
  background: linear-gradient(180deg, var(--panel), var(--bg));
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 18px 20px;
}
.p-stat b {
  display: block;
  font-size: clamp(24px, 3vw, 32px);
  line-height: 1.15;
  color: var(--primary-dark);
  font-variant-numeric: tabular-nums;
  letter-spacing: -.5px;
}
.p-stat span { display: block; margin-top: 6px; font-size: 13px; color: var(--text-dim); }

/* ============================================================ 通用小节 */
.p-sec { padding: 72px 0; }
.p-sec.alt { background: var(--panel); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }

.p-sec-head { max-width: 760px; margin-bottom: 40px; }

.p-eyebrow {
  font-size: 12px; font-weight: 700; letter-spacing: 1.4px;
  color: var(--primary); text-transform: uppercase;
}

.p-sec-head h2 {
  font-size: clamp(24px, 3vw, 34px);
  margin: 10px 0 0;
  line-height: 1.25;
  font-weight: 800;
  letter-spacing: -.4px;
}

.p-sec-head p { color: var(--text-dim); margin: 14px 0 0; font-size: 15.5px; }

/* ============================================================ 功能卡片 */
.p-feats { display: grid; gap: 20px; grid-template-columns: repeat(auto-fit, minmax(330px, 1fr)); }

.p-feat {
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 26px 26px 22px;
  box-shadow: var(--shadow-sm);
  transition: transform .18s, box-shadow .18s, border-color .18s;
  display: flex; flex-direction: column;
}
.p-feat:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); border-color: var(--primary-line); }

.p-feat-top { display: flex; align-items: center; gap: 12px; }

.p-feat-k {
  font-family: var(--mono);
  font-size: 13px; font-weight: 700;
  color: var(--primary);
  background: rgba(21, 101, 192, .1);
  border-radius: 8px;
  padding: 4px 9px;
}
.p-feat-top h3 { font-size: 18.5px; margin: 0; font-weight: 700; line-height: 1.35; }

.p-feat-tag {
  margin-left: auto;
  font-size: 11.5px; font-weight: 700;
  padding: 3px 10px;
  border-radius: 999px;
  background: var(--primary-soft); color: var(--primary);
  border: 1px solid var(--primary-line);
  white-space: nowrap;
}

.p-feat p { margin: 14px 0 0; color: var(--text-dim); font-size: 14.5px; }

.p-feat ul { list-style: none; margin: 16px 0 0; padding: 0; display: grid; gap: 8px; }
.p-feat li {
  position: relative;
  padding-left: 24px;
  font-size: 14px;
  color: var(--text);
}
.p-feat li::before {
  content: "";
  position: absolute;
  left: 6px; top: .58em;
  width: 7px; height: 7px;
  border-radius: 2px;
  background: var(--primary);
  opacity: .75;
}

/* ============================================================ 截图 */
.p-shots { display: grid; gap: 24px; grid-template-columns: repeat(auto-fit, minmax(420px, 1fr)); }

.p-shot {
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
  display: flex; flex-direction: column;
  transition: transform .18s, box-shadow .18s;
}
.p-shot:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }

/* 固定比例 + cover：六张截图原始高矮不一，若不锁定会参差不齐 */
.p-shot-img {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 10;
  object-fit: cover;
  object-position: top center;
  background: var(--border);
  border-bottom: 1px solid var(--border);
  cursor: zoom-in;
}

.p-shot-body { padding: 18px 22px 20px; }
.p-shot-body h3 { font-size: 16.5px; margin: 0; font-weight: 700; }
.p-shot-body p { margin: 8px 0 0; font-size: 14px; color: var(--text-dim); }

/* ============================================================ 架构 */
.p-arch { display: grid; gap: 12px; }

.p-layer {
  display: flex; align-items: center; gap: 16px;
  background: var(--panel);
  border: 1px solid var(--border);
  border-left: 4px solid var(--primary);
  border-radius: var(--radius);
  padding: 16px 20px;
  box-shadow: var(--shadow-sm);
}
.p-layer .p-layer-tag {
  font-family: var(--mono);
  font-size: 11.5px; font-weight: 700;
  color: var(--primary);
  background: rgba(21, 101, 192, .1);
  padding: 4px 10px;
  border-radius: 6px;
  flex: none;
  min-width: 62px;
  text-align: center;
}
.p-layer b { font-size: 15px; flex: none; }
.p-layer span { font-size: 14px; color: var(--text-dim); }

.p-bench { margin-top: 28px; background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.p-bench h3 { margin: 0; padding: 15px 20px; font-size: 15px; border-bottom: 1px solid var(--border); background: var(--bg); }
.p-bench-row {
  display: flex; justify-content: space-between; gap: 16px;
  padding: 12px 20px; font-size: 14px;
  border-bottom: 1px solid var(--border);
}
.p-bench-row:last-child { border-bottom: 0; }
.p-bench-row span { color: var(--text-dim); }
/* 性能列：数值行用等宽（数字对齐好看），维文行用维文字体。
   【为什么字体也必须收窄成 `.num`，不能整列套 --mono】
   这里最初写的是 `.p-bench-row b { font-family: var(--mono) }`，
   与后来修掉的 `direction: ltr` 是**同一个「整列无差别套用」的毛病** ——
   direction 修了，字体当时漏了，于是留下一处更隐蔽的错：

   维文语言包里这一列装着 `ھەممىسى مۇۋەپپەقىيەتلىك`、`تەخمىنەن 3 ms`
   这类**真维文**，而 `--mono` 是
   `SFMono-Regular / JetBrains Mono / Consolas / Courier New / monospace`
   —— 全是拉丁等宽字体，没有任何阿拉伯字形。浏览器只能用回退链
   去凑，结果就是**连写断开、上下加符错位**。
   `--mono` 的定义处本就写着「维文绝不能用等宽」，这条规则正好违反它。

   更麻烦的是这种错在截图上"像是字体不好看"，不像是 bug，极易放过；
   实测时四个 <b> 里三个（纯维文那些）都拿到了等宽字体。

   现由 portal.js 打的 `num` 类区分二者：
     · `.num`（`1.36 s (15,931 …)`）→ 保留等宽，数字对齐
     · 其余（纯维文）→ 用 --ui-ug（正字法友好的阿拉伯字体栈）
   本规则放在全局作用域，故用 `.p-bench-row b.num` 限定。 */
.p-bench-row b { font-size: 13.5px; color: var(--ok); white-space: nowrap; }
.p-bench-row b.num { font-family: var(--mono); }
/* 维文行换用正字法字体。与 .p-feat-tag 同样只换字体、不换方向。
   （深色/浅色共用，故不限主题。） */
body.lang-ug .p-bench-row b:not(.num) { font-family: var(--ui-ug); }

/* ============================================================ API 表 */
/* 表格外层滚动容器：窄屏下 API 表（方法/路径/说明三列 + 等宽路径）
   必然宽于视口，硬挤压会把"说明"列压成一列一个字。
   改为横向滚动，表格自身保持 min-width 保证可读。 */
.p-table-scroll {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--panel);
  box-shadow: var(--shadow-sm);
}
.p-table { width: 100%; min-width: 560px; border-collapse: collapse; background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow-sm); }
.p-table th, .p-table td { text-align: left; padding: 12px 18px; font-size: 14px; border-bottom: 1px solid var(--border); }
.p-table th { background: var(--bg); font-size: 12.5px; text-transform: uppercase; letter-spacing: .6px; color: var(--text-dim); font-weight: 700; }
.p-table tr:last-child td { border-bottom: 0; }
.p-table td:nth-child(1) { width: 82px; }
.p-table td:nth-child(2) { width: 300px; }
.p-table code {
  font-family: var(--mono);
  font-size: 13px;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 5px;
  padding: 2px 7px;
  /* 接口路径是 LTR，即便页面切到别的方向也不能被镜像 */
  direction: ltr;
  unicode-bidi: isolate;
  white-space: nowrap;
}

.p-m {
  font-family: var(--mono);
  font-size: 11.5px; font-weight: 700;
  padding: 3px 9px; border-radius: 6px;
}
.p-m.post { background: color-mix(in srgb, var(--ok) 14%, transparent); color: var(--ok); border: 1px solid color-mix(in srgb, var(--ok) 40%, transparent); }
.p-m.get  { background: var(--primary-soft); color: var(--primary-dark); border: 1px solid var(--primary-line); }

/* ==========================================================================
   维吾尔文界面（lang=ug）—— RTL 与字体
   --------------------------------------------------------------------------
   【为什么 RTL 只在 body 上切换，而不是整站常开】
   门户中英版是 LTR，且页面里有**必须保持 LTR 的内容**：
   API 路径（`/api/check`）、SQL 表名、代码片段。
   若把 html 整体设成 rtl，`/api/check` 会被镜像成 `check/api/` 的视觉顺序
   —— 看起来只是"怪"，复制出来却是错的，属于最危险的那类排版 bug。
   因此：RTL 切到 body 层，代码/路径用 .p-code / code 显式锁回 LTR。

   【为什么维文界面必须换字体】
   系统默认阿拉伯字体（尤其 Linux 上的 DejaVu / Noto Naskh 回退链）
   对 UEY 正字法的连写与上下加符支持参差，会出现字母断开、
   加符错位。这里复用主应用的字体栈（UKIJ Tuz Tom 等）。
   ========================================================================== */
body.lang-ug {
  font-family: var(--ui-ug);
  /* 阿拉伯字母有上下加符，行高要比拉丁文宽，否则上下行会粘连 */
  line-height: 1.95;

  /* 【为什么这里只写 `text-align: start`，而不是逐类列举 .p-feat / .p-stat …】
     原来是一份清单式的选择器列表（.p-sec-head, .p-feat, .p-shot-body …），
     清单的毛病是**必然漏项**：`#top` 首屏那段
     （.p-hero > .wrap > h1 / .p-lede / .p-tag / .p-hero-cta）
     当时就不在清单里。实测维文模式下首屏标题与正文统统左对齐，
     而其它区块却是右对齐 —— 同一个页面出现两种方向。

     改为：整页方向由 <html dir> 统一决定（body 不再硬编码 ltr，
     见上方 body 规则），这里只做一次兜底。
     用 `start` 而非 `right`，是为了让「方向」与「对齐」保持同一个来源：
     若写死 right，将来支持其它 RTL 语言时又要多一处单独修改。 */
  text-align: start;
}

/* 列表项的项目符号在 RTL 下要翻到右侧 */
body.lang-ug .p-feat li { padding-left: 0; padding-right: 24px; }
body.lang-ug .p-feat li::before { left: auto; right: 6px; }

/* 顶栏与页脚：RTL 下 flex 主轴反向，logo 自然落在右侧 */
body.lang-ug .p-nav { margin-left: 0; margin-right: auto; }
body.lang-ug .p-lang,
body.lang-ug .p-auth,
body.lang-ug .p-enter { margin-left: 0; margin-right: 6px; }
/* 语言按钮与登录/注册在 RTL 下也保持 6px 间距 */
.p-auth + .p-auth { margin-left: 6px; }
body.lang-ug .p-auth + .p-auth { margin-left: 0; margin-right: 6px; }

/* 维文界面里的技术标签：强制 LTR + 拉丁字体。
   【为什么必须逐类挑，不能整批套用】
   这些类里混着两种性质完全不同的内容，一律 LTR 会把维文弄坏：
     · 纯拉丁/数字 —— 序号 `01`、`RTL`、`API`、`Cache`、`Engine`、`DB`
       → 必须 LTR，否则在 RTL 上下文里顺序会被镜像；
     · **真实维文词** —— `.p-feat-tag` 在维文语言包里是
       `ئاساسىي` / `ئىملا قائىدىسى` / `سۈپەت دەرۋازىسى` / `باشقۇرۇش`
       → 绝不能 LTR。给维文词强加 LTR 会让连写与阅读顺序出错，
       而且这种错误在截图上看起来"像是字体问题"，极难定位。

   实测（改造前）：`body.lang-ug .p-feat-tag { direction: ltr }` 让 7 个
   维文标签全部以 LTR 渲染。原注释写的是"避免阿拉伯字体渲染英文词组"，
   说明作者当时以为这个类只装英文 —— 维文语言包加入后该前提已不成立。

   因此这里把 `p-feat-tag` 移出强制 LTR 名单，只保留真正纯拉丁的类。 */
body.lang-ug .p-feat-k,
body.lang-ug .p-layer-tag,
body.lang-ug .p-m,
body.lang-ug .p-eyebrow {
  font-family: var(--ui);
  direction: ltr;
  unicode-bidi: isolate;
}

/* `.p-feat-tag` 只换字体、不换方向：维文标签要保持 RTL。
   用 `isolate` 而非 `isolate-override` —— 后者会强制内部按 LTR 排版，
   正是前面那个 bug 的成因。 */
body.lang-ug .p-feat-tag {
  font-family: var(--ui-ug);
  unicode-bidi: isolate;
}

/* 反例保护：路径 / 代码 / **数值** 一律强制 LTR，
   绝不允许被 RTL 上下文镜像 —— 这类内容错了不会被肉眼发现。
   （例：`1.36 s (15,931 سۆز/سېكۇنت)` 若按 RTL 排，
   括号与数字会被重排成难以辨认的顺序。）

   【为什么 `.p-bench-row b` 要收窄成 `.p-bench-row b.num`】
   这一列在维文语言包里同时装着两类内容：
     · 数值型 `1.36 s (15,931 …)` —— 必须 LTR；
     · 纯维文 `ھەممىسى مۇۋەپپەقىيەتلىك` —— 绝不能 LTR。
   原先的 `.p-bench-row b { direction: ltr; text-align: left }` 是
   **无语言限定**的（`.p-bench-row b` 与 `.p-table code` 并列出现两次），
   会把纯维文那几行也强行 LTR，破坏维文连写。
   现由 portal.js 给数值行打上 `num` 类，方向只作用于它。
   同理 `.p-table code` 保持不限语言 —— 表格里只放接口路径。 */
body.lang-ug code,
body.lang-ug .p-table code,
body.lang-ug .p-bench-row b.num,
.p-bench-row b.num,
.p-table code {
  direction: ltr;
  unicode-bidi: isolate;
  text-align: left;
}

/* 页脚右栏在 RTL 下贴左，与整体方向一致 */
body.lang-ug .p-foot .p-foot-right { margin-left: 0; margin-right: auto; text-align: right; }

/* 顶栏在窄屏收起导航后，语言切换需要能容纳三种语言 */
@media (max-width: 900px) {
  .p-lang button { padding: 6px 10px; font-size: 12.5px; }
}

/* ============================================================ 页脚 */
.p-foot {
  background: var(--text);
  color: var(--panel);
  padding: 36px 0;
  font-size: 13.5px;
}
.p-foot-in { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.p-foot b { color: var(--panel); font-weight: 600; }
.p-foot .p-foot-right { margin-left: auto; text-align: right; }

/* ============================================================ 图片放大 */
.p-lightbox {
  position: fixed; inset: 0; z-index: 200;
  background: rgba(12, 18, 28, .86);
  display: none;
  align-items: center; justify-content: center;
  padding: 40px;
  cursor: zoom-out;
}
.p-lightbox.on { display: flex; }
.p-lightbox img {
  max-width: 100%; max-height: 100%;
  border-radius: var(--radius);
  box-shadow: 0 20px 60px rgba(0, 0, 0, .5);
}

/* ============================================================ 响应式 */
@media (max-width: 900px) {
  .p-nav a { display: none; }           /* 窄屏收起主导航，保留语言切换与入口 */
  .p-hero { padding: 52px 0 44px; }
  .p-sec { padding: 52px 0; }
  .p-shots { grid-template-columns: 1fr; }
  .p-layer { flex-wrap: wrap; }
  .p-table td:nth-child(2) { width: auto; }
}

@media (max-width: 560px) {
  .p-wrap, .wrap, .p-top-in { padding-left: 16px; padding-right: 16px; }
  .p-stats-grid { grid-template-columns: 1fr 1fr; }
  .p-feats { grid-template-columns: 1fr; }
  .p-foot .p-foot-right { margin-left: 0; text-align: left; }

  /* 顶栏在手机上是"logo + 语言三连 + 外观 + 入口"共 6 个控件，
     会挤成两行且高度失控。这里收紧间距并把语言按钮压扁，
     保证仍在一到两行内、且每个目标 ≥ 32px 可点。 */
  .p-top-in { padding: 10px 16px; gap: 8px; }
  .p-logo-mark { width: 32px; height: 32px; font-size: 19px; }
  .p-logo-txt b { font-size: 14px; }
  .p-logo-txt span { display: none; }   /* 副标在手机上省掉 */
  .p-nav { gap: 2px; }
  .p-lang button { padding: 6px 9px; font-size: 12px; }
  .p-theme { width: 32px; height: 32px; font-size: 15px; margin-left: 2px; }
  .p-enter { padding: 7px 12px; font-size: 13px; margin-left: 2px; }

  .p-hero { padding: 40px 0 34px; }
  .p-sec { padding: 44px 0; }
  .p-hero h1 { letter-spacing: -.2px; }
  .p-stat b { font-size: 26px; }
  .p-sec-head { margin-bottom: 28px; }

  /* 截图：手机上 iframe 般的 16/10 卡片太矮看不清内容，改 4/3 */
  .p-shot-img { aspect-ratio: 4 / 3; }
  .p-lightbox { padding: 16px; }
}

@media (max-width: 380px) {
  /* 极窄：语言按钮只留当前语言以外的两个也不现实，整体缩到最小可点尺寸 */
  .p-lang button { padding: 5px 7px; font-size: 11px; }
  .p-stats-grid { grid-template-columns: 1fr; }
}

/* 打印：门户常被用于交付说明，打印时去掉装饰、展开所有内容 */
@media print {
  .p-top, .p-hero-cta, .p-lightbox, .p-theme { display: none !important; }
  body { background: #fff; }
  .p-sec { padding: 24px 0; break-inside: avoid; }
  .p-shot { break-inside: avoid; }
}
