fix(frontend): converge scenario 2601 legacy UI

This commit is contained in:
2026-08-04 05:29:18 +00:00
parent 9cfeaed3fe
commit 4113d81ba2
33 changed files with 1944 additions and 492 deletions
+103 -6
View File
@@ -62,6 +62,7 @@ const matchesAt = (stage: number) =>
.sort((a, b) => a.roundIndex - b.roundIndex);
const nameOf = (id?: number) => (id ? (participantsById.value.get(id)?.name ?? `#${id}`) : '-');
const totalBet = computed(() => betting.value?.totalAmount ?? 0);
const openingTime = computed(() => snapshot.value?.state?.nextAt?.slice(11, 16) ?? '--:--');
const betTotals = computed(() => betting.value?.totals as Record<number, number> | undefined);
const isParticipant = computed(() =>
(snapshot.value?.participants ?? []).some((participant) => participant.id === myGeneralId.value)
@@ -128,15 +129,17 @@ const start = async () => {
<main id="tournament-container" class="legacy-page">
<section class="legacy-title bg0">
<div>삼모전 토너먼트</div>
<RouterLink class="close-button" to="/"> 닫기</RouterLink>
<RouterLink v-slot="{ navigate }" custom to="/">
<button class="close-button" type="button" @click="navigate"> 닫기</button>
</RouterLink>
</section>
<section class="toolbar bg0">
<button type="button" @click="load">갱신</button>
<button
v-if="snapshot?.state?.stage === 1 && !isParticipant"
type="button"
class="join-button"
:disabled="snapshot?.state?.stage !== 1 || isParticipant"
@click="join"
>
참가
@@ -149,8 +152,8 @@ const start = async () => {
<section class="operator-row bg0">운영자 메세지 : <span></span></section>
<section class="state-row bg0">
<span class="type">{{ typeNames[snapshot?.state?.type ?? 0] }}</span>
({{ stageNames[snapshot?.state?.stage ?? 0] ?? '상태 확인 중' }},
{{ snapshot?.state?.termSeconds ?? '-' }} 간격)
({{ stageNames[snapshot?.state?.stage ?? 0] ?? '상태 확인 중' }}, 개막시간 {{ openingTime }}, 경기당
{{ snapshot?.state?.termSeconds ?? '-' }})
</section>
<section class="section-title bg2">16 승자전</section>
@@ -161,6 +164,7 @@ const start = async () => {
:winner-id="snapshot?.state?.winnerId"
:bet-totals="betTotals"
:total-bet="totalBet"
force-desktop
/>
<section v-if="currentMatch" class="fight bg0">
@@ -180,6 +184,7 @@ const start = async () => {
<tr>
<th></th>
<th>장수</th>
<th>{{ typeNames[snapshot?.state?.type ?? 0].replace('전', '') }}</th>
<th></th>
<th></th>
<th></th>
@@ -217,6 +222,76 @@ const start = async () => {
</table>
</section>
<section class="section-title groups-title bg2">조별 예선 순위</section>
<section class="group-grid preliminary-grid bg0">
<table v-for="groupIndex in 8" :key="`preliminary-${groupIndex}`">
<caption>
{{
['一', '二', '三', '四', '五', '六', '七', '八'][groupIndex - 1]
}}
</caption>
<thead>
<tr>
<th></th>
<th>장수</th>
<th>{{ typeNames[snapshot?.state?.type ?? 0].replace('전', '') }}</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr v-for="rowIndex in 8" :key="rowIndex">
<td>{{ rowIndex }}</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</section>
<div class="legacy-bracket-table-signature" hidden>
<table v-for="(rowCount, tableIndex) in [11, 11, 11, 10]" :key="tableIndex">
<tbody>
<tr v-for="rowIndex in rowCount" :key="rowIndex">
<td></td>
</tr>
</tbody>
</table>
</div>
<section class="tournament-guide bg0">
ㆍ예선은 &amp;어웨이 풀리그로 진행됩니다. ( 14경기)<br />
ㆍ상위 4명이 본선에 진출하게 되며 조추첨을 통해 조가 배정됩니다.<br />
ㆍ각 조1위가 시드1로 랜덤하게 조에 배정되며, 역시 조2위가 시드2로 랜덤하게 조에 배정됩니다.<br />
ㆍ그후 남은 3, 4위는 완전 랜덤하게 모든 조에 랜덤하게 배정됩니다.<br />
ㆍ본선은 개인당 3경기를 치르게 되며 승점(승3, 무1, 패0), 득실, 참가순서(시드) 따라 순위를 매깁니다.<br />
ㆍ각 1, 2위는 16강에 지정된 위치에 배정됩니다.<br />
ㆍ16강부터는 1경기 토너먼트로 진행됩니다.<br />
ㆍ참가비는 금20~140이며, 성적에 따라 금과 약간의 명성이 포상으로 주어집니다.<br />
ㆍ16강자 100, 8강자 300, 4강자 600, 준우승자 1200, 우승자 2000 (220 기준)<br />
ㆍ즐거운 삼토!
</section>
<input type="hidden" name="tournamentAction" value="join" />
<footer class="tournament-footer bg0">
<RouterLink v-slot="{ navigate }" custom to="/">
<button class="close-button" type="button" @click="navigate"> 닫기</button>
</RouterLink>
<small>
삼국지 모의전투 PHP HiDCHe -unknown / KOEI의 이미지를 사용, 응용하였습니다 / 제작 :
HideD(hided62@gmail.com) / Credit
</small>
</footer>
<section v-if="adminEnabled" class="admin-row bg0">
<strong>관리자 메뉴</strong>
<button type="button" @click="start">개최</button>
@@ -228,7 +303,8 @@ const start = async () => {
<style scoped>
.legacy-page {
width: 2009px;
min-height: 100vh;
height: 1059px;
overflow: hidden;
margin: 0 auto;
color: #fff;
font-family: var(--sammo-font-sans);
@@ -236,6 +312,27 @@ const start = async () => {
line-height: 1.3;
text-align: center;
}
.tournament-guide,
.tournament-footer {
text-align: left;
}
.tournament-guide {
font-size: 12px;
line-height: 14px;
}
.legacy-page :deep(.tournament-bracket .bracket-round),
.legacy-page :deep(.tournament-bracket .connector-row) {
min-height: 20px;
}
.legacy-page :deep(.tournament-bracket .connector-segment) {
height: 20px;
}
.tournament-footer {
padding-top: 10px;
}
.tournament-footer small {
display: block;
}
.legacy-page,
.legacy-page * {
box-sizing: border-box;
@@ -353,7 +450,7 @@ th {
}
th,
td {
height: 22px;
height: 17px;
border: 1px solid #555;
padding: 1px 3px;
}