// Shared chrome + primitives for the recruit-site UI kit const { useState, useEffect: useEffectR, useRef: useRefR } = React; // Photo: real image when src given, else warm gradient placeholder function PhotoSlot({ src, label, h = 220, round = 16, tone = "red", style, alt, zoom }) { const grads = { red: "linear-gradient(135deg,#E5231F 0%,#D9892B 100%)", sauce: "linear-gradient(135deg,#5A2B18 0%,#E5231F 120%)", gold: "linear-gradient(135deg,#D9892B 0%,#F7B731 100%)", char: "linear-gradient(135deg,#2A2522 0%,#5A2B18 100%)", }; return (
{src ? {alt||label||""} :
} {label && {label}}
); } // Scroll-reveal wrapper function Reveal({ children, style, delay = 0, y = 26 }) { const ref = useRefR(null); const [vis, setVis] = useState(false); useEffectR(() => { const el = ref.current; if (!el) return; if (window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches) { setVis(true); return; } const o = new IntersectionObserver((es) => es.forEach(e => { if (e.isIntersecting) { setVis(true); o.disconnect(); } }), { threshold:.12, rootMargin:"0px 0px -8% 0px" }); o.observe(el); return () => o.disconnect(); }, []); return
{children}
; } function Kicker({ en, jp, light }) { return (
{en}

{jp}

); } function Btn({ children, variant = "primary", onClick, full, small }) { const base = { fontFamily:"var(--font-body)", fontWeight:700, cursor:"pointer", border:0, borderRadius:999, padding: small ? "9px 20px" : "14px 30px", fontSize: small ? 13 : 15, width: full ? "100%" : "auto", transition:"all .18s ease", display:"inline-flex", alignItems:"center", justifyContent:"center", gap:8 }; const styles = { primary: { ...base, background:"var(--primary)", color:"#fff", boxShadow:"0 8px 22px rgba(229,35,31,.28)" }, ghost: { ...base, background:"transparent", color:"var(--primary)", border:"2px solid var(--primary)" }, dark: { ...base, background:"var(--charcoal-black)", color:"var(--fg-on-dark)" }, gold: { ...base, background:"var(--festival-yellow)", color:"var(--sauce-brown)" }, }; const [h, setH] = useState(false); const hov = h && variant === "primary" ? { background:"var(--primary-hover)", transform:"translateY(-2px)", boxShadow:"0 12px 26px rgba(229,35,31,.34)" } : {}; return ; } function Header({ onNav, page }) { const [open, setOpen] = useState(false); const links = [["home","ホーム"],["jobs","求人一覧"],["profile","会社概要"]]; return (
onNav("home")}> YNNY 株式会社Y.N.N.Y
); } function FloatingCTA({ onNav }) { return (
onNav("apply")}>今すぐ応募する
); } function Footer() { return ( ); } Object.assign(window, { PhotoSlot, Reveal, Kicker, Btn, Header, FloatingCTA, Footer });