// 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
?

:
}
{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 (
);
}
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 (
);
}
function FloatingCTA({ onNav }) {
return (
);
}
function Footer() {
return (
);
}
Object.assign(window, { PhotoSlot, Reveal, Kicker, Btn, Header, FloatingCTA, Footer });