diff --git a/resources/views/rd/design-insight/index.blade.php b/resources/views/rd/design-insight/index.blade.php index 72ad4c38..29d90723 100644 --- a/resources/views/rd/design-insight/index.blade.php +++ b/resources/views/rd/design-insight/index.blade.php @@ -834,7 +834,7 @@
@@ -941,7 +941,7 @@ 첫 번째 카드 추가 @@ -3422,6 +3422,938 @@ function designInsight() { `; + // ===== 추가 50종 와이어프레임 (51~100) ===== + // 게이지/미터 + if (key.includes('게이지') || key.includes('미터') && key.includes('대시보드')) return ` +
+
+ ${[{l:'CPU 사용률',v:'73%',c:'#f59e0b',pct:73},{l:'메모리',v:'45%',c:'#10b981',pct:45},{l:'달성률',v:'92%',c:'#ef4444',pct:92}].map(g => ` +
+ + + + +
${g.v}
+
${g.l}
+
+ `).join('')} +
+
`; + + // 히트맵 캘린더 + if (key.includes('히트맵') || key.includes('잔디') && key.includes('캘린더')) return ` +
+
활동 기록
+
+
+ +
+
+ ${Array.from({length:26},(_, w) => `
${Array.from({length:7},(_, d) => { + const r = Math.random(); + const colors = ['#f1f5f9','#dcfce7','#86efac','#22c55e','#15803d']; + const ci = r > 0.7 ? (r > 0.9 ? 4 : 3) : (r > 0.4 ? (r > 0.55 ? 2 : 1) : 0); + return `
`; + }).join('')}
`).join('')} +
+
+
+ 적음 + ${['#f1f5f9','#dcfce7','#86efac','#22c55e','#15803d'].map(c => `
`).join('')} + 많음 +
+
`; + + // 퍼널/전환율 + if (key.includes('퍼널') || key.includes('전환율')) return ` +
+
수주 파이프라인
+ ${[{s:'리드',v:'1,240',w:100,c:'#bfdbfe'},{s:'미팅',v:'680',w:82,c:'#93c5fd',r:'54.8%'},{s:'제안',v:'340',w:64,c:'#60a5fa',r:'50.0%'},{s:'협상',v:'180',w:46,c:'#3b82f6',r:'52.9%'},{s:'수주',v:'95',w:28,c:'#1d4ed8',r:'52.8%'}].map(f => ` +
+ ${f.s} +
+ ${f.v} +
+ ${f.r?`→ ${f.r}`:''} +
+ `).join('')} +
`; + + // 비교 대시보드 + if (key.includes('비교') && (key.includes('전월') || key.includes('당월') || key.includes('대시보드'))) return ` +
+
+ 기간 비교 +
+ 3월 + vs + 2월 +
+
+ ${[{l:'매출',a:'₩48.5M',b:'₩42.1M',d:'+15.2%',up:true},{l:'수주',a:'247건',b:'198건',d:'+24.7%',up:true},{l:'미수금',a:'₩3.2M',b:'₩2.8M',d:'+14.3%',up:false},{l:'거래처',a:'52개',b:'49개',d:'+6.1%',up:true}].map(k => + `
+
${k.l}
+
+ ${k.a} + ${k.b} +
+
${k.up?'▲':'▲'} ${k.d}
+
` + ).join('')} +
+
`; + + // 지도 기반 + if (key.includes('지도') && (key.includes('데이터') || key.includes('시각화') || key.includes('분포'))) return ` +
+
+
거래처 분포
+ ${['서울 28','경기 15','부산 8'].map(r => `
${r}개
`).join('')} +
+
+
+
+
+
+ ${[{x:35,y:30,s:20,c:'#3b82f6'},{x:40,y:35,s:14,c:'#3b82f6'},{x:55,y:70,s:10,c:'#3b82f6'},{x:25,y:55,s:8,c:'#3b82f6'},{x:60,y:45,s:6,c:'#3b82f6'}].map(m => + `
` + ).join('')} +
서울
+
`; + + // 마스터-디테일 + if (key.includes('마스터') && key.includes('디테일')) return ` +
+
+
+
🔍 검색...
+
+ ${['수주 #1024|ABC산업|true','수주 #1023|XYZ전자|false','수주 #1022|한국물산|false','수주 #1021|글로벌|false'].map(r => { + const [t,c,a] = r.split('|'); + return `
+
${t}
+
${c}
+
`; + }).join('')} +
+
+
+
수주 #1024
+
+ 편집 + 인쇄 +
+
+
+ ${['거래처|ABC산업(주)','금액|₩12,500,000','납기일|2026-04-15','상태|진행 중'].map(f => { + const [k,v] = f.split('|'); + return `
${k}
${v}
`; + }).join('')} +
+
+
`; + + // 타일/썸네일 뷰 + if (key.includes('타일') || key.includes('썸네일') && key.includes('뷰')) return ` +
+
+ 이미지 라이브러리 +
+ + + 정렬 ▾ +
+
+ ${[{h:70,c:'#bfdbfe',t:'도면 A-101'},{h:90,c:'#bbf7d0',t:'제품 사진'},{h:60,c:'#fde68a',t:'견적서'},{h:80,c:'#ddd6fe',t:'시방서'},{h:65,c:'#fecaca',t:'카탈로그'},{h:75,c:'#e0e7ff',t:'설치 매뉴얼'}].map(i => ` +
+
📸
+
+
${i.t}
+
2026-03-08
+
+
+ `).join('')} +
+
`; + + // 피벗 테이블 + if (key.includes('피벗') || key.includes('크로스탭')) return ` +
+
+ 매출 분석 (피벗) +
+
+ + + + + + + + + + ${[['ABC산업','12.5','15.2','18.3','46.0'],['XYZ전자','8.1','9.4','11.2','28.7'],['한국물산','5.3','6.8','7.5','19.6']].map(r => + `${r.slice(1).map((v,i) => ``).join('')}` + ).join('')} + + + + + + + + +
거래처 \\ 월1월2월3월합계
${r[0]}${v}M
합계25.9M31.4M37.0M94.3M
+
+
`; + + // 수평 타임라인 + if (key.includes('수평') && key.includes('타임라인')) return ` +
+
프로젝트 로드맵
+
+
+ ${[{x:5,t:'기획',d:'1월',done:true},{x:25,t:'설계',d:'2월',done:true},{x:45,t:'개발',d:'3월',active:true},{x:65,t:'테스트',d:'4월'},{x:85,t:'배포',d:'5월'}].map(e => ` +
+
${e.done?'✓':e.active?'●':'○'}
+
${e.t}
+
${e.d}
+
+ `).join('')} +
+
`; + + // 트리 테이블 + if (key.includes('트리') && key.includes('테이블')) return ` +
+
+ BOM 구조 +
+ 전체 펼치기 +
+
+
품명
수량
단가
금액
+
+ ${[{n:'▾ 블라인드 50mm',q:'1',p:'',a:'15,000',bold:true,lv:0},{n:'알루미늄 슬랫',q:'25',p:'200',a:'5,000',lv:1},{n:'헤드레일',q:'1',p:'3,000',a:'3,000',lv:1},{n:'▸ 부속품 세트',q:'1',p:'',a:'4,500',lv:1,collapsed:true},{n:'조작 코드',q:'1',p:'2,500',a:'2,500',lv:1}].map(r => ` +
+
${r.n}
+
${r.q}
+
${r.p}
+
${r.a}
+
+ `).join('')} +
`; + + // 멀티 스텝 폼 + if (key.includes('멀티') && key.includes('스텝') || key.includes('멀티스텝')) return ` +
+
+ ${[{n:'1',t:'기본 정보',done:true},{n:'2',t:'상세 설정',active:true},{n:'3',t:'확인'}].map((s,i) => ` +
+ ${i>0?`
`:''} +
${s.done?'✓':s.n}
+
+ `).join('')} +
+
상세 설정
+ ${['납기일','배송 방법','결제 조건'].map(f => `
${f}
`).join('')} +
+ ← 이전 +
다음 →
+
+
`; + + // 태그/칩 입력 + if (key.includes('태그') && (key.includes('칩') || key.includes('입력'))) return ` +
+
태그
+
+ ${['블라인드','50mm','수동','알루미늄'].map(t => `${t}×`).join('')} + 태그 입력... +
+
+ ${['전동','롤스크린','커튼'].map((s,i) => `
${s}
`).join('')} +
+
`; + + // 슬라이더/레인지 + if (key.includes('슬라이더') && (key.includes('레인지') || key.includes('조절'))) return ` +
+
+
+ 가격 범위 + ₩10,000 ~ ₩50,000 +
+
+
+
+
+
+
₩0₩100,000
+
+
+
+ 수량 + 65 +
+
+
+
+
+
+
`; + + // 토글 설정 + if (key.includes('토글') && (key.includes('설정') || key.includes('스위치'))) return ` +
+
알림 설정
+ ${[{t:'이메일 알림',d:'수주/견적 상태 변경 시 이메일 발송',on:true},{t:'푸시 알림',d:'실시간 푸시 알림 수신',on:true},{t:'슬랙 연동',d:'슬랙 채널에 알림 전달',on:false},{t:'주간 리포트',d:'매주 월요일 주간 요약 발송',on:true},{t:'마케팅 메일',d:'신규 기능 안내 및 팁',on:false}].map(s => ` +
+
+
${s.t}
+
${s.d}
+
+
+
+
+
+ `).join('')} +
`; + + // 서명 패드 + if (key.includes('서명') && (key.includes('패드') || key.includes('전자'))) return ` +
+
전자 서명
+
+ +
마우스/터치로 서명
+
+
+ 지우기 +
+ 서명 완료 +
+
`; + + // 컬러 피커 + if (key.includes('컬러') && key.includes('피커')) return ` +
+
+
+
+
+
+
+
+
+
+
#3B82F6
+
+
+ ${['#ef4444','#f59e0b','#10b981','#3b82f6','#8b5cf6','#ec4899','#64748b','#1e293b'].map(c => `
`).join('')} +
+
`; + + // 평점/별점 + if (key.includes('별점') || key.includes('평점') && key.includes('리뷰')) return ` +
+
+
4.5
+
★★★★☆
+
128개 리뷰
+
+
+ ${[{s:5,w:65},{s:4,w:20},{s:3,w:8},{s:2,w:4},{s:1,w:3}].map(r => ` +
+ ${r.s}★ +
+ ${r.w}% +
+ `).join('')} +
+
+
리뷰 작성
+
☆☆☆☆☆
+
+
+
`; + + // 바텀 시트 + if (key.includes('바텀') && key.includes('시트')) return ` +
+
+
+
+
+
+
+
필터
+ ${['상태','날짜 범위','거래처'].map(f => `
${f}선택 ▸
`).join('')} +
+
초기화
+
적용
+
+
+
`; + + // 컨텍스트 메뉴 + if (key.includes('컨텍스트') && key.includes('우클릭')) return ` +
+
+
+
+ ${[{t:'복사',k:'⌘C'},{t:'붙여넣기',k:'⌘V'},{t:'잘라내기',k:'⌘X'},{sep:true},{t:'편집',icon:'✏️'},{t:'복제',icon:'📋'},{t:'이동',icon:'📁'},{sep:true},{t:'삭제',danger:true,icon:'🗑️'}].map(i => + i.sep?`
`: + `
+ ${i.icon?`${i.icon}`:''} + ${i.t} + ${i.k?`${i.k}`:''} +
` + ).join('')} +
+
`; + + // 슬라이드오버 패널 + if (key.includes('슬라이드오버') || key.includes('사이드') && key.includes('패널') && key.includes('상세')) return ` +
+
+
+
+
+
+
+
+ 수주 상세 + +
+
+ ${['거래처|ABC산업','금액|₩12.5M','상태|진행 중','담당자|홍길동'].map(f => { + const [k,v] = f.split('|'); + return `
${k}
${v}
`; + }).join('')} +
+
+ 편집 + 삭제 +
+
+
`; + + // 쿠키 동의 배너 + if (key.includes('쿠키') || key.includes('gdpr') || key.includes('동의') && key.includes('배너')) return ` +
+
+
+ 🍪 +
+
이 웹사이트는 쿠키를 사용합니다
+
더 나은 경험을 위해 쿠키를 사용합니다. 자세히 보기
+
+
+ 설정 + 모두 동의 +
+
+
`; + + // 탑 네비게이션 + if (key.includes('탑바') || key.includes('gnb') || key.includes('탑') && key.includes('네비게이션') && key.includes('검색')) return ` +
+
+
+
S
+ SAM +
+ ${['대시보드','수주','거래처','품목'].map((m,i) => `${m}`).join('')} +
+
+ 🔍 + 검색... ⌘K +
+
+
+
🔔
3
+
+
+
+
+
+
콘텐츠
+
+
`; + + // 앵커/스크롤 스파이 + if (key.includes('앵커') || key.includes('스크롤스파이') || key.includes('목차') && key.includes('사이드')) return ` +
+
+
가이드 문서
+ ${['1. 소개','내용이 여기에 표시됩니다...','2. 설치 방법','npm install sam-sdk','3. 기본 사용법'].map((t,i) => + i%2===0?`
${t}
`: + `
${t}
` + ).join('')} +
+
+
목차
+ ${['소개','설치 방법','기본 사용법','API 레퍼런스','FAQ'].map((t,i) => ` +
${t}
+ `).join('')} +
+
`; + + // 페이지네이션 + if (key.includes('페이지네이션') && key.includes('패턴')) return ` +
+
페이지네이션 유형
+
+
기본형
+
+ ${['◀','1','2','3','...','28','29','30','▶'].map(p => `${p}`).join('')} +
+
+
+
미니형
+
+ ← 이전 + 3 / 30 + 다음 → +
+
+
+
상세형
+
+ 총 842건 + | + 페이지당 20 ▾ +
+
+ ${['◀','1','2','3','▶'].map(p => `${p}`).join('')} +
+
+
+
`; + + // FAB + if (key.includes('fab') || key.includes('플로팅') && key.includes('액션')) return ` +
+
+
+ ${[{icon:'📋',label:'수주 등록'},{icon:'🏢',label:'거래처 등록'},{icon:'📦',label:'품목 등록'}].map(a => ` +
+ ${a.label} +
${a.icon}
+
+ `).join('')} +
+
+
+
`; + + // 사이드 탭 + if (key.includes('세로') && key.includes('탭') || key.includes('사이드') && key.includes('탭')) return ` +
+
+ ${[{icon:'📊',active:true},{icon:'📋',active:false},{icon:'🏢',active:false},{icon:'⚙️',active:false}].map(t => ` +
${t.icon}
+ `).join('')} +
+
+
📊 대시보드
+
+
+
콘텐츠 영역
+
+
`; + + // RBAC 권한 관리 + if (key.includes('권한') && (key.includes('rbac') || key.includes('역할') || key.includes('접근'))) return ` +
+
역할/권한 관리
+
+ + + + + + + + + ${[['수주 조회','✅','✅','✅'],['수주 등록','✅','✅','❌'],['수주 삭제','✅','❌','❌'],['설정 변경','✅','❌','❌'],['사용자 관리','✅','❌','❌']].map(r => + `${r.slice(1).map(v => ``).join('')}` + ).join('')} + +
기능관리자매니저일반
${r[0]}${v}
+
+
`; + + // 세션/디바이스 관리 + if (key.includes('세션') && (key.includes('디바이스') || key.includes('관리'))) return ` +
+
+ 활성 세션 + 모두 로그아웃 +
+ ${[{d:'Chrome · Windows',ip:'192.168.1.100',time:'현재 활동 중',current:true},{d:'Safari · macOS',ip:'10.0.0.55',time:'2시간 전'},{d:'Samsung Internet · Android',ip:'172.16.0.12',time:'어제'}].map(s => ` +
+ ${s.d.includes('Windows')?'💻':s.d.includes('mac')?'🖥️':'📱'} +
+
${s.d} ${s.current?'이 기기':''}
+
${s.ip} · ${s.time}
+
+ ${!s.current?'로그아웃':''} +
+ `).join('')} +
`; + + // API 키 관리 + if (key.includes('api') && key.includes('키') || key.includes('토큰') && key.includes('관리')) return ` +
+
+ 🔑 API 키 + + 새 키 생성 +
+ ${[{name:'Production Key',key:'sk-prod...x8f2',created:'2026-01-15',last:'2분 전'},{name:'Development Key',key:'sk-dev...m4k9',created:'2026-02-20',last:'1시간 전'},{name:'Test Key',key:'sk-test...p2j7',created:'2026-03-01',last:'3일 전'}].map(k => ` +
+
+
${k.name}
+
+ ${k.key} + 📋 +
+
생성: ${k.created} · 마지막 사용: ${k.last}
+
+ 폐기 +
+ `).join('')} +
`; + + // 간트 차트 + if (key.includes('간트') || key.includes('gantt')) return ` +
+
+ 프로젝트 일정 +
+ 2026년 3월 +
+
+
+
작업
+ ${['기획','UI 설계','개발','테스트','배포'].map(t => `
${t}
`).join('')} +
+
+
+ ${Array.from({length:10},(_, i) => `
${i+1}
`).join('')} +
+ ${[{s:0,w:3,c:'#10b981',p:100},{s:2,w:3,c:'#3b82f6',p:80},{s:3,w:5,c:'#f59e0b',p:40},{s:6,w:3,c:'#8b5cf6',p:0},{s:8,w:2,c:'#ec4899',p:0}].map(b => ` +
+
+
+
+ `).join('')} +
+
+
+
`; + + // 조직도 + if (key.includes('조직도') && key.includes('트리')) return ` +
+
대표이사
홍길동
+
+
+
+
+
+ ${['영업팀|김영업','개발팀|이개발','생산팀|박생산'].map(d => { + const [dept,lead] = d.split('|'); + return `
+
+
${dept}
${lead}
+
`; + }).join('')} +
+
`; + + // 워터폴 차트 + if (key.includes('워터폴') && key.includes('재무')) return ` +
+
손익 분석
+
+ ${[{l:'매출',v:100,h:100,c:'#3b82f6',base:0},{l:'원가',v:-40,h:40,c:'#ef4444',base:60},{l:'판관비',v:-25,h:25,c:'#ef4444',base:35},{l:'기타수익',v:10,h:10,c:'#10b981',base:35},{l:'영업이익',v:45,h:45,c:'#8b5cf6',base:0}].map(b => ` +
+
${b.v>0?'+':''}${b.v}M
+
+
${b.l}
+
+ `).join('')} +
+
`; + + // 리포트 빌더 + if (key.includes('리포트') && key.includes('빌더') || key.includes('커스텀') && key.includes('보고서')) return ` +
+
+
필드 선택
+ ${['📋 거래처명','💰 수주금액','📅 수주일','👤 담당자','📊 상태'].map((f,i) => `
${f} ${i<3?'✓':''}
`).join('')} +
차트
+ ${['📊 바','📈 라인','🍩 도넛'].map((c,i) => `
${c}
`).join('')} +
+
+
미리보기
+
+
+ ${[60,40,80,50,70,90,45].map(h => `
`).join('')} +
+
+
+ 실행 + 저장 + 📥 PDF +
+
+
`; + + // 댓글/스레드 + if (key.includes('댓글') || key.includes('스레드') && key.includes('답글')) return ` +
+
💬 댓글 3
+ ${[{u:'김영업',t:'견적 금액이 확정되면 알려주세요.',time:'2시간 전',replies:[{u:'이관리',t:'네, 오늘 중으로 확인하겠습니다.',time:'1시간 전'}]},{u:'박생산',t:'납기일 조정이 필요합니다.',time:'30분 전',replies:[]}].map(c => ` +
+
+
+
+
${c.u} ${c.time}
+
${c.t}
+
👍 2답글
+ ${c.replies.map(r => ` +
+
+
${r.u} ${r.time}
${r.t}
+
+ `).join('')} +
+
+
+ `).join('')} +
`; + + // 에러 페이지 + if (key.includes('에러') && (key.includes('404') || key.includes('500') || key.includes('오류'))) return ` +
+
404
+
페이지를 찾을 수 없습니다
+
요청하신 페이지가 존재하지 않거나
이동되었을 수 있습니다
+
+ 홈으로 가기 + ← 이전 페이지 +
+
`; + + // 비교 테이블 + if (key.includes('비교') && (key.includes('기능') || key.includes('제품') || key.includes('체크'))) return ` +
+
+
+ ${['Basic','Pro','Enterprise'].map((p,i) => `
${p}
${i===1?'
추천
':''}
`).join('')} + ${[['사용자 수','5명','50명','무제한'],['저장 공간','1GB','10GB','무제한'],['API 호출','1,000/일','10,000/일','무제한'],['우선 지원','❌','✅','✅'],['커스텀 도메인','❌','❌','✅']].map(r => + `
${r[0]}
${r.slice(1).map((v,i) => `
${v}
`).join('')}` + ).join('')} +
+
`; + + // 캐러셀/슬라이더 + if (key.includes('캐러셀') || key.includes('슬라이더') && key.includes('스와이프')) return ` +
+
+
+
슬라이드 2 / 5
콘텐츠가 여기에 표시됩니다
+
+
+
+
+
+ ${[false,true,false,false,false].map(a => `
`).join('')} +
+
`; + + // 아코디언/FAQ + if (key.includes('아코디언') || key.includes('faq')) return ` +
+
자주 묻는 질문
+ ${[{q:'SAM은 어떤 서비스인가요?',a:'SAM은 블라인드/스크린 제조업체를 위한 ERP/MES 통합 솔루션입니다.',open:true},{q:'무료 체험이 가능한가요?',a:'',open:false},{q:'데이터 마이그레이션을 지원하나요?',a:'',open:false},{q:'커스터마이징이 가능한가요?',a:'',open:false}].map(f => ` +
+
+ ${f.q} + +
+ ${f.open?`
${f.a}
`:''} +
+ `).join('')} +
`; + + // 툴팁/팝오버 + if (key.includes('툴팁') || key.includes('팝오버')) return ` +
+
+
hover 요소
+
+ 이것은 툴팁입니다 +
+
+
+
+
클릭 요소
+
+
+
팝오버 제목
+
추가 정보를 여기에 표시합니다.
+
+
+
`; + + // 프로그레스 트래커 + if (key.includes('프로그레스') && (key.includes('배송') || key.includes('처리') || key.includes('추적'))) return ` +
+
수주 진행 상태
+
+ ${[{s:'수주 접수',t:'2026-03-01 09:00',done:true},{s:'설계 검토',t:'2026-03-03 14:00',done:true},{s:'생산 중',t:'2026-03-05 ~',active:true},{s:'품질 검사',t:'',wait:true},{s:'출하/배송',t:'',wait:true}].map(e => ` +
+
+
${e.done?'✓':e.active?'●':'○'}
+ ${!e.wait?`
`:''} +
+
+
${e.s}
+ ${e.t?`
${e.t}
`:''} +
+
+ `).join('')} +
+
`; + + // 데이터 임포트 + if (key.includes('임포트') || key.includes('가져오기') && key.includes('csv')) return ` +
+
+ ${['1 업로드','2 매핑','3 확인'].map((s,i) => ` +
+ ${i>0?`
`:''} +
${i+1}
+ ${s.slice(2)} +
+ `).join('')} +
+
필드 매핑
+ ${['거래처명 → company_name','연락처 → phone','주소 → address'].map(m => ` +
+ ${m.split(' → ')[0]} + +
${m.split(' → ')[1]}
+
+ `).join('')} +
`; + + // 랜딩 히어로 + if (key.includes('랜딩') || key.includes('히어로') && key.includes('cta')) return ` +
+
+
스마트한 제조 관리,
SAM으로 시작하세요
+
수주부터 출하까지, 하나의 플랫폼에서
제조 전 공정을 관리하세요
+
+ 무료로 시작하기 + 데모 보기 +
+
+ ${['제조사 120+','도입 6개월','만족도 98%'].map(s => `${s}`).join('')} +
+
+
`; + + // 코드 에디터 + if (key.includes('코드') && (key.includes('에디터') || key.includes('구문'))) return ` +
+
+
+ api.php + 📋 +
+
+
1use App\\Http\\Controllers;
+
2
+
3Route::get('/orders', function () {
+
4 return Order::all();
+
5});
+
+
`; + + // 키보드 단축키 + if (key.includes('단축키') && (key.includes('키보드') || key.includes('도움말'))) return ` +
+
+ ⌨️ 키보드 단축키 + +
+
+
일반
+ ${[['⌘ K','검색 열기'],['⌘ N','새로 만들기'],['⌘ S','저장']].map(([k,d]) => `
${d}${k}
`).join('')} +
네비게이션
+ ${[['G → D','대시보드'],['G → O','수주 목록'],['?','단축키 도움말']].map(([k,d]) => `
${d}${k}
`).join('')} +
+
`; + + // 다크 모드 + if (key.includes('다크') && key.includes('모드') || key.includes('다크모드')) return ` +
+
+
+ ☀️ + 라이트 +
+
+
+
+
+
+
+
+
+ 🌙 + 다크 +
+
+
+
+
+
+
+
`; + + // 파일 매니저 + if (key.includes('파일') && (key.includes('매니저') || key.includes('탐색기'))) return ` +
+
+
📁 전체 파일
+ ${['📂 견적서','📂 도면','📂 계약서','📂 사진'].map((f,i) => `
${f}
`).join('')} +
+
+
+ 전체 파일/도면 +
+ 업로드 +
+
+ ${['A-101.dwg|📐','A-102.dwg|📐','제품사진.png|🖼️','시방서.pdf|📄','매뉴얼.pdf|📄','+ 새 폴더|📁'].map(f => { + const [n,i] = f.split('|'); + return `
+
${i}
+
${n}
+
`; + }).join('')} +
+
+
`; + // 기본 와이어프레임 (매칭 안 됨) return `
@@ -3764,7 +4696,7 @@ function designInsight() { // ===== Preset Templates ===== loadPresetTemplates() { const existing = (this.currentProject.cards || []).length; - if (existing > 0 && !confirm('현재 프로젝트에 인기 UI 패턴 50종을 추가합니다. 계속하시겠습니까?')) return; + if (existing > 0 && !confirm('현재 프로젝트에 인기 UI 패턴 100종을 추가합니다. 계속하시겠습니까?')) return; const now = new Date().toISOString(); const mkId = () => 'di_' + Date.now() + '_' + Math.random().toString(36).substr(2, 6); @@ -4520,6 +5452,734 @@ function designInsight() { usedIn: ['Airbnb', 'Booking.com', 'Google Flights', 'SAM 기간 필터'], guidelines: '오늘 날짜 강조. 선택 불가 날짜 회색 처리. 기간 선택 시 범위 배경색. 모바일: 전체 화면 달력. 키보드: 화살표 키 이동.', }, + // ===== 추가 50종 (51~100) ===== + // ===== 대시보드 추가 (5) ===== + { + type: 'pattern', title: '게이지/미터 대시보드', category: 'dashboard', rating: 4, + tags: ['게이지', '미터', '진행률', '속도계'], + memo: 'Grafana, Datadog, 자동차 계기판 UI. 원형 게이지로 목표 달성률이나 시스템 사용률을 직관적으로 표시.', + components: [ + { name: '원형 게이지 (반원 또는 전원)', required: true }, + { name: '현재 값 (중앙 큰 텍스트)', required: true }, + { name: '목표/한계 값 표시', required: true }, + { name: '색상 구간 (초록/노랑/빨강)', required: true }, + { name: '라벨 (측정 항목명)', required: true }, + ], + usedIn: ['Grafana', 'Datadog', 'Google PageSpeed', 'SAM 생산 달성률'], + guidelines: '0~100% 범위. 초록(0~60%), 노랑(60~80%), 빨강(80~100%). 애니메이션 전환. 숫자는 게이지 중앙 크게 표시.', + }, + { + type: 'pattern', title: '히트맵 캘린더 (활동 기록)', category: 'dashboard', rating: 4, + tags: ['히트맵', '캘린더', '활동', '잔디'], + memo: 'GitHub Contribution, Wakatime 등. 일별 활동량을 색상 농도로 표현하여 장기 패턴을 한눈에 파악.', + components: [ + { name: '일별 셀 그리드 (52주 × 7일)', required: true }, + { name: '색상 농도 스케일 (연→진)', required: true }, + { name: '요일 라벨 (좌측)', required: true }, + { name: '월 라벨 (상단)', required: true }, + { name: '셀 hover 시 상세 툴팁', required: true }, + ], + usedIn: ['GitHub', 'Wakatime', 'Habitica', 'SAM 출근 기록'], + guidelines: '5단계 색상 (없음/연/중/진/최대). 셀 크기 10~12px. 오늘 날짜 테두리 강조. 빈 날짜는 가장 연한 색.', + }, + { + type: 'pattern', title: '퍼널/전환율 차트', category: 'dashboard', rating: 4, + tags: ['퍼널', '전환율', '세일즈', '단계'], + memo: 'HubSpot, Salesforce, Mixpanel 등. 단계별 전환율을 시각화하여 이탈 구간을 파악하는 세일즈/마케팅 핵심 차트.', + components: [ + { name: '단계별 사다리꼴 바', required: true }, + { name: '각 단계 수치 + 전환율 (%)', required: true }, + { name: '단계 간 이탈률 표시', required: true }, + { name: '단계 라벨', required: true }, + { name: '기간 필터', required: false }, + ], + usedIn: ['HubSpot', 'Salesforce', 'Mixpanel', 'SAM 수주 파이프라인'], + guidelines: '최상단이 가장 넓고 아래로 좁아지는 형태. 전환율은 단계 사이에 표시. 이탈률이 큰 구간 빨간 강조.', + }, + { + type: 'pattern', title: '비교 대시보드 (전월 vs 당월)', category: 'dashboard', rating: 3, + tags: ['비교', '전월', '당월', '증감'], + memo: 'Google Analytics 비교 뷰, Stripe 비교 등. 두 기간의 데이터를 나란히 비교하여 성과 변화를 분석.', + components: [ + { name: '기간 A / 기간 B 선택기', required: true }, + { name: '병렬 KPI 카드 (A vs B)', required: true }, + { name: '증감률 화살표 + 색상', required: true }, + { name: '겹친 라인 차트 (비교)', required: true }, + { name: '차이 요약 테이블', required: false }, + ], + usedIn: ['Google Analytics', 'Stripe', 'Shopify', 'SAM 월간 비교'], + guidelines: '기간 A는 실선, B는 점선. 증가=초록, 감소=빨강. 카드에서 양쪽 숫자 나란히 표시. 차이 절대값 + 퍼센트 동시 표시.', + }, + { + type: 'pattern', title: '지도 기반 데이터 시각화', category: 'dashboard', rating: 3, + tags: ['지도', '위치', '지리', '분포'], + memo: 'Google Maps, Mapbox, Tableau 지도 등. 지역별 데이터 분포를 지도 위에 시각화.', + components: [ + { name: '지도 배경 (벡터/래스터)', required: true }, + { name: '데이터 마커/핀', required: true }, + { name: '클러스터링 (밀집 지역)', required: false }, + { name: '범례 (색상/크기 의미)', required: true }, + { name: '지역 hover 상세 정보', required: true }, + ], + usedIn: ['Google Maps', 'Tableau', 'Uber', 'SAM 거래처 분포'], + guidelines: '마커는 데이터 크기에 비례. 밀집 시 클러스터 자동 그룹핑. 지역 클릭 시 드릴다운. 줌 레벨별 상세도 조절.', + }, + // ===== 목록 추가 (5) ===== + { + type: 'pattern', title: '마스터-디테일 레이아웃', category: 'list', rating: 5, + tags: ['마스터', '디테일', '분할', '목록상세'], + memo: 'Apple Mail, Outlook, Notion 등. 좌측 목록 + 우측 상세의 2패널 구조. ERP에서 가장 빈번히 사용.', + components: [ + { name: '좌측 목록 패널 (검색 + 스크롤)', required: true }, + { name: '우측 상세 패널', required: true }, + { name: '목록 항목 선택 하이라이트', required: true }, + { name: '리사이즈 핸들 (패널 너비 조절)', required: false }, + { name: '상세 패널 탭 (정보/이력/첨부)', required: false }, + { name: '빈 상태 (선택 안 됨)', required: true }, + ], + usedIn: ['Apple Mail', 'Outlook', 'Notion', 'SAM 수주/거래처 상세'], + guidelines: '좌측 300~400px 고정, 우측 flex:1. 목록에서 현재 선택은 파란 배경. 모바일: 스택 레이아웃 (목록→상세 전환).', + }, + { + type: 'pattern', title: '타일/썸네일 뷰', category: 'list', rating: 3, + tags: ['타일', '썸네일', '갤러리', '그리드뷰'], + memo: 'Pinterest, Dribbble, macOS Finder 등. 이미지 중심 데이터를 그리드 타일로 표시하는 시각적 목록.', + components: [ + { name: '이미지 썸네일 (메인)', required: true }, + { name: '타이틀 + 메타정보', required: true }, + { name: 'Masonry/균등 그리드 레이아웃', required: true }, + { name: '뷰 모드 전환 (타일/목록)', required: true }, + { name: '정렬 옵션', required: false }, + ], + usedIn: ['Pinterest', 'Dribbble', 'macOS Finder', 'SAM 도면/이미지 관리'], + guidelines: '타일 최소 200px, 최대 4열. 이미지 비율 유지 (object-fit: cover). hover 시 오버레이 액션. lazy loading 적용.', + }, + { + type: 'pattern', title: '피벗 테이블', category: 'list', rating: 4, + tags: ['피벗', '크로스탭', '집계', '엑셀'], + memo: 'Excel 피벗, Google Sheets, Tableau 등. 행/열 교차 집계로 다차원 데이터를 분석하는 테이블.', + components: [ + { name: '행 헤더 (그룹핑 기준)', required: true }, + { name: '열 헤더 (분석 차원)', required: true }, + { name: '데이터 셀 (집계 값)', required: true }, + { name: '행/열 합계', required: true }, + { name: '필드 드래그 앤 드롭 (행↔열)', required: false }, + { name: '집계 함수 선택 (합계/평균/카운트)', required: false }, + ], + usedIn: ['Excel', 'Google Sheets', 'Tableau', 'SAM 매출 분석'], + guidelines: '행 그룹 접기/펼치기. 합계 행은 볼드 + 배경색. 금액은 천단위 콤마 우측 정렬. 큰 데이터는 가상 스크롤.', + }, + { + type: 'pattern', title: '수평 타임라인', category: 'list', rating: 3, + tags: ['타임라인', '수평', '이력', '연대기'], + memo: 'LinkedIn Experience, 프로젝트 로드맵, 제품 릴리즈 히스토리 등. 시간순 이벤트를 가로로 나열.', + components: [ + { name: '수평 축 (시간선)', required: true }, + { name: '이벤트 노드 (점/아이콘)', required: true }, + { name: '이벤트 카드 (상/하 교대 배치)', required: true }, + { name: '스크롤/드래그 네비게이션', required: true }, + { name: '현재 시점 표시', required: false }, + ], + usedIn: ['LinkedIn', 'Jira Roadmap', 'Product Hunt', 'SAM 프로젝트 이력'], + guidelines: '카드를 상/하 교대로 배치하여 가독성 확보. 현재 시점 빨간 선. 이벤트 노드 클릭 시 상세 팝업. 좌우 스크롤 또는 드래그.', + }, + { + type: 'pattern', title: '트리 테이블 (계층형 데이터)', category: 'list', rating: 4, + tags: ['트리', '계층', '테이블', '접기펼치기'], + memo: 'Jira 이슈 트리, BOM 구조, 파일 탐색기 등. 테이블 행 안에서 부모-자식 관계를 트리로 표현.', + components: [ + { name: '접기/펼치기 화살표 (행 좌측)', required: true }, + { name: '들여쓰기 레벨 (depth 표현)', required: true }, + { name: '테이블 헤더 (일반 컬럼)', required: true }, + { name: '부모 행 볼드/배경색 구분', required: false }, + { name: '전체 펼치기/접기 버튼', required: true }, + ], + usedIn: ['Jira', 'SAM BOM 트리', 'Windows Explorer', 'macOS Finder'], + guidelines: '레벨당 들여쓰기 16~20px. 리프 노드는 화살표 없음. 접힌 상태에서 자식 수 표시. Shift+클릭으로 재귀 펼치기.', + }, + // ===== 폼 추가 (8) ===== + { + type: 'pattern', title: '멀티 스텝 폼 (위자드)', category: 'form', rating: 5, + tags: ['멀티스텝', '위자드', '단계', '폼'], + memo: 'Typeform, Stripe Checkout, HubSpot 등. 복잡한 폼을 여러 단계로 나눠 사용자 부담을 줄이는 패턴.', + components: [ + { name: '진행 바/스텝 인디케이터', required: true }, + { name: '현재 단계 폼 필드', required: true }, + { name: '이전/다음 버튼', required: true }, + { name: '단계별 유효성 검사', required: true }, + { name: '요약/확인 단계 (마지막)', required: true }, + { name: '임시 저장 (중간 이탈 방지)', required: false }, + ], + usedIn: ['Typeform', 'Stripe Checkout', 'HubSpot', 'SAM 견적 등록'], + guidelines: '3~5단계 권장. 각 단계 필드 3~5개 이내. 완료 단계에 확인 아이콘. 진행 바에 퍼센트 또는 단계 번호 표시.', + }, + { + type: 'pattern', title: '주소 검색/입력 폼', category: 'form', rating: 3, + tags: ['주소', '검색', '우편번호', 'API'], + memo: '다음 주소 API, Google Places, 네이버 지도 등. 우편번호 검색 후 상세주소를 입력하는 한국형 주소 입력.', + components: [ + { name: '우편번호 검색 버튼', required: true }, + { name: '주소 검색 모달/팝업', required: true }, + { name: '기본 주소 (자동 채워짐)', required: true }, + { name: '상세 주소 입력란', required: true }, + { name: '검색 결과 목록', required: true }, + ], + usedIn: ['카카오 주소 API', '네이버 주소', 'SAM 거래처 주소'], + guidelines: '검색창에 동/도로명/건물명 입력. 결과 클릭 시 기본주소 자동 채움 + 상세주소 포커스. 모바일: 전체 화면 검색.', + }, + { + type: 'pattern', title: '태그/칩 입력', category: 'form', rating: 4, + tags: ['태그', '칩', '다중선택', '입력'], + memo: 'Gmail 수신자, Notion 태그, Jira 라벨 등. 여러 항목을 태그 형태로 추가/삭제하는 입력 UI.', + components: [ + { name: '입력 필드 (텍스트 입력)', required: true }, + { name: '태그 칩 (X 삭제 버튼)', required: true }, + { name: '자동완성 드롭다운', required: true }, + { name: 'Enter/콤마로 추가', required: true }, + { name: 'Backspace로 마지막 태그 삭제', required: true }, + { name: '드래그로 순서 변경', required: false }, + ], + usedIn: ['Gmail', 'Notion', 'Jira', 'SAM 품목 태그'], + guidelines: '태그 칩 높이 24px, pill 형태. 입력 필드와 태그가 같은 줄에 배치. 중복 태그 방지 (이미 있으면 깜빡임). 최대 개수 제한 안내.', + }, + { + type: 'pattern', title: '슬라이더/레인지 입력', category: 'form', rating: 3, + tags: ['슬라이더', '레인지', '범위', '조절'], + memo: 'Airbnb 가격 필터, YouTube 볼륨, Figma 투명도 등. 드래그로 수치를 조절하는 입력 컨트롤.', + components: [ + { name: '트랙 바 (가로 선)', required: true }, + { name: '핸들/썸 (드래그 포인트)', required: true }, + { name: '현재 값 표시 (핸들 위 또는 옆)', required: true }, + { name: '최소/최대 라벨', required: true }, + { name: '범위 선택 (핸들 2개)', required: false }, + { name: '수치 직접 입력 (옆 필드)', required: false }, + ], + usedIn: ['Airbnb', 'YouTube', 'Figma', 'SAM 가격 필터'], + guidelines: '핸들 크기 최소 20px (터치 영역 44px). 드래그 중 값 실시간 업데이트. 스텝 단위 설정 가능. 키보드: 좌우 화살표로 미세 조정.', + }, + { + type: 'pattern', title: '토글 설정 패널', category: 'form', rating: 3, + tags: ['토글', '스위치', '설정', '온오프'], + memo: 'iOS 설정, Android 설정, Notion 설정 등. 각 옵션을 토글 스위치로 켜고 끄는 설정 패널.', + components: [ + { name: '토글 스위치 (ON/OFF)', required: true }, + { name: '옵션 라벨 + 설명', required: true }, + { name: '섹션 그룹핑', required: true }, + { name: '위험한 설정 빨간 강조', required: false }, + { name: '변경 시 즉시 저장 / 저장 버튼', required: true }, + ], + usedIn: ['iOS 설정', 'Android 설정', 'Notion', 'SAM 알림 설정'], + guidelines: '토글 너비 44px, 높이 24px. ON=파랑/초록, OFF=회색. 라벨 좌측, 토글 우측 정렬. 변경 사항 즉시 저장 또는 하단 저장 버튼.', + }, + { + type: 'pattern', title: '서명 패드 (전자 서명)', category: 'form', rating: 3, + tags: ['서명', '전자서명', '캔버스', '필기'], + memo: 'DocuSign, Adobe Sign, SAM 전자결재 등. 마우스/터치로 직접 서명을 작성하는 UI.', + components: [ + { name: '캔버스 영역 (서명 작성)', required: true }, + { name: '지우기 버튼', required: true }, + { name: '펜 굵기/색상 옵션', required: false }, + { name: '서명 완료/확인 버튼', required: true }, + { name: '서명 이미지 미리보기', required: false }, + { name: '텍스트 서명 옵션 (타이핑)', required: false }, + ], + usedIn: ['DocuSign', 'Adobe Sign', 'HelloSign', 'SAM 전자결재 서명'], + guidelines: '캔버스 배경 연한 줄무늬. 펜 압력 감지 (가능 시). 서명 이미지 PNG/SVG로 저장. 모바일: 가로 모드 권장.', + }, + { + type: 'pattern', title: '컬러 피커', category: 'form', rating: 3, + tags: ['컬러', '색상', '피커', '팔레트'], + memo: 'Figma, Photoshop, Notion 등 디자인 도구. 색상을 시각적으로 선택하는 UI 컴포넌트.', + components: [ + { name: '색상 영역 (Saturation/Brightness)', required: true }, + { name: '색상 바 (Hue 슬라이더)', required: true }, + { name: '투명도 슬라이더 (Alpha)', required: false }, + { name: 'HEX/RGB/HSL 입력', required: true }, + { name: '최근 사용 색상', required: false }, + { name: '프리셋 팔레트', required: false }, + ], + usedIn: ['Figma', 'Photoshop', 'VS Code', 'SAM 테마 설정'], + guidelines: '미리보기 원형 또는 사각형. HEX 6자리 입력. 스포이드 도구 (브라우저 지원 시). 자주 사용 색상 저장.', + }, + { + type: 'pattern', title: '평점/별점 입력', category: 'form', rating: 3, + tags: ['별점', '평점', '리뷰', '평가'], + memo: 'Amazon, Google Maps, App Store 등. 별 아이콘을 클릭하여 점수를 매기는 UI.', + components: [ + { name: '별 아이콘 5개 (클릭 가능)', required: true }, + { name: 'hover 시 미리보기', required: true }, + { name: '반별 (0.5점 단위) 지원', required: false }, + { name: '숫자 표시 (4.5/5.0)', required: true }, + { name: '리뷰 텍스트 영역', required: false }, + ], + usedIn: ['Amazon', 'Google Maps', 'App Store', 'SAM 공급업체 평가'], + guidelines: '별 크기 24~32px. 채워진 별=노랑, 빈 별=회색. hover 시 해당 별까지 채워짐. 읽기 전용 모드: 평균 + 리뷰 수.', + }, + // ===== 모달/팝업 추가 (5) ===== + { + type: 'pattern', title: '바텀 시트 (모바일)', category: 'modal', rating: 4, + tags: ['바텀시트', '모바일', '시트', '슬라이드업'], + memo: 'Google Maps, Apple Maps, Uber 등 모바일 앱. 화면 하단에서 올라오는 시트형 모달.', + components: [ + { name: '드래그 핸들 (상단 바)', required: true }, + { name: '시트 콘텐츠', required: true }, + { name: '반쯤 열린 / 완전히 열린 상태', required: true }, + { name: '배경 딤 (오버레이)', required: true }, + { name: '아래로 스와이프 닫기', required: true }, + ], + usedIn: ['Google Maps', 'Apple Maps', 'Uber', 'SAM 모바일 필터'], + guidelines: '핸들 바 너비 40px, 높이 4px, 중앙 배치. 3단계 높이 (peek/half/full). 스와이프 속도에 따라 닫기 판단. 배경 탭 시 닫기.', + }, + { + type: 'pattern', title: '컨텍스트 메뉴 (우클릭)', category: 'modal', rating: 3, + tags: ['컨텍스트', '우클릭', '메뉴', '팝업'], + memo: 'VS Code, Figma, macOS 등. 마우스 우클릭 위치에 나타나는 상황별 액션 메뉴.', + components: [ + { name: '메뉴 항목 목록', required: true }, + { name: '키보드 단축키 표시', required: true }, + { name: '구분선 (그룹 분리)', required: true }, + { name: '아이콘 (항목 좌측)', required: false }, + { name: '비활성 항목 (회색)', required: true }, + { name: '서브메뉴 (우측 화살표)', required: false }, + ], + usedIn: ['VS Code', 'Figma', 'macOS', 'SAM 테이블 우클릭'], + guidelines: '마우스 위치에 생성 (화면 밖으로 나가지 않게 조정). 외부 클릭 시 닫기. 메뉴 항목 높이 28~32px. 위험 항목 빨간색.', + }, + { + type: 'pattern', title: '슬라이드오버 상세 패널', category: 'modal', rating: 4, + tags: ['슬라이드오버', '패널', '사이드', '상세'], + memo: 'AWS Console, Jira 상세, Salesforce Record 등. 우측에서 슬라이드하여 상세 정보를 보여주는 패널.', + components: [ + { name: '우측 슬라이드 패널 (320~480px)', required: true }, + { name: '패널 헤더 (제목 + 닫기)', required: true }, + { name: '콘텐츠 영역 (스크롤)', required: true }, + { name: '배경 딤 (반투명)', required: true }, + { name: '하단 액션 버튼 (고정)', required: false }, + ], + usedIn: ['AWS Console', 'Jira', 'Salesforce', 'SAM 수주 상세'], + guidelines: '패널 너비 400~500px. 뒤 페이지는 어둡게 + 클릭 가능(닫기). 슬라이드 애니메이션 200~300ms. ESC로 닫기.', + }, + { + type: 'pattern', title: '쿠키/개인정보 동의 배너', category: 'modal', rating: 3, + tags: ['쿠키', '동의', 'GDPR', '배너'], + memo: 'EU GDPR 대응. 거의 모든 웹사이트에 필수. 쿠키 사용 동의를 받는 하단 배너 또는 모달.', + components: [ + { name: '안내 텍스트 (쿠키 사용 목적)', required: true }, + { name: '동의/거부 버튼', required: true }, + { name: '상세 설정 링크', required: true }, + { name: '개인정보처리방침 링크', required: true }, + { name: '카테고리별 토글 (필수/분석/마케팅)', required: false }, + ], + usedIn: ['EU 웹사이트 전체', 'Vercel', 'Notion', 'SAM (향후 적용)'], + guidelines: '하단 고정 또는 중앙 모달. "모두 동의" 버튼 강조. 필수 쿠키는 비활성화 불가 (회색 토글). 닫기 버튼 없이 선택 강제.', + }, + { + type: 'pattern', title: '풀스크린 모달 (이머시브)', category: 'modal', rating: 3, + tags: ['풀스크린', '전체화면', '모달', '이머시브'], + memo: 'Medium 글쓰기, Notion 전체화면, Google Docs 등. 전체 화면을 차지하는 몰입형 모달.', + components: [ + { name: '전체 화면 오버레이', required: true }, + { name: '상단 툴바 (닫기 + 액션)', required: true }, + { name: '중앙 콘텐츠 영역 (최대 너비 제한)', required: true }, + { name: '닫기 버튼 (좌상단 또는 우상단)', required: true }, + { name: '저장/발행 버튼', required: false }, + ], + usedIn: ['Medium', 'Notion', 'Google Docs', 'SAM 문서 편집'], + guidelines: '배경 완전 흰색 또는 단색. 콘텐츠 최대 너비 720~800px (가독성). ESC로 닫기 + 저장 안 됨 확인. 애니메이션: fade-in.', + }, + // ===== 네비게이션 추가 (5) ===== + { + type: 'pattern', title: '탑 네비게이션 바 + 검색', category: 'navigation', rating: 5, + tags: ['탑바', 'GNB', '검색', '헤더'], + memo: 'GitHub, Notion, AWS Console 등. 상단 고정 네비게이션 바. 로고 + 메뉴 + 검색 + 프로필의 표준 구조.', + components: [ + { name: '로고 (좌측)', required: true }, + { name: '메뉴 항목 (중앙 또는 좌측)', required: true }, + { name: '검색 바 (중앙)', required: true }, + { name: '알림 아이콘 + 배지', required: false }, + { name: '프로필 아바타 + 드롭다운', required: true }, + ], + usedIn: ['GitHub', 'Notion', 'AWS', 'SAM 상단 헤더'], + guidelines: '높이 48~64px. position: sticky. 스크롤 시 그림자 추가. 검색: Ctrl+K 단축키. 프로필 클릭 시 드롭다운 메뉴.', + }, + { + type: 'pattern', title: '앵커/스크롤 스파이 네비게이션', category: 'navigation', rating: 3, + tags: ['앵커', '스크롤스파이', '목차', '사이드'], + memo: 'Bootstrap Docs, MDN, Tailwind Docs 등. 긴 문서에서 현재 섹션을 추적하는 사이드 목차.', + components: [ + { name: '섹션 링크 목록 (사이드)', required: true }, + { name: '현재 섹션 하이라이트', required: true }, + { name: '스크롤 연동 (자동 추적)', required: true }, + { name: '클릭 시 스무스 스크롤', required: true }, + { name: '들여쓰기 (서브섹션)', required: false }, + ], + usedIn: ['Bootstrap Docs', 'MDN', 'Tailwind CSS', 'SAM 가이드 페이지'], + guidelines: '사이드 고정 (position: sticky). IntersectionObserver로 현재 섹션 감지. 현재 섹션 파란색 + 좌측 바. 모바일: 상단 드롭다운.', + }, + { + type: 'pattern', title: '페이지네이션 패턴', category: 'navigation', rating: 4, + tags: ['페이지네이션', '페이지', '이동', '넘기기'], + memo: 'Google 검색, GitHub Issues 등. 대량 데이터를 페이지 단위로 나누어 탐색하는 UI.', + components: [ + { name: '이전/다음 버튼', required: true }, + { name: '페이지 번호 (1, 2, 3...)', required: true }, + { name: '말줄임 (1 ... 5 6 7 ... 20)', required: true }, + { name: '첫 페이지/마지막 페이지', required: true }, + { name: '페이지당 표시 수 선택', required: false }, + { name: '총 결과 수 표시', required: true }, + ], + usedIn: ['Google 검색', 'GitHub', 'AWS Console', 'SAM 목록 페이지'], + guidelines: '현재 페이지 파란 배경. 표시 페이지 5~7개. 양 끝에 말줄임(...). 첫/마지막 페이지는 항상 표시. 모바일: 이전/다음만.', + }, + { + type: 'pattern', title: '플로팅 액션 버튼 (FAB)', category: 'navigation', rating: 3, + tags: ['FAB', '플로팅', '액션', '버튼'], + memo: 'Material Design, Gmail, Google Docs 등. 화면 하단에 떠있는 주요 액션 버튼.', + components: [ + { name: '원형 버튼 (고정 위치)', required: true }, + { name: '아이콘 (+ 기호)', required: true }, + { name: '확장 메뉴 (클릭 시 다중 액션)', required: false }, + { name: '스크롤 시 축소/숨기기', required: false }, + { name: '툴팁 라벨', required: false }, + ], + usedIn: ['Gmail', 'Google Docs', 'Material Design', 'SAM 모바일 빠른 등록'], + guidelines: '우하단 고정 (right: 24px, bottom: 24px). 크기 56px (mini: 40px). 그림자 필수. 확장 시 위로 액션 아이콘 나열.', + }, + { + type: 'pattern', title: '사이드 탭 (세로 탭)', category: 'navigation', rating: 3, + tags: ['세로탭', '사이드탭', '수직탭', '패널'], + memo: 'VS Code 사이드바, Slack 좌측, Notion 좌측 등. 좌측에 세로로 배치된 탭으로 콘텐츠를 전환.', + components: [ + { name: '세로 탭 목록 (좌측)', required: true }, + { name: '활성 탭 하이라이트', required: true }, + { name: '아이콘 + 라벨 (선택적)', required: true }, + { name: '콘텐츠 패널 (우측)', required: true }, + { name: '아이콘만 모드 (축소)', required: false }, + ], + usedIn: ['VS Code', 'Slack', 'Notion', 'SAM 설정 페이지'], + guidelines: '탭 너비: 확장 200px, 축소 48px. 활성 탭: 좌측 파란 바 + 배경색. 아이콘: 24px, 라벨: 12~14px. 키보드: ↑↓ 탭 전환.', + }, + // ===== 인증 추가 (3) ===== + { + type: 'pattern', title: '역할/권한 관리 (RBAC)', category: 'auth', rating: 4, + tags: ['권한', 'RBAC', '역할', '접근제어'], + memo: 'AWS IAM, GitHub Org Settings, Notion Permissions 등. 역할 기반 접근 제어를 관리하는 UI.', + components: [ + { name: '역할 목록 (관리자, 편집자, 뷰어)', required: true }, + { name: '권한 매트릭스 (역할 × 기능)', required: true }, + { name: '체크박스/토글 (권한 부여)', required: true }, + { name: '역할 생성/편집/삭제', required: true }, + { name: '사용자-역할 배정', required: true }, + ], + usedIn: ['AWS IAM', 'GitHub', 'Notion', 'SAM 부서 권한 관리'], + guidelines: '매트릭스: 행=권한, 열=역할. 체크/언체크로 즉시 변경. 관리자 역할은 수정 불가 (잠금 아이콘). 변경 시 확인 다이얼로그.', + }, + { + type: 'pattern', title: '세션/디바이스 관리', category: 'auth', rating: 3, + tags: ['세션', '디바이스', '보안', '로그아웃'], + memo: 'Google 계정, GitHub Sessions, Notion 등. 로그인된 디바이스/세션을 관리하고 원격 로그아웃.', + components: [ + { name: '활성 세션 목록', required: true }, + { name: '디바이스 정보 (OS, 브라우저, IP)', required: true }, + { name: '마지막 활동 시간', required: true }, + { name: '현재 세션 표시 (이 기기)', required: true }, + { name: '개별/전체 로그아웃 버튼', required: true }, + ], + usedIn: ['Google 계정', 'GitHub', 'Notion', 'SAM 보안 설정'], + guidelines: '현재 세션은 "이 기기" 초록 배지. 디바이스 아이콘 (데스크톱/모바일). 로그아웃 시 확인 다이얼로그. 마지막 활동 상대 시간 표시.', + }, + { + type: 'pattern', title: 'API 키 관리', category: 'auth', rating: 3, + tags: ['API키', '토큰', '인증', '개발자'], + memo: 'Stripe API Keys, OpenAI API, GitHub Token 등. API 키를 생성/관리/폐기하는 개발자 설정.', + components: [ + { name: 'API 키 목록 (마스킹)', required: true }, + { name: '새 키 생성 버튼', required: true }, + { name: '키 복사 버튼', required: true }, + { name: '키 폐기/삭제', required: true }, + { name: '만료일/사용 통계', required: false }, + { name: '생성 시 한 번만 표시 경고', required: true }, + ], + usedIn: ['Stripe', 'OpenAI', 'GitHub', 'SAM API 키 관리'], + guidelines: '키 마스킹: sk-...xxxx (앞 4자 + 뒤 4자만). 복사 시 "복사됨" 토스트. 새 키 생성 시 전체 표시 (한 번만). 테스트/프로덕션 키 구분.', + }, + // ===== 보고서 추가 (4) ===== + { + type: 'pattern', title: '간트 차트 (프로젝트 일정)', category: 'report', rating: 5, + tags: ['간트', '일정', '프로젝트', '타임라인'], + memo: 'Jira Roadmap, Monday.com, Microsoft Project 등. 작업 일정을 가로 막대로 시각화하는 프로젝트 관리 핵심 도구.', + components: [ + { name: '작업 목록 (좌측 고정)', required: true }, + { name: '시간축 (상단 헤더, 일/주/월)', required: true }, + { name: '작업 바 (시작~종료)', required: true }, + { name: '의존관계 화살표', required: false }, + { name: '진행률 표시 (바 내부)', required: true }, + { name: '마일스톤 (다이아몬드 아이콘)', required: false }, + ], + usedIn: ['Jira Roadmap', 'Monday.com', 'MS Project', 'SAM 프로젝트 관리'], + guidelines: '작업 바는 드래그로 이동/리사이즈. 오늘 날짜 빨간 세로선. 주말 배경 회색. 크리티컬 패스 빨간 강조.', + }, + { + type: 'pattern', title: '조직도 (트리 구조)', category: 'report', rating: 4, + tags: ['조직도', '트리', '계층', '구조'], + memo: 'SAM 조직도, Lucidchart, OrgChart 등. 부서/직원의 계층 구조를 시각적으로 표현.', + components: [ + { name: '노드 카드 (이름 + 직책)', required: true }, + { name: '연결선 (부모→자식)', required: true }, + { name: '확대/축소 컨트롤', required: true }, + { name: '접기/펼치기 (부서 단위)', required: true }, + { name: '드래그 팬 (이동)', required: true }, + ], + usedIn: ['SAM 조직도', 'Lucidchart', 'OrgChart', 'HR 시스템'], + guidelines: '노드 카드: 이름, 직책, 부서, 아바타. 연결선: 직선 또는 곡선. 수평/수직 레이아웃 전환. 검색 시 해당 노드 하이라이트.', + }, + { + type: 'pattern', title: '워터폴 차트 (재무 분석)', category: 'report', rating: 3, + tags: ['워터폴', '재무', '증감', '누적'], + memo: 'McKinsey, BCG 재무 보고서, Excel 등. 초기 값에서 증가/감소를 순차적으로 보여주는 재무 분석 차트.', + components: [ + { name: '시작 막대 (전체 높이)', required: true }, + { name: '증가 막대 (초록)', required: true }, + { name: '감소 막대 (빨강)', required: true }, + { name: '연결선 (이전 값→현재 시작)', required: true }, + { name: '최종 합계 막대', required: true }, + { name: '각 막대 위 수치 라벨', required: true }, + ], + usedIn: ['McKinsey 보고서', 'Excel', 'Power BI', 'SAM 재무 분석'], + guidelines: '증가=초록, 감소=빨강, 합계=파랑. 연결선으로 이전 값과 현재 시작점 연결. 막대 위에 절대 값 + 변화량 표시.', + }, + { + type: 'pattern', title: '리포트 빌더 (커스텀 보고서)', category: 'report', rating: 4, + tags: ['리포트빌더', '커스텀', '보고서', '생성기'], + memo: 'Salesforce Reports, HubSpot Reports, Metabase 등. 사용자가 직접 필드/필터/차트를 조합하여 보고서를 생성.', + components: [ + { name: '데이터 소스 선택', required: true }, + { name: '필드 선택 (드래그 또는 체크)', required: true }, + { name: '필터 조건 빌더', required: true }, + { name: '차트 유형 선택', required: true }, + { name: '미리보기', required: true }, + { name: '저장/내보내기', required: true }, + ], + usedIn: ['Salesforce', 'HubSpot', 'Metabase', 'SAM 리포트 빌더 (계획)'], + guidelines: '좌측: 필드 목록 (드래그). 우측: 미리보기 영역. 필터: AND/OR 조합 UI. 차트 유형 아이콘 선택. 저장된 보고서 목록.', + }, + // ===== 기타 추가 (15) ===== + { + type: 'pattern', title: '댓글/스레드', category: 'etc', rating: 4, + tags: ['댓글', '스레드', '답글', '토론'], + memo: 'GitHub PR Comments, Notion Comments, Figma Comments 등. 특정 항목에 대한 토론을 스레드로 관리.', + components: [ + { name: '댓글 목록 (시간순)', required: true }, + { name: '아바타 + 작성자 + 시간', required: true }, + { name: '답글 (들여쓰기 스레드)', required: true }, + { name: '편집/삭제 (본인 댓글)', required: true }, + { name: '이모지 리액션', required: false }, + { name: '멘션 (@사용자)', required: false }, + ], + usedIn: ['GitHub', 'Notion', 'Figma', 'SAM 게시판/수주 댓글'], + guidelines: '답글 들여쓰기 24px. 시간은 상대 표시 (3분 전). 본인 댓글만 편집/삭제 가능. 새 댓글 자동 스크롤.', + }, + { + type: 'pattern', title: '에러 페이지 (404/500)', category: 'etc', rating: 3, + tags: ['에러', '404', '500', '오류페이지'], + memo: 'GitHub 404, Notion 404, Stripe 등. 페이지를 찾을 수 없거나 서버 오류 시 표시되는 안내 페이지.', + components: [ + { name: '에러 코드 (큰 텍스트)', required: true }, + { name: '안내 메시지', required: true }, + { name: '일러스트/아이콘', required: false }, + { name: '홈으로 가기 버튼', required: true }, + { name: '검색 바 (선택적)', required: false }, + { name: '이전 페이지로 가기', required: true }, + ], + usedIn: ['GitHub', 'Notion', 'Stripe', 'SAM 에러 페이지'], + guidelines: '화면 중앙 배치. 에러 코드 크게 (72~96px). 친근한 메시지. 홈/뒤로 가기 버튼 명확히. 404는 유머 가능, 500은 진지하게.', + }, + { + type: 'pattern', title: '비교 테이블 (기능/제품)', category: 'etc', rating: 4, + tags: ['비교', '기능비교', '제품', '체크마크'], + memo: 'SaaS 가격 페이지, Product Hunt, AWS 서비스 비교 등. 여러 옵션을 기능별로 나란히 비교하는 테이블.', + components: [ + { name: '기능 목록 (좌측 고정)', required: true }, + { name: '옵션 컬럼 (2~4개)', required: true }, + { name: '체크/X 아이콘', required: true }, + { name: '추천 옵션 하이라이트', required: false }, + { name: '가격 행 (상단 또는 하단)', required: true }, + { name: '선택/CTA 버튼', required: true }, + ], + usedIn: ['SaaS 가격 페이지', 'Product Hunt', 'AWS', 'SAM 요금제 비교'], + guidelines: '기능 행 zebra striping. 추천 열 파란 테두리 + 배지. 체크=초록, X=빨강, 하이픈=회색. 모바일: 좌우 스크롤.', + }, + { + type: 'pattern', title: '캐러셀/슬라이더', category: 'etc', rating: 3, + tags: ['캐러셀', '슬라이더', '갤러리', '스와이프'], + memo: 'Amazon 상품 이미지, Netflix 콘텐츠 행, Instagram 다중 이미지 등. 좌우로 넘기는 콘텐츠 슬라이더.', + components: [ + { name: '슬라이드 컨테이너', required: true }, + { name: '좌/우 네비게이션 화살표', required: true }, + { name: '페이지 인디케이터 (점)', required: true }, + { name: '자동 재생 (선택적)', required: false }, + { name: '스와이프 제스처 (모바일)', required: true }, + ], + usedIn: ['Amazon', 'Netflix', 'Instagram', 'SAM 제품 이미지'], + guidelines: '한 번에 1~3개 표시. 인디케이터 5개 이하. 자동 재생 시 정지 버튼. 마지막 슬라이드 후 첫 번째로 순환. 스와이프 threshold 50px.', + }, + { + type: 'pattern', title: '아코디언/FAQ', category: 'etc', rating: 4, + tags: ['아코디언', 'FAQ', '접기', '펼치기'], + memo: 'Apple FAQ, Stripe Help, Bootstrap Accordion 등. 질문/답변을 접기/펼치기로 관리하는 UI.', + components: [ + { name: '질문/제목 (클릭 영역)', required: true }, + { name: '펼치기/접기 아이콘 (+ 또는 ▾)', required: true }, + { name: '답변/내용 (슬라이드 펼침)', required: true }, + { name: '하나만 열기 모드 (선택적)', required: false }, + { name: '전체 펼치기/접기 버튼', required: false }, + ], + usedIn: ['Apple FAQ', 'Stripe', 'Bootstrap', 'SAM FAQ/도움말'], + guidelines: '기본 모두 접힌 상태. 클릭 영역은 전체 행. 아이콘 회전 애니메이션 (180도). 펼침 시 슬라이드 다운 200ms.', + }, + { + type: 'pattern', title: '툴팁/팝오버', category: 'etc', rating: 3, + tags: ['툴팁', '팝오버', '도움말', 'hover'], + memo: 'GitHub 아이콘 hover, Notion 블록 메뉴, AWS 설명 등. 요소에 마우스를 올리면 추가 정보를 표시.', + components: [ + { name: '트리거 요소 (hover/click)', required: true }, + { name: '팝업 컨테이너 (말풍선)', required: true }, + { name: '화살표 (연결 포인터)', required: true }, + { name: '텍스트 내용', required: true }, + { name: '닫기 버튼 (팝오버)', required: false }, + ], + usedIn: ['GitHub', 'Notion', 'AWS', 'SAM 아이콘 도움말'], + guidelines: '툴팁: hover 후 300ms 지연 표시. 팝오버: 클릭 트리거 + 닫기. 위치: 자동 조정 (화면 밖 방지). 최대 너비 250px.', + }, + { + type: 'pattern', title: '프로그레스 트래커 (배송/처리)', category: 'etc', rating: 4, + tags: ['프로그레스', '배송', '처리상태', '추적'], + memo: 'Amazon 배송 추적, Coupang, DHL 등. 주문/처리 단계별 진행 상황을 시각화.', + components: [ + { name: '단계 노드 (원/체크)', required: true }, + { name: '연결선 (완료/진행/대기)', required: true }, + { name: '단계 라벨 + 시간', required: true }, + { name: '현재 단계 강조', required: true }, + { name: '상세 정보 (각 단계 설명)', required: false }, + ], + usedIn: ['Amazon', 'Coupang', 'DHL', 'SAM 수주 상태 추적'], + guidelines: '완료=초록 체크, 현재=파란 점+애니메이션, 대기=회색. 수평 또는 수직 배치. 각 단계에 시간/날짜 표시.', + }, + { + type: 'pattern', title: '데이터 임포트 위자드', category: 'etc', rating: 4, + tags: ['임포트', '가져오기', 'CSV', '엑셀'], + memo: 'Airtable Import, HubSpot Import, Notion Import 등. CSV/엑셀 파일을 업로드하고 필드를 매핑하는 3단계 플로우.', + components: [ + { name: '파일 업로드 (드래그 앤 드롭)', required: true }, + { name: '미리보기 (첫 5행)', required: true }, + { name: '필드 매핑 (소스→대상)', required: true }, + { name: '유효성 검사 결과', required: true }, + { name: '임포트 진행률', required: true }, + { name: '결과 요약 (성공/실패 건수)', required: true }, + ], + usedIn: ['Airtable', 'HubSpot', 'Notion', 'SAM 데이터 마이그레이션'], + guidelines: '3단계: 업로드→매핑→확인. 미리보기에서 문제 행 빨간 강조. 매핑: 드롭다운으로 대상 필드 선택. 자동 감지 (컬럼명 유사도).', + }, + { + type: 'pattern', title: '랜딩 페이지 히어로 섹션', category: 'etc', rating: 4, + tags: ['랜딩', '히어로', 'CTA', '메인배너'], + memo: 'Stripe, Linear, Vercel 등 SaaS. 메인 페이지 첫 화면. 헤드라인 + 서브텍스트 + CTA 버튼의 표준 구조.', + components: [ + { name: '헤드라인 (큰 텍스트)', required: true }, + { name: '서브 텍스트 (설명)', required: true }, + { name: 'CTA 버튼 (1~2개)', required: true }, + { name: '히어로 이미지/영상/일러스트', required: false }, + { name: '소셜 프루프 (고객 로고/통계)', required: false }, + ], + usedIn: ['Stripe', 'Linear', 'Vercel', 'SAM 소개 페이지'], + guidelines: '헤드라인: 32~56px, 한 줄 권장. CTA 버튼: 명확한 액션 (예: "무료로 시작하기"). 서브 텍스트: 18~20px, 2줄 이내.', + }, + { + type: 'pattern', title: '코드 에디터/뷰어', category: 'etc', rating: 3, + tags: ['코드', '에디터', '구문강조', '개발'], + memo: 'VS Code, GitHub Gist, CodePen 등. 코드를 구문 강조하여 보여주거나 편집하는 UI.', + components: [ + { name: '코드 영역 (모노스페이스 폰트)', required: true }, + { name: '줄 번호', required: true }, + { name: '구문 강조 (Syntax Highlighting)', required: true }, + { name: '복사 버튼', required: true }, + { name: '언어 선택 드롭다운', required: false }, + { name: '다크/라이트 테마', required: false }, + ], + usedIn: ['VS Code', 'GitHub', 'CodePen', 'SAM API 문서'], + guidelines: '폰트: JetBrains Mono 또는 Fira Code. 다크 배경 (#1e1e1e). 복사 시 "복사됨" 피드백. 줄 번호 회색, 코드 색상은 테마에 따름.', + }, + { + type: 'pattern', title: '키보드 단축키 도움말', category: 'etc', rating: 3, + tags: ['단축키', '키보드', '도움말', '핫키'], + memo: 'GitHub (? 키), Notion (/), Gmail (?) 등. 키보드 단축키 목록을 보여주는 오버레이.', + components: [ + { name: '키 조합 표시 (Kbd 스타일)', required: true }, + { name: '액션 설명', required: true }, + { name: '카테고리 그룹핑', required: true }, + { name: '검색/필터', required: false }, + { name: 'ESC로 닫기', required: true }, + ], + usedIn: ['GitHub', 'Notion', 'Gmail', 'SAM 디자인 인사이트'], + guidelines: 'Kbd 스타일: 회색 배경 + 테두리 + 라운드. 그룹별 섹션 분리. 2~3열 레이아웃. ?키로 열기 관례.', + }, + { + type: 'pattern', title: '다크 모드 전환', category: 'etc', rating: 3, + tags: ['다크모드', '테마', '라이트', '전환'], + memo: 'macOS, Tailwind, GitHub, VS Code 등. 라이트/다크 테마를 전환하는 UI + 실제 적용.', + components: [ + { name: '토글 스위치/버튼', required: true }, + { name: '해/달 아이콘', required: true }, + { name: '시스템 설정 연동', required: false }, + { name: '전환 애니메이션', required: false }, + { name: 'CSS 변수 기반 테마', required: true }, + ], + usedIn: ['macOS', 'GitHub', 'Tailwind Docs', 'SAM (계획)'], + guidelines: '3옵션: 라이트/다크/시스템. 전환 시 부드러운 트랜지션 (200ms). prefers-color-scheme 미디어 쿼리. localStorage에 선호 저장.', + }, + { + type: 'pattern', title: '알림 설정 패널', category: 'etc', rating: 3, + tags: ['알림설정', '구독', '채널', '선호'], + memo: 'GitHub Notifications, Slack Preferences, Notion Settings 등. 알림 채널별/유형별 수신 여부를 설정.', + components: [ + { name: '알림 유형 목록 (수주, 승인 등)', required: true }, + { name: '채널별 토글 (이메일/푸시/슬랙)', required: true }, + { name: '방해 금지 시간 설정', required: false }, + { name: '전체 켜기/끄기', required: true }, + { name: '미리보기 (알림 샘플)', required: false }, + ], + usedIn: ['GitHub', 'Slack', 'Notion', 'SAM 알림 설정'], + guidelines: '매트릭스: 행=알림 유형, 열=채널. 토글 ON/OFF. 변경 즉시 저장. 필수 알림(보안)은 비활성화 불가.', + }, + { + type: 'pattern', title: '파일 매니저/탐색기', category: 'etc', rating: 4, + tags: ['파일', '탐색기', '폴더', '관리'], + memo: 'Google Drive, Dropbox, macOS Finder 등. 폴더/파일을 계층적으로 탐색하고 관리하는 UI.', + components: [ + { name: '폴더 트리 (좌측)', required: true }, + { name: '파일 목록 (우측, 그리드/리스트)', required: true }, + { name: '경로 표시 (브레드크럼)', required: true }, + { name: '업로드/새 폴더 버튼', required: true }, + { name: '파일 미리보기', required: false }, + { name: '검색/정렬/필터', required: true }, + ], + usedIn: ['Google Drive', 'Dropbox', 'macOS Finder', 'SAM 문서 관리'], + guidelines: '더블클릭으로 폴더 진입. 파일 유형별 아이콘. 드래그 앤 드롭으로 이동. 우클릭 컨텍스트 메뉴. 다중 선택 (Ctrl+클릭).', + }, + { + type: 'pattern', title: '소셜 공유 버튼', category: 'etc', rating: 3, + tags: ['공유', '소셜', 'SNS', '링크'], + memo: 'Medium, Product Hunt, 뉴스 사이트 등. 콘텐츠를 SNS에 공유하는 버튼 세트.', + components: [ + { name: '소셜 미디어 아이콘 (Twitter, LinkedIn 등)', required: true }, + { name: '링크 복사 버튼', required: true }, + { name: '공유 수 카운터', required: false }, + { name: '이메일 공유', required: false }, + { name: '플로팅/고정 위치 선택', required: true }, + ], + usedIn: ['Medium', 'Product Hunt', '뉴스 사이트', 'SAM 공유 기능'], + guidelines: '아이콘: 각 플랫폼 브랜드 컬러. 링크 복사 시 "복사됨" 토스트. 플로팅: 좌측 고정, 스크롤 따라감. 인라인: 콘텐츠 상/하단.', + }, ]; const cards = presets.map(p => ({ @@ -4553,7 +6213,7 @@ function designInsight() { this.currentProject.cards = [...cards, ...this.currentProject.cards]; this.saveProject(); this.categoryFilter = 'pattern'; - this.toast('인기 UI 패턴 50종이 추가되었습니다'); + this.toast('인기 UI 패턴 100종이 추가되었습니다'); }, }; }