Compare commits

..

4 Commits

10 changed files with 207 additions and 37 deletions

View File

@@ -1,5 +1,22 @@
# 의사결정 이력
## 2026-03-30 v1.2.13
- 공통 상태를 로컬 우측 패널에 연결할 때는 템플릿의 ref 자동 언래핑을 고려해야 하므로, 템플릿에서는 `.value` 없이 직접 참조하는 편이 안전하다고 다시 정리했다.
- 이번 회귀처럼 편집 화면이 통째로 무너질 수 있는 연결점은 작은 레이아웃 수정이어도 바로 복구 릴리스로 끊는 편이 낫다고 판단했다.
## 2026-03-30 v1.2.12
- 공통 상단의 패널 토글은 로컬 우측 패널 화면에서도 같은 의미로 동작해야 하므로, 에디터의 `editorSidebar`도 같은 상태를 공유해 접고 펴는 편이 일관된다고 판단했다.
- 로컬 우측 패널 화면에 공통 `rightClosed` 그리드 계산이 다시 들어오면 컬럼 수가 꼬일 수 있으므로, 에디터/관리자 화면은 셸 차원에서 별도 예외 컬럼 규칙을 유지하기로 결정했다.
## 2026-03-30 v1.2.11
- 에디터와 관리자처럼 자체 우측 패널이 있는 화면은 공통 `workspaceBody` 카드 배경 안에 다시 넣기보다, 셸 레벨에서 중앙 본문을 투명하게 풀어주는 편이 우측 사이드바 독립성이 더 잘 살아난다고 판단했다.
- 로컬 우측 패널의 핵심은 “본문 안쪽 보조 박스”가 아니라 “진짜 오른쪽 컬럼”처럼 읽히는 것이므로, 에디터에서는 본문 카드보다 패널 분리감을 먼저 확보하기로 결정했다.
## 2026-03-30 v1.2.10
- 목록 화면도 결국 같은 제품의 라이브러리 레이어이므로, 상단 통계 카드와 버튼의 높이·반경·배경을 공통 셸과 같은 문법으로 맞추는 편이 일관성이 높다고 정리했다.
- 홈 화면의 빠른 액션은 중복 의미 버튼보다 `즐겨찾기 / 내 리스트 / 커스텀 시작`처럼 실제 이동 동선이 분명한 버튼 구성이 더 적합하다고 판단했다.
- 카드 hover 반응은 화면마다 조금씩 다르게 두기보다, 모두 얕은 위로 이동과 배경 변화로 통일하는 편이 대시보드 감도를 유지하기 쉽다고 결정했다.
## 2026-03-30 v1.2.9
- 관리자 화면은 기능보다 먼저 정보 계층이 읽혀야 하므로, 현재 탭에 맞는 요약 통계를 헤더에서 먼저 보여주는 편이 운영 판단에 더 유리하다고 정리했다.
- 게임/아이템/티어표/회원 카드는 기능이 다른 대신 같은 제품 안에 있으므로, 배경층·반경·패딩은 하나의 대시보드 문법으로 맞춰 시안 톤을 더 강하게 유지하기로 결정했다.

View File

@@ -29,16 +29,21 @@
- 중앙 워크스페이스
- 현재 라우트의 핵심 콘텐츠를 렌더링하는 영역이며, 홈/목록 계열 화면은 카드형 대시보드 레이아웃을 우선 적용한다.
- 홈, 게임 허브, 내 티어표, 즐겨찾기 화면은 같은 카드 문법(상단 16:9 썸네일, 제목, 작성자/보조 메타, 하단 상태 영역)을 공유하도록 정리한다.
- 목록 계열 화면의 상단 도구 영역은 통계 카드와 액션 버튼을 공통 높이/반경으로 맞춰, 같은 라이브러리 대시보드로 읽히도록 정리한다.
- 우측 패널
- 현재 화면 문맥에 맞는 설명, 빠른 액션, 계정 상태 같은 보조 정보를 배치한다.
- 에디터/관리자 세부 옵션은 후속 단계에서 이 패널로 점진 이관한다.
- 공통 토글 버튼으로 패널을 접으면 중앙 워크스페이스가 남는 공간을 확장 사용한다.
- 티어표 편집 화면
- 공통 우측 패널 대신 전용 로컬 편집 패널을 사용한다.
- 공통 `workspaceBody` 카드 컨테이너를 벗기고, 중앙 보드 영역과 우측 `320px` 편집 패널이 별도 컬럼처럼 보이도록 배치한다.
- 공통 상단 토글 버튼은 로컬 편집 패널의 접힘/펼침 상태와도 연결되어, 우측 패널을 숨기면 중앙 보드 영역이 확장된다.
- 템플릿에서는 공통 패널 상태를 ref 자동 언래핑 기준으로 직접 참조해, 우측 편집 패널이 의도치 않게 항상 닫히는 회귀를 방지한다.
- 제목, 설명, 대표 썸네일, 공개 여부, 저장/삭제/요청 액션을 우측 로컬 패널에 배치한다.
- 보드 바로 옆에는 드래그용 아이템 풀을 별도 패널로 두고, 커스텀 아이템 이름 정리 목록은 우측 편집 패널 내부에서 관리한다.
- 관리자 화면
- 공통 우측 패널 대신 전용 로컬 운영 패널을 사용한다.
- 공통 `workspaceBody` 카드 컨테이너를 벗기고, 중앙 관리 목록과 우측 운영 패널이 독립 컬럼처럼 보이도록 배치한다.
- 우측 로컬 패널에는 `게임/아이템/티어표/회원 관리` 탭, 검색, 필터, 새로고침, 빠른 작업 제어를 배치하고, 중앙 영역에는 실제 관리 대상 목록과 상세만 렌더링한다.
- 상단 헤더에는 현재 탭 기준 요약 통계 카드를 배치해 운영 상태를 먼저 읽고, 각 관리 카드는 공통 대시보드 카드 문법(두꺼운 반경, 얕은 레이어 배경, 강조된 액션 버튼)을 공유한다.

View File

@@ -3,10 +3,14 @@
## 즉시 확인 필요
- 피그마 기반 리디자인은 현재 공통 셸과 카드 목록 화면, 포커스 화면 안정화까지만 반영된 상태이므로, 에디터/관리자 우측 옵션 패널을 시안 구조에 맞게 실제 기능 패널로 이관하는 작업이 남아 있다.
- 홈/게임 허브/내 티어표/즐겨찾기 카드 문법은 어느 정도 통일됐지만, 아직 실제 SVG 아이콘, 미세 간격, hover/selection 상태 같은 디테일은 더 다듬을 필요가 있다.
- 목록 화면 상단 도구 막대는 공통 카드 문법으로 거의 맞췄지만, 실제 피그마처럼 필터 토글/정렬 상태를 시각적으로 더 강하게 드러내는 디테일은 남아 있다.
- 현재 공통 셸에는 임시 선형 SVG 아이콘을 사용하므로, 최종 머티리얼 아이콘 에셋을 받으면 교체하고 아이콘 크기/정렬을 다시 미세 조정할 필요가 있다.
- 공통 셸과 에디터에는 일부 실제 SVG 아이콘을 연결했지만, 아직 즐겨찾기/설정/관리자 등 나머지 내비 아이콘은 임시 선형 SVG이므로 추가 에셋 교체가 남아 있다.
- 공통 우측 패널의 토글과 독립 컬럼 구조는 반영되었지만, 현재는 안내 카드 중심이므로 실제 화면별 기능 컨트롤을 이 패널로 옮기는 작업이 남아 있다.
- 티어표 편집 화면과 관리자 화면 모두 로컬 우측 패널 구조로 옮겼지만, 아직 세부 카드 밀도와 아이콘/모션 디테일은 피그마 시안 수준으로 더 다듬을 필요가 있다.
- 에디터/관리자 로컬 우측 패널은 셸 카드에서 분리됐지만, 아직 실제 피그마처럼 패널 토글 전환 모션과 상태 강조가 더 필요하다.
- 에디터 로컬 우측 패널은 공통 토글과 연결됐지만, 아직 완전한 피그마 수준의 패널 애니메이션과 내부 카드 재배치는 더 다듬을 필요가 있다.
- 에디터 우측 패널 회귀는 복구했지만, 로컬 패널과 공통 셸 상태를 함께 쓰는 화면은 토글/초기 상태를 더 엄격히 점검할 필요가 있다.
- 관리자 화면은 헤더 요약 통계와 카드 계층까지 정리됐지만, 아직 표준 SVG 아이콘 교체와 더 세밀한 상태 색상/선택 상태 표현은 남아 있다.
- 머티리얼 아이콘 SVG는 아직 임시 문자/배지 스타일로 대체된 부분이 있으므로, 최종 아이콘 에셋을 받아 반영하는 작업이 필요하다.
- 미사용 커스텀 이미지 일괄 삭제는 현재 "참조가 없는 항목" 기준이며, 보관 기간 정책 같은 운영 규칙은 아직 없다.

View File

@@ -1,5 +1,21 @@
# 업데이트 로그
## 2026-03-30 v1.2.13
- **에디터 우측 패널 회귀 수정**: 공통 패널 상태를 템플릿에서 잘못 참조해 `editorSidebar`가 항상 닫힌 상태로 계산되던 문제를 수정해, 제목/설명/썸네일/저장 패널이 다시 정상 표시되도록 복구
## 2026-03-30 v1.2.12
- **에디터 우측 패널 토글 연결**: 공통 상단의 패널 토글 버튼이 이제 티어표 편집 화면의 `editorSidebar`에도 직접 연결되어, 숨기면 우측 패널이 접히고 중앙 보드 영역이 넓어지도록 수정
- **로컬 우측 패널 컬럼 충돌 방지**: 에디터/관리자처럼 로컬 우측 패널을 쓰는 화면에서는 공통 `rightClosed` 셸 컬럼 계산이 다시 끼어들지 않도록 예외 처리를 추가해 레이아웃이 다시 틀어지지 않게 보정
## 2026-03-30 v1.2.11
- **에디터 로컬 우측 패널 분리 보정**: 에디터/관리자처럼 로컬 우측 패널을 쓰는 화면은 공통 `workspaceBody` 카드 컨테이너를 벗기고, 로컬 패널이 중앙 본문 안쪽이 아니라 독립 컬럼처럼 보이도록 셸 구조를 조정
- **에디터 우측 컬럼 간격 보정**: 티어표 편집 화면의 `editorSidebar`가 본문 내부 보조 박스처럼 눌리지 않도록 간격과 최소 폭을 정리해 우측 사이드바 역할이 더 분명하게 보이도록 수정
## 2026-03-30 v1.2.10
- **목록 화면 상단 툴바 밀도 통일**: 홈, 게임 허브, 내 티어표, 즐겨찾기 상단 영역의 통계 카드와 액션 버튼 높이/반경/배경을 맞춰 공통 셸과 같은 도구 막대 문법으로 정리
- **홈 빠른 진입 흐름 보정**: 홈 화면 툴바에서 중복되던 버튼 흐름을 `즐겨찾기 / 내 리스트 / 커스텀 티어표 만들기` 중심으로 재구성해 실제 사용 동선에 맞게 정리
- **목록 카드 인터랙션 보강**: 주요 카드 목록에 일관된 hover 이동과 배경 전환을 넣어, 대시보드 카드가 더 또렷하게 반응하도록 조정
## 2026-03-30 v1.2.9
- **관리자 대시보드 헤더 보강**: 관리자 화면 상단에 현재 탭 기준 요약 통계 카드를 추가해, 게임/아이템/티어표/회원 상태를 즉시 읽을 수 있게 정리
- **운영 패널 질감 정리**: 우측 `320px` 운영 패널의 탭, 입력, 통계 카드, 버튼 라운드/배경/호버 상태를 공통 셸 톤에 맞춰 더 두꺼운 대시보드 카드 문법으로 통일

View File

@@ -1,5 +1,5 @@
<script setup>
import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
import { computed, onMounted, onUnmounted, provide, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useAuthStore } from './stores/auth'
import { toApiUrl } from './lib/runtime'
@@ -16,6 +16,7 @@ const { toasts, dismissToast } = useToast()
const menuOpen = ref(false)
const rightRailOpen = ref(true)
provide('rightRailOpen', rightRailOpen)
const isAdmin = computed(() => !!auth.user?.isAdmin)
const isPreviewMode = computed(() => route.query.preview === '1')
@@ -194,7 +195,14 @@ async function logout() {
</script>
<template>
<div class="appShell" :class="{ 'appShell--preview': isPreviewMode, 'appShell--rightClosed': !rightRailOpen }">
<div
class="appShell"
:class="{
'appShell--preview': isPreviewMode,
'appShell--rightClosed': !rightRailOpen,
'appShell--localRail': usesLocalRightRail,
}"
>
<template v-if="isPreviewMode">
<main class="appMain appMain--preview">
<RouterView />
@@ -265,7 +273,7 @@ async function logout() {
</aside>
<main class="appMain">
<section class="workspace">
<section class="workspace" :class="{ 'workspace--localRail': usesLocalRightRail }">
<header class="workspaceHead">
<div>
<div class="workspaceHead__title">{{ routeMeta.title }}</div>
@@ -278,7 +286,7 @@ async function logout() {
</button>
</div>
</header>
<div class="workspaceBody">
<div class="workspaceBody" :class="{ 'workspaceBody--localRail': usesLocalRightRail }">
<RouterView />
</div>
</section>
@@ -356,6 +364,14 @@ async function logout() {
display: block;
}
.appShell--localRail {
grid-template-columns: 248px minmax(0, 1fr);
}
.appShell--localRail.appShell--rightClosed {
grid-template-columns: 248px minmax(0, 1fr);
}
.leftRail,
.rightRail {
min-height: 100vh;
@@ -673,6 +689,10 @@ async function logout() {
gap: 16px;
}
.workspace--localRail {
gap: 12px;
}
.workspaceHead {
display: flex;
align-items: flex-start;
@@ -708,6 +728,15 @@ async function logout() {
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
}
.workspaceBody--localRail {
min-height: calc(100vh - 92px);
padding: 0;
border: 0;
border-radius: 0;
background: transparent;
box-shadow: none;
}
.rightRail {
display: grid;
align-content: start;
@@ -860,6 +889,14 @@ async function logout() {
grid-template-columns: 220px minmax(0, 1fr);
}
.appShell--localRail {
grid-template-columns: 220px minmax(0, 1fr);
}
.appShell--localRail.appShell--rightClosed {
grid-template-columns: 220px minmax(0, 1fr);
}
.rightRail {
display: none;
}
@@ -881,6 +918,11 @@ async function logout() {
border-radius: 20px;
}
.workspaceBody--localRail {
padding: 0;
border-radius: 0;
}
.workspaceHead__title {
font-size: 26px;
}

View File

@@ -117,6 +117,7 @@ onMounted(loadFavorites)
justify-content: space-between;
align-items: flex-end;
flex-wrap: wrap;
padding: 6px 2px 8px;
}
.head__eyebrow {
font-size: 11px;
@@ -141,15 +142,15 @@ onMounted(loadFavorites)
}
.input,
.select {
padding: 10px 12px;
border-radius: 10px;
padding: 11px 13px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.92);
}
.btn {
padding: 10px 12px;
border-radius: 10px;
padding: 11px 13px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.92);
@@ -165,13 +166,20 @@ onMounted(loadFavorites)
gap: 18px;
}
.boardCard {
border-radius: 18px;
border-radius: 22px;
border: 1px solid rgba(255, 255, 255, 0.16);
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;
}
.boardCard:hover {
transform: translateY(-2px);
background: rgba(70, 70, 70, 0.96);
}
.boardCard__body {
border: 0;

View File

@@ -139,7 +139,7 @@ function submitSearch() {
align-items: flex-start;
justify-content: space-between;
flex-wrap: wrap;
padding: 4px 2px 18px;
padding: 6px 2px 18px;
}
.dashboardHero__left {
display: grid;
@@ -172,10 +172,10 @@ function submitSearch() {
display: grid;
gap: 2px;
min-width: 112px;
padding: 10px 14px;
border-radius: 12px;
padding: 12px 14px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.04);
background: rgba(255, 255, 255, 0.045);
}
.dashboardStat__label {
font-size: 11px;
@@ -189,12 +189,19 @@ function submitSearch() {
}
.primary {
padding: 12px 16px;
border-radius: 12px;
border-radius: 14px;
border: 1px solid rgba(77, 127, 233, 0.96);
background: rgba(77, 127, 233, 0.88);
color: #fff;
cursor: pointer;
font-weight: 800;
transition:
transform 0.16s ease,
background 0.16s ease,
border-color 0.16s ease;
}
.primary:hover {
transform: translateY(-1px);
}
.panel {
/* border: 1px solid rgba(255, 255, 255, 0.08); */
@@ -234,15 +241,15 @@ function submitSearch() {
}
.searchBar__input {
min-width: 240px;
padding: 10px 12px;
border-radius: 10px;
padding: 11px 13px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.92);
}
.searchBar__button {
padding: 10px 14px;
border-radius: 12px;
padding: 11px 14px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.92);
@@ -258,7 +265,7 @@ function submitSearch() {
gap: 18px;
}
.boardCard {
border-radius: 18px;
border-radius: 22px;
border: 1px solid rgba(255, 255, 255, 0.16);
background: rgba(62, 62, 62, 0.82);
color: rgba(255, 255, 255, 0.92);
@@ -268,9 +275,13 @@ function submitSearch() {
min-height: 168px;
overflow: hidden;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
transition:
transform 0.16s ease,
background 0.16s ease;
}
.boardCard:hover {
background: rgba(70, 70, 70, 0.96);
transform: translateY(-2px);
}
.boardCard__body {
text-align: left;

View File

@@ -33,6 +33,22 @@ function goFreeform() {
router.push('/editor/freeform/new')
}
function goFavorites() {
if (!auth.user) {
router.push('/login?redirect=/favorites')
return
}
router.push('/favorites')
}
function goMyLists() {
if (!auth.user) {
router.push('/login?redirect=/me')
return
}
router.push('/me')
}
function thumbUrl(g) {
if (!g.thumbnailSrc) return ''
return toApiUrl(g.thumbnailSrc)
@@ -52,8 +68,12 @@ function thumbUrl(g) {
<span class="dashboardToolbar__label">Visible Games</span>
<strong class="dashboardToolbar__value">{{ games.length }}</strong>
</div>
<button class="dashboardToolbar__ghost" @click="goFreeform">Quick Start</button>
<button class="dashboardToolbar__ghost" @click="goFreeform">Browse All</button>
<div class="dashboardToolbar__stat">
<span class="dashboardToolbar__label">Account</span>
<strong class="dashboardToolbar__value">{{ auth.user ? 'Ready' : 'Guest' }}</strong>
</div>
<button class="dashboardToolbar__ghost" @click="goFavorites">{{ auth.user ? '즐겨찾기 보기' : '로그인 즐겨찾기' }}</button>
<button class="dashboardToolbar__ghost" @click="goMyLists">{{ auth.user ? ' 리스트 보기' : '로그인 리스트' }}</button>
<button class="customTierBtn" @click="goFreeform">{{ auth.user ? '+ 커스텀 티어표 만들기' : '+ 로그인 커스텀 티어표 만들기' }}</button>
</div>
</section>
@@ -85,10 +105,12 @@ function thumbUrl(g) {
flex-wrap: wrap;
margin-top: 2px;
margin-bottom: 18px;
padding: 6px 2px 18px;
}
.dashboardHero__copy {
display: grid;
gap: 8px;
max-width: 720px;
}
.dashboardHero__eyebrow {
font-size: 11px;
@@ -118,10 +140,10 @@ function thumbUrl(g) {
display: grid;
gap: 2px;
min-width: 112px;
padding: 10px 14px;
border-radius: 12px;
padding: 12px 14px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.04);
background: rgba(255, 255, 255, 0.045);
}
.dashboardToolbar__label {
font-size: 11px;
@@ -135,13 +157,21 @@ function thumbUrl(g) {
}
.dashboardToolbar__ghost,
.customTierBtn {
padding: 10px 14px;
border-radius: 12px;
padding: 12px 14px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.84);
font-weight: 700;
cursor: pointer;
transition:
transform 0.16s ease,
border-color 0.16s ease,
background 0.16s ease;
}
.dashboardToolbar__ghost:hover,
.customTierBtn:hover {
transform: translateY(-1px);
}
.customTierBtn {
background: rgba(77, 127, 233, 0.88);
@@ -163,8 +193,8 @@ function thumbUrl(g) {
}
.libraryCard {
text-align: left;
padding: 12px;
border-radius: 18px;
padding: 14px;
border-radius: 22px;
border: 1px solid rgba(255, 255, 255, 0.16);
background: rgba(62, 62, 62, 0.82);
color: rgba(255, 255, 255, 0.92);
@@ -172,9 +202,13 @@ function thumbUrl(g) {
display: grid;
gap: 12px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
transition:
transform 0.16s ease,
background 0.16s ease;
}
.libraryCard:hover {
background: rgba(70, 70, 70, 0.96);
transform: translateY(-2px);
}
.libraryCard__thumbWrap {
width: 100%;

View File

@@ -120,6 +120,7 @@ async function removeList(t) {
justify-content: space-between;
flex-wrap: wrap;
margin-bottom: 18px;
padding: 6px 2px 8px;
}
.head__eyebrow {
font-size: 11px;
@@ -140,10 +141,10 @@ async function removeList(t) {
display: grid;
gap: 2px;
min-width: 112px;
padding: 10px 14px;
border-radius: 12px;
padding: 12px 14px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.04);
background: rgba(255, 255, 255, 0.045);
}
.head__statLabel {
font-size: 11px;
@@ -162,8 +163,8 @@ async function removeList(t) {
padding: 0;
}
.link {
padding: 8px 10px;
border-radius: 10px;
padding: 10px 12px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.14);
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.92);
@@ -181,12 +182,19 @@ async function removeList(t) {
.boardCard {
display: grid;
gap: 10px;
border-radius: 18px;
border-radius: 22px;
border: 1px solid rgba(255, 255, 255, 0.16);
background: rgba(62, 62, 62, 0.82);
color: rgba(255, 255, 255, 0.92);
overflow: hidden;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
transition:
transform 0.16s ease,
background 0.16s ease;
}
.boardCard:hover {
transform: translateY(-2px);
background: rgba(70, 70, 70, 0.96);
}
.boardCard__body {
flex: 1 1 auto;

View File

@@ -1,5 +1,5 @@
<script setup>
import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
import { computed, inject, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import Sortable from 'sortablejs'
import * as htmlToImage from 'html-to-image'
@@ -12,6 +12,7 @@ const route = useRoute()
const router = useRouter()
const auth = useAuthStore()
const toast = useToast()
const globalRightRailOpen = inject('rightRailOpen', ref(true))
const gameId = computed(() => route.params.gameId)
const tierListId = computed(() => route.params.tierListId)
const previewMode = computed(() => route.query.preview === '1')
@@ -669,7 +670,11 @@ onUnmounted(() => {
</div>
</div>
<section class="layout" :style="{ '--thumb-size': `${iconSize}px` }">
<section
class="layout"
:class="{ 'layout--railClosed': !globalRightRailOpen }"
:style="{ '--thumb-size': `${iconSize}px` }"
>
<div class="editorMain">
<section class="head">
<div class="editorMain__headCopy">
@@ -1037,8 +1042,12 @@ onUnmounted(() => {
.layout {
display: grid;
grid-template-columns: minmax(0, 1fr) 320px;
gap: 16px;
gap: 18px;
align-items: start;
transition: grid-template-columns 220ms ease;
}
.layout--railClosed {
grid-template-columns: minmax(0, 1fr) 0;
}
.error {
margin: 10px 0 14px;
@@ -1349,6 +1358,7 @@ onUnmounted(() => {
display: grid;
align-content: start;
gap: 14px;
min-width: 0;
padding: 14px 12px;
border-radius: 22px;
border: 1px solid rgba(255, 255, 255, 0.08);
@@ -1356,6 +1366,21 @@ onUnmounted(() => {
position: sticky;
top: 14px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
transition:
opacity 220ms ease,
transform 220ms ease,
padding 220ms ease,
border-color 220ms ease,
background 220ms ease;
}
.layout--railClosed .editorSidebar {
opacity: 0;
transform: translateX(18px);
pointer-events: none;
overflow: hidden;
padding-left: 0;
padding-right: 0;
border-color: transparent;
}
.editorSidebar__section {
display: grid;