[{"data":1,"prerenderedAt":3073},["ShallowReactive",2],{"doc:\u002Ffrontend":3},{"id":4,"title":5,"body":6,"description":3066,"extension":3067,"meta":3068,"navigation":697,"path":3069,"seo":3070,"stem":3071,"__hash__":3072},"docs\u002FFRONTEND.md","Frontend 개발 가이드 — 맑은 메시징 사용자단",{"type":7,"value":8,"toc":3006},"minimark",[9,13,35,61,64,69,239,241,245,255,258,291,293,297,316,325,335,341,349,400,413,417,494,503,507,562,569,576,586,588,592,596,631,635,638,766,769,991,998,1050,1054,1057,1148,1152,1181,1183,1187,1191,1233,1237,1262,1281,1288,1476,1480,1507,1511,1518,1520,1524,1528,1662,1666,1678,1751,1754,1769,1773,1799,1803,1897,1901,1904,2023,2027,2034,2036,2040,2043,2255,2260,2353,2355,2359,2363,2422,2426,2478,2481,2495,2497,2501,2509,2541,2551,2562,2566,2630,2632,2636,2640,2702,2706,2757,2765,2772,2778,2787,2789,2793,2881,2883,2887,2891,2920,2924,2933,2949,2953,3003],[10,11,5],"h1",{"id":12},"frontend-개발-가이드-맑은-메시징-사용자단",[14,15,16,17,25,26,30,31,34],"p",{},"이 문서는 ",[18,19,21],"a",{"href":20},"..",[22,23,24],"code",{},"malgn-noti"," 사용자단(고객 콘솔)의 ",[27,28,29],"strong",{},"디자인 시스템 + HTML\u002FCSS\u002FJS 코딩 컨벤션","을 정리합니다. 운영자 콘솔(",[22,32,33],{},"malgn-noti-admin",")도 동일 스택이므로 같은 규칙을 따릅니다.",[36,37,38,58],"blockquote",{},[14,39,40,41,45,46,53,54,57],{},"프로젝트 전반의 큰 그림은 ",[18,42,44],{"href":43},"..\u002FCLAUDE","CLAUDE.md",", ",[27,47,48,49],{},"디자인 정본(SoT)은 ",[18,50,52],{"href":51},".\u002FDESIGN","DESIGN.md"," (Relay-inspired v1.0). 시안 사이트는 ",[27,55,56],{},"IA(페이지 목록·라우트)"," 한정 참조.",[14,59,60],{},"⚠️ 2026-05-18 디자인 전면 피벗 — 이 문서의 §3·§9는 신규 디자인 시스템 기준으로 갱신됨. 구 시안(indigo\u002FNoto Sans KR\u002F1200px) 기술은 폐기.",[62,63],"hr",{},[65,66,68],"h2",{"id":67},"_1-기술-스택-한눈에","1. 기술 스택 한눈에",[70,71,72,88],"table",{},[73,74,75],"thead",{},[76,77,78,82,85],"tr",{},[79,80,81],"th",{},"영역",[79,83,84],{},"선택",[79,86,87],{},"비고",[89,90,91,110,124,137,158,183,201,215,226],"tbody",{},[76,92,93,97,103],{},[94,95,96],"td",{},"프레임워크",[94,98,99,100],{},"Nuxt 3 + ",[22,101,102],{},"future.compatibilityVersion: 4",[94,104,105,106,109],{},"소스는 ",[22,107,108],{},"app\u002F"," 디렉토리",[76,111,112,115,118],{},[94,113,114],{},"언어",[94,116,117],{},"TypeScript (strict)",[94,119,120,123],{},[22,121,122],{},"any"," 금지",[76,125,126,129,134],{},[94,127,128],{},"UI",[94,130,131],{},[27,132,133],{},"Nuxt UI v3 (MIT)",[94,135,136],{},"Reka UI + Tailwind v4 통합",[76,138,139,142,149],{},[94,140,141],{},"스타일",[94,143,144,145,148],{},"Tailwind v4 + scoped ",[22,146,147],{},"\u003Cstyle>"," + CSS 변수",[94,150,151,154,155],{},[22,152,153],{},"@nuxtjs\u002Ftailwindcss"," ",[27,156,157],{},"설치 금지",[76,159,160,163,177],{},[94,161,162],{},"아이콘",[94,164,165,166,169,170,45,173,176],{},"Iconify (",[22,167,168],{},"lucide"," 기본, ",[22,171,172],{},"heroicons",[22,174,175],{},"bi",")",[94,178,179,180],{},"일반 UI는 ",[22,181,182],{},"i-lucide-*",[76,184,185,188,191],{},[94,186,187],{},"폰트",[94,189,190],{},"Inter · JetBrains Mono · Pretendard",[94,192,193,196,197,200],{},[22,194,195],{},"--font-sans"," \u002F ",[22,198,199],{},"--font-mono",", 한국어 fallback Pretendard",[76,202,203,206,212],{},[94,204,205],{},"상태",[94,207,208,209,176],{},"Pinia (",[22,210,211],{},"@pinia\u002Fnuxt",[94,213,214],{},"인증\u002F크레딧\u002F사용자",[76,216,217,220,223],{},[94,218,219],{},"검증",[94,221,222],{},"Zod",[94,224,225],{},"폼\u002F응답",[76,227,228,231,234],{},[94,229,230],{},"배포",[94,232,233],{},"Cloudflare Pages",[94,235,236],{},[22,237,238],{},"nitro.preset = 'cloudflare-pages'",[62,240],{},[65,242,244],{"id":243},"_2-디렉토리-구조-nuxt-4-호환","2. 디렉토리 구조 (Nuxt 4 호환)",[246,247,252],"pre",{"className":248,"code":250,"language":251},[249],"language-text","app\u002F\n├── app.vue                  # 진입 (UApp + NuxtLayout + NuxtPage)\n├── app.config.ts            # Nuxt UI 테마(primary\u002Fneutral)\n├── error.vue                # Nuxt 루트 에러 핸들러\n├── assets\u002F\n│   └── css\u002Fmain.css         # Tailwind + 시안 디자인 토큰\n├── components\u002F\n│   ├── AppGnb.vue           # 상단 GNB\n│   ├── AppFooter.vue        # 푸터\n│   ├── AppConfirmDialog.vue # 위험 액션 컨펌\n│   └── AppPagePlaceholder.vue\n├── composables\u002F\n│   ├── useApi.ts            # $fetch 래퍼 (인증\u002F에러 표준화)\n│   ├── useExportJob.ts      # 비동기 다운로드 요청\n│   └── useAiTemplate.ts     # AI 템플릿 생성\n├── layouts\u002F\n│   ├── default.vue          # GNB + 본문 + Footer\n│   ├── auth.vue             # 중앙 카드 (로그인\u002F회원가입)\n│   └── blank.vue            # 슬롯만 (단독 시스템 페이지)\n├── middleware\u002F\n│   └── auth.global.ts\n├── pages\u002F                   # 자동 라우팅 (시안 IA 기준 16카테고리)\n├── stores\u002F\n│   └── auth.ts              # Pinia\n└── types\u002F\n    ├── domain.ts            # Channel, Tenant, User 등\n    └── api.ts               # Paginated, ExportJob 등\n","text",[22,253,250],{"__ignoreMap":254},"",[14,256,257],{},"루트:",[259,260,261,268,277,285],"ul",{},[262,263,264,267],"li",{},[22,265,266],{},"nuxt.config.ts"," — modules \u002F nitro \u002F app \u002F runtimeConfig",[262,269,270,273,274],{},[22,271,272],{},"tsconfig.json"," — ",[22,275,276],{},"extends: .\u002F.nuxt\u002Ftsconfig.json",[262,278,279,273,282],{},[22,280,281],{},"eslint.config.mjs",[22,283,284],{},"withNuxt()",[262,286,287,290],{},[22,288,289],{},".env.example"," — 환경변수 템플릿",[62,292],{},[65,294,296],{"id":295},"_3-디자인-시스템","3. 디자인 시스템",[36,298,299],{},[14,300,301,306,307,310,311,315],{},[27,302,303,304],{},"정본은 ",[18,305,52],{"href":51}," — Relay-inspired v1.0. 토큰·컴포넌트·발송 아키텍처 전체가 거기 있고, 라이브 카탈로그는 ",[22,308,309],{},"\u002Fguide"," 페이지(",[18,312,314],{"href":313},"..\u002Fapp\u002Fpages\u002Fguide.vue","app\u002Fpages\u002Fguide.vue","). 아래는 코딩 시 자주 쓰는 핵심만 요약.",[317,318,320,321,176],"h3",{"id":319},"_31-색상-토큰-css-변수-maincss","3.1 색상 토큰 (CSS 변수 — ",[18,322,324],{"href":323},"..\u002Fapp\u002Fassets\u002Fcss\u002Fmain.css","main.css",[14,326,327,328],{},"무채색 ink 11단 + 단일 그린 액센트. ",[27,329,330,331,334],{},"Tailwind 임의값(",[22,332,333],{},"bg-[#...]",") 금지, 항상 변수 사용.",[246,336,339],{"className":337,"code":338,"language":251},[249],"\u002F* 무채색 ink (≈ Tailwind zinc) *\u002F\n--ink-900 #0a0a0a … --ink-50 #f4f4f5\n--paper   #fafaf9     \u002F* 앱 배경 *\u002F\n--line    #ececec     \u002F* 1px hairline border *\u002F\n--white   #ffffff     \u002F* 카드·탑바·입력 표면 *\u002F\n\n\u002F* 단일 액센트 — Green *\u002F\n--accent      #00DC82  \u002F* AI·Live·+delta·Primary CTA *\u002F\n--accent-soft #e6fbf2  \u002F* pill\u002F배경 *\u002F\n--accent-ink  #007a48  \u002F* 라이트 위 액센트 텍스트 *\u002F\n\n\u002F* 시맨틱: --{success|warning|danger|info}-{soft|line|ink} *\u002F\n\u002F* 레이아웃 *\u002F\n--container-max 1400px\n",[22,340,338],{"__ignoreMap":254},[317,342,344,345,176],{"id":343},"_32-nuxt-ui-테마-appconfigts","3.2 Nuxt UI 테마 (",[18,346,348],{"href":347},"..\u002Fapp\u002Fapp.config.ts","app.config.ts",[246,350,354],{"className":351,"code":352,"language":353,"meta":254,"style":254},"language-ts shiki shiki-themes github-light github-dark","export default defineAppConfig({\n  ui: { colors: { primary: 'zinc', neutral: 'zinc' } }\n})\n","ts",[22,355,356,376,394],{"__ignoreMap":254},[357,358,361,365,368,372],"span",{"class":359,"line":360},"line",1,[357,362,364],{"class":363},"szBVR","export",[357,366,367],{"class":363}," default",[357,369,371],{"class":370},"sScJk"," defineAppConfig",[357,373,375],{"class":374},"sVt8B","({\n",[357,377,379,382,386,389,391],{"class":359,"line":378},2,[357,380,381],{"class":374},"  ui: { colors: { primary: ",[357,383,385],{"class":384},"sZZnC","'zinc'",[357,387,388],{"class":374},", neutral: ",[357,390,385],{"class":384},[357,392,393],{"class":374}," } }\n",[357,395,397],{"class":359,"line":396},3,[357,398,399],{"class":374},"})\n",[14,401,402,403,196,406,409,410,412],{},"기본 색은 무채색(zinc). 액센트(그린)는 의미 있는 곳에만 — ",[22,404,405],{},".btn-accent",[22,407,408],{},".btn-primary","(ink-900) 등 ",[18,411,324],{"href":323}," 클래스로 표현.",[317,414,416],{"id":415},"_33-폰트","3.3 폰트",[70,418,419,431],{},[73,420,421],{},[76,422,423,426,428],{},[79,424,425],{},"용도",[79,427,187],{},[79,429,430],{},"변수",[89,432,433,447,465,481],{},[76,434,435,438,443],{},[94,436,437],{},"UI 텍스트",[94,439,440],{},[27,441,442],{},"Inter",[94,444,445],{},[22,446,195],{},[76,448,449,452,461],{},[94,450,451],{},"숫자·ID·코드",[94,453,454,457,458,176],{},[27,455,456],{},"JetBrains Mono"," (",[22,459,460],{},"tabular-nums",[94,462,463],{},[22,464,199],{},[76,466,467,470,475],{},[94,468,469],{},"한국어 fallback",[94,471,472],{},[27,473,474],{},"Pretendard",[94,476,477,478,480],{},"(",[22,479,195],{},"에 포함)",[76,482,483,486,489],{},[94,484,485],{},"대형 디스플레이",[94,487,488],{},"Instrument Serif",[94,490,491],{},[22,492,493],{},"--font-serif",[14,495,496,154,499,502],{},[18,497,266],{"href":498},"..\u002Fnuxt.config.ts",[22,500,501],{},"app.head.link","에서 로드.",[317,504,506],{"id":505},"_34-레이아웃-폭","3.4 레이아웃 폭",[70,508,509,520],{},[73,510,511],{},[76,512,513,515,518],{},[79,514,81],{},[79,516,517],{},"max-width",[79,519,87],{},[89,521,522,533,552],{},[76,523,524,527,530],{},[94,525,526],{},"Topbar(GNB)",[94,528,529],{},"화면 폭",[94,531,532],{},"56px 높이, sticky, 단일 행",[76,534,535,541,549],{},[94,536,537,538,176],{},"본문 (",[22,539,540],{},".app-container",[94,542,543,457,546,176],{},[27,544,545],{},"1400px",[22,547,548],{},"--container-max",[94,550,551],{},"좌우·상하 32px",[76,553,554,557,559],{},[94,555,556],{},"푸터",[94,558,545],{},[94,560,561],{},"본문과 끝 정렬 (다크 배경)",[14,563,564,565,568],{},"UI는 100% 네이티브 스케일로 렌더된다. (구 ",[22,566,567],{},"html { zoom: 1.15 }"," 전역 확대 방식은 2026-05-20 폐기 — 좌표계 어긋남으로 팝오버·정렬 버그를 유발해 제거.)",[317,570,572,573,176],{"id":571},"_35-2단-콘텐츠-content-2col","3.5 2단 콘텐츠 (",[22,574,575],{},".content-2col",[14,577,578,581,582,585],{},[22,579,580],{},"grid-template-columns: minmax(0,1fr) 320px; gap: 24px",". ",[22,583,584],{},"\u003C= 1024px","에서 1단으로 접힘.",[62,587],{},[65,589,591],{"id":590},"_4-html-vue-작성-규칙","4. HTML \u002F Vue 작성 규칙",[317,593,595],{"id":594},"_41-컴포넌트-형식","4.1 컴포넌트 형식",[259,597,598,607,610,617],{},[262,599,600,606],{},[27,601,602,603],{},"반드시 ",[22,604,605],{},"\u003Cscript setup lang=\"ts\">",". Options API 금지.",[262,608,609],{},"한 파일에 한 컴포넌트.",[262,611,612,613,616],{},"파일명: PascalCase (",[22,614,615],{},"AppGnb.vue",").",[262,618,619,620,626,627,630],{},"자체 컴포넌트는 ",[27,621,622,625],{},[22,623,624],{},"App*"," 접두사",", Nuxt UI는 자동 ",[22,628,629],{},"U*"," — 두 네임스페이스로 구분.",[317,632,634],{"id":633},"_42-페이지-컴포넌트-템플릿","4.2 페이지 컴포넌트 템플릿",[14,636,637],{},"placeholder 단계의 표준:",[246,639,643],{"className":640,"code":641,"language":642,"meta":254,"style":254},"language-vue shiki shiki-themes github-light github-dark","\u003Cscript setup lang=\"ts\">\nuseHead({ title: 'XXX' })\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CAppPagePlaceholder\n    title=\"XXX\"\n    category=\"대분류 · 소분류\"\n    description=\"간단한 설명\"\n  \u002F>\n\u003C\u002Ftemplate>\n","vue",[22,644,645,669,683,692,699,709,718,729,740,751,757],{"__ignoreMap":254},[357,646,647,650,654,657,660,663,666],{"class":359,"line":360},[357,648,649],{"class":374},"\u003C",[357,651,653],{"class":652},"s9eBZ","script",[357,655,656],{"class":370}," setup",[357,658,659],{"class":370}," lang",[357,661,662],{"class":374},"=",[357,664,665],{"class":384},"\"ts\"",[357,667,668],{"class":374},">\n",[357,670,671,674,677,680],{"class":359,"line":378},[357,672,673],{"class":370},"useHead",[357,675,676],{"class":374},"({ title: ",[357,678,679],{"class":384},"'XXX'",[357,681,682],{"class":374}," })\n",[357,684,685,688,690],{"class":359,"line":396},[357,686,687],{"class":374},"\u003C\u002F",[357,689,653],{"class":652},[357,691,668],{"class":374},[357,693,695],{"class":359,"line":694},4,[357,696,698],{"emptyLinePlaceholder":697},true,"\n",[357,700,702,704,707],{"class":359,"line":701},5,[357,703,649],{"class":374},[357,705,706],{"class":652},"template",[357,708,668],{"class":374},[357,710,712,715],{"class":359,"line":711},6,[357,713,714],{"class":374},"  \u003C",[357,716,717],{"class":652},"AppPagePlaceholder\n",[357,719,721,724,726],{"class":359,"line":720},7,[357,722,723],{"class":370},"    title",[357,725,662],{"class":374},[357,727,728],{"class":384},"\"XXX\"\n",[357,730,732,735,737],{"class":359,"line":731},8,[357,733,734],{"class":370},"    category",[357,736,662],{"class":374},[357,738,739],{"class":384},"\"대분류 · 소분류\"\n",[357,741,743,746,748],{"class":359,"line":742},9,[357,744,745],{"class":370},"    description",[357,747,662],{"class":374},[357,749,750],{"class":384},"\"간단한 설명\"\n",[357,752,754],{"class":359,"line":753},10,[357,755,756],{"class":374},"  \u002F>\n",[357,758,760,762,764],{"class":359,"line":759},11,[357,761,687],{"class":374},[357,763,706],{"class":652},[357,765,668],{"class":374},[14,767,768],{},"본격 구현 시:",[246,770,772],{"className":640,"code":771,"language":642,"meta":254,"style":254},"\u003Cscript setup lang=\"ts\">\nuseHead({ title: 'XXX' })\n\n\u002F\u002F 1. 타입 \u002F 스키마 (Zod)\n\u002F\u002F 2. 상태 (ref\u002Fcomputed)\n\u002F\u002F 3. 데이터 fetch (useFetch \u002F useApi)\n\u002F\u002F 4. 핸들러\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"app-container py-8\">\n    \u003Cheader class=\"mb-6\">\n      \u003Ch1 class=\"text-2xl font-bold\">XXX\u003C\u002Fh1>\n      \u003Cp class=\"text-sm text-gray-500 mt-1\">설명\u003C\u002Fp>\n    \u003C\u002Fheader>\n    \u003C!-- 본문 -->\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cstyle scoped>\n\u002F* 페이지 전용 스타일 *\u002F\n\u003C\u002Fstyle>\n",[22,773,774,790,800,804,810,815,820,825,833,837,845,862,880,902,923,933,939,949,958,963,976,982],{"__ignoreMap":254},[357,775,776,778,780,782,784,786,788],{"class":359,"line":360},[357,777,649],{"class":374},[357,779,653],{"class":652},[357,781,656],{"class":370},[357,783,659],{"class":370},[357,785,662],{"class":374},[357,787,665],{"class":384},[357,789,668],{"class":374},[357,791,792,794,796,798],{"class":359,"line":378},[357,793,673],{"class":370},[357,795,676],{"class":374},[357,797,679],{"class":384},[357,799,682],{"class":374},[357,801,802],{"class":359,"line":396},[357,803,698],{"emptyLinePlaceholder":697},[357,805,806],{"class":359,"line":694},[357,807,809],{"class":808},"sJ8bj","\u002F\u002F 1. 타입 \u002F 스키마 (Zod)\n",[357,811,812],{"class":359,"line":701},[357,813,814],{"class":808},"\u002F\u002F 2. 상태 (ref\u002Fcomputed)\n",[357,816,817],{"class":359,"line":711},[357,818,819],{"class":808},"\u002F\u002F 3. 데이터 fetch (useFetch \u002F useApi)\n",[357,821,822],{"class":359,"line":720},[357,823,824],{"class":808},"\u002F\u002F 4. 핸들러\n",[357,826,827,829,831],{"class":359,"line":731},[357,828,687],{"class":374},[357,830,653],{"class":652},[357,832,668],{"class":374},[357,834,835],{"class":359,"line":742},[357,836,698],{"emptyLinePlaceholder":697},[357,838,839,841,843],{"class":359,"line":753},[357,840,649],{"class":374},[357,842,706],{"class":652},[357,844,668],{"class":374},[357,846,847,849,852,855,857,860],{"class":359,"line":759},[357,848,714],{"class":374},[357,850,851],{"class":652},"div",[357,853,854],{"class":370}," class",[357,856,662],{"class":374},[357,858,859],{"class":384},"\"app-container py-8\"",[357,861,668],{"class":374},[357,863,865,868,871,873,875,878],{"class":359,"line":864},12,[357,866,867],{"class":374},"    \u003C",[357,869,870],{"class":652},"header",[357,872,854],{"class":370},[357,874,662],{"class":374},[357,876,877],{"class":384},"\"mb-6\"",[357,879,668],{"class":374},[357,881,883,886,888,890,892,895,898,900],{"class":359,"line":882},13,[357,884,885],{"class":374},"      \u003C",[357,887,10],{"class":652},[357,889,854],{"class":370},[357,891,662],{"class":374},[357,893,894],{"class":384},"\"text-2xl font-bold\"",[357,896,897],{"class":374},">XXX\u003C\u002F",[357,899,10],{"class":652},[357,901,668],{"class":374},[357,903,905,907,909,911,913,916,919,921],{"class":359,"line":904},14,[357,906,885],{"class":374},[357,908,14],{"class":652},[357,910,854],{"class":370},[357,912,662],{"class":374},[357,914,915],{"class":384},"\"text-sm text-gray-500 mt-1\"",[357,917,918],{"class":374},">설명\u003C\u002F",[357,920,14],{"class":652},[357,922,668],{"class":374},[357,924,926,929,931],{"class":359,"line":925},15,[357,927,928],{"class":374},"    \u003C\u002F",[357,930,870],{"class":652},[357,932,668],{"class":374},[357,934,936],{"class":359,"line":935},16,[357,937,938],{"class":808},"    \u003C!-- 본문 -->\n",[357,940,942,945,947],{"class":359,"line":941},17,[357,943,944],{"class":374},"  \u003C\u002F",[357,946,851],{"class":652},[357,948,668],{"class":374},[357,950,952,954,956],{"class":359,"line":951},18,[357,953,687],{"class":374},[357,955,706],{"class":652},[357,957,668],{"class":374},[357,959,961],{"class":359,"line":960},19,[357,962,698],{"emptyLinePlaceholder":697},[357,964,966,968,971,974],{"class":359,"line":965},20,[357,967,649],{"class":374},[357,969,970],{"class":652},"style",[357,972,973],{"class":370}," scoped",[357,975,668],{"class":374},[357,977,979],{"class":359,"line":978},21,[357,980,981],{"class":808},"\u002F* 페이지 전용 스타일 *\u002F\n",[357,983,985,987,989],{"class":359,"line":984},22,[357,986,687],{"class":374},[357,988,970],{"class":652},[357,990,668],{"class":374},[317,992,994,995,176],{"id":993},"_43-페이지-메타-definepagemeta","4.3 페이지 메타 (",[22,996,997],{},"definePageMeta",[70,999,1000,1010],{},[73,1001,1002],{},[76,1003,1004,1007],{},[79,1005,1006],{},"페이지 종류",[79,1008,1009],{},"설정",[89,1011,1012,1020,1030,1040],{},[76,1013,1014,1017],{},[94,1015,1016],{},"일반 (GNB + Footer)",[94,1018,1019],{},"(기본, 설정 없음)",[76,1021,1022,1025],{},[94,1023,1024],{},"로그인\u002F회원가입\u002F재설정",[94,1026,1027],{},[22,1028,1029],{},"definePageMeta({ layout: 'auth', auth: false })",[76,1031,1032,1035],{},[94,1033,1034],{},"404\u002F시스템 에러\u002F점검",[94,1036,1037],{},[22,1038,1039],{},"definePageMeta({ layout: 'blank', auth: false })",[76,1041,1042,1045],{},[94,1043,1044],{},"리다이렉트만 하는 페이지",[94,1046,1047],{},[22,1048,1049],{},"definePageMeta({ layout: false })",[317,1051,1053],{"id":1052},"_44-자동-임포트-nuxt-4","4.4 자동 임포트 (Nuxt 4)",[14,1055,1056],{},"다음 API\u002F유틸은 import 없이 사용 가능:",[259,1058,1059,1083,1115,1125,1139],{},[262,1060,1061,1062,45,1065,45,1068,45,1071,45,1074,45,1077,45,1080],{},"Vue: ",[22,1063,1064],{},"ref",[22,1066,1067],{},"computed",[22,1069,1070],{},"watch",[22,1072,1073],{},"onMounted",[22,1075,1076],{},"defineProps",[22,1078,1079],{},"defineEmits",[22,1081,1082],{},"defineModel",[262,1084,1085,1086,45,1088,45,1091,45,1094,45,1097,45,1100,45,1103,45,1106,45,1109,45,1112],{},"Nuxt: ",[22,1087,673],{},[22,1089,1090],{},"useState",[22,1092,1093],{},"useRoute",[22,1095,1096],{},"useRouter",[22,1098,1099],{},"useFetch",[22,1101,1102],{},"$fetch",[22,1104,1105],{},"navigateTo",[22,1107,1108],{},"useRuntimeConfig",[22,1110,1111],{},"useNuxtApp",[22,1113,1114],{},"useToast",[262,1116,1117,1118,1121,1122,1124],{},"Components: ",[22,1119,1120],{},"app\u002Fcomponents\u002F"," 아래 전부, Nuxt UI ",[22,1123,629],{}," 전부",[262,1126,1127,1128,1131,1132,45,1135,1138],{},"composables: ",[22,1129,1130],{},"app\u002Fcomposables\u002F"," 아래 전부 (",[22,1133,1134],{},"useApi",[22,1136,1137],{},"useExportJob"," 등)",[262,1140,1141,1142,1131,1145,176],{},"stores: ",[22,1143,1144],{},"app\u002Fstores\u002F",[22,1146,1147],{},"useAuthStore",[317,1149,1151],{"id":1150},"_45-접근성","4.5 접근성",[259,1153,1154,1161,1164,1171],{},[262,1155,1156,1157,1160],{},"form 요소에 label 또는 ",[22,1158,1159],{},"aria-label"," 필수",[262,1162,1163],{},"키보드 조작 가능 — Nuxt UI(Reka UI)가 대부분 처리해 줍니다",[262,1165,1166,1167,1170],{},"focus ring 유지 (Tailwind 기본 ",[22,1168,1169],{},"focus-visible:ring-*"," 또는 Nuxt UI 기본 스타일)",[262,1172,1173,1174,1177,1178,1180],{},"한국어 콘텐츠: ",[22,1175,1176],{},"\u003Chtml lang=\"ko\">"," (이미 ",[22,1179,266],{},"에서 설정)",[62,1182],{},[65,1184,1186],{"id":1185},"_5-css-작성-규칙","5. CSS 작성 규칙",[317,1188,1190],{"id":1189},"_51-우선순위","5.1 우선순위",[1192,1193,1194,1200,1211,1227],"ol",{},[262,1195,1196,1199],{},[27,1197,1198],{},"Nuxt UI 컴포넌트의 색·간격·라운드 기본값"," 우선 사용",[262,1201,1202,1203,1206,1207,1210],{},"필요하면 Nuxt UI 컴포넌트의 ",[22,1204,1205],{},"class"," prop 또는 ",[22,1208,1209],{},":ui"," prop으로 미세 조정",[262,1212,1213,1214,1219,1220,1223,1224,1138],{},"자체 CSS는 ",[27,1215,1216],{},[22,1217,1218],{},"\u003Cstyle scoped>"," + CSS 변수(",[22,1221,1222],{},"var(--line)","·",[22,1225,1226],{},"var(--ink-*)",[262,1228,1229,1230,176],{},"마지막 수단으로 Tailwind 임의값 (",[22,1231,1232],{},"text-[#1f2937]",[317,1234,1236],{"id":1235},"_52-디자인-토큰-사용","5.2 디자인 토큰 사용",[14,1238,1239,1240,1242,1243,1246,1247,1261],{},"자체 CSS는 항상 ",[18,1241,52],{"href":51},"의 ink\u002Faccent\u002Fsemantic 토큰을 CSS 변수로 씁니다. 구 시안 base.css·",[22,1244,1245],{},"--gray-*"," 별칭은 2026-05-18 피벗으로 폐기됨(별칭은 main.css에 backward-compat용으로만 남아 있음) — ",[27,1248,1249,1250,1253,1254,1253,1257,1260],{},"신규 코드는 ",[22,1251,1252],{},"--ink-*","\u002F",[22,1255,1256],{},"--line",[22,1258,1259],{},"--accent","를 직접 사용",".",[14,1263,1264,1265,1223,1268,1223,1271,1223,1274,1277,1278,1280],{},"공용 클래스(",[22,1266,1267],{},".card",[22,1269,1270],{},".btn",[22,1272,1273],{},".table",[22,1275,1276],{},".form-row"," 등)는 ",[18,1279,324],{"href":323},"가 정본이며, 컴포넌트는 이 클래스를 그대로 차용하면 유지보수가 쉬워집니다.",[14,1282,1283,1284,1287],{},"예 (",[18,1285,615],{"href":1286},"..\u002Fapp\u002Fcomponents\u002FAppGnb.vue","):",[246,1289,1291],{"className":640,"code":1290,"language":642,"meta":254,"style":254},"\u003Cstyle scoped>\n.gnb {\n  position: sticky;\n  top: 0;\n  z-index: 1030;\n  background: var(--white);\n  border-bottom: 1px solid var(--line);\n  height: var(--gnb-height);\n}\n.gnb-nav-item:hover .gnb-dropdown {\n  opacity: 1;\n  visibility: visible;\n  transform: translateY(0);\n}\n\u003C\u002Fstyle>\n",[22,1292,1293,1303,1311,1326,1338,1350,1369,1394,1410,1415,1425,1436,1448,1464,1468],{"__ignoreMap":254},[357,1294,1295,1297,1299,1301],{"class":359,"line":360},[357,1296,649],{"class":374},[357,1298,970],{"class":652},[357,1300,973],{"class":370},[357,1302,668],{"class":374},[357,1304,1305,1308],{"class":359,"line":378},[357,1306,1307],{"class":370},".gnb",[357,1309,1310],{"class":374}," {\n",[357,1312,1313,1317,1320,1323],{"class":359,"line":396},[357,1314,1316],{"class":1315},"sj4cs","  position",[357,1318,1319],{"class":374},": ",[357,1321,1322],{"class":1315},"sticky",[357,1324,1325],{"class":374},";\n",[357,1327,1328,1331,1333,1336],{"class":359,"line":694},[357,1329,1330],{"class":1315},"  top",[357,1332,1319],{"class":374},[357,1334,1335],{"class":1315},"0",[357,1337,1325],{"class":374},[357,1339,1340,1343,1345,1348],{"class":359,"line":701},[357,1341,1342],{"class":1315},"  z-index",[357,1344,1319],{"class":374},[357,1346,1347],{"class":1315},"1030",[357,1349,1325],{"class":374},[357,1351,1352,1355,1357,1360,1362,1366],{"class":359,"line":711},[357,1353,1354],{"class":1315},"  background",[357,1356,1319],{"class":374},[357,1358,1359],{"class":1315},"var",[357,1361,477],{"class":374},[357,1363,1365],{"class":1364},"s4XuR","--white",[357,1367,1368],{"class":374},");\n",[357,1370,1371,1374,1376,1379,1382,1385,1388,1390,1392],{"class":359,"line":720},[357,1372,1373],{"class":1315},"  border-bottom",[357,1375,1319],{"class":374},[357,1377,1378],{"class":1315},"1",[357,1380,1381],{"class":363},"px",[357,1383,1384],{"class":1315}," solid",[357,1386,1387],{"class":1315}," var",[357,1389,477],{"class":374},[357,1391,1256],{"class":1364},[357,1393,1368],{"class":374},[357,1395,1396,1399,1401,1403,1405,1408],{"class":359,"line":731},[357,1397,1398],{"class":1315},"  height",[357,1400,1319],{"class":374},[357,1402,1359],{"class":1315},[357,1404,477],{"class":374},[357,1406,1407],{"class":1364},"--gnb-height",[357,1409,1368],{"class":374},[357,1411,1412],{"class":359,"line":742},[357,1413,1414],{"class":374},"}\n",[357,1416,1417,1420,1423],{"class":359,"line":753},[357,1418,1419],{"class":370},".gnb-nav-item:hover",[357,1421,1422],{"class":370}," .gnb-dropdown",[357,1424,1310],{"class":374},[357,1426,1427,1430,1432,1434],{"class":359,"line":759},[357,1428,1429],{"class":1315},"  opacity",[357,1431,1319],{"class":374},[357,1433,1378],{"class":1315},[357,1435,1325],{"class":374},[357,1437,1438,1441,1443,1446],{"class":359,"line":864},[357,1439,1440],{"class":1315},"  visibility",[357,1442,1319],{"class":374},[357,1444,1445],{"class":1315},"visible",[357,1447,1325],{"class":374},[357,1449,1450,1453,1455,1458,1460,1462],{"class":359,"line":882},[357,1451,1452],{"class":1315},"  transform",[357,1454,1319],{"class":374},[357,1456,1457],{"class":1315},"translateY",[357,1459,477],{"class":374},[357,1461,1335],{"class":1315},[357,1463,1368],{"class":374},[357,1465,1466],{"class":359,"line":904},[357,1467,1414],{"class":374},[357,1469,1470,1472,1474],{"class":359,"line":925},[357,1471,687],{"class":374},[357,1473,970],{"class":652},[357,1475,668],{"class":374},[317,1477,1479],{"id":1478},"_53-절대-하지-말-것","5.3 절대 하지 말 것",[259,1481,1482,1487,1494,1501],{},[262,1483,1484,1486],{},[22,1485,153],{}," 설치 (Nuxt UI 모듈이 Tailwind를 통합 관리)",[262,1488,1489,1490,1493],{},"인라인 ",[22,1491,1492],{},"style=\"color: #6366f1\""," 같은 하드코딩 (단, 동적 색상은 인라인 OK)",[262,1495,1496,1497,1500],{},"전역 ",[22,1498,1499],{},":root"," 변수를 컴포넌트 안에서 재정의 (예외적인 경우만)",[262,1502,1503,1506],{},[22,1504,1505],{},"!important"," 남용 (Tailwind v4의 우선순위가 충분히 강합니다)",[317,1508,1510],{"id":1509},"_54-다크-모드","5.4 다크 모드",[14,1512,1513,1514,1517],{},"현 단계: 라이트 모드 단일. CSS 변수가 다크 호환 가능한 구조라 추후 ",[22,1515,1516],{},":root[data-theme=\"dark\"]","에서 변수 재정의로 도입.",[62,1519],{},[65,1521,1523],{"id":1522},"_6-js-ts-작성-규칙","6. JS \u002F TS 작성 규칙",[317,1525,1527],{"id":1526},"_61-타입","6.1 타입",[259,1529,1530,1541,1557,1618],{},[262,1531,1532,1536,1537,1540],{},[27,1533,1534,123],{},[22,1535,122],{}," (불가피하면 ",[22,1538,1539],{},"unknown"," 후 narrow)",[262,1542,1543,1544,1550,1551],{},"도메인 타입은 ",[18,1545,1547],{"href":1546},"..\u002Fapp\u002Ftypes\u002Fdomain.ts",[22,1548,1549],{},"app\u002Ftypes\u002Fdomain.ts",", API 타입은 ",[18,1552,1554],{"href":1553},"..\u002Fapp\u002Ftypes\u002Fapi.ts",[22,1555,1556],{},"app\u002Ftypes\u002Fapi.ts",[262,1558,1559,1560],{},"props\u002Femits는 제네릭 형태:\n",[246,1561,1563],{"className":351,"code":1562,"language":353,"meta":254,"style":254},"defineProps\u003C{ title: string; count?: number }>()\ndefineEmits\u003C{ confirm: []; cancel: [] }>()\n",[22,1564,1565,1596],{"__ignoreMap":254},[357,1566,1567,1569,1572,1575,1578,1581,1584,1587,1590,1593],{"class":359,"line":360},[357,1568,1076],{"class":370},[357,1570,1571],{"class":374},"\u003C{ ",[357,1573,1574],{"class":1364},"title",[357,1576,1577],{"class":363},":",[357,1579,1580],{"class":1315}," string",[357,1582,1583],{"class":374},"; ",[357,1585,1586],{"class":1364},"count",[357,1588,1589],{"class":363},"?:",[357,1591,1592],{"class":1315}," number",[357,1594,1595],{"class":374}," }>()\n",[357,1597,1598,1600,1602,1605,1607,1610,1613,1615],{"class":359,"line":378},[357,1599,1079],{"class":370},[357,1601,1571],{"class":374},[357,1603,1604],{"class":1364},"confirm",[357,1606,1577],{"class":363},[357,1608,1609],{"class":374}," []; ",[357,1611,1612],{"class":1364},"cancel",[357,1614,1577],{"class":363},[357,1616,1617],{"class":374}," [] }>()\n",[262,1619,1620,1621,1623,1624],{},"v-model은 ",[22,1622,1082],{},":\n",[246,1625,1627],{"className":351,"code":1626,"language":353,"meta":254,"style":254},"const open = defineModel\u003Cboolean>('open', { default: false })\n",[22,1628,1629],{"__ignoreMap":254},[357,1630,1631,1634,1637,1640,1643,1645,1648,1651,1654,1657,1660],{"class":359,"line":360},[357,1632,1633],{"class":363},"const",[357,1635,1636],{"class":1315}," open",[357,1638,1639],{"class":363}," =",[357,1641,1642],{"class":370}," defineModel",[357,1644,649],{"class":374},[357,1646,1647],{"class":1315},"boolean",[357,1649,1650],{"class":374},">(",[357,1652,1653],{"class":384},"'open'",[357,1655,1656],{"class":374},", { default: ",[357,1658,1659],{"class":1315},"false",[357,1661,682],{"class":374},[317,1663,1665],{"id":1664},"_62-api-호출","6.2 API 호출",[14,1667,1668,1669,1671,1672,1577],{},"직접 ",[22,1670,1102],{}," 호출 대신 항상 ",[18,1673,1675],{"href":1674},"..\u002Fapp\u002Fcomposables\u002FuseApi.ts",[22,1676,1677],{},"useApi()",[246,1679,1681],{"className":351,"code":1680,"language":353,"meta":254,"style":254},"const api = useApi()\nconst items = await api\u003CPaginated\u003CItem>>('\u002Fmessages', {\n  query: { page: 1, channel: 'sms' }\n})\n",[22,1682,1683,1698,1731,1747],{"__ignoreMap":254},[357,1684,1685,1687,1690,1692,1695],{"class":359,"line":360},[357,1686,1633],{"class":363},[357,1688,1689],{"class":1315}," api",[357,1691,1639],{"class":363},[357,1693,1694],{"class":370}," useApi",[357,1696,1697],{"class":374},"()\n",[357,1699,1700,1702,1705,1707,1710,1712,1714,1717,1719,1722,1725,1728],{"class":359,"line":378},[357,1701,1633],{"class":363},[357,1703,1704],{"class":1315}," items",[357,1706,1639],{"class":363},[357,1708,1709],{"class":363}," await",[357,1711,1689],{"class":370},[357,1713,649],{"class":374},[357,1715,1716],{"class":370},"Paginated",[357,1718,649],{"class":374},[357,1720,1721],{"class":370},"Item",[357,1723,1724],{"class":374},">>(",[357,1726,1727],{"class":384},"'\u002Fmessages'",[357,1729,1730],{"class":374},", {\n",[357,1732,1733,1736,1738,1741,1744],{"class":359,"line":396},[357,1734,1735],{"class":374},"  query: { page: ",[357,1737,1378],{"class":1315},[357,1739,1740],{"class":374},", channel: ",[357,1742,1743],{"class":384},"'sms'",[357,1745,1746],{"class":374}," }\n",[357,1748,1749],{"class":359,"line":694},[357,1750,399],{"class":374},[14,1752,1753],{},"장점:",[259,1755,1756,1759,1766],{},[262,1757,1758],{},"baseURL \u002F credentials \u002F Accept 자동",[262,1760,1761,1762,1765],{},"401 → ",[22,1763,1764],{},"\u002Flogin"," 리다이렉트 자동",[262,1767,1768],{},"에러 표준화",[317,1770,1772],{"id":1771},"_63-composable-패턴","6.3 composable 패턴",[259,1774,1775,1782,1792],{},[262,1776,1777,1778,1781],{},"파일명·함수명 모두 ",[22,1779,1780],{},"use*","로 시작",[262,1783,1784,1785,45,1787,45,1789,176],{},"한 책임에 집중 (",[22,1786,1134],{},[22,1788,1137],{},[22,1790,1791],{},"useAiTemplate",[262,1793,1794,1795,1798],{},"반환은 객체로 (",[22,1796,1797],{},"return { data, refresh }"," 같은 형태)",[317,1800,1802],{"id":1801},"_64-pinia-store","6.4 Pinia store",[259,1804,1805,1815],{},[262,1806,1807,1808,1811,1812,176],{},"파일: ",[22,1809,1810],{},"app\u002Fstores\u002F{name}.ts"," → 자동 import (",[22,1813,1814],{},"useXxxStore",[262,1816,1817,1818],{},"옵션 API 형식 (Pinia 표준):\n",[246,1819,1821],{"className":351,"code":1820,"language":353,"meta":254,"style":254},"export const useAuthStore = defineStore('auth', {\n  state: () => ({ ... }),\n  getters: { ... },\n  actions: { async logout() { ... } }\n})\n",[22,1822,1823,1845,1865,1875,1893],{"__ignoreMap":254},[357,1824,1825,1827,1830,1833,1835,1838,1840,1843],{"class":359,"line":360},[357,1826,364],{"class":363},[357,1828,1829],{"class":363}," const",[357,1831,1832],{"class":1315}," useAuthStore",[357,1834,1639],{"class":363},[357,1836,1837],{"class":370}," defineStore",[357,1839,477],{"class":374},[357,1841,1842],{"class":384},"'auth'",[357,1844,1730],{"class":374},[357,1846,1847,1850,1853,1856,1859,1862],{"class":359,"line":378},[357,1848,1849],{"class":370},"  state",[357,1851,1852],{"class":374},": () ",[357,1854,1855],{"class":363},"=>",[357,1857,1858],{"class":374}," ({ ",[357,1860,1861],{"class":363},"...",[357,1863,1864],{"class":374}," }),\n",[357,1866,1867,1870,1872],{"class":359,"line":396},[357,1868,1869],{"class":374},"  getters: { ",[357,1871,1861],{"class":363},[357,1873,1874],{"class":374}," },\n",[357,1876,1877,1880,1883,1886,1889,1891],{"class":359,"line":694},[357,1878,1879],{"class":374},"  actions: { ",[357,1881,1882],{"class":363},"async",[357,1884,1885],{"class":370}," logout",[357,1887,1888],{"class":374},"() { ",[357,1890,1861],{"class":363},[357,1892,393],{"class":374},[357,1894,1895],{"class":359,"line":701},[357,1896,399],{"class":374},[317,1898,1900],{"id":1899},"_65-검증-zod","6.5 검증 (Zod)",[14,1902,1903],{},"폼·외부 응답은 Zod로 파싱:",[246,1905,1907],{"className":351,"code":1906,"language":353,"meta":254,"style":254},"import { z } from 'zod'\n\nconst SendSmsSchema = z.object({\n  to: z.string().min(1),\n  body: z.string().min(1).max(2000)\n})\ntype SendSms = z.infer\u003Ctypeof SendSmsSchema>\n",[22,1908,1909,1923,1927,1944,1965,1993,1997],{"__ignoreMap":254},[357,1910,1911,1914,1917,1920],{"class":359,"line":360},[357,1912,1913],{"class":363},"import",[357,1915,1916],{"class":374}," { z } ",[357,1918,1919],{"class":363},"from",[357,1921,1922],{"class":384}," 'zod'\n",[357,1924,1925],{"class":359,"line":378},[357,1926,698],{"emptyLinePlaceholder":697},[357,1928,1929,1931,1934,1936,1939,1942],{"class":359,"line":396},[357,1930,1633],{"class":363},[357,1932,1933],{"class":1315}," SendSmsSchema",[357,1935,1639],{"class":363},[357,1937,1938],{"class":374}," z.",[357,1940,1941],{"class":370},"object",[357,1943,375],{"class":374},[357,1945,1946,1949,1952,1955,1958,1960,1962],{"class":359,"line":694},[357,1947,1948],{"class":374},"  to: z.",[357,1950,1951],{"class":370},"string",[357,1953,1954],{"class":374},"().",[357,1956,1957],{"class":370},"min",[357,1959,477],{"class":374},[357,1961,1378],{"class":1315},[357,1963,1964],{"class":374},"),\n",[357,1966,1967,1970,1972,1974,1976,1978,1980,1982,1985,1987,1990],{"class":359,"line":701},[357,1968,1969],{"class":374},"  body: z.",[357,1971,1951],{"class":370},[357,1973,1954],{"class":374},[357,1975,1957],{"class":370},[357,1977,477],{"class":374},[357,1979,1378],{"class":1315},[357,1981,616],{"class":374},[357,1983,1984],{"class":370},"max",[357,1986,477],{"class":374},[357,1988,1989],{"class":1315},"2000",[357,1991,1992],{"class":374},")\n",[357,1994,1995],{"class":359,"line":711},[357,1996,399],{"class":374},[357,1998,1999,2002,2005,2007,2010,2012,2015,2017,2020],{"class":359,"line":720},[357,2000,2001],{"class":363},"type",[357,2003,2004],{"class":370}," SendSms",[357,2006,1639],{"class":363},[357,2008,2009],{"class":370}," z",[357,2011,1261],{"class":374},[357,2013,2014],{"class":370},"infer",[357,2016,649],{"class":374},[357,2018,2019],{"class":363},"typeof",[357,2021,2022],{"class":374}," SendSmsSchema>\n",[317,2024,2026],{"id":2025},"_66-시간","6.6 시간",[14,2028,2029,2030,2033],{},"UTC ISO 8601 (",[22,2031,2032],{},"2026-05-12T03:04:05Z",")로 주고받고, 표시용 변환은 프론트엔드 책임. 라이브러리 미정 (Day.js \u002F date-fns 검토).",[62,2035],{},[65,2037,2039],{"id":2038},"_7-nuxt-ui-컴포넌트-매핑-가이드","7. Nuxt UI 컴포넌트 매핑 가이드",[14,2041,2042],{},"시안의 반복 패턴 → Nuxt UI 컴포넌트 매핑.",[70,2044,2045,2055],{},[73,2046,2047],{},[76,2048,2049,2052],{},[79,2050,2051],{},"시안 패턴",[79,2053,2054],{},"Nuxt UI \u002F 자체 컴포넌트",[89,2056,2057,2072,2090,2105,2119,2137,2151,2162,2175,2194,2204,2214,2224,2235,2245],{},[76,2058,2059,2062],{},[94,2060,2061],{},"모달 (확인\u002F알림)",[94,2063,2064,2067,2068,2071],{},[22,2065,2066],{},"AppConfirmDialog"," (자체 ",[22,2069,2070],{},"AppModal"," 기반)",[76,2073,2074,2077],{},[94,2075,2076],{},"팝업\u002F다이얼로그(수신자 정보, 발송 컨펌, 템플릿 선택 등)",[94,2078,2079,2080,2082,2083,273,2086,2089],{},"자체 ",[22,2081,2070],{}," 기반 ",[22,2084,2085],{},"App*Dialog",[22,2087,2088],{},"USlideover","는 모바일 GNB 드로어 전용",[76,2091,2092,2095],{},[94,2093,2094],{},"다운로드 요청 완료 토스트",[94,2096,2097,2100,2101,2104],{},[22,2098,2099],{},"useToast()"," → 내부에서 ",[22,2102,2103],{},"UNotification"," 표시",[76,2106,2107,2110],{},[94,2108,2109],{},"채널\u002F카테고리 트리",[94,2111,2112,2115,2116],{},[22,2113,2114],{},"UNavigationMenu"," (수직) 또는 자체 ",[22,2117,2118],{},"AppCategoryTree",[76,2120,2121,2124],{},[94,2122,2123],{},"목록 + 정렬 + 페이징",[94,2125,2126,2129,2130,2133,2134],{},[22,2127,2128],{},"UTable"," + ",[22,2131,2132],{},"UPagination"," + 공용 ",[22,2135,2136],{},"AppFilterBar",[76,2138,2139,2142],{},[94,2140,2141],{},"폼 + 검증",[94,2143,2144,2129,2147,2150],{},[22,2145,2146],{},"UForm",[22,2148,2149],{},"UFormField"," + Zod 스키마",[76,2152,2153,2156],{},[94,2154,2155],{},"드롭다운 메뉴",[94,2157,2158,2161],{},[22,2159,2160],{},"UDropdownMenu","(click) 또는 시안 hover 스타일은 자체 CSS",[76,2163,2164,2167],{},[94,2165,2166],{},"라디오 카드 \u002F 체크박스",[94,2168,2169,45,2172],{},[22,2170,2171],{},"URadioGroup",[22,2173,2174],{},"UCheckbox",[76,2176,2177,2180],{},[94,2178,2179],{},"입력",[94,2181,2182,45,2185,45,2188,45,2191],{},[22,2183,2184],{},"UInput",[22,2186,2187],{},"UTextarea",[22,2189,2190],{},"USelect",[22,2192,2193],{},"UInputNumber",[76,2195,2196,2199],{},[94,2197,2198],{},"토글",[94,2200,2201],{},[22,2202,2203],{},"USwitch",[76,2205,2206,2209],{},[94,2207,2208],{},"탭",[94,2210,2211],{},[22,2212,2213],{},"UTabs",[76,2215,2216,2219],{},[94,2217,2218],{},"아바타",[94,2220,2221],{},[22,2222,2223],{},"UAvatar",[76,2225,2226,2229],{},[94,2227,2228],{},"카드",[94,2230,2231,2234],{},[22,2232,2233],{},"UCard"," (또는 직접 div + 시안 스타일)",[76,2236,2237,2240],{},[94,2238,2239],{},"배지",[94,2241,2242],{},[22,2243,2244],{},"UBadge",[76,2246,2247,2250],{},[94,2248,2249],{},"알림 박스",[94,2251,2252],{},[22,2253,2254],{},"UAlert",[14,2256,2257,2259],{},[22,2258,2066],{}," 사용 예 (위험 액션 컨펌):",[246,2261,2263],{"className":640,"code":2262,"language":642,"meta":254,"style":254},"\u003CAppConfirmDialog\n  v-model:open=\"open\"\n  title=\"이 캠페인을 삭제할까요?\"\n  description=\"이미 발송된 메시지는 영향을 받지 않습니다.\"\n  confirm-color=\"error\"\n  confirm-label=\"삭제\"\n  @confirm=\"onDelete\"\n\u002F>\n",[22,2264,2265,2272,2292,2302,2312,2322,2332,2348],{"__ignoreMap":254},[357,2266,2267,2269],{"class":359,"line":360},[357,2268,649],{"class":374},[357,2270,2271],{"class":652},"AppConfirmDialog\n",[357,2273,2274,2277,2279,2282,2284,2287,2289],{"class":359,"line":378},[357,2275,2276],{"class":370},"  v-model",[357,2278,1577],{"class":374},[357,2280,2281],{"class":370},"open",[357,2283,662],{"class":374},[357,2285,2286],{"class":384},"\"",[357,2288,2281],{"class":374},[357,2290,2291],{"class":384},"\"\n",[357,2293,2294,2297,2299],{"class":359,"line":396},[357,2295,2296],{"class":370},"  title",[357,2298,662],{"class":374},[357,2300,2301],{"class":384},"\"이 캠페인을 삭제할까요?\"\n",[357,2303,2304,2307,2309],{"class":359,"line":694},[357,2305,2306],{"class":370},"  description",[357,2308,662],{"class":374},[357,2310,2311],{"class":384},"\"이미 발송된 메시지는 영향을 받지 않습니다.\"\n",[357,2313,2314,2317,2319],{"class":359,"line":701},[357,2315,2316],{"class":370},"  confirm-color",[357,2318,662],{"class":374},[357,2320,2321],{"class":384},"\"error\"\n",[357,2323,2324,2327,2329],{"class":359,"line":711},[357,2325,2326],{"class":370},"  confirm-label",[357,2328,662],{"class":374},[357,2330,2331],{"class":384},"\"삭제\"\n",[357,2333,2334,2337,2339,2341,2343,2346],{"class":359,"line":720},[357,2335,2336],{"class":374},"  @",[357,2338,1604],{"class":370},[357,2340,662],{"class":374},[357,2342,2286],{"class":384},[357,2344,2345],{"class":374},"onDelete",[357,2347,2291],{"class":384},[357,2349,2350],{"class":359,"line":731},[357,2351,2352],{"class":374},"\u002F>\n",[62,2354],{},[65,2356,2358],{"id":2357},"_8-아이콘","8. 아이콘",[317,2360,2362],{"id":2361},"_81-컬렉션-이미-설치됨","8.1 컬렉션 (이미 설치됨)",[70,2364,2365,2377],{},[73,2366,2367],{},[76,2368,2369,2372,2374],{},[79,2370,2371],{},"컬렉션",[79,2373,425],{},[79,2375,2376],{},"prefix",[89,2378,2379,2393,2407],{},[76,2380,2381,2385,2388],{},[94,2382,2383],{},[22,2384,168],{},[94,2386,2387],{},"일반 UI 아이콘 (메뉴\u002F버튼\u002Fempty state)",[94,2389,2390],{},[22,2391,2392],{},"i-lucide-...",[76,2394,2395,2399,2402],{},[94,2396,2397],{},[22,2398,172],{},[94,2400,2401],{},"Nuxt UI 기본\u002F대안",[94,2403,2404],{},[22,2405,2406],{},"i-heroicons-...",[76,2408,2409,2414,2417],{},[94,2410,2411,2413],{},[22,2412,175],{}," (Bootstrap Icons)",[94,2415,2416],{},"시안 매칭용 (채널 카드 등)",[94,2418,2419],{},[22,2420,2421],{},"i-bi-...",[317,2423,2425],{"id":2424},"_82-사용-예","8.2 사용 예",[246,2427,2429],{"className":640,"code":2428,"language":642,"meta":254,"style":254},"\u003CUIcon name=\"i-lucide-send\" class=\"text-xl text-primary-500\" \u002F>\n\u003CUIcon name=\"i-bi-chat-text\" class=\"text-2xl\" \u002F>\n",[22,2430,2431,2456],{"__ignoreMap":254},[357,2432,2433,2435,2438,2441,2443,2446,2448,2450,2453],{"class":359,"line":360},[357,2434,649],{"class":374},[357,2436,2437],{"class":652},"UIcon",[357,2439,2440],{"class":370}," name",[357,2442,662],{"class":374},[357,2444,2445],{"class":384},"\"i-lucide-send\"",[357,2447,854],{"class":370},[357,2449,662],{"class":374},[357,2451,2452],{"class":384},"\"text-xl text-primary-500\"",[357,2454,2455],{"class":374}," \u002F>\n",[357,2457,2458,2460,2462,2464,2466,2469,2471,2473,2476],{"class":359,"line":378},[357,2459,649],{"class":374},[357,2461,2437],{"class":652},[357,2463,2440],{"class":370},[357,2465,662],{"class":374},[357,2467,2468],{"class":384},"\"i-bi-chat-text\"",[357,2470,854],{"class":370},[357,2472,662],{"class":374},[357,2474,2475],{"class":384},"\"text-2xl\"",[357,2477,2455],{"class":374},[14,2479,2480],{},"브랜드\u002F페이지 단위로 컬렉션을 일관되게:",[259,2482,2483,2490],{},[262,2484,2485,2486,2489],{},"채널 카드 → ",[22,2487,2488],{},"i-bi-*"," (시안 톤)",[262,2491,2492,2493],{},"일반 액션·메뉴 → ",[22,2494,182],{},[62,2496],{},[65,2498,2500],{"id":2499},"_9-레이아웃-컴포넌트","9. 레이아웃 컴포넌트",[317,2502,2504,2505,176],{"id":2503},"_91-appgnb-appgnbvue","9.1 AppGnb (",[18,2506,2507],{"href":1286},[22,2508,615],{},[259,2510,2511,2522,2529,2532,2535],{},[262,2512,2513,2514,2517,2518,2521],{},"sticky top, ",[27,2515,2516],{},"56px 높이",", 단일 행(시안의 2단 GNB 폐기), ",[22,2519,2520],{},"rgba(255,255,255,*)"," 불투명 배경 + 하단 1px line",[262,2523,2524,2525,2528],{},"좌: 로고 (",[22,2526,2527],{},"AppLogoMark"," + \"맑은\" + \"message\")",[262,2530,2531],{},"중: 7개 메뉴 (서비스 \u002F 메시지 발송 \u002F 발송 조회·통계 \u002F 주소록 \u002F 발신 정보 \u002F 메시지 관리 \u002F 캠페인) — hover 드롭다운",[262,2533,2534],{},"우: 인증 분기 (비로그인: 문의·로그인·회원가입 \u002F 로그인: 문의·충전·사용자 아바타 드롭다운)",[262,2536,2537,2540],{},[22,2538,2539],{},"\u003C 1024px",": 햄버거 → 좌측 Drawer(280px)",[317,2542,2544,2545,176],{"id":2543},"_92-appfooter-appfootervue","9.2 AppFooter (",[18,2546,2548],{"href":2547},"..\u002Fapp\u002Fcomponents\u002FAppFooter.vue",[22,2549,2550],{},"AppFooter.vue",[259,2552,2553,2556,2559],{},[262,2554,2555],{},"검정 배경, 상·하단 2단",[262,2557,2558],{},"상단: 로고\u002F슬로건 + 정책 링크 6개",[262,2560,2561],{},"하단: 회사명 + 사업자 정보 7개 + 카피라이트",[317,2563,2565],{"id":2564},"_93-레이아웃별-적용","9.3 레이아웃별 적용",[70,2567,2568,2584],{},[73,2569,2570],{},[76,2571,2572,2575,2579,2582],{},[79,2573,2574],{},"layout",[79,2576,2578],{"align":2577},"center","GNB",[79,2580,2581],{"align":2577},"Footer",[79,2583,425],{},[89,2585,2586,2601,2616],{},[76,2587,2588,2593,2596,2598],{},[94,2589,2590],{},[22,2591,2592],{},"default",[94,2594,2595],{"align":2577},"✓",[94,2597,2595],{"align":2577},[94,2599,2600],{},"일반 페이지 (홈\u002F발송\u002F조회\u002F관리…)",[76,2602,2603,2608,2611,2613],{},[94,2604,2605],{},[22,2606,2607],{},"auth",[94,2609,2610],{"align":2577},"—",[94,2612,2610],{"align":2577},[94,2614,2615],{},"로그인\u002F회원가입\u002F비밀번호 재설정",[76,2617,2618,2623,2625,2627],{},[94,2619,2620],{},[22,2621,2622],{},"blank",[94,2624,2610],{"align":2577},[94,2626,2610],{"align":2577},[94,2628,2629],{},"404\u002F시스템 에러\u002F점검\u002F이메일 템플릿",[62,2631],{},[65,2633,2635],{"id":2634},"_10-빌드-배포","10. 빌드 \u002F 배포",[317,2637,2639],{"id":2638},"_101-로컬-명령어","10.1 로컬 명령어",[246,2641,2645],{"className":2642,"code":2643,"language":2644,"meta":254,"style":254},"language-bash shiki shiki-themes github-light github-dark","pnpm install\npnpm dev              # http:\u002F\u002Flocalhost:3000\npnpm typecheck        # nuxt typecheck\npnpm lint\npnpm build            # nitro cloudflare-pages preset → dist\u002F\npnpm preview          # 로컬 빌드 미리보기\n","bash",[22,2646,2647,2655,2665,2675,2682,2692],{"__ignoreMap":254},[357,2648,2649,2652],{"class":359,"line":360},[357,2650,2651],{"class":370},"pnpm",[357,2653,2654],{"class":384}," install\n",[357,2656,2657,2659,2662],{"class":359,"line":378},[357,2658,2651],{"class":370},[357,2660,2661],{"class":384}," dev",[357,2663,2664],{"class":808},"              # http:\u002F\u002Flocalhost:3000\n",[357,2666,2667,2669,2672],{"class":359,"line":396},[357,2668,2651],{"class":370},[357,2670,2671],{"class":384}," typecheck",[357,2673,2674],{"class":808},"        # nuxt typecheck\n",[357,2676,2677,2679],{"class":359,"line":694},[357,2678,2651],{"class":370},[357,2680,2681],{"class":384}," lint\n",[357,2683,2684,2686,2689],{"class":359,"line":701},[357,2685,2651],{"class":370},[357,2687,2688],{"class":384}," build",[357,2690,2691],{"class":808},"            # nitro cloudflare-pages preset → dist\u002F\n",[357,2693,2694,2696,2699],{"class":359,"line":711},[357,2695,2651],{"class":370},[357,2697,2698],{"class":384}," preview",[357,2700,2701],{"class":808},"          # 로컬 빌드 미리보기\n",[317,2703,2705],{"id":2704},"_102-cloudflare-pages-배포","10.2 Cloudflare Pages 배포",[246,2707,2709],{"className":2642,"code":2708,"language":2644,"meta":254,"style":254},"pnpm build\nnpx wrangler pages deploy dist \\\n  --project-name=malgn-noti \\\n  --branch=main \\\n  --commit-dirty=true\n",[22,2710,2711,2718,2738,2745,2752],{"__ignoreMap":254},[357,2712,2713,2715],{"class":359,"line":360},[357,2714,2651],{"class":370},[357,2716,2717],{"class":384}," build\n",[357,2719,2720,2723,2726,2729,2732,2735],{"class":359,"line":378},[357,2721,2722],{"class":370},"npx",[357,2724,2725],{"class":384}," wrangler",[357,2727,2728],{"class":384}," pages",[357,2730,2731],{"class":384}," deploy",[357,2733,2734],{"class":384}," dist",[357,2736,2737],{"class":1315}," \\\n",[357,2739,2740,2743],{"class":359,"line":396},[357,2741,2742],{"class":1315},"  --project-name=malgn-noti",[357,2744,2737],{"class":1315},[357,2746,2747,2750],{"class":359,"line":694},[357,2748,2749],{"class":1315},"  --branch=main",[357,2751,2737],{"class":1315},[357,2753,2754],{"class":359,"line":701},[357,2755,2756],{"class":1315},"  --commit-dirty=true\n",[14,2758,2759,2760],{},"production: ",[18,2761,2762],{"href":2762,"rel":2763},"https:\u002F\u002Fmalgn-noti.pages.dev",[2764],"nofollow",[317,2766,2768,2769,176],{"id":2767},"_103-빌드-산출물-구조-dist","10.3 빌드 산출물 구조 (",[22,2770,2771],{},"dist\u002F",[246,2773,2776],{"className":2774,"code":2775,"language":251},[249],"dist\u002F\n├── _fonts\u002F                  # 폰트 자산\n├── _nuxt\u002F                   # 클라이언트 JS\u002FCSS 청크\n├── _worker.js\u002F              # SSR worker (Nitro)\n├── _routes.json             # Pages Functions 라우팅\n├── _headers\n├── _redirects\n└── nitro.json\n",[22,2777,2775],{"__ignoreMap":254},[14,2779,2780,196,2783,2786],{},[22,2781,2782],{},"_routes.json",[22,2784,2785],{},"_headers"," 등은 Nitro가 자동 생성. 수정 금지.",[62,2788],{},[65,2790,2792],{"id":2791},"_11-코딩-체크리스트-pr-전","11. 코딩 체크리스트 (PR 전)",[259,2794,2797,2808,2817,2829,2835,2844,2852,2858,2864,2873],{"className":2795},[2796],"contains-task-list",[262,2798,2801,154,2805,2807],{"className":2799},[2800],"task-list-item",[2802,2803],"input",{"disabled":697,"type":2804},"checkbox",[22,2806,605],{}," 사용",[262,2809,2811,154,2813,2816],{"className":2810},[2800],[2802,2812],{"disabled":697,"type":2804},[22,2814,2815],{},"useHead({ title })"," 페이지 제목 설정",[262,2818,2820,154,2822,2824,2825,2828],{"className":2819},[2800],[2802,2821],{"disabled":697,"type":2804},[22,2823,122],{}," 없음 (",[22,2826,2827],{},"tsc --noEmit"," 통과)",[262,2830,2832,2834],{"className":2831},[2800],[2802,2833],{"disabled":697,"type":2804}," Zod로 외부 입력 파싱",[262,2836,2838,2840,2841,2843],{"className":2837},[2800],[2802,2839],{"disabled":697,"type":2804}," API 호출은 ",[22,2842,1677],{}," 경유",[262,2845,2847,2849,2850],{"className":2846},[2800],[2802,2848],{"disabled":697,"type":2804}," 위험 액션은 ",[22,2851,2066],{},[262,2853,2855,2857],{"className":2854},[2800],[2802,2856],{"disabled":697,"type":2804}," 새 아이콘은 기존 3개 컬렉션 중 선택",[262,2859,2861,2863],{"className":2860},[2800],[2802,2862],{"disabled":697,"type":2804}," 색상은 CSS 변수 또는 Nuxt UI 토큰 사용 (하드코딩 X)",[262,2865,2867,154,2869,2872],{"className":2866},[2800],[2802,2868],{"disabled":697,"type":2804},[22,2870,2871],{},"pnpm typecheck"," 통과",[262,2874,2876,154,2878,2872],{"className":2875},[2800],[2802,2877],{"disabled":697,"type":2804},[22,2879,2880],{},"pnpm lint",[62,2882],{},[65,2884,2886],{"id":2885},"_12-참고-자료","12. 참고 자료",[317,2888,2890],{"id":2889},"_121-디자인-디자인-가이드","12.1 디자인 \u002F 디자인 가이드",[259,2892,2893,2901,2912],{},[262,2894,2895,1319,2898,2900],{},[27,2896,2897],{},"디자인 정본",[18,2899,52],{"href":51}," (Relay-inspired v1.0)",[262,2902,2903,1319,2906,2908,2909,2911],{},[27,2904,2905],{},"라이브 카탈로그",[22,2907,309],{}," 페이지 — ",[18,2910,314],{"href":313}," (17섹션 sticky nav)",[262,2913,2914,1319,2917],{},[27,2915,2916],{},"토큰·클래스 정본",[18,2918,2919],{"href":323},"app\u002Fassets\u002Fcss\u002Fmain.css",[317,2921,2923],{"id":2922},"_122-시안-ia-참조-전용","12.2 시안 (IA 참조 전용)",[36,2925,2926],{},[14,2927,2928,2929,2932],{},"2026-05-18 디자인 피벗 이후 시안의 ",[27,2930,2931],{},"디자인(CSS\u002Fbase.css)은 더 이상 참조하지 않는다",". IA(페이지 목록·라우트 구조)만 정본으로 유지.",[259,2934,2935,2942],{},[262,2936,2937,2938],{},"페이지 목록(IA 정본): ",[18,2939,2940],{"href":2940,"rel":2941},"https:\u002F\u002Fmalgn-notifications.pages.dev\u002F#\u002Fpagelists",[2764],[262,2943,2944,2945],{},"사이트맵 + 기능명세: ",[18,2946,2947],{"href":2947,"rel":2948},"https:\u002F\u002Fmalgn-notifications.pages.dev\u002F#\u002Fsitemap",[2764],[317,2950,2952],{"id":2951},"_123-외부-문서","12.3 외부 문서",[259,2954,2955,2962,2969,2976,2983,2990,2997],{},[262,2956,2957],{},[18,2958,2961],{"href":2959,"rel":2960},"https:\u002F\u002Fnuxt.com\u002Fdocs",[2764],"Nuxt 3 docs",[262,2963,2964],{},[18,2965,2968],{"href":2966,"rel":2967},"https:\u002F\u002Fui.nuxt.com\u002F",[2764],"Nuxt UI v3",[262,2970,2971],{},[18,2972,2975],{"href":2973,"rel":2974},"https:\u002F\u002Ftailwindcss.com\u002F",[2764],"Tailwind CSS v4",[262,2977,2978],{},[18,2979,2982],{"href":2980,"rel":2981},"https:\u002F\u002Freka-ui.com\u002F",[2764],"Reka UI",[262,2984,2985],{},[18,2986,2989],{"href":2987,"rel":2988},"https:\u002F\u002Ficonify.design\u002F",[2764],"Iconify",[262,2991,2992],{},[18,2993,2996],{"href":2994,"rel":2995},"https:\u002F\u002Fpinia.vuejs.org\u002F",[2764],"Pinia",[262,2998,2999],{},[18,3000,222],{"href":3001,"rel":3002},"https:\u002F\u002Fzod.dev\u002F",[2764],[970,3004,3005],{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":254,"searchDepth":396,"depth":396,"links":3007},[3008,3009,3010,3020,3028,3034,3042,3043,3047,3054,3060,3061],{"id":67,"depth":378,"text":68},{"id":243,"depth":378,"text":244},{"id":295,"depth":378,"text":296,"children":3011},[3012,3014,3016,3017,3018],{"id":319,"depth":396,"text":3013},"3.1 색상 토큰 (CSS 변수 — main.css)",{"id":343,"depth":396,"text":3015},"3.2 Nuxt UI 테마 (app.config.ts)",{"id":415,"depth":396,"text":416},{"id":505,"depth":396,"text":506},{"id":571,"depth":396,"text":3019},"3.5 2단 콘텐츠 (.content-2col)",{"id":590,"depth":378,"text":591,"children":3021},[3022,3023,3024,3026,3027],{"id":594,"depth":396,"text":595},{"id":633,"depth":396,"text":634},{"id":993,"depth":396,"text":3025},"4.3 페이지 메타 (definePageMeta)",{"id":1052,"depth":396,"text":1053},{"id":1150,"depth":396,"text":1151},{"id":1185,"depth":378,"text":1186,"children":3029},[3030,3031,3032,3033],{"id":1189,"depth":396,"text":1190},{"id":1235,"depth":396,"text":1236},{"id":1478,"depth":396,"text":1479},{"id":1509,"depth":396,"text":1510},{"id":1522,"depth":378,"text":1523,"children":3035},[3036,3037,3038,3039,3040,3041],{"id":1526,"depth":396,"text":1527},{"id":1664,"depth":396,"text":1665},{"id":1771,"depth":396,"text":1772},{"id":1801,"depth":396,"text":1802},{"id":1899,"depth":396,"text":1900},{"id":2025,"depth":396,"text":2026},{"id":2038,"depth":378,"text":2039},{"id":2357,"depth":378,"text":2358,"children":3044},[3045,3046],{"id":2361,"depth":396,"text":2362},{"id":2424,"depth":396,"text":2425},{"id":2499,"depth":378,"text":2500,"children":3048},[3049,3051,3053],{"id":2503,"depth":396,"text":3050},"9.1 AppGnb (AppGnb.vue)",{"id":2543,"depth":396,"text":3052},"9.2 AppFooter (AppFooter.vue)",{"id":2564,"depth":396,"text":2565},{"id":2634,"depth":378,"text":2635,"children":3055},[3056,3057,3058],{"id":2638,"depth":396,"text":2639},{"id":2704,"depth":396,"text":2705},{"id":2767,"depth":396,"text":3059},"10.3 빌드 산출물 구조 (dist\u002F)",{"id":2791,"depth":378,"text":2792},{"id":2885,"depth":378,"text":2886,"children":3062},[3063,3064,3065],{"id":2889,"depth":396,"text":2890},{"id":2922,"depth":396,"text":2923},{"id":2951,"depth":396,"text":2952},"이 문서는 malgn-noti 사용자단(고객 콘솔)의 디자인 시스템 + HTML\u002FCSS\u002FJS 코딩 컨벤션을 정리합니다. 운영자 콘솔(malgn-noti-admin)도 동일 스택이므로 같은 규칙을 따릅니다.","md",{},"\u002Ffrontend",{"title":5,"description":3066},"FRONTEND","xc2HGolPf7vl6HTYJny10J6JQ6ig-vkX-CuPH8xF4qg",1780638909350]