/* ============================================================
   机宇Agent · 视觉系统 v4
   方向：把散落的东西编成一条路 —— 编号、序列、满幅细线
   参照 vercel.com 的「强度」（留白、字距、明暗交替），
   不复用它的标识与图形语言：这里的标记是三条渐次对齐的线。
   ============================================================ */

:root{
  --r-s:6px;
  --r-m:10px;
  --r-l:18px;
  --e-out:cubic-bezier(.16,1,.3,1);
  --t-fast:.18s;
  --t:.4s;
  --nav:60px;
  --pad:clamp(20px,4.6vw,64px);
  --max:1360px;
}

*,*::before,*::after{box-sizing:border-box}
html{background:var(--paper);-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  font-size:15.5px;line-height:1.7;letter-spacing:-.006em;
  -webkit-font-smoothing:antialiased;overflow-x:hidden;
}
a{color:inherit;text-decoration:none}
button,input,select,textarea{font:inherit;color:inherit}
img{display:block;max-width:100%}
::selection{background:var(--ink);color:var(--paper)}
:focus-visible{outline:2px solid var(--signal);outline-offset:3px;border-radius:3px}

/* ── 版心与满幅线 ── */
.shell{width:100%;max-width:var(--max);margin-inline:auto;padding-inline:var(--pad)}
.hair{height:1px;background:var(--hair);border:0;margin:0}
.band{border-top:1px solid var(--hair)}
.band-dark{background:var(--void);color:var(--void-ink)}
.band-dark .hair{background:var(--void-hair)}

/* ── 字阶 ── */
h1,h2,h3,h4{margin:0;font-weight:600;letter-spacing:-.055em;line-height:.98;text-wrap:wrap}
.d1{font-size:clamp(26px,3.4vw,46px)}
.d2{font-size:clamp(23px,2.9vw,38px);line-height:1.02}
.d3{font-size:clamp(21px,2.5vw,32px);line-height:1.06;letter-spacing:-.045em}
.h-s{font-size:clamp(17px,1.7vw,21px);line-height:1.2;letter-spacing:-.035em}
.lead{color:var(--ink-2);font-size:clamp(16px,1.35vw,19px);line-height:1.62;letter-spacing:-.012em}
.band-dark .lead{color:var(--void-ink-2)}
.mono,.meta,.idx{
  font-family:ui-monospace,"SF Mono",SFMono-Regular,Menlo,monospace;
  font-variant-numeric:tabular-nums;letter-spacing:.02em;
}
.eyebrow{
  display:inline-flex;align-items:center;gap:10px;
  font-family:ui-monospace,"SF Mono",Menlo,monospace;
  font-size:11.5px;letter-spacing:.18em;color:var(--ink-3);text-transform:uppercase;
}
.eyebrow::before{content:"";width:22px;height:1px;background:var(--hair-2)}
.band-dark .eyebrow{color:var(--void-ink-2)}
.band-dark .eyebrow::before{background:var(--void-hair)}

/* ── 标记：三条渐次对齐的线 ── */
.mark{display:inline-flex;flex-direction:column;gap:2.5px;width:16px;flex:none}
.mark i{display:block;height:2px;background:currentColor;border-radius:1px}
.mark i:nth-child(1){width:8px}
.mark i:nth-child(2){width:12px}
.mark i:nth-child(3){width:16px}
.wordmark{display:inline-flex;align-items:center;gap:10px;flex:none;white-space:nowrap;font-size:15px;font-weight:600;letter-spacing:-.03em}

/* ── 顶栏 ── */
.nav{
  position:sticky;top:0;z-index:80;height:var(--nav);display:flex;align-items:center;
  background:color-mix(in srgb,var(--paper) 82%,transparent);
  backdrop-filter:saturate(180%) blur(14px);-webkit-backdrop-filter:saturate(180%) blur(14px);
  border-bottom:1px solid transparent;transition:border-color var(--t) var(--e-out);
}
.nav.is-stuck{border-bottom-color:var(--hair)}
.nav-in{display:flex;align-items:center;gap:clamp(14px,2.4vw,28px);width:100%;max-width:var(--max);margin-inline:auto;padding-inline:var(--pad)}
.nav-links{display:flex;align-items:center;gap:4px;min-width:0;scrollbar-width:none}
.nav-links::-webkit-scrollbar{display:none}
.nav-links a{
  position:relative;flex:none;height:30px;display:inline-flex;align-items:center;padding:0 10px;
  border-radius:var(--r-s);color:var(--ink-2);font-size:13.5px;white-space:nowrap;
  transition:color var(--t-fast) var(--e-out),background var(--t-fast) var(--e-out);
}
.nav-links a:hover{color:var(--ink);background:var(--hover-surface)}
.nav-links a[aria-current]{color:var(--ink);font-weight:500}

/* ── 顶栏下拉：必看资源 ──
   照 lovable.dev 的下拉量着做的：一个 20px 圆角的外壳铺浅色底，
   左半边盖一块 19px 圆角的卡片色 —— 两区的深浅差就这么来的，不画分隔线。
   阴影是七层很紧的叠加（不是一团大模糊），条目之间只留 2px，
   悬浮只变字色、不加底色。
   选择器都带 .nav-links 前缀：上面 `.nav-links a` 是 inline-flex + 定高，
   权重比单个 class 高，不压住的话标题和说明会挤成一行。 */
.nav-drop{position:relative;flex:none}
.nav-links .nav-drop-t{
  /* 旁边几项是 <a>，这个是 <button>，得把浏览器默认的 outset 立体边框
     和 ButtonFace 底色清掉，否则看起来像凭空多了圈边框和阴影 */
  appearance:none;-webkit-appearance:none;border:0;background:transparent;
  font:inherit;line-height:inherit;
  height:30px;display:inline-flex;align-items:center;gap:2px;padding:0 6px 0 10px;
  border-radius:var(--r-s);color:var(--ink-2);font-size:13.5px;white-space:nowrap;cursor:pointer;
  transition:color .15s cubic-bezier(.4,0,.2,1),background .15s cubic-bezier(.4,0,.2,1);
}
.nav-links .nav-drop-t:hover{color:var(--ink);background:var(--hover-surface)}
.nav-links .nav-drop-t[aria-current]{color:var(--ink);font-weight:500}
.nav-links .nav-drop-t svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round;opacity:.55;
  transition:transform .27s cubic-bezier(.45,0,.25,1),opacity .15s}
.nav-drop:hover .nav-drop-t svg,.nav-drop.is-open .nav-drop-t svg{transform:rotate(180deg);opacity:.9}

/* 上方留一条透明的桥，鼠标从按钮挪到面板中间不会断开 */
.nav-links .nav-drop-pop{
  position:absolute;top:100%;left:-8px;z-index:90;padding-top:7px;
  opacity:0;visibility:hidden;transform:translateY(-6px) scale(.985);transform-origin:28px 0;
  transition:opacity .27s cubic-bezier(.45,0,.25,1),transform .27s cubic-bezier(.45,0,.25,1),visibility .27s;
}
.nav-drop:hover .nav-drop-pop,
.nav-drop:focus-within .nav-drop-pop,
.nav-drop.is-open .nav-drop-pop{opacity:1;visibility:visible;transform:none}

.nav-links .nav-drop-in{
  display:grid;grid-template-columns:260px 260px;
  border-radius:20px;padding:1px;background:var(--wash);
  box-shadow:
    0 0 0 .5px #fff,
    0 0 0 1px color-mix(in srgb,var(--hair-2) 70%,transparent),
    0 1.5px 1px rgba(0,0,0,.04),
    0 3.5px 3px -1.5px rgba(0,0,0,.04),
    0 6.5px 6px -3px rgba(0,0,0,.04);
}
:root[data-theme="dark"] .nav-links .nav-drop-in,
html:not([data-theme="light"]) .nav-links .nav-drop-in{
  box-shadow:
    0 0 0 1px rgba(255,255,255,.10),
    0 2px 3px rgba(0,0,0,.30),
    0 8px 12px -4px rgba(0,0,0,.35);
}
@media(prefers-color-scheme:light){
  html:not([data-theme="dark"]) .nav-links .nav-drop-in{
    box-shadow:
      0 0 0 .5px #fff,
      0 0 0 1px color-mix(in srgb,var(--hair-2) 70%,transparent),
      0 1.5px 1px rgba(0,0,0,.04),
      0 3.5px 3px -1.5px rgba(0,0,0,.04),
      0 6.5px 6px -3px rgba(0,0,0,.04);
  }
}

.nav-links .ndp-col{
  display:flex;flex-direction:column;gap:2px;
  padding:32px 20px 24px;min-width:0;
}
.nav-links .ndp-col:first-child{background:var(--card);border-radius:19px}
.nav-links .ndp-lab{
  margin:0 0 7px 12px;color:var(--ink-3);
  font-size:12px;line-height:16px;font-weight:400;
}
.nav-links .ndp-i{
  /* .nav-links a 带着 align-items:center，不压住的话标题和说明会居中 */
  display:flex;flex-direction:column;align-items:flex-start;text-align:left;height:auto;
  padding:7px 12px 9px;border-radius:10px;
  white-space:normal;background:transparent;box-shadow:none;
  transition:color .1s cubic-bezier(.4,0,.2,1);
}
/* lovable 那边条目悬浮不加底色，只让标题变色 —— 加了底色会显得廉价 */
.nav-links .ndp-i:hover{background:transparent;box-shadow:none}
.nav-links .ndp-i b{
  display:block;color:var(--ink-hi);
  font-size:16px;line-height:24px;font-weight:500;letter-spacing:-.01em;
  transition:color .1s cubic-bezier(.4,0,.2,1);
}
.nav-links .ndp-i em{
  display:block;color:var(--ink-3);
  font-size:12px;line-height:16px;font-style:normal;font-weight:400;
}
.nav-links .ndp-i:hover b{color:var(--signal-text)}
.nav-links .ndp-i[aria-current] b{color:var(--signal-text)}

@media(max-width:640px){
  /* 窄屏顶栏要横向滚，绝对定位的面板会被裁掉；改成 fixed 铺满一行 */
  .nav-links{overflow-x:auto}
  .nav-links .nav-drop-pop{position:fixed;top:var(--nav);left:10px;right:10px;padding-top:6px}
  .nav-links .nav-drop-in{grid-template-columns:1fr}
  .nav-links .ndp-col{padding:22px 16px 18px}
  .nav-links .ndp-col:first-child{border-radius:19px 19px 0 0}
}
.nav-right{margin-left:auto;display:flex;align-items:center;gap:8px;flex:none}
/* 导航右上的站内搜索。每页都有，不要求登录。
   窄屏先把输入框收成一个图标位，再窄就整个藏掉，别把导航挤断行。 */
.nv-s{display:flex;align-items:center;gap:6px}
.nv-s-in{position:relative;display:flex;align-items:center}
.nv-s svg{position:absolute;left:9px;width:14px;height:14px;pointer-events:none;
  stroke:var(--ink-3);stroke-width:1.9;fill:none;stroke-linecap:round}
.nv-go{flex:none;height:32px;padding:0 13px;border:1px solid var(--hair-2);border-radius:8px;
  background:var(--card);color:var(--ink-2);font-size:12.5px;font-weight:650;
  white-space:nowrap;cursor:pointer;
  transition:border-color .14s var(--e-out),color .14s var(--e-out)}
.nv-go:hover{border-color:var(--signal-line);color:var(--ink)}
.nv-s input{width:300px;height:32px;padding:0 10px 0 28px;border:1px solid var(--hair-2);
  border-radius:8px;background:var(--card);color:var(--ink);font-size:12.5px;
  transition:width .18s var(--e-out),border-color .14s var(--e-out)}
.nv-s input::placeholder{color:var(--ink-3)}
.nv-s input:focus{outline:none;width:420px;border-color:var(--signal-line)}
.nv-s input::-webkit-search-cancel-button{-webkit-appearance:none}
.nv-help{display:inline-flex;align-items:center;gap:5px;height:32px;padding:0 10px;
  border:1px solid var(--hair-2);border-radius:8px;color:var(--ink-2);font-size:12.5px;
  font-weight:650;white-space:nowrap;
  transition:border-color .14s var(--e-out),color .14s var(--e-out)}
.nv-help svg{width:14px;height:14px;stroke:currentColor;stroke-width:1.8;fill:none;
  stroke-linecap:round;stroke-linejoin:round}
.nv-help:hover{border-color:var(--signal-line);color:var(--ink)}
@media(max-width:1180px){.nv-s input{width:min(200px,22vw)}.nv-s input:focus{width:min(280px,30vw)}}
@media(max-width:960px){.nv-go{display:none}}   /* 窄屏靠回车搜 */
@media(max-width:760px){.nv-s{display:none}}

/* ── 按钮 ── */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;height:42px;padding:0 20px;
  border:1px solid var(--ink);border-radius:var(--r-s);background:var(--ink);color:var(--paper);
  font-size:14.5px;font-weight:500;letter-spacing:-.01em;cursor:pointer;
  transition:background var(--t-fast) var(--e-out),color var(--t-fast) var(--e-out),border-color var(--t-fast) var(--e-out);
}
.btn:hover{background:#242424;border-color:#242424}
.btn .arw{transition:transform var(--t) var(--e-out)}
.btn:hover .arw{transform:translateX(4px)}
.btn-ghost{
  background:transparent;color:var(--ink);border-color:var(--hair-2);
}
.btn-ghost:hover{background:var(--hover-surface);border-color:var(--signal-line)}
.btn-sm{height:32px;padding:0 13px;font-size:13px}
.band-dark .btn{background:var(--void-ink);border-color:var(--void-ink);color:var(--void)}
.band-dark .btn:hover{background:#fff;border-color:#fff}
.band-dark .btn-ghost{background:transparent;color:var(--void-ink);border-color:#2E2E2E}
.band-dark .btn-ghost:hover{background:#171717;border-color:#3A3A3A}

/* ── 动效基础（脚本可用时才隐藏） ── */
html.has-motion [data-motion-text],
html.has-motion [data-reveal],
html.has-motion [data-reveal-item],
html.has-motion [data-image-reveal]{visibility:hidden}
/* 逐词上浮动画的遮罩：overflow:hidden 会把 g/y/p 这类下伸笔画切掉，
   行高等于字号时尤其明显（「Agent」的 g 就是这么被削平的）。
   给它留出下伸空间，再用等量负边距抵掉，视觉位置不变。 */
.motion-word-mask{display:inline-block;overflow:hidden;vertical-align:top;
  padding-bottom:.22em;margin-bottom:-.22em}
.motion-word{display:inline-block;will-change:transform,opacity}
[data-image-reveal]{overflow:hidden}

/* ── 表单 ── */
.field{
  display:flex;align-items:center;gap:10px;height:44px;padding:0 14px;
  border:1px solid var(--hair-2);border-radius:var(--r-m);background:var(--card);
  transition:border-color var(--t-fast) var(--e-out),box-shadow var(--t-fast) var(--e-out);
}
.field:focus-within{border-color:var(--ink);box-shadow:0 0 0 4px rgba(10,10,10,.05)}
.field svg{flex:none;color:var(--ink-3)}
.field input{flex:1;min-width:0;border:0;background:none;outline:0;font-size:14.5px}
.field input::placeholder{color:var(--ink-3)}
input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}

/* ── 页脚 ── */
.foot{border-top:1px solid var(--hair);padding:24px 0 28px;margin-top:0}
.foot-grid{display:grid;grid-template-columns:minmax(0,1.7fr) repeat(3,minmax(0,1fr));gap:clamp(24px,4vw,56px);align-items:start}
.foot h4{margin:0 0 14px;font-size:12.5px;font-weight:500;letter-spacing:0;color:var(--ink)}
.foot a{display:block;padding:5px 0;color:var(--ink-2);font-size:13.5px;transition:color var(--t-fast) var(--e-out)}
.foot a:hover{color:var(--ink)}
.foot-note{color:var(--ink-3);font-size:14px;line-height:1.7;max-width:24em;margin-top:12px}
.foot-end{
  display:flex;justify-content:center;gap:16px;flex-wrap:wrap;
  margin-top:0;padding-top:0;border-top:0;
  color:var(--ink-3);font-size:12.5px;
}
.foot-end a{color:inherit;text-decoration:none}
.foot-end a:hover{color:var(--ink-2);text-decoration:underline;text-underline-offset:3px}

@media(max-width:1080px){
  .nav-links{gap:0}
  .nav-links a{padding:0 8px;font-size:13px}
}
@media(max-width:1000px){
  .foot-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
  .foot-brand,.foot-grid > div:first-child{grid-column:1/-1;margin-bottom:8px}
}
@media(max-width:640px){
  .foot-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px}
  .nav-right .btn-ghost{display:none}
}

/* ── 主题切换器：顶栏三档 跟随系统 / 浅色 / 深色 ── */
.theme-sw{display:inline-flex;gap:1px;padding:2px;flex:none;
  border:1px solid var(--hair);border-radius:999px;background:var(--card)}
.theme-sw button{
  width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;
  border:0;border-radius:50%;background:none;color:var(--ink-3);cursor:pointer;padding:0;
  transition:background .16s var(--e-out),color .16s var(--e-out);
}
.theme-sw button:hover{color:var(--ink);background:color-mix(in srgb,var(--signal) 12%,transparent)}
.theme-sw button[aria-pressed="true"]{background:var(--signal);color:var(--btn-ink)}
/* 小屏也留着：主题切换是用户最需要够得着的控件，
   要挤就挤掉旁边的次要按钮（.nav-right .btn-ghost 已在下面藏了） */
@media(max-width:640px){
  .theme-sw{padding:1px}
  .theme-sw button{width:24px;height:24px}
}

/* ══ 导航栏搜索框的下拉建议 ══
   .nv-s 要做定位基准，下拉挂在它下面右对齐（搜索框在导航右侧，
   左对齐会顶出屏幕）。窄屏收窄并允许滚动，不遮住整块内容。 */
.nv-s{position:relative}
/* 必须显式写：下面给了 .nv-sug{display:flex}，作者样式会压过浏览器
   自带的 [hidden]{display:none}，于是 box.hidden=true 只改属性、不改外观——
   面板看着一直挂在那儿。 */
.nv-sug[hidden]{display:none}
.nv-sug{
  position:absolute;top:calc(100% + 8px);right:0;z-index:120;
  width:min(520px,calc(100vw - 32px));max-height:min(66vh,460px);
  /* 外层不滚：底部那条出口要一直在，滚动交给里面的 .nv-sug-body */
  display:flex;flex-direction:column;overflow:hidden;
  border:1px solid var(--hair);border-radius:12px;background:var(--card);
  box-shadow:0 18px 48px rgba(0,0,0,.16);padding:6px;
  text-align:left}
.nv-sug-body{
  flex:1 1 auto;min-height:0;overflow-y:auto;
  /* 滚到头之后不要把滚动传给页面（否则看着像"滑的是背后的页面"） */
  overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.nv-sug-g{padding:8px 10px 4px;color:var(--ink-3);
  font-size:11px;letter-spacing:.06em}
.nv-sug-i{display:block;padding:8px 10px;border-radius:8px;
  color:var(--ink-2);text-decoration:none}
.nv-sug-i b{display:block;color:var(--ink-hi);font-size:13.5px;font-weight:600}
.nv-sug-i em{display:inline-block;margin-top:2px;color:var(--ink-3);
  font-style:normal;font-size:11px}
.nv-sug-i p{margin:3px 0 0;color:var(--ink-3);font-size:12px;line-height:1.5;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.nv-sug-i:hover,.nv-sug-i.is-on{background:var(--hover-surface);color:var(--ink)}
/* AI 排的那一段单独标一下，和下面「更多结果」区分开 */
.nv-sug-g-ai{display:flex;align-items:center;gap:6px;color:var(--accent-o);font-weight:600}
.nv-sug-g-ai::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--accent-o)}
.nv-sug-why{display:block;margin-top:3px;color:var(--accent-o);
  font-style:normal;font-size:11.5px;line-height:1.45}
.nv-sug-none,.nv-sug-tip{padding:16px 10px;color:var(--ink-3);font-size:13px;line-height:1.6}
.nv-sug-load{display:flex;align-items:center;gap:8px;
  padding:16px 10px;color:var(--ink-3);font-size:13px}
.nv-sug-load i{width:14px;height:14px;flex:none;border-radius:50%;
  border:2px solid var(--hair-2);border-top-color:var(--signal);
  animation:nv-spin .7s linear infinite}
@keyframes nv-spin{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion: reduce){.nv-sug-load i{animation-duration:2s}}
/* 固定在底部，不参与滚动 */
.nv-sug-more{flex:none;display:block;margin-top:4px;padding:11px 10px;
  border-top:1px solid var(--hair);border-radius:0 0 8px 8px;
  background:var(--card);
  color:var(--signal-text);font-size:12.5px;font-weight:600;text-decoration:none}
.nv-sug-more:hover,.nv-sug-more.is-on{background:var(--hover-surface)}
@media(max-width:640px){.nv-sug{width:calc(100vw - 24px)}}
