[{"data":1,"prerenderedAt":2349},["ShallowReactive",2],{"doc:\u002Fhistory\u002Fhistory.20260520":3},{"id":4,"title":5,"body":6,"description":2310,"extension":2342,"meta":2343,"navigation":2344,"path":2345,"seo":2346,"stem":2347,"__hash__":2348},"docs\u002Fhistory\u002Fhistory.20260520.md","2026-05-20 — 발송 페이지 UX 폴리시 2차 + PUSH 부가항목·플로우 관리 완성",{"type":7,"value":8,"toc":2309},"minimark",[9,13,18,51,55,170,174,243,247,293,297,316,320,383,387,515,519,638,642,690,694,734,738,811,815,893,897,903,1003,1007,1016,1170,1174,1325,1329,1435,1439,1554,1558,1672,1676,1782,1786,1859,1863,1953,1956,1961,2025,2029,2104,2107,2190,2193,2273,2277],[10,11,5],"h1",{"id":12},"_2026-05-20-발송-페이지-ux-폴리시-2차-push-부가항목플로우-관리-완성",[14,15,17],"h2",{"id":16},"한-줄-요약","한 줄 요약",[19,20,21,22,26,27,30,31,34,35,38,39,42,43,46,47,50],"p",{},"§17(5\u002F19) 이후 발송 6채널 전반의 UX를 다듬고, PUSH 메시지 설정의 부가 항목(버튼·미디어·Android 미디어·iOS 미디어·Android 큰 아이콘·그룹)을 모두 실 동작 다이얼로그로 구현하고, 복합 플로우의 등록·수정·삭제·이름 클릭 편집까지 한 다이얼로그로 통합. 공용 컴포넌트(이메일 미리보기·다중 키 컬럼 수신자 위젯·중첩 모달 스크롤 잠금)도 다듬어 Cloudflare Pages에 배포 (#15). 이후 문구 정리(발송 옵션→발송 설정, 띄어쓰기, 푸터 이메일 오타)로 재배포 (#16), 5\u002F18 피벗 이후 누적분을 DESIGN\u002FFRONTEND\u002FSTACK\u002FCLAUDE·가이드 페이지에 현행화하여 재배포 (#17). 끝으로 FRONTEND\u002FDESIGN 문서에 남아 있던 stale 매핑(USlideover·구 ",[23,24,25],"code",{},"--gray-*"," 토큰 예시)을 코드 현실에 맞춰 정정하여 재배포 (#18). 이어서 발송 조회 페이지(",[23,28,29],{},"AppHistoryView",")의 목록 영역·검색 필터·다이얼로그를 캡처 기준으로 전면 재작업하고, ",[23,32,33],{},".btn-sky"," 레거시 클래스를 프로젝트 전역에서 제거(→",[23,36,37],{},".btn-primary",")하여 재배포 (#19). 이후 통계 페이지를 Chart.js로 재구성하고, ",[23,40,41],{},"zoom"," 전역 스케일을 폐기한 뒤 폰트 타입 스케일을 토큰화(",[23,44,45],{},"--fz-scale",")하여 +15% 적용, 재배포 (#20). 이어서 발송 6채널의 '템플릿 사용유무' 토글 동작을 개선 — 토글 시 수신자 목록을 항상 유지하고 메시지 설정만 stash\u002F복원하도록 ",[23,48,49],{},"useTemplateToggle"," composable로 통일, 재배포 (#21). 이어서 주소록 관리 페이지를 강화 — 등록·일괄등록·그룹이동 모달, 선택 발송 채널 드롭다운, 이름 클릭 수정, 페이지네이션·토큰 컬럼을 추가하여 재배포 (#22). 이어서 발신 정보·발신 번호 관리 페이지를 신규 구성하고, 개인정보 동의 → 등록 방식 선택 → 서류 인증\u002F휴대폰 본인인증 3단계 등록 마법사를 추가했으며, 누적 타입 에러 8건을 정리해 재배포 (#23). 이어서 그룹 관리 페이지를 신규 구성하고(그룹 등록·수정 모달, 행별 메시지 발송 채널 드롭다운, 검색·페이지네이션), 주소록·그룹 관리 툴바를 통일하여 재배포 (#24). 이어서 RCS 브랜드 관리 페이지를 신규 구성하고(RCS Biz Center 연동 흐름, 브랜드 목록 표, 하단 번호형 페이지바·새로고침), 발신 정보 리스트 페이지 구조를 통일하여 재배포 (#25). 끝으로 이메일 도메인 관리 페이지를 신규 구성하고(도메인 등록·DKIM 설정 모달), 재배포 (#26).",[14,52,54],{"id":53},"_1-수신자-입력-다이얼로그-일괄-강화","1. 수신자 입력 다이얼로그 일괄 강화",[56,57,58,94,129],"ul",{},[59,60,61,65],"li",{},[62,63,64],"strong",{},"AppRecipientFormDialog",[56,66,67,77,84,91],{},[59,68,69,72,73,76],{},[23,70,71],{},"keyColumn"," 단일 → ",[23,74,75],{},"keyColumns?: ('phone'|'email'|'token')[]"," 다중 지원. 단일 모드는 기존 검증 유지, 다중 모드는 \"최소 한 항목 + 입력된 항목 형식 검사\" 정책.",[59,78,79,80,83],{},"휴대폰은 하이픈 자동 포맷팅을 다시 제거하고 ",[62,81,82],{},"국내 11자리 숫자만 입력"," 으로 단순화(국가코드 칸도 폐기). 안내문 동일 갱신.",[59,85,86,87,90],{},"이메일 행에 정규식 형식 검증(",[23,88,89],{},"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$",").",[59,92,93],{},"\"(이름 없음)\" 폴백 등 UX 보정.",[59,95,96,99],{},[62,97,98],{},"AppRecipientCard",[56,100,101,115],{},[59,102,103,106,107,110,111,114],{},[23,104,105],{},"keyColumns?:"," prop 추가 → 표 헤더·셀이 N개 컬럼으로 확장 (",[23,108,109],{},"headOf"," \u002F ",[23,112,113],{},"valOf"," 도우미).",[59,116,117,120,121,124,125,128],{},[62,118,119],{},"별칭 클릭 → 수정 다이얼로그"," 오픈(",[23,122,123],{},"\u003Cbutton class=\"rcp-name-btn\">",", accent-ink + bold + hover underline). ",[23,126,127],{},"수신자 정보 수정"," 버튼은 6채널 모두에서 제거.",[59,130,131,134],{},[62,132,133],{},"AppAddressBookDialog",[56,135,136,145,151],{},[59,137,138,140,141,144],{},[23,139,105],{}," 동일 지원, valOf에 ",[23,142,143],{},"token"," 분기 추가.",[59,146,147,148,150],{},"개별 샘플 8명에 FCM\u002FAPNS 형태 ",[23,149,143],{}," 필드 부여 + 그룹 합성 수신자에도 토큰 포함 → PUSH 페이지 토큰 열 의미화.",[59,152,153,154,157,158,161,162,165,166,169],{},"행 클릭 시 체크박스 더블 토글로 체크가 누락되던 버그 수정: ",[23,155,156],{},"\u003Clabel class=\"checkbox\">"," → ",[23,159,160],{},"\u003Cspan class=\"checkbox\">","(라벨 포워딩 제거), input은 ",[23,163,164],{},"pointer-events: none"," + ",[23,167,168],{},"tabindex=\"-1\""," 표시 전용으로 분리.",[14,171,173],{"id":172},"_2-sms-발송-페이지","2. SMS 발송 페이지",[56,175,176,190,200,208,221,237],{},[59,177,178,181,182,185,186,189],{},[62,179,180],{},"AppSmsTemplateDialog",": 단순 리스트 → \"샘플 템플릿 선택\" 카드 그리드(검색 + 단문\u002F장문\u002F포토 탭 + 우측 미리보기). SMS 8종(봄 인사) + LMS 2종 + MMS 3종 시드. ",[23,183,184],{},"Tpl","에 ",[23,187,188],{},"images?"," 추가.",[59,191,192,195,196,199],{},[62,193,194],{},"MMS 템플릿 선택 시 자동 첨부 + 수정 불가",": ",[23,197,198],{},"attachLocked"," computed로 칩 회색 처리 + 자물쇠 아이콘 + \"(수정 불가)\" 안내, 삭제 ×·이미지 선택 버튼 숨김.",[59,201,202,195,205,207],{},[62,203,204],{},"AppPhonePreview",[23,206,188],{}," prop 추가 → 발송 페이지 미리보기에도 첨부 이미지가 그대로 표시(아이콘+파일명+KB 카드).",[59,209,210,213,214,165,217,220],{},[62,211,212],{},"이미지 첨부 실제 파일 픽커",": 숨김 ",[23,215,216],{},"\u003Cinput type=\"file\" accept=\".jpg,.jpeg,image\u002Fjpeg\" multiple>",[23,218,219],{},"onPickImages()"," 검증(JPG\u002FJPEG · 3장 · 1장 ≤300KB · 합산 ≤800KB).",[59,222,223,195,226,229,230,165,233,236],{},[62,224,225],{},"템플릿 사용유무 토글 시 페이지 내용 초기화",[23,227,228],{},"resetContent()"," 추출 + watcher(",[23,231,232],{},"flush: 'sync'",[23,234,235],{},"suppressTplReset"," 가드) → 전체 초기화 다이얼로그도 같은 함수를 재사용.",[59,238,239,242],{},[62,240,241],{},"광고용 자동 (광고) 접두 강제",": purpose \u002F subject 두 개 watcher가 idempotent하게 부착·해제.",[14,244,246],{"id":245},"_3-이메일-발송-페이지","3. 이메일 발송 페이지",[56,248,249,267,278,290],{},[59,250,251,254,255,258,259,262,263,266],{},[62,252,253],{},"공용 컴포넌트 추출",": 다이얼로그 미리보기와 발송 페이지 미리보기가 구조적으로 달랐던 문제를 ",[23,256,257],{},"AppEmailPreview","(제목·보낸사람·첨부·헤딩·본문 카드·버튼·HTML\u002F텍스트 토글)로 통합. ",[23,260,261],{},"EmailTpl","을 ",[23,264,265],{},"app\u002Ftypes\u002Ftemplate.ts","로 이동, 다이얼로그\u002F페이지 모두 같은 컴포넌트 사용.",[59,268,269,185,271,110,274,277],{},[23,270,261],{},[23,272,273],{},"heading",[23,275,276],{},"buttonLabel"," 까지 전달되어 페이지 미리보기에 즉시 반영.",[59,279,280,281,157,284,289],{},"미리보기 컬럼 너비 ",[23,282,283],{},"320px",[62,285,286],{},[23,287,288],{},"460px"," 확대.",[59,291,292],{},"광고용 자동 (광고) 접두 강제 동일 적용.",[14,294,296],{"id":295},"_4-알림톡-발송-페이지","4. 알림톡 발송 페이지",[56,298,299,306],{},[59,300,301,302,305],{},"수신자 카드 잠금 게이팅(",[23,303,304],{},":locked",") 제거 → 다른 채널과 동일 동작.",[59,307,308,309,311,312,315],{},"메시지 설정 카드도 ",[23,310,304],{}," 제거 + ",[23,313,314],{},"v-if=\"template\""," 게이팅 해제 → 템플릿 미선택 시에도 각 항목 표시 + 값 공란, 내용 textarea placeholder 안내.",[14,317,319],{"id":318},"_5-rcs-발송-페이지","5. RCS 발송 페이지",[56,321,322,349,364,374],{},[59,323,324,325],{},"발송 유형 셀렉트 옵션 캡처 반영\n",[56,326,327,338],{},[59,328,329,330,157,333],{},"2번째: ",[23,331,332],{},"스탠드얼론 \u002F 템플릿",[62,334,335],{},[23,336,337],{},"스탠드얼론 \u002F 대화형",[59,339,340,341,157,344],{},"3번째: ",[23,342,343],{},"SMS \u002F LMS \u002F 대체 없음",[62,345,346],{},[23,347,348],{},"SMS \u002F 통합 SMS",[59,350,351,352,157,355,360,361,90],{},"수신 대기 만료 기한: ",[23,353,354],{},"1시간\u002F6시간\u002F24시간\u002F3일",[62,356,357],{},[23,358,359],{},"40초\u002F3분\u002F1시간\u002F24시간"," (기본 ",[23,362,363],{},"24h",[59,365,366,369,370,373],{},[23,367,368],{},"RcsTpl"," 공용 타입 + 9개 비디오팩 템플릿에 발송 목적·유형 3종·내용·이미지·버튼·만료 기한 시드 → 템플릿 선택 시 ",[62,371,372],{},"메시지 설정 자동 채움",".",[59,375,376,377,110,379,382],{},"템플릿 사용유무 토글 → SMS와 동일한 ",[23,378,228],{},[23,380,381],{},"handleReset()"," \u002F suppress watcher 패턴.",[14,384,386],{"id":385},"_6-push-발송-페이지-부가-항목-완성","6. PUSH 발송 페이지 — 부가 항목 완성",[56,388,389,406,431,505,508],{},[59,390,391,195,394,397,398,401,402,405],{},[62,392,393],{},"AppPushPreview",[23,395,396],{},"platform: 'android'|'ios'"," prop 추가 → 두 디바이스를 별도 잠금화면 레이아웃으로 렌더(상태바\u002F시계\u002F날짜\u002F알림 카드\u002F하단 버튼). 콘텐츠(",[23,399,400],{},"title","\u002F",[23,403,404],{},"body",")는 항상 동일 바인딩.",[59,407,408,411,412,415,416,419,420,423,424,426,427,430],{},[62,409,410],{},"AppPushRecipientDialog","(수신자 직접 입력): 타이틀 \"수신자 직접 입력\" \u002F \"수신자 수정\", ",[62,413,414],{},"별칭"," 단일 입력 + 토큰 다중 추가(푸시 유형 7종 셀렉트). 수정 모드에서는 ",[23,417,418],{},"+ 추가","·푸시 유형 뱃지·× 삭제 모두 숨김. 데이터: ",[23,421,422],{},"name","=별칭, ",[23,425,143],{},"=토큰, ",[23,428,429],{},"vars.pushType","=유형.",[59,432,433,434,437,438],{},"메시지 설정 부가 항목 전용 다이얼로그 6종(공용 ",[23,435,436],{},"AppPushMediaDialog","를 prop으로 분기):\n",[56,439,440,450,496],{},[59,441,442,445,446,449],{},[62,443,444],{},"AppPushButtonDialog",": 유형 4종(응답\u002F앱 열기\u002FURL 열기\u002F닫기). 칩 = ",[23,447,448],{},"유형 ✏ ×","(연필 클릭 시 수정 다이얼로그 재오픈)",[59,451,452,454,455,110,457,110,460,110,463,466,467],{},[62,453,436],{}," (재사용): ",[23,456,400],{},[23,458,459],{},"showType",[23,461,462],{},"showExpand",[23,464,465],{},"types"," prop으로 다음 4행을 한 컴포넌트로 처리\n",[56,468,469,478,484,490],{},[59,470,471,474,475],{},[62,472,473],{},"미디어",": URL · 유형 4종 · 펼치기 (사용\u002F사용 안함). 칩 ",[23,476,477],{},"유형 · URL ×",[59,479,480,483],{},[62,481,482],{},"Android 미디어",": URL · 유형(이미지만) · 펼치기 → 단일 옵션 자동 선택",[59,485,486,489],{},[62,487,488],{},"iOS 미디어",": URL · 유형 4종 (펼치기 없음)",[59,491,492,495],{},[62,493,494],{},"Android 큰 아이콘",": URL만 (유형\u002F펼치기 없음), 타이틀 \"Android 큰 아이콘\"",[59,497,498,501,502],{},[62,499,500],{},"AppPushGroupDialog",": 키 + 설명. 칩 ",[23,503,504],{},"key ✏ ×",[59,506,507],{},"광고용 자동 (광고) 접두 강제(pushType + title)",[59,509,510,511,514],{},"주소록 다이얼로그를 ",[23,512,513],{},"key-column=\"token\"","으로 전환 → 토큰 컬럼 노출",[14,516,518],{"id":517},"_7-복합-플로우-페이지-등록수정관리-통합","7. 복합 플로우 페이지 — 등록\u002F수정\u002F관리 통합",[56,520,521,536,558,568,582,588],{},[59,522,523,524,527,528,531,532,535],{},"초기 로드 시 ",[62,525,526],{},"플로우 미선택"," 상태로 시작. select에 placeholder ",[23,529,530],{},"\u003Coption value=\"\">플로우를 선택하세요\u003C\u002Foption>"," 추가, 메시지 설정 각 항목은 표시·값 공란, 발신\u002F제목\u002F내용 disabled, 발송 버튼 ",[23,533,534],{},"!selectedFlow"," 시 비활성.",[59,537,538,539,542,543,546,547,550,551,262,554,557],{},"수신자 설정도 다른 채널과 동일하게 빈 상태 시작 — ",[23,540,541],{},"varKeys"," computed로 노드 본문에서 ",[23,544,545],{},"#{...}"," 동적 수집, ",[23,548,549],{},":show-vars","·",[23,552,553],{},":show-substitution",[23,555,556],{},"varKeys.length > 0","으로 게이팅. 플로우 전환 시 recipients\u002FselectedRcpt\u002FcommonVars\u002FsubstitutionMode 초기화.",[59,559,560,563,564,567],{},[62,561,562],{},"수신자 휴대폰 + 이메일 동시 입력 + 표 동시 표시"," — ",[23,565,566],{},":key-columns=\"['phone', 'email']\"","(card\u002Fdialog\u002Faddress book 모두).",[59,569,570,573,574,577,578,581],{},[62,571,572],{},"AppFlowCreateDialog",": 등록·수정 겸용 (",[23,575,576],{},"edit?: FlowDraft | null"," prop \u002F ",[23,579,580],{},"isEdit"," computed로 타이틀·확인 버튼 라벨 분기). 폼 카드 2개(\"플로우 발송 정보\" + \"플로우 설정\"), 채널 옵션 4종(SMS\u002F알림톡\u002F이메일\u002FPUSH) + 채널 변경 시 템플릿 자동 비움 + HTML5 드래그 앤 드롭 순서 변경 + 첫 행 채널 미선택은 placeholder.",[59,583,584,587],{},[62,585,586],{},"AppFlowTemplatePickerDialog","(신규): \"선택\" 버튼 → 채널별 템플릿 라디오 선택(검색 + 커스텀 라디오). 채널별 목업 템플릿(SMS 3·알림톡 3·이메일 1·PUSH 1).",[59,589,590,593,594,597,598,550,601,550,604,607,608,550,611,614,615,618,619,165,622,625,626,629,630,633,634,637],{},[62,591,592],{},"AppFlowManageDialog"," 리팩토링: ",[23,595,596],{},"Flow"," 인터페이스를 raw(",[23,599,600],{},"purpose",[23,602,603],{},"mode",[23,605,606],{},"channels: { id, ch, template }[]",")로 정규화, 표시는 ",[23,609,610],{},"purposeLabel",[23,612,613],{},"channelsLabel"," 도우미. ",[23,616,617],{},"openCreate"," 단일 상태 → ",[23,620,621],{},"openFlowDialog",[23,623,624],{},"editingFlow: FlowDraft | null"," 공용. ",[62,627,628],{},"플로우 이름 클릭 → 수정 다이얼로그",", 별도 \"플로우 수정\" 버튼은 제거. \"플로우 생성\" → ",[62,631,632],{},"\"플로우 등록\"",", \"플로우 생성 관리\" → ",[62,635,636],{},"\"플로우 관리\""," 라벨\u002F타이틀 통일.",[14,639,641],{"id":640},"_8-appmodal-스크롤-잠금-견고화","8. AppModal — 스크롤 잠금 견고화",[56,643,644,647,679],{},[59,645,646],{},"모달 열 때 본 페이지가 맨 위로 튀던 문제, 그리고 살짝 위로 어긋나던 잔여 문제까지 해결.",[59,648,649,652,653,656,657,660,661,664,665,668,669,262,672,675,676,678],{},[62,650,651],{},"scrollLock 공용 유틸"," ",[23,654,655],{},"app\u002Futils\u002FscrollLock.ts"," 신설: 모듈 수준 카운터 + ",[23,658,659],{},"savedY","로 ",[62,662,663],{},"중첩 모달","에서도 최초 잠금만 body 변경, 마지막 해제 시에만 복원. ",[23,666,667],{},"html { zoom: var(--ui-scale) }"," 보정 — ",[23,670,671],{},"body.top",[23,673,674],{},"savedY \u002F zoom","으로 나눠 실제 시각 오프셋이 정확히 ",[23,677,659],{},"가 되도록 함.",[59,680,681,682,685,686,689],{},"AppModal은 인스턴스별 ",[23,683,684],{},"locked"," 가드로 중복 lock\u002Funlock을 방지하고, ",[23,687,688],{},"onBeforeUnmount","에서도 안전 해제.",[14,691,693],{"id":692},"_9-배포커밋이력","9. 배포·커밋·이력",[56,695,696,705,720,731],{},[59,697,698,157,701,704],{},[23,699,700],{},"pnpm build",[23,702,703],{},"npx -y wrangler@4 pages deploy dist --project-name=malgn-noti --branch=main --commit-dirty=true --commit-message \"send-page UX polish 2nd batch + PUSH extension dialogs + flow mgmt\""," 1회 (배포 #15)",[59,706,707,708,711,712,715,716,719],{},"프로덕션 검증: ",[23,709,710],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fsend\u002Fpush"," 200, ",[23,713,714],{},"\u002Fsend\u002Fflow"," 200, alias ",[23,717,718],{},"https:\u002F\u002Fc4b53baf.malgn-noti.pages.dev\u002Fsend\u002Fpush"," 200",[59,721,722,723,726,727,730],{},"커밋: ",[23,724,725],{},"bd7e07e 발송 페이지 UX 폴리시 2차 + PUSH 부가항목·플로우 관리 완성"," (25 files changed, 2355+\u002F447-) → ",[23,728,729],{},"origin\u002Fmain"," 푸시",[59,732,733],{},"Cloudflare Pages 자동 배포가 추가로 트리거되었을 수 있음(working tree 기준 wrangler 직접 배포본이 라이브)",[14,735,737],{"id":736},"_10-문구-정리-재배포-10-배포-16","10. 문구 정리 + 재배포 (§10, 배포 #16)",[56,739,740,749,768,780,793,802],{},[59,741,742,195,745,748],{},[62,743,744],{},"발송 옵션 → 발송 설정",[23,746,747],{},"AppSendOptionsCard"," 카드 타이틀 변경 → 6채널 공용 컴포넌트라 한 곳 수정으로 전 발송 페이지 반영.",[59,750,751,195,754,157,757,760,761,157,764,767],{},[62,752,753],{},"띄어쓰기 교정",[23,755,756],{},"사용 안함",[23,758,759],{},"사용 안 함","(템플릿 사용유무·HTML 스타일 라디오, 5곳), ",[23,762,763],{},"직접입력",[23,765,766],{},"직접 입력","(AppRecipientCard·AppRecipientActions·DESIGN.md).",[59,769,770,195,773,157,776,779],{},[62,771,772],{},"푸터 이메일 오타",[23,774,775],{},"massage@malgnsoft.com",[23,777,778],{},"message@malgnsoft.com"," (AppFooter).",[59,781,782,783,157,785,788,789,792],{},"배포: ",[23,784,700],{},[23,786,787],{},"wrangler pages deploy"," (",[23,790,791],{},"--commit-message \"wording fixes: send option label, spacing, footer email typo\"",") — 배포 #16.",[59,794,707,795,715,798,801],{},[23,796,797],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fsend\u002Fsms",[23,799,800],{},"https:\u002F\u002Fe22f7472.malgn-noti.pages.dev\u002Fsend\u002Fsms"," 200.",[59,803,722,804,807,808,810],{},[23,805,806],{},"704a1b4 문구 정리: 발송 설정 라벨 변경 + 띄어쓰기 + 푸터 이메일 오타"," (10 files, +12 −12) → ",[23,809,729],{}," 푸시.",[14,812,814],{"id":813},"_11-문서디자인-가이드-현행화-재배포-11-배포-17","11. 문서·디자인 가이드 현행화 + 재배포 (§11, 배포 #17)",[56,816,817,820,830,847,853,863,869,885],{},[59,818,819],{},"5\u002F18 디자인 피벗 이후 누적된 변경을 문서에 반영.",[59,821,822,825,826,829],{},[62,823,824],{},"DESIGN.md",": §0 적용 현황(Phase 1·2 완료), §6 \"Phase 2 재작업 예정\" 제거, §12 발송 아키텍처를 ",[62,827,828],{},"5-카드 → 3+1 카드 골격","(템플릿 선택\u002F수신자 설정\u002F메시지 설정\u002F발송 설정)으로 재작성, §12.3 핵심 컴포넌트 목록 전면 갱신, §14에 5\u002F19·5\u002F20 이력 추가.",[59,831,832,835,836,839,840,550,843,846],{},[62,833,834],{},"FRONTEND.md",": 디자인 정본을 DESIGN.md로 명시, §3 디자인 시스템을 ink\u002Faccent 토큰·1400px·",[23,837,838],{},"zoom 1.15"," 기준으로 전면 재작성(구 indigo\u002FNoto Sans KR\u002F1200px 폐기), §9.1 GNB를 56px·7개 메뉴로 정정, §12의 시안 base.css 섹션 카탈로그 폐기 → ",[23,841,842],{},"\u002Fguide",[23,844,845],{},"main.css"," 안내.",[59,848,849,852],{},[62,850,851],{},"STACK.md",": 폰트 행을 Inter\u002FJetBrains Mono\u002FPretendard로 갱신.",[59,854,855,858,859,862],{},[62,856,857],{},"CLAUDE.md",": §4 UI 패턴을 실제 ",[23,860,861],{},"AppModal"," 기반 공용 컴포넌트로 정정(USlideover·존재하지 않는 컴포넌트 제거), §7 \"(계획)\" 표기 삭제, §8 네이밍 예시 실존 컴포넌트로 교체, §2 pnpm 확정, §10 TODO 정리.",[59,864,865,868],{},[62,866,867],{},"guide.vue",": §16 \"5-카드 골격\" → \"발송 카드 골격\" 섹션을 실제 3+1 카드 구조·매트릭스로 갱신.",[59,870,871,872,788,874,877,878,881,882,801],{},"배포 #17: ",[23,873,787],{},[23,875,876],{},"--commit-message \"docs sync: ...\"","), 프로덕션 ",[23,879,880],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fguide"," 200 \u002F alias ",[23,883,884],{},"https:\u002F\u002Fc9760142.malgn-noti.pages.dev",[59,886,722,887,890,891,810],{},[23,888,889],{},"75ab98c 문서·디자인 가이드 현행화 (2026-05-18~20 반영)"," (5 files, +114 −140) → ",[23,892,729],{},[14,894,896],{"id":895},"_12-문서-stale-매핑-정정-재배포-12-배포-18","12. 문서 stale 매핑 정정 + 재배포 (§12, 배포 #18)",[19,898,899,902],{},[23,900,901],{},"doc\u002F"," 문서 일독 검수에서 5\u002F18 피벗 이후에도 갱신되지 않은 매핑 2건을 발견해 코드 현실에 맞춰 정정.",[56,904,905,929,958,965,974,985,993],{},[59,906,907,910,911,914,915,917,918,921,922,924,925,928],{},[62,908,909],{},"USlideover 매핑 불일치",": FRONTEND.md §7과 DESIGN.md §6.4가 패널형 팝업·상세\u002F편집을 ",[23,912,913],{},"USlideover","로 매핑했으나, 실제로는 모든 팝업이 자체 ",[23,916,861],{}," 기반 ",[23,919,920],{},"App*Dialog","이고 ",[23,923,913],{},"는 ",[23,926,927],{},"AppGnb.vue","의 모바일 GNB 드로어 전용. CLAUDE.md §4(\"USlideover 사용하지 않음\")와 어긋나 정정.",[59,930,931,937,938,940,941,943,944,401,947,950,951,401,954,957],{},[62,932,933,934,936],{},"구 ",[23,935,25],{}," 토큰 예시",": FRONTEND.md §5.1·§5.2의 자체 CSS 예시가 폐기된 ",[23,939,25],{}," 별칭·시안 base.css 1:1 차용을 권장. ",[23,942,25],{},"는 main.css에 backward-compat용으로만 남아 있고 신규 코드는 ",[23,945,946],{},"--ink-*",[23,948,949],{},"--line"," 직접 사용이 정본 → §5.2를 \"디자인 토큰 사용\"으로 재작성, AppGnb 예시도 ",[23,952,953],{},"var(--white)",[23,955,956],{},"var(--line)","로 교체.",[59,959,960,961,964],{},"검증: ",[23,962,963],{},"history.20260520.md","는 잘리지 않은 완전한 파일임을 확인(142줄 정상 종료) — Read 출력 끝 혼동이었음.",[59,966,967,968,788,970,973],{},"빌드 → ",[23,969,787],{},[23,971,972],{},"--commit-message \"docs sync: fix stale USlideover mapping and gray token examples\"",") — 배포 #18.",[59,975,707,976,550,979,715,981,984],{},[23,977,978],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fhome",[23,980,842],{},[23,982,983],{},"https:\u002F\u002F3f68045a.malgn-noti.pages.dev\u002Fhome"," 200. (문서만 변경이라 라이브 산출물은 #17과 동일.)",[59,986,722,987,990,991,810],{},[23,988,989],{},"f81424b 문서 정정: USlideover 매핑·구 토큰 예시 현행화"," (2 files, +11 −9) → ",[23,992,729],{},[59,994,995,996,999,1000,373],{},"변경 파일: ",[23,997,998],{},"doc\u002FFRONTEND.md",", ",[23,1001,1002],{},"doc\u002FDESIGN.md",[14,1004,1006],{"id":1005},"_13-발송-조회-페이지-전면-재작업-btn-sky-제거-13-배포-19","13. 발송 조회 페이지 전면 재작업 + btn-sky 제거 (§13, 배포 #19)",[19,1008,1009,1010,563,1012,1015],{},"사용자 제공 캡처 기준으로 발송 조회(",[23,1011,29],{},[23,1013,1014],{},"\u002Fhistory\u002F{sms,rcs,kakao,email,push}"," 5채널 공용)의 목록 영역·검색 필터·다이얼로그를 단계적으로 재작업.",[56,1017,1018,1032,1042,1056,1085,1108,1139,1147,1162],{},[59,1019,1020,1023,1024,1027,1028,1031],{},[62,1021,1022],{},"목록 영역 재구성",": 컬럼을 ",[23,1025,1026],{},"메시지 아이디 \u002F 메시지 채널 \u002F 요청 일시 \u002F 발송 시점 \u002F 발신 정보 \u002F 발송 상태 \u002F 발송 목적 \u002F 수신자 정보 \u002F 수신 상태","로 교체. 카드 상단 툴바(선택 취소·일괄 취소·조회 필드 추가 설정·검색 결과 다운로드 요청·다운로드 요청 목록·총 N건), 카드 하단 페이지네이션(",[23,1029,1030],{},"«‹ 1…N ›»","). 목업 데이터·생성기 신규.",[59,1033,1034,1037,1038,1041],{},[62,1035,1036],{},"조회 필드 추가 설정",": 체크박스 다중선택 드롭다운(바깥클릭\u002FEsc 닫힘). 체크 시 ",[23,1039,1040],{},"예약\u002F발송\u002F수신 일시·템플릿 이름·플로우 이름"," 컬럼이 발송 목적↔수신자 정보 사이에 동적 삽입.",[59,1043,1044,1047,1048,1051,1052,1055],{},[62,1045,1046],{},"검색 필터",": 시안 카드형 → 처음의 가로 바(",[23,1049,1050],{},".filter-bar",") 스타일로 회귀(사용자 피드백). 필드 라벨 제거 + 셀렉트 기본 옵션을 필드명으로 표시해 한 줄 배치. 발송 상태(9종)·발송 시점·수신 상태·발송 목적 셀렉트 + 요청 일시 날짜 범위 + 조회\u002F초기화. ",[23,1053,1054],{},"조회"," 클릭 시 적용(draft→applied). 메시지 채널 필터는 페이지 고정이라 UI 제외.",[59,1057,1058,1061,1062,1072,1073,1076,1077,1080,1081,1084],{},[62,1059,1060],{},"AppDateTimePicker",": 미사용 상태였던 컴포넌트를 정비해 요청 일시에 적용. ",[62,1063,1064,1067,1068,1071],{},[23,1065,1066],{},"html{zoom:1.15}","+",[23,1069,1070],{},"UPopover","(floating-ui JS 위치계산) 충돌로 팝오버가 어긋나던 문제","를 CSS ",[23,1074,1075],{},"position:absolute"," 앵커로 해결. 24시간제(시 00–23)·1분 단위(분 00–59), 시·분은 네이티브 ",[23,1078,1079],{},"\u003Cselect>","(텔레포트 회피), 트리거는 ",[23,1082,1083],{},".input"," 클래스로 셀렉트와 높이(36px) 정렬.",[59,1086,1087,1090,1091,1094,1095,550,1098,1100,1101,1103,1104,1107],{},[62,1088,1089],{},"다이얼로그 4종",": 다운로드 요청 확인 \u002F 다운로드 요청 목록(신규 ",[23,1092,1093],{},"AppExportListDialog",") \u002F 일괄 취소 \u002F 선택 취소 — 모두 ",[23,1096,1097],{},"AppConfirmDialog",[23,1099,861],{}," 기반. ",[23,1102,1097],{}," 본문에 ",[23,1105,1106],{},"white-space: pre-line"," 추가(2단락 메시지). 선택 취소·일괄 취소는 발송 대기·예약 건의 발송 취소 기능(선택 취소=체크 행 \u002F 일괄 취소=검색 결과 전체).",[59,1109,1110,1113,1114,1116,1117,1119,1120,1122,1123,1125,1126,1128,1129,1132,1133,1135,1136,1138],{},[62,1111,1112],{},"btn-sky 전역 제거",": 레거시 ",[23,1115,33],{},"(정의가 ",[23,1118,37],{},"와 동일)를 컴포넌트·페이지 21개에서 ",[23,1121,37],{},"로 교체, ",[23,1124,845],{},"의 ",[23,1127,33],{}," 정의·",[23,1130,1131],{},".modal-footer"," 오버라이드 삭제, ",[23,1134,867],{}," 카탈로그 중복 예시 제거, ",[23,1137,824],{}," §6.4 갱신. 시각 변화 없음(클래스명 통일).",[59,1140,967,1141,788,1143,1146],{},[23,1142,787],{},[23,1144,1145],{},"--commit-message \"history list area rebuild, search filter, dialogs, btn-sky cleanup\"",") — 배포 #19.",[59,1148,707,1149,550,1152,715,1155,711,1158,1161],{},[23,1150,1151],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fhistory\u002Fsms",[23,1153,1154],{},"\u002Fhome",[23,1156,1157],{},"https:\u002F\u002F77a6d8df.malgn-noti.pages.dev",[23,1159,1160],{},"fb-select"," 마커 확인.",[59,1163,722,1164,1167,1168,810],{},[23,1165,1166],{},"d0efe8c 발송 조회 페이지 목록·검색 필터·다이얼로그 전면 작업 + btn-sky 정리"," (28 files, +867 −191) → ",[23,1169,729],{},[14,1171,1173],{"id":1172},"_14-통계-페이지-재구성-폰트-토큰화-zoom-제거-14-배포-20","14. 통계 페이지 재구성 + 폰트 토큰화 + zoom 제거 (§14, 배포 #20)",[56,1175,1176,1205,1239,1275,1280,1298,1317],{},[59,1177,1178,1185,1186,1193,1194,550,1197,1200,1201,1204],{},[62,1179,1180,1181,1184],{},"통계 페이지(",[23,1182,1183],{},"history\u002Fstats.vue",") 전면 재구성",": 기존 KPI·스택바·도넛 → 검색 필터(한 줄 가로 바) + 차트 + 데이터 테이블 3-카드. ",[62,1187,1188,1189,1192],{},"Chart.js(",[23,1190,1191],{},"chart.js@4.5.1",") 도입"," — CLAUDE.md·STACK.md가 지정한 차트 라이브러리(\"예정\"→실도입). 7종 상태(요청·요청취소·발송·발송실패·수신·수신실패·실발송) 막대 그래프 + 합계 행 테이블, 차트·표가 단일 소스(",[23,1195,1196],{},"STAT_ROWS",[23,1198,1199],{},"SERIES",")에서 파생. 기간 프리셋(오늘\u002F최근 7·30일) 선택 시 날짜 자동 설정 + 역방향 동기화. 헤더는 발송 페이지와 동일한 ",[23,1202,1203],{},".page-header","로 통일.",[59,1206,1207,195,1212,1214,1215,1217,1218,1221,1222,1225,1226,1229,1230,1232,1233,1235,1236,1238],{},[62,1208,1209,1211],{},[23,1210,41],{}," 전역 스케일 폐기",[23,1213,667],{},"(1.15)가 좌표계 어긋남으로 팝오버(",[23,1216,1070],{},")·정렬 버그를 유발 → ",[23,1219,1220],{},"--ui-scale"," 토큰·",[23,1223,1224],{},"--container-max"," 보정 calc·",[23,1227,1228],{},"scrollLock","의 zoom 보정 모두 제거. 네이티브 100% 렌더로 전환. (",[23,1231,1060],{},"도 같은 원인이라 ",[23,1234,1070],{},"→CSS ",[23,1237,1075],{}," 앵커로 사전 수정.)",[59,1240,1241,1244,1245,1247,1248,1251,1252,1255,1256,1259,1260,1263,1264,401,1267,1270,1271,1274],{},[62,1242,1243],{},"폰트 타입 스케일 토큰화",": zoom 없이 전역 폰트 확대를 위해 ",[23,1246,45],{}," 단일 노브 + ",[23,1249,1250],{},"--fz-2xs~5xl"," 토큰 도입(",[23,1253,1254],{},"calc(기준px × --fz-scale)","). 하드코딩 ",[23,1257,1258],{},"font-size: Npx","·인라인 ",[23,1261,1262],{},"text-[Npx]"," 약 460곳을 ",[23,1265,1266],{},"var(--fz-*)",[23,1268,1269],{},"text-[length:var(--fz-*)]","로 일괄 치환(sed). ",[23,1272,1273],{},"--fz-scale: 1.15","로 전역 +15% 적용 — 이후 스케일 조정은 한 줄.",[59,1276,1277,1279],{},[62,1278,1060],{},": 미사용이던 컴포넌트를 정비해 요청 일시 날짜 범위에 적용(24시간제·1분 단위). 발송 조회·통계 필터 공용.",[59,1281,1282,1283,1286,1287,1290,1291,1294,1295,90],{},"잡정리: 발송 조회 페이지 ",[23,1284,1285],{},"CSV 다운로드"," 버튼 제거, ",[23,1288,1289],{},".table th"," 폰트 크기 상향(",[23,1292,1293],{},"--fz-2xs","→",[23,1296,1297],{},"--fz-sm",[59,1299,967,1300,1302,1303,550,1306,550,1309,715,1311,711,1314,1161],{},[23,1301,787],{}," — 배포 #20. 프로덕션 ",[23,1304,1305],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fhistory\u002Fstats",[23,1307,1308],{},"\u002Fhistory\u002Fsms",[23,1310,1154],{},[23,1312,1313],{},"https:\u002F\u002F95f36a35.malgn-noti.pages.dev",[23,1315,1316],{},"fz-scale",[59,1318,722,1319,1322,1323,810],{},[23,1320,1321],{},"6bc05c6 통계 페이지 재구성 + 폰트 토큰화 + zoom 스케일 제거"," (53 files, +664 −637) → ",[23,1324,729],{},[14,1326,1328],{"id":1327},"_15-발송-페이지-템플릿-토글-동작-개선-15-배포-21","15. 발송 페이지 템플릿 토글 동작 개선 (§15, 배포 #21)",[56,1330,1331,1343,1363,1376,1393,1406,1412,1427],{},[59,1332,1333,1338,1339,1342],{},[62,1334,1335,1337],{},[23,1336,49],{}," composable 신규",": 발송 페이지의 \"템플릿 사용유무\" 토글 동작을 한 곳에 정의. off→on(사용)은 현재 off 모드 메시지 설정을 스냅샷으로 보관하고 메시지+템플릿만 초기화, on→off(사용 안 함)는 템플릿을 해제하고 보관해 둔 off 모드 설정을 복원. ",[23,1340,1341],{},"setSilently","로 전체 초기화 시 watch 억제.",[59,1344,1345,1348,1349,1351,1352,401,1355,1358,1359,1362],{},[62,1346,1347],{},"수신자 목록 항상 유지",": 기존 sms·rcs는 토글 시 ",[23,1350,228],{},"로 수신자(",[23,1353,1354],{},"recipients",[23,1356,1357],{},"selectedRcpt",")까지 전부 날렸음 → ",[23,1360,1361],{},"resetMessage()","(메시지+템플릿만)로 분리. 수신자는 어느 페이지·어느 전환에서도 초기화하지 않음.",[59,1364,1365,195,1368,1371,1372,1375],{},[62,1366,1367],{},"치환자 표시\u002F숨김만",[23,1369,1370],{},"commonVars"," 값은 보존하고 표시 여부만 computed(",[23,1373,1374],{},"showSubst"," 등)가 제어. 템플릿으로 치환자가 추가되면 칸이 나타나고 빠지면 숨겨지되 값은 살아 있음.",[59,1377,1378,1381,1382,1384,1385,1388,1389,1392],{},[62,1379,1380],{},"email·push",": 토글 watch가 아예 없던 상태 → ",[23,1383,49],{}," 신설. ",[23,1386,1387],{},"handleReset","도 정식 구현(기존엔 ",[23,1390,1391],{},"recipients=[]","만 비웠음).",[59,1394,1395,195,1398,1401,1402,1405],{},[62,1396,1397],{},"flow",[23,1399,1400],{},"watch(flowName)","에서 수신자·치환자 초기화 라인 제거 — 플로우를 바꿔도 수신자 유지. 기존 타입 에러(",[23,1403,1404],{},"nodes[0]"," undefined 접근) 4건도 함께 정리.",[59,1407,1408,1411],{},[62,1409,1410],{},"kakao",": \"템플릿 사용유무\" 토글이 없는 구조(항상 사전 승인 템플릿 기반)라 변경 없음.",[59,1413,967,1414,788,1416,1419,1420,1423,1424,801],{},[23,1415,787],{},[23,1417,1418],{},"--commit-message \"send pages: keep recipients on template toggle, stash and restore message settings\"",") — 배포 #21. 프로덕션 ",[23,1421,1422],{},"\u002Fsend\u002F{sms,kakao,rcs,email,push,flow}"," 전부 200, alias ",[23,1425,1426],{},"https:\u002F\u002Fe1b4d7da.malgn-noti.pages.dev",[59,1428,722,1429,1432,1433,810],{},[23,1430,1431],{},"93411ae 발송 페이지 템플릿 토글 동작 개선 — 수신자 유지 + 메시지 stash\u002F복원"," (6 files, +345 −46) → ",[23,1434,729],{},[14,1436,1438],{"id":1437},"_16-주소록-관리-페이지-강화-16-배포-22","16. 주소록 관리 페이지 강화 (§16, 배포 #22)",[56,1440,1441,1447,1468,1486,1500,1506,1516,1530,1546],{},[59,1442,1443,1446],{},[62,1444,1445],{},"GNB",": '연락처 관리' → '주소록 관리'.",[59,1448,1449,1456,1457,1459,1460,1463,1464,1467],{},[62,1450,1451,1452,1455],{},"주소록 페이지(",[23,1453,1454],{},"contacts\u002Flist.vue",")",": 타이틀 '주소록 그룹\u002F연락처' → '주소록 관리', 발송 페이지와 동일한 ",[23,1458,1203],{},"로 통일. 테이블 하단 페이지네이션 추가, 'CSV 가져오기' 제거, ",[62,1461,1462],{},"토큰 컬럼","(있음 \u002F ",[23,1465,1466],{},"-",") 추가.",[59,1469,1470,1473,1474,1477,1478,1481,1482,1485],{},[62,1471,1472],{},"그룹 이동 모달",": 선택한 연락처를 다른 그룹으로 일괄 이동. ",[23,1475,1476],{},"DATA","를 ",[23,1479,1480],{},"reactive","로, 그룹 카운트를 ",[23,1483,1484],{},"computed","로 전환해 이동 즉시 좌측 인원수 갱신.",[59,1487,1488,1491,1492,1495,1496,1499],{},[62,1489,1490],{},"선택 발송 → 5채널 드롭다운",": 선택 발송 클릭 시 문자메시지\u002F알림톡·친구톡\u002FRCS\u002F이메일\u002FPUSH 드롭다운, 채널 선택 시 선택 연락처를 ",[23,1493,1494],{},"useState('sendRecipients')","로 인계해 해당 채널 발송 페이지로 이동. 발송 6채널이 ",[23,1497,1498],{},"onMounted","에서 인계 수신자를 반영(sms는 §15 이전 적용, kakao\u002Frcs\u002Femail\u002Fpush 추가).",[59,1501,1502,1505],{},[62,1503,1504],{},"AppContactFormDialog","(신규): 주소록 등록\u002F수정 겸용 모달 — 별칭(64자)·휴대폰·이메일, 토큰 입력 패널(푸시 유형·국가\u002F언어 코드·시간대·수신 거부 3종·디바이스 ID, 칩으로 다중), 그룹 다중 선택(최대 16). 이름 클릭 시 수정 모드로 오픈.",[59,1507,1508,1511,1512,1515],{},[62,1509,1510],{},"AppContactBulkDialog","(신규): 주소록 일괄 등록 모달 — 템플릿 다운로드 + ",[23,1513,1514],{},".xlsx"," 파일 업로드(최대 1MB).",[59,1517,1518,1521,1522,1525,1526,1529],{},[62,1519,1520],{},"배포 범위 분리",": 배포 시점 working tree에 별개의 '발신번호 등록' 진행 중 작업이 섞여 있어, 사용자 확인 후 해당 변경을 ",[23,1523,1524],{},"git stash","로 임시 분리하고 ",[62,1527,1528],{},"주소록 작업만"," 빌드·배포·커밋한 뒤 stash 복원.",[59,1531,967,1532,788,1534,1537,1538,550,1541,715,1543,801],{},[23,1533,787],{},[23,1535,1536],{},"--commit-message \"address book: register\u002Fbulk dialogs, group move, channel send dropdown\"",") — 배포 #22. 프로덕션 ",[23,1539,1540],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fcontacts\u002Flist",[23,1542,1154],{},[23,1544,1545],{},"https:\u002F\u002F57bab931.malgn-noti.pages.dev",[59,1547,722,1548,1551,1552,810],{},[23,1549,1550],{},"547dd61 주소록 관리 페이지 강화 — 등록·일괄등록·그룹이동·채널 발송"," (5 files, +839 −41) → ",[23,1553,729],{},[14,1555,1557],{"id":1556},"_17-발신-번호-관리-페이지-등록-마법사-17-배포-23","17. 발신 번호 관리 페이지 + 등록 마법사 (§17, 배포 #23)",[56,1559,1560,1573,1579,1593,1606,1647,1664],{},[59,1561,1562,1568,1569,1572],{},[62,1563,1564,1565,1455],{},"발신 정보 · 발신 번호 페이지(",[23,1566,1567],{},"sender\u002Fnumbers.vue",": 시안 IA를 Relay-inspired 디자인에 맞춰 신규 구성 — 명의자 인증 안내 박스, ",[23,1570,1571],{},"발신 번호 등록","(페이지 헤더 우측 배치)·삭제·등록 안내 툴바, 표(발신 번호 유형·번호·승인 상태 배지·요청\u002F승인 일시), 페이지네이션.",[59,1574,1575,1578],{},[62,1576,1577],{},"등록 안내 모달",": 발신 번호 유형별 필요 서류를 표로 안내(대표자·임직원·타사·타인 번호).",[59,1580,1581,1584,1585,1588,1589,1592],{},[62,1582,1583],{},"AppSenderRegisterDialog","(신규): 3단계 등록 마법사. ① 개인정보 수집 이용 동의(체크 후 진행) → ② 등록 방식 선택(직접 등록·서류 인증 \u002F 휴대폰 본인인증) → ③ 분기 — 서류 인증(유형 select·번호·필요 서류 파일 업로드 → ",[23,1586,1587],{},"심사 중"," 등록) 또는 휴대폰 본인인증(통신사·이름·주민번호·내외국인·휴대폰, 인증번호 3분 카운트다운 → ",[23,1590,1591],{},"승인"," 즉시 등록). 단계 인디케이터·검증별 버튼 활성화 포함.",[59,1594,1595,1598,1599,550,1602,1605],{},[62,1596,1597],{},"types\u002Fsender.ts","(신규): ",[23,1600,1601],{},"SenderNumber",[23,1603,1604],{},"SenderRegisterResult"," 공용 타입 분리.",[59,1607,1608,1611,1612,550,1615,550,1618,1621,1622,1624,1625,1628,1629,1632,1633,1636,1637,1067,1639,1642,1643,1646],{},[62,1609,1610],{},"타입 에러 정리",": 누적 타입 에러 8건 해소 — 템플릿 다이얼로그 4종의 배열 인덱스 접근 가드(",[23,1613,1614],{},"?? null",[23,1616,1617],{},"?? ''",[23,1619,1620],{},"?? []","), ",[23,1623,410],{},"의 수신자 ",[23,1626,1627],{},"vars"," 타입 명시, ",[23,1630,1631],{},"KakaoMessageBody","를 재작성된 ",[23,1634,1635],{},"AppTemplateVariableTextarea","(",[23,1638,404],{},[23,1640,1641],{},"modelValue"," API)에 정합. ",[23,1644,1645],{},"pnpm typecheck"," 클린.",[59,1648,967,1649,788,1651,1654,1655,550,1658,715,1661,801],{},[23,1650,787],{},[23,1652,1653],{},"--commit-message \"sender numbers page: 3-step register wizard ...\"",") — 배포 #23. 프로덕션 ",[23,1656,1657],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fsender\u002Fnumbers",[23,1659,1660],{},"\u002Fsend\u002Fsms",[23,1662,1663],{},"https:\u002F\u002F3c26af5f.malgn-noti.pages.dev",[59,1665,722,1666,1669,1670,810],{},[23,1667,1668],{},"fe58e2d 발신 번호 관리 페이지 — 등록 마법사 3단계 + 타입 에러 정리"," (9 files, +1182 −12) → ",[23,1671,729],{},[14,1673,1675],{"id":1674},"_18-그룹-관리-페이지-주소록그룹-툴바-통일-18-배포-24","18. 그룹 관리 페이지 + 주소록·그룹 툴바 통일 (§18, 배포 #24)",[56,1677,1678,1687,1704,1716,1727,1755,1774],{},[59,1679,1680,1686],{},[62,1681,1682,1683,1455],{},"그룹 관리 페이지(",[23,1684,1685],{},"contacts\u002Fgroups.vue",": placeholder → 신규 구성. 표(그룹 이름·그룹 아이디·주소록 수·등록 일시·메시지 발송), 그룹 이름 검색, 페이지네이션.",[59,1688,1689,195,1692,1695,1696,1699,1700,1703],{},[62,1690,1691],{},"그룹 등록\u002F수정",[23,1693,1694],{},"그룹 등록"," 버튼(헤더 우측)·그룹 이름 클릭 → ",[23,1697,1698],{},"AppGroupFormDialog","(신규, 등록·수정 겸용 — ",[23,1701,1702],{},"edit"," prop으로 제목·문구 분기). 등록 시 목록 상단 추가, 수정 시 이름 갱신.",[59,1705,1706,195,1709,1712,1713,1715],{},[62,1707,1708],{},"행별 메시지 발송 드롭다운",[23,1710,1711],{},"메시지 발송"," 컬럼의 버튼 클릭 → 5채널(문자메시지\u002F알림톡·친구톡\u002FRCS\u002F이메일\u002FPUSH) 드롭다운. 채널 선택 시 그룹의 주소록 수만큼 목업 수신자를 생성해 ",[23,1714,1494],{},"로 인계 → 해당 발송 페이지 수신자 설정에 표시. 주소록 수 0이면 안내 토스트.",[59,1717,1718,1721,1722,1724,1725,90],{},[62,1719,1720],{},"그룹 삭제",": 선택 → ",[23,1723,1097],{},"(위험) → 일괄 삭제(",[23,1726,1480],{},[59,1728,1729,1732,1733,165,1736,1739,1740,1743,1744,1747,1748,1751,1752,1754],{},[62,1730,1731],{},"툴바 통일",": 주소록 관리·그룹 관리 툴바를 동일 형식으로 — 검색 입력이 바를 채우고, 선택 시 ",[23,1734,1735],{},"N개\u002F명 선택됨",[23,1737,1738],{},"선택 삭제"," 노출, ",[23,1741,1742],{},"새로고침","(ghost) + ",[23,1745,1746],{},"총 N개\u002F명",". 주소록 관리의 '삭제'→'선택 삭제', '연락처 수'→'주소록 수' 문구 정리, ",[23,1749,1750],{},"새 그룹"," 버튼 → ",[23,1753,1698],{}," 연결.",[59,1756,967,1757,788,1759,1762,1763,550,1766,550,1769,715,1771,801],{},[23,1758,787],{},[23,1760,1761],{},"--commit-message \"contacts: group management page, group register\u002Fedit dialog, toolbar polish\"",") — 배포 #24. 프로덕션 ",[23,1764,1765],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fcontacts\u002Fgroups",[23,1767,1768],{},"\u002Fcontacts\u002Flist",[23,1770,1154],{},[23,1772,1773],{},"https:\u002F\u002F8a830019.malgn-noti.pages.dev",[59,1775,722,1776,1779,1780,810],{},[23,1777,1778],{},"4e88e1f 주소록·그룹 관리 페이지 보강"," (3 files, +525 −7) → ",[23,1781,729],{},[14,1783,1785],{"id":1784},"_19-rcs-브랜드-관리-페이지-19-배포-25","19. RCS 브랜드 관리 페이지 (§19, 배포 #25)",[56,1787,1788,1797,1803,1814,1834,1851],{},[59,1789,1790,1796],{},[62,1791,1792,1793,1455],{},"발신 정보 · RCS 브랜드 페이지(",[23,1794,1795],{},"sender\u002Fbrands.vue",": placeholder → 신규 구성. 발신 번호 관리 페이지와 동일한 구조(페이지 헤더 우측 액션 버튼 + 안내 박스 + 리스트 카드).",[59,1798,1799,1802],{},[62,1800,1801],{},"안내 박스",": RCS Biz Center 가입·대행사 지정·사업자등록번호 기준 연동·정보 변경 시 재연동 4-bullet. \"RCS Biz Center\"는 외부 링크.",[59,1804,1805,195,1808,1810,1811,1813],{},[62,1806,1807],{},"브랜드 연동",[23,1809,1807],{}," 버튼(헤더 우측) → ",[23,1812,1097],{},"(사업자등록번호 기준 연동 안내) → 확인 시 연동 일시 갱신 + 토스트. 직접 등록 폼이 아니라 RCS Biz Center sync 흐름.",[59,1815,1816,1819,1820,1823,1824,1823,1826,1829,1830,1833],{},[62,1817,1818],{},"리스트 카드",": 툴바(",[23,1821,1822],{},"업체명"," · ",[23,1825,1742],{},[23,1827,1828],{},"총 N개",") + 표(브랜드 이름·아이디·승인 상태 배지·승인\u002F연동 일시) + 하단 번호형 페이지바(",[23,1831,1832],{},"« ‹ 1 › »",") — 발신 번호 관리 페이지와 동일 포맷. 검색은 미포함.",[59,1835,967,1836,788,1838,1841,1842,550,1845,715,1848,801],{},[23,1837,787],{},[23,1839,1840],{},"--commit-message \"rcs brand management page: sync flow, brand list table, bottom pager, refresh\"",") — 배포 #25. 프로덕션 ",[23,1843,1844],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fsender\u002Fbrands",[23,1846,1847],{},"\u002Fsender\u002Fnumbers",[23,1849,1850],{},"https:\u002F\u002F6f271361.malgn-noti.pages.dev",[59,1852,722,1853,1856,1857,810],{},[23,1854,1855],{},"e3e7a02 RCS 브랜드 관리 페이지 — 연동 흐름 + 브랜드 목록"," (1 file, +277 −5) → ",[23,1858,729],{},[14,1860,1862],{"id":1861},"_20-이메일-도메인-관리-페이지-20-배포-26","20. 이메일 도메인 관리 페이지 (§20, 배포 #26)",[56,1864,1865,1878,1883,1898,1912,1929,1945],{},[59,1866,1867,1873,1874,1877],{},[62,1868,1869,1870,1455],{},"발신 정보 · 이메일 도메인 페이지(",[23,1871,1872],{},"sender\u002Fdomains.vue",": placeholder → 신규 구성. 발신 번호·RCS 브랜드 관리 페이지와 동일 구조(헤더 우측 ",[23,1875,1876],{},"도메인 등록"," + 안내 박스 + 리스트 카드 + 번호형 페이지바).",[59,1879,1880,1882],{},[62,1881,1801],{},": 도메인 소유권 인증 \u002F 인증 후 SPF·DMARC·DKIM 설정 가능 2-bullet.",[59,1884,1885,1819,1887,1890,1891,1823,1893,1823,1895,1897],{},[62,1886,1818],{},[23,1888,1889],{},"DKIM 설정","(검색 앞, 1개 선택 시 활성) · 검색란 · 선택 시 ",[23,1892,1738],{},[23,1894,1742],{},[23,1896,1828],{},") + 표(도메인·소유 인증 상태·인증 일시). 그룹 관리 페이지 툴바 패턴(검색 채움 + 선택 시 액션) 적용.",[59,1899,1900,1903,1904,1907,1908,1911],{},[62,1901,1902],{},"AppDomainRegisterDialog","(신규): 루트 도메인 입력 + ",[23,1905,1906],{},"검증"," 버튼(형식 검증) → 검증 전 ",[23,1909,1910],{},"확인"," 비활성, \"사용 가능한 도메인입니다.\" 안내.",[59,1913,1914,1917,1918,1621,1921,1924,1925,1928],{},[62,1915,1916],{},"AppDkimSettingsDialog","(신규): DKIM 레코드 인증 카드 — 절차 안내, DNS 호스트 이름·TXT 레코드 값(읽기전용 + ",[23,1919,1920],{},"복사",[23,1922,1923],{},"인증"," 버튼 + 성공 표시, ",[23,1926,1927],{},"DKIM 사용 설정"," 토글.",[59,1930,967,1931,788,1933,1936,1937,550,1940,715,1942,801],{},[23,1932,787],{},[23,1934,1935],{},"--commit-message \"email domain management page with domain register and DKIM dialogs\"",") — 배포 #26. 프로덕션 ",[23,1938,1939],{},"https:\u002F\u002Fmalgn-noti.pages.dev\u002Fsender\u002Fdomains",[23,1941,1154],{},[23,1943,1944],{},"https:\u002F\u002F298c40ec.malgn-noti.pages.dev",[59,1946,722,1947,1950,1951,810],{},[23,1948,1949],{},"46f18f8 이메일 도메인 관리 페이지 신규 구성"," (3 files, +711 −6) → ",[23,1952,729],{},[14,1954,1955],{"id":1955},"산출물",[1957,1958,1960],"h3",{"id":1959},"신규-10","신규 (10)",[56,1962,1963,1970,1976,1982,1988,1994,2000,2005,2012,2019],{},[59,1964,1965],{},[1966,1967,1969],"a",{"href":1968},"..\u002F..\u002Fapp\u002Fcomponents\u002FAppFlowCreateDialog.vue","app\u002Fcomponents\u002FAppFlowCreateDialog.vue",[59,1971,1972],{},[1966,1973,1975],{"href":1974},"..\u002F..\u002Fapp\u002Fcomponents\u002FAppFlowTemplatePickerDialog.vue","app\u002Fcomponents\u002FAppFlowTemplatePickerDialog.vue",[59,1977,1978],{},[1966,1979,1981],{"href":1980},"..\u002F..\u002Fapp\u002Fcomponents\u002FAppPushButtonDialog.vue","app\u002Fcomponents\u002FAppPushButtonDialog.vue",[59,1983,1984],{},[1966,1985,1987],{"href":1986},"..\u002F..\u002Fapp\u002Fcomponents\u002FAppPushGroupDialog.vue","app\u002Fcomponents\u002FAppPushGroupDialog.vue",[59,1989,1990],{},[1966,1991,1993],{"href":1992},"..\u002F..\u002Fapp\u002Fcomponents\u002FAppPushMediaDialog.vue","app\u002Fcomponents\u002FAppPushMediaDialog.vue",[59,1995,1996],{},[1966,1997,1999],{"href":1998},"..\u002F..\u002Fapp\u002Fcomponents\u002FAppPushRecipientDialog.vue","app\u002Fcomponents\u002FAppPushRecipientDialog.vue",[59,2001,2002],{},[1966,2003,655],{"href":2004},"..\u002F..\u002Fapp\u002Futils\u002FscrollLock.ts",[59,2006,2007,2011],{},[1966,2008,2010],{"href":2009},"..\u002F..\u002Fapp\u002Fcomposables\u002FuseTemplateToggle.ts","app\u002Fcomposables\u002FuseTemplateToggle.ts"," — §15",[59,2013,2014,2018],{},[1966,2015,2017],{"href":2016},"..\u002F..\u002Fapp\u002Fcomponents\u002FAppSenderRegisterDialog.vue","app\u002Fcomponents\u002FAppSenderRegisterDialog.vue"," — §17",[59,2020,2021,2018],{},[1966,2022,2024],{"href":2023},"..\u002F..\u002Fapp\u002Ftypes\u002Fsender.ts","app\u002Ftypes\u002Fsender.ts",[1957,2026,2028],{"id":2027},"수정-20","수정 (20)",[56,2030,2031,2037,2072,2077,2083,2098],{},[59,2032,2033,2034,1455],{},"6개 발송 페이지(",[23,2035,2036],{},"app\u002Fpages\u002Fsend\u002F{sms,kakao,rcs,email,push,flow}.vue",[59,2038,2039,999,2042,999,2045,999,2048,999,2051,999,2054,999,2057,999,2060,999,2063,999,2066,999,2069],{},[23,2040,2041],{},"app\u002Fcomponents\u002FAppAddressBookDialog.vue",[23,2043,2044],{},"AppEmailPreview.vue",[23,2046,2047],{},"AppEmailTemplateDialog.vue",[23,2049,2050],{},"AppFlowManageDialog.vue",[23,2052,2053],{},"AppModal.vue",[23,2055,2056],{},"AppPhonePreview.vue",[23,2058,2059],{},"AppPushPreview.vue",[23,2061,2062],{},"AppRcsTemplateDialog.vue",[23,2064,2065],{},"AppRecipientCard.vue",[23,2067,2068],{},"AppRecipientFormDialog.vue",[23,2070,2071],{},"AppSmsTemplateDialog.vue",[59,2073,2074,2076],{},[23,2075,265],{},"(EmailTpl·RcsTpl 추가)",[59,2078,2079,2082],{},[23,2080,2081],{},"app\u002Fpages\u002Fsender\u002Fnumbers.vue","(§17 발신 번호 관리 페이지 전면 구성)",[59,2084,2085,2086,999,2089,999,2092,999,2095],{},"§17 타입 에러 정리: ",[23,2087,2088],{},"AppKakaoTemplateDialog.vue",[23,2090,2091],{},"AppPushRecipientDialog.vue",[23,2093,2094],{},"AppPushTemplateDialog.vue",[23,2096,2097],{},"KakaoMessageBody.vue",[59,2099,2100,2103],{},[23,2101,2102],{},"app\u002Fpages\u002Fsender\u002Fbrands.vue","(§19 RCS 브랜드 관리 페이지 전면 구성)",[1957,2105,2106],{"id":2106},"배포",[56,2108,2109,2122,2129,2135,2142,2148,2154,2160,2166,2172,2178,2184],{},[59,2110,2111,2112,2117,2118],{},"#15 — 프로덕션: ",[1966,2113,2114],{"href":2114,"rel":2115},"https:\u002F\u002Fmalgn-noti.pages.dev",[2116],"nofollow"," \u002F Alias: ",[1966,2119,2120],{"href":2120,"rel":2121},"https:\u002F\u002Fc4b53baf.malgn-noti.pages.dev",[2116],[59,2123,2124,2125],{},"#16 — 문구 정리 \u002F Alias: ",[1966,2126,2127],{"href":2127,"rel":2128},"https:\u002F\u002Fe22f7472.malgn-noti.pages.dev",[2116],[59,2130,2131,2132],{},"#17 — 문서·가이드 현행화 \u002F Alias: ",[1966,2133,884],{"href":884,"rel":2134},[2116],[59,2136,2137,2138],{},"#18 — 문서 stale 매핑 정정 \u002F Alias: ",[1966,2139,2140],{"href":2140,"rel":2141},"https:\u002F\u002F3f68045a.malgn-noti.pages.dev",[2116],[59,2143,2144,2145],{},"#19 — 발송 조회 페이지 전면 재작업 + btn-sky 제거 \u002F Alias: ",[1966,2146,1157],{"href":1157,"rel":2147},[2116],[59,2149,2150,2151],{},"#20 — 통계 페이지 재구성 + 폰트 토큰화 + zoom 제거 \u002F Alias: ",[1966,2152,1313],{"href":1313,"rel":2153},[2116],[59,2155,2156,2157],{},"#21 — 발송 페이지 템플릿 토글 동작 개선 \u002F Alias: ",[1966,2158,1426],{"href":1426,"rel":2159},[2116],[59,2161,2162,2163],{},"#22 — 주소록 관리 페이지 강화 \u002F Alias: ",[1966,2164,1545],{"href":1545,"rel":2165},[2116],[59,2167,2168,2169],{},"#23 — 발신 번호 관리 페이지 + 등록 마법사 \u002F Alias: ",[1966,2170,1663],{"href":1663,"rel":2171},[2116],[59,2173,2174,2175],{},"#24 — 그룹 관리 페이지 + 주소록·그룹 툴바 통일 \u002F Alias: ",[1966,2176,1773],{"href":1773,"rel":2177},[2116],[59,2179,2180,2181],{},"#25 — RCS 브랜드 관리 페이지 \u002F Alias: ",[1966,2182,1850],{"href":1850,"rel":2183},[2116],[59,2185,2186,2187],{},"#26 — 이메일 도메인 관리 페이지 \u002F Alias: ",[1966,2188,1944],{"href":1944,"rel":2189},[2116],[1957,2191,2192],{"id":2192},"커밋",[56,2194,2195,2201,2207,2213,2219,2225,2231,2237,2243,2249,2255,2261,2267],{},[59,2196,2197,2200],{},[23,2198,2199],{},"bd7e07e"," 발송 페이지 UX 폴리시 2차 + PUSH 부가항목·플로우 관리 완성",[59,2202,2203,2206],{},[23,2204,2205],{},"428eeca"," history: 2026-05-20 작업 이력 추가 (배포 #15)",[59,2208,2209,2212],{},[23,2210,2211],{},"704a1b4"," 문구 정리: 발송 설정 라벨 변경 + 띄어쓰기 + 푸터 이메일 오타 (§10, 배포 #16)",[59,2214,2215,2218],{},[23,2216,2217],{},"75ab98c"," 문서·디자인 가이드 현행화 (2026-05-18~20 반영) (§11, 배포 #17)",[59,2220,2221,2224],{},[23,2222,2223],{},"f81424b"," 문서 정정: USlideover 매핑·구 토큰 예시 현행화 (§12, 배포 #18)",[59,2226,2227,2230],{},[23,2228,2229],{},"d0efe8c"," 발송 조회 페이지 목록·검색 필터·다이얼로그 전면 작업 + btn-sky 정리 (§13, 배포 #19)",[59,2232,2233,2236],{},[23,2234,2235],{},"6bc05c6"," 통계 페이지 재구성 + 폰트 토큰화 + zoom 스케일 제거 (§14, 배포 #20)",[59,2238,2239,2242],{},[23,2240,2241],{},"93411ae"," 발송 페이지 템플릿 토글 동작 개선 — 수신자 유지 + 메시지 stash\u002F복원 (§15, 배포 #21)",[59,2244,2245,2248],{},[23,2246,2247],{},"547dd61"," 주소록 관리 페이지 강화 — 등록·일괄등록·그룹이동·채널 발송 (§16, 배포 #22)",[59,2250,2251,2254],{},[23,2252,2253],{},"fe58e2d"," 발신 번호 관리 페이지 — 등록 마법사 3단계 + 타입 에러 정리 (§17, 배포 #23)",[59,2256,2257,2260],{},[23,2258,2259],{},"4e88e1f"," 주소록·그룹 관리 페이지 보강 (§18, 배포 #24)",[59,2262,2263,2266],{},[23,2264,2265],{},"e3e7a02"," RCS 브랜드 관리 페이지 — 연동 흐름 + 브랜드 목록 (§19, 배포 #25)",[59,2268,2269,2272],{},[23,2270,2271],{},"46f18f8"," 이메일 도메인 관리 페이지 신규 구성 (§20, 배포 #26)",[14,2274,2276],{"id":2275},"다음-단계-한계","다음 단계 \u002F 한계",[56,2278,2279,2285,2291,2297,2303],{},[59,2280,2281,2284],{},[62,2282,2283],{},"발신정보·메시지 관리·캠페인·계정\u002F문의·시스템 페이지"," — 디자인 핸드오프 미반영 영역. IA만 있고 핸드오프 기반 디자인 미적용.",[59,2286,2287,2290],{},[62,2288,2289],{},"수정 모드에서 푸시 유형 재선택 UI"," — 현재 수정 다이얼로그에는 토큰 행 안에서 유형 셀렉트가 노출되지 않음(추가가 막혀 있어 그 안에서 유형만 갈아끼우려면 삭제→재추가 흐름이 필요). 한 칸짜리 인라인 유형 셀렉트로 보강 여지 있음.",[59,2292,2293,2296],{},[62,2294,2295],{},"백엔드 연동 부재"," — 모든 다이얼로그 시드 데이터는 목업. NHN API 연동 전이라 저장 후 새로고침하면 휘발됨.",[59,2298,2299,2302],{},[62,2300,2301],{},"드래그 핸들 키보드 접근성"," — AppFlowCreateDialog의 행 순서 변경은 마우스 드래그만 지원. ↑\u002F↓ 화살표 키보드 보조가 필요할 수 있음.",[59,2304,2305,2308],{},[62,2306,2307],{},"AppFlowCreateDialog의 placeholder 채널"," — 새 행 추가 시 ch=\"\"로 시작하지만 선택 버튼 클릭 시 토스트로 가드만 함. 필드 자체에 빨간 외곽선 등 시각 검증을 더할 수 있음.",{"title":2310,"searchDepth":2311,"depth":2311,"links":2312},"",3,[2313,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2341],{"id":16,"depth":2314,"text":17},2,{"id":53,"depth":2314,"text":54},{"id":172,"depth":2314,"text":173},{"id":245,"depth":2314,"text":246},{"id":295,"depth":2314,"text":296},{"id":318,"depth":2314,"text":319},{"id":385,"depth":2314,"text":386},{"id":517,"depth":2314,"text":518},{"id":640,"depth":2314,"text":641},{"id":692,"depth":2314,"text":693},{"id":736,"depth":2314,"text":737},{"id":813,"depth":2314,"text":814},{"id":895,"depth":2314,"text":896},{"id":1005,"depth":2314,"text":1006},{"id":1172,"depth":2314,"text":1173},{"id":1327,"depth":2314,"text":1328},{"id":1437,"depth":2314,"text":1438},{"id":1556,"depth":2314,"text":1557},{"id":1674,"depth":2314,"text":1675},{"id":1784,"depth":2314,"text":1785},{"id":1861,"depth":2314,"text":1862},{"id":1955,"depth":2314,"text":1955,"children":2336},[2337,2338,2339,2340],{"id":1959,"depth":2311,"text":1960},{"id":2027,"depth":2311,"text":2028},{"id":2106,"depth":2311,"text":2106},{"id":2192,"depth":2311,"text":2192},{"id":2275,"depth":2314,"text":2276},"md",{},true,"\u002Fhistory\u002Fhistory.20260520",{"title":5,"description":2310},"history\u002Fhistory.20260520","fiHnIgdOlBNMxSzyNtS08GQzzpwCRsgeQvWr3tHL4Mw",1780643216574]