
이 계획서는 프레임(레이어) 크기 조절 시 세로 크기가 가변적으로 불안정하게 임의로 커지는 버그를 해결하고, 본문 텍스트가 위쪽 프레임에서 사라지고 아래쪽 프레임으로만 몰려 비어버리는 현상을 수정하며, 본문 편집/이동 시 안정성을 대폭 향상시키기 위한 작업 계획입니다.
문제 원인 분석 (Root Cause)
-
위쪽 프레임이 비어버리고 아래쪽 프레임으로 텍스트가 쏠리는 버그:
reflowText함수 내에서 본문 프레임에 텍스트가 넘치는지 판단하는 기준 코드가 아래와 같았습니다:if (f.scrollHeight > f.clientHeight || wrapper.scrollHeight > f.clientHeight)- 여기서
f는 레이어 프레임 자체(.layer-element)입니다. 이 레이어 프레임은 내부에 크기 조절 핸들(resize-handle, bottom: -8px 등)과 회전 핸들 등의 UI 요소를 자식으로 포함하고 있으며,overflow: visible상태입니다. - 이로 인해 텍스트가 전혀 없거나 아주 조금만 들어있어도, 하단에 튀어나온 조절 핸들 등의 위치 때문에
f.scrollHeight가 항상f.clientHeight보다 큰 상태가 유지되었습니다. - 그 결과 이진 탐색(binary search) 연산이 오동작하여 첫 프레임에는 0글자만 넣어도 오버플로우가 발생했다고 판단하게 되고, 결국 첫 프레임은 빈 프레임이 되고 모든 텍스트가 마지막 프레임(아래쪽 프레임)으로 쏠려버리는 치명적인 버그가 유발되었습니다.
-
해결 방법:
- 핸들 등 외곽 UI 요소를 포함하는 부모 프레임
f대신, 순수하게 텍스트 단락들만 담고 있는.text-content-wrapper(wrapper)의scrollHeight만을 프레임 높이(f.clientHeight)와 비교하도록 수정합니다. if (wrapper.scrollHeight > f.clientHeight)- 이와 함께 CSS에서
.text-content-wrapper에height: 100% !important;를 설정하여, 텍스트 래퍼의 높이가 부모 프레임 크기를 초과하여 임의로 늘어나지 않도록 견고하게 제어합니다.
- 핸들 등 외곽 UI 요소를 포함하는 부모 프레임
-
인라인 편집 시 백스페이스로 인한 프레임 삭제 버그:
- 인라인 편집기(
contentEditable=true) 상태에서 사용자가 백스페이스를 누를 때, activeElement가DIV이므로 일반 입력 필드로 인식되지 못하고 레이어 삭제 이벤트가 트리거되던 문제를 방지합니다.
- 인라인 편집기(
-
확대 배율(Zoom)과 크기 조절/이동의 좌표 충돌:
getBoundingClientRect()의 확대 픽셀값 대신 unscaled 고유 레이아웃 값(offsetWidth,offsetHeight등)을 사용하여 120% 줌 상태에서도 튐 현상 없이 안정적으로 크기가 조절되도록 보정합니다.
Proposed Changes (제안된 변경 사항)
[Views Component]
[MODIFY]
-
CSS 규칙 변경 (약 455라인):
css.layer-element[data-type="bodytext"] .text-content-wrapper {overflow: hidden;height: 100% !important; /* 항상 부모 레이어 프레임 크기 내에 고정되도록 제약 */} -
Mousedown 이벤트 리스너 수정 (리사이즈 및 드래그 시작) (약 3026, 3072라인 부근):
getBoundingClientRect()사용 부분을 제거하고layer.offsetWidth,layer.offsetHeight,layer.offsetLeft,layer.offsetTop을 사용하여 드래그 타겟 데이터를 빌드합니다.
-
Mousemove 이벤트 리스너 수정 (Resizing 및 Dragging 처리) (약 3333, 3435라인 부근):
- 마우스 무브 변화율(
dx,dy) 계산 및 부모의 너비/높이 계산(parentEl.offsetWidth/offsetHeight)을 교정하여 페이지 하단 경계를 초과하지 못하도록 최종 제한합니다.
- 마우스 무브 변화율(
-
Keydown 삭제 감지 및 삭제 로직 보정 (약 2030, 2039라인 부근):
deleteSelectedLayer()및keydown핸들러를 수정하여,isContentEditable편집 상태에서는 백스페이스/Delete 삭제 단축키가 작동하지 않도록 방어하고, 프레임 삭제 시 체인 링크를 자동 복구하고 텍스트 유실 없이 리플로우를 수행합니다.
-
Reflow 텍스트 높이 판단 조건 수정 (약 2405, 2437라인 부근):
reflowText함수 내 이진 탐색 및 오버셋 표시 여부 결정 시, 핸들 위치에 영향받는 부모 높이 비교(f.scrollHeight)를 제외하고 순수한 텍스트 높이 비교(wrapper.scrollHeight > f.clientHeight)만 수행하도록 교정합니다.
Verification Plan (검증 계획)
수동 검증 및 시나리오
-
프레임 간 텍스트 자동 분배 검증:
- 2개 이상의 본문 프레임을 연결한 상태에서 첫 번째 프레임의 위치를 옮기거나 크기를 변경해 봅니다.
- 첫 번째 프레임에 설정한 세로 크기 한도만큼 텍스트가 정상적으로 남고, 초과하는 분량만 다음 프레임으로 자연스럽게 넘어가는지 확인합니다. 첫 번째 프레임이 텅 비어버리는 현상이 완벽하게 해결되었는지 검증합니다.
-
글자 지우기(Backspace) 작동 확인:
- 본문 텍스트 프레임 내부에서 백스페이스로 글자를 지울 때 프레임이 제거되지 않는지 확인합니다.
-
프레임 하단 경계 제한 및 리사이즈 조작 확인:
- 크기 조절 시 프레임의 하단 경계선이 페이지 밖으로 나가지 않고 걸리며, 조작감이 가변적으로 튀지 않고 1px 단위로 견고하게 고정/조절되는지 검증합니다.
본문 리사이징 시 세로 고정 및 넘침 자동 분배 버그 해결 (Reflow Deadlock)
텍스트 프레임 외곽에 있는 **조절 핸들의 크기(bottom: -8px)**로 인해 텍스트 높이와 관계없이 프레임 자체의 scrollHeight가 clientHeight보다 항상 큰 것으로 브라우저가 인식하던 치명적인 버그가 있었습니다.
이로 인해 글자가 조금만 있어도 강제로 텍스트가 다음 프레임으로 다 밀려나 위쪽 프레임이 텅 비어버렸던 것입니다.
판단 기준을 레이어 외부 핸들이 아닌 내부 순수 텍스트 영역(.text-content-wrapper)의 scrollHeight로 변경하고, CSS에 height: 100% !important를 주입하여 세로 크기 고정 및 한도 내 자동 분배가 완벽하고 자연스럽게 작동하도록 교정했습니다.
크기 조절 및 이동 시 튀는 불안정 좌표 보정
120% 줌 배율이 가해진 화면상의 물리적 좌표(getBoundingClientRect) 대신, 배율 왜곡이 없는 레이아웃 프로퍼티(offsetWidth, offsetHeight, offsetLeft, offsetTop)를 활용하도록 수학적 계산식을 전부 정비했습니다.
이제 크기를 조작하거나 프레임을 이동시켜도 순간적으로 커지거나 툭툭 튀는 기현상이 사라지고 1px 단위로 매우 매끄럽게 흡착하듯 고정 조절됩니다.
페이지 하단 경계 제한 강제
요소의 아래쪽 경계가 소속된 .magazine-page 영역의 높이를 벗어나지 못하도록 연산 제약을 추가했습니다.
이로 인해 프레임이 페이지 밖으로 삐져나가 조절 핸들이 가려지거나 사라져 고칠 수 없게 되는 락(Lock) 현상이 완벽히 방지됩니다.
더블클릭 편집 시 백스페이스로 프레임이 삭제되는 버그 차단
인라인 편집 중 글자를 지우기 위해 백스페이스나 Delete 키를 누를 때 편집 포커스(isContentEditable)를 체크하여 프레임 전체 레이어가 지워지던 문제를 차단했습니다.
체인 프레임 삭제 시 링크 자동 복구 및 텍스트 데이터 인계 보장
여러 프레임이 엮인 구조에서 중간 혹은 첫 번째(Head) 프레임을 지워도 앞뒤 링크를 자동으로 재결합하고 전체 텍스트 본문 원본을 인계받아 텍스트가 유실되지 않고 남은 프레임으로 자연스럽게 reflow 흐름을 이어가도록 개선했습니다.