/*
  桃之若 · 窗边小室
  空间化个人表达 + 克制过渡。
  纯 CSS / SVG / 原生 JS；无 Canvas、无依赖、无持续粒子动画。
*/

:root {
  --ease-room: cubic-bezier(.22, 1, .36, 1);
  --ease-soft: cubic-bezier(.2, .7, .2, 1);
  --motion-fast: 180ms;
  --motion-mid: 420ms;
  --motion-slow: 760ms;
  --room-cream: #f7f1e7;
  --room-wall: #eee7db;
  --room-line: #697074;
  --room-blue: #7c8aa8;
  --room-blue-soft: #cfd6e3;
  --room-teal: #6f948b;
  --room-warm: #e5bd78;
  --room-night: #22292d;
}

:root[data-theme="dark"] {
  --room-cream: #202526;
  --room-wall: #181d1f;
  --room-line: #aeb5b4;
  --room-blue: #9eabc8;
  --room-blue-soft: #394354;
  --room-teal: #87aaa1;
  --room-warm: #d9ad69;
  --room-night: #111719;
}

body.bespoke-room,
body:has(.room-card) {
  background-image:
    radial-gradient(circle at 8% 9%, color-mix(in srgb, var(--graph-teal) 7%, transparent), transparent 24rem),
    radial-gradient(circle at 92% 18%, color-mix(in srgb, var(--graph-violet) 8%, transparent), transparent 30rem),
    linear-gradient(90deg, color-mix(in srgb, var(--ink) 2.2%, transparent) 1px, transparent 1px);
  background-size: auto, auto, 64px 64px;
}

/* ---------- 首页：从数据图变成可进入的个人空间 ---------- */
.home-page .cover {
  min-height: clamp(45rem, calc(100svh - 5rem), 57rem);
}
.home-page .cover-inner {
  grid-template-columns: minmax(18rem, .68fr) minmax(34rem, 1.32fr);
  gap: clamp(2.4rem, 5vw, 5.8rem);
  max-width: 80rem;
}
.home-page .cover-copy { max-width: 31rem; }
.home-page .cover-title { font-size: clamp(3.8rem, 6.7vw, 5.9rem); }
.home-page .cover-poem { max-width: 25rem; line-height: 1.9; }
.cover-room-note {
  max-width: 23rem;
  margin: 2rem 0 0;
  padding: .75rem 0 .75rem 1rem;
  border-left: 2px solid color-mix(in srgb, var(--graph-violet) 44%, var(--line));
  color: var(--muted);
  font-size: .82rem;
  line-height: 1.8;
}
.cover-room-note span {
  display: block;
  margin-bottom: .2rem;
  color: var(--graph-teal);
  font-family: var(--font-mono);
  font-size: .62rem;
  letter-spacing: .11em;
}
.home-page .cover-bg img { opacity: .18; }

.room-card {
  position: relative;
  min-width: 0;
  overflow: hidden;
  padding: clamp(1rem, 2vw, 1.45rem);
  border: 1px solid color-mix(in srgb, var(--room-line) 30%, transparent);
  border-radius: 20px;
  background:
    linear-gradient(color-mix(in srgb, var(--room-line) 4%, transparent) 1px, transparent 1px),
    linear-gradient(90deg, color-mix(in srgb, var(--room-line) 4%, transparent) 1px, transparent 1px),
    color-mix(in srgb, var(--paper) 93%, transparent);
  background-size: 28px 28px, 28px 28px, auto;
  box-shadow: 0 30px 78px rgba(57, 62, 64, .11), inset 0 1px rgba(255, 255, 255, .52);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}
.room-card::before {
  content: "";
  position: absolute;
  z-index: 2;
  inset: 0 0 auto;
  height: 3px;
  background: linear-gradient(90deg, var(--graph-violet) 0 44%, var(--graph-teal) 44% 59%, transparent 59%);
}
html.has-js .room-card {
  opacity: 0;
  transform: translateY(12px) scale(.992);
  transition: opacity var(--motion-slow) var(--ease-room), transform var(--motion-slow) var(--ease-room);
}
html.has-js .room-card.is-room-ready { opacity: 1; transform: none; }

.room-head {
  position: relative;
  z-index: 3;
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 1rem;
  padding: .2rem 0 .85rem;
  border-bottom: 1px solid var(--line);
}
.room-kicker {
  display: block;
  margin-bottom: .25rem;
  color: var(--graph-violet);
  font-family: var(--font-mono);
  font-size: .65rem;
  letter-spacing: .12em;
}
.room-head h2 {
  margin: 0;
  font-size: clamp(1.25rem, 2.1vw, 1.55rem);
  font-weight: 600;
  letter-spacing: .06em;
}
.room-status {
  display: inline-flex;
  align-items: center;
  gap: .45rem;
  padding-top: .2rem;
  color: var(--muted);
  font-family: var(--font-mono);
  font-size: .64rem;
  white-space: nowrap;
}
.room-status i {
  width: 7px;
  height: 7px;
  border-radius: 2px;
  background: var(--graph-teal);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--graph-teal) 14%, transparent);
}

.room-scene { position: relative; margin: .8rem 0 .45rem; }
.room-scene svg { display: block; width: 100%; height: auto; overflow: visible; }
.room-wall { fill: color-mix(in srgb, var(--room-wall) 94%, transparent); stroke: color-mix(in srgb, var(--room-line) 28%, transparent); }
.room-sunwash { opacity: .62; pointer-events: none; }
.room-light-start { stop-color: color-mix(in srgb, var(--room-warm) 26%, transparent); }
.room-light-end { stop-color: transparent; }
.room-sky-top { stop-color: color-mix(in srgb, var(--room-blue-soft) 80%, var(--room-cream)); }
.room-sky-bottom { stop-color: color-mix(in srgb, var(--room-warm) 45%, var(--room-cream)); }
:root[data-theme="dark"] .room-sky-top { stop-color: #263442; }
:root[data-theme="dark"] .room-sky-bottom { stop-color: #384247; }
:root[data-theme="dark"] .room-sunwash { opacity: .28; }

.room-window-frame { fill: color-mix(in srgb, var(--room-cream) 75%, var(--room-line)); stroke: color-mix(in srgb, var(--room-line) 55%, transparent); stroke-width: 2; }
.room-window-bar { fill: none; stroke: color-mix(in srgb, var(--room-line) 50%, transparent); stroke-width: 5; }
.room-sun { fill: color-mix(in srgb, var(--room-warm) 80%, #fff); opacity: .88; }
.room-hill--back { fill: color-mix(in srgb, var(--room-blue) 45%, var(--room-cream)); }
.room-hill--front { fill: color-mix(in srgb, var(--room-teal) 60%, var(--room-cream)); }

.room-shelf > path:first-child,
.room-branch,
.room-floor-line { fill: none; stroke: color-mix(in srgb, var(--room-line) 58%, transparent); stroke-width: 3; stroke-linecap: round; }
.room-book--one { fill: color-mix(in srgb, var(--room-blue) 74%, var(--room-cream)); }
.room-book--two { fill: color-mix(in srgb, var(--room-teal) 72%, var(--room-cream)); }
.room-book--three { fill: color-mix(in srgb, var(--room-warm) 54%, var(--room-cream)); }
.room-vase { fill: color-mix(in srgb, var(--room-blue-soft) 74%, var(--room-cream)); stroke: color-mix(in srgb, var(--room-line) 38%, transparent); }
.room-desk { fill: color-mix(in srgb, var(--room-line) 72%, var(--room-cream)); }
.room-desk-leg { fill: none; stroke: color-mix(in srgb, var(--room-line) 62%, var(--room-cream)); stroke-width: 10; }

.room-lamp > path:first-child { fill: none; stroke: var(--room-line); stroke-width: 8; stroke-linecap: round; stroke-linejoin: round; }
.room-lamp-shade { fill: color-mix(in srgb, var(--room-blue) 78%, var(--room-cream)); stroke: color-mix(in srgb, var(--room-line) 55%, transparent); stroke-width: 2; }
.room-lamp-pivot, .room-lamp-base { fill: var(--room-line); }
.room-lamp-glow { fill: color-mix(in srgb, var(--room-warm) 13%, transparent); stroke: none; }
:root[data-theme="dark"] .room-lamp-glow { fill: color-mix(in srgb, var(--room-warm) 24%, transparent); }

.room-monitor { fill: color-mix(in srgb, var(--room-line) 78%, var(--room-cream)); }
.room-monitor-screen { fill: color-mix(in srgb, var(--room-night) 93%, var(--room-blue)); stroke: color-mix(in srgb, var(--room-blue) 28%, transparent); }
.room-monitor-neck { fill: none; stroke: color-mix(in srgb, var(--room-line) 72%, var(--room-cream)); stroke-width: 9; stroke-linecap: round; }
.room-screen-line { fill: none; stroke: var(--room-teal); stroke-width: 5; stroke-linecap: round; opacity: .7; }
.room-screen-line--two { stroke: var(--room-blue); opacity: .78; }
.room-screen-line--three { stroke: color-mix(in srgb, var(--room-warm) 80%, #fff); opacity: .55; }

.room-notebook { fill: color-mix(in srgb, var(--room-blue) 68%, var(--room-cream)); }
.room-notebook-page { fill: color-mix(in srgb, var(--room-cream) 96%, #fff); stroke: color-mix(in srgb, var(--room-line) 25%, transparent); }
.room-notebook-spine, .room-notebook-line { fill: none; stroke: color-mix(in srgb, var(--room-line) 48%, transparent); stroke-width: 2; stroke-linecap: round; }
.room-pencil { fill: none; stroke: color-mix(in srgb, var(--room-warm) 78%, var(--room-line)); stroke-width: 5; stroke-linecap: round; }

.room-photo { fill: color-mix(in srgb, var(--room-cream) 93%, #fff); stroke: color-mix(in srgb, var(--room-line) 38%, transparent); stroke-width: 2; }
.room-photo-inner { fill: color-mix(in srgb, var(--room-blue-soft) 68%, var(--room-cream)); }
.room-photo-mountain { fill: none; stroke: var(--room-teal); stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; }
.room-photo-sun { fill: var(--room-warm); }
.room-note-pin { fill: color-mix(in srgb, var(--room-warm) 31%, var(--room-cream)); stroke: color-mix(in srgb, var(--room-line) 33%, transparent); stroke-width: 2; }
.room-pin { fill: var(--room-blue); }
.room-note-sign { fill: none; stroke: color-mix(in srgb, var(--room-line) 52%, transparent); stroke-width: 3; stroke-linecap: round; }
.room-mug path { fill: color-mix(in srgb, var(--room-teal) 54%, var(--room-cream)); stroke: color-mix(in srgb, var(--room-line) 38%, transparent); stroke-width: 2; }
.room-mug .room-steam { fill: none; stroke: color-mix(in srgb, var(--room-line) 42%, transparent); stroke-width: 2; stroke-linecap: round; }

.room-object { cursor: pointer; outline: none; }
.room-object > g:first-of-type {
  transform-box: fill-box;
  transform-origin: center bottom;
  transition: transform var(--motion-mid) var(--ease-room), filter var(--motion-mid) ease;
}
.room-object-label { opacity: 0; transition: opacity var(--motion-fast) ease; pointer-events: none; }
.room-object-label rect { fill: color-mix(in srgb, var(--room-night) 84%, transparent); }
.room-object-label text { fill: #fff; font-family: var(--font-mono); font-size: 10px; text-anchor: middle; dominant-baseline: middle; letter-spacing: .04em; }
.room-object:hover > g:first-of-type,
.room-object:focus-visible > g:first-of-type { transform: translateY(-6px); }
.room-object:hover .room-object-label,
.room-object:focus-visible .room-object-label { opacity: 1; }
.room-object:focus-visible > g:first-of-type { filter: drop-shadow(0 0 7px color-mix(in srgb, var(--graph-violet) 55%, transparent)); }

.room-key {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  border-top: 1px solid var(--line);
}
.room-key a {
  position: relative;
  min-width: 0;
  padding: .75rem .65rem .15rem;
  transition: color var(--motion-fast) ease, background var(--motion-mid) ease;
}
.room-key a + a { border-left: 1px solid var(--line); }
.room-key span { display: block; color: var(--graph-teal); font-family: var(--font-mono); font-size: .62rem; }
.room-key strong { display: block; margin-top: .12rem; font-size: .9rem; font-weight: 600; letter-spacing: .05em; }
.room-key em { display: block; overflow: hidden; margin-top: .12rem; color: var(--faint); font-family: var(--font-mono); font-size: .6rem; font-style: normal; text-overflow: ellipsis; white-space: nowrap; }
.room-key a::after {
  content: "";
  position: absolute;
  right: .65rem;
  bottom: -.2rem;
  left: .65rem;
  height: 2px;
  background: var(--graph-violet);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--motion-mid) var(--ease-room);
}
.room-key a:hover,
.room-key a:focus-visible { color: var(--graph-violet); background: color-mix(in srgb, var(--graph-violet-soft) 20%, transparent); }
.room-key a:hover::after,
.room-key a:focus-visible::after { transform: scaleX(1); }

.room-card[data-room-active="notes"] .room-object--notes > g:first-of-type,
.room-card[data-room-active="writing"] .room-object--writing > g:first-of-type,
.room-card[data-room-active="gallery"] .room-object--gallery > g:first-of-type,
.room-card[data-room-active="about"] .room-object--about > g:first-of-type { transform: translateY(-6px); }
.room-card[data-room-active="notes"] .room-object--notes .room-object-label,
.room-card[data-room-active="writing"] .room-object--writing .room-object-label,
.room-card[data-room-active="gallery"] .room-object--gallery .room-object-label,
.room-card[data-room-active="about"] .room-object--about .room-object-label { opacity: 1; }
.room-card[data-room-active="notes"] .room-key [data-room-target="notes"]::after,
.room-card[data-room-active="writing"] .room-key [data-room-target="writing"]::after,
.room-card[data-room-active="gallery"] .room-key [data-room-target="gallery"]::after,
.room-card[data-room-active="about"] .room-key [data-room-target="about"]::after { transform: scaleX(1); }

/* 页面入口变成一组真正有节奏的“桌面物件”，仍保持轻量 */
.portal-card { overflow: hidden; isolation: isolate; }
.portal-card::before {
  position: absolute;
  z-index: 2;
  top: 1.65rem;
  left: 1.65rem;
  min-width: 2.2rem;
  padding: .2rem .35rem;
  border: 1px solid rgba(255,255,255,.45);
  border-radius: 999px;
  background: rgba(28,32,33,.46);
  color: rgba(255,255,255,.9);
  font-family: var(--font-mono);
  font-size: .56rem;
  letter-spacing: .08em;
  text-align: center;
  backdrop-filter: blur(6px);
}
.portal-card:nth-child(1)::before { content: "01 / NOTE"; }
.portal-card:nth-child(2)::before { content: "02 / READ"; }
.portal-card:nth-child(3)::before { content: "03 / LIGHT"; }
.portal-card:nth-child(4)::before { content: "04 / SELF"; }
.portal-card,
.portal-card .pc-frame img,
.portal-card .pc-arrow { transition-timing-function: var(--ease-room); }
.portal-card:hover { transform: translateY(-5px); }
.portal-card:hover .pc-frame img { transform: scale(1.035); }
.portal-card:hover .pc-arrow { transform: translateX(6px); }

.doc-row { transition-duration: var(--motion-mid); transition-timing-function: var(--ease-soft); }
.doc-title a,
.recent-all a,
.contact-link { transition-duration: var(--motion-fast); }

/* ---------- 关于页：个人身份是反复留下来的线索，而非简历 ---------- */
.about-page .page-hero {
  min-height: clamp(22rem, 48vh, 31rem);
  display: grid;
  align-content: end;
  background:
    radial-gradient(circle at 78% 28%, color-mix(in srgb, var(--room-warm) 16%, transparent), transparent 16rem),
    radial-gradient(circle at 18% 72%, color-mix(in srgb, var(--graph-violet) 10%, transparent), transparent 24rem),
    linear-gradient(color-mix(in srgb, var(--graph-charcoal) 3.5%, transparent) 1px, transparent 1px),
    color-mix(in srgb, var(--paper) 95%, transparent);
  background-size: auto, auto, 36px 36px, auto;
}
.about-page .page-hero h1 { max-width: 15em; font-size: clamp(2.35rem, 5.5vw, 4rem); }
.about-page .about-letter { max-width: 58rem; }
.about-page .about-letter > p { max-width: 44rem; }

.about-compass {
  display: grid;
  grid-template-columns: minmax(15rem, .76fr) minmax(0, 1.24fr);
  gap: clamp(2rem, 5vw, 5rem);
  margin: clamp(3.5rem, 7vw, 6rem) 0 0;
  padding: clamp(1.5rem, 3vw, 2.3rem);
  border: 1px solid var(--line-ink);
  border-radius: 18px;
  background:
    linear-gradient(color-mix(in srgb, var(--room-line) 4%, transparent) 1px, transparent 1px),
    linear-gradient(90deg, color-mix(in srgb, var(--room-line) 4%, transparent) 1px, transparent 1px),
    color-mix(in srgb, var(--paper) 92%, transparent);
  background-size: 28px 28px, 28px 28px, auto;
}
.about-compass-intro { align-self: start; position: sticky; top: 7rem; }
.about-compass-kicker {
  margin: 0 0 .65rem !important;
  color: var(--graph-teal) !important;
  font-family: var(--font-mono);
  font-size: .63rem;
  letter-spacing: .13em;
}
.about-compass-intro h2 { margin: 0; font-size: clamp(1.45rem, 2.6vw, 2rem); line-height: 1.55; letter-spacing: .02em; }
.about-compass-intro > p:last-child { margin: .8rem 0 0; color: var(--muted); font-size: .9rem; }
.about-clues { margin: 0; padding: 0; list-style: none; }
.about-clues li {
  display: grid;
  grid-template-columns: 2.7rem minmax(0, 1fr);
  gap: 1rem;
  padding: 1.25rem 0;
  border-bottom: 1px solid var(--line);
  transition: transform var(--motion-mid) var(--ease-room), color var(--motion-fast) ease;
}
.about-clues li:first-child { padding-top: .2rem; }
.about-clues li:last-child { border-bottom: 0; padding-bottom: .2rem; }
.about-clues li:hover { transform: translateX(5px); }
.about-clue-no { color: var(--graph-violet); font-family: var(--font-mono); font-size: .68rem; }
.about-clues strong { display: block; font-size: 1.08rem; font-weight: 600; letter-spacing: .05em; }
.about-clues p { margin: .35rem 0 0 !important; color: var(--muted) !important; font-size: .9rem; line-height: 1.9 !important; }
.about-topics--rooms { margin-top: clamp(3rem, 6vw, 5rem); }
.about-topics--rooms .topic { transition: padding var(--motion-mid) var(--ease-room), background var(--motion-mid) ease; }
.about-topics--rooms .topic:hover { padding-right: .7rem; padding-left: .7rem; background: color-mix(in srgb, var(--graph-violet-soft) 22%, transparent); }
.about-topics--rooms dt { color: var(--graph-violet); }

/* 二级页保留同一“房间”的过渡语言，但不强行做卡片 */
.page-hero h1,
.page-hero .lead,
.about-letter,
.doc-list,
.gallery-flow,
.jot-list { transition-timing-function: var(--ease-room); }
.nav a::after { transition-duration: var(--motion-mid); transition-timing-function: var(--ease-room); }
.theme-toggle { transition-duration: var(--motion-mid); transition-timing-function: var(--ease-room); }

@media (max-width: 1080px) {
  .home-page .cover-inner {
    grid-template-columns: 1fr;
    max-width: 48rem;
    gap: 2.4rem;
  }
  .home-page .cover-copy { max-width: 38rem; }
  .room-card { width: 100%; }
}

@media (max-width: 760px) {
  .room-key { grid-template-columns: 1fr 1fr; }
  .room-key a:nth-child(3) { border-left: 0; border-top: 1px solid var(--line); }
  .room-key a:nth-child(4) { border-top: 1px solid var(--line); }
  .about-compass { grid-template-columns: 1fr; gap: 1.8rem; }
  .about-compass-intro { position: static; }
  .about-clues li:hover { transform: none; }
}

@media (max-width: 640px) {
  .home-page .cover-inner { padding-top: 2.8rem; }
  .home-page .cover-title { font-size: 3.45rem; }
  .room-card { padding: .82rem; border-radius: 14px; }
  .room-head { display: block; }
  .room-status { margin-top: .45rem; }
  .room-scene { margin-right: -.25rem; margin-left: -.25rem; }
  .room-object-label { display: none; }
  .room-key a { padding: .65rem .55rem .25rem; }
  .portal-card::before { top: 1.3rem; left: 1.3rem; }
  .about-page .page-hero { min-height: 20rem; }
  .about-page .page-hero h1 { font-size: 2.25rem; }
  .about-compass { padding: 1.15rem; border-radius: 14px; }
  .about-clues li { grid-template-columns: 2.2rem minmax(0, 1fr); }
}

@media (prefers-reduced-motion: reduce) {
  html.has-js .room-card { opacity: 1; transform: none; }
  .room-object > g:first-of-type,
  .room-key a,
  .room-key a::after,
  .about-clues li { transition: none !important; transform: none !important; }
}
