/* color palette from */ :root { --vt-c-white: #ffffff; --vt-c-white-soft: #f8f8f8; --vt-c-white-mute: #f2f2f2; --vt-c-black: #181818; --vt-c-black-soft: #222222; --vt-c-black-mute: #282828; --vt-c-indigo: #2c3e50; --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); --vt-c-text-light-1: var(--vt-c-indigo); --vt-c-text-light-2: rgba(60, 60, 60, 0.66); --vt-c-text-dark-1: var(--vt-c-white); --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); } /* semantic color variables for this project */ :root { --color-background: var(--vt-c-white); --color-background-soft: var(--vt-c-white-soft); --color-background-mute: var(--vt-c-white-mute); --color-border: var(--vt-c-divider-light-2); --color-border-hover: var(--vt-c-divider-light-1); --color-heading: var(--vt-c-text-light-1); --color-text: var(--vt-c-text-light-1); --section-gap: 160px; } @media (prefers-color-scheme: dark) { :root { --color-background: var(--vt-c-black); --color-background-soft: var(--vt-c-black-soft); --color-background-mute: var(--vt-c-black-mute); --color-border: var(--vt-c-divider-dark-2); --color-border-hover: var(--vt-c-divider-dark-1); --color-heading: var(--vt-c-text-dark-1); --color-text: var(--vt-c-text-dark-2); } } *, *::before, *::after { box-sizing: border-box; margin: 0; font-weight: normal; } body { min-height: 100vh; color: var(--color-text); background: var(--color-background); transition: color 0.5s, background-color 0.5s; line-height: 1.6; font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 15px; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; margin: 0; padding: 0; overflow: hidden; } /*== layer提示框==*/ .yvan-msg { min-width: 100px; background-color: rgba(0, 0, 0, 0.6); color: #fff; border: none; box-shadow: none; margin: 0; padding: 0; border-radius: 2px; position: fixed; pointer-events: auto; z-index: 10000; } .yvan-msg-content { pointer-events: auto; color: #fff; padding: 12px 25px; text-align: center; position: relative; line-height: 24px; word-break: break-all; overflow: hidden; font-size: 14px; overflow-x: hidden; overflow-y: auto; } /*== 动画 ==*/ .yvan-anim { -webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration: 0.3s; animation-duration: 0.3s; } @-webkit-keyframes yvan-bounceIn { 0% { opacity: 0; -webkit-transform: scale(0.5); transform: scale(0.5); } 100% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } } @keyframes yvan-bounceIn { 0% { opacity: 0; -webkit-transform: scale(0.5); -ms-transform: scale(0.5); transform: scale(0.5); } 100% { opacity: 1; -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } } .yvan-anim-00 { -webkit-animation-name: yvan-bounceIn; animation-name: yvan-bounceIn; } @-webkit-keyframes yvan-zoomInDown { 0% { opacity: 0; -webkit-transform: scale(0.1) translatey(-2000px); transform: scale(0.1) translatey(-2000px); -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } 60% { opacity: 1; -webkit-transform: scale(0.475) translatey(60px); transform: scale(0.475) translatey(60px); -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } } @keyframes yvan-zoomInDown { 0% { opacity: 0; -webkit-transform: scale(0.1) translatey(-2000px); -ms-transform: scale(0.1) translatey(-2000px); transform: scale(0.1) translatey(-2000px); -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } 60% { opacity: 1; -webkit-transform: scale(0.475) translatey(60px); -ms-transform: scale(0.475) translatey(60px); transform: scale(0.475) translatey(60px); -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } } .yvan-anim-01 { -webkit-animation-name: yvan-zoomInDown; animation-name: yvan-zoomInDown; } @-webkit-keyframes yvan-fadeInUpBig { 0% { opacity: 0; -webkit-transform: translatey(2000px); transform: translatey(2000px); } 100% { opacity: 1; -webkit-transform: translatey(0); transform: translatey(0); } } @keyframes yvan-fadeInUpBig { 0% { opacity: 0; -webkit-transform: translatey(2000px); -ms-transform: translatey(2000px); transform: translatey(2000px); } 100% { opacity: 1; -webkit-transform: translatey(0); -ms-transform: translatey(0); transform: translatey(0); } } .yvan-anim-02 { -webkit-animation-name: yvan-fadeInUpBig; animation-name: yvan-fadeInUpBig; } @-webkit-keyframes yvan-zoomInLeft { 0% { opacity: 0; -webkit-transform: scale(0.1) translatex(-2000px); transform: scale(0.1) translatex(-2000px); -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } 60% { opacity: 1; -webkit-transform: scale(0.475) translatex(48px); transform: scale(0.475) translatex(48px); -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } } @keyframes yvan-zoomInLeft { 0% { opacity: 0; -webkit-transform: scale(0.1) translatex(-2000px); -ms-transform: scale(0.1) translatex(-2000px); transform: scale(0.1) translatex(-2000px); -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } 60% { opacity: 1; -webkit-transform: scale(0.475) translatex(48px); -ms-transform: scale(0.475) translatex(48px); transform: scale(0.475) translatex(48px); -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } } .yvan-anim-03 { -webkit-animation-name: yvan-zoomInLeft; animation-name: yvan-zoomInLeft; } @-webkit-keyframes yvan-rollIn { 0% { opacity: 0; -webkit-transform: translatex(-100%) rotate(-120deg); transform: translatex(-100%) rotate(-120deg); } 100% { opacity: 1; -webkit-transform: translatex(0) rotate(0); transform: translatex(0) rotate(0); } } @keyframes yvan-rollIn { 0% { opacity: 0; -webkit-transform: translatex(-100%) rotate(-120deg); -ms-transform: translatex(-100%) rotate(-120deg); transform: translatex(-100%) rotate(-120deg); } 100% { opacity: 1; -webkit-transform: translatex(0) rotate(0); -ms-transform: translatex(0) rotate(0); transform: translatex(0) rotate(0); } } .yvan-anim-04 { -webkit-animation-name: yvan-rollIn; animation-name: yvan-rollIn; } @keyframes yvan-fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } .yvan-anim-05 { -webkit-animation-name: yvan-fadeIn; animation-name: yvan-fadeIn; } @-webkit-keyframes yvan-shake { 0%, 100% { -webkit-transform: translatex(0); transform: translatex(0); } 10%, 30%, 50%, 70%, 90% { -webkit-transform: translatex(-10px); transform: translatex(-10px); } 20%, 40%, 60%, 80% { -webkit-transform: translatex(10px); transform: translatex(10px); } } @keyframes yvan-shake { 0%, 100% { -webkit-transform: translatex(0); -ms-transform: translatex(0); transform: translatex(0); } 10%, 30%, 50%, 70%, 90% { -webkit-transform: translatex(-10px); -ms-transform: translatex(-10px); transform: translatex(-10px); } 20%, 40%, 60%, 80% { -webkit-transform: translatex(10px); -ms-transform: translatex(10px); transform: translatex(10px); } } .yvan-anim-06 { -webkit-animation-name: yvan-shake; animation-name: yvan-shake; } @-webkit-keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } /** flex多行容器 */ .flex-column-container { display: flex; flex-direction: column; flex-wrap: nowrap; } /** flex多列容器 */ .flex-row-container { display: flex; flex-direction: row; flex-wrap: nowrap; } /** flex自动填充 */ .flex-item-fill { flex-grow: 1; overflow: hidden; } /** flex固定大小 */ .flex-item-fixed { flex-shrink: 0; } /** flex主轴上对齐方式 */ .flex-justify-content-center { justify-content: center; } /** flex交叉轴上对齐方式 */ .flex-align-items-center { align-items: center; } /** 内容居中 */ .content-center { display: flex; align-items: center; justify-content: center; }