/* 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 (
);
}
// ── 계급(랭크) 뱃지 ──
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 (
{showName && (
)}
);
}
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 (
);
}
// ── 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 (
{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 (
);
})}
내용
)}
)}
);
}
Object.assign(window, { Icon, Logo, RankBadge, WinRing, KdaChip, SearchBar, RecentChips, wrColor, FeedbackWidget });