Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 14607fbbbb | |||
| 28e23d6c26 |
@@ -1,5 +1,15 @@
|
|||||||
# 의사결정 이력
|
# 의사결정 이력
|
||||||
|
|
||||||
|
## 2026-03-30 v1.2.2
|
||||||
|
- 우측 패널은 본문 내부 보조 박스가 아니라 별도 컬럼으로 보이는 것이 핵심이므로, 폭을 `320px`로 고정하고 접힘/펼침도 레이아웃 레벨에서 처리하는 편이 맞다고 판단했다.
|
||||||
|
- 좌측 패널도 시안 기준 인지 폭이 중요하므로 `248px`로 고정하고, 중앙 콘텐츠는 나머지 공간을 유동적으로 쓰게 하는 구조로 정리했다.
|
||||||
|
- 우측 패널 토글은 라우트별 개별 구현보다 공통 셸의 상단 컨트롤로 두는 편이 모든 화면에서 일관된 사용성을 제공한다고 판단했다.
|
||||||
|
|
||||||
|
## 2026-03-30 v1.2.1
|
||||||
|
- 공통 셸을 먼저 올린 직후에는 에디터와 관리자처럼 자체 패널이 많은 화면이 가장 크게 깨지므로, 이 화면들은 우선 공통 우측 패널을 숨기고 중앙 폭을 회복시키는 편이 안정적이라고 판단했다.
|
||||||
|
- 목록형 카드 화면은 셸 안쪽 폭이 줄어든 상태에서 이전보다 더 많은 컬럼을 유지하면 즉시 사용성이 무너지므로, 기본 컬럼 수를 줄여 먼저 읽히는 상태를 만드는 쪽을 우선하기로 했다.
|
||||||
|
- 리디자인 초기 단계에서는 “완벽한 시안 재현”보다 먼저 실제 조작 가능한 상태를 되찾는 것이 중요하므로, 이번 단계는 안정화 릴리스로 짧게 끊어 가기로 정리했다.
|
||||||
|
|
||||||
## 2026-03-30 v1.2.0
|
## 2026-03-30 v1.2.0
|
||||||
- 피그마 시안은 단순 컴포넌트 교체보다 앱 전체의 정보 구조를 바꾸는 성격이 강하므로, 우선 공통 앱 셸부터 `좌측 내비 / 중앙 워크스페이스 / 우측 컨텍스트 패널`로 올리는 단계적 리디자인이 더 안전하다고 판단했다.
|
- 피그마 시안은 단순 컴포넌트 교체보다 앱 전체의 정보 구조를 바꾸는 성격이 강하므로, 우선 공통 앱 셸부터 `좌측 내비 / 중앙 워크스페이스 / 우측 컨텍스트 패널`로 올리는 단계적 리디자인이 더 안전하다고 판단했다.
|
||||||
- 홈, 게임 허브, 내 티어표, 즐겨찾기처럼 카드 목록 중심 화면은 시안 톤을 먼저 맞추고, 에디터와 관리자처럼 상호작용이 무거운 화면은 같은 셸 안에서 후속 이관하는 방식이 리스크가 적다고 정리했다.
|
- 홈, 게임 허브, 내 티어표, 즐겨찾기처럼 카드 목록 중심 화면은 시안 톤을 먼저 맞추고, 에디터와 관리자처럼 상호작용이 무거운 화면은 같은 셸 안에서 후속 이관하는 방식이 리스크가 적다고 정리했다.
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
## 공통 레이아웃
|
## 공통 레이아웃
|
||||||
- 앱 셸 파일: `frontend/src/App.vue`
|
- 앱 셸 파일: `frontend/src/App.vue`
|
||||||
- 역할: 좌측 내비게이션, 중앙 워크스페이스, 우측 컨텍스트 패널로 구성된 공통 앱 셸 렌더링, 로그인 상태 반영, 사용자 메뉴, 관리자 메뉴 노출 제어, 전역 우측 상단 토스트 렌더링
|
- 역할: 좌측 내비게이션, 중앙 워크스페이스, 우측 컨텍스트 패널로 구성된 공통 앱 셸 렌더링, 로그인 상태 반영, 사용자 메뉴, 관리자 메뉴 노출 제어, 전역 우측 상단 토스트 렌더링
|
||||||
|
- 세부: 좌측 패널은 `248px`, 우측 패널은 `320px` 기준 폭을 사용하며, 상단 토글 버튼으로 우측 패널을 접고 펼칠 수 있다.
|
||||||
|
|
||||||
## 백엔드 진입점
|
## 백엔드 진입점
|
||||||
- 서버 엔트리: `backend/index.js`
|
- 서버 엔트리: `backend/index.js`
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
- NAS HTTPS 리버스 프록시 운영 시 프런트 Nginx는 백엔드로 `X-Forwarded-Proto: https`를 전달하고, Express 세션은 프록시 환경에서 `secure` 쿠키를 허용하도록 설정한다.
|
- NAS HTTPS 리버스 프록시 운영 시 프런트 Nginx는 백엔드로 `X-Forwarded-Proto: https`를 전달하고, Express 세션은 프록시 환경에서 `secure` 쿠키를 허용하도록 설정한다.
|
||||||
- 프런트 파비콘은 운영 정적 파일 차단 영향을 줄이기 위해 `index.html`의 인라인 데이터 URL로 제공한다.
|
- 프런트 파비콘은 운영 정적 파일 차단 영향을 줄이기 위해 `index.html`의 인라인 데이터 URL로 제공한다.
|
||||||
- 프런트 앱 셸은 `좌측 내비게이션 / 중앙 워크스페이스 / 우측 컨텍스트 패널` 3단 구조로 재정의되었고, preview 모드에서는 이 셸을 숨기고 콘텐츠만 렌더링한다.
|
- 프런트 앱 셸은 `좌측 내비게이션 / 중앙 워크스페이스 / 우측 컨텍스트 패널` 3단 구조로 재정의되었고, preview 모드에서는 이 셸을 숨기고 콘텐츠만 렌더링한다.
|
||||||
|
- 좌측 패널은 `248px`, 우측 패널은 `320px` 기준 폭을 사용하며, 우측 패널은 상단 토글 버튼으로 접고 펼칠 수 있다.
|
||||||
|
|
||||||
## 데이터 저장 구조
|
## 데이터 저장 구조
|
||||||
- 메인 데이터베이스: MariaDB `tier_cursor` (기본값)
|
- 메인 데이터베이스: MariaDB `tier_cursor` (기본값)
|
||||||
@@ -28,6 +29,7 @@
|
|||||||
- 우측 패널
|
- 우측 패널
|
||||||
- 현재 화면 문맥에 맞는 설명, 빠른 액션, 계정 상태 같은 보조 정보를 배치한다.
|
- 현재 화면 문맥에 맞는 설명, 빠른 액션, 계정 상태 같은 보조 정보를 배치한다.
|
||||||
- 에디터/관리자 세부 옵션은 후속 단계에서 이 패널로 점진 이관한다.
|
- 에디터/관리자 세부 옵션은 후속 단계에서 이 패널로 점진 이관한다.
|
||||||
|
- 공통 토글 버튼으로 패널을 접으면 중앙 워크스페이스가 남는 공간을 확장 사용한다.
|
||||||
|
|
||||||
## DB 스키마
|
## DB 스키마
|
||||||
- `users`
|
- `users`
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
# 할 일 및 이슈
|
# 할 일 및 이슈
|
||||||
|
|
||||||
## 즉시 확인 필요
|
## 즉시 확인 필요
|
||||||
- 피그마 기반 리디자인은 현재 공통 셸과 카드 목록 화면까지만 1차 적용된 상태이므로, 에디터/관리자 우측 옵션 패널을 시안 구조에 맞게 실제 기능 패널로 이관하는 작업이 남아 있다.
|
- 피그마 기반 리디자인은 현재 공통 셸과 카드 목록 화면, 포커스 화면 안정화까지만 반영된 상태이므로, 에디터/관리자 우측 옵션 패널을 시안 구조에 맞게 실제 기능 패널로 이관하는 작업이 남아 있다.
|
||||||
|
- 공통 우측 패널의 토글과 독립 컬럼 구조는 반영되었지만, 현재는 안내 카드 중심이므로 실제 화면별 기능 컨트롤을 이 패널로 옮기는 작업이 남아 있다.
|
||||||
- 머티리얼 아이콘 SVG는 아직 임시 문자/배지 스타일로 대체된 부분이 있으므로, 최종 아이콘 에셋을 받아 반영하는 작업이 필요하다.
|
- 머티리얼 아이콘 SVG는 아직 임시 문자/배지 스타일로 대체된 부분이 있으므로, 최종 아이콘 에셋을 받아 반영하는 작업이 필요하다.
|
||||||
- 미사용 커스텀 이미지 일괄 삭제는 현재 "참조가 없는 항목" 기준이며, 보관 기간 정책 같은 운영 규칙은 아직 없다.
|
- 미사용 커스텀 이미지 일괄 삭제는 현재 "참조가 없는 항목" 기준이며, 보관 기간 정책 같은 운영 규칙은 아직 없다.
|
||||||
- 업로드 이미지는 현재 원본 파일을 그대로 저장하므로, 운영 부담이 커지면 서버 저장 전 리사이즈/압축(예: 긴 변 제한, WebP 변환) 도입이 필요하다.
|
- 업로드 이미지는 현재 원본 파일을 그대로 저장하므로, 운영 부담이 커지면 서버 저장 전 리사이즈/압축(예: 긴 변 제한, WebP 변환) 도입이 필요하다.
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
# 업데이트 로그
|
# 업데이트 로그
|
||||||
|
|
||||||
|
## 2026-03-30 v1.2.2
|
||||||
|
- **사이드 패널 폭 고정**: 공통 앱 셸의 좌측 패널 폭을 `248px`, 우측 패널 폭을 `320px` 기준으로 재정의해 피그마 시안과 더 가깝게 맞춤
|
||||||
|
- **우측 패널 토글 추가**: 상단 우측 토글 버튼으로 우측 패널을 접고 펼칠 수 있게 하고, 접힐 때는 중앙 작업 영역이 자연스럽게 확장되도록 전환 애니메이션을 추가
|
||||||
|
- **우측 패널 독립성 강화**: 우측 패널은 본문과 별도 컬럼으로 유지하고, 닫힐 때도 본문 레이아웃과 분리된 독립 패널처럼 동작하도록 셸 구조를 조정
|
||||||
|
|
||||||
|
## 2026-03-30 v1.2.1
|
||||||
|
- **포커스 화면 폭 복구**: 에디터·관리자·프로필·로그인 화면은 공통 우측 패널을 잠시 숨기고 중앙 작업 폭을 넓혀, 기존 기능 UI가 3단 셸과 충돌하며 깨지던 문제를 완화
|
||||||
|
- **목록 카드 밀도 재조정**: 홈, 게임 허브, 내 티어표, 즐겨찾기 화면의 기본 컬럼 수를 줄여 현재 셸 폭 안에서도 카드가 과도하게 눌리지 않도록 정리
|
||||||
|
- **에디터/관리자 패널 안정화**: 내부 작업 패널 색상과 폭을 새 셸 톤에 맞춰 다시 정리해, 중첩 패널 때문에 사용성이 무너지던 부분을 우선 복구
|
||||||
|
|
||||||
## 2026-03-30 v1.2.0
|
## 2026-03-30 v1.2.0
|
||||||
- **피그마 기반 공통 앱 셸 1차 적용**: 상단 헤더 중심 구조를 `좌측 내비게이션 / 중앙 워크스페이스 / 우측 컨텍스트 패널` 3단 앱 셸로 재구성하고, 데스크톱 기준의 어두운 대시보드형 톤으로 전환
|
- **피그마 기반 공통 앱 셸 1차 적용**: 상단 헤더 중심 구조를 `좌측 내비게이션 / 중앙 워크스페이스 / 우측 컨텍스트 패널` 3단 앱 셸로 재구성하고, 데스크톱 기준의 어두운 대시보드형 톤으로 전환
|
||||||
- **홈/목록 화면 카드 UI 리디자인**: 홈, 게임 허브, 내 티어표, 즐겨찾기 화면의 카드 그리드와 툴바를 시안에 맞춰 더 조밀한 대시보드 형태로 재배치
|
- **홈/목록 화면 카드 UI 리디자인**: 홈, 게임 허브, 내 티어표, 즐겨찾기 화면의 카드 그리드와 툴바를 시안에 맞춰 더 조밀한 대시보드 형태로 재배치
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ const auth = useAuthStore()
|
|||||||
const { toasts, dismissToast } = useToast()
|
const { toasts, dismissToast } = useToast()
|
||||||
|
|
||||||
const menuOpen = ref(false)
|
const menuOpen = ref(false)
|
||||||
|
const rightRailOpen = ref(true)
|
||||||
|
|
||||||
const isAdmin = computed(() => !!auth.user?.isAdmin)
|
const isAdmin = computed(() => !!auth.user?.isAdmin)
|
||||||
const isPreviewMode = computed(() => route.query.preview === '1')
|
const isPreviewMode = computed(() => route.query.preview === '1')
|
||||||
@@ -128,6 +129,10 @@ const favoriteLinks = computed(() => [
|
|||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await auth.refresh()
|
await auth.refresh()
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
const saved = window.localStorage.getItem('tier-maker:right-rail-open')
|
||||||
|
if (saved === '0') rightRailOpen.value = false
|
||||||
|
}
|
||||||
document.addEventListener('click', onDocumentClick)
|
document.addEventListener('click', onDocumentClick)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -157,6 +162,13 @@ function toggleMenu() {
|
|||||||
menuOpen.value = !menuOpen.value
|
menuOpen.value = !menuOpen.value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toggleRightRail() {
|
||||||
|
rightRailOpen.value = !rightRailOpen.value
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
window.localStorage.setItem('tier-maker:right-rail-open', rightRailOpen.value ? '1' : '0')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function goProfile() {
|
function goProfile() {
|
||||||
menuOpen.value = false
|
menuOpen.value = false
|
||||||
router.push('/profile')
|
router.push('/profile')
|
||||||
@@ -170,7 +182,7 @@ async function logout() {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="appShell" :class="{ 'appShell--preview': isPreviewMode }">
|
<div class="appShell" :class="{ 'appShell--preview': isPreviewMode, 'appShell--rightClosed': !rightRailOpen }">
|
||||||
<template v-if="isPreviewMode">
|
<template v-if="isPreviewMode">
|
||||||
<main class="appMain appMain--preview">
|
<main class="appMain appMain--preview">
|
||||||
<RouterView />
|
<RouterView />
|
||||||
@@ -247,6 +259,11 @@ async function logout() {
|
|||||||
<div class="workspaceHead__title">{{ routeMeta.title }}</div>
|
<div class="workspaceHead__title">{{ routeMeta.title }}</div>
|
||||||
<div class="workspaceHead__subtitle">{{ routeMeta.subtitle }}</div>
|
<div class="workspaceHead__subtitle">{{ routeMeta.subtitle }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="workspaceHead__actions">
|
||||||
|
<button class="ghostIcon ghostIcon--workspace" type="button" :aria-pressed="rightRailOpen" @click="toggleRightRail">
|
||||||
|
{{ rightRailOpen ? '우측 패널 숨기기' : '우측 패널 보기' }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="workspaceBody">
|
<div class="workspaceBody">
|
||||||
<RouterView />
|
<RouterView />
|
||||||
@@ -254,7 +271,7 @@ async function logout() {
|
|||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<aside class="rightRail">
|
<aside class="rightRail" :class="{ 'rightRail--closed': !rightRailOpen }" :aria-hidden="!rightRailOpen">
|
||||||
<div class="rightRail__top">
|
<div class="rightRail__top">
|
||||||
<button class="ghostIcon" type="button" aria-label="상태">⌗</button>
|
<button class="ghostIcon" type="button" aria-label="상태">⌗</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -296,11 +313,12 @@ async function logout() {
|
|||||||
.appShell {
|
.appShell {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 260px minmax(0, 1fr) 280px;
|
grid-template-columns: 248px minmax(0, 1fr) 320px;
|
||||||
background:
|
background:
|
||||||
radial-gradient(circle at top left, rgba(255, 255, 255, 0.04), transparent 28%),
|
radial-gradient(circle at top left, rgba(255, 255, 255, 0.04), transparent 28%),
|
||||||
linear-gradient(180deg, #1a1a1a 0%, #121212 100%);
|
linear-gradient(180deg, #1a1a1a 0%, #121212 100%);
|
||||||
color: rgba(255, 255, 255, 0.92);
|
color: rgba(255, 255, 255, 0.92);
|
||||||
|
transition: grid-template-columns 220ms ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.appShell--preview {
|
.appShell--preview {
|
||||||
@@ -310,15 +328,35 @@ async function logout() {
|
|||||||
.leftRail,
|
.leftRail,
|
||||||
.rightRail {
|
.rightRail {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
padding: 14px 10px;
|
padding: 14px 12px;
|
||||||
border-right: 1px solid rgba(255, 255, 255, 0.08);
|
border-right: 1px solid rgba(255, 255, 255, 0.08);
|
||||||
background: rgba(14, 14, 14, 0.92);
|
background: rgba(14, 14, 14, 0.92);
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rightRail {
|
.rightRail {
|
||||||
border-right: 0;
|
border-right: 0;
|
||||||
border-left: 1px solid rgba(255, 255, 255, 0.08);
|
border-left: 1px solid rgba(255, 255, 255, 0.08);
|
||||||
|
transition:
|
||||||
|
opacity 220ms ease,
|
||||||
|
transform 220ms ease,
|
||||||
|
padding 220ms ease,
|
||||||
|
border-color 220ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appShell--rightClosed {
|
||||||
|
grid-template-columns: 248px minmax(0, 1fr) 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appShell--rightClosed .rightRail {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateX(18px);
|
||||||
|
pointer-events: none;
|
||||||
|
overflow: hidden;
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
border-left-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.leftRail__top,
|
.leftRail__top,
|
||||||
@@ -330,8 +368,9 @@ async function logout() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ghostIcon {
|
.ghostIcon {
|
||||||
width: 28px;
|
min-width: 28px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
|
padding: 0 10px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
border: 1px solid rgba(255, 255, 255, 0.08);
|
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||||
background: rgba(255, 255, 255, 0.03);
|
background: rgba(255, 255, 255, 0.03);
|
||||||
@@ -339,6 +378,17 @@ async function logout() {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ghostIcon--workspace {
|
||||||
|
min-width: 118px;
|
||||||
|
height: 36px;
|
||||||
|
padding: 0 14px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background: rgba(255, 255, 255, 0.05);
|
||||||
|
color: rgba(255, 255, 255, 0.88);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
|
||||||
.brandBlock {
|
.brandBlock {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 2px;
|
gap: 2px;
|
||||||
@@ -346,7 +396,7 @@ async function logout() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.brandBlock__title {
|
.brandBlock__title {
|
||||||
font-size: 22px;
|
font-size: 21px;
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
letter-spacing: -0.04em;
|
letter-spacing: -0.04em;
|
||||||
}
|
}
|
||||||
@@ -461,8 +511,8 @@ async function logout() {
|
|||||||
.leftNav__item {
|
.leftNav__item {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 12px;
|
gap: 10px;
|
||||||
padding: 10px 12px;
|
padding: 10px;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
color: rgba(255, 255, 255, 0.76);
|
color: rgba(255, 255, 255, 0.76);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@@ -475,8 +525,8 @@ async function logout() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.leftNav__glyph {
|
.leftNav__glyph {
|
||||||
width: 26px;
|
width: 24px;
|
||||||
height: 26px;
|
height: 24px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
display: grid;
|
display: grid;
|
||||||
place-items: center;
|
place-items: center;
|
||||||
@@ -542,7 +592,7 @@ async function logout() {
|
|||||||
|
|
||||||
.appMain {
|
.appMain {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
padding: 18px 18px 28px;
|
padding: 14px 18px 22px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -562,8 +612,15 @@ async function logout() {
|
|||||||
gap: 16px;
|
gap: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.workspaceHead__actions {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
.workspaceHead__title {
|
.workspaceHead__title {
|
||||||
font-size: 34px;
|
font-size: 28px;
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
letter-spacing: -0.04em;
|
letter-spacing: -0.04em;
|
||||||
}
|
}
|
||||||
@@ -571,7 +628,7 @@ async function logout() {
|
|||||||
.workspaceHead__subtitle {
|
.workspaceHead__subtitle {
|
||||||
margin-top: 6px;
|
margin-top: 6px;
|
||||||
color: rgba(255, 255, 255, 0.58);
|
color: rgba(255, 255, 255, 0.58);
|
||||||
font-size: 14px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.workspaceBody {
|
.workspaceBody {
|
||||||
|
|||||||
@@ -1354,18 +1354,14 @@ async function saveFeaturedOrder() {
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.wrap {
|
.wrap {
|
||||||
padding: 10px 2px;
|
display: grid;
|
||||||
}
|
gap: 16px;
|
||||||
.title {
|
|
||||||
margin: 0 0 10px;
|
|
||||||
font-size: 26px;
|
|
||||||
letter-spacing: -0.02em;
|
|
||||||
}
|
}
|
||||||
.card {
|
.card {
|
||||||
border: 1px solid rgba(255, 255, 255, 0.12);
|
border: 0;
|
||||||
background: rgba(255, 255, 255, 0.04);
|
background: transparent;
|
||||||
border-radius: 16px;
|
border-radius: 0;
|
||||||
padding: 14px;
|
padding: 0;
|
||||||
}
|
}
|
||||||
.desc {
|
.desc {
|
||||||
opacity: 0.82;
|
opacity: 0.82;
|
||||||
@@ -1392,7 +1388,7 @@ async function saveFeaturedOrder() {
|
|||||||
}
|
}
|
||||||
.tabs,
|
.tabs,
|
||||||
.modeTabs {
|
.modeTabs {
|
||||||
margin-top: 14px;
|
margin-top: 0;
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
@@ -1400,26 +1396,27 @@ async function saveFeaturedOrder() {
|
|||||||
.tab,
|
.tab,
|
||||||
.modeTab {
|
.modeTab {
|
||||||
padding: 10px 14px;
|
padding: 10px 14px;
|
||||||
border-radius: 12px;
|
border-radius: 10px;
|
||||||
border: 1px solid rgba(255, 255, 255, 0.14);
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
background: rgba(255, 255, 255, 0.06);
|
background: rgba(255, 255, 255, 0.05);
|
||||||
color: rgba(255, 255, 255, 0.92);
|
color: rgba(255, 255, 255, 0.92);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
.tab--active,
|
.tab--active,
|
||||||
.modeTab--active {
|
.modeTab--active {
|
||||||
background: rgba(96, 165, 250, 0.2);
|
background: rgba(255, 255, 255, 0.1);
|
||||||
|
border-color: rgba(255, 255, 255, 0.18);
|
||||||
}
|
}
|
||||||
.panel {
|
.panel {
|
||||||
margin-top: 14px;
|
margin-top: 14px;
|
||||||
border: 1px solid rgba(255, 255, 255, 0.12);
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
background: rgba(0, 0, 0, 0.12);
|
background: rgba(48, 48, 48, 0.78);
|
||||||
border-radius: 16px;
|
border-radius: 18px;
|
||||||
padding: 14px;
|
padding: 16px;
|
||||||
}
|
}
|
||||||
.panel--compact {
|
.panel--compact {
|
||||||
max-width: 480px;
|
max-width: 520px;
|
||||||
}
|
}
|
||||||
.featuredOrderPanel {
|
.featuredOrderPanel {
|
||||||
margin-top: 14px;
|
margin-top: 14px;
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ onMounted(loadFavorites)
|
|||||||
}
|
}
|
||||||
.list {
|
.list {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
gap: 18px;
|
gap: 18px;
|
||||||
}
|
}
|
||||||
.row {
|
.row {
|
||||||
@@ -244,12 +244,12 @@ onMounted(loadFavorites)
|
|||||||
}
|
}
|
||||||
@media (max-width: 1100px) {
|
@media (max-width: 1100px) {
|
||||||
.list {
|
.list {
|
||||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media (max-width: 960px) {
|
@media (max-width: 960px) {
|
||||||
.list {
|
.list {
|
||||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media (max-width: 720px) {
|
@media (max-width: 720px) {
|
||||||
|
|||||||
@@ -214,7 +214,7 @@ function submitSearch() {
|
|||||||
}
|
}
|
||||||
.list {
|
.list {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
gap: 18px;
|
gap: 18px;
|
||||||
}
|
}
|
||||||
.row {
|
.row {
|
||||||
@@ -312,14 +312,14 @@ function submitSearch() {
|
|||||||
padding: 7px 10px;
|
padding: 7px 10px;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
@media (max-width: 1100px) {
|
@media (max-width: 1280px) {
|
||||||
.list {
|
.list {
|
||||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media (max-width: 1100px) {
|
@media (max-width: 1100px) {
|
||||||
.list {
|
.list {
|
||||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media (max-width: 720px) {
|
@media (max-width: 720px) {
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ function thumbUrl(g) {
|
|||||||
}
|
}
|
||||||
.grid {
|
.grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
gap: 18px;
|
gap: 18px;
|
||||||
}
|
}
|
||||||
.error {
|
.error {
|
||||||
@@ -165,12 +165,12 @@ function thumbUrl(g) {
|
|||||||
}
|
}
|
||||||
@media (max-width: 1200px) {
|
@media (max-width: 1200px) {
|
||||||
.grid {
|
.grid {
|
||||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media (max-width: 900px) {
|
@media (max-width: 900px) {
|
||||||
.grid {
|
.grid {
|
||||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media (max-width: 720px) {
|
@media (max-width: 720px) {
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ async function removeList(t) {
|
|||||||
}
|
}
|
||||||
.list {
|
.list {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
gap: 18px;
|
gap: 18px;
|
||||||
}
|
}
|
||||||
.row {
|
.row {
|
||||||
@@ -215,12 +215,12 @@ async function removeList(t) {
|
|||||||
}
|
}
|
||||||
@media (max-width: 1100px) {
|
@media (max-width: 1100px) {
|
||||||
.list {
|
.list {
|
||||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media (max-width: 960px) {
|
@media (max-width: 960px) {
|
||||||
.list {
|
.list {
|
||||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media (max-width: 720px) {
|
@media (max-width: 720px) {
|
||||||
|
|||||||
@@ -857,8 +857,8 @@ onUnmounted(() => {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.head {
|
.head {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 14px;
|
gap: 16px;
|
||||||
padding: 6px 2px 14px;
|
padding: 2px 2px 16px;
|
||||||
}
|
}
|
||||||
.previewOnly {
|
.previewOnly {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
@@ -938,8 +938,8 @@ onUnmounted(() => {
|
|||||||
}
|
}
|
||||||
.heroCard {
|
.heroCard {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: minmax(0, 1.5fr) minmax(280px, 360px);
|
grid-template-columns: minmax(0, 1.65fr) minmax(260px, 320px);
|
||||||
gap: 18px;
|
gap: 16px;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
}
|
}
|
||||||
.heroCard__main,
|
.heroCard__main,
|
||||||
@@ -1123,8 +1123,8 @@ onUnmounted(() => {
|
|||||||
}
|
}
|
||||||
.layout {
|
.layout {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 320px;
|
grid-template-columns: minmax(0, 1fr) 284px;
|
||||||
gap: 14px;
|
gap: 16px;
|
||||||
align-items: start;
|
align-items: start;
|
||||||
}
|
}
|
||||||
.error {
|
.error {
|
||||||
@@ -1135,10 +1135,10 @@ onUnmounted(() => {
|
|||||||
background: rgba(239, 68, 68, 0.12);
|
background: rgba(239, 68, 68, 0.12);
|
||||||
}
|
}
|
||||||
.board {
|
.board {
|
||||||
border: 1px solid rgba(255, 255, 255, 0.12);
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
background: rgba(255, 255, 255, 0.04);
|
background: rgba(48, 48, 48, 0.78);
|
||||||
border-radius: 16px;
|
border-radius: 18px;
|
||||||
padding: 20px;
|
padding: 18px;
|
||||||
align-self: start;
|
align-self: start;
|
||||||
}
|
}
|
||||||
.modalOverlay {
|
.modalOverlay {
|
||||||
@@ -1419,9 +1419,9 @@ onUnmounted(() => {
|
|||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
.sidebar {
|
.sidebar {
|
||||||
border: 1px solid rgba(255, 255, 255, 0.12);
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
background: rgba(255, 255, 255, 0.04);
|
background: rgba(48, 48, 48, 0.78);
|
||||||
border-radius: 16px;
|
border-radius: 18px;
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
}
|
}
|
||||||
.sidebar__title {
|
.sidebar__title {
|
||||||
|
|||||||
Reference in New Issue
Block a user