@font-face { font-family: 'InterLocal'; src: url('../../resources/fonts/annual-report/Inter-Var.ttf') format('truetype'); font-style: normal; font-weight: 100 900; font-display: swap; } @font-face { font-family: 'PlayfairDisplayLocal'; src: url('../../resources/fonts/annual-report/PlayfairDisplay-Var.ttf') format('truetype'); font-style: normal; font-weight: 400 900; font-display: swap; } @font-face { font-family: 'CormorantGaramondLocal'; src: url('../../resources/fonts/annual-report/CormorantGaramond-Var.ttf') format('truetype'); font-style: normal; font-weight: 300 700; font-display: swap; } @font-face { font-family: 'NotoSerifSCLocal'; src: url('../../resources/fonts/annual-report/NotoSerifSC-Var.ttf') format('truetype'); font-style: normal; font-weight: 200 900; font-display: swap; } @font-face { font-family: 'SpaceMonoLocal'; src: url('../../resources/fonts/annual-report/SpaceMono-Regular.ttf') format('truetype'); font-style: normal; font-weight: 400; font-display: swap; } @font-face { font-family: 'SpaceMonoLocal'; src: url('../../resources/fonts/annual-report/SpaceMono-Bold.ttf') format('truetype'); font-style: normal; font-weight: 700; font-display: swap; } .annual-report-window { --c-bg: #050505; --c-bg-deep: #090909; --c-text: #F2F2F0; --c-text-bright: #FAFAF8; --c-text-soft: rgba(250, 250, 248, 0.84); --c-text-muted: rgba(250, 250, 248, 0.58); --c-text-faint: rgba(250, 250, 248, 0.42); --c-gold: #B8945A; --c-gold-strong: #C8AA72; --c-gold-rgb: 184, 148, 90; --c-paper: #ECE8DF; --c-paper-ink: #1A1710; --c-paper-muted: #6E6757; /* 顶级平滑缓动曲线 */ --ease-epic: cubic-bezier(0.76, 0, 0.24, 1); --ease-out: cubic-bezier(0.25, 1, 0.5, 1); background-color: var(--c-bg); color: var(--c-text); font-family: 'InterLocal', 'NotoSerifSCLocal', -apple-system, BlinkMacSystemFont, sans-serif; -webkit-font-smoothing: antialiased; overflow: hidden; overscroll-behavior: none; height: 100vh; width: 100vw; position: relative; -webkit-app-region: no-drag; // 默认不可拖拽,给特定区域开放 // 顶部拖动控制条与关闭按钮 .top-controls { position: absolute; top: 0; left: 0; width: 100%; height: 60px; display: flex; justify-content: flex-end; align-items: center; padding: 0 20px; z-index: 10000; -webkit-app-region: drag; .close-btn { width: 32px; height: 32px; border-radius: 50%; background: rgba(var(--c-gold-rgb), 0.14); border: 1px solid rgba(var(--c-gold-rgb), 0.34); color: var(--c-text-soft); display: flex; justify-content: center; align-items: center; cursor: pointer; -webkit-app-region: no-drag; transition: all 0.3s var(--ease-out); &:hover { background: rgba(var(--c-gold-rgb), 0.24); color: var(--c-text-bright); box-shadow: 0 0 12px rgba(var(--c-gold-rgb), 0.24); transform: scale(1.05); } } } &[data-scene="10"] .top-controls .close-btn { background: rgba(26, 20, 9, 0.08); border-color: rgba(75, 58, 27, 0.28); color: rgba(38, 29, 12, 0.72); } &[data-scene="10"] .top-controls .close-btn:hover { background: rgba(30, 23, 10, 0.16); color: #171006; } .p0-bg-layer { position: absolute; inset: 0; z-index: 1; pointer-events: none; opacity: 0; transition: opacity 1.1s var(--ease-out); } &[data-scene="0"] .p0-bg-layer { opacity: 1; } &[data-scene="1"] .p0-bg-layer { opacity: 0.16; } .p0-particle-canvas { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0.48; } .p0-center-glow { position: absolute; inset: 0; background: radial-gradient(circle at center, rgba(var(--c-gold-rgb), 0.12) 0%, rgba(var(--c-gold-rgb), 0.03) 36%, rgba(255, 255, 255, 0.02) 50%, transparent 72%); } /* 细微的电影噪点 */ .film-grain { position: absolute; inset: 0; z-index: 9999; opacity: 0.018; pointer-events: none; mix-blend-mode: overlay; background: url('data:image/svg+xml;utf8,%3Csvg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"%3E%3Cfilter id="noiseFilter"%3E%3CfeTurbulence type="fractalNoise" baseFrequency="0.9" numOctaves="3" stitchTiles="stitch"/%3E%3C/filter%3E%3Crect width="100%25" height="100%25" filter="url(%23noiseFilter)"/%3E%3C/svg%3E'); } /* ========================================= 标志性组件的演化 ========================================= */ #memory-core { position: absolute; transform: translate(-50%, -50%); transition: all 1.5s var(--ease-epic); z-index: 5; pointer-events: none; background: var(--c-gold-strong); } /* S0: 年份下方引线(保留后续场景形变) */ &[data-scene="0"] #memory-core { top: 84vh; left: 50vw; width: clamp(120px, 16vw, 220px); height: 1px; border-radius: 999px; opacity: 1; box-shadow: 0 0 12px rgba(var(--c-gold-rgb), 0.48); filter: blur(0px); } @media (max-width: 1024px) { &[data-scene="0"] #memory-core { top: 81vh; width: clamp(96px, 22vw, 180px); } } /* S1: 深海地平线底光 */ &[data-scene="1"] #memory-core { top: 100vh; left: 50vw; width: 200vw; height: 60vh; border-radius: 50%; opacity: 0.15; box-shadow: none; filter: blur(80px); } /* S2: 凌晨微光 */ &[data-scene="2"] #memory-core { top: 45vh; left: 50vw; width: 300px; height: 150px; border-radius: 50%; opacity: 0.08; box-shadow: none; filter: blur(40px); } /* S3: 竖直时间引线 (内容线段,可被 S4 过渡形变) */ &[data-scene="3"] #memory-core { top: var(--s3-line-top, 48vh); left: var(--s3-line-left, calc(50vw - min(36vw, 440px) + 12px)); width: 1px; height: var(--s3-line-height, clamp(240px, 34vh, 320px)); border-radius: 1px; background: var(--c-gold); opacity: 0.55; box-shadow: 0 0 12px rgba(var(--c-gold-rgb), 0.38); filter: blur(0px); } /* S4: 内容横线 (由 S3 竖线平滑形变过来) */ &[data-scene="4"] #memory-core { top: 55vh; left: 50vw; width: 80vw; height: 1px; border-radius: 0; background: rgba(var(--c-gold-rgb), 0.88); opacity: 0.35; box-shadow: 0 0 10px rgba(var(--c-gold-rgb), 0.28); filter: blur(0px); } /* S5: MUTUAL RESONANCE (底部弥散的主氛围光源) */ &[data-scene="5"] #memory-core { top: 100vh; left: 50vw; width: 150vw; height: 80vh; border-radius: 50%; opacity: 0.04; box-shadow: none; filter: blur(80px); } /* S6: SOCIAL KINETICS (大字背后的脉冲环境背光) */ &[data-scene="6"] #memory-core { top: 40vh; left: 30vw; width: 80vw; height: 80vh; border-radius: 50%; opacity: 0.03; box-shadow: none; filter: blur(100px); animation: corePulse 3s ease-in-out infinite alternate; } @keyframes corePulse { 0% { transform: translate(-50%, -50%) scale(0.9); opacity: 0.02; } 100% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.05; } } /* S7: THE SPARK (顶部的倾斜透射光束感) */ &[data-scene="7"] #memory-core { top: 0vh; left: 20vw; width: 120vw; height: 100vh; border-radius: 50%; opacity: 0.05; box-shadow: none; filter: blur(90px); transform: translate(-50%, -50%) rotate(-15deg); } /* S8: FADING SIGNALS (迷雾) */ &[data-scene="8"] #memory-core { top: 50vh; left: 50vw; width: 80vw; height: 80vh; border-radius: 50%; opacity: 0.05; box-shadow: none; filter: blur(80px); animation: coreBreathing 6s ease-in-out infinite; } @keyframes coreBreathing { 0%, 100% { opacity: 0.03; transform: translate(-50%, -50%) scale(0.95); } 50% { opacity: 0.06; transform: translate(-50%, -50%) scale(1.05); } } /* S9: LEXICON (大气) */ &[data-scene="9"] #memory-core { top: -20vh; left: -20vw; width: 150vw; height: 150vw; border-radius: 50%; opacity: 0.08; box-shadow: none; filter: blur(60px); } /* S10: EXTRACTION */ &[data-scene="10"] #memory-core { top: 50vh; left: 50vw; width: 250vmax; height: 250vmax; border-radius: 50%; background: var(--c-paper); /* Explodes into warm bright color smoothly */ opacity: 1; box-shadow: none; border: none; filter: blur(0px); transition: all 1s cubic-bezier(0.8, 0, 0.1, 1); } /* ========================================= 场景控制系统 & 遮罩出场动画 ========================================= */ .scene { position: absolute; inset: 0; z-index: 10; display: flex; flex-direction: column; justify-content: center; align-items: center; pointer-events: none; } .scene.active { pointer-events: auto; } .serif { font-family: 'NotoSerifSCLocal', 'CormorantGaramondLocal', serif; } .mono { font-family: 'SpaceMonoLocal', 'NotoSerifSCLocal', monospace; } .num-display { font-family: 'InterLocal', -apple-system, sans-serif; font-variant-numeric: tabular-nums; font-weight: 500; letter-spacing: -0.02em; } /* 通用文案样式放大 */ .en-tag { position: absolute; top: 6vh; left: 4vw; font-size: clamp(0.9rem, 1.05vw, 1.05rem); color: var(--c-text-soft); letter-spacing: 0.28em; font-weight: 500; text-rendering: optimizeLegibility; z-index: 10; } .desc-text { font-size: 1.3rem; line-height: 1.8; color: var(--c-text); margin-top: 35vh; } /* Mask Reveal 动画 */ .reveal-wrap { overflow: hidden; display: inline-block; vertical-align: top; } .reveal-inner { transform: translateY(110%); transition: transform 1.2s var(--ease-epic), opacity 1.2s var(--ease-epic); opacity: 0; } .scene.active .reveal-inner { transform: translateY(0); opacity: 1; } .scene.prev .reveal-inner { transform: translateY(-50%); opacity: 0; transition: all 0.6s ease; } .scene.next .reveal-inner { transform: translateY(50%); opacity: 0; transition: all 0.6s ease; } &.exporting-scenes .top-controls, &.exporting-scenes .pagination, &.exporting-scenes .swipe-hint { opacity: 0 !important; visibility: hidden !important; } .delay-1 { transition-delay: 0.1s; } .delay-2 { transition-delay: 0.2s; } .delay-3 { transition-delay: 0.3s; } /* 场景排版 */ #scene-0 { text-align: center; } #scene-0 .scene0-cn-tag { letter-spacing: 0.22em; font-weight: 500; } #scene-0 .title-year { font-family: 'PlayfairDisplayLocal', 'CormorantGaramondLocal', serif; font-size: clamp(6.8rem, 21vw, 18rem); line-height: 1.02; letter-spacing: -0.04em; margin-top: 10vh; text-shadow: 0 18px 45px rgba(0, 0, 0, 0.45); max-width: 90vw; overflow-wrap: anywhere; } #scene-0 .title-year--numeric { font-size: clamp(6.8rem, 21vw, 18rem); letter-spacing: -0.04em; } #scene-0 .title-year--text { font-size: clamp(4.8rem, 14vw, 10rem); letter-spacing: 0.01em; line-height: 1.08; } #scene-0 .title-year--text-long { font-size: clamp(3.8rem, 10.5vw, 7.5rem); letter-spacing: 0.02em; line-height: 1.12; } #scene-0 .title-year-wrap { padding: clamp(6px, 0.8vh, 14px) 0; } #scene-0 .p0-desc { margin-top: clamp(9vh, 11vh, 13vh); } #scene-0 .p0-desc-inner { font-size: clamp(1rem, 1.35vw, 1.2rem); line-height: 2; color: var(--c-text-soft); letter-spacing: 0.08em; } #scene-1 .title-data { font-size: clamp(5.5rem, 16vw, 13rem); font-family: 'InterLocal'; font-weight: 300; letter-spacing: -0.05em; line-height: 1; margin-bottom: 4vh; } #scene-2 { padding: 0 10vw; text-align: center; } #scene-2 .title-time { font-size: clamp(4.5rem, 12vw, 9rem); line-height: 1; margin-top: 10vh; } #scene-2 .desc-text { margin-top: 2vh; } #scene-3 { align-items: center; justify-content: flex-start; padding: 0 8vw; } #scene-3 .en-tag { left: 4vw; top: 6vh; } #scene-3 .s3-layout { position: absolute; top: 20vh; left: 50%; transform: translateX(-50%); width: min(880px, 72vw); max-width: 100%; display: flex; flex-direction: column; gap: clamp(4vh, 5vh, 7vh); padding-left: clamp(52px, 7vw, 108px); } #scene-3 .s3-subtitle-wrap { display: block; width: 100%; } #scene-3 .s3-subtitle { font-size: clamp(1rem, 1.25vw, 1.15rem); color: var(--c-text-muted); letter-spacing: 0.05em; line-height: 1.7; } #scene-3 .contact-list { display: flex; flex-direction: column; gap: clamp(3.2vh, 4vh, 5.5vh); margin-top: 0; width: 100%; max-width: none; } #scene-3 .s3-row-wrap { display: block; width: 100%; } #scene-3 .c-item { display: grid; grid-template-columns: minmax(0, 1fr) max-content; align-items: end; column-gap: clamp(36px, 8vw, 140px); width: 100%; min-height: clamp(58px, 8vh, 88px); } #scene-3 .c-info { display: flex; flex-direction: column; gap: 6px; min-width: 0; } #scene-3 .c-name { font-size: clamp(2rem, 4.3vw, 3.2rem); line-height: 1; letter-spacing: 0.03em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: min(56vw, 460px); } #scene-3 .c-sub { font-size: 0.68rem; color: var(--c-text-muted); letter-spacing: 0.08em; } #scene-3 .c-count { font-size: clamp(1.4rem, 2.2vw, 2rem); font-family: 'SpaceMonoLocal'; line-height: 1; text-align: right; min-width: 7ch; } @media (max-width: 1280px) { #scene-3 .s3-layout { width: min(820px, 76vw); padding-left: clamp(44px, 6vw, 92px); } } @media (max-width: 1024px) { #scene-3 .s3-layout { top: 18.5vh; width: min(760px, 86vw); padding-left: clamp(30px, 5vw, 60px); } #scene-3 .c-name { font-size: clamp(1.65rem, 5.2vw, 2.4rem); } #scene-3 .c-count { font-size: clamp(1.2rem, 2.8vw, 1.75rem); } } @media (max-width: 760px) { #scene-3 .s3-layout { top: 17.5vh; gap: clamp(3vh, 4.5vh, 5vh); width: 90vw; padding-left: 26px; } #scene-3 .contact-list { gap: clamp(2.8vh, 3.4vh, 4vh); } #scene-3 .c-item { column-gap: 24px; min-height: 52px; } #scene-3 .c-sub { font-size: 0.62rem; } } #scene-8 { align-items: center; justify-content: center; padding: 0; overflow: hidden; } /* V2 Background: Cinematic Aura */ #scene-8 .s8-bg-layer { position: absolute; inset: -10%; z-index: 1; opacity: 0; transition: opacity 2s 0.2s var(--ease-out); filter: blur(120px) contrast(1.1) brightness(0.6); pointer-events: none; .bg-avatar { width: 100%; height: 100%; object-fit: cover; transform: scale(1.2); } } .scene.active #scene-8 .s8-bg-layer { opacity: 0.18; } #scene-8 .s8-floating-layout { position: relative; width: 100vw; height: 100vh; z-index: 2; display: grid; grid-template-columns: repeat(12, 1fr); grid-template-rows: repeat(12, 1fr); padding: 10vh 8vw; } /* The Central Pivot: Name & Meta */ #scene-8 .s8-hero-unit { grid-column: 2 / 8; grid-row: 4 / 7; display: flex; flex-direction: column; justify-content: center; .s8-name { font-size: clamp(4.5rem, 10vw, 8.5rem); font-weight: 700; color: var(--c-text-bright); letter-spacing: 0.08em; line-height: 1; margin-bottom: 2vh; background: linear-gradient(135deg, var(--c-gold-strong), var(--c-text-bright), var(--c-gold-strong)); background-size: 200% auto; -webkit-background-clip: text; -webkit-text-fill-color: transparent; animation: shine 8s linear infinite; text-shadow: 0 0 40px rgba(var(--c-gold-rgb), 0.2); } .s8-meta { font-family: 'SpaceMonoLocal'; font-size: clamp(0.7rem, 0.85vw, 0.9rem); color: var(--c-gold-strong); letter-spacing: 0.4em; text-transform: uppercase; display: flex; align-items: center; gap: 1.5vw; &::after { content: ''; flex: 1; height: 1px; background: linear-gradient(to right, rgba(var(--c-gold-rgb), 0.6), transparent); } } } /* Fragmented Storytelling */ #scene-8 .s8-fragments { position: absolute; inset: 0; pointer-events: none; } #scene-8 .fragment { position: absolute; max-width: 24ch; font-size: clamp(0.95rem, 1.1vw, 1.15rem); line-height: 2.1; color: var(--c-text-muted); font-weight: 300; &.f1 { top: 25vh; right: 12vw; text-align: right; color: var(--c-text-soft); font-style: italic; } &.f2 { bottom: 20vh; left: 15vw; max-width: 38ch; } &.f3 { bottom: 12vh; right: 10vw; text-align: right; opacity: 0.6; font-size: 0.85rem; letter-spacing: 0.05em; } } @keyframes shine { to { background-position: 200% center; } } #scene-8 .s8-empty-wrap { grid-column: 4 / 10; grid-row: 5 / 8; text-align: center; .s8-empty-text { font-size: 1.6rem; line-height: 2.5; color: var(--c-text-soft); font-weight: 200; } } @media (max-width: 1024px) { #scene-8 .s8-hero-unit { grid-column: 2 / 12; grid-row: 2 / 5; } #scene-8 .fragment { position: relative; inset: auto !important; max-width: 100%; text-align: left !important; margin-top: 4vh; } #scene-8 .s8-fragments { position: relative; grid-column: 2 / 12; grid-row: 6 / 12; display: flex; flex-direction: column; } } /* S4 宇宙 (彻底修复穿模 BUG) */ #scene-4 { color: var(--c-text-bright); } #scene-4 .en-tag { color: var(--c-text-muted); } .word-burst { position: absolute; font-family: 'NotoSerifSCLocal'; font-weight: 500; white-space: nowrap; transform: translate(-50%, -50%) scale(0.8); opacity: 0; transition: all 1s cubic-bezier(0.175, 0.885, 0.32, 1.2); } /* 仅在 S9 显影 */ &[data-scene="9"] .word-burst { transform: translate(-50%, -50%) scale(1); opacity: var(--target-op, 1); } .float-el { display: inline-block; animation: floatWord 4s ease-in-out infinite alternate; } @keyframes floatWord { 0% { transform: translateY(-8px); } 100% { transform: translateY(8px); } } .btn-wrap { position: absolute; bottom: 8vh; left: 50%; transform: translateX(-50%); display: flex; flex-direction: column; align-items: center; opacity: 0; transition: opacity 1s 0.8s; } &[data-scene="10"] .btn-wrap { opacity: 1; } .btn { display: inline-flex; align-items: center; justify-content: center; padding: 1rem 3rem; color: var(--c-gold-strong); background: #111111; border-radius: 100px; cursor: pointer; transition: all 0.4s var(--ease-out); margin-top: 3vh; font-family: 'SpaceMonoLocal'; font-size: 0.75rem; letter-spacing: 0.15em; border: 1px solid rgba(var(--c-gold-rgb), 0.36); pointer-events: auto; } .btn:hover { transform: scale(1.05); background: #1d1d1d; box-shadow: 0 10px 24px rgba(var(--c-gold-rgb), 0.24); } /* 导航系统 */ .pagination { position: absolute; right: 4vw; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; gap: 12px; z-index: 100; mix-blend-mode: difference; } .dot-nav { width: 3px; height: 12px; background: rgba(var(--c-gold-rgb), 0.22); transition: all 0.4s var(--ease-out); cursor: pointer; border-radius: 3px; } .dot-nav:hover { background: rgba(var(--c-gold-rgb), 0.56); } .dot-nav.active { background: var(--c-gold-strong); height: 32px; box-shadow: 0 0 10px rgba(var(--c-gold-rgb), 0.52); } .swipe-hint { position: absolute; bottom: 5vh; left: 50%; transform: translateX(-50%); font-family: 'SpaceMonoLocal'; font-size: clamp(0.74rem, 0.9vw, 0.9rem); letter-spacing: 0.28em; color: var(--c-text-muted); font-weight: 500; text-rendering: geometricPrecision; z-index: 100; opacity: 0; transition: opacity 0.8s ease; pointer-events: none; } &[data-scene="0"] .swipe-hint { opacity: 0.6; animation: hintPulse 2s infinite alternate; } @keyframes hintPulse { 0% { transform: translateX(-50%) translateY(0); } 100% { transform: translateX(-50%) translateY(-5px); } } // 加载状态 &.loading, &.error { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 16px; color: var(--c-text-muted); p { font-size: 16px; } } &.loading { animation: loadingPageEnter 0.46s var(--ease-out) both; .loading-ring { position: relative; width: 160px; height: 160px; animation: loadingRingEnter 0.52s var(--ease-epic) both; svg { width: 100%; height: 100%; transform: rotate(-90deg); } .ring-bg { fill: none; stroke: rgba(var(--c-gold-rgb), 0.2); stroke-width: 6; } .ring-progress { fill: none; stroke: var(--c-gold-strong); stroke-width: 6; stroke-linecap: round; stroke-dasharray: 264; transition: stroke-dashoffset 0.3s ease; } .ring-text { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 36px; font-weight: 600; color: var(--c-text-bright); } } .loading-stage { font-size: 20px; font-weight: 600; color: var(--c-gold-strong); margin-top: 24px; animation: loadingTextEnter 0.52s var(--ease-out) both; animation-delay: 0.06s; } .loading-hint { font-size: 14px; color: var(--c-text-muted); margin-top: 4px; animation: loadingTextEnter 0.52s var(--ease-out) both; animation-delay: 0.12s; } } @keyframes loadingPageEnter { from { opacity: 0; filter: blur(12px); } to { opacity: 1; filter: blur(0); } } @keyframes loadingRingEnter { from { opacity: 0; transform: translateY(12px) scale(0.94); } to { opacity: 1; transform: translateY(0) scale(1); } } @keyframes loadingTextEnter { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } }