2026-07-17 11:54:43 +08:00

926 lines
17 KiB
CSS

@font-face {
font-family: 'Source Han Sans SC Fami Week Star';
font-style: normal;
font-weight: 500;
font-display: swap;
src: url('./assets/fonts/source-han-sans-sc-medium-latin.woff2')
format('woff2');
}
* {
box-sizing: border-box;
-webkit-tap-highlight-color: transparent;
}
:root {
--fami-week-page-width: min(100vw, 430px);
}
html,
body {
margin: 0;
width: 100%;
min-height: 100%;
overflow-x: hidden;
background: var(--hy-theme-bg, #f7f3ff);
color: #fff;
font-family:
'Source Han Sans SC Fami Week Star', 'Source Han Sans SC',
'Noto Sans Arabic', Arial, 'Helvetica Neue', Helvetica, sans-serif;
}
body {
background: #032b29;
}
button {
margin: 0;
border: 0;
padding: 0;
color: inherit;
font: inherit;
background: transparent;
cursor: pointer;
}
button:focus-visible {
outline: 6px solid #fff;
outline-offset: -10px;
}
img {
display: block;
max-width: none;
user-select: none;
-webkit-user-drag: none;
}
[hidden] {
display: none !important;
}
.fami-visually-hidden {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0 0 0 0);
clip-path: inset(50%);
white-space: nowrap;
}
.fami-week-star {
display: flex;
justify-content: center;
width: 100%;
min-height: 100svh;
overflow: hidden;
background: #032b29;
}
.fami-stage-wrap {
--design-scale: 0.3472222222;
position: relative;
flex: 0 0 auto;
width: var(--fami-week-page-width);
height: 921px;
overflow: hidden;
background: #053633;
}
.fami-design {
position: absolute;
isolation: isolate;
top: 0;
left: 0;
width: 1080px;
height: 3532px;
overflow: hidden;
transform: scale(var(--design-scale));
transform-origin: left top;
background: #053633;
}
.fami-hero {
position: absolute;
z-index: 2;
top: 0;
left: 0;
width: 1080px;
height: 1080px;
overflow: hidden;
background: #053633;
}
.fami-hero::after {
position: absolute;
z-index: 1;
inset: 0;
background: linear-gradient(
180deg,
rgba(1, 35, 32, 0.02) 0%,
rgba(1, 35, 32, 0.05) 70%,
#053633 100%
);
content: '';
pointer-events: none;
}
.fami-hero-background {
position: absolute;
z-index: 0;
top: 0;
left: 0;
width: 1080px;
height: 2402px;
object-fit: fill;
object-position: center top;
filter: saturate(1.08) brightness(1.03);
}
/* Figma 的 Hero 是压平的大区块,不能作为运行时截图;这里只复用无文字背景,星徽、标题、猫头鹰和日期牌全部独立构建。 */
.fami-hero-star,
.fami-hero-star::before,
.fami-hero-star::after,
.fami-hero-star-core,
.fami-hero-star-core::before {
position: absolute;
display: block;
clip-path: polygon(
50% 0,
61.5% 34%,
98% 35%,
68.5% 56.5%,
79.5% 93%,
50% 71.5%,
20.5% 93%,
31.5% 56.5%,
2% 35%,
38.5% 34%
);
}
.fami-hero-star {
z-index: 2;
top: 75px;
left: 221px;
width: 638px;
height: 600px;
filter: drop-shadow(0 10px 4px rgba(72, 35, 0, 0.82))
drop-shadow(0 0 30px rgba(255, 213, 89, 0.92));
}
.fami-hero-star::before {
z-index: 0;
inset: 0;
background: conic-gradient(
from -32deg at 50% 48%,
#7a3c00,
#ffe88d 8%,
#e38b09 18%,
#fff1a7 29%,
#a84d00 43%,
#ffd85a 58%,
#8b4200 72%,
#fff0a0 88%,
#7a3c00
);
content: '';
}
.fami-hero-star::after {
z-index: 1;
inset: 28px;
background: linear-gradient(
145deg,
#fff5a5,
#bb6100 35%,
#ffdb55 70%,
#713100
);
content: '';
}
.fami-hero-star-core {
z-index: 2;
inset: 57px;
background: url('./assets/layers/body-watermark.webp') -523px -683px /
1573px 3497px no-repeat;
filter: saturate(1.08) contrast(1.05);
}
.fami-hero-star-core::before {
inset: 0;
background:
linear-gradient(
90deg,
transparent 39%,
rgba(255, 246, 164, 0.08) 44%,
rgba(255, 255, 235, 0.88) 49.5%,
#fff 50%,
rgba(255, 255, 235, 0.88) 50.5%,
rgba(255, 246, 164, 0.08) 56%,
transparent 61%
),
linear-gradient(
0deg,
transparent 39%,
rgba(255, 246, 164, 0.08) 44%,
rgba(255, 255, 235, 0.88) 49.5%,
#fff 50%,
rgba(255, 255, 235, 0.88) 50.5%,
rgba(255, 246, 164, 0.08) 56%,
transparent 61%
),
radial-gradient(
circle at 50% 50%,
#fff 0 1.5%,
#fffbd2 2% 4%,
rgba(255, 236, 122, 0.95) 5% 8%,
rgba(63, 255, 226, 0.48) 9% 21%,
transparent 37%
);
content: '';
}
.fami-title-plaque {
position: absolute;
z-index: 3;
top: 574px;
left: 57px;
width: 966px;
height: 252px;
border: 14px solid #e7ac31;
border-radius: 114px 114px 72px 72px;
background:
radial-gradient(
circle at 50% 110%,
rgba(37, 255, 227, 0.25),
transparent 44%
),
linear-gradient(180deg, #0a776b 0%, #07594f 45%, #033b36 100%);
box-shadow:
inset 0 0 0 7px #fff0a4,
inset 0 0 0 15px #865206,
inset 0 0 42px rgba(0, 255, 220, 0.34),
0 8px 0 #6d3e00,
0 0 40px rgba(255, 202, 73, 0.65);
}
.fami-title-plaque::before,
.fami-title-plaque::after,
.fami-title-gem,
.fami-date-plaque::after {
position: absolute;
width: 48px;
height: 48px;
border: 7px solid #f9cf61;
background: linear-gradient(135deg, #64fff1, #00a99a 55%, #006a63);
box-shadow:
inset 0 0 0 5px #0a6d65,
0 0 18px rgba(67, 255, 231, 0.72);
content: '';
transform: rotate(45deg);
}
.fami-title-plaque::before {
top: 86px;
left: -32px;
}
.fami-title-plaque::after {
top: 86px;
right: -32px;
}
.fami-title-gem {
bottom: -32px;
left: calc(50% - 24px);
}
.fami-wordmark {
position: absolute;
z-index: 6;
top: 618px;
left: 115px;
width: 850px;
height: 152px;
margin: 0;
color: #ffe08a;
font-family: Georgia, 'Times New Roman', serif;
font-size: 124px;
font-weight: 700;
line-height: 152px;
text-align: center;
text-shadow:
0 4px 0 #7b4300,
0 8px 7px rgba(48, 25, 0, 0.75),
0 0 18px #fff1a4,
0 0 30px #ffbe36;
letter-spacing: -3px;
white-space: nowrap;
-webkit-text-stroke: 2px #fff0ad;
}
:lang(tr) .fami-wordmark,
:lang(es) .fami-wordmark {
font-size: 98px;
letter-spacing: -2px;
}
.fami-owl {
position: absolute;
z-index: 6;
top: 705px;
left: 125px;
width: 286px;
height: 286px;
filter: drop-shadow(0 12px 10px rgba(0, 0, 0, 0.34));
}
.fami-date-plaque {
position: absolute;
z-index: 5;
top: 850px;
left: 357px;
width: 643px;
height: 104px;
border: 10px solid #e8af2d;
border-radius: 50px;
background:
radial-gradient(
circle at 50% 130%,
rgba(68, 255, 228, 0.3),
transparent 52%
),
linear-gradient(180deg, #0a756a, #04433e);
box-shadow:
inset 0 0 0 5px #fff0a4,
inset 0 0 0 11px #784507,
0 7px 0 #714000,
0 0 24px rgba(255, 206, 76, 0.52);
}
.fami-date-plaque::after {
top: 21px;
right: -29px;
width: 40px;
height: 40px;
}
.fami-cycle-range {
position: absolute;
z-index: 7;
top: 889px;
left: 405px;
width: 445px;
height: 34px;
overflow: visible;
color: #dffbff;
font-family: 'SF Pro Text', 'Helvetica Neue', Arial, sans-serif;
font-size: 30px;
font-weight: 500;
line-height: 30px;
text-align: left;
white-space: nowrap;
text-shadow: 0 2px 7px rgba(0, 0, 0, 0.5);
}
.fami-note {
position: absolute;
z-index: 6;
top: 1069px;
left: 44px;
width: 952px;
height: 132px;
margin: 0;
overflow: hidden;
color: #e8fffd;
font-size: 36px;
font-weight: 500;
line-height: 42px;
text-align: left;
}
[dir='rtl'] .fami-note {
text-align: right;
}
.fami-gifts {
position: absolute;
z-index: 6;
top: 1247px;
left: 61px;
display: grid;
grid-template-columns: repeat(3, 257px);
column-gap: 93px;
width: 957px;
height: 258px;
}
.fami-gifts.has-state {
display: flex;
align-items: center;
justify-content: center;
}
.fami-current-state,
.fami-reward-state {
display: flex;
align-items: center;
justify-content: center;
padding: 36px 72px;
color: rgba(232, 255, 253, 0.86);
font-size: 34px;
font-weight: 500;
line-height: 46px;
text-align: center;
background: rgba(10, 65, 62, 0.88);
}
.fami-current-state {
width: 957px;
height: 180px;
}
.fami-gift-card {
position: relative;
width: 257px;
height: 258px;
}
.fami-gift-frame,
.fami-reward-frame {
position: absolute;
z-index: 2;
inset: 0;
width: 257px;
height: 258px;
object-fit: fill;
pointer-events: none;
}
.fami-gift-media,
.fami-reward-media {
position: absolute;
z-index: 3;
top: 41px;
left: 35px;
display: grid;
place-items: center;
width: 188px;
height: 188px;
}
.fami-gift-media img,
.fami-reward-media img {
position: relative;
z-index: 2;
width: 188px;
height: 188px;
object-fit: contain;
}
.fami-gift-media img:not([src]),
.fami-reward-media img:not([src]) {
display: none;
}
.fami-media-placeholder {
position: absolute;
z-index: 1;
top: 50%;
left: 50%;
width: 74px;
height: 74px;
border: 8px solid rgba(255, 224, 117, 0.76);
background: linear-gradient(135deg, #62fff0, #038e84);
box-shadow: 0 0 24px rgba(82, 255, 233, 0.72);
transform: translate(-50%, -50%) rotate(45deg);
}
.fami-gift-media img[src] + .fami-media-placeholder,
.fami-reward-media img[src] + .fami-media-placeholder {
display: none;
}
.fami-tabs {
position: absolute;
z-index: 8;
top: 1557px;
left: 21px;
display: grid;
grid-template-columns: repeat(3, 336px);
column-gap: 17px;
width: 1042px;
height: 151px;
}
.fami-tab {
position: relative;
width: 336px;
height: 151px;
overflow: hidden;
color: rgba(255, 255, 255, 0.6);
}
.fami-tab-skin {
position: absolute;
z-index: 0;
top: 0;
left: 0;
width: 336px;
height: 149px;
object-fit: fill;
pointer-events: none;
}
.fami-tab-skin--active {
display: none;
}
.fami-tab.is-active {
color: #fff;
}
.fami-tab.is-active .fami-tab-skin--active {
display: block;
}
.fami-tab.is-active .fami-tab-skin--inactive {
display: none;
}
.fami-tab span {
position: absolute;
z-index: 2;
top: 53px;
left: 32px;
display: flex;
align-items: center;
justify-content: center;
width: 270px;
height: 80px;
font-size: 32px;
font-weight: 500;
line-height: 34px;
text-align: center;
white-space: normal;
text-shadow: 0 2px 6px rgba(0, 0, 0, 0.45);
}
:lang(tr) .fami-tab span,
:lang(es) .fami-tab span {
top: 47px;
height: 90px;
font-size: 28px;
line-height: 30px;
}
.fami-panel {
position: absolute;
z-index: 5;
top: 0;
left: 0;
width: 1080px;
}
.fami-history-heading-band {
position: absolute;
top: 1760px;
left: 0;
width: 1080px;
height: 140px;
background: #0a413e;
}
.fami-history-heading-band h2 {
position: absolute;
top: 47px;
left: 120px;
width: 840px;
height: 56px;
margin: 0;
overflow: hidden;
color: #56ffdd;
font-size: 46px;
font-weight: 500;
line-height: 46px;
text-align: center;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
white-space: nowrap;
}
.fami-rank-list {
position: absolute;
left: 0;
width: 1080px;
}
.fami-rank-list--history {
top: 1900px;
}
.fami-rank-list--weekly {
top: 1760px;
}
.fami-rank-row {
position: relative;
width: 1080px;
height: 140px;
color: #fff;
}
.fami-rank-list--history .fami-rank-row:nth-child(odd) {
background: rgba(0, 203, 179, 0.2);
}
.fami-rank-list--history .fami-rank-row:nth-child(even),
.fami-rank-list--weekly .fami-rank-row:nth-child(odd) {
background: #0a413e;
}
.fami-rank-list--weekly .fami-rank-row:nth-child(even) {
background: rgba(11, 47, 59, 0.2);
}
.fami-rank-position {
position: absolute;
top: 0;
left: 0;
width: 137px;
height: 140px;
}
.fami-rank-medal {
position: absolute;
top: 39px;
left: 45px;
width: 69px;
height: 61px;
object-fit: contain;
}
.fami-rank-medal:not([src]) {
display: none;
}
.fami-rank-number {
position: absolute;
top: 49px;
left: 69px;
min-width: 42px;
height: 48px;
font-size: 36px;
font-weight: 500;
line-height: 42px;
text-align: left;
}
.fami-rank-medal[src] + .fami-rank-number {
display: none;
}
.fami-rank-avatar {
position: absolute;
top: 13px;
left: 160px;
width: 113px;
height: 113px;
overflow: hidden;
border-radius: 50%;
background: linear-gradient(145deg, #0d7b70, #042e2b);
box-shadow: inset 0 0 0 3px rgba(126, 255, 235, 0.35);
}
.fami-rank-avatar img {
position: absolute;
z-index: 2;
inset: 0;
width: 113px;
height: 113px;
object-fit: cover;
}
.fami-rank-avatar img:not([src]) {
display: none;
}
.fami-avatar-placeholder {
position: absolute;
z-index: 1;
inset: 0;
display: grid;
place-items: center;
color: rgba(232, 255, 253, 0.85);
font-size: 42px;
font-weight: 500;
text-transform: uppercase;
}
.fami-rank-name,
.fami-rank-score {
position: absolute;
top: 49px;
height: 48px;
overflow: hidden;
color: #fff;
font-size: 36px;
font-weight: 500;
line-height: 42px;
white-space: nowrap;
text-overflow: ellipsis;
}
.fami-rank-name {
left: 313px;
width: 440px;
text-align: start;
}
.fami-rank-score {
left: 846px;
width: 180px;
text-align: left;
}
.fami-list-state {
display: flex;
align-items: center;
justify-content: center;
width: 1080px;
height: 280px;
padding: 40px 90px;
color: rgba(232, 255, 253, 0.82);
font-size: 34px;
font-weight: 500;
line-height: 46px;
text-align: center;
background: #0a413e;
}
.fami-panel--rewards {
height: 3532px;
}
.fami-reward-panel-skin {
position: absolute;
top: 1760px;
left: 24px;
width: 1033px;
height: 1689px;
object-fit: fill;
pointer-events: none;
}
.fami-reward-groups {
position: absolute;
top: 1760px;
left: 0;
width: 1080px;
height: 1689px;
}
.fami-reward-state {
position: absolute;
top: 300px;
left: 90px;
width: 900px;
min-height: 200px;
}
.fami-reward-group {
position: absolute;
top: 116px;
left: 0;
width: 1080px;
height: 461px;
}
.fami-reward-group:nth-child(2) {
top: 614px;
}
.fami-reward-group:nth-child(3) {
top: 1112px;
}
.fami-reward-heading {
position: absolute;
top: 0;
left: 225px;
width: 632px;
height: 98px;
}
.fami-reward-heading img {
position: absolute;
inset: 0;
width: 632px;
height: 98px;
object-fit: fill;
pointer-events: none;
}
.fami-reward-heading h2 {
position: absolute;
top: 43px;
left: 120px;
width: 392px;
height: 45px;
margin: 0;
color: #dffcff;
font-family: 'SF Pro Text', 'Helvetica Neue', Arial, sans-serif;
font-size: 40px;
font-weight: 500;
line-height: 40px;
text-align: center;
text-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
}
.fami-reward-items {
position: absolute;
top: 135px;
left: 134px;
display: grid;
grid-template-columns: repeat(3, 257px);
column-gap: 21px;
width: 813px;
height: 326px;
}
.fami-reward-items[data-count='1'] {
left: 412px;
grid-template-columns: 257px;
width: 257px;
}
.fami-reward-items[data-count='2'] {
left: 273px;
grid-template-columns: repeat(2, 257px);
width: 535px;
}
.fami-reward-item {
position: relative;
width: 257px;
height: 326px;
}
.fami-reward-card {
position: absolute;
top: 0;
left: 0;
width: 257px;
height: 258px;
}
.fami-reward-glow {
position: absolute;
z-index: 1;
top: 30px;
left: 19px;
width: 219px;
height: 219px;
object-fit: contain;
opacity: 0.34;
pointer-events: none;
}
.fami-reward-label {
position: absolute;
top: 290px;
left: 3px;
width: 251px;
height: 45px;
overflow: hidden;
color: #fff;
font-size: 36px;
font-weight: 500;
line-height: 36px;
text-align: center;
white-space: nowrap;
text-overflow: ellipsis;
}
.fami-watermark {
position: absolute;
z-index: 1;
top: 987px;
left: -65px;
width: 1210px;
height: 2689px;
object-fit: fill;
opacity: 0.1;
pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
scroll-behavior: auto !important;
}
}