릴리스: v1.4.8 주제 헤더 안정화와 검색 헤더 통일
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
# 의사결정 이력
|
# 의사결정 이력
|
||||||
|
|
||||||
|
## 2026-04-02 v1.4.8
|
||||||
|
- 주제 상세 화면 제목은 내부 ID를 잠깐 보여주는 것보다, 로딩 문구를 거쳐 실제 이름으로 자연스럽게 바뀌는 편이 사용자 체감상 더 안정적이라고 판단했다.
|
||||||
|
- 주요 목록 화면은 `pageHead` 문법을 계속 통일해 두는 편이, 이후 검색/필터 툴바를 더 붙이더라도 구조를 예측하기 쉽다고 판단했다.
|
||||||
|
|
||||||
## 2026-04-02 v1.4.7
|
## 2026-04-02 v1.4.7
|
||||||
- 주제 상세 컬렉션 화면도 즐겨찾기·나의 티어표와 같은 `pageHead` 문법으로 맞춰야, 네비게이션으로 이동하는 주요 화면들의 리듬이 더 자연스럽다고 판단했다.
|
- 주제 상세 컬렉션 화면도 즐겨찾기·나의 티어표와 같은 `pageHead` 문법으로 맞춰야, 네비게이션으로 이동하는 주요 화면들의 리듬이 더 자연스럽다고 판단했다.
|
||||||
- 라우트 전환은 한 번에 `/games`를 없애기보다, 먼저 `/topics`를 기본 진입 경로로 세우고 기존 `/games`는 alias로 유지하는 점진 전환이 더 안전하다고 정리했다.
|
- 라우트 전환은 한 번에 `/games`를 없애기보다, 먼저 `/topics`를 기본 진입 경로로 세우고 기존 `/games`는 alias로 유지하는 점진 전환이 더 안전하다고 정리했다.
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
# 할 일 및 이슈
|
# 할 일 및 이슈
|
||||||
|
|
||||||
## 단기 확인
|
## 단기 확인
|
||||||
|
- 주제 상세 화면 제목은 ID fallback 대신 로딩 문구를 쓰도록 바꿨으므로, 직접 진입·뒤로가기·다른 주제로 연속 이동할 때 헤더가 깜빡이거나 이전 제목을 잠깐 유지하지 않는지 한 번 더 QA한다.
|
||||||
|
- 검색 결과 화면도 `pageHead` 구조로 맞췄으므로, 주요 목록 화면들 간 상단 여백과 타이포 리듬이 자연스러운지 한 번 더 비교 QA한다.
|
||||||
- 주제 상세 컬렉션 화면은 `pageHead` 공통 레이아웃과 `/topics` 기본 경로로 옮겼으므로, 직접 진입·뒤로가기·검색 후 재진입 시 주소와 헤더 흐름이 자연스러운지 한 번 더 QA한다.
|
- 주제 상세 컬렉션 화면은 `pageHead` 공통 레이아웃과 `/topics` 기본 경로로 옮겼으므로, 직접 진입·뒤로가기·검색 후 재진입 시 주소와 헤더 흐름이 자연스러운지 한 번 더 QA한다.
|
||||||
- `/topics/:gameId`를 기본 경로로 세우고 `/games/:gameId`는 alias로 남겼으므로, 다음 단계에서는 에디터/검색/공유 흐름에서 어떤 링크를 새 경로로 더 전환할지 범위를 정한다.
|
- `/topics/:gameId`를 기본 경로로 세우고 `/games/:gameId`는 alias로 남겼으므로, 다음 단계에서는 에디터/검색/공유 흐름에서 어떤 링크를 새 경로로 더 전환할지 범위를 정한다.
|
||||||
- 내부 리네이밍 2단계로 관리자 `selectedTemplate / templates / loadTemplate / refreshTemplates` 묶음까지 정리했으므로, 다음 단계에서는 `/games/:gameId` 라우트와 프런트 API 호출부를 어디까지 `topic/template` 의미로 감쌀지 범위를 먼저 정리한다.
|
- 내부 리네이밍 2단계로 관리자 `selectedTemplate / templates / loadTemplate / refreshTemplates` 묶음까지 정리했으므로, 다음 단계에서는 `/games/:gameId` 라우트와 프런트 API 호출부를 어디까지 `topic/template` 의미로 감쌀지 범위를 먼저 정리한다.
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
# 업데이트 로그
|
# 업데이트 로그
|
||||||
|
|
||||||
|
## 2026-04-02 v1.4.8
|
||||||
|
- 주제 상세 컬렉션 화면은 제목을 `topicId` fallback으로 먼저 노출하지 않도록 바꾸고, 주제 전환 시에는 로딩 문구를 거쳐 실제 이름으로 자연스럽게 바뀌게 정리했다.
|
||||||
|
- 검색 결과 화면도 공통 `pageHead` 문법으로 맞춰 주요 목록 화면들의 상단 리듬을 한 번 더 통일했다.
|
||||||
|
|
||||||
## 2026-04-02 v1.4.7
|
## 2026-04-02 v1.4.7
|
||||||
- 주제 선택 뒤에 들어가는 `Collection` 화면을 공통 `pageHead` 레이아웃으로 다시 맞추고, 검색 입력을 즐겨찾기 화면처럼 상단 우측 툴바로 정리했다.
|
- 주제 선택 뒤에 들어가는 `Collection` 화면을 공통 `pageHead` 레이아웃으로 다시 맞추고, 검색 입력을 즐겨찾기 화면처럼 상단 우측 툴바로 정리했다.
|
||||||
- `공개 티어표` 보조 설명 줄은 제거해 헤더 밀도를 줄였고, 사용자 진입 경로는 `/topics/:gameId`를 기본으로 전환하면서 기존 `/games/:gameId`는 alias로 유지했다.
|
- `공개 티어표` 보조 설명 줄은 제거해 헤더 밀도를 줄였고, 사용자 진입 경로는 `/topics/:gameId`를 기본으로 전환하면서 기존 `/games/:gameId`는 alias로 유지했다.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed, onMounted, ref } from 'vue'
|
import { computed, ref, watch } from 'vue'
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
import { api } from '../lib/api'
|
import { api } from '../lib/api'
|
||||||
import { toApiUrl } from '../lib/runtime'
|
import { toApiUrl } from '../lib/runtime'
|
||||||
@@ -15,7 +15,9 @@ const tierLists = ref([])
|
|||||||
const error = ref('')
|
const error = ref('')
|
||||||
const query = ref('')
|
const query = ref('')
|
||||||
const brokenThumbnailIds = ref({})
|
const brokenThumbnailIds = ref({})
|
||||||
|
const isTopicLoading = ref(false)
|
||||||
const isListView = computed(() => route.query.view === 'list')
|
const isListView = computed(() => route.query.view === 'list')
|
||||||
|
const topicTitle = computed(() => topicName.value || (isTopicLoading.value ? '주제 불러오는 중...' : ''))
|
||||||
|
|
||||||
function fmt(ts) {
|
function fmt(ts) {
|
||||||
return new Date(ts).toLocaleDateString(undefined, {
|
return new Date(ts).toLocaleDateString(undefined, {
|
||||||
@@ -47,21 +49,20 @@ function handleThumbnailError(tierListId) {
|
|||||||
brokenThumbnailIds.value = { ...brokenThumbnailIds.value, [tierListId]: true }
|
brokenThumbnailIds.value = { ...brokenThumbnailIds.value, [tierListId]: true }
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(async () => {
|
|
||||||
await loadTierLists()
|
|
||||||
})
|
|
||||||
|
|
||||||
async function loadTierLists() {
|
async function loadTierLists() {
|
||||||
|
isTopicLoading.value = true
|
||||||
try {
|
try {
|
||||||
const [gameRes, listRes] = await Promise.all([
|
const [gameRes, listRes] = await Promise.all([
|
||||||
api.getGame(topicId.value),
|
api.getGame(topicId.value),
|
||||||
api.searchPublicTierLists(topicId.value, query.value),
|
api.searchPublicTierLists(topicId.value, query.value),
|
||||||
])
|
])
|
||||||
topicName.value = gameRes.game?.name || topicId.value
|
topicName.value = gameRes.game?.name || ''
|
||||||
brokenThumbnailIds.value = {}
|
brokenThumbnailIds.value = {}
|
||||||
tierLists.value = listRes.tierLists || []
|
tierLists.value = listRes.tierLists || []
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
error.value = '주제 정보를 불러오지 못했어요.'
|
error.value = '주제 정보를 불러오지 못했어요.'
|
||||||
|
} finally {
|
||||||
|
isTopicLoading.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,13 +81,23 @@ function openTierList(id) {
|
|||||||
function submitSearch() {
|
function submitSearch() {
|
||||||
loadTierLists()
|
loadTierLists()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
topicId,
|
||||||
|
() => {
|
||||||
|
topicName.value = ''
|
||||||
|
error.value = ''
|
||||||
|
loadTierLists()
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<section class="pageHead">
|
<section class="pageHead">
|
||||||
<div class="pageHead__main">
|
<div class="pageHead__main">
|
||||||
<div class="pageHead__eyebrow">Collection</div>
|
<div class="pageHead__eyebrow">Collection</div>
|
||||||
<h2 class="pageHead__title">{{ topicName || topicId }}</h2>
|
<h2 class="pageHead__title">{{ topicTitle }}</h2>
|
||||||
<div class="pageHead__desc">이 주제의 공개 티어표를 같은 카드 레이아웃으로 살펴보고 이어서 새 티어표를 만들 수 있어요.</div>
|
<div class="pageHead__desc">이 주제의 공개 티어표를 같은 카드 레이아웃으로 살펴보고 이어서 새 티어표를 만들 수 있어요.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="pageHead__aside toolbar">
|
<div class="pageHead__aside toolbar">
|
||||||
|
|||||||
@@ -65,13 +65,13 @@ watch(
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<section class="wrap">
|
<section class="wrap">
|
||||||
<div class="head">
|
<section class="pageHead">
|
||||||
<div>
|
<div class="pageHead__main">
|
||||||
<div class="head__eyebrow">검색</div>
|
<div class="pageHead__eyebrow">Search</div>
|
||||||
<h2 class="title">전체 티어표 검색</h2>
|
<h2 class="pageHead__title">전체 티어표 검색</h2>
|
||||||
<div class="desc">공개된 모든 티어표를 제목과 작성자 기준으로 찾아볼 수 있어요.</div>
|
<div class="pageHead__desc">공개된 티어표를 제목과 작성자 기준으로 다시 찾아볼 수 있어요.</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</section>
|
||||||
|
|
||||||
<div v-if="error" class="error">{{ error }}</div>
|
<div v-if="error" class="error">{{ error }}</div>
|
||||||
<div v-else-if="loading" class="empty">검색 중이에요.</div>
|
<div v-else-if="loading" class="empty">검색 중이에요.</div>
|
||||||
@@ -110,30 +110,6 @@ watch(
|
|||||||
display: grid;
|
display: grid;
|
||||||
gap: 18px;
|
gap: 18px;
|
||||||
}
|
}
|
||||||
.head {
|
|
||||||
display: flex;
|
|
||||||
gap: 14px;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: flex-end;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
padding: 6px 2px 8px;
|
|
||||||
}
|
|
||||||
.head__eyebrow {
|
|
||||||
font-size: 11px;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--theme-text-soft);
|
|
||||||
}
|
|
||||||
.title {
|
|
||||||
margin: 4px 0 0;
|
|
||||||
font-size: 32px;
|
|
||||||
color: var(--theme-text-strong);
|
|
||||||
letter-spacing: -0.04em;
|
|
||||||
}
|
|
||||||
.desc {
|
|
||||||
margin-top: 6px;
|
|
||||||
color: var(--theme-text-muted);
|
|
||||||
}
|
|
||||||
.error {
|
.error {
|
||||||
margin: 0 0 8px;
|
margin: 0 0 8px;
|
||||||
padding: 10px 12px;
|
padding: 10px 12px;
|
||||||
|
|||||||
Reference in New Issue
Block a user