// site-lecturers.jsx — Lecturer grid const LECTURERS = [ { name: 'LAN', kana: 'ラン', en: 'Extension · Design', desc: 'シールエクステ・デザイン提案を得意とする講師。', src: 'assets/img/lan.jpg', pos: 'right 30%' }, { name: 'RIKU', kana: 'リク', en: 'Cut · Sculpting', desc: 'メンズカット・骨格補正を軸にした構築的なカット。', src: 'assets/img/riku.jpg', pos: 'center 30%' }, { name: 'S__1138883_0', kana: 'エス', en: 'Color · Editorial', desc: 'ハイトーンを起点にしたエディトリアルカラー。', src: 'assets/img/s.jpg', pos: 'center 25%' }, { name: 'SARA', kana: 'サラ', en: 'Color · Highlight', desc: '透明感のあるハイライト・ベーシックカラーが得意。', src: 'assets/img/sara.jpg', pos: 'center 25%' }, { name: 'KYOICHI', kana: 'きょーいち', en: 'Black Hair · Braids', desc: 'コーンロウ/ブレイズ/ドレッドを総合的に指導。', src: 'assets/img/kyoichi.jpg', pos: 'center 25%' }, { name: 'YUTO AIZU', kana: '会津 勇斗', en: 'Founder · Cut', desc: 'YuHouseアカデミー代表。サロンワーク全般を指導。', src: 'assets/img/aizu.jpg', pos: 'center 25%' }, { name: 'GOSHI YAMASHIRO', kana: '山代 剛士', en: 'Cut · Mens', desc: 'メンズ専門のショートカット・刈り上げ設計。', src: 'assets/img/yamashiro.jpg', pos: 'center 30%' }, { name: 'TAKERU KOTANI', kana: '小谷 武琉', en: 'Extension · Feather', desc: '羽エクステの装着技術とデザイン構成。', src: 'assets/img/kotani.jpg', pos: 'center 35%' }, { name: 'YOSHITO NIIMURA', kana: '新村 嘉人', en: 'Black Hair · Afro', desc: 'アフロ・ドレッドのテクスチャー作り。', src: 'assets/img/niimura.jpg', pos: 'center 25%' }, { name: 'MIKI TATEISHI', kana: '立石 未希', en: 'Counsel · Design', desc: 'カウンセリングとデザイン提案を体系的に学ぶ。', src: 'assets/img/tateishi.jpg', pos: 'center 25%' }]; function LecturerCard({ idx, lecturer, onOpen }) { const [hov, setHov] = useState(false); const num = String(idx + 1).padStart(2, '0'); return ( ); } // ── Profile modal ────────────────────────────────────────────────────────── function LecturerModal({ idx, onClose }) { const open = idx !== null; const lecturer = open ? LECTURERS[idx] : null; const num = open ? String(idx + 1).padStart(2, '0') : ''; // Lock scroll + ESC to close while open. useEffect(() => { if (!open) return; const prev = document.body.style.overflow; document.body.style.overflow = 'hidden'; const onKey = (e) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', onKey); return () => { document.body.style.overflow = prev; window.removeEventListener('keydown', onKey); }; }, [open, onClose]); if (!open) return null; return (
e.stopPropagation()} style={{ position: 'relative', display: 'grid', gridTemplateColumns: '0.85fr 1fr', width: 'min(880px, 100%)', maxHeight: '86vh', overflow: 'hidden', background: BRAND.white, color: BRAND.ink, boxShadow: '0 40px 100px -40px rgba(0,0,0,.6)', animation: 'lecRise .4s cubic-bezier(.2,.7,.2,1)', }}> {/* Close */} {/* Photo */}
{lecturer.name}
N° {num}
{/* Body */}
{lecturer.en}

{lecturer.name}

{lecturer.kana}
Profile

##############################################
####################################
##############################################
####################

e.preventDefault()} style={{ fontFamily: 'ui-monospace, monospace', fontSize: 11, letterSpacing: '.2em', color: BRAND.mute, textDecoration: 'none', }}>INSTAGRAM ↗ e.preventDefault()} style={{ fontFamily: 'ui-monospace, monospace', fontSize: 11, letterSpacing: '.2em', color: BRAND.mute, textDecoration: 'none', }}>TIKTOK ↗
); } function Lecturers() { const [active, setActive] = useState(null); return (
Lecturers — 04

現場の第一線で活躍するヘアアーティストたち。
得意分野ごとに、深く学べる体制をご用意しています。

{LECTURERS.map((l, i) => )}
setActive(null)} />
); } window.Lecturers = Lecturers; window.LECTURERS = LECTURERS;