/* ============================================================
   温水煮代码 · 个人主页
   风格：纸片拼贴 / 编辑式排版 —— 白底、蓝色重点、等宽小标签、
   胶带贴纸卡片、大字中文标题、按小节编号的「故事分镜」导航。

   几个关键做法（都是手写，没有动画库）：
   · 撕纸边缘用 clip-path: polygon(锯齿点)，所以投影必须用
     filter: drop-shadow() —— box-shadow 画的是没被裁掉的那个矩形。
   · 所有色调都由 --blue 一个变量 color-mix 出来。
   · 入场动画用 translate 属性（不是 transform），这样不会和卡片
     自身的 transform: rotate(--card-angle) 打架。
   · 尊重 prefers-reduced-motion：加 .motion-off，全站过渡直接关掉。
   ============================================================ */
:root{
  --paper:#ffffff;
  --paper-2:#f6f7fb;
  --paper-3:#eef0f7;
  --ink:#14161b;
  --body:#3c414b;
  --muted:#6a7280;
  --faint:#9aa2af;
  --line:rgba(16,24,40,.10);
  --line-2:rgba(16,24,40,.18);
  --blue:#2b4ad8;
  --blue-deep:#1c33a8;
  --blue-soft:color-mix(in srgb,var(--blue) 12%,var(--paper));
  --blue-tint:color-mix(in srgb,var(--blue) 5%,var(--paper));
  --tape:color-mix(in srgb,var(--blue) 16%,var(--paper-2));
  --card-paper:color-mix(in srgb,var(--paper) 96%,var(--ink) 4%);
  --drop:drop-shadow(1px 3px 2px color-mix(in srgb,var(--ink) 13%,transparent));
  --drop-lift:drop-shadow(2px 7px 3px color-mix(in srgb,var(--ink) 17%,transparent));
  --shadow:0 20px 44px -30px rgba(16,24,40,.45);
  --shadow-lift:0 26px 54px -28px rgba(16,24,40,.5);
  --mono:ui-monospace,SFMono-Regular,"JetBrains Mono",Menlo,Consolas,"Courier New",monospace;
  --sans:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",system-ui,sans-serif;
  --serif:Georgia,"Times New Roman","Songti SC","Noto Serif SC",serif;
  --head-h:58px;      /* 顶栏高度 */
  --wrap-w:min(1080px,92vw);   /* 正文栏宽度 */
  --card-w:300px;     /* 贯穿卡片的宽度 */
  --gutter:24px;      /* 卡片和正文之间 */
  --edge:40px;        /* 卡片 / 正文离屏幕边的距离 */

  /* 撕纸 / 胶带的不规则边（点位故意抖动，看起来才像手撕的） */
  --tear-card:polygon(0% 2%,12% 0%,26% 2%,41% 0%,57% 2%,72% 0%,87% 2%,100% 0%,
                      99% 18%,100% 34%,98% 51%,100% 67%,99% 84%,100% 100%,
                      86% 98%,71% 100%,55% 98%,39% 100%,24% 98%,9% 100%,0% 99%,
                      1% 82%,0% 65%,2% 49%,0% 33%,1% 17%);
  --tear-tape:polygon(2% 0%,100% 3%,97% 22%,100% 40%,97% 60%,100% 80%,98% 100%,
                      0% 97%,3% 80%,0% 60%,3% 40%,0% 20%);
  --tear-hl:polygon(0% 4%,16% 0%,31% 3%,47% 0%,67% 4%,85% 0%,100% 3%,
                    99% 96%,78% 100%,59% 96%,42% 100%,22% 96%,0% 99%);
}

*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  font-family:var(--sans);color:var(--body);background:var(--paper);
  line-height:1.85;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
  overflow-x:hidden;
}
a{color:var(--blue);text-decoration:none}
img{max-width:100%;height:auto;display:block}
button{font-family:inherit;font-size:inherit;color:inherit;background:none;border:0;cursor:pointer}
ul,ol{list-style:none}
::selection{background:var(--blue-soft);color:var(--blue-deep)}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}

/* ---------- 通用排版件 ---------- */
.wrap{width:var(--wrap-w);margin-inline:auto}
.mono{font-family:var(--mono);letter-spacing:.16em;text-transform:uppercase;font-size:.7rem}

/* 小节眉题：01 / SELECTED WORK */
.eyebrow{font-family:var(--mono);font-size:.72rem;letter-spacing:.2em;color:var(--faint);margin-bottom:1.1rem}
.eyebrow b{color:var(--blue);font-weight:500}
.eyebrow i{font-style:normal;padding:0 .5em;color:var(--line-2)}

/* 大标题 + 撕下来的荧光纸片 */
.h-big{font-size:clamp(1.9rem,4.4vw,3.3rem);line-height:1.3;font-weight:800;color:var(--ink);letter-spacing:-.02em;margin-bottom:1rem}
.h-big .hl{display:inline-block;position:relative;padding:.04em .24em;background:var(--paper-3);transform:rotate(-.9deg);clip-path:var(--tear-hl)}
.h-big .hl--b{background:var(--blue-soft);color:var(--blue-deep);transform:rotate(.6deg)}
.lead{font-size:clamp(.95rem,1.2vw,1.06rem);color:var(--muted);max-width:46em}

.sec{padding:clamp(4rem,9vw,7.5rem) 0;scroll-margin-top:calc(var(--head-h) + 16px);position:relative}
.sec + .sec{border-top:1px dashed var(--line)}
.sec__head{margin-bottom:clamp(2rem,4vw,3.2rem)}

/* 撕纸卡：注意用 drop-shadow，不是 box-shadow */
.paper{position:relative;background:var(--card-paper);clip-path:var(--tear-card);filter:var(--drop)}
.tape{
  position:absolute;top:-9px;left:34%;width:76px;height:21px;z-index:2;pointer-events:none;
  background:var(--tape);opacity:.9;transform:rotate(-7deg);clip-path:var(--tear-tape);
}
.tape--r{left:auto;right:22%;transform:rotate(8deg)}

/* 手写体的一句话 */
.hand{font-family:var(--serif);font-style:italic;color:var(--blue);font-size:1.05rem}

/* ---------- 入场：滚到了才浮上来 ----------
   用 translate 属性而不是 transform，卡片自己的 rotate 才不会被覆盖 */
@keyframes arrive{from{opacity:.25;translate:0 20px}to{opacity:1;translate:0 0}}
[data-reveal]{opacity:0}
[data-reveal].has-arrived{opacity:1;animation:arrive .62s cubic-bezier(.2,.7,.3,1) both}
.motion-off [data-reveal]{opacity:1;animation:none}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  [data-reveal]{opacity:1;animation:none}
  *{animation-duration:.001ms !important;transition-duration:.001ms !important}
}

/* ============================================================
   顶栏
   ============================================================ */
.site{
  position:sticky;top:0;z-index:60;height:var(--head-h);
  display:flex;align-items:center;padding:0 clamp(1rem,4vw,2.4rem);
  background:color-mix(in srgb,var(--paper) 90%,transparent);
  backdrop-filter:blur(14px) saturate(1.3);border-bottom:1px solid var(--line);
  transition:background .35s,border-color .35s;
}
.site__bar{
  display:flex;align-items:center;gap:1rem;width:100%;height:100%;
  border:1px solid transparent;border-radius:0;
  transition:width .35s cubic-bezier(.2,.7,.3,1),height .35s,padding .35s,
             border-radius .35s,border-color .35s,background .35s,box-shadow .35s;
}
.site__id{display:flex;align-items:center;gap:.55rem;color:var(--ink);font-weight:800}
.site__id img{width:28px;height:28px;border-radius:6px}
.site__id b{font-size:1.02rem}
.site__id span{font-family:var(--mono);font-size:.64rem;letter-spacing:.18em;color:var(--faint);text-transform:uppercase}
.site__nav{margin-left:auto;display:flex;align-items:center;gap:clamp(.6rem,1.6vw,1.5rem)}
.site__nav a{flex:none;white-space:nowrap;color:var(--body);font-size:.9rem;font-weight:600;padding:.2rem 0;border-bottom:1.5px solid transparent;transition:color .25s,border-color .25s}
.site__nav a:hover{color:var(--blue);border-bottom-color:var(--blue)}
/* 选择器要压过上面的 .site__nav a，否则 padding 会被它的 .2rem 0 顶掉 */
.site__nav .site__cta{
  display:inline-flex;align-items:center;gap:.35rem;flex:none;white-space:nowrap;
  background:var(--blue);color:#fff;padding:.45em 1.05em;font-size:.86rem;font-weight:700;
  border-bottom:0;transition:background .25s;
}
.site__nav .site__cta:hover{background:var(--blue-deep);color:#fff;border-bottom:0}
@media(max-width:760px){
  .site__id span{display:none}
  .site__nav a[data-hide]{display:none}
}
/* 再窄就只留「项目报价」，其余靠下面的分镜条导航 */
@media(max-width:560px){
  .site{gap:.5rem;padding-inline:1rem}
  .site__nav a:not(.site__cta){display:none}
}

/* ============================================================
   往下滚之后：顶栏收成一颗浮着的胶囊
   —— .site 仍然 sticky 占着原来的高度，收的是里面那层 .site__bar，
      所以不会有布局跳动。
   ============================================================ */
.is-pill .site{background:transparent;border-bottom-color:transparent;backdrop-filter:none}
.is-pill .site__bar{
  width:min(1080px,100%);margin-inline:auto;height:46px;padding:0 .55rem 0 1.05rem;
  border-radius:999px;border-color:var(--line);
  background:color-mix(in srgb,var(--paper) 84%,transparent);
  backdrop-filter:blur(16px) saturate(1.4);
  box-shadow:0 16px 34px -22px rgba(16,24,40,.5);
}
.is-pill .site__id img{width:24px;height:24px}

/* ============================================================
   Hero
   ============================================================ */
.hero{
  padding:clamp(2.6rem,6vw,5rem) 0 clamp(2rem,4vw,3.4rem);
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.82fr);gap:clamp(2rem,5vw,4rem);align-items:center;
}
.hero__me{display:flex;align-items:center;gap:.85rem;margin-bottom:2rem}
.hero__me img{width:46px;height:46px;border-radius:50%;border:1px solid var(--line);background:var(--paper-2);padding:3px}
.hero__me b{display:block;color:var(--ink);font-size:1rem;line-height:1.5}
.hero__me small{color:var(--faint);font-size:.82rem}
.hero__kick{color:var(--muted);font-size:.92rem;margin-bottom:1.1rem}
.hero__h{font-size:clamp(2rem,4.7vw,3.5rem);line-height:1.3;font-weight:900;letter-spacing:-.03em;color:var(--ink)}
.hero__h span{display:inline-block;padding:.02em .2em .1em;margin-bottom:.3rem;clip-path:var(--tear-hl)}
.hero__h .l1{background:var(--paper-3);transform:rotate(-1deg)}
.hero__h .l2{background:var(--blue-soft);color:var(--blue-deep);transform:rotate(.7deg)}
/* 标题下面那道铅笔线 */
.hero__pencil{display:block;width:180px;height:38px;margin:.6rem 0 -.6rem 4rem;color:var(--blue);opacity:.5;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round}
.hero__sub{margin-top:1.5rem;font-size:1.12rem;font-weight:800;color:var(--ink)}
.hero__p{margin-top:.5rem;color:var(--muted);max-width:30em}
.hero__acts{display:flex;flex-wrap:wrap;gap:.8rem;margin-top:2rem}
.btn{
  display:inline-flex;align-items:center;gap:.5rem;padding:.72em 1.6em;
  font-weight:700;font-size:.92rem;clip-path:var(--tear-tape);
  transition:transform .22s,background .22s,color .22s,filter .22s;
}
.btn--main{background:var(--blue);color:#fff;filter:var(--drop)}
.btn--main:hover{background:var(--blue-deep);color:#fff;transform:translateY(-3px);filter:var(--drop-lift)}
.btn--ghost{background:var(--paper-3);color:var(--ink)}
.btn--ghost:hover{color:var(--blue);transform:translateY(-3px)}

/* ---------- Hero 右侧拼贴 ---------- */
.collage{position:relative}
.sheet{
  position:relative;padding:2.4rem 1.7rem 1.5rem;
  background:
    repeating-linear-gradient(0deg,transparent 0 29px,color-mix(in srgb,var(--blue) 8%,transparent) 29px 30px),
    var(--card-paper);
  filter:var(--drop);transform:rotate(-1.2deg);clip-path:var(--tear-card);
}
.sheet__stamp{
  position:absolute;right:14px;top:14px;display:grid;gap:4px;padding:10px 12px;
  border:1px solid var(--blue);color:var(--blue);transform:rotate(10deg);opacity:.6;
  font-family:var(--mono);font-size:.56rem;letter-spacing:.16em;text-align:center;line-height:1.5;
}
.sheet__stamp b{font-size:.62rem;font-weight:700;letter-spacing:.2em}
.snip{
  margin-top:1.4rem;background:color-mix(in srgb,var(--blue) 4%,var(--paper));
  padding:.9rem 1rem;clip-path:var(--tear-card);transform:rotate(-.8deg);
  display:grid;gap:.5rem;
}
.snip > div{display:grid;grid-template-columns:34px 1fr;gap:.7rem;align-items:baseline}
.snip dt{font-family:var(--mono);font-size:.6rem;letter-spacing:.1em;color:var(--blue);text-align:right}
.snip dd{font-size:.8rem;color:var(--muted);line-height:1.7}
.snip dd b{color:var(--ink);font-weight:700;white-space:nowrap}
/* 纸片底下那行：左边联系方式，右边手写的一句 */
.sheet__foot{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-top:.9rem}
.sheet__contact{display:inline-flex;align-items:baseline;gap:.5rem;white-space:nowrap;transition:opacity .22s}
.sheet__contact i{font-style:normal;font-size:.8rem;color:var(--blue)}
.sheet__contact b{color:var(--ink);font-weight:700;font-size:.85rem;border-bottom:1px solid var(--line-2);transition:border-color .22s,color .22s}
.sheet__contact:hover b{color:var(--blue);border-color:var(--blue)}
.scribble{color:var(--blue);font:italic 19px var(--serif);transform:rotate(-3deg);opacity:.85}
/* 剪下来贴上去的头像 */
.cut{width:118px;margin:0 auto;background:var(--paper);padding:9px;transform:rotate(2.4deg);filter:var(--drop-lift)}
.cut img{width:100%;height:auto}

/* ============================================================
   贯穿卡片
   够宽的屏幕上这张纸脱离文档流，固定在屏幕一侧，一节换一次边
   （Hero 在右、01 在左、02 在右…… 如此反复），一路跟着页面走。
   每一节的正文同时排到卡片的**对面**：小节上的 data-side 决定
   哪边留出卡片的位置，正文在剩下那条带里居中。
   卡片滑动只动 left（合成层的活），正文的左右是按节写死的，
   不跟着做动画 —— 否则整页每帧回流。
   ============================================================ */
@media(min-width:1150px){
  :root{
    /* 正文栏还是原来那条居中的 1080；卡片就停在它里面，
       宽度、左右位置都等于原来 Hero 右栏那一格（1fr : .82fr，gap 同款）。 */
    --wrap-w:min(1080px,92%);
    --hero-gap:clamp(2rem,5vw,4rem);
    --card-w:calc((var(--wrap-w) - var(--hero-gap)) * .45);
    --card-slot:calc(var(--card-w) + var(--hero-gap));
  }
  /* 卡片占掉哪半边，正文就往另一半缩 */
  .sec[data-side="right"] > .wrap,.band[data-side="right"] > .wrap{padding-right:var(--card-slot)}
  .sec[data-side="left"]  > .wrap,.band[data-side="left"]  > .wrap{padding-left:var(--card-slot)}

  .hero{grid-template-columns:1fr}          /* 卡片浮出去了，Hero 变单列 */
  .sheet--travel{
    position:fixed;z-index:30;width:var(--card-w);
    top:calc(var(--head-h) + 30px);
    left:calc(50% + var(--wrap-w) / 2 - var(--card-w));   /* 右：贴住正文栏右缘 */
    max-height:calc(100vh - var(--head-h) - 60px);overflow:auto;scrollbar-width:none;
    transition:left .65s cubic-bezier(.4,0,.2,1),opacity .45s;
  }
  /* 换边的那一瞬间卡片正好滑到画面外，淡入一下，别硬弹出来 */
  .sheet--travel.is-swap{opacity:0;transition:none}
  .side-left .sheet--travel{left:calc(50% - var(--wrap-w) / 2)}
  .sheet--travel::-webkit-scrollbar{display:none}
  .motion-off .sheet--travel{transition:none}

  /* 正文只剩半条带了，这几处跟着收成单列 / 更小的最小列宽。
     选择器要带上 .page —— 这几条的基础规则写在本块后面，同权重会被盖掉。 */
  .page .works{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}
  .page .about,.page .contact{grid-template-columns:1fr}
}

@media(max-width:900px){
  .hero{grid-template-columns:1fr;padding-top:2rem}
  .collage{max-width:400px;margin-inline:auto}
  .hero__pencil{margin-left:1rem}
}

/* ---------- 卡片上的小人（canvas + 旁白） ----------
   它现在长在贯穿卡片里，跟着卡片一起走；换到下一节碎成纸片再拼回来。 */
.journey{position:relative;margin:.2rem auto 0;width:min(185px,45%);opacity:0;transition:opacity .6s}
.journey.is-mounted{opacity:1}
.journey__stage{position:relative;width:100%;aspect-ratio:1/1}
.journey__cv{width:100%;height:100%;display:block;opacity:0}
.journey__cv.is-ready{opacity:1;transition:opacity .4s}
.journey__cap{text-align:center;color:var(--muted);margin-top:-6%}
.journey__n{display:flex;align-items:center;justify-content:center;gap:.5rem;font-family:var(--mono);font-size:.58rem;letter-spacing:.12em;color:var(--blue)}
.journey__n s{display:block;width:30px;height:1px;background:currentColor;opacity:.4;text-decoration:none}
.journey__n span{color:var(--faint)}
.journey__cap p{margin-top:.3rem;color:var(--ink);font-size:.8rem;font-weight:600;line-height:1.6}
.journey__cap small{color:var(--faint);font-size:.7rem;line-height:1.5;display:block}

/* ============================================================
   01 作品
   ============================================================ */
.works{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:clamp(1.6rem,3vw,2.4rem)}
.work{
  --card-angle:-1deg;
  position:relative;isolation:isolate;display:flex;flex-direction:column;
  padding:13px 13px 10px;color:inherit;background:var(--card-paper);
  clip-path:var(--tear-card);transform:rotate(var(--card-angle));filter:var(--drop);
  transition:transform .22s,filter .22s;
}
.work:nth-child(2n){--card-angle:.9deg}
.work:nth-child(3n){--card-angle:-.5deg}
.work::after{  /* 贴在卡片上的那条胶带 */
  content:"";position:absolute;top:-9px;left:34%;width:66px;height:23px;z-index:2;pointer-events:none;
  background:var(--tape);opacity:.88;transform:rotate(-7deg);clip-path:var(--tear-tape);
}
.work:nth-child(2n)::after{left:49%;transform:rotate(8deg)}
.work:hover{transform:translateY(-4px) rotate(0deg);filter:var(--drop-lift)}
.work:active{transform:translateY(-1px) rotate(0deg)}
.motion-off .work{transition:none}

/* 卡片上的「窗口」：跟随鼠标做一点点倾斜（JS 只写 CSS 变量） */
.work__win{
  position:relative;height:158px;overflow:hidden;background:var(--paper-2);
  border:1px solid var(--line);
  transform:perspective(720px)
            rotateX(var(--tilt-x,0deg)) rotateY(var(--tilt-y,0deg))
            translate(var(--shift-x,0px),var(--shift-y,0px)) scale(var(--tscale,1));
  transition:transform .3s cubic-bezier(.2,.7,.3,1);
}
.motion-off .work__win{transition:none;transform:none}
.work__win::after{
  content:"";position:absolute;inset:26px 0 0;
  background:repeating-linear-gradient(-45deg,color-mix(in srgb,var(--blue) 5%,transparent) 0 8px,transparent 8px 18px);
}
.work__win svg{
  position:absolute;left:50%;top:calc(50% + 13px);width:54px;height:54px;transform:translate(-50%,-50%);
  stroke:var(--blue);fill:none;stroke-width:1.15;opacity:.8;z-index:1;
}
.work__bar{
  position:absolute;top:0;left:0;right:0;height:26px;background:var(--paper);
  border-bottom:1px solid var(--line);display:flex;align-items:center;gap:5px;padding:0 9px;z-index:1;
}
.work__bar i{width:7px;height:7px;border-radius:50%;background:var(--line-2);display:block}
.work__bar span{margin-left:auto;font-family:var(--mono);font-size:.58rem;letter-spacing:.08em;color:var(--faint)}
.work__body{padding:.95rem .35rem .3rem}
.work__no{display:flex;align-items:center;gap:.6rem;font-family:var(--mono);font-size:.64rem;letter-spacing:.14em;color:var(--blue)}
.work__no s{color:var(--faint);text-decoration:none}
.work__t{display:flex;align-items:baseline;gap:.5rem;margin-top:.3rem}
.work__t b{font-size:1.1rem;font-weight:800;color:var(--ink)}
.work__t i{margin-left:auto;font-style:normal;color:var(--blue);opacity:0;translate:-4px 4px;transition:opacity .25s,translate .25s}
.work:hover .work__t i{opacity:1;translate:0 0}
.work__d{margin-top:.3rem;font-size:.87rem;color:var(--muted);line-height:1.75}
.work__tags{display:flex;flex-wrap:wrap;gap:.35rem;margin-top:.75rem}
.work__tags span{font-family:var(--mono);font-size:.6rem;letter-spacing:.05em;color:var(--muted);border:1px solid var(--line);padding:.12rem .42rem}
.work__live{
  position:absolute;top:36px;right:22px;z-index:3;display:inline-flex;align-items:center;gap:.3rem;
  background:var(--paper);border:1px solid var(--line);padding:.1rem .45rem;
  font-family:var(--mono);font-size:.58rem;letter-spacing:.1em;color:var(--blue);
}
.work__live::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--blue);animation:blink 1.8s infinite}
@keyframes blink{0%,100%{opacity:1}50%{opacity:.25}}

/* ============================================================
   02 关于 / 承接什么
   ============================================================ */
.about{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:clamp(1.6rem,4vw,3rem);align-items:start}
.can{display:grid;gap:.5rem}
.can li{
  display:flex;align-items:flex-start;gap:.7rem;padding:.65rem .9rem;background:var(--paper-2);
  color:var(--ink);font-weight:600;font-size:.93rem;line-height:1.7;
}
.can li em{font-family:var(--mono);font-style:normal;font-size:.62rem;color:var(--blue);padding-top:.5em;letter-spacing:.08em}
/* 能点进去的那几条：整条都是热区，右边补个箭头 */
.can li.is-link{padding:0;transition:background .22s}
.can li.is-link a{
  display:flex;align-items:flex-start;gap:.7rem;width:100%;
  padding:.65rem .9rem;color:inherit;transition:color .22s;
}
.can li.is-link i{
  margin-left:auto;font-style:normal;color:var(--blue);
  opacity:.5;transition:opacity .22s,translate .22s;
}
.can li.is-link:hover{background:var(--blue-tint)}
.can li.is-link:hover a{color:var(--blue-deep)}
.can li.is-link:hover i{opacity:1;translate:2px -2px}
.can li.is-link.is-down:hover i{translate:0 2px}   /* 站内往下跳的那条 */

/* 悬停（或聚焦）弹出小程序码的那条 */
.can li.is-qr{position:relative;cursor:pointer;transition:background .22s}
.can li.is-qr:hover,.can li.is-qr:focus-within{background:var(--blue-tint);outline:none}
.can li.is-qr > i{
  margin-left:auto;font-style:normal;font-family:var(--mono);font-size:.6rem;
  letter-spacing:.1em;color:var(--blue);opacity:.55;padding-top:.45em;transition:opacity .22s;
}
.can li.is-qr:hover > i,.can li.is-qr:focus-within > i{opacity:1}
.qrpop{
  position:absolute;bottom:calc(100% + 12px);right:10px;z-index:20;width:190px;
  padding:10px 10px 8px;background:var(--paper);border:1px solid var(--line);
  filter:var(--drop-lift);text-align:center;pointer-events:none;
  opacity:0;visibility:hidden;translate:0 8px;
  transition:opacity .22s,translate .22s,visibility .22s;
}
.qrpop::before{ /* 贴一条胶带，和别处的纸片一个做法 */
  content:"";position:absolute;top:-8px;left:50%;width:64px;height:18px;margin-left:-32px;
  background:var(--tape);transform:rotate(-3deg);clip-path:var(--tear-tape);
}
.qrpop img{width:100%;height:auto;display:block}
.qrpop figcaption{
  margin-top:.45rem;font-family:var(--mono);font-size:.54rem;letter-spacing:.05em;
  color:var(--faint);line-height:1.6;
}
.can li.is-qr:hover .qrpop,.can li.is-qr:focus-within .qrpop{opacity:1;visibility:visible;translate:0 0}
.motion-off .qrpop{transition:none}
.skills{padding:1.5rem 1.7rem 1.7rem}
.skills h3{font-size:.95rem;color:var(--ink);margin-bottom:1rem;display:flex;align-items:center;gap:.6rem}
.skills h3 .mono{color:var(--faint);font-weight:400}
.skills .row{display:grid;grid-template-columns:74px 1fr;gap:.8rem;align-items:baseline;margin-bottom:.7rem}
.skills dt{font-family:var(--mono);font-size:.62rem;letter-spacing:.1em;color:var(--faint);text-align:right}
.skills dd{font-size:.87rem;color:var(--body)}

.why{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:1rem;margin-top:clamp(1.8rem,4vw,2.8rem)}
.why div{padding:1rem 1.1rem;background:var(--paper-2)}
.why b{display:block;color:var(--ink);font-size:.97rem}
.why span{font-size:.83rem;color:var(--muted)}

@media(max-width:820px){
  .about{grid-template-columns:1fr}
}

/* ============================================================
   03 文章
   ============================================================ */
.notes{border-top:1px solid var(--line)}
.note{
  display:grid;grid-template-columns:96px minmax(0,1fr) auto;gap:1rem;align-items:baseline;
  padding:.85rem .4rem;border-bottom:1px solid var(--line);color:inherit;
  transition:background .2s,padding .2s;
}
.note:hover{background:var(--paper-2);padding-inline:.9rem}
.note__d{font-family:var(--mono);font-size:.66rem;letter-spacing:.08em;color:var(--faint)}
.note__t{font-size:.95rem;color:var(--ink);font-weight:600;line-height:1.7}
.note:hover .note__t,.note:hover .note__g{color:var(--blue)}
.note__g{color:var(--faint);font-size:.85rem}
.notes__more{display:flex;justify-content:center;margin-top:1.6rem}
@media(max-width:640px){
  .note{grid-template-columns:1fr auto;gap:.2rem 1rem}
  .note__d{grid-column:1/-1}
}

/* ============================================================
   04 经历
   ============================================================ */
.jr{display:grid;gap:clamp(2rem,5vw,4rem);align-items:start}
.tl{position:relative;padding-left:1.5rem}
.tl::before{content:"";position:absolute;left:4px;top:.6rem;bottom:.6rem;width:1px;background:var(--line-2)}
.tl li{position:relative;padding-bottom:1.8rem}
.tl li::before{
  content:"";position:absolute;left:-1.5rem;top:.62rem;width:9px;height:9px;border-radius:50%;
  background:var(--paper);border:1.5px solid var(--line-2);
}
.tl li:first-child::before{background:var(--blue);border-color:var(--blue)}
.tl__d{font-family:var(--mono);font-size:.66rem;letter-spacing:.1em;color:var(--faint)}
.tl li:first-child .tl__d{color:var(--blue)}
.tl__t{display:block;font-size:1.01rem;font-weight:700;color:var(--ink);margin-top:.1rem}
.tl__x{font-size:.87rem;color:var(--muted)}

/* ============================================================
   05 联系
   ============================================================ */
.contact{display:grid;grid-template-columns:minmax(0,.78fr) minmax(0,1fr);gap:clamp(2rem,5vw,3.6rem);align-items:start}
.letter{position:relative;padding:clamp(1.6rem,2.6vw,2.4rem);background:var(--blue-tint);clip-path:var(--tear-card)}
.letter__go{position:absolute;top:1.5rem;right:1.8rem;color:var(--blue);font-size:1.1rem}
.mail{
  display:inline-block;max-width:100%;margin-top:1.2rem;font-weight:700;color:var(--ink);
  font-size:clamp(.95rem,1.6vw,1.2rem);letter-spacing:-.02em;overflow-wrap:anywhere;
  border-bottom:1px solid var(--line-2);padding-bottom:.1em;transition:color .22s,border-color .22s;
}
.mail:hover{color:var(--blue);border-color:var(--blue)}
.chips{display:flex;flex-wrap:wrap;gap:.6rem;margin-top:1.4rem}
.chip{
  display:inline-flex;align-items:center;gap:.45rem;background:var(--paper);border:1px solid var(--line);
  padding:.45em .9em;font-size:.85rem;font-weight:600;color:var(--ink);white-space:nowrap;
  transition:border-color .22s,color .22s,transform .22s;
}
.chip:hover{border-color:var(--blue);color:var(--blue);transform:translateY(-2px)}
.chip svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.5}
.chip small{font-family:var(--mono);font-size:.6rem;color:var(--faint);letter-spacing:.05em}
.chip:hover small{color:var(--blue)}
.sign{margin-top:2rem}
.sign small{font-family:var(--serif);font-style:italic;color:var(--muted);display:block}
.sign b{font-family:var(--serif);font-size:1.5rem;color:var(--blue);font-weight:400;letter-spacing:.02em}

/* 二维码 */
.qrs{display:flex;flex-wrap:wrap;gap:1rem;margin-top:1.6rem}
.qr{width:102px;text-align:center;background:var(--paper);padding:8px 8px 6px;filter:var(--drop);border:1px solid var(--line)}
.qr:nth-child(2){transform:rotate(1.4deg)}
.qr:nth-child(3){transform:rotate(-1.6deg)}
.qr figcaption{font-family:var(--mono);font-size:.54rem;letter-spacing:.05em;color:var(--faint);margin-top:.35rem;line-height:1.6}

/* 留言表单 */
.mbox{padding:clamp(1.4rem,3vw,2rem)}
.mbox h3{font-size:1.05rem;color:var(--ink);font-weight:800}
.mbox .hint{font-size:.85rem;color:var(--muted);margin:.3rem 0 1.2rem}
.mf-l{display:block;margin-bottom:.9rem}
.mf-t{display:block;font-family:var(--mono);font-size:.62rem;letter-spacing:.12em;color:var(--faint);margin-bottom:.4rem}
.mf-req{color:var(--blue)}
.mbox textarea,.mbox input{
  width:100%;font-family:inherit;font-size:.92rem;color:var(--ink);line-height:1.8;
  background:var(--paper-2);border:1px solid var(--line);padding:.65rem .8rem;resize:vertical;
  transition:border-color .22s,background .22s;
}
.mbox textarea:focus,.mbox input:focus{outline:none;border-color:var(--blue);background:var(--paper)}
.mf-hp{position:absolute;left:-9999px;opacity:0;height:0}
.mf-btn{
  width:100%;background:var(--blue);color:#fff;padding:.8em 1em;font-weight:700;font-size:.93rem;
  transition:background .22s,transform .22s;
}
.mf-btn:hover:not(:disabled){background:var(--blue-deep);transform:translateY(-2px)}
.mf-btn:disabled{opacity:.6;cursor:default}
.mf-tip{min-height:1.6em;margin-top:.6rem;font-size:.85rem;text-align:center}
.mf-tip.ok{color:var(--blue)}
.mf-tip.err{color:#c0392b}
@media(max-width:820px){.contact{grid-template-columns:1fr}}

/* ============================================================
   页脚
   ============================================================ */
.foot{
  border-top:1px solid var(--line);padding:1.6rem 0 2.6rem;margin-top:2rem;
  display:flex;flex-wrap:wrap;gap:.6rem 1.4rem;align-items:center;font-size:.79rem;color:var(--faint);
}
.foot a{color:var(--faint);transition:color .22s}
.foot a:hover{color:var(--blue)}
.foot .sp{margin-left:auto}

/* 复制提示 */
.toast{
  position:fixed;left:50%;bottom:2.2rem;translate:-50% 14px;z-index:90;
  background:var(--ink);color:#fff;padding:.6em 1.2em;font-size:.85rem;
  opacity:0;pointer-events:none;transition:opacity .25s,translate .25s;box-shadow:var(--shadow-lift);
}
.toast.show{opacity:1;translate:-50% 0}

/* noscript 兜底 */
.nojs{padding:2rem 0;border-top:1px dashed var(--line)}
.nojs h2{font-size:1.1rem;color:var(--ink);margin:1.2rem 0 .5rem}
.nojs li{list-style:disc;margin-left:1.2rem}
