From 1a7ec50a935edd5b1cc4995cab88aa160b506251 Mon Sep 17 00:00:00 2001 From: zenn Date: Mon, 30 Mar 2026 17:58:51 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A6=B4=EB=A6=AC=EC=8A=A4:=20v1.2.21=20?= =?UTF-8?q?=ED=8B=B0=EC=96=B4=ED=91=9C=20=EC=B9=B4=EB=93=9C=EC=99=80=20?= =?UTF-8?q?=EC=A2=8C=EC=B8=A1=20=EB=A0=88=EC=9D=BC=20=EB=B0=80=EB=8F=84=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/history.md | 5 + docs/map.md | 6 +- docs/spec.md | 4 +- docs/todo.md | 1 + docs/update.md | 5 + frontend/src/App.vue | 46 +++++---- frontend/src/views/FavoriteTierListsView.vue | 101 +++++++++--------- frontend/src/views/GameHubView.vue | 103 +++++++++---------- frontend/src/views/MyTierListsView.vue | 79 ++++++++------ frontend/src/views/SearchResultsView.vue | 95 +++++++++-------- 10 files changed, 241 insertions(+), 204 deletions(-) diff --git a/docs/history.md b/docs/history.md index 8614bf1..f8ea1c7 100644 --- a/docs/history.md +++ b/docs/history.md @@ -1,5 +1,10 @@ # 의사결정 이력 +## 2026-03-30 v1.2.21 +- 티어표 목록 카드는 페이지마다 다른 메타 구성을 두기보다, `제목+좋아요 / 작성자+최종 수정일` 두 줄 문법으로 통일하는 편이 시안과 사용성 모두에 더 맞다고 정리했다. +- `내 즐겨찾기` 화면에서 “즐겨찾기한 날짜”는 컬렉션 내부 정보일 뿐 카드 핵심 정보는 아니므로, 정렬은 유지하되 카드에는 마지막 수정일만 보여주는 편이 더 읽기 쉽다고 판단했다. +- 좌측 `Favorites`는 메인 내비보다 보조 영역이어야 하므로, 같은 공간 안에서도 더 작은 썸네일·더 작은 텍스트·더 약한 대비로 눌러두는 편이 맞다고 정리했다. + ## 2026-03-30 v1.2.20 - 전역 검색 입력이 이미 좌측 레일에 고정되어 있으므로, 검색 결과 화면 안에 검색 폼을 또 두는 것은 중복이라고 판단해 `/search` 화면은 결과 표시 자체에만 집중시키기로 했다. - 중앙 워크스페이스는 셸 여백 위에 다시 큰 카드 테두리와 배경을 씌우면 시안보다 한 겹 더 두꺼워 보이므로, `workspaceBody`는 외곽 카드 없이 단일 여백 레이어만 유지하는 편이 더 맞다고 정리했다. diff --git a/docs/map.md b/docs/map.md index ed9ae3a..a872806 100644 --- a/docs/map.md +++ b/docs/map.md @@ -7,7 +7,7 @@ ## `/games/:gameId` - 화면 파일: `frontend/src/views/GameHubView.vue` -- 역할: 선택한 게임 정보 표시, 상단 통계/생성 CTA, 공개 티어표 목록 표시, 제목/작성자 검색, 티어표별 상단 썸네일/작성자 표시, 즐겨찾기 상태 표시, 새 티어표 작성 진입 +- 역할: 선택한 게임 정보 표시, 상단 생성 CTA, 공개 티어표 목록 표시, 제목/작성자 검색, 티어표별 `상단 썸네일 / 제목+좋아요 / 작성자+최종 수정일` 카드 표시, 새 티어표 작성 진입 - 연동 API: `GET /api/games/:gameId`, `GET /api/tierlists/public`, `POST /api/tierlists/:id/favorite`, `DELETE /api/tierlists/:id/favorite` ## `/editor/:gameId/new`, `/editor/:gameId/:tierListId` @@ -22,7 +22,7 @@ ## `/me` - 화면 파일: `frontend/src/views/MyTierListsView.vue` -- 역할: 내 티어표 목록 조회, 라이브러리 카드형 썸네일 표시, 편집 화면으로 이동, 작성자 본인 티어표 삭제 +- 역할: 내 티어표 목록 조회, 4열 라이브러리 카드형 썸네일 표시, 편집 화면으로 이동, 작성자 본인 티어표 삭제 - 연동 API: `GET /api/tierlists/me`, `DELETE /api/tierlists/:id` ## `/favorites` @@ -32,7 +32,7 @@ ## `/search` - 화면 파일: `frontend/src/views/SearchResultsView.vue` -- 역할: 좌측 전역 검색 입력에서 넘긴 키워드로 공개 티어표 전체를 검색하고, 자체 검색 툴바 없이 제목/작성자/게임 ID 기준 메타를 카드 목록으로 표시 +- 역할: 좌측 전역 검색 입력에서 넘긴 키워드로 공개 티어표 전체를 검색하고, 자체 검색 툴바 없이 `상단 썸네일 / 제목+좋아요 / 작성자+최종 수정일` 카드 목록으로 표시 - 연동 API: `GET /api/tierlists/public?q=...` ## `/admin` diff --git a/docs/spec.md b/docs/spec.md index d0e69d4..cbcb8a9 100644 --- a/docs/spec.md +++ b/docs/spec.md @@ -28,11 +28,11 @@ - 좌측 패널 - 사용자 요약, 전체 공개 티어표 검색 입력, 주요 라우트 내비게이션, 최근 즐겨찾기 티어표 바로가기, 관리자 진입 버튼을 배치한다. - `Settings`는 별도 메뉴 항목으로만 진입하며, 사용자 카드 자체는 정보 표시 용도로만 사용한다. - - `Favorites` 영역은 최근 즐겨찾기 티어표 최대 10개를 바로 보여주고, 하단 `즐겨찾기 더 보기` 링크로 전체 즐겨찾기 화면에 연결한다. + - 사용자 아바타는 원형 보더 스타일을 유지하고, `Favorites` 영역은 최근 즐겨찾기 티어표 최대 10개를 메인 메뉴보다 작은 밀도의 바로가기 목록으로 보여준 뒤 하단 `즐겨찾기 더 보기` 링크로 전체 즐겨찾기 화면에 연결한다. - 중앙 워크스페이스 - 현재 라우트의 핵심 콘텐츠를 렌더링하는 영역이며, 홈/목록 계열 화면은 카드형 대시보드 레이아웃을 우선 적용한다. - 공통 `workspaceBody`는 별도 외곽 카드 테두리 없이 셸 여백만 제공하고, 실제 카드/패널 레이어는 각 화면 내부에서만 구성한다. - - 홈, 게임 허브, 내 티어표, 즐겨찾기 화면은 같은 카드 문법(상단 16:9 썸네일, 제목, 작성자/보조 메타, 하단 상태 영역)을 공유하도록 정리한다. + - 홈, 게임 허브, 내 티어표, 즐겨찾기, 검색 결과 화면은 같은 카드 문법(상단 16:9 썸네일, `제목+좋아요` 1행, `작성자+최종 수정일` 1행)을 공유하며, 데스크톱 기준 기본 4열 카드 그리드를 사용한다. - 목록 계열 화면의 상단 도구 영역은 통계 카드와 액션 버튼을 공통 높이/반경으로 맞춰, 같은 라이브러리 대시보드로 읽히도록 정리한다. - 우측 패널 - 현재 화면 문맥에 맞는 설명, 빠른 액션, 계정 상태 같은 보조 정보를 배치한다. diff --git a/docs/todo.md b/docs/todo.md index f60ff5b..c472869 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -14,6 +14,7 @@ - 에디터 우측 패널 외곽 래퍼는 제거했으므로, 다음 단계는 공통 오른쪽 컬럼 안에서 입력/버튼/구분선 간격을 시안처럼 더 정교하게 다듬는 작업이다. - 공통 56px 셸 헤더는 반영했으므로, 다음 단계는 좌/중앙/우 헤더 안에 실제 아이콘/상태 요소를 시안 순서에 맞게 하나씩 채워 넣는 작업이다. - 좌측 레일은 최근 즐겨찾기와 전역 검색까지 붙었으므로, 다음 단계는 검색 자동완성이나 즐겨찾기 썸네일 품질 같은 디테일을 더 다듬는 작업이다. +- 카드 목록은 4열 기준과 메타 줄 구성까지 통일했으므로, 다음 단계는 필터 상태 배지나 hover·selection 강조 같은 상호작용 디테일을 더 다듬는 작업이다. - 검색 결과 화면은 좌측 전역 검색 입력만 쓰도록 정리됐으므로, 다음 단계는 결과 필터/정렬 여부를 검토하는 식으로 확장하면 된다. - 공통 3단 셸 구조는 고정했지만, 관리자/에디터 우측 패널 내부에 아직 바디에 남아 있는 제어 요소를 더 옮겨야 한다. - 홈 화면 우측 사이드는 CTA 하나만 남긴 상태이므로, 이후 필요할 때도 임시 정보 카드 다수를 다시 넣기보다 실제 필요한 기능만 선별해 추가해야 한다. diff --git a/docs/update.md b/docs/update.md index a803b11..ddf5b1b 100644 --- a/docs/update.md +++ b/docs/update.md @@ -1,5 +1,10 @@ # 업데이트 로그 +## 2026-03-30 v1.2.21 +- **티어표 카드 문법 통일**: 게임 허브, 검색 결과, 내 티어표, 즐겨찾기 목록의 카드 레이아웃을 `상단 썸네일 / 제목+좋아요 / 작성자+최종 수정일` 2줄 메타 구조로 통일하고, 데스크톱 기준 한 줄 4개 카드가 보이도록 재배치 +- **즐겨찾기 화면 날짜 기준 단순화**: `내 즐겨찾기` 화면은 더 이상 즐겨찾기한 시각을 표시하지 않고, 정렬 기준과 무관하게 덱의 마지막 수정일만 카드에 노출하도록 정리 +- **좌측 사용자 카드/즐겨찾기 밀도 보정**: 좌측 사용자 아바타를 원형 보더 스타일로 통일하고, `Favorites` 바로가기 섹션은 메인 메뉴보다 덜 강조되도록 썸네일·텍스트·간격을 한 단계 축소 + ## 2026-03-30 v1.2.20 - **검색 결과 상단 툴바 제거**: `/search` 화면의 중복 검색 폼을 제거하고, 좌측 전역 검색 입력만 검색 진입점으로 사용하도록 단순화 - **왼쪽 즐겨찾기 더보기 아이콘 교체**: 사용자가 추가한 `more.svg`를 좌측 `즐겨찾기 더 보기` 링크 아이콘에 연결 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index ca12c9d..ed0cb7e 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -496,9 +496,11 @@ watch( .appUserCard__avatar { width: 42px; height: 42px; - border-radius: 12px; + border-radius: 999px; object-fit: cover; flex: 0 0 auto; + border: 1px solid rgba(255, 255, 255, 0.14); + background: rgba(255, 255, 255, 0.08); } .appUserCard__avatar--fallback { @@ -596,18 +598,18 @@ watch( } .leftRail__section { - margin-top: 24px; + margin-top: 22px; display: grid; - gap: 10px; + gap: 8px; } .leftRail__sectionTitle { display: flex; align-items: center; gap: 8px; - font-size: 14px; - color: rgba(255, 255, 255, 0.62); - font-weight: 700; + font-size: 11px; + color: rgba(255, 255, 255, 0.38); + font-weight: 600; } .favoriteEmpty { @@ -618,21 +620,21 @@ watch( .favoriteShortcut { display: grid; - grid-template-columns: 36px minmax(0, 1fr); - gap: 12px; + grid-template-columns: 24px minmax(0, 1fr); + gap: 8px; align-items: center; - padding: 6px 0; + padding: 3px 0; border: 0; background: transparent; - color: rgba(255, 255, 255, 0.9); + color: rgba(255, 255, 255, 0.72); text-align: left; cursor: pointer; } .favoriteShortcut__thumb { - width: 36px; - height: 36px; - border-radius: 8px; + width: 24px; + height: 24px; + border-radius: 6px; object-fit: cover; background: rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.08); @@ -650,23 +652,23 @@ watch( overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - font-size: 14px; + font-size: 12px; } .favoriteMoreLink { display: flex; align-items: center; - gap: 10px; + gap: 8px; margin-top: 4px; - color: rgba(255, 255, 255, 0.76); + color: rgba(255, 255, 255, 0.62); text-decoration: none; - font-size: 14px; + font-size: 12px; } .favoriteMoreLink__icon { - width: 28px; - height: 28px; - border-radius: 10px; + width: 22px; + height: 22px; + border-radius: 8px; display: grid; place-items: center; background: rgba(255, 255, 255, 0.06); @@ -674,8 +676,8 @@ watch( } .favoriteMoreLink__icon img { - width: 16px; - height: 16px; + width: 12px; + height: 12px; display: block; filter: brightness(0) saturate(100%) invert(94%) sepia(6%) saturate(207%) hue-rotate(186deg) brightness(96%) contrast(92%); } diff --git a/frontend/src/views/FavoriteTierListsView.vue b/frontend/src/views/FavoriteTierListsView.vue index f99631e..35e0e37 100644 --- a/frontend/src/views/FavoriteTierListsView.vue +++ b/frontend/src/views/FavoriteTierListsView.vue @@ -11,17 +11,12 @@ const toast = useToast() const favorites = ref([]) const query = ref('') const sort = ref('favorited') -const sortLabel = computed(() => - sort.value === 'favorited' ? '즐겨찾기한 날짜' : sort.value === 'updated' ? '최종 업데이트' : '즐겨찾기 수' -) function fmt(ts) { - return new Date(ts).toLocaleString(undefined, { + return new Date(ts).toLocaleDateString(undefined, { year: 'numeric', month: '2-digit', day: '2-digit', - hour: '2-digit', - minute: '2-digit', }) } @@ -86,21 +81,20 @@ onMounted(loadFavorites)
대표 썸네일
-
{{ tierList.title }}
-
- -
{{ avatarFallbackOf(tierList) }}
- by {{ displayNameOf(tierList) }} +
+
{{ tierList.title }}
+
♡ {{ tierList.favoriteCount || 0 }}
+
+
+
+ +
{{ avatarFallbackOf(tierList) }}
+ {{ displayNameOf(tierList) }} +
+
{{ fmt(tierList.updatedAt) }}
-
-
-
{{ tierList.gameName || tierList.gameId }}
-
{{ sortLabel }}: {{ fmt(sort === 'favorited' ? tierList.favoritedAt : tierList.updatedAt) }}
-
-
★ {{ tierList.favoriteCount || 0 }}
-
@@ -162,7 +156,7 @@ onMounted(loadFavorites) } .list { display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 18px; } .boardCard { @@ -171,7 +165,6 @@ onMounted(loadFavorites) background: rgba(62, 62, 62, 0.82); overflow: hidden; display: grid; - gap: 10px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); transition: transform 0.16s ease, @@ -189,20 +182,19 @@ onMounted(loadFavorites) text-align: left; cursor: pointer; display: grid; - gap: 10px; } .boardCard__thumbWrap { width: 100%; aspect-ratio: 16 / 9; - background: #555; - display: grid; - place-items: center; + padding: 14px 14px 0; + box-sizing: border-box; } .boardCard__thumb, .boardCard__thumbPlaceholder { width: 100%; height: 100%; display: block; + border-radius: 18px; } .boardCard__thumb { object-fit: cover; @@ -216,63 +208,68 @@ onMounted(loadFavorites) font-weight: 700; } .boardCard__head { - padding: 14px 14px 0; + padding: 16px 18px 18px; display: grid; gap: 10px; } +.boardCard__titleRow, +.boardCard__metaRow { + display: flex; + gap: 12px; + align-items: center; + justify-content: space-between; +} .boardCard__title { + min-width: 0; font-weight: 800; font-size: 18px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .boardCard__author { + min-width: 0; display: inline-flex; align-items: center; gap: 8px; font-size: 13px; opacity: 0.86; } +.boardCard__authorName { + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} .boardCard__avatar { - width: 28px; - height: 28px; - border-radius: 999px; + width: 22px; + height: 22px; + border-radius: 6px; object-fit: cover; background: rgba(255, 255, 255, 0.08); + flex: 0 0 auto; } .boardCard__avatar--fallback { display: grid; place-items: center; - font-size: 12px; + font-size: 11px; font-weight: 900; } -.boardCard__foot { - padding: 0 14px 14px; - display: flex; - gap: 12px; - align-items: center; - justify-content: space-between; -} -.boardCard__meta { - display: grid; - gap: 4px; - opacity: 0.78; - font-size: 13px; -} +.boardCard__date, .favoriteStat { - border: 1px solid rgba(255, 255, 255, 0.12); - background: rgba(255, 255, 255, 0.05); - color: rgba(255, 255, 255, 0.92); - border-radius: 999px; - padding: 7px 10px; - font-weight: 800; + flex: 0 0 auto; + font-size: 13px; + color: rgba(255, 255, 255, 0.64); + white-space: nowrap; } -@media (max-width: 1100px) { +@media (max-width: 1400px) { .list { - grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-columns: repeat(3, minmax(0, 1fr)); } } -@media (max-width: 960px) { +@media (max-width: 1024px) { .list { - grid-template-columns: 1fr; + grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 720px) { diff --git a/frontend/src/views/GameHubView.vue b/frontend/src/views/GameHubView.vue index e56cb55..2661616 100644 --- a/frontend/src/views/GameHubView.vue +++ b/frontend/src/views/GameHubView.vue @@ -17,12 +17,10 @@ const error = ref('') const query = ref('') function fmt(ts) { - return new Date(ts).toLocaleString(undefined, { + return new Date(ts).toLocaleDateString(undefined, { year: 'numeric', month: '2-digit', day: '2-digit', - hour: '2-digit', - minute: '2-digit', }) } @@ -109,20 +107,22 @@ function submitSearch() {
대표 썸네일
-
{{ t.title }}
-
- -
{{ avatarFallbackOf(t) }}
- by {{ displayNameOf(t) }} +
+
{{ t.title }}
+
+ {{ t.isFavorited ? '♥' : '♡' }} {{ t.favoriteCount || 0 }} +
+
+
+
+ +
{{ avatarFallbackOf(t) }}
+ {{ displayNameOf(t) }} +
+
{{ fmt(t.updatedAt) }}
-
-
{{ fmt(t.updatedAt) }}
-
- {{ t.isFavorited ? '★' : '☆' }} {{ t.favoriteCount || 0 }} -
-
@@ -238,7 +238,7 @@ function submitSearch() { } .list { display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 18px; } .boardCard { @@ -247,9 +247,6 @@ function submitSearch() { background: rgba(62, 62, 62, 0.82); color: rgba(255, 255, 255, 0.92); display: grid; - gap: 10px; - align-content: start; - min-height: 168px; overflow: hidden; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); transition: @@ -269,20 +266,19 @@ function submitSearch() { cursor: pointer; width: 100%; display: grid; - gap: 10px; } .boardCard__thumbWrap { width: 100%; aspect-ratio: 16 / 9; - background: #555; - display: grid; - place-items: center; + padding: 14px 14px 0; + box-sizing: border-box; } .boardCard__thumb { width: 100%; height: 100%; object-fit: cover; display: block; + border-radius: 18px; } .boardCard__thumbPlaceholder { width: 100%; @@ -293,76 +289,79 @@ function submitSearch() { color: rgba(255, 255, 255, 0.4); font-size: 13px; font-weight: 700; + border-radius: 18px; } .boardCard__title { font-weight: 800; min-width: 0; font-size: 18px; line-height: 1.35; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .boardCard__head { - padding: 14px 14px 0; + padding: 16px 18px 18px; display: grid; + gap: 10px; +} +.boardCard__titleRow, +.boardCard__metaRow { + display: flex; gap: 12px; - align-content: start; + align-items: center; + justify-content: space-between; } .boardCard__author { + min-width: 0; display: inline-flex; gap: 8px; align-items: center; font-size: 13px; opacity: 0.86; - flex: 0 0 auto; +} +.boardCard__authorName { + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .boardCard__avatar { - width: 28px; - height: 28px; - border-radius: 999px; + width: 22px; + height: 22px; + border-radius: 6px; object-fit: cover; border: 1px solid rgba(255, 255, 255, 0.12); background: rgba(255, 255, 255, 0.08); + flex: 0 0 auto; } .boardCard__avatar--fallback { display: grid; place-items: center; - font-size: 12px; + font-size: 11px; font-weight: 900; } -.boardCard__meta { - opacity: 0.78; - font-size: 13px; -} -.boardCard__foot { - padding: 0 14px 14px; - display: flex; - gap: 12px; - align-items: center; - justify-content: space-between; - margin-top: auto; -} +.boardCard__date, .favoriteStat { - border: 1px solid rgba(255, 255, 255, 0.12); - background: rgba(255, 255, 255, 0.05); - color: rgba(255, 255, 255, 0.92); - border-radius: 999px; - padding: 7px 10px; - font-weight: 800; + flex: 0 0 auto; + font-size: 13px; + color: rgba(255, 255, 255, 0.64); + white-space: nowrap; } -@media (max-width: 1280px) { +@media (max-width: 1400px) { .list { - grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-columns: repeat(3, minmax(0, 1fr)); } } -@media (max-width: 1100px) { +@media (max-width: 1024px) { .list { - grid-template-columns: 1fr; + grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 720px) { .dashboardHero__right { width: 100%; } - .dashboardStat, .primary { width: 100%; } diff --git a/frontend/src/views/MyTierListsView.vue b/frontend/src/views/MyTierListsView.vue index ce8ec88..060841a 100644 --- a/frontend/src/views/MyTierListsView.vue +++ b/frontend/src/views/MyTierListsView.vue @@ -17,12 +17,10 @@ watch(error, (message) => { }) function fmt(ts) { - return new Date(ts).toLocaleString(undefined, { + return new Date(ts).toLocaleDateString(undefined, { year: 'numeric', month: '2-digit', day: '2-digit', - hour: '2-digit', - minute: '2-digit', }) } @@ -93,14 +91,19 @@ async function removeList(t) {
대표 썸네일
-
{{ t.title }}
-
- -
{{ avatarFallbackOf(t) }}
- by {{ displayNameOf(t) }} +
+
{{ t.title }}
+
♡ {{ t.favoriteCount || 0 }}
+
+
+
+ +
{{ avatarFallbackOf(t) }}
+ {{ displayNameOf(t) }} +
+
{{ fmt(t.updatedAt) }}
-
{{ fmt(t.updatedAt) }}
@@ -176,12 +179,11 @@ async function removeList(t) { } .list { display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 18px; } .boardCard { display: grid; - gap: 10px; border-radius: 22px; border: 1px solid rgba(255, 255, 255, 0.16); background: rgba(62, 62, 62, 0.82); @@ -206,20 +208,19 @@ async function removeList(t) { color: inherit; padding: 0; display: grid; - gap: 10px; } .boardCard__thumbWrap { width: 100%; aspect-ratio: 16 / 9; - background: #555; - display: grid; - place-items: center; + padding: 14px 14px 0; + box-sizing: border-box; } .boardCard__thumb { width: 100%; height: 100%; object-fit: cover; display: block; + border-radius: 18px; } .boardCard__thumbPlaceholder { width: 100%; @@ -230,59 +231,77 @@ async function removeList(t) { color: rgba(255, 255, 255, 0.4); font-size: 13px; font-weight: 700; + border-radius: 18px; } .boardCard__title { font-weight: 900; min-width: 0; + font-size: 18px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .boardCard__head { - padding: 0 14px; + padding: 16px 18px 18px; + display: grid; + gap: 10px; +} +.boardCard__titleRow, +.boardCard__metaRow { display: flex; gap: 12px; align-items: center; justify-content: space-between; - flex-wrap: wrap; } .boardCard__author { + min-width: 0; display: inline-flex; gap: 8px; align-items: center; font-size: 13px; opacity: 0.84; } +.boardCard__authorName { + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} .boardCard__avatar { - width: 28px; - height: 28px; - border-radius: 999px; + width: 22px; + height: 22px; + border-radius: 6px; object-fit: cover; border: 1px solid rgba(255, 255, 255, 0.12); background: rgba(255, 255, 255, 0.08); + flex: 0 0 auto; } .boardCard__avatar--fallback { display: grid; place-items: center; - font-size: 12px; + font-size: 11px; font-weight: 900; } -.boardCard__meta { - padding: 0 14px; - margin-top: 6px; - opacity: 0.76; +.boardCard__date, +.favoriteStat { + flex: 0 0 auto; font-size: 13px; + color: rgba(255, 255, 255, 0.64); + white-space: nowrap; } .link--danger { background: rgba(239, 68, 68, 0.14); border-color: rgba(239, 68, 68, 0.28); - margin: 0 14px 14px; + margin: 0 18px 18px; } -@media (max-width: 1100px) { +@media (max-width: 1400px) { .list { - grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-columns: repeat(3, minmax(0, 1fr)); } } -@media (max-width: 960px) { +@media (max-width: 1024px) { .list { - grid-template-columns: 1fr; + grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 720px) { diff --git a/frontend/src/views/SearchResultsView.vue b/frontend/src/views/SearchResultsView.vue index 93db314..607919f 100644 --- a/frontend/src/views/SearchResultsView.vue +++ b/frontend/src/views/SearchResultsView.vue @@ -13,12 +13,10 @@ const error = ref('') const query = ref('') function fmt(ts) { - return new Date(ts).toLocaleString(undefined, { + return new Date(ts).toLocaleDateString(undefined, { year: 'numeric', month: '2-digit', day: '2-digit', - hour: '2-digit', - minute: '2-digit', }) } @@ -86,23 +84,22 @@ watch(
대표 썸네일
-
{{ tierList.title }}
-
- -
{{ avatarFallbackOf(tierList) }}
- by {{ displayNameOf(tierList) }} +
+
{{ tierList.title }}
+
+ {{ tierList.isFavorited ? '♥' : '♡' }} {{ tierList.favoriteCount || 0 }} +
+
+
+
+ +
{{ avatarFallbackOf(tierList) }}
+ {{ displayNameOf(tierList) }} +
+
{{ fmt(tierList.updatedAt) }}
-
-
-
{{ tierList.gameId }}
-
{{ fmt(tierList.updatedAt) }}
-
-
- {{ tierList.isFavorited ? '★' : '☆' }} {{ tierList.favoriteCount || 0 }} -
-
@@ -149,7 +146,7 @@ watch( } .list { display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 18px; } .boardCard { @@ -158,7 +155,6 @@ watch( background: rgba(62, 62, 62, 0.82); overflow: hidden; display: grid; - gap: 10px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); transition: transform 0.16s ease, background 0.16s ease; } @@ -174,20 +170,19 @@ watch( text-align: left; cursor: pointer; display: grid; - gap: 10px; } .boardCard__thumbWrap { width: 100%; aspect-ratio: 16 / 9; - background: #555; - display: grid; - place-items: center; + padding: 14px 14px 0; + box-sizing: border-box; } .boardCard__thumb, .boardCard__thumbPlaceholder { width: 100%; height: 100%; display: block; + border-radius: 18px; } .boardCard__thumb { object-fit: cover; @@ -201,52 +196,66 @@ watch( font-weight: 700; } .boardCard__head { - padding: 14px 14px 0; + padding: 16px 18px 18px; display: grid; gap: 10px; } +.boardCard__titleRow, +.boardCard__metaRow { + display: flex; + gap: 12px; + align-items: center; + justify-content: space-between; +} .boardCard__title { + min-width: 0; font-weight: 800; font-size: 18px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .boardCard__author { + min-width: 0; display: inline-flex; align-items: center; gap: 8px; font-size: 13px; opacity: 0.86; } +.boardCard__authorName { + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} .boardCard__avatar { - width: 28px; - height: 28px; - border-radius: 999px; + width: 22px; + height: 22px; + border-radius: 6px; object-fit: cover; background: rgba(255, 255, 255, 0.08); + flex: 0 0 auto; } .boardCard__avatar--fallback { display: grid; place-items: center; - font-size: 12px; + font-size: 11px; font-weight: 900; } -.boardCard__foot { - padding: 0 14px 14px; - display: flex; - gap: 12px; - align-items: center; - justify-content: space-between; -} -.boardCard__meta { - display: grid; - gap: 4px; - opacity: 0.78; - font-size: 13px; -} +.boardCard__date, .favoriteStat { + flex: 0 0 auto; font-size: 13px; - color: rgba(255, 255, 255, 0.74); + color: rgba(255, 255, 255, 0.64); + white-space: nowrap; } -@media (max-width: 1200px) { +@media (max-width: 1400px) { + .list { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} +@media (max-width: 1024px) { .list { grid-template-columns: repeat(2, minmax(0, 1fr)); }