卫戍协议:盟约 web remake — initial import
Online co-op browser remake of Arknights' Stronghold Protocol: Alliance (client-simulated combat, official waves/bonds/items/strategies, 3D board, facing wheel, operator loadout, official emotes, deployment scripts).
This commit is contained in:
commit
01a44cd288
408 files changed
+308986
No files matched your search
@@ -0,0 +1,938 @@
|
||||
/* ==========================================================================================
|
||||
components.css — styles for js/ui/components.js and js/ui/toasts.js.
|
||||
Sizes in rem (1rem = 100 design px @1080p). Motion 150–250 ms.
|
||||
========================================================================================== */
|
||||
|
||||
/* ---- icon ------------------------------------------------------------------------------------ */
|
||||
.icon { fill: currentColor; flex: none; display: inline-block; vertical-align: middle; }
|
||||
|
||||
/* ---- button ------------------------------------------------------------------------------------ */
|
||||
.btn {
|
||||
--btn-bg: #1a201d;
|
||||
--btn-bg-hover: #222a26;
|
||||
--btn-fg: var(--text-hi);
|
||||
--btn-bd: var(--line-2);
|
||||
--btn-bd-hover: var(--mint-700);
|
||||
--btn-glow: rgba(78, 216, 175, .25);
|
||||
--bk-c: var(--mint-500);
|
||||
--bk-l: .1rem;
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: .1rem;
|
||||
height: .5rem;
|
||||
min-width: .5rem;
|
||||
padding: 0 .26rem;
|
||||
border: 1px solid var(--btn-bd);
|
||||
background: var(--btn-bg);
|
||||
color: var(--btn-fg);
|
||||
font-size: .18rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: .06em;
|
||||
line-height: 1;
|
||||
white-space: nowrap;
|
||||
outline-offset: 3px;
|
||||
transition: background-color var(--t-fast) var(--ease-out), border-color var(--t-fast) var(--ease-out),
|
||||
color var(--t-fast) var(--ease-out), box-shadow var(--t-med) var(--ease-out), transform var(--t-fast) var(--ease-out),
|
||||
filter var(--t-fast) var(--ease-out);
|
||||
}
|
||||
.btn::after {
|
||||
/* hover bracket corners */
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: -4px;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
background:
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) top left / var(--bk-l) 2px no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) top left / 2px var(--bk-l) no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) top right / var(--bk-l) 2px no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) top right / 2px var(--bk-l) no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) bottom left / var(--bk-l) 2px no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) bottom left / 2px var(--bk-l) no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) bottom right / var(--bk-l) 2px no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) bottom right / 2px var(--bk-l) no-repeat;
|
||||
transform: scale(1.04);
|
||||
transition: opacity var(--t-fast) var(--ease-out), transform var(--t-med) var(--ease-out);
|
||||
}
|
||||
.btn:not(:disabled):hover {
|
||||
background-color: var(--btn-bg-hover);
|
||||
border-color: var(--btn-bd-hover);
|
||||
box-shadow: 0 0 .18rem var(--btn-glow);
|
||||
}
|
||||
/* two rules: a selector list with :focus-visible is dropped whole by Safari < 15.4 */
|
||||
.btn:not(:disabled):hover::after { opacity: 1; transform: scale(1); }
|
||||
.btn:focus-visible::after { opacity: 1; transform: scale(1); }
|
||||
/* touch screens have no hover: a tap must not leave the hover glow stuck on */
|
||||
@media (hover: none) { .btn:not(:disabled):hover::after { opacity: 0; transform: none; } }
|
||||
.btn:not(:disabled):active { transform: translateY(1px); filter: brightness(.94); }
|
||||
.btn:focus-visible { outline: none; }
|
||||
|
||||
.btn__icon { width: 1.15em; height: 1.15em; }
|
||||
.btn__label { position: relative; }
|
||||
.btn__spin {
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
border: 2px solid currentColor;
|
||||
border-right-color: transparent;
|
||||
border-radius: 50%;
|
||||
animation: spin .7s linear infinite;
|
||||
}
|
||||
@keyframes spin { to { transform: rotate(360deg); } }
|
||||
|
||||
/* filled variants carry a hatch strip on the right end (in-game "准备就绪" look) */
|
||||
.btn--primary, .btn--amber, .btn--ice, .btn--danger {
|
||||
background-image:
|
||||
repeating-linear-gradient(-55deg, rgba(0, 0, 0, .16) 0 2px, transparent 2px 6px),
|
||||
linear-gradient(180deg, rgba(255, 255, 255, .18), rgba(255, 255, 255, 0) 45%);
|
||||
background-size: .34rem 100%, 100% 100%;
|
||||
background-position: right center, 0 0;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.btn--primary {
|
||||
--btn-bg: var(--mint-500);
|
||||
--btn-bg-hover: var(--mint-400);
|
||||
--btn-fg: var(--text-on-mint);
|
||||
--btn-bd: #6fe8c4;
|
||||
--btn-bd-hover: #9dffe2;
|
||||
--btn-glow: rgba(23, 249, 183, .45);
|
||||
--bk-c: var(--mint-400);
|
||||
}
|
||||
.btn--amber {
|
||||
--btn-bg: var(--amber);
|
||||
--btn-bg-hover: #ffb640;
|
||||
--btn-fg: #1d1203;
|
||||
--btn-bd: #ffc15e;
|
||||
--btn-bd-hover: #ffd58c;
|
||||
--btn-glow: rgba(246, 163, 41, .45);
|
||||
--bk-c: var(--amber);
|
||||
}
|
||||
.btn--ice {
|
||||
--btn-bg: var(--ice);
|
||||
--btn-bg-hover: #b9e0ff;
|
||||
--btn-fg: #0b1b29;
|
||||
--btn-bd: #c4e5ff;
|
||||
--btn-bd-hover: #e2f2ff;
|
||||
--btn-glow: rgba(159, 212, 255, .45);
|
||||
--bk-c: var(--ice);
|
||||
}
|
||||
.btn--danger {
|
||||
--btn-bg: #a3241a;
|
||||
--btn-bg-hover: #c42d20;
|
||||
--btn-fg: #fff;
|
||||
--btn-bd: #c83a2c;
|
||||
--btn-bd-hover: #ff5a47;
|
||||
--btn-glow: rgba(231, 49, 24, .45);
|
||||
--bk-c: var(--red-premium);
|
||||
}
|
||||
.btn--secondary { --btn-bg: rgba(20, 24, 22, .9); }
|
||||
.btn--ghost {
|
||||
--btn-bg: transparent;
|
||||
--btn-bg-hover: rgba(78, 216, 175, .06);
|
||||
--btn-fg: var(--text-lo);
|
||||
--btn-bd: transparent;
|
||||
--btn-bd-hover: transparent;
|
||||
--btn-glow: transparent;
|
||||
}
|
||||
.btn--ghost:not(:disabled):hover { color: var(--text-hi); }
|
||||
.btn.is-active { --btn-bd: var(--mint-500); --btn-fg: var(--mint-400); box-shadow: inset 0 0 0 1px var(--mint-a35); }
|
||||
.btn--primary.is-active { --btn-fg: var(--text-on-mint); }
|
||||
|
||||
.btn:disabled {
|
||||
cursor: not-allowed;
|
||||
--btn-bg: #171c1a;
|
||||
--btn-fg: var(--text-dim);
|
||||
--btn-bd: var(--line);
|
||||
background-image: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
.btn--primary:disabled {
|
||||
--btn-bg: #0f1d19;
|
||||
--btn-fg: var(--mint-700);
|
||||
--btn-bd: var(--mint-800);
|
||||
background-image: repeating-linear-gradient(-55deg, rgba(78, 216, 175, .06) 0 2px, transparent 2px 6px);
|
||||
background-size: .34rem 100%;
|
||||
background-position: right center;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.btn.is-loading { cursor: progress; --btn-fg: var(--text-lo); }
|
||||
.btn--primary.is-loading { --btn-bg: var(--mint-700); --btn-fg: var(--text-on-mint); }
|
||||
|
||||
.btn--sm { height: .36rem; min-width: .36rem; padding: 0 .16rem; font-size: .15rem; gap: .07rem; }
|
||||
.btn--lg { height: .64rem; min-width: .64rem; padding: 0 .34rem; font-size: .22rem; gap: .12rem; }
|
||||
.btn--xl { height: .84rem; min-width: .84rem; padding: 0 .48rem; font-size: .28rem; letter-spacing: .24em; gap: .16rem; }
|
||||
.btn--block { display: flex; width: 100%; }
|
||||
.btn--square { padding: 0; width: var(--sq, .5rem); }
|
||||
.btn--square.btn--sm { --sq: .36rem; }
|
||||
.btn--square.btn--lg { --sq: .64rem; }
|
||||
.btn--square.btn--xl { --sq: .84rem; }
|
||||
.btn--square .btn__icon { width: 50%; height: 50%; }
|
||||
|
||||
/* ---- panel ------------------------------------------------------------------------------------- */
|
||||
.panel {
|
||||
--bk-c: var(--mint-500);
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-width: 0;
|
||||
background:
|
||||
repeating-linear-gradient(0deg, rgba(255, 255, 255, .016) 0 1px, transparent 1px 3px),
|
||||
linear-gradient(180deg, rgba(30, 36, 33, .94), rgba(18, 22, 20, .94));
|
||||
border: 1px solid var(--line);
|
||||
box-shadow: 0 .12rem .3rem rgba(0, 0, 0, .35);
|
||||
}
|
||||
.panel--mint { --bk-c: var(--mint-500); }
|
||||
.panel--gold { --bk-c: var(--gold); }
|
||||
.panel--amber { --bk-c: var(--amber); }
|
||||
.panel--orange { --bk-c: var(--orange-hi); }
|
||||
.panel--red { --bk-c: var(--red-premium); }
|
||||
.panel--ice { --bk-c: var(--ice); }
|
||||
.panel--dim { --bk-c: var(--line-3); }
|
||||
.panel--glow { border-color: var(--mint-800); box-shadow: 0 0 0 1px rgba(78, 216, 175, .12), 0 0 .3rem rgba(23, 249, 183, .12), 0 .12rem .3rem rgba(0, 0, 0, .35); }
|
||||
.panel__head {
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
justify-content: space-between;
|
||||
gap: .16rem;
|
||||
padding: .16rem .22rem .12rem;
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
.panel__titles { display: flex; flex-direction: column; gap: .03rem; min-width: 0; }
|
||||
.panel__title { font-size: .21rem; font-weight: 700; letter-spacing: .04em; }
|
||||
.panel__actions { display: flex; gap: .08rem; align-items: center; }
|
||||
.panel__body { position: relative; padding: .22rem; min-height: 0; }
|
||||
.panel--flush .panel__body { padding: 0; }
|
||||
|
||||
/* ---- chevrons ------------------------------------------------------------------------------------ */
|
||||
.chevrons { --cv: var(--mint-500); display: inline-flex; align-items: center; gap: .03rem; height: .28rem; }
|
||||
.chevrons svg { height: 100%; width: calc(var(--ch-h, .28rem) * .6); fill: var(--cv); opacity: .9; }
|
||||
.chevrons--left svg { transform: scaleX(-1); }
|
||||
.chevrons.is-animated svg { animation: chev-flow 1.2s linear infinite; animation-delay: calc(var(--i) * 140ms); opacity: .15; }
|
||||
.chevrons--gold { --cv: var(--gold); }
|
||||
.chevrons--amber { --cv: var(--amber); }
|
||||
.chevrons--orange { --cv: var(--orange-hi); }
|
||||
.chevrons--red { --cv: var(--red-premium); }
|
||||
.chevrons--ice { --cv: var(--ice); }
|
||||
.chevrons--dim { --cv: var(--line-3); }
|
||||
@keyframes chev-flow { 0% { opacity: .15; } 25% { opacity: 1; } 55%, 100% { opacity: .15; } }
|
||||
|
||||
/* ---- hex badge ------------------------------------------------------------------------------------ */
|
||||
.hex {
|
||||
--hex-c: var(--gold);
|
||||
--hex-bg: #15130b;
|
||||
--hex-fg: var(--gold);
|
||||
--hex-h: .34rem;
|
||||
--hex-slope: .1rem;
|
||||
display: inline-grid;
|
||||
height: var(--hex-h);
|
||||
padding: 1.5px;
|
||||
background: var(--hex-c);
|
||||
clip-path: polygon(var(--hex-slope) 0, calc(100% - var(--hex-slope)) 0, 100% 50%, calc(100% - var(--hex-slope)) 100%, var(--hex-slope) 100%, 0 50%);
|
||||
filter: drop-shadow(0 0 3px rgba(0, 0, 0, .6));
|
||||
vertical-align: middle;
|
||||
}
|
||||
.hex__fill {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: .05rem;
|
||||
min-width: calc(var(--hex-h) * .95);
|
||||
padding: 0 calc(var(--hex-slope) + .04rem);
|
||||
background: radial-gradient(120% 90% at 50% 0%, rgba(255, 255, 255, .08), transparent 60%), var(--hex-bg);
|
||||
color: var(--hex-fg);
|
||||
clip-path: polygon(var(--hex-slope) 0, calc(100% - var(--hex-slope)) 0, 100% 50%, calc(100% - var(--hex-slope)) 100%, var(--hex-slope) 100%, 0 50%);
|
||||
}
|
||||
.hex__value { font-family: var(--font-num); font-weight: 700; font-size: calc(var(--hex-h) * .62); line-height: 1; font-variant-numeric: tabular-nums; }
|
||||
.hex__icon { width: calc(var(--hex-h) * .5); height: calc(var(--hex-h) * .5); }
|
||||
.hex--sm { --hex-h: .26rem; --hex-slope: .075rem; }
|
||||
.hex--lg { --hex-h: .46rem; --hex-slope: .13rem; }
|
||||
.hex--mint { --hex-c: var(--mint-500); --hex-fg: var(--mint-400); --hex-bg: #0b1814; }
|
||||
.hex--discount { --hex-c: var(--mint-400); --hex-fg: var(--mint-400); --hex-bg: #0b1814; }
|
||||
.hex--premium { --hex-c: var(--red-premium); --hex-fg: var(--red-premium); --hex-bg: #1b0c0b; }
|
||||
.hex--red { --hex-c: var(--red); --hex-fg: #fff; --hex-bg: #6d170e; }
|
||||
.hex--amber { --hex-c: var(--amber); --hex-fg: var(--amber); --hex-bg: #1b1307; }
|
||||
.hex--ice { --hex-c: var(--ice); --hex-fg: var(--ice); --hex-bg: #0c1823; }
|
||||
.hex--dark { --hex-c: var(--line-3); --hex-fg: var(--text-hi); --hex-bg: #111513; }
|
||||
|
||||
/* ---- tier chip ------------------------------------------------------------------------------------- */
|
||||
/* Official octagon chip (sprite img_chess_level_N) when available; otherwise a CSS octagon in the same colours. */
|
||||
.tier {
|
||||
--tc: var(--tier-1);
|
||||
--tier-h: .28rem;
|
||||
--oct: polygon(27% 0, 73% 0, 100% 27%, 100% 73%, 73% 100%, 27% 100%, 0 73%, 0 27%);
|
||||
position: relative;
|
||||
isolation: isolate;
|
||||
display: inline-grid;
|
||||
place-items: center;
|
||||
flex: none;
|
||||
width: var(--tier-h);
|
||||
height: var(--tier-h);
|
||||
background: var(--tc);
|
||||
clip-path: var(--oct);
|
||||
color: var(--tc);
|
||||
font-family: var(--font-num);
|
||||
font-weight: 700;
|
||||
font-size: calc(var(--tier-h) * .5);
|
||||
line-height: 1;
|
||||
letter-spacing: -.02em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.tier::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: max(1.5px, calc(var(--tier-h) * .08));
|
||||
z-index: -1;
|
||||
background: #2a2f2d;
|
||||
clip-path: var(--oct);
|
||||
}
|
||||
.tier--1 { --tc: var(--tier-1); }
|
||||
.tier--2 { --tc: var(--tier-2); }
|
||||
.tier--3 { --tc: var(--tier-3); }
|
||||
.tier--4 { --tc: var(--tier-4); }
|
||||
.tier--5 { --tc: var(--tier-5); }
|
||||
.tier--6 { --tc: var(--tier-6); }
|
||||
.tier--sm { --tier-h: .22rem; }
|
||||
.tier--lg { --tier-h: .38rem; }
|
||||
.tier--golden { --tc: var(--gold); }
|
||||
.tier--golden::before { background: #3b2e05; }
|
||||
.tier--img { background: none; clip-path: none; }
|
||||
.tier--img::before { content: none; }
|
||||
.tier--img img { width: 100%; height: 100%; display: block; object-fit: contain; filter: drop-shadow(0 1px 1px rgba(0, 0, 0, .8)); }
|
||||
.tier--img.tier--golden img { filter: drop-shadow(0 0 .04rem rgba(255, 198, 0, .95)) drop-shadow(0 0 .02rem rgba(255, 198, 0, .9)); }
|
||||
|
||||
/* ---- bond disc ------------------------------------------------------------------------------------ */
|
||||
.bond {
|
||||
--disc: .56rem;
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: .05rem;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
background: none;
|
||||
color: inherit;
|
||||
font: inherit;
|
||||
}
|
||||
.bond__disc { position: relative; width: var(--disc); height: var(--disc); display: grid; place-items: center; }
|
||||
.bond__ring {
|
||||
position: absolute;
|
||||
inset: calc(var(--disc) * -.1);
|
||||
width: calc(var(--disc) * 1.2);
|
||||
height: calc(var(--disc) * 1.2);
|
||||
overflow: visible;
|
||||
}
|
||||
.bond__ring circle { fill: none; stroke-width: 5; stroke: rgba(255, 255, 255, .13); transition: stroke var(--t-med); }
|
||||
.bond__ring circle.on { stroke: var(--mint-400); filter: drop-shadow(0 0 2px rgba(23, 249, 183, .8)); }
|
||||
.bond__core {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 50%;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
background: radial-gradient(circle at 50% 30%, #46524d, #1d2421 72%);
|
||||
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .1), inset 0 -3px 6px rgba(0, 0, 0, .5), 0 2px 6px rgba(0, 0, 0, .55);
|
||||
transition: transform var(--t-fast) var(--ease-out), box-shadow var(--t-med), background var(--t-med);
|
||||
}
|
||||
.bond__icon { width: 66%; height: 66%; object-fit: contain; filter: brightness(0) invert(.82); pointer-events: none; }
|
||||
.bond__glyph { font-weight: 900; font-size: calc(var(--disc) * .42); line-height: 1; color: #cfd6d3; }
|
||||
.bond.is-active .bond__core {
|
||||
background: radial-gradient(circle at 50% 28%, #b6ffea, var(--mint-500) 52%, #16906e 100%);
|
||||
box-shadow: 0 0 .16rem rgba(23, 249, 183, .5), inset 0 0 0 1px rgba(255, 255, 255, .45), inset 0 -4px 8px rgba(0, 60, 40, .45);
|
||||
}
|
||||
.bond.is-active .bond__icon { filter: brightness(0) opacity(.85); }
|
||||
.bond.is-active .bond__glyph { color: #06221a; }
|
||||
.bond__count {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
bottom: calc(var(--disc) * -.1);
|
||||
transform: translateX(-50%);
|
||||
font-family: var(--font-num);
|
||||
font-weight: 700;
|
||||
font-size: calc(var(--disc) * .32);
|
||||
line-height: 1;
|
||||
color: #fff;
|
||||
text-shadow: 0 0 3px #000, 0 1px 2px #000, 0 0 6px #000;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
.bond__name { font-size: calc(var(--disc) * .27); color: var(--text-md); text-shadow: 0 1px 2px #000; white-space: nowrap; }
|
||||
.bond.is-active .bond__name { color: var(--text-hi); }
|
||||
.bond.is-disabled .bond__core { filter: grayscale(1) brightness(.55); }
|
||||
.bond.is-disabled .bond__name { color: var(--text-dim); }
|
||||
.bond__ban {
|
||||
position: absolute;
|
||||
top: calc(var(--disc) * -.12);
|
||||
right: calc(var(--disc) * -.12);
|
||||
width: calc(var(--disc) * .36);
|
||||
height: calc(var(--disc) * .36);
|
||||
display: grid;
|
||||
place-items: center;
|
||||
background: #d32a1b;
|
||||
color: #fff;
|
||||
border: 1px solid #ff7a6b;
|
||||
box-shadow: 0 0 4px rgba(0, 0, 0, .6);
|
||||
}
|
||||
.bond__ban .icon { width: 80%; height: 80%; }
|
||||
.bond.is-frozen { opacity: .5; }
|
||||
.bond.is-clickable { cursor: pointer; }
|
||||
.bond.is-clickable:hover .bond__core { transform: scale(1.07); }
|
||||
.bond--sm { --disc: .42rem; }
|
||||
.bond--lg { --disc: .76rem; }
|
||||
|
||||
/* ---- seven segment & countdown ------------------------------------------------------------------- */
|
||||
.seg {
|
||||
--seg-h: .72rem;
|
||||
--seg-on: var(--mint-glow);
|
||||
--seg-glow: rgba(23, 249, 183, .55);
|
||||
display: inline-flex;
|
||||
align-items: stretch;
|
||||
gap: calc(var(--seg-h) * .06);
|
||||
height: var(--seg-h);
|
||||
filter: drop-shadow(0 0 calc(var(--seg-h) * .07) var(--seg-glow));
|
||||
}
|
||||
.seg__char { height: var(--seg-h); width: calc(var(--seg-h) * .615); overflow: visible; }
|
||||
.seg__char--colon { width: calc(var(--seg-h) * .2); }
|
||||
.seg .on { fill: var(--seg-on); }
|
||||
.seg .off { fill: var(--seg-on); opacity: .07; }
|
||||
.seg--orange { --seg-on: var(--orange-hi); --seg-glow: rgba(255, 110, 40, .6); }
|
||||
.seg--gold { --seg-on: var(--gold); --seg-glow: rgba(255, 198, 0, .5); }
|
||||
.seg--red { --seg-on: var(--red-premium); --seg-glow: rgba(255, 84, 84, .55); }
|
||||
.seg--ice { --seg-on: var(--ice); --seg-glow: rgba(159, 212, 255, .5); }
|
||||
.seg.is-flicker { animation: seg-flicker 1s steps(1, end) infinite; }
|
||||
@keyframes seg-flicker {
|
||||
0%, 44% { opacity: 1; }
|
||||
45% { opacity: .45; }
|
||||
50% { opacity: 1; }
|
||||
53% { opacity: .6; }
|
||||
56%, 100% { opacity: 1; }
|
||||
}
|
||||
|
||||
.countdown { --cd-h: .72rem; --cd-c: var(--mint-glow); display: inline-flex; align-items: flex-start; gap: .1rem; }
|
||||
.countdown .seg { --seg-h: var(--cd-h); }
|
||||
.countdown__main { display: flex; flex-direction: column; align-items: flex-end; }
|
||||
.countdown__label {
|
||||
margin-top: .05rem;
|
||||
font-family: var(--font-display);
|
||||
font-size: calc(var(--cd-h) * .14);
|
||||
letter-spacing: .22em;
|
||||
color: var(--mint-700);
|
||||
line-height: 1;
|
||||
}
|
||||
.countdown__gauge { display: flex; flex-direction: column; justify-content: space-between; width: calc(var(--cd-h) * .3); height: var(--cd-h); }
|
||||
.countdown__gauge i { display: block; height: 12%; background: rgba(23, 249, 183, .1); transition: background var(--t-med), box-shadow var(--t-med); }
|
||||
.countdown__gauge i.on { background: var(--cd-c); box-shadow: 0 0 6px rgba(23, 249, 183, .55); }
|
||||
.countdown.is-warn { --cd-c: var(--orange-hi); }
|
||||
.countdown.is-warn .countdown__label { color: var(--orange); }
|
||||
.countdown.is-warn .countdown__gauge i { background: rgba(255, 122, 51, .12); }
|
||||
.countdown.is-warn .countdown__gauge i.on { background: var(--orange-hi); box-shadow: 0 0 6px rgba(255, 110, 40, .6); }
|
||||
.countdown--sm { --cd-h: .44rem; }
|
||||
.countdown--lg { --cd-h: 1.1rem; }
|
||||
|
||||
/* ---- modal ---------------------------------------------------------------------------------------- */
|
||||
.modal {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: var(--z-modal);
|
||||
display: grid;
|
||||
place-items: center;
|
||||
padding: .3rem;
|
||||
background: rgba(3, 5, 4, .72);
|
||||
-webkit-backdrop-filter: blur(3px);
|
||||
backdrop-filter: blur(3px);
|
||||
animation: modal-fade var(--t-med) var(--ease-out);
|
||||
}
|
||||
.modal__box {
|
||||
--bk-c: var(--mint-500);
|
||||
--mstripe: var(--mint-500);
|
||||
width: min(6.4rem, 94vw);
|
||||
max-height: 88vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background:
|
||||
repeating-linear-gradient(0deg, rgba(255, 255, 255, .016) 0 1px, transparent 1px 3px),
|
||||
linear-gradient(180deg, #1c2320, #111513);
|
||||
border: 1px solid var(--line-2);
|
||||
box-shadow: 0 .3rem .9rem rgba(0, 0, 0, .65), 0 0 .4rem rgba(23, 249, 183, .06);
|
||||
animation: modal-in var(--t-slow) var(--ease-out);
|
||||
}
|
||||
.modal__box--red { --bk-c: var(--red-premium); --mstripe: var(--red); }
|
||||
.modal__box--amber { --bk-c: var(--amber); --mstripe: var(--amber); }
|
||||
.modal__box--orange { --bk-c: var(--orange-hi); --mstripe: var(--orange); }
|
||||
.modal__box--gold { --bk-c: var(--gold); --mstripe: var(--gold); }
|
||||
.modal__box--ice { --bk-c: var(--ice); --mstripe: var(--ice); }
|
||||
.modal__stripe {
|
||||
flex: none;
|
||||
height: .05rem;
|
||||
background: repeating-linear-gradient(-45deg, var(--mstripe) 0 .06rem, transparent .06rem .13rem);
|
||||
opacity: .55;
|
||||
}
|
||||
.modal__head { display: flex; flex-direction: column; gap: .04rem; padding: .22rem .3rem .04rem; }
|
||||
.modal__title { font-size: .26rem; font-weight: 700; letter-spacing: .04em; }
|
||||
.modal__body { padding: .14rem .3rem .26rem; color: var(--text-md); overflow: auto; }
|
||||
.modal__text { font-size: .18rem; line-height: 1.7; }
|
||||
.modal__actions {
|
||||
flex: none;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: .14rem;
|
||||
padding: .18rem .3rem;
|
||||
border-top: 1px solid var(--line);
|
||||
background: rgba(0, 0, 0, .22);
|
||||
}
|
||||
@keyframes modal-fade { from { opacity: 0; } }
|
||||
@keyframes modal-in { from { opacity: 0; transform: translateY(.14rem) scale(.985); } }
|
||||
|
||||
/* ---- tooltip -------------------------------------------------------------------------------------- */
|
||||
.tt-anchor { display: inline-flex; }
|
||||
.tt-anchor--block { display: flex; }
|
||||
.tooltip {
|
||||
position: fixed;
|
||||
z-index: var(--z-tooltip);
|
||||
max-width: 3.8rem;
|
||||
padding: .09rem .13rem;
|
||||
background: rgba(10, 13, 12, .97);
|
||||
border: 1px solid var(--line-2);
|
||||
border-left: 2px solid var(--mint-500);
|
||||
box-shadow: 0 .06rem .2rem rgba(0, 0, 0, .55);
|
||||
color: var(--text-md);
|
||||
font-size: .15rem;
|
||||
line-height: 1.55;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
transition: opacity var(--t-fast) var(--ease-out), transform var(--t-fast) var(--ease-out);
|
||||
white-space: pre-line;
|
||||
}
|
||||
.tooltip.is-shown { opacity: 1; }
|
||||
.tooltip--top.is-shown { animation: tip-up var(--t-fast) var(--ease-out); }
|
||||
.tooltip--bottom.is-shown { animation: tip-down var(--t-fast) var(--ease-out); }
|
||||
@keyframes tip-up { from { transform: translateY(4px); } }
|
||||
@keyframes tip-down { from { transform: translateY(-4px); } }
|
||||
|
||||
/* ---- progress bar ----------------------------------------------------------------------------------- */
|
||||
.pbar { --pc: var(--mint-500); --ph: .1rem; display: flex; flex-direction: column; gap: .05rem; min-width: .8rem; }
|
||||
.pbar__meta { display: flex; justify-content: space-between; align-items: baseline; gap: .1rem; font-size: .14rem; color: var(--text-lo); }
|
||||
.pbar__value { font-family: var(--font-num); font-weight: 700; color: var(--text-hi); font-size: .16rem; }
|
||||
.pbar__value small { color: var(--text-dim); font-size: .8em; }
|
||||
.pbar__track { position: relative; height: var(--ph); background: #080a09; border: 1px solid var(--line); overflow: hidden; }
|
||||
.pbar__fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, transparent, var(--pc)); background: linear-gradient(90deg, color-mix(in srgb, var(--pc) 45%, transparent), var(--pc));
|
||||
box-shadow: 0 0 8px var(--pc); box-shadow: 0 0 8px color-mix(in srgb, var(--pc) 60%, transparent);
|
||||
transition: width var(--t-slow) var(--ease-out);
|
||||
}
|
||||
.pbar__segs {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: repeating-linear-gradient(90deg, transparent 0 calc(100% / var(--segs) - 2px), #080a09 calc(100% / var(--segs) - 2px) calc(100% / var(--segs)));
|
||||
}
|
||||
.pbar--gold { --pc: var(--gold); }
|
||||
.pbar--amber { --pc: var(--amber); }
|
||||
.pbar--orange { --pc: var(--orange-hi); }
|
||||
.pbar--red { --pc: var(--red-premium); }
|
||||
.pbar--ice { --pc: var(--ice); }
|
||||
.pbar--sm { --ph: .06rem; }
|
||||
.pbar--lg { --ph: .16rem; }
|
||||
|
||||
/* ---- tabs -------------------------------------------------------------------------------------------- */
|
||||
.tabs { display: flex; gap: .04rem; border-bottom: 1px solid var(--line); }
|
||||
.tabs__tab {
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: .07rem;
|
||||
padding: .1rem .22rem .12rem;
|
||||
border: 0;
|
||||
background: none;
|
||||
color: var(--text-lo);
|
||||
font-size: .17rem;
|
||||
font-weight: 500;
|
||||
letter-spacing: .04em;
|
||||
transition: color var(--t-fast) var(--ease-out), background-color var(--t-fast);
|
||||
}
|
||||
.tabs__tab:hover:not(:disabled) { color: var(--text-hi); background: rgba(78, 216, 175, .04); }
|
||||
.tabs__tab:disabled { color: var(--text-dim); cursor: not-allowed; }
|
||||
.tabs__tab::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: .12rem;
|
||||
right: .12rem;
|
||||
bottom: -1px;
|
||||
height: 2px;
|
||||
background: var(--mint-500);
|
||||
box-shadow: 0 0 8px rgba(23, 249, 183, .7);
|
||||
transform: scaleX(0);
|
||||
transition: transform var(--t-med) var(--ease-out);
|
||||
}
|
||||
.tabs__tab.is-active { color: var(--mint-400); }
|
||||
.tabs__tab.is-active::after { transform: scaleX(1); }
|
||||
.tabs__badge { font-family: var(--font-num); font-size: .13rem; padding: .01rem .06rem; background: var(--bg-3); color: var(--text-md); }
|
||||
.tabs--sm .tabs__tab { font-size: .15rem; padding: .07rem .16rem .09rem; }
|
||||
|
||||
/* ---- spinner -------------------------------------------------------------------------------------- */
|
||||
.spinner { --sp: .36rem; --sc: var(--mint-500); display: inline-flex; align-items: center; gap: .1rem; color: var(--text-lo); font-size: .15rem; }
|
||||
.spinner svg { width: var(--sp); height: var(--sp); animation: spin 1.6s linear infinite; overflow: visible; }
|
||||
.spinner__track { fill: none; stroke: var(--line-2); stroke-width: 3; }
|
||||
.spinner__arc { fill: none; stroke: var(--sc); stroke-width: 3; stroke-dasharray: 34 98; animation: spinner-dash 1.1s var(--ease-in-out) infinite; filter: drop-shadow(0 0 3px var(--sc)); }
|
||||
.spinner--sm { --sp: .22rem; }
|
||||
.spinner--lg { --sp: .56rem; }
|
||||
.spinner--gold { --sc: var(--gold); }
|
||||
.spinner--amber { --sc: var(--amber); }
|
||||
.spinner__label { font-family: var(--font-display); letter-spacing: .2em; font-size: .12rem; text-transform: uppercase; }
|
||||
@keyframes spinner-dash { 0% { stroke-dashoffset: 0; } 100% { stroke-dashoffset: -132; } }
|
||||
|
||||
/* ---- avatar frame ---------------------------------------------------------------------------------- */
|
||||
.avatar {
|
||||
--av: .9rem;
|
||||
--seat-hue: 162;
|
||||
--bk-c: var(--line-3);
|
||||
--bk-l: calc(var(--av) * .16);
|
||||
position: relative;
|
||||
width: var(--av);
|
||||
height: var(--av);
|
||||
flex: none;
|
||||
padding: calc(var(--av) * .045);
|
||||
background: #0a0d0c;
|
||||
border: 1px solid var(--line);
|
||||
}
|
||||
.avatar__img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
background:
|
||||
repeating-linear-gradient(45deg, rgba(255, 255, 255, .03) 0 2px, transparent 2px 7px),
|
||||
radial-gradient(circle at 30% 18%, hsl(var(--seat-hue) 42% 30%), hsl(var(--seat-hue) 30% 11%) 72%);
|
||||
}
|
||||
.avatar__img img { width: 100%; height: 100%; object-fit: cover; }
|
||||
.avatar__glyph {
|
||||
font-size: calc(var(--av) * .44);
|
||||
font-weight: 900;
|
||||
line-height: 1;
|
||||
color: hsl(var(--seat-hue) 70% 82%);
|
||||
text-shadow: 0 0 calc(var(--av) * .12) hsl(var(--seat-hue) 80% 50% / .45);
|
||||
}
|
||||
.avatar__bot { width: 56%; height: 56%; color: #a9c3d8; filter: drop-shadow(0 0 6px rgba(159, 212, 255, .35)); }
|
||||
.avatar__empty { width: 36%; height: 36%; color: var(--text-dim); }
|
||||
.avatar__badge {
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
top: calc(var(--av) * -.1);
|
||||
left: calc(var(--av) * -.1);
|
||||
width: max(.22rem, calc(var(--av) * .28));
|
||||
height: max(.22rem, calc(var(--av) * .28));
|
||||
display: grid;
|
||||
place-items: center;
|
||||
clip-path: polygon(25% 0, 75% 0, 100% 50%, 75% 100%, 25% 100%, 0 50%);
|
||||
}
|
||||
.avatar__badge .icon { width: 62%; height: 62%; }
|
||||
.avatar__badge--host { background: var(--gold); color: #1d1400; }
|
||||
.avatar__badge--self { left: auto; right: calc(var(--av) * -.1); background: var(--mint-500); color: var(--text-on-mint); }
|
||||
.avatar__tag {
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
right: calc(var(--av) * .06);
|
||||
bottom: calc(var(--av) * .06);
|
||||
padding: .01rem .05rem;
|
||||
background: var(--ice);
|
||||
color: #0b1a26;
|
||||
font-family: var(--font-display);
|
||||
font-weight: 700;
|
||||
font-size: max(.1rem, calc(var(--av) * .13));
|
||||
letter-spacing: .08em;
|
||||
line-height: 1.2;
|
||||
}
|
||||
.avatar.is-self { --bk-c: var(--mint-500); border-color: var(--mint-800); }
|
||||
.avatar.is-ready { --bk-c: var(--mint-400); }
|
||||
.avatar.is-offline .avatar__img, .avatar.is-dead .avatar__img { filter: grayscale(1) brightness(.45); }
|
||||
.avatar.is-empty { border-style: dashed; border-color: var(--line-2); background: transparent; --bk-c: transparent; }
|
||||
.avatar.is-empty .avatar__img { background: rgba(255, 255, 255, .015); }
|
||||
.avatar--sm { --av: .48rem; }
|
||||
.avatar--lg { --av: 1.4rem; }
|
||||
.avatar--xl { --av: 2rem; }
|
||||
|
||||
/* ---- phase banner ------------------------------------------------------------------------------------ */
|
||||
.pbanner { --pb: var(--mint-500); --pb-glow: rgba(23, 249, 183, .4); width: 100%; pointer-events: none; }
|
||||
.pbanner--overlay { position: fixed; left: 0; right: 0; top: 50%; transform: translateY(-50%); z-index: var(--z-banner); }
|
||||
.pbanner--orange { --pb: var(--orange-hi); --pb-glow: rgba(255, 110, 40, .45); }
|
||||
.pbanner--red { --pb: var(--red-premium); --pb-glow: rgba(255, 60, 60, .45); }
|
||||
.pbanner--gold { --pb: var(--gold); --pb-glow: rgba(255, 198, 0, .4); }
|
||||
.pbanner--ice { --pb: var(--ice); --pb-glow: rgba(159, 212, 255, .4); }
|
||||
.pbanner__band {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: .5rem;
|
||||
padding: .24rem 0 .26rem;
|
||||
background:
|
||||
repeating-linear-gradient(0deg, rgba(255, 255, 255, .025) 0 1px, transparent 1px 3px),
|
||||
linear-gradient(90deg, transparent, rgba(7, 10, 9, .93) 16%, rgba(7, 10, 9, .93) 84%, transparent);
|
||||
overflow: hidden;
|
||||
transform-origin: center;
|
||||
animation: pb-open var(--t-med) var(--ease-out) backwards;
|
||||
}
|
||||
.pbanner__band::before, .pbanner__band::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 1px;
|
||||
background: linear-gradient(90deg, transparent, var(--pb) 18%, var(--pb) 82%, transparent);
|
||||
box-shadow: 0 0 8px var(--pb-glow);
|
||||
animation: pb-line 380ms var(--ease-out) backwards;
|
||||
}
|
||||
.pbanner__band::before { top: 0; }
|
||||
.pbanner__band::after { bottom: 0; }
|
||||
.pbanner__text {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: .04rem;
|
||||
animation: pb-wipe 380ms 90ms var(--ease-out) backwards;
|
||||
}
|
||||
.pbanner__text::after {
|
||||
/* one-shot light sweep */
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -20%;
|
||||
bottom: -20%;
|
||||
left: -30%;
|
||||
width: 20%;
|
||||
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .22), transparent);
|
||||
transform: skewX(-20deg);
|
||||
animation: pb-sweep 700ms 250ms var(--ease-out) forwards;
|
||||
opacity: 0;
|
||||
}
|
||||
.pbanner__micro { font-family: var(--font-display); font-size: .12rem; letter-spacing: .5em; color: var(--pb); padding-left: .5em; }
|
||||
.pbanner__title {
|
||||
font-size: .56rem;
|
||||
font-weight: 900;
|
||||
letter-spacing: .16em;
|
||||
padding-left: .16em;
|
||||
line-height: 1.1;
|
||||
color: #fff;
|
||||
text-shadow: 0 0 .22rem var(--pb-glow), 0 2px 0 rgba(0, 0, 0, .5);
|
||||
}
|
||||
.pbanner__sub { font-size: .16rem; color: var(--text-lo); letter-spacing: .12em; }
|
||||
.pbanner__chev { --ch-h: .42rem; height: .42rem; flex: none; }
|
||||
.pbanner--inline .pbanner__band { animation-duration: var(--t-slow); }
|
||||
.pbanner.is-leaving .pbanner__band { animation: pb-close 240ms var(--ease-in-out) forwards; }
|
||||
@keyframes pb-open { from { transform: scaleY(0); opacity: 0; } }
|
||||
@keyframes pb-close { to { transform: scaleY(0); opacity: 0; } }
|
||||
@keyframes pb-line { from { transform: scaleX(0); } }
|
||||
@keyframes pb-wipe { from { clip-path: inset(0 100% 0 0); } to { clip-path: inset(0 0 0 0); } }
|
||||
@keyframes pb-sweep { 0% { left: -30%; opacity: 1; } 100% { left: 120%; opacity: 0; } }
|
||||
|
||||
/* ---- ping pill ------------------------------------------------------------------------------------- */
|
||||
.ping {
|
||||
--pc: var(--mint-400);
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: .04rem;
|
||||
height: .32rem;
|
||||
padding: 0 .14rem 0 .11rem;
|
||||
border-radius: 99px;
|
||||
background: rgba(0, 0, 0, .5);
|
||||
border: 1px solid var(--line);
|
||||
color: var(--pc);
|
||||
font-family: var(--font-num);
|
||||
font-size: .18rem;
|
||||
font-weight: 700;
|
||||
line-height: 1;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
.ping__icon { width: .15rem; height: .15rem; margin-right: .03rem; }
|
||||
.ping__unit { font-size: .13rem; color: var(--text-lo); font-weight: 500; }
|
||||
.ping--low { --pc: var(--mint-400); }
|
||||
.ping--medium { --pc: var(--amber); }
|
||||
.ping--high { --pc: var(--red-premium); }
|
||||
.ping--off { --pc: var(--text-dim); }
|
||||
|
||||
/* ---- difficulty tag ---------------------------------------------------------------------------------- */
|
||||
.dtag { --d-color: var(--amber); display: inline-flex; align-items: center; gap: .06rem; color: var(--d-color); font-weight: 700; font-size: .18rem; letter-spacing: .04em; white-space: nowrap; }
|
||||
.dtag__icon { width: 1.15em; height: 1.15em; filter: drop-shadow(0 0 4px var(--d-color)); filter: drop-shadow(0 0 4px color-mix(in srgb, var(--d-color) 65%, transparent)); }
|
||||
.dicon { object-fit: contain; image-rendering: auto; }
|
||||
.dtag__code { font-family: var(--font-num); font-size: .72em; font-weight: 500; color: var(--text-dim); letter-spacing: .1em; margin-left: .03rem; }
|
||||
.dtag--sm { font-size: .15rem; }
|
||||
.dtag--lg { font-size: .24rem; }
|
||||
|
||||
/* ---- text field ------------------------------------------------------------------------------------ */
|
||||
.field { display: flex; flex-direction: column; gap: .07rem; min-width: 0; }
|
||||
.field__label { display: flex; align-items: baseline; gap: .1rem; font-size: .15rem; color: var(--text-lo); font-weight: 500; letter-spacing: .04em; }
|
||||
.field__box {
|
||||
--bk-c: var(--line-3);
|
||||
--bk-l: .1rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: .1rem;
|
||||
height: .56rem;
|
||||
padding: 0 .16rem;
|
||||
background: rgba(5, 7, 6, .78);
|
||||
border: 1px solid var(--line);
|
||||
transition: border-color var(--t-fast), box-shadow var(--t-med);
|
||||
}
|
||||
.field__box:hover { border-color: var(--line-2); }
|
||||
.field__box:focus-within { border-color: var(--mint-700); --bk-c: var(--mint-400); box-shadow: 0 0 0 1px rgba(78, 216, 175, .15), 0 0 .18rem rgba(23, 249, 183, .15); }
|
||||
.field__input {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
height: 100%;
|
||||
background: none;
|
||||
border: 0;
|
||||
outline: none;
|
||||
color: var(--text-hi);
|
||||
font-size: .2rem;
|
||||
letter-spacing: .04em;
|
||||
}
|
||||
.field__input::placeholder { color: var(--text-dim); font-weight: 400; letter-spacing: .04em; }
|
||||
.field__icon { width: .22rem; height: .22rem; color: var(--text-dim); }
|
||||
.field__box:focus-within .field__icon { color: var(--mint-500); }
|
||||
.field__hint { font-size: .13rem; color: var(--text-dim); }
|
||||
.field--lg .field__box { height: .68rem; }
|
||||
.field--lg .field__input { font-size: .26rem; font-weight: 700; }
|
||||
.field--code .field__box { height: .64rem; }
|
||||
.field--code .field__input { font-family: var(--font-num); font-size: .34rem; font-weight: 700; letter-spacing: .42em; text-transform: uppercase; }
|
||||
.field--code .field__input::placeholder { font-family: var(--font-cjk); font-size: .18rem; letter-spacing: .06em; font-weight: 400; text-transform: none; }
|
||||
.field.is-invalid .field__box { border-color: var(--red); --bk-c: var(--red-premium); }
|
||||
.field.is-disabled { opacity: .5; }
|
||||
|
||||
/* ---- toasts -------------------------------------------------------------------------------------------- */
|
||||
.toast-host {
|
||||
position: fixed;
|
||||
top: .22rem;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
z-index: var(--z-toast);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: .08rem;
|
||||
pointer-events: none;
|
||||
width: max-content;
|
||||
max-width: 92vw;
|
||||
}
|
||||
.toast {
|
||||
--tc: var(--mint-500);
|
||||
pointer-events: auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: .1rem;
|
||||
min-width: 2.4rem;
|
||||
max-width: 7.2rem;
|
||||
padding: .11rem .2rem .11rem .14rem;
|
||||
background: rgba(9, 12, 11, .96);
|
||||
border: 1px solid var(--line-2);
|
||||
border-left: 3px solid var(--tc);
|
||||
box-shadow: 0 .08rem .24rem rgba(0, 0, 0, .55), -.04rem 0 .16rem transparent; box-shadow: 0 .08rem .24rem rgba(0, 0, 0, .55), -.04rem 0 .16rem color-mix(in srgb, var(--tc) 25%, transparent);
|
||||
color: var(--text-hi);
|
||||
font-size: .17rem;
|
||||
line-height: 1.45;
|
||||
cursor: pointer;
|
||||
animation: toast-in var(--t-med) var(--ease-out);
|
||||
}
|
||||
.toast__icon { width: .2rem; height: .2rem; fill: var(--tc); flex: none; }
|
||||
.toast__text { flex: 1; }
|
||||
.toast__count { font-family: var(--font-num); font-size: .14rem; color: var(--text-lo); }
|
||||
.toast--success { --tc: var(--mint-400); }
|
||||
.toast--warn { --tc: var(--amber); }
|
||||
.toast--error { --tc: var(--red-premium); }
|
||||
.toast.is-leaving { animation: toast-out var(--t-med) var(--ease-in-out) forwards; }
|
||||
@keyframes toast-in { from { opacity: 0; transform: translateY(-.12rem); } }
|
||||
@keyframes toast-out { to { opacity: 0; transform: translateY(-.08rem); } }
|
||||
|
||||
/* ---- connection banner (main.js) --------------------------------------------------------------------- */
|
||||
.conn-banner {
|
||||
position: fixed;
|
||||
left: 50%;
|
||||
bottom: .24rem;
|
||||
transform: translateX(-50%);
|
||||
z-index: var(--z-conn);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: .14rem;
|
||||
padding: .1rem .12rem .1rem .2rem;
|
||||
background: rgba(24, 12, 8, .94);
|
||||
border: 1px solid rgba(232, 90, 26, .55);
|
||||
box-shadow: 0 .08rem .3rem rgba(0, 0, 0, .6), 0 0 .2rem rgba(232, 90, 26, .15);
|
||||
color: var(--text-hi);
|
||||
font-size: .16rem;
|
||||
/* own keyframes: toast-in's transform would drop the translateX(-50%) centring mid-animation */
|
||||
animation: conn-in var(--t-med) var(--ease-out);
|
||||
}
|
||||
/* transitional states (connecting / re-handshaking) only appear if they last longer than .6 s */
|
||||
.conn-banner--soft { animation: conn-in-soft var(--t-med) var(--ease-out) .6s backwards; }
|
||||
@keyframes conn-in { from { opacity: 0; transform: translate(-50%, .12rem); } }
|
||||
@keyframes conn-in-soft { from { opacity: 0; visibility: hidden; transform: translate(-50%, .12rem); } }
|
||||
/* In a match the top-centre capsule (round / phase / kills), the ticker strip under it and the bottom centre
|
||||
(combat view switcher, shop bar) are taken: toasts and the connection banner sit below the ticker instead
|
||||
(toasts below the banner while it shows). */
|
||||
/* (classes set by js: html.sp-in-match — the match screen is mounted; html.sp-conn — the banner shows. No :has(): Firefox
|
||||
ESR 115 / Safari < 15.4 lack it) */
|
||||
.sp-in-match .toast-host { top: calc(1.34rem + var(--sa-t, 0px)); }
|
||||
.sp-in-match .conn-banner { top: calc(1.34rem + var(--sa-t, 0px)); bottom: auto; }
|
||||
.sp-in-match.sp-conn .toast-host { top: calc(2.0rem + var(--sa-t, 0px)); }
|
||||
.conn-banner .icon { width: .22rem; height: .22rem; color: var(--orange-hi); }
|
||||
.conn-banner__sub { color: var(--text-lo); font-family: var(--font-num); font-size: .15rem; }
|
||||
|
||||
/* ---- misc shared bits ------------------------------------------------------------------------------ */
|
||||
.kv { display: flex; align-items: baseline; gap: .08rem; }
|
||||
.kv__k { color: var(--text-lo); font-size: .14rem; }
|
||||
.kv__v { font-family: var(--font-num); font-weight: 700; }
|
||||
.divider { height: 1px; background: linear-gradient(90deg, transparent, var(--line-2) 15%, var(--line-2) 85%, transparent); }
|
||||
.status-dot { width: .09rem; height: .09rem; border-radius: 50%; background: var(--text-dim); flex: none; display: inline-block; }
|
||||
.status-dot.is-on { background: var(--mint-400); box-shadow: 0 0 6px var(--mint-glow); }
|
||||
.status-dot.is-warn { background: var(--amber); box-shadow: 0 0 6px var(--amber); animation: blink 1s steps(2) infinite; }
|
||||
.status-dot.is-bad { background: var(--red-premium); box-shadow: 0 0 6px var(--red-premium); }
|
||||
@keyframes blink { 50% { opacity: .35; } }
|
||||
|
||||
/* ---- shared screen chrome: top bar, section labels, player chip, crash screen ------------------------ */
|
||||
.topbar {
|
||||
position: relative;
|
||||
z-index: 3;
|
||||
flex: none;
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
|
||||
align-items: center;
|
||||
gap: .24rem;
|
||||
height: 1.1rem;
|
||||
padding: 0 .44rem;
|
||||
background: linear-gradient(180deg, rgba(8, 10, 9, .92), rgba(10, 13, 12, .55));
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
.topbar::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: .44rem;
|
||||
right: .44rem;
|
||||
bottom: -1px;
|
||||
height: 1px;
|
||||
background: linear-gradient(90deg, var(--mint-700), transparent 26%, transparent 74%, var(--mint-700));
|
||||
}
|
||||
.topbar__left { justify-self: start; display: flex; align-items: center; gap: .18rem; min-width: 0; }
|
||||
.topbar__center { display: flex; flex-direction: column; align-items: center; gap: .03rem; text-align: center; }
|
||||
.topbar__title { display: flex; align-items: center; gap: .18rem; font-size: .3rem; font-weight: 700; letter-spacing: .1em; line-height: 1.2; }
|
||||
.topbar__sep { width: 1px; height: .28rem; background: var(--line-2); }
|
||||
.topbar__right { justify-self: end; display: flex; align-items: center; gap: .16rem; min-width: 0; }
|
||||
|
||||
.section-label { display: flex; align-items: baseline; gap: .12rem; margin: 0 0 .14rem; font-size: .2rem; font-weight: 700; letter-spacing: .08em; }
|
||||
.section-label__idx { font-size: .15rem; color: var(--mint-500); padding: 0 .06rem; border: 1px solid var(--mint-800); line-height: 1.35; letter-spacing: .06em; }
|
||||
|
||||
.me-chip { display: flex; align-items: center; gap: .12rem; padding: .06rem .18rem .06rem .06rem; border: 1px solid var(--line); background: rgba(0, 0, 0, .35); }
|
||||
.me-chip__text { display: flex; flex-direction: column; line-height: 1.3; min-width: 0; }
|
||||
.me-chip__name { font-weight: 700; font-size: .18rem; max-width: 2.4rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
|
||||
.crash { align-items: center; justify-content: center; }
|
||||
.crash__box {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: .14rem;
|
||||
width: 6rem;
|
||||
padding: .36rem .4rem;
|
||||
background: rgba(16, 20, 18, .95);
|
||||
border: 1px solid var(--line-2);
|
||||
--bk-c: var(--red-premium);
|
||||
}
|
||||
.crash__box h2 { font-size: .3rem; }
|
||||
@@ -0,0 +1,137 @@
|
||||
/* ==========================================================================================
|
||||
devices.css — multi-device layer (loaded last). Desktop Chrome / Edge / Firefox / Safari, iPad and Android tablets
|
||||
in landscape, phones in landscape (≥ 640×360 CSS px). js/ui/device.js puts the feature classes on <html>
|
||||
(sp-touch, sp-coarse, sp-hover / sp-no-hover, sp-fs, sp-standalone, sp-reduced-motion) — never UA sniffing.
|
||||
|
||||
1. no page zoom / scroll / pull-to-refresh while playing (touch-action, overscroll-behavior, callouts)
|
||||
2. safe-area insets (notches, rounded corners, home indicator): the HUD and every screen stay inside them while the
|
||||
board and the backdrops stay full-bleed
|
||||
3. touch: every small control gets an invisible ≥ 44 px hit area (::before, no layout change); on short touch
|
||||
screens (phones) the most used controls also grow visually
|
||||
4. reduced motion extras; fullscreen button
|
||||
========================================================================================== */
|
||||
|
||||
:root {
|
||||
--sa-t: env(safe-area-inset-top, 0px);
|
||||
--sa-r: env(safe-area-inset-right, 0px);
|
||||
--sa-b: env(safe-area-inset-bottom, 0px);
|
||||
--sa-l: env(safe-area-inset-left, 0px);
|
||||
--tap-min: 44px;
|
||||
}
|
||||
|
||||
/* ---- 1. gestures ------------------------------------------------------------------------------------------------- */
|
||||
html, body { overscroll-behavior: none; }
|
||||
/* pan only: no pinch-zoom / double-tap zoom anywhere (scrollable lists still scroll); the field canvas uses none */
|
||||
html { touch-action: pan-x pan-y; }
|
||||
body { -webkit-touch-callout: none; }
|
||||
button, a, label, summary, [role="button"], [role="tab"], [role="option"], .scard, .lvcard, .dband, .bond, .pavatar { touch-action: manipulation; }
|
||||
img { -webkit-user-drag: none; }
|
||||
.gm__field, .gm__field canvas, .ff, .fwheel, .fwheel__dia { touch-action: none; }
|
||||
/* the DOM fallback board drags with pointer events too */
|
||||
.ff-piece, .ff-slot, .ff-tile { touch-action: none; -webkit-user-select: none; user-select: none; }
|
||||
input, textarea, select { -webkit-user-select: text; user-select: text; }
|
||||
|
||||
/* ---- 2. safe areas ------------------------------------------------------------------------------------------------ */
|
||||
/* the in-match HUD layer sits inside the safe area; the field (canvas) below it stays full-bleed */
|
||||
.gm__hud { top: var(--sa-t); right: var(--sa-r); bottom: var(--sa-b); left: var(--sa-l); }
|
||||
/* the selected unit's underframe (ui/underframe.js) is placed at the tile's CLIENT px (view.tileScreen) inside the HUD
|
||||
layer: step back over the HUD's safe-area offset so it stays on its unit on a notched phone */
|
||||
.gm__hud > .uframe { margin-left: calc(-1 * var(--sa-l)); margin-top: calc(-1 * var(--sa-t)); }
|
||||
.gm > .spov { left: calc(2.8rem + var(--sa-l)); right: var(--sa-r); }
|
||||
/* every other screen is laid out inside the safe area (the app backdrop fills the notch strip) */
|
||||
.screen:not(.gm) { top: var(--sa-t); right: var(--sa-r); bottom: var(--sa-b); left: var(--sa-l); }
|
||||
.guide, .awayov { padding: var(--sa-t) var(--sa-r) var(--sa-b) var(--sa-l); }
|
||||
/* (in a match the toasts sit under the top bar: components.css .sp-in-match .toast-host already adds --sa-t) */
|
||||
html:not(.sp-in-match) .toast-host { margin-top: var(--sa-t); }
|
||||
.conn-banner { margin-bottom: var(--sa-b); }
|
||||
.rotate-hint { padding: calc(24px + var(--sa-t)) calc(24px + var(--sa-r)) calc(24px + var(--sa-b)) calc(24px + var(--sa-l)); }
|
||||
|
||||
/* ---- 3. touch targets ---------------------------------------------------------------------------------------------- */
|
||||
/* An invisible hit area of at least --tap-min around small controls on touch screens: centred, never smaller than the
|
||||
control, no layout change. Only controls that do not use ::before themselves are listed. */
|
||||
:where(.sp-coarse) :where(.tapx, .gtop__exit, .gtop__iconbtn, .enemybtn, .readybtn, .gm__gear, .fsbtn, .ewheel__btn, .ewheel__nav,
|
||||
.toolbtn, .funds__collapse, .team__btn, .effect, .bslot .bond, .vswitch__arrow, .edrawer__close, .dpanel__close, .bpop__close,
|
||||
.modal__close, .uf__btn, .chud__back, .tabs__tab, .btn, .pill-btn, .scard__detail, .title-guide, .stephead__guide, .set-toggle, .set-seg button) {
|
||||
position: relative;
|
||||
}
|
||||
.sp-coarse :is(.tapx, .gtop__exit, .gtop__iconbtn, .enemybtn, .readybtn, .gm__gear, .fsbtn, .ewheel__btn, .ewheel__nav,
|
||||
.toolbtn, .funds__collapse, .team__btn, .effect, .bslot .bond, .vswitch__arrow, .edrawer__close, .dpanel__close, .bpop__close,
|
||||
.modal__close, .uf__btn, .chud__back, .tabs__tab, .btn, .pill-btn, .scard__detail, .title-guide, .stephead__guide, .set-toggle, .set-seg button)::before {
|
||||
content: '';
|
||||
position: absolute; left: 50%; top: 50%; z-index: 0;
|
||||
width: max(100%, var(--tap-min)); height: max(100%, var(--tap-min));
|
||||
transform: translate(-50%, -50%);
|
||||
background: transparent; border: 0; box-shadow: none; clip-path: none; pointer-events: auto;
|
||||
}
|
||||
/* The 交流 panel's pager (‹ dots ›) sits in the strip under the emote cells (panel y 1.97–2.31rem, css/emotes.css). Its
|
||||
hit areas stay inside that strip and never overlap each other: a centred 44 px area of ‹ / › covered the centres of
|
||||
the bottom-left / bottom-right emotes (a tap there turned the page or hit the disabled ‹), and 28 px dot areas 0.21rem
|
||||
apart covered the neighbouring dot (a tap on dot N opened page N+1). ‹ / › grow outwards (away from the dots), the
|
||||
dots only up to half the gap. Selectors ≥ the specificity of the generic hit-area rule above. */
|
||||
.sp-coarse .ewheel__panel .ewheel__nav::before { top: .03rem; bottom: -.15rem; height: auto; transform: none; }
|
||||
.sp-coarse .ewheel__panel .ewheel__nav.is-prev::before { left: auto; right: 0; }
|
||||
.sp-coarse .ewheel__panel .ewheel__nav.is-next::before { left: 0; right: auto; }
|
||||
.sp-coarse .ewheel__dot::before { inset: -.02rem -.05rem -.2rem; width: auto; height: auto; transform: none; }
|
||||
|
||||
/* Phones in landscape (short touch screens: 1rem ≈ 40 px here): the most used controls grow a little so they are
|
||||
comfortable to hit and to read, without changing the official layout. */
|
||||
@media (max-height: 600px) and (pointer: coarse), (max-height: 600px) and (any-pointer: coarse) {
|
||||
.readybtn { height: max(.56rem, 34px); }
|
||||
.toolbtn { min-height: max(.5rem, 30px); }
|
||||
.gm__gear { width: max(.56rem, 34px); height: max(.56rem, 34px); }
|
||||
.gtop__exit { min-width: max(.56rem, 34px); min-height: max(.56rem, 34px); }
|
||||
.gtop__iconbtn.has-sprite, .enemybtn.has-sprite { height: max(.46rem, 26px); width: calc(max(.46rem, 26px) * 35 / 29); }
|
||||
.gtop__iconbtn.has-sprite.is-wide, .enemybtn.has-sprite.is-wide { width: calc(max(.46rem, 26px) * 61 / 29); }
|
||||
.gtop__iconbtn:not(.has-sprite), .enemybtn:not(.has-sprite) { height: max(.46rem, 26px); min-width: max(.46rem, 26px); }
|
||||
.ewheel__panel { scale: 1.3; transform-origin: 0 100%; }
|
||||
.fwheel__cancel { min-height: 30px; }
|
||||
.set-toggle, .set-seg button { height: max(.38rem, 30px); }
|
||||
/* a taller range input whose visible track stays thin: transparent borders are part of the hit area */
|
||||
.set-range { height: 30px; border: 11px solid transparent; border-left-width: 0; border-right-width: 0; background-clip: padding-box; box-shadow: inset 0 0 0 1px var(--line-2); }
|
||||
.field--lg .field__box { height: max(.68rem, 40px); }
|
||||
}
|
||||
|
||||
/* ---- 4. misc ------------------------------------------------------------------------------------------------------ */
|
||||
.fsbtn { display: grid; place-items: center; padding: 0; background: rgba(8, 11, 10, .85); border: 1px solid var(--line-2); color: var(--text-lo); transition: color var(--t-fast), border-color var(--t-fast); }
|
||||
.fsbtn .icon { width: .26rem; height: .26rem; }
|
||||
.fsbtn:hover, .fsbtn[aria-pressed="true"] { color: var(--mint-400); border-color: var(--mint-700); }
|
||||
.title-fs { width: .4rem; height: .4rem; margin-left: .06rem; }
|
||||
/* standalone / fullscreen: the browser bars are gone, nothing to reserve */
|
||||
.sp-standalone .rotate-hint__micro::after { content: ' · PWA'; }
|
||||
|
||||
/* reduced motion: camera-free UI pieces that animate continuously stop (the global rule in theme.css shortens the rest) */
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.team__status.is-gold, .ff-tile--gate, .title-bg__sweep, .boot__hex { animation: none !important; }
|
||||
}
|
||||
.sp-reduced-motion .team__status.is-gold, .sp-reduced-motion .ff-tile--gate { animation: none; }
|
||||
|
||||
/* the shop card's ⓘ corner: a smaller hit area (the card itself is the main target; its first tap shows the detail) */
|
||||
.sp-coarse .scard__detail::before { width: 30px; height: 30px; }
|
||||
|
||||
/* Narrow viewports (< 768 CSS px: the root scale is clamped at 40 px, so the layout is narrower than the 19.2 rem
|
||||
design): the shop bar would cover the corner's ⚙ / 📖 / ⛶ buttons — they wrap into a row above the 交流 button. */
|
||||
/* The left-docked detail card then ends above that two-row corner (.24rem + 交流 + .1rem gap + ⚙ row + .1rem): at its
|
||||
desktop bottom (1.02rem) it hid ⚙ / 📖 / ⛶. (gameLogic panelSlots keeps the taller desktop slot: conservative.) */
|
||||
@media (max-width: 767px) {
|
||||
.gm__corner { flex-wrap: wrap-reverse; align-content: flex-start; width: max(72px, calc(3 * .56rem + .2rem)); }
|
||||
.dpanel:not(.dpanel--right) { bottom: calc(.44rem + max(1.51rem, 72px) * 55 / 151 + .56rem); }
|
||||
}
|
||||
@media (max-width: 767px) and (pointer: coarse), (max-width: 767px) and (any-pointer: coarse) {
|
||||
.gm__corner { width: max(96px, calc(3 * max(.56rem, 34px) + .2rem)); }
|
||||
.dpanel:not(.dpanel--right) { bottom: calc(.44rem + max(1.51rem, 96px) * 55 / 151 + max(.56rem, 34px)); }
|
||||
}
|
||||
|
||||
/* Short landscape phones (≤ 460 CSS px tall, 1rem = 40 px): the lobby's two columns are compressed so the
|
||||
创建同盟 button and the join panel stay on screen without scrolling. */
|
||||
@media (max-height: 460px) {
|
||||
.lobby-body { padding-top: .2rem; padding-bottom: .2rem; gap: .36rem; }
|
||||
.mode-cards { margin-bottom: .2rem; }
|
||||
.mode-card { min-height: 0; gap: .12rem; padding: .22rem .26rem .2rem; }
|
||||
.mode-card__icon { width: .66rem; height: .66rem; }
|
||||
.mode-card__name { font-size: .4rem; }
|
||||
.mode-card__points, .diff-card__effects, .tips, .create-box__hint { display: none; }
|
||||
.diff-list { gap: .1rem; }
|
||||
.diff-card { padding-top: .12rem; padding-bottom: .12rem; }
|
||||
.create-box { margin-top: .18rem; }
|
||||
.create-box .btn--xl { height: .8rem; }
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
/* Emotes (交流) — public/js/ui/emotes.js. Research 09 §4: picture-only bubbles, a 3×2 pager per theme, 1 s cooldown.
|
||||
Sizes follow the official sprites at 1 px = .01rem (1920-wide reference): emoji_btn 151×55, emoji_bkg 313×231,
|
||||
emoji_cell_bkg 85×85, emoji_bubble_bkg 108×97. With the local ui/battle extraction the official sprites are used
|
||||
(inline --ewheel-* / --ebubble-bg); without it CSS draws look-alikes. Loaded after the screen sheets, so these rules
|
||||
also override the v1 emote rules that may still sit in screens/game.css. */
|
||||
|
||||
/* ---- picture / fallback glyph ------------------------------------------------------------------------------- */
|
||||
.eart { display: block; width: 100%; height: 100%; object-fit: contain; pointer-events: none; user-select: none; -webkit-user-drag: none; }
|
||||
.eart--glyph {
|
||||
display: grid; place-items: center; border-radius: 22%;
|
||||
background: radial-gradient(circle at 50% 42%, rgba(78, 216, 175, .10), rgba(78, 216, 175, 0) 70%);
|
||||
color: rgba(195, 203, 199, .55);
|
||||
}
|
||||
.eart--glyph .icon { width: 58%; height: 58%; }
|
||||
.eart--pending { visibility: hidden; }
|
||||
|
||||
/* ---- 交流 button -------------------------------------------------------------------------------------------- */
|
||||
.ewheel { position: relative; }
|
||||
.ewheel__btn {
|
||||
position: relative; display: flex; align-items: center; justify-content: flex-start; gap: .08rem;
|
||||
height: .56rem; min-width: 1.51rem; padding: 0 .2rem 0 .14rem;
|
||||
background: rgba(8, 11, 10, .85); border: 1px solid var(--line-2); border-radius: .04rem;
|
||||
color: var(--text-md); font-size: .18rem; font-weight: 700; letter-spacing: .1em; line-height: 1;
|
||||
transition: color var(--t-fast), border-color var(--t-fast), filter var(--t-fast), opacity var(--t-fast);
|
||||
}
|
||||
.ewheel__btn .icon { width: .3rem; height: .3rem; color: var(--mint-500); }
|
||||
.ewheel__btn:hover:not(:disabled), .ewheel__btn.is-on { color: var(--mint-400); border-color: var(--mint-700); }
|
||||
.ewheel__btn:disabled { opacity: .5; cursor: not-allowed; }
|
||||
/* emoji_btn 151×55: plate x 3–147, y 0–45 (a shadow below); the robot face + '<' chevron span x 22–79. The label gets
|
||||
its own box right of the chevron (x ≥ 57 %), so a font clamped up by a browser minimum font size (CJK Chrome: 12 px)
|
||||
or a small root can never run into the icon; the button never shrinks below 72 px (96 px on touch screens). */
|
||||
.ewheel__btn.has-sprite {
|
||||
--ewb-w: max(1.51rem, 72px);
|
||||
width: var(--ewb-w); height: calc(var(--ewb-w) * 55 / 151); min-width: 0; padding: 0; display: block;
|
||||
background: var(--ewheel-btn) left bottom / 100% 100% no-repeat; border: 0; border-radius: 0; color: #f2f2f2;
|
||||
}
|
||||
.ewheel__btn.has-sprite .ewheel__label {
|
||||
position: absolute; left: 57%; right: 3%; top: 0; height: 82%;
|
||||
display: flex; align-items: center; justify-content: center; overflow: hidden;
|
||||
font-size: calc(var(--ewb-w) * 18 / 151); letter-spacing: .06em; line-height: 1;
|
||||
}
|
||||
.ewheel__btn.has-sprite:hover:not(:disabled), .ewheel__btn.has-sprite.is-on { color: #fff; filter: brightness(1.18); border: 0; }
|
||||
.ewheel__btn.has-sprite:disabled { opacity: 1; color: rgba(242, 242, 242, .45); }
|
||||
.ewheel__btn.is-cooling { cursor: wait; }
|
||||
.ewheel__label { white-space: nowrap; }
|
||||
|
||||
/* ---- panel: one page per theme ----------------------------------------------------------------------------- */
|
||||
/* emoji_bkg is 313×231 with a soft shadow margin; its opaque plate spans x 15–297, y 13–212. The cells, the pager
|
||||
and the CSS fallback plate all use that geometry. */
|
||||
.ewheel__panel {
|
||||
position: absolute; left: -.15rem; bottom: calc(100% + .02rem); z-index: 5;
|
||||
width: 3.13rem; height: 2.31rem; padding: 0; box-sizing: border-box;
|
||||
background: none; border: 0; border-radius: 0; box-shadow: none;
|
||||
transform-origin: .45rem 100%;
|
||||
animation: emo-panel-in 160ms var(--ease-out);
|
||||
touch-action: pan-y; user-select: none; -webkit-user-select: none;
|
||||
}
|
||||
.ewheel__panel::before { /* CSS look-alike of the emoji_bkg plate */
|
||||
content: ''; position: absolute; left: .15rem; top: .13rem; width: 2.82rem; height: 1.99rem; border-radius: .06rem;
|
||||
background: rgba(19, 19, 19, .92); box-shadow: 0 .04rem .16rem rgba(0, 0, 0, .5), inset 0 0 0 1px rgba(255, 255, 255, .07);
|
||||
}
|
||||
.ewheel__panel.has-sprite { background: var(--ewheel-bg) center / 100% 100% no-repeat; }
|
||||
.ewheel__panel.has-sprite::before { content: none; }
|
||||
.ewheel__viewport { position: absolute; left: .205rem; top: .19rem; width: 2.71rem; height: 1.78rem; overflow: hidden; touch-action: pan-y; cursor: grab; }
|
||||
.ewheel__viewport:active { cursor: grabbing; }
|
||||
.ewheel__page {
|
||||
display: grid; grid-template-columns: repeat(3, .85rem); grid-auto-rows: .85rem; gap: .08rem;
|
||||
justify-content: space-between; align-content: start; height: 100%;
|
||||
animation: emo-page-in 180ms var(--ease-out);
|
||||
will-change: transform;
|
||||
}
|
||||
.ewheel__page.is-from-right { animation-name: emo-page-from-right; }
|
||||
.ewheel__page.is-from-left { animation-name: emo-page-from-left; }
|
||||
.ewheel__page.is-dragging { animation: none; transition: none; opacity: .92; }
|
||||
|
||||
.ewheel__item {
|
||||
position: relative; display: grid; place-items: center; width: .85rem; height: .85rem; padding: .07rem; margin: 0; box-sizing: border-box;
|
||||
background: rgba(255, 255, 255, .16); border: 0; border-radius: .08rem; color: inherit; font-size: 0; flex-direction: initial; gap: 0;
|
||||
transition: background-color var(--t-fast), filter var(--t-fast), transform 90ms var(--ease-out);
|
||||
}
|
||||
.ewheel__panel.has-cell .ewheel__item { background: var(--ewheel-cell) center / 100% 100% no-repeat; border-radius: 0; }
|
||||
.ewheel__item:hover:not(:disabled) { background-color: rgba(255, 255, 255, .26); filter: brightness(1.12); transform: none; border-color: transparent; }
|
||||
/* the official cell is a rounded plate with transparent corners: brighten it, never fill its square box */
|
||||
.ewheel__panel.has-cell .ewheel__item:hover:not(:disabled) { background-color: transparent; filter: brightness(1.35); }
|
||||
.ewheel__item:active:not(:disabled) { transform: scale(.9); }
|
||||
.ewheel__item:focus-visible { outline: 2px solid var(--mint-500); outline-offset: 1px; }
|
||||
.ewheel__item:disabled { opacity: .45; cursor: wait; }
|
||||
|
||||
/* pager: ‹ dots › in the strip under the cells */
|
||||
.ewheel__dots { position: absolute; left: .15rem; width: 2.82rem; top: 1.99rem; height: .12rem; display: flex; align-items: center; justify-content: center; gap: .1rem; }
|
||||
.ewheel__dot {
|
||||
position: relative; width: .11rem; height: .12rem; padding: 0; border: 0; border-radius: .015rem; background: rgba(255, 255, 255, .28);
|
||||
transition: background-color var(--t-fast), transform var(--t-fast);
|
||||
}
|
||||
.ewheel__dot:hover { background: rgba(255, 255, 255, .55); }
|
||||
.ewheel__dot.is-on { background: #fff; transform: scale(1.12); }
|
||||
.ewheel__dot::before { content: ''; position: absolute; inset: -.05rem -.05rem; } /* bigger hit area */
|
||||
.ewheel__nav {
|
||||
position: absolute; top: 1.94rem; width: .26rem; height: .22rem; display: grid; place-items: center; padding: 0; z-index: 1;
|
||||
background: none; border: 0; color: rgba(255, 255, 255, .6); transition: color var(--t-fast), opacity var(--t-fast);
|
||||
}
|
||||
.ewheel__nav .icon { width: .18rem; height: .18rem; }
|
||||
.ewheel__nav.is-prev { left: .7rem; }
|
||||
.ewheel__nav.is-next { right: .7rem; }
|
||||
.ewheel__nav:hover:not(:disabled) { color: #fff; }
|
||||
.ewheel__nav:disabled { opacity: .18; cursor: default; }
|
||||
|
||||
/* ---- bubble beside the sender's avatar (picture only) ------------------------------------------------------ */
|
||||
/* emoji_bubble_bkg is 108×97: plate x 22–97, y 8–85, tail tip at x 9, y ≈ 46 (pointing left, toward the avatar). */
|
||||
.ebubble {
|
||||
--ebubble-ttl: 3000ms;
|
||||
--ebubble-age: 0ms; /* set inline for a bubble mounted after its emote arrived: resume the timeline, never restart it */
|
||||
position: relative; display: block; box-sizing: border-box; width: 1.08rem; height: .97rem; max-width: none; padding: 0;
|
||||
background: none; border: 0; clip-path: none; color: inherit; font-size: 0; white-space: normal; filter: none;
|
||||
transform-origin: .09rem 47%;
|
||||
animation: emo-bubble-pop 240ms var(--ease-out) calc(0ms - var(--ebubble-age)) both,
|
||||
emo-bubble-out 300ms var(--ease-in-out) calc(var(--ebubble-ttl) - 300ms - var(--ebubble-age)) forwards;
|
||||
pointer-events: none; z-index: 3;
|
||||
}
|
||||
/* CSS look-alike of emoji_bubble_bkg: dark rounded square + tail */
|
||||
.ebubble::before {
|
||||
content: ''; position: absolute; left: .22rem; top: .08rem; width: .76rem; height: .78rem; border-radius: .08rem;
|
||||
background: rgba(24, 24, 24, .86); box-shadow: 0 .02rem .08rem rgba(0, 0, 0, .45);
|
||||
}
|
||||
.ebubble::after {
|
||||
content: ''; position: absolute; left: .09rem; top: calc(47% - .08rem); width: .14rem; height: .16rem;
|
||||
background: rgba(24, 24, 24, .86); clip-path: polygon(100% 0, 0 50%, 100% 100%);
|
||||
}
|
||||
.ebubble.has-sprite { background: var(--ebubble-bg) center / 100% 100% no-repeat; }
|
||||
.ebubble.has-sprite::before, .ebubble.has-sprite::after { content: none; }
|
||||
/* in the team panel the bubble is anchored beside the row (placement: screens/game.css .team__bubble) */
|
||||
.ebubble.team__bubble { position: absolute; }
|
||||
.ebubble__icon { position: absolute; left: .26rem; top: .12rem; width: .68rem; height: .70rem; display: grid; place-items: center; }
|
||||
.ebubble .eart { width: 100%; height: 100%; }
|
||||
|
||||
@keyframes emo-panel-in { from { opacity: 0; transform: translateY(.06rem) scale(.96); } }
|
||||
@keyframes emo-page-in { from { opacity: 0; } }
|
||||
@keyframes emo-page-from-right { from { opacity: .2; transform: translateX(45%); } }
|
||||
@keyframes emo-page-from-left { from { opacity: .2; transform: translateX(-45%); } }
|
||||
@keyframes emo-bubble-pop { 0% { opacity: 0; scale: .35; } 60% { opacity: 1; scale: 1.1; } 100% { opacity: 1; scale: 1; } }
|
||||
@keyframes emo-bubble-out { to { opacity: 0; scale: .92; } }
|
||||
|
||||
@media (pointer: coarse) {
|
||||
.ewheel__btn.has-sprite { --ewb-w: max(1.51rem, 96px); }
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.ewheel__panel, .ewheel__page, .ewheel__page.is-from-right, .ewheel__page.is-from-left { animation: none; }
|
||||
.ebubble { animation: emo-bubble-out 1ms linear calc(var(--ebubble-ttl) - 1ms - var(--ebubble-age)) forwards; }
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
/* ==========================================================================================
|
||||
screens/briefing.css — INFO_CHECK briefing (js/screens/briefing.js) + the pre-game step header
|
||||
shared with the band draft (js/ui/matchChrome.js StepHeader). Research 06 §4.1 / §11.6.
|
||||
========================================================================================== */
|
||||
|
||||
/* ---- shared pre-game backdrop + header ---- */
|
||||
.brief__bg {
|
||||
position: absolute; inset: 0; z-index: 0; pointer-events: none;
|
||||
background:
|
||||
repeating-linear-gradient(0deg, rgba(255, 255, 255, .018) 0 1px, transparent 1px 4px),
|
||||
radial-gradient(90% 70% at 20% 30%, rgba(232, 90, 26, .07), transparent 60%),
|
||||
radial-gradient(80% 70% at 85% 60%, rgba(78, 216, 175, .07), transparent 60%);
|
||||
}
|
||||
.stephead {
|
||||
position: relative; z-index: 2; flex: none;
|
||||
display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: .24rem;
|
||||
height: 1.16rem; padding: 0 .36rem 0 .26rem;
|
||||
background: linear-gradient(180deg, rgba(8, 10, 9, .94), rgba(10, 13, 12, .6)); border-bottom: 1px solid var(--line);
|
||||
}
|
||||
.stephead::after { content: ''; position: absolute; left: .3rem; right: .3rem; bottom: -1px; height: 1px; background: linear-gradient(90deg, var(--mint-700), transparent 26%, transparent 74%, var(--mint-700)); }
|
||||
.stephead__left { display: flex; align-items: center; gap: .16rem; }
|
||||
.stephead__meta { display: flex; flex-direction: column; gap: .06rem; align-items: flex-start; }
|
||||
.stephead__center { display: flex; flex-direction: column; align-items: center; gap: .04rem; }
|
||||
.stephead__title { display: flex; align-items: baseline; gap: .02rem; font-size: .34rem; font-weight: 900; letter-spacing: .12em; }
|
||||
.stephead__title b { font-size: .56rem; line-height: 1; color: var(--mint-400); text-shadow: 0 0 .2rem rgba(23, 249, 183, .4); }
|
||||
.stephead__of { font-size: .26rem; color: var(--text-dim); margin-right: .18rem; }
|
||||
.stephead__right { justify-self: end; display: flex; align-items: center; gap: .24rem; }
|
||||
.stephead__right .countdown { --cd-h: .64rem; }
|
||||
|
||||
.brief-h { display: flex; align-items: baseline; gap: .12rem; font-size: .21rem; font-weight: 700; letter-spacing: .1em; margin-bottom: .12rem; }
|
||||
.brief-h::before { content: ''; width: .06rem; height: .2rem; background: var(--mint-500); align-self: center; }
|
||||
|
||||
/* ---- briefing layout ---- */
|
||||
.brief__main { position: relative; z-index: 1; flex: 1; min-height: 0; display: grid; grid-template-columns: 6.2rem 1fr; gap: .36rem; padding: .3rem .5rem .1rem; }
|
||||
.brief__left { display: flex; flex-direction: column; gap: .2rem; min-height: 0; }
|
||||
.brief__right { display: flex; flex-direction: column; gap: .2rem; min-height: 0; overflow: auto; padding-right: .06rem; }
|
||||
|
||||
.brief-boss {
|
||||
--bk-c: var(--orange-hi);
|
||||
position: relative; display: grid; grid-template-columns: 2rem 1fr; gap: .2rem; padding: .22rem .24rem;
|
||||
background: linear-gradient(135deg, rgba(60, 18, 8, .55), rgba(12, 14, 13, .85) 60%); border: 1px solid rgba(255, 110, 40, .3);
|
||||
}
|
||||
.brief-boss > .micro { position: absolute; left: .24rem; top: .1rem; }
|
||||
.brief-boss__art { position: relative; width: 2rem; height: 2rem; display: grid; place-items: center; margin-top: .12rem; }
|
||||
.brief-boss__ring { position: absolute; inset: 0; border-radius: 50%; border: 2px solid rgba(255, 110, 40, .5);
|
||||
background: radial-gradient(circle, rgba(255, 60, 20, .25), transparent 65%); box-shadow: 0 0 .4rem rgba(255, 80, 30, .25), inset 0 0 .3rem rgba(255, 80, 30, .3); }
|
||||
.brief-boss__ring::after { content: ''; position: absolute; inset: .14rem; border-radius: 50%; border: 1px dashed rgba(255, 110, 40, .45); animation: spin 18s linear infinite; }
|
||||
.brief-boss__sil { position: relative; width: 74%; height: 74%; object-fit: cover; border-radius: 50%;
|
||||
filter: grayscale(1) sepia(1) hue-rotate(-28deg) saturate(3.2) brightness(.62) contrast(1.35);
|
||||
box-shadow: 0 0 0 2px rgba(255, 110, 40, .7), 0 0 .3rem rgba(255, 80, 30, .5); }
|
||||
.brief-boss__art::after { content: ''; position: absolute; inset: 13%; border-radius: 50%; pointer-events: none;
|
||||
background: repeating-linear-gradient(0deg, rgba(0, 0, 0, .22) 0 2px, transparent 2px 4px), radial-gradient(circle, transparent 45%, rgba(40, 8, 2, .75) 100%); }
|
||||
.brief-boss__q { font-size: 1rem; font-weight: 900; color: rgba(255, 110, 40, .6); }
|
||||
.brief-boss__text { display: flex; flex-direction: column; gap: .08rem; padding-top: .2rem; min-width: 0; }
|
||||
.brief-boss__name { font-size: .34rem; font-weight: 900; letter-spacing: .04em; line-height: 1.25; }
|
||||
.brief-boss__when { font-size: .15rem; color: var(--orange-hi); }
|
||||
.brief-boss__abil { margin: .04rem 0 0; padding-left: .18rem; display: flex; flex-direction: column; gap: .04rem; font-size: .14rem; line-height: 1.6; color: var(--text-md); }
|
||||
|
||||
.brief-stage { display: flex; align-items: center; justify-content: space-between; gap: .2rem; padding: .12rem .18rem; background: rgba(12, 15, 14, .8); border: 1px solid var(--line); }
|
||||
.brief-stage__k { display: flex; align-items: baseline; gap: .12rem; min-width: 0; }
|
||||
.brief-stage__pool { font-size: .14rem; color: var(--text-lo); white-space: nowrap; }
|
||||
.brief-stage__name { display: flex; align-items: center; gap: .08rem; font-size: .19rem; font-weight: 700; }
|
||||
.brief-stage__name .icon { width: .2rem; height: .2rem; color: var(--mint-500); }
|
||||
|
||||
.brief-factions { display: flex; flex-direction: column; gap: .1rem; min-height: 0; }
|
||||
.brief-faction { display: flex; gap: .14rem; align-items: center; padding: .12rem .16rem; background: rgba(12, 15, 14, .8); border: 1px solid var(--line); border-left: 3px solid var(--amber); }
|
||||
.brief-faction__icon { width: .72rem; height: .72rem; flex: none; display: grid; place-items: center; background: radial-gradient(circle, rgba(246, 163, 41, .16), transparent 70%); }
|
||||
.brief-faction__icon img { width: 100%; height: 100%; object-fit: contain; }
|
||||
.brief-faction__text { display: flex; flex-direction: column; gap: .03rem; }
|
||||
.brief-faction__text b { font-size: .2rem; color: var(--amber); }
|
||||
.brief-faction__text span { font-size: .15rem; color: var(--text-lo); }
|
||||
|
||||
.brief-bonds { padding: .16rem .2rem .2rem; background: rgba(12, 15, 14, .8); border: 1px solid var(--line); }
|
||||
.brief-bonds__row { display: flex; flex-wrap: wrap; gap: .16rem .1rem; }
|
||||
.brief-bond { position: relative; width: 1rem; display: flex; justify-content: center; }
|
||||
.brief-bond .bond { --disc: .66rem; }
|
||||
.brief-bond .bond__name { font-size: .16rem; }
|
||||
.brief-bond__ban { position: absolute; top: -.04rem; right: .08rem; display: inline-flex; align-items: center; gap: .01rem; font-size: .12rem; font-weight: 700; padding: 0 .05rem; background: var(--red); color: #fff; line-height: 1.5; box-shadow: 0 0 0 1px #000; }
|
||||
.brief-bond__ban .icon { width: .12rem; height: .12rem; }
|
||||
.brief-bond.is-partial .bond__core { box-shadow: 0 0 0 2px rgba(255, 84, 84, .5); }
|
||||
.brief-legend { display: flex; align-items: center; gap: .08rem; flex-wrap: wrap; font-size: .14rem; color: var(--text-dim); margin-top: -.06rem; }
|
||||
.brief-legend__off { width: .16rem; height: .16rem; border-radius: 50%; background: #3a403d; border: 2px solid #555; }
|
||||
.brief-legend__ban { display: inline-grid; place-items: center; width: .2rem; height: .18rem; background: var(--red); color: #fff; }
|
||||
.brief-legend__ban .icon { width: .12rem; height: .12rem; }
|
||||
|
||||
.brief-banned { padding: .16rem .2rem .2rem; background: rgba(12, 15, 14, .8); border: 1px solid var(--line); }
|
||||
.brief-banned__n { margin-left: auto; font-size: .22rem; color: var(--red-premium); }
|
||||
.brief-banned__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(.6rem, 1fr)); gap: .08rem; }
|
||||
.brief-banned__grid .uthumb { --ut: .6rem; }
|
||||
|
||||
.brief__foot { position: relative; z-index: 2; flex: none; display: flex; align-items: center; justify-content: flex-end; gap: .4rem; padding: .18rem .5rem .3rem; }
|
||||
.brief-ready { display: flex; align-items: center; gap: .16rem; }
|
||||
.brief-ready__txt { font-size: .2rem; color: var(--text-lo); }
|
||||
.brief-ready__txt b { font-size: .4rem; color: var(--mint-400); margin: 0 .02rem; }
|
||||
.brief-ready__txt span { font-size: .24rem; color: var(--text-dim); }
|
||||
.brief-ready__pips { display: flex; gap: .06rem; }
|
||||
.brief-ready__pips i { width: .3rem; height: .3rem; display: grid; place-items: center; color: var(--text-dim); }
|
||||
.brief-ready__pips i .icon { width: 100%; height: 100%; }
|
||||
.brief-ready__pips i.on { color: var(--mint-400); filter: drop-shadow(0 0 .06rem rgba(23, 249, 183, .6)); }
|
||||
.brief-ready__pips i.me { border-bottom: 2px solid var(--mint-700); }
|
||||
@@ -0,0 +1,77 @@
|
||||
/* ==========================================================================================
|
||||
screens/draft.css — BAND_DRAFT strategy pick (js/screens/bandDraft.js). Research 06 §4.2:
|
||||
draft order on the left, portrait grid, detail pane with 初始生命值 and 确认选择 / 跳过.
|
||||
========================================================================================== */
|
||||
|
||||
.draft__main { position: relative; z-index: 1; flex: 1; min-height: 0; display: grid; grid-template-columns: 3.9rem 1fr 5rem; gap: .3rem; padding: .3rem .42rem .36rem; }
|
||||
|
||||
.draft-order { display: flex; flex-direction: column; gap: .1rem; min-height: 0; }
|
||||
.dorder {
|
||||
position: relative; display: grid; grid-template-columns: auto auto 1fr auto; align-items: center; gap: .12rem;
|
||||
padding: .1rem .12rem .1rem .08rem; background: rgba(12, 15, 14, .82); border: 1px solid var(--line);
|
||||
transition: border-color var(--t-med), background var(--t-med);
|
||||
}
|
||||
.dorder .pavatar { --pa: .66rem; }
|
||||
.dorder__idx { font-size: .22rem; color: var(--text-dim); width: .26rem; text-align: center; }
|
||||
.dorder__text { display: flex; flex-direction: column; gap: .02rem; min-width: 0; }
|
||||
.dorder__name { font-size: .18rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: flex; align-items: center; gap: .06rem; }
|
||||
.dorder__ai { font-family: var(--font-num); font-size: .11rem; padding: 0 .04rem; background: #a9c3d8; color: #0b1520; }
|
||||
.dorder__state { font-size: .14rem; }
|
||||
.dorder__state span { display: inline-flex; align-items: center; gap: .04rem; }
|
||||
.dorder__state .icon { width: .16rem; height: .16rem; }
|
||||
.dorder__box { position: relative; width: .6rem; height: .6rem; display: grid; place-items: center; border: 1px dashed var(--line-2); }
|
||||
.dorder__check { position: absolute; right: -.06rem; bottom: -.06rem; width: .22rem; height: .22rem; display: grid; place-items: center; background: var(--mint-500); color: var(--text-on-mint); }
|
||||
.dorder__check .icon { width: .16rem; height: .16rem; }
|
||||
.dorder__finger { width: .44rem; height: .44rem; animation: finger 1s ease-in-out infinite; }
|
||||
@keyframes finger { 50% { transform: translateX(-.06rem); } }
|
||||
.dorder.is-cur { border-color: var(--gold); background: linear-gradient(90deg, rgba(255, 198, 0, .12), rgba(12, 15, 14, .82)); box-shadow: 0 0 .2rem rgba(255, 198, 0, .15); }
|
||||
.dorder.is-done { border-color: var(--mint-800); }
|
||||
.dorder.is-self .dorder__name { color: var(--mint-400); }
|
||||
.draft-order__tip { margin-top: auto; font-size: .13rem; line-height: 1.6; color: var(--text-dim); }
|
||||
|
||||
.draft-grid {
|
||||
display: grid; grid-template-columns: repeat(auto-fill, minmax(1.36rem, 1fr)); grid-auto-rows: min-content; gap: .12rem;
|
||||
min-height: 0; overflow: auto; padding: .04rem .08rem .04rem .04rem; align-content: start;
|
||||
}
|
||||
.dband {
|
||||
position: relative; display: flex; flex-direction: column; align-items: center; gap: .05rem; padding: .08rem .06rem .1rem;
|
||||
background: rgba(12, 15, 14, .82); border: 1px solid var(--line); color: var(--text-md);
|
||||
transition: transform var(--t-fast), border-color var(--t-fast), background var(--t-fast);
|
||||
}
|
||||
.dband:hover { transform: translateY(-.03rem); border-color: var(--line-3); }
|
||||
.dband .bandicon { --bi: 1.1rem; border: 1px solid var(--line-2); }
|
||||
.dband__name { font-size: .16rem; font-weight: 700; color: var(--text-hi); white-space: nowrap; }
|
||||
.dband__lp { display: inline-flex; align-items: center; gap: .04rem; font-size: .15rem; color: var(--mint-400); }
|
||||
.dband__lp i { width: .12rem; height: .14rem; background: var(--mint-500); clip-path: polygon(0 0, 30% 0, 30% 20%, 45% 20%, 45% 0, 55% 0, 55% 20%, 70% 20%, 70% 0, 100% 0, 100% 35%, 85% 50%, 85% 80%, 100% 90%, 100% 100%, 0 100%, 0 90%, 15% 80%, 15% 50%, 0 35%); }
|
||||
.dband__who { position: absolute; right: .04rem; top: .04rem; display: flex; flex-direction: column; gap: .02rem; }
|
||||
.dband__who .pavatar { --pa: .3rem; border-radius: 50%; overflow: hidden; border: 2px solid var(--mint-400); }
|
||||
.dband.is-sel { border-color: var(--mint-400); background: linear-gradient(180deg, rgba(78, 216, 175, .18), rgba(12, 15, 14, .85)); box-shadow: 0 0 0 1px var(--mint-400), 0 0 .24rem rgba(23, 249, 183, .2); }
|
||||
.dband.is-mine::after { content: '已选择'; position: absolute; left: 0; top: 0; font-size: .11rem; font-weight: 700; padding: 0 .06rem; background: var(--mint-500); color: var(--text-on-mint); }
|
||||
|
||||
.draft-detail {
|
||||
display: flex; flex-direction: column; align-items: center; gap: .12rem; padding: .26rem .26rem .22rem; min-height: 0;
|
||||
background: linear-gradient(180deg, rgba(20, 30, 26, .9), rgba(10, 13, 12, .92)); border: 1px solid var(--line-2);
|
||||
}
|
||||
.draft-detail__art { position: relative; padding: .06rem; border: 1px solid var(--mint-800); background: radial-gradient(circle, rgba(78, 216, 175, .14), transparent 70%); }
|
||||
.draft-detail__art .bandicon { --bi: 2rem; }
|
||||
.draft-detail__hp { display: flex; align-items: center; gap: .12rem; font-size: .16rem; color: var(--text-lo); }
|
||||
.draft-detail__name { font-size: .42rem; font-weight: 900; letter-spacing: .1em; }
|
||||
.draft-detail__eff { align-self: stretch; display: flex; flex-direction: column; gap: .06rem; padding: .12rem .14rem; background: rgba(0, 0, 0, .3); border-left: 3px solid var(--mint-500); flex: 1; min-height: 0; overflow: auto; }
|
||||
.draft-detail__eff b { font-size: .2rem; color: var(--mint-400); }
|
||||
.draft-detail__desc { font-size: .16rem; line-height: 1.7; color: var(--text-md); }
|
||||
.draft-detail__actions { align-self: stretch; display: flex; flex-direction: column; gap: .1rem; }
|
||||
.draft-detail__status { display: flex; align-items: center; gap: .06rem; font-size: .15rem; color: var(--text-lo); }
|
||||
.draft-detail__status .icon { width: .18rem; height: .18rem; }
|
||||
.draft-detail__btns { display: flex; gap: .1rem; }
|
||||
.draft-detail__btns .btn { flex: 1; }
|
||||
.dorder__secs { margin-left: .06rem; font-size: .15rem; color: var(--gold); }
|
||||
/* 队友已选 (research 09 §5): a strategy a teammate picked cannot be chosen again */
|
||||
.dband.is-taken { cursor: not-allowed; border-color: rgba(246, 163, 41, .35); }
|
||||
.dband.is-taken .bandicon, .dband.is-taken .dband__name, .dband.is-taken .dband__lp { filter: grayscale(.8) brightness(.62); }
|
||||
.dband.is-taken:hover { transform: none; }
|
||||
.dband__taken {
|
||||
position: absolute; left: 50%; top: 42%; transform: translate(-50%, -50%) rotate(-8deg); white-space: nowrap; pointer-events: none;
|
||||
padding: .02rem .12rem; font-size: .15rem; font-weight: 900; letter-spacing: .16em; color: #1d1400; background: var(--amber);
|
||||
box-shadow: 0 .03rem .1rem rgba(0, 0, 0, .6);
|
||||
}
|
||||
.draft-detail__status--taken { color: var(--amber); }
|
||||
@@ -0,0 +1,504 @@
|
||||
/* ==========================================================================================
|
||||
screens/game-panels.css — rich text, unit thumbnails & glyphs (gameComponents.js), detail panel,
|
||||
bond popup, enemy / match-info drawer, 机变 overlay.
|
||||
========================================================================================== */
|
||||
|
||||
/* ---- rich text (official markup, js/ui/richText.js) ---- */
|
||||
.rt { white-space: normal; }
|
||||
.rt-vup { color: #3fb6ff; }
|
||||
.rt-vdown { color: #ff6a4a; }
|
||||
.rt-rem { color: #f49800; }
|
||||
.rt-note { color: var(--text-lo); }
|
||||
.rt-kw { color: #2fd0ff; }
|
||||
.rt-mint { color: var(--mint-400); }
|
||||
.rt-hl { color: var(--gold-2); }
|
||||
.rt-term { color: #9fd4ff; border-bottom: 1px dotted rgba(159, 212, 255, .6); }
|
||||
|
||||
/* ---- unit thumbnail ---- */
|
||||
.uthumb {
|
||||
--ut: .72rem; --tc: var(--tier-1);
|
||||
position: relative; display: inline-block; width: var(--ut); height: var(--ut); flex: none;
|
||||
}
|
||||
.uthumb--xs { --ut: .34rem; } .uthumb--sm { --ut: .54rem; } .uthumb--lg { --ut: 1.1rem; }
|
||||
.uthumb--t1 { --tc: var(--tier-1); } .uthumb--t2 { --tc: var(--tier-2); } .uthumb--t3 { --tc: var(--tier-3); }
|
||||
.uthumb--t4 { --tc: var(--tier-4); } .uthumb--t5 { --tc: var(--tier-5); } .uthumb--t6 { --tc: var(--tier-6); }
|
||||
.uthumb__art {
|
||||
position: absolute; inset: 0; overflow: hidden; display: grid; place-items: center;
|
||||
background: linear-gradient(160deg, #1a201d, #111513); background: linear-gradient(160deg, color-mix(in srgb, var(--tc) 30%, #1a201d), #111513);
|
||||
border: 1px solid var(--tc); border: 1px solid color-mix(in srgb, var(--tc) 60%, var(--line-2));
|
||||
clip-path: polygon(0 0, 100% 0, 100% calc(100% - var(--ut) * .16), calc(100% - var(--ut) * .16) 100%, 0 100%);
|
||||
}
|
||||
.uthumb__art img { width: 100%; height: 100%; object-fit: cover; }
|
||||
.uthumb--item .uthumb__art img { object-fit: contain; width: 84%; height: 84%; }
|
||||
.uthumb--enemy .uthumb__art { background: linear-gradient(160deg, #3a1c18, #140d0c); border-color: rgba(255, 90, 74, .45); }
|
||||
.uthumb__glyph { font-weight: 900; font-size: calc(var(--ut) * .44); color: var(--text-md); }
|
||||
.uthumb__tier { position: absolute; left: -.03rem; top: -.03rem; transform: scale(.82); transform-origin: top left; }
|
||||
.uthumb--xs .uthumb__tier, .uthumb--sm .uthumb__tier { transform: scale(.66); }
|
||||
.uthumb.is-golden .uthumb__art { border-color: var(--gold); box-shadow: inset 0 0 calc(var(--ut) * .18) rgba(255, 198, 0, .45); }
|
||||
.uthumb.is-golden::after { content: ''; position: absolute; inset: -2px; border: 1px solid rgba(255, 198, 0, .7); pointer-events: none; clip-path: inherit; }
|
||||
.uthumb.is-dim .uthumb__art img { filter: grayscale(.85) brightness(.55); }
|
||||
.uthumb__tag { position: absolute; right: 0; bottom: 0; font-size: calc(var(--ut) * .17); line-height: 1.2; padding: 0 .03rem; background: #a9c3d8; color: #0b1520; font-weight: 700; }
|
||||
|
||||
.bglyph { display: inline-grid; place-items: center; width: .24rem; height: .24rem; flex: none; }
|
||||
.bglyph img { width: 100%; height: 100%; object-fit: contain; filter: brightness(0) invert(.86) sepia(.4) hue-rotate(110deg) saturate(2.5); }
|
||||
.bglyph__txt { font-weight: 900; font-size: .15rem; color: var(--mint-400); }
|
||||
.bandicon { --bi: .6rem; display: inline-grid; place-items: center; width: var(--bi); height: var(--bi); flex: none; overflow: hidden; background: #111513; }
|
||||
.bandicon img { width: 100%; height: 100%; object-fit: cover; }
|
||||
.bandicon__txt { font-weight: 900; font-size: calc(var(--bi) * .44); color: var(--mint-400); }
|
||||
.bandicon--xs { --bi: .26rem; } .bandicon--sm { --bi: .42rem; } .bandicon--lg { --bi: 1.14rem; } .bandicon--xl { --bi: 2.2rem; }
|
||||
.sprite { object-fit: contain; }
|
||||
|
||||
/* ---- detail panel ---- */
|
||||
.dpanel {
|
||||
--bk-c: var(--mint-500);
|
||||
position: absolute; left: 2.3rem; top: 2.1rem; bottom: 1.02rem; width: 4.9rem; max-height: 8.4rem; z-index: 9;
|
||||
display: flex; flex-direction: column;
|
||||
background: rgba(11, 15, 13, .97); border: 1px solid var(--line-2); box-shadow: 0 .14rem .4rem rgba(0, 0, 0, .65);
|
||||
animation: panel-in var(--t-slow) var(--ease-out);
|
||||
}
|
||||
@keyframes panel-in { from { opacity: 0; transform: translateX(-.3rem); } }
|
||||
/* docked right (the selected unit's underframe is on the left: gameLogic panelSide / panelSlots — keep the insets in
|
||||
sync with PANEL_RIGHT_GAP / PANEL_RIGHT_BOTTOM(_SHOP)); above the shop bar while it is open */
|
||||
.dpanel--right { left: auto; right: .9rem; bottom: 1.02rem; animation-name: panel-in-r; }
|
||||
.dpanel--right.is-shop { bottom: 3.78rem; }
|
||||
@keyframes panel-in-r { from { opacity: 0; transform: translateX(.3rem); } }
|
||||
.dpanel__close { position: absolute; right: .08rem; top: .08rem; z-index: 2; width: .38rem; height: .38rem; display: grid; place-items: center; background: rgba(0, 0, 0, .5); border: 1px solid var(--line-2); color: var(--text-lo); }
|
||||
.dpanel__close:hover { color: #fff; border-color: var(--line-3); }
|
||||
.dpanel__close .icon { width: .2rem; height: .2rem; }
|
||||
.dpanel__scroll { flex: 1; min-height: 0; overflow: auto; padding: .18rem .2rem .2rem; display: flex; flex-direction: column; gap: .14rem; }
|
||||
.dhead { display: flex; gap: .16rem; }
|
||||
.dhead__art { position: relative; width: 1.3rem; height: 1.9rem; flex: none; overflow: hidden; background: linear-gradient(180deg, #1c2421, #0e1210); border: 1px solid var(--line-2); }
|
||||
.dhead__art img { width: 100%; height: 100%; object-fit: cover; object-position: top; }
|
||||
.dhead__art.is-golden { border-color: var(--gold); box-shadow: 0 0 .16rem rgba(255, 198, 0, .35); }
|
||||
.dhead__art .uthumb { margin: .4rem auto; display: block; }
|
||||
.dhead__icon { width: 1.1rem; height: 1.1rem; flex: none; display: grid; place-items: center; background: radial-gradient(circle, #26302c, #111513); border: 1px solid var(--line-2); }
|
||||
.dhead__icon img { width: 88%; height: 88%; object-fit: contain; }
|
||||
.dhead__icon .icon { width: .5rem; height: .5rem; color: var(--mint-500); }
|
||||
.dhead__icon.is-golden { border-color: var(--gold); }
|
||||
.dhead__icon--enemy { background: radial-gradient(circle, #3a1c18, #140d0c); border-color: rgba(255, 90, 74, .45); }
|
||||
.dhead__icon--enemy.is-boss { border-color: var(--orange-hi); box-shadow: 0 0 .18rem rgba(255, 110, 40, .45); }
|
||||
.dhead__icon--enemy.is-elite { border-color: var(--gold-2); }
|
||||
.dhead__info { display: flex; flex-direction: column; gap: .05rem; min-width: 0; padding-top: .02rem; flex: 1; }
|
||||
.dhead__chips { display: flex; align-items: center; gap: .08rem; flex-wrap: wrap; }
|
||||
.dhead__name { font-size: .32rem; font-weight: 900; letter-spacing: .04em; line-height: 1.2; }
|
||||
.dhead__en { font-family: var(--font-display); font-size: .12rem; letter-spacing: .2em; color: var(--text-dim); text-transform: uppercase; }
|
||||
.dhead__flavor { font-size: .13rem; color: var(--text-lo); font-style: italic; }
|
||||
.dhead__class { display: flex; align-items: center; gap: .06rem; flex-wrap: wrap; font-size: .15rem; color: var(--text-md); margin-top: .06rem; }
|
||||
.dhead__class .sep { width: 1px; height: .16rem; background: var(--line-2); }
|
||||
.dhead__prof, .dhead__sub { width: .24rem; height: .24rem; object-fit: contain; }
|
||||
.dhead__pos { font-size: .12rem; padding: 0 .06rem; border: 1px solid var(--line-2); color: var(--text-lo); }
|
||||
.dtag-elite, .dtag-token, .dtag-kind { font-size: .13rem; font-weight: 700; padding: .01rem .08rem; letter-spacing: .08em; }
|
||||
.dtag-elite { background: var(--gold); color: #1d1400; }
|
||||
.dtag-token { background: #a9c3d8; color: #0b1520; }
|
||||
.dtag-kind { border: 1px solid var(--line-2); color: var(--text-lo); font-weight: 500; }
|
||||
.drank { font-size: .13rem; font-weight: 700; padding: .01rem .08rem; }
|
||||
.drank--normal { background: var(--bg-4); color: var(--text-md); }
|
||||
.drank--elite { background: var(--gold-2); color: #1d1400; }
|
||||
.drank--boss { background: var(--orange); color: #fff; }
|
||||
.dhp { position: relative; height: .18rem; margin-top: .08rem; background: #0a0d0c; border: 1px solid var(--line-2); }
|
||||
.dhp i { position: absolute; inset: 0 auto 0 0; background: linear-gradient(90deg, #2bb65a, #56e08a); }
|
||||
.dhp--enemy i { background: linear-gradient(90deg, #b5261a, #ff5a4a); }
|
||||
.dhp span { position: absolute; inset: 0; display: grid; place-items: center; font-size: .12rem; color: #fff; text-shadow: 0 1px 2px #000; }
|
||||
.dtrait { display: flex; gap: .08rem; align-items: flex-start; font-size: .14rem; line-height: 1.6; color: var(--text-md); padding: .08rem .1rem; background: rgba(255, 255, 255, .03); border-left: 2px solid var(--line-3); }
|
||||
.dtrait .icon { width: .16rem; height: .16rem; margin-top: .03rem; color: var(--text-lo); flex: none; }
|
||||
.dstats-wrap { display: flex; gap: .12rem; align-items: stretch; }
|
||||
.dstats { flex: 1; display: grid; grid-template-columns: repeat(2, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
|
||||
.dstat { display: flex; align-items: baseline; justify-content: space-between; gap: .06rem; padding: .05rem .1rem; background: #0f1311; }
|
||||
.dstat__k { font-size: .13rem; color: var(--text-lo); white-space: nowrap; }
|
||||
.dstat__v { font-size: .18rem; color: #fff; }
|
||||
.dstat small { font-size: .11rem; color: var(--text-dim); margin-left: .04rem; }
|
||||
.drange { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .06rem; padding: .06rem .1rem; background: #0f1311; border: 1px solid var(--line); min-width: 1.1rem; }
|
||||
.rgrid { --rg: .14rem; display: grid; gap: 2px; }
|
||||
.rgrid i { width: var(--rg); height: var(--rg); border: 1px solid rgba(255, 255, 255, .06); }
|
||||
.rgrid i.on { background: rgba(246, 163, 41, .25); border-color: var(--amber); }
|
||||
.rgrid i.self { background: var(--mint-500); border-color: var(--mint-400); }
|
||||
.dsec { display: flex; flex-direction: column; gap: .08rem; }
|
||||
.dsec__title { display: flex; align-items: baseline; gap: .1rem; font-size: .17rem; font-weight: 700; color: var(--mint-400); padding-bottom: .04rem; border-bottom: 1px solid var(--line); }
|
||||
.dtext { font-size: .15rem; line-height: 1.65; color: var(--text-md); }
|
||||
.dskill { display: flex; gap: .12rem; align-items: center; }
|
||||
.dskill__icon { width: .62rem; height: .62rem; flex: none; object-fit: cover; border: 1px solid var(--line-3); background: #0a0d0c; }
|
||||
.dskill__icon--empty { display: grid; place-items: center; }
|
||||
.dskill__icon--empty b { font-family: var(--font-display); font-size: .2rem; color: var(--mint-400); letter-spacing: .02em; }
|
||||
.dskill__slot { display: inline-block; margin-right: .06rem; padding: 0 .05rem; vertical-align: .02rem; font-family: var(--font-display);
|
||||
font-size: .12rem; line-height: 1.5; color: var(--text-lo); border: 1px solid var(--line-3); }
|
||||
.dskill__meta { display: flex; flex-direction: column; gap: .05rem; min-width: 0; }
|
||||
.dskill__name { font-size: .19rem; }
|
||||
.dskill__tags { display: flex; flex-wrap: wrap; gap: .06rem; align-items: center; }
|
||||
.dsp { font-size: .12rem; padding: 0 .06rem; line-height: 1.6; font-weight: 700; }
|
||||
.dsp--time { background: #7fd37a; color: #0b1a0a; }
|
||||
.dsp--atk { background: #ff8a3d; color: #1f0c00; }
|
||||
.dsp--def { background: #f2bd3e; color: #1f1400; }
|
||||
.dsp--trig { border: 1px solid var(--line-3); color: var(--text-lo); font-weight: 500; }
|
||||
.dsp__num { display: inline-flex; align-items: center; gap: .03rem; font-size: .13rem; color: var(--text-lo); }
|
||||
.dsp__num b { color: #fff; }
|
||||
.dsp__num .icon { width: .14rem; height: .14rem; color: var(--gold); }
|
||||
.dtalent { display: flex; flex-direction: column; gap: .02rem; }
|
||||
.dtalent b { font-size: .15rem; color: var(--text-hi); }
|
||||
.dgarrison { display: flex; flex-direction: column; gap: .06rem; }
|
||||
.dgarrison__type { display: inline-flex; align-self: flex-start; align-items: center; gap: .05rem; font-size: .13rem; color: var(--gold-2); padding: .01rem .08rem .01rem .04rem; border: 1px solid rgba(242, 189, 62, .4); }
|
||||
.dgarrison__icon { width: .2rem; height: .2rem; object-fit: contain; }
|
||||
.dbonds { display: flex; flex-wrap: wrap; gap: .08rem; }
|
||||
.dbond { display: inline-flex; align-items: center; gap: .05rem; padding: .03rem .1rem .03rem .05rem; font-size: .15rem; background: rgba(78, 216, 175, .08); border: 1px solid var(--mint-800); color: var(--mint-400); }
|
||||
/* the unit's bonds in the header's right column, right under name / class (user playtest #2 item 9): icon, name,
|
||||
count / next threshold, tier pips — visible as soon as the card opens */
|
||||
.dbonds--top { gap: .05rem; margin-top: .06rem; }
|
||||
.dhead__info .dbonds--top .dbond { font-size: .14rem; padding: .02rem .07rem .02rem .03rem; }
|
||||
.dhead__info .dbond__icon { width: .24rem; height: .24rem; }
|
||||
.dbonds--top .dbond { gap: .06rem; padding: .03rem .08rem .03rem .04rem; font: inherit; font-size: .15rem; color: var(--text-md);
|
||||
background: rgba(255, 255, 255, .03); border: 1px solid var(--line-2); cursor: default; }
|
||||
.dbonds--top button.dbond { cursor: pointer; }
|
||||
.dbonds--top button.dbond:hover { border-color: var(--mint-500); color: #fff; }
|
||||
.dbonds--top .dbond.is-active { color: var(--mint-400); background: rgba(78, 216, 175, .1); border-color: var(--mint-700); }
|
||||
.dbonds--top .dbond.is-core .dbond__name { font-weight: 700; }
|
||||
.dbond__icon { width: .26rem; height: .26rem; }
|
||||
.dbond:not(.is-active) .dbond__icon img { filter: brightness(0) invert(.6); }
|
||||
.dbond__count { font-size: .15rem; color: #fff; }
|
||||
.dbond__count small { font-size: .11rem; color: var(--text-dim); }
|
||||
.dbond__count.is-max { color: var(--gold-2); }
|
||||
.dbond__tiers { display: inline-flex; gap: 2px; margin-left: .02rem; }
|
||||
.dbond__tiers i { width: .05rem; height: .12rem; background: rgba(255, 255, 255, .16); transform: skewX(-18deg); }
|
||||
.dbond__tiers i.on { background: var(--mint-400); box-shadow: 0 0 .04rem rgba(78, 216, 175, .8); }
|
||||
.dtag-loadout { display: inline-block; margin-left: .08rem; vertical-align: .02rem; font-size: .11rem; font-weight: 700; letter-spacing: .06em;
|
||||
padding: 0 .06rem; line-height: 1.6; background: var(--mint-500); color: #062019; }
|
||||
.dmodule { display: flex; align-items: center; flex-wrap: wrap; gap: .08rem; font-size: .15rem; }
|
||||
.dmodule__name { color: var(--text-hi); }
|
||||
/* official module type icon (local-client art, white glyph) on a dark tile; the type letter without it */
|
||||
.dmodule__icon { flex: none; display: inline-grid; place-items: center; width: .4rem; height: .4rem; background: linear-gradient(180deg, #2a322f, #151a18); border: 1px solid var(--gold-2); border: 1px solid color-mix(in srgb, var(--gold-2) 60%, transparent); }
|
||||
.dmodule__icon img { width: 80%; height: 80%; object-fit: contain; }
|
||||
.dmodule__icon b { font-size: .2rem; font-weight: 700; line-height: 1; color: var(--gold-2); }
|
||||
.dmodule__type { font-family: var(--font-display); font-size: .12rem; letter-spacing: .1em; padding: 0 .06rem; border: 1px solid var(--line-3); color: var(--text-lo); }
|
||||
.dmodule.is-none .dmodule__name { color: var(--text-dim); font-weight: 500; }
|
||||
.ditem { display: flex; gap: .1rem; align-items: flex-start; }
|
||||
.ditem__text { display: flex; flex-direction: column; gap: .02rem; min-width: 0; }
|
||||
.ditem__text b { font-size: .15rem; }
|
||||
.ditem__desc { font-size: .13rem; line-height: 1.55; color: var(--text-lo); }
|
||||
.dempty { font-size: .14rem; }
|
||||
.dhint { display: flex; align-items: flex-start; gap: .06rem; font-size: .14rem; color: var(--text-lo); line-height: 1.6; }
|
||||
.dhint .icon { width: .16rem; height: .16rem; margin-top: .03rem; flex: none; }
|
||||
.dactions { display: flex; justify-content: flex-end; gap: .1rem; padding-top: .06rem; border-top: 1px solid var(--line); }
|
||||
.dsell { margin-left: .06rem; color: #1d1400; }
|
||||
.dfactions { display: flex; flex-wrap: wrap; gap: .06rem; }
|
||||
.dfaction { display: inline-flex; align-items: center; gap: .04rem; font-size: .13rem; color: var(--amber); padding: 0 .08rem 0 .02rem; border: 1px solid rgba(246, 163, 41, .45); }
|
||||
.dfaction img { width: .22rem; height: .22rem; object-fit: contain; }
|
||||
.dabil { margin: 0; padding-left: .2rem; display: flex; flex-direction: column; gap: .05rem; font-size: .15rem; line-height: 1.6; color: var(--text-md); }
|
||||
|
||||
/* ---- bond popup ---- */
|
||||
.bpop {
|
||||
position: absolute; left: 2.3rem; top: 2.1rem; width: 5.4rem; max-height: calc(100% - 2.4rem); z-index: 8; overflow: auto;
|
||||
display: flex; flex-direction: column; gap: .12rem; padding: .2rem .22rem;
|
||||
background: rgba(11, 15, 13, .97); border: 1px solid var(--line-2); box-shadow: 0 .14rem .4rem rgba(0, 0, 0, .65);
|
||||
animation: pop-in var(--t-med) var(--ease-out);
|
||||
}
|
||||
/* placement (gameLogic bondPopupPlace / BPOP — keep in sync): beside the left-docked detail card, left of the
|
||||
right-docked one, against the right edge, or over the card it was opened from — never over the selected unit's
|
||||
underframe when a place is free */
|
||||
.bpop--beside { left: 7.32rem; z-index: 10; }
|
||||
.bpop--besideR { left: auto; right: 5.92rem; z-index: 10; }
|
||||
.bpop--right { left: auto; right: .9rem; z-index: 10; }
|
||||
.bpop.is-over { z-index: 10; background: rgb(11, 15, 13); }
|
||||
.bpop__close { position: absolute; right: .08rem; top: .08rem; width: .36rem; height: .36rem; display: grid; place-items: center; background: none; border: 1px solid var(--line-2); color: var(--text-lo); }
|
||||
.bpop__close .icon { width: .18rem; height: .18rem; }
|
||||
.bpop__head { display: flex; gap: .16rem; align-items: center; }
|
||||
.bpop__disc { width: .86rem; height: .86rem; border-radius: 50%; display: grid; place-items: center; background: #1b2320; border: 3px solid rgba(255, 255, 255, .14); flex: none; }
|
||||
.bpop__disc .bglyph { width: .56rem; height: .56rem; }
|
||||
.bpop__disc .bglyph img { filter: brightness(0) invert(.8); }
|
||||
.bpop__disc.is-active { background: var(--mint-500); border-color: var(--mint-400); box-shadow: 0 0 .24rem rgba(23, 249, 183, .45); }
|
||||
.bpop__disc.is-active .bglyph img { filter: brightness(0) opacity(.85); }
|
||||
.bpop__titles { display: flex; flex-direction: column; gap: .02rem; min-width: 0; }
|
||||
.bpop__name { font-size: .32rem; font-weight: 900; letter-spacing: .08em; }
|
||||
.bpop__facts { display: flex; gap: .16rem; font-size: .15rem; color: var(--text-lo); }
|
||||
.bpop__facts b { color: #fff; font-size: .18rem; }
|
||||
.bpop__facts small { font-size: .12rem; }
|
||||
.bpop__tiers { display: flex; gap: .06rem; }
|
||||
.bpop__tier { display: flex; align-items: baseline; gap: .02rem; padding: .02rem .12rem; border: 1px solid var(--line-2); color: var(--text-dim); font-size: .13rem; }
|
||||
.bpop__tier b { font-size: .2rem; }
|
||||
.bpop__tier.is-on { background: var(--mint-500); color: var(--text-on-mint); border-color: var(--mint-400); }
|
||||
.bpop__sec { display: flex; flex-direction: column; gap: .06rem; }
|
||||
.bpop__sec h4 { font-size: .16rem; color: var(--mint-400); display: flex; align-items: baseline; gap: .08rem; }
|
||||
.bpop__sec h4 small { font-size: .13rem; color: var(--text-lo); font-weight: 400; }
|
||||
.bpop__sec--now { padding: .1rem .12rem; background: rgba(78, 216, 175, .06); border-left: 3px solid var(--mint-500); }
|
||||
.bpop__desc { font-size: .15rem; line-height: 1.7; color: var(--text-md); }
|
||||
.bpop__members { display: grid; grid-template-columns: repeat(5, 1fr); gap: .08rem; }
|
||||
.bpop__member { position: relative; display: flex; flex-direction: column; align-items: center; gap: .03rem; padding: .04rem 0; background: none; border: 1px solid transparent; }
|
||||
.bpop__member:hover { border-color: var(--line-2); background: rgba(255, 255, 255, .03); }
|
||||
.bpop__member.is-on .uthumb__art { border-color: var(--mint-400); box-shadow: 0 0 .1rem rgba(23, 249, 183, .45); }
|
||||
.bpop__mname { font-size: .12rem; color: var(--text-lo); max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.bpop__member.is-on .bpop__mname { color: var(--mint-400); }
|
||||
.bpop__member.is-owned .bpop__mname { color: var(--text-hi); }
|
||||
.bpop__ban { position: absolute; top: .02rem; right: .1rem; width: .2rem; height: .2rem; display: grid; place-items: center; background: var(--red); color: #fff; border-radius: 50%; }
|
||||
.bpop__ban .icon { width: .14rem; height: .14rem; }
|
||||
|
||||
/* ---- enemy / info drawer ---- */
|
||||
.edrawer {
|
||||
--bk-c: var(--amber);
|
||||
position: absolute; left: 50%; top: 1.08rem; transform: translateX(-50%); width: 7.4rem; max-height: calc(100% - 4.4rem); z-index: 9;
|
||||
display: flex; flex-direction: column; background: rgba(11, 15, 13, .97); border: 1px solid var(--line-2); box-shadow: 0 .14rem .4rem rgba(0, 0, 0, .65);
|
||||
animation: drawer-in var(--t-slow) var(--ease-out);
|
||||
}
|
||||
@keyframes drawer-in { from { opacity: 0; transform: translate(-50%, -.2rem); } }
|
||||
.edrawer__top { display: flex; align-items: flex-end; justify-content: space-between; padding: .08rem .12rem 0 .16rem; border-bottom: 1px solid var(--line); }
|
||||
.edrawer__top .tabs { border-bottom: 0; }
|
||||
.edrawer__close { width: .34rem; height: .34rem; margin-bottom: .06rem; display: grid; place-items: center; background: none; border: 1px solid var(--line-2); color: var(--text-lo); }
|
||||
.edrawer__close .icon { width: .18rem; height: .18rem; }
|
||||
.edrawer__body { overflow: auto; padding: .14rem .18rem .18rem; display: flex; flex-direction: column; gap: .12rem; }
|
||||
.edrawer__sum { display: flex; align-items: center; justify-content: space-between; gap: .12rem; flex-wrap: wrap; font-size: .15rem; color: var(--text-md); }
|
||||
.edrawer__sum b { font-size: .19rem; }
|
||||
.edrawer__empty { display: flex; align-items: center; gap: .08rem; justify-content: center; padding: .3rem; color: var(--text-dim); font-size: .16rem; }
|
||||
.edrawer__empty .icon { width: .24rem; height: .24rem; }
|
||||
.fchips { display: flex; gap: .06rem; flex-wrap: wrap; }
|
||||
.fchip { display: inline-flex; align-items: center; gap: .04rem; padding: 0 .1rem 0 .02rem; font-size: .13rem; color: var(--amber); border: 1px solid rgba(246, 163, 41, .45); background: rgba(246, 163, 41, .06); }
|
||||
.fchip__icon { width: .26rem; height: .26rem; object-fit: contain; }
|
||||
.elist { display: grid; grid-template-columns: 1fr 1fr; gap: .08rem; }
|
||||
.erow { display: flex; align-items: center; gap: .1rem; padding: .06rem .12rem .06rem .06rem; background: rgba(255, 255, 255, .025); border: 1px solid var(--line); text-align: left; color: inherit; transition: border-color var(--t-fast), background var(--t-fast); }
|
||||
.erow:hover { border-color: var(--line-3); background: rgba(255, 255, 255, .05); }
|
||||
.erow--boss { border-color: rgba(255, 110, 40, .6); background: rgba(232, 90, 26, .1); }
|
||||
.erow--bounty { border-color: rgba(255, 198, 0, .45); }
|
||||
.erow__text { display: flex; flex-direction: column; gap: .03rem; min-width: 0; flex: 1; }
|
||||
.erow__name { font-size: .16rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
||||
.erow__tags { display: flex; gap: .04rem; flex-wrap: wrap; }
|
||||
.erow__count { font-size: .26rem; color: #fff; }
|
||||
.etag { font-size: .11rem; line-height: 1.5; padding: 0 .05rem; font-weight: 700; }
|
||||
.etag--boss { background: var(--orange); color: #fff; }
|
||||
.etag--bounty { background: var(--gold); color: #1d1400; }
|
||||
.etag--escort { background: var(--bg-4); color: var(--text-md); }
|
||||
.etag--elite { background: var(--gold-2); color: #1d1400; }
|
||||
.etag--fly { background: #2c4a63; color: #cfe8ff; }
|
||||
.etag--faction { border: 1px solid rgba(246, 163, 41, .5); color: var(--amber); font-weight: 500; }
|
||||
.eboss { display: flex; gap: .12rem; align-items: center; padding: .1rem .12rem; border: 1px solid rgba(255, 110, 40, .45); background: linear-gradient(90deg, rgba(232, 90, 26, .14), transparent); }
|
||||
.eboss > div { display: flex; flex-direction: column; gap: .02rem; }
|
||||
.eboss b { font-size: .19rem; }
|
||||
.eboss .t-lo { font-size: .13rem; }
|
||||
.iband { display: flex; gap: .12rem; align-items: flex-start; padding: .1rem; background: rgba(78, 216, 175, .05); border: 1px solid var(--mint-800); }
|
||||
.iband > div { display: flex; flex-direction: column; gap: .03rem; min-width: 0; }
|
||||
.iband b { font-size: .19rem; }
|
||||
.iband b small { font-size: .14rem; font-weight: 400; margin-left: .06rem; }
|
||||
.iband__desc { font-size: .14rem; line-height: 1.6; color: var(--text-md); }
|
||||
.istage { display: flex; align-items: center; gap: .06rem; font-size: .15rem; color: var(--text-lo); }
|
||||
.istage .icon { width: .18rem; height: .18rem; color: var(--mint-500); }
|
||||
.istage b { color: var(--text-hi); }
|
||||
.ihead { font-size: .16rem; color: var(--mint-400); display: flex; gap: .08rem; align-items: baseline; }
|
||||
.ihead small { color: var(--text-lo); font-size: .14rem; }
|
||||
.ibonds { display: flex; flex-wrap: wrap; gap: .06rem; }
|
||||
.ibond { display: inline-flex; align-items: center; gap: .05rem; padding: .03rem .08rem .03rem .04rem; font-size: .14rem; border: 1px solid var(--line-2); color: var(--text-md); }
|
||||
.ibond.is-off { color: var(--text-dim); background: rgba(255, 255, 255, .02); text-decoration: line-through; text-decoration-color: rgba(255, 84, 84, .6); }
|
||||
.ibond.is-off .bglyph img { filter: grayscale(1) brightness(.5); }
|
||||
.ibond__ban { display: inline-flex; align-items: center; gap: .02rem; font-size: .12rem; padding: 0 .05rem; background: var(--red); color: #fff; text-decoration: none; }
|
||||
.ibond__ban .icon { width: .12rem; height: .12rem; }
|
||||
.ibanned { display: flex; flex-wrap: wrap; gap: .06rem; }
|
||||
.ibanned__one { padding: 0; background: none; border: 0; }
|
||||
|
||||
/* ---- 机变 overlay ---- */
|
||||
.spov { position: absolute; inset: 0 0 0 2.8rem; z-index: 20; }
|
||||
.gm.has-sp .gm__bonds, .gm.has-sp .gm__effects { opacity: 0; pointer-events: none; transition: opacity var(--t-med); }
|
||||
.spov__veil { position: absolute; inset: 0; background: linear-gradient(90deg, rgba(4, 7, 6, .6) 0, rgba(4, 7, 6, .9) .5rem, rgba(4, 7, 6, .92)); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); border-left: 1px solid var(--line); }
|
||||
.spov__inner { position: absolute; left: .3rem; right: .5rem; top: 1.14rem; bottom: .5rem; display: flex; flex-direction: column; gap: .16rem; animation: screen-in var(--t-slow) var(--ease-out); }
|
||||
.spov__head { display: flex; align-items: flex-end; justify-content: space-between; gap: .3rem; }
|
||||
.spov__titles { display: flex; flex-direction: column; gap: .04rem; }
|
||||
.spov__title { display: flex; align-items: baseline; gap: .14rem; font-size: .5rem; font-weight: 900; letter-spacing: .08em; color: #eafff8; text-shadow: 0 0 .2rem rgba(23, 249, 183, .35); }
|
||||
.spov__title.is-special { color: var(--gold-2); text-shadow: 0 0 .2rem rgba(242, 189, 62, .35); }
|
||||
.spov__bar { color: var(--mint-700); font-weight: 400; }
|
||||
.spov__desc { font-size: .22rem; font-weight: 400; color: var(--text-lo); letter-spacing: .04em; text-shadow: none; }
|
||||
.spov__sub { font-size: .15rem; color: var(--text-dim); }
|
||||
.spov__turn { display: flex; align-items: center; gap: .24rem; }
|
||||
.spov__turntxt { display: flex; align-items: center; gap: .08rem; font-size: .24rem; font-weight: 700; color: var(--text-md); }
|
||||
.spov__turntxt .icon { width: .26rem; height: .26rem; }
|
||||
.spov__turntxt.is-mine { color: var(--gold); text-shadow: 0 0 .16rem rgba(255, 198, 0, .45); animation: blink 1.2s ease-in-out infinite; }
|
||||
.spov__turntxt.is-done { color: var(--mint-400); }
|
||||
.spov__order { display: flex; gap: .1rem; }
|
||||
.spov__who { display: flex; align-items: center; gap: .08rem; padding: .05rem .12rem .05rem .06rem; background: rgba(255, 255, 255, .03); border: 1px solid var(--line); }
|
||||
.spov__who.is-cur { border-color: var(--gold); background: rgba(255, 198, 0, .08); }
|
||||
.spov__who.is-done { border-color: var(--mint-800); }
|
||||
.spov__who.is-self .spov__wname { color: var(--mint-400); }
|
||||
.spov__idx { font-size: .16rem; color: var(--text-dim); width: .2rem; text-align: center; }
|
||||
.spov__wname { font-size: .15rem; max-width: 1.2rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.spov__wstate { display: grid; }
|
||||
.spov__wstate .icon { width: .2rem; height: .2rem; }
|
||||
.spov__who.is-done .spov__wstate { color: var(--mint-400); }
|
||||
.spov__who.is-cur .spov__wstate { color: var(--gold); }
|
||||
.spov__grid { flex: 1; min-height: 0; display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(2, 1fr); gap: .2rem; }
|
||||
.spov__grid--3 { grid-template-columns: repeat(3, minmax(0, 4.3rem)); grid-template-rows: minmax(0, 5rem); justify-content: center; align-content: start; gap: .36rem; margin-top: .3rem; }
|
||||
.spov__grid--3 .spcard { justify-content: flex-start; padding-top: .62rem; }
|
||||
.spov__grid--3 .spcard__icon { width: 1.6rem; height: 1.6rem; margin-bottom: .1rem; }
|
||||
.spov__grid--3 .spcard--bounty .spcard__icon { width: 1.4rem; height: 1.4rem; }
|
||||
.spcard {
|
||||
position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .12rem; padding: .3rem .3rem .24rem; overflow: hidden; text-align: center;
|
||||
background: linear-gradient(180deg, rgba(210, 224, 219, .12), rgba(120, 140, 132, .06)); border: 1px solid rgba(200, 220, 212, .25); color: var(--text-hi);
|
||||
transition: transform var(--t-fast) var(--ease-out), border-color var(--t-fast), background var(--t-fast), opacity var(--t-med);
|
||||
}
|
||||
.spcard__glow { position: absolute; inset: 0; background: radial-gradient(70% 50% at 50% 0%, rgba(78, 216, 175, .16), transparent 70%); pointer-events: none; }
|
||||
.spcard.is-pickable { cursor: pointer; }
|
||||
.spcard.is-pickable:hover { transform: translateY(-.06rem); border-color: var(--mint-400); background: linear-gradient(180deg, rgba(78, 216, 175, .18), rgba(78, 216, 175, .05)); box-shadow: 0 0 0 1px var(--mint-400), 0 .1rem .3rem rgba(23, 249, 183, .2); }
|
||||
.spcard:disabled { cursor: default; }
|
||||
.spcard.is-taken { background: rgba(120, 140, 132, .05); }
|
||||
.spcard.is-taken > :not(.spcard__taker) { opacity: .38; filter: grayscale(.7); }
|
||||
.spcard.is-mine { border-color: var(--mint-400); box-shadow: inset 0 0 0 1px var(--mint-400); }
|
||||
.spcard.is-mine > :not(.spcard__taker) { opacity: 1; filter: none; }
|
||||
.spcard__tier { position: absolute; left: .12rem; top: .12rem; }
|
||||
.spcard__icon { width: 1.3rem; height: 1.3rem; display: grid; place-items: center; flex: none; }
|
||||
.spcard__icon img { width: 100%; height: 100%; object-fit: contain; filter: drop-shadow(0 .06rem .12rem rgba(0, 0, 0, .6)); }
|
||||
.spcard__icon .icon { width: .7rem; height: .7rem; color: var(--mint-500); }
|
||||
.spcard--bounty .spcard__icon { width: 1.1rem; height: 1.1rem; border: 2px solid rgba(255, 90, 74, .5); background: radial-gradient(circle, #3a1c18, #140d0c); }
|
||||
.spcard--bounty .spcard__icon img { object-fit: cover; }
|
||||
.spcard__body { display: flex; flex-direction: column; align-items: center; gap: .08rem; min-height: 0; }
|
||||
.spcard__name { font-size: .26rem; font-weight: 900; letter-spacing: .06em; }
|
||||
.spcard__desc { font-size: .16rem; line-height: 1.65; color: var(--text-md); max-width: 4.6rem; display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; }
|
||||
.spov__grid--3 .spcard__desc { -webkit-line-clamp: 8; }
|
||||
.spcard__tags { display: flex; gap: .08rem; }
|
||||
.spcard__tag { font-size: .13rem; font-weight: 700; padding: .01rem .08rem; }
|
||||
.spcard__tag--team { background: var(--mint-500); color: var(--text-on-mint); }
|
||||
.spcard__tag--coin { background: var(--gold); color: #1d1400; }
|
||||
.spcard__taker { position: absolute; right: .12rem; top: .12rem; display: flex; align-items: center; gap: .06rem; padding: .03rem .1rem .03rem .03rem;
|
||||
background: rgba(8, 11, 10, .92); border: 1px solid var(--mint-500); border-radius: .3rem; font-size: .13rem; color: var(--mint-400); font-weight: 700; }
|
||||
.spcard__taker .pavatar { --pa: .4rem; border-radius: 50%; overflow: hidden; border: 2px solid var(--mint-400); }
|
||||
.spcard.is-taken .spcard__taker { filter: none; }
|
||||
.spcard__spin { position: absolute; inset: 0; display: grid; place-items: center; background: rgba(0, 0, 0, .4); }
|
||||
|
||||
/* Grid image boxes: definite 100% tracks so `height: 100%` images resolve against the box (an auto track would
|
||||
let non-square art overflow its frame). */
|
||||
.uthumb__art, .bandicon, .dhead__icon, .spcard__icon, .effect, .pavatar__img, .brief-faction__icon, .scard__itemart, .bglyph {
|
||||
grid-template-rows: 100%;
|
||||
grid-template-columns: 100%;
|
||||
}
|
||||
.spcard__icon img, .dhead__icon img, .scard__itemart img, .effect img { max-width: 100%; max-height: 100%; }
|
||||
|
||||
/* ---- direction wheel (ui/facingWheel.js, research 09 §1.2): white diamond, 4 chevrons, "✕ 点击取消", orange range ---- */
|
||||
.fwheel { position: fixed; inset: 0; z-index: 6; touch-action: none; user-select: none; -webkit-user-select: none; cursor: crosshair; }
|
||||
.fwheel__stripes { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; }
|
||||
.fwheel__dia { position: absolute; transform: translate(-50%, -50%); pointer-events: none; animation: fwheel-in 160ms var(--ease-out); }
|
||||
@keyframes fwheel-in { from { opacity: 0; transform: translate(-50%, -50%) scale(.82); } }
|
||||
.fwheel__svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; filter: drop-shadow(0 0 .05rem rgba(0, 0, 0, .75)); }
|
||||
.fwheel__outer { fill: rgba(8, 12, 10, .1); stroke: #fff; stroke-width: 2.4px; vector-effect: non-scaling-stroke; }
|
||||
.fwheel__quad { fill: transparent; transition: fill var(--t-fast); }
|
||||
/* only the chevron lights (research 09 §1.2): a tinted quadrant would wash out the units standing under the diamond */
|
||||
.fwheel__quad.is-on { fill: transparent; }
|
||||
.fwheel__inner { fill: rgba(255, 255, 255, .06); stroke: rgba(255, 255, 255, .9); stroke-width: 1.6px; vector-effect: non-scaling-stroke; }
|
||||
.fwheel.is-pressed .fwheel__inner { fill: rgba(255, 255, 255, .1); }
|
||||
.fwheel__chev path { fill: rgba(255, 255, 255, .92); transform-box: fill-box; transform-origin: center; transition: transform var(--t-fast), fill var(--t-fast); }
|
||||
.fwheel__chev.is-on path { fill: #ffae3d; transform: scale(1.4); filter: drop-shadow(0 0 3px rgba(255, 156, 51, .9)); }
|
||||
.fwheel__cancel {
|
||||
position: absolute; left: 25%; top: 25%; transform: translate(-92%, -118%); pointer-events: auto;
|
||||
display: inline-flex; align-items: center; gap: .05rem; padding: .03rem .1rem .03rem .05rem; white-space: nowrap;
|
||||
background: var(--red); border: 0; color: #fff; font-size: .15rem; font-weight: 700; letter-spacing: .06em; cursor: pointer;
|
||||
clip-path: polygon(0 0, 100% 0, 100% 70%, calc(100% - .08rem) 100%, 0 100%); box-shadow: 0 .03rem .1rem rgba(0, 0, 0, .5);
|
||||
}
|
||||
.fwheel__cancel:hover { background: #ff4a2b; }
|
||||
.fwheel__x { width: .18rem; height: .18rem; filter: brightness(0) invert(1); }
|
||||
.fwheel__x--txt { display: grid; place-items: center; filter: none; font-size: .14rem; }
|
||||
.fwheel__tip {
|
||||
position: absolute; left: 50%; top: 100%; transform: translate(-50%, .08rem); white-space: nowrap; pointer-events: none;
|
||||
padding: .04rem .16rem; background: rgba(8, 11, 10, .9); border: 1px solid rgba(255, 156, 51, .6); color: #ffc27a; font-size: .15rem; letter-spacing: .08em;
|
||||
}
|
||||
.fwheel__sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
|
||||
|
||||
/* ---- underframe: the selection diamond of a tapped own piece (ui/underframe.js): 撤退 / 出售 +N / 销毁 ----
|
||||
It sits above every HUD panel (detail card z 9, bond popup, drawer, shop bar): only its buttons take pointer events,
|
||||
so they are never covered (user playtest #2 item 8); overlays that must win (机变, modals, the drag ghost) are higher. */
|
||||
.gm__hud > .uframe { position: absolute; transform: translate(-50%, -50%); pointer-events: none; z-index: 12; }
|
||||
.uframe__dia { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; animation: uframe-in 180ms var(--ease-out); }
|
||||
@keyframes uframe-in { from { opacity: 0; transform: scale(.85); } }
|
||||
.uframe__outer { fill: rgba(78, 216, 175, .05); stroke: rgba(255, 255, 255, .88); stroke-width: 1.6px; stroke-dasharray: 7 5; vector-effect: non-scaling-stroke; }
|
||||
.uframe__corner { fill: none; stroke: var(--mint-400); stroke-width: 2.4px; vector-effect: non-scaling-stroke; }
|
||||
.uframe__btn {
|
||||
position: absolute; pointer-events: auto; display: flex; flex-direction: column; align-items: center; gap: .02rem;
|
||||
padding: 0; background: none; border: 0; color: #fff; cursor: pointer; filter: drop-shadow(0 .03rem .06rem rgba(0, 0, 0, .8));
|
||||
animation: uframe-in 200ms var(--ease-out);
|
||||
}
|
||||
.uframe__btn:disabled { opacity: .5; cursor: wait; }
|
||||
.uframe__btn--retreat { left: 25%; top: 25%; transform: translate(-80%, -90%); }
|
||||
.uframe__btn--sell, .uframe__btn--destroy { left: 75%; top: 25%; transform: translate(-20%, -90%); }
|
||||
/* the octagon plate every button stands on (the official util_btn plates are octagons) */
|
||||
.uframe__glyph, .uframe__plate {
|
||||
width: .56rem; height: .56rem; padding: .08rem; box-sizing: border-box;
|
||||
clip-path: polygon(30% 0, 70% 0, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0 70%, 0 30%);
|
||||
}
|
||||
.uframe__glyph { background: var(--red); fill: #fff; box-shadow: inset 0 0 0 2px rgba(255, 255, 255, .22); }
|
||||
/* coloured plates: tone colour through the official sprite's shape (mask), dark backing through its glyph cut-out */
|
||||
.uframe__plate { --uf-tone: linear-gradient(180deg, #ffd06a 0%, #f6a329 55%, #d9820c 100%); --uf-ink: #1d1400;
|
||||
position: relative; display: grid; place-items: center; padding: 0; background: var(--uf-ink); }
|
||||
.uframe__plate--destroy { --uf-tone: linear-gradient(180deg, #ff6a4f 0%, #e73118 60%, #b8200d 100%); --uf-ink: #230703; }
|
||||
.uframe__plate.has-mask::after {
|
||||
content: ''; position: absolute; inset: 0; background: var(--uf-tone);
|
||||
-webkit-mask: var(--uf-mask) center / 100% 100% no-repeat; mask: var(--uf-mask) center / 100% 100% no-repeat;
|
||||
}
|
||||
.uframe__plate.is-glyph { background: var(--uf-tone); }
|
||||
.uframe__pglyph { width: 64%; height: 64%; color: var(--uf-ink); }
|
||||
.uframe__btn:hover:not(:disabled) .uframe__glyph { background: #ff4a2b; }
|
||||
.uframe__btn:hover:not(:disabled) .uframe__plate { filter: brightness(1.12) drop-shadow(0 0 .08rem rgba(255, 198, 90, .7)); }
|
||||
.uframe__btn--destroy:hover:not(:disabled) .uframe__plate { filter: brightness(1.12) drop-shadow(0 0 .08rem rgba(255, 90, 60, .7)); }
|
||||
.uframe__label { font-size: .14rem; font-weight: 700; letter-spacing: .12em; padding: 0 .06rem; background: rgba(8, 11, 10, .82); text-shadow: 0 1px 2px #000; }
|
||||
.uframe__btn--sell .uframe__label { color: #ffd98a; }
|
||||
.uframe__price { position: absolute; right: -.12rem; top: -.06rem; --hex-h: .24rem; }
|
||||
|
||||
/* ---- equip-replace dialog (js/ui/equipReplace.js; official equip_replace_* sprites via --eqr-* when installed) ---- */
|
||||
.eqr-host { display: contents; }
|
||||
.modal__box.eqr {
|
||||
--bk-c: var(--red-premium);
|
||||
background: rgba(14, 14, 18, .98);
|
||||
background: var(--eqr-bg, none) center / cover no-repeat, repeating-linear-gradient(0deg, rgba(255, 255, 255, .015) 0 1px, transparent 1px 3px), linear-gradient(180deg, #17171c, #0d0d11);
|
||||
border-color: rgba(255, 84, 84, .35);
|
||||
}
|
||||
.eqr .modal__body { display: flex; flex-direction: column; align-items: stretch; gap: .1rem; padding-bottom: .16rem; }
|
||||
.eqr__lead { font-size: .17rem; line-height: 1.6; color: var(--text-md); }
|
||||
.eqr__lead b { color: var(--text-hi); }
|
||||
.eqr__lead .t-red { color: var(--red-premium); }
|
||||
.eqr__top { display: flex; align-items: center; justify-content: center; gap: .22rem; margin-top: .06rem; }
|
||||
.eqr__op { display: flex; flex-direction: column; align-items: center; gap: .05rem; flex: none; width: 1.1rem; }
|
||||
.eqr__ava {
|
||||
position: relative; display: grid; place-items: center; width: .96rem; height: .96rem;
|
||||
background: var(--eqr-ava, linear-gradient(160deg, #26262c, #111114)) center / 100% 100% no-repeat;
|
||||
}
|
||||
.eqr__ava::after { content: ''; position: absolute; inset: .1rem; background: var(--eqr-avaf, none) center / 100% 100% no-repeat; pointer-events: none; }
|
||||
.eqr__ava .uthumb { --ut: .72rem; }
|
||||
.eqr__opname { font-size: .15rem; font-weight: 700; color: var(--text-hi); max-width: 1.1rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.eqr__swap { display: grid; place-items: center; width: .4rem; height: .32rem; color: var(--mint-400); flex: none; }
|
||||
.eqr__swap img, .eqr__swap .icon { width: 100%; height: 100%; object-fit: contain; }
|
||||
.eqr__incoming { display: flex; flex-direction: column; gap: .04rem; min-width: 0; flex: 0 1 4.2rem; }
|
||||
.eqr__card { display: grid; grid-template-columns: auto minmax(0, 1fr); grid-template-rows: auto auto; column-gap: .12rem; row-gap: .04rem; align-items: center; text-align: left; }
|
||||
.eqr__card--new {
|
||||
padding: .1rem .14rem; border: 1px solid rgba(89, 244, 202, .45);
|
||||
background: linear-gradient(90deg, rgba(78, 216, 175, .14), rgba(78, 216, 175, .03));
|
||||
}
|
||||
.eqr__icon { grid-row: 1; grid-column: 1; position: relative; display: grid; place-items: center; }
|
||||
.eqr__card--new .eqr__icon { width: .74rem; height: .74rem; background: var(--eqr-round, none) center / 100% 100% no-repeat; }
|
||||
.eqr__card--new .eqr__icon .uthumb { --ut: .56rem; }
|
||||
.eqr__meta { grid-row: 1; grid-column: 2; display: flex; flex-direction: column; gap: .03rem; min-width: 0; }
|
||||
.eqr__chips { display: flex; align-items: center; gap: .06rem; min-height: .2rem; }
|
||||
.eqr__elite { font-size: .12rem; padding: 0 .06rem; background: var(--gold); color: #1b1300; font-weight: 700; }
|
||||
.eqr__name { font-size: .19rem; color: var(--text-hi); line-height: 1.2; }
|
||||
.eqr__desc { grid-row: 2; grid-column: 1 / -1; margin: 0; font-size: .145rem; line-height: 1.55; color: var(--text-md); max-height: 1.12rem; overflow: auto; }
|
||||
.eqr__arrow { position: relative; height: .5rem; margin: 0 auto; width: 50%; }
|
||||
.eqr__aline { position: absolute; left: 0; right: 0; top: .2rem; height: .2rem; border: .045rem solid rgba(242, 242, 242, .82); border-bottom: 0; }
|
||||
.eqr__aline::before { content: ''; position: absolute; left: 50%; top: -.25rem; width: .045rem; height: .21rem; margin-left: -.0225rem; background: rgba(242, 242, 242, .82); }
|
||||
.eqr__ahead { position: absolute; top: .34rem; width: .3rem; height: .2rem; margin-left: -.15rem; background: var(--eqr-ahead, none) center / 100% 100% no-repeat; }
|
||||
.eqr__ahead--l { left: calc(0% + .0225rem); } .eqr__ahead--r { left: calc(100% - .0225rem); }
|
||||
.eqr-host:not([style*="--eqr-ahead"]) .eqr__ahead { width: .16rem; height: .16rem; margin-left: -.08rem; top: .3rem; border-right: .045rem solid rgba(242, 242, 242, .82); border-bottom: .045rem solid rgba(242, 242, 242, .82); transform: rotate(45deg); background: none; }
|
||||
.eqr__opts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .3rem; }
|
||||
.eqr__opt {
|
||||
position: relative; display: flex; flex-direction: column; align-items: center; gap: .08rem; min-height: 2.5rem; padding: .18rem .16rem .5rem;
|
||||
text-align: center; color: inherit; cursor: pointer; overflow: hidden;
|
||||
background: var(--eqr-opt, none) center / 100% 100% no-repeat, linear-gradient(180deg, rgba(255, 255, 255, .07), rgba(255, 255, 255, .02));
|
||||
border: 2px solid rgba(255, 255, 255, .16);
|
||||
transition: border-color var(--t-fast), transform var(--t-fast), box-shadow var(--t-fast);
|
||||
}
|
||||
.eqr__opt .eqr__icon { width: .86rem; height: .86rem; }
|
||||
.eqr__opt .eqr__icon .uthumb { --ut: .8rem; }
|
||||
.eqr__opt .eqr__meta { align-items: center; }
|
||||
.eqr__opt .eqr__desc { text-align: left; max-height: 1rem; }
|
||||
.eqr__opt:hover { border-color: rgba(255, 255, 255, .42); }
|
||||
.eqr__opt:focus-visible { outline: 2px solid var(--mint-400); outline-offset: 2px; }
|
||||
.eqr__opt.is-sel { border-color: #e2262a; box-shadow: 0 0 .2rem rgba(226, 38, 42, .45); }
|
||||
.eqr__opt.is-sel::after {
|
||||
content: ''; position: absolute; inset: 0; pointer-events: none;
|
||||
background: var(--eqr-sel, linear-gradient(225deg, rgba(226, 38, 42, .55), transparent 38%)) center / 100% 100% no-repeat;
|
||||
}
|
||||
.eqr__flag {
|
||||
position: absolute; z-index: 2; left: 0; right: 0; bottom: 0; height: .44rem; display: flex; align-items: center; justify-content: center; gap: .08rem;
|
||||
font-size: .17rem; font-weight: 700; letter-spacing: .12em; color: #fff; text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
|
||||
background: var(--eqr-selbar, linear-gradient(90deg, #a3141a, #d42a2a)) center / 100% 100% no-repeat;
|
||||
opacity: 0; transform: translateY(100%); transition: opacity var(--t-fast), transform var(--t-med) var(--ease-out);
|
||||
}
|
||||
.eqr__flag-icon { width: .2rem; height: .2rem; }
|
||||
.eqr__opt.is-sel .eqr__flag { opacity: 1; transform: none; }
|
||||
.eqr__hint { margin: .04rem 0 0; text-align: center; font-size: .15rem; color: var(--text-lo); min-height: .24rem; }
|
||||
.eqr__hint b { color: var(--text-hi); }
|
||||
.eqr__ok-icon { width: .2rem; height: .2rem; margin-right: .06rem; vertical-align: -.03rem; filter: brightness(0) invert(1); }
|
||||
@@ -0,0 +1,224 @@
|
||||
/* ==========================================================================================
|
||||
screens/game-shop.css — bottom shop bar (js/ui/shopBar.js) + merge reward overlay (rewardOverlay.js).
|
||||
Research 06 §11.2: LEVEL card, operator cards (tier chip, price hexagon, half-body art, bond & class
|
||||
rows, icy frozen overlay), item card, funds card with ✕ 收起; 冻结 (ice) / 刷新 (amber) above.
|
||||
========================================================================================== */
|
||||
|
||||
.shopbar {
|
||||
position: absolute; right: .26rem; bottom: .2rem;
|
||||
display: flex; flex-direction: column; align-items: flex-end; gap: .1rem;
|
||||
animation: shop-up var(--t-slow) var(--ease-out);
|
||||
}
|
||||
@keyframes shop-up { from { opacity: 0; transform: translateY(.3rem); } }
|
||||
/* Official layout (research 06 §11.2 / D3): "剩余可放置角色: N" on its own line, right-aligned ABOVE [冻结] [刷新]. On one
|
||||
line the block reached over the bench's last pads (整备区 slot 9 at 16:9 under the official shop camera). Only the
|
||||
bar's parts take the pointer: its box spans the empty space left of the tools, which used to swallow drags and taps
|
||||
on bench slots 5–9. */
|
||||
.gm__hud > .shopbar { pointer-events: none; }
|
||||
.shopbar__row, .shopbar__tools > button { pointer-events: auto; }
|
||||
.shopbar__tools { display: grid; grid-template-columns: auto auto; justify-content: end; align-items: center; gap: .06rem .12rem; }
|
||||
.shopbar__remain {
|
||||
grid-column: 1 / -1; justify-self: end; pointer-events: none;
|
||||
font-size: .16rem; color: var(--text-md); padding: .04rem .14rem; background: rgba(8, 11, 10, .78);
|
||||
border-left: 3px solid var(--mint-500);
|
||||
}
|
||||
.shopbar__remain b { color: var(--mint-400); font-size: .2rem; margin-left: .04rem; }
|
||||
.toolbtn {
|
||||
--tb: var(--ice);
|
||||
display: flex; align-items: center; gap: .08rem; height: .48rem; padding: 0 .14rem 0 .08rem;
|
||||
background: rgba(8, 11, 10, .9); border: 2px solid var(--tb); color: var(--tb); font-size: .19rem; font-weight: 700; letter-spacing: .1em;
|
||||
box-shadow: 0 .04rem .14rem rgba(0, 0, 0, .45);
|
||||
transition: background var(--t-fast), box-shadow var(--t-fast), transform var(--t-fast);
|
||||
}
|
||||
.toolbtn:hover:not(:disabled) { background: rgba(8, 11, 10, .9); background: color-mix(in srgb, var(--tb) 16%, rgba(8, 11, 10, .9)); box-shadow: 0 0 .18rem transparent; box-shadow: 0 0 .18rem color-mix(in srgb, var(--tb) 40%, transparent); }
|
||||
.toolbtn:active:not(:disabled) { transform: translateY(1px); }
|
||||
.toolbtn:disabled { --tb: var(--line-3); color: var(--text-dim); cursor: not-allowed; }
|
||||
.toolbtn__img { width: .34rem; height: .34rem; object-fit: contain; }
|
||||
.toolbtn .icon { width: .24rem; height: .24rem; }
|
||||
.toolbtn--amber { --tb: var(--amber); }
|
||||
.toolbtn--ice.is-on { background: var(--ice); color: #0b1822; }
|
||||
.toolbtn--ice.is-on kbd { color: #28435a; border-color: #5d88aa; }
|
||||
.toolbtn--ice.is-on:hover:not(:disabled) { background: #c2e5ff; color: #0b1822; box-shadow: 0 0 .22rem rgba(159, 212, 255, .6); }
|
||||
.toolbtn--ice.is-on kbd { background: rgba(255, 255, 255, .35) !important; }
|
||||
.toolbtn__free { font-size: .13rem; padding: .01rem .06rem; background: var(--mint-500); color: var(--text-on-mint); letter-spacing: 0; }
|
||||
.toolbtn .hex { --hex-h: .26rem; }
|
||||
|
||||
.shopbar__row {
|
||||
position: relative; display: flex; align-items: stretch; gap: .08rem; padding: .1rem;
|
||||
background: linear-gradient(180deg, rgba(14, 19, 17, .94), rgba(8, 11, 10, .97));
|
||||
border: 1px solid var(--line-2); border-top: 2px solid var(--mint-700);
|
||||
box-shadow: 0 -.04rem .3rem rgba(0, 0, 0, .55);
|
||||
}
|
||||
.shopbar__row::before {
|
||||
content: ''; position: absolute; left: 0; right: 0; top: -2px; height: 2px;
|
||||
background: linear-gradient(90deg, var(--mint-400), transparent 30%, transparent 70%, var(--mint-400));
|
||||
}
|
||||
.shopbar__cards { display: flex; gap: .08rem; }
|
||||
.shopbar__item { display: flex; gap: .08rem; padding-left: .08rem; border-left: 1px dashed var(--line-2); }
|
||||
.shopbar.is-frozen .shopbar__row { border-color: rgba(159, 212, 255, .5); border-top-color: var(--ice); }
|
||||
.shopbar.is-locked .scard:not(.scard--sold) { filter: saturate(.55) brightness(.8); }
|
||||
|
||||
/* ---- level card ---- */
|
||||
.lvcard {
|
||||
position: relative; width: 1.24rem; height: 2.24rem; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .12rem;
|
||||
padding: .2rem .1rem .1rem; background: linear-gradient(180deg, #5fe0b9, #36b690); border: 0; color: var(--text-on-mint);
|
||||
clip-path: polygon(0 0, 100% 0, 100% calc(100% - .14rem), calc(100% - .14rem) 100%, 0 100%);
|
||||
transition: filter var(--t-fast), transform var(--t-fast);
|
||||
}
|
||||
.lvcard:hover:not(.is-disabled) { filter: brightness(1.08); }
|
||||
.lvcard:active:not(.is-disabled) { transform: translateY(1px); }
|
||||
.lvcard__price { position: absolute; top: .08rem; left: 50%; transform: translateX(-50%); }
|
||||
.lvcard__frame { position: relative; display: flex; flex-direction: column; align-items: center; padding: .04rem .16rem .02rem; border: 2px solid rgba(6, 17, 13, .75); }
|
||||
.lvcard__frame::before, .lvcard__frame::after { content: ''; position: absolute; width: .1rem; height: .1rem; border: 2px solid var(--text-on-mint); }
|
||||
.lvcard__frame::before { left: -.06rem; top: -.06rem; border-right: 0; border-bottom: 0; }
|
||||
.lvcard__frame::after { right: -.06rem; bottom: -.06rem; border-left: 0; border-top: 0; }
|
||||
.lvcard__micro { font-family: var(--font-display); font-size: .12rem; letter-spacing: .24em; font-weight: 700; }
|
||||
.lvcard__num { font-size: .66rem; line-height: .9; font-weight: 700; }
|
||||
.lvcard__label { font-size: .2rem; font-weight: 900; letter-spacing: .3em; padding-left: .3em; }
|
||||
.lvcard__key { position: absolute; right: .08rem; bottom: .06rem; color: var(--mint-900) !important; border-color: rgba(6, 17, 13, .35) !important; background: transparent !important; }
|
||||
.lvcard.is-disabled { background: linear-gradient(180deg, #3a4a44, #2a3531); color: #8fa59c; cursor: not-allowed; }
|
||||
.lvcard.is-disabled .lvcard__frame { border-color: rgba(143, 165, 156, .5); }
|
||||
.lvcard.is-disabled .lvcard__frame::before, .lvcard.is-disabled .lvcard__frame::after { border-color: #8fa59c; }
|
||||
.lvcard.is-max { background: linear-gradient(180deg, #d9b24a, #a07a1c); color: #1d1400; cursor: default; filter: none; }
|
||||
|
||||
/* ---- operator / item card ---- */
|
||||
.scard-wrap { display: flex; }
|
||||
.scard {
|
||||
--tc: var(--tier-1);
|
||||
position: relative; width: 1.56rem; height: 2.24rem; padding: 0; overflow: hidden; text-align: left;
|
||||
display: flex; flex-direction: column; justify-content: flex-end;
|
||||
background: #151a18; border: 1px solid rgba(78, 216, 175, .35);
|
||||
transition: transform var(--t-fast) var(--ease-out), border-color var(--t-fast), box-shadow var(--t-fast);
|
||||
}
|
||||
.scard--t1 { --tc: var(--tier-1); } .scard--t2 { --tc: var(--tier-2); } .scard--t3 { --tc: var(--tier-3); }
|
||||
.scard--t4 { --tc: var(--tier-4); } .scard--t5 { --tc: var(--tier-5); } .scard--t6 { --tc: var(--tier-6); }
|
||||
.scard__bg { position: absolute; inset: 0;
|
||||
background: linear-gradient(180deg, #1c2320, #0f1311); /* fallback: no color-mix() (Safari < 16.2) */
|
||||
background:
|
||||
radial-gradient(120% 70% at 80% 30%, color-mix(in srgb, var(--tc) 28%, transparent), transparent 70%),
|
||||
linear-gradient(180deg, #1c2320, #0f1311); }
|
||||
.scard__water { position: absolute; left: -.2rem; top: .34rem; width: 1.1rem; height: 1.1rem; opacity: .1; }
|
||||
.scard__water .bglyph { width: 100%; height: 100%; }
|
||||
.scard__art { position: absolute; right: -.14rem; top: 0; height: 100%; width: auto; max-width: none; object-fit: cover; pointer-events: none;
|
||||
-webkit-mask-image: linear-gradient(180deg, #000 55%, transparent 88%); mask-image: linear-gradient(180deg, #000 55%, transparent 88%); }
|
||||
.scard__top { position: absolute; left: .06rem; right: .06rem; top: .06rem; display: flex; align-items: flex-start; justify-content: space-between; z-index: 2; }
|
||||
.scard__price { position: absolute; left: 50%; top: 0; transform: translateX(-50%); filter: drop-shadow(0 1px 3px #000); }
|
||||
.scard__free { position: absolute; left: 50%; top: .02rem; transform: translateX(-50%); font-family: var(--font-num); font-weight: 700; font-size: .16rem; letter-spacing: .1em; color: var(--text-on-mint); background: var(--mint-400); padding: 0 .1rem; clip-path: polygon(.08rem 0, calc(100% - .08rem) 0, 100% 50%, calc(100% - .08rem) 100%, .08rem 100%, 0 50%); }
|
||||
.scard__pips { display: flex; gap: .03rem; padding: .03rem .04rem; background: rgba(0, 0, 0, .6); }
|
||||
.scard__pips i { width: .07rem; height: .07rem; border: 1px solid var(--gold); transform: rotate(45deg); }
|
||||
.scard__pips i.on { background: var(--gold); }
|
||||
.scard__body { position: relative; z-index: 2; display: flex; flex-direction: column; gap: .03rem; padding: .3rem .08rem .08rem; background: linear-gradient(0deg, rgba(8, 11, 10, .98) 60%, transparent); }
|
||||
/* the loadout's skill (DESIGN §16) above the name; mint frame = not the default skill */
|
||||
.scard__skill { position: absolute; right: .07rem; top: -.02rem; width: .3rem; height: .3rem; display: grid; place-items: center;
|
||||
background: #0a0d0c; border: 1px solid var(--line-3); box-shadow: 0 1px 3px rgba(0, 0, 0, .8); }
|
||||
.scard__skill img { width: 100%; height: 100%; object-fit: cover; }
|
||||
.scard__skill .icon { width: .18rem; height: .18rem; color: var(--gold); }
|
||||
/* a chosen skill without an icon in the asset manifest: its slot letter */
|
||||
.scard__sglyph { font-family: var(--font-display); font-size: .13rem; font-weight: 700; letter-spacing: .02em; color: var(--mint-400); }
|
||||
.scard__skill.is-custom { border-color: var(--mint-400); box-shadow: 0 0 0 1px var(--mint-500), 0 0 .08rem rgba(23, 249, 183, .5); }
|
||||
.scard__skill.is-custom::after { content: ''; position: absolute; right: -.04rem; top: -.04rem; width: .08rem; height: .08rem; background: var(--mint-400); transform: rotate(45deg); }
|
||||
.scard__mod { position: absolute; right: 100%; bottom: 0; margin-right: .03rem; display: flex; align-items: center; gap: .02rem; font-family: var(--font-display); font-size: .1rem; line-height: 1.4; padding: 0 .04rem; background: rgba(0, 0, 0, .75); color: var(--gold-2); white-space: nowrap; }
|
||||
/* the official module type icon (local-client art, DESIGN §13); the type text stays beside it */
|
||||
.scard__skill .scard__modicon { flex: none; width: .14rem; height: .14rem; object-fit: contain; }
|
||||
.scard__name { font-size: .19rem; font-weight: 900; letter-spacing: .04em; color: #fff; text-shadow: 0 1px 3px #000; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
||||
.scard__bonds { display: flex; flex-wrap: wrap; gap: .02rem .08rem; }
|
||||
.scard__bond { display: inline-flex; align-items: center; gap: .03rem; font-size: .13rem; color: var(--mint-400); }
|
||||
.scard__bond .bglyph { width: .18rem; height: .18rem; }
|
||||
.scard__class { display: flex; align-items: center; gap: .05rem; font-size: .13rem; color: var(--text-lo); }
|
||||
.scard__prof { width: .18rem; height: .18rem; object-fit: contain; opacity: .85; }
|
||||
.scard__detail { position: absolute; right: .04rem; bottom: .04rem; z-index: 3; width: .24rem; height: .24rem; display: grid; place-items: center; color: var(--text-dim); opacity: 0; transition: opacity var(--t-fast), color var(--t-fast); cursor: help; }
|
||||
.scard__detail .icon { width: .18rem; height: .18rem; }
|
||||
.scard:hover .scard__detail { opacity: 1; }
|
||||
.scard__detail:hover { color: var(--mint-400); }
|
||||
.scard__mergetag { position: absolute; z-index: 3; right: 0; top: .38rem; font-size: .12rem; font-weight: 700; padding: .01rem .06rem; background: var(--gold); color: #1d1400; letter-spacing: .08em; }
|
||||
.scard:not(.is-disabled):not(.scard--sold):hover { transform: translateY(-.08rem); border-color: var(--mint-400); box-shadow: 0 0 0 1px var(--mint-400), 0 .1rem .24rem rgba(23, 249, 183, .22); }
|
||||
.scard:not(.is-disabled):not(.scard--sold):active { transform: translateY(-.04rem); }
|
||||
.scard.is-disabled { cursor: not-allowed; }
|
||||
.scard.is-disabled .scard__art, .scard.is-disabled .scard__itemart { filter: grayscale(.7) brightness(.6); }
|
||||
.scard.is-merge { border-color: var(--gold); box-shadow: 0 0 0 1px rgba(255, 198, 0, .6), 0 0 .2rem rgba(255, 198, 0, .3); }
|
||||
.scard.is-frozen::after { content: ''; position: absolute; inset: 0; z-index: 2; pointer-events: none;
|
||||
background: linear-gradient(180deg, rgba(159, 212, 255, .28), rgba(159, 212, 255, .12) 50%, rgba(159, 212, 255, .34));
|
||||
box-shadow: inset 0 0 0 2px rgba(159, 212, 255, .8), inset 0 0 .3rem rgba(159, 212, 255, .5); }
|
||||
.scard__ice { position: absolute; left: 50%; bottom: .06rem; transform: translateX(-50%); z-index: 4; width: .3rem; height: .3rem; display: grid; place-items: center; background: #0c1a26; border: 1px solid var(--ice); color: var(--ice); }
|
||||
.scard__ice .icon { width: .2rem; height: .2rem; }
|
||||
.scard--item { --tc: var(--gold-2); }
|
||||
.scard__itemart { position: absolute; left: 50%; top: .38rem; transform: translateX(-50%); width: 1rem; height: 1rem; display: grid; place-items: center;
|
||||
background: radial-gradient(circle, rgba(255, 198, 0, .16), transparent 70%); }
|
||||
.scard__itemart img { width: 100%; height: 100%; object-fit: contain; filter: drop-shadow(0 .04rem .08rem #000); }
|
||||
.scard__itemart .icon { width: .6rem; height: .6rem; color: var(--gold-2); }
|
||||
.scard__idesc { font-size: .12rem; line-height: 1.45; color: var(--text-lo); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
|
||||
.scard--sold { background: repeating-linear-gradient(135deg, rgba(255, 255, 255, .02) 0 .08rem, transparent .08rem .16rem), rgba(8, 11, 10, .75); border: 1px dashed var(--line-2); justify-content: center; align-items: center; }
|
||||
.scard__soldtxt { display: flex; flex-direction: column; align-items: center; gap: .02rem; font-size: .16rem; color: var(--text-dim); }
|
||||
|
||||
/* ---- funds card ---- */
|
||||
.funds { width: 1.18rem; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .08rem; padding: .06rem; border-left: 1px solid var(--line); }
|
||||
.funds__hex {
|
||||
position: relative; width: 1rem; height: .9rem; display: flex; flex-direction: column; align-items: center; justify-content: center;
|
||||
background: linear-gradient(180deg, #2b2410, #16120a); color: var(--gold);
|
||||
clip-path: polygon(25% 0, 75% 0, 100% 50%, 75% 100%, 25% 100%, 0 50%);
|
||||
}
|
||||
.funds__hex::before { content: ''; position: absolute; inset: 2px; clip-path: inherit; border: 0; background: transparent; box-shadow: inset 0 0 0 2px var(--gold); }
|
||||
.funds__coin { width: .34rem; height: .34rem; fill: var(--gold); filter: drop-shadow(0 0 .06rem rgba(255, 198, 0, .6)); }
|
||||
.funds__num { font-size: .36rem; line-height: 1; font-weight: 700; color: #fff; }
|
||||
.funds__label { font-size: .14rem; color: var(--text-lo); letter-spacing: .1em; }
|
||||
.funds__collapse { display: flex; align-items: center; gap: .04rem; font-size: .15rem; background: none; border: 1px solid var(--line-2); color: var(--text-lo); padding: .02rem .1rem; }
|
||||
.funds__collapse .icon { width: .14rem; height: .14rem; }
|
||||
.funds__collapse:hover { color: var(--text-hi); border-color: var(--line-3); }
|
||||
.coin-glyph { fill: var(--gold); }
|
||||
|
||||
/* collapsed tab */
|
||||
.shopbar-tab { position: absolute; right: .26rem; bottom: .2rem; display: flex; align-items: center; gap: .1rem; padding: .08rem; background: rgba(8, 11, 10, .92); border: 1px solid var(--line-2); border-top: 2px solid var(--mint-700); }
|
||||
.shopbar-tab__funds { display: flex; align-items: center; gap: .06rem; padding: 0 .1rem; }
|
||||
.shopbar-tab__funds .coin-glyph { width: .26rem; height: .26rem; }
|
||||
.shopbar-tab__funds b { font-size: .28rem; }
|
||||
.shopbar-tab__btn { display: flex; align-items: center; gap: .04rem; height: .44rem; padding: 0 .16rem; background: var(--mint-500); color: var(--text-on-mint); border: 0; font-size: .17rem; font-weight: 700; letter-spacing: .1em; }
|
||||
.shopbar-tab__btn .icon { width: .18rem; height: .18rem; transform: rotate(90deg); }
|
||||
|
||||
/* (no drag-to-sell zone: selling is the underframe's 出售 +N button — research 09 §5) */
|
||||
|
||||
/* ---- merge reward (inline: replaces the operator cards) ---- */
|
||||
.shopbar__reward { display: flex; gap: .08rem; padding: 0 .08rem 0 0; position: relative; animation: pop-in var(--t-slow) var(--ease-out); }
|
||||
.shopbar__reward::before { content: ''; position: absolute; inset: -.06rem -.04rem; border: 1px solid rgba(255, 198, 0, .55);
|
||||
box-shadow: 0 0 .24rem rgba(255, 198, 0, .18), inset 0 0 .3rem rgba(255, 198, 0, .08); pointer-events: none; }
|
||||
.rwtag {
|
||||
width: .92rem; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .06rem; padding: .08rem .04rem;
|
||||
background: linear-gradient(180deg, rgba(255, 198, 0, .22), rgba(255, 198, 0, .06)); color: var(--gold); text-align: center;
|
||||
}
|
||||
.rwtag__icon { width: .34rem; height: .34rem; filter: drop-shadow(0 0 .08rem rgba(255, 198, 0, .6)); }
|
||||
.rwtag__title { writing-mode: vertical-rl; font-size: .22rem; font-weight: 900; letter-spacing: .2em; line-height: 1; }
|
||||
.rwtag__micro { font-family: var(--font-display); font-size: .09rem; letter-spacing: .14em; opacity: .75; }
|
||||
.rwtag__sub { font-size: .12rem; color: var(--text-md); line-height: 1.3; }
|
||||
.rwtag__later { display: flex; align-items: center; gap: .02rem; margin-top: .04rem; padding: .02rem .08rem; font-size: .13rem; color: var(--text-lo);
|
||||
background: rgba(0, 0, 0, .35); border: 1px solid var(--line-2); }
|
||||
.rwtag__later .icon { width: .12rem; height: .12rem; }
|
||||
.rwtag__later:hover { color: var(--text-hi); border-color: var(--line-3); }
|
||||
.shopbar__rwcards { display: flex; gap: .08rem; }
|
||||
.shopbar__rwcards .scard { border-color: rgba(255, 198, 0, .5); }
|
||||
.shopbar.has-reward .shopbar__row { border-top-color: var(--gold); }
|
||||
.rewardpill {
|
||||
position: absolute; right: .26rem; bottom: 3.26rem; z-index: 6; display: flex; align-items: center; gap: .08rem; padding: .08rem .16rem;
|
||||
background: rgba(24, 18, 4, .95); border: 1px solid var(--gold); color: var(--gold); font-size: .17rem; font-weight: 700;
|
||||
animation: pulse-gold 1.6s ease-in-out infinite;
|
||||
}
|
||||
.rewardpill .icon { width: .2rem; height: .2rem; }
|
||||
@keyframes pulse-gold { 50% { box-shadow: 0 0 .24rem rgba(255, 198, 0, .5); } }
|
||||
|
||||
/* ---- two-tap buy / upgrade (research 09 §5): the first tap lifts + enlarges the card and shows 确认购买 ---- */
|
||||
.scard.is-armed {
|
||||
z-index: 3; transform: translateY(-.16rem) scale(1.08) !important; border-color: var(--gold);
|
||||
box-shadow: 0 0 0 2px var(--gold), 0 .14rem .32rem rgba(0, 0, 0, .65), 0 0 .3rem rgba(255, 198, 0, .35) !important;
|
||||
}
|
||||
.scard.is-armed.is-disabled { border-color: var(--red-premium); box-shadow: 0 0 0 2px var(--red-premium), 0 .14rem .32rem rgba(0, 0, 0, .65) !important; }
|
||||
.scard__confirm {
|
||||
position: absolute; left: 0; right: 0; bottom: 0; z-index: 4; display: flex; flex-direction: column; align-items: center; gap: 0;
|
||||
padding: .05rem 0 .04rem; background: linear-gradient(0deg, var(--gold), #e0a800); color: #1d1400; pointer-events: none;
|
||||
animation: confirm-in var(--t-fast) var(--ease-out);
|
||||
}
|
||||
@keyframes confirm-in { from { transform: translateY(100%); } }
|
||||
.scard__confirm b { font-size: .18rem; font-weight: 900; letter-spacing: .22em; padding-left: .22em; }
|
||||
.scard__confirm small { font-size: .11rem; letter-spacing: .1em; opacity: .75; }
|
||||
.scard__confirm.is-no { background: linear-gradient(0deg, #54150f, #34100c); color: var(--red-premium); }
|
||||
.scard__confirm.is-no small { opacity: 1; color: #ffb0a6; max-width: 100%; padding: 0 .06rem; text-align: center; white-space: normal; }
|
||||
.shopbar.has-armed .scard:not(.is-armed):not(.scard--sold) { filter: brightness(.72); }
|
||||
.lvcard.is-armed { background: linear-gradient(180deg, #ffd65a, #e0a800); color: #1d1400; box-shadow: 0 0 0 2px #fff4c2, 0 0 .3rem rgba(255, 198, 0, .5); animation: pulse-gold 1.1s var(--ease-in-out) infinite; }
|
||||
.lvcard.is-armed .lvcard__label { letter-spacing: .12em; padding-left: .12em; }
|
||||
@@ -0,0 +1,560 @@
|
||||
/* ==========================================================================================
|
||||
screens/game.css — in-match screen layout & HUD (js/screens/game.js, js/ui/hud.js, bondStrip.js,
|
||||
teamPanel.js, emotes.js, ticker.js, effectsList.js, combatHud.js, settings.js, matchChrome.js,
|
||||
fallbackField.js). Shop: game-shop.css. Panels / overlays / rich text: game-panels.css.
|
||||
Sizes in rem (1rem = 100 design px at 1920×1080).
|
||||
========================================================================================== */
|
||||
|
||||
/* ---- screen shell ---------------------------------------------------------------------------- */
|
||||
.gm { background: transparent; }
|
||||
.gm__field { position: absolute; inset: 0; z-index: 0; overflow: hidden; }
|
||||
.gm__field canvas { display: block; }
|
||||
.gm__vignette {
|
||||
position: absolute; inset: 0; z-index: 1; pointer-events: none;
|
||||
background:
|
||||
linear-gradient(180deg, rgba(6, 9, 8, .78) 0%, rgba(6, 9, 8, 0) 18%),
|
||||
linear-gradient(0deg, rgba(6, 9, 8, .6) 0%, rgba(6, 9, 8, 0) 22%),
|
||||
radial-gradient(120% 90% at 45% 50%, transparent 60%, rgba(0, 0, 0, .5) 100%);
|
||||
}
|
||||
.gm__loading { position: absolute; inset: 0; z-index: 2; display: grid; place-items: center; pointer-events: none; }
|
||||
.gm__hud { position: absolute; inset: 0; z-index: 3; pointer-events: none; }
|
||||
.gm__hud > * { pointer-events: auto; }
|
||||
.gload { align-items: center; justify-content: center; gap: .2rem; }
|
||||
|
||||
/* ---- top bar -------------------------------------------------------------------------------------- */
|
||||
.gtop {
|
||||
position: absolute; left: 0; right: 0; top: 0;
|
||||
display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: start;
|
||||
padding: .2rem .3rem 0 .26rem; gap: .2rem; pointer-events: none;
|
||||
}
|
||||
.gtop > * { pointer-events: auto; }
|
||||
.gtop__left { display: flex; align-items: center; gap: .16rem; }
|
||||
.gtop__meta { display: flex; flex-direction: column; align-items: flex-start; gap: .06rem; }
|
||||
.gtop__exit { box-shadow: 0 .06rem .2rem rgba(0, 0, 0, .5); }
|
||||
.gtop__center {
|
||||
--bk-c: var(--mint-700);
|
||||
display: flex; align-items: center; gap: .18rem;
|
||||
height: .78rem; padding: 0 .24rem 0 .14rem; margin-top: .02rem;
|
||||
background: linear-gradient(180deg, rgba(10, 14, 12, .92), rgba(10, 14, 12, .78));
|
||||
border: 1px solid var(--line);
|
||||
box-shadow: 0 .08rem .28rem rgba(0, 0, 0, .45);
|
||||
position: relative;
|
||||
}
|
||||
/* the two official 🔍 buttons (ui/hud.js CheckBtn): btn_check_player (mint, left) and btn_check_enemy (amber, right);
|
||||
sprites are 35×29 (plain) / 61×29 (with chevrons) → .555rem / .967rem × .46rem */
|
||||
.gtop__iconbtn {
|
||||
display: flex; align-items: center; justify-content: center; gap: .04rem; min-width: .46rem; height: .46rem; padding: 0 .1rem;
|
||||
background: rgba(78, 216, 175, .06); border: 2px solid var(--mint-600); border-radius: .06rem; color: #fff;
|
||||
font-family: var(--font-num); font-weight: 700;
|
||||
transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast), filter var(--t-fast), opacity var(--t-fast);
|
||||
}
|
||||
.gtop__iconbtn .icon { width: .24rem; height: .24rem; }
|
||||
.gtop__iconbtn:hover, .gtop__iconbtn.is-on { background: var(--mint-a20); color: var(--mint-400); border-color: var(--mint-500); }
|
||||
.gtop__iconbtn.is-on:not(.has-sprite) { opacity: .6; }
|
||||
.gtop__iconbtn .enemybtn__chev { color: #fff; }
|
||||
.gtop__right { display: flex; flex-direction: column; align-items: flex-end; gap: .1rem; justify-self: end; }
|
||||
.gtop__right .countdown { --cd-h: .7rem; filter: drop-shadow(0 0 .12rem rgba(0, 0, 0, .8)); }
|
||||
.gtop__clock { display: flex; align-items: flex-start; gap: .14rem; }
|
||||
|
||||
/* solo pause / resume (ui/hud.js PauseButton, official battle pause: two bars on a dark square) */
|
||||
.pausebtn {
|
||||
display: grid; place-items: center; width: .6rem; height: .6rem; flex: none;
|
||||
background: rgba(10, 14, 12, .88); border: 2px solid rgba(242, 242, 242, .75); color: #fff;
|
||||
box-shadow: 0 .04rem .16rem rgba(0, 0, 0, .55);
|
||||
transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast), box-shadow var(--t-fast);
|
||||
}
|
||||
.pausebtn__glyph { width: .3rem; height: .3rem; fill: currentColor; }
|
||||
.pausebtn:hover:not(:disabled) { background: rgba(255, 255, 255, .14); border-color: #fff; }
|
||||
.pausebtn.is-on { background: var(--mint-500); border-color: var(--mint-400); color: var(--text-on-mint); box-shadow: 0 0 .22rem rgba(23, 249, 183, .45); }
|
||||
.pausebtn.is-busy { opacity: .6; }
|
||||
|
||||
/* boss-round overtime warning (ui/hud.js OvertimeWarning; red DOT look: official icon_warn / blood_icon + bg_lose_hp) */
|
||||
.otwarn {
|
||||
position: relative; display: flex; align-items: center; gap: .08rem; height: .38rem; padding: 0 .14rem 0 .1rem;
|
||||
background: linear-gradient(90deg, rgba(120, 10, 14, .92), rgba(40, 6, 8, .88)); border: 1px solid rgba(255, 84, 84, .7);
|
||||
color: #ffdede; font-size: .16rem; white-space: nowrap; box-shadow: 0 0 .18rem rgba(255, 36, 36, .35);
|
||||
animation: ot-in var(--t-slow) var(--ease-out);
|
||||
}
|
||||
.otwarn__icon { width: .24rem; height: .24rem; object-fit: contain; flex: none; color: var(--red-premium); }
|
||||
.otwarn__tag { font-family: var(--font-num); font-size: .13rem; font-weight: 700; letter-spacing: .1em; padding: 0 .05rem; background: #e2262a; color: #fff; line-height: 1.35; }
|
||||
.otwarn__txt b { color: #fff; font-size: .2rem; }
|
||||
.otwarn__lost { font-size: .13rem; color: rgba(255, 222, 222, .75); }
|
||||
.otwarn__lost b { color: #fff; }
|
||||
.otwarn--pending { border-style: dashed; }
|
||||
.otwarn--pending .otwarn__icon { animation: blink 1s steps(2, end) infinite; }
|
||||
.otwarn--drain { animation: ot-in var(--t-slow) var(--ease-out), ot-pulse 1s ease-in-out infinite; }
|
||||
.otwarn__blood { display: grid; place-items: center; width: .5rem; height: .28rem; flex: none; background: radial-gradient(closest-side, rgba(255, 40, 40, .9), rgba(255, 40, 40, 0)); }
|
||||
.otwarn--drain .otwarn__icon { color: #fff; }
|
||||
.otwarn__tick {
|
||||
position: absolute; left: .18rem; top: -.04rem; font-size: .2rem; font-weight: 700; color: var(--red-premium);
|
||||
text-shadow: 0 0 .06rem rgba(0, 0, 0, .9); pointer-events: none; animation: ot-tick 1s var(--ease-out) forwards;
|
||||
}
|
||||
@keyframes ot-in { from { opacity: 0; transform: translateY(-.06rem); } }
|
||||
@keyframes ot-pulse { 0%, 100% { box-shadow: 0 0 .12rem rgba(255, 36, 36, .3); } 50% { box-shadow: 0 0 .32rem rgba(255, 36, 36, .75); border-color: #ff6a6a; } }
|
||||
@keyframes ot-tick { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(-.3rem); } }
|
||||
@media (prefers-reduced-motion: reduce) { .otwarn, .otwarn--drain, .otwarn__tick, .otwarn--pending .otwarn__icon { animation: none; } }
|
||||
|
||||
.roundbox { display: flex; align-items: center; gap: .08rem; }
|
||||
.roundbox__label { font-size: .16rem; color: var(--text-lo); letter-spacing: .08em; }
|
||||
.roundbox__num {
|
||||
min-width: .54rem; height: .44rem; display: grid; place-items: center; padding: 0 .08rem;
|
||||
background: #eef3f1; color: #0b0f0d; font-size: .32rem; font-weight: 700; line-height: 1;
|
||||
clip-path: polygon(.06rem 0, 100% 0, 100% calc(100% - .06rem), calc(100% - .06rem) 100%, 0 100%, 0 .06rem);
|
||||
}
|
||||
|
||||
/* phase capsule */
|
||||
.capsule {
|
||||
--cap: var(--mint-500);
|
||||
display: flex; align-items: center; gap: .1rem; height: .5rem; min-width: 2.2rem; padding: 0 .22rem 0 .12rem;
|
||||
border: 2px solid var(--cap); border-radius: .25rem;
|
||||
background: linear-gradient(90deg, transparent, rgba(0, 0, 0, .25)); background: linear-gradient(90deg, color-mix(in srgb, var(--cap) 16%, transparent), rgba(0, 0, 0, .25));
|
||||
box-shadow: inset 0 0 .14rem transparent, 0 0 .16rem transparent; box-shadow: inset 0 0 .14rem color-mix(in srgb, var(--cap) 30%, transparent), 0 0 .16rem color-mix(in srgb, var(--cap) 25%, transparent);
|
||||
white-space: nowrap;
|
||||
}
|
||||
.capsule__icon { width: .36rem; height: .36rem; object-fit: contain; color: var(--cap); flex: none; }
|
||||
.capsule__label { font-size: .21rem; font-weight: 700; letter-spacing: .12em; color: var(--text-hi); }
|
||||
.capsule__kills { font-size: .26rem; color: var(--text-lo); letter-spacing: .04em; }
|
||||
.capsule__kills b { color: #fff; font-size: .3rem; }
|
||||
.capsule__tag { font-size: .14rem; padding: .01rem .08rem; background: var(--orange); color: #1a0800; font-weight: 700; letter-spacing: .1em; }
|
||||
.capsule--combat { --cap: var(--orange-hi); }
|
||||
.capsule--boss { --cap: var(--orange-hi); min-width: 4.2rem; }
|
||||
.bossbar { position: relative; flex: 1; min-width: 2.2rem; height: .2rem; background: rgba(0, 0, 0, .6); border: 1px solid rgba(255, 122, 51, .5); overflow: hidden; }
|
||||
.bossbar__fill { position: absolute; inset: 0 auto 0 0; background: linear-gradient(90deg, #b8340d, var(--orange-hi)); box-shadow: 0 0 .1rem rgba(255, 110, 40, .8); transition: width 300ms var(--ease-out); }
|
||||
.bossbar__txt { position: absolute; inset: 0; display: grid; place-items: center; font-size: .14rem; font-weight: 700; color: #fff; text-shadow: 0 1px 2px #000; }
|
||||
|
||||
/* LP tower */
|
||||
.lp { display: inline-flex; align-items: center; gap: .05rem; color: var(--mint-400); white-space: nowrap; }
|
||||
.lp__icon { width: 1.1em; height: 1.1em; object-fit: contain; flex: none; }
|
||||
.lp b { font-weight: 700; line-height: 1; }
|
||||
.lp--sm { font-size: .19rem; }
|
||||
.lp--md { font-size: .24rem; }
|
||||
.lp--lg { font-size: .34rem; }
|
||||
.lp--lg .lp__icon { width: .42rem; height: .42rem; }
|
||||
.lp--danger { color: var(--red-premium); }
|
||||
.lp--danger .lp__icon { filter: hue-rotate(-140deg) saturate(2.4) brightness(.95); }
|
||||
.lp--team { color: var(--mint-glow); }
|
||||
|
||||
/* enemy preview button: amber [🔍▶▶] → the pen (research 09 §2); grey [🔍] in the pen view and outside 休整期 */
|
||||
.enemybtn {
|
||||
display: flex; align-items: center; justify-content: center; gap: .06rem; min-width: .46rem; height: .46rem; padding: 0 .14rem;
|
||||
background: rgba(20, 16, 10, .85); border: 2px solid var(--amber); border-radius: .06rem; color: #fff;
|
||||
font-family: var(--font-num); font-size: .16rem; letter-spacing: -.1em; font-weight: 700;
|
||||
transition: background var(--t-fast), box-shadow var(--t-fast), filter var(--t-fast), opacity var(--t-fast);
|
||||
}
|
||||
.enemybtn .icon { width: .24rem; height: .24rem; }
|
||||
.enemybtn__chev { font-size: .18rem; letter-spacing: -.12em; margin-left: .02rem; }
|
||||
.enemybtn:hover:not(.is-grey) { background: rgba(246, 163, 41, .2); box-shadow: 0 0 .16rem rgba(246, 163, 41, .35); }
|
||||
.enemybtn.is-grey { border-color: rgba(246, 163, 41, .32); color: rgba(255, 255, 255, .35); background: rgba(20, 20, 20, .8); }
|
||||
.enemybtn[aria-disabled="true"] { cursor: not-allowed; }
|
||||
/* official sprites: the picture is the whole button */
|
||||
.gtop__iconbtn.has-sprite, .enemybtn.has-sprite {
|
||||
width: .555rem; min-width: 0; height: .46rem; padding: 0; border: 0; border-radius: 0; box-shadow: none;
|
||||
background: var(--chk-sprite) center / 100% 100% no-repeat;
|
||||
}
|
||||
.gtop__iconbtn.has-sprite.is-wide, .enemybtn.has-sprite.is-wide { width: .967rem; }
|
||||
.gtop__iconbtn.has-sprite:hover, .enemybtn.has-sprite:hover:not(.is-grey) { background: var(--chk-sprite) center / 100% 100% no-repeat; filter: brightness(1.2); box-shadow: none; }
|
||||
.gtop__iconbtn.has-sprite.is-on { background: var(--chk-sprite) center / 100% 100% no-repeat; }
|
||||
|
||||
/* ready toggle */
|
||||
.readywrap { display: flex; flex-direction: column; align-items: flex-end; gap: .05rem; }
|
||||
.readywrap__count { font-size: .14rem; color: var(--text-lo); }
|
||||
.readywrap__count b { color: var(--mint-400); font-size: .17rem; }
|
||||
.readybtn {
|
||||
display: flex; align-items: center; gap: .12rem; height: .56rem; padding: 0 .16rem 0 .12rem; min-width: 2.3rem;
|
||||
background: rgba(10, 14, 12, .9); border: 2px solid var(--mint-500); color: var(--text-hi);
|
||||
font-size: .22rem; font-weight: 700; letter-spacing: .14em;
|
||||
box-shadow: 0 0 .18rem rgba(23, 249, 183, .15);
|
||||
transition: background var(--t-fast), color var(--t-fast), box-shadow var(--t-fast);
|
||||
}
|
||||
.readybtn:hover:not(:disabled) { background: rgba(78, 216, 175, .14); box-shadow: 0 0 .26rem rgba(23, 249, 183, .3); }
|
||||
.readybtn__box { width: .3rem; height: .3rem; border: 2px solid var(--mint-500); display: grid; place-items: center; flex: none; }
|
||||
.readybtn__box .icon { width: .26rem; height: .26rem; }
|
||||
.readybtn__label { flex: 1; text-align: left; }
|
||||
.readybtn__key { font-family: var(--font-num); font-size: .11rem; font-weight: 500; letter-spacing: .06em; color: var(--text-dim); border: 1px solid var(--line-2); padding: 0 .04rem; }
|
||||
.readybtn.is-on { background: var(--mint-500); color: var(--text-on-mint); }
|
||||
.readybtn.is-on .readybtn__box { border-color: var(--text-on-mint); background: var(--text-on-mint); color: var(--mint-400); }
|
||||
.readybtn.is-on .readybtn__key { color: var(--mint-900); border-color: var(--mint-700); }
|
||||
.readybtn.is-on:hover:not(:disabled) { background: var(--mint-400); color: var(--text-on-mint); box-shadow: 0 0 .3rem rgba(23, 249, 183, .45); }
|
||||
.readybtn:disabled { border-color: var(--line-2); color: var(--text-dim); box-shadow: none; cursor: not-allowed; }
|
||||
.readybtn:disabled .readybtn__box { border-color: var(--line-2); }
|
||||
.readybtn.is-busy { opacity: .7; }
|
||||
|
||||
/* ---- bond strip ---------------------------------------------------------------------------------------- */
|
||||
.gm__bonds { position: absolute; left: 1.56rem; top: 1.36rem; right: 5.2rem; pointer-events: none; }
|
||||
/* Only the bond discs (and the +N chip) take the pointer: the strip's box spans the width under the top bar, where the
|
||||
top board row's units stand (row 12 at 16:9 / 21:9 / 720p / phones, the boss field's row 5 in a boss prep) — it used
|
||||
to swallow the taps and drags on them (review of user playtest #2 item 8: every own unit reachable). */
|
||||
.gm__bonds > *, .gm__bonds .bstrip { pointer-events: none; }
|
||||
.gm__bonds .bslot, .gm__bonds .bstrip__more { pointer-events: auto; }
|
||||
.bstrip { display: flex; align-items: flex-start; gap: .1rem; flex-wrap: nowrap; }
|
||||
.bstrip.is-frozen .bslot { opacity: .5; filter: saturate(.4); }
|
||||
.bstrip--empty { display: inline-flex; align-items: center; gap: .12rem; padding: .08rem .16rem; font-size: .15rem; color: var(--text-dim); background: rgba(8, 11, 10, .6); border: 1px dashed var(--line-2); }
|
||||
.bstrip__owner { align-self: center; writing-mode: vertical-rl; padding: .06rem .02rem; border: 1px solid rgba(246, 163, 41, .5); background: rgba(40, 26, 6, .7); }
|
||||
.bstrip__owner .micro { color: var(--amber); letter-spacing: .1em; font-size: .12rem; }
|
||||
.bstrip.is-other .bond__core { box-shadow: 0 0 0 1px rgba(246, 163, 41, .45); }
|
||||
.bstrip__more { align-self: center; font-size: .16rem; color: var(--text-lo); padding: .04rem .08rem; border: 1px solid var(--line-2); background: rgba(8, 11, 10, .7); }
|
||||
.bslot { position: relative; display: flex; flex-direction: column; align-items: center; width: .74rem; }
|
||||
.bslot .bond { --disc: .52rem; }
|
||||
.bslot .bond__name { font-size: .14rem; font-weight: 500; text-shadow: 0 1px 3px #000, 0 0 6px #000; }
|
||||
.bslot__count {
|
||||
position: absolute; top: -.04rem; right: .02rem; font-size: .13rem; font-weight: 700; color: var(--text-hi);
|
||||
background: rgba(8, 11, 10, .92); border: 1px solid var(--line-2); padding: 0 .04rem; line-height: 1.35;
|
||||
}
|
||||
.bslot__count small { color: var(--text-dim); font-size: .11rem; }
|
||||
.bslot__count.is-max { border-color: var(--mint-700); color: var(--mint-400); }
|
||||
.bslot.is-active .bslot__count { border-color: var(--mint-700); }
|
||||
.bslot.is-open .bond__core { box-shadow: 0 0 0 2px var(--mint-400), 0 0 .2rem rgba(23, 249, 183, .6); }
|
||||
|
||||
/* ---- team panel ------------------------------------------------------------------------------------------- */
|
||||
.team { position: absolute; left: .22rem; top: 2.36rem; display: flex; flex-direction: column; gap: .14rem; pointer-events: none; }
|
||||
.team__row { position: relative; display: flex; align-items: center; gap: .1rem; pointer-events: auto; }
|
||||
.team__btn {
|
||||
position: relative; padding: 0; background: none; border: 0;
|
||||
transition: transform var(--t-fast);
|
||||
}
|
||||
.team__btn:hover { transform: translateX(.03rem); }
|
||||
.team__seat {
|
||||
position: absolute; left: -.02rem; top: -.04rem; font-size: .11rem; padding: 0 .04rem; line-height: 1.3;
|
||||
background: rgba(8, 11, 10, .9); color: var(--text-lo); border: 1px solid var(--line-2);
|
||||
}
|
||||
.team__ai { position: absolute; right: -.04rem; bottom: -.04rem; font-family: var(--font-num); font-size: .11rem; font-weight: 700; padding: 0 .04rem; background: #a9c3d8; color: #0b1520; }
|
||||
.team__you { position: absolute; right: -.08rem; top: -.08rem; width: .22rem; height: .22rem; display: grid; place-items: center; background: var(--mint-500); color: var(--text-on-mint); clip-path: polygon(25% 3%, 75% 3%, 100% 50%, 75% 97%, 25% 97%, 0 50%); }
|
||||
.team__you .icon { width: .14rem; height: .14rem; }
|
||||
.team__info { display: flex; flex-direction: column; gap: .02rem; min-width: 0; padding: .04rem .12rem .04rem .06rem; background: linear-gradient(90deg, rgba(8, 11, 10, .82), rgba(8, 11, 10, 0)); }
|
||||
.team__name { font-size: .15rem; font-weight: 500; color: var(--text-md); max-width: 1.5rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-shadow: 0 1px 2px #000; }
|
||||
.team__line { display: flex; align-items: center; gap: .1rem; }
|
||||
.team__status { width: .26rem; height: .26rem; display: grid; place-items: center; border: 1px solid currentColor; background: rgba(0, 0, 0, .5); }
|
||||
.team__status .icon { width: .18rem; height: .18rem; }
|
||||
.team__status .lsprite { width: .2rem; height: .2rem; object-fit: contain; }
|
||||
.team__status.has-sprite { border-color: transparent; background: none; animation: none; }
|
||||
.team__status.has-sprite .lsprite { width: .26rem; height: .26rem; }
|
||||
.team__status.is-lo { color: var(--text-lo); }
|
||||
.team__status.is-mint { color: var(--mint-400); }
|
||||
.team__status.is-gold { color: var(--gold); animation: blink 1.2s steps(2) infinite; }
|
||||
.team__status.is-orange { color: var(--orange-hi); }
|
||||
.team__status.is-red, .team__status.is-offline { color: var(--red-premium); }
|
||||
.team__eye { color: var(--amber); display: grid; }
|
||||
.team__eye .icon { width: .2rem; height: .2rem; }
|
||||
.team__row.is-self .pavatar { box-shadow: 0 0 0 2px var(--mint-500), 0 0 .18rem rgba(23, 249, 183, .35); }
|
||||
.team__row.is-watched .pavatar { box-shadow: 0 0 0 2px var(--amber), 0 0 .18rem rgba(246, 163, 41, .45); }
|
||||
.team__row.is-dead .team__name { color: var(--text-dim); text-decoration: line-through; }
|
||||
.team__bubble { position: absolute; left: calc(100% + .06rem); top: 50%; transform: translateY(-50%); width: max-content; max-width: 3.2rem; }
|
||||
/* 前往查看 / 返回战场 (research 09 §3.1: tapping a teammate's avatar expands a mint button under it) */
|
||||
.team__row.is-open .pavatar { box-shadow: 0 0 0 2px var(--mint-400), 0 0 .2rem rgba(23, 249, 183, .45); }
|
||||
.team__row.is-open .team__info { background: linear-gradient(90deg, rgba(13, 44, 36, .92), rgba(8, 11, 10, 0)); }
|
||||
.team__ob, .team__back { align-self: flex-start; margin-top: .04rem; min-width: 1.1rem; animation: pop-in var(--t-fast) var(--ease-out); }
|
||||
.team__ob .btn__label, .team__back .btn__label { letter-spacing: .12em; }
|
||||
.team__back { border-color: rgba(255, 255, 255, .7); color: #fff; }
|
||||
|
||||
/* player avatar (band icon / glyph) */
|
||||
.pavatar {
|
||||
--pa: .8rem;
|
||||
position: relative; display: block; width: var(--pa); height: var(--pa); flex: none;
|
||||
background: linear-gradient(135deg, hsl(var(--seat-hue) 40% 22%), hsl(var(--seat-hue) 30% 10%));
|
||||
border: 1px solid var(--line-2);
|
||||
}
|
||||
.pavatar--sm { --pa: .42rem; }
|
||||
.pavatar__img { position: absolute; inset: 0; overflow: hidden; display: grid; place-items: center; }
|
||||
.pavatar__img img { width: 100%; height: 100%; object-fit: cover; }
|
||||
.pavatar__glyph { font-weight: 900; font-size: calc(var(--pa) * .5); color: hsl(var(--seat-hue) 70% 72%); }
|
||||
.pavatar__bot { width: 56%; height: 56%; color: #a9c3d8; }
|
||||
.pavatar.is-dead .pavatar__img, .pavatar.is-left .pavatar__img, .pavatar.is-offline .pavatar__img { filter: grayscale(1) brightness(.4); }
|
||||
.pavatar__x, .pavatar__door { position: absolute; inset: 0; display: grid; place-items: center; color: var(--red-premium); }
|
||||
.pavatar__x .icon, .pavatar__door .icon { width: 60%; height: 60%; filter: drop-shadow(0 0 4px #000); }
|
||||
|
||||
/* ---- effects ---------------------------------------------------------------------------------------------- */
|
||||
.gm__effects { position: absolute; right: .3rem; top: 2.4rem; }
|
||||
.effects { display: flex; flex-direction: column; align-items: flex-end; gap: .08rem; }
|
||||
.effect {
|
||||
position: relative; width: .5rem; height: .5rem; display: grid; place-items: center;
|
||||
background: rgba(8, 11, 10, .85); border: 1px solid var(--line-2);
|
||||
}
|
||||
.effect img { width: 86%; height: 86%; object-fit: contain; }
|
||||
.effect .icon { width: .28rem; height: .28rem; color: var(--mint-500); }
|
||||
.effect--band { border-color: var(--mint-800); }
|
||||
.effect--team { border-color: rgba(78, 216, 175, .6); }
|
||||
.effect__n { position: absolute; right: -.05rem; bottom: -.05rem; min-width: .2rem; font-size: .12rem; line-height: 1.4; text-align: center; background: var(--gold); color: #1d1400; padding: 0 .03rem; }
|
||||
.efftip { display: flex; flex-direction: column; gap: .04rem; max-width: 3.6rem; }
|
||||
.efftip b { font-size: .17rem; color: var(--mint-400); }
|
||||
.efftip__kind { font-size: .12rem; color: var(--text-dim); }
|
||||
.efftip p { font-size: .15rem; line-height: 1.55; color: var(--text-md); }
|
||||
|
||||
/* ---- corner: emote + settings --------------------------------------------------------------------------------- */
|
||||
.gm__corner { position: absolute; left: .24rem; bottom: .24rem; display: flex; align-items: flex-end; gap: .1rem; }
|
||||
.gm__gear {
|
||||
width: .56rem; height: .56rem; display: grid; place-items: center; background: rgba(8, 11, 10, .85);
|
||||
border: 1px solid var(--line-2); color: var(--text-lo); transition: color var(--t-fast), border-color var(--t-fast);
|
||||
}
|
||||
.gm__gear .icon { width: .28rem; height: .28rem; }
|
||||
.gm__gear:hover { color: var(--mint-400); border-color: var(--mint-700); }
|
||||
|
||||
.ewheel { position: relative; }
|
||||
.ewheel__btn {
|
||||
display: flex; align-items: center; gap: .08rem; height: .56rem; padding: 0 .2rem 0 .14rem;
|
||||
background: rgba(8, 11, 10, .85); border: 1px solid var(--line-2); color: var(--text-md); font-size: .18rem; font-weight: 700; letter-spacing: .1em;
|
||||
transition: color var(--t-fast), border-color var(--t-fast);
|
||||
}
|
||||
.ewheel__btn .icon { width: .3rem; height: .3rem; color: var(--mint-500); }
|
||||
.ewheel__btn:hover, .ewheel__btn.is-on { color: var(--mint-400); border-color: var(--mint-700); }
|
||||
.ewheel__btn:disabled { opacity: .5; cursor: not-allowed; }
|
||||
.ewheel__panel {
|
||||
position: absolute; left: 0; bottom: calc(100% + .12rem); width: 4.1rem; padding: .14rem .16rem .16rem;
|
||||
background: linear-gradient(180deg, rgba(20, 26, 24, .97), rgba(10, 14, 12, .97)); border: 1px solid var(--line-2);
|
||||
box-shadow: 0 .1rem .3rem rgba(0, 0, 0, .6);
|
||||
animation: pop-in var(--t-med) var(--ease-out);
|
||||
}
|
||||
.ewheel__grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: .08rem; margin-top: .12rem; }
|
||||
.ewheel__item {
|
||||
position: relative; display: flex; flex-direction: column; align-items: center; gap: .02rem; padding: .06rem .02rem .05rem;
|
||||
background: rgba(255, 255, 255, .025); border: 1px solid var(--line); font-size: .12rem; color: var(--text-lo);
|
||||
transition: background var(--t-fast), border-color var(--t-fast), transform var(--t-fast), color var(--t-fast);
|
||||
}
|
||||
.ewheel__item:hover:not(:disabled) { background: var(--mint-a10); border-color: var(--mint-700); color: var(--mint-400); transform: translateY(-.02rem); }
|
||||
.ewheel__item:disabled { opacity: .45; cursor: wait; }
|
||||
.ewheel__art { width: .6rem; height: .6rem; display: grid; place-items: center; }
|
||||
.ewheel__art:empty { display: none; }
|
||||
.ewheel__art .eart { width: 100%; height: 100%; object-fit: contain; filter: drop-shadow(0 0 .06rem rgba(23, 249, 183, .25)); }
|
||||
.ewheel__txt { white-space: nowrap; }
|
||||
.ewheel__panel.is-text .ewheel__grid { grid-template-columns: repeat(3, 1fr); }
|
||||
.ewheel__panel.is-text .ewheel__item { padding: .12rem .04rem; font-size: .15rem; color: var(--text-md); }
|
||||
@keyframes pop-in { from { opacity: 0; transform: translateY(.08rem) scale(.97); } }
|
||||
|
||||
/* speech bubble next to a team row: official emote art (+ phrase), or the phrase alone */
|
||||
.ebubble {
|
||||
display: flex; align-items: center; gap: .06rem; padding: .05rem .14rem .05rem .2rem; white-space: nowrap;
|
||||
background: rgba(22, 28, 26, .96); color: var(--text-hi); font-size: .15rem; font-weight: 700;
|
||||
border: 1px solid rgba(78, 216, 175, .45);
|
||||
clip-path: polygon(.1rem 0, 100% 0, 100% 100%, .1rem 100%, .1rem 62%, 0 50%, .1rem 38%);
|
||||
animation: bubble-in 150ms var(--ease-out), bubble-out 300ms var(--ease-in-out) 2.7s forwards;
|
||||
filter: drop-shadow(0 .04rem .1rem rgba(0, 0, 0, .55));
|
||||
z-index: 2;
|
||||
}
|
||||
.ebubble--art { padding: .02rem .14rem .02rem .16rem; }
|
||||
.ebubble .eart { width: .62rem; height: .62rem; object-fit: contain; }
|
||||
.ebubble__txt { color: var(--mint-400); }
|
||||
.ebubble--text { background: rgba(236, 244, 241, .96); border: 0; }
|
||||
.ebubble--text .ebubble__txt { color: #0b1310; }
|
||||
@keyframes bubble-in { from { opacity: 0; transform: translateY(-50%) scale(.6); } }
|
||||
@keyframes bubble-out { to { opacity: 0; } }
|
||||
|
||||
/* ---- ticker -------------------------------------------------------------------------------------------- */
|
||||
/* a slim strip hugging the bottom of the top bar; the bond strip starts right below it (.gm__bonds top) */
|
||||
.ticker { position: absolute; top: 1.0rem; left: 50%; transform: translateX(-50%); width: 7.6rem; height: .3rem; overflow: hidden; pointer-events: none; z-index: 4; }
|
||||
.ticker__line {
|
||||
position: absolute; right: 0; top: 0; height: 100%; display: flex; align-items: center; gap: .1rem; white-space: nowrap;
|
||||
padding: 0 .24rem; font-size: .16rem; color: var(--text-hi);
|
||||
background: linear-gradient(90deg, transparent, rgba(10, 14, 12, .97) 10%, rgba(10, 14, 12, .97) 90%, transparent);
|
||||
border-top: 1px solid rgba(255, 198, 0, .35); border-bottom: 1px solid rgba(255, 198, 0, .35);
|
||||
animation: ticker-in 420ms var(--ease-out), ticker-out 380ms var(--ease-in-out) 4.8s forwards;
|
||||
left: 0; justify-content: center;
|
||||
}
|
||||
.ticker__icon { width: .22rem; height: .22rem; color: var(--gold); flex: none; }
|
||||
@keyframes ticker-in { from { transform: translateX(80%); opacity: 0; } }
|
||||
@keyframes ticker-out { to { transform: translateX(-40%); opacity: 0; } }
|
||||
|
||||
/* ---- watching / dead / combat hud ------------------------------------------------------------------------------ */
|
||||
/* scouting a teammate's board in prep: the shop bar is hidden, the pill takes its place */
|
||||
.gm__watching {
|
||||
position: absolute; left: 50%; bottom: .4rem; transform: translateX(-50%);
|
||||
display: flex; align-items: center; gap: .14rem; padding: .06rem .08rem .06rem .18rem;
|
||||
background: rgba(24, 16, 4, .92); border: 1px solid rgba(246, 163, 41, .6); color: var(--text-hi); font-size: .17rem;
|
||||
}
|
||||
.gm__watching > .icon { width: .24rem; height: .24rem; color: var(--amber); }
|
||||
.gm__watching b { color: var(--amber); }
|
||||
.gm__dead {
|
||||
position: absolute; left: 50%; bottom: 3.1rem; transform: translateX(-50%); display: flex; align-items: center; gap: .1rem;
|
||||
padding: .1rem .26rem; background: rgba(40, 8, 6, .9); border: 1px solid rgba(255, 84, 84, .5); color: var(--red-premium); font-size: .18rem; font-weight: 700;
|
||||
}
|
||||
.gm__dead .icon { width: .22rem; height: .22rem; }
|
||||
|
||||
.chud { position: absolute; inset: 0; pointer-events: none; }
|
||||
.chud > * { pointer-events: auto; }
|
||||
.dpbox {
|
||||
position: absolute; right: .3rem; top: 50%; transform: translateY(-50%);
|
||||
display: flex; flex-direction: column; align-items: center; gap: .02rem; padding: .1rem .12rem;
|
||||
background: rgba(8, 11, 10, .85); border: 1px solid var(--line-2); border-right: 3px solid var(--mint-500);
|
||||
}
|
||||
.dpbox__icon { width: .26rem; height: .26rem; color: var(--mint-500); }
|
||||
.dpbox b { font-size: .34rem; line-height: 1; color: #fff; }
|
||||
.chud__bottom { position: absolute; left: 50%; bottom: .3rem; transform: translateX(-50%); display: flex; flex-direction: column; align-items: center; gap: .12rem; pointer-events: none; }
|
||||
.chud__bottom > * { pointer-events: auto; }
|
||||
.chud__msg {
|
||||
display: flex; align-items: center; gap: .1rem; padding: .1rem .3rem; font-size: .19rem; color: var(--text-hi);
|
||||
background: rgba(8, 11, 10, .9); border: 1px solid var(--line-2); border-radius: .3rem; white-space: nowrap;
|
||||
animation: pop-in var(--t-slow) var(--ease-out);
|
||||
}
|
||||
.chud__msg .icon { width: .22rem; height: .22rem; color: var(--gold); animation: hg-flip 2.4s var(--ease-in-out) infinite; }
|
||||
@keyframes hg-flip { 0%, 40% { transform: rotate(0); } 50%, 90% { transform: rotate(180deg); } 100% { transform: rotate(360deg); } }
|
||||
.chud__msg--dead { border-color: rgba(255, 84, 84, .5); color: var(--red-premium); }
|
||||
.chud__msg--dead .icon { color: var(--red-premium); animation: none; }
|
||||
.vswitch { display: flex; align-items: center; gap: .1rem; height: .5rem; padding: 0 .06rem; background: rgba(8, 11, 10, .9); border: 1px solid var(--line-2); }
|
||||
.vswitch__arrow { width: .4rem; height: .4rem; display: grid; place-items: center; background: none; border: 0; color: var(--mint-500); }
|
||||
.vswitch__arrow .icon { width: .3rem; height: .3rem; }
|
||||
.vswitch__arrow:hover:not(:disabled) { color: var(--mint-400); background: var(--mint-a10); }
|
||||
.vswitch__arrow:disabled { color: var(--text-dim); cursor: default; }
|
||||
.vswitch__label { min-width: 1.6rem; text-align: center; font-size: .2rem; font-weight: 700; letter-spacing: .12em; }
|
||||
.vswitch.is-single .vswitch__arrow { visibility: hidden; }
|
||||
/* client-side combat (ui/combatHud.js, research 09 §3.1): waiting pill + teammates' progress, observing pill, ‹ › halves */
|
||||
.chud__wait { border-color: rgba(255, 198, 0, .45); }
|
||||
.chud__progress { display: flex; flex-wrap: wrap; justify-content: center; gap: .1rem .18rem; max-width: 9rem; font-size: .15rem; color: var(--text-md); }
|
||||
.chud__prog {
|
||||
display: inline-flex; align-items: center; gap: .08rem; padding: .03rem .12rem; background: rgba(8, 11, 10, .82);
|
||||
border: 1px solid rgba(78, 216, 175, .25); border-left: 3px solid var(--gold);
|
||||
}
|
||||
.chud__prog b { font-weight: 500; max-width: 1.4rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.chud__prog .num { color: var(--gold); font-size: .16rem; }
|
||||
.chud__prog.is-done { border-left-color: var(--mint-500); }
|
||||
.chud__prog__ok { color: var(--mint-400); font-weight: 900; }
|
||||
.chud__observe { gap: .14rem; padding: 0 .08rem 0 .16rem; border-color: rgba(246, 163, 41, .55); }
|
||||
.chud__observe .vswitch__label, .chud__layers .vswitch__label { display: inline-flex; align-items: center; justify-content: center; gap: .08rem; }
|
||||
.chud__observe .vswitch__label .icon { width: .24rem; height: .24rem; color: var(--amber); }
|
||||
.chud__layers .vswitch__label .icon { width: .22rem; height: .22rem; color: var(--amber); }
|
||||
.chud__back { flex: none; }
|
||||
.chud__layers { border-color: var(--mint-700); }
|
||||
@keyframes spin { to { transform: rotate(360deg); } }
|
||||
|
||||
/* ---- settings modal ------------------------------------------------------------------------------------------------ */
|
||||
.set-list { display: flex; flex-direction: column; gap: .16rem; padding-top: .06rem; }
|
||||
.set-row { display: grid; grid-template-columns: 3.3rem 1fr auto; align-items: center; gap: .18rem; min-height: .44rem; }
|
||||
.set-row__label { display: flex; align-items: center; gap: .1rem; font-size: .18rem; color: var(--text-hi); white-space: nowrap; }
|
||||
.set-row__label .icon { width: .2rem; height: .2rem; color: var(--mint-500); }
|
||||
.set-row__label .micro { margin-left: .04rem; }
|
||||
.set-row__val { width: .5rem; text-align: right; font-size: .2rem; color: var(--mint-400); }
|
||||
.set-range {
|
||||
-webkit-appearance: none; appearance: none; width: 100%; height: .08rem; background: linear-gradient(90deg, var(--mint-500) var(--pct), #0a0d0c var(--pct));
|
||||
border: 1px solid var(--line-2); outline: none; cursor: pointer;
|
||||
}
|
||||
.set-range::-webkit-slider-thumb { -webkit-appearance: none; width: .2rem; height: .26rem; background: var(--mint-400); clip-path: polygon(50% 0, 100% 30%, 100% 100%, 0 100%, 0 30%); cursor: grab; }
|
||||
.set-range::-moz-range-thumb { width: .2rem; height: .26rem; background: var(--mint-400); border: 0; }
|
||||
.set-toggle { grid-column: 2 / 4; justify-self: start; display: flex; align-items: center; gap: .1rem; height: .38rem; padding: 0 .14rem 0 .06rem; background: #0a0d0c; border: 1px solid var(--line-2); color: var(--text-lo); font-size: .15rem; }
|
||||
.set-toggle i { width: .46rem; height: .24rem; background: var(--bg-3); position: relative; transition: background var(--t-fast); }
|
||||
.set-toggle i::after { content: ''; position: absolute; left: .03rem; top: .03rem; width: .18rem; height: .18rem; background: var(--text-lo); transition: transform var(--t-fast), background var(--t-fast); }
|
||||
.set-toggle.is-on { color: var(--mint-400); border-color: var(--mint-700); }
|
||||
.set-toggle.is-on i { background: var(--mint-800); }
|
||||
.set-toggle.is-on i::after { transform: translateX(.22rem); background: var(--mint-400); }
|
||||
.set-seg { grid-column: 2 / 4; justify-self: start; display: flex; border: 1px solid var(--line-2); }
|
||||
.set-seg button { min-width: .8rem; height: .38rem; background: #0a0d0c; border: 0; border-right: 1px solid var(--line-2); color: var(--text-lo); font-size: .16rem; }
|
||||
.set-seg button:last-child { border-right: 0; }
|
||||
.set-seg button.is-on { background: var(--mint-500); color: var(--text-on-mint); font-weight: 700; }
|
||||
.set-hint { margin-top: .06rem; font-size: .14rem; color: var(--text-dim); line-height: 1.8; }
|
||||
.set-hint kbd, .lvcard__key, .toolbtn kbd { font-family: var(--font-num); font-size: .11rem; border: 1px solid var(--line-2); padding: 0 .04rem; color: var(--text-lo); background: rgba(0, 0, 0, .3); }
|
||||
|
||||
/* ---- exit / away ------------------------------------------------------------------------------------------------------ */
|
||||
.exitm { display: flex; flex-direction: column; gap: .1rem; font-size: .17rem; line-height: 1.7; }
|
||||
.awayov { position: fixed; inset: 0; z-index: 70; display: grid; place-items: center; background: rgba(4, 7, 6, .78); -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px); animation: screen-in var(--t-slow) var(--ease-out); }
|
||||
.awayov__box { display: flex; flex-direction: column; align-items: center; gap: .12rem; padding: .44rem .7rem; background: rgba(12, 16, 14, .96); border: 1px solid var(--line-2); }
|
||||
.awayov__icon { width: .8rem; height: .8rem; color: var(--ice); filter: drop-shadow(0 0 .2rem rgba(159, 212, 255, .5)); }
|
||||
.awayov__box h2 { font-size: .34rem; letter-spacing: .12em; }
|
||||
|
||||
/* ---- simplified (DOM) field view ---------------------------------------------------------------------------------------- */
|
||||
.ff { position: absolute; inset: 0; overflow: hidden; user-select: none; }
|
||||
.ff::before { content: ''; position: absolute; inset: 0; background: radial-gradient(70% 60% at 45% 48%, rgba(40, 60, 52, .35), transparent 70%); }
|
||||
.ff-board { position: absolute; }
|
||||
.ff-tile, .ff-slot, .ff-piece, .ff-unit { position: absolute; left: 0; top: 0; }
|
||||
.ff-tile { box-sizing: border-box; border: 1px solid rgba(0, 0, 0, .35); }
|
||||
.ff-tile--floor { background: linear-gradient(180deg, #3d4843, #333d38); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .06); }
|
||||
.ff-tile--high { background: linear-gradient(180deg, #5d6a64, #4a5651); box-shadow: inset 0 2px 0 rgba(255, 255, 255, .12), inset 0 -4px 0 rgba(0, 0, 0, .25); }
|
||||
.ff-tile--lane { background: linear-gradient(180deg, #2b322f, #252c29); }
|
||||
.ff-tile--void { background: transparent; border-color: transparent; }
|
||||
.ff-tile--gate { background: radial-gradient(circle, rgba(255, 60, 40, .6), rgba(120, 20, 10, .5)); border: 2px solid #ff4a2e; animation: gate-pulse 1.4s ease-in-out infinite; }
|
||||
.ff-tile--goal { background: radial-gradient(circle, rgba(60, 160, 255, .55), rgba(10, 50, 120, .5)); border: 2px solid #4ab0ff; }
|
||||
.ff-tile--mire { background: linear-gradient(180deg, #4a4030, #3c3326); }
|
||||
.ff-tile--smog { background: linear-gradient(180deg, #4a4a52, #3a3a42); }
|
||||
.ff-tile--deep { background: linear-gradient(180deg, #1e3a52, #173045); }
|
||||
.ff-tile--infect { background: linear-gradient(180deg, #4a2a3a, #3a2030); }
|
||||
.ff-tile.is-legal { box-shadow: inset 0 0 0 2px rgba(89, 244, 202, .8), inset 0 0 calc(var(--tile) * .4) rgba(23, 249, 183, .3); }
|
||||
.ff-tile.is-illegal { box-shadow: inset 0 0 0 2px rgba(255, 84, 84, .5); }
|
||||
.ff-tile.is-range { box-shadow: inset 0 0 0 2px rgba(246, 163, 41, .7); }
|
||||
.ff-tile.is-hover-legal { background: rgba(78, 216, 175, .45); }
|
||||
.ff-tile.is-hover-illegal { background: rgba(255, 60, 60, .4); }
|
||||
@keyframes gate-pulse { 50% { box-shadow: 0 0 calc(var(--tile) * .4) rgba(255, 60, 40, .8); } }
|
||||
.ff-hand-label { position: absolute; left: 0; right: 0; display: flex; align-items: center; gap: .1rem; font-size: .13rem; color: var(--text-dim); letter-spacing: .2em; }
|
||||
.ff-hand-label i { flex: 1; height: 1px; background: linear-gradient(90deg, var(--line-2), transparent); }
|
||||
.ff-slot { box-sizing: border-box; border: 2px dashed rgba(170, 140, 90, .45); background: rgba(120, 90, 50, .16); display: grid; place-items: end start; }
|
||||
.ff-slot span { font-size: .11rem; color: rgba(210, 180, 130, .5); padding: 0 .03rem; }
|
||||
.ff-slot--temp { border-color: rgba(255, 122, 51, .6); background: rgba(232, 90, 26, .12); }
|
||||
.ff-slot.is-hover-legal { background: rgba(78, 216, 175, .35); border-color: var(--mint-400); }
|
||||
.ff-slot.is-hover-illegal { background: rgba(255, 60, 60, .3); }
|
||||
.ff-piece { transition: transform 160ms var(--ease-out); z-index: 2; }
|
||||
.ff-piece.is-draggable { cursor: grab; }
|
||||
.ff-piece.is-lifted { opacity: .25; }
|
||||
.ff-piece__art {
|
||||
position: absolute; inset: 7%; overflow: hidden; display: grid; place-items: center; background: #1a201d;
|
||||
border: 2px solid rgba(255, 255, 255, .22); clip-path: polygon(12% 0, 100% 0, 100% 88%, 88% 100%, 0 100%, 0 12%);
|
||||
}
|
||||
.ff-piece__art img { width: 100%; height: 100%; object-fit: cover; pointer-events: none; }
|
||||
.ff-piece__art span { font-weight: 900; font-size: calc(var(--tile) * .4); color: var(--text-md); }
|
||||
.ff-piece--item .ff-piece__art { background: radial-gradient(circle, #2a3430, #141917); }
|
||||
.ff-piece--item .ff-piece__art img { object-fit: contain; width: 80%; height: 80%; }
|
||||
.ff-piece.is-golden .ff-piece__art { border-color: var(--gold); box-shadow: 0 0 calc(var(--tile) * .18) rgba(255, 198, 0, .6); }
|
||||
.ff-piece.is-temp .ff-piece__art { border-color: var(--orange-hi); }
|
||||
.ff-piece__tier { position: absolute; left: 0; top: 0; transform: scale(.9); transform-origin: top left; }
|
||||
.ff-piece__items { position: absolute; right: 8%; bottom: 8%; display: flex; gap: 2px; }
|
||||
.ff-piece__items i { width: calc(var(--tile) * .12); height: calc(var(--tile) * .12); background: var(--gold); transform: rotate(45deg); box-shadow: 0 0 3px #000; }
|
||||
.ff-piece__count { position: absolute; right: 6%; bottom: 4%; font-family: var(--font-num); font-size: calc(var(--tile) * .2); color: #fff; text-shadow: 0 1px 2px #000; }
|
||||
/* facing wedge (research 09 §1.2): an orange › on the piece's edge along its direction */
|
||||
.ff-piece__dir {
|
||||
position: absolute; left: 50%; top: 50%; width: calc(var(--tile) * .2); height: calc(var(--tile) * .26); pointer-events: none;
|
||||
background: #ff9c33; clip-path: polygon(0 0, 45% 0, 100% 50%, 45% 100%, 0 100%, 55% 50%); filter: drop-shadow(0 0 2px #000);
|
||||
transform: translate(-50%, -50%) rotate(var(--dir-rot, 0deg)) translateX(calc(var(--tile) * .46));
|
||||
}
|
||||
.ff-dir--up { --dir-rot: -90deg; } .ff-dir--right { --dir-rot: 0deg; } .ff-dir--down { --dir-rot: 90deg; } .ff-dir--left { --dir-rot: 180deg; }
|
||||
.ff-ghost { position: absolute; z-index: 20; pointer-events: none; opacity: .92; transform: scale(1.08); filter: drop-shadow(0 .1rem .16rem rgba(0, 0, 0, .7)); }
|
||||
.ff-ghost img { width: 100%; height: 100%; object-fit: cover; border: 2px solid var(--mint-400); clip-path: polygon(12% 0, 100% 0, 100% 88%, 88% 100%, 0 100%, 0 12%); }
|
||||
.ff-ghost.is-golden img { border-color: var(--gold); }
|
||||
.ff-unit { z-index: 3; transition: transform 110ms linear, opacity 400ms; }
|
||||
.ff-unit__art { width: 100%; height: 100%; overflow: hidden; border-radius: 50%; border: 2px solid var(--mint-500); background: #111; display: grid; place-items: center; }
|
||||
.ff-unit__art img { width: 100%; height: 100%; object-fit: cover; }
|
||||
.ff-unit__art span { font-weight: 900; font-size: calc(var(--tile) * .34); }
|
||||
.ff-unit.is-enemy .ff-unit__art { border-color: #ff5a4a; border-radius: 12%; transform: rotate(45deg) scale(.82); }
|
||||
.ff-unit.is-enemy .ff-unit__art img { transform: rotate(-45deg) scale(1.3); }
|
||||
.ff-unit.is-golden .ff-unit__art { border-color: var(--gold); box-shadow: 0 0 8px rgba(255, 198, 0, .6); }
|
||||
.ff-unit.is-boss .ff-unit__art { border-width: 3px; box-shadow: 0 0 14px rgba(255, 60, 40, .7); }
|
||||
.ff-unit.is-skill .ff-unit__art { box-shadow: 0 0 10px rgba(255, 198, 0, .9); }
|
||||
.ff-unit.is-stunned { filter: grayscale(.6) brightness(.8); }
|
||||
.ff-unit.is-dead { opacity: 0; }
|
||||
.ff-unit.is-fly { margin-top: -6%; }
|
||||
.ff-unit__bars { position: absolute; left: 8%; right: 8%; bottom: -12%; display: flex; flex-direction: column; gap: 1px; }
|
||||
.ff-unit__bars i { display: block; height: 4px; background: #3fdc6a; box-shadow: 0 0 0 1px #000; }
|
||||
.ff-unit.is-enemy .ff-unit__bars i.hp { background: #ff4a3a; }
|
||||
.ff-unit__bars i.sp { height: 3px; background: #ffd23a; }
|
||||
.ff-float { position: absolute; z-index: 5; transform: translate(-50%, 0); font-family: var(--font-num); font-weight: 700; font-size: .2rem; pointer-events: none; text-shadow: 0 1px 2px #000, 0 0 4px #000; animation: float-up 900ms var(--ease-out) forwards; }
|
||||
.ff-float--phys { color: #ffd7a8; }
|
||||
.ff-float--arts { color: #d59cff; }
|
||||
.ff-float--true { color: #fff; }
|
||||
.ff-float--heal { color: #6dff9c; }
|
||||
@keyframes float-up { to { transform: translate(-50%, -.4rem); opacity: 0; } }
|
||||
.ff-badge { position: absolute; left: 50%; bottom: .08rem; transform: translateX(-50%); font-family: var(--font-display); font-size: .1rem; letter-spacing: .3em; color: var(--text-dim); opacity: .5; pointer-events: none; }
|
||||
.gm--combat .ff-badge { display: none; }
|
||||
|
||||
/* ---- small screens (1280×720 → root ≈ 66px) ------------------------------------------------------------------------ */
|
||||
@media (max-aspect-ratio: 16/10) {
|
||||
.gm__bonds { right: 4.6rem; }
|
||||
}
|
||||
|
||||
/* fallback view: enemy preview pen (setCamera('pen')) */
|
||||
.ff-board--pen .ff-pen__enemy { padding: 0; border: 0; background: none; cursor: pointer; border-radius: 50%; }
|
||||
.ff-board--pen .ff-pen__enemy:hover { filter: brightness(1.2); }
|
||||
.ff-board--pen .ff-pen__enemy .ff-unit__art { border-color: rgba(255, 90, 60, .7); }
|
||||
.ff-pen__empty { position: absolute; left: 0; right: 0; top: 45%; text-align: center; color: var(--text-lo); font-size: .16rem; }
|
||||
|
||||
/* enemy preview pen view (research 09 §2): the bond strip and the effects column step aside for the pen */
|
||||
.gm__bonds, .gm__effects { transition: opacity var(--t-med) var(--ease-out); }
|
||||
.gm.is-pen .gm__bonds, .gm.is-pen .gm__effects { opacity: 0; pointer-events: none; }
|
||||
.gm.is-pen .gm__bonds > *, .gm.is-pen .gm__effects > *, .gm.is-pen .gm__bonds .bslot, .gm.is-pen .gm__bonds .bstrip__more { pointer-events: none; }
|
||||
|
||||
/* solo pause overlay (screens/game.js PausedOverlay; m.public.paused): the field dims under an official matte plate */
|
||||
.pauseov {
|
||||
position: absolute; inset: 0; z-index: 65; display: grid; place-items: center; pointer-events: auto;
|
||||
background: rgba(4, 7, 6, .62); -webkit-backdrop-filter: grayscale(.6) blur(2px); backdrop-filter: grayscale(.6) blur(2px);
|
||||
animation: screen-in var(--t-med) var(--ease-out);
|
||||
}
|
||||
.pauseov__box { display: flex; flex-direction: column; align-items: center; gap: .16rem; }
|
||||
.pauseov__plate {
|
||||
display: flex; flex-direction: column; align-items: center; gap: .02rem; min-width: 3.6rem; padding: .16rem .6rem .2rem;
|
||||
background: rgba(20, 22, 22, .9); background: var(--pause-plate, linear-gradient(90deg, transparent, rgba(12, 14, 14, .95) 18%, rgba(12, 14, 14, .95) 82%, transparent)) center / 100% 100% no-repeat;
|
||||
}
|
||||
.pauseov__micro { font-family: var(--font-num); font-size: .16rem; letter-spacing: .5em; color: var(--mint-400); }
|
||||
.pauseov__plate h2 { font-size: .5rem; font-weight: 900; letter-spacing: .3em; color: #fff; text-shadow: 0 0 .2rem rgba(0, 0, 0, .8); }
|
||||
.pauseov__note { font-size: .17rem; color: var(--text-md); text-shadow: 0 1px 2px #000; }
|
||||
.pauseov__btns { display: flex; gap: .2rem; }
|
||||
@@ -0,0 +1,110 @@
|
||||
/* ==========================================================================================
|
||||
guide.css — 玩法说明 viewer (js/ui/guide.js): the 19 official tutorial pages at 16:9, chapter tabs,
|
||||
‹ › edge buttons, page dots. Sits above modals (it can be opened from the settings dialog).
|
||||
========================================================================================== */
|
||||
|
||||
.guide {
|
||||
position: fixed; inset: 0; z-index: calc(var(--z-modal) + 4);
|
||||
display: grid; place-items: center;
|
||||
background: radial-gradient(ellipse at 50% 40%, rgba(8, 14, 12, .82), rgba(2, 4, 3, .94));
|
||||
-webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
|
||||
animation: guide-fade 180ms var(--ease-out);
|
||||
}
|
||||
@keyframes guide-fade { from { opacity: 0; } }
|
||||
|
||||
.guide__box {
|
||||
--bk-c: var(--mint-500);
|
||||
position: relative; display: flex; flex-direction: column; gap: .12rem;
|
||||
padding: .16rem .22rem .16rem;
|
||||
background: linear-gradient(180deg, rgba(22, 28, 26, .98), rgba(10, 13, 12, .98));
|
||||
border: 1px solid var(--line-2);
|
||||
box-shadow: 0 .2rem .6rem rgba(0, 0, 0, .7), 0 0 0 1px rgba(78, 216, 175, .06) inset;
|
||||
outline: none;
|
||||
animation: guide-pop 220ms var(--ease-out);
|
||||
}
|
||||
@keyframes guide-pop { from { opacity: 0; transform: translateY(.12rem) scale(.985); } }
|
||||
|
||||
/* header: title | chapter tabs | close */
|
||||
.guide__head { display: flex; align-items: center; gap: .3rem; min-height: .62rem; }
|
||||
.guide__titles { display: flex; flex-direction: column; gap: .02rem; min-width: 2.4rem; }
|
||||
.guide__title { margin: 0; font-size: .3rem; font-weight: 900; letter-spacing: .12em; color: var(--text-hi); line-height: 1.1; }
|
||||
.guide__chapters { display: flex; gap: .06rem; margin: 0 auto; }
|
||||
.guide__chapter {
|
||||
position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .01rem;
|
||||
min-width: 1.5rem; height: .56rem; padding: 0 .22rem;
|
||||
background: rgba(255, 255, 255, .03); border: 1px solid var(--line); color: var(--text-lo);
|
||||
clip-path: polygon(.12rem 0, 100% 0, calc(100% - .12rem) 100%, 0 100%);
|
||||
transition: color var(--t-fast), background var(--t-fast), border-color var(--t-fast);
|
||||
}
|
||||
.guide__chapter:hover { color: var(--text-hi); background: rgba(78, 216, 175, .06); }
|
||||
.guide__chapter.is-on { color: var(--text-on-mint); background: var(--mint-500); border-color: var(--mint-500); }
|
||||
.guide__chname { font-size: .19rem; font-weight: 700; letter-spacing: .1em; }
|
||||
.guide__chmicro { font-family: var(--font-display); font-size: .1rem; letter-spacing: .24em; opacity: .75; }
|
||||
.guide__close {
|
||||
width: .56rem; height: .56rem; display: grid; place-items: center; flex: none;
|
||||
background: rgba(0, 0, 0, .35); border: 1px solid var(--line-2); color: var(--text-md);
|
||||
transition: color var(--t-fast), border-color var(--t-fast), background var(--t-fast);
|
||||
}
|
||||
.guide__close .icon { width: .3rem; height: .3rem; }
|
||||
.guide__close:hover { color: var(--text-hi); border-color: var(--red-premium); background: var(--red-a20); }
|
||||
|
||||
/* page stage (16:9) with edge buttons */
|
||||
.guide__stage { position: relative; }
|
||||
.guide__page {
|
||||
position: relative; overflow: hidden;
|
||||
width: min(calc(96vw - .5rem), calc((100vh - 2.3rem) * 16 / 9));
|
||||
aspect-ratio: 16 / 9;
|
||||
background: #050807 repeating-linear-gradient(135deg, rgba(78, 216, 175, .04) 0 .02rem, transparent .02rem .14rem);
|
||||
border: 1px solid var(--line);
|
||||
}
|
||||
/* the pages are stored squashed to 1024²: stretch back to 16:9 */
|
||||
.guide__page img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: fill; user-select: none; opacity: 0; transition: opacity 160ms ease; }
|
||||
.guide__page.is-loaded img { opacity: 1; }
|
||||
.guide__loading { position: absolute; inset: 0; display: grid; place-items: center; }
|
||||
.guide__missing { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; gap: .1rem; color: var(--text-lo); font-size: .2rem; }
|
||||
.guide__missing .icon { width: .3rem; height: .3rem; }
|
||||
.guide__nav {
|
||||
position: absolute; top: 0; bottom: 0; z-index: 2; width: 1rem; display: grid; place-items: center;
|
||||
color: rgba(242, 242, 242, .7); background: transparent; border: 0;
|
||||
transition: color var(--t-fast), background var(--t-fast);
|
||||
}
|
||||
.guide__nav .icon { width: .52rem; height: .52rem; filter: drop-shadow(0 0 .06rem rgba(0, 0, 0, .9)); }
|
||||
.guide__prev { left: 0; background: linear-gradient(90deg, rgba(0, 0, 0, .38), transparent); }
|
||||
.guide__next { right: 0; background: linear-gradient(270deg, rgba(0, 0, 0, .38), transparent); }
|
||||
.guide__nav:hover { color: var(--mint-400); }
|
||||
.guide__prev:hover { background: linear-gradient(90deg, rgba(0, 0, 0, .6), transparent); }
|
||||
.guide__next:hover { background: linear-gradient(270deg, rgba(0, 0, 0, .6), transparent); }
|
||||
|
||||
/* footer: chapter + title | dots | count */
|
||||
.guide__foot { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: .3rem; min-height: .44rem; }
|
||||
.guide__label { display: flex; align-items: center; gap: .14rem; min-width: 0; }
|
||||
.guide__chtag {
|
||||
flex: none; padding: .02rem .12rem; font-size: .14rem; font-weight: 700; letter-spacing: .1em;
|
||||
color: var(--mint-400); border: 1px solid var(--mint-800); background: var(--mint-a10);
|
||||
}
|
||||
.guide__ptitle { font-size: .22rem; font-weight: 700; letter-spacing: .06em; color: var(--text-hi); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
||||
.guide__dots { display: flex; align-items: center; gap: .05rem; }
|
||||
.guide__dot {
|
||||
width: .2rem; height: .08rem; padding: 0; border: 0; background: var(--line-2);
|
||||
transition: background var(--t-fast), width var(--t-fast);
|
||||
}
|
||||
.guide__dot.is-first { margin-left: .14rem; }
|
||||
.guide__dot:hover { background: var(--line-3); }
|
||||
.guide__dot.is-on { width: .42rem; background: var(--mint-500); box-shadow: 0 0 .08rem rgba(23, 249, 183, .5); }
|
||||
.guide__count { justify-self: end; font-size: .24rem; color: var(--text-md); letter-spacing: .06em; }
|
||||
|
||||
/* text fallback (no local tutorial art) */
|
||||
.guide__stage--text { width: min(92vw, 10rem); max-height: calc(100vh - 2rem); overflow: auto; padding: .1rem .06rem; }
|
||||
.guide__tips ol { margin: .14rem 0 0; padding-left: .34rem; display: flex; flex-direction: column; gap: .08rem; }
|
||||
.guide__tips li { font-size: .18rem; line-height: 1.6; color: var(--text-md); }
|
||||
.guide__tips li::marker { color: var(--mint-500); font-family: var(--font-num); }
|
||||
|
||||
/* standard trigger */
|
||||
.guide-btn .btn__icon { color: var(--mint-500); }
|
||||
|
||||
@media (max-height: 560px) {
|
||||
.guide__box { padding: .08rem .12rem; gap: .06rem; }
|
||||
.guide__head { min-height: .5rem; }
|
||||
.guide__titles { display: none; }
|
||||
.guide__page { width: min(calc(96vw - .3rem), calc((100vh - 1.5rem) * 16 / 9)); }
|
||||
}
|
||||
@@ -0,0 +1,362 @@
|
||||
/* ==========================================================================================
|
||||
screens/loadout.css — 干员调配 (Operator loadout, DESIGN §16; js/screens/loadout.js): full-screen overlay with a
|
||||
filterable roster of the visible chess (left) and the selected chess's skills and elite modules (right).
|
||||
Official preset sprites (ui/outer: operator_preset, image_skill_select_outline, skill_select_deco, icon_equip_non)
|
||||
are used when the local-client art is present; every piece has a CSS fallback.
|
||||
Sizes are design px ÷ 100 (theme.css root scale); text that must stay readable on phones uses max(.xxrem, N px).
|
||||
========================================================================================== */
|
||||
|
||||
.lo {
|
||||
position: fixed; inset: 0; z-index: 55; /* above every screen (1) and the in-match banners (40), below the connection
|
||||
banner (60), modals / confirm dialogs (80), toasts and tooltips */
|
||||
display: flex; flex-direction: column;
|
||||
padding: var(--sa-t, 0px) var(--sa-r, 0px) var(--sa-b, 0px) var(--sa-l, 0px);
|
||||
background: var(--bg-0);
|
||||
color: var(--text-hi);
|
||||
animation: lo-in 200ms var(--ease-out) backwards;
|
||||
overscroll-behavior: contain;
|
||||
}
|
||||
@keyframes lo-in { from { opacity: 0; } }
|
||||
.lo__bg {
|
||||
position: absolute; inset: 0; pointer-events: none;
|
||||
background:
|
||||
radial-gradient(70% 90% at 18% 10%, rgba(78, 216, 175, .07), transparent 60%),
|
||||
radial-gradient(60% 70% at 100% 100%, rgba(52, 184, 216, .06), transparent 60%),
|
||||
linear-gradient(rgba(78, 216, 175, .035) 1px, transparent 1px) 0 0 / .6rem .6rem,
|
||||
linear-gradient(90deg, rgba(78, 216, 175, .035) 1px, transparent 1px) 0 0 / .6rem .6rem,
|
||||
linear-gradient(180deg, #0f1312, #090b0a);
|
||||
}
|
||||
.lo > * { position: relative; }
|
||||
|
||||
/* ---- top bar ---------------------------------------------------------------------------------------------------- */
|
||||
.lo-top {
|
||||
flex: none; display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: .2rem;
|
||||
height: max(1rem, 48px); padding: 0 .36rem;
|
||||
background: linear-gradient(180deg, rgba(8, 10, 9, .95), rgba(10, 13, 12, .6));
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
.lo-top::after {
|
||||
content: ''; position: absolute; left: .36rem; right: .36rem; bottom: -1px; height: 1px;
|
||||
background: linear-gradient(90deg, var(--mint-700), transparent 26%, transparent 74%, var(--mint-700));
|
||||
}
|
||||
.lo-top__left { justify-self: start; display: flex; align-items: center; gap: .14rem; }
|
||||
.lo-top__center { display: flex; flex-direction: column; align-items: center; gap: .02rem; }
|
||||
.lo-top__title { display: flex; align-items: center; gap: .12rem; margin: 0; font-size: max(.32rem, 16px); font-weight: 900; letter-spacing: .14em; line-height: 1.15; }
|
||||
.lo-top__icon { width: max(.3rem, 16px); height: max(.3rem, 16px); object-fit: contain; color: var(--mint-500); }
|
||||
.lo-top__right { justify-self: end; display: flex; align-items: center; gap: .16rem; min-width: 0; }
|
||||
.lo-count { font-size: max(.16rem, 11px); color: var(--text-lo); white-space: nowrap; }
|
||||
.lo-count b { color: var(--mint-400); font-size: max(.22rem, 13px); margin: 0 .02rem 0 .06rem; }
|
||||
/* co-op briefing: time left before the match locks the loadout (the overlay covers the briefing's own countdown) */
|
||||
.lo-deadline { --cd-h: max(.44rem, 20px); flex: none; }
|
||||
.lo-deadline .countdown__label { font-size: max(.11rem, 8px); }
|
||||
.lo-sync { font-size: max(.14rem, 10px); padding: .03rem .1rem; border: 1px solid var(--line-2); color: var(--text-lo); white-space: nowrap; letter-spacing: .04em; }
|
||||
.lo-sync.is-ok { color: var(--mint-400); border-color: var(--mint-800); }
|
||||
.lo-sync.is-busy { color: var(--text-md); }
|
||||
.lo-sync.is-warn { color: var(--amber); border-color: rgba(246, 163, 41, .45); }
|
||||
.lo-sync.is-bad { color: var(--red-premium); border-color: rgba(255, 84, 84, .45); }
|
||||
|
||||
.lo-note {
|
||||
flex: none; display: flex; align-items: center; gap: .08rem; margin: 0; padding: .07rem .36rem;
|
||||
font-size: max(.15rem, 10px); color: var(--text-lo);
|
||||
background: linear-gradient(90deg, rgba(78, 216, 175, .08), transparent 70%);
|
||||
border-bottom: 1px solid rgba(47, 58, 53, .6);
|
||||
}
|
||||
.lo-note .icon { width: max(.16rem, 11px); height: max(.16rem, 11px); color: var(--mint-500); flex: none; }
|
||||
.lo-note.is-locked { color: var(--amber); background: linear-gradient(90deg, rgba(246, 163, 41, .12), transparent 70%); }
|
||||
.lo-note.is-locked .icon { color: var(--amber); }
|
||||
|
||||
.lo-loading { flex: 1; display: flex; align-items: center; justify-content: center; gap: .14rem; color: var(--text-lo); font-size: max(.18rem, 12px); }
|
||||
|
||||
/* ---- body layout -------------------------------------------------------------------------------------------------- */
|
||||
.lo-body {
|
||||
flex: 1 1 auto; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 7rem);
|
||||
gap: .22rem; padding: .18rem .3rem .22rem;
|
||||
}
|
||||
.lo-roster { min-width: 0; min-height: 0; display: flex; flex-direction: column; gap: .12rem; }
|
||||
.lo-detail-wrap { min-width: 0; min-height: 0; display: flex; flex-direction: column; }
|
||||
.lo-detail-back { display: none; }
|
||||
|
||||
/* ---- filters ----------------------------------------------------------------------------------------------------------- */
|
||||
.lo-filters { flex: none; display: flex; flex-direction: column; gap: .08rem; }
|
||||
.lo-frow { display: flex; align-items: center; gap: .12rem; flex-wrap: wrap; min-width: 0; }
|
||||
.lo-chips { display: flex; align-items: center; gap: .05rem; flex-wrap: wrap; }
|
||||
.lo-chip {
|
||||
display: inline-flex; align-items: center; justify-content: center; gap: .05rem;
|
||||
min-width: max(.46rem, 26px); height: max(.4rem, 24px); padding: 0 .12rem;
|
||||
font: inherit; font-size: max(.15rem, 11px); font-weight: 700; color: var(--text-lo);
|
||||
background: rgba(255, 255, 255, .03); border: 1px solid var(--line); cursor: pointer;
|
||||
clip-path: polygon(.07rem 0, 100% 0, calc(100% - .07rem) 100%, 0 100%);
|
||||
transition: color var(--t-fast), background var(--t-fast), border-color var(--t-fast);
|
||||
touch-action: manipulation;
|
||||
}
|
||||
.lo-chip:hover { color: var(--text-hi); border-color: var(--line-3); }
|
||||
.lo-chip.is-on { color: var(--text-on-mint); background: var(--mint-500); border-color: var(--mint-400); }
|
||||
.lo-chip--tier .num { font-family: var(--font-num); font-size: max(.17rem, 12px); letter-spacing: .04em; }
|
||||
.lo-chip--t1 { --tc: var(--tier-1); } .lo-chip--t2 { --tc: var(--tier-2); } .lo-chip--t3 { --tc: var(--tier-3); }
|
||||
.lo-chip--t4 { --tc: var(--tier-4); } .lo-chip--t5 { --tc: var(--tier-5); } .lo-chip--t6 { --tc: var(--tier-6); }
|
||||
.lo-chip--tier { color: var(--tc); box-shadow: inset 0 -2px 0 var(--tc); }
|
||||
.lo-chip--tier.is-on { color: #0b0d0c; background: var(--tc); border-color: var(--tc); }
|
||||
.lo-chip__icon { width: max(.22rem, 14px); height: max(.22rem, 14px); object-fit: contain; }
|
||||
/* prof.large art is a black glyph on a white square: inverted + screen-blended it becomes a white glyph on any dark
|
||||
surface; on the mint "on" chip it is multiplied instead (dark glyph, the square takes the chip colour) */
|
||||
.lo-profglyph { filter: invert(1); mix-blend-mode: screen; opacity: .85; }
|
||||
.lo-chip:hover .lo-profglyph { opacity: 1; }
|
||||
.lo-chip.is-on .lo-profglyph { filter: none; mix-blend-mode: multiply; opacity: 1; }
|
||||
.lo-chip__lbl { font-size: max(.14rem, 10px); }
|
||||
.lo-search { flex: 1 1 2.6rem; min-width: 2rem; max-width: 4.2rem; margin-left: auto; }
|
||||
|
||||
.lo-select { display: inline-flex; align-items: center; gap: .06rem; height: max(.4rem, 24px); padding-left: .1rem; border: 1px solid var(--line); background: rgba(0, 0, 0, .35); }
|
||||
.lo-select__k { font-size: max(.13rem, 10px); color: var(--text-dim); letter-spacing: .06em; }
|
||||
.lo-select select {
|
||||
height: 100%; min-width: 1.6rem; padding: 0 .26rem 0 .06rem; border: 0; outline: none; cursor: pointer;
|
||||
font: inherit; font-size: max(.15rem, 11px); color: var(--text-hi);
|
||||
background: transparent url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path fill='%234ed8af' d='M7 9l5 6 5-6z'/></svg>") no-repeat right .04rem center / .2rem .2rem;
|
||||
-webkit-appearance: none; appearance: none;
|
||||
}
|
||||
.lo-select select option { background: var(--bg-2); color: var(--text-hi); }
|
||||
.lo-select:focus-within { border-color: var(--mint-700); }
|
||||
|
||||
.lo-toggle {
|
||||
display: inline-flex; align-items: center; gap: .07rem; height: max(.4rem, 24px); padding: 0 .12rem;
|
||||
font: inherit; font-size: max(.15rem, 11px); color: var(--text-lo); background: transparent; border: 1px solid transparent; cursor: pointer;
|
||||
touch-action: manipulation;
|
||||
}
|
||||
.lo-toggle__box { display: grid; place-items: center; width: max(.2rem, 14px); height: max(.2rem, 14px); border: 1px solid var(--line-3); }
|
||||
.lo-toggle__box .icon { width: 86%; height: 86%; opacity: 0; color: var(--text-on-mint); }
|
||||
.lo-toggle.is-on { color: var(--mint-400); }
|
||||
.lo-toggle.is-on .lo-toggle__box { background: var(--mint-500); border-color: var(--mint-400); }
|
||||
.lo-toggle.is-on .lo-toggle__box .icon { opacity: 1; }
|
||||
|
||||
/* ---- roster grid ------------------------------------------------------------------------------------------------------------ */
|
||||
.lo-grid {
|
||||
flex: 1 1 auto; min-height: 0; overflow: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain;
|
||||
display: grid; grid-template-columns: repeat(auto-fill, minmax(max(1.16rem, 64px), 1fr)); grid-auto-rows: max-content;
|
||||
align-content: start; gap: .1rem; padding: .06rem .08rem .2rem .02rem;
|
||||
scrollbar-width: thin; scrollbar-color: var(--line-3) transparent;
|
||||
}
|
||||
.lo-empty { grid-column: 1 / -1; padding: .4rem; text-align: center; font-size: max(.16rem, 11px); }
|
||||
|
||||
.lo-card {
|
||||
--tc: var(--tier-1);
|
||||
position: relative; display: flex; flex-direction: column; align-items: stretch; min-width: 0;
|
||||
padding: 0; font: inherit; color: var(--text-hi); text-align: left; cursor: pointer;
|
||||
background: linear-gradient(180deg, rgba(34, 41, 38, .95), rgba(14, 17, 16, .98));
|
||||
border: 1px solid var(--line); box-shadow: inset 0 -2px 0 var(--tc);
|
||||
transition: border-color var(--t-fast), transform var(--t-fast), box-shadow var(--t-fast);
|
||||
touch-action: manipulation;
|
||||
}
|
||||
.lo-card--t1 { --tc: var(--tier-1); } .lo-card--t2 { --tc: var(--tier-2); } .lo-card--t3 { --tc: var(--tier-3); }
|
||||
.lo-card--t4 { --tc: var(--tier-4); } .lo-card--t5 { --tc: var(--tier-5); } .lo-card--t6 { --tc: var(--tier-6); }
|
||||
.lo-card:hover { border-color: var(--line-3); transform: translateY(-1px); }
|
||||
.lo-card.is-sel { border-color: var(--mint-400); box-shadow: inset 0 -2px 0 var(--tc), 0 0 0 1px var(--mint-500), 0 0 .16rem rgba(23, 249, 183, .35); }
|
||||
.lo-card:focus-visible { outline: 2px solid var(--mint-400); outline-offset: 1px; }
|
||||
.lo-card__art { position: relative; display: block; aspect-ratio: 1; overflow: hidden; background: #1b201e; }
|
||||
.lo-card__art img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
||||
.lo-card__art::after { content: ''; position: absolute; inset: 55% 0 0; background: linear-gradient(180deg, transparent, rgba(8, 10, 9, .85)); }
|
||||
.lo-card__glyph { display: grid; place-items: center; width: 100%; height: 100%; font-size: .44rem; font-weight: 900; color: var(--text-dim); }
|
||||
.lo-card__tier { position: absolute; left: .03rem; top: .03rem; z-index: 1; }
|
||||
.lo-card__flag {
|
||||
position: absolute; right: 0; top: 0; z-index: 1; width: .22rem; height: .22rem;
|
||||
background: linear-gradient(225deg, var(--mint-400) 50%, transparent 50%);
|
||||
}
|
||||
.lo-card__name {
|
||||
position: absolute; left: .05rem; right: .05rem; top: calc(100% - max(.64rem, 34px)); z-index: 1;
|
||||
font-size: max(.15rem, 10px); font-weight: 700; line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
|
||||
text-shadow: 0 1px 2px #000;
|
||||
}
|
||||
.lo-card__kit { display: flex; align-items: center; justify-content: space-between; gap: .04rem; height: max(.3rem, 18px); padding: 0 .04rem; background: rgba(0, 0, 0, .4); }
|
||||
.lo-card__sk { display: inline-flex; align-items: center; gap: .04rem; font-size: max(.13rem, 9px); color: var(--text-lo); }
|
||||
.lo-card__sk b { font-family: var(--font-num); letter-spacing: .04em; }
|
||||
.lo-card__sk.is-alt { color: var(--mint-400); }
|
||||
.lo-card__mod {
|
||||
display: inline-grid; place-items: center; min-width: max(.24rem, 15px); height: max(.2rem, 13px); padding: 0 .03rem;
|
||||
font-family: var(--font-num); font-size: max(.13rem, 9px); font-weight: 700; color: var(--text-lo);
|
||||
border: 1px solid var(--line-2); background: rgba(255, 255, 255, .04);
|
||||
}
|
||||
.lo-card__mod.is-alt { color: var(--text-on-mint); background: var(--gold-2); border-color: var(--gold); }
|
||||
|
||||
/* ---- skill icon / module glyph ---------------------------------------------------------------------------------------------- */
|
||||
.lo-sicon { position: relative; flex: none; display: inline-grid; place-items: center; width: .72rem; height: .72rem; background: #151a18; border: 1px solid var(--line-2); }
|
||||
.lo-sicon img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
||||
.lo-sicon--xs { width: max(.2rem, 13px); height: max(.2rem, 13px); border: 0; background: transparent; }
|
||||
.lo-sicon--xs .lo-sicon__glyph { display: none; }
|
||||
.lo-sicon--md { width: max(.72rem, 38px); height: max(.72rem, 38px); }
|
||||
.lo-sicon__glyph { font-family: var(--font-num); font-size: max(.2rem, 12px); font-weight: 700; color: var(--text-lo); letter-spacing: .04em; }
|
||||
.lo-sicon.is-on { border-color: #1ea0ff; }
|
||||
.lo-sicon__outline { position: absolute; inset: -.05rem; width: calc(100% + .1rem) !important; height: calc(100% + .1rem) !important; object-fit: fill; pointer-events: none; }
|
||||
.lo-sicon__ring { position: absolute; inset: -.05rem; border: 2px solid #1ea0ff; pointer-events: none; }
|
||||
|
||||
.lo-mglyph { position: relative; flex: none; display: inline-grid; place-items: center; width: max(.56rem, 30px); height: max(.56rem, 30px);
|
||||
background: linear-gradient(180deg, #2a322f, #151a18); border: 1px solid var(--line-3); }
|
||||
.lo-mglyph img { width: 78%; height: 78%; object-fit: contain; }
|
||||
.lo-mglyph__t { font-family: var(--font-num); font-size: max(.26rem, 15px); font-weight: 700; color: var(--gold-2); line-height: 1; }
|
||||
.lo-mglyph--none { background: #121615; border-style: dashed; }
|
||||
.lo-mglyph__slash { position: absolute; inset: 22%; border-radius: 50%; border: 2px solid var(--text-dim); }
|
||||
.lo-mglyph__slash::after { content: ''; position: absolute; left: 50%; top: -10%; bottom: -10%; width: 2px; background: var(--text-dim); transform: translateX(-50%) rotate(45deg); }
|
||||
|
||||
/* ---- detail panel -------------------------------------------------------------------------------------------------------- */
|
||||
.lo-detail {
|
||||
--bk-c: var(--mint-500);
|
||||
flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column;
|
||||
background: linear-gradient(180deg, rgba(24, 30, 28, .97), rgba(10, 13, 12, .98));
|
||||
border: 1px solid var(--line-2); box-shadow: 0 .14rem .4rem rgba(0, 0, 0, .45);
|
||||
}
|
||||
.lo-detail--empty { align-items: center; justify-content: center; font-size: max(.16rem, 11px); }
|
||||
.lo-dhead { position: relative; flex: none; display: grid; grid-template-columns: max(1.3rem, 60px) minmax(0, 1fr); gap: .16rem; padding: .16rem .18rem .14rem; border-bottom: 1px solid var(--line); }
|
||||
.lo-dhead__art { position: relative; overflow: hidden; aspect-ratio: 1 / 1.25; background: #1b201e; border: 1px solid var(--line-2); box-shadow: inset 0 -3px 0 var(--tc, var(--tier-1)); }
|
||||
.lo-dhead__art--t1 { --tc: var(--tier-1); } .lo-dhead__art--t2 { --tc: var(--tier-2); } .lo-dhead__art--t3 { --tc: var(--tier-3); }
|
||||
.lo-dhead__art--t4 { --tc: var(--tier-4); } .lo-dhead__art--t5 { --tc: var(--tier-5); } .lo-dhead__art--t6 { --tc: var(--tier-6); }
|
||||
.lo-dhead__art img { width: 100%; height: 100%; object-fit: cover; object-position: 50% 12%; display: block; }
|
||||
.lo-dhead__art .uthumb { width: 100%; height: 100%; }
|
||||
.lo-dhead__info { min-width: 0; display: flex; flex-direction: column; gap: .04rem; }
|
||||
.lo-dhead__chips { display: flex; align-items: center; gap: .08rem; }
|
||||
.lo-dhead__name { margin: .02rem 0 0; font-size: max(.34rem, 17px); font-weight: 900; letter-spacing: .06em; line-height: 1.1; }
|
||||
.lo-dhead__en { font-family: var(--font-display); font-size: max(.13rem, 9px); letter-spacing: .14em; color: var(--text-dim); text-transform: uppercase; }
|
||||
.lo-dhead__class { display: flex; align-items: center; gap: .05rem; font-size: max(.15rem, 10px); color: var(--text-md); }
|
||||
.lo-dhead__prof { width: max(.2rem, 13px); height: max(.2rem, 13px); object-fit: contain; }
|
||||
.lo-sep { width: 1px; height: .16rem; background: var(--line-3); margin: 0 .04rem; }
|
||||
.lo-dhead__bonds { display: flex; flex-wrap: wrap; gap: .05rem; margin-top: .02rem; }
|
||||
.lo-bond { display: inline-flex; align-items: center; gap: .04rem; padding: .01rem .08rem .01rem .04rem; font-size: max(.13rem, 9px); color: var(--text-md); background: rgba(255, 255, 255, .04); border: 1px solid var(--line); }
|
||||
.lo-bond__icon { width: max(.18rem, 12px); height: max(.18rem, 12px); object-fit: contain; }
|
||||
.lo-bond__dot { width: .1rem; height: .1rem; border-radius: 50%; background: var(--mint-700); }
|
||||
.lo-dhead__reset { position: absolute; right: .12rem; top: .12rem; }
|
||||
|
||||
.lo-detail__body { flex: 1 1 auto; min-height: 0; overflow: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; padding: .12rem .18rem .2rem; scrollbar-width: thin; scrollbar-color: var(--line-3) transparent; }
|
||||
.lo-sec { display: flex; flex-direction: column; gap: .08rem; }
|
||||
.lo-sec + .lo-sec { margin-top: .18rem; }
|
||||
.lo-sec__head { display: flex; align-items: center; gap: .12rem; min-height: max(.36rem, 22px); }
|
||||
.lo-sec__head h3 { display: flex; align-items: baseline; gap: .08rem; margin: 0; font-size: max(.2rem, 13px); font-weight: 900; letter-spacing: .1em; }
|
||||
.lo-sec__head h3::before { content: ''; align-self: center; width: .05rem; height: .2rem; background: var(--mint-500); }
|
||||
.lo-sec__note { margin-left: auto; font-size: max(.13rem, 9px); color: var(--text-dim); }
|
||||
.lo-sec__note b { color: var(--text-md); }
|
||||
|
||||
.lo-seg { margin-left: auto; display: inline-flex; border: 1px solid var(--line-2); }
|
||||
.lo-seg button {
|
||||
height: max(.32rem, 22px); padding: 0 .12rem; font: inherit; font-size: max(.13rem, 10px); color: var(--text-lo);
|
||||
background: transparent; border: 0; cursor: pointer; touch-action: manipulation;
|
||||
}
|
||||
.lo-seg button + button { border-left: 1px solid var(--line-2); }
|
||||
.lo-seg button.is-on { color: var(--text-on-mint); background: var(--mint-500); }
|
||||
.lo-seg button:disabled { opacity: .4; cursor: default; }
|
||||
|
||||
/* skills */
|
||||
.lo-skills { display: flex; flex-direction: column; gap: .07rem; }
|
||||
.lo-skill {
|
||||
position: relative; display: flex; align-items: flex-start; gap: .14rem; width: 100%; padding: .1rem .12rem .1rem .16rem;
|
||||
font: inherit; color: var(--text-md); text-align: left; cursor: pointer;
|
||||
background: rgba(255, 255, 255, .025); border: 1px solid var(--line);
|
||||
transition: background var(--t-fast), border-color var(--t-fast);
|
||||
touch-action: manipulation;
|
||||
}
|
||||
.lo-skill:hover { border-color: var(--line-3); background: rgba(255, 255, 255, .04); }
|
||||
.lo-skill.is-on { color: var(--text-hi); background: linear-gradient(90deg, rgba(30, 160, 255, .13), rgba(30, 160, 255, .02) 70%); border-color: rgba(30, 160, 255, .55); }
|
||||
.lo-skill__deco { position: absolute; left: -1px; top: 50%; transform: translate(-40%, -50%); width: .14rem; height: .17rem; }
|
||||
.lo-skill__deco img, .lo-skill__deco i { display: block; width: 100%; height: 100%; }
|
||||
.lo-skill__deco i { background: #1ea0ff; clip-path: polygon(0 0, 100% 50%, 0 100%); }
|
||||
.lo-skill__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: .05rem; }
|
||||
.lo-skill__head { display: flex; align-items: center; gap: .08rem; flex-wrap: wrap; }
|
||||
.lo-skill__slot { font-family: var(--font-num); font-size: max(.13rem, 9px); font-weight: 700; color: var(--text-dim); padding: 0 .05rem; border: 1px solid var(--line-2); letter-spacing: .06em; }
|
||||
.lo-skill.is-on .lo-skill__slot { color: #7cc8ff; border-color: rgba(30, 160, 255, .55); }
|
||||
.lo-skill__name { font-size: max(.19rem, 12px); font-weight: 700; color: var(--text-hi); }
|
||||
.lo-skill__tags { display: flex; flex-wrap: wrap; align-items: center; gap: .06rem; }
|
||||
.lo-skill__desc { display: block; font-size: max(.15rem, 10px); line-height: 1.55; color: var(--text-md); }
|
||||
.lo-sp { padding: .01rem .07rem; font-size: max(.12rem, 9px); font-weight: 700; color: #0b0d0c; background: #9bd26b; }
|
||||
.lo-sp--atk { background: #ff9a3c; }
|
||||
.lo-sp--def { background: #f5c542; }
|
||||
.lo-sp--passive { background: #9aa4a0; }
|
||||
.lo-tag { font-size: max(.13rem, 9px); color: var(--text-lo); }
|
||||
.lo-tag b { color: var(--text-hi); font-family: var(--font-num); margin-left: .02rem; }
|
||||
|
||||
.lo-badge { display: inline-flex; align-items: center; gap: .03rem; padding: .01rem .07rem; font-size: max(.12rem, 9px); font-weight: 700; line-height: 1.4; letter-spacing: .04em; white-space: nowrap; }
|
||||
.lo-badge .icon { width: .13rem; height: .13rem; }
|
||||
.lo-badge--def { color: var(--gold-2); border: 1px solid rgba(242, 189, 62, .55); }
|
||||
.lo-badge--on { color: #0b1a26; background: #1ea0ff; }
|
||||
.lo-badge--changed { color: var(--text-on-mint); background: var(--mint-500); }
|
||||
.lo-badge--plain { color: var(--text-dim); border: 1px solid var(--line-2); }
|
||||
|
||||
/* modules */
|
||||
.lo-mods { display: flex; flex-wrap: wrap; gap: .08rem; }
|
||||
.lo-mod {
|
||||
position: relative; flex: 1 1 1.9rem; min-width: 1.7rem; max-width: 3.2rem; display: flex; align-items: center; gap: .1rem; padding: .08rem .12rem .08rem .08rem;
|
||||
font: inherit; color: var(--text-md); text-align: left; cursor: pointer;
|
||||
background: rgba(255, 255, 255, .025); border: 1px solid var(--line);
|
||||
transition: background var(--t-fast), border-color var(--t-fast); touch-action: manipulation;
|
||||
}
|
||||
.lo-mod:hover { border-color: var(--line-3); }
|
||||
.lo-mod.is-on { color: var(--text-hi); background: linear-gradient(90deg, rgba(242, 189, 62, .14), rgba(242, 189, 62, .02) 75%); border-color: rgba(242, 189, 62, .7); }
|
||||
.lo-mod.is-on .lo-mglyph { border-color: var(--gold-2); box-shadow: 0 0 .1rem rgba(255, 198, 0, .35); }
|
||||
.lo-mod__text { min-width: 0; display: flex; flex-direction: column; gap: .01rem; }
|
||||
.lo-mod__type { font-family: var(--font-num); font-size: max(.12rem, 9px); letter-spacing: .1em; color: var(--text-dim); }
|
||||
.lo-mod__name { font-size: max(.16rem, 11px); font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
||||
.lo-mod__def { position: absolute; right: .04rem; top: .04rem; }
|
||||
|
||||
.lo-minfo { margin-top: .04rem; padding: .1rem .12rem; display: flex; flex-direction: column; gap: .07rem; background: rgba(0, 0, 0, .28); border: 1px solid var(--line); border-left: 3px solid var(--gold-2); }
|
||||
.lo-minfo--none { border-left-color: var(--line-3); }
|
||||
.lo-minfo__lead { margin: 0; font-size: max(.15rem, 10px); color: var(--text-lo); }
|
||||
.lo-minfo__title { display: flex; align-items: center; gap: .08rem; font-size: max(.17rem, 11px); }
|
||||
.lo-minfo__type { font-family: var(--font-num); font-size: max(.13rem, 9px); color: var(--gold-2); letter-spacing: .1em; }
|
||||
.lo-minfo__icon { flex: none; width: max(.26rem, 16px); height: max(.26rem, 16px); object-fit: contain; }
|
||||
.lo-minfo__row { display: grid; grid-template-columns: max(.5rem, 28px) minmax(0, 1fr); gap: .08rem; align-items: baseline; }
|
||||
.lo-minfo__k { font-size: max(.13rem, 9px); color: var(--text-dim); letter-spacing: .08em; }
|
||||
.lo-minfo__v { font-size: max(.15rem, 10px); line-height: 1.55; color: var(--text-md); }
|
||||
.lo-minfo__tname { color: var(--text-hi); margin-right: .06rem; }
|
||||
.lo-attrs { display: flex; flex-wrap: wrap; gap: .06rem; }
|
||||
.lo-attr { display: inline-flex; align-items: baseline; gap: .04rem; padding: .01rem .08rem; background: rgba(255, 255, 255, .04); border: 1px solid var(--line); font-size: max(.13rem, 9px); color: var(--text-lo); }
|
||||
.lo-attr b { font-family: var(--font-num); font-size: max(.15rem, 10px); }
|
||||
.lo-attr.is-up b { color: var(--mint-400); }
|
||||
.lo-attr.is-down b { color: var(--red-premium); }
|
||||
.lo-locknote { display: flex; align-items: center; gap: .06rem; margin: .16rem 0 0; font-size: max(.14rem, 10px); color: var(--amber); }
|
||||
.lo-locknote .icon { width: .16rem; height: .16rem; }
|
||||
|
||||
/* ---- entry button (lobby / room / briefing) --------------------------------------------------------------------------- */
|
||||
.lo-entry { position: relative; gap: .08rem; }
|
||||
.lo-entry__icon { width: 1.25em; height: 1.25em; object-fit: contain; flex: none; }
|
||||
.lo-entry__n {
|
||||
display: inline-grid; place-items: center; min-width: 1.5em; height: 1.5em; padding: 0 .3em; margin-left: .02rem;
|
||||
font-size: .8em; font-weight: 700; color: var(--text-on-mint); background: var(--mint-500); border-radius: 1em;
|
||||
}
|
||||
|
||||
/* Untimed phases (user playtest #11: the official 独立模拟 shows no countdown outside combat — the server sends
|
||||
deadline 0 for them, Match.soloUntimed): ui/components.js Countdown renders its "无倒计时" placeholder ("--" digits +
|
||||
COUNTDOWN label), which reads as a timer — it is not shown at all. (Owner of components.js: returning null there
|
||||
for a missing deadline makes this rule a no-op.) */
|
||||
.countdown[aria-label="无倒计时"] { display: none; }
|
||||
|
||||
/* the app screens behind the overlay do not need to animate */
|
||||
.sp-loadout-open .app-root > .screen { visibility: hidden; }
|
||||
|
||||
/* ---- narrow / short viewports ------------------------------------------------------------------------------------------- */
|
||||
@media (max-width: 1100px) {
|
||||
.lo-body { grid-template-columns: minmax(0, 1fr) minmax(0, 6.4rem); gap: .16rem; padding: .12rem .2rem .16rem; }
|
||||
.lo-chip__lbl { display: none; }
|
||||
}
|
||||
/* phones (the root scale is clamped at 40 px: less than ~14 rem of width): the detail slides over the roster */
|
||||
@media (max-width: 760px) {
|
||||
.lo-top { padding: 0 .16rem; }
|
||||
.lo-count, .lo-sync { display: none; }
|
||||
.lo-body { grid-template-columns: minmax(0, 1fr); }
|
||||
.lo-detail-wrap { display: none; }
|
||||
.lo-body.is-detail .lo-roster { display: none; }
|
||||
.lo-body.is-detail .lo-detail-wrap { display: flex; }
|
||||
.lo-detail-back {
|
||||
display: inline-flex; align-self: flex-start; align-items: center; gap: .04rem; margin-bottom: .08rem; padding: .04rem .12rem .04rem .04rem;
|
||||
font: inherit; font-size: max(.15rem, 11px); color: var(--mint-400); background: transparent; border: 1px solid var(--mint-800); cursor: pointer;
|
||||
}
|
||||
.lo-detail-back .icon { width: .2rem; height: .2rem; }
|
||||
}
|
||||
@media (max-height: 520px) {
|
||||
.lo-note { display: none; }
|
||||
.lo-dhead { grid-template-columns: max(1rem, 48px) minmax(0, 1fr); padding: .1rem .14rem; }
|
||||
.lo-dhead__en { display: none; }
|
||||
.lo-grid { grid-template-columns: repeat(auto-fill, minmax(max(1rem, 58px), 1fr)); }
|
||||
}
|
||||
/* the shared Button / TextField scale with the root (40 px/rem on phones ⇒ 6–7 px text, 14–20 px tall): the overlay's
|
||||
own controls (返回, 全部恢复默认, 恢复默认, the search field) keep a readable size and a tappable height (review fix) */
|
||||
.lo .lo-back { height: max(.5rem, 32px); padding: 0 max(.2rem, 10px) 0 max(.12rem, 6px); font-size: max(.18rem, 12px); }
|
||||
.lo .lo-top__right .btn, .lo .lo-dhead__reset { height: max(.36rem, 28px); padding: 0 max(.16rem, 8px); font-size: max(.15rem, 11px); }
|
||||
.lo .lo-search .field__box { height: max(.56rem, 28px); padding: 0 max(.16rem, 6px); }
|
||||
.lo .lo-search .field__input { font-size: max(.2rem, 12px); }
|
||||
.lo .lo-search .field__icon { width: max(.22rem, 14px); height: max(.22rem, 14px); }
|
||||
.sp-coarse .lo-chip, .sp-coarse .lo-toggle, .sp-coarse .lo-select { min-height: 30px; }
|
||||
.sp-coarse .lo-seg button { min-height: 28px; }
|
||||
@media (prefers-reduced-motion: reduce) { .lo, .lo-card { animation: none; transition: none; } }
|
||||
@@ -0,0 +1,240 @@
|
||||
/* ==========================================================================================
|
||||
screens/lobby.css — mode cards (独立/同盟), difficulty cards, create button, join panel.
|
||||
========================================================================================== */
|
||||
|
||||
.lobby-body {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
|
||||
gap: .5rem;
|
||||
width: 100%;
|
||||
max-width: 19.2rem;
|
||||
margin: 0 auto;
|
||||
padding: .36rem .6rem .4rem;
|
||||
align-content: start;
|
||||
}
|
||||
.lobby-left, .lobby-right { display: flex; flex-direction: column; min-width: 0; }
|
||||
|
||||
/* ---- mode cards ------------------------------------------------------------------------------------ */
|
||||
.mode-cards { display: grid; grid-template-columns: 1fr 1fr; gap: .24rem; margin-bottom: .34rem; }
|
||||
.mode-card {
|
||||
--bk-c: transparent;
|
||||
--bk-l: .2rem;
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: .22rem;
|
||||
min-height: 4.3rem;
|
||||
padding: .34rem .32rem .3rem;
|
||||
overflow: hidden;
|
||||
text-align: left;
|
||||
background: linear-gradient(180deg, rgba(28, 34, 31, .92), rgba(13, 16, 15, .94));
|
||||
border: 1px solid var(--line);
|
||||
color: var(--text-hi);
|
||||
transition: border-color var(--t-med) var(--ease-out), box-shadow var(--t-med) var(--ease-out), transform var(--t-fast) var(--ease-out);
|
||||
animation: card-in var(--t-slow) var(--ease-out) backwards;
|
||||
}
|
||||
.mode-card:nth-child(2) { animation-delay: 60ms; }
|
||||
.mode-card__bg {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
pointer-events: none;
|
||||
background:
|
||||
radial-gradient(70% 55% at 100% 0%, rgba(78, 216, 175, .10), transparent 70%),
|
||||
repeating-linear-gradient(-45deg, rgba(255, 255, 255, .018) 0 2px, transparent 2px 12px),
|
||||
linear-gradient(transparent 70%, rgba(0, 0, 0, .35));
|
||||
transition: opacity var(--t-med);
|
||||
}
|
||||
.mode-card::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
height: 3px;
|
||||
background: linear-gradient(90deg, var(--mint-500), transparent);
|
||||
transform: scaleX(0);
|
||||
transform-origin: left;
|
||||
transition: transform var(--t-slow) var(--ease-out);
|
||||
}
|
||||
.mode-card__icon {
|
||||
position: relative;
|
||||
width: .88rem;
|
||||
height: .88rem;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
background: #0c0f0e;
|
||||
border: 1px solid var(--line-2);
|
||||
color: var(--text-md);
|
||||
clip-path: polygon(25% 0, 75% 0, 100% 50%, 75% 100%, 25% 100%, 0 50%);
|
||||
transition: background var(--t-med), color var(--t-med);
|
||||
}
|
||||
.mode-card__icon .icon { width: .44rem; height: .44rem; }
|
||||
.mode-card__text { position: relative; display: flex; flex-direction: column; gap: .1rem; }
|
||||
.mode-card__name { font-size: .46rem; font-weight: 900; letter-spacing: .08em; line-height: 1.1; }
|
||||
.mode-card__desc { font-size: .17rem; color: var(--text-lo); line-height: 1.65; max-width: 3.6rem; }
|
||||
.mode-card__points { display: flex; flex-direction: column; gap: .05rem; margin-top: .06rem; font-size: .15rem; color: var(--text-md); }
|
||||
.mode-card__points span::before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
width: .06rem;
|
||||
height: .06rem;
|
||||
margin: 0 .1rem .02rem 0;
|
||||
background: var(--mint-700);
|
||||
transform: rotate(45deg);
|
||||
vertical-align: middle;
|
||||
}
|
||||
.mode-card__check {
|
||||
position: absolute;
|
||||
top: .2rem;
|
||||
right: .2rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: .05rem;
|
||||
padding: .04rem .12rem .04rem .08rem;
|
||||
background: var(--mint-500);
|
||||
color: var(--text-on-mint);
|
||||
font-size: .14rem;
|
||||
font-weight: 700;
|
||||
opacity: 0;
|
||||
transform: translateY(-.06rem);
|
||||
transition: opacity var(--t-med), transform var(--t-med) var(--ease-out);
|
||||
}
|
||||
.mode-card__check .icon { width: .16rem; height: .16rem; }
|
||||
.mode-card:hover { border-color: var(--line-3); --bk-c: var(--line-3); }
|
||||
.mode-card:active { transform: translateY(1px); }
|
||||
.mode-card.is-selected {
|
||||
--bk-c: var(--mint-400);
|
||||
border-color: var(--mint-700);
|
||||
box-shadow: 0 0 0 1px rgba(78, 216, 175, .22), 0 0 .44rem rgba(23, 249, 183, .13), inset 0 0 .7rem rgba(23, 249, 183, .05);
|
||||
}
|
||||
.mode-card.is-selected::before { transform: scaleX(1); }
|
||||
.mode-card.is-selected .mode-card__icon { background: var(--mint-500); border-color: var(--mint-400); color: var(--text-on-mint); }
|
||||
.mode-card.is-selected .mode-card__check { opacity: 1; transform: none; }
|
||||
@keyframes card-in { from { opacity: 0; transform: translateY(.14rem); } }
|
||||
|
||||
/* ---- join panel ------------------------------------------------------------------------------------ */
|
||||
.join-panel .panel__body { display: flex; flex-direction: column; gap: .14rem; padding: .22rem .26rem .18rem; }
|
||||
.join-row { display: flex; gap: .16rem; align-items: stretch; }
|
||||
.join-row .field { flex: 1; }
|
||||
.join-row .btn { height: .64rem; }
|
||||
.join-foot { display: flex; align-items: center; flex-wrap: wrap; gap: .1rem; min-height: .32rem; font-size: .14rem; }
|
||||
.code-chip {
|
||||
padding: .03rem .12rem .03rem .16rem;
|
||||
border: 1px solid var(--line-2);
|
||||
background: rgba(0, 0, 0, .3);
|
||||
color: var(--amber);
|
||||
font-size: .17rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: .2em;
|
||||
transition: border-color var(--t-fast), background-color var(--t-fast);
|
||||
}
|
||||
.code-chip:hover { border-color: var(--amber); background: rgba(246, 163, 41, .08); }
|
||||
|
||||
/* ---- tips -------------------------------------------------------------------------------------------- */
|
||||
.tips {
|
||||
--bk-c: var(--line-3);
|
||||
margin-top: .3rem;
|
||||
padding: .16rem .22rem .2rem;
|
||||
background: rgba(8, 10, 9, .55);
|
||||
border: 1px solid var(--line);
|
||||
}
|
||||
.tips__head { display: flex; align-items: center; gap: .1rem; font-size: .16rem; font-weight: 700; color: var(--text-md); }
|
||||
.tips__head > .icon { width: .2rem; height: .2rem; color: var(--mint-500); }
|
||||
.tips__idx { margin-left: auto; font-size: .16rem; color: var(--text-md); }
|
||||
.tips__nav {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: .3rem;
|
||||
height: .3rem;
|
||||
padding: 0;
|
||||
border: 1px solid var(--line-2);
|
||||
background: transparent;
|
||||
color: var(--text-lo);
|
||||
transition: color var(--t-fast), border-color var(--t-fast);
|
||||
}
|
||||
.tips__nav:hover { color: var(--mint-400); border-color: var(--mint-700); }
|
||||
.tips__nav .icon { width: .18rem; height: .18rem; }
|
||||
.tips__text { margin-top: .1rem; font-size: .17rem; color: var(--text-lo); line-height: 1.6; animation: tip-in var(--t-slow) var(--ease-out); }
|
||||
@keyframes tip-in { from { opacity: 0; transform: translateX(.1rem); } }
|
||||
|
||||
/* ---- difficulty cards -------------------------------------------------------------------------------- */
|
||||
.diff-list { display: flex; flex-direction: column; gap: .14rem; }
|
||||
.diff-card {
|
||||
--d-color: var(--amber);
|
||||
position: relative;
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr) auto;
|
||||
grid-template-rows: auto auto auto;
|
||||
gap: .06rem .2rem;
|
||||
padding: .18rem .24rem .18rem .36rem;
|
||||
overflow: hidden;
|
||||
text-align: left;
|
||||
background: linear-gradient(90deg, rgba(28, 34, 31, .93), rgba(15, 19, 17, .93));
|
||||
border: 1px solid var(--line);
|
||||
color: var(--text-hi);
|
||||
transition: border-color var(--t-med), box-shadow var(--t-med), background var(--t-med);
|
||||
animation: card-in var(--t-slow) var(--ease-out) backwards;
|
||||
}
|
||||
.diff-card:nth-child(2) { animation-delay: 40ms; }
|
||||
.diff-card:nth-child(3) { animation-delay: 80ms; }
|
||||
.diff-card:nth-child(4) { animation-delay: 120ms; }
|
||||
.diff-card__bar { position: absolute; left: 0; top: 0; bottom: 0; width: .06rem; background: var(--d-color); opacity: .45; transition: opacity var(--t-med), box-shadow var(--t-med); }
|
||||
.diff-card__head { grid-column: 1 / -1; display: flex; align-items: center; gap: .1rem; min-width: 0; }
|
||||
.diff-card__glyph { width: .28rem; height: .28rem; color: var(--d-color); filter: drop-shadow(0 0 5px var(--d-color)); filter: drop-shadow(0 0 5px color-mix(in srgb, var(--d-color) 55%, transparent)); }
|
||||
.diff-card__name { font-size: .27rem; font-weight: 900; letter-spacing: .06em; color: var(--d-color); }
|
||||
.diff-card__code { font-size: .14rem; color: var(--text-dim); letter-spacing: .1em; }
|
||||
.diff-card__meta { margin-left: auto; display: flex; align-items: center; gap: .04rem; font-size: .14rem; color: var(--text-lo); white-space: nowrap; }
|
||||
.diff-card__meta .num { color: var(--text-hi); font-weight: 700; font-size: .17rem; }
|
||||
.diff-card__hidden {
|
||||
margin-left: .08rem;
|
||||
padding: 0 .07rem;
|
||||
border: 1px solid transparent; border: 1px solid color-mix(in srgb, var(--d-color) 45%, transparent);
|
||||
color: var(--d-color); color: color-mix(in srgb, var(--d-color) 80%, #fff);
|
||||
font-size: .12rem;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.diff-card__desc { grid-column: 1; font-size: .16rem; color: var(--text-md); }
|
||||
.diff-card__effects { grid-column: 1; display: flex; flex-wrap: wrap; gap: .04rem .2rem; font-size: .14rem; color: var(--text-lo); }
|
||||
.diff-card__effects span::before { content: '·'; margin-right: .05rem; color: var(--d-color); font-weight: 900; }
|
||||
/* battlefield pool note (config.json modes[].stages): 战场固定为 战场#01 / 战场随机(共N张) — the last item of the
|
||||
effects row (no extra card height: the lobby must not scroll at 1280×720 / 1920×1080) */
|
||||
.diff-card__effects .diff-card__stage { display: inline-flex; align-self: flex-start; align-items: center; gap: .05rem; }
|
||||
.diff-card__effects .diff-card__stage::before { content: none; }
|
||||
.diff-card__stage .icon { flex: none; width: .15rem; height: .15rem; color: var(--d-color); opacity: .85; }
|
||||
.diff-card__check {
|
||||
grid-column: 2;
|
||||
grid-row: 2 / span 2;
|
||||
align-self: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: .03rem;
|
||||
font-size: .12rem;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
.diff-card__check .icon {
|
||||
width: .46rem;
|
||||
height: .46rem;
|
||||
padding: .09rem;
|
||||
border-radius: 50%;
|
||||
border: 2px solid var(--line-2);
|
||||
color: transparent;
|
||||
transition: background var(--t-med), border-color var(--t-med), color var(--t-med), transform var(--t-med) var(--ease-out);
|
||||
}
|
||||
.diff-card__check span { opacity: 0; transition: opacity var(--t-med); }
|
||||
.diff-card:hover { border-color: var(--line-3); }
|
||||
.diff-card.is-selected {
|
||||
border-color: var(--d-color); border-color: color-mix(in srgb, var(--d-color) 65%, transparent);
|
||||
background: linear-gradient(90deg, #151a18, rgba(15, 19, 17, .95) 70%); background: linear-gradient(90deg, color-mix(in srgb, var(--d-color) 15%, #151a18), rgba(15, 19, 17, .95) 70%);
|
||||
box-shadow: 0 0 .3rem transparent; box-shadow: 0 0 .3rem color-mix(in srgb, var(--d-color) 16%, transparent);
|
||||
}
|
||||
.diff-card.is-selected .diff-card__bar { opacity: 1; box-shadow: 0 0 .14rem var(--d-color); }
|
||||
.diff-card.is-selected .diff-card__check { color: var(--d-color); }
|
||||
.diff-card.is-selected .diff-card__check .icon { background: var(--d-color); border-color: var(--d-color); color: #150a04; transform: rotate(-8deg); }
|
||||
.diff-card.is-selected .diff-card__check span { opacity: 1; }
|
||||
|
||||
/* ---- create ------------------------------------------------------------------------------------------ */
|
||||
.create-box { margin-top: .3rem; display: flex; flex-direction: column; gap: .12rem; }
|
||||
.create-box .btn--xl { height: .92rem; font-size: .32rem; letter-spacing: .3em; }
|
||||
.create-box__hint { display: flex; align-items: center; justify-content: center; min-height: .3rem; font-size: .14rem; color: var(--text-lo); }
|
||||
@@ -0,0 +1,78 @@
|
||||
/* ==========================================================================================
|
||||
screens/result.css — settlement (js/screens/result.js). Research 06 §10.6: mint 模拟完成 headline,
|
||||
huge "通过回合" numerals, boss medallions, per-player cards with lineup, bonds, stats and 评语.
|
||||
========================================================================================== */
|
||||
|
||||
.result__bg { position: absolute; inset: 0; z-index: 0; background: var(--result-bg, none) center / cover no-repeat; opacity: .55; filter: saturate(.9); }
|
||||
.result__bg::after { content: ''; position: absolute; inset: 0; background: linear-gradient(90deg, rgba(8, 11, 10, .72), rgba(8, 11, 10, .5) 40%, rgba(8, 11, 10, .88) 62%); }
|
||||
.result__grid { position: absolute; inset: 0; z-index: 0; pointer-events: none;
|
||||
background: linear-gradient(rgba(78, 216, 175, .04) 1px, transparent 1px) 0 0 / .6rem .6rem, linear-gradient(90deg, rgba(78, 216, 175, .04) 1px, transparent 1px) 0 0 / .6rem .6rem;
|
||||
-webkit-mask-image: radial-gradient(70% 70% at 25% 50%, #000, transparent); mask-image: radial-gradient(70% 70% at 25% 50%, #000, transparent); }
|
||||
.result__main { position: relative; z-index: 1; flex: 1; min-height: 0; display: grid; grid-template-columns: 5.6rem 1fr; gap: .5rem; padding: .36rem .5rem .3rem .6rem; }
|
||||
.result__hero { display: flex; flex-direction: column; align-items: flex-start; gap: .16rem; padding-top: .3rem; min-height: 0; }
|
||||
.result__logoimg { height: 1.1rem; width: auto; opacity: .92; }
|
||||
.result__headline { font-size: .96rem; font-weight: 900; letter-spacing: .12em; line-height: 1.05; color: var(--mint-400); text-shadow: 0 0 .4rem rgba(23, 249, 183, .45); animation: head-in 600ms var(--ease-out); }
|
||||
.result.is-lose .result__headline { color: var(--red-premium); text-shadow: 0 0 .4rem rgba(255, 60, 60, .4); }
|
||||
@keyframes head-in { from { opacity: 0; letter-spacing: .5em; } }
|
||||
.result__sub { font-size: .2rem; color: var(--text-lo); letter-spacing: .1em; }
|
||||
.result__rounds { display: flex; align-items: baseline; gap: .12rem; margin-top: .1rem; }
|
||||
.result__rlabel { font-size: .22rem; color: var(--text-md); letter-spacing: .14em; }
|
||||
.result__rnum { font-size: 1.5rem; line-height: .9; font-weight: 700; color: #fff; }
|
||||
.result__rof { font-size: .4rem; color: var(--text-dim); }
|
||||
.result__medals { display: flex; gap: .24rem; margin-top: .12rem; }
|
||||
.medal { position: relative; width: 1.1rem; display: flex; flex-direction: column; align-items: center; gap: .08rem; }
|
||||
.medal img { width: .96rem; height: .96rem; object-fit: cover; border-radius: 50%; border: 3px solid var(--line-3); background: #151a18; filter: grayscale(.7) brightness(.7); }
|
||||
.medal.is-done img { border-color: var(--gold); filter: none; box-shadow: 0 0 .24rem rgba(255, 198, 0, .4); }
|
||||
.medal--hidden.is-done img { border-color: var(--red-premium); box-shadow: 0 0 .24rem rgba(255, 60, 60, .4); }
|
||||
.medal__check { position: absolute; right: .04rem; top: .64rem; width: .32rem; height: .32rem; display: grid; place-items: center; background: var(--text-dim); color: #fff; border-radius: 50%; }
|
||||
.medal.is-done .medal__check { background: var(--gold); color: #1d1400; }
|
||||
.medal__check .icon { width: .2rem; height: .2rem; }
|
||||
.medal__label { font-size: .14rem; color: var(--text-lo); }
|
||||
.result__time { font-size: .16rem; }
|
||||
.result__time b { color: var(--text-hi); }
|
||||
|
||||
.result__players { display: flex; flex-direction: column; gap: .1rem; min-height: 0; overflow: auto; padding-right: .06rem; }
|
||||
.result__players > :first-child { margin-top: auto; }
|
||||
.result__players > :last-child { margin-bottom: auto; }
|
||||
.rcard {
|
||||
display: flex; flex-direction: column; gap: .09rem; padding: .12rem .18rem .14rem; background: rgba(11, 15, 13, .9); border: 1px solid var(--line);
|
||||
border-left: 3px solid var(--line-3); animation: card-in var(--t-slow) var(--ease-out) backwards;
|
||||
}
|
||||
.rcard:nth-child(3) { animation-delay: 80ms; } .rcard:nth-child(4) { animation-delay: 160ms; } .rcard:nth-child(5) { animation-delay: 240ms; }
|
||||
@keyframes card-in { from { opacity: 0; transform: translateX(.3rem); } }
|
||||
.rcard.is-self { border-left-color: var(--mint-500); background: linear-gradient(90deg, rgba(78, 216, 175, .08), rgba(11, 15, 13, .9) 40%); }
|
||||
.rcard.is-dead { opacity: .8; }
|
||||
.rcard__head { display: grid; grid-template-columns: auto minmax(1.5rem, 2.1rem) minmax(0, 1fr) auto 2.3rem; gap: .18rem; align-items: center; }
|
||||
.rcard__head .pavatar { --pa: .6rem; }
|
||||
.rcard__who { display: flex; flex-direction: column; gap: .03rem; min-width: 0; }
|
||||
.rcard__name { font-size: .22rem; display: flex; align-items: center; gap: .08rem; }
|
||||
.rcard__ai, .rcard__you { font-size: .11rem; padding: 0 .05rem; font-weight: 700; }
|
||||
.rcard__ai { background: #a9c3d8; color: #0b1520; }
|
||||
.rcard__you { background: var(--mint-500); color: var(--text-on-mint); }
|
||||
.rcard__band { display: inline-flex; align-items: center; gap: .06rem; font-size: .15rem; color: var(--text-lo); }
|
||||
.rcard__round { display: flex; flex-direction: column; align-items: center; }
|
||||
.rcard__round b { font-size: .34rem; line-height: 1; color: #fff; }
|
||||
.rcard__gain { display: flex; gap: .08rem; margin-top: .03rem; font-size: .13rem; color: var(--gold); }
|
||||
.rcard__gain span { display: inline-flex; align-items: center; gap: .02rem; }
|
||||
.rcard__gain .icon { width: .14rem; height: .14rem; }
|
||||
.rcard__gain b { font-size: .14rem; color: var(--gold); }
|
||||
.rcard__title { display: flex; align-items: center; gap: .08rem; padding: .06rem .14rem .06rem .06rem; border: 1px solid rgba(255, 198, 0, .4); background: rgba(255, 198, 0, .06); min-width: 0; }
|
||||
.rcard__title--none { border-style: dashed; border-color: var(--line); background: none; height: .64rem; }
|
||||
.rcard__title > span { display: flex; flex-direction: column; }
|
||||
.rcard__title b { font-size: .19rem; color: var(--gold); }
|
||||
.rcard__ticon { width: .5rem; height: .5rem; object-fit: contain; }
|
||||
.rcard__title .icon { width: .3rem; height: .3rem; color: var(--gold); }
|
||||
.rcard__mid { display: flex; flex-direction: column; justify-content: center; gap: .06rem; min-width: 0; }
|
||||
.rcard__lineup .uthumb { --ut: .46rem; }
|
||||
.rcard__lineup { display: flex; flex-wrap: wrap; gap: .05rem; }
|
||||
.rcard__noinfo { font-family: var(--font-display); font-size: .14rem; letter-spacing: .3em; color: var(--text-dim); padding: .14rem .2rem; border: 1px dashed var(--line-2); }
|
||||
.rcard__bonds { display: flex; gap: .05rem; flex-wrap: wrap; }
|
||||
.rbond { display: inline-flex; align-items: center; gap: .04rem; padding: .01rem .07rem .01rem .03rem; border: 1px solid var(--line-2); font-size: .13rem; color: var(--text-lo); }
|
||||
.rbond .bglyph { width: .2rem; height: .2rem; }
|
||||
.rbond.is-on { border-color: var(--mint-800); color: var(--mint-400); }
|
||||
.rcard__stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px; }
|
||||
.rstat { display: flex; align-items: baseline; justify-content: space-between; gap: .06rem; padding: .05rem .1rem; background: #0e1210; box-shadow: 0 0 0 1px var(--line); font-size: .13rem; color: var(--text-lo); white-space: nowrap; min-width: 0; }
|
||||
.rstat b { font-size: .18rem; color: #fff; }
|
||||
.rstat.is-best b { color: var(--gold); }
|
||||
.result__foot { margin-top: auto; padding-top: .2rem; display: flex; }
|
||||
.result__foot .btn { min-width: 3.4rem; }
|
||||
@@ -0,0 +1,277 @@
|
||||
/* ==========================================================================================
|
||||
screens/room.css — room/waiting screen: invite key, 4 seat cards, bottom action bar.
|
||||
========================================================================================== */
|
||||
|
||||
.room-screen .topbar { height: 1.36rem; }
|
||||
.room-ping { display: flex; flex-direction: column; align-items: flex-start; gap: .04rem; }
|
||||
|
||||
/* ---- invite key ---------------------------------------------------------------------------------------- */
|
||||
.invite {
|
||||
--bk-c: var(--mint-500);
|
||||
display: grid;
|
||||
grid-template-columns: auto auto;
|
||||
column-gap: .2rem;
|
||||
row-gap: .06rem;
|
||||
align-items: center;
|
||||
padding: .1rem .16rem .12rem;
|
||||
background: rgba(0, 0, 0, .38);
|
||||
border: 1px solid var(--line);
|
||||
}
|
||||
.invite__label { grid-column: 1 / -1; display: flex; align-items: center; gap: .07rem; font-size: .14rem; color: var(--text-lo); }
|
||||
.invite__label .icon { width: .16rem; height: .16rem; color: var(--mint-500); }
|
||||
.invite__code { display: flex; gap: .06rem; }
|
||||
.invite__code span {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: .46rem;
|
||||
height: .58rem;
|
||||
background: linear-gradient(180deg, rgba(78, 216, 175, .1), rgba(78, 216, 175, .02));
|
||||
border-bottom: 2px solid var(--mint-600);
|
||||
color: var(--mint-400);
|
||||
font-size: .44rem;
|
||||
font-weight: 700;
|
||||
line-height: 1;
|
||||
text-shadow: 0 0 .16rem rgba(23, 249, 183, .45);
|
||||
}
|
||||
.invite__btns { display: flex; flex-direction: column; gap: .06rem; }
|
||||
.solo-note { display: flex; flex-direction: column; align-items: flex-end; gap: .03rem; font-size: .16rem; color: var(--text-lo); }
|
||||
|
||||
/* ---- seats ------------------------------------------------------------------------------------------------ */
|
||||
.seats {
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, minmax(0, 3.8rem));
|
||||
grid-template-rows: minmax(0, 6rem);
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
gap: .3rem;
|
||||
padding: .3rem .6rem .24rem;
|
||||
}
|
||||
.seats--solo { grid-template-columns: 3.8rem minmax(0, 6.4rem); }
|
||||
|
||||
.seat {
|
||||
--bk-c: var(--line-3);
|
||||
--bk-l: .18rem;
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: .07rem;
|
||||
height: 100%;
|
||||
min-height: 0;
|
||||
padding: .16rem .2rem .18rem;
|
||||
background:
|
||||
repeating-linear-gradient(0deg, rgba(255, 255, 255, .014) 0 1px, transparent 1px 3px),
|
||||
linear-gradient(180deg, rgba(29, 35, 32, .95), rgba(11, 14, 13, .97));
|
||||
border: 1px solid var(--line);
|
||||
box-shadow: 0 .14rem .34rem rgba(0, 0, 0, .4);
|
||||
transition: border-color var(--t-med), box-shadow var(--t-med);
|
||||
animation: seat-in var(--t-slow) var(--ease-out) backwards;
|
||||
animation-delay: calc(var(--seat-i, 0) * 60ms);
|
||||
}
|
||||
@keyframes seat-in { from { opacity: 0; transform: translateY(.18rem); } }
|
||||
.seat::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
height: 3px;
|
||||
background: var(--line-2);
|
||||
transition: background var(--t-med), box-shadow var(--t-med);
|
||||
}
|
||||
.seat__head { align-self: stretch; display: flex; align-items: center; gap: .1rem; }
|
||||
.seat__no { font-size: .22rem; font-weight: 700; color: var(--text-md); padding-left: .08rem; border-left: 3px solid var(--line-3); line-height: 1.1; }
|
||||
.seat__host {
|
||||
margin-left: auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: .04rem;
|
||||
padding: .02rem .09rem;
|
||||
background: var(--gold);
|
||||
color: #1d1400;
|
||||
font-size: .13rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
.seat__host .icon { width: .15rem; height: .15rem; }
|
||||
.seat__art {
|
||||
position: relative;
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
align-self: stretch;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: .08rem;
|
||||
margin: .06rem 0 .04rem;
|
||||
overflow: hidden;
|
||||
background:
|
||||
radial-gradient(circle at 50% 42%, rgba(78, 216, 175, .08), transparent 62%),
|
||||
linear-gradient(rgba(78, 216, 175, .04) 1px, transparent 1px) 0 0 / .3rem .3rem,
|
||||
linear-gradient(90deg, rgba(78, 216, 175, .04) 1px, transparent 1px) 0 0 / .3rem .3rem,
|
||||
#0b0e0d;
|
||||
border: 1px solid rgba(255, 255, 255, .04);
|
||||
}
|
||||
.seat__stripes {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
height: .14rem;
|
||||
background: repeating-linear-gradient(-45deg, rgba(255, 255, 255, .06) 0 .05rem, transparent .05rem .1rem);
|
||||
}
|
||||
.seat__art .avatar { --av: 2.1rem; }
|
||||
.seat__bot-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: .05rem;
|
||||
padding: .02rem .1rem;
|
||||
background: rgba(159, 212, 255, .1);
|
||||
border: 1px solid rgba(159, 212, 255, .35);
|
||||
color: var(--ice);
|
||||
font-size: .14rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
.seat__bot-label .icon { width: .16rem; height: .16rem; }
|
||||
.seat__who { display: flex; align-items: center; gap: .08rem; max-width: 100%; }
|
||||
.seat__name { font-size: .26rem; font-weight: 700; max-width: 3rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.seat__you { flex: none; padding: .01rem .07rem; background: var(--mint-500); color: var(--text-on-mint); font-size: .13rem; font-weight: 700; }
|
||||
.seat__foot {
|
||||
align-self: stretch;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: .1rem;
|
||||
min-height: .46rem;
|
||||
margin-top: .06rem;
|
||||
padding-top: .1rem;
|
||||
border-top: 1px solid var(--line);
|
||||
}
|
||||
.seat__foot .tt-anchor { position: absolute; right: .14rem; bottom: .14rem; }
|
||||
.seat__state { display: flex; align-items: center; gap: .06rem; font-size: .18rem; font-weight: 700; letter-spacing: .06em; }
|
||||
.seat__state .icon { width: .22rem; height: .22rem; }
|
||||
.seat__state--ready { color: var(--mint-400); }
|
||||
.seat__state--waiting { color: var(--text-lo); }
|
||||
.seat__state--offline { color: var(--orange-hi); }
|
||||
.seat__state--host { color: var(--gold-2); }
|
||||
|
||||
.seat.is-ready { --bk-c: var(--mint-500); border-color: var(--mint-800); }
|
||||
.seat.is-ready::before { background: var(--mint-500); box-shadow: 0 0 .12rem rgba(23, 249, 183, .6); }
|
||||
.seat.is-host .seat__no { border-left-color: var(--gold); }
|
||||
.seat.is-me { box-shadow: 0 0 0 1px rgba(78, 216, 175, .28), 0 0 .44rem rgba(23, 249, 183, .12), 0 .14rem .34rem rgba(0, 0, 0, .4); }
|
||||
.seat.is-me .seat__no { color: var(--mint-400); }
|
||||
.seat.is-offline::before { background: var(--orange); }
|
||||
.seat.is-bot .seat__art { background:
|
||||
radial-gradient(circle at 50% 42%, rgba(159, 212, 255, .08), transparent 62%),
|
||||
linear-gradient(rgba(159, 212, 255, .04) 1px, transparent 1px) 0 0 / .3rem .3rem,
|
||||
linear-gradient(90deg, rgba(159, 212, 255, .04) 1px, transparent 1px) 0 0 / .3rem .3rem,
|
||||
#0b0e10; }
|
||||
|
||||
.seat--empty { background: rgba(10, 13, 12, .5); border-style: dashed; border-color: var(--line-2); box-shadow: none; }
|
||||
.seat--empty .seat__art { background: transparent; border: 0; }
|
||||
.seat__radar {
|
||||
width: 1.3rem;
|
||||
height: 1.3rem;
|
||||
border-radius: 50%;
|
||||
background:
|
||||
repeating-radial-gradient(circle, transparent 0 .2rem, rgba(78, 216, 175, .14) .2rem .21rem),
|
||||
conic-gradient(from 0deg, rgba(23, 249, 183, .2), transparent 25%);
|
||||
-webkit-mask-image: radial-gradient(circle, #000 60%, transparent 71%);
|
||||
mask-image: radial-gradient(circle, #000 60%, transparent 71%);
|
||||
animation: radar-sweep 4s linear infinite;
|
||||
}
|
||||
@keyframes radar-sweep { to { transform: rotate(360deg); } }
|
||||
.seat__wait { font-size: .2rem; color: var(--text-lo); letter-spacing: .08em; }
|
||||
.seat--empty .seat__foot { border-top-style: dashed; }
|
||||
|
||||
.solo-brief {
|
||||
--bk-c: var(--mint-500);
|
||||
align-self: stretch;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: .14rem;
|
||||
height: 100%;
|
||||
padding: .34rem .4rem;
|
||||
background:
|
||||
repeating-linear-gradient(0deg, rgba(255, 255, 255, .014) 0 1px, transparent 1px 3px),
|
||||
linear-gradient(180deg, rgba(24, 29, 27, .92), rgba(11, 14, 13, .95));
|
||||
border: 1px solid var(--line);
|
||||
animation: seat-in var(--t-slow) 80ms var(--ease-out) backwards;
|
||||
}
|
||||
.solo-brief h2 { font-size: .36rem; font-weight: 900; letter-spacing: .06em; }
|
||||
.solo-brief p { font-size: .18rem; color: var(--text-md); }
|
||||
.solo-brief ul { margin: .06rem 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: .08rem; font-size: .16rem; color: var(--text-lo); }
|
||||
.solo-brief li::before { content: ''; display: inline-block; width: .06rem; height: .06rem; margin: 0 .12rem .02rem 0; background: var(--mint-600); transform: rotate(45deg); vertical-align: middle; }
|
||||
.solo-brief b { color: var(--text-hi); }
|
||||
|
||||
/* ---- bottom bar ----------------------------------------------------------------------------------------- */
|
||||
.room-bar {
|
||||
position: relative;
|
||||
flex: none;
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
|
||||
align-items: center;
|
||||
gap: .3rem;
|
||||
height: 1.5rem;
|
||||
padding: 0 .6rem;
|
||||
background: linear-gradient(0deg, rgba(7, 9, 8, .96), rgba(10, 13, 12, .7));
|
||||
border-top: 1px solid var(--line);
|
||||
}
|
||||
.room-bar::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: .6rem;
|
||||
right: .6rem;
|
||||
top: -1px;
|
||||
height: 1px;
|
||||
background: linear-gradient(90deg, var(--mint-700), transparent 30%, transparent 70%, var(--mint-700));
|
||||
}
|
||||
.room-bar__left { display: flex; align-items: center; gap: .22rem; min-width: 0; }
|
||||
.room-bar__label { display: flex; flex-direction: column; font-size: .17rem; font-weight: 700; color: var(--text-md); line-height: 1.35; }
|
||||
.room-bar__center { display: flex; flex-direction: column; align-items: center; gap: .06rem; }
|
||||
.room-bar__right { justify-self: end; display: flex; align-items: center; gap: .16rem; }
|
||||
.room-bar__status { font-size: .15rem; }
|
||||
.room-bar__status .icon { width: .18rem; height: .18rem; margin-right: .05rem; vertical-align: -.03rem; }
|
||||
|
||||
.dpick { display: flex; border: 1px solid var(--line-2); background: rgba(0, 0, 0, .3); }
|
||||
.dpick__opt {
|
||||
--d-color: var(--amber);
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: .06rem;
|
||||
height: .54rem;
|
||||
padding: 0 .2rem;
|
||||
border: 0;
|
||||
border-right: 1px solid var(--line);
|
||||
background: transparent;
|
||||
color: var(--text-lo);
|
||||
font-size: .18rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: .08em;
|
||||
transition: color var(--t-fast), background-color var(--t-med), box-shadow var(--t-med);
|
||||
}
|
||||
.dpick__opt:last-child { border-right: 0; }
|
||||
.dpick__opt .icon { width: .2rem; height: .2rem; color: var(--d-color); opacity: .55; transition: opacity var(--t-fast); }
|
||||
.dpick__opt:hover:not(:disabled) { color: var(--text-hi); background: rgba(255, 255, 255, .03); }
|
||||
.dpick__opt:hover:not(:disabled) .icon { opacity: 1; }
|
||||
.dpick__opt:disabled { cursor: progress; }
|
||||
.dpick__opt.is-active {
|
||||
color: var(--d-color);
|
||||
background: transparent; background: color-mix(in srgb, var(--d-color) 17%, transparent);
|
||||
box-shadow: inset 0 -3px 0 var(--d-color);
|
||||
}
|
||||
.dpick__opt.is-active .icon { opacity: 1; filter: drop-shadow(0 0 5px var(--d-color)); }
|
||||
.dpick--ro { border: 0; background: none; gap: .18rem; align-items: center; font-size: .14rem; }
|
||||
|
||||
.ready-count[hidden] { display: none; }
|
||||
.ready-count { display: flex; align-items: baseline; gap: .06rem; font-size: .16rem; }
|
||||
.ready-count b { font-size: .36rem; line-height: 1; color: var(--mint-400); text-shadow: 0 0 .14rem rgba(23, 249, 183, .45); }
|
||||
.ready-count .t-dim { font-size: .22rem; }
|
||||
.ready-count__icons { display: flex; gap: .02rem; margin-left: .12rem; align-self: center; }
|
||||
.ready-count__icons .icon { width: .28rem; height: .28rem; color: var(--line-3); transition: color var(--t-med); }
|
||||
.ready-count__icons .icon.is-on { color: var(--mint-400); filter: drop-shadow(0 0 4px var(--mint-glow)); }
|
||||
|
||||
.room-bar .btn--xl { min-width: 3.2rem; letter-spacing: .2em; }
|
||||
@@ -0,0 +1,253 @@
|
||||
/* ==========================================================================================
|
||||
screens/title.css — title screen: radar + ridgeline backdrop, dot-matrix emblem, big title,
|
||||
nickname console. Pure CSS/SVG art; an optional backdrop image fades in underneath.
|
||||
========================================================================================== */
|
||||
|
||||
.title-screen { align-items: center; justify-content: center; }
|
||||
|
||||
/* ---- backdrop ----------------------------------------------------------------------------------- */
|
||||
.title-bg { position: absolute; inset: 0; overflow: hidden; pointer-events: none; }
|
||||
.title-bg__art {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
opacity: 0;
|
||||
object-position: center 30%;
|
||||
filter: saturate(.8) brightness(.9);
|
||||
transition: opacity 600ms ease;
|
||||
}
|
||||
.title-bg.has-art .title-bg__art { opacity: .8; }
|
||||
/* The real backdrop already carries a radar + target point; keep only the sweep over it. */
|
||||
.title-bg.has-art .title-bg__target { display: none; }
|
||||
.title-bg.has-art .title-bg__radar { opacity: .35; }
|
||||
.title-bg__ridge-art {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: -.1rem;
|
||||
height: 3.3rem;
|
||||
background-repeat: repeat-x;
|
||||
background-position: center bottom;
|
||||
background-size: auto 100%;
|
||||
opacity: 0;
|
||||
transition: opacity 600ms ease;
|
||||
}
|
||||
.title-bg.has-ridges .title-bg__ridge-art { opacity: 1; }
|
||||
.title-bg__ridges { animation: fade-in 600ms ease backwards; }
|
||||
@keyframes fade-in { from { opacity: 0; } }
|
||||
.title-bg__glow {
|
||||
position: absolute;
|
||||
left: -10%;
|
||||
right: -10%;
|
||||
bottom: 0;
|
||||
height: 6rem;
|
||||
background:
|
||||
radial-gradient(48% 42% at 50% 78%, rgba(23, 249, 183, .40), rgba(23, 249, 183, .08) 62%, transparent 76%),
|
||||
radial-gradient(26% 26% at 50% 80%, rgba(120, 255, 215, .30), transparent 70%);
|
||||
filter: blur(6px);
|
||||
animation: glow-breathe 7s ease-in-out infinite;
|
||||
}
|
||||
@keyframes glow-breathe { 50% { opacity: .78; } }
|
||||
|
||||
.title-bg__radar {
|
||||
position: absolute;
|
||||
left: 17%;
|
||||
top: 40%;
|
||||
width: 5.6rem;
|
||||
height: 5.6rem;
|
||||
transform: translate(-50%, -50%);
|
||||
border-radius: 50%;
|
||||
background:
|
||||
radial-gradient(circle, transparent 0 .05rem, rgba(78, 216, 175, .5) .05rem .065rem, transparent .065rem),
|
||||
repeating-radial-gradient(circle, transparent 0 .69rem, rgba(78, 216, 175, .16) .69rem .7rem),
|
||||
linear-gradient(rgba(78, 216, 175, .12), rgba(78, 216, 175, .12)) center / 100% 1px no-repeat,
|
||||
linear-gradient(rgba(78, 216, 175, .12), rgba(78, 216, 175, .12)) center / 1px 100% no-repeat;
|
||||
-webkit-mask-image: radial-gradient(circle, #000 55%, transparent 71%);
|
||||
mask-image: radial-gradient(circle, #000 55%, transparent 71%);
|
||||
opacity: .8;
|
||||
}
|
||||
.title-bg__sweep {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
border-radius: 50%;
|
||||
background: conic-gradient(from 0deg, rgba(23, 249, 183, .28), rgba(23, 249, 183, 0) 22%, transparent 100%);
|
||||
animation: radar-sweep 6s linear infinite;
|
||||
}
|
||||
@keyframes radar-sweep { to { transform: rotate(360deg); } }
|
||||
|
||||
.title-bg__target {
|
||||
position: absolute;
|
||||
right: 12%;
|
||||
top: 22%;
|
||||
width: 1.3rem;
|
||||
height: 1.3rem;
|
||||
border-radius: 50%;
|
||||
background:
|
||||
radial-gradient(circle, rgba(246, 163, 41, .9) 0 .06rem, transparent .065rem),
|
||||
radial-gradient(circle, transparent 0 .2rem, rgba(246, 163, 41, .5) .2rem .215rem, transparent .215rem),
|
||||
radial-gradient(circle, transparent 0 .5rem, rgba(246, 163, 41, .22) .5rem .51rem, transparent .51rem),
|
||||
radial-gradient(circle, rgba(246, 163, 41, .18), transparent 70%);
|
||||
animation: target-pulse 3.2s ease-in-out infinite;
|
||||
}
|
||||
.title-bg__target::after {
|
||||
content: 'TARGET POINT';
|
||||
position: absolute;
|
||||
left: 110%;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
padding: .02rem .08rem;
|
||||
border: 1px solid rgba(246, 163, 41, .35);
|
||||
font-family: var(--font-display);
|
||||
font-size: .1rem;
|
||||
letter-spacing: .2em;
|
||||
color: rgba(246, 163, 41, .7);
|
||||
white-space: nowrap;
|
||||
}
|
||||
@keyframes target-pulse { 50% { transform: scale(1.06); opacity: .75; } }
|
||||
|
||||
.title-bg__ridges { position: absolute; left: 0; right: 0; bottom: 0; width: 100%; height: 40%; }
|
||||
.title-bg__ridges .ridge { stroke-width: 1.5; vector-effect: non-scaling-stroke; }
|
||||
.title-bg__ridges .ridge--far { opacity: .95; }
|
||||
.title-bg__haze {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background:
|
||||
linear-gradient(180deg, rgba(12, 15, 14, .6) 0%, transparent 25%, transparent 70%, rgba(6, 8, 7, .7) 100%),
|
||||
radial-gradient(46% 42% at 50% 44%, rgba(10, 13, 12, .82), rgba(10, 13, 12, .4) 60%, transparent 80%);
|
||||
}
|
||||
|
||||
/* ---- corners ------------------------------------------------------------------------------------- */
|
||||
.title-corner { position: absolute; z-index: 2; display: flex; align-items: flex-start; gap: .12rem; line-height: 1.7; }
|
||||
.title-corner--tl { left: .44rem; top: .38rem; }
|
||||
.title-corner--tr { right: .44rem; top: .38rem; text-align: right; }
|
||||
.title-corner__mark {
|
||||
width: .32rem;
|
||||
height: .32rem;
|
||||
margin-top: .02rem;
|
||||
border: 1px solid var(--mint-700);
|
||||
background:
|
||||
linear-gradient(var(--mint-500), var(--mint-500)) center / 40% 2px no-repeat,
|
||||
linear-gradient(var(--mint-500), var(--mint-500)) center / 2px 40% no-repeat;
|
||||
clip-path: polygon(25% 0, 75% 0, 100% 50%, 75% 100%, 25% 100%, 0 50%);
|
||||
}
|
||||
|
||||
/* ---- centre column ------------------------------------------------------------------------------- */
|
||||
.title-main {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin-top: -.3rem;
|
||||
}
|
||||
|
||||
.emblem { position: relative; display: flex; align-items: center; gap: .26rem; margin-bottom: .26rem; animation: rise-in 600ms var(--ease-out) backwards; }
|
||||
.emblem__svg { width: 1.3rem; height: 1.4rem; overflow: visible; filter: drop-shadow(0 0 .12rem rgba(210, 255, 240, .25)); }
|
||||
.emblem__svg circle { fill: #dfe6e2; animation: dot-twinkle 4.8s ease-in-out infinite; }
|
||||
.emblem__svg circle.d1 { animation-delay: -.7s; }
|
||||
.emblem__svg circle.d2 { animation-delay: -1.4s; }
|
||||
.emblem__svg circle.d3 { animation-delay: -2.1s; }
|
||||
.emblem__svg circle.d4 { animation-delay: -2.8s; }
|
||||
.emblem__svg circle.d5 { animation-delay: -3.5s; }
|
||||
.emblem__svg circle.d6 { animation-delay: -4.2s; }
|
||||
.emblem__svg circle.is-accent { fill: var(--mint-glow); filter: drop-shadow(0 0 .04rem var(--mint-glow)); animation: none; }
|
||||
@keyframes dot-twinkle { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }
|
||||
.emblem__bracket { width: .16rem; height: 1.7rem; border: 2px solid rgba(223, 230, 226, .45); }
|
||||
.emblem__bracket--l { border-right: 0; }
|
||||
.emblem__bracket--r { border-left: 0; }
|
||||
|
||||
.title-en {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: .02rem;
|
||||
font-family: var(--font-display);
|
||||
text-transform: uppercase;
|
||||
line-height: 1;
|
||||
animation: rise-in 600ms 80ms var(--ease-out) backwards;
|
||||
}
|
||||
.title-en__a { font-size: .34rem; font-weight: 500; letter-spacing: .3em; padding-left: .3em; color: #cdd6d1; }
|
||||
.title-en__b {
|
||||
font-size: .38rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: .34em;
|
||||
padding-left: .34em;
|
||||
color: var(--mint-500);
|
||||
text-shadow: 0 0 .18rem rgba(23, 249, 183, .45);
|
||||
}
|
||||
.title-cn {
|
||||
margin-top: .14rem;
|
||||
font-size: 1.02rem;
|
||||
font-weight: 900;
|
||||
line-height: 1.12;
|
||||
letter-spacing: .06em;
|
||||
color: #f4f6f5;
|
||||
text-shadow: 0 .04rem .2rem rgba(0, 0, 0, .7);
|
||||
animation: rise-in 600ms 140ms var(--ease-out) backwards;
|
||||
}
|
||||
.title-cn__colon { color: #f4f6f5; }
|
||||
.title-cn em { font-style: normal; color: var(--mint-500); text-shadow: 0 0 .26rem rgba(23, 249, 183, .45); }
|
||||
.title-tag {
|
||||
margin-top: .12rem;
|
||||
font-size: .19rem;
|
||||
color: var(--text-lo);
|
||||
letter-spacing: .1em;
|
||||
animation: rise-in 600ms 200ms var(--ease-out) backwards;
|
||||
}
|
||||
@keyframes rise-in { from { opacity: 0; transform: translateY(.14rem); } }
|
||||
|
||||
.title-login {
|
||||
--bk-c: var(--mint-500);
|
||||
position: relative;
|
||||
width: 4.9rem;
|
||||
margin-top: .42rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: .16rem;
|
||||
padding: .24rem .28rem .2rem;
|
||||
background: linear-gradient(180deg, rgba(20, 25, 23, .82), rgba(10, 13, 12, .88));
|
||||
border: 1px solid var(--line-2);
|
||||
box-shadow: 0 .2rem .5rem rgba(0, 0, 0, .5), 0 0 .5rem rgba(23, 249, 183, .06);
|
||||
-webkit-backdrop-filter: blur(4px);
|
||||
backdrop-filter: blur(4px);
|
||||
animation: rise-in 600ms 260ms var(--ease-out) backwards;
|
||||
}
|
||||
.title-login::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: -1px;
|
||||
right: -1px;
|
||||
top: -1px;
|
||||
height: 2px;
|
||||
background: linear-gradient(90deg, var(--mint-500), transparent 60%);
|
||||
}
|
||||
.title-login .btn--xl { letter-spacing: .6em; padding-left: calc(.48rem + .3em); }
|
||||
.title-invite {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: .08rem;
|
||||
padding: .08rem .12rem;
|
||||
background: rgba(246, 163, 41, .08);
|
||||
border: 1px solid rgba(246, 163, 41, .35);
|
||||
color: var(--amber);
|
||||
font-size: .16rem;
|
||||
}
|
||||
.title-invite .icon { width: .2rem; height: .2rem; }
|
||||
.title-invite b { font-size: .2rem; letter-spacing: .2em; color: #ffd08a; }
|
||||
.title-conn { display: flex; align-items: center; justify-content: center; gap: .1rem; min-height: .32rem; font-size: .14rem; color: var(--text-lo); }
|
||||
.title-conn .ping { height: .26rem; font-size: .15rem; }
|
||||
|
||||
.title-foot {
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
left: .44rem;
|
||||
right: .44rem;
|
||||
bottom: .3rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-end;
|
||||
font-size: .13rem;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
@@ -0,0 +1,369 @@
|
||||
/* ==========================================================================================
|
||||
theme.css — design tokens, fonts, root scale, base reset, shared backdrops & utilities.
|
||||
Look: research 06 §12 (near-black green-grey, mint accents, gold prices, bracket frames).
|
||||
|
||||
Root scale: 1rem = 100 design px at 1920×1080 and scales with min(vw/1920, vh/1080), so the
|
||||
whole UI is authored in design pixels ÷ 100 (e.g. 24px → .24rem). The root never drops below
|
||||
40px, which keeps it clear of CJK browsers' minimum-font-size clamping. 1px hairlines stay px.
|
||||
========================================================================================== */
|
||||
|
||||
:root {
|
||||
color-scheme: dark;
|
||||
|
||||
/* surfaces */
|
||||
--bg-0: #0c0f0e;
|
||||
--bg-1: #141816;
|
||||
--bg-2: #1e2421;
|
||||
--bg-3: #252c29;
|
||||
--bg-4: #2d3632;
|
||||
--bg-glass: rgba(16, 20, 18, .82);
|
||||
--line: #2f3a35;
|
||||
--line-2: #3e4b45;
|
||||
--line-3: #58675f;
|
||||
|
||||
/* accents (official hex values where research marks [DATA]) */
|
||||
--mint-500: #4ed8af;
|
||||
--mint-400: #59f4ca;
|
||||
--mint-600: #35d8b4;
|
||||
--mint-glow: #17f9b7;
|
||||
--mint-700: #2a9e7f;
|
||||
--mint-800: #145443;
|
||||
--mint-900: #0d2c24;
|
||||
--mint-a10: rgba(78, 216, 175, .10);
|
||||
--mint-a20: rgba(78, 216, 175, .20);
|
||||
--mint-a35: rgba(78, 216, 175, .35);
|
||||
--gold: #ffc600;
|
||||
--gold-2: #f2bd3e;
|
||||
--gold-a20: rgba(255, 198, 0, .2);
|
||||
--amber: #f6a329;
|
||||
--amber-a20: rgba(246, 163, 41, .2);
|
||||
--orange: #e85a1a;
|
||||
--orange-hi: #ff7a33;
|
||||
--orange-a20: rgba(232, 90, 26, .22);
|
||||
--red: #e73118;
|
||||
--red-abyss: #ff0024;
|
||||
--red-premium: #ff5454;
|
||||
--red-a20: rgba(231, 49, 24, .22);
|
||||
--ice: #9fd4ff;
|
||||
--ice-a20: rgba(159, 212, 255, .2);
|
||||
--ice-900: #14283a;
|
||||
|
||||
/* text */
|
||||
--text-hi: #f2f2f2;
|
||||
--text-md: #c3cbc7;
|
||||
--text-lo: #8a948f;
|
||||
--text-dim: #5d6863;
|
||||
--text-on-mint: #06110d;
|
||||
|
||||
/* difficulty (shared/constants.js DIFFICULTY_COLORS) */
|
||||
--diff-funny: #f6a329;
|
||||
--diff-normal: #e85a1a;
|
||||
--diff-hard: #e73118;
|
||||
--diff-abyss: #ff0024;
|
||||
|
||||
/* chess tier accents (I–VI), sampled from the official tier chips (img_chess_level_1..6) */
|
||||
--tier-1: #a8a8a8;
|
||||
--tier-2: #f2f2f2;
|
||||
--tier-3: #34e6b2;
|
||||
--tier-4: #34b8d8;
|
||||
--tier-5: #f8bf00;
|
||||
--tier-6: #f88000;
|
||||
|
||||
/* shop level tag colours (shopLevelDisplayDataDict) */
|
||||
--lv-1: #434343;
|
||||
--lv-2: #626654;
|
||||
--lv-3: #445760;
|
||||
--lv-4: #615b74;
|
||||
--lv-5: #6c5e41;
|
||||
--lv-6: #5d341e;
|
||||
|
||||
/* type */
|
||||
--font-cjk: 'Noto Sans SC', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', sans-serif;
|
||||
--font-num: 'Bender', 'Rajdhani', 'Oxanium', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
||||
--font-display: 'Novecento', 'Novecento Wide', 'Oxanium', 'Rajdhani', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
||||
--font-mono: 'Bender', 'Oxanium', ui-monospace, 'SFMono-Regular', Menlo, Consolas, monospace;
|
||||
|
||||
/* motion */
|
||||
--ease-out: cubic-bezier(.2, .8, .2, 1);
|
||||
--ease-in-out: cubic-bezier(.6, 0, .3, 1);
|
||||
--t-fast: 150ms;
|
||||
--t-med: 200ms;
|
||||
--t-slow: 250ms;
|
||||
|
||||
/* layers */
|
||||
--z-screen: 1;
|
||||
--z-banner: 40;
|
||||
--z-conn: 60;
|
||||
--z-modal: 80;
|
||||
--z-toast: 90;
|
||||
--z-tooltip: 95;
|
||||
--z-rotate: 100;
|
||||
|
||||
/* bracket corners (see .brackets) */
|
||||
--bk-c: var(--mint-500);
|
||||
--bk-l: .14rem;
|
||||
--bk-w: 2px;
|
||||
}
|
||||
|
||||
/* ---- root scale ----------------------------------------------------------------------------- */
|
||||
html {
|
||||
font-size: clamp(40px, min(calc(100vw / 19.2), calc(100vh / 10.8)), 240px);
|
||||
/* mobile browsers: 100vh is the height with the toolbars hidden — the small viewport (svh; Safari 15.4+, Chrome 108+,
|
||||
Firefox 101+) is what is really visible while they show; older browsers keep the line above */
|
||||
font-size: clamp(40px, min(calc(100vw / 19.2), calc(100svh / 10.8)), 240px);
|
||||
-webkit-text-size-adjust: 100%;
|
||||
text-size-adjust: 100%;
|
||||
height: 100%;
|
||||
background: var(--bg-0);
|
||||
}
|
||||
|
||||
*, *::before, *::after { box-sizing: border-box; }
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
background: var(--bg-0);
|
||||
color: var(--text-hi);
|
||||
font-family: var(--font-cjk);
|
||||
font-size: .18rem;
|
||||
line-height: 1.5;
|
||||
font-weight: 400;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
text-rendering: optimizeLegibility;
|
||||
-webkit-user-select: none;
|
||||
user-select: none;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
|
||||
input, textarea, [contenteditable], .selectable { -webkit-user-select: text; user-select: text; }
|
||||
button, input, select, textarea { font: inherit; color: inherit; }
|
||||
button { cursor: pointer; }
|
||||
img { max-width: 100%; }
|
||||
h1, h2, h3, h4, p { margin: 0; }
|
||||
:focus { outline: none; }
|
||||
:focus-visible { outline: 2px solid var(--mint-400); outline-offset: 2px; }
|
||||
|
||||
::selection { background: var(--mint-500); color: var(--text-on-mint); }
|
||||
|
||||
::-webkit-scrollbar { width: 6px; height: 6px; }
|
||||
::-webkit-scrollbar-track { background: transparent; }
|
||||
::-webkit-scrollbar-thumb { background: var(--line-2); }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--mint-700); }
|
||||
|
||||
.sr-only {
|
||||
position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px;
|
||||
overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
|
||||
}
|
||||
|
||||
/* ---- typography helpers ---------------------------------------------------------------------- */
|
||||
.num { font-family: var(--font-num); font-variant-numeric: tabular-nums; letter-spacing: .02em; }
|
||||
.display { font-family: var(--font-display); text-transform: uppercase; letter-spacing: .12em; }
|
||||
.micro {
|
||||
font-family: var(--font-display);
|
||||
font-size: .11rem;
|
||||
line-height: 1.2;
|
||||
letter-spacing: .18em;
|
||||
text-transform: uppercase;
|
||||
color: var(--text-dim);
|
||||
white-space: nowrap;
|
||||
}
|
||||
.micro--mint { color: var(--mint-700); }
|
||||
.micro--gold { color: #9c7c16; }
|
||||
.micro--hi { color: var(--text-lo); }
|
||||
.t-mint { color: var(--mint-500); }
|
||||
.t-gold { color: var(--gold); }
|
||||
.t-amber { color: var(--amber); }
|
||||
.t-orange { color: var(--orange-hi); }
|
||||
.t-red { color: var(--red-premium); }
|
||||
.t-ice { color: var(--ice); }
|
||||
.t-lo { color: var(--text-lo); }
|
||||
.t-dim { color: var(--text-dim); }
|
||||
|
||||
/* ---- bracket corners: 4 L-shaped corners drawn with gradients on ::after ---------------------- */
|
||||
.brackets { position: relative; }
|
||||
.brackets::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: -1px;
|
||||
pointer-events: none;
|
||||
background:
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) top left / var(--bk-l) var(--bk-w) no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) top left / var(--bk-w) var(--bk-l) no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) top right / var(--bk-l) var(--bk-w) no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) top right / var(--bk-w) var(--bk-l) no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) bottom left / var(--bk-l) var(--bk-w) no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) bottom left / var(--bk-w) var(--bk-l) no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) bottom right / var(--bk-l) var(--bk-w) no-repeat,
|
||||
linear-gradient(var(--bk-c), var(--bk-c)) bottom right / var(--bk-w) var(--bk-l) no-repeat;
|
||||
transition: opacity var(--t-med) var(--ease-out);
|
||||
}
|
||||
|
||||
/* ---- texture overlays -------------------------------------------------------------------------- */
|
||||
.fx-scan { position: relative; }
|
||||
.fx-scan::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
pointer-events: none;
|
||||
background: repeating-linear-gradient(0deg, rgba(255, 255, 255, .028) 0 1px, transparent 1px 3px);
|
||||
mix-blend-mode: screen;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.fx-noise {
|
||||
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='180' height='180'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 .8 0 0 0 0 .9 0 0 0 0 .85 0 0 0 .55 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)' opacity='.5'/></svg>");
|
||||
}
|
||||
|
||||
/* ---- global app backdrop (behind every screen) ------------------------------------------------- */
|
||||
.app-root {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
overflow: hidden;
|
||||
isolation: isolate;
|
||||
}
|
||||
|
||||
.app-bg {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: 0;
|
||||
pointer-events: none;
|
||||
background:
|
||||
radial-gradient(120% 80% at 50% 110%, rgba(23, 249, 183, .10), transparent 55%),
|
||||
radial-gradient(80% 60% at 50% 40%, rgba(40, 60, 52, .35), transparent 70%),
|
||||
linear-gradient(180deg, #0b0e0d 0%, #0e1311 55%, #0a0d0c 100%);
|
||||
}
|
||||
.app-bg::before {
|
||||
/* faint survey grid */
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background:
|
||||
linear-gradient(rgba(78, 216, 175, .045) 1px, transparent 1px) 0 0 / .8rem .8rem,
|
||||
linear-gradient(90deg, rgba(78, 216, 175, .045) 1px, transparent 1px) 0 0 / .8rem .8rem;
|
||||
-webkit-mask-image: radial-gradient(90% 80% at 50% 50%, #000 30%, transparent 85%);
|
||||
mask-image: radial-gradient(90% 80% at 50% 50%, #000 30%, transparent 85%);
|
||||
}
|
||||
.app-bg::after {
|
||||
/* grain + scanlines + vignette */
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background:
|
||||
repeating-linear-gradient(0deg, rgba(255, 255, 255, .02) 0 1px, transparent 1px 3px),
|
||||
radial-gradient(130% 100% at 50% 50%, transparent 55%, rgba(0, 0, 0, .65) 100%),
|
||||
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 .75 0 0 0 0 .85 0 0 0 0 .8 0 0 0 .6 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)' opacity='.35'/></svg>");
|
||||
opacity: .9;
|
||||
}
|
||||
|
||||
/* ---- screens ------------------------------------------------------------------------------------ */
|
||||
.screen {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: var(--z-screen);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
animation: screen-in var(--t-slow) var(--ease-out) backwards;
|
||||
}
|
||||
/* Opacity only: a transform here would become the containing block of fixed overlays. */
|
||||
@keyframes screen-in { from { opacity: 0; } }
|
||||
|
||||
.screen__scroll {
|
||||
flex: 1 1 auto;
|
||||
min-height: 0;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/* crosshair "+" marks used as decoration */
|
||||
.cross {
|
||||
position: absolute;
|
||||
width: .22rem;
|
||||
height: .22rem;
|
||||
pointer-events: none;
|
||||
background:
|
||||
linear-gradient(var(--mint-700), var(--mint-700)) center / 100% 1px no-repeat,
|
||||
linear-gradient(var(--mint-700), var(--mint-700)) center / 1px 100% no-repeat;
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
/* ---- boot splash (index.html, removed by main.js) ------------------------------------------- */
|
||||
.boot {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
background: var(--bg-0);
|
||||
z-index: 200;
|
||||
transition: opacity 250ms ease;
|
||||
}
|
||||
.boot.is-done { opacity: 0; pointer-events: none; }
|
||||
.boot__inner { display: grid; justify-items: center; gap: .18rem; }
|
||||
.boot__hex {
|
||||
width: .64rem;
|
||||
height: .64rem;
|
||||
border: 2px solid var(--mint-500);
|
||||
clip-path: polygon(25% 3%, 75% 3%, 100% 50%, 75% 97%, 25% 97%, 0 50%);
|
||||
animation: boot-spin 1.4s linear infinite;
|
||||
background: linear-gradient(135deg, transparent 45%, rgba(78, 216, 175, .35) 50%, transparent 55%);
|
||||
}
|
||||
.boot__text { font-family: var(--font-display); font-size: .13rem; letter-spacing: .4em; color: var(--mint-700); }
|
||||
.boot__err { max-width: 6rem; text-align: center; color: var(--text-lo); font-size: .16rem; }
|
||||
@keyframes boot-spin { to { transform: rotate(360deg); } }
|
||||
|
||||
/* ---- rotate-device hint (portrait phones/tablets) ------------------------------------------- */
|
||||
.rotate-hint {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: var(--z-rotate);
|
||||
display: none;
|
||||
place-items: center;
|
||||
align-content: center;
|
||||
gap: 18px;
|
||||
padding: 24px;
|
||||
text-align: center;
|
||||
background: var(--bg-0);
|
||||
color: var(--text-md);
|
||||
font-size: 16px;
|
||||
}
|
||||
.rotate-hint__phone {
|
||||
width: 54px;
|
||||
height: 90px;
|
||||
border: 3px solid var(--mint-500);
|
||||
border-radius: 9px;
|
||||
position: relative;
|
||||
animation: rotate-phone 2.4s var(--ease-in-out) infinite;
|
||||
box-shadow: 0 0 24px rgba(23, 249, 183, .25);
|
||||
}
|
||||
.rotate-hint__phone::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
bottom: 6px;
|
||||
width: 14px;
|
||||
height: 3px;
|
||||
margin-left: -7px;
|
||||
background: var(--mint-500);
|
||||
border-radius: 2px;
|
||||
}
|
||||
.rotate-hint__title { font-size: 20px; font-weight: 700; color: var(--text-hi); }
|
||||
.rotate-hint__micro { font-family: var(--font-display); font-size: 11px; letter-spacing: .3em; color: var(--mint-700); }
|
||||
@keyframes rotate-phone {
|
||||
0%, 20% { transform: rotate(0deg); }
|
||||
50%, 75% { transform: rotate(-90deg); }
|
||||
100% { transform: rotate(0deg); }
|
||||
}
|
||||
/* only on a device that can be turned (js/ui/device.js sp-rotatable: a touch screen whose screen is not landscape) —
|
||||
a narrow desktop window or a split-view iPad keeps the game */
|
||||
@media (orientation: portrait) and (max-width: 1024px) {
|
||||
.sp-rotatable .rotate-hint { display: grid; }
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
*, *::before, *::after {
|
||||
animation-duration: 1ms !important;
|
||||
animation-iteration-count: 1 !important;
|
||||
transition-duration: 1ms !important;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user