arena/src/styles.css

1970 lines
38 KiB
CSS

:root {
color-scheme: dark;
font-family:
Inter, Pretendard, "Noto Sans KR", system-ui, -apple-system, BlinkMacSystemFont,
"Segoe UI", sans-serif;
background: #080a07;
color: #fff5db;
}
* {
box-sizing: border-box;
}
html {
min-width: 320px;
min-height: 100%;
background: #080a07;
}
body {
margin: 0;
min-width: 320px;
min-height: 100vh;
overflow: hidden;
}
button,
input,
textarea {
font: inherit;
}
button {
border: 0;
cursor: pointer;
}
button:focus-visible,
input:focus-visible,
textarea:focus-visible {
outline: 3px solid rgb(238 185 73 / 0.46);
outline-offset: 3px;
}
#app {
--arena-gap: 18px;
--score-band-height: 134px;
--score-panel-left: 14px;
--score-panel-width: 224px;
--score-rail-width: calc(var(--score-panel-left) + var(--score-panel-width));
--drawer-width: min(430px, 100vw);
--drawer-live-width: min(340px, calc(100vw - 48px));
position: relative;
min-height: 100vh;
overflow: hidden;
background:
linear-gradient(180deg, rgb(8 10 7 / 0.18), rgb(3 5 4 / 0.84)),
#080a07;
}
#app.match-live {
--drawer-width: var(--drawer-live-width);
}
.arena-shell {
position: fixed;
inset: 0;
display: grid;
place-items: center;
overflow: hidden;
background: #090b08;
}
.arena-shell::before {
content: "";
position: absolute;
inset: 0;
z-index: 1;
background:
radial-gradient(circle at 50% 50%, rgb(255 211 122 / 0.06), transparent 42%),
linear-gradient(90deg, rgb(3 5 4 / 0.48), rgb(3 5 4 / 0.08) 45%, rgb(3 5 4 / 0.48)),
linear-gradient(180deg, rgb(3 5 4 / 0.08), rgb(3 5 4 / 0.5));
pointer-events: none;
transition:
background 520ms ease,
opacity 520ms ease;
}
#app.match-live .arena-shell::before {
opacity: 0.24;
}
#app.match-live .arena-shell {
place-items: center;
}
#game {
position: relative;
z-index: 0;
width: max(100vw, 100vh);
height: max(100vw, 100vh);
overflow: hidden;
opacity: 0.68;
filter: saturate(1) contrast(1.08) brightness(1.08);
transform: scale(1.04);
transform-origin: center;
transition:
width 620ms cubic-bezier(0.2, 0.8, 0.2, 1),
height 620ms cubic-bezier(0.2, 0.8, 0.2, 1),
opacity 520ms ease,
filter 520ms ease,
transform 700ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
#app.match-live #game {
width: min(100vw, 100vh);
height: min(100vw, 100vh);
margin-left: 0;
opacity: 1;
filter: none;
transform: scale(1);
}
#game canvas {
display: block;
width: 100% !important;
height: 100% !important;
image-rendering: pixelated;
}
.battle-preview {
position: fixed;
inset: 0;
z-index: 2;
overflow: hidden;
opacity: 0.84;
pointer-events: none;
transition:
opacity 420ms ease,
transform 700ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
#app.match-live .battle-preview {
opacity: 0;
transform: scale(1.08);
}
.preview-fighter {
position: absolute;
width: 100px;
height: 100px;
background-repeat: no-repeat;
background-size: auto 100px;
image-rendering: pixelated;
transform-origin: center;
filter:
drop-shadow(0 18px 22px rgb(0 0 0 / 0.68))
saturate(1.14)
brightness(1.12);
animation:
preview-attack var(--sprite-speed) steps(var(--sprite-steps)) infinite,
preview-breathe 1800ms ease-in-out infinite;
}
.preview-knight {
--sprite-end: -600px;
--sprite-scale: 5.2;
--sprite-speed: 840ms;
--sprite-steps: 6;
left: 10vw;
top: 48vh;
background-image: url("/assets/characters/knight/Knight-Attack01.png");
transform: scale(var(--sprite-scale));
}
.preview-orc {
--sprite-end: -500px;
--sprite-scale: 5.35;
--sprite-speed: 760ms;
--sprite-steps: 5;
right: 9vw;
top: 46vh;
background-image: url("/assets/characters/orc/Orc-Attack01.png");
transform: scaleX(-1) scale(var(--sprite-scale));
}
.preview-wizard {
--sprite-end: -500px;
--sprite-scale: 4.35;
--sprite-speed: 980ms;
--sprite-steps: 5;
left: 56vw;
top: 24vh;
background-image: url("/assets/characters/wizard/Wizard-Attack01.png");
opacity: 0.58;
transform: scaleX(-1) scale(var(--sprite-scale));
}
.preview-strike {
position: absolute;
width: 160px;
height: 5px;
border-radius: 999px;
background: linear-gradient(90deg, transparent, rgb(255 229 156 / 0.86), transparent);
box-shadow: 0 0 24px rgb(227 89 59 / 0.5);
opacity: 0;
transform-origin: center;
animation: preview-strike 980ms ease-in-out infinite;
}
.preview-strike-a {
left: 38vw;
top: 54vh;
transform: rotate(-18deg);
}
.preview-strike-b {
right: 31vw;
top: 42vh;
transform: rotate(22deg);
animation-delay: 260ms;
}
.intro-stage {
position: fixed;
inset: 0;
z-index: 5;
display: grid;
place-items: center;
padding: clamp(24px, 5vw, 56px);
pointer-events: none;
transition:
opacity 420ms ease,
transform 620ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
#app.match-live .intro-stage {
opacity: 0;
transform: scale(0.96);
}
#app.match-live .intro-content {
pointer-events: none;
}
.intro-content {
display: grid;
justify-items: center;
gap: 22px;
text-align: center;
pointer-events: auto;
animation: intro-rise 760ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
transition:
transform 560ms cubic-bezier(0.2, 0.8, 0.2, 1),
opacity 360ms ease;
}
#app.options-open:not(.match-live) .intro-content {
opacity: 0.72;
}
.arena-logo {
margin: 0;
color: #fff4d1;
font-size: clamp(4rem, 16vw, 11rem);
font-weight: 950;
letter-spacing: 0;
line-height: 0.9;
text-shadow:
0 2px 0 #ad4d37,
0 14px 42px rgb(0 0 0 / 0.72),
0 0 40px rgb(230 173 71 / 0.28);
text-transform: uppercase;
}
.arena-logo .small-text {
font-size: 0.7em; /* 원래 크기의 85%로 축소 (원하는 만큼 숫자를 조절해 보세요) */
margin-top: 0.05em; /* 글자가 줄어들면서 생긴 간격을 미세하게 조정하고 싶다면 사용 */
}
.arena-logo span {
display: block;
}
.arena-meta {
position: fixed;
right: clamp(10px, 2vw, 18px);
bottom: clamp(10px, 2vw, 18px);
z-index: 10;
display: flex;
flex-direction: row;
align-items: center;
gap: 8px;
pointer-events: none;
transition: opacity 220ms ease;
}
.visitor-count,
.about-button {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 28px;
margin: 0;
border: 1px solid rgb(238 185 73 / 0.22);
border-radius: 999px;
padding: 5px 12px;
background: rgb(8 10 7 / 0.68);
color: #e7c879;
font-size: 0.72rem;
font-weight: 800;
line-height: 1;
text-decoration: none;
backdrop-filter: blur(10px);
pointer-events: auto;
transition:
background 180ms ease,
border-color 180ms ease,
transform 180ms ease,
opacity 220ms ease;
}
.visitor-count {
opacity: 0;
transform: translateY(8px);
}
#app.match-live .visitor-count {
opacity: 0.86;
transform: translateY(0);
}
.about-button {
min-width: 72px;
color: #ffe8b4;
font-weight: 900;
box-shadow: 0 4px 12px rgb(0 0 0 / 0.22);
}
.about-button:hover {
border-color: rgb(238 185 73 / 0.42);
background: rgb(255 246 216 / 0.14);
transform: translateY(-1px);
}
.start-button,
form button[type="submit"],
.pause-button,
.restart-button {
min-height: 52px;
border-radius: 8px;
background: linear-gradient(180deg, #e56443, #b93c2f);
color: #fff7df;
font-weight: 900;
box-shadow:
0 18px 44px rgb(0 0 0 / 0.36),
inset 0 1px 0 rgb(255 255 255 / 0.2);
transition:
background 180ms ease,
transform 180ms ease,
box-shadow 180ms ease;
}
.start-button {
min-width: 180px;
padding: 0 30px;
text-transform: uppercase;
}
#app.options-open:not(.match-live) .start-button {
pointer-events: none;
visibility: hidden;
}
.start-button:hover,
form button[type="submit"]:hover,
.pause-button:hover,
.restart-button:hover {
background: linear-gradient(180deg, #f0754f, #c84636);
transform: translateY(-1px);
box-shadow:
0 22px 52px rgb(0 0 0 / 0.42),
inset 0 1px 0 rgb(255 255 255 / 0.24);
}
.pause-button,
.restart-button {
display: none;
border: 1px solid rgb(238 185 73 / 0.3);
background: rgb(255 246 216 / 0.08);
color: #ffe8b4;
}
.pause-button:hover,
.restart-button:hover {
background: rgb(255 246 216 / 0.14);
}
#app.match-live .pause-button,
#app.match-live .restart-button {
display: block;
}
#app.match-live .match-actions {
grid-template-columns: 1fr 1fr;
}
#app.match-live .match-actions button[type="submit"] {
grid-column: 1 / -1;
}
#app.match-paused .pause-button {
background: linear-gradient(180deg, #e3b24f, #9a6c24);
color: #120f08;
}
#app.match-ended .pause-button {
display: none;
}
.drawer-scrim {
position: fixed;
inset: 0;
z-index: 6;
background: rgb(4 5 4 / 0.42);
opacity: 0;
pointer-events: none;
transition: opacity 320ms ease;
}
#app.options-open .drawer-scrim {
opacity: 1;
pointer-events: auto;
}
#app.match-live .drawer-scrim {
opacity: 0;
pointer-events: none;
}
.drawer-toggle {
display: none;
min-height: 40px;
border: 1px solid rgb(238 185 73 / 0.28);
border-radius: 8px;
padding: 0 12px;
background: rgb(12 15 11 / 0.84);
color: #ffe8b4;
font-size: 0.82rem;
font-weight: 900;
box-shadow: 0 16px 38px rgb(0 0 0 / 0.36);
transition:
background 180ms ease,
transform 180ms ease;
backdrop-filter: blur(10px);
}
.drawer-toggle:hover {
background: rgb(255 246 216 / 0.14);
transform: translateY(-1px);
}
#app.match-live .drawer-toggle {
display: block;
}
.fighter-entry {
position: fixed;
top: 0;
right: 0;
z-index: 7;
display: grid;
align-content: start;
gap: 24px;
width: var(--drawer-width);
height: 100vh;
overflow-y: auto;
border-left: 1px solid rgb(239 199 103 / 0.22);
padding: clamp(22px, 4vw, 34px);
background:
linear-gradient(180deg, rgb(29 33 22 / 0.94), rgb(13 16 12 / 0.96)),
#11140f;
box-shadow: -28px 0 80px rgb(0 0 0 / 0.52);
transform: translateX(104%);
transition:
opacity 260ms ease,
transform 520ms cubic-bezier(0.2, 0.8, 0.2, 1);
backdrop-filter: blur(16px);
}
#app.options-open .fighter-entry {
transform: translateX(0);
}
#app.match-live .fighter-entry {
top: 24px;
right: 24px;
height: auto;
max-height: calc(100vh - 48px);
gap: 16px;
border: 1px solid rgb(239 199 103 / 0.22);
border-radius: 8px;
padding: 20px;
transform: translateX(0);
}
#app.match-live.drawer-collapsed .fighter-entry {
width: auto;
min-width: 0;
overflow: visible;
border-color: transparent;
padding: 0;
background: transparent;
box-shadow: none;
opacity: 1;
pointer-events: auto;
transform: translateX(0);
}
#app.match-live .drawer-close {
display: none;
}
#app.match-live .fighter-entry h2 {
font-size: 2rem;
}
#app.match-live .fighter-entry textarea {
min-height: 190px;
}
#app.match-live .fighter-entry fieldset {
padding: 12px;
}
#app.match-live.drawer-collapsed .entry-copy,
#app.match-live.drawer-collapsed .fighter-entry form {
display: none;
}
#app.match-live.drawer-collapsed .drawer-header {
justify-content: end;
}
.drawer-header {
display: flex;
align-items: start;
justify-content: space-between;
gap: 16px;
}
.drawer-header-controls {
display: flex;
align-items: center;
gap: 8px;
}
.entry-copy {
display: grid;
gap: 8px;
}
.eyebrow {
margin: 0;
color: #e3b24f;
font-size: 0.78rem;
font-weight: 900;
letter-spacing: 0;
text-transform: uppercase;
}
h2 {
margin: 0;
color: #fff3d2;
font-size: clamp(1.7rem, 4vw, 2.5rem);
line-height: 1.05;
letter-spacing: 0;
}
.drawer-close {
display: grid;
place-items: center;
width: 40px;
height: 40px;
flex: 0 0 auto;
border: 1px solid rgb(238 185 73 / 0.22);
border-radius: 8px;
background: rgb(255 246 216 / 0.08);
color: #f8deb0;
font-weight: 900;
}
.drawer-close:hover {
background: rgb(255 246 216 / 0.14);
}
.about-backdrop {
position: fixed;
inset: 0;
z-index: 20;
display: grid;
place-items: center;
padding: clamp(16px, 4vw, 34px);
background: rgb(3 5 4 / 0.66);
backdrop-filter: blur(8px);
}
.about-backdrop[hidden] {
display: none;
}
.about-dialog {
display: grid;
grid-template-rows: auto auto minmax(0, 1fr);
width: min(560px, calc(100vw - 32px));
max-height: min(760px, calc(100svh - 32px));
overflow: hidden;
border: 1px solid rgb(239 199 103 / 0.28);
border-radius: 8px;
background:
linear-gradient(180deg, rgb(29 33 22 / 0.98), rgb(10 13 9 / 0.98)),
#11140f;
box-shadow:
0 24px 100px rgb(0 0 0 / 0.62),
inset 0 1px 0 rgb(255 255 255 / 0.06);
outline: none;
}
.about-header {
display: flex;
align-items: start;
justify-content: space-between;
gap: 16px;
padding: clamp(20px, 4vw, 28px) clamp(20px, 4vw, 30px) 14px;
}
.about-close {
display: grid;
place-items: center;
width: 40px;
height: 40px;
flex: 0 0 auto;
border: 1px solid rgb(238 185 73 / 0.22);
border-radius: 8px;
background: rgb(255 246 216 / 0.08);
color: #f8deb0;
font-weight: 900;
}
.about-close:hover {
background: rgb(255 246 216 / 0.14);
}
.about-tabs {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 4px;
padding: 0 clamp(20px, 4vw, 30px) 14px;
border-bottom: 1px solid rgb(238 185 73 / 0.16);
}
.about-tab {
min-width: 0;
min-height: 42px;
border: 1px solid transparent;
border-radius: 6px;
padding: 8px 10px;
background: rgb(255 246 216 / 0.06);
color: #ead8ad;
font-size: 0.86rem;
font-weight: 900;
line-height: 1.2;
}
.about-tab[aria-selected="true"] {
border-color: rgb(238 185 73 / 0.36);
background: #323822;
color: #fff7df;
}
.about-panel {
min-height: 0;
overflow: auto;
padding: clamp(18px, 4vw, 26px) clamp(20px, 4vw, 30px) clamp(22px, 5vw, 34px);
}
.about-fields {
display: grid;
gap: 0;
margin: 0;
}
.about-field-row {
display: grid;
grid-template-columns: 96px minmax(0, 1fr);
align-items: center;
gap: 14px;
min-height: 50px;
border-bottom: 1px solid rgb(238 185 73 / 0.14);
}
.about-field-row:first-child {
border-top: 1px solid rgb(238 185 73 / 0.14);
}
.about-field-row dt {
color: #e3b24f;
font-size: 0.78rem;
font-weight: 950;
text-transform: uppercase;
}
.about-field-row dd {
min-width: 0;
margin: 0;
color: #fff7df;
font-weight: 800;
overflow-wrap: anywhere;
}
.about-field-row a,
.about-markdown a {
color: #85dcc7;
text-decoration-color: rgb(133 220 199 / 0.42);
text-underline-offset: 3px;
}
.about-markdown {
display: grid;
gap: 12px;
color: #ead8ad;
font-size: 0.92rem;
font-weight: 600;
line-height: 1.56;
}
.about-markdown :is(h3, h4, h5, h6, p, ul, blockquote) {
margin: 0;
}
.about-markdown h3,
.about-markdown h4,
.about-markdown h5,
.about-markdown h6 {
color: #fff3d2;
font-size: 1rem;
line-height: 1.3;
}
.about-markdown blockquote {
border-left: 3px solid rgb(238 185 73 / 0.36);
padding: 4px 0 4px 16px;
color: #c4b693;
font-style: italic;
}
.about-markdown hr {
margin: 8px 0;
border: 0;
border-top: 1px solid rgb(238 185 73 / 0.16);
}
.about-markdown code {
border: 1px solid rgb(238 185 73 / 0.14);
border-radius: 4px;
padding: 2px 5px;
background: rgb(255 246 216 / 0.08);
color: #f1c761;
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-size: 0.88em;
}
.about-markdown li {
line-height: 1.5;
}
.about-markdown li strong {
color: #fff3d2;
}
.about-markdown ul {
display: grid;
gap: 8px;
padding-left: 1.2rem;
}
.about-empty {
color: #bfae83;
}
form {
display: grid;
gap: 16px;
}
.match-actions {
display: grid;
gap: 10px;
}
fieldset {
display: grid;
gap: 10px;
min-width: 0;
margin: 0;
border: 1px solid rgb(238 185 73 / 0.22);
border-radius: 8px;
padding: 14px;
background: rgb(5 7 5 / 0.26);
}
legend {
padding: 0 6px;
color: #e3b24f;
font-size: 0.78rem;
font-weight: 900;
letter-spacing: 0;
text-transform: uppercase;
}
.team-size-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.team-size-number {
width: 88px;
min-width: 88px;
padding-inline: 10px;
text-align: center;
font-weight: 900;
}
label {
color: #ead8ad;
font-size: 0.92rem;
}
input:not([type="range"]):not([type="radio"]),
textarea {
min-height: 48px;
border: 1px solid rgb(238 185 73 / 0.28);
border-radius: 8px;
padding: 0 14px;
background: #232719;
color: #fff7df;
outline: none;
}
textarea {
min-height: 258px;
resize: vertical;
padding-block: 12px;
line-height: 1.45;
}
input[type="range"] {
width: 100%;
accent-color: #e3b24f;
}
.spawn-placement-field {
display: grid;
gap: 8px;
}
.spawn-placement-label {
color: #ead8ad;
font-size: 0.92rem;
}
.spawn-placement-options {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 4px;
min-width: 0;
border: 1px solid rgb(238 185 73 / 0.2);
border-radius: 8px;
padding: 4px;
background: #1d2116;
}
.spawn-placement-option {
position: relative;
min-width: 0;
}
.spawn-placement-option input {
position: absolute;
width: 1px;
height: 1px;
opacity: 0;
pointer-events: none;
}
.spawn-placement-option span {
display: grid;
min-height: 44px;
place-items: center;
border: 1px solid transparent;
border-radius: 6px;
padding: 8px;
color: #ead8ad;
text-align: center;
font-size: 0.86rem;
font-weight: 900;
line-height: 1.25;
cursor: pointer;
}
.spawn-placement-option input:checked + span {
border-color: rgb(238 185 73 / 0.36);
background: #323822;
color: #fff7df;
}
.spawn-placement-option input:focus-visible + span {
outline: 2px solid #f1c761;
outline-offset: -2px;
}
.scoreboard {
position: fixed;
top: clamp(14px, 3vw, 28px);
left: var(--score-panel-left);
z-index: 3;
display: flex;
justify-content: flex-start;
width: var(--score-panel-width);
max-height: calc(100vh - 96px);
min-height: 64px;
overflow: hidden;
padding: 8px;
border: 1px solid rgb(238 185 73 / 0.18);
border-radius: 8px;
background: rgb(4 6 4 / 0.5);
opacity: 0;
pointer-events: none;
transform: translateY(-18px);
transition:
opacity 420ms ease,
transform 420ms ease;
backdrop-filter: blur(10px);
}
#app.match-live .scoreboard {
opacity: 1;
pointer-events: auto;
transform: translateY(0);
}
.score-side {
display: flex;
flex-wrap: wrap;
gap: 6px;
width: max-content;
}
.score-side.right {
display: none;
}
.team-score {
display: grid;
grid-template-rows: auto 1px auto;
gap: 5px;
width: 100px;
min-height: 54px;
overflow: hidden;
border-radius: 6px;
padding: 7px 9px 6px;
color: #fff;
font-size: 0.8rem;
font-weight: 900;
text-align: left;
text-shadow: 1px 1px 2px #000;
transition:
filter 160ms ease,
transform 160ms ease;
}
.team-score:hover {
filter: brightness(1.16);
transform: translateY(-1px);
}
.team-score.is-focused {
box-shadow:
inset 0 0 0 2px rgb(255 244 209 / 0.92),
0 0 18px rgb(227 178 79 / 0.26);
}
.team-score:disabled {
cursor: default;
filter: grayscale(0.6) brightness(0.68);
}
.team-score:disabled:hover {
transform: none;
}
.team-score-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.team-score-rule {
width: 100%;
background: var(--team-color);
opacity: 0.9;
}
.team-score-count {
justify-self: end;
color: #fff2c8;
font-size: 0.86rem;
}
.battle-notice {
position: fixed;
top: clamp(12px, 2vw, 20px);
left: 50%;
z-index: 5;
display: flex;
align-items: center;
justify-content: center;
width: min(420px, 72vmin, calc(100vw - 64px));
min-height: 38px;
border: 1px solid rgb(238 185 73 / 0.26);
border-radius: 8px;
padding: 8px 14px;
background: rgb(8 10 7 / 0.68);
color: #ffe8b4;
font-size: 0.8rem;
font-weight: 900;
line-height: 1.35;
text-align: center;
text-shadow: 1px 1px 2px #000;
opacity: 0;
pointer-events: none;
transform: translate(-50%, -10px);
transition:
opacity 260ms ease,
transform 260ms ease;
backdrop-filter: blur(10px);
}
#app.match-live .battle-notice.is-visible {
opacity: 1;
transform: translate(-50%, 0);
}
@media (min-width: 961px) {
#app.match-live .battle-notice {
right: auto;
left: 50%;
width: min(420px, 72vmin, calc(100vw - var(--drawer-width) - var(--score-rail-width) - 56px));
transform: translate(-50%, -10px);
}
#app.match-live .battle-notice.is-visible {
transform: translate(-50%, 0);
}
#app.match-live.drawer-collapsed .battle-notice {
right: auto;
width: min(420px, 72vmin, calc(100vw - 64px));
}
}
.kill-log {
position: fixed;
bottom: clamp(14px, 3vw, 26px);
left: var(--score-panel-left);
z-index: 4;
width: min(370px, calc(100vw - 32px));
max-height: min(34vh, 292px);
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: rgb(238 185 73 / 0.3) transparent;
border: 1px solid rgb(238 185 73 / 0.2);
border-radius: 8px;
padding: 10px;
background: rgb(4 6 4 / 0.58);
opacity: 0;
pointer-events: none;
transform: translateY(16px);
transition:
opacity 260ms ease,
transform 260ms ease;
backdrop-filter: blur(10px);
}
.kill-log::-webkit-scrollbar {
width: 4px;
}
.kill-log::-webkit-scrollbar-track {
background: transparent;
}
.kill-log::-webkit-scrollbar-thumb {
border-radius: 10px;
background: rgb(238 185 73 / 0.3);
}
#app.match-live .kill-log.has-entries {
opacity: 1;
pointer-events: auto;
transform: translateY(0);
}
.kill-log-list {
display: flex;
flex-direction: column;
gap: 6px;
min-height: 0;
margin: 0;
padding: 0;
list-style: none;
}
.kill-log-item {
display: grid;
grid-template-columns: minmax(0, 1fr) 54px minmax(0, 1fr);
align-items: center;
gap: 8px;
min-height: 54px;
border: 1px solid rgb(255 244 209 / 0.12);
border-radius: 6px;
padding: 7px 9px;
background: rgb(8 10 7 / 0.74);
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.06);
animation: kill-log-entry 180ms ease both;
}
.kill-log-fighter {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
}
.kill-log-fighter.killer {
border-left: 3px solid var(--killer-color);
padding-left: 6px;
}
.kill-log-fighter.victim {
flex-direction: row-reverse;
border-right: 3px solid var(--victim-color);
padding-right: 6px;
justify-content: end;
text-align: right;
}
.kill-log-avatar {
position: relative;
flex: 0 0 auto;
width: 36px;
height: 36px;
border: 1px solid rgb(255 244 209 / 0.16);
border-radius: 6px;
background-color: rgb(255 246 216 / 0.08);
background-position: left center;
background-repeat: no-repeat;
background-size: auto 36px;
image-rendering: pixelated;
box-shadow: inset 0 -10px 18px rgb(0 0 0 / 0.22);
}
.kill-log-fighter.victim .kill-log-avatar::before,
.kill-log-fighter.victim .kill-log-avatar::after {
content: "";
position: absolute;
top: 7px;
right: 1px;
width: 14px;
height: 2px;
border: 1px solid rgb(255 216 212 / 0.22);
border-radius: 999px;
background: #f24a42;
box-shadow:
0 0 0 1px rgb(48 4 3 / 0.7),
0 0 5px rgb(227 54 46 / 0.6);
transform-origin: center;
}
.kill-log-fighter.victim .kill-log-avatar::before {
transform: rotate(45deg);
}
.kill-log-fighter.victim .kill-log-avatar::after {
transform: rotate(-45deg);
}
.kill-log-copy {
display: grid;
gap: 2px;
min-width: 0;
}
.kill-log-team,
.kill-log-member {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.kill-log-team {
min-width: 0;
color: #fff7df;
font-size: 0.78rem;
font-weight: 900;
text-shadow: 1px 1px 2px #000;
}
.kill-log-member {
flex: 0 0 auto;
color: #ead8ad;
font-size: 0.72rem;
font-weight: 800;
}
.kill-log-action {
display: grid;
justify-items: center;
gap: 2px;
min-width: 0;
}
.kill-log-action-text {
color: #ffdc93;
font-size: 0.68rem;
font-weight: 950;
line-height: 1;
}
.kill-log-weapon {
position: relative;
display: block;
width: 28px;
height: 28px;
place-self: center;
border: 1px solid rgb(238 185 73 / 0.28);
border-radius: 999px;
background: rgb(255 246 216 / 0.08);
box-shadow: 0 0 16px rgb(227 89 59 / 0.16);
}
.kill-log-weapon::before,
.kill-log-weapon::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
width: 18px;
height: 3px;
border-radius: 999px;
background: linear-gradient(90deg, #ffe8b4 0 70%, #b93c2f 70% 100%);
box-shadow: 0 0 8px rgb(255 226 166 / 0.3);
transform-origin: center;
}
.kill-log-weapon::before {
transform: translate(-50%, -50%) rotate(42deg);
}
.kill-log-weapon::after {
transform: translate(-50%, -50%) rotate(-42deg);
}
.victory-celebration {
position: fixed;
z-index: 9;
display: grid;
overflow: hidden;
place-items: center;
inset: 0;
background: rgb(4 6 4 / 0.2);
isolation: isolate;
opacity: 1;
pointer-events: auto;
transform: scale(1);
transition:
opacity 220ms ease,
transform 220ms ease;
}
.victory-celebration.is-leaving {
opacity: 0;
transform: scale(0.98);
}
.victory-celebration::before {
content: "";
position: absolute;
z-index: -1;
width: min(122vmin, 1240px);
aspect-ratio: 1;
border-radius: 50%;
background:
radial-gradient(circle, rgb(255 233 166 / 0.18) 0 18%, rgb(227 178 79 / 0.12) 31%, transparent 66%);
animation: victory-glow 1.8s ease-out both;
}
.victory-celebration.is-draw::before {
background:
radial-gradient(circle, rgb(255 247 223 / 0.16) 0 18%, rgb(227 178 79 / 0.1) 31%, transparent 62%);
}
.victory-rays {
position: absolute;
z-index: 0;
width: min(112vmin, 1120px);
aspect-ratio: 1;
border-radius: 50%;
background: repeating-conic-gradient(
from -4deg,
rgb(255 233 166 / 0.18) 0 8deg,
transparent 8deg 18deg
);
opacity: 0.54;
mask-image: radial-gradient(circle, #000 0 18%, transparent 66%);
animation: victory-rays-in 1.1s ease-out both, victory-rays-turn 11s linear infinite;
}
.victory-celebration.is-draw .victory-rays {
opacity: 0.22;
}
.victory-confetti {
position: absolute;
z-index: 1;
inset: 0;
}
.victory-confetti-piece {
position: absolute;
top: 50%;
left: 50%;
display: block;
width: clamp(6px, 0.8vw, 11px);
height: clamp(10px, 1.2vw, 18px);
border-radius: 8px;
background: var(--confetti-color);
box-shadow: 0 0 12px rgb(255 230 166 / 0.22);
opacity: 0;
transform: translate(-50%, -50%) rotate(var(--confetti-tilt)) scale(0.3);
animation: victory-confetti-burst var(--confetti-duration) cubic-bezier(0.15, 0.84, 0.35, 1) var(--confetti-delay) both;
}
.victory-confetti-piece:nth-child(3n) {
width: clamp(10px, 1vw, 15px);
height: clamp(6px, 0.72vw, 10px);
border-radius: 2px;
}
.victory-banner {
position: relative;
z-index: 2;
display: grid;
width: min(calc(100vw - 36px), 760px);
min-height: clamp(108px, 18vw, 170px);
overflow: hidden;
place-items: center;
border: 2px solid #f1c45d;
border-radius: 8px;
padding: clamp(1.25rem, 3.8vw, 2rem) clamp(1.3rem, 5.4vw, 3.4rem);
background:
linear-gradient(135deg, rgb(18 21 13 / 0.98), rgb(3 5 4 / 0.92)),
rgb(4 6 4 / 0.9);
color: #fff7df;
font-size: clamp(1.65rem, 5vw, 3rem);
font-weight: 950;
letter-spacing: 0;
line-height: 1.12;
text-align: center;
text-wrap: balance;
text-shadow:
0 2px 0 rgb(55 36 8 / 0.56),
0 0 24px rgb(255 226 153 / 0.28);
box-shadow:
0 0 0 1px rgb(255 237 187 / 0.2) inset,
0 0 42px rgb(227 178 79 / 0.44),
0 24px 90px rgb(0 0 0 / 0.58);
animation: banner-in 0.64s cubic-bezier(0.16, 0.9, 0.25, 1.2);
backdrop-filter: blur(6px);
}
.victory-banner::before {
content: "";
position: absolute;
inset: -40% auto -40% -36%;
width: 28%;
background: linear-gradient(90deg, transparent, rgb(255 248 223 / 0.6), transparent);
transform: skewX(-18deg);
animation: victory-banner-sheen 1s 0.28s ease-out both;
}
.victory-banner::after {
content: "";
position: absolute;
inset: 10px;
border: 1px solid rgb(255 225 151 / 0.24);
border-radius: 5px;
}
.victory-banner-message {
position: relative;
z-index: 1;
display: block;
max-width: 100%;
overflow-wrap: anywhere;
animation: victory-message-pulse 720ms 80ms ease-out both;
}
.victory-celebration.is-draw .victory-banner {
border-color: #d8c28d;
box-shadow:
0 0 0 1px rgb(255 237 187 / 0.14) inset,
0 0 28px rgb(227 178 79 / 0.24),
0 24px 90px rgb(0 0 0 / 0.52);
}
#app.match-paused .arena-shell::after {
content: "일시정지";
position: fixed;
top: 50%;
left: 50%;
z-index: 6;
border: 1px solid rgb(238 185 73 / 0.34);
border-radius: 8px;
padding: 14px 26px;
background: rgb(5 7 5 / 0.76);
color: #ffe8b4;
font-size: clamp(1.3rem, 4vw, 2rem);
font-weight: 950;
transform: translate(-50%, -50%);
box-shadow: 0 18px 60px rgb(0 0 0 / 0.46);
backdrop-filter: blur(8px);
}
.match-status {
position: fixed;
bottom: clamp(14px, 3vw, 26px);
left: 50%;
z-index: 4;
width: min(980px, calc(100vw - 32px));
min-height: 48px;
overflow: hidden;
border: 1px solid rgb(238 185 73 / 0.28);
border-radius: 8px;
padding: 13px 0;
background: rgb(8 10 7 / 0.74);
color: #ffe2a6;
font-weight: 900;
opacity: 0;
pointer-events: none;
transform: translate(-50%, calc(100% + 28px));
transition:
opacity 420ms ease,
transform 420ms ease;
backdrop-filter: blur(10px);
}
#app.status-active:not(.match-live) .match-status {
opacity: 1;
transform: translate(-50%, 0);
}
#app.match-live .match-status {
display: none;
}
@media (min-width: 961px) {
#app.match-live .match-status {
left: calc((100vw - var(--drawer-width)) / 2);
width: min(760px, calc(100vw - var(--drawer-width) - 32px));
}
#app.match-live.drawer-collapsed .match-status {
left: 50%;
width: min(980px, calc(100vw - 32px));
}
}
.status-track {
display: flex;
width: max-content;
min-width: 200%;
gap: 64px;
animation: status-marquee 22s linear infinite;
}
.status-track span {
flex: 0 0 auto;
min-width: calc(50vw - 32px);
padding-left: 28px;
white-space: nowrap;
}
@keyframes intro-rise {
from {
opacity: 0;
transform: translateY(22px) scale(0.96);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
@keyframes preview-attack {
to {
background-position-x: var(--sprite-end);
}
}
@keyframes preview-breathe {
0%,
100% {
margin-top: 0;
}
50% {
margin-top: -8px;
}
}
@keyframes preview-strike {
0%,
58%,
100% {
opacity: 0;
}
64%,
76% {
opacity: 0.86;
}
}
@keyframes status-marquee {
from {
transform: translateX(0);
}
to {
transform: translateX(-50%);
}
}
@keyframes kill-log-entry {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes banner-in {
from {
opacity: 0;
transform: translateY(18px) scale(0.78);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
@keyframes victory-banner-sheen {
from {
opacity: 0;
transform: translateX(0) skewX(-18deg);
}
18% {
opacity: 1;
}
to {
opacity: 0;
transform: translateX(560%) skewX(-18deg);
}
}
@keyframes victory-confetti-burst {
0% {
opacity: 0;
transform: translate(-50%, -50%) rotate(var(--confetti-tilt)) scale(0.3);
}
12% {
opacity: 1;
}
74% {
opacity: 1;
}
100% {
opacity: 0;
transform:
translate(calc(-50% + var(--confetti-x)), calc(-50% + var(--confetti-y)))
rotate(calc(var(--confetti-tilt) + var(--confetti-spin)))
scale(1);
}
}
@keyframes victory-glow {
from {
opacity: 0;
transform: scale(0.58);
}
35% {
opacity: 1;
}
to {
opacity: 0.8;
transform: scale(1);
}
}
@keyframes victory-rays-in {
from {
transform: scale(0.56);
}
to {
transform: scale(1);
}
}
@keyframes victory-rays-turn {
to {
rotate: 360deg;
}
}
@keyframes victory-message-pulse {
from {
opacity: 0.72;
transform: scale(0.88);
}
58% {
transform: scale(1.05);
}
to {
opacity: 1;
transform: scale(1);
}
}
@media (prefers-reduced-motion: reduce) {
.victory-banner,
.victory-banner::before,
.victory-banner-message,
.victory-celebration::before,
.victory-confetti-piece,
.victory-rays {
animation-duration: 1ms;
animation-iteration-count: 1;
}
}
@media (max-width: 960px) {
body {
overflow: hidden;
}
#app {
--arena-gap: 0px;
--mobile-game-size: min(100vw, calc(100svh - var(--score-band-height)));
--mobile-kill-log-top: calc(var(--score-band-height) + var(--mobile-game-size) + 10px);
--mobile-options-button-width: 54px;
--mobile-options-gap: 8px;
--mobile-team-card-width: clamp(56px, calc((100vw - 120px) / 4), 72px);
--mobile-visitor-space: calc(104px + env(safe-area-inset-bottom));
--score-band-height: 132px;
--score-panel-left: 10px;
--score-panel-width: calc(100vw - 20px);
--score-rail-width: 0px;
}
#app.match-live .arena-shell {
place-items: start center;
}
#app.match-live #game {
width: var(--mobile-game-size);
height: var(--mobile-game-size);
margin-top: var(--score-band-height);
margin-left: 0;
}
.intro-stage {
padding: 20px;
}
.arena-logo {
font-size: clamp(3.8rem, 22vw, 7rem);
}
.fighter-entry {
width: 100vw;
padding: 22px;
}
#app.match-live .fighter-entry {
top: calc(10px + env(safe-area-inset-top));
right: 10px;
left: 10px;
width: auto;
max-height: calc(100svh - 20px - env(safe-area-inset-top) - env(safe-area-inset-bottom));
gap: 10px;
padding: 12px;
}
#app.match-live.drawer-collapsed .fighter-entry {
top: calc(22px + env(safe-area-inset-top));
right: 10px;
left: auto;
width: auto;
}
#app.match-live .fighter-entry h2 {
font-size: clamp(1.45rem, 7vw, 1.8rem);
}
#app.match-live .fighter-entry textarea {
height: 112px;
min-height: 112px;
resize: none;
}
#app.match-live .fighter-entry fieldset {
gap: 7px;
padding: 9px;
}
#app.match-live .fighter-entry form {
gap: 10px;
}
#app.match-live .entry-copy {
gap: 4px;
}
#app.match-live .eyebrow {
font-size: 0.68rem;
}
#app.match-live label,
#app.match-live .spawn-placement-label {
font-size: 0.82rem;
}
#app.match-live input:not([type="range"]):not([type="radio"]),
#app.match-live textarea {
min-height: 40px;
padding-inline: 10px;
}
#app.match-live textarea {
padding-block: 9px;
}
#app.match-live .team-size-number {
width: 64px;
min-width: 64px;
}
#app.match-live .spawn-placement-option span {
min-height: 36px;
padding: 6px;
font-size: 0.76rem;
}
#app.match-live .match-actions {
gap: 8px;
}
#app.match-live .match-actions button {
min-height: 44px;
}
#app.match-live .drawer-toggle {
min-width: 116px;
}
#app.match-live.drawer-collapsed .drawer-toggle {
width: var(--mobile-options-button-width);
min-width: var(--mobile-options-button-width);
padding-inline: 6px;
font-size: 0;
}
#app.match-live.drawer-collapsed .drawer-toggle::before {
content: "옵션";
font-size: 0.78rem;
line-height: 1;
}
.battle-preview {
opacity: 0.62;
}
.preview-knight {
left: -8vw;
top: 52vh;
}
.preview-orc {
right: -9vw;
top: 49vh;
}
.preview-wizard {
left: 48vw;
top: 21vh;
}
.scoreboard {
align-items: flex-start;
top: 10px;
left: var(--score-panel-left);
width: var(--score-panel-width);
max-height: calc(var(--score-band-height) - 12px);
overflow-x: auto;
overflow-y: hidden;
padding: 9px min(148px, 38vw) 9px 9px;
scrollbar-color: rgb(238 185 73 / 0.38) transparent;
scrollbar-width: thin;
touch-action: pan-x;
}
#app.match-live.drawer-collapsed .scoreboard {
width: calc(
100vw - 20px - var(--mobile-options-button-width) - var(--mobile-options-gap)
);
padding-right: 9px;
}
.score-side {
display: grid;
grid-auto-columns: var(--mobile-team-card-width);
grid-auto-flow: column;
grid-template-rows: repeat(2, 48px);
gap: 5px 5px;
}
.scoreboard::-webkit-scrollbar {
height: 4px;
}
.scoreboard::-webkit-scrollbar-track {
background: transparent;
}
.scoreboard::-webkit-scrollbar-thumb {
border-radius: 999px;
background: rgb(238 185 73 / 0.38);
}
.team-score {
width: auto;
min-height: 0;
height: 48px;
gap: 3px;
padding: 5px 6px;
font-size: 0.66rem;
}
.team-score-count {
font-size: 0.74rem;
}
.team-score.is-focused {
box-shadow: inset 0 0 0 2px rgb(255 244 209 / 0.92);
}
.battle-notice {
top: calc(var(--score-band-height) + 8px);
right: 24px;
left: 24px;
width: auto;
padding-inline: 12px;
font-size: 0.76rem;
transform: translateY(-10px);
}
#app.match-live .battle-notice.is-visible {
transform: translateY(0);
}
.kill-log {
top: var(--mobile-kill-log-top);
bottom: auto;
left: 10px;
width: calc(100vw - 20px);
max-height: calc(100svh - var(--mobile-kill-log-top) - var(--mobile-visitor-space));
padding: 8px;
}
#app.match-live .victory-celebration {
padding:
var(--score-band-height)
14px
min(30svh, 230px);
}
.victory-banner {
width: min(calc(100vw - 48px), 520px);
min-height: 92px;
padding: 1rem 1.1rem;
font-size: clamp(1.35rem, 7vw, 2rem);
}
.match-status {
bottom: 10px;
width: calc(100vw - 20px);
}
.arena-meta {
right: 10px;
bottom: calc(10px + env(safe-area-inset-bottom));
z-index: 10;
gap: 8px;
opacity: 1;
pointer-events: auto;
}
.visitor-count {
font-size: 0.68rem;
}
.about-button {
min-width: 68px;
min-height: 26px;
font-size: 0.68rem;
}
.about-backdrop {
align-items: end;
padding: 12px;
}
.about-dialog {
width: 100%;
max-height: calc(100svh - 24px);
}
.about-header {
padding: 18px 18px 12px;
}
.about-tabs {
padding: 0 18px 12px;
}
.about-panel {
padding: 16px 18px 22px;
}
.about-field-row {
grid-template-columns: 78px minmax(0, 1fr);
min-height: 48px;
gap: 10px;
}
}