You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
과거 '디자인 승인 게이트 해제'와 공용 시안을 모든 화면에 자동 적용한다는 FE 결정을 철회한다. 기존 댓글에 기록된 #1605의 core 승격·receiver/afternote 이관은 다시 구현하지 않는다. 미확정 화면 치환과 새 API 신설 예약을 제거한다.
PM 확인 사항
timeletter 등 기존 시트와 공용 시안의 간격·타이포·색·디바이더·컨테이너 차이를 모두 통일할지, 유지할 변형이 있는지 PM에게 확인한다. #1613/#1615의 다른 담당자 범위는 변경하지 않는다. 이미 확정된 기능·항목을 바꾸거나 폐기된 음성 기능을 다시 넣지 않는다.
완료 기준
PM의 명시적 답변·적용 범위·근거를 기록한다. 미답변이나 과거 FE 재량을 승인으로 보지 않는다. 디자이너에게 질문하지 않는다. 확정 전 구현 체크리스트·기존 코드 재개 예약을 제거하고 결정 후 필요한 작업만 다시 정한다.
승격 대상이 4중이 됐습니다 — #369(PR #1112)에서 애프터노트 에디터에 네 번째 구현을 추가했습니다.
feature/afternote/.../author/editor/memorial/MemorialMediaSourceBottomSheet.kt (153줄) — 영정 사진·장례식 영상 슬롯의 소스 선택 시트. 헤더 "미디어 추가하기", 옵션 2개(갤러리 / 촬영), ModalBottomSheet 래핑은 같은 파일의 MemorialMediaSourceSheet 가 담당. 호출부는 AfternoteEditorScreen.kt 1곳.
시각 규격은 이 이슈가 "최신 두 구현이 서로 일치한다"고 적은 쪽(gap 10dp·bodyBase·gray6 헤더·gray3 디바이더)을 그대로 따랐습니다 — DocumentSourceBottomSheet 를 베껴 왔습니다. 즉 드리프트를 늘리진 않았지만 중복 줄 수는 늘렸습니다.
승격 API 안에 반영할 점 하나: 이 시트는 옵션 목록이 호출 시점 상태에 따라 갈립니다(사진 슬롯이면 "사진 촬영", 영상 슬롯이면 "영상 촬영" — 아이콘도 다름). 제안된 items: List<MediaSheetItem> 시그니처면 호출부가 목록을 만들어 넘기는 형태라 그대로 수용됩니다. 별도 확장은 필요 없어 보입니다.
이 이슈가 먼저 가면 승격 대상은 4곳, #1118(추모 음성 녹음)이 먼저 가면 이 시트에 옵션이 하나 더 붙습니다.
본문의 Figma 링크를 현행 노드로 고쳤습니다 — 495-16938 → 4327-72281.
옛 노드는 파일의 back up 페이지에 있는 사본입니다. 두 노드 다 살아 있고 렌더도 같아서 링크가 깨진 티가 안 나는데, 디자이너가 손대는 건 정리 Screen Design 쪽이라 옛 노드를 보고 있으면 변경을 놓칩니다.
REST 로 훑어 보니 코드 안의 Figma 참조 3개가 전부 back up 페이지를 가리키고 있습니다:
위치
노드
페이지
mindrecord/.../MediaSelectBottomSheet.kt:38
495:16938
back up
afternote/.../AfternoteDisplayRes.kt:40
34:3342
back up
afternote/.../MessageSection.kt:24
3628:17591
back up
세 건 다 #1119(주석 정합화)에 체크리스트로 넣어 두었습니다. MediaSelectBottomSheet.kt:38 은 마크다운 링크가 아니라 Figma 노드 495:16938 이라는 맨텍스트라 figma.com grep 에 안 잡힙니다 — 쓸이할 때 노드 번호로 찾아야 합니다.
changed the title [-]refactor(core): 미디어 선택 바텀시트 3중 구현을 core:ui 로 승격 — 시안 확정 선행[/-][+]refactor(core): 미디어 선택 바텀시트 4중 구현을 core:ui로 승격[/+]on Aug 28, 2026
items: List<MediaSheetItem> 이므로 #1118 의 음성(AUDIO) 갈래는 호출부에서 원소 하나 더 넣으면 끝이고 core 는 안 바뀐다.iconTint/labelColor 는 투기가 아니라 실제 요구다 — 추억 노트 시트의 "삭제" 항목이 error 색이다.
시안 정본은 4327:72281 이고, 노드 지오메트리 실측표는 PR #1605 본문에 있다. 시안 값이 전부 정수라 소수점 dp 는 없었다.
PM 질문을 "남은 한 화면(타임레터)을 공용으로 통일할까"의 예·아니오로 좁혀 발신했는데, 그 예·아니오가 결정하는 픽셀 목록이 이 이슈 어디에도 없다. 그래서 지금 확정할 수 있는 것만 실측해 둔다. "통일"이면 이 표가 #1613 의 작업 지시가 되고, "유지"면 이 표가 그대로 타임레터 변형 명세가 된다. 어느 쪽이든 다음 착수자가 코드를 다시 뜯을 필요는 없다.
근거는 전부 origin/develop7d87aa3 실코드다. 시안 정본은 4327:72281 이고, 아래 표는 시안이 아니라 develop 두 파일을 직접 읽어 낸 값이다.
행마다 bottomBorder 1dp gray3 #E0E0E0, 좌우 인셋 20dp (MSS:151)
헤더 여백
vertical 12dp (MBS:39)
상단 8, 핸들, 위 14, 아래 18 (MSS:90-106)
드래그 핸들
ModalBottomSheet 기본 32×4 (TLW:352-356, dragHandle 미지정)
본문이 직접 그리는 40×4 gray3, 래퍼는 dragHandle = null (MSS:90-99, 135)
컨테이너 색
Color.White 원시값 (TLW:355)
gray1 #FAFAFA (MSS:133)
하단 여백
32dp (MBS:68)
bottomSpacing 기본 32dp (MSS:81). 유일하게 같은 축
문구 출처
하드코딩 5개, 헤더 1 + 항목 4 (MBS:35, 45, 51, 57, 63)
core_ui_media_sheet_{title,image,voice,file,link} 가 글자까지 동일 (core/ui strings.xml:76-80)
디바이더 색에 한 줄 덧붙인다. 저장소 전체 .kt 에 MaterialTheme( 호출이 0건이라 timeletter 판 디바이더는 M3 기본 색 스킴의 outlineVariant 로 떨어진다. 앱 테마가 지정한 색이 아니다.
다크는 비교에서 뺐다. AfternoteTheme 의 isDarkTheme 기본값이 false 로 못박혀 있고 ThemeDarkModeLockTest·LightSystemBarLockKonsistTest 가 그걸 지키고 있어서, 지금 화면에 드러나는 차이는 라이트뿐이다.
#1613 본문의 6줄(행 세로 패딩·gap·헤더 패딩·타이포/색·디바이더·Image → Icon) 말고 다음 3건이 더 바뀐다. 본문 치환만 하고 이 3건을 빼면 화면이 시안과 안 맞는다.
드래그 핸들이 둘이 된다. refactor(timeletter): 미디어 선택 시트를 core:ui MediaSelectSheet 로 이관 (#642 인계) #1613 은 "자체 sheetState 를 유지하니 본문(MediaSelectSheetContent) 쪽을 쓴다"고만 적었는데, 본문이 핸들을 직접 그리는 반면 TLW:352 의 ModalBottomSheet 는 dragHandle 을 안 넘겨 기본 핸들도 같이 그린다. 선례는 afternote 쪽이고 거기선 래퍼가 dragHandle = null 을 박아 뒀다(MemorialMediaSourceState.kt:244).
ic_file 은 정리 대상이 아니다. 시트를 치환해도 TLW:567 의 EditorBlock.File 칩이 계속 쓴다. 참조가 0건이 되는 것은 ic_image 하나뿐이고, 그건 지금 MBS:44 한 곳에서만 쓰인다.
완료 조건의 "참조 0건이 된 timeletter 지역 아이콘·문자열 리소스 정리"에서 문자열 쪽은 대상이 없다. 시트 문구 5개가 전부 코드 하드코딩이고 timeletter strings.xml 에 대응 항목이 없다.
호출부 줄 번호 TimeLetterWriteScreen.kt:260 은 작성 시점(2026-08-30)엔 맞았지만 지금은 ModalBottomSheet 352, MediaBottomSheetContent 357 이다. 그 사이 TLW 에 389줄이 들어왔다. 음성 갈래도 audioLauncher.launch("audio/*") 에서 onOpenVoiceRecorder() 로 바뀌었다(TLW:362-365). MBS 자체는 2026-08-28 이후 그대로라 위 표의 수치는 refactor(timeletter): 미디어 선택 시트를 core:ui MediaSelectSheet 로 이관 (#642 인계) #1613 작성 시점과 같다.
착수 상태
열린 PR 62건의 제목·본문·브랜치명을 전수 검색했다. #642·#1613·MediaBottomSheet·MediaSelectSheet·MediaSheetItem·"미디어 추가"를 무는 PR 0건이고, 원격에 1613 브랜치도 없다. 타임레터를 건드리는 열린 PR 은 #1967·#1905·#1708·#1365 네 건인데 TLW 를 여는 것은 #1365 하나뿐이고, 그 diff 는 로딩 실패 Scaffold 와 isSubmitting 배선만 건드리지 시트 블록(351-377)에는 들어오지 않는다. 지금 착수해도 충돌하는 작업은 없다.
본문과 develop 실태가 어긋난 곳
"새 API 신설 예약을 제거한다"는 예약이 아니라 이미 선 코드다. PR refactor(core,receiver,afternote): 미디어 선택 바텀시트를 core:ui 로 승격한다 (#642) #1605 머지로 core/ui/.../sheet/MediaSelectSheet.kt 가 develop 에 있고 소비처가 셋이다. receiver DocumentUploadScreen.kt:145, afternote MemorialMediaSourceBottomSheet.kt:73, mindrecord WriteTextField.kt:336.
"미확정 화면 치환"이 가리킬 화면은 타임레터 한 곳뿐이다. 4중 구현 중 셋은 치환이 끝났고 사본 파일도 지워졌다.
PM 확인 사항의 "유지할 변형이 있는지"는 열린 갈래처럼 적혀 있지만, develop 에 남은 변형은 timeletter 판 하나다. 그 판은 core 컴포넌트보다 먼저 쓰였고 파일 안에 디자인 토큰(AfternoteDesign) 참조가 0건이라, 차이가 화면별 의도라기보다 토큰 미사용 드리프트로 보인다. 판단은 PM 답변에 맡긴다.
"폐기된 음성 기능을 다시 넣지 않는다"를 타임레터 시트의 음성 항목까지로 읽으면 오독이다. 폐기된 것은 추억 노트 음성 녹음(추억 노트 미디어 음성 녹음 첨부 — #369 에서 서버 계약 부재로 빠진 갈래 #1118, 2026-09-11 NOT_PLANNED)이고, 타임레터 시트의 "음성 추가하기"는 살아 있다. TLW:362-365 가 onOpenVoiceRecorder 로 이어지고 VoiceRecorderBottomSheet 가 뜬다. core 에도 core_ui_media_sheet_voice 가 있고 mindrecord 가 쓴다.
Activity
1hyok commentedon Aug 25, 2026
승격 대상이 4중이 됐습니다 — #369(PR #1112)에서 애프터노트 에디터에 네 번째 구현을 추가했습니다.
feature/afternote/.../author/editor/memorial/MemorialMediaSourceBottomSheet.kt(153줄) — 영정 사진·장례식 영상 슬롯의 소스 선택 시트. 헤더 "미디어 추가하기", 옵션 2개(갤러리 / 촬영),ModalBottomSheet래핑은 같은 파일의MemorialMediaSourceSheet가 담당. 호출부는AfternoteEditorScreen.kt1곳.시각 규격은 이 이슈가 "최신 두 구현이 서로 일치한다"고 적은 쪽(gap 10dp·bodyBase·gray6 헤더·gray3 디바이더)을 그대로 따랐습니다 —
DocumentSourceBottomSheet를 베껴 왔습니다. 즉 드리프트를 늘리진 않았지만 중복 줄 수는 늘렸습니다.승격 API 안에 반영할 점 하나: 이 시트는 옵션 목록이 호출 시점 상태에 따라 갈립니다(사진 슬롯이면 "사진 촬영", 영상 슬롯이면 "영상 촬영" — 아이콘도 다름). 제안된
items: List<MediaSheetItem>시그니처면 호출부가 목록을 만들어 넘기는 형태라 그대로 수용됩니다. 별도 확장은 필요 없어 보입니다.이 이슈가 먼저 가면 승격 대상은 4곳, #1118(추모 음성 녹음)이 먼저 가면 이 시트에 옵션이 하나 더 붙습니다.
1hyok commentedon Aug 25, 2026
본문의 Figma 링크를 현행 노드로 고쳤습니다 —
495-16938→4327-72281.옛 노드는 파일의
back up페이지에 있는 사본입니다. 두 노드 다 살아 있고 렌더도 같아서 링크가 깨진 티가 안 나는데, 디자이너가 손대는 건정리 Screen Design쪽이라 옛 노드를 보고 있으면 변경을 놓칩니다.REST 로 훑어 보니 코드 안의 Figma 참조 3개가 전부
back up페이지를 가리키고 있습니다:mindrecord/.../MediaSelectBottomSheet.kt:38495:16938afternote/.../AfternoteDisplayRes.kt:4034:3342afternote/.../MessageSection.kt:243628:17591세 건 다 #1119(주석 정합화)에 체크리스트로 넣어 두었습니다.
MediaSelectBottomSheet.kt:38은 마크다운 링크가 아니라Figma 노드 495:16938이라는 맨텍스트라figma.comgrep 에 안 잡힙니다 — 쓸이할 때 노드 번호로 찾아야 합니다.[-]refactor(core): 미디어 선택 바텀시트 3중 구현을 core:ui 로 승격 — 시안 확정 선행[/-][+]refactor(core): 미디어 선택 바텀시트 4중 구현을 core:ui로 승격[/+][-]refactor(core): 미디어 선택 바텀시트 4중 구현을 core:ui로 승격[/-][+]미디어 선택 바텀시트 4중 구현을 core:ui로 승격[/+]1hyok commentedon Aug 30, 2026
진행 상황 — core 승격은 끝났고 남은 건 두 모듈 치환이다 (2026-08-30)
PR #1605 가
core:ui신설 + 내 담당 모듈 호출부 2곳 치환까지 끝냈다.Closes대신Refs로 건 이유는 아래 두 갈래가 남아서다.core:ui승격 (sheet/MediaSelectSheet.kt신설)DocumentSourceBottomSheet이관 + 파일 삭제MemorialMediaSourceBottomSheet본문 치환셋이 다 끝나면 이 이슈가 닫힌다.
본문과 실제가 어긋난 곳 3건 — 착수 전에 읽을 것
feature/afternote/.../memorial/MemorialMediaSourceBottomSheet.kt다. 내 담당이라 PR refactor(core,receiver,afternote): 미디어 선택 바텀시트를 core:ui 로 승격한다 (#642) #1605 에서 같이 이관했다 — 하나만 남기면 이 이슈가 경고한 반쪽 승격(FixedRightPopupPositionProvider전례)이 된다.DocumentUploadScreen.kt는 이미feature/receiver로 옮겨졌다 (refactor(afternote): 수신자 흐름 58개 파일을 feature:receiver 로 이전 — 애프터노트 모듈이 타 도메인 열람 관문 소유 #615 완료). 본문은feature/afternote/.../receiver/deliveryverification/경로로 적고 있다.신설 API — 항목 개수를 계약에 안 박았다
items: List<MediaSheetItem>이므로 #1118 의 음성(AUDIO) 갈래는 호출부에서 원소 하나 더 넣으면 끝이고 core 는 안 바뀐다.iconTint/labelColor는 투기가 아니라 실제 요구다 — 추억 노트 시트의 "삭제" 항목이error색이다.시안 정본은 4327:72281 이고, 노드 지오메트리 실측표는 PR #1605 본문에 있다. 시안 값이 전부 정수라 소수점 dp 는 없었다.
[-]미디어 선택 바텀시트 4중 구현을 core:ui로 승격[/-][+]미디어 선택 시트의 화면별 규격 통일 범위를 PM에게 확인한다[/+]1hyok commentedon Sep 13, 2026
PM 전건호에게 Figma 댓글로 질문했다(2026-09-13). 이 이슈는 그동안 PM 확인 대기로 분류돼 있었지만 실측해 보니 어느 채널에도 발신 기록이 없었다. 이번이 첫 발신이다.
4327:72281COMPONENT Property 1=media_select — 정리 Screen Design#4327:43064 > SECTION 타임레터#4327:99019 > SECTION 미디어 추가 바텀시트 모음#4638:39892 > COMPONENT_SET 바텀시트#4327:72280message_meta로 보내 알림이 가도록 했다. 평문@이름은 알림이 가지 않는다.물은 것은 묵은 본문의 질문을 그대로 옮긴 것이 아니라 origin/develop 86ab223 실코드와 현재 시안으로 다시 벼린 것이다.
본문에 있었지만 이번 질문에서 뺀 축:
1hyok commentedon Sep 13, 2026
타임레터 판과 core 정본의 규격 차이 실측 (2026-09-13)
PM 질문을 "남은 한 화면(타임레터)을 공용으로 통일할까"의 예·아니오로 좁혀 발신했는데, 그 예·아니오가 결정하는 픽셀 목록이 이 이슈 어디에도 없다. 그래서 지금 확정할 수 있는 것만 실측해 둔다. "통일"이면 이 표가 #1613 의 작업 지시가 되고, "유지"면 이 표가 그대로 타임레터 변형 명세가 된다. 어느 쪽이든 다음 착수자가 코드를 다시 뜯을 필요는 없다.
근거는 전부
origin/develop7d87aa3 실코드다. 시안 정본은 4327:72281 이고, 아래 표는 시안이 아니라 develop 두 파일을 직접 읽어 낸 값이다.약어: MBS =
feature/timeletter/.../component/MediaBottomSheetContent.kt, MSS =core/ui/.../sheet/MediaSelectSheet.kt, TLW =feature/timeletter/.../screen/sender/TimeLetterWriteScreen.kt.ic_image·ic_file둘 다 intrinsic 24dp)Image, tint 없음, size 지정 없음 (MBS:100-103)Icon,iconBktint, 24dp (MSS:156-161)ProvideTextStyle(bodyLargeR)= 18/22 (Theme.kt:74, AfternoteTypography.kt:139-147)bodyBase= 16/24 (MSS:103, 164)LocalContentColor기본)gray6#757575, 문구gray9#212121 (MSS:104, 165)HorizontalDividerM3 기본, 좌우 인셋 0이라 시트 전폭 (MBS:48, 54, 60, 66)bottomBorder1dpgray3#E0E0E0, 좌우 인셋 20dp (MSS:151)ModalBottomSheet기본 32×4 (TLW:352-356,dragHandle미지정)gray3, 래퍼는dragHandle = null(MSS:90-99, 135)Color.White원시값 (TLW:355)gray1#FAFAFA (MSS:133)bottomSpacing기본 32dp (MSS:81). 유일하게 같은 축core_ui_media_sheet_{title,image,voice,file,link}가 글자까지 동일 (core/uistrings.xml:76-80)디바이더 색에 한 줄 덧붙인다. 저장소 전체
.kt에MaterialTheme(호출이 0건이라 timeletter 판 디바이더는 M3 기본 색 스킴의outlineVariant로 떨어진다. 앱 테마가 지정한 색이 아니다.다크는 비교에서 뺐다.
AfternoteTheme의isDarkTheme기본값이false로 못박혀 있고ThemeDarkModeLockTest·LightSystemBarLockKonsistTest가 그걸 지키고 있어서, 지금 화면에 드러나는 차이는 라이트뿐이다.#1613 델타 목록에 없는 축 3건
#1613 본문의 6줄(행 세로 패딩·gap·헤더 패딩·타이포/색·디바이더·
Image→Icon) 말고 다음 3건이 더 바뀐다. 본문 치환만 하고 이 3건을 빼면 화면이 시안과 안 맞는다.sheetState를 유지하니 본문(MediaSelectSheetContent) 쪽을 쓴다"고만 적었는데, 본문이 핸들을 직접 그리는 반면 TLW:352 의ModalBottomSheet는dragHandle을 안 넘겨 기본 핸들도 같이 그린다. 선례는 afternote 쪽이고 거기선 래퍼가dragHandle = null을 박아 뒀다(MemorialMediaSourceState.kt:244).Color.White→gray1(TLW:355).#1613 대상표에서 고칠 것 3건
다른 담당자 범위라 #1613 본문은 손대지 않았다. 착수 전에 여기를 읽으면 된다.
ic_file은 정리 대상이 아니다. 시트를 치환해도 TLW:567 의EditorBlock.File칩이 계속 쓴다. 참조가 0건이 되는 것은ic_image하나뿐이고, 그건 지금 MBS:44 한 곳에서만 쓰인다.strings.xml에 대응 항목이 없다.TimeLetterWriteScreen.kt:260은 작성 시점(2026-08-30)엔 맞았지만 지금은ModalBottomSheet352,MediaBottomSheetContent357 이다. 그 사이 TLW 에 389줄이 들어왔다. 음성 갈래도audioLauncher.launch("audio/*")에서onOpenVoiceRecorder()로 바뀌었다(TLW:362-365). MBS 자체는 2026-08-28 이후 그대로라 위 표의 수치는 refactor(timeletter): 미디어 선택 시트를 core:ui MediaSelectSheet 로 이관 (#642 인계) #1613 작성 시점과 같다.착수 상태
열린 PR 62건의 제목·본문·브랜치명을 전수 검색했다.
#642·#1613·MediaBottomSheet·MediaSelectSheet·MediaSheetItem·"미디어 추가"를 무는 PR 0건이고, 원격에 1613 브랜치도 없다. 타임레터를 건드리는 열린 PR 은 #1967·#1905·#1708·#1365 네 건인데 TLW 를 여는 것은 #1365 하나뿐이고, 그 diff 는 로딩 실패Scaffold와isSubmitting배선만 건드리지 시트 블록(351-377)에는 들어오지 않는다. 지금 착수해도 충돌하는 작업은 없다.본문과 develop 실태가 어긋난 곳
core/ui/.../sheet/MediaSelectSheet.kt가 develop 에 있고 소비처가 셋이다. receiverDocumentUploadScreen.kt:145, afternoteMemorialMediaSourceBottomSheet.kt:73, mindrecordWriteTextField.kt:336.MediaSheetMigrationTest.kt가 core 문자열로 가드까지 걸려 있다.AfternoteDesign) 참조가 0건이라, 차이가 화면별 의도라기보다 토큰 미사용 드리프트로 보인다. 판단은 PM 답변에 맡긴다.onOpenVoiceRecorder로 이어지고VoiceRecorderBottomSheet가 뜬다. core 에도core_ui_media_sheet_voice가 있고 mindrecord 가 쓴다.PM 답변은 2026-09-13 발신분이 아직 도착 전이다. 코드는 내지 않는다. 남은 갈래가 timeletter 치환 하나이고 그건 #1613(koongmai) 범위이며, 본문도 확정 전 구현을 금지한다.
1hyok commentedon Sep 18, 2026
PM 결정 대기 항목은 깃허브 이슈로 두지 않고 피그마 질문 한 자리에만 둔다(2026-09-18 결정). 이 이슈의 질문은 피그마 스레드에 걸려 있다: https://www.figma.com/design/UP9ZR186jHvRBicjA2SOea/?node-id=4327-72281#1923877305 답이 오면 그 답을 근거로 구현 이슈를 새로 만든다.