ui: refine editor sidebar scroll spacing
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
# 의사결정 이력
|
# 의사결정 이력
|
||||||
|
|
||||||
|
## 2026-04-06 v1.4.101
|
||||||
|
- 실제 문제는 `editorCanvas` 자체보다 그 아래 `workspaceBody--localRail`의 하단 패딩까지 문서가 더 스크롤되는 구간에서 발생했다. 따라서 오른쪽 sticky 카드만 보정하는 것보다, 오른쪽 컬럼을 별도 래퍼로 감싸고 workspace 하단 패딩까지 고려한 여유 공간을 래퍼에 주는 편이 더 정확하다고 판단했다.
|
||||||
|
- 아이템 풀은 내부 스크롤이 필요하지만, 오른쪽 패널 안에서 스크롤바가 항상 보이면 작업 화면이 좁고 복잡해 보일 수 있으므로 스크롤 동작만 유지하고 스크롤바 시각 요소는 숨기는 편이 낫다고 정리했다.
|
||||||
|
|
||||||
## 2026-04-06 v1.4.100
|
## 2026-04-06 v1.4.100
|
||||||
- 오른쪽 아이템 패널은 sticky로 동작하지만 부모 컨테이너의 끝에 닿으면 sticky 제한 때문에 마지막 스크롤 위치에서 위쪽 여백이 무너져 보일 수 있다. 그래서 편집 캔버스 자체에 작은 하단 여유 공간을 두어 마지막 위치에서도 패널 주변 여백이 유지되도록 하는 편이 낫다고 판단했다.
|
- 오른쪽 아이템 패널은 sticky로 동작하지만 부모 컨테이너의 끝에 닿으면 sticky 제한 때문에 마지막 스크롤 위치에서 위쪽 여백이 무너져 보일 수 있다. 그래서 편집 캔버스 자체에 작은 하단 여유 공간을 두어 마지막 위치에서도 패널 주변 여백이 유지되도록 하는 편이 낫다고 판단했다.
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
# 업데이트 로그
|
# 업데이트 로그
|
||||||
|
|
||||||
|
## 2026-04-06 v1.4.101
|
||||||
|
- `workspaceBody--localRail`의 하단 패딩 구간까지 스크롤했을 때 오른쪽 아이템 카드가 sticky 기준 영역을 벗어나 상단에 붙어 보이던 문제를 보정했다. 오른쪽 sticky 컬럼을 래퍼로 감싸고 하단 여유 공간을 명시해 마지막 스크롤 위치에서도 여백이 유지되도록 했다.
|
||||||
|
- 티어표 편집 화면의 아이템 그리드 내부 스크롤은 유지하되, 시각적인 스크롤바는 보이지 않도록 정리했다.
|
||||||
|
- 확인: `npm run build`
|
||||||
|
|
||||||
## 2026-04-06 v1.4.100
|
## 2026-04-06 v1.4.100
|
||||||
- 티어표 편집 화면을 가장 아래까지 스크롤했을 때 오른쪽 아이템 카드가 부모 컨테이너 끝에 걸리며 상단 여백이 무너져 보일 수 있어, 편집 캔버스 하단에 sticky 여백용 패딩을 추가했다.
|
- 티어표 편집 화면을 가장 아래까지 스크롤했을 때 오른쪽 아이템 카드가 부모 컨테이너 끝에 걸리며 상단 여백이 무너져 보일 수 있어, 편집 캔버스 하단에 sticky 여백용 패딩을 추가했다.
|
||||||
- 확인: `npm run build`
|
- 확인: `npm run build`
|
||||||
|
|||||||
@@ -1809,59 +1809,61 @@ onUnmounted(() => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div ref="sidebarEl" class="sidebar" :style="{ '--editor-sidebar-max-height': editorSidebarMaxHeight || undefined }">
|
<div class="sidebarStickyFrame">
|
||||||
<div class="sidebar__titleRow">
|
<div ref="sidebarEl" class="sidebar" :style="{ '--editor-sidebar-max-height': editorSidebarMaxHeight || undefined }">
|
||||||
<div class="sidebar__title">아이템</div>
|
<div class="sidebar__titleRow">
|
||||||
<div class="sidebar__count">{{ visiblePoolCount }} / {{ pool.length }}</div>
|
<div class="sidebar__title">아이템</div>
|
||||||
</div>
|
<div class="sidebar__count">{{ visiblePoolCount }} / {{ pool.length }}</div>
|
||||||
<div class="sidebar__hint">
|
</div>
|
||||||
{{ canEdit ? '아이템을 드래그하거나, 클릭으로 선택한 뒤 원하는 셀/풀을 클릭해서 옮길 수 있어요.' : '공개 티어표는 보기 전용입니다.' }}
|
<div class="sidebar__hint">
|
||||||
</div>
|
{{ canEdit ? '아이템을 드래그하거나, 클릭으로 선택한 뒤 원하는 셀/풀을 클릭해서 옮길 수 있어요.' : '공개 티어표는 보기 전용입니다.' }}
|
||||||
<input
|
</div>
|
||||||
ref="poolSearchEl"
|
<input
|
||||||
v-model="poolSearchQuery"
|
ref="poolSearchEl"
|
||||||
class="sidebar__search"
|
v-model="poolSearchQuery"
|
||||||
type="text"
|
class="sidebar__search"
|
||||||
maxlength="60"
|
type="text"
|
||||||
placeholder="아이템 이름 검색"
|
maxlength="60"
|
||||||
/>
|
placeholder="아이템 이름 검색"
|
||||||
<div
|
/>
|
||||||
ref="poolEl"
|
|
||||||
class="pool"
|
|
||||||
:class="{ 'pool--clickTarget': canEdit && !!selectedItemId }"
|
|
||||||
data-list-type="pool"
|
|
||||||
@click.self="moveSelectedItemToPool"
|
|
||||||
>
|
|
||||||
<div
|
<div
|
||||||
v-for="id in pool"
|
ref="poolEl"
|
||||||
:key="id"
|
class="pool"
|
||||||
class="poolItem"
|
:class="{ 'pool--clickTarget': canEdit && !!selectedItemId }"
|
||||||
:class="{
|
data-list-type="pool"
|
||||||
'poolItem--readonly': !canEdit,
|
@click.self="moveSelectedItemToPool"
|
||||||
'poolItem--hidden': !isPoolItemVisible(id),
|
|
||||||
'poolItem--selected': selectedItemId === id,
|
|
||||||
}"
|
|
||||||
:data-item-id="id"
|
|
||||||
@click.stop="selectItemByClick(id)"
|
|
||||||
>
|
>
|
||||||
<img
|
<div
|
||||||
:src="resolveItemSrc(itemsById[id])"
|
v-for="id in pool"
|
||||||
class="thumb"
|
:key="id"
|
||||||
:alt="itemsById[id]?.label || id"
|
class="poolItem"
|
||||||
draggable="false"
|
:class="{
|
||||||
/>
|
'poolItem--readonly': !canEdit,
|
||||||
<div class="poolItem__label">{{ itemsById[id]?.label || id }}</div>
|
'poolItem--hidden': !isPoolItemVisible(id),
|
||||||
<button
|
'poolItem--selected': selectedItemId === id,
|
||||||
v-if="canRemoveEditorItem(id)"
|
}"
|
||||||
class="poolItem__deleteBtn"
|
:data-item-id="id"
|
||||||
type="button"
|
@click.stop="selectItemByClick(id)"
|
||||||
title="커스텀 이미지 제거"
|
|
||||||
@pointerdown.stop
|
|
||||||
@click.stop="deleteEditorItem(id)"
|
|
||||||
>
|
>
|
||||||
삭제
|
<img
|
||||||
</button>
|
:src="resolveItemSrc(itemsById[id])"
|
||||||
<div v-if="!canEdit" class="poolItem__state">미배치</div>
|
class="thumb"
|
||||||
|
:alt="itemsById[id]?.label || id"
|
||||||
|
draggable="false"
|
||||||
|
/>
|
||||||
|
<div class="poolItem__label">{{ itemsById[id]?.label || id }}</div>
|
||||||
|
<button
|
||||||
|
v-if="canRemoveEditorItem(id)"
|
||||||
|
class="poolItem__deleteBtn"
|
||||||
|
type="button"
|
||||||
|
title="커스텀 이미지 제거"
|
||||||
|
@pointerdown.stop
|
||||||
|
@click.stop="deleteEditorItem(id)"
|
||||||
|
>
|
||||||
|
삭제
|
||||||
|
</button>
|
||||||
|
<div v-if="!canEdit" class="poolItem__state">미배치</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -2024,6 +2026,12 @@ onUnmounted(() => {
|
|||||||
align-items: start;
|
align-items: start;
|
||||||
padding-bottom: 14px;
|
padding-bottom: 14px;
|
||||||
}
|
}
|
||||||
|
.sidebarStickyFrame {
|
||||||
|
min-width: 0;
|
||||||
|
align-self: stretch;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding-bottom: 46px;
|
||||||
|
}
|
||||||
.editorMain__title {
|
.editorMain__title {
|
||||||
font-size: 28px;
|
font-size: 28px;
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
@@ -3146,11 +3154,15 @@ onUnmounted(() => {
|
|||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
scrollbar-width: none;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
align-content: start;
|
align-content: start;
|
||||||
}
|
}
|
||||||
|
.pool::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
.pool--clickTarget {
|
.pool--clickTarget {
|
||||||
cursor: copy;
|
cursor: copy;
|
||||||
}
|
}
|
||||||
@@ -3343,6 +3355,9 @@ onUnmounted(() => {
|
|||||||
max-height: none;
|
max-height: none;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
}
|
}
|
||||||
|
.sidebarStickyFrame {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
.pool {
|
.pool {
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
grid-template-columns: repeat(6, minmax(0, 1fr));
|
grid-template-columns: repeat(6, minmax(0, 1fr));
|
||||||
|
|||||||
Reference in New Issue
Block a user