// site-courses.jsx — Course catalog const COURSES = [ { cat: 'EXTENSION', title: 'シールエクステ講習', en: 'Tape-in Extension', desc: '自然な馴染ませ方、装着位置、毛量調整、デザイン提案まで学ぶ実践講習。', target: '美容師 / アシスタント / エクステ強化', skills: ['装着技術', '馴染ませ', 'デザイン構成', 'カウンセリング'], duration: '1日 · 6h', href: 'course.html?course=seal', }, { cat: 'EXTENSION', title: '羽エクステ講習', en: 'Feather Extension', desc: '羽根素材を使った繊細な装着技術。質感とデザインの両面から指導。', target: '美容師 / 装飾デザイン志向', skills: ['素材選定', '装着技術', '配置設計', '質感調整'], duration: '1日 · 5h', href: 'course.html?course=feather', }, { cat: 'CUT', title: 'カット講習', en: 'Precision Cut', desc: '骨格・毛流を読み解き、サロンワークに直結するカット理論と実践。', target: '美容師 / カット技術を磨きたい方', skills: ['骨格補正', 'セニング設計', 'メンズ/レディース', '再現性'], duration: '2日 · 12h', href: 'course.html?course=cut', }, { cat: 'COLOR', title: 'カラー講習', en: 'Color Design', desc: 'ベーシックカラーからハイトーンまで。薬剤理論と現場の感覚を統合。', target: '美容師 / カラリスト志望', skills: ['薬剤選定', 'ハイライト', 'ハイトーン', 'カウンセリング'], duration: '2日 · 10h', href: 'course.html?course=color', }, ]; function CourseCard({ course, idx }) { const [hov, setHov] = useState(false); const num = String(idx + 1).padStart(2, '0'); return ( setHov(true)} onMouseLeave={() => setHov(false)} style={{ background: BRAND.white, border: `1px solid ${hov ? BRAND.black : BRAND.hair}`, transition: 'border-color .4s ease, transform .4s ease', display: 'flex', flexDirection: 'column', textDecoration: 'none', color: 'inherit', transform: hov ? 'translateY(-4px)' : 'none', }}> {/* Photo */} {/* Body */} {course.cat} COURSE · {num} {course.en} {course.title} {course.desc} {/* Spec table */} For {course.target} Skills {course.skills.join(' / ')} Time {course.duration} 詳細を見る → ); } function Courses() { return ( Courses — 05 {['All', 'Cut', 'Color', 'Extension', 'Black Hair'].map((t, i) => ( {t} ))} {COURSES.map((c, i) => )} 全ての講習を見る ); } window.Courses = Courses; window.COURSES = COURSES;
{course.desc}