// sections.jsx — All non-hero sections. const { useState: useStateS, useEffect: useEffectS, useRef: useRefS } = React; // IntersectionObserver-based reveal hook function useReveal() { const ref = useRefS(null); useEffectS(() => { const el = ref.current; if (!el) return; const io = new IntersectionObserver((entries) => { entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add("in"); io.unobserve(e.target); } }); }, { threshold: 0.12, rootMargin: "0px 0px -40px 0px" }); io.observe(el); return () => io.disconnect(); }, []); return ref; } // ─── Inline icons (thin stroke) ──────────────────────────────────────────── const I = { pen: (p) => , steel: (p) => , loop: (p) => , block: (p) => , laser: (p) => , mold: (p) => , preform: (p) => , blow: (p) => , family: (p) => , }; // ─── Pillars ───────────────────────────────────────────────────────────── function Pillars({ T }) { const r = useReveal(); return (
{T.sec_what_num}

{T.sec_what_h}

001

{T.pillar1_h}

{T.pillar1_p}

002

{T.pillar2_h}

{T.pillar2_p}

003

{T.pillar3_h}

{T.pillar3_p}

); } // ─── Process ───────────────────────────────────────────────────────────── function Process({ T }) { const r = useReveal(); const steps = [ { lab: "01 / " + T.step1_h.toUpperCase(), ico: , h: T.step1_h, p: T.step1_p }, { lab: "02 / " + T.step2_h.toUpperCase(), ico: , h: T.step2_h, p: T.step2_p }, { lab: "03 / " + T.step3_h.toUpperCase(), ico: , h: T.step3_h, p: T.step3_p }, { lab: "04 / " + T.step4_h.toUpperCase(), ico: , h: T.step4_h, p: T.step4_p }, { lab: "05 / " + T.step5_h.toUpperCase(), ico: , h: T.step5_h, p: T.step5_p }, { lab: "06 / " + T.step6_h.toUpperCase(), ico: , h: T.step6_h, p: T.step6_p }, ]; return (
{T.sec_process_num}

{T.sec_process_h}

{steps.map((s, i) => (
{s.lab}
{s.ico}

{s.h}

{s.p}

))}
); } // ─── Workshop (editorial archive viewer) ───────────────────────────────── function Workshop({ T, lang }) { const r = useReveal(); const [active, setActive] = useStateS(0); const [fade, setFade] = useStateS(false); const [stripOpen, setStripOpen] = useStateS(false); const items = [ { src: "assets/kalip-01.jpg", code: "BK-001", t: T.ws1_t, c: T.ws1_c, steel: T.ws1_steel, cav: T.ws1_cav, tol: T.ws1_tol, finish: T.ws1_finish }, { src: "assets/kalip-02.jpg", code: "BK-002", t: T.ws2_t, c: T.ws2_c, steel: T.ws2_steel, cav: T.ws2_cav, tol: T.ws2_tol, finish: T.ws2_finish }, { src: "assets/kalip-03.jpg", code: "BK-003", t: T.ws3_t, c: T.ws3_c, steel: T.ws3_steel, cav: T.ws3_cav, tol: T.ws3_tol, finish: T.ws3_finish }, { src: "assets/kalip-04.jpg", code: "BK-004", t: T.ws4_t, c: T.ws4_c, steel: T.ws4_steel, cav: T.ws4_cav, tol: T.ws4_tol, finish: T.ws4_finish }, { src: "assets/kalip-05.jpg", code: "BK-005", t: T.ws5_t, c: T.ws5_c, steel: T.ws5_steel, cav: T.ws5_cav, tol: T.ws5_tol, finish: T.ws5_finish }, { src: "assets/kalip-06.jpg", code: "BK-006", t: T.ws6_t, c: T.ws6_c, steel: T.ws6_steel, cav: T.ws6_cav, tol: T.ws6_tol, finish: T.ws6_finish }, { src: "assets/kalip-07.jpg", code: "BK-007", t: T.ws7_t, c: T.ws7_c, steel: T.ws7_steel, cav: T.ws7_cav, tol: T.ws7_tol, finish: T.ws7_finish }, { src: "assets/kalip-08.jpg", code: "BK-008", t: T.ws8_t, c: T.ws8_c, steel: T.ws8_steel, cav: T.ws8_cav, tol: T.ws8_tol, finish: T.ws8_finish }, { src: "assets/kalip-09.jpg", code: "BK-009", t: T.ws9_t, c: T.ws9_c, steel: T.ws9_steel, cav: T.ws9_cav, tol: T.ws9_tol, finish: T.ws9_finish }, { src: "assets/kalip-10.jpg", code: "BK-010", t: T.ws10_t, c: T.ws10_c, steel: T.ws10_steel, cav: T.ws10_cav, tol: T.ws10_tol, finish: T.ws10_finish }, { src: "assets/kalip-11.jpg", code: "BK-011", t: T.ws11_t, c: T.ws11_c, steel: T.ws11_steel, cav: T.ws11_cav, tol: T.ws11_tol, finish: T.ws11_finish }, { src: "assets/kalip-12.jpg", code: "BK-012", t: T.ws12_t, c: T.ws12_c, steel: T.ws12_steel, cav: T.ws12_cav, tol: T.ws12_tol, finish: T.ws12_finish }, { src: "assets/kalip-13.jpg", code: "BK-013", t: T.ws13_t, c: T.ws13_c, steel: T.ws13_steel, cav: T.ws13_cav, tol: T.ws13_tol, finish: T.ws13_finish }, { src: "assets/kalip-14.jpg", code: "BK-014", t: T.ws14_t, c: T.ws14_c, steel: T.ws14_steel, cav: T.ws14_cav, tol: T.ws14_tol, finish: T.ws14_finish }, { src: "assets/kalip-15.jpg", code: "BK-015", t: T.ws15_t, c: T.ws15_c, steel: T.ws15_steel, cav: T.ws15_cav, tol: T.ws15_tol, finish: T.ws15_finish }, { src: "assets/kalip-16.jpg", code: "BK-016", t: T.ws16_t, c: T.ws16_c, steel: T.ws16_steel, cav: T.ws16_cav, tol: T.ws16_tol, finish: T.ws16_finish }, { src: "assets/kalip-17.jpg", code: "BK-017", t: T.ws17_t, c: T.ws17_c, steel: T.ws17_steel, cav: T.ws17_cav, tol: T.ws17_tol, finish: T.ws17_finish }, { src: "assets/kalip-18.jpg", code: "BK-018", t: T.ws18_t, c: T.ws18_c, steel: T.ws18_steel, cav: T.ws18_cav, tol: T.ws18_tol, finish: T.ws18_finish }, { src: "assets/kalip-19.jpg", code: "BK-019", t: T.ws19_t, c: T.ws19_c, steel: T.ws19_steel, cav: T.ws19_cav, tol: T.ws19_tol, finish: T.ws19_finish }, { src: "assets/kalip-20.jpg", code: "BK-020", t: T.ws20_t, c: T.ws20_c, steel: T.ws20_steel, cav: T.ws20_cav, tol: T.ws20_tol, finish: T.ws20_finish }, { src: "assets/kalip-21.jpg", code: "BK-021", t: T.ws21_t, c: T.ws21_c, steel: T.ws21_steel, cav: T.ws21_cav, tol: T.ws21_tol, finish: T.ws21_finish }, { src: "assets/kalip-22.jpg", code: "BK-022", t: T.ws22_t, c: T.ws22_c, steel: T.ws22_steel, cav: T.ws22_cav, tol: T.ws22_tol, finish: T.ws22_finish }, { src: "assets/kalip-23.jpg", code: "BK-023", t: T.ws23_t, c: T.ws23_c, steel: T.ws23_steel, cav: T.ws23_cav, tol: T.ws23_tol, finish: T.ws23_finish }, { src: "assets/kalip-24.jpg", code: "BK-024", t: T.ws24_t, c: T.ws24_c, steel: T.ws24_steel, cav: T.ws24_cav, tol: T.ws24_tol, finish: T.ws24_finish }, { src: "assets/kalip-25.jpg", code: "BK-025", t: T.ws25_t, c: T.ws25_c, steel: T.ws25_steel, cav: T.ws25_cav, tol: T.ws25_tol, finish: T.ws25_finish }, { src: "assets/kalip-26.jpg", code: "BK-026", t: T.ws26_t, c: T.ws26_c, steel: T.ws26_steel, cav: T.ws26_cav, tol: T.ws26_tol, finish: T.ws26_finish }, { src: "assets/kalip-27.jpg", code: "BK-027", t: T.ws27_t, c: T.ws27_c, steel: T.ws27_steel, cav: T.ws27_cav, tol: T.ws27_tol, finish: T.ws27_finish }, ]; const cur = items[active]; const select = (i) => { if (i === active) return; setFade(true); setTimeout(() => { setActive(i); setFade(false); }, 220); }; const prev = () => select((active - 1 + items.length) % items.length); const next = () => select((active + 1) % items.length); useEffectS(() => { const onKey = (e) => { if (e.key === "ArrowLeft") prev(); else if (e.key === "ArrowRight") next(); }; const sec = r.current; if (!sec) return; let inView = false; const io = new IntersectionObserver((entries) => { inView = entries[0].isIntersecting; }, { threshold: 0.25 }); io.observe(sec); const handler = (e) => { if (inView) onKey(e); }; window.addEventListener("keydown", handler); return () => { window.removeEventListener("keydown", handler); io.disconnect(); }; }, [active]); return (
{T.sec_workshop_num}

{T.sec_workshop_h}

{T.sec_workshop_sub}

{/* Featured image */}
{T.ws_status} · {cur.code} {T.ws_meta_loc}
{String(active+1).padStart(2,"0")} / {String(items.length).padStart(2,"0")}
{/* Spec plate */}
{cur.code} {T.ws_archive} · {T.ws_meta_date}

{cur.t}

{cur.c}

{T.ws_steel}{cur.steel}
{T.ws_cavity}{cur.cav}
{T.ws_tol}{cur.tol}
{T.ws_finish}{cur.finish}
BLK · {cur.code} {T.ws_meta_loc}
{/* Foot bar — toggle + hint */}
{lang === "tr" ? "← → ile gez" : "← → to browse"}
{/* Index strip — collapsible */}
{items.map((it, i) => ( ))}
); } // ─── Family ────────────────────────────────────────────────────────────── function Family({ T, lang, accent }) { const r = useReveal(); const [open, setOpen] = useStateS(null); const [hover, setHover] = useStateS(null); return (
{T.sec_family_num}

{T.sec_family_h}

{T.sec_family_sub}

{window.BOTTLES.map((b, i) => { const glbUrl = b.glb; return (
setOpen(open === b.code ? null : b.code)} onMouseEnter={() => setHover(b.code)} onMouseLeave={() => setHover(null)} style={{cursor:"pointer"}} >
{glbUrl ? : }
{b.code}
{b.name[lang]}
{b.fam[lang]}
VOL{b.vol} H{b.h} W{b.w}
); })} {open && (
{(() => { const b = window.BOTTLES.find(x => x.code === open); return (
{b.code} · {b.fam[lang]}

{b.name[lang]}

{lang === "tr" ? `Çelik bloktan türemiş bu üye, ailenin ${b.fam[lang].toLowerCase()} kolundan geliyor. Aynı kavite mantığı, farklı orana taşınmış. Kalıp parça ayırma çizgisi gövde merkezinde, ${b.h} yüksekliğinde, ${b.w} ağırlığında bir formdur.` : `Descended from the same steel block, this member belongs to the family's ${b.fam[lang].toLowerCase()} branch. Same cavity logic, different proportion. Parting line through the body centre. ${b.h} tall, ${b.w} dry weight.`}

{lang==="tr"?"Hacim":"Volume"}{b.vol}
{lang==="tr"?"Yükseklik":"Height"}{b.h}
{lang==="tr"?"Ağırlık":"Weight"}{b.w}
{lang==="tr"?"Boyun":"Neck"}24/410
{lang==="tr"?"Malzeme":"Material"}PET / PETG
{lang==="tr"?"MOQ":"MOQ"}5,000
); })()}
)}
); } // ─── Factory ───────────────────────────────────────────────────────────── function Factory({ T }) { const r = useReveal(); const stats = [ { k: T.fact_k1, v: T.fact_v1 }, { k: T.fact_k2, v: T.fact_v2 }, { k: T.fact_k3, v: T.fact_v3, em: true }, { k: T.fact_k4, v: T.fact_v4 }, { k: T.fact_k5, v: T.fact_v5 }, ]; return (
{T.sec_factory_num}

{T.sec_factory_h}

{T.fact_p}

{stats.map((s, i) => (
{s.k}
{s.em ? {s.v} : s.v}
))}
); } // ─── Contact ───────────────────────────────────────────────────────────── function Contact({ T }) { const r = useReveal(); const [sent, setSent] = useStateS(false); const [vals, setVals] = useStateS({ name:"", email:"", company:"", proj:"" }); const submit = (e) => { e.preventDefault(); setSent(true); }; return (
{T.sec_contact_num}

{T.sec_contact_h}

setVals({...vals, name:e.target.value})}/>
setVals({...vals, email:e.target.value})}/>
setVals({...vals, company:e.target.value})}/>