/* =============================================================================
   KIES 铠石智能 · 前台设计系统  v2
   2026-08-26 · 服务端直出，无框架，无构建期依赖
   -----------------------------------------------------------------------------
   风格取向：**中文工业品 B2B 商城的密集信息布局** —— 左侧品类导航、多卡片面板、
   橙红价格体系、宫格入口、情报流。不是 SaaS 落地页那种大留白。

   为什么是这个方向：采购方进站的第一个动作是「在一屏里扫到我要的那一类」。
   这类用户一次会开七八个标签页横向比货，留白越大他要滚的次数越多。
   密集不等于杂乱 —— 靠的是卡片边界、统一行高、对齐的数字，而不是靠留白分区。

   为什么不用 Google Fonts：默认语言中文、主要客户在中国大陆，
   fonts.googleapis.com 在那里不可靠。一次字体超时换来整页 FOIT，
   代价远大于自定义字形带来的品味。全站系统字体栈 + tabular-nums 保证
   价格与参数对齐 —— 这类站的字体工作重点本来就是「数字能不能对齐」。

   为什么不用 CSS 框架：这份样式会被静态化进每一个页面的关键渲染路径。
   旧站那份 92 KB 的 home.css 就是这么来的。这里只写真正用到的组件。

   颜色一律走令牌。任何一处写死 hex 都是在给下一次改版埋几千处修改。
   ============================================================================= */

/* ── 令牌 ────────────────────────────────────────────────────────────────── */
:root {
  /* 底色浅灰、卡片纯白 —— 这是「一屏很多块内容」能读得下去的前提：
     卡片靠底色衬出边界，不必再用粗描边或重阴影去分区。 */
  --k-paper:      #F5F5F5;
  --k-surface:    #FFFFFF;
  --k-surface-2:  #FAFAFA;
  --k-surface-3:  #F0F0F0;
  --k-line:       #E6E6E6;
  --k-line-soft:  #F0F0F0;

  --k-ink:        #333333;
  --k-ink-2:      #666666;
  --k-ink-3:      #999999;
  --k-ink-4:      #BBBBBB;

  /* 主色：工业橙。品牌、主 CTA、栏目「更多 ›」、选中态。
     不给它太多地方 —— 满屏橙色时橙色就不再是指引。 */
  --k-brand:      #FF6A00;
  --k-brand-2:    #E85D00;
  --k-brand-3:    #FF8630;
  --k-brand-soft: #FFF1E6;
  --k-brand-tint: #FFF8F2;

  /* 价格红。规则（2026-08-27 按实际用法收紧了措辞，原来写的是「别处一律不许用」，
     而代码里始终有四处例外 —— 规则和代码不一致时，先改到一致再谈遵守）：

       · **大面积一律不用**：按钮、卡片底色、横幅。中文电商用户对这个红的语义预期
         就是「钱」，一个红色大按钮会被读成「折扣」或「危险」。
         主 CTA 一律走品牌橙（.k-btn-primary）。
       · **小面积的强调标记可以用**：角标（.k-badge）、必填星号（.k-req）、
         「新品上架」（.k-nav-hot）。这几处面积小、位置固定，
         用红是中文电商的通行约定，换成别的颜色反而要重新学。

     .k-btn-signal（红底按钮）保留定义但**目前全站没有使用者** ——
     留着是为了「确实需要一个比主 CTA 更强的红按钮」那天，不要再去发明一个新类。 */
  --k-price:      #E4393C;
  --k-price-2:    #C8302F;
  --k-price-soft: #FDECEC;

  /* 蓝：功能入口、链接、信息类标签。与橙分工明确，不混用 */
  --k-blue:       #2D7CF0;
  --k-blue-2:     #1A67DB;
  --k-blue-soft:  #EAF2FE;

  /* ── 结构深色 ────────────────────────────────────────────────────────
     2026-08-28 新增。品牌的第二支柱色，**不是**「深色主题」——
     它在浅色主题下同样出现，而且正是浅色主题下最重要的那几块：
     顶栏工具条、首屏、四张行动卡、整个页脚。

     为什么需要它：此前全站只有「白卡片 + 浅灰底 + 橙点缀」三层，
     一页从上到下没有一处深色，于是每一块的视觉权重完全一样 ——
     版面读起来是「一叠等重的白盒子」，这正是「不够大气」的技术成因。
     国际工业品站（Misumi / RS / Keyence / Farnell）无一例外用一块深色
     去锚定首屏与页脚，剩下的部分才敢留白。

     ⚠️ 不要用 --k-ink 系列代替它。--k-ink 是**文字**颜色，深色主题下会翻成浅色；
        这一组是**结构底色**，两个主题下都必须是深的，翻过去页脚就白给白了。 */
  --k-deep:       #0E1519;
  --k-deep-2:     #162127;
  --k-deep-3:     #1F2C34;
  --k-deep-line:  rgba(255,255,255,.13);
  --k-deep-ink:   #F4F7F8;
  --k-deep-ink-2: rgba(255,255,255,.70);
  --k-deep-ink-3: rgba(255,255,255,.46);

  --k-ok:         #17A05B;   --k-ok-soft:   #E6F6EE;
  --k-warn:       #E6A23C;   --k-warn-soft: #FDF4E5;
  --k-crit:       #D93026;   --k-crit-soft: #FCEBEA;

  /* 四张行动卡的底色。它们是**装饰**，不承载语义，
     所以深色主题下只降饱和不换色相 —— 换了就认不出是同一张卡。

     ⚠️ 2026-08-28 重调。原来是橙 / 正红 / 亮蓝 / 天青四支**互不相干的高饱和**渐变，
        四张卡并排时页面上同时出现四个争夺注意力的主色 —— 这是整页里
        「看起来最不专业」的一块，而且它恰好排在首页最后，是访客带走的最后印象。
        高饱和撞色是消费类促销位的语言，B2B 采购看到的是「这家像个做活动的」。

        现在收成**一族**：一支品牌橙（唯一的暖色，留给第一张最重要的卡）
        + 三支深色调（石墨 / 靛蓝 / 深松绿）。四张仍然分得清、仍然认得出，
        但页面的主色只剩橙一个，其余三张退成结构色 —— 与工具条、页脚同一族。
        白字在这四支上的对比度都 ≥ 7:1（原来的天青只有 2.6:1，白字其实是糊的）。 */
  --k-grad-1: linear-gradient(140deg, #FF8A3D 0%, #E85D00 100%);
  --k-grad-2: linear-gradient(140deg, #2C3B45 0%, #0E1519 100%);
  --k-grad-3: linear-gradient(140deg, #3C5C9E 0%, #1B2F5C 100%);
  --k-grad-4: linear-gradient(140deg, #2C7F76 0%, #10504C 100%);

  /* 圆角：4/8 → 6/12。4px 在 14px 正文的密集版式里几乎看不出是圆角，
     只是把直角磨毛了；6/12 才读得出「这是有人调过的」。
     再大就不行了 —— 16px 以上是消费类 App 的语言，参数表放进去会显得轻浮。 */
  --k-radius:     6px;
  --k-radius-lg:  12px;
  /* 阴影带一点冷偏（16,24,32 而不是纯黑）：纯黑阴影压在浅灰底上会发灰发脏，
     带蓝的阴影读起来是「有高度」而不是「有污渍」。两层叠加 ——
     近处那层给边界，远处那层给高度，单层做不出这两件事。 */
  --k-shadow:     0 1px 2px rgba(16,24,32,.05), 0 2px 8px rgba(16,24,32,.05);
  --k-shadow-hov: 0 2px 4px rgba(16,24,32,.06), 0 8px 24px rgba(16,24,32,.10);
  --k-shadow-lg:  0 4px 8px rgba(16,24,32,.06), 0 20px 48px rgba(16,24,32,.16);
  /* 键盘焦点环。全站一处定义 —— 每个组件各写各的焦点样式，
     结果一定是「有几个组件根本没写」，而那几个只有键盘用户会遇到。 */
  --k-focus:      0 0 0 3px rgba(255,106,0,.30);

  /* ── 字体 ────────────────────────────────────────────────────────────
     **全部是系统字体引用：仓库里不带任何字体文件，也不外链任何字体服务。**
     两条理由缺一不可：

     1. 版权。在 CSS 里按名字引用一款字体，用的是**访客机器上已经装好的那一份**，
        不构成分发；只有把字体文件打包进仓库、或用 @font-face 由自己的服务器发出去，
        才涉及授权。所以「微软雅黑」「苹方」这类商业字体出现在下面的列表里是安全的，
        把它们的 .ttf 放进 public/ 就不安全了。
        ⚠️ 以后若要自托管，只能加明确允许 Web 嵌入的开源字体（思源黑体 Source Han Sans、
           Noto Sans SC、HarmonyOS Sans 均为 SIL OFL / Apache），并把 LICENSE 一起入库。
           商业字体一律「引用不打包」。
     2. 性能。默认语言中文、主要客户在中国大陆，fonts.googleapis.com 在那里不可靠，
        一次超时换来整页 FOIT；中文字体动辄 3~10 MB，自托管也要分片。

     ── 中英分两套，而不是一套通吃 ──────────────────────────────────────
     · **字形来源**。中文页面里的拉丁字母（型号 EB-E200、单位 TOPS、价格）应当来自
       与中文字重、x-height 匹配的西文字体，而不是让中文字体自带的半吊子拉丁字形去凑
       —— 那正是中文网页里英文「又宽又飘」的来源。所以中文栈把西文字体排在**中文字体
       之前**：西文字体不含汉字，汉字自然落到后面那一款，两边各取所长。
     · **字距**。雅黑/苹方在 14px 下笔画密，+0.01em 明显更透气；同样的字距加在英文上
       会让单词散开。
     · **平滑**。-webkit-font-smoothing: antialiased 让字变细 —— 对拉丁是「更精致」，
       对汉字是「笔画糊掉」，深色主题下的白字尤其明显。所以中文用 auto，英文才开 antialiased。

     语言由 <html lang> 决定（layout.php 输出 IntlLang::locale()：中文 zh-CN、英文 en），
     下面用 [lang^="en"] 覆盖一组令牌。新增语种按同样方式加一段。 */
  --k-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
            "PingFang SC", "HarmonyOS Sans SC", "Hiragino Sans GB",
            "Microsoft YaHei UI", "Microsoft YaHei",
            "Source Han Sans SC", "Noto Sans SC", "Noto Sans CJK SC", sans-serif,
            "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji";
  /* 等宽只用在**数字与型号**上（价格、库存、日期、货号），不用在正文 ——
     中文没有等宽需求，强行等宽会让中英混排的行看起来一格一格的。
     选型标准只有一条：0 带斜杠、1/l/I 分得开，型号要能被一位不差地抄下来。 */
  --k-mono: ui-monospace, SFMono-Regular, "SF Mono", "Cascadia Mono",
            "Sarasa Mono SC", "JetBrains Mono", "Noto Sans Mono",
            "Roboto Mono", Consolas, "Liberation Mono", monospace;

  /* 中文简体的排版参数（默认值；英文见下面的 [lang^="en"] 覆盖） */
  --k-ls:        .01em;   /* 正文字距 */
  --k-prose-lh:  1.85;    /* 长文行高：汉字方块密，要比拉丁松 */
  --k-head-lh:   1.4;     /* 标题行高 */
  --k-head-ls:   0;
  --k-smooth:    auto;    /* 汉字不做 antialiased，理由见上 */

  /* ⚠️ 2026-08-28：1200 → 1280，槽宽 16 → 24。
     原来的注释写的是「1280 在 1366 的笔记本上顶死了」—— 那句话把**版心**
     和**窗口**算成了一回事。版心 1280 加上两侧各 24 的内边距，占位仍是 1280，
     1366 的屏幕左右各余 43px；真正会顶死的是 1366 上再开第二个窗口，
     而那种用法下浏览器宽度早就掉到断点以下了（≤1080 走单栏）。

     为什么值得加这 80px：首页是「左栏 220 + 12 栅格」，多出来的宽度全部落在
     右侧的面板区 —— 8 栏的首屏促销位从 ~700 涨到 ~760，标题才排得下一行。
     槽宽 16 → 24 是另一半：16px 的左右留白在 1280 的版心里比例失衡，
     内容像是被压到玻璃上。 */
  --k-w:      1280px;
  --k-w-text: 68ch;
  --k-gut:    24px;

  --k-head-h: 60px;
  --k-rail-w: 220px;   /* 左侧品类导航宽度，首页面板栅格与它对齐 */
  /* 版块之间的垂直节奏。写成令牌而不是散落的 20px：
     「大气」在版面上的唯一实现方式就是节奏 —— 而节奏必须一处可调。 */
  --k-sec:    32px;
  --k-gap:    16px;   /* 面板栅格的槽宽 */
}

/* ── 英文站的排版覆盖 ────────────────────────────────────────────────────
   纯拉丁栈：不需要为汉字让位，所以把各平台的界面字体放在最前面
   （Segoe UI Variable 是 Win11 的界面字体，比 Segoe UI 的字重级配得更细）。
   末尾仍留一档中文兜底 —— 英文站上仍会出现中文（公司全称、少数未翻译的数据字段），
   掉到 serif 上会非常突兀。 */
:root:lang(en), [lang^="en"] {
  --k-sans: system-ui, -apple-system, BlinkMacSystemFont,
            "Segoe UI Variable Text", "Segoe UI", Roboto, "Helvetica Neue",
            "Noto Sans", Arial, sans-serif,
            "PingFang SC", "Microsoft YaHei", "Noto Sans SC",
            "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji";
  --k-ls:        0;
  --k-prose-lh:  1.65;
  --k-head-lh:   1.25;
  --k-head-ls:   -.01em;   /* 拉丁大字号收一点字距，标题才不散 */
  --k-smooth:    antialiased;

  /* ⚠️ 必须显式声明，且必须是 light 而不是 "light dark"。
     这个属性管的是**浏览器自己画的那部分**：滚动条、下拉箭头、日期选择器、
     <input> 的默认背景、表单控件的焦点环。
     不声明的话它默认跟随系统 —— 于是在系统深色的机器上会出现最难看的那种组合：
     页面是我们画的白底，滚动条和下拉框却是浏览器画的黑底。
     站点已经决定默认浅色（见下面那段注释），这里就要把浏览器一起按住。 */
  color-scheme: light;
}

/* 深色主题。工业现场显示器常年高亮度，必须让用户能压暗。
   ⚠️ 这里只重定义令牌值，组件样式一律不写进来 ——
      写进来的颜色在「跟随系统」这个未打标记的状态下不会生效。 */
:root[data-theme="dark"] {
  color-scheme: dark;   /* 用户切到深色时，把滚动条与原生控件一起翻过去 */
  --k-paper:#0F1214; --k-surface:#181C1F; --k-surface-2:#1E2327; --k-surface-3:#262C31;
  --k-line:#2E353A; --k-line-soft:#232A2E;
  --k-ink:#E8EAEB; --k-ink-2:#AAB2B7; --k-ink-3:#7C868C; --k-ink-4:#5A6469;
  --k-brand:#FF8A3D; --k-brand-2:#FFA060; --k-brand-3:#FFB37E;
  --k-brand-soft:#2B1B0E; --k-brand-tint:#20160E;
  --k-price:#FF6B62; --k-price-2:#FF8A82; --k-price-soft:#2C1513;
  --k-blue:#5C9BFF; --k-blue-2:#7FB2FF; --k-blue-soft:#111E33;
  --k-ok:#3FBF7F; --k-ok-soft:#0F2A1D; --k-warn:#D9A441; --k-warn-soft:#2A2113;
  --k-crit:#F0665C; --k-crit-soft:#2C1512;
  --k-shadow:0 1px 4px rgba(0,0,0,.5);
  --k-shadow-hov:0 4px 16px rgba(0,0,0,.6);
  --k-shadow-lg:0 6px 28px rgba(0,0,0,.7);
  /* 结构深色在深色主题下要**比页面底色更深**。
     浅色主题里 --k-deep(#0E1519) 压在 --k-paper(#F5F5F5) 上，对比强烈；
     深色主题里 --k-paper 变成 #0F1214 —— 与 --k-deep 只差 3 个灰阶，
     工具条、首屏与页脚会整个融进背景，页面从「三段式」塌成一整块黑。
     所以这里把它们再往下压一档，反差方向不变。 */
  --k-deep:#06090B; --k-deep-2:#0B1013; --k-deep-3:#151D22;
}
/* ⚠️ 2026-08-28：**刻意不再有 @media (prefers-color-scheme: dark) 这一段。**
   以前这里有一份与上面完全相同的令牌覆盖，作用是「系统是深色就自动跟随」。
   删掉它是产品决定，不是遗漏：

     · 这是一个**品牌站**。首屏是品牌的第一印象，而「第一印象长什么样」
       不该由访客机器上一个与本站无关的开关决定 —— 同一条推广链接，
       甲看到的是白底橙字、乙看到的是黑底，对外投放物料没法做。
     · 中国大陆 B2B 采购方的办公机器大量是系统级深色（尤其是 Windows 11 默认
       跟随「深色应用模式」的那批），自动跟随的实际结果是**多数人进站即深色**。
     · 深色主题本身要留 —— 工业现场显示器常年高亮度，用户需要能压暗。
       但那是**用户按了按钮**之后的事，走 :root[data-theme="dark"]。

   所以现在的规则只有一条：**默认浅色；深色仅在用户显式切换后生效并被记住。**
   恢复跟随系统的话，只需把这段注释换回一份 :root:not([data-theme="light"])
   的令牌覆盖 —— 但请先确认上面三条理由是不是都不成立了。 */

/* ── 重置 ────────────────────────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration:.01ms !important; transition-duration:.01ms !important; }
}
body {
  margin: 0;
  /* 明确画底色：直出页面不给 body 上色会借用宿主底色 */
  background: var(--k-paper);
  color: var(--k-ink);
  font-family: var(--k-sans);
  font-size: 14px;      /* 中文密集布局的基准字号，不是 16 */
  line-height: 1.6;
  letter-spacing: var(--k-ls);
  -webkit-font-smoothing: var(--k-smooth);
  /* ⚠️ 这里**刻意不写 font-synthesis**。合成粗体确实难看，但把它关掉的前提是
     字体族里真的有 Bold 字重 —— 而这是一份系统字体栈，最终用哪一款取决于
     访客装了什么。真关掉的话，在缺 Bold 的机器上标题会退成正常字重，
     「标题看不出是标题」比「粗体是合成的」严重得多。 */
}
img, svg, video { max-width: 100%; height: auto; display: block; }
a { color: var(--k-ink); text-decoration: none; }
/* ⚠️ 全站唯一的键盘焦点样式，写在重置层。
   :focus-visible 而不是 :focus —— 后者会让**鼠标点击**也留下一圈框，
   于是下一个人为了「点按钮时那圈难看的线」把 outline:none 写进组件里，
   键盘用户从此在这个站上完全看不到自己在哪。这是无障碍最常见的死法。
   两层：outline 负责在任何底色上都可见，box-shadow 负责好看。 */
:focus-visible {
  outline: 2px solid var(--k-brand);
  outline-offset: 2px;
  border-radius: var(--k-radius);
}
.k-btn:focus-visible, .k-input:focus-visible, .k-select:focus-visible, .k-textarea:focus-visible {
  outline-offset: 1px; box-shadow: var(--k-focus);
}
a:hover { color: var(--k-brand); }
h1, h2, h3, h4 {
  margin: 0; font-weight: 600;
  line-height: var(--k-head-lh); letter-spacing: var(--k-head-ls);
  /* text-wrap: balance 让多行标题的每一行长度接近，中文标题受益尤其明显；
     word-break: keep-all 保证中文不从词中间断开（英文仍在空格处正常换行）。 */
  text-wrap: balance; word-break: keep-all;
}
p { margin: 0 0 .8em; }
ul, ol { margin: 0; padding: 0; }
li { list-style: none; }
table { border-collapse: collapse; }
button, input, select, textarea { font: inherit; color: inherit; }
:focus-visible { outline: 2px solid var(--k-brand); outline-offset: 2px; border-radius: 2px; }
.k-skip { position: absolute; left: -9999px; top: 0; z-index: 300; background: var(--k-brand); color: #fff; padding: 10px 16px; }
.k-skip:focus { left: 0; }

/* ── 布局原语 ────────────────────────────────────────────────────────────── */
.k-wrap { max-width: var(--k-w); margin: 0 auto; padding-inline: var(--k-gut); }
.k-wrap-narrow { max-width: 900px; margin: 0 auto; padding-inline: var(--k-gut); }
.k-prose { max-width: var(--k-w-text); line-height: var(--k-prose-lh); }
.k-stack { display: flex; flex-direction: column; }
.k-row { display: flex; align-items: center; }
.k-gap-4{gap:4px} .k-gap-8{gap:8px} .k-gap-12{gap:12px}
.k-gap-16{gap:16px} .k-gap-24{gap:24px} .k-gap-32{gap:32px}
.k-grow { flex: 1 1 auto; min-width: 0; }
.k-section { padding-block: var(--k-sec); }
.k-scroll-x { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.k-hide { display: none !important; }
@media (max-width: 900px){ .k-hide-md{ display:none !important } }
@media (max-width: 640px){ .k-hide-sm{ display:none !important } }

/* ── 排版 ────────────────────────────────────────────────────────────────── */
/* 眉标（栏目上方那一行小字）。它必须一眼被读成「标签」而不是「一句很小的话」，
   字距是唯一不靠颜色做到这件事的手段。

   ⚠️ 2026-08-28：中文默认**不再用等宽体**。原来整条规则是
   `font-family: var(--k-mono); letter-spacing:.16em; text-transform:uppercase`——
   这三样是为拉丁写的，套在汉字上是三重灾难：
     · 等宽体里的汉字要么退到系统兜底字体（与正文不是同一款），要么被拉成方格；
     · .16em 字距加在方块字之间，「专注 AI 硬件」会读成「专 注  A I  硬 件」；
     · uppercase 对汉字无效，只把中间夹的英文单词变形。
   现在：中文走无衬线 + 字重 600 + 克制的 .08em；
   拉丁在下面 [lang^="en"] 那段里恢复等宽与大字距 —— 那里它是对的。 */
.k-eyebrow { font-family: var(--k-sans); font-size: 11.5px; font-weight: 600; letter-spacing: .08em; color: var(--k-ink-3); }
[lang^="en"] .k-eyebrow { font-family: var(--k-mono); font-size: 11px; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; }
/* ⚠️ 2026-08-28：标题字阶整体上调一档（24/18/15 → 30/21/16）。
   正文仍然是 14px —— 密集版式的正文不能动，动了每屏能装的信息量就掉了。
   要放大的是**层级差**：原来 h1 只比正文大 10px，扫版面时「哪里是标题」
   要靠加粗去分辨，而加粗在中文里本来就不明显（很多系统字体没有真 Bold）。
   30 / 21 / 16 / 14 这四档，隔着一米看屏幕也分得出来。 */
.k-h1 { font-size: 30px; font-weight: 600; line-height: var(--k-head-lh); letter-spacing: var(--k-head-ls); }
.k-h2 { font-size: 21px; font-weight: 600; line-height: var(--k-head-lh); letter-spacing: var(--k-head-ls); }
.k-h3 { font-size: 16px; font-weight: 600; }
.k-lede { color: var(--k-ink-2); font-size: 15px; max-width: var(--k-w-text); line-height: var(--k-prose-lh); }
.k-muted { color: var(--k-ink-3); }
.k-num { font-family: var(--k-mono); font-variant-numeric: tabular-nums; }
.k-sr { position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; }

/* 栏目头：左标题 + 右「更多 ›」。整站所有卡片共用这一个，
   而不是每块内容各写一套 —— 旧站就是各写各的，没有两处间距一样。 */
.k-panel-head {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 14px 18px; border-bottom: 1px solid var(--k-line-soft);
}
.k-panel-head h2, .k-panel-head h3 {
  font-size: 16.5px; font-weight: 600; letter-spacing: .3px;
  /* 标题左侧那条 3px 的品牌色短竖线。整站几十个栏目头共用同一个组件，
     所以这一笔加一次就到处都有 —— 这是「品牌化」性价比最高的一处：
     它不占地方、不抢注意力，但每一块内容的起点都带上了品牌色。
     用伪元素而不是让模板多写一个 <i>：模板里一个字都不用改。 */
  display: inline-flex; align-items: center; gap: 9px;
}
.k-panel-head h2::before, .k-panel-head h3::before {
  content: ""; width: 3px; height: 15px; border-radius: 2px;
  background: var(--k-brand); flex: 0 0 auto;
}
.k-panel-more { font-size: 12.5px; color: var(--k-brand); display: inline-flex; align-items: center; gap: 2px; white-space: nowrap; }
.k-panel-more:hover { color: var(--k-brand-2); }
.k-panel-more::after { content: "\203A"; font-size: 15px; line-height: 1; }

/* ── 按钮 ────────────────────────────────────────────────────────────────── */
.k-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  /* 2026-08-28：7/16 → 9/18。原来的按钮高 30px，在 14px 正文旁边显得「细」，
     而按钮是页面上唯一一个「越敦实越可信」的元素 —— 它承诺的是点下去会发生事。 */
  padding: 9px 18px; border-radius: var(--k-radius); border: 1px solid transparent;
  font-size: 13.5px; font-weight: 500; line-height: 1.4; cursor: pointer;
  background: var(--k-surface-3); color: var(--k-ink);
  transition: background .15s, border-color .15s, color .15s, box-shadow .15s, transform .15s;
  white-space: nowrap;
}
.k-btn:hover { background: var(--k-line); color: var(--k-ink); }
/* 主 CTA 带一层同色投影。这不是装饰 —— 纯色块按钮贴在白底上是「平的」，
   一层橙色的低透明投影让它从纸面上浮起来，这是主按钮与次按钮之间
   除了颜色以外的第二重区分（色盲用户只能靠这一重）。 */
.k-btn-primary { background: var(--k-brand); color: #fff; box-shadow: 0 1px 2px rgba(232,93,0,.24), 0 4px 12px rgba(232,93,0,.20); }
.k-btn-primary:hover { background: var(--k-brand-2); color: #fff; box-shadow: 0 2px 4px rgba(232,93,0,.26), 0 8px 20px rgba(232,93,0,.26); transform: translateY(-1px); }
.k-btn-primary:active { transform: none; }
/* 强调按钮 = 会花钱或产生商务往来的动作：加购、立即订购、提交询价。
   到处都是它的时候，它就不再是强调。 */
.k-btn-signal { background: var(--k-price); color: #fff; }
.k-btn-signal:hover { background: var(--k-price-2); color: #fff; }
.k-btn-ghost { background: var(--k-surface); border-color: var(--k-line); color: var(--k-ink-2); }
.k-btn-ghost:hover { background: var(--k-surface-2); border-color: var(--k-brand); color: var(--k-brand); }
.k-btn-lg { padding: 13px 30px; font-size: 15px; }
.k-btn-sm { padding: 5px 11px; font-size: 12px; }
.k-btn-block { width: 100%; }
.k-btn[disabled], .k-btn[aria-disabled="true"] { opacity: .5; cursor: not-allowed; }
.k-btn-pill { border-radius: 999px; padding: 6px 20px; border: 1px solid rgba(255,255,255,.85); background: transparent; color: #fff; font-size: 13px; }
.k-btn-pill:hover { background: rgba(255,255,255,.16); color: #fff; }

/* ── 表单 ────────────────────────────────────────────────────────────────── */
.k-field { display: flex; flex-direction: column; gap: 5px; }
.k-label { font-size: 13px; color: var(--k-ink-2); }
.k-label .k-req { color: var(--k-price); margin-left: 2px; }
.k-input, .k-select, .k-textarea {
  width: 100%; padding: 9px 12px; border: 1px solid var(--k-line);
  border-radius: var(--k-radius); background: var(--k-surface); color: var(--k-ink);
  font-size: 13.5px; transition: border-color .15s, box-shadow .15s;
}
.k-input:focus, .k-select:focus, .k-textarea:focus { outline: none; border-color: var(--k-brand); box-shadow: var(--k-focus); }
.k-input::placeholder, .k-textarea::placeholder { color: var(--k-ink-4); }
.k-textarea { min-height: 96px; resize: vertical; line-height: 1.6; }
.k-help { font-size: 12px; color: var(--k-ink-3); }
.k-error { font-size: 12px; color: var(--k-crit); }
.k-form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 14px; }
.k-hp { position: absolute; left: -9999px; opacity: 0; height: 0; width: 0; }

.k-qty { display: inline-flex; border: 1px solid var(--k-line); border-radius: var(--k-radius); overflow: hidden; background: var(--k-surface); }
.k-qty button { width: 28px; border: 0; background: var(--k-surface-3); cursor: pointer; color: var(--k-ink-2); font-size: 15px; line-height: 1; }
.k-qty button:hover { background: var(--k-line); color: var(--k-ink); }
.k-qty input { width: 58px; border: 0; text-align: center; background: transparent; font-family: var(--k-mono); font-variant-numeric: tabular-nums; font-size: 13.5px; }
.k-qty input:focus { outline: none; }

/* ── 标签 / 状态 ─────────────────────────────────────────────────────────── */
.k-tag { display: inline-flex; align-items: center; gap: 4px; padding: 1px 6px; border-radius: 2px; font-size: 11.5px; line-height: 18px; background: var(--k-surface-3); color: var(--k-ink-2); white-space: nowrap; }
.k-tag-brand  { background: var(--k-brand-soft);  color: var(--k-brand); }
.k-tag-ok     { background: var(--k-ok-soft);     color: var(--k-ok); }
.k-tag-warn   { background: var(--k-warn-soft);   color: var(--k-warn); }
.k-tag-crit   { background: var(--k-crit-soft);   color: var(--k-crit); }
.k-tag-signal { background: var(--k-price-soft);  color: var(--k-price); }
.k-tag-blue   { background: var(--k-blue-soft);   color: var(--k-blue); }
.k-tag-mono   { font-family: var(--k-mono); letter-spacing: .02em; }
/* 实心角标，压在商品图左上角：买赠 / 新品 / 直供 */
.k-tag-solid  { background: var(--k-brand); color: #fff; border-radius: 2px 0 6px 0; padding: 2px 7px; font-size: 11px; }

.k-stock { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; }
.k-stock::before { content: ""; width: 7px; height: 7px; border-radius: 50%; flex: 0 0 auto; }
.k-stock-in::before  { background: var(--k-ok); }      .k-stock-in  { color: var(--k-ok); }
.k-stock-low::before { background: var(--k-warn); border-radius: 1px; transform: rotate(45deg); }
.k-stock-low         { color: var(--k-warn); }
.k-stock-out::before { background: var(--k-ink-3); border-radius: 1px; }
.k-stock-out         { color: var(--k-ink-3); }
.k-stock-rfq::before { background: var(--k-blue); border-radius: 0; clip-path: polygon(50% 0, 100% 100%, 0 100%); }
.k-stock-rfq         { color: var(--k-blue); }

/* ── 顶栏 ────────────────────────────────────────────────────────────────── */
/* 三层：工具条（细）→ 主栏（Logo + 搜索 + 购物车）→ 导航条（全部分类 + 主入口）。
   导航必须服务端直出 —— JS 渲染的导航等于爬虫眼里每个页面都是孤岛，
   几万个产品页只能靠 sitemap 被发现，站内权重完全传不下去。 */
.k-head { background: var(--k-surface); }

/* ── 工具条 ──────────────────────────────────────────────────────────────
   ⚠️ 2026-08-28：浅灰底 → 结构深色。这是整次改版里**单笔收益最大**的一处。

   原来它是 #FAFAFA 底 + #999 小字，压在 #FFF 的主栏上面 —— 两者相差不到 3%
   亮度，实际效果是「顶栏上方有一条说不清是什么的浅色带」。
   换成深色之后：① 页面从第一像素起就有一条锚，整个顶栏被它压住，
   显得稳；② 深色带是国际工业品站（RS / Farnell / Misumi）的通行开局，
   中文用户对它也不陌生（京东企业购、震坤行同样是深色工具条）；
   ③ 币种、语言这类「不常用但必须能找到」的功能放在深色带里最合适 ——
   它们从此不再与主栏的搜索框争夺注意力。

   ⚠️ 里面所有颜色走 --k-deep-* 而不是 --k-ink-*：这块在深浅两个主题下
      **都是深的**，用文字色令牌会让它在深色主题下翻成浅色。 */
.k-head-util { background: var(--k-deep); font-size: 12px; color: var(--k-deep-ink-3); }
.k-head-util .k-wrap { display: flex; align-items: center; gap: 16px; height: 38px; }
/* ⚠️ 这条不是可有可无的。工具条挂着 .k-scroll-x（横向滚），但**横向滚的前提是
   里面的东西不折行** —— 少了这一条，390px 的手机上「您好，欢迎光临」会折成两行、
   「简体中文」被压成竖排的「体中」，整条工具条从 38px 撑到 76px。
   flex item 默认可以收缩到内容宽度以下（min-width:auto 只对 overflow 可见时生效），
   所以要同时按住 flex 与 white-space 两处。 */
.k-head-util .k-wrap > * { flex: 0 0 auto; white-space: nowrap; }
.k-head-util .k-wrap > .k-grow { flex: 1 1 auto; }
.k-head-util a { color: var(--k-deep-ink-3); transition: color .15s; }
.k-head-util a:hover { color: #fff; text-decoration: none; }
.k-head-util .k-lang { margin-left: 4px; }
.k-head-util .k-sep { width: 1px; height: 12px; background: var(--k-deep-line); }
/* 币种是一个原生 <select>（它必须是原生的：手机上原生选择器是最好用的那个）。
   原生控件不吃我们的令牌，所以这里逐条按住 —— 不按的话深色带里会开一个白洞。 */
.k-head-util .k-select {
  width: auto; padding: 3px 8px; height: 24px;
  background: rgba(255,255,255,.07); border-color: var(--k-deep-line);
  color: var(--k-deep-ink-2); font-size: 12px;
}
.k-head-util .k-select:hover { background: rgba(255,255,255,.13); color: #fff; }
/* ⚠️ appearance:none 是**必须的**，不是为了好看。
   Chromium 在 appearance:auto 下用自己的控件皮肤画 <select> 的底 ——
   我们设的 background 被计算出来了（devtools 里看得到），但画面上仍是浅色控件，
   于是深色工具条右上角开了一个白洞。踩过一次，写在这里。
   关掉原生外观就必须自己补下拉箭头：用内联 SVG 的 data URI，
   不引外部图片（这份 CSS 在关键渲染路径上，不该再多一个请求）。 */
.k-head-util .k-select {
  -webkit-appearance: none; appearance: none;
  padding-right: 24px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23ffffff' stroke-opacity='.55' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 8px center;
  /* 原生下拉**展开后**的那张菜单由系统绘制，底色跟随 color-scheme。
     这块是深的，所以在这里单独翻成 dark，否则展开的是白底菜单配浅灰字。 */
  color-scheme: dark;
}

/* ⚠️ 2026-08-27：这一行原来是 height:78px + align-items:center，看起来没问题，
   实际 LOGO、搜索框、购物车三样**不在同一条水平线上**。原因是热搜词那一行
   （.k-search-hot）在 .k-search 内部、参与布局，把这个 flex item 的高度顶到了
   ~59px（36 的输入框 + 6 的间距 + 17 的词行）。align-items:center 于是让购物车
   对齐的是「输入框 + 热搜词」这一整块的中线 —— 比输入框自己的中线低了 11px。

   修法：把热搜词移出常规流（绝对定位挂在搜索框正下方）。这样 .k-search 的高度
   回到 36px，三样东西对齐的就是同一条线。行高相应从 78 提到 84，给下方的热搜词
   留出位置。窄屏（≤900）搜索框整条换行，那里必须改回常规流，否则热搜词会压住下面。 */
/* ⚠️ 高度写成 padding 而不是 height：热搜词那一行是绝对定位挂在搜索框下方的
   （见下面 .k-search-hot），它不占常规流高度，所以下边距必须由容器的
   padding-bottom 让出来。上一版用 height:84px，算下来热搜词底边落在 83px，
   离导航条只剩 1px —— 两行字几乎贴在一起。
   2026-08-28 重算（搜索框与按钮从 36 升到 42、LOGO 从 38 升到 44）：
   上 20 + 内容 44 + 下 34 = 98，热搜词底边约 86，与导航条之间留 12px。
   改这三个数字时把这段算术一起改，别只改一个。 */
.k-head-main .k-wrap { display: flex; align-items: center; gap: 32px; height: auto; padding-block: 20px 34px; }
.k-logo { display: inline-flex; align-items: center; gap: 10px; flex: 0 0 auto; }
/* ⚠️ 高度定死、**宽度自适应**。原来写的是 width:38px;height:38px —— 对内置的
   方形字标没问题，但后台图位「国际站 LOGO」要的是一张 4:1 的横版标（槽位说明里
   写的就是「高 ≥ 80，宽高比 ≤ 5:1」）。一旦甲方传了真正的横版 LOGO，
   它会被压进 38×38 的方框里挤成一团 —— 而且不会有任何报错。
   模板里的 width/height 属性保留（占位防抖），由这里覆盖成自适应。 */
.k-logo { gap: 12px; }
.k-logo-mark { height: 44px; width: auto; max-width: 200px; object-fit: contain; flex: 0 0 auto; }
.k-logo-txt { display: flex; flex-direction: column; gap: 3px; line-height: 1.05; }
/* ⚠️ 2026-08-28：字标由**纯橙**改为「橙 + 墨」两段。
   原来整个「KIES铠石」四个字全是橙色 —— 站名于是和搜索按钮、分类块同色，
   读起来像一个按钮而不像一个名字。现在中文品牌名走墨色（它是名字），
   拉丁 KIES 保留品牌橙（它是标识），两者靠 <b> 里的字符顺序天然分段 ——
   模板一个字都不用改，靠的是下面 :first-letter 之外的另一条路：
   整块给墨色，再用 .k-logo-txt b 的 background-clip 渐变在前 4 个字符上着色
   做不到（CSS 没有「前 N 个字符」选择器）。所以这里的做法是：
   **整块墨色 + 字重 700 + 字距收紧**，橙色让给 LOGO 图标本身。
   这比"半橙半墨"更稳 —— 它不依赖品牌名的字符构成，甲方改名也不会错位。 */
.k-logo-txt b { font-size: 23px; font-weight: 700; letter-spacing: .04em; color: var(--k-ink); }
.k-logo-txt span { font-size: 11px; color: var(--k-ink-3); letter-spacing: .08em; }
.k-logo:hover .k-logo-txt b { color: var(--k-brand); }
/* 内置占位字标（甲方没传 LOGO 时）走品牌橙。它是图形标，橙色在这里是对的。 */
.k-logo > svg.k-logo-mark { color: var(--k-brand); }

/* 搜索：AI 自然语言选型与关键词检索共用一个入口。
   两个搜索框会让人不知道该用哪个，而这类站的搜索是最主要的找货方式。 */
/* ⚠️ 2026-08-27：搜索框放宽到 640。这是一个**以搜索为主要找货方式**的站，
   在 1200 的容器里给搜索 560、然后把剩下 200 多像素空在最右边，是把版面浪费在了
   最不需要它的位置上。 */
.k-search { flex: 1 1 auto; max-width: 680px; position: relative; }
/* ⚠️ 2026-08-28：外框从「2px 品牌橙」改为「1.5px 墨线 + 聚焦时才变橙」。
   常驻的 2px 橙框是中文低端商城最典型的一笔 —— 搜索框本身并不需要被强调，
   它已经是版面上最大的一个控件了；真正需要橙色的是它右边那个按钮。
   常驻橙框的代价是：整条顶栏永远有一个不会消失的橙色矩形，
   于是「橙色 = 现在该看这里」这个约定失效。
   聚焦时变橙 + 焦点环，反而让「我正在搜索」这件事第一次有了视觉反馈。 */
.k-search-box {
  display: flex; border: 1.5px solid var(--k-ink-4); border-radius: var(--k-radius);
  overflow: hidden; background: var(--k-surface); transition: border-color .15s, box-shadow .15s;
}
.k-search-box:hover { border-color: var(--k-ink-3); }
.k-search-box:focus-within { border-color: var(--k-brand); box-shadow: var(--k-focus); }
.k-search-box input { flex: 1 1 auto; min-width: 0; height: 42px; padding: 0 14px; border: 0; background: transparent; font-size: 14px; color: var(--k-ink); }
.k-search-box input:focus { outline: none; }
.k-search-box input::placeholder { color: var(--k-ink-4); }
.k-search-box button { flex: 0 0 auto; height: 42px; padding: 0 24px; border: 0; background: var(--k-brand); color: #fff; font-size: 14px; font-weight: 500; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; transition: background .15s; }
.k-search-box button:hover { background: var(--k-brand-2); }
/* 「AI 选型」原来是**亮蓝**实心块，紧挨着橙色的「搜索」——
   一个 20px 高的空间里两个高饱和主色贴在一起，是整个顶栏最刺眼的地方，
   而且两个按钮谁主谁次完全读不出来。改成结构深色：它与「搜索」明确分主次
   （橙是主），同时深色块本身就带「这是更高级的那个」的暗示 ——
   AI 入口要的正是这个语气，不是更亮。 */
.k-search-box .k-search-ai { background: var(--k-deep); }
.k-search-box .k-search-ai:hover { background: var(--k-deep-3); }
/* 热搜词：直出的真链接，是长尾词进站的一条通道 */
/* 绝对定位挂在搜索框下方：它不能参与 .k-search 的高度计算，否则顶栏三样东西
   就不在同一条线上（见 .k-head-main 的注释）。窄屏在媒体查询里改回常规流。 */
.k-search-hot { position: absolute; top: calc(100% + 8px); left: 0; right: 0; display: flex; gap: 12px; font-size: 12px; color: var(--k-ink-3); flex-wrap: wrap; overflow: hidden; max-height: 18px; }
.k-search-hot a { color: var(--k-ink-3); }
.k-search-hot a:hover { color: var(--k-brand); }

/* margin-left:auto 是这一行的关键：没有它，flex 的剩余空间会全部堆在
   最后一个元素**之后**，购物车按钮于是停在版心中间，右边空一大块。 */
.k-head-actions { display: flex; align-items: center; gap: 14px; flex: 0 0 auto; margin-left: auto; }

/* 服务热线。中文 B2B 顶栏的标配，而且是真的转化入口 —— 相当一部分采购看到号码
   直接打过来。号码用等宽体：它是要被人照着按的，0/O、1/l 不能看错。 */
.k-head-tel { display: inline-flex; align-items: center; gap: 9px; flex: 0 0 auto; }
.k-head-tel svg { width: 22px; height: 22px; flex: 0 0 auto; color: var(--k-brand); }
.k-head-tel i { display: block; font-style: normal; font-size: 11px; line-height: 1.3; color: var(--k-ink-3); }
/* ⚠️ 2026-08-28：号码由**品牌橙 18px** 改为墨色 17px。
   一个橙色的大号码钉在顶栏右上角，是「区域性小商贸公司」最强的一个视觉信号 ——
   国际客户读到的不是「方便联系」，是「这家主要靠电话做生意」。
   号码仍然是转化入口，所以字号只降 1px、等宽体保留（它要被人照着按）、
   悬停仍然变橙；变的只是「它默认不喊」。真正该喊的是旁边的搜索与 CTA。 */
.k-head-tel b {
  display: block; font-family: var(--k-mono); font-variant-numeric: tabular-nums;
  font-size: 17px; font-weight: 700; line-height: 1.2; color: var(--k-ink); letter-spacing: -.01em;
}
.k-head-tel i { letter-spacing: .04em; }
.k-head-tel:hover b { color: var(--k-brand); }
/* 窄屏隐藏：它会把搜索框挤没，而页脚里有同一个号码 */
@media (max-width: 1080px) { .k-head-tel { display: none; } }
.k-cart-btn { display: inline-flex; align-items: center; gap: 7px; height: 42px; padding: 0 18px; border: 1px solid var(--k-line); border-radius: var(--k-radius); background: var(--k-surface); font-size: 13.5px; position: relative; transition: border-color .15s, color .15s, background .15s; }
.k-cart-btn:hover { border-color: var(--k-brand); color: var(--k-brand); background: var(--k-brand-tint); }
.k-icon-btn { position: relative; width: 34px; height: 34px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid transparent; border-radius: var(--k-radius); background: transparent; color: var(--k-ink-2); cursor: pointer; }
.k-icon-btn:hover { background: var(--k-surface-3); color: var(--k-brand); }
.k-badge { position: absolute; top: -6px; right: -6px; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: var(--k-price); color: #fff; font-family: var(--k-mono); font-size: 10px; line-height: 16px; text-align: center; }
/* 语言切换。⚠️ 2026-08-28：当前语种原来是**橙底白字**。
   一个 40×20 的橙色实心块坐在顶栏右上角，与主栏的橙色搜索按钮、
   导航条的橙色分类块三点连成一线 —— 橙色被用在了三个完全不同层级的东西上，
   于是它不再指示任何东西。橙色在这个站里只该有一个含义：「按这里会发生事」。
   语言不是那种东西，它是身份标识，用白底深字表达「你现在在这一侧」。 */
.k-lang { display: inline-flex; border: 1px solid var(--k-deep-line); border-radius: var(--k-radius); overflow: hidden; }
.k-lang a { padding: 3px 10px; font-size: 12px; color: var(--k-deep-ink-3); background: transparent; transition: background .15s, color .15s; }
.k-lang a:hover { background: rgba(255,255,255,.10); color: #fff; }
.k-lang a[aria-current="true"] { background: #fff; color: var(--k-deep); font-weight: 600; }

/* 导航条：左边是「全部分类」的固定位（首页常驻展开、内页悬停展开），右边是主入口 */
/* ── 顶栏渠道下拉（微信商城 / App 下载）──────────────────────────────────
   <details>/<summary>：开合是原生行为，没有 JS 也能展开。
   ⚠️ summary 用了 .k-icon-btn（和主题切换同一个外观），所以要去掉它的默认三角，
      否则按钮里会多出一个小箭头把图标挤歪。 */
.k-hdrop { position: relative; display: inline-flex; }
.k-hdrop > summary { list-style: none; }
.k-hdrop > summary::-webkit-details-marker { display: none; }
.k-hdrop > summary::marker { content: ""; }
.k-hdrop[open] > summary { background: var(--k-surface-3); color: var(--k-brand); }
.k-hdrop-panel {
  position: absolute; top: calc(100% + 8px); right: 0; z-index: 50;
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px;
  width: min(340px, calc(100vw - 32px)); padding: 12px;
  background: var(--k-surface); border: 1px solid var(--k-line);
  border-radius: var(--k-radius-lg); box-shadow: var(--k-shadow-lg);
}
.k-hdrop-item { display: flex; flex-direction: column; align-items: center; gap: 5px; text-align: center; }
.k-hdrop-qr {
  width: 96px; height: 96px; display: flex; align-items: center; justify-content: center;
  background: var(--k-surface-2); border: 1px solid var(--k-line); border-radius: var(--k-radius); overflow: hidden;
}
.k-hdrop-qr img { width: 100%; height: 100%; object-fit: contain; display: block; }
.k-hdrop-qr svg { width: 52px; height: 52px; color: var(--k-ink-4); }
.k-hdrop-qr svg rect { fill: none; stroke: currentColor; stroke-width: 2.4; }
.k-hdrop-qr svg path { fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; }
.k-hdrop-item > b { font-size: 13px; font-weight: 600; color: var(--k-ink); }
.k-hdrop-item > i { font-style: normal; font-size: 11.5px; color: var(--k-ink-3); }
.k-hdrop-item > a { font-size: 12px; color: var(--k-brand); }
.k-hdrop-item.is-soon .k-hdrop-qr { border-style: dashed; }
.k-hdrop-soon {
  padding: 1px 6px; border-radius: 2px;
  background: var(--k-warn-soft); color: var(--k-warn) !important; font-size: 11px;
}

/* 导航条吸顶。这类站的列表页动辄几屏，导航一旦滚出去，换品类就只能滚回顶部。
   只吸导航这一条（不吸整个顶栏）：工具条与搜索行加起来 110px，全吸会吃掉
   小屏上三分之一的可视高度。z-index 20 —— 低于提示层（300），高于页面内容。 */
/* ⚠️ 2026-08-28：整条 2px 的品牌橙下边线换成 1px 常规分隔线。
   一条横贯全屏的 2px 橙线是很强的一笔，但它出现在**每一个页面的每一屏**
   （这条是吸顶的），于是橙色变成了背景噪声。
   现在把橙色留给「当前所在的那一项」——同样是橙，但它开始表达信息了。
   吸顶时才加投影（.is-stuck 由不了 JS，改用 position:sticky + 常驻极浅投影）。 */
.k-head-nav {
  background: var(--k-surface); border-bottom: 1px solid var(--k-line);
  position: sticky; top: 0; z-index: 20;
  box-shadow: 0 1px 0 rgba(16,24,32,.03), 0 4px 12px rgba(16,24,32,.04);
}
.k-head-nav .k-wrap { display: flex; align-items: stretch; height: 46px; }
.k-allcat {
  width: var(--k-rail-w); flex: 0 0 auto; display: flex; align-items: center; gap: 9px;
  padding: 0 16px; background: var(--k-brand); color: #fff; font-size: 15px; font-weight: 600;
  letter-spacing: .02em; cursor: pointer; transition: background .15s;
}
.k-allcat:hover { color: #fff; background: var(--k-brand-2); }
/* ⚠️ 英文站上「All product categories」比中文的「全部产品分类」长一倍多，
   在 220px 的固定宽度里会折成两行，把 46px 的导航条撑成 62px ——
   而 .k-allcat 的宽度是 var(--k-rail-w)，与首页左栏严格对齐，**不能加宽**。
   所以这里让它单行 + 溢出省略，并把英文的字号收一档。
   不隐藏、不换措辞：这块是「全部分类」的固定位，文案由 IntlText 统一管。 */
.k-allcat > span, .k-allcat { white-space: nowrap; }
.k-allcat { overflow: hidden; }
.k-allcat > span { overflow: hidden; text-overflow: ellipsis; min-width: 0; }
[lang^="en"] .k-allcat { font-size: 13.5px; letter-spacing: 0; }
.k-nav { display: flex; align-items: stretch; gap: 0; margin-left: 8px; }
/* ⚠️ 整排导航为什么会比左边的橙色块高出约 8px —— 拉伸链断在**两个**地方，
   两条规则缺一不可（第一次只补了 <li> 那一条，页面上看不出任何变化）：

     .k-wrap        display:flex; align-items:stretch; height:40px
       a.k-allcat   flex item        → 被拉满 40px ✅（所以它的文字居中是对的）
       nav.k-grow   flex item        → 被拉满 40px ✅
         ul.k-nav   <nav> 里的普通块 → 高度 auto ≈ 21px  ← 断点 ①
           li       ul 的 flex item  → 只有 21px          ← 断点 ②
             a      display:flex; align-items:center → 只居中了自己那 21px 里的文字

   <a> 内部那句 align-items:center 管不到它自己盒子之外的 19px，所以整排往上偏。
   断点 ① 靠下面给 <nav> 加 display:flex（<ul> 成为 flex item 才会被拉满），
   断点 ② 靠 .k-nav > li 的 display:flex。两条都在，链路才通到底。 */
.k-head-nav .k-wrap > nav { display: flex; }
.k-nav > li { display: flex; }
/* 导航项：当前项 / 悬停项在**下沿**画一条 2.5px 的品牌色短线。
   用伪元素而不是 border-bottom：border 会在悬停时让文字跳 2.5px
   （盒模型变高），伪元素绝对定位不参与布局，文字纹丝不动。
   这一处是全站唯一「橙色横线」的合法用途 —— 它只在一个地方出现，
   所以它才说得清「你在这里」。 */
.k-nav > li > a {
  position: relative; display: flex; align-items: center; padding: 0 17px;
  font-size: 14.5px; color: var(--k-ink); white-space: nowrap; transition: color .15s;
}
.k-nav > li > a::after {
  content: ""; position: absolute; left: 17px; right: 17px; bottom: 0; height: 2.5px;
  background: var(--k-brand); border-radius: 2px 2px 0 0;
  transform: scaleX(0); transform-origin: center; transition: transform .18s ease;
}
.k-nav > li > a:hover, .k-nav > li > a[aria-current="page"] { color: var(--k-brand); }
.k-nav > li > a:hover::after, .k-nav > li > a[aria-current="page"]::after { transform: scaleX(1); }
/* ⚠️ 2026-08-28：「新品上架」由**价格红**改为品牌橙 + 一个小圆点。
   价格红在本站的约定是「钱」（见令牌区那段规则），把它用在一个导航项上
   等于告诉用户「这一项与价格有关」—— 它其实是 ?sort=new 的列表页。
   而且红字紧挨着橙色导航，是整条导航条上唯一的撞色。
   小圆点比换颜色更能表达「这里有新东西」，而且不占用任何语义色。 */
.k-nav-hot { color: var(--k-brand) !important; font-weight: 500; }
.k-nav-hot::before {
  content: ""; width: 5px; height: 5px; border-radius: 50%; background: var(--k-price);
  margin-right: 6px; flex: 0 0 auto;
}

/* ── 左侧品类导航（首页常驻，内页悬停）───────────────────────────────────── */
/* 每一行是「大类 + 三个子类关键词」。子类关键词不是装饰 ——
   采购搜的是「工业相机」而不是「机器视觉」，把子类词直出在首页
   等于把长尾词和内链一起铺开了，这是这类站最主要的收录来源。 */
/* ⚠️ 2026-08-28：圆角从「只有下方」改成**四角**，并补 1px 描边。
   原来只圆下方，是为了让它看起来是顶栏那块橙色「全部产品分类」向下的延续。
   但 .k-allcat 与 .k-catrail 在 ≤1080px 是**一起隐藏**的（见本节末尾那条媒体查询）——
   在笔记本与平板宽度上那块橙色根本不存在，「延续」这个前提有一半时间不成立，
   剩下的只是一张顶边是直角、又贴死在导航条上的白块。
   现在它是一张标准面板：四角圆角、1px 描边、与右侧栅格顶边对齐。
   列的连续性靠**宽度对齐**（都是 var(--k-rail-w)）保持，不靠贴住。 */
.k-catrail {
  width: var(--k-rail-w); flex: 0 0 auto;
  background: var(--k-surface); border: 1px solid var(--k-line);
  border-radius: var(--k-radius-lg); overflow: hidden;
  box-shadow: var(--k-shadow);
}
.k-catrail > li { border-bottom: 1px solid var(--k-line-soft); }
.k-catrail > li:last-child { border-bottom: 0; }
.k-catrail-item { display: flex; gap: 10px; padding: 9px 12px; align-items: flex-start; }
.k-catrail-item:hover { background: var(--k-brand-tint); }
.k-catrail-ico { width: 18px; height: 18px; flex: 0 0 auto; margin-top: 2px; color: var(--k-ink-3); }
.k-catrail-item:hover .k-catrail-ico { color: var(--k-brand); }
.k-catrail-txt { min-width: 0; }
.k-catrail-txt b { display: block; font-size: 13.5px; font-weight: 500; color: var(--k-ink); }
.k-catrail-item:hover .k-catrail-txt b { color: var(--k-brand); }
.k-catrail-txt span { display: block; font-size: 11.5px; color: var(--k-ink-3); line-height: 1.5; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 1080px) { .k-catrail, .k-allcat { display: none; } }

/* ── 首页栅格 ────────────────────────────────────────────────────────────── */
/* 第一屏：左品类导航 + 中间促销区 + 右侧服务卡。用 grid 而不是 float，
   高度自适应，任何一块内容为空时不会塌成一团。 */
/* ⚠️ margin-top 不是装饰。这一块此前**紧贴导航条**（0px），
   在 ≤1080px（左栏与橙色块都隐藏）时的表现是：首屏深色卡与「服务与能力」白卡
   直接怼在吸顶导航下沿上，中间一像素空气都没有。
   与页面里其余版块之间的槽宽用同一个令牌 —— 「上下留一样多」是节奏，
   在这里单写一个数字，下次调 --k-gap 时它就会掉队。 */
.k-home-top {
  display: grid; grid-template-columns: var(--k-rail-w) minmax(0,1fr);
  gap: var(--k-gap); align-items: start;
  margin-top: var(--k-gap);
}
@media (max-width: 1080px) { .k-home-top { grid-template-columns: 1fr; } }
.k-panels { display: grid; grid-template-columns: repeat(12, 1fr); gap: var(--k-gap); }
/* ⚠️ 加一条 1px 描边。原来只有阴影 —— 阴影在白底上几乎不可见，
   于是相邻的两张白卡片之间没有任何边界，一排卡片看起来是一整片白。
   描边负责「这是一块」，阴影负责「它浮在纸上」，两者不能互相代替。 */
.k-panel {
  background: var(--k-surface); border: 1px solid var(--k-line);
  border-radius: var(--k-radius-lg); overflow: hidden; box-shadow: var(--k-shadow);
  display: flex; flex-direction: column;
}
.k-panel-body { padding: 16px 18px; flex: 1 1 auto; }
.k-panel-body-flush { padding: 0; }
/* 常用跨度。写成类而不是内联 style，改版时能一处改完 */
.k-sp-3{grid-column:span 3} .k-sp-4{grid-column:span 4} .k-sp-5{grid-column:span 5}
.k-sp-6{grid-column:span 6} .k-sp-7{grid-column:span 7} .k-sp-8{grid-column:span 8}
.k-sp-9{grid-column:span 9} .k-sp-12{grid-column:span 12}
@media (max-width: 1080px){ .k-sp-3,.k-sp-4,.k-sp-5{grid-column:span 6} }
@media (max-width: 720px){ .k-panels > *{grid-column:span 12 !important} }

/* 面板里的小商品对（热卖/低价这类两连图） */
.k-mini-pair { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.k-mini { display: flex; flex-direction: column; gap: 6px; }
.k-mini-img { aspect-ratio: 1/1; background: var(--k-surface-2); border-radius: var(--k-radius); display: flex; align-items: center; justify-content: center; overflow: hidden; }
.k-mini-img img { width: 100%; height: 100%; object-fit: contain; padding: 8px; }
.k-mini-price { display: flex; align-items: baseline; gap: 5px; }
.k-mini-price b { font-family: var(--k-mono); font-variant-numeric: tabular-nums; font-size: 16px; color: var(--k-price); font-weight: 700; }
.k-mini-price del { font-family: var(--k-mono); font-size: 11.5px; color: var(--k-ink-4); }
.k-mini-name { font-size: 12px; color: var(--k-ink-2); line-height: 1.4; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }

/* 要点清单（免费服务 / 征集邀约那类） */
.k-checklist { display: flex; flex-direction: column; gap: 9px; }
.k-checklist li { display: flex; gap: 7px; align-items: flex-start; font-size: 13px; color: var(--k-ink-2); }
.k-checklist svg { width: 15px; height: 15px; flex: 0 0 auto; color: var(--k-brand); margin-top: 2px; }

/* 促销横幅（带轮播点，无 JS 时是一张静态图 + 一条真链接） */
/* ── 首屏 ────────────────────────────────────────────────────────────────
   ⚠️ 2026-08-28 整块重做。原来是「淡蓝底 + 蓝色标题 + 24px 字」，
   高 210px，夹在白卡片中间 —— 它是首页最重要的一块内容，
   在版面上却和旁边那张「服务与能力」列表长得一样重。
   一个没有第一屏的 B2B 首页，访客的第一印象只能由「密密麻麻的分类」决定。

   现在：结构深色 + 品牌橙的光晕 + 一层极淡的工程网格。
   三样东西各有分工 ——
     · 深色：把第一屏从「一叠白卡片」里拔出来，这是「大气」的全部技术内容；
     · 橙光晕：品牌色在这里第一次以**大面积**出现，但它是光不是块，不喊；
     · 网格：1px 的等距线，工业/工程语汇。它必须极淡（.028），
       淡到「说不出哪里有网格，但觉得这块底子是有质感的」为止。
   ⚠️ 网格用 background-image 的两道 linear-gradient，不是图片 ——
      直出页面的关键渲染路径上不该再多一个请求，何况这块要跟着主题变色。 */
.k-promo {
  position: relative; z-index: 0; overflow: hidden;
  border-radius: var(--k-radius-lg);
  background:
    radial-gradient(120% 140% at 88% 8%, rgba(255,106,0,.30) 0%, rgba(255,106,0,0) 58%),
    linear-gradient(135deg, var(--k-deep-3) 0%, var(--k-deep) 62%);
  min-height: 300px; display: flex; flex-direction: column; justify-content: center;
  padding: 38px 40px;
  color: var(--k-deep-ink);
}
.k-promo::before {
  content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background-image:
    linear-gradient(rgba(255,255,255,.028) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.028) 1px, transparent 1px);
  background-size: 44px 44px;
  /* 网格向右下淡出，避免它在文字最密的左上角制造噪点 */
  -webkit-mask-image: linear-gradient(115deg, rgba(0,0,0,.15) 0%, #000 100%);
          mask-image: linear-gradient(115deg, rgba(0,0,0,.15) 0%, #000 100%);
}
.k-promo .k-eyebrow { color: var(--k-brand-3); }
@media (max-width: 900px) { .k-promo { padding: 26px 22px; min-height: 240px; } }
/* 模板里首页 hero 用的是 <h1>（一页只能有一个 h1，这里就是那一个），
   而这条规则原来只写了 h3 —— h1 于是回落到浏览器默认的 2em 粗体，
   在 8 栏宽度里被撑成两行且断在词中间（「…直供，从边 / 缘算力…」）。
   word-break: keep-all 让中文只在标点处断行，不再从词中间劈开。 */
.k-promo h1, .k-promo h2, .k-promo h3 {
  /* 24 → 36。首屏标题是整站唯一一处「可以大」的地方，
     其余全部克制正是为了让这一处敢大。clamp 让它在窄屏自己收，
     不用再写一条媒体查询去追。 */
  font-size: clamp(24px, 2.5vw + 12px, 36px);
  line-height: 1.32; font-weight: 700; color: #fff;
  letter-spacing: var(--k-head-ls);
  word-break: keep-all; max-width: 20em;
  margin: 10px 0 0;
}
.k-promo p { margin: 12px 0 0; font-size: 14.5px; line-height: 1.75; color: var(--k-deep-ink-2); max-width: 44em; }
.k-promo .k-btn { margin-top: 26px; align-self: flex-start; }
/* 深色底上的次按钮：白描边幽灵按钮。用 .k-btn-ghost 的既有类名，
   在这里覆盖 —— 模板不用改，别处的 ghost 按钮不受影响。 */
.k-promo .k-btn-ghost {
  background: rgba(255,255,255,.06); border-color: rgba(255,255,255,.30); color: #fff;
  backdrop-filter: blur(2px);
}
.k-promo .k-btn-ghost:hover { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.55); color: #fff; }
@media (max-width: 640px) {
  /* ⚠️ 窄屏必须放开 word-break。keep-all 的意思是「只在标点处断行」——
     这在 700px 宽的首屏里是对的（中文词组不会被劈成两半），
     但在 390px 的手机上，一个 18 字的分句根本没有标点可断，
     于是它整行溢出容器右边被裁掉，**而且不会出现滚动条**（父级 overflow:hidden）。
     手机上汉字逐字换行本来就是正常排版，这里回到 normal。 */
  .k-promo h1, .k-promo h2, .k-promo h3 { word-break: normal; max-width: none; }
}
.k-promo-dots { position: absolute; left: 22px; bottom: 14px; display: flex; gap: 5px; }
.k-promo-dots i { width: 6px; height: 6px; border-radius: 3px; background: rgba(255,255,255,.35); }
.k-promo-dots i[data-on] { width: 16px; background: var(--k-brand); }

/* 宫格入口（我的订阅那一块）。三列，每格图标 + 名称 */
/* ⚠️ 2026-08-27：原来是「3 栏 + 图标在左」。「我的 KIES」这块在有新闻时是
   k-sp-3（12 栅格里的 3 栏），一格净宽只剩 ~60px，扣掉内边距和 17px 图标后
   留给文字不到 30px —— 中文于是被逐字竖排成一列（「我 / 的 / 订 / 单」）。
   改成「图标在上、文字在下」的方块，并按面板宽度给列数：
   窄面板 2 栏、宽面板（无新闻时的 k-sp-6）3 栏。
   word-break: keep-all 保证中文整词不拆；英文（"Technical documents"）仍在空格处换行。 */
.k-subs { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.k-sp-6 .k-subs  { grid-template-columns: repeat(3, 1fr); }
.k-sp-12 .k-subs { grid-template-columns: repeat(6, 1fr); }
@media (max-width: 640px){ .k-subs{ grid-template-columns: repeat(2,1fr) } }
.k-sub {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 6px; padding: 12px 6px; min-height: 68px;
  border-radius: var(--k-radius); background: var(--k-surface-2);
  font-size: 12.5px; line-height: 1.4; text-align: center; word-break: keep-all;
}
.k-sub:hover { background: var(--k-brand-tint); color: var(--k-brand); }
.k-sub svg { width: 18px; height: 18px; flex: 0 0 auto; color: var(--k-brand); }

/* 情报流（新闻/招标/政策）。日期右对齐、等宽，一屏能扫完 */
.k-intel { display: flex; flex-direction: column; }
.k-intel li { display: flex; gap: 10px; align-items: baseline; padding: 7px 0; font-size: 13px; }
.k-intel li::before { content: ""; width: 4px; height: 4px; border-radius: 50%; background: var(--k-brand); flex: 0 0 auto; transform: translateY(-2px); }
.k-intel a { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--k-ink-2); }
.k-intel a:hover { color: var(--k-brand); }
.k-intel time { flex: 0 0 auto; font-family: var(--k-mono); font-size: 11.5px; color: var(--k-ink-4); }

/* 彩色行动卡（提交商品信息 / 推荐有礼 / 问题反馈 / 提交金点子） */
.k-portals { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--k-gap); }
.k-portal {
  position: relative; overflow: hidden;
  border-radius: var(--k-radius-lg); padding: 26px; color: #fff;
  display: flex; flex-direction: column; gap: 6px; min-height: 172px;
  box-shadow: var(--k-shadow);
  transition: transform .18s ease, box-shadow .18s ease;
}
/* 与首屏同一套工程网格。四张卡与首屏因此认得出是同一族东西，
   而不是「首页最后又出现了四个不知道哪来的色块」。 */
.k-portal::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background-image:
    linear-gradient(rgba(255,255,255,.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.05) 1px, transparent 1px);
  background-size: 34px 34px;
  -webkit-mask-image: linear-gradient(140deg, transparent 30%, #000 100%);
          mask-image: linear-gradient(140deg, transparent 30%, #000 100%);
}
.k-portal > * { position: relative; }
.k-portal:hover { color: #fff; transform: translateY(-3px); box-shadow: var(--k-shadow-hov); }
.k-portal b { font-size: 20px; font-weight: 700; letter-spacing: var(--k-head-ls); }
.k-portal span { font-size: 13px; line-height: 1.7; opacity: .82; }
.k-portal .k-btn-pill { margin-top: auto; align-self: flex-start; }
.k-portal-1 { background: var(--k-grad-1); }
.k-portal-2 { background: var(--k-grad-2); }
.k-portal-3 { background: var(--k-grad-3); }
.k-portal-4 { background: var(--k-grad-4); }
/* 分区标题（我的 KIES 那种居中带装饰线的） */
.k-band-title { display: flex; align-items: center; justify-content: center; gap: 14px; margin-bottom: 6px; }
.k-band-title::before, .k-band-title::after {
  content: ""; width: 72px; height: 1px; flex: 0 0 auto;
  /* 渐变而不是半透明实线：实线两端戛然而止，渐变让它「淡出」，
     这是同一笔装饰线看起来「设计过」与「随手画的」之间的全部差别。 */
  background: linear-gradient(90deg, transparent, var(--k-brand));
}
.k-band-title::after { background: linear-gradient(90deg, var(--k-brand), transparent); }
.k-band-title h2 { font-size: 26px; font-weight: 600; letter-spacing: var(--k-head-ls); }
.k-band-sub { text-align: center; font-size: 13.5px; color: var(--k-ink-3); margin-bottom: 24px; }

/* ── 面包屑 ──────────────────────────────────────────────────────────────── */
/* ⚠️ 2026-08-27：面包屑此前**没有任何容器约束** —— 它是 <main> 之外的一个裸 <nav>，
   于是贴着浏览器左边缘，而全站其它内容都在 1200px 居中的 .k-wrap 里。
   表现就是每一张内页的第一行文字都比正文左移一大截。
   修法是把容器约束写进类本身，而不是去 23 个模板里各包一层 div：
   面包屑在所有模板里都渲染在 .k-wrap **之外**（已逐个确认过），所以不会双重内边距。 */
.k-crumb {
  max-width: var(--k-w); margin-inline: auto; padding-inline: var(--k-gut);
  /* 上边距与首页第一屏用同一个令牌：内页第一行内容与吸顶导航之间的空气
     应该和首页一样多，否则从首页点进内页会有「跳了一下」的感觉。 */
  padding-block: var(--k-gap) 2px; font-size: 12.5px; color: var(--k-ink-3);
}
/* 产品名可能很长，末项要能换行而不是把整行撑出容器 */
.k-crumb [aria-current="page"] { min-width: 0; overflow-wrap: anywhere; }
/* 正文用 .k-wrap-narrow（900px）的页面，面包屑要跟着收窄，否则左边缘对不上 */
.k-crumb-narrow { max-width: 900px; }
.k-crumb ol { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; }
.k-crumb li { display: flex; align-items: center; gap: 5px; }
.k-crumb li + li::before { content: "\203A"; color: var(--k-ink-4); }
.k-crumb a { color: var(--k-ink-3); }
.k-crumb a:hover { color: var(--k-brand); }
.k-crumb [aria-current="page"] { color: var(--k-ink-2); }

/* ── 卡片 ────────────────────────────────────────────────────────────────── */
.k-card { background: var(--k-surface); border-radius: var(--k-radius-lg); box-shadow: var(--k-shadow); }
.k-card-pad { padding: 16px; }

/* 商品卡：图 → 价 → 标题 → 参数读数 → 动作。
   价格排在标题**上面**是中文电商的既有习惯，采购扫的是价格列而不是名称列。
   参数读数区在卡片里而不是折叠起来 —— 硬件采购看的是「多少 TOPS、什么接口、
   几天交货」，不是一张打光漂亮的产品图。 */
.k-grid-products { display: grid; grid-template-columns: repeat(auto-fill, minmax(216px, 1fr)); gap: 12px; }
.k-pcard { display: flex; flex-direction: column; background: var(--k-surface); border: 1px solid transparent; border-radius: var(--k-radius-lg); overflow: hidden; transition: border-color .15s, box-shadow .15s; }
.k-pcard:hover { border-color: var(--k-brand); box-shadow: var(--k-shadow-hov); }
.k-pcard-media { position: relative; aspect-ratio: 1/1; background: var(--k-surface-2); display: flex; align-items: center; justify-content: center; overflow: hidden; }
.k-pcard-media img { width: 100%; height: 100%; object-fit: contain; padding: 12px; }
.k-pcard-flags { position: absolute; left: 0; top: 0; display: flex; flex-direction: column; gap: 3px; align-items: flex-start; }
.k-pcard-body { padding: 10px 12px 12px; display: flex; flex-direction: column; gap: 6px; flex: 1 1 auto; }
.k-pcard-brand { font-family: var(--k-mono); font-size: 11px; letter-spacing: .06em; color: var(--k-ink-3); text-transform: uppercase; }
.k-pcard-title { font-size: 13.5px; font-weight: 400; line-height: 1.45; color: var(--k-ink-2); overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.k-pcard-title a { color: inherit; }
.k-pcard:hover .k-pcard-title a { color: var(--k-brand); }
.k-pcard-pn { font-family: var(--k-mono); font-size: 11.5px; color: var(--k-ink-4); }
.k-spec-readout { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--k-line-soft); border-radius: 3px; overflow: hidden; }
.k-spec-readout > div { background: var(--k-surface-2); padding: 5px 7px; min-width: 0; }
.k-spec-readout dt { font-size: 10px; color: var(--k-ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.k-spec-readout dd { margin: 1px 0 0; font-family: var(--k-mono); font-variant-numeric: tabular-nums; font-size: 12px; font-weight: 600; color: var(--k-ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.k-pcard-foot { margin-top: auto; padding-top: 8px; display: flex; align-items: flex-end; justify-content: space-between; gap: 8px; }
.k-price { display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap; }
.k-price-from { font-size: 11px; color: var(--k-ink-3); }
.k-price-val { font-family: var(--k-mono); font-variant-numeric: tabular-nums; font-size: 19px; font-weight: 700; color: var(--k-price); letter-spacing: -.01em; }
.k-price-was { font-family: var(--k-mono); font-size: 11.5px; color: var(--k-ink-4); text-decoration: line-through; }
.k-price-rfq { font-size: 14px; font-weight: 600; color: var(--k-blue); }
.k-price-unit { font-size: 11px; color: var(--k-ink-3); }

/* ── 列表页 ──────────────────────────────────────────────────────────────── */
.k-layout-list { display: grid; grid-template-columns: var(--k-rail-w) minmax(0,1fr); gap: 12px; align-items: start; }
@media (max-width: 940px) { .k-layout-list { grid-template-columns: 1fr; } }
.k-filter { background: var(--k-surface); border-radius: var(--k-radius-lg); padding: 4px 12px; box-shadow: var(--k-shadow); }
.k-filter-group { border-bottom: 1px solid var(--k-line-soft); padding: 11px 0; }
.k-filter-group:last-child { border-bottom: 0; }
.k-filter-group > summary { cursor: pointer; list-style: none; display: flex; align-items: center; justify-content: space-between; font-size: 13.5px; font-weight: 600; color: var(--k-ink); }
.k-filter-group > summary::-webkit-details-marker { display: none; }
.k-filter-group > summary::after { content: "+"; color: var(--k-ink-3); font-family: var(--k-mono); }
.k-filter-group[open] > summary::after { content: "\2013"; }
.k-filter-opts { display: flex; flex-direction: column; gap: 6px; margin-top: 9px; max-height: 240px; overflow-y: auto; }
.k-filter-opts label { display: flex; align-items: center; gap: 7px; font-size: 12.5px; color: var(--k-ink-2); cursor: pointer; }
.k-filter-opts label:hover { color: var(--k-brand); }
.k-filter-opts input { accent-color: var(--k-brand); }
.k-filter-opts .k-cnt { margin-left: auto; font-family: var(--k-mono); font-size: 11px; color: var(--k-ink-4); }
.k-toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; background: var(--k-surface); border-radius: var(--k-radius-lg); padding: 10px 14px; margin-bottom: 12px; box-shadow: var(--k-shadow); font-size: 13px; }
.k-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.k-chip { display: inline-flex; align-items: center; gap: 5px; padding: 2px 5px 2px 9px; border: 1px solid var(--k-brand); border-radius: 2px; background: var(--k-brand-soft); font-size: 12px; color: var(--k-brand); }
.k-chip a { color: inherit; font-size: 13px; line-height: 1; padding: 0 2px; }

.k-pager { display: flex; justify-content: center; gap: 5px; margin-top: 22px; flex-wrap: wrap; }
.k-pager a, .k-pager span { min-width: 32px; height: 32px; padding: 0 9px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--k-line); border-radius: var(--k-radius); font-family: var(--k-mono); font-size: 12.5px; color: var(--k-ink-2); background: var(--k-surface); }
.k-pager a:hover { border-color: var(--k-brand); color: var(--k-brand); }
.k-pager [aria-current="page"] { background: var(--k-brand); border-color: var(--k-brand); color: #fff; }
.k-pager .k-pager-gap { border: 0; background: transparent; }

/* ── 产品详情 ────────────────────────────────────────────────────────────── */
.k-pdp { display: grid; grid-template-columns: 400px minmax(0,1fr); gap: 24px; align-items: start; background: var(--k-surface); border-radius: var(--k-radius-lg); padding: 20px; box-shadow: var(--k-shadow); }
@media (max-width: 1024px) { .k-pdp { grid-template-columns: 1fr; } }
.k-gallery-main { aspect-ratio: 1/1; background: var(--k-surface-2); border-radius: var(--k-radius); display: flex; align-items: center; justify-content: center; overflow: hidden; }
.k-gallery-main img { width: 100%; height: 100%; object-fit: contain; padding: 16px; }
.k-gallery-thumbs { display: flex; gap: 7px; margin-top: 9px; flex-wrap: wrap; }
.k-gallery-thumbs button { width: 56px; height: 56px; padding: 3px; border: 1px solid var(--k-line); border-radius: 3px; background: var(--k-surface); cursor: pointer; }
.k-gallery-thumbs button[aria-selected="true"] { border-color: var(--k-brand); }
.k-gallery-thumbs img { width: 100%; height: 100%; object-fit: contain; }

/* 购买盒。B2B 的这一块信息密度必须高 —— 采购要的四个数字（价、起订、交期、库存）全在这儿 */
.k-buybox { display: flex; flex-direction: column; gap: 14px; }
.k-buybox-price { background: var(--k-price-soft); border-radius: var(--k-radius); padding: 14px 16px; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.k-buybox-price .k-price-val { font-size: 30px; }
.k-facts { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1px; background: var(--k-line-soft); border-radius: 3px; overflow: hidden; }
.k-facts > div { background: var(--k-surface-2); padding: 8px 11px; }
.k-facts dt { font-size: 11.5px; color: var(--k-ink-3); }
.k-facts dd { margin: 2px 0 0; font-family: var(--k-mono); font-variant-numeric: tabular-nums; font-size: 13.5px; font-weight: 600; }

/* 阶梯价：B2B 最有说服力的东西。买得多便宜多少，一眼看到 */
.k-tiers { width: 100%; font-size: 12.5px; }
.k-tiers th, .k-tiers td { padding: 6px 10px; border-bottom: 1px solid var(--k-line-soft); text-align: left; }
.k-tiers th { font-size: 11px; color: var(--k-ink-3); font-weight: 400; background: var(--k-surface-2); }
.k-tiers td:last-child, .k-tiers th:last-child { text-align: right; }
.k-tiers td { font-family: var(--k-mono); font-variant-numeric: tabular-nums; }
.k-tiers tr[data-active="1"] td { background: var(--k-brand-tint); color: var(--k-price); font-weight: 700; }

.k-spec-table { width: 100%; font-size: 13px; background: var(--k-surface); }
.k-spec-table caption { text-align: left; font-weight: 600; padding: 12px 0 7px; color: var(--k-ink); }
.k-spec-table th, .k-spec-table td { padding: 8px 12px; border: 1px solid var(--k-line-soft); vertical-align: top; }
.k-spec-table th { width: 30%; font-weight: 400; color: var(--k-ink-3); background: var(--k-surface-2); text-align: left; }
.k-spec-table td { font-family: var(--k-mono); font-variant-numeric: tabular-nums; color: var(--k-ink); }

.k-docs { display: flex; flex-direction: column; gap: 7px; }
.k-doc { display: flex; align-items: center; gap: 11px; padding: 10px 13px; border: 1px solid var(--k-line); border-radius: var(--k-radius); background: var(--k-surface); }
.k-doc:hover { border-color: var(--k-brand); }
.k-doc-kind { font-family: var(--k-mono); font-size: 10.5px; font-weight: 700; padding: 2px 6px; border-radius: 2px; background: var(--k-blue-soft); color: var(--k-blue); flex: 0 0 auto; }
.k-doc-name { flex: 1 1 auto; min-width: 0; font-size: 13px; color: var(--k-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.k-doc-meta { font-family: var(--k-mono); font-size: 11px; color: var(--k-ink-3); flex: 0 0 auto; }

/* 选项卡用锚点而不是 JS：每个分区有自己的锚，可被当作页面片段收录，也能直接分享 */
.k-tabs { display: flex; gap: 0; background: var(--k-surface); border-radius: var(--k-radius-lg) var(--k-radius-lg) 0 0; overflow-x: auto; margin-top: 12px; }
.k-tabs a { padding: 12px 22px; font-size: 14px; color: var(--k-ink-2); white-space: nowrap; border-bottom: 2px solid transparent; }
.k-tabs a:hover { color: var(--k-brand); }
.k-tabs a[aria-current="true"] { color: var(--k-brand); border-bottom-color: var(--k-brand); font-weight: 600; }

/* ── AI 能力 ─────────────────────────────────────────────────────────────── */
/* 「智能化 / AI 化」在这个站上是三件具体的事，不是一句口号：
   ① 自然语言选型；② 一键把参数表复制成模型能读的格式；③ AI 生成询价草稿。
   每一件都放在用户正需要它的位置，而不是塞进一个叫「AI 助手」的浮窗。 */
.k-ai-bar { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 11px 14px; border-radius: var(--k-radius-lg); background: linear-gradient(90deg, var(--k-blue-soft), var(--k-surface)); border: 1px solid var(--k-blue-soft); }
.k-ai-bar .k-ai-ico { color: var(--k-blue); flex: 0 0 auto; }
.k-ai-bar p { margin: 0; font-size: 13px; color: var(--k-ink-2); flex: 1 1 240px; }
/* ⚠️ 与 .k-panel / .k-panel-head 保持同一套盒子度量（描边、内边距、标题左侧的品牌短线）。
   这一块此前是「另写的一套」，于是首页上它比旁边所有面板矮一点、标题也没有那条竖线 ——
   差别小到不会被当成 bug，但正是这种「每块都差一点」累积成「看起来不专业」。 */
.k-ai-panel { background: var(--k-surface); border: 1px solid var(--k-line); border-radius: var(--k-radius-lg); box-shadow: var(--k-shadow); overflow: hidden; }
.k-ai-panel-head { padding: 14px 18px; border-bottom: 1px solid var(--k-line-soft); }
.k-ai-panel-head > :first-child {
  display: inline-flex; align-items: center; gap: 9px;
  font-size: 16.5px; font-weight: 600; letter-spacing: .3px;
}
.k-ai-panel-head > :first-child::before {
  content: ""; width: 3px; height: 15px; border-radius: 2px;
  background: var(--k-brand); flex: 0 0 auto;
}
.k-ai-panel-body { padding: 18px; }
.k-ai-samples { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 10px; }
.k-ai-samples button { padding: 5px 12px; border: 1px solid var(--k-line); border-radius: 999px; background: var(--k-surface); font-size: 12.5px; color: var(--k-ink-2); cursor: pointer; }
.k-ai-samples button:hover { border-color: var(--k-blue); color: var(--k-blue); }
/* 模型给的结果必须标注为建议并给出「联系工程师」的出口。
   选型错了是要赔设备的，界面不能显得比它实际更确定。 */
.k-ai-note { margin-top: 12px; padding-top: 10px; border-top: 1px dashed var(--k-line); font-size: 12px; color: var(--k-ink-3); }

/* ── 交易页 ──────────────────────────────────────────────────────────────── */
.k-layout-checkout { display: grid; grid-template-columns: minmax(0,1fr) 320px; gap: 12px; align-items: start; }
@media (max-width: 940px) { .k-layout-checkout { grid-template-columns: 1fr; } }
.k-summary { position: sticky; top: 12px; background: var(--k-surface); border-radius: var(--k-radius-lg); padding: 16px; box-shadow: var(--k-shadow); }
.k-summary-line { display: flex; justify-content: space-between; gap: 12px; padding: 6px 0; font-size: 13px; color: var(--k-ink-2); }
.k-summary-line .v { font-family: var(--k-mono); font-variant-numeric: tabular-nums; color: var(--k-ink); }
.k-summary-total { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding-top: 11px; margin-top: 7px; border-top: 1px solid var(--k-line); }
.k-summary-total .v { font-family: var(--k-mono); font-variant-numeric: tabular-nums; font-size: 22px; font-weight: 700; color: var(--k-price); }
.k-cart-row { display: grid; grid-template-columns: 76px minmax(0,1fr) auto auto auto; gap: 14px; align-items: center; padding: 14px 0; border-bottom: 1px solid var(--k-line-soft); }
@media (max-width: 720px) { .k-cart-row { grid-template-columns: 60px 1fr; gap: 8px 12px; } }
.k-cart-row img { width: 76px; height: 76px; object-fit: contain; background: var(--k-surface-2); border-radius: 3px; }

/* 支付方式。降级态（线下汇款/PI）不是错误页，是一条正常成交路径，
   所以它长得和其它渠道一样正式，而不是一段红色警告。 */
.k-pay-opts { display: flex; flex-direction: column; gap: 9px; }
.k-pay-opt { display: flex; align-items: flex-start; gap: 11px; padding: 13px; border: 1px solid var(--k-line); border-radius: var(--k-radius); background: var(--k-surface); cursor: pointer; }
.k-pay-opt:has(input:checked) { border-color: var(--k-brand); background: var(--k-brand-tint); }
.k-pay-opt input { margin-top: 3px; accent-color: var(--k-brand); }
.k-pay-opt b { display: block; font-size: 13.5px; }
.k-pay-opt span { font-size: 12px; color: var(--k-ink-3); line-height: 1.5; }

/* 订单状态轨。已完成实心、当前描边、未到空心 —— 形状也编码状态 */
.k-track { display: flex; flex-wrap: wrap; }
.k-track-step { flex: 1 1 108px; position: relative; padding-right: 8px; }
.k-track-step .dot { width: 12px; height: 12px; border-radius: 50%; border: 2px solid var(--k-line); background: var(--k-surface); }
.k-track-step[data-state="done"] .dot { background: var(--k-brand); border-color: var(--k-brand); }
.k-track-step[data-state="now"] .dot { border-color: var(--k-price); box-shadow: 0 0 0 4px var(--k-price-soft); }
.k-track-step .bar { position: absolute; left: 12px; right: 0; top: 5px; height: 2px; background: var(--k-line); }
.k-track-step[data-state="done"] .bar { background: var(--k-brand); }
.k-track-step:last-child .bar { display: none; }
.k-track-step .lb { margin-top: 9px; font-size: 12.5px; color: var(--k-ink-2); }
.k-track-step .tm { font-family: var(--k-mono); font-size: 11px; color: var(--k-ink-4); }

/* ── 提示 / 空态 ─────────────────────────────────────────────────────────── */
.k-note { display: flex; gap: 9px; padding: 11px 13px; border-radius: var(--k-radius); font-size: 13px; line-height: 1.6; }
.k-note-info { background: var(--k-blue-soft); color: var(--k-ink-2); }
.k-note-ok   { background: var(--k-ok-soft);   color: var(--k-ok); }
.k-note-warn { background: var(--k-warn-soft); color: var(--k-warn); }
.k-note-crit { background: var(--k-crit-soft); color: var(--k-crit); }
.k-empty { text-align: center; padding: 48px 20px; color: var(--k-ink-3); }
.k-empty b { display: block; font-size: 15px; color: var(--k-ink-2); margin-bottom: 5px; }

/* ── 枢纽页卡片网格 ──────────────────────────────────────────────────────
   产品线 / 品牌 / 应用场景 / 解决方案 / 知识库 —— 五张枢纽页共用这一组卡片。

   ⚠️ 2026-08-27 补：这两个类此前**只存在于模板里，样式表里一行都没有**。
      后果不是报错，而是那五张页面渲染成一列裸的加粗文字 —— HTML 结构正确、
      链接可点、抓取器也读得到，所以任何自动检查都过得去，只有人打开看才发现。
      同批补的还有 .k-router / .k-router-card（账户中心）与 .k-promo h1（首页 hero）。
      教训写在这里：模板里新写一个类名，必须同时在本文件里落一条规则，
      哪怕只是空的占位 —— 没有规则的类名在页面上是隐形的。 */
.k-cat-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));
  gap: 12px;
}
.k-cat-card {
  display: flex; flex-direction: column; gap: 7px;
  padding: 16px;
  background: var(--k-surface);
  border: 1px solid var(--k-line);
  border-radius: var(--k-radius-lg);
  box-shadow: var(--k-shadow);
  transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
a.k-cat-card:hover {
  border-color: var(--k-brand);
  box-shadow: var(--k-shadow-hov);
  transform: translateY(-1px);
}
/* 标题：categories.php 里 <b> 内嵌 <a>，其余四页整张卡是 <a> —— 两种都要好看 */
.k-cat-card > b { font-size: 15px; font-weight: 600; color: var(--k-ink); line-height: 1.45; word-break: keep-all; }
.k-cat-card > b > a { color: inherit; }
.k-cat-card > b > a:hover { color: var(--k-brand); }
a.k-cat-card:hover > b { color: var(--k-brand); }
.k-cat-card > p { margin: 0; font-size: 12.5px; line-height: 1.7; color: var(--k-ink-2); }
/* 二级分组：不折叠、不省略 —— 这些链接是二级分类页被抓取器发现的唯一入口 */
.k-cat-card > ul { display: flex; flex-wrap: wrap; gap: 5px 12px; margin: 2px 0 0; }
.k-cat-card > ul a { font-size: 12.5px; color: var(--k-ink-3); }
.k-cat-card > ul a:hover { color: var(--k-brand); }
/* 数量标签沉到卡片底部，让一行里高矮不一的卡片在底边对齐 */
.k-cat-card > .k-tag { align-self: flex-start; margin-top: auto; }
@media (max-width: 520px) { .k-cat-grid { grid-template-columns: 1fr; } }

/* ── 账户中心的四个入口 ──────────────────────────────────────────────────
   两张是计数卡（<b class="k-num"> 是数字），两张是纯文字入口 ——
   同一个 <b> 要用两种字号，否则「我的订单」会被撑成 24px 的标题。 */
.k-router { display: grid; grid-template-columns: repeat(auto-fit, minmax(176px, 1fr)); gap: 12px; }
.k-router-card {
  display: flex; flex-direction: column; gap: 5px;
  padding: 18px 16px;
  background: var(--k-surface);
  border: 1px solid var(--k-line);
  border-radius: var(--k-radius-lg);
  box-shadow: var(--k-shadow);
  transition: border-color .15s ease, box-shadow .15s ease;
}
.k-router-card:hover { border-color: var(--k-brand); box-shadow: var(--k-shadow-hov); }
.k-router-card > b { font-size: 15px; font-weight: 600; color: var(--k-ink); line-height: 1.35; word-break: keep-all; }
.k-router-card > b.k-num { font-size: 26px; line-height: 1.1; color: var(--k-brand); }
.k-router-card > span { font-size: 12.5px; color: var(--k-ink-3); line-height: 1.6; }

/* ── 分段按钮的选中态 ────────────────────────────────────────────────────
   kies.js 用 classList.toggle('is-on') 标当前项，但这个类此前没有任何规则 ——
   于是「当前是验证码登录还是密码登录」在视觉上完全看不出来。 */
.k-btn.is-on { background: var(--k-brand); border-color: var(--k-brand); color: #fff; }
.k-btn.is-on:hover { background: var(--k-brand-2); color: #fff; }

/* ── 页脚 ────────────────────────────────────────────────────────────────── */
/* ── 页脚 ────────────────────────────────────────────────────────────────
   ⚠️ 2026-08-28：白底 → 结构深色，与顶栏工具条同一支色。

   原来的页脚是**白底**，而它上面的正文区是浅灰底（--k-paper）——
   于是整页最后一屏比正文还亮，页面读起来是「越往下越飘」，没有收口。
   把页脚压成深色之后，一页从上到下是「深（工具条）→ 浅（正文）→ 深（页脚）」，
   两端被夹住 —— 这是所有大站页脚都是深色的原因，不是审美偏好。

   顶部保留 3px 品牌橙：深底上那一条橙线是全站唯一的「结束」标记。 */
.k-foot { background: var(--k-deep); color: var(--k-deep-ink-2); border-top: 3px solid var(--k-brand); margin-top: 48px; }
.k-foot-main { display: grid; grid-template-columns: minmax(240px, 1.3fr) repeat(auto-fit, minmax(130px, 1fr)); gap: 32px; padding-block: 44px 36px; }
.k-foot-col > b { display: block; font-size: 14px; font-weight: 600; color: #fff; margin-bottom: 14px; letter-spacing: .02em; }
.k-foot-col ul { display: flex; flex-direction: column; gap: 9px; }
.k-foot-col a { font-size: 12.5px; color: var(--k-deep-ink-3); transition: color .15s; }
.k-foot-col a:hover { color: #fff; }
.k-foot-about p { font-size: 12.5px; color: var(--k-deep-ink-3); line-height: 1.9; max-width: 30em; margin: 0; }
.k-foot-contact { font-family: var(--k-mono); font-size: 13px; color: var(--k-deep-ink-2); display: flex; flex-direction: column; gap: 7px; margin-top: 18px; }
.k-foot-contact > span:first-child { font-size: 12px; color: var(--k-deep-ink-3); font-family: var(--k-sans); }
/* 号码：深底上用白色而不是品牌橙。橙字压在近黑底上对比度只有 4.3:1，
   而且橙色在这一屏已经由顶部那条 3px 线代表了 —— 号码只需要「最亮」。 */
.k-foot-contact b { font-size: 21px; line-height: 1.15; color: #fff; font-weight: 700; margin-bottom: 2px; }
/* ⚠️ 2026-08-27：电话是 <b><a>…</a></b>，而 .k-foot-col a 给所有页脚链接定了
   12.5px + 灰色 —— 它作用在 <a> 元素本身，直接盖掉从 <b> 继承来的 22px 品牌色。
   表现是：页脚那个「本该最显眼的转化入口」渲染成和地址一样大的灰字，
   而且 <b> 的行高仍然按 22px 算，于是联系块的行距也跟着变松。
   这一条把它掰回来 —— 相当一部分 B2B 采购是看到页脚电话直接打过来的。 */
.k-foot-contact b a { font-size: inherit; color: inherit; font-weight: inherit; }
.k-foot-contact b a:hover { color: var(--k-brand-3); }
.k-foot-contact a { color: var(--k-deep-ink-2); }
.k-foot-contact a:hover { color: #fff; }
/* ── 页脚社交 ────────────────────────────────────────────────────────────
   微信没有可跳转的主页，只有二维码，所以它是 <button> + 浮层；其余是真链接。
   浮层用 :hover / :focus-within 展开，不写 JS —— 键盘 Tab 过去同样能看到。 */
.k-foot-social { margin-top: 18px; }
.k-foot-social > b { display: block; font-size: 13px; font-weight: 600; color: #fff; margin-bottom: 10px; }
.k-foot-social ul { display: flex; gap: 8px; flex-wrap: wrap; }
/* <a> 与 <button> 共用同一个类：全局 reset 里已经有 box-sizing 与
   button{font:inherit}，所以这一条规则两种标签都能直接吃，不需要 all:unset。 */
/* 社交按钮活在深色页脚里，所以底色/描边走 --k-deep-*。
   ⚠️ 悬停不要用品牌橙描边 —— 深底上一圈橙线会跳出来抢戏，
      而这几个图标的优先级低于页脚里的电话与产品线链接。白描边足够。 */
.k-social {
  display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; padding: 0;
  border: 1px solid var(--k-deep-line); border-radius: var(--k-radius);
  background: rgba(255,255,255,.05); color: var(--k-deep-ink-2); cursor: pointer;
  transition: background .15s, border-color .15s, color .15s;
}
.k-social:hover, .k-social:focus-visible { border-color: rgba(255,255,255,.45); color: #fff; background: rgba(255,255,255,.12); }
.k-social svg { width: 18px; height: 18px; fill: currentColor; }
.k-social-qr { position: relative; display: inline-flex; }
.k-social-pop {
  position: absolute; bottom: calc(100% + 10px); left: 50%; transform: translateX(-50%);
  display: none; flex-direction: column; align-items: center; gap: 6px;
  padding: 10px; background: var(--k-surface); border: 1px solid var(--k-line);
  border-radius: var(--k-radius-lg); box-shadow: var(--k-shadow-lg); z-index: 10;
}
.k-social-qr:hover .k-social-pop, .k-social-qr:focus-within .k-social-pop { display: flex; }
.k-social-pop img { display: block; width: 120px; height: 120px; }
.k-social-pop i { font-style: normal; font-size: 11px; color: var(--k-ink-3); white-space: nowrap; }

/* 公安备案：警徽图标与文字基线对齐；没配图标时只出文字，同样合规 */
.k-foot-police { display: inline-flex; align-items: center; gap: 5px; }
.k-foot-police img { display: block; width: 16px; height: 16px; }

.k-foot-bar { border-top: 1px solid var(--k-deep-line); padding-block: 18px; display: flex; flex-wrap: wrap; gap: 8px 20px; align-items: center; font-size: 12px; line-height: 1.8; color: var(--k-deep-ink-3); }
.k-foot-bar a { color: var(--k-deep-ink-3); transition: color .15s; }
.k-foot-bar a:hover { color: #fff; }

/* ── 顶栏与页脚的窄屏适配 ────────────────────────────────────────────────
   ⚠️ 2026-08-27 补：这两块此前**没有任何断点**。顶栏主行是一条固定 78px 高的
   flex（LOGO + 搜索 + 购物车），在 390px 的手机上三样东西挤在一行里，
   搜索框被压到只剩几十像素 —— 而搜索恰恰是这个站最主要的找货方式。

   处理办法是换行而不是隐藏：搜索框整条掉到第二行占满宽度，
   第一行留 LOGO 与购物车。隐藏搜索（很多站的做法）在这里是错的 ——
   手机上的采购一样要搜型号。 */
@media (max-width: 900px) {
  .k-head-main .k-wrap { flex-wrap: wrap; height: auto; padding-block: 10px; gap: 10px 16px; }
  .k-head-actions { order: 2; }
  .k-search { order: 3; flex: 1 0 100%; max-width: none; }
  /* 搜索框这时自己占一整行，热搜词必须回到常规流 —— 还挂在绝对定位上会压住下面的导航条 */
  .k-search-hot { position: static; margin-top: 6px; max-height: none; }
}
@media (max-width: 640px) {
  /* 品牌副标题（「AI 硬件与工业智能设备分销商」）在窄屏会折成两行把顶栏撑高。
     主标题保留 —— 那是品牌识别，副标题只是补充。 */
  .k-logo-txt b { font-size: 18px; }
  .k-logo-txt span { display: none; }
  .k-search-box button { padding: 0 14px; font-size: 13px; }
  /* 购物车只留图标：文字在这个宽度下和角标会撞在一起 */
  .k-cart-btn > span:not(.k-badge) { display: none; }
  .k-cart-btn { padding: 0 11px; }
}
@media (max-width: 720px) {
  /* 页脚五列在窄屏挤成五条竖线。两列 + 「关于」独占一行最稳：
     「关于」那一列装着电话与邮箱，是页脚里最该被看清的一块。 */
  .k-foot-main { grid-template-columns: repeat(2, 1fr); gap: 24px 20px; padding-block: 26px; }
  .k-foot-about { grid-column: 1 / -1; }
}
@media (max-width: 460px) {
  .k-foot-main { grid-template-columns: 1fr; }
}

/* ── 移动端外壳：底部固定导航 + 分类抽屉 ────────────────────────────────
   ⚠️ 整块只在 ≤900px 出现。桌面端它仍在 DOM 里（display:none）——
      这样静态化出来的 HTML 一份就够，不用按设备出两份。

   ⚠️ 底栏 fixed 会盖住页面最后一截，所以 body 要补 padding-bottom。
      这两个数字（底栏高度 / body 内边距）必须一起改，否则页脚最后一行
      会被永久盖住，而且只在手机上出现、桌面自测永远看不到。 */
.k-mbar { display: none; }

@media (max-width: 900px) {
  body { padding-bottom: calc(56px + env(safe-area-inset-bottom, 0px)); }

  .k-mbar {
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
    display: grid; grid-template-columns: repeat(5, 1fr);
    height: calc(56px + env(safe-area-inset-bottom, 0px));
    padding-bottom: env(safe-area-inset-bottom, 0px);   /* iPhone 底部横条 */
    background: var(--k-surface);
    border-top: 1px solid var(--k-line);
    box-shadow: 0 -2px 12px rgb(0 0 0 / 6%);
  }
  .k-mbar-i {
    position: relative;
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px;
    height: 56px; font-size: 11px; line-height: 1.2; color: var(--k-ink-2);
    list-style: none; cursor: pointer; -webkit-tap-highlight-color: transparent;
  }
  .k-mbar-i::-webkit-details-marker { display: none; }   /* Safari 的 <summary> 小三角 */
  .k-mbar-i::marker { content: ""; }
  .k-mbar-i svg { width: 21px; height: 21px; }
  .k-mbar-i:active { background: var(--k-surface-2); }
  /* AI 选型是这个站的差异化入口，给它品牌色 —— 底栏里唯一一个有颜色的 */
  .k-mbar-ai { color: var(--k-brand); }
  .k-mbar .k-badge { top: 4px; right: calc(50% - 20px); }

  /* 抽屉。<details> 原生开合，没有 JS 也能用；kies.js 只额外补「点外面关 / Esc 关」 */
  .k-mdrawer { position: static; }
  .k-mdrawer-panel {
    position: fixed; left: 0; right: 0; bottom: calc(56px + env(safe-area-inset-bottom, 0px));
    max-height: 62vh; overflow-y: auto; -webkit-overflow-scrolling: touch;
    padding: 14px 16px 18px;
    background: var(--k-surface);
    border-top: 1px solid var(--k-line);
    border-radius: var(--k-radius-lg) var(--k-radius-lg) 0 0;
    box-shadow: 0 -8px 28px rgb(0 0 0 / 14%);
    z-index: 2;   /* 压在蒙层（1）之上 */
  }
  .k-mdrawer-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 10px; }
  .k-mdrawer-head b { font-size: 14px; font-weight: 600; color: var(--k-ink); }
  .k-mdrawer-head a { font-size: 12.5px; color: var(--k-brand); }
  .k-mdrawer-list { display: flex; flex-direction: column; gap: 2px; }
  .k-mdrawer-list > li { padding: 9px 0; border-bottom: 1px solid var(--k-line-soft); }
  .k-mdrawer-list > li:last-child { border-bottom: 0; }
  .k-mdrawer-top { display: block; font-size: 14px; font-weight: 500; color: var(--k-ink); }
  /* 二级不折叠：折起来的链接抓取器看不到，手机上多一次点击就多一次流失 */
  .k-mdrawer-subs { display: flex; flex-wrap: wrap; gap: 4px 14px; margin-top: 5px; }
  .k-mdrawer-subs a { font-size: 12.5px; color: var(--k-ink-3); }
  .k-mdrawer-subs a:active { color: var(--k-brand); }
  .k-mdrawer-empty { margin: 8px 0 0; }

  /* 抽屉展开时压一层背景。它同时是「点外面关」的命中区域（脚本在管），
     没有脚本时点它不会关 —— 但再点一次「分类」一样能关，不会卡住。 */
  .k-mdrawer[open]::before {
    content: ""; position: fixed; inset: 0 0 calc(56px + env(safe-area-inset-bottom, 0px));
    background: rgb(0 0 0 / 32%);
    /* ⚠️ 这里必须是**正的** z-index。.k-mbar 自己有 z-index:40，它是一个层叠上下文；
       蒙层作为它的后代，用 z-index:-1 会被画到 .k-mbar 的背景**之下** —— 也就是
       完全看不见。用 1 压在栏目背景之上、面板（2）之下；inset 的 bottom 留出
       底栏高度，所以蒙层不会盖住底栏本身。 */
    z-index: 1;
  }

  /* 工具条：这几项在底栏里都有更好的入口，手机上收起来给币种/语言让位 */
  .k-head-util .k-util-more { display: none; }
}


/* ── 长表单：分节、复选网格、文件选择、步骤条（2026-08-27 供应商申请页）──────
   为什么单独一组而不是复用筛选栏那套：筛选栏的 .k-filter-opts 有
   max-height:240px + overflow-y:auto —— 那是给"很多品牌"设计的，
   放在表单里会让一组只有七八项的品类复选框莫名其妙出现内滚动条。 */
.k-fset { border: 0; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 14px; }
.k-legend {
  /* legend 在 flex 容器里不参与布局（浏览器对它有特殊处理），
     所以用 float:none + width:100% 让它稳定占满一行，不同浏览器表现才一致 */
  float: none; width: 100%; padding: 0 0 8px; margin: 0;
  font-size: 14px; font-weight: 600; color: var(--k-ink);
  border-bottom: 1px solid var(--k-line);
}
.k-fset + .k-fset { margin-top: 4px; }

/* 复选网格：一行两到四列自适应，项数少时不会拉出滚动条 */
.k-checks { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 8px 14px; }
.k-checks label { display: flex; align-items: center; gap: 7px; font-size: 13px; color: var(--k-ink-2); cursor: pointer; }
.k-checks label:hover { color: var(--k-brand); }
.k-checks input { accent-color: var(--k-brand); flex: 0 0 auto; }

/* 文件选择框。不做"隐藏原生 input + 自己画按钮"那一套 ——
   那种做法在没有 JS 时选完文件不会显示文件名，用户无法确认自己选对了。 */
.k-file {
  width: 100%; padding: 7px 11px; border: 1px dashed var(--k-line);
  border-radius: var(--k-radius); background: var(--k-surface-3);
  color: var(--k-ink-2); font-size: 13px; cursor: pointer;
}
.k-file:focus { outline: none; border-color: var(--k-brand); box-shadow: 0 0 0 2px var(--k-brand-soft); }
.k-file::file-selector-button {
  margin-right: 10px; padding: 4px 12px; border: 1px solid var(--k-line);
  border-radius: var(--k-radius); background: var(--k-surface);
  color: var(--k-ink-2); font-size: 12.5px; cursor: pointer;
}
.k-file::file-selector-button:hover { border-color: var(--k-brand); color: var(--k-brand); }

/* 步骤条：告诉申请方"交完之后会发生什么"，这一条比表单本身更能减少催问 */
.k-steps { display: flex; flex-direction: column; gap: 12px; counter-reset: kstep; }
.k-steps li { display: grid; grid-template-columns: 22px minmax(0,1fr); gap: 3px 10px; align-items: start; }
.k-steps li::before {
  counter-increment: kstep; content: counter(kstep);
  grid-row: 1 / span 2; width: 22px; height: 22px; border-radius: 50%;
  background: var(--k-brand-soft); color: var(--k-brand);
  font-family: var(--k-mono); font-size: 12px; display: flex; align-items: center; justify-content: center;
}
.k-steps li b { font-size: 13px; color: var(--k-ink); }
.k-steps li span { font-size: 12.5px; color: var(--k-ink-3); line-height: 1.6; }

/* 首页底部的供应商招募条。窄条而不是整屏区块 ——
   招商是低频入口，给它一屏等于把客户的主路径往下推一屏。 */
.k-supbar {
  display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap;
  padding: 18px 22px; border-radius: var(--k-radius-lg);
  background: var(--k-brand-soft); border: 1px solid var(--k-brand-tint);
}
.k-supbar > div { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.k-supbar b { font-size: 15px; color: var(--k-ink); }
.k-supbar span { font-size: 12.5px; color: var(--k-ink-3); line-height: 1.7; max-width: 62em; }
@media (max-width: 700px) { .k-supbar { padding: 16px; } .k-supbar .k-btn { width: 100%; justify-content: center; } }


/* ── 供应商投稿页（2026-08-28）────────────────────────────────────────────
   只在 /s/{token} 上用。这一页是手机优先的：缩略图要能一眼看清拍糊没有，
   状态徽标要在小屏上仍然分得开颜色。 */
.k-thumbs { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.k-thumbs img {
  width: 76px; height: 76px; object-fit: cover;
  border: 1px solid var(--k-line); border-radius: var(--k-radius); background: var(--k-surface-3);
}
.k-subrow { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--k-line-soft); }
.k-subrow:last-child { border-bottom: 0; }
.k-subrow > div { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.k-subrow b { font-size: 14px; color: var(--k-ink); }
.k-badge { flex: 0 0 auto; padding: 2px 9px; border-radius: 999px; font-size: 12px; line-height: 1.7; white-space: nowrap; }
/* 0 待处理 / 1 已上架 / 2 已退回 / 3 疑似重复。
   用背景色而不是只用文字色：小屏上灰底浅字的对比度撑不住。 */
.k-badge-0 { background: var(--k-brand-soft); color: var(--k-brand); }
.k-badge-1 { background: var(--k-blue-soft);  color: var(--k-blue-2); }
.k-badge-2 { background: var(--k-surface-3);  color: var(--k-ink-3); }
.k-badge-3 { background: var(--k-price-soft); color: var(--k-price-2); }

/* ── 打印：报价单与参数表会被打印出来带进会议室 ─────────────────────────── */
@media print {
  .k-head, .k-foot, .k-ai-bar, .k-skip, .k-toolbar, .k-filter, .k-catrail, .k-portals { display: none !important; }
  body { background: #fff; color: #000; font-size: 12px; }
  .k-card, .k-pcard, .k-panel, .k-pdp { box-shadow: none; border: 1px solid #999; }
  a[href^="http"]::after { content: " (" attr(href) ")"; font-size: 10px; color: #555; }
}
