/* ===== 基础 ===== */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:var(--f-body);font-size:16.5px;line-height:1.85;
  -webkit-font-smoothing:antialiased;
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
h1,h2,h3,p,ul,ol,figure,li{margin:0}
ul,ol{padding:0;list-style:none}
button{font:inherit}

.wrap{max-width:var(--maxw);margin:0 auto;padding:0 var(--pad);position:relative}
.wrap--narrow{max-width:var(--maxw-narrow)}

/* ===== 顶部进度条 ===== */
.progress{position:fixed;top:0;left:0;right:0;height:2px;z-index:90}
.progress span{display:block;height:100%;width:0;background:var(--red)}

/* ===== 导航 ===== */
.nav{
  position:sticky;top:0;z-index:80;
  display:flex;align-items:center;justify-content:space-between;gap:24px;
  padding:15px var(--pad);
  background:var(--paper);
  border-bottom:1px solid var(--line);
}
.nav__brand{display:flex;align-items:center;gap:10px}
.nav__seal{
  display:grid;place-items:center;width:28px;height:28px;border-radius:0;
  background:var(--red);color:#fff;font-family:var(--f-display);font-size:15px;line-height:1;
}
.nav__name{font-family:var(--f-display);font-size:16.5px;letter-spacing:.1em}
.nav__links{display:flex;gap:clamp(16px,2.6vw,38px)}
.nav__links a{
  position:relative;font-size:14.5px;letter-spacing:.08em;color:var(--ink-2);
  padding:3px 0;transition:color .2s var(--ease);
}
.nav__links a::after{
  content:"";position:absolute;left:0;right:100%;bottom:0;height:1px;
  background:var(--red);transition:right .3s var(--ease);
}
.nav__links a:hover{color:var(--red)}
.nav__links a:hover::after,.nav__links a.is-active::after{right:0}
.nav__links a.is-active{color:var(--red)}

/* ===== 按钮 ===== */
.btn{
  display:inline-flex;align-items:center;justify-content:center;
  padding:12px 26px;border:1px solid var(--red);border-radius:0;
  font-size:14.5px;letter-spacing:.1em;cursor:pointer;background:transparent;color:var(--red);
  transition:background .22s var(--ease),color .22s var(--ease),transform .12s var(--ease);
}
.btn:hover{background:var(--red-soft)}
.btn:active{transform:translateY(1px)}
.btn--solid{background:var(--red);color:#fff}
.btn--solid:hover{background:var(--red-deep)}
.link-arrow{
  display:inline-block;color:var(--red);font-size:14.5px;letter-spacing:.06em;
  border-bottom:1px solid rgba(122,27,24,.4);padding-bottom:2px;
  transition:border-color .22s var(--ease)
}
.link-arrow:hover{border-color:var(--red)}

/* ===== 首屏（三维场景） ===== */
.hero{
  position:relative;background:#0d0a09;color:#EDE6D7;
  min-height:calc(100vh - 62px);
  display:grid;grid-template-rows:1fr auto;
  padding:0 var(--pad);overflow:hidden;
}
.hero__stage{position:absolute;inset:0;z-index:0}
#scene{display:block;width:100%;height:100%}
.no-webgl #scene{display:none}

.hero__fallback{
  position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  padding:8vh 6vw 10vh;
}
.hero__fallback svg{width:min(44vw,540px);height:auto}
.has-webgl .hero__fallback{display:none}
.hero__fallback .hmap__edge{fill:rgba(217,74,61,.06);stroke:rgba(217,74,61,.5)}
.hero__fallback .hmap__route{stroke:#d94a3d;stroke-width:9}
.hero__fallback .hmap__dot{fill:#f2e6cf;stroke:#0d0a09;stroke-width:4}

.hero__veil{
  position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(102deg,
    rgba(13,10,9,.97) 0%,
    rgba(13,10,9,.92) 26%,
    rgba(13,10,9,.55) 44%,
    rgba(13,10,9,.10) 64%,
    rgba(13,10,9,.30) 84%,
    rgba(13,10,9,.62) 100%);
}

.hero__content{
  position:relative;z-index:2;width:100%;max-width:var(--maxw);
  margin:0 auto;align-self:center;
  padding:clamp(40px,9vh,96px) 0 clamp(24px,4vh,48px);
}
.hero__kicker{
  display:inline-block;color:var(--gold);font-size:13.5px;letter-spacing:.16em;
  padding-bottom:12px;margin-bottom:clamp(16px,2.6vh,28px);
  border-bottom:1px solid rgba(237,230,215,.22);
}
.hero__title{
  font-family:var(--f-display);font-weight:600;color:#F5ECDA;
  font-size:clamp(44px,7vw,94px);line-height:1.05;letter-spacing:.07em;
}
.hero__fact{
  margin-top:clamp(16px,2.6vh,28px);max-width:23em;
  color:#B6AB99;font-size:17px;line-height:1.9;
}

.hero__strip{
  position:relative;z-index:2;
  max-width:var(--maxw);margin:0 auto;width:100%;
  display:grid;grid-template-columns:repeat(5,1fr);
  border-top:1px solid rgba(237,230,215,.18);
  padding:16px 0 20px;
}
.hero__strip li{
  font-family:var(--f-display);font-size:15px;letter-spacing:.12em;
  color:#DCD2BF;border-left:1px solid rgba(237,230,215,.13);padding-left:16px;
}
.hero__strip li:first-child{border-left:0;padding-left:0}
.hero__strip span{
  display:block;font-family:var(--f-num);font-size:11.5px;
  letter-spacing:.06em;color:#8A8073;margin-bottom:3px;
}

/* ===== 区块 ===== */
.sec{padding:clamp(56px,8vw,104px) 0}
.sec__title{
  font-family:var(--f-display);font-weight:600;
  font-size:clamp(26px,3.6vw,40px);line-height:1.25;letter-spacing:.06em;
}
.sec__lead{margin-top:14px;color:var(--ink-3);font-size:16px;max-width:32em}
.sec__head{display:flex;align-items:baseline;justify-content:space-between;gap:24px;flex-wrap:wrap}
.sec__aside{color:var(--ink-3);font-size:14px}
.sec__aside strong{color:var(--red);font-family:var(--f-num);font-size:18px}
.sec__more{margin-top:36px}

/* ===== 名录 ===== */
.sec--ledger{background:var(--paper)}
.ledger{margin-top:clamp(28px,4vw,48px);border-bottom:1px solid var(--line)}
.ledger li{
  display:grid;grid-template-columns:148px minmax(150px,210px) minmax(0,1fr);
  gap:clamp(14px,2.4vw,40px);
  padding:clamp(20px,2.8vw,30px) 0;
  border-top:1px solid var(--line);
  align-items:start;
}
.ledger time{
  font-family:var(--f-num);font-size:14.5px;letter-spacing:.1em;color:var(--red);padding-top:6px;
}
.ledger h3{font-family:var(--f-display);font-size:clamp(22px,2.4vw,29px);letter-spacing:.12em;font-weight:600}
.ledger__place{font-size:12.5px;color:var(--ink-3);letter-spacing:.06em;margin-top:6px}
.ledger__text{color:var(--ink-2);line-height:1.85}

/* ===== 今日 ===== */
.sec--today{background:#1A0E0C;color:var(--ink);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.today__grid{
  display:grid;grid-template-columns:200px minmax(0,1fr) 190px;
  gap:clamp(18px,3vw,48px);align-items:start;
}
.today__aside{
  border-left:1px solid rgba(247,242,232,.22);
  padding-left:clamp(16px,2vw,26px);
}
.today__count{
  font-size:12.5px;letter-spacing:.14em;color:rgba(247,242,232,.6);
}
.today__count strong{
  display:block;font-family:var(--f-num);font-size:40px;font-weight:400;
  line-height:1.1;color:#F7F2E8;letter-spacing:0;margin-bottom:4px;
}
.today__count-note{font-size:11.5px;letter-spacing:.08em;color:rgba(247,242,232,.5);margin-top:8px}
.today__link{
  display:inline-block;margin-top:18px;font-size:13px;letter-spacing:.06em;
  color:rgba(247,242,232,.92);border-bottom:1px solid rgba(247,242,232,.45);padding-bottom:2px;
  transition:border-color .2s var(--ease)
}
.today__link:hover{border-color:rgba(247,242,232,.9)}
.today__label{font-size:12.5px;letter-spacing:.16em;color:rgba(244,239,228,.62)}
.today__tag{
  font-family:var(--f-num);font-size:13.5px;letter-spacing:.08em;
  color:rgba(244,239,228,.9);margin-top:12px;
  padding-top:12px;border-top:1px solid rgba(244,239,228,.22);
}
.today__date{font-family:var(--f-num);font-size:14.5px;letter-spacing:.12em;color:rgba(244,239,228,.68)}
.today__title{
  font-family:var(--f-display);font-weight:600;
  font-size:clamp(28px,3.8vw,44px);letter-spacing:.08em;
  margin:8px 0 18px;color:#F7F2E8;
}
.today__text{max-width:34em;line-height:1.95;color:rgba(247,242,232,.9)}
.today__place{margin-top:18px;font-size:12.5px;letter-spacing:.1em;color:rgba(247,242,232,.52)}

/* ===== 留言 ===== */
.wallform{
  display:flex;gap:10px;align-items:stretch;flex-wrap:wrap;
  margin-top:clamp(24px,3vw,34px);
}
.input{
  padding:13px 15px;background:#17120F;border:1px solid var(--line);border-radius:0;
  font-family:var(--f-body);font-size:15.5px;color:var(--ink);
  transition:border-color .2s var(--ease);
}
.input:focus{outline:none;border-color:var(--red)}
.input--name{width:190px;flex:0 0 auto}
.input--grow{flex:1 1 320px;min-width:220px}
.input--area{resize:vertical;line-height:1.8}
.wallform__foot{display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap}
.wallform__tip{font-size:12.5px;color:var(--ink-3)}
.wallform--stack{display:flex;flex-direction:column;gap:20px;align-items:stretch}
.field{display:flex;flex-direction:column;gap:7px}
.field__label{font-size:12.5px;letter-spacing:.14em;color:var(--ink-3)}
.notice{
  padding:13px 17px;border-left:2px solid var(--red);background:var(--red-soft);
  font-size:15px;margin-bottom:22px;color:#F2CFC7;
}
.notice--ok{border-left-color:#5C9A5C;background:rgba(92,154,92,.12);color:#BCE0BC}

.wall{
  margin-top:clamp(26px,3.4vw,38px);
  display:grid;grid-template-columns:repeat(2,1fr);gap:0;
  border-top:1px solid var(--line);
}
.wall__item{
  padding:24px 26px 24px 0;border-bottom:1px solid var(--line);
}
.wall__item:nth-child(even){padding-left:26px;padding-right:0;border-left:1px solid var(--line)}
.wall__txt{font-size:15.5px;line-height:1.85;color:var(--ink);word-break:break-word}
.wall__meta{display:flex;justify-content:space-between;gap:12px;margin-top:14px;font-size:12px;color:var(--ink-3)}
.wall__time{font-family:var(--f-num);letter-spacing:.06em}
.wall__empty{grid-column:1/-1;padding:36px 0;color:var(--ink-3);border-bottom:1px solid var(--line)}

/* ===== 页头 ===== */
.pagehead{padding:clamp(64px,10vh,112px) 0 clamp(24px,4vw,40px);border-bottom:1px solid var(--line)}
.pagehead__crumb{font-size:13px;letter-spacing:.1em;color:var(--ink-3);margin-bottom:20px}
.pagehead__crumb a{color:var(--red)}
.pagehead__crumb span{margin:0 8px;opacity:.5}
.pagehead__title{
  font-family:var(--f-display);font-weight:600;
  font-size:clamp(34px,6vw,62px);line-height:1.15;letter-spacing:.06em;
}
.pagehead__lead{margin-top:18px;max-width:32em;color:var(--ink-2);font-size:16.5px}
.pagehead--404{padding-bottom:clamp(80px,14vh,140px)}

/* ===== 地图页 ===== */
.sec--map{padding-top:clamp(36px,5vw,56px)}
.mapcard{
  display:grid;grid-template-columns:1.4fr 1fr;gap:0;
  border:1px solid var(--line);
}
.mapcard__map{background:var(--paper-2);padding:clamp(14px,2.6vw,26px);position:relative;border-right:1px solid var(--line)}
.gansumap{width:100%;height:auto;display:block}
.gansumap__fill{fill:rgba(179,58,46,.10)}
.gansumap__edge{stroke:rgba(179,58,46,.55);stroke-width:2;stroke-linejoin:round}
.route{
  fill:none;stroke:var(--red);stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:1000;stroke-dashoffset:1000;
  transition:stroke-dashoffset 2.2s var(--ease) .15s;
}
.mapcard.is-in .route{stroke-dashoffset:0}
.marker{cursor:pointer;outline:none}
.marker__halo{fill:var(--red);opacity:.1;transition:opacity .25s var(--ease)}
.marker__dot{fill:var(--red);transition:fill .2s var(--ease)}
.marker__label{font-family:var(--f-body);font-size:12.5px;font-weight:600;fill:var(--ink-2);letter-spacing:.06em}
.marker:hover .marker__halo,.marker.is-active .marker__halo{opacity:.22}
.marker:hover .marker__label,.marker.is-active .marker__label{fill:var(--red)}
.gansumap__inset{
  position:absolute;top:clamp(12px,1.8vw,22px);left:clamp(12px,1.8vw,22px);
  width:clamp(74px,10vw,116px);height:auto;opacity:.92;
}
.mapcard__note{margin-top:10px;font-size:11px;letter-spacing:.1em;color:var(--ink-3);text-align:right}
.mapcard__panel{background:var(--paper);padding:clamp(22px,3vw,34px);display:flex;flex-direction:column;justify-content:space-between}
.mapdetail__item{display:none}
.mapdetail__item.is-active{display:block}
.mapdetail__date{font-family:var(--f-num);font-size:14px;letter-spacing:.12em;color:var(--red)}
.mapdetail__title{font-family:var(--f-display);font-size:clamp(26px,3vw,34px);letter-spacing:.12em;margin:8px 0 4px;font-weight:600}
.mapdetail__place{font-size:13px;color:var(--ink-3);letter-spacing:.06em}
.mapdetail__body{margin-top:16px;color:var(--ink-2);line-height:1.9}
.mapcard__hint{margin-top:24px;font-size:12px;color:var(--ink-3);letter-spacing:.08em}
.sec--mapnote{padding-top:clamp(36px,5vw,56px)}
.sec--timeline{padding-top:clamp(24px,3vw,40px)}
.sec--timeline .yearband:first-child{margin-top:0}
.prose{margin-top:20px}
.prose p{color:var(--ink-2);max-width:36em;margin-bottom:1.1em}
.prose p:last-child{margin-bottom:0;margin-top:1.6em}

/* ===== 时间线 ===== */
.yearband{display:flex;align-items:baseline;gap:18px;margin:clamp(36px,5vw,56px) 0 4px}
.yearband__num{font-family:var(--f-num);font-size:clamp(32px,4.4vw,48px);color:var(--red);letter-spacing:.04em}
.yearband__line{flex:1;height:1px;background:var(--line)}
.yearband__note{font-size:12.5px;letter-spacing:.12em;color:var(--ink-3)}
.tl{border-bottom:1px solid var(--line);margin-bottom:clamp(28px,4vw,44px)}
.tl__item{
  display:grid;grid-template-columns:132px minmax(0,1fr);gap:clamp(16px,3vw,44px);
  padding:clamp(18px,2.6vw,26px) 0;border-top:1px solid var(--line);
  align-items:start;
}
.tl__main{min-width:0}
.tl__dot{display:none}
.tl__date{font-family:var(--f-num);font-size:14px;letter-spacing:.1em;color:var(--red);padding-top:5px}
.tl__title{font-family:var(--f-display);font-size:clamp(20px,2.3vw,26px);letter-spacing:.1em;font-weight:600}
.tl__body{color:var(--ink-2);max-width:36em;margin-top:8px}
.tl__place{font-size:12.5px;color:var(--ink-3);margin-top:8px;letter-spacing:.06em}

/* ===== 页脚 ===== */
.foot{background:#0A0807;color:rgba(237,230,215,.72);border-top:1px solid var(--line)}
.foot__inner{
  max-width:var(--maxw);margin:0 auto;padding:clamp(40px,6vw,64px) var(--pad);
  display:grid;grid-template-columns:200px minmax(0,1fr) auto;
  gap:clamp(22px,4vw,56px);align-items:start;
}
.foot__brand{font-family:var(--f-display);font-size:22px;letter-spacing:.12em;color:#F7F2E8}
.foot__sub{font-size:12.5px;letter-spacing:.12em;color:rgba(247,242,232,.55);margin-top:6px}
.foot__col p{font-size:13px;line-height:1.9}
.foot__col--meta{text-align:right;font-family:var(--f-num);font-size:12px;letter-spacing:.06em;color:rgba(247,242,232,.56)}

/* ===== 动效 ===== */
.js [data-reveal]{
  opacity:0;transform:translateY(16px);
  transition:opacity .6s var(--ease), transform .6s var(--ease);
  transition-delay:calc(var(--i,0) * 55ms);
}
.js [data-reveal].is-in{opacity:1;transform:none}

/* ===== 响应式 ===== */
@media (max-width:960px){
  .hero{min-height:calc(100vh - 56px)}
  .hero__fallback{padding:14vh 8vw 16vh}
  .hero__fallback svg{width:min(70vw,420px)}
  .hero__strip{grid-template-columns:repeat(3,1fr);row-gap:14px}
  .ledger li{grid-template-columns:120px minmax(0,1fr);gap:10px 18px}
  .ledger time{padding-top:2px}
  .ledger__head{grid-column:2}
  .ledger__text{grid-column:2}
  .today__grid{grid-template-columns:1fr;gap:20px}
  .today__aside{border-left:0;border-top:1px solid rgba(247,242,232,.22);padding-left:0;padding-top:16px}
  .mapcard{grid-template-columns:1fr}
  .mapcard__map{border-right:0;border-bottom:1px solid var(--line)}
  .foot__inner{grid-template-columns:1fr;gap:22px}
  .foot__col--meta{text-align:left}
  .tl__item{grid-template-columns:1fr;gap:6px}
}
@media (max-width:620px){
  body{font-size:16px}
  .nav__name{display:none}
  .hero__strip{grid-template-columns:repeat(2,1fr)}
  .hero__title{letter-spacing:.04em}
  .wall{grid-template-columns:1fr}
  .wall__item:nth-child(even){padding-left:0;border-left:0}
  .ledger li{grid-template-columns:1fr}
  .ledger__head{grid-column:1}
  .ledger__text{grid-column:1}
  .input--name{width:100%}
  .wallform .btn{width:100%}
}

/* ===== 减弱动效 ===== */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none!important;transition:none!important}
  .js [data-reveal]{opacity:1;transform:none}
  .hmap__route,.route{stroke-dashoffset:0}
}
