Skip to content

Commit 8cd3acb

Browse files
authored
Merge pull request #66 from hamlsy/feat/65
[Feat/65] 회원 통계 api 연동 및 디자인 개선
2 parents 06ea2ed + c3d24c0 commit 8cd3acb

9 files changed

Lines changed: 247 additions & 87 deletions

File tree

KoSpot-frontend-private

src/core/components/NavigationBar.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<header class="header">
44
<div class="header-content">
55
<div class="header-left">
6-
<div class="home-link" @click="simpleMode ? null : goToMain" :style="{ cursor: simpleMode ? 'default' : 'pointer' }">
6+
<div class="home-link" @click="goToMain">
77
<h1 class="logo">KoSpot</h1>
88
<span class="badge">Beta</span>
99
</div>
@@ -380,8 +380,8 @@ export default {
380380
display: flex;
381381
align-items: center;
382382
text-decoration: none;
383-
cursor: pointer;
384383
transition: opacity 0.2s ease;
384+
cursor: pointer;
385385
}
386386
387387
.home-link:hover {

src/features/game/multiplayer/shared/services/websocket/composables/core.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const connectionCallbacks = ref(new Set());
1818
* @param {String} endpoint - WebSocket 서버 엔드포인트
1919
* @param {Function} onConnectCallback - 연결 성공 시 실행할 콜백 함수
2020
*/
21-
const connect = (endpoint = "/api/ws", onConnectCallback = null) => {
21+
const connect = (endpoint = "/ws", onConnectCallback = null) => {
2222
// 기존 연결이 있는 경우 정리 (새로고침 시 중복 연결 방지)
2323
if (stompClient.value && !isConnected.value) {
2424
try {
@@ -56,7 +56,7 @@ const connect = (endpoint = "/api/ws", onConnectCallback = null) => {
5656
} else {
5757
// 프로덕션 환경: 환경 변수 또는 현재 호스트 사용
5858
if (process.env.VUE_APP_WS_URL) {
59-
wsUrl = `${process.env.VUE_APP_WS_URL}`;
59+
wsUrl = `${process.env.VUE_APP_WS_URL}/${endpoint}`;
6060
} else {
6161
// 환경 변수가 없으면 현재 페이지의 호스트 사용
6262
wsUrl = `${window.location.protocol}//${window.location.host}${endpoint}`;

src/features/game/single/main/components/PracticeTutorialModal.vue

Lines changed: 54 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33
<div class="tutorial-container">
44
<!-- 헤더 -->
55
<div class="tutorial-header">
6+
<button
7+
class="top-dismiss-button"
8+
type="button"
9+
@click="skipTutorial"
10+
>
11+
<i class="fas fa-times"></i>
12+
튜토리얼 닫기
13+
</button>
614
<div class="progress-indicator">
715
<span
816
v-for="(slide, index) in slides"
@@ -12,9 +20,6 @@
1220
@click="goToSlide(index)"
1321
></span>
1422
</div>
15-
<button class="nav-button complete-button" @click="skipTutorial">
16-
튜토리얼 닫기
17-
</button>
1823
</div>
1924

2025
<!-- 슬라이드 컨텐츠 -->
@@ -181,20 +186,50 @@ const completeTutorial = () => {
181186
overflow-y: auto;
182187
display: flex;
183188
flex-direction: column;
184-
padding: 2rem;
189+
padding: 1rem;
185190
}
186191
187192
/* 헤더 */
188193
.tutorial-header {
189194
display: flex;
190-
justify-content: space-between;
195+
flex-direction: column;
191196
align-items: center;
197+
gap: 0.75rem;
192198
padding: 0;
193-
margin-bottom: 1.5rem;
199+
margin-bottom: 1.75rem;
194200
border-bottom: none;
195201
position: relative;
196202
}
197203
204+
.top-dismiss-button {
205+
display: inline-flex;
206+
align-items: center;
207+
gap: 0.5rem;
208+
padding: 0.55rem 1.1rem;
209+
border-radius: 10px;
210+
background: linear-gradient(135deg, #f1f5f9, #e2e8f0);
211+
border: 1px solid #cbd5f5;
212+
color: #1e293b;
213+
font-size: 0.85rem;
214+
font-weight: 600;
215+
cursor: pointer;
216+
transition: transform 0.2s ease, box-shadow 0.2s ease;
217+
}
218+
219+
.top-dismiss-button i {
220+
font-size: 0.9rem;
221+
}
222+
223+
.top-dismiss-button:hover {
224+
transform: translateY(-2px);
225+
box-shadow: 0 8px 18px rgba(148, 163, 184, 0.35);
226+
}
227+
228+
.top-dismiss-button:active {
229+
transform: translateY(0);
230+
box-shadow: none;
231+
}
232+
198233
/* 진행 표시기 */
199234
.progress-indicator {
200235
display: flex;
@@ -204,44 +239,23 @@ const completeTutorial = () => {
204239
}
205240
206241
.progress-dot {
207-
width: 6px;
208-
height: 6px;
242+
width: 10px;
243+
height: 10px;
209244
border-radius: 50%;
210-
background: #cbd5e1;
245+
background: #e2e8f0;
246+
border: 2px solid #cbd5f5;
211247
cursor: pointer;
212-
transition: width 0.2s ease, background-color 0.2s ease;
248+
transition: transform 0.2s ease, background 0.2s ease, border-color 0.2s ease;
213249
}
214250
215251
.progress-dot.active {
216252
background: #3b82f6;
217-
width: 20px;
218-
border-radius: 3px;
253+
border-color: #2563eb;
254+
transform: scale(1.15);
219255
}
220256
221257
.progress-dot:hover {
222-
background: #94a3b8;
223-
}
224-
225-
/* 닫기 버튼 */
226-
.close-button {
227-
padding: 10px 20px;
228-
border: none;
229-
border-radius: 8px;
230-
background: #f1f5f9;
231-
color: #475569;
232-
font-size: 0.95rem;
233-
font-weight: 600;
234-
cursor: pointer;
235-
transition: opacity 0.15s ease;
236-
white-space: nowrap;
237-
}
238-
239-
.close-button:hover {
240-
opacity: 0.9;
241-
}
242-
243-
.close-button:active {
244-
opacity: 0.8;
258+
background: #bfdbfe;
245259
}
246260
247261
/* 슬라이드 래퍼 */
@@ -299,10 +313,12 @@ const completeTutorial = () => {
299313
.navigation-controls {
300314
display: flex;
301315
justify-content: space-between;
316+
align-items: center;
302317
padding: 0;
303318
margin-top: 1.5rem;
304319
border-top: none;
305320
gap: 10px;
321+
flex-wrap: nowrap;
306322
}
307323
308324
.nav-button {
@@ -390,11 +406,12 @@ const completeTutorial = () => {
390406
}
391407
392408
.navigation-controls {
393-
flex-direction: column;
409+
justify-content: center;
410+
gap: 8px;
394411
}
395412
396413
.nav-button {
397-
width: 100%;
414+
min-width: 120px;
398415
justify-content: center;
399416
}
400417
@@ -404,4 +421,3 @@ const completeTutorial = () => {
404421
}
405422
}
406423
</style>
407-

src/features/game/single/main/views/RoadViewMainView.vue

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,35 @@ function startThemeGame(gameData) {
584584
@import url("@/shared/assets/styles/common/slide-menu/slide-menu.css");
585585
@import url("@/shared/assets/styles/game/roadView/roadview-main.css");
586586
587+
.practice-mode-options {
588+
display: flex;
589+
flex-direction: column;
590+
gap: 1rem;
591+
}
592+
593+
.region-selector {
594+
display: grid;
595+
grid-template-columns: repeat(3, minmax(0, 1fr));
596+
gap: 0.75rem;
597+
width: 100%;
598+
}
599+
600+
601+
@media (max-width: 640px) {
602+
.practice-mode-options {
603+
gap: 0.75rem;
604+
}
605+
606+
.region-selector {
607+
gap: 0.5rem;
608+
}
609+
610+
.region-selector button {
611+
padding: 0.5rem 0.6rem;
612+
font-size: 0.82rem;
613+
}
614+
}
615+
587616
/* Google Ads 공간 스타일 */
588617
.google-ads-space {
589618
margin: 20px 0;
@@ -618,6 +647,10 @@ function startThemeGame(gameData) {
618647
margin: 0;
619648
}
620649
650+
.popup-header {
651+
margin: 8px;
652+
}
653+
621654
/* 반응형 */
622655
@media (max-width: 768px) {
623656
.google-ads-space {

0 commit comments

Comments
 (0)