
    /* === tokens === */
    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
    :root {
      --paper: #FAFAF9;
      --paper-noise: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
      --paper-edge: #E7E5E4;
      --spine-line: rgba(90, 87, 80, 0.13);
      --spine-glow: rgba(0, 0, 0, 0.036);
      --bg-dark: #1C1917;
      --text: #FAFAF9;
      --text-muted: #A8A29E;
      --text-ink: #0C0A09;
      --text-ink-muted: #57534E;
      --accent: #CA8A04;
      --accent-soft: #D97706;
      --accent-bg: #292524;
      --accent-glow: rgba(202, 138, 4, 0.28);
      --chrome: rgba(28, 25, 23, 0.88);
      --font-display: "Playfair Display", "Noto Serif SC", "Songti SC", serif;
      --font-ui: "Inter", "PingFang SC", "Microsoft YaHei", sans-serif;
      --radius-md: 12px;
      --radius-lg: 16px;
      --radius-xl: 24px;
      --shadow-soft: 0 8px 32px rgba(28, 25, 23, 0.08);
      --shadow-glow: 0 0 60px rgba(202, 138, 4, 0.14);
      --glass-light: rgba(255, 252, 247, 0.72);
      --glass-border: rgba(202, 138, 4, 0.28);
      --footer-h: 36px;
      --dock-h: 34px;
      --dock-bottom: 20px;
      --dock-gap: 2px;
      --flip-ms: 400ms;
      --flip-ease: cubic-bezier(0.32, 0.06, 0.15, 1);
      --tile-gap: 40px;
      --tile-pad: 28px;
      --tile-dock-reserve: calc(var(--dock-h) + var(--dock-bottom) + 14px);
      --tile-slot-h: 480px;
      --grid-cols: 3;
      --grid-gap: 2px;
      --grid-pad: 2px;
      --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
      --micro-ms: 220ms;
    }
    @media (min-width: 900px) { :root { --grid-cols: 5; } }
    @media (min-width: 1200px) { :root { --grid-cols: 6; } }
    @media (min-width: 600px) and (max-width: 899px) { :root { --grid-cols: 4; } }
    html, body { height: 100%; overflow: hidden; }
    body {
      font-family: var(--font-ui);
      background: var(--bg-dark);
      color: var(--text);
      -webkit-font-smoothing: antialiased;
      cursor: default;
    }
    #app { height: 100%; display: flex; flex-direction: column; position: relative; }

    .glass-light {
      background: var(--glass-light);
      backdrop-filter: blur(20px) saturate(1.15);
      -webkit-backdrop-filter: blur(20px) saturate(1.15);
      border: 1px solid var(--glass-border);
      box-shadow:
        var(--shadow-soft),
        0 1px 0 rgba(255, 255, 255, 0.85) inset,
        var(--shadow-glow);
    }
    .glass-dark {
      background: var(--chrome);
      backdrop-filter: blur(24px) saturate(1.1);
      -webkit-backdrop-filter: blur(24px) saturate(1.1);
      border: 1px solid rgba(202, 138, 4, 0.2);
      box-shadow: 0 8px 40px rgba(0, 0, 0, 0.35), 0 1px 0 rgba(255, 255, 255, 0.06) inset;
    }

    /* Footer */
    .footer-credit {
      flex-shrink: 0;
      min-height: var(--footer-h);
      display: flex;
      align-items: center;
      justify-content: center;
      flex-wrap: wrap;
      gap: 6px 10px;
      padding: 8px 14px;
      font-size: 11px;
      letter-spacing: 0.04em;
      color: var(--text-ink-muted);
      border-top: 1px solid #E7E5E4;
      background: var(--paper);
      z-index: 10;
      transition: background var(--micro-ms) var(--ease-out), color var(--micro-ms) var(--ease-out), border-color var(--micro-ms) var(--ease-out);
    }
    body:not(.mode-empty) .footer-credit {
      display: none;
    }
    .footer-sep { opacity: 0.45; user-select: none; }
    .footer-coffee {
      border: 1px solid rgba(202, 138, 4, 0.32);
      background: rgba(202, 138, 4, 0.08);
      color: #B45309;
      font: inherit;
      letter-spacing: inherit;
      min-height: 32px;
      padding: 6px 12px;
      border-radius: 999px;
      cursor: pointer;
      transition: background var(--micro-ms) var(--ease-out), border-color var(--micro-ms) var(--ease-out), color var(--micro-ms) var(--ease-out);
    }
    .footer-coffee:hover {
      background: rgba(202, 138, 4, 0.14);
      border-color: rgba(202, 138, 4, 0.5);
      color: #92400E;
    }
    .footer-coffee:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
    .footer-version {
      border: none;
      background: none;
      min-height: 32px;
      padding: 6px 4px;
      font: inherit;
      letter-spacing: inherit;
      color: var(--text-ink-muted);
      cursor: pointer;
      text-decoration: underline;
      text-decoration-color: rgba(87, 83, 78, 0.35);
      text-underline-offset: 3px;
      transition: color var(--micro-ms) var(--ease-out), text-decoration-color var(--micro-ms) var(--ease-out);
    }
    .footer-version:hover {
      color: var(--accent);
      text-decoration-color: rgba(202, 138, 4, 0.5);
    }
    .footer-version:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 2px; }
    .footer-feedback a {
      color: inherit;
      text-decoration: underline;
      text-underline-offset: 2px;
      text-decoration-color: rgba(202, 138, 4, 0.45);
    }
    .footer-feedback a:hover { color: var(--accent); }

    /* === empty === */
    #empty-view {
      flex: 1;
      position: relative;
      display: flex;
      align-items: center;
      justify-content: center;
      min-height: 0;
      overflow: hidden;
      background: var(--paper);
    }
    #empty-view.hidden { display: none; }
    .hero-bg {
      position: absolute;
      inset: 0;
      pointer-events: none;
      overflow: hidden;
    }
    .hero-aurora {
      position: absolute;
      inset: -25%;
      background:
        radial-gradient(ellipse 55% 45% at 18% 28%, rgba(202, 138, 4, 0.18), transparent 68%),
        radial-gradient(ellipse 48% 42% at 82% 72%, rgba(217, 119, 6, 0.12), transparent 64%),
        radial-gradient(ellipse 70% 60% at 50% 100%, rgba(250, 250, 249, 0.95), transparent 55%);
      animation: hero-aurora 16s var(--ease-out) infinite alternate;
    }
    .hero-grid {
      position: absolute;
      inset: 0;
      opacity: 0.35;
      background-image:
        linear-gradient(rgba(202, 138, 4, 0.04) 1px, transparent 1px),
        linear-gradient(90deg, rgba(202, 138, 4, 0.04) 1px, transparent 1px);
      background-size: 48px 48px;
      mask-image: radial-gradient(ellipse 80% 70% at 50% 45%, black 20%, transparent 75%);
    }
    .hero-vignette {
      position: absolute;
      inset: 0;
      background: radial-gradient(ellipse 90% 80% at 50% 50%, transparent 40%, rgba(250, 250, 249, 0.55) 100%);
    }
    .hero-frames { position: absolute; inset: 0; }
    .hero-frame {
      position: absolute;
      border-radius: 6px;
      border: 1px solid rgba(202, 138, 4, 0.22);
      background: linear-gradient(145deg, rgba(255, 252, 247, 0.55), rgba(250, 250, 249, 0.15));
      backdrop-filter: blur(6px);
      -webkit-backdrop-filter: blur(6px);
      box-shadow: var(--shadow-soft);
    }
    .hero-frame.f1 { width: clamp(72px, 10vw, 120px); height: clamp(96px, 13vw, 160px); top: 10%; left: 7%; transform: rotate(-9deg); animation: hero-float 9s ease-in-out infinite; }
    .hero-frame.f2 { width: clamp(60px, 8vw, 100px); height: clamp(78px, 10vw, 130px); top: 14%; right: 8%; transform: rotate(7deg); animation: hero-float 10s ease-in-out infinite reverse; opacity: 0.85; }
    .hero-frame.f3 { width: clamp(48px, 6vw, 80px); height: clamp(60px, 8vw, 100px); bottom: 18%; left: 10%; transform: rotate(5deg); animation: hero-float 11s ease-in-out infinite 1s; opacity: 0.65; }
    .hero-frame.f4 { width: clamp(56px, 7vw, 90px); height: clamp(72px, 9vw, 115px); bottom: 22%; right: 11%; transform: rotate(-5deg); animation: hero-float 12s ease-in-out infinite 0.5s; opacity: 0.5; }
    .hero-content {
      position: relative;
      z-index: 2;
      display: flex;
      flex-direction: column;
      align-items: center;
      padding: 48px 24px;
      animation: hero-enter 0.9s var(--ease-out) both;
    }
    .empty-logo {
      width: clamp(46px, 11vw, 58px);
      height: clamp(46px, 11vw, 58px);
      margin-bottom: 12px;
      padding: 9px;
      border-radius: 14px;
      background: rgba(255, 252, 247, 0.72);
      backdrop-filter: blur(14px) saturate(1.1);
      -webkit-backdrop-filter: blur(14px) saturate(1.1);
      border: 1px solid rgba(202, 138, 4, 0.24);
      box-shadow: var(--shadow-soft), 0 1px 0 rgba(255, 255, 255, 0.85) inset;
      display: flex;
      align-items: center;
      justify-content: center;
      flex-shrink: 0;
      opacity: 0.94;
    }
    .empty-logo svg {
      width: 100%;
      height: 100%;
      display: block;
    }
    .empty-title {
      font-family: var(--font-display);
      font-size: clamp(2.4rem, 6.5vw, 4.25rem);
      font-weight: 600;
      letter-spacing: 0.12em;
      color: var(--text-ink);
      margin-bottom: clamp(24px, 4vh, 44px);
      margin-top: 0;
      text-align: center;
      text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8);
    }
    .empty-title::after {
      content: "";
      display: block;
      width: 56px;
      height: 2px;
      margin: 18px auto 0;
      background: linear-gradient(90deg, transparent, var(--accent), transparent);
      opacity: 0.85;
    }
    .drop-zone {
      position: relative;
      width: min(580px, 92vw);
      padding: 56px 40px 52px;
      border-radius: var(--radius-xl);
      text-align: center;
      cursor: pointer;
      transition:
        transform var(--micro-ms) var(--ease-out),
        box-shadow var(--micro-ms) var(--ease-out),
        border-color var(--micro-ms) var(--ease-out);
    }
    .drop-zone.glass-light {
      border-style: dashed;
      border-width: 1.5px;
    }
    .drop-zone::before {
      content: "";
      position: absolute;
      inset: -2px;
      border-radius: inherit;
      background: linear-gradient(135deg, rgba(202, 138, 4, 0.45), transparent 40%, rgba(202, 138, 4, 0.25));
      opacity: 0;
      z-index: -1;
      transition: opacity var(--micro-ms) var(--ease-out);
      filter: blur(12px);
    }
    .drop-zone:hover {
      transform: translateY(-2px);
      box-shadow: var(--shadow-soft), 0 0 72px rgba(202, 138, 4, 0.16), 0 1px 0 rgba(255, 255, 255, 0.85) inset;
    }
    .drop-zone:hover::before { opacity: 0.55; }
    .drop-zone.dragover {
      transform: translateY(-3px) scale(1.01);
      border-color: var(--accent-soft);
      box-shadow: var(--shadow-soft), 0 0 80px var(--accent-glow), 0 1px 0 rgba(255, 255, 255, 0.9) inset;
    }
    .drop-zone.dragover::before { opacity: 0.75; }
    .drop-zone-icon {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 52px;
      height: 52px;
      margin: 0 auto 24px;
      border-radius: 50%;
      background: rgba(202, 138, 4, 0.1);
      border: 1px solid rgba(202, 138, 4, 0.25);
      color: var(--accent);
    }
    .drop-zone-icon svg { stroke: var(--accent); pointer-events: none; width: 26px; height: 26px; }
    .drop-zone-main {
      font-size: clamp(17px, 2.2vw, 20px);
      color: var(--accent);
      margin-bottom: 18px;
      font-weight: 600;
      letter-spacing: 0.04em;
    }
    .drop-zone-sub {
      font-size: clamp(15px, 2vw, 18px);
      color: var(--text-ink-muted);
      letter-spacing: 0.02em;
    }
    .empty-error { margin-top: 20px; font-size: 13px; color: #B45309; min-height: 20px; }
    .import-actions {
      display: flex;
      justify-content: center;
      gap: 10px;
      flex-wrap: wrap;
      position: relative;
      z-index: 1;
    }
    .import-action-btn {
      min-height: 42px;
      display: inline-flex;
      align-items: center;
      justify-content: center;
      gap: 8px;
      padding: 0 16px;
      border-radius: 999px;
      border: 1px solid rgba(202, 138, 4, 0.38);
      background: rgba(255, 255, 255, 0.58);
      color: var(--accent);
      font: inherit;
      font-size: 13px;
      font-weight: 700;
      cursor: pointer;
      transition: transform var(--micro-ms) var(--ease-out), border-color var(--micro-ms) var(--ease-out), background var(--micro-ms) var(--ease-out);
    }
    .import-action-btn:hover {
      transform: translateY(-1px);
      border-color: rgba(202, 138, 4, 0.68);
      background: rgba(255, 255, 255, 0.82);
    }
    .import-action-btn.primary {
      background: linear-gradient(180deg, rgba(202, 138, 4, 0.96), rgba(180, 120, 4, 0.96));
      color: var(--paper);
      border-color: rgba(202, 138, 4, 0.78);
    }
    .import-action-btn svg {
      width: 16px;
      height: 16px;
      flex: 0 0 auto;
    }
    .empty-privacy {
      margin-top: 28px;
      font-size: 13px;
      color: var(--text-ink-muted);
      letter-spacing: 0.06em;
      opacity: 0.85;
      text-align: center;
      max-width: 420px;
      line-height: 1.65;
    }

    body.import-busy { cursor: wait; }
    body.import-busy .drop-zone { pointer-events: none; opacity: 0.72; }

    @keyframes hero-aurora {
      0% { transform: translate(0, 0) scale(1); }
      100% { transform: translate(2%, -1.5%) scale(1.04); }
    }
    @keyframes hero-float {
      0%, 100% { transform: translateY(0) rotate(var(--rot, -9deg)); }
      50% { transform: translateY(-12px) rotate(calc(var(--rot, -9deg) + 2deg)); }
    }
    .hero-frame.f1 { --rot: -9deg; }
    .hero-frame.f2 { --rot: 7deg; }
    .hero-frame.f3 { --rot: 5deg; }
    .hero-frame.f4 { --rot: -5deg; }
    @keyframes hero-enter {
      from { opacity: 0; transform: translateY(20px); }
      to { opacity: 1; transform: translateY(0); }
    }

    /* Reader shell */
    #reader-view {
      flex: 1;
      display: flex;
      min-height: 0;
      position: relative;
    }
    #reader-view.hidden { display: none; }

    /* === rail === */
    #album-rail {
      position: absolute;
      left: 0; top: 0; bottom: 0;
      width: 32px;
      z-index: 30;
      transition: width 0.25s ease;
      pointer-events: auto;
    }
    #album-rail.expanded { width: 240px; }
    #album-rail.hidden { display: none; }
    .rail-tab {
      position: absolute;
      left: 0;
      top: 50%;
      transform: translateY(-50%);
      width: 32px;
      height: 48px;
      display: flex;
      align-items: center;
      justify-content: center;
      padding: 0;
      background: rgba(28, 25, 23, 0.92);
      backdrop-filter: blur(12px);
      -webkit-backdrop-filter: blur(12px);
      border: 1px solid rgba(202, 138, 4, 0.22);
      border-left: none;
      border-radius: 0 10px 10px 0;
      color: var(--accent);
      cursor: pointer;
      z-index: 33;
      box-shadow: 2px 0 16px rgba(0, 0, 0, 0.28);
      transition: opacity var(--micro-ms) var(--ease-out), background var(--micro-ms) var(--ease-out), border-color var(--micro-ms) var(--ease-out);
    }
    .rail-tab:hover { background: rgba(41, 37, 36, 0.96); border-color: rgba(202, 138, 4, 0.4); }
    .rail-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
    .rail-tab svg { stroke: var(--accent); pointer-events: none; }
    #album-rail.expanded .rail-tab { opacity: 0; pointer-events: none; }
    .rail-hit { position: absolute; left: 0; top: 0; bottom: 0; width: 36px; z-index: 31; }
    .rail-panel {
      position: absolute;
      left: 0; top: 0; bottom: 0;
      width: 240px;
      background: var(--chrome);
      backdrop-filter: blur(24px);
      -webkit-backdrop-filter: blur(24px);
      border-right: 1px solid rgba(202, 138, 4, 0.15);
      padding: 14px 12px;
      overflow-y: auto;
      opacity: 0;
      pointer-events: none;
      transition: opacity var(--micro-ms) var(--ease-out);
    }
    #album-rail.expanded .rail-panel { opacity: 1; pointer-events: auto; }
    .rail-title { font-size: 13px; font-weight: 500; letter-spacing: 0.06em; margin-bottom: 12px; padding-left: 8px; color: var(--text-muted); }
    .rail-item {
      padding: 10px 12px;
      border-radius: 10px;
      margin-bottom: 4px;
      cursor: pointer;
      display: flex;
      align-items: center;
      gap: 8px;
      transition: background var(--micro-ms) var(--ease-out), outline-color var(--micro-ms) var(--ease-out);
    }
    .rail-item:hover { background: rgba(255, 255, 255, 0.05); }
    .rail-item.active { background: rgba(202, 138, 4, 0.1); outline: 1px solid rgba(202, 138, 4, 0.45); }
    .rail-item-name {
      flex: 1;
      font-size: 13px;
      border: none;
      background: transparent;
      color: inherit;
      outline: none;
      min-width: 0;
      cursor: pointer;
      user-select: none;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
    }
    .rail-item-name.editing {
      cursor: text;
      user-select: text;
      border-radius: 6px;
      padding: 2px 6px;
      margin: -2px -6px;
      background: rgba(255, 255, 255, 0.08);
      outline: 1px solid rgba(202, 138, 4, 0.45);
    }
    .rail-item-rename {
      flex: 1;
      font-size: 13px;
      border: none;
      border-radius: 6px;
      padding: 2px 6px;
      margin: -2px -6px;
      background: rgba(255, 255, 255, 0.08);
      color: inherit;
      outline: 1px solid rgba(202, 138, 4, 0.45);
      min-width: 0;
      cursor: text;
    }
    .rail-item-meta { font-size: 10px; color: var(--text-muted); white-space: nowrap; }
    .rail-del {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 28px;
      height: 28px;
      background: none;
      border: none;
      cursor: pointer;
      padding: 0;
      color: var(--text-muted);
    }
    .rail-del:hover { color: #e88; }
    .rail-del svg { stroke: currentColor; pointer-events: none; }

    /* === book + flip === */
    #content {
      flex: 1;
      min-width: 0;
      min-height: 0;
      position: relative;
      padding-bottom: calc(var(--dock-h) + var(--dock-bottom) + 8px);
    }

    /* Content */
    #book-view {
      position: absolute;
      inset: 0;
      background: var(--paper);
    }
    #book-view::before {
      content: "";
      position: absolute;
      inset: 0;
      pointer-events: none;
      z-index: 0;
      opacity: 0.04;
      background-image: var(--paper-noise);
    }
    #book-view.hidden { display: none; }
    .book-scene {
      position: relative;
      width: 100%;
      height: 100%;
      display: flex;
      perspective: 1800px;
      perspective-origin: 50% 50%;
      background: var(--paper);
      overflow: hidden;
    }
    .book-half {
      flex: 1;
      position: relative;
      background: var(--paper);
      min-width: 0;
      overflow: hidden;
      cursor: pointer;
    }
    .book-half.left::before,
    .book-half.right::after {
      content: "";
      position: absolute;
      bottom: 0;
      width: 28%;
      height: 28%;
      min-width: 72px;
      min-height: 72px;
      max-width: 140px;
      max-height: 140px;
      z-index: 4;
      pointer-events: auto;
    }
    .book-half.left::before {
      left: 0;
      cursor: w-resize;
    }
    .book-half.right::after {
      right: 0;
      cursor: e-resize;
    }
    /* 1px 书脊线 + 极窄柔光：固定在中轴、始终在 flip 层之上，翻页时不随半页 inset 变化 */
    .book-spine {
      position: relative;
      width: 1px;
      flex-shrink: 0;
      align-self: stretch;
      z-index: 11;
      pointer-events: none;
      background: var(--spine-line);
      box-shadow:
        -5px 0 14px var(--spine-glow),
        5px 0 14px var(--spine-glow);
    }
    .page-inner {
      position: absolute;
      inset: 6% 8% 8% 8%;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    .page-inner img {
      max-width: 100%;
      max-height: 100%;
      object-fit: contain;
      box-shadow: 0 2px 8px rgba(0,0,0,0.06);
      cursor: zoom-in;
    }
    /* 相框：仅展开（贴图）与画册（贴照片）；平铺不加边框 */
    .tile-inner::after {
      content: "";
      position: absolute;
      inset: 0;
      pointer-events: none;
      z-index: 2;
      box-shadow: inset 0 0 0 2px transparent;
    }
    body.show-frame-border #tile-view .tile-inner::after {
      box-shadow: inset 0 0 0 2px rgba(12, 10, 9, 0.9);
    }
    body.show-frame-border #book-view .page-inner img {
      outline: 2px solid rgba(12, 10, 9, 0.9);
      outline-offset: 0;
    }
    body.show-frame-border #lightbox-img {
      outline: 2px solid rgba(12, 10, 9, 0.9);
      outline-offset: 0;
    }
    .page-empty { background: var(--paper); }

    #flip-layer {
      position: absolute;
      inset: 0;
      pointer-events: none;
      z-index: 10;
    }
    .book-under {
      position: absolute;
      inset: 0;
      display: flex;
      z-index: 1;
      background: var(--paper);
    }
    #flip-layer .book-under {
      z-index: 1;
    }
    .flip-leaf {
      position: absolute;
      top: 0;
      bottom: 0;
      transform-style: preserve-3d;
      z-index: 5;
      will-change: transform;
      transition: transform var(--flip-ms) var(--flip-ease);
    }
    .flip-leaf.from-right { transform-origin: left center; }
    .flip-leaf.from-left { transform-origin: right center; }
    .leaf-face {
      position: absolute;
      inset: 0;
      backface-visibility: hidden;
      -webkit-backface-visibility: hidden;
      background: var(--paper);
      overflow: hidden;
      isolation: isolate;
    }
    .leaf-face::before {
      content: "";
      position: absolute;
      inset: 0;
      pointer-events: none;
      z-index: 0;
      opacity: 0.04;
      background-image: var(--paper-noise);
    }
    .leaf-face .page-inner { inset: 6% 8% 8% 8%; z-index: 1; }
    .leaf-face.leaf-back { transform: rotateY(180deg); }

    /* === expand（原横向平铺，UI 称「展开」） === */
    #tile-view {
      position: absolute;
      inset: 0;
      background: var(--paper);
      overflow-x: auto;
      overflow-y: hidden;
      scroll-behavior: auto;
      padding-bottom: var(--tile-dock-reserve);
      box-sizing: border-box;
    }
    #tile-view.hidden { display: none; }
    .tile-track {
      display: inline-flex;
      flex-direction: row;
      align-items: center;
      height: 100%;
      min-height: 100%;
      padding: 0;
      gap: var(--tile-gap);
      box-sizing: border-box;
    }
    .tile-track-virtual {
      display: block;
      position: relative;
      height: 100%;
      min-height: 100%;
      box-sizing: border-box;
      padding: 0;
    }
    .tile-track-virtual .tile-item {
      position: absolute;
      margin: 0;
    }
    .tile-item {
      flex-shrink: 0;
      width: auto;
      height: var(--tile-slot-h);
      margin-top: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      cursor: default;
      line-height: 0;
      content-visibility: auto;
      contain-intrinsic-size: auto 200px;
    }
    .tile-inner {
      position: relative;
      overflow: hidden;
      line-height: 0;
      flex-shrink: 0;
    }
    .tile-inner img {
      display: block;
      position: absolute;
      left: 50%;
      top: 50%;
      object-fit: contain;
      transform-origin: center center;
      cursor: zoom-in;
      pointer-events: auto;
      z-index: 1;
    }

    /* === grid（平铺：相册网格） === */
    #grid-view {
      position: absolute;
      inset: 0;
      background: var(--paper);
      overflow-x: hidden;
      overflow-y: auto;
      scroll-behavior: auto;
      padding: var(--grid-pad) var(--grid-pad) calc(var(--grid-pad) + var(--tile-dock-reserve));
      box-sizing: border-box;
    }
    #grid-view.hidden { display: none; }
    .grid-track {
      display: grid;
      grid-template-columns: repeat(var(--grid-cols), 1fr);
      gap: var(--grid-gap);
      width: 100%;
    }
    .grid-track-virtual {
      display: block;
      position: relative;
    }
    .grid-track-virtual .grid-cell {
      position: absolute;
      aspect-ratio: auto;
    }
    .grid-cell {
      position: relative;
      aspect-ratio: 1;
      overflow: hidden;
      background: #E7E5E4;
      cursor: pointer;
      line-height: 0;
    }
    .grid-cell.is-loaded {
      background: var(--paper);
    }
    .grid-cell img {
      display: block;
      width: 100%;
      height: 100%;
      object-fit: cover;
      transform-origin: center center;
      pointer-events: auto;
      cursor: zoom-in;
    }

    /* === lightbox === */
    #lightbox {
      position: fixed;
      inset: 0;
      z-index: 200;
      background: var(--paper);
      display: flex;
      flex-direction: column;
      animation: modal-fade-in 0.2s var(--ease-out);
    }
    #lightbox.hidden { display: none; }
    #lightbox::before {
      content: "";
      position: absolute;
      inset: 0;
      pointer-events: none;
      opacity: 0.04;
      background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
    }
    .lightbox-stage {
      position: relative;
      flex: 1;
      min-height: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      overflow: auto;
      padding: 16px;
      z-index: 1;
    }
    #lightbox-img {
      display: block;
      flex-shrink: 0;
      transform-origin: center center;
      cursor: zoom-in;
      box-shadow: none;
    }
    .lightbox-close {
      position: absolute;
      top: 16px;
      right: 16px;
      z-index: 2;
      width: 40px;
      height: 40px;
      border-radius: 50%;
      border: 1px solid rgba(202, 138, 4, 0.28);
      background: rgba(255, 252, 247, 0.92);
      color: var(--text-ink-muted);
      cursor: pointer;
      display: flex;
      align-items: center;
      justify-content: center;
      box-shadow: var(--shadow-soft);
      transition: background var(--micro-ms) var(--ease-out), border-color var(--micro-ms) var(--ease-out), color var(--micro-ms) var(--ease-out);
    }
    .lightbox-close:hover { background: rgba(202, 138, 4, 0.12); border-color: rgba(202, 138, 4, 0.45); color: var(--text-ink); }
    .lightbox-close svg { stroke: currentColor; pointer-events: none; }

    /* === dock === */
    #floating-dock {
      position: absolute;
      left: 50%;
      bottom: var(--dock-bottom);
      transform: translateX(-50%);
      height: var(--dock-h);
      max-width: min(880px, calc(100vw - 24px));
      display: flex;
      align-items: center;
      gap: 5px;
      padding: 0 8px;
      border-radius: 999px;
      z-index: 40;
      transition: opacity var(--micro-ms) var(--ease-out), transform var(--micro-ms) var(--ease-out);
    }
    #floating-dock.glass-dark { border-radius: 999px; }
    #floating-dock.faded { opacity: 0.32; }
    #floating-dock.hidden { display: none; }
    .dock-btn {
      width: 28px; height: 28px;
      border-radius: 50%;
      border: 1px solid rgba(255, 255, 255, 0.1);
      background: rgba(255, 255, 255, 0.04);
      color: var(--text);
      font-size: 15px;
      cursor: pointer;
      display: flex;
      align-items: center;
      justify-content: center;
      flex-shrink: 0;
      transition: border-color var(--micro-ms) var(--ease-out), color var(--micro-ms) var(--ease-out), background var(--micro-ms) var(--ease-out), transform var(--micro-ms) var(--ease-out);
    }
    .dock-btn:hover { border-color: rgba(202, 138, 4, 0.5); color: var(--accent); background: rgba(202, 138, 4, 0.08); transform: translateY(-1px); }
    .dock-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
    .dock-btn.icon { font-size: 14px; color: var(--accent); }
    .dock-btn.icon-lucide { padding: 0; }
    .dock-btn.icon-lucide svg { stroke: currentColor; pointer-events: none; width: 14px; height: 14px; }
    .dock-btn.icon-lucide.active { background: rgba(202, 138, 4, 0.18); border-color: rgba(202, 138, 4, 0.55); color: var(--accent); }
    .dock-page {
      font-size: 10px;
      font-weight: 500;
      letter-spacing: 0.02em;
      color: var(--text-muted);
      min-width: 96px;
      text-align: center;
      white-space: nowrap;
    }
    .dock-seg {
      display: flex;
      border-radius: 999px;
      overflow: hidden;
      border: 1px solid rgba(255, 255, 255, 0.1);
      flex-shrink: 0;
      background: rgba(0, 0, 0, 0.2);
    }
    .dock-seg button {
      padding: 4px 9px;
      font-size: 10px;
      font-weight: 500;
      letter-spacing: 0.04em;
      border: none;
      background: transparent;
      color: var(--text-muted);
      cursor: pointer;
      transition: background var(--micro-ms) var(--ease-out), color var(--micro-ms) var(--ease-out);
    }
    .dock-seg button.active {
      background: var(--accent);
      color: var(--paper);
    }
    .dock-seg button:hover:not(.active) { color: var(--accent); }
    .dock-add {
      padding: 4px 10px;
      font-size: 10px;
      font-weight: 600;
      letter-spacing: 0.03em;
      border-radius: 999px;
      border: 1px solid rgba(202, 138, 4, 0.55);
      background: linear-gradient(180deg, rgba(202, 138, 4, 0.95), rgba(180, 120, 4, 0.95));
      color: var(--paper);
      cursor: pointer;
      white-space: nowrap;
      flex-shrink: 0;
      transition: filter var(--micro-ms) var(--ease-out), transform var(--micro-ms) var(--ease-out), box-shadow var(--micro-ms) var(--ease-out);
      box-shadow: 0 2px 10px rgba(202, 138, 4, 0.22);
    }
    .dock-add:hover { filter: brightness(1.06); transform: translateY(-1px); box-shadow: 0 4px 16px rgba(202, 138, 4, 0.32); }
    .dock-add:focus-visible { outline: 2px solid var(--accent-soft); outline-offset: 2px; }
    .dock-clear:hover {
      border-color: rgba(248, 113, 113, 0.55);
      color: #fecaca;
      background: rgba(248, 113, 113, 0.14);
      transform: translateY(-1px);
    }

    /* === modal === */
    #import-modal {
      position: fixed;
      inset: 0;
      background: rgba(12, 10, 9, 0.52);
      backdrop-filter: blur(6px);
      -webkit-backdrop-filter: blur(6px);
      display: flex;
      align-items: center;
      justify-content: center;
      z-index: 100;
      animation: modal-fade-in 0.25s var(--ease-out);
    }
    #import-modal.hidden { display: none; }
    #coffee-modal {
      position: fixed;
      inset: 0;
      background: rgba(12, 10, 9, 0.52);
      backdrop-filter: blur(6px);
      -webkit-backdrop-filter: blur(6px);
      display: flex;
      align-items: center;
      justify-content: center;
      z-index: 100;
      animation: modal-fade-in 0.25s var(--ease-out);
    }
    #coffee-modal.hidden { display: none; }
    .coffee-modal-box { width: min(340px, 92vw); text-align: center; }
    .coffee-qr-wrap {
      display: block;
      width: min(240px, 72vw);
      margin: 16px auto 0;
      padding: 14px;
      background: #fff;
      border-radius: 12px;
      box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);
      line-height: 0;
    }
    .coffee-qr-wrap svg {
      display: block;
      width: 100%;
      height: auto;
    }
    .coffee-hint {
      margin-top: 14px;
      font-size: 12px;
      color: var(--text-muted);
      line-height: 1.5;
    }
    .coffee-hint a {
      color: var(--accent);
      text-decoration: underline;
      text-underline-offset: 2px;
    }
    #version-modal {
      position: fixed;
      inset: 0;
      background: rgba(12, 10, 9, 0.52);
      backdrop-filter: blur(6px);
      -webkit-backdrop-filter: blur(6px);
      display: flex;
      align-items: center;
      justify-content: center;
      z-index: 100;
      padding: 24px;
      animation: modal-fade-in 0.25s var(--ease-out);
    }
    #version-modal.hidden { display: none; }
    .version-modal-box { width: min(400px, 92vw); text-align: left; }
    .version-current {
      font-size: 13px;
      color: var(--accent-soft);
      margin: -8px 0 16px;
      letter-spacing: 0.04em;
    }
    .version-changelog { display: flex; flex-direction: column; gap: 14px; }
    .version-entry {
      padding: 12px 14px;
      border-radius: 10px;
      background: rgba(250, 250, 249, 0.04);
      border: 1px solid rgba(168, 162, 158, 0.18);
    }
    .version-entry-head {
      display: flex;
      align-items: baseline;
      justify-content: space-between;
      gap: 12px;
      margin-bottom: 8px;
      font-size: 13px;
      color: var(--text);
    }
    .version-entry-head strong { font-weight: 600; letter-spacing: 0.03em; }
    .version-entry-date { font-size: 12px; color: var(--text-muted); white-space: nowrap; }
    .version-entry ul {
      margin: 0;
      padding-left: 1.1em;
      font-size: 13px;
      color: var(--text-muted);
      line-height: 1.65;
    }
    .version-entry li + li { margin-top: 4px; }
    .version-entry.is-current {
      border-color: rgba(202, 138, 4, 0.35);
      background: rgba(202, 138, 4, 0.08);
    }
    .modal-box {
      width: min(420px, 92vw);
      border-radius: var(--radius-lg);
      padding: 28px 28px 24px;
      position: relative;
      animation: modal-rise 0.35s var(--ease-out);
    }
    .modal-box.glass-dark { border: 1px solid rgba(202, 138, 4, 0.35); }
    .modal-close {
      position: absolute;
      right: 16px; top: 14px;
      background: rgba(255, 255, 255, 0.06);
      border: 1px solid rgba(255, 255, 255, 0.08);
      border-radius: 50%;
      width: 32px;
      height: 32px;
      color: var(--text-muted);
      font-size: 20px;
      cursor: pointer;
      line-height: 1;
      display: flex;
      align-items: center;
      justify-content: center;
      transition: color var(--micro-ms) var(--ease-out), border-color var(--micro-ms) var(--ease-out), background var(--micro-ms) var(--ease-out);
    }
    .modal-close:hover { color: var(--text); border-color: rgba(202, 138, 4, 0.35); background: rgba(202, 138, 4, 0.1); }
    .modal-title { font-family: var(--font-display); font-size: 20px; font-weight: 600; letter-spacing: 0.04em; margin-bottom: 20px; }
    .modal-body { font-size: 14px; color: var(--text-muted); line-height: 1.7; letter-spacing: 0.02em; }
    .modal-wait {
      margin-top: 18px;
      padding: 14px 16px;
      border: 1.5px dashed rgba(202, 138, 4, 0.45);
      border-radius: var(--radius-md);
      text-align: center;
      color: var(--accent);
      font-size: 13px;
      font-weight: 500;
      letter-spacing: 0.04em;
      background: rgba(202, 138, 4, 0.06);
    }
    .modal-import-actions {
      margin-top: 14px;
      justify-content: flex-start;
    }
    .modal-import-actions .import-action-btn {
      color: var(--text);
      background: rgba(202, 138, 4, 0.08);
    }
    .modal-import-actions .import-action-btn.primary {
      color: var(--paper);
      background: linear-gradient(180deg, rgba(202, 138, 4, 0.96), rgba(180, 120, 4, 0.96));
    }
    .import-modal-box { width: min(560px, 92vw); }
    .modal-error { margin-top: 12px; font-size: 13px; color: #F87171; min-height: 18px; }
    .wechat-import-panel {
      margin-top: 16px;
      padding: 14px;
      border-radius: var(--radius-md);
      border: 1px solid rgba(202, 138, 4, 0.28);
      background: rgba(250, 250, 249, 0.06);
      display: flex;
      flex-direction: column;
      gap: 10px;
    }
    .wechat-import-panel.hidden { display: none; }
    .wechat-import-title {
      font-size: 14px;
      font-weight: 600;
      color: var(--text);
      letter-spacing: 0.03em;
    }
    .wechat-import-desc {
      font-size: 12px;
      line-height: 1.6;
      color: var(--text-muted);
    }
    .wechat-import-methods {
      display: grid;
      grid-template-columns: 1fr;
      gap: 8px;
    }
    .wechat-method-card {
      display: flex;
      flex-direction: column;
      gap: 10px;
      min-height: 100%;
      padding: 13px;
      border-radius: 12px;
      border: 1px solid rgba(168, 162, 158, 0.18);
      background: rgba(12, 10, 9, 0.16);
    }
    .wechat-method-card.is-primary {
      border-color: rgba(202, 138, 4, 0.58);
      background: linear-gradient(180deg, rgba(202, 138, 4, 0.12), rgba(12, 10, 9, 0.12));
      box-shadow: 0 12px 28px rgba(0, 0, 0, 0.16);
    }
    .wechat-method-kicker {
      color: var(--accent);
      font-size: 11px;
      font-weight: 700;
      letter-spacing: 0.08em;
    }
    .wechat-method-name {
      color: var(--text);
      font-size: 14px;
      font-weight: 700;
      letter-spacing: 0.02em;
    }
    .wechat-method-copy {
      color: var(--text-muted);
      font-size: 11px;
      line-height: 1.55;
    }
    .wechat-path-inline {
      display: grid;
      grid-template-columns: 1fr 34px;
      gap: 6px;
      align-items: stretch;
    }
    .wechat-method-steps {
      margin: 0;
      padding-left: 1.25em;
      color: var(--text-muted);
      font-size: 11px;
      line-height: 1.75;
    }
    .wechat-method-steps li + li { margin-top: 2px; }
    .wechat-method-steps strong {
      color: var(--text);
      font-weight: 800;
    }
    .wechat-import-path {
      padding: 9px 10px;
      border-radius: 8px;
      border: 1px solid rgba(202, 138, 4, 0.34);
      background: rgba(12, 10, 9, 0.28);
      color: #E7E5E4;
      font-family: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace;
      font-size: 11px;
      line-height: 1.45;
      overflow-wrap: anywhere;
    }
    .wechat-import-btn {
      min-height: 38px;
      border-radius: 999px;
      border: 1px solid rgba(202, 138, 4, 0.45);
      background: rgba(202, 138, 4, 0.08);
      color: var(--text);
      font: inherit;
      font-size: 12px;
      font-weight: 600;
      cursor: pointer;
      transition: transform var(--micro-ms) var(--ease-out), background var(--micro-ms) var(--ease-out), border-color var(--micro-ms) var(--ease-out);
    }
    .wechat-import-btn:hover {
      transform: translateY(-1px);
      border-color: rgba(202, 138, 4, 0.7);
      background: rgba(202, 138, 4, 0.16);
    }
    .wechat-import-btn.primary {
      background: linear-gradient(180deg, rgba(202, 138, 4, 0.96), rgba(180, 120, 4, 0.96));
      color: var(--paper);
    }
    .wechat-method-card .wechat-import-btn {
      margin-top: auto;
      width: 100%;
    }
    .wechat-icon-btn {
      min-height: 34px;
      width: 34px;
      padding: 0;
      display: inline-flex;
      align-items: center;
      justify-content: center;
      border-radius: 999px;
    }
    .wechat-icon-btn svg {
      width: 15px;
      height: 15px;
    }
    .wechat-import-btn:disabled {
      opacity: 0.48;
      cursor: not-allowed;
      transform: none;
    }
    .wechat-import-note {
      min-height: 16px;
      color: var(--text-muted);
      font-size: 11px;
      line-height: 1.5;
    }
    @media (max-width: 640px) {
      .import-modal-box { width: min(420px, 92vw); }
      .wechat-import-methods { grid-template-columns: 1fr; }
      .import-action-btn { width: 100%; }
      .modal-import-actions { justify-content: stretch; }
    }

    @keyframes modal-fade-in {
      from { opacity: 0; }
      to { opacity: 1; }
    }
    @keyframes modal-rise {
      from { opacity: 0; transform: translateY(12px) scale(0.98); }
      to { opacity: 1; transform: translateY(0) scale(1); }
    }

    @media (max-width: 640px) {
      .hero-frame { display: none; }
      .empty-title { letter-spacing: 0.08em; }
      .drop-zone { padding: 44px 24px 40px; }
    }

    @media (prefers-reduced-motion: reduce) {
      :root { --flip-ms: 0ms; }
      .flip-leaf { transition: none; }
      #tile-view { scroll-behavior: auto; }
      .hero-aurora, .hero-frame, .hero-content, #import-modal, #coffee-modal, #version-modal, .modal-box { animation: none; }
    }
