Skip to content

HBEA110_Shell·탭바·알림 ​

(Hereby) 직원 앱 > Shell·탭바·알림

앱직원 앱 (Employee App / ESS, 포트 4002)
대상 사용자조건1 [직원(self scope)]
프로토타입TBU
관련 정책상단 고정 바(FIG 정책 fixed-header) · [[POL_권한(RBAC)]]
Statusreview
Owner카나 (PM)

개요 ​

직원 앱 공통 Shell — 상단 fixed header(날짜·알림 종·프로필 아바타) + 하단 4탭 탭바 + 알림 패널. 하단 탭바: "근무" / "메신저" / "결재" / "더보기". 메신저 탭에 미읽음 배지. 알림 패널: 헤더 "알림 (3)" + "모두 읽음" + 알림 항목 리스트. 원천 Notification / NotificationDelivery. 모바일 특성: 상단 fixed header(관찰상 날짜·알림·프로필 3요소, 라이브상 종 배지 포함 4요소로 관찰됨) + 하단 탭바 4탭 + 풀페이지 모달 패턴. 시각 정비(#648): 직원 앱 공용 모달은 모바일 호스트에서 화면 가장자리까지 꽉 차는 표시 변형(full-layer)으로 열리고, 닫기(X)는 제목 줄 안 화면 우측 8px에 서서 2depth 헤더의 뒤로(<) 버튼과 좌우 대칭을 이룬다. 모든 스크롤 화면 끝에 하단 여백을 둬 마지막 카드가 화면·하단 내비 바닥에 붙어 잘려 보이던 문제를 없앴다.

문서 히스토리 ​

날짜작성자팀변경 내용
2026-07-06카나PM최초 작성
2026-07-10카나PM라이브 기능 검토 반영
2026-07-13카나PM버튼 행동 명세 보강
2026-07-21카나PMGC700 깊이 재작성 + fixed-header 정책 반영
2026-07-21카나PM셀 스타일 확정판 적용 (콸 승인)
2026-08-18개발DEV알림 항목 클릭 딥링크 구현 반영(후순위 → 구현, design/employee-notice)
2026-08-18카나라이브 재검증 정정알림 항목 타임스탬프 라이브 표기 = 날짜만 점표기 "2026. 07. 26."(시각 없음). 기존 "2026.07.04 17:03:29"(시각 포함)는 미현행. 헤더 "알림 (n)"·"모두 읽음"은 미읽음 0건 상태라 미노출(0건 시 조건부 노출로 해석)
2026-08-21카나PMPR #574 딥링크 라이브 실증(dev, 콸 지시 검토): CASE01 — "휴가 신청 접수" 클릭 → 결재 > 휴가신청 탭 정상 착지 / CASE02 — "접근 권한 요청" 클릭 → 다이얼로그 제목 "확인"·본문 "관리자에서 확인해 주세요."(앱이름 볼드)·[확인] 1버튼 원문 그대로 확인. 근거 = 커밋+라이브 이중으로 격상
2026-09-10개발DEV시각 정비(#648, design/app-ui-improvements 머지): 공용 모달 full-layer 표시 변형(모바일 호스트 edge-to-edge) 추가, 닫기 X 제목 줄 우측 8px 정렬(2depth 뒤로 버튼 대칭), 모든 스크롤 화면 하단 끝 여백 신설. 근거 = 커밋(b2a82e2·17ccfcf·6101ee4)
2026-09-23카나PM안드로이드 백버튼이 알림 2depth 화면·불편·오류 신고 팝업을 한 층만 닫도록 수정 반영(4b363ff, PR #849, QA 2026-09-22) — 기존에는 홈 탭에서 앱 종료 확인이 떴음. 커밋 근거, 라이브 실사 이월(TBU)
2026-10-02카나PM하단 고정 배너(새 버전·버전 확인 실패) 행 추가 — 탭바 보이면 탭바 위 16px, 아니면 바닥 16px로 위치 변경·로그인 버튼 가림 해소(cc823348·3454d65f, #1011) — 커밋 근거, 라이브 실사 이월(TBU) - 카나/PM
2026-10-07카나PMPR #1035 반영(796e116c): 하단 탭바 분리형 캡슐 전환(AI 켠 병원) + 「AI 어시스턴트」 원형 버튼(ㄴ22 신설, 검색 우선 시작 화면·캡슐 입력줄) — AI 화면 상세는 HBEA600(가칭) 신규 채번 제안. 커밋 근거, 라이브 실사 이월(TBU)
2026-10-08카나PM10/7 머지분 반영 — PR #1083(fd5bf280·920aee91·28b87a1c·d37cb047): 헤더 스크롤 유리·결재·메신저 날짜 줄 0.6배 접힘(ㄴ14) · 하단 내비 리퀴드 글라스·선택 유리 스프링(ㄴ23) · 하단 탭 재탭 = 맨 위 스크롤(ㄴ24) · AI 어시스턴트 화면 오른쪽 슬라이드 인(ㄴ22 보강) · iOS 바닥 여백 22px·상태 표시줄 색 동기화(26) · iOS 왼쪽 가장자리 스와이프 = 뒤로(41) · PR #1090/#1093(ef18fa36·bd9bde77) 조직 「화면 캡처 제한」 민감 화면 보호·스크린샷 토스트(50, 웹 안내막 제거) · PR #1072(MED-940) 안드로이드 시스템 바 인셋 복구·키보드 여백(51). 커밋 근거, 라이브 실사 이월(TBU)
2026-10-08카나PM낮 스윕 라이브 실사(웹 /employee-app) — 분리형 캡슐 내비(20 CASE01: .ds-bottom-nav--split·4탭+AI 버튼)·선택 유리 .ds-bottom-nav__glow 실재(ㄴ23)·AI 어시스턴트 화면 원문 전체 채록(ㄴ22: 제목·바로가기 5종·입력줄 placeholder·하단 고지) 실증. 실기기 전용 항목(ㄴ14 접힘 체감·26 iOS 여백·41 엣지 스와이프·50 캡처 가림·토스트)은 TBU 유지
2026-10-09카나PMPR #1120 반영: 그라데이션 유리 헤더·유리 버튼 44 토큰 통일·벨 드롭다운 캡슐 밖(ㄴ14-1 신설). AI 이전 대화 오른쪽 서랍·Enter 보내기 등 AI 화면 몫은 HBEA600 채번 제안 유지(미작성) — 커밋 근거, 모바일 실사 이월
2026-10-14카나PMㄴ13 정정 — 헤더 아바타 = 프로필 시트(나에게 채팅·인증/보안 설정·프로필 사진 변경·내 정보·더보기·닫기, 10/14 라이브 실측): 「더보기」 행 신설(#1210 338c8f4)·「인증/보안 설정」 행(#1227 — 화면 자체는 HBEA520(가칭) 채번 제안). ㄴ32 「모두 읽음」 본문 위 줄 → 헤더 오른쪽 글자 버튼(안 읽은 알림 있을 때만, 6f8d869) — 커밋 근거 - 카나/PM

Data I/O ​

Server → Client ​

변수DB 엔티티.컬럼값 없을 때비고
$클라이언트 당일 날짜 파생당일값 필수"2026년 7월 6일 월"
$Employee self (이니셜)이니셜 fallback"최"
$Notification.isRead=false 카운트0(배지 hide)"알림 (3)"
$Notification (제목/본문/타임스탬프)Empty 문구(TBU)타임스탬프 "2026. 07. 26." (날짜만·점표기, 시각 없음 — 2026-08-18 정정)
$ConversationMember.unreadCount0"메신저 0"

Client → Server ​

액션전달 값tRPC procedure권한 토큰
모두 읽음(없음)sdk.notification.markAllRead() (추정)notification:update.self (추정)
탭 전환tabKey (근무/메신저/결재/더보기)(클라이언트 라우팅)-
알림 항목 클릭NotificationEvent.type (→ 목적지) + 알림 idsdk.notification.markRead(id) + 클라이언트 라우팅notification:read.self (추정)

markAllRead → Notification.isRead=true. 알림 항목 클릭 → 읽음 처리 + 화면 이동(2026-08-18 구현, 이전 FIG 정책 "후순위"). 목적지는 NotificationEvent.type 하나로 결정되며 표는 @hereby/core/constants의 resolveNotificationTarget 단일 정본(알림 목록·공용 알림 벨·서버 푸시 payload가 공유). markAllRead procedure 확정값 = TBU.

외부 통합 (알림 채널·발송) ​

외부 시스템데이터동기/비동기비고
푸시(device_tokens)platform별 푸시 발송 대상비동기NotificationDelivery 추적

화면 플로우 (Shell 구조) ​


Shell·탭바·알림 사양표 ​

번호항목/기능명타입사양 및 기능 설명연관/영향 범위비고
00화면 진입 조건-조건1 [직원 인증]. 모든 탭 공통 프레임. 미인증 시 Shell 미노출(로그인 리다이렉트)
01초기 상태Output상단 fixed header 고정 + 하단 탭바 노출 + 근무 탭 활성. 알림 패널 닫힘
10상단 fixed header-날짜 / 알림 / 프로필 요소FIG 정책 fixed-header정책 3요소 vs 라이브 4요소(종 배지 포함) 차이 → OQ
ㄴ11날짜 헤더Text"2026년 7월 6일 월"(당일 날짜·요일). 당일값 필수. 정책: "당일 날짜 표시"FIG 정책 fixed-header
ㄴ12알림 종Button• 알림 패널을 여닫는 헤더 버튼. self 알림만 노출
• 클릭 → 알림 패널 토글(열기/닫기)
 - CASE01 [미읽음>0]: 배지 카운트 표시
 - CASE02 [미읽음 0]: 배지 hide
NotificationFIG 정책 fixed-header
ㄴ12-3ㄴ 정책 소재-정책: "알림 + 처리대기 통합" / "설정" 포함 / 항목 클릭 시 화면 이동(정책상 후순위였으나 2026-08-18 구현)FIG 정책 fixed-header정책 "처리대기 통합"·"설정" 라이브 미관찰 → OQ
ㄴ13프로필 아바타 → 프로필 시트Button• 헤더 아바타(이니셜 "최", 값없음 시 이니셜 fallback) 클릭 → 내 프로필 시트(바텀시트) 오픈 — 이름·역할 요약 + 행 메뉴 (2026-10-14 라이브 실측):
 - 「나에게 채팅」 → 나와의 대화
 - 「인증/보안 설정」 → 인증/보안 설정 화면([HBEA520] — 채번 제안, #1227)
 - 「프로필 사진 변경」
 - 「내 정보」 → [[HBEA510_내 정보·근무 설정]]
 - 「더보기」 → 더보기 탭 1depth (#1210 — 시트에 없는 설정·앱 정보 동선 단축)
 - 「닫기」
Employee self · [[HBEA500_더보기]]정정: 구 「클릭 = 더보기 이동」 폐기 · 「더보기」 행 신설(338c8f4) · 실측 2026-10-14
ㄴ14헤더 스크롤 유리 · 줄 접힘Rule• (10/8, #1083, fd5bf280·920aee91) 헤더를 화면 흐름에서 띄움(position: absolute) — 본문이 헤더 뒤로 지나감. 스크롤되면(.is-scrolled) 헤더가 하단 캡슐과 같은 유리(흰 반투명 + 뒤 흐림)가 됨(모양 정본을 디자인 시스템으로 이관, 앱은 바탕색 --ds-app-header-surface만 넘김)
 - CASE01 [결재 · 메신저 (탭 줄 있음)]: collapseOnScroll — 날짜 줄이 스크롤 양의 0.6배로 위로 접혀 다 접히면 탭 줄만 상단 고정. 손을 떼도 스냅 없음, 본문은 손가락과 1배 속도(종전 2배로 튕기던 문제 해소). 메신저는 목록 스크롤로도 판정하고 목록이 유리 탭 줄 뒤로 지나감
 - CASE02 [근무 · 더보기 (탭 줄 없음)]: 유리만, 접힘 없음
 - CASE03 [2depth]: 접힘 끔(뒤로 버튼이 사라지면 안 됨)
AppHeader · [[HBEA400_결재 허브]] 06 · [[HBEA300_메신저]] ㄴ42신설 (#1083) · TBU: 실기기 긴 목록 스크롤 끊김 여부
ㄴ14-1그라데이션 유리 헤더 · 유리 버튼 44Rule• (10/8, #1120, 57275641·33b34e0e) 앱 헤더 유리를 그라데이션 유리층(::before, 흐림 --ds-app-header-blur 4px)으로 개편 — 메신저 대화방·AI 화면은 대화 목록이 헤더 뒤까지 올라감
• 뒤로 버튼 = 유리 원, 오른쪽 액션 = 아이콘 유리 캡슐(.ds-app-header__glass). 유리 버튼 36 → 44(--ds-app-header-btn 단일 토큰이 유리 원·캡슐 높이·대화방 검색칸 높이·아바타를 함께 결정), 캡슐 안 아이콘 md→lg(36·글리프 24), 아바타 이니셜 b4→b3
• 알림벨 드롭다운 모드는 캡슐 밖(backdrop-filter가 fixed 기준점을 바꿔 어긋나는 것 방지, b24278c4) — 직원 앱의 화면 이동형 벨은 캡슐 안 유지
DS app-header · [[HBEA300_메신저]] ㄴ44신설 (#1120) · 모바일 전용 — 데스크톱 웹 실사 한계로 커밋 근거(TBU: 모바일 실측)
20하단 탭바Tab• 근무/메신저/결재/더보기 4탭을 전환하는 하단 네비게이션. 활성 탭 하이라이트
• 클릭 → 해당 탭 화면 전환
• 분리형 캡슐 내비 전환(10/7, #1035, 796e116c) — AI를 켠 병원은 탭 4개를 반투명 흐림 캡슐로 띄운 분리형으로 표시(선택 탭 neutral-700 + neutral-75 바탕, 아이콘 20 · 라벨 12, 화면 설정과 무관하게 「기본」 크기 고정, 아래 그라데이션)
 - CASE01 [AI 켠 병원]: 분리형 캡슐 탭 + 오른쪽 AI 버튼(ㄴ22)
 - CASE02 [AI 끈 병원]: 예전 한 줄 탭바 그대로
4탭 · 분리형 전환 (#1035) · 라이브 실사 확인(2026-10-08 낮, 웹 /employee-app·AI 켠 okbest): body app-nav-split·.ds-bottom-nav--split 분리형 캡슐 + 4탭(근무/메신저/결재/더보기) + 오른쪽 AI 원형 버튼(aria "AI 어시스턴트 열기") 실증 — CASE01 확인 · 실기기 체감(흐림·크기 고정)은 TBU
ㄴ22AI 어시스턴트 버튼 (하단 내비)Button• (신설 10/7, #1035, 796e116c) 하단 내비 오른쪽에 아이콘만 있는 「AI 어시스턴트」 원형 버튼(BI 패밀리 그라디언트)
• 클릭 → AI 어시스턴트 화면: 첫 화면 = BI + "어떤 도움이 필요하세요?" + 업무 바로가기(lightor 버튼, AI를 거치지 않고 기존 화면을 염). 입력 중에는 AI 없이 메뉴를 맞춰 입력줄 위 팝오버로 표시(준비 중 메뉴는 "준비 중"), 예시 질문은 첫 질문 전 입력칸 포커스 때만. 입력줄 = 선 없는 캡슐(포커스 5줄까지, 빠지면 한 줄 말줄임), 제목·이전 대화는 앱 헤더가 담당, 이전 대화 목록에서 뒤로 가면 대화 화면으로 복귀
• (10/8, #1083, 920aee91) AI 어시스턴트 화면이 오른쪽에서 밀려 들어옴(x-depth-page 전환 — 종전 빠져 있었음). 직원 앱 AI 화면에는 기능 안내(「기능 바로가기」·답변 속 「화면에서 위치 보기」) 미연결([[HBEA500_더보기]] ㄴ37-4)
• 더보기 목록의 AI 줄은 제거([[HBEA500_더보기]])
AI 어시스턴트 화면신설 (#1035) · AI 화면 상세 = 신규 채번 제안(HBEA600 가칭) · AI 안내문 프롬프트 employee-app-v3(#1035 49fd31c7) · 라이브 실사 확인(2026-10-08 낮, 웹): AI 버튼 → 화면 전환, 헤더 「뒤로」·「이전 대화」, 제목 "어떤 도움이 필요하세요?", 바로가기 5종 "남은 휴가 · 휴가 신청 · 내 신청 진행 · 근무 기록 · 외근 신청" + 「불편·기능 신고」, 입력줄 placeholder "예: 남은 휴가, 근무 기록, 외근 신청 방법", 하단 고지 원문 "답변은 참고용이에요. 신청·제출은 각 화면에서 직접 해요. 앱이 이상하면 불편·기능 신고로, 동료에게 연락은 메신저로 해요."
ㄴ23리퀴드 글라스 · 선택 유리Rule• (10/8, #1083, fd5bf280) 분리형 하단 캡슐 = 흰 66% + 뒤 흐림 20px + 유리 테두리(Apple HIG Materials regular). 선택된 탭 뒤에 「선택 유리」 한 장(.ds-bottom-nav__glow)이 뜸 — 종전 회색 바탕 즉시 교체·움직임 없음
• 누름 → 그 탭 0.96으로 눌리고 선택 유리 1.08로 부풂 · 누른 채 끌면 유리가 따라감 · 떼면 **450ms 스프링(넘침 약 6%)**으로 누른 탭까지 이동
• 위치는 offsetLeft 기준(하단 내비 화면 배율 zoom 1.2에서도 맞음). 흐림은 캡슐 한 겹만(저사양 안드로이드 스크롤 끊김 방지)
 - CASE01 [모션 줄이기 · 투명도 줄이기 접근성 설정]: 설정을 따름
BottomNav · .ds-bottom-nav--split신설 (#1083) · 웹 DOM 실사(2026-10-08 낮): .ds-bottom-nav--split + 선택 유리 .ds-bottom-nav__glow 요소 실재 확인 · TBU: 실기기 체감(흐림·스프링·끌기)
ㄴ24하단 탭 재탭 = 맨 위로Behavior• (10/8, #1083, 920aee91) 이미 선택된 하단 탭을 한 번 더 누르면 그 화면이 맨 위로 스크롤20 하단 탭바신설 (#1083)
ㄴ21메신저 미읽음 배지Badge• 메신저 탭 미읽음 카운트 배지("메신저 0"), 0 시 hide
• 공지 진입은 메신저 > "대화" 상단 "공지 n" 섹션 경유
ConversationMember.unreadCount · [[HBEA300_메신저]]
25하단 고정 배너 (새 버전·버전 확인 실패)Banner• 앱 하단에 뜨는 업데이트 안내 배너 2종 — 본문 위·버튼 아래 상하 배치
 - 새 버전: "새 버전이 준비되었어요" + "버전 {n} · 앱을 재시작하여 적용하세요" · 〔나중에〕/〔재시작〕(적용 실패 시 "업데이트를 적용하지 못했어요. 다시 시도해 주세요." + 〔다시 시도〕)
 - 버전 확인 실패: "지원 버전을 확인하지 못했어요. 네트워크 연결을 확인하고 다시 시도해 주세요." · 〔나중에〕/〔다시 확인〕
• 위치: CASE01 [하단 탭바 보임] 탭바 위 16px · CASE02 [탭바 숨김(로그인·상세 2depth 등)] 화면 바닥 16px(+ safe-area) — 좌우 여백과 같음
20 하단 탭바 · body.app-has-bottom-nav위치 변경 (코드 반영: cc823348·3454d65f, #1011) · 구버전은 고정값(bottom-24)이 로그인 버튼을 덮음 · 문구는 기존 그대로 · TBU: 라이브 실사 이월
26iOS 바닥 여백 · 상태 표시줄 색Rule• (10/8, #1083, 920aee91) iOS 앱(html.plt-ios): 하단 캡슐과 채팅 입력줄(메신저 대화방 · AI 어시스턴트)이 홈 인디케이터 바로 위 22px(인디케이터 영역 안으로 12px, iOS 26 탭바 위치)에 붙음 — 종전 「8px + 34px」에 화면 배율까지 곱해져 50px 가까이 비었음. 바닥 여백 변수 --ds-bottom-nav-bottom-gap
 - CASE01 [안드로이드]: 기존 값 유지(3버튼 내비 바가 불투명해 겹치면 가려짐), 배율로 부풀던 것만 보정
• 상태 표시줄 색: 화면 맨 위 불투명 면 색(셸 회색 · 흰 면)을 읽어 body 배경 · theme-color · 안드로이드 StatusBar에 넣음(utils/status-bar-surface.ts) — 종전 고정 브랜드 주황 theme-color 제거
20 하단 탭바 · [[HBEA300_메신저]] 입력줄신설 (#1083) · TBU: 실기기에서 상태 표시줄과 앱 배경 이어짐(스크린샷 불가 영역)
30알림 패널Panel헤더 "알림 (3)" + "모두 읽음" + 알림 항목 리스트NotificationTBU: 패널 오버레이/풀페이지 형태
ㄴ31알림 헤더Text"알림 (n)" — n = 미읽음 카운트원문 카피
ㄴ32모두 읽음Button• 알림 전체를 일괄 읽음 처리하는 기능
• 클릭 → 즉시 실행(컨펌 없음), 성공: 전체 읽음 처리·미읽음 카운트 0
• (10/13, 6f8d869) 위치 변경: 본문 위 줄 → 헤더 오른쪽 글자 버튼, 안 읽은 알림이 있을 때만 노출
Notification.isRead=trueTBU: 실패 토스트 UI · 위치 변경 라이브 실사(미읽음 0건이라 미노출)
ㄴ33알림 항목ListItem• 개별 알림 항목({제목}/{본문}/{타임스탬프 "2026. 07. 26." (날짜만·점표기, 시각 없음 — 2026-08-18 정정)})을 표시하고 해당 화면으로 딥링크하는 요소
• 클릭 → 읽음 처리(즉시·낙관적) + 알림 유형별 화면 이동. 이동이 먼저, 읽음 처리는 뒤(서버 왕복 대기 없음)
 - CASE01 [목적지 있는 유형]: 해당 화면으로 이동하며 알림 화면은 닫힘
 - CASE02 [목적지 없는 유형]: 컨펌 다이얼로그 "{앱이름}에서 확인해 주세요."(제목 「확인」·확인 버튼 1개, 앱이름 볼드) + 읽음 처리, 화면 유지(ㄴ33-2·ㄴ33-3 참조)
Notification · [[HBEA400_결재]] · [[HBEA300_메신저]]2026-08-18 구현
ㄴ33-2ㄴ 알림 유형별 목적지-• leave_request → 결재 > "휴가신청" / overtime·offsite_work → 결재 > "근무" / incentive → 결재 > "인센티브" / document·certificate → 결재 > "서류관리" / 대화 알림 → 메신저(해당 대화방)
• (10/8, #1075·#1076) 메신저 답글 · @멘션 알림(NotificationType.MESSAGE, referenceType conversation) → 메신저 해당 대화방 — "{이름}님이 회원님의 메시지에 답글을 남겼습니다" · "{이름}님이 회원님을 언급했습니다" · "{이름}님이 전체를 언급했습니다"([[HBEA300_메신저]] ㄴ39 · ㄴ40)
resolveNotificationTarget(@hereby/core/constants)표를 늘릴 때 이 행도 함께 갱신
ㄴ33-3ㄴ 이동 없는 유형 → 안내 앱-• 직원 앱에 화면이 없는 알림은 이동 대신 안내 다이얼로그를 띄우고, 문구의 앱 이름은 워크스페이스 전환기 표기를 따른다
• "급여관리": memo(급여 시트 셀 메모) · allowance · deduction · education · system+grade_promotion(호봉 승급)
• "관리자": permission_request · general(주당 근무시간 초과)
• "내부 결재": system+work_type_change(근무형태 변경)
resolveNotificationAppLabel(@hereby/core/constants)새 알림 타입은 이동/안내 중 하나를 반드시 가진다(core 단위 테스트가 강제)
ㄴ33-Eㄴ 알림 EmptyText알림 0건 Empty 문구 표시NotificationTBU: Empty 원문 미확보
ㄴ34ㄴ 알림 유형 (관찰)-"휴가 신청 접수"("{유형} 1일 신청이 접수되었습니다") / "접근 권한 요청"("안세희님이 권한을 요청했습니다 (admin): test")휴가 = LeaveRequest / 권한요청 = Admin 권한 흐름원문 2종 카피
ㄴ35안드로이드 백버튼 — 알림 화면Rule• 알림 2depth 화면이 app-back-button을 화면 맨 위층(캡처 단계)에서 먼저 받아 한 층만 물러나고 전파를 끊는다
 - CASE01 [알림 화면 열림 + 백]: 알림 화면 닫기(앱은 유지)
 - 구버전: 리스너가 없어 홈 탭에서 백을 누르면 앱 종료 확인이 떴음(QA 2026-09-22)
app-back-button · 30 알림 패널신설 (코드 반영: 4b363ff, #849) · TBU: 라이브 실사 이월
40안드로이드 백버튼 — 불편·오류 신고 팝업Rule• 불편·오류 신고 팝업도 백버튼을 맨 위층에서 먼저 받아 한 층만 물러난다
 - CASE01 [신고 상세]: 「내역」으로 뒤로
 - CASE02 [내역 · 작성]: 팝업 닫기
 - CASE03 [전송 중]: 백 무시
 - 구버전: 홈 탭에서 앱 종료 확인이 떴음(QA 2026-09-22)
app-back-button · CS 리포트 위젯([[HBAD100_App Shell·사이드바]] ㄴ10-1)신설 (코드 반영: 4b363ff, #849) · TBU: 라이브 실사 이월
41iOS 왼쪽 가장자리 스와이프 = 뒤로Gesture• (10/8, #1083, 920aee91·28b87a1c) iPhone 앱에서 화면 왼쪽 끝 20px에서 오른쪽으로 밀면 화면 맨 위에 실제로 보이는 뒤로(<) 버튼을 누른 것과 같음(utils/edge-swipe-back.ts). 화면이 손가락을 따라오고, 화면 폭 35% 이상이거나 빠르게 튕기면 뒤로 감(2depth 퇴장 슬라이드가 밀어 둔 위치에서 이어짐). 햅틱 없음
• 대상: 뒤로 버튼(data-edge-swipe-back 표식)만 — 모양만 <인 「이전 달 · 이전 해」 버튼은 대상 아님
 - CASE01 [X로 닫는 풀레이어 팝업(휴가 신청 등 9종)]: 동작 안 함
 - CASE02 [헤더가 <인 급여명세서 본인 확인 팝업]: 동작
 - CASE03 [안드로이드 · Safari 웹]: 켜지 않음(시스템 뒤로 제스처 · 브라우저 스와이프와 겹침)
• 세로 스크롤 막는 리스너는 2depth가 열려 있을 때만 붙음(탭 첫 화면 긴 목록 스크롤 영향 없음, 28b87a1c)
edge-swipe-back · x-depth-page신설 (#1083) · TBU: 실기기(급여명세서 · 근무 기록 스와이프, 휴가 신청 미동작)
50화면 캡처 제한 (민감 화면)Rule• (10/8, #1090 ef18fa36 · #1093 bd9bde77) 관리자 「설정」 직원 앱 구역 「화면 캡처 제한」(organization settings.screenCaptureProtection, 키 없음 = 켬, 명시적 false만 꺼짐)이 켜져 있으면 네이티브 직원 앱(iOS · Android)의 급여명세서 · 내 정보 · 메신저에서 스크린샷 · 화면 녹화 · 미러링 시 내용을 가림
 - 민감 화면 판정: 2depth 종류 payslips · my-info, 또는 메신저 섹션. 민감 화면을 벗어난 뒤 1초 동안 보호 유지(전환 프레임 노출 방지)
 - Android: 민감 · 유예 구간만 FLAG_SECURE, API 35+ 녹화 감지 시 오버레이 "화면 녹화가 감지되어 내용을 가렸어요." / iOS: 캡처 시 웹뷰 검게(secure canvas), 녹화 · 미러링 시 블러 오버레이(같은 문구)
 - 민감 화면에서 스크린샷이 찍히면 토스트 "화면이 캡처되었어요."(info)
• 설정 읽기: 로그인 후 1회 + 앱이 앞으로 돌아올 때마다(폴링 없음). 실패 시 이전 값 유지, 한 번도 못 읽었으면 켬으로 봄(fail-closed)
 - CASE01 [설정 꺼짐]: 보호 · 오버레이 · 토스트 모두 없음
 - CASE02 [웹 브라우저(4002)]: 가드 미기동, 종전과 동일
 - CASE03 [구 네이티브(플러그인 없음) + 최신 OTA]: 차단은 약해질 수 있으나 화면 막힘 없음
• #1093: #1090의 웹 전체 검은 안내막(screen-capture-protection-shield) 제거 — 메신저 · 급여 화면이 검게 가려져 사용 불가하던 현장 문제 해소. 차단은 네이티브만 담당
organization.getScreenCaptureProtection · ScreenCaptureGuard 플러그인 · [[HBEA300_메신저]] ㄴ43 · [[HBEA510_내 정보·근무 설정]] · [[HBEA530_급여명세서 모달]]신설 (#1090 · #1093) · 관리자 설정 화면은 HBAD 쪽 사양 · TBU: 실기기 가림 · 토스트 확인(실사 대기)
51안드로이드 시스템 바 인셋 · 키보드 여백Rule• (10/8, #1072, MED-940) 안드로이드 앱이 상태 바 · 내비 바를 피해 그려짐 — @capacitor/keyboard 8.0.2 → 8.0.6(구버전이 SystemBars 인셋 처리를 덮어써 WebView가 화면 전체를 차지, 입력줄 · 목록 아래쪽이 내비 바 아래로 들어갔음)
• 키보드 열림: 입력줄이 키보드 바로 위 — --kb-height = WebView가 조금이라도 줄었으면 0, 전혀 안 줄었으면 키보드 높이(utils/keyboard-offset.ts, 종전 48px 빈 띠 해소)
AI 어시스턴트 · [[HBEA300_메신저]] 입력줄신설 (#1072) · TBU: 실기기(3버튼 내비 삼성 등) 입력줄 위치

알림 채널·선호 보조표 ​

구성원천설명비고
이벤트NotificationEvent도메인 이벤트 → 알림 생성(type/action/title/message)
채널 선호NotificationPreferenceper-event / per-channel enabled 토글(in_app 등)라이브 상세 TBU
muteNotificationMuteSettingevent/target 단위 음소거 + expiresAtTBU
발송 이력NotificationDeliverychannel/status/isSeen/isRead/isDismissed 추적
푸시 토큰device_tokensplatform별 푸시 발송 대상

권한·상태 분기 요약 ​

시나리오트리거결과비고
CASE01 [미읽음 존재]알림 종 배지 표시 → 클릭알림 패널 열림, "알림 (n)"n>0
CASE02 [모두 읽음 실행]"모두 읽음" 클릭미읽음 카운트 0, 배지 hide컨펌 없음
CASE03 [프로필 클릭]상단 프로필 아바타 클릭더보기 화면 이동FIG 정책
CASE04 [항목 클릭 · 목적지 있음]알림 항목 클릭읽음 처리 + 해당 화면 이동(결재 탭까지 지정)2026-08-18 구현 · 라이브 확인
CASE05 [항목 클릭 · 목적지 없음]memo·permission_request·system 등 클릭컨펌 다이얼로그 "{앱이름}에서 확인해 주세요." + 읽음 처리, 화면 유지직원 앱에 대응 화면 없음
CASE06 [안드로이드 백버튼]알림 2depth 화면·불편·오류 신고 팝업에서 백한 층만 닫힘(앱 종료 확인 안 뜸)전송 중에는 무시 · 4b363ff, #849
CASE07 [iOS 가장자리 스와이프]2depth에서 왼쪽 끝 밀기보이는 뒤로(<) 버튼과 같이 뒤로X 팝업 · 안드로이드 · 웹 제외 · #1083
CASE08 [화면 캡처 제한 켬]급여명세서 · 내 정보 · 메신저에서 스크린샷캡처 내용 가림 + 토스트 "화면이 캡처되었어요."네이티브만 · #1090/#1093

Open Question ​

  • FIG 정책 fixed-header "알림 + 처리대기 통합" 표현 vs 라이브 관찰(알림 패널 "알림 (3)"·"모두 읽음"만 관찰, 처리대기 통합 UI 미관찰) — 통합 여부·처리대기 항목 소스 라이브 재확인 필요
  • FIG 정책상 알림 종 내 "설정" 진입점 — 라이브 미관찰, 노출 여부 TBU
  • 알림 항목 클릭 딥링크 = 2026-08-18 구현(ㄴ33·ㄴ33-2·ㄴ33-3). 잔여: 지금 안내 다이얼로그로 처리 중인 유형 중 직원 앱 화면을 새로 줄 것이 있는지 — 특히 allowance·deduction(수당·공제 승인)은 급여명세서가 후보지만 확정분만 노출돼 방금 승인된 건이 안 보임
  • 알림 Empty 상태 원문 문구 = TBU (미확보)
  • fixed header 요소 수: 정책 3요소 vs 라이브 4요소(종 배지 포함) 정합 = 확인 필요
  • 알림 카테고리/채널/mute 라이브 상세(per-event/per-channel/mute UI) = TBU
  • 메신저 배지 vs 알림 배지 집계 규칙 = TBU