// Store chrome — white/premium theme, image PhotoSlot, scroll Reveal, header/footer
const { useState: useStateC, useEffect: useEffectC, useRef: useRefC } = React;
function Btn({ children, variant = "primary", onClick, full, small, as = "button", href }) {
const base = { fontFamily:"var(--font-body)", fontWeight:700, cursor:"pointer", border:0,
borderRadius:999, padding: small ? "10px 20px" : "15px 30px", fontSize: small ? 13 : 15,
width: full ? "100%" : "auto", transition:"all .2s ease", display:"inline-flex",
alignItems:"center", justifyContent:"center", gap:9, textDecoration:"none", letterSpacing:".02em" };
const variants = {
primary: { ...base, background:"var(--primary)", color:"#fff", boxShadow:"0 10px 26px rgba(229,35,31,.26)" },
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)" },
line: { ...base, background:"#fff", color:"var(--ink-900)", border:"1.5px solid var(--line-300)" },
outlineLight: { ...base, background:"rgba(255,255,255,.1)", color:"#fff", border:"1.5px solid rgba(255,255,255,.6)", backdropFilter:"blur(4px)" },
};
const [h, setH] = useStateC(false);
const hov = h ? (variant==="primary" ? { background:"var(--primary-hover)", transform:"translateY(-2px)", boxShadow:"0 14px 30px rgba(229,35,31,.34)" }
: variant==="gold" ? { transform:"translateY(-2px)", boxShadow:"0 12px 24px rgba(247,183,49,.4)" }
: variant==="outlineLight" ? { background:"rgba(255,255,255,.2)" }
: { transform:"translateY(-2px)", borderColor:"var(--primary)", color:"var(--primary)" }) : {};
const Tag = as;
return setH(true)} onMouseLeave={()=>setH(false)}>{children};
}
// Photo: real image when src given, else warm gradient placeholder
function PhotoSlot({ src, label, h = 220, round = 16, tone = "red", style, zoom, children, alt, onClick }) {
const grads = {
red:"linear-gradient(135deg,#E5231F,#D9892B)", sauce:"linear-gradient(135deg,#5A2B18,#E5231F)",
gold:"linear-gradient(135deg,#D9892B,#F7B731)", char:"linear-gradient(135deg,#2A2522,#5A2B18)",
};
return (
{src
?

:
}
{children}
{label &&
{label}}
);
}
// Scroll-reveal wrapper
function Reveal({ children, style, delay = 0, y = 26 }) {
const ref = useRefC(null);
const [vis, setVis] = useStateC(false);
useEffectC(() => {
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, center, sub }) {
return (
);
}
function DemoBar({ lang, setLang }) {
return (
← ご提案に戻る
PREMIUM ¥150,000
AI検索対応 (AEO)
店舗サイト プレビュー
);
}
function Header({ t, lang, setLang, cartCount, onCart, onReserve }) {
const [scr, setScr] = useStateC(false);
useEffectC(() => {
const f = () => setScr(window.scrollY > 40);
window.addEventListener("scroll", f, { passive:true }); f();
return () => window.removeEventListener("scroll", f);
}, []);
const links = [["menu",t.navMenu],["craft",t.navCraft],["plan",t.navPlan],["news",t.navNews],["shops",t.navShops]];
const go = (id) => { const el=document.getElementById(id); if(el) window.scrollTo({top: el.offsetTop-58, behavior:"smooth"}); };
return (
);
}
function Footer({ t }) {
return (
);
}
Object.assign(window, { Btn, PhotoSlot, Reveal, Kicker, DemoBar, Header, Footer });