/* eslint-disable */ // ───────────────────────────────────────────────────────────── // searchgg · 공용 컴포넌트 (라이트 테마 · 흰 배경 / 검정 포인트) // ───────────────────────────────────────────────────────────── const { useState, useRef, useEffect } = React; // ── 아이콘 ── const PATHS = { search: 'M11 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm6 12 4 4', chevR: 'M9 5l7 7-7 7', chevL: 'M15 5l-7 7 7 7', user: 'M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM4 20a8 8 0 0 1 16 0', users: 'M9 11a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7zM2.5 19a6.5 6.5 0 0 1 13 0M16 4.5a3.5 3.5 0 0 1 0 7M18 13a6.5 6.5 0 0 1 3.5 6', bolt: 'M13 2L4 14h6l-1 8 9-12h-6z', refresh: 'M20 11a8 8 0 1 0-.7 4.5M20 5v6h-6', clock: 'M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18zM12 7v5l3.5 2', heart: 'M12 20s-7-4.3-7-9.5A3.5 3.5 0 0 1 12 7a3.5 3.5 0 0 1 7 3.5C19 15.7 12 20 12 20z', gun: 'M3 8h15l-1 4h-3l-1 3h-3l-1-3H5a2 2 0 0 1-2-2V8zM8 12v3', shieldcheck: 'M12 3l7 3v5c0 4.5-3 7.3-7 8.5-4-1.2-7-4-7-8.5V6l7-3zM9 11.5l2 2 4-4', flame: 'M12 2c1 3-1.5 4.2-1.5 6.5 0 1.4 1 2.3 1 2.3s.6-1 .6-2.2c1.6 1 3.4 3 3.4 5.6a5.5 5.5 0 1 1-11 0c0-2.3 1.4-4 2.2-5 .3 1 .9 1.6.9 1.6s-.2-2.3 1.2-4.2C10.4 4.6 12 4 12 2z', }; function Icon({ name, size = 18, stroke = 'currentColor', fill = 'none', sw = 1.7, style }) { const filled = ['flame', 'bolt', 'heart'].includes(name); return ( ); } // ── 로고 ── function Logo({ size = 24, light = false }) { return (
search.gg
); } // ── 계급(랭크) 뱃지 ── function RankBadge({ rank, size = 44, showName = false }) { if (!rank) return null; const c = rank.color; const pip = (i) => { const cx = size / 2, base = size * 0.66, gap = size * 0.13; const total = rank.pips, x = cx + (i - (total - 1) / 2) * gap; if (rank.shape === 'star') return ; if (rank.shape === 'flower') return ; if (rank.shape === 'dia') return ; if (rank.shape === 'chev') return ; return ; }; return (
{rank.name} {Array.from({ length: rank.pips }).map((_, i) => pip(i))} {showName && (
{rank.name}
{rank.group}
)}
); } function wrColor(wr) { return wr >= 60 ? '#48515f' : wr >= 50 ? '#48515f' : '#e5484d'; } // ── 승률 링 ── function WinRing({ wr, size = 64, sw = 6, label = '승률', color }) { const r = (size - sw) / 2, c = 2 * Math.PI * r; const col = color || wrColor(wr); return (
{wr}%
{label}
); } // ── KDA 칩 ── function KdaChip({ k, d, a, big }) { return ( {k} / {d} / {a} ); } // ───────────────────────────────────────────────────────────── // SearchBar — 흰 필드 + 검정 버튼. 라이브 추천 → onPick(player) // ───────────────────────────────────────────────────────────── function SearchBar({ onPick, big, placeholder = '닉네임으로 전적을 검색하세요' }) { const SA = window.SA; const [q, setQ] = useState(''); const [open, setOpen] = useState(false); const ref = useRef(null); useEffect(() => { const h = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }; document.addEventListener('pointerdown', h, true); return () => document.removeEventListener('pointerdown', h, true); }, []); const matches = q.trim() ? SA.allPlayers.filter((p) => p.name.toLowerCase().includes(q.trim().toLowerCase())).slice(0, 6) : []; const recents = SA.recentSearches.map((n) => SA.allPlayers.find((p) => p.name === n)).filter(Boolean); const submit = () => { const found = matches[0] || SA.allPlayers.find((p) => p.name === q.trim()); if (found) { onPick(found); setQ(''); setOpen(false); } else if (q.trim()) { onPick(SA.allPlayers[1]); setQ(''); setOpen(false); } }; const h = big ? 58 : 44; return (
{ setQ(e.target.value); setOpen(true); }} onFocus={() => setOpen(true)} onKeyDown={(e) => e.key === 'Enter' && submit()} placeholder={placeholder} style={{ flex: 1, border: 'none', outline: 'none', background: 'transparent', color: '#15171c', fontFamily: "'Pretendard',sans-serif", fontSize: big ? 17 : 14.5, padding: `0 ${big ? 16 : 11}px`, fontWeight: 500 }} />
{open && (
{q.trim() ? `"${q}" 검색 결과` : '최근 검색한 유저'}
{(q.trim() ? matches : recents).map((p) => ( ))} {q.trim() && matches.length === 0 && (
일치하는 유저가 없어요. 닉네임을 확인해 주세요.
)}
)}
); } // ── 최근검색 칩 ── function RecentChips({ onPick, onDark = false }) { const SA = window.SA; return (
최근 {SA.recentSearches.slice(0, 6).map((n) => { const p = SA.allPlayers.find((x) => x.name === n); return ( ); })}
); } // ───────────────────────────────────────────────────────────── // 문의 위젯 — 우하단 플로팅 버튼 + 문의 모달 // 푸터 '문의하기' 링크는 window 'sa-open-feedback' 이벤트로 연동 // ───────────────────────────────────────────────────────────── function FeedbackWidget() { const PT = '#48515f'; const [open, setOpen] = React.useState(false); const [type, setType] = React.useState('불편 사항'); const [text, setText] = React.useState(''); const [sent, setSent] = React.useState(false); const [files, setFiles] = React.useState([]); const fileRef = React.useRef(null); const addFiles = (list) => { const arr = Array.from(list || []); if (!arr.length) return; setFiles((f) => [...f, ...arr].slice(0, 3)); }; const fmtSize = (n) => n > 1048576 ? (n / 1048576).toFixed(1) + 'MB' : Math.max(1, Math.round(n / 1024)) + 'KB'; React.useEffect(() => { const fn = () => { setOpen(true); setSent(false); }; window.addEventListener('sa-open-feedback', fn); return () => window.removeEventListener('sa-open-feedback', fn); }, []); const submit = () => { if (!text.trim()) return; setSent(true); setTimeout(() => { setOpen(false); setText(''); setType('불편 사항'); setSent(false); setFiles([]); }, 1400); }; return ( {/* 플로팅 버튼 */} {/* 문의 모달 */} {open && (
setOpen(false)} style={{ position: 'fixed', inset: 0, zIndex: 300, background: 'rgba(20,22,26,.55)', backdropFilter: 'blur(2px)', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 20, animation: 'sgFade .18s ease' }}>
e.stopPropagation()} style={{ width: 430, maxWidth: '100%', background: '#fff', borderRadius: 12, overflow: 'hidden', boxShadow: '0 24px 70px rgba(0,0,0,.3)', fontFamily: "'Pretendard',sans-serif" }}>
문의하기
불편한 점이나 궁금한 점을 알려주세요.
{sent ? (
문의가 접수되었어요
답변은 마이페이지 > 문의 내역에서 확인할 수 있어요.
) : (
문의 유형
{['불편 사항', '버그 제보', '기능 제안', '신고', '기타 문의'].map((v) => { const on = type === v; return ( ); })}
내용