/* ==========================================================================
   购物车 · 视觉层 skin.css
   纯样式覆盖，不改任何模板结构。
   生效方式：cart 的四个页面模板（goodsList / goods / shoppingCar / settlement）
             在各自原有 link 之后追加一行引用本文件。
   回滚方式：删掉那三行 <link> 即可，其余文件零改动。
   ========================================================================== */

:root {
  --zk-navy: #4073FF;
  --zk-navy-soft: #628CFF;
  /* 品牌色的 RGB 三通道，供 rgba() 使用。换品牌色时主题控制台只改这一个，
     下面所有半透明品牌色（阴影 / 边框 / 底纹）会一起跟着变。 */
  --zk-navy-rgb: 64, 115, 255;
  --zk-ink: #101828;
  --zk-sub: #475467;
  --zk-muted: #8A94A6;
  --zk-line: #E7EBF2;
  --zk-line-soft: #EFF2F7;
  --zk-red: #D92D20;
  /* 直角风格（2026-10-04 用户要求「全改直角」）：圆角刻度整体归零。
     ⚠️ 购物车页只加载本文件，不加载会员中心的 skin.css，所以这套刻度必须
     在这里自己定义一份，不能指望继承。
     回滚：把 --zk-radius 改回 var(--zk-r-lg, 14px)，并删掉文件末尾「全局直角」一节。 */
  --zk-r-xs: 0;
  --zk-r-sm: 0;
  --zk-r-md: 0;
  --zk-r-lg: 0;
  --zk-r-xl: 0;
  --zk-radius: 0;
  /* 全场圆角总闸：文件末尾第 11 节用它一次性控制所有元素的圆角。
     0 = 直角（当前风格）；「运营后台 → 主题」想换成圆角时只改这一个变量。 */
  --zk-r-all: 0;
  /* 主卡四周外边距。.template 上另有一份（见第六节），这里只是兜底，
     供 .zk-goods（商品配置页）等不在 .template 内的节点取用。
     ⚠️ 2026-10-04 起归零：白卡（.el-main 那块白色面板）改为铺满屏幕，
     不再留四周灰边；底栏与配置页底栏本来就要跟白卡同宽，所以一并归零。 */
  --zk-shell-m: 0;
}
@media (max-width: 1366px) {
  :root { --zk-shell-m: 0; }   /* 已铺满，窄屏同样是 0 */
}

/* ==========================================================================
   一、商品选购页 —— 卡片式重构
   ========================================================================== */

.goods-list-div {
  display: grid !important;
  /* 每行几个由后台「购物车」设置页决定（--zk-cols，默认 3）；窄屏仍按下面的媒体查询降列 */
  grid-template-columns: repeat(var(--zk-cols, 3), 1fr) !important;
  column-gap: 20px !important;
  row-gap: 20px !important;
  align-items: stretch !important;
}
@media (max-width: 1180px) {
  .goods-list-div { grid-template-columns: repeat(2, 1fr) !important; }
}
@media (max-width: 760px) {
  .goods-list-div { grid-template-columns: 1fr !important; }
}

/* ---------- 卡片本体 ---------- */
.shopping-item {
  display: flex !important;
  flex-direction: column !important;
  justify-content: flex-start !important;
  gap: 14px !important;
  min-height: 0 !important;
  padding: 20px 20px 18px !important;
  background: #fff !important;
  /* 页面底色改成纯白后，原来的浅灰边框在白底上几乎看不见 ⇒ 换成淡品牌蓝的边，
     卡片在白底上仍然立得住（跟随后台主色，不写死颜色）。 */
  border: 1px solid rgba(var(--zk-navy-rgb), .18) !important;
  border-radius: var(--zk-radius) !important;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .04) !important;
  transition: transform .22s ease, box-shadow .22s ease, border-color .22s ease;
}
.shopping-item:hover {
  transform: translateY(-4px);
  border-color: rgba(var(--zk-navy-rgb), .30) !important;
  box-shadow: 0 16px 32px rgba(var(--zk-navy-rgb), .13) !important;
}

/* 打散内容容器：让「标题 → 规格 → 标签 → 活动 → 价格」按视觉顺序排列 */
.shopping-item .goods-content { display: contents !important; }
.shopping-item .goods-name        { order: 1; }
.shopping-item .goods-description { order: 2; }
.shopping-item .goods-tag         { order: 3; }
.shopping-item .goods-active      { order: 4; }
.shopping-item .price-box         { order: 5; }

/* 推荐角标 */
.shopping-item .client-box {
  top: 0;
  right: 0;
  padding: 3px 10px;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: .3px;
  border-radius: 0;
}

/* ---------- 商品名 ---------- */
.shopping-item .goods-name {
  margin: 0 !important;
  padding: 0 !important;
  display: flex !important;
  align-items: flex-start !important;
  justify-content: space-between !important;
  gap: 10px;
}
.shopping-item .goods-name .goods-name-text {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: 16px !important;
  font-weight: 600 !important;
  line-height: 1.45 !important;
  color: var(--zk-ink) !important;
  white-space: normal !important;
  text-overflow: clip !important;
}
.shopping-item .goods-name .qty-box {
  flex-shrink: 0;
  font-size: 12px;
  color: var(--zk-muted);
  padding-top: 3px;
}
.shopping-item .goods-name.sold-out .goods-name-text { color: #B4BAC6 !important; }

/* ---------- 规格描述：两栏（标签 / 值） ---------- */
.shopping-item .goods-description {
  flex: none !important;
  min-height: 0 !important;
  max-height: none !important;
  padding: 0 !important;
  margin: 0 !important;
  background: transparent !important;
  overflow: visible !important;
  font-size: 13px !important;
  line-height: 1.6 !important;
  color: var(--zk-ink);
  white-space: normal !important;
}
/* 没有描述内容时不占位 */
.shopping-item .goods-description:empty { display: none !important; }

.shopping-item .goods-description > p,
.shopping-item .goods-description > div,
.shopping-item .goods-description li,
.shopping-item .goods-description table tr {
  display: flex !important;
  justify-content: space-between !important;
  align-items: baseline !important;
  gap: 14px;
  margin: 0 !important;
  padding: 7px 0 !important;
  border-bottom: 1px dashed var(--zk-line-soft);
  font-size: 13px !important;
  line-height: 1.6 !important;
  color: var(--zk-ink);
}
.shopping-item .goods-description > p:last-child,
.shopping-item .goods-description > div:last-child,
.shopping-item .goods-description li:last-child { border-bottom: 0 !important; }

/* 行内第一个元素（通常是标签）弱化为灰色 */
.shopping-item .goods-description > p > :first-child,
.shopping-item .goods-description li > :first-child { color: var(--zk-muted); }

.shopping-item .goods-description img { max-width: 100%; height: auto; }
.shopping-item .goods-description ::-webkit-scrollbar { width: 0; }

/* ---------- 标签 / 活动 ---------- */
.shopping-item .goods-tag {
  height: auto !important;
  padding: 0 !important;
  margin: 0 !important;
  background: transparent !important;
  gap: 6px !important;
  row-gap: 6px !important;
}
.shopping-item .goods-tag .tag-item {
  padding: 2px 8px !important;
  font-size: 12px !important;
  line-height: 18px;
  border-radius: 0;
  color: var(--zk-navy) !important;
  background: rgba(var(--zk-navy-rgb), .08);
}
.shopping-item .goods-tag .tag-item::after { display: none !important; }

.shopping-item .goods-active {
  margin: 0 !important;
  padding: 0 !important;
  gap: 6px !important;
}
.shopping-item .goods-active .active-name {
  padding: 2px 8px !important;
  font-size: 12px !important;
  line-height: 18px;
  border-radius: 0;
  color: var(--zk-red) !important;
  background: rgba(217, 45, 32, .08) !important;
}

/* ---------- 价格 + 购买按钮 ---------- */
.shopping-item .price-box {
  margin-top: auto !important;
  padding: 0 !important;
  display: flex !important;
  flex-direction: column !important;
  align-items: stretch !important;
  gap: 12px !important;
  border-top: 1px solid var(--zk-line-soft);
  padding-top: 14px !important;
}
.shopping-item .price-box .price-box-left {
  display: flex !important;
  align-items: baseline !important;
  gap: 6px;
  text-align: left !important;
}
.shopping-item .price-box .item-price {
  font-size: 30px !important;
  font-weight: 700 !important;
  line-height: 1.1 !important;
  letter-spacing: -.5px;
}
.shopping-item .price-box .item-price .item-price-prefix { font-size: 14px !important; font-weight: 600; }
.shopping-item .price-box .item-price .item-price-cycle { font-size: 13px !important; color: var(--zk-muted) !important; }
.shopping-item .price-box .original-price { font-size: 12px !important; color: var(--zk-muted) !important; }

.shopping-item .price-box .buy-btn {
  width: 100% !important;
  height: 42px !important;
  margin: 0 !important;
  border: none !important;
  border-radius: 0 !important;
  font-size: 15px !important;
  font-weight: 600 !important;
  letter-spacing: .3px;
  background: linear-gradient(135deg, var(--zk-navy-soft), var(--zk-navy)) !important;
  color: #fff !important;
  box-shadow: 0 6px 14px rgba(var(--zk-navy-rgb), .22);
  transition: box-shadow .2s, transform .2s;
}
.shopping-item .price-box .buy-btn:hover:not([disabled]) {
  background: linear-gradient(135deg, #6A92FF, #25449B) !important;
  box-shadow: 0 10px 20px rgba(var(--zk-navy-rgb), .30);
  transform: translateY(-1px);
}
.shopping-item .price-box .buy-btn[disabled],
.shopping-item .price-box .buy-btn.is-disabled {
  background: #F2F4F7 !important;
  color: #98A2B3 !important;
  border: 1px solid #EAECF0 !important;
  box-shadow: none !important;
}

/* ---------- 顶部搜索 / 筛选区 ---------- */
.search-box .el-select .el-input__inner,
.search-box .search-input .el-input__inner {
  border-radius: 0 !important;
  border-color: var(--zk-line) !important;
}
.search-box .search-input .el-input__inner:focus,
.search-box .el-select .el-input__inner:focus {
  border-color: var(--zk-navy-soft) !important;
  box-shadow: 0 0 0 3px rgba(98, 140, 255, .12) !important;
}
.search-btn {
  border-radius: 0 !important;
  background: linear-gradient(135deg, var(--zk-navy-soft), var(--zk-navy)) !important;
  color: #fff !important;
  font-weight: 500;
  box-shadow: 0 4px 10px rgba(var(--zk-navy-rgb), .20);
}
.search-btn:hover { background: linear-gradient(135deg, #6A92FF, #25449B) !important; }

/* 空态 */
.no-goods { padding: 40px 0; }

/* ---------- 分组信息提示条：由警示红改为信息蓝 ---------- */
.second-desc {
  height: auto !important;
  min-height: 40px;
  display: flex;
  align-items: center;
  padding: 9px 14px;
  margin-top: 18px !important;
  font-size: 13px !important;
  line-height: 1.5;
  color: var(--zk-navy) !important;
  background: #EDF3FF !important;
  border: 1px solid #DCE6FF;
  border-radius: 0 !important;
}

/* ==========================================================================
   二、购物车页
   ========================================================================== */

/* 商品分组表 */
.shopping-car-box .el-table,
.shopping-box .el-table { border-radius: 0; overflow: hidden; }

/* 底部结算条 */
.el-footer .footer-box,
.el-footer .footer-content {
  border-top: 1px solid var(--zk-line);
}

/* ==========================================================================
   三、结算页
   ========================================================================== */
.settlement-box .el-card,
.config-box {
  border-radius: 0;
  border-color: var(--zk-line);
}

/* ==========================================================================
   四、商品选购页 —— 左侧分类导航
   数据模型：一级分组 = 可展开的分组标题，二级分组 = 叶子项（同一时间只展开一个）
   量纲：本区块紧邻 .shopping-item 商品卡，而商品卡区域用的是**固定 px**
        （见 goodsList.css 的 .shopping-item 段，14/16/24px，不随视口缩放），
        所以这里也统一用 px，才能和卡片字号、间距保持同一视觉尺度。
   ========================================================================== */
.main-content-box.has-cat {
  display: flex !important;
  align-items: flex-start;
  gap: 20px;
}
.zk-main {
  flex: 1 1 auto;
  min-width: 0;
}

/* ---------- 分类面板 ---------- */
/* 与右侧内容 **分开滚动**：面板贴住顶栏不再随页面走，只有右侧内容滚动；
   分组多到装不下时，面板内部自己滚（搜索框常驻，列表滚）。
   · 贴住位置 = 顶栏高度 40px + 主区上边距 0.28rem + 内边距 0.32rem（= 0.6rem），
     三者都来自 clientarea/common/{common,skin}.css：顶栏 fixed 40px，
     主区 margin-top: calc(40px + 0.28rem)、padding: 0.32rem。
   · 底部预留 --zk-cat-bottom：配置页底部有 fixed 操作条，见第六节。
   · position:sticky 要求祖先链上没有 overflow≠visible 的滚动容器，
     element-ui 给 .el-main 默认 overflow:auto，必须放开 —— 见本节末尾。 */
.zk-cat {
  flex: 0 0 220px;
  width: 220px;
  box-sizing: border-box;
  background: #fff;
  border: 1px solid var(--zk-line);
  border-radius: 0;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .04);
  overflow: hidden;
  position: sticky;
  top: var(--zk-cat-top, calc(40px + 0.6rem));
  max-height: calc(100vh - var(--zk-cat-top, calc(40px + 0.6rem)) - var(--zk-cat-bottom, 24px));
  display: flex;
  flex-direction: column;
}

/* 选购页的分类栏上方还有一行页面标题（.main-title / .cart-des），
   所以它贴住的位置要比配置页再往下 32px —— 这样贴住时位置和原位一致，不会先跳一下。 */
.template {
  --zk-cat-top: calc(40px + 0.6rem + 32px);
  --zk-cat-bottom: 24px;
}

/* 解开主区 .el-main 的 overflow:auto —— 它不实际滚动，却会截断 sticky 的参照系。
   （.template = 选购/购物车/结算；.zk-goods = 商品配置页，两者根容器不同）
   只点页面级的那个 .el-main，别误伤底部操作条里的 .f-order .el-main。 */
.template > .el-container > .el-container > .el-main,
.zk-goods > .el-container > .el-container > .el-main {
  overflow: visible !important;
}

/* 面板内搜索：单行输入框，放大镜嵌在输入框内右侧（对齐参考站） */
.zk-cat-search {
  position: relative;
  display: block;
  flex: 0 0 auto;
  padding: 12px;
  border-bottom: 1px solid var(--zk-line-soft);
  background: #fff;
}
.zk-cat-search .zk-cat-input { width: 100%; }
.zk-cat-search .el-input__inner {
  height: 38px !important;
  line-height: 38px !important;
  padding: 0 42px 0 12px !important;
  border-radius: 0 !important;
  font-size: 14px !important;
  color: #1F2D3D !important;
  border-color: #DCE1E9 !important;
  background: #FBFCFE !important;
}
.zk-cat-search .el-input__inner::placeholder { color: #A6B0BF !important; }
.zk-cat-search .el-input__inner:focus {
  border-color: var(--zk-navy) !important;
  background: #fff !important;
  box-shadow: 0 0 0 2px rgba(var(--zk-navy-rgb), .10) !important;
}
/* clearable 的清除按钮往左让位，避免压住搜索图标 */
.zk-cat-search .el-input__suffix { right: 36px !important; line-height: 38px !important; }
.zk-cat-search-btn {
  position: absolute !important;
  right: 19px !important;
  top: 50% !important;
  transform: translateY(-50%) !important;
  width: 30px !important;
  height: 30px !important;
  min-width: 0 !important;
  margin: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: transparent !important;
  color: #475569 !important;   /* 原 #94A3B8 对白底 2.4:1，放大镜几乎看不见 */
  font-size: 16px !important;  /* 17px 不在字号阶梯里（桌面 12~16 / 手机 11~16） */
  box-shadow: none !important;
  transition: color .16s ease, background .16s ease;
}
.zk-cat-search-btn:hover {
  color: var(--zk-navy) !important;
  background: rgba(var(--zk-navy-rgb), .07) !important;
}
.zk-cat-search-btn [class^="el-icon-"] { margin: 0; font-size: 16px; }

/* 分组列表（面板高度不够时，滚动发生在这里，搜索框不动） */
.zk-cat-list {
  list-style: none;
  margin: 0;
  padding: 8px 0 10px;
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  scrollbar-width: thin;
}
.zk-cat-list::-webkit-scrollbar { width: 6px; }
.zk-cat-list::-webkit-scrollbar-thumb {
  background: #D5DDE7;
  border-radius: 999px;
}
.zk-cat-list::-webkit-scrollbar-thumb:hover { background: #BFCAD8; }
/* 分组标题：不做底色块，跟参考站一样是一行朴素文字 + 右侧三角 */
.zk-cat-group + .zk-cat-group {
  border-top: 1px solid var(--zk-line-soft);
}
/* 左栏只保留一条「内容左线」= 12px（= .zk-cat-search 的内边距）：
   标题蓝竖条 / 搜索框 / 分类名都从这条线开始，不再三种缩进。
   —— 分组标题原本 16px，与搜索框差 4px，用户反馈「对不齐」。 */
.zk-cat-group-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 13px 12px;
  cursor: pointer;
  font-size: 14px;
  font-weight: 500;
  color: #1F2D3D;
  transition: background .16s ease, color .16s ease;
}
.zk-cat-group-head:hover {
  background: #F7F9FC;
  color: var(--zk-navy);
}
.zk-cat-group.is-active > .zk-cat-group-head {
  color: var(--zk-navy);
  font-weight: 600;
  background: transparent;
}
.zk-cat-group-arrow {
  font-size: 14px;
  color: #C0C9D6;
  transition: transform .2s ease, color .2s ease;
}
.zk-cat-group.is-active .zk-cat-group-arrow {
  transform: rotate(180deg);
  color: #2E6BE6;
}

/* 二级叶子项：整行通栏（左侧品牌色竖条贴面板左边），跟参考站一致。
   字号与一级分组标题「一致」（都 14px），层级靠缩进和左侧小圆点区分。 */
.zk-cat-sub {
  list-style: none;
  margin: 0;
  padding: 0;
}
.zk-cat-subitem {
  position: relative;
  padding: 11px 14px 11px 28px;
  font-size: 14px;
  line-height: 20px;
  color: #3A4657;
  cursor: pointer;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  transition: background .16s ease, color .16s ease, box-shadow .16s ease;
}
.zk-cat-subitem::before {
  content: "";
  position: absolute;
  left: 12px;
  top: 50%;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: #C6D1E0;
  transform: translateY(-50%);
  transition: background .16s ease;
}
.zk-cat-subitem:hover {
  background: #F4F7FC;
  color: var(--zk-navy);
}
.zk-cat-subitem:hover::before { background: var(--zk-navy); }
.zk-cat-subitem.is-active {
  background: rgba(var(--zk-navy-rgb), .07);
  color: var(--zk-navy);
  font-weight: 600;
  box-shadow: inset 3px 0 0 0 var(--zk-navy);
}
.zk-cat-subitem.is-active::before { background: var(--zk-navy); }
.zk-cat-sub-loading,
.zk-cat-sub-empty {
  padding: 11px 14px 11px 28px;
  font-size: 13px;
  color: var(--zk-muted);
}

/* ---------- 当前位置面包屑 ---------- */
.zk-crumb {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 14px;
  font-size: 14px;
  color: var(--zk-muted);
}
.zk-crumb .el-icon-arrow-right {
  font-size: 12px;
  color: #C6D1E0;
}
.zk-crumb .is-current {
  color: var(--zk-navy);
  font-weight: 600;
}

/* ---------- 桌面端：分类栏贴住白卡左边缘（应用壳布局） ----------
   目标：分类栏左边缘贴齐白卡内缘、上下贯通到卡片底部，且与右侧内容各自滚动。
   做法：把白卡本身变成「固定高度的弹性列」，两栏各占一列、各自 overflow:auto ——
        不再依赖 position:sticky（sticky 容易被 .el-main 的 overflow 截断；而且面板
        一旦撑满整列高度，也没有可移动的余量了）。
   作用域：只作用于「有分类栏」的选购页。域名/SSL 模式（没有 .has-cat）与 ≤1024 窄屏
        折叠布局都不受影响。
   · --zk-shell-m = 白卡四周外边距，须与 clientarea/common/skin.css 保持一致
     （默认 0.28rem；≤1366 断点那边改成 0.2rem，这里同步）。
   · 用 :has() 精确限定「白卡里含分类栏」，避免影响购物车页 / 结算页。 */
/* ---------- 白卡铺满屏幕（去掉四周那圈灰边） ----------
   用户反馈「商品卡外面那个框没有铺满、四周有空隙看着不舒服」。
   白卡 = .el-main（那块白色圆角面板），官方给它写了 0.28rem 的外边距
   （1920 下 28px、1440 下 21px、手机 0.28×52≈15px），所以四周会露出一圈底色。
   · 上方留 40px = 顶栏高度，让白卡顶到顶栏下沿；左右下三面直接贴屏幕边。
   · 圆角必须一起去掉，否则四个角会露出底色小三角。
   · --zk-shell-m 已归零（见文件头），底栏 / 配置页底栏因此同步铺满。
   · 直接子代链是为了不误伤底部操作条里的 .el-main（.f-order .el-main）。
   回滚：删掉这条 + 把 --zk-shell-m 改回 0.28rem。
   ---------------------------------------------------------------------- */
.template > .el-container > .el-container > .el-main,
.zk-goods > .el-container > .el-container > .el-main {
  margin: 40px 0 0 !important;
  border-radius: 0 !important;
}

@media (min-width: 1025px) {
  .template { --zk-shell-m: 0; }

  /* 白卡：固定一屏高、自身不滚；
     左/右/下三面内边距去掉，让分类栏能贴到白卡内缘 —— 省下的内边距转给标题和右栏
     （不能用负边距撑破：goodsList.css 给 .main-content-box 设了 width:100%，
      负边距只会把整块左移、右边界反而缩进来） */
  .template .el-container:nth-child(2) > .el-main:has(.main-content-box.has-cat) {
    height: calc(100vh - 40px - var(--zk-shell-m) * 2) !important;
    display: flex !important;
    flex-direction: column;
    overflow: hidden !important;
    padding-left: 0 !important;
    padding-right: 0 !important;
    padding-bottom: 0 !important;
  }
  /* 必须带 :has 限定 —— 插件模板里 <div class="template"> 把整页都包住了，
     里面除了主内容区，还有底部固定操作条 .f-order（结构同样是 .el-main > .main-card）。
     不加限定的话这条会把底栏那个 main-card 也变成「竖排居中」，底栏里的
     订购时长/数量、当前配置、按钮就会被叠成三行、掉到屏幕外面去。 */
  .template .el-main:has(.main-content-box.has-cat) > .main-card {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    /* common.css 给 .main-card 设了 margin:auto。它一旦成为 flex item，
       width:auto 就退化成 fit-content，auto margin 再把整块居中收缩（实测缩到 782px）。 */
    margin: 0 !important;
  }
  /* 标题：用 margin 把左内边距顶回来 —— 用 margin 而不是 padding，
     是为了让标题左侧那根装饰竖条（::before）跟着文字一起右移，保持原样。
     ⚠️ 左值必须与左栏的「内容左线」一致（= .zk-cat-search 的 12px 内边距），
     并写成**固定 px**：原来写 0.32rem 会随视口放大（1440 → 24px、1920 → 32px），
     而左栏的 12px 是固定的 ⇒ 屏幕越宽、标题越往右跑，跟搜索框、分类名对不上。 */
  .template .el-main:has(.main-content-box.has-cat) > .main-card > .main-title,
  .template .el-main:has(.main-content-box.has-cat) > .main-card > .cart-des {
    margin-left: 12px !important;
    margin-right: 0.32rem !important;
  }

  /* 两栏区 */
  .template .main-content-box.has-cat {
    flex: 1 1 auto;
    min-height: 0;
    align-items: stretch;
    margin: 0 !important;
    padding-bottom: 0 !important;
  }

  /* 左栏：贴在白卡左内缘、贯通上下；只有分组列表内部滚动 */
  .template .main-content-box.has-cat > .zk-cat {
    position: static !important;
    top: auto !important;
    height: auto !important;
    max-height: none !important;
    border: 0 !important;
    border-right: 1px solid var(--zk-line) !important;
    border-radius: 0 !important;
    box-shadow: none !important;
  }

  /* 右栏：自己滚；右/下内边距顶回白卡原来的 0.32rem */
  .template .main-content-box.has-cat > .zk-main {
    overflow-y: auto;
    padding: 0 0.32rem 0.32rem 0;
  }
  .template .main-content-box.has-cat > .zk-main::-webkit-scrollbar { width: 6px; }
  .template .main-content-box.has-cat > .zk-main::-webkit-scrollbar-thumb {
    background: #D6DEE9;
    border-radius: 999px;
  }
  .template .main-content-box.has-cat > .zk-main::-webkit-scrollbar-thumb:hover { background: #BFCAD8; }
}

@media (max-width: 1366px) {
  .template { --zk-shell-m: 0; }   /* 已铺满，窄屏同样是 0 */
}

/* ---------- 窄屏：分类面板折到上方 ---------- */
@media (max-width: 1024px) {
  .main-content-box.has-cat { flex-direction: column !important; }
  /* 折到正文上方后不再需要贴住视口 */
  .zk-cat {
    flex: 1 1 auto !important;
    width: 100% !important;
    position: static;
    max-height: 340px;
    overflow-y: auto;
  }
  .zk-main { width: 100%; }
}

/* ==========================================================================
   五、沉浸式布局 —— 隐藏会员中心通用侧边栏
   --------------------------------------------------------------------------
   选购 / 购物车 / 结算三页自带左侧商品分类导航，与系统侧边栏叠成「双左栏」，
   故这三页隐藏系统侧边栏，只保留自有的分类导航。
   · 侧边栏里的 logo 与导航一并收起；系统导航改由顶栏汉堡按钮唤起的侧滑抽屉
     承载 —— 该按钮原本只在 ≤750px 出现，这里在宽屏补上，避免导航失去入口；
   · .el-header 原 width 为 calc(100% - 190px)（给侧边栏让位），改为通栏贴左。
   回滚：删掉本节即可。
   ========================================================================== */
.template > .el-container > .el-aside {
  display: none !important;
}

.template .el-header {
  width: 100% !important;
  left: 0 !important;
}

/* 顶栏左侧：汉堡按钮（宽屏显示 + 一点内边距，避免贴边） */
.template .el-header .header-left {
  padding-left: 0.16rem;
}
.template .el-header .header-left .menu-img {
  display: inline-block !important;
  height: 0.2rem !important;
  width: auto;
  cursor: pointer;
  opacity: 0.75;
  transition: opacity 0.15s;
}
.template .el-header .header-left .menu-img:hover {
  opacity: 1;
}

/* 侧滑抽屉：原样式只写在 ≤750px 断点内，宽屏打开会裸奔，这里补齐
   （抽屉挂在 body 上，不能加 .template 前缀；本文件只在 cart 三页加载，无外溢） */
.drawer-menu {
  background: linear-gradient(180deg, #2A4BA6 0%, var(--zk-navy) 46%, #12294D 100%) !important;
  font-size: 0.15rem;
  overflow-y: auto;
}
.drawer-menu .drawer-menu-top {
  height: 0.6rem;
  display: flex;
  align-items: center;
  justify-content: center;
}
.drawer-menu .drawer-menu-logo {
  height: 0.3rem;
  max-width: 2rem;
}
.drawer-menu .drawer-menu-list-top {
  margin-top: 0.24rem;
  padding: 0 0.18rem;
}
.drawer-menu .menu-top {
  margin-top: 0 !important;
}
.drawer-menu .el-menu-item,
.drawer-menu .el-submenu__title {
  color: rgba(255, 255, 255, 0.82) !important;
}
.drawer-menu .el-menu-item:hover,
.drawer-menu .el-submenu__title:hover {
  background: rgba(255, 255, 255, 0.1) !important;
}
.drawer-menu .el-menu-item.is-active {
  color: #fff !important;
  background: rgba(255, 255, 255, 0.16) !important;
  border-radius: 0;
}

@media (max-width: 750px) {
  .template .el-header .header-left .menu-img {
    height: 0.5rem !important;
  }
}

/* ==========================================================================
   六、商品配置页（/cart/goods.htm）—— 与选购页同一套骨架
   --------------------------------------------------------------------------
   · 该页根容器是 .goods（不是 .template），所以沉浸式那几条要单独写一份；
   · 左侧复用选购页的 .zk-cat 分类树（结构与第四节完全一致，样式自然继承）；
   · 配置表单由插件模板渲染（mf_dcim 等），插件 CSS 是随内容注入到 body 的、
     加载顺序晚于本文件，所以这里一律加 .zk-goods 前缀 + !important 提优先级，
     只做外观层微调，绝不动结构。
   · 对齐参考站的关键点：底部固定操作条原本用 190px 占位给系统侧边栏让位，
     侧栏隐藏后必须归零，并把左右内边距改成和主内容一致的 0.6rem（0.28rem 外边距
     + 0.32rem 内边距，见 clientarea/common/skin.css），否则底栏与正文左右错位。
   回滚：删掉本节 + goods.php 里的 skin.css <link> 即可。
   ========================================================================== */

/* ---------- 1. 沉浸式布局：隐藏系统侧边栏，顶栏通栏，汉堡进顶栏 ---------- */
.zk-goods > .el-container > .el-aside {
  display: none !important;
}
.zk-goods .el-header {
  width: 100% !important;
  left: 0 !important;
}
.zk-goods .el-header .header-left {
  padding-left: 0.16rem;
}
.zk-goods .el-header .header-left .menu-img {
  display: inline-block !important;
  height: 0.2rem !important;
  width: auto;
  cursor: pointer;
  opacity: 0.75;
  transition: opacity 0.15s;
}
.zk-goods .el-header .header-left .menu-img:hover {
  opacity: 1;
}
@media (max-width: 750px) {
  .zk-goods .el-header .header-left .menu-img {
    height: 0.5rem !important;
  }
}

/* ---------- 2. 两栏骨架 ---------- */
/* 给底部固定操作条（1.2rem）留出空间，避免分类树底部被压住 */
.zk-goods .main-content-box.has-cat {
  padding-bottom: 0.6rem;
}
/* 分类树贴住顶栏时，底部要让开 fixed 的操作条，否则树底会被压在条子下面 */
.zk-goods {
  --zk-cat-bottom: calc(1.2rem + 20px);
}
.zk-goods .zk-cat {
  align-self: flex-start;
}
/* goods.css 里 .config-box 是 height:100%，外层高度变成 auto 后要放开 */
.zk-goods .zk-main .config-box {
  height: auto;
}

/* ---------- 3. 「返回 当前分组」入口 ---------- */
.zk-crumb-back {
  margin-bottom: 12px;
}
.zk-back-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 14px 7px 11px;
  border: 1px solid var(--zk-line);
  border-radius: 0;
  background: #fff;
  color: #55637A;
  font-size: 14px;
  line-height: 1;
  cursor: pointer;
  transition: color 0.16s ease, border-color 0.16s ease, background 0.16s ease;
}
.zk-back-link i {
  font-size: 13px;
}
.zk-back-link em {
  font-style: normal;
  margin-left: 2px;
  color: var(--zk-navy);
  font-weight: 600;
}
.zk-back-link:hover {
  color: var(--zk-navy);
  border-color: rgba(var(--zk-navy-rgb), 0.35);
  background: rgba(var(--zk-navy-rgb), 0.04);
}

/* ---------- 4. 配置表单：外观层微调 ---------- */
/* 商品名标题 */
.zk-goods .content .template > .tit {
  font-size: 0.24rem !important;
  font-weight: 600 !important;
  color: var(--zk-navy) !important;
  line-height: 1.3 !important;
  margin: 0 0 0.2rem !important;
  padding-bottom: 0.14rem;
  border-bottom: 1px solid var(--zk-line-soft);
}
/* 分节标题 */
.zk-goods .mf-dcim .com-tit {
  font-weight: 600 !important;
  color: #1F2D3D !important;
}
/* 表单标签 */
.zk-goods .mf-dcim .el-form-item__label {
  color: #55637A !important;
  font-weight: 500 !important;
}

/* ---------- 5. 底部固定操作条 ---------- */
/* 与上方主卡同宽：官方 .f-order 是贴屏幕左右边的通栏，主卡却是左右各留
   --zk-shell-m 的浮卡 ⇒ 底栏比主卡宽一圈，边缘对不上。
   收紧到主卡的同一条边界上。（.el-main 那个 0.6rem 是「外边距+内边距」
   之和，现在外边距由这里出，内边距就该退回 0.32rem = 主卡内边距。） */
.zk-goods .f-order {
  left: 0;
  right: 0;
  width: auto !important;
  margin-left: var(--zk-shell-m, 0.28rem) !important;
  margin-right: var(--zk-shell-m, 0.28rem) !important;
}
.zk-goods .f-order .l-empty {
  width: 0 !important;
}
.zk-goods .f-order .el-main {
  padding-left: 0.32rem !important;
  padding-right: 0.32rem !important;
  box-shadow: 0 -1px 0 0 var(--zk-line), 0 -6px 18px rgba(16, 24, 40, 0.05) !important;
}
.zk-goods .f-order .right .buy {
  border: 0 !important;
  border-radius: 0 !important;
  font-weight: 600;
  letter-spacing: 0.5px;
  background: linear-gradient(135deg, var(--zk-navy-soft), var(--zk-navy)) !important;
  box-shadow: 0 6px 14px rgba(var(--zk-navy-rgb), .24);
  transition: box-shadow .2s ease, transform .2s ease;
}
.zk-goods .f-order .right .buy:hover:not([disabled]) {
  background: linear-gradient(135deg, #6A92FF, #25449B) !important;
  box-shadow: 0 10px 20px rgba(var(--zk-navy-rgb), .32);
  transform: translateY(-1px);
}
.zk-goods .f-order .right .add-cart {
  border-radius: 0 !important;
  border-color: rgba(var(--zk-navy-rgb), .35) !important;
  color: var(--zk-navy) !important;
  background: #fff !important;
  transition: background .16s ease, border-color .16s ease;
}
.zk-goods .f-order .right .add-cart:hover {
  border-color: var(--zk-navy) !important;
  background: rgba(var(--zk-navy-rgb), .06) !important;
}

/* ==========================================================================
   七、购物车 / 结算页底部「合计」对齐
   --------------------------------------------------------------------------
   两页底部结构相同（.footer-right 里放「合计：¥0.00」+ 按钮），但都对不齐：
   ① 两页共性问题：「合计」两个字是裸文本，跟着大号数字的基线往下沉，
      视觉上比 ¥0.00 矮半截；
   ② 结算页独有：.footer-right 没写 align-items（默认 stretch），价格组被拉满
      与按钮同高、文字贴在顶部 ⇒ 价格中线比按钮中线高约 3px。
      购物车页的 .footer-right 有 align-items:center，本来就不会错。
   改法：模板里给「合计」包一层 .zk-total-label、整行加 .zk-total-row，
        这里只补对齐规则（改的文件：shoppingCar.php / settlement.php + 本文件）。
   ========================================================================== */
.template .footer-right .zk-total-row {
  display: flex;
  align-items: center;   /* 让「合计」与数字垂直居中，而不是贴基线 */
  margin: 0;
}
.template .footer-right .zk-total-label {
  line-height: 1;        /* 去掉行距，盒子高度才等于字高，居中才准 */
}
/* 结算页：价格组压成与按钮等高（0.46rem = .buy-btn 高度）并内部居中，
   justify-content 是给 ≤750px 的 .footer-right{display:block} 兜右对齐的 */
.template .footer-right .totalprice-box {
  height: 0.46rem;
  display: flex;
  align-items: center;
  justify-content: flex-end;
}

/* ==========================================================================
   八、底部结算条 —— 与上方主卡同宽对齐
   --------------------------------------------------------------------------
   官方规则写的是：
     .el-footer { width: calc(100vw - 160px); padding-left: 2.1rem; ... }
   这两个值都是给左侧那条系统侧边栏（190px）占位的。侧边栏已被我们隐藏，
   底栏却仍按「有侧栏」在算 ⇒ 白条右侧凭空短一截（1440 短 118px、1080 短 130px），
   与上方主卡对不齐，里面的「合计 / 结算」也跟着整体左移。
   （.settlement-box / .goods-box 的 padding-bottom 才是真正的底部留白，不受影响。）

   改法：把底栏改成与主卡同一套几何 ——
     左右外边距 = --zk-shell-m（0.28rem；≤1366 为 0.2rem，与主卡 margin 同源）
     左右内边距 = 0.32rem（= 主卡 padding，1440 下 24px）
   ========================================================================== */
.template .el-footer {
  left: 0;
  right: 0;
  width: auto !important;
  margin-left: var(--zk-shell-m, 0.28rem) !important;
  margin-right: var(--zk-shell-m, 0.28rem) !important;
  padding-left: 0.32rem !important;
  padding-right: 0.32rem !important;
}

/* 官方给 .footer-box 设了 max-width:1500px + margin:0 auto —— 宽屏下会把
   本来已经对齐的内容二次内缩居中（1920 实测内容缩到 1430px）。放开它。 */
.template .el-footer .footer-box,
.template .el-footer .footer-content {
  width: 100% !important;
  max-width: none !important;
  margin: 0 !important;
}

/* ==========================================================================
   九、商品选购页 · 服务公告条（商品卡片下方）
   --------------------------------------------------------------------------
   数据源是系统自带的「购物车说明」：后台 `系统设置 → 主题设置 → 购物车说明`
   （配置项 cart_instruction / cart_instruction_content，前端走 commonData）。
   原来它渲染在页面顶部并**顶替**主标题；现改为渲染在商品网格下方，
   主标题恒常显示。模板改动只在 goodsList.php 的两处 `cart-des`。
   量纲同商品卡区域，用固定 px。
   配色：红色警示系（故意不用品牌蓝，跟常规内容区分开）；
   左侧只有一个 16×16 的「圆圈感叹号」图标（inline SVG），不放任何文字。
   ========================================================================== */
.zk-notice {
  position: relative;
  margin: 20px 0 4px;
  padding: 12px 16px 12px 42px;
  border-radius: 0;
  background: #FEF3F2;
  border: 1px solid #FECDCA;
  border-left: 4px solid #D92D20;
  color: #B42318;
  font-size: 14px;
  line-height: 1.75;
}
/* 左侧标记：只放一个「圆圈感叹号」图标，绝对定位贴在首行左侧，不带文字 */
.zk-notice::before {
  content: "";
  position: absolute;
  left: 18px;
  top: 16px;
  width: 16px;
  height: 16px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10' fill='%23D92D20'/%3E%3Cpath d='M12 6.4v7.2' stroke='%23FFFFFF' stroke-width='2.4' stroke-linecap='round'/%3E%3Ccircle cx='12' cy='17.6' r='1.4' fill='%23FFFFFF'/%3E%3C/svg%3E") center / contain no-repeat;
}
/* 后台填的是富文本，把默认段距收紧 */
.zk-notice p { margin: 0; }
.zk-notice p + p { margin-top: 6px; }
.zk-notice a { color: #B42318; text-decoration: underline; }

/* ==========================================================================
   十、手机端适配（≤750px，与官方断点一致）
   --------------------------------------------------------------------------
   背景：站点是「PC 模板 + JS 动态根字号」，设计稿基准 1rem = 100px（1920）。
        窄屏下根字号切成 屏幕宽 / 7.5 —— 手机 390px ⇒ 1rem = 52px，
        相当于所有按 rem 写的长度被放大了 2.56 倍。
        · 会员中心自己的 common.css 有 750 断点，把这套逻辑算对了；
        · 插件（mf_dcim / mf_cloud…）CSS **没有**移动端断点，仍按 100px 基准写
          rem ⇒ 底部操作条在手机上必然撑爆：实测 390px 视口里
          .f-order .right 右边界跑到 430px（超出屏幕 40px），价格/按钮被挤成竖排。
   做法：这一节把移动端「底层操作区」的量纲全部换成固定 px，并按
        「一行放不下就换行」重排。桌面端（>750px）完全不受影响。
   回滚：删掉本节即可。
   ========================================================================== */
@media (max-width: 750px) {

  /* ---------- 1. 商品配置页 · 底部操作条：改两行 ---------- */
  /* 官方 .f-order 是 height:1.2rem 的单行条（= 手机上仅 62px 高），
     装不下「时长 + 数量 + 当前配置 + 价格 + 两个按钮」⇒ 高度放开、允许换行。 */
  .zk-goods .f-order {
    height: auto !important;
    margin-left: 12px !important;
    margin-right: 12px !important;
    font-size: 13px !important;
  }
  /* element-ui 给 .el-main 默认 overflow:auto，换行后会把内容裁掉 */
  .zk-goods .f-order .el-main {
    padding: 0 !important;
    overflow: visible !important;
  }
  .zk-goods .f-order .main-card {
    flex-wrap: wrap;
    align-items: center;
    align-content: center;
    row-gap: 8px;
    height: auto !important;
    padding: 10px 0 16px;
  }

  /* 第一行：订购时长 + 订购数量，各占一半 */
  .zk-goods .f-order .main-card > .left {
    flex: 1 1 100%;
    justify-content: space-between;
    gap: 10px;
  }
  .zk-goods .f-order .main-card > .left > .time,
  .zk-goods .f-order .main-card > .left > .num {
    display: flex;
    align-items: center;
    min-width: 0;
  }
  .zk-goods .f-order .time { margin-right: 0 !important; }
  .zk-goods .f-order .l-txt {
    margin-right: 6px !important;
    white-space: nowrap;
  }
  .zk-goods .f-order .duration-select { width: 96px !important; }
  .zk-goods .f-order .el-input-number { width: 112px !important; }
  /* 插件给输入框写的是 0.3rem 级尺寸（手机上是 15px 高都不到），统一按 px 收紧 */
  .zk-goods .f-order .el-input__inner {
    height: 34px !important;
    line-height: 34px !important;
    font-size: 13px !important;
    padding: 0 8px !important;
  }
  .zk-goods .f-order .el-input-number__decrease,
  .zk-goods .f-order .el-input-number__increase {
    width: 28px !important;
    height: 34px !important;
    line-height: 34px !important;
    font-size: 12px !important;
  }

  /* 「当前配置 / 配置免费详情」是 hover 触发的气泡，触屏点不出来，
     留着只会把第二行挤爆 —— 手机上收起。
     注意：el-popover 的 reference 槽（模板里写的 <a class="link">）渲染出来是
     不带 class 的 <span>，所以按 .link 选不中，得按「除了价格块全不要」来选。 */
  .zk-goods .f-order .mid > *:not(.bot-price) { display: none !important; }

  /* 第二行：价格（左） + 购物车 & 立即购买（右） */
  .zk-goods .f-order .mid {
    flex: 1 1 auto;
    min-width: 0;
    align-items: center;
  }
  .zk-goods .f-order .bot-price { margin-left: 0 !important; font-size: 12px !important; }
  .zk-goods .f-order .bot-price .new { display: flex; align-items: baseline; }
  .zk-goods .f-order .bot-price .new span {
    font-size: 20px !important;
    line-height: 1.1 !important;
  }
  .zk-goods .f-order .bot-price .old { margin-top: 2px !important; }

  .zk-goods .f-order .right { flex: 0 0 auto; gap: 8px; }
  .zk-goods .f-order .right .add-cart {
    width: 40px !important;
    height: 34px !important;
    border-radius: 0 !important;
  }
  .zk-goods .f-order .right .buy {
    width: auto !important;
    min-width: 96px;
    padding: 0 16px;
    margin-left: 0 !important;
    line-height: 34px !important;
    font-size: 14px !important;
    border-radius: 0 !important;
  }

  /* 底栏变成两行后高了一倍，主内容区底部要让出空间，否则最后一项被挡在条子下面 */
  .zk-goods .main-content-box.has-cat { padding-bottom: 130px !important; }

  /* ---------- 2. 左侧分类栏 ----------
     手机上不再占首屏：改由「分类抽屉」承载（见第十九节），这里只补字号。
     字号与抽屉里的会员中心菜单保持一致（都 14px）。 */
  .zk-cat-group-head { padding: 11px 14px; font-size: 14px; }
  .zk-cat-subitem { padding: 10px 12px 10px 26px; font-size: 14px; }

  /* ---------- 3. 购物车 / 结算页 · 底部结算条 ---------- */
  /* 官方在 750 断点把底栏做成竖排，但没给 height:auto（结算页给了、购物车页漏了），
     且字号按 100px 基准写 rem（0.18rem 实际只有 9.4px）⇒ 三行文字叠在一起。 */
  .template .el-footer {
    height: auto !important;
    margin-left: 12px !important;
    margin-right: 12px !important;
    margin-bottom: 12px !important;
    padding-left: 14px !important;
    padding-right: 14px !important;
    padding-top: 10px !important;
    padding-bottom: 10px !important;
  }
  .template .el-footer .footer-left {
    font-size: 13px !important;
    row-gap: 4px;
  }
  .template .el-footer .footer-right { font-size: 13px !important; }
  .template .el-footer .btn-box .buy-btn,
  .template .el-footer .buy-btn {
    width: auto !important;
    min-width: 104px;
    padding: 0 18px;
    height: 36px !important;
    line-height: 36px !important;
    margin-top: 10px !important;
    font-size: 14px !important;
    border-radius: 0 !important;
  }
  /* 结算页「合计」行：竖排后右对齐，别贴边 */
  .template .footer-right .totalprice-box {
    height: auto;
    padding-top: 2px;
  }
  .template .footer-right .zk-total-row { justify-content: flex-end; }
}

/* ==========================================================================
   十一、商品配置页 · 机型配置表（el-table）
   --------------------------------------------------------------------------
   表体由**插件模板**渲染（plugins/server/mf_dcim/.../goods.html）。
   · 该表格是「选机型」的核心交互区，原来行高只有 0.45rem（≈34px）、
     表头表体全灰边框，勾选后除一个小圆点外没有任何反馈 ⇒ 分不清选了哪台。
   · 插件 CSS 是随 ajax 内容注入 body 的，加载时机晚于本文件
     ⇒ 每条规则都必须带 !important。
   · 选中态：模板里每行第一列是 <el-radio v-model="params.model_config_id">，
     勾选后 DOM 上出现 .el-radio__input.is-checked，用 :has() 反查整行。
     （tableRowClassName 只写 row.index，不产出 class，靠不上。）
   ========================================================================== */

/* 外框：圆角 + 浅描边，去掉 element 自带的底部横线 */
.zk-goods .mf-dcim .el-table {
  border: 1px solid #E8ECF2 !important;
  border-radius: 0 !important;
  overflow: hidden;
}
.zk-goods .mf-dcim .el-table::before,
.zk-goods .mf-dcim .el-table::after { display: none !important; }

/* 表头：浅灰底、深一号的字色 */
.zk-goods .mf-dcim .el-table th.el-table__cell {
  background: #F7F9FC !important;
  color: #55637A !important;
  font-weight: 600 !important;
  font-size: 13px !important;
  border-bottom: 1px solid #E8ECF2 !important;
}

/* 表体：加大行高 + 弱化分隔线 */
.zk-goods .mf-dcim tbody .el-table__row,
.zk-goods .mf-dcim thead tr { height: 50px !important; }
.zk-goods .mf-dcim .el-table td.el-table__cell {
  border-bottom: 1px solid #F0F2F5 !important;
  font-size: 13px !important;
  color: #1F2D3D !important;
}
.zk-goods .mf-dcim .el-table__row:last-child td.el-table__cell { border-bottom: 0 !important; }

/* 悬停 */
.zk-goods .mf-dcim .el-table--enable-row-hover .el-table__body tr:hover > td.el-table__cell {
  background: #F4F7FC !important;
}

/* 选中行：整行淡蓝底 + 左侧品牌色竖条 */
.zk-goods .mf-dcim .el-table__body tr:has(.el-radio__input.is-checked) > td.el-table__cell {
  background: rgba(var(--zk-navy-rgb), .06) !important;
}
.zk-goods .mf-dcim .el-table__body tr:has(.el-radio__input.is-checked) > td.el-table__cell:first-child {
  box-shadow: inset 3px 0 0 0 var(--zk-navy);
}
.zk-goods .mf-dcim .el-table__body tr:has(.el-radio__input.is-checked) .model-name {
  color: var(--zk-navy);
  font-weight: 600;
}

/* 单选框跟随品牌色 */
.zk-goods .mf-dcim .el-radio__input.is-checked .el-radio__inner {
  border-color: var(--zk-navy) !important;
  background: var(--zk-navy) !important;
}
.zk-goods .mf-dcim .el-radio__inner:hover { border-color: var(--zk-navy) !important; }

/* ==========================================================================
   十二、商品配置页 · 机型筛选器（处理器 / 内存 两个下拉）
   --------------------------------------------------------------------------
   这两个下拉**不是**购买参数，而是「筛选下面的机型表」的过滤条件。
   原来的做法是把两个下拉裸放在表单行里，和购买选项长得一模一样，
   容易被当成"必须选的配置" ⇒ 这里包成一条浅底筛选栏，和下方表格视觉上归为一组。
   实体改动（合并成级联选择器）不做：那会改掉插件提交的数据结构，有下单失败风险。
   ========================================================================== */
.zk-goods .mf-dcim .top-select {
  display: flex !important;
  align-items: center;
  flex-wrap: wrap;
  gap: 12px;
  padding: 12px 14px;
  margin-bottom: 14px;
  background: #F7F9FC;
  border: 1px solid #EEF1F6;
  border-radius: 0;
}
.zk-goods .mf-dcim .top-select .el-select {
  flex: 1 1 0;
  width: auto !important;
  min-width: 0;
  margin-right: 0 !important;
}
.zk-goods .mf-dcim .top-select .el-select .el-input__inner {
  height: 38px !important;
  line-height: 38px !important;
  border-radius: 0 !important;
  border-color: #DCE1E9 !important;
  background: #fff !important;
}
.zk-goods .mf-dcim .top-select .el-select .el-input__inner:focus {
  border-color: var(--zk-navy-soft) !important;
  box-shadow: 0 0 0 3px rgba(98, 140, 255, .12) !important;
}
.zk-goods .mf-dcim .top-select .el-select .el-input__icon { line-height: 38px !important; }

/* ==========================================================================
   十三、购物车 / 结算页 · 商品明细表（原生 <table class="goods-table">）
   --------------------------------------------------------------------------
   官方样式（shoppingCar.css / settlement.css）：表头 #eef4ff 蓝底 + 0.46rem 行高、
   每格都有 1px #e6e7eb 边框，整张表像 Excel 表格 ⇒ 弱化边框、抬高行高。
   ========================================================================== */
.template .goods-table {
  border: 1px solid #EAECF0 !important;
  border-radius: 0 !important;
  overflow: hidden;
}
.template .goods-table thead,
.template .goods-table thead tr {
  background: #F7F9FC !important;
  height: auto !important;
  line-height: 1 !important;
}
.template .goods-table thead th {
  padding-top: 13px !important;
  padding-bottom: 13px !important;
  font-size: 13px !important;
  font-weight: 600 !important;
  color: #55637A !important;
  border-bottom: 1px solid #EAECF0 !important;
}
.template .goods-table tbody tr td {
  border-bottom: 1px solid #F2F4F7 !important;
  vertical-align: middle;
}
.template .goods-table tbody tr:last-child td { border-bottom: 0 !important; }
.template .goods-table tbody tr:hover td { background: #FAFBFD; }

/* ==========================================================================
   十四、购物车空状态 · 「去选购」按钮
   --------------------------------------------------------------------------
   el-empty 默认只有一句灰字，用户点进来没东西可做。
   模板改动：shoppingCar.php 的 el-empty 里加了一个按钮（文案 lang.shoppingCar_go_goods）。
   ========================================================================== */
.template .el-empty .zk-empty-btn {
  height: 38px !important;
  padding: 0 26px !important;
  margin-top: 6px;
  border: 0 !important;
  border-radius: 0 !important;
  font-size: 14px !important;
  font-weight: 600 !important;
  letter-spacing: .3px;
  background: linear-gradient(135deg, var(--zk-navy-soft), var(--zk-navy)) !important;
  color: #fff !important;
  box-shadow: 0 6px 14px rgba(var(--zk-navy-rgb), .22);
  transition: box-shadow .2s ease, transform .2s ease;
}
.template .el-empty .zk-empty-btn:hover {
  box-shadow: 0 10px 20px rgba(var(--zk-navy-rgb), .30);
  transform: translateY(-1px);
}

/* ==========================================================================
   十五、手机端补充（≤750px）
   ========================================================================== */
@media (max-width: 750px) {

  /* 机型表：手机上「卡片化」——隐藏表头，一行 = 一张卡片，
     每个单元格变成「列名 —— 值」的一行。列名由 js/goods.js 的
     decorateModelTable() 从真实表头写进 .cell 的 data-zk-label，
     所以多语言、以及「GPU 列有没有」这类条件列都能自适应。
     （不再用横向滚动：手机上要横着滑才看得全，体验更差。） */
  .zk-goods .mf-dcim .el-table {
    max-height: none !important;
    overflow: visible !important;
    border: 0 !important;
    border-radius: 0 !important;
  }
  .zk-goods .mf-dcim .el-table__header-wrapper { display: none !important; }
  /* 给卡片化的行留出空间：主卡右内边距会切掉一点点，这里补回来 */
  .zk-goods .mf-dcim .el-table__body-wrapper,
  .zk-goods .mf-dcim .el-table__fixed,
  .zk-goods .mf-dcim .el-table__fixed-right { overflow: visible !important; }
  .zk-goods .mf-dcim .el-table__body-wrapper,
  .zk-goods .mf-dcim .el-table__body,
  .zk-goods .mf-dcim .el-table__body > tbody {
    display: block !important;
    width: 100% !important;
  }
  /* 一行 = 一张卡片；右侧留出单选框的位置 */
  .zk-goods .mf-dcim .el-table__body tr {
    display: block !important;
    position: relative;
    height: auto !important;
    margin-bottom: 12px;
    padding: 6px 40px 6px 12px;
    background: #fff !important;
    border: 1px solid #E8ECF2 !important;
    border-radius: 0 !important;
  }
  .zk-goods .mf-dcim .el-table__body tr:last-child { margin-bottom: 0; }
  .zk-goods .mf-dcim .el-table__body tr:has(.el-radio__input.is-checked) {
    border-color: rgba(var(--zk-navy-rgb), .45) !important;
    box-shadow: 0 0 0 3px rgba(var(--zk-navy-rgb), .07);
  }
  /* 卡片化后要清掉桌面端的「选中行淡蓝底 + 首格左侧竖条」——
     首格已被抽到右上角，那条竖条会挂在错误的位置上。 */
  .zk-goods .mf-dcim .el-table__body tr:has(.el-radio__input.is-checked) > td.el-table__cell {
    background: transparent !important;
  }
  .zk-goods .mf-dcim .el-table__body tr:has(.el-radio__input.is-checked) > td.el-table__cell:first-child {
    box-shadow: none !important;
  }
  .zk-goods .mf-dcim .el-table__body tr:hover > td.el-table__cell { background: transparent !important; }
  /* 单元格：一行「列名 —— 值」 */
  .zk-goods .mf-dcim .el-table__body tr > td.el-table__cell {
    display: block !important;
    width: auto !important;
    padding: 8px 0 !important;
    border: 0 !important;
    border-bottom: 1px dashed #F0F2F5 !important;
    font-size: 13px !important;
    text-align: right !important;
  }
  .zk-goods .mf-dcim .el-table__body tr > td.el-table__cell:last-child { border-bottom: 0 !important; }
  .zk-goods .mf-dcim .el-table__body tr > td.el-table__cell > .cell {
    display: flex !important;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    width: 100% !important;
    white-space: normal !important;
    overflow: visible !important;
    text-overflow: clip !important;
    line-height: 1.5;
  }
  /* 左侧列名（来自 data-zk-label） */
  .zk-goods .mf-dcim .el-table__body tr > td.el-table__cell > .cell[data-zk-label]::before {
    content: attr(data-zk-label);
    flex: 0 0 auto;
    color: #7A8699;
    font-weight: 400;
  }
  /* 第 0 列（单选框）抽到卡片右上角 */
  .zk-goods .mf-dcim .el-table__body tr > td.el-table__cell:first-child {
    position: absolute;
    top: 12px;
    right: 12px;
    width: auto !important;
    padding: 0 !important;
    border: 0 !important;
    text-align: left !important;
  }
  .zk-goods .mf-dcim .el-table__body tr > td.el-table__cell:first-child > .cell {
    display: block !important;
    width: auto !important;
  }
  /* 机型名单独放大一点，卡片标题感 */
  .zk-goods .mf-dcim .el-table__body tr > td.el-table__cell:nth-child(2) > .cell {
    font-size: 15px !important;
    font-weight: 600 !important;
    color: var(--zk-navy) !important;
  }
  .zk-goods .mf-dcim .el-table__body tr > td.el-table__cell:nth-child(2) > .cell[data-zk-label]::before {
    font-size: 13px !important;
    font-weight: 400 !important;
    color: #7A8699 !important;
  }
  .zk-goods .mf-dcim .el-table th.el-table__cell,
  .zk-goods .mf-dcim .el-table td.el-table__cell {
    padding-left: 6px !important;
    padding-right: 6px !important;
    font-size: 13px !important;
  }

  /* 筛选器：两个下拉各占一整行，指头好点 */
  .zk-goods .mf-dcim .top-select { flex-direction: column; align-items: stretch; gap: 10px; }
  .zk-goods .mf-dcim .top-select .el-select { flex: 0 0 auto; width: 100% !important; }

  /* 配置表单里的下拉 / 输入框统一拉满宽度，避免半截宽度的输入框 */
  .zk-goods .mf-dcim .el-form-item__content { width: 100% !important; margin-left: 0 !important; }
  .zk-goods .mf-dcim .el-form-item__label {
    float: none !important;
    display: block !important;
    width: auto !important;
    text-align: left !important;
    padding: 0 0 6px !important;
    line-height: 1.4 !important;
  }
  .zk-goods .mf-dcim .el-form-item .el-select,
  .zk-goods .mf-dcim .el-form-item .el-input,
  .zk-goods .mf-dcim .el-form-item .el-input-number { width: 100% !important; }

  /* 商品明细表：手机上只留必要列宽，横向能滚 */
  .template .goods-table thead th,
  .template .goods-table tbody td {
    padding-left: 8px !important;
    padding-right: 8px !important;
  }

  /* 空状态按钮做大一点，好点 */
  .template .el-empty .zk-empty-btn { height: 42px !important; padding: 0 30px !important; }
}


/* ==========================================================================
   十六、商品卡描述 —— 「标签 / 值」两栏 + 行首小图标
   --------------------------------------------------------------------------
   后台商品描述实际长这样（纯文本 + <br>，不带任何标签）：
     CPU:8H 高性能E5<br>内存8G DDR4<br>硬盘:40G SSD<br>带宽:50M上下<br>区域:西安
   这种结构下，上一节 1a（第一节「规格描述：两栏」）里按 `> p` 写的规则一条都套不上，
   所以左栏（`js/goodsList.js` 的 fmtDesc()）会把它改写成
   <div class="zk-spec"><span class="zk-spec-k"><i class="zk-ic …"></i>标签</span>
                        <span class="zk-spec-v">值</span></div>
   这里负责这套新结构的样式。
   ⚠️ 描述是后台富文本：fmtDesc() 只在「整段都是 标签:值 + <br>」时才改写，
      出现图片/表格/列表等结构就原样返回，此时仍走上面那套 `> p` 的规则。
   ========================================================================== */
.shopping-item .goods-description .zk-spec {
  display: flex !important;
  justify-content: space-between !important;
  align-items: baseline !important;
  gap: 12px;
  margin: 0 !important;
  padding: 7px 0 !important;
  border-bottom: 1px dashed var(--zk-line-soft);
  font-size: 13px !important;
  line-height: 1.6 !important;
}
.shopping-item .goods-description .zk-spec:last-child { border-bottom: 0 !important; }
/* 切不出「标签 / 值」的行（后台写成了整句），整行当值，不做两栏 */
.shopping-item .goods-description .zk-spec-plain { justify-content: flex-start !important; }
.shopping-item .goods-description .zk-spec-k {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  flex: 0 0 auto;
  color: var(--zk-muted);
  white-space: nowrap;
}
.shopping-item .goods-description .zk-spec-v {
  color: var(--zk-ink);
  text-align: right;
  word-break: break-word;
}

/* 图标：内联 SVG（stroke = 品牌深海蓝），不依赖任何外部资源或图标字体 */
.shopping-item .goods-description .zk-ic {
  display: inline-block;
  flex: 0 0 14px;
  width: 14px;
  height: 14px;
  opacity: .82;
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
}
.shopping-item .goods-description .zk-ic-cpu {
  background-color: var(--zk-navy);
  -webkit-mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='6' y='6' width='12' height='12' rx='1.5'/><path d='M9 2v4M15 2v4M9 18v4M15 18v4M2 9h4M2 15h4M18 9h4M18 15h4'/></svg>") center/contain no-repeat;
  mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='6' y='6' width='12' height='12' rx='1.5'/><path d='M9 2v4M15 2v4M9 18v4M15 18v4M2 9h4M2 15h4M18 9h4M18 15h4'/></svg>") center/contain no-repeat;
}
.shopping-item .goods-description .zk-ic-ram {
  background-color: var(--zk-navy);
  -webkit-mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='2' y='7' width='20' height='10' rx='1.5'/><path d='M6 11v2M10 11v2M14 11v2M18 11v2'/></svg>") center/contain no-repeat;
  mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='2' y='7' width='20' height='10' rx='1.5'/><path d='M6 11v2M10 11v2M14 11v2M18 11v2'/></svg>") center/contain no-repeat;
}
.shopping-item .goods-description .zk-ic-disk {
  background-color: var(--zk-navy);
  -webkit-mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><ellipse cx='12' cy='6' rx='8' ry='3'/><path d='M4 6v12c0 1.7 3.6 3 8 3s8-1.3 8-3V6'/></svg>") center/contain no-repeat;
  mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><ellipse cx='12' cy='6' rx='8' ry='3'/><path d='M4 6v12c0 1.7 3.6 3 8 3s8-1.3 8-3V6'/></svg>") center/contain no-repeat;
}
.shopping-item .goods-description .zk-ic-net {
  background-color: var(--zk-navy);
  -webkit-mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9'/><path d='M3 12h18M12 3c2.5 2.6 3.8 5.6 3.8 9s-1.3 6.4-3.8 9c-2.5-2.6-3.8-5.6-3.8-9S9.5 5.6 12 3z'/></svg>") center/contain no-repeat;
  mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9'/><path d='M3 12h18M12 3c2.5 2.6 3.8 5.6 3.8 9s-1.3 6.4-3.8 9c-2.5-2.6-3.8-5.6-3.8-9S9.5 5.6 12 3z'/></svg>") center/contain no-repeat;
}
.shopping-item .goods-description .zk-ic-loc {
  background-color: var(--zk-navy);
  -webkit-mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M12 21s7-5.6 7-11a7 7 0 1 0-14 0c0 5.4 7 11 7 11z'/><circle cx='12' cy='10' r='2.6'/></svg>") center/contain no-repeat;
  mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M12 21s7-5.6 7-11a7 7 0 1 0-14 0c0 5.4 7 11 7 11z'/><circle cx='12' cy='10' r='2.6'/></svg>") center/contain no-repeat;
}
.shopping-item .goods-description .zk-ic-os {
  background-color: var(--zk-navy);
  -webkit-mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='4' width='18' height='13' rx='2'/><path d='M8 21h8M12 17v4'/></svg>") center/contain no-repeat;
  mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='4' width='18' height='13' rx='2'/><path d='M8 21h8M12 17v4'/></svg>") center/contain no-repeat;
}
.shopping-item .goods-description .zk-ic-shield {
  background-color: var(--zk-navy);
  -webkit-mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M12 3l7 3v6c0 4.2-2.9 7.6-7 9-4.1-1.4-7-4.8-7-9V6l7-3z'/></svg>") center/contain no-repeat;
  mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M12 3l7 3v6c0 4.2-2.9 7.6-7 9-4.1-1.4-7-4.8-7-9V6l7-3z'/></svg>") center/contain no-repeat;
}
.shopping-item .goods-description .zk-ic-dot {
  background-color: var(--zk-navy);
  -webkit-mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><circle cx='12' cy='12' r='3.5' fill='%23FFFFFF'/></svg>") center/contain no-repeat;
  mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><circle cx='12' cy='12' r='3.5' fill='%23FFFFFF'/></svg>") center/contain no-repeat;
}

/* ==========================================================================
   十七、商品选购页 · 快捷筛选标签（价格区间）
   --------------------------------------------------------------------------
   纯前端过滤 `goodsList`（见 js/goodsList.js 的 filteredGoodsList），不动接口。
   标签文案走多语言键 cart_filter_*（三个语言目录的 index.js 都加了）。
   ========================================================================== */
.zk-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0 0 16px;
}
.zk-chip {
  padding: 5px 14px;
  font-size: 13px;
  line-height: 20px;
  color: #4A5668;
  background: #F2F5F9;
  border: 1px solid transparent;
  border-radius: 0;
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
  transition: color .16s ease, background .16s ease, box-shadow .16s ease;
}
.zk-chip:hover {
  color: var(--zk-navy);
  background: #E9EFF7;
}
.zk-chip.is-active {
  color: #fff;
  background: var(--zk-navy);
  border-color: var(--zk-navy);
  box-shadow: 0 4px 10px rgba(var(--zk-navy-rgb), .20);
}

/* ==========================================================================
   十八、配置页 · 专业术语问号提示
   --------------------------------------------------------------------------
   解释文案走多语言键 zk_term_*（三个语言目录的 index.js 都加了），
   由 js/goods.js 的 applyTermTips() 在插件表单渲染完成后挂上去。
   · 表单标签：挂自己写的 .zk-term 气泡（纯 CSS，hover 显示）；
   · 机型表表头：气泡会被 .el-table 的 overflow 裁掉 ⇒ 只加原生 title，
     并把问号做成不可点的静态标记。
   ========================================================================== */
.zk-goods .mf-dcim .el-form-item__label .zk-term,
.zk-term {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 14px;
  height: 14px;
  margin-left: 5px;
  border-radius: 50%;
  background: #E8ECF2;
  color: #55637A;
  font-size: 10px;
  font-weight: 700;
  line-height: 1;
  vertical-align: 1px;
  cursor: help;
  transition: background .16s ease, color .16s ease;
}
.zk-term:hover { background: var(--zk-navy); color: #fff; }
/* 气泡：默认隐藏，hover / 聚焦时淡入 */
.zk-term::after {
  content: attr(data-tip);
  position: absolute;
  left: 50%;
  bottom: calc(100% + 9px);
  transform: translateX(-50%) translateY(3px);
  width: 250px;
  padding: 9px 12px;
  border-radius: 0;
  background: rgba(21, 32, 51, .95);
  color: #fff;
  font-size: 12px;
  font-weight: 400;
  line-height: 1.7;
  text-align: left;
  white-space: normal;
  word-break: break-word;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  z-index: 3000;
  box-shadow: 0 10px 24px rgba(16, 24, 40, .22);
  transition: opacity .16s ease, transform .16s ease, visibility .16s;
}
.zk-term::before {
  content: "";
  position: absolute;
  left: 50%;
  bottom: calc(100% + 3px);
  transform: translateX(-50%);
  border: 6px solid transparent;
  border-top-color: rgba(21, 32, 51, .95);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  z-index: 3000;
  transition: opacity .16s ease, visibility .16s;
}
.zk-term:hover::after,
.zk-term:hover::before,
.zk-term.is-open::after,
.zk-term.is-open::before { opacity: 1; visibility: visible; }
.zk-term:hover::after,
.zk-term.is-open::after { transform: translateX(-50%) translateY(0); }
/* 靠左的标签（如「区域」「可用区」）气泡会顶出卡片，改成左对齐展开 */
.zk-goods .mf-dcim .el-form-item__label .zk-term::after {
  left: -4px;
  transform: translateX(0) translateY(3px);
}
.zk-goods .mf-dcim .el-form-item__label .zk-term::before {
  left: 7px;
  transform: translateX(0);
}
.zk-goods .mf-dcim .el-form-item__label .zk-term:hover::after,
.zk-goods .mf-dcim .el-form-item__label .zk-term.is-open::after {
  transform: translateX(0) translateY(0);
}
/* 机型表表头：原生 title 方案，问号只是个静态小标记 */
.zk-goods .mf-dcim .el-table th .zk-term-head {
  cursor: help;
  border-bottom: 1px dotted #A9B4C4;
}
.zk-goods .mf-dcim .el-table th .zk-term-head::after {
  content: "?";
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 13px;
  height: 13px;
  margin-left: 4px;
  border-radius: 50%;
  background: #E8ECF2;
  color: #55637A;
  font-size: 10px;
  font-weight: 700;
  line-height: 1;
  vertical-align: 1px;
}

/* ==========================================================================
   十九、手机端 · 左侧分类栏改「抽屉」
   --------------------------------------------------------------------------
   手机上分类面板原本折到内容上方、限高 220px，仍然占掉半屏。
   现在改成：默认收起，由内容区顶部一个按钮唤出，从左侧滑入 + 遮罩。
   · 桌面端（>750px）完全不受影响：入口条与遮罩都 display:none，
     .zk-cat 仍是原来的左侧固定栏（sticky / 应用壳）。
   · 抽屉靠 position:fixed 脱离文档流，所以不会在 .main-content-box 里占位。
   ========================================================================== */
.zk-cat-bar,
.zk-cat-mask,
.zk-cat-mobile-head { display: none; }

@media (max-width: 750px) {

  /* 入口按钮 */
  .zk-cat-bar { display: flex; margin-bottom: 12px; }
  .zk-cat-open {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    max-width: 100%;
    padding: 9px 14px;
    font-size: 14px;
    color: var(--zk-navy);
    background: #fff;
    border: 1px solid var(--zk-line);
    border-radius: 0;
    cursor: pointer;
    box-shadow: 0 1px 2px rgba(16, 24, 40, .04);
  }
  .zk-cat-open > span {
    max-width: 150px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: 600;
  }
  .zk-cat-open .el-icon-menu { font-size: 16px; }
  .zk-cat-open .el-icon-arrow-down { font-size: 12px; color: #98A2B3; }

  /* 遮罩 */
  .zk-cat-mask {
    display: block;
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: rgba(16, 24, 40, .45);
    z-index: 2050;
  }

  /* 抽屉本体 */
  .zk-cat {
    position: fixed !important;
    top: 0 !important;
    left: 0 !important;
    bottom: 0;
    width: 78vw !important;
    max-width: 300px;
    height: 100vh !important;
    max-height: none !important;
    flex: none !important;
    border: 0 !important;
    border-radius: 0 !important;
    box-shadow: 4px 0 24px rgba(16, 24, 40, .18);
    z-index: 2051;
    transform: translateX(-102%);
    transition: transform .26s ease;
    display: flex;
    flex-direction: column;
  }
  .zk-cat.is-open { transform: translateX(0); }

  /* 抽屉标题栏 */
  .zk-cat-mobile-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex: 0 0 auto;
    padding: 14px 16px;
    font-size: 15px;
    font-weight: 600;
    color: var(--zk-navy);
    border-bottom: 1px solid var(--zk-line-soft);
  }
  .zk-cat-mobile-head .el-icon-close {
    padding: 4px;
    font-size: 18px;
    color: #98A2B3;
    cursor: pointer;
  }
  .zk-cat-list { flex: 1 1 auto; overflow-y: auto; }

  /* 抽屉打开时，右侧内容不要再抢滚动 */
  .zk-cat-open { position: relative; z-index: 1; }
}

@media (min-width: 751px) {
  /* 桌面端即便残留 is-open 也不该有视觉变化（防止窗口从窄拉宽后卡住） */
  .zk-cat.is-open { transform: none; }
}

/* ==========================================================================
   二十、手机端（≤750px）· 购物车明细表卡片化 + 底栏重排 + 触点放大
   --------------------------------------------------------------------------
   390×844 实测发现的四类问题：
   ① 购物车明细表 table.goods-table 实测宽 862px，容器只有 366px
      ⇒「数量 / 小计 / 操作」三列被整个裁掉，用户在手机上既看不到小计，
        也点不到数量加减和删除 ⇒ 整表转成卡片。
        每格的列名由 shoppingCar.js / settlement.js 写进 data-zk-label
        （取真实表头文字 ⇒ 跟着语言走，不硬编码中文）。
   ② 底部结算条把「删除选中的商品」做成大号红字贴在左侧，和「全选」只隔几像素，
      误触即删单 ⇒ 改成「次要操作一行、合计+大按钮一行」。
   ③ 多处可点区域小于 36px：筛选标签 32 / 配置页下拉 34 / 机型表单选 14 /
      返回入口 30 / 抽屉关闭 26 / 购物车「修改配置」29×11。
   ④ 商品卡片里那条空「活动」占位行（模板内联 opacity:0）白占 36px，
      在手机上看起来就是一条莫名其妙的空白灰条。
   回滚：删掉本节即可（桌面端 >750px 完全不受影响）。
   ========================================================================== */
@media (max-width: 750px) {

  /* ------------------------------------------------------------------
     1. 购物车 / 结算页 · 明细表转卡片
     ------------------------------------------------------------------ */
  .template .goods-table {
    display: block !important;
    width: 100% !important;
    border: 0 !important;
    border-radius: 0 !important;
    overflow: visible !important;
  }
  .template .goods-table thead { display: none !important; }
  .template .goods-table tbody,
  .template .goods-table tbody tr {
    display: block !important;
    width: 100% !important;
  }

  /* 卡片本体就是外层 .shopping-goods（内含勾选框 + 商品名 + 明细表） */
  .template .shopping-goods {
    position: relative !important;
    display: block !important;
    padding: 14px 14px 4px !important;
    margin-bottom: 12px !important;
    background: #fff !important;
    border: 1px solid #E8ECF2 !important;
    border-radius: 0 !important;
    box-shadow: 0 1px 2px rgba(16, 24, 40, .04) !important;
  }
  .template .shopping-goods .table-content { overflow: visible !important; }
  .template .shopping-goods .table-name {
    display: flex !important;
    align-items: center !important;
    justify-content: flex-start !important;
    gap: 8px !important;
    padding: 0 38px 12px 0 !important;
    margin: 0 !important;
    border-bottom: 1px solid #F0F2F5 !important;
    overflow: visible !important;
  }
  .template .shopping-goods .table-name .goods-name {
    font-size: 15px !important;
    font-weight: 600 !important;
    color: #1F2D3D !important;
  }
  /* 「修改配置」原来只有 29×11，放大成能点的胶囊 */
  .template .shopping-goods .table-name .edit-goods {
    flex: 0 0 auto;
    margin-left: auto !important;
    padding: 8px 11px !important;
    font-size: 13px !important;
    line-height: 1 !important;
    border-radius: 0 !important;
    background: rgba(var(--zk-navy-rgb), .06) !important;
  }

  /* 每一个单元格 = 一行「列名 …… 值」 */
  .template .goods-table tbody tr td {
    display: flex !important;
    flex-wrap: wrap !important;
    align-items: center !important;
    justify-content: flex-start !important;
    gap: 8px 10px !important;
    width: 100% !important;
    min-width: 0 !important;
    max-width: none !important;
    padding: 10px 0 !important;
    border: 0 !important;
    border-bottom: 1px dashed #EEF1F5 !important;
    background: transparent !important;
    font-size: 13px !important;
    text-align: left !important;
  }
  .template .goods-table tbody tr td:last-child { border-bottom: 0 !important; }
  /* 列名吃掉全部剩余宽度 ⇒ 后面的值被顶到最右，且「¥1.00 / 年」这种组合不会被拆散 */
  .template .goods-table tbody tr td::before {
    content: attr(data-zk-label);
    flex: 0 0 auto;
    margin-right: auto;
    font-size: 13px !important;
    color: #7A8699 !important;
  }
  /* 第 1 格（配置详情）与删除格不显示列名 */
  .template .goods-table tbody tr td:first-child::before,
  .template .goods-table tbody tr td.delete-btn::before,
  .template .goods-table tbody tr td[data-zk-label=""]::before { display: none !important; }

  /* 第 1 格：配置明细整段通栏，内部再按「名称 …… 价格」排 */
  .template .goods-table tbody tr td:first-child {
    display: block !important;
    padding: 2px 0 8px !important;
  }
  .template .goods-table tbody tr td:first-child .info-box { width: 100% !important; }
  .template .goods-table tbody tr td:first-child .goodsInfo-type { width: auto !important; flex: 1 1 auto; }
  .template .goods-table tbody tr td:first-child .goodsInfo-price { flex: 0 0 auto; color: #1F2D3D !important; }
  .template .goods-table tbody tr td:first-child .goods-info {
    display: flex !important;
    justify-content: space-between !important;
    align-items: baseline !important;
    gap: 12px !important;
    padding: 7px 0 !important;
    margin: 0 !important;
    border-bottom: 1px dashed #F4F6F9 !important;
    font-size: 13px !important;
    line-height: 1.5 !important;
  }
  .template .goods-table tbody tr td:first-child .goods-info:last-child { border-bottom: 0 !important; }

  /* 数量：选择器靠右（靠 ::before 的 margin-right:auto 顶过去，不再重复 margin-left） */
  .template .goods-table tbody tr td .el-input-number {
    margin-left: 0 !important;
    width: 136px !important;
  }
  .template .goods-table tbody tr td .el-input-number .el-input__inner {
    height: 36px !important;
    line-height: 36px !important;
    font-size: 14px !important;
  }
  .template .goods-table tbody tr td .el-input-number .el-input-number__decrease,
  .template .goods-table tbody tr td .el-input-number .el-input-number__increase {
    width: 36px !important;
    height: 36px !important;
    line-height: 36px !important;
    font-size: 15px !important;
  }
  .template .goods-table tbody tr td .qty-num,
  .template .goods-table tbody tr td .qty-tips { flex-basis: 100%; margin: 4px 0 0 !important; text-align: right; }

  /* 小计：金额提级 */
  .template .goods-table tbody tr td.item-total {
    font-size: 15px !important;
    font-weight: 600 !important;
    color: var(--zk-navy) !important;
  }
  .template .goods-table tbody tr td.item-total .original-price { font-weight: 400 !important; }

  /* 删除：从表格末列抽到卡片右上角，触控区 36×36 */
  .template .goods-table tbody tr td.delete-btn {
    position: absolute !important;
    top: 10px !important;
    right: 10px !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    width: 36px !important;
    height: 36px !important;
    min-width: 0 !important;
    padding: 0 !important;
    border: 0 !important;
    border-radius: 0 !important;
    background: transparent !important;
  }
  .template .goods-table tbody tr td.delete-btn i.el-icon-delete {
    font-size: 18px !important;
    color: #98A2B3 !important;
  }
  /* 失效商品那一行 */
  .template .goods-table tbody tr td.no-goods-td {
    flex-direction: column !important;
    align-items: flex-start !important;
    gap: 10px !important;
  }
  .template .goods-table .no-goods-tips { font-size: 13px !important; white-space: normal !important; }
  .template .goods-table .buy-again-btn {
    height: 36px !important;
    line-height: 36px !important;
    font-size: 14px !important;
    border-radius: 0 !important;
    margin-left: 0 !important;
  }

  /* ------------------------------------------------------------------
     2. 底部结算条：次要操作一行、合计 + 大按钮一行
     ------------------------------------------------------------------ */
  .template .el-footer {
    padding: 12px 14px !important;
    border-radius: 0 !important;
    box-shadow: 0 -2px 16px rgba(16, 24, 40, .10) !important;
  }
  .template .el-footer .footer-box {
    flex-direction: column !important;
    align-items: stretch !important;
    justify-content: flex-start !important;
    gap: 0 !important;
    height: auto !important;
  }
  /* 次要操作行 */
  .template .el-footer .footer-left {
    order: 1;
    display: flex !important;
    flex-direction: row !important;
    flex-wrap: wrap !important;
    align-items: center !important;
    gap: 6px 10px !important;
    width: 100% !important;
    padding: 0 0 10px !important;
    margin: 0 0 10px !important;
    border-bottom: 1px solid #F0F2F5 !important;
    font-size: 13px !important;
    line-height: 1.4 !important;
    color: #7A8699 !important;
  }
  /* 「已选择 N 件商品」排到「全选」之后，别孤零零占一行 */
  .template .el-footer .footer-left .all-check { order: 1; }
  .template .el-footer .footer-left > span:not(.delect-btn) { order: 2; }
  .template .el-footer .footer-left .all-check .el-checkbox__label {
    font-size: 13px !important;
    color: #55637A !important;
  }
  /* 删除：弱化成小号描边胶囊，并推到最右，远离「全选」 */
  .template .el-footer .footer-left .delect-btn { order: 3; margin: 0 0 0 auto !important; }
  .template .el-footer .footer-left .delect-goods {
    display: inline-flex !important;
    align-items: center !important;
    min-height: 36px !important;
    padding: 0 12px !important;
    font-size: 13px !important;
    font-weight: 400 !important;
    line-height: 1 !important;
    border-radius: 0 !important;
    background: rgba(217, 45, 32, .06) !important;
  }
  /* 主操作行：合计在左、大按钮在右（结算页额外多一行协议勾选） */
  .template .el-footer .footer-right {
    order: 2;
    display: grid !important;
    grid-template-columns: 1fr auto;
    align-items: center;
    gap: 10px 12px !important;
    width: 100% !important;
    font-size: 13px !important;
  }
  .template .el-footer .footer-right .totalprice-box,
  .template .el-footer .footer-right .zk-total-row {
    grid-column: 1;
    grid-row: 1;
  }
  .template .el-footer .footer-right .totalprice-box { height: auto !important; padding: 0 !important; }
  .template .el-footer .footer-right .zk-total-row { justify-content: flex-start !important; margin: 0 !important; }
  .template .el-footer .footer-right .zk-total-label { font-size: 13px !important; color: #7A8699 !important; }
  .template .el-footer .footer-right .total-price { font-size: 20px !important; font-weight: 700 !important; }
  /* .btn-box 拆成网格项，让「提交订单」和「合计」并排，协议勾选单独一行 */
  .template .el-footer .footer-right .btn-box { display: contents !important; }
  .template .el-footer .footer-right .buy-btn,
  .template .el-footer .btn-box .buy-btn {
    grid-column: 2;
    grid-row: 1;
    justify-self: end;
    width: auto !important;
    min-width: 128px !important;
    height: 44px !important;
    line-height: 44px !important;
    margin: 0 !important;
    padding: 0 20px !important;
    font-size: 16px !important;
    font-weight: 600 !important;
    border-radius: 0 !important;
  }
  .template .el-footer .footer-right .check-box {
    grid-column: 1 / -1;
    grid-row: 2;
    display: flex !important;
    align-items: center !important;
    flex-wrap: wrap !important;
    gap: 2px 6px !important;
    font-size: 12px !important;
    line-height: 1.5 !important;
    color: #7A8699 !important;
  }
  /* 固定底栏要盖住内容，主区底部留出让位空间（配置页已有 130px，不重复加） */
  .template .el-main > .main-card:not(:has(.main-content-box.has-cat)) {
    padding-bottom: 132px !important;
  }
  /* ⚠️ 上面那条会连带命中配置页底栏里的 main-card —— .f-order 底下同样是
     .el-main > .main-card、里面同样没有 .main-content-box，于是底栏也被塞进
     132px 下内边距：底栏从 ~119px 被撑成 234px（吃掉手机 1/3 屏高），
     两行内容还被 align-content 拉开一大段空档。这里用更高权重按回去。 */
  .zk-goods .config-box .f-order .el-main > .main-card {
    padding-top: 10px !important;
    padding-bottom: 16px !important;
  }

  /* ------------------------------------------------------------------
     3. 触点放大：所有小于 36px 的可点区域
     ------------------------------------------------------------------ */
  /* 勾选框：视觉 17px，实际触控区由 min-height 撑到 36px */
  .template .el-checkbox {
    display: inline-flex !important;
    align-items: center !important;
    min-height: 36px !important;
    padding: 0 !important;
  }
  .template .el-checkbox__inner { width: 17px !important; height: 17px !important; }
  .template .el-checkbox__inner::after {
    top: 2px !important;
    left: 5px !important;
    width: 4px !important;
    height: 8px !important;
  }
  /* 列表页筛选标签 32 → 38。
     ⚠️ 把高度撑到 38px 后，行高仍是桌面继承来的 20px ⇒ 文字贴在按钮顶端
     （实测上留 2px、下留 21px，就是用户说的「字体偏上」）。
     用 flex 居中把文字摆正，上下各留 10px。 */
  .zk-main .zk-chip,
  .zk-chip {
    min-height: 38px;
    padding: 0 16px !important;
    font-size: 13px !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
  }
  /* 筛选标签：5 个标签合计 482px、手机只有 340px 宽。原先排成一行横向滚动，
     结果最右边那个标签被切掉一半，看着像「显示坏了」（用户反馈）。
     改成换行 —— 3 + 2 两行，全部标签完整可见，也不用再横滑。 */
  .zk-main .zk-filters,
  .zk-filters {
    flex-wrap: wrap !important;
    overflow: visible !important;
    row-gap: 8px !important;
    column-gap: 8px !important;
    padding-bottom: 0 !important;
    margin-bottom: 14px !important;
  }
  .zk-filters .zk-chip { flex: 0 0 auto !important; }

  /* ---------- 4. 商品列表卡片：去掉空「活动」占位行 ----------
     模板在没有任何活动时，仍渲染一个 <div class="active-name" style="opacity: 0">，
     视觉看不见但白占 36px（gap 14 + 行高 22），在手机上就是一条空白灰条。 */
  .shopping-item .goods-active:has(> .active-name[style*="opacity: 0"]) { display: none !important; }
  .shopping-item { gap: 12px !important; }

  /* ------------------------------------------------------------------
     5. 商品配置页：下拉/输入/单选框放大，「返回」入口加高
     ------------------------------------------------------------------ */
  .zk-crumb-back { margin-bottom: 10px; }
  .zk-back-link {
    min-height: 40px;
    padding: 0 16px 0 13px !important;
    font-size: 14px !important;
  }
  .zk-goods .el-form-item .el-input__inner,
  .zk-goods .el-form-item .el-select .el-input__inner,
  .zk-goods .mf-dcim .top-select .el-select .el-input__inner {
    height: 44px !important;
    line-height: 44px !important;
    font-size: 14px !important;
  }
  .zk-goods .el-form-item .el-select .el-input__icon,
  .zk-goods .mf-dcim .top-select .el-select .el-input__icon { line-height: 44px !important; }
  .zk-goods .el-form-item .el-input-number__decrease,
  .zk-goods .el-form-item .el-input-number__increase {
    height: 44px !important;
    line-height: 44px !important;
    width: 34px !important;
  }
  /* 机型表上的单选框：14 → 20，并把整行变成可点（JS 已把 label 绑在行上） */
  .zk-goods .mf-dcim .el-radio { padding: 6px; }
  .zk-goods .mf-dcim .el-radio__inner { width: 20px !important; height: 20px !important; }
  .zk-goods .mf-dcim .el-table__body tr { cursor: pointer; }
  .zk-goods .mf-dcim .top-select { padding: 10px 12px; gap: 10px; }

  /* 底栏里的时长 / 数量控件 34 → 42 */
  .zk-goods .f-order .el-input__inner {
    height: 42px !important;
    line-height: 42px !important;
    font-size: 14px !important;
  }
  .zk-goods .f-order .duration-select { width: 104px !important; }
  .zk-goods .f-order .el-input-number { width: 122px !important; }
  .zk-goods .f-order .el-input-number__decrease,
  .zk-goods .f-order .el-input-number__increase {
    width: 34px !important;
    height: 42px !important;
    line-height: 42px !important;
    font-size: 13px !important;
  }
  .zk-goods .f-order .right .add-cart { width: 42px !important; height: 42px !important; border-radius: 0 !important; }
  .zk-goods .f-order .right .buy {
    height: 42px !important;
    line-height: 42px !important;
    min-width: 106px !important;
    border-radius: 0 !important;
  }

  /* ------------------------------------------------------------------
     6. 术语问号：触屏可用
     气泡宽度沿用桌面端的 250px（390 视口下：标签左边界约 70px + 250px 仍在屏内）。
     ⚠️ 这里千万不要改成 width:auto —— 绝对定位 + 只给 left 时 shrink-to-fit
        会退化成「一个字一行」的竖条（实测宽度 12px、高 320px，整个竖着贴在页头）。
     ------------------------------------------------------------------ */
  .zk-term {
    width: 18px !important;
    height: 18px !important;
    margin-left: 6px !important;
    font-size: 11px !important;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  .zk-term::after { font-size: 12px !important; }

  /* ------------------------------------------------------------------
     7. 分类抽屉：关闭按钮 / 搜索按钮放大
     ------------------------------------------------------------------ */
  .zk-cat-mobile-head { padding: 10px 10px 10px 16px !important; }
  .zk-cat-mobile-head .el-icon-close {
    padding: 9px !important;
    font-size: 19px !important;
  }
  .zk-cat-search-btn.el-button { min-width: 38px !important; height: 38px !important; }

  /* ------------------------------------------------------------------
     8. 配置页插件表单 · 小字统一
     插件模板（mf_*.css）按桌面基准写 rem（1rem = 100px），而手机根字号是
     屏宽 / 7.5（390 ⇒ 52px）⇒ 同一个 0.12rem 只剩 6.2px，配置页上一堆
     6~9px 的字。这里把已知节点统一到 12~14px。
     ------------------------------------------------------------------ */
  /* 镜像卡（系统 / 机型图标格）：桌面这张卡是 1.9rem × 0.84rem，手机根字号只有
     52px ⇒ 实得 99 × 44px，而卡里「名字 + 版本」两行字要 50px 高、光
     「Proxmox-VE」一个词就 60px 宽，塞不进 55px 的文字区 ⇒ 文字整个挤出卡片，
     截图里满屏乱窜。所以手机端不只是调字号，得把卡改成「两列等宽 + 内容不许溢出」。 */
  .zk-goods .image-box,
  .zk-goods .image-ul {
    max-width: none !important;
    width: 100% !important;
  }
  .zk-goods .image-ul { gap: 8px !important; }
  /* 收起态官方写的是 height: 1rem（手机上 52px），装不下 56px 的卡 */
  .zk-goods .image-ul.hide { height: 64px !important; }
  .zk-goods .image-ul .image-item,
  .zk-goods .image-ul .empty-image {
    width: calc(50% - 4px) !important;
    height: 56px !important;
    min-width: 0 !important;
    padding: 8px 10px !important;
    margin: 0 !important;
    box-sizing: border-box !important;
    flex: 0 0 auto !important;
  }
  .zk-goods .image-ul .image-item .icon {
    width: 20px !important;
    height: 20px !important;
    flex: 0 0 auto !important;
  }
  .zk-goods .image-ul .image-item .r-info {
    margin-left: 6px !important;
    min-width: 0 !important;
    flex: 1 1 auto !important;
    overflow: hidden !important;
  }
  .zk-goods .image-ul .image-item .r-info .name {
    font-size: 13px !important;
    line-height: 17px !important;
    white-space: nowrap !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
  }
  .zk-goods .image-ul .image-item .r-info .version {
    font-size: 11px !important;
    line-height: 15px !important;
    margin-top: 3px !important;
    white-space: nowrap !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
  }
  /* 点开机型后下方展开的版本列表 */
  .zk-goods .image-ul .image-item .version-select .v-item { padding: 9px 10px !important; }
  .zk-goods .image-ul .image-item .version-select .v-item span { font-size: 12px !important; }

  /* 表单下方的灰色说明（「不支持切换地域；」「Linux系统：系统盘容量需…」） */
  .zk-goods .el-form-item__content .s-tip,
  .zk-goods .el-form-item__content .s-tip span {
    font-size: 12px !important;
    line-height: 1.55 !important;
  }

  /* 单选按钮（登录方式：自动创建密码 / 自定义密码 / SSH 密钥）：
     官方在这张表单里把按钮写死 width: 1.44rem（手机 74.9px）、padding 0，
     可「自动创建密码」六个字就要 84px ⇒ 最后一个字戳到按钮框外面。
     手机端改成「宽度跟着文字走、但不少于原来的宽度」，短选项外观不变。 */
  .zk-goods .mf-dcim .el-form .el-radio-button__inner,
  .zk-goods .mf-cloud .el-form .el-radio-button__inner {
    width: auto !important;
    min-width: 1.44rem !important;
    padding: 0 9px !important;
    box-sizing: border-box !important;
    font-size: 13px !important;
    white-space: nowrap !important;
  }

  /* 分节标题：基础配置 / 机型配置 / 网络配置 / 系统配置 */
  .zk-goods .mf-dcim .con > .com-tit,
  .zk-goods .mf-dcim .con form > .com-tit { font-size: 14px !important; }

  /* 底栏「订购时长 / 订购数量」标签 */
  .zk-goods .f-order .l-txt { font-size: 13px !important; }

  /* 「使用优惠码」入口（配置页底栏与购物车页都有）：整块收小一圈 */
  .discount-popover .discount-text,
  .template .discount-text,
  .zk-goods .f-order .discount-text {
    font-size: 11px !important;
    line-height: 16px !important;
    padding: 0 5px !important;
    border-radius: 0 !important;
  }

  /* 配置页商品主标题（h1.tit 原 12.5px，比正文还小）。
     注意它不是 .zk-goods 的后代，而是 .template 的直接子元素。
     ⚠️ 必须写成 .zk-goods .content .template > h1.tit —— 桌面那段
        `.zk-goods .content .template > .tit`（0,4,0）带 !important，
        权重比 `.template > h1.tit`（0,2,1）高，写低了压不过。 */
  .zk-goods .content .template > h1.tit,
  .zk-goods .content .template > .tit,
  .zk-goods h1.tit,
  .zk-goods .main-card > .tit { font-size: 16px !important; }

  /* ---------- 整体收一档：底栏合计与主按钮、面包屑 ---------- */
  /* 底栏合计金额 20 → 18（页面最大字，仍保持最醒目） */
  .template .el-footer .footer-right .total-price { font-size: 18px !important; }
  /* 底栏主按钮 16 → 15 */
  .template .el-footer .footer-right .buy-btn,
  .template .el-footer .btn-box .buy-btn { font-size: 15px !important; }
  /* 面包屑（「云产品 › 测试」）14 → 12 */
  .zk-crumb { font-size: 12px !important; }
  /* 配置页底栏价格 20 → 18 */
  .zk-goods .f-order .bot-price .new span { font-size: 18px !important; }
  /* 选购页商品卡价格 30 → 18（桌面是 30px，手机上过于夸张） */
  .template .shopping-item .price-box .item-price { font-size: 18px !important; }
  .template .shopping-item .price-box .item-price .item-price-prefix { font-size: 12px !important; }
}

/* ==========================================================================
   窗口 / 浮层里的「零碎字号」归位（两端通用）
   --------------------------------------------------------------------------
   背景：插件 CSS 按「1rem = 100px（1920 基准）」设计，但根字号随视口缩放
   （1440 屏 1rem = 75px、1366 屏 71.1px、手机 52px），同一段 0.13rem 的文字
   在大屏上 13px、1440 屏 9.75px、手机上只剩 6.8px —— 这是「同一个界面里
   字体忽大忽小」的根因。下面统一改成固定 px。
   回滚：删掉本节即可。
   ========================================================================== */

/* ---------- 「当前配置详情 / 配置费用明细」浮层：标签与值全部 13px ----------
   插件原值 0.13rem（桌面 9.75px、手机 6.8px），连值里的 <span class="price">
   都单独写了字号，所以要连子孙一起点名。 */
.zk-goods .cur-content .c-item,
.zk-goods .cur-content .c-item *,
.zk-goods .free-content .c-item,
.zk-goods .free-content .c-item * {
  font-size: 13px !important;
  line-height: 20px !important;
}
/* 浮层里的小标题比正文大一档 */
.zk-goods .cur-content .tit,
.zk-goods .free-content .tit { font-size: 14px !important; }
/* 浮层里的按钮 */
.zk-goods .cur-content .el-button,
.zk-goods .free-content .el-button,
.el-popover .el-button { font-size: 13px !important; }

/* ---------- 表单下方的灰色说明（「不支持切换地域；」「Linux系统：…」）----------
   插件的 0.13rem ⇒ 桌面 9.75px。归到「次要说明」12px。 */
.zk-goods .s-tip,
.zk-goods .s-tip span,
.zk-goods .el-form-item__content .s-tip,
.zk-goods .el-form-item__content .s-tip span {
  font-size: 12px !important;
  line-height: 1.6 !important;
}

/* ==========================================================================
   桌面端专项（@media min-width:751px）
   ⚠️ 手机端对下面这几处有自己的一套（见文件里的手机端各节），
      所以必须包在媒体查询里，写在媒体查询外面会反过来盖掉手机端设置。
   ========================================================================== */
@media (min-width: 751px) {

  /* ---------- ① 配置页底栏 ---------- */
  .zk-goods .f-order .l-txt,
  .zk-goods .f-order .r-txt { font-size: 13px !important; }
  /* 「使用优惠码」：桌面是 9px（0.12rem），统一到 12px */
  .zk-goods .f-order .discount-text,
  .discount-popover .discount-text,
  .template .discount-text { font-size: 12px !important; }

  /* ---------- ② 机型格（系统镜像卡）----------
     名字 12px、版本 9px（0.12rem）—— 同一格里两个字号差 3px。
     统一 12px，层级靠颜色/字重区分。 */
  .zk-goods .image-ul .image-item .r-info .name,
  .zk-goods .image-ul .image-item .r-info .version { font-size: 12px !important; line-height: 1.45 !important; }
  .zk-goods .image-ul .image-item .version-select .v-item span { font-size: 12px !important; }

  /* ---------- ③ 术语问号圆点 10 → 11（与手机端一致，这是本项目最小的一档）---------- */
  .zk-goods .mf-dcim .el-form-item__label .zk-term,
  .zk-term { font-size: 11px !important; }
  .zk-goods .mf-dcim .el-table th .zk-term-head { font-size: 11px !important; }
}

/* ==========================================================================
   30. 购物车侧：文字对比度达标（WCAG AA ≥ 4.5:1）
   --------------------------------------------------------------------------
   全量体检（.workbuddy/audit_ui.js）发现购物车页有 8 类文字对比度不足，
   最差只有 1.90:1（底栏「已选 0 件」的黄色数字压在白底上）。
   这些颜色都写在页面级 CSS（goodsList.css / shoppingCar.css / settlement.css）
   里，而页面级 CSS 加载在本文件之后 ⇒ 必须 !important 才能压过。
   色值全部沿用既有变量或既有色相，只压深，不改配色风格。
   ========================================================================== */

/* 价格前缀「￥」#F0142F → #D92D20（4.33 → 4.83） */
.shopping-item .price-box .item-price .item-price-prefix,
.zk-goods .f-order .bot-price .new > span,
.template .goods-table td.item-total,
.template .goods-table td.item-total span {
  color: #D92D20 !important;
}

/* 底栏「已选 N 件」的数字原本是黄 #FAAD10（1.90:1），改成同一个红 */
.template .el-footer .footer-left .text-red,
.template .el-footer .footer-left span .text-red,
.template .footer-box .footer-left .text-red,
.text-red {
  color: #D92D20 !important;
}

/* 「删除选中的商品」#F13939 → #D92D20（3.90 → 4.83） */
.template .el-footer .delect-goods,
.template .el-footer .delect-goods .el-link--inner,
.template .footer-box .delect-goods,
.template .footer-box .delect-btn a,
.template .footer-box .delect-btn a span {
  color: #D92D20 !important;
}

/* 底栏合计金额 #E5484D → #D92D20 */
.template .el-footer .total-price,
.template .footer-box .total-price,
.template .totalprice-box .total-price,
.zk-total-row .total-price {
  color: #D92D20 !important;
}

/* 「使用优惠码」胶囊 #F99600 / #E5484D → #B54708（2.24 → 5.43） */
.discount-popover .discount-text,
.template .discount-text,
.zk-goods .f-order .discount-text,
.discount-box .discount-text {
  color: #B54708 !important;
  border-color: #B54708 !important;
}

/* 次要灰字：--zk-muted #8A94A6 → #667085（3.06 → 4.90） */
:root { --zk-muted: #667085; }
.template .el-footer .footer-right .zk-total-label,
.zk-total-row .zk-total-label,
.zk-cat-subitem,
.zk-crumb-item { color: #667085 !important; }

/* 面包屑各段：分隔符比文字更淡是刻意的，但也要达标 */
.zk-crumb,
.zk-crumb span { color: #667085 !important; }

/* 底栏主操作按钮（「提交订单」/「立即购买」）的圆角统一。
   同一个按钮，结算页是 10px（= --zk-r-md，来自会员中心皮肤里那条
   `.btn-box .buy-btn`，它会跟着共用 header 一起在购物车页生效），
   购物车页却是 8px（= 全局 .el-button 的 --zk-r-sm）——两页看着不一样。
   这里统一到 --zk-r-md。手机会员端第 2050 行那条更具体（0,4,0），
   手机上仍是 8px，不受影响。 */
.template .el-footer .buy-btn,
.template .el-footer .add-cart,
.template .footer-box .footer-right .buy-btn,
.template .footer-box .footer-right .add-cart,
.template .footer-box .btn-box .buy-btn {
  border-radius: 0 !important;
}


/* ==========================================================================
   11. 全场直角（2026-10-04 · 用户要求「全改直角」）
   --------------------------------------------------------------------------
   做法：先把所有元素的圆角归零，再把「本来就是圆形」的少数几个恢复成圆。

   为什么不逐个列组件：官方 element-ui.css(90 处) + common.css(37 处) +
   各页面级 css(100+ 处) 都写了圆角，而且大量用 rem（会随屏幕缩放变化），
   逐个覆盖既容易漏、又会被后面加载的页面级 css 反压。通配一刀切最彻底。

   ⚠️ 伪元素（::before / ::after / 滚动条 thumb）不受 `*` 影响，
      圆形小装饰天然保留，无需处理。

   圆角总闸：值取自 --zk-r-all（见文件开头的设计令牌）。
            0 = 直角；想全局改圆角只改那一个变量即可，不用碰本节。

   回滚：删掉本节，并把文件开头的 --zk-r-* 圆角刻度改回 6 / 8 / 10 / 14 / 18。
   ========================================================================== */
body * { border-radius: var(--zk-r-all, 0) !important; }

/* 保留圆形 —— 这些不是「框」，是圆点/头像，变方反而难看 */
.el-radio__inner,             /* 单选钮的圆点 */
.el-avatar,                   /* 头像组件 */
.el-header .head-box,         /* 顶栏用户头像 */
.el-slider__button,           /* 滑动条的滑块 */
.zk-term,                     /* 商品配置页的圆形问号图标 */
[class*="avatar"], [class*="circle"] {
  border-radius: 50% !important;
}

/* ==========================================================================
   十二、白卡撑到屏幕底部

   用户反馈：购物车内容下面空着一大片（白卡只有内容那么高，下面露出网页底色）。
   做法：给白卡一个「至少一屏高」的下限 = 视口高度 - 顶栏 40px，
        白卡底边正好落到屏幕底边，下面不再露底色。
        内容比一屏高时正常按内容走，不影响滚动。
   适用范围：选购页 / 商品配置页（有 .main-content-box 的那两个根容器）。
   回滚：删掉本节。
   ========================================================================== */
@media (min-width: 1025px) {
  .template > .el-container > .el-container > .el-main:has(.main-content-box),
  .zk-goods > .el-container > .el-container > .el-main:has(.main-content-box) {
    min-height: calc(100vh - 40px) !important;
  }

  /* 购物车 / 结算页：底部那条「全选 / 合计 / 结算」操作条是固定贴在屏幕上的
     （约 141px = 1.2rem 条高 + 底部间隙），主内容区要按
     「视口高度 - 顶栏 40px - 操作条 141px」撑满，否则内容少的时候
     操作条上方会露出一条灰底。
     ⚠️ 141 写固定 px：本站在 ≥1025px 下 1rem 恒为 100px，换算成 rem 反而多一层漂移。 */
  .template > .el-container > .el-container:has(> .el-footer) > .el-main {
    min-height: calc(100vh - 40px - 141px) !important;
  }
  /* 兜底：这两页主内容区之外的底色跟白卡一样是白的，不露灰 */
  .template > .el-container > .el-container:has(> .el-footer) {
    background: #FFFFFF !important;
  }
}
