/* ==========================================================================
   MimirDesk 登录页（2026-10-31 重构）
   --------------------------------------------------------------------------
   设计基准：一张 1711 × 919 的设计稿（原件 admin-assets/login-bg-raw.jpg）。
   整页按该稿等比缩放，位置/尺寸全部写成「设计像素 × 变量」：
       --u  = min(100vw, 186.1806vh) / 1711   ← 1 个设计像素（背景图用）
       --ks = 0.82                            ← 卡片整体缩放系数（可调）
       --uc = --u * --ks                      ← 卡片内一切尺寸都用它
   视口比例与设计稿一致时 --u 恰为 1px。卡片内所有尺寸都乘 --uc，
   所以改 --ks 是「连框带字一起缩」，不会出现框缩了字没缩的错位。

   ⚠️ 背景图里的白色卡片与投影已在生成时抹平（tools/make_login_bg.py），
      所以卡片缩小后四周不会露出原图的卡边；改 --ks 不必重做背景图。

   设计稿原始坐标（--ks = 1 时；缩小后按比例同步变化）：
       卡片         x 579 .. 1117 (w 539)   y 131 .. 793 (h 663)  r 14
       内容左边距   47          内容宽 445
       logo         96 × 96      y 183
       标题         33px/700     y 295
       副标题       18px/400     y 345
       输入框 1     445 × 56     y 426
       输入框 2     445 × 56     y 543
       记住我行     h 24         y 624
       登录按钮     445 × 62     y 682
   ⚠️ 卡片高度已由 663 改为 748（2026-10-31）：设计稿没有第三方登录，
      配好 Azure Entra ID 后必须在按钮下方追加「或使用以下登陆 + 一个按钮」，
      663 高度只剩 50px 余量放不下（divider 18 + 间距 + 按钮 46 ≈ 92）。
      卡片是向下长高的（顶部锚点不动），所以 logo/标题/表单的位置仍与设计稿逐像素一致。
      以后删掉第三方登录时把 H 改回 663（半高 331.5）。
   ⚠️ 页脚（::after）已改为钉在页面底部，与卡片脱钩：距底边一个行高（28 设计像素）。
       第三方分隔线  y 634（卡片内）h 18
       第三方按钮    445 × 46     y 672

   ⚠️ 字号只有两级（2026-10-31 统一）：标题 33，其余一切文字 18。
      改版前正文是 16/17/18/19/20 五种混用 —— 分隔线 16、SSO 按钮 17、
      输入框 19、页脚 20，肉眼就是「一个界面里字号不齐」。
      现在层级只靠 字重 / 颜色 区分，不再靠字号。新增元素请一律用 18。

   注意：本文件替换 rustdesk-api 编译产物 static/css/login-CH1Kl6cX.css，
   选择器必须保留 [data-v-1dd7ab39]，否则 scoped 样式不生效。
   ========================================================================== */

.login-container[data-v-1dd7ab39] {
  /* 1 个设计像素对应的实际长度 */
  --u: calc(min(100vw, 186.1806vh) / 1711);

  /* 卡片缩放系数 —— 想整体调大/调小登录框，只改这一个数。
     1 = 与设计稿 1:1（卡片 539×663）；0.82 = 卡片缩到 82%，字号、内距、
     输入框、按钮全部等比同步。卡片内所有尺寸都写成「设计像素 × --uc」，
     所以改这里不会出现「框缩了字没缩」的错位。 */
  --ks: 0.82;
  --uc: calc(var(--u) * var(--ks));

  /* 整张卡片（连同页脚）的垂直偏移，单位 = 设计像素，负数向上。
     -24 = 把「卡片 + 页脚」当成一个整体居中（页脚在下方有视觉重量，
     所以卡片本身要比几何正中再高一点才显得居中）。
     想让登录框再高一点/低一点，只改这一个数。 */
  --dy: -24;
  /* 卡片自身的中心线（设计稿里卡片中心比视口中心低 3 设计像素） */
  --cy: calc(50vh + (3 + var(--dy)) * var(--u));

  /* 设计稿取色 */
  --lk-ink: #111827;      /* 主标题 */
  --lk-ink2: #1F2937;     /* label / 正文 */
  --lk-sub: #6B7280;      /* 副标题 */
  --lk-ph: #9AA1AC;       /* placeholder / 图标 */
  --lk-line: #DEDFE3;     /* 输入框边框 */
  --lk-line-f: #9CB6EC;   /* 输入框 focus 边框 */
  --lk-ring: #B9CDF2;     /* 输入框 focus 外发光 */
  --lk-blue: #0063FC;     /* 主按钮 / 链接 */
  --lk-card: #FCFCFC;     /* 卡片底色（与背景图一致） */

  position: fixed;
  inset: 0;
  display: block;
  padding: 0;
  margin: 0;
  overflow: hidden;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
    "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;
  -webkit-font-smoothing: antialiased;
}

/* 背景图：与设计稿同比例，居中，铺满自己的矩形。
   视口比设计稿「窄」（16:10、3:2 屏）时上下会留出窄边，容器用设计稿顶/底行的
   实际取样色做垂直渐变填住；「宽」（21:9、带鱼屏）时左右留边，横向是纯渐变无内容。 */
.login-container[data-v-1dd7ab39] {
  background: linear-gradient(180deg, #E4EAF8 0%, #E5EBF9 52%, #E6ECFA 100%);
}

.login-container[data-v-1dd7ab39]::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: calc(1711 * var(--u));
  height: calc(919 * var(--u));
  transform: translate(-50%, -50%);
  background: url("../img/login-bg.jpg") 0 0 / 100% 100% no-repeat;
  pointer-events: none;
}

/* 视口比设计稿「窄」时（16:9 / 16:10 / 3:2），stage 上下会留边，图片顶行被切成直角。
   这里把上下各 26px 渐隐到容器背景色，把硬分界软化成过渡。
   阈值取 1710/919（略小于设计稿的 1711/919）—— 视口比例正好等于设计稿时
   stage 是铺满的，不能淡化真正的内容。 */
@media (max-aspect-ratio: 1710/919) {
  .login-container[data-v-1dd7ab39]::before {
    -webkit-mask-image: linear-gradient(180deg, transparent 0, #000 26px,
      #000 calc(100% - 26px), transparent 100%);
    mask-image: linear-gradient(180deg, transparent 0, #000 26px,
      #000 calc(100% - 26px), transparent 100%);
  }
}

/* 页脚版权：钉在页面底部居中，距底边一个页脚行高（28 设计像素）。
   ⚠️ 用 bottom 而不是 top —— 卡片高度变化时页脚不再跟着跑。 */
.login-container[data-v-1dd7ab39]::after {
  content: "© 2026 MM-AIGC。本产品包含遵循 MIT、AGPL-3.0 及 BSD 许可的开源软件。";
  position: absolute;
  left: 0;
  right: 0;
  bottom: calc(28 * var(--uc));
  line-height: calc(28 * var(--uc));
  font-size: calc(18 * var(--uc));
  color: #4B5563;
  text-align: center;
  white-space: nowrap;
  pointer-events: none;
}

/* ---------------- 卡片 ----------------
   以卡片自身的中心（--cy）为锚点，半高 374 = 748/2。
   ⚠️ 这里的 374 必须与上面的 height 同步：加高卡片时若忘了改这个数，
      卡片会整体向下偏移「(新高度 - 旧高度) / 2」，看起来就是「登录框偏下」
      —— 663→748 时就踩过这个坑（少扣 42.5 设计像素）。 */
.login-card[data-v-1dd7ab39] {
  position: absolute;
  left: calc(50vw - 7 * var(--u) - 269.5 * var(--uc));
  top: calc(var(--cy) - 374 * var(--uc));
  width: calc(539 * var(--uc));
  height: calc(748 * var(--uc));
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  background: var(--lk-card);
  border: 0;
  border-radius: calc(14 * var(--uc));
  box-shadow: none;
  text-align: left;
  overflow: hidden;
}

/* logo */
.login-card[data-v-1dd7ab39] > .login-logo {
  position: absolute;
  left: 50%;
  top: calc(52 * var(--uc));
  width: calc(96 * var(--uc));
  height: calc(96 * var(--uc));
  margin: 0 0 0 calc(-48 * var(--uc));
  display: block;
  border-radius: 0;
  object-fit: contain;
}

/* 主标题 */
.login-card[data-v-1dd7ab39]::before {
  content: "MimirDesk";
  position: absolute;
  left: 0;
  right: 0;
  top: calc(164 * var(--uc));
  line-height: calc(40 * var(--uc));
  font-size: calc(33 * var(--uc));
  font-weight: 700;
  letter-spacing: 0;
  color: var(--lk-ink);
  text-align: center;
  white-space: nowrap;
}

/* 副标题 */
.login-card[data-v-1dd7ab39]::after {
  content: "欢迎登录管理平台";
  position: absolute;
  left: 0;
  right: 0;
  top: calc(214 * var(--uc));
  line-height: calc(26 * var(--uc));
  font-size: calc(18 * var(--uc));
  font-weight: 400;
  color: var(--lk-sub);
  text-align: center;
  white-space: nowrap;
}

/* ---------------- 表单 ---------------- */
.login-form[data-v-1dd7ab39] {
  position: absolute;
  left: calc(47 * var(--uc));
  top: calc(259 * var(--uc));
  width: calc(445 * var(--uc));
  margin: 0;
  padding: 0;
}

.login-form[data-v-1dd7ab39] > .el-form-item {
  display: block;
  margin: 0 0 calc(29 * var(--uc)) 0;
  padding: 0;
}

/* 第二项（密码）与第一项之间的间距 */
.login-form[data-v-1dd7ab39] > .el-form-item:nth-child(2) {
  margin-bottom: calc(25 * var(--uc));
}

/* label */
.login-form[data-v-1dd7ab39] > .el-form-item > .el-form-item__label {
  display: block;
  float: none;
  width: auto;
  height: auto;
  margin: 0;
  padding: 0;
  line-height: calc(28 * var(--uc));
  font-size: calc(18 * var(--uc));
  font-weight: 500;
  color: var(--lk-ink2);
  text-align: left;
  justify-content: flex-start;
}

.login-form[data-v-1dd7ab39] > .el-form-item > .el-form-item__content {
  margin: 0;
  margin-left: 0 !important;
  line-height: normal;
  padding-top: calc(8 * var(--uc));
}

.login-form[data-v-1dd7ab39] > .el-form-item:nth-child(2) > .el-form-item__content {
  padding-top: calc(4 * var(--uc));
}

/* ---------------- 输入框 ---------------- */
.login-form[data-v-1dd7ab39] .login-input {
  width: 100%;
  --el-input-height: calc(56 * var(--uc));
  font-size: calc(18 * var(--uc));
}

.login-form[data-v-1dd7ab39] .login-input .el-input__wrapper {
  height: calc(56 * var(--uc));
  box-sizing: border-box;
  padding: 0 calc(18 * var(--uc)) 0 calc(45 * var(--uc));
  border-radius: calc(9 * var(--uc));
  background-color: #FFFFFF;
  background-repeat: no-repeat;
  background-position: calc(17 * var(--uc)) center;
  background-size: calc(18 * var(--uc)) calc(18 * var(--uc));
  box-shadow: 0 0 0 calc(1 * var(--uc)) var(--lk-line) inset;
  transition: box-shadow .16s ease;
}

.login-form[data-v-1dd7ab39] .login-input .el-input__wrapper:hover {
  box-shadow: 0 0 0 calc(1 * var(--uc)) #C6CCD6 inset;
}

.login-form[data-v-1dd7ab39] .login-input .el-input__wrapper.is-focus,
.login-form[data-v-1dd7ab39] .login-input .el-input__wrapper:focus-within {
  box-shadow: 0 0 0 calc(1.6 * var(--uc)) var(--lk-line-f) inset,
    0 0 0 calc(3.2 * var(--uc)) var(--lk-ring);
}

.login-form[data-v-1dd7ab39] .login-input .el-input__inner {
  height: calc(54 * var(--uc));
  line-height: calc(54 * var(--uc));
  font-size: calc(18 * var(--uc));
  color: var(--lk-ink2);
  background: transparent;
}

.login-form[data-v-1dd7ab39] .login-input .el-input__inner::placeholder {
  color: var(--lk-ph);
}

.login-form[data-v-1dd7ab39] .login-input .el-input__suffix {
  right: calc(16 * var(--uc));
  color: var(--lk-ph);
}

.login-form[data-v-1dd7ab39] .login-input .el-input__suffix svg {
  width: calc(20 * var(--uc));
  height: calc(20 * var(--uc));
}

/* 用户名框：人形图标 */
.login-form[data-v-1dd7ab39] > .el-form-item:nth-child(1) .el-input__wrapper {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239AA1AC' stroke-width='1.7' stroke-linecap='round'%3E%3Ccircle cx='12' cy='8.2' r='3.5'/%3E%3Cpath d='M5 20c0-3.5 3.1-5.9 7-5.9s7 2.4 7 5.9'/%3E%3C/svg%3E");
}

/* 密码框：锁图标 */
.login-form[data-v-1dd7ab39] > .el-form-item:nth-child(2) .el-input__wrapper {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239AA1AC' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4.6' y='10.4' width='14.8' height='9.4' rx='2.2'/%3E%3Cpath d='M8.4 10.4V7.7a3.6 3.6 0 0 1 7.2 0v2.7'/%3E%3C/svg%3E");
}

/* 验证码：若开启，按同一视觉排布，整个表单自动下移压缩间距 */
.login-form[data-v-1dd7ab39] > .el-form-item .captcha-input {
  width: 100%;
}

.login-form[data-v-1dd7ab39] > .el-form-item .captcha-input .el-input-group__append {
  padding: 0;
  border-radius: 0 calc(9 * var(--uc)) calc(9 * var(--uc)) 0;
  overflow: hidden;
  background: #fff;
  box-shadow: none;
}

.login-form[data-v-1dd7ab39] .captcha {
  display: block;
  width: calc(150 * var(--uc));
  height: calc(54 * var(--uc));
  cursor: pointer;
}

/* ---------------- 记住我 / 忘记密码 ---------------- */
.login-card .md-recall {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: calc(24 * var(--uc));
  margin: 0;
  font-size: calc(18 * var(--uc));
  line-height: calc(24 * var(--uc));
  color: var(--lk-ink2);
}

.login-card .md-rmk {
  display: inline-flex;
  align-items: center;
  gap: calc(13 * var(--uc));
  cursor: pointer;
  color: #1F2937;
  font-size: calc(18 * var(--uc));
  line-height: calc(24 * var(--uc));
  user-select: none;
}

.login-card .md-rmk-box {
  -webkit-appearance: none;
  appearance: none;
  flex: none;
  width: calc(22 * var(--uc));
  height: calc(22 * var(--uc));
  margin: 0;
  border: calc(1.5 * var(--uc)) solid #C9CED8;
  border-radius: calc(5 * var(--uc));
  background: #FFFFFF;
  cursor: pointer;
  position: relative;
  box-sizing: border-box;
  transition: background-color .15s ease, border-color .15s ease;
}

.login-card .md-rmk-box:hover {
  border-color: #A9B2C0;
}

.login-card .md-rmk-box:checked {
  background: var(--lk-blue);
  border-color: var(--lk-blue);
}

.login-card .md-rmk-box:checked::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 47%;
  width: calc(5 * var(--uc));
  height: calc(9 * var(--uc));
  border: solid #FFFFFF;
  border-width: 0 calc(2 * var(--uc)) calc(2 * var(--uc)) 0;
  transform: translate(-50%, -50%) rotate(45deg);
  box-sizing: border-box;
}

.login-card .md-forgot {
  color: var(--lk-blue);
  font-size: calc(18 * var(--uc));
  line-height: calc(24 * var(--uc));
  text-decoration: none;
  cursor: pointer;
  white-space: nowrap;
}

.login-card .md-forgot:hover {
  text-decoration: underline;
}

/* 最后一个 form-item = 登录按钮行（「记住我」是普通 div，不参与 nth 计数） */
.login-form[data-v-1dd7ab39] > .el-form-item:last-child {
  margin-top: calc(34 * var(--uc));
  margin-bottom: 0;
}

.login-form[data-v-1dd7ab39] > .el-form-item:last-child > .el-form-item__content {
  padding-top: 0;
}

/* ---------------- 登录按钮 ---------------- */
.login-form[data-v-1dd7ab39] .login-button {
  display: block;
  width: 100%;
  height: calc(62 * var(--uc));
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: calc(12 * var(--uc));
  background: var(--lk-blue);
  color: #FFFFFF;
  font-size: calc(18 * var(--uc));
  font-weight: 500;
  letter-spacing: calc(1 * var(--uc));
  box-shadow: 0 calc(6 * var(--uc)) calc(16 * var(--uc)) rgba(0, 88, 244, .28);
  transition: background-color .16s ease, box-shadow .16s ease;
}

.login-form[data-v-1dd7ab39] .login-button:hover,
.login-form[data-v-1dd7ab39] .login-button:focus {
  background: #0056E0;
  color: #FFFFFF;
  box-shadow: 0 calc(8 * var(--uc)) calc(20 * var(--uc)) rgba(0, 88, 244, .34);
}

.login-form[data-v-1dd7ab39] .login-button:active {
  background: #004BC4;
}

.login-form[data-v-1dd7ab39] .login-button + .login-button {
  margin-top: calc(12 * var(--uc));
  height: calc(48 * var(--uc));
  background: #FFFFFF;
  color: var(--lk-blue);
  box-shadow: 0 0 0 calc(1 * var(--uc)) var(--lk-line) inset;
  font-size: calc(18 * var(--uc));
}

/* ---------------- 第三方登录（未配置时不渲染） ----------------
   ⚠️ 这两个块（.divider / .oidc-options）在上游模板里是 .login-card 的直接子元素，
      而卡片里其它所有元素都是绝对定位 —— 一旦不给它们定位，它们就会按普通文档流
      贴在卡片顶部左上角，正好压在 logo 和标题上（2026-10-31 线上就是这样错位的）。
      所以这里必须显式 re-position 到登录按钮下方。 */
.login-card[data-v-1dd7ab39] .divider {
  position: absolute;
  left: calc(47 * var(--uc));
  top: calc(634 * var(--uc));
  width: calc(445 * var(--uc));
  height: calc(18 * var(--uc));
  margin: 0;
  display: flex;
  align-items: center;
  font-size: calc(18 * var(--uc));
  line-height: calc(18 * var(--uc));
  color: #5B6472;
  white-space: nowrap;
}

.login-card[data-v-1dd7ab39] .divider::before,
.login-card[data-v-1dd7ab39] .divider::after {
  content: "";
  flex: 1;
  height: 1px;
  background: #E5E7EB;
}

.login-card[data-v-1dd7ab39] .divider::before { margin-right: calc(10 * var(--uc)); }
.login-card[data-v-1dd7ab39] .divider::after  { margin-left: calc(10 * var(--uc)); }

.login-card[data-v-1dd7ab39] .oidc-options {
  position: absolute;
  left: calc(47 * var(--uc));
  top: calc(672 * var(--uc));
  width: calc(445 * var(--uc));
  display: flex;
  flex-direction: column;
  gap: calc(8 * var(--uc));
}

.login-card[data-v-1dd7ab39] .oidc-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: calc(10 * var(--uc));
  width: 100%;
  height: calc(46 * var(--uc));
  padding: 0;
  border: 1px solid #E1E4EA;
  border-radius: calc(10 * var(--uc));
  background: #FFFFFF;
  color: var(--lk-ink2);
  font-size: calc(18 * var(--uc));
  line-height: 1;
  cursor: pointer;
  transition: background-color .15s ease, border-color .15s ease, box-shadow .15s ease;
}

.login-card[data-v-1dd7ab39] .oidc-btn:hover,
.login-card[data-v-1dd7ab39] .oidc-btn:focus-visible {
  background: #F7F9FC;
  border-color: #C9D2E0;
  box-shadow: 0 calc(2 * var(--uc)) calc(8 * var(--uc)) rgba(17, 24, 39, .06);
}

/* el-button 会把子节点包进一个内层 <span> —— 图标与文字是它的子元素，
   所以 gap 必须写在内层 span 上，写在外层 .oidc-btn 上不生效（图标会紧贴文字）。 */
.login-card[data-v-1dd7ab39] .oidc-btn > span {
  display: inline-flex;
  align-items: center;
  gap: calc(10 * var(--uc));
}

.login-card[data-v-1dd7ab39] .oidc-icon {
  flex: none;
  width: calc(20 * var(--uc));
  height: calc(20 * var(--uc));
  margin: 0;
  object-fit: contain;
}

/* ---------------- 有验证码时的兜底压缩，避免溢出卡片 ---------------- */
.login-form:has(.captcha-input) > .el-form-item:nth-child(1),
.login-form:has(.captcha-input) > .el-form-item:nth-child(2) {
  margin-bottom: calc(14 * var(--uc));
}

.login-form:has(.captcha-input) > .el-form-item:nth-child(3) {
  margin-bottom: calc(16 * var(--uc));
}

/* 验证码是后端按失败次数动态给出的（同一个人连续输错几次就会出现），
   卡片高度却是按「两行输入」定的 ⇒ 多出来的第三行会把登录按钮顶到
   divider 上（实测按钮 583–628 压在分隔线 584–597 上）。
   上面那三条压缩只省回 26px，还差 60px，所以这里让卡片长高同样多：
     +82 设计像素 = 60px（--ks=0.82、1711 视口下的实测增量）
     divider 634→716、oidc 672→754 同步下移，底部留白仍是 30
     半高锚点 374 → 415 = (748+82)/2，只动 height 不同步锚点会整体上移 41 */
.login-card[data-v-1dd7ab39]:has(.captcha-input) {
  height: calc(830 * var(--uc));
  top: calc(var(--cy) - 415 * var(--uc));
}

.login-card[data-v-1dd7ab39]:has(.captcha-input) .divider {
  top: calc(716 * var(--uc));
}

.login-card[data-v-1dd7ab39]:has(.captcha-input) .oidc-options {
  top: calc(754 * var(--uc));
}


/* ---------------- 窄屏兜底 ----------------
   设计稿是 16:9 桌面稿，纯等比缩放到手机竖屏会让卡片只剩 120px 宽、字号 4px。
   720px 以下改用按宽度的固定比例，隐藏背景插画，保证能用；
   桌面端（≥721px）完全不受影响。 */
@media (max-width: 720px) {
  .login-container[data-v-1dd7ab39] {
    --u: calc(100vw / 560);
    background: #EAF1FE;
  }
  .login-container[data-v-1dd7ab39]::before {
    display: none;
  }
  .login-container[data-v-1dd7ab39]::after {
    left: 0;
    right: 0;
    white-space: normal;
    font-size: calc(18 * var(--uc));
    line-height: calc(24 * var(--uc));
    padding: 0 calc(24 * var(--uc));
    box-sizing: border-box;
  }
}

/* ---------------- 多语言切换（登录页右上角地球按钮） ----------------
   结构与行为见 admin-assets/login-i18n.js；这里只管样子。
   它挂在 body 上（fixed），不在 .login-container 里，所以拿不到 --u，
   自带一套设计像素 --lu；**不乘 --ks** —— 它是页面级控件而不是卡片内容，
   跟着卡片一起缩会在 1440 下小到看不清。 */
.md-lang {
  --lu: calc(min(100vw, 186.1806vh) / 1711);
  position: fixed;
  top: calc(28 * var(--lu));
  right: calc(40 * var(--lu));
  z-index: 30;
  display: none;
  font-family: inherit;
  font-size: calc(16 * var(--lu));
  line-height: 1;
  color: #1F2937;
  -webkit-font-smoothing: antialiased;
}
.md-lang--on { display: block; }

.md-lang-btn {
  display: flex;
  align-items: center;
  gap: calc(8 * var(--lu));
  min-width: calc(150 * var(--lu));
  height: calc(44 * var(--lu));
  padding: 0 calc(14 * var(--lu));
  box-sizing: border-box;
  border: 1px solid #E4E9F2;
  border-radius: calc(22 * var(--lu));
  background: #FFFFFF;
  box-shadow: 0 calc(2 * var(--lu)) calc(10 * var(--lu)) rgba(28, 42, 74, 0.06);
  color: inherit;
  font: inherit;
  cursor: pointer;
  transition: border-color 0.18s ease, box-shadow 0.18s ease;
}
.md-lang-btn:hover {
  border-color: #CBD5E5;
  box-shadow: 0 calc(4 * var(--lu)) calc(16 * var(--lu)) rgba(28, 42, 74, 0.10);
}
.md-lang-btn:focus-visible {
  outline: 2px solid #2F6BFF;
  outline-offset: 2px;
}

.md-lang-globe,
.md-lang-chev {
  display: flex;
  align-items: center;
  justify-content: center;
  flex: none;
}
.md-lang-globe { color: #2F6BFF; }
.md-lang-globe svg {
  width: calc(20 * var(--lu));
  height: calc(20 * var(--lu));
}
.md-lang-chev { color: #8A93A3; }
.md-lang-chev svg {
  width: calc(16 * var(--lu));
  height: calc(16 * var(--lu));
  transition: transform 0.2s ease;
}
.md-lang--open .md-lang-chev svg { transform: rotate(180deg); }

.md-lang-cur {
  flex: 1;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.md-lang-menu {
  position: absolute;
  left: 0;
  right: 0;
  top: calc(100% + calc(8 * var(--lu)));
  margin: 0;
  padding: calc(6 * var(--lu)) 0;
  list-style: none;
  border: 1px solid #EDF1F7;
  border-radius: calc(12 * var(--lu));
  background: #FFFFFF;
  box-shadow: 0 calc(10 * var(--lu)) calc(30 * var(--lu)) rgba(28, 42, 74, 0.14);
  opacity: 0;
  visibility: hidden;
  transform: translateY(calc(-4 * var(--lu)));
  transition: opacity 0.16s ease, transform 0.16s ease, visibility 0.16s;
}
.md-lang--open .md-lang-menu {
  opacity: 1;
  visibility: visible;
  transform: none;
}

.md-lang-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: calc(10 * var(--lu));
  height: calc(42 * var(--lu));
  padding: 0 calc(14 * var(--lu));
  cursor: pointer;
  white-space: nowrap;
}
.md-lang-item:hover { background: #F4F7FC; }
.md-lang-name { flex: 1; }
.md-lang-check {
  display: none;
  align-items: center;
  color: #2F6BFF;
}
.md-lang-check svg {
  width: calc(16 * var(--lu));
  height: calc(16 * var(--lu));
}
.md-lang-item[aria-selected="true"] .md-lang-check { display: flex; }

@media (max-width: 720px) {
  .md-lang {
    --lu: calc(100vw / 414);
    top: calc(16 * var(--lu));
    right: calc(16 * var(--lu));
    font-size: calc(15 * var(--lu));
  }
  .md-lang-btn {
    min-width: 0;
    height: calc(40 * var(--lu));
    border-radius: calc(20 * var(--lu));
  }
  .md-lang-item { height: calc(40 * var(--lu)); }
}

/* ---------------- 随语言变化的伪元素文案 ----------------
   标题「MimirDesk」不翻译；副标题与页脚版权是 CSS content，只能按语言列规则。
   简体中文规则就是上面的默认值，因此这里不重复写 zh-CN。
   特异性 (0,3,2) > 默认规则 (0,2,1)，不用 !important。 */
html[data-md-lang="en"] .login-card[data-v-1dd7ab39]::after { content: "Welcome to the admin console"; }
html[data-md-lang="fr"] .login-card[data-v-1dd7ab39]::after { content: "Bienvenue dans la console d'administration"; }
html[data-md-lang="ko"] .login-card[data-v-1dd7ab39]::after { content: "관리 콘솔에 오신 것을 환영합니다"; }
html[data-md-lang="ru"] .login-card[data-v-1dd7ab39]::after { content: "Добро пожаловать в консоль администратора"; }
html[data-md-lang="es"] .login-card[data-v-1dd7ab39]::after { content: "Bienvenido a la consola de administración"; }
html[data-md-lang="zh-TW"] .login-card[data-v-1dd7ab39]::after { content: "歡迎登入管理平台"; }

html[data-md-lang="en"] .login-container[data-v-1dd7ab39]::after { content: "© 2026 MM-AIGC. Includes open source software under MIT, AGPL-3.0 and BSD licenses."; }
html[data-md-lang="fr"] .login-container[data-v-1dd7ab39]::after { content: "© 2026 MM-AIGC. Inclut des logiciels open source sous licences MIT, AGPL-3.0 et BSD."; }
html[data-md-lang="ko"] .login-container[data-v-1dd7ab39]::after { content: "© 2026 MM-AIGC. MIT, AGPL-3.0 및 BSD 라이선스 오픈 소스 소프트웨어를 포함합니다."; }
html[data-md-lang="ru"] .login-container[data-v-1dd7ab39]::after { content: "© 2026 MM-AIGC. Содержит открытое ПО под лицензиями MIT, AGPL-3.0 и BSD."; }
html[data-md-lang="es"] .login-container[data-v-1dd7ab39]::after { content: "© 2026 MM-AIGC. Incluye software de código abierto bajo licencias MIT, AGPL-3.0 y BSD."; }
html[data-md-lang="zh-TW"] .login-container[data-v-1dd7ab39]::after { content: "© 2026 MM-AIGC。本產品包含遵循 MIT、AGPL-3.0 及 BSD 授權的開源軟體。"; }
