function RES(p){ return (typeof window!=="undefined" && window.__resources && window.__resources[p]) || p; } // sections.jsx — About, Services, Works, Technology, News, Partners, Team, Contact, Footer function SectionHeader({ label, title, subtitle, lede, id }) { return (
{label}

{title}

{subtitle ?
{subtitle}
: null} {lede ?

{lede}

: null}
); } /* ---------------- About ---------------- */ function About({ copy }) { const a = copy.about; const sub = copy === COPY.ja ? "AquaVisionについて" : "About AquaVision"; return (

{a.body.split("\n\n")[0]}

Bosch VR scene MUSEO DEL PRADO VR -2025 TOKYO
{a.meta.map(([k, v], i) =>
{k}
{v}
)}
); } /* ---------------- Services (Core Competence) ---------------- */ const ServiceGlyph = ({ kind }) => { // simple geometric glyphs only — no AI illustration if (kind === 0) return (// Creativity — orbit ); if (kind === 1) return (// Large scale — building w/ scale marker ); if (kind === 2) return (// Multi-sensor — concentric senses ); if (kind === 3) return (// Cutting-edge tech — XR triangle ); // kind 4 — Total art — composition return ( ); }; function Services({ copy }) { const s = copy.services; const isJa = copy === COPY.ja; return (
{isJa ? "詳しく見る" : "View more"}
); } /* ---------------- Works ---------------- */ const WorkPlaceholder = ({ i }) => { // varied abstract SVG placeholders — clearly placeholder but on-brand const variants = [ // 0 — radial rings {Array.from({ length: 24 }).map((_, k) => )} {Array.from({ length: 12 }).map((_, k) => )} , // 1 — flow field arcs {Array.from({ length: 40 }).map((_, k) => )} , // 2 — grid + dot {Array.from({ length: 17 }).map((_, k) => )} {Array.from({ length: 13 }).map((_, k) => )} , // 3 — wave fold {Array.from({ length: 22 }).map((_, k) => { const off = k * 12; return ; })} , // 4 — sphere wireframe {Array.from({ length: 9 }).map((_, k) => )} {Array.from({ length: 9 }).map((_, k) => )} ]; return variants[i % variants.length]; }; function Works({ copy }) { const w = copy.works; const [open, setOpen] = React.useState(null); React.useEffect(() => { if (open == null) return; const onKey = (e) => {if (e.key === 'Escape') setOpen(null);}; window.addEventListener('keydown', onKey); document.body.style.overflow = 'hidden'; return () => { window.removeEventListener('keydown', onKey); document.body.style.overflow = ''; }; }, [open]); const item = open != null ? w.items[open] : null; const findItem = (key) => w.items.find((it) => it.key === key); const segments = w.segments || [{ itemKeys: w.items.map((it) => it.key || it.title) }]; return (
{segments.map((seg, sIdx) =>
{seg.eyebrow}

{seg.title} {seg.en && {seg.en}}

{seg.lede}

{seg.comingSoon ? {copy === COPY.ja ? "Coming Soon" : "Coming Soon"} : {copy === COPY.ja ? "詳しく見る" : "View more"} }
{seg.itemKeys.map((key) => { const it = findItem(key); if (!it) return null; const i = w.items.indexOf(it); return ( ); })}
)}
{item && setOpen(null)} />}
); } function WorkModal({ item, onClose }) { const [active, setActive] = React.useState(0); const gallery = item.gallery && item.gallery.length ? item.gallery : item.image ? [item.image] : []; return (
e.stopPropagation()}>
{gallery.length > 0 &&
{item.title}
} {gallery.length > 1 &&
{gallery.map((g, i) => )}
}
{item.tag}

{item.title}

{item.jp}
{item.tagline &&
{item.tagline}
} {item.intro &&

{item.intro}

} {item.body && item.body.split("\n\n").map((p, i) =>

{p}

)} {item.meta &&
{item.meta.map(([k, v], i) =>
{k}
{v}
)}
}
); } /* ---------------- Business (parallel to Services, list style) ---------------- */ function BusinessRow({ item }) { const [open, setOpen] = React.useState(false); return (
  • {item.num}

    {item.en}{item.jp}

    {item.body}

    {item.capabilities && item.capabilities.length > 0 &&
    }
    {item.image &&
    {item.imageCap {item.imageCap && {item.imageCap}}
    }
  • ); } function Business({ copy }) { if (!copy.business) return null; const b = copy.business; return (
      {b.items.map((it, i) => )}
    ); } /* ---------------- CEO Message ---------------- */ function CEOMessage({ copy }) { if (!copy.ceo) return null; const c = copy.ceo; return (
    {c.label}

    {c.title}

    {c.sign_role}
    {c.sign_name}
    {c.body.split("\n\n").map((p, i) =>

    {p}

    )}
    ); } /* ---------------- Technology ---------------- */ function TechVis() { // ambient animated SVG — wireframe globe + scanning line return ( {Array.from({ length: 13 }).map((_, k) => )} {Array.from({ length: 9 }).map((_, k) => )} {/* scanning line */} {/* corner ticks */} {[[20, 20], [380, 20], [20, 380], [380, 380]].map(([x, y], k) => )} {/* readout */} N 35.6917° E 139.7300° SCAN ACTIVE FOV 0.42 RAD REAL · TIME ); } function Technology({ copy }) { const t = copy.tech; return (
    SYS / REALTIME
      {t.items.map((it, i) =>
    • {it.num}

      {it.en}{it.jp}

      {it.k}
    • )}
    ); } /* ---------------- News ---------------- */ function News({ copy }) { const n = copy.news; return (
    {n.more}
    ); } /* ---------------- Partners ---------------- */ function Partners({ copy }) { const p = copy.partners; return (
    {p.items.map((it, i) =>
    P—{String(i + 1).padStart(2, '0')} {it.logo ?
    {it.name}
    : {it.name} } {it.sub}
    )}
    ); } /* ---------------- Team ---------------- */ function MemberPortrait({ i }) { // Real photo for specific members const photos = { 0: RES("assets/team-fu.jpg"), 1: RES("assets/team-jin.jpg"), 2: RES("assets/team-xu.png") }; if (photos[i]) { return ; } // VR-avatar style portraits — members without a photo rendered as an immersive XR persona // wearing a modern VR headset, in the AquaVision aqua palette. const personas = [ // 0 — Stephanie Fu (CEO) { skin: "#f2d3b3", hair: "#15161a", hairStyle: "bob", visor: "#2EB5E6", glow: "#9fe3ff", bg1: "#16324e", bg2: "#0a1a2c" }, // 1 — Aiko Sasaki (Creative) { skin: "#ecc8a2", hair: "#241a12", hairStyle: "long", visor: "#36c0c2", glow: "#a7f0ef", bg1: "#173a4e", bg2: "#0a1f2a" }, // 2 — Kenji Nomura (Marketing) { skin: "#e7c6a0", hair: "#161616", hairStyle: "short",visor: "#3b82d6", glow: "#a9cdff", bg1: "#14283f", bg2: "#0a1626" } ]; const p = personas[i % personas.length]; const uid = "vrp" + i; // hair shape behind/above the headset const hairTop = p.hairStyle === "long" ? : p.hairStyle === "bob" ? : ; return ( {/* immersive background */} {Array.from({ length: 11 }).map((_, k) => )} {Array.from({ length: 11 }).map((_, k) => )} {/* soft aqua halo */} {/* shoulders / bust */} {/* neck */} {/* head */} {/* hair */} {hairTop} {/* lower face — nose + smile (below visor) */} {/* VR HEADSET */} {/* head strap around the skull */} {/* visor body */} {/* glossy visor face */} {/* visor reflection streaks */} {/* visor edge highlight */} {/* front sensor dot */} {/* corner accent */} ); } function Team({ copy }) { const t = copy.team; const [open, setOpen] = React.useState(null); // close on escape React.useEffect(() => { if (open == null) return; const onKey = (e) => {if (e.key === 'Escape') setOpen(null);}; window.addEventListener('keydown', onKey); document.body.style.overflow = 'hidden'; return () => { window.removeEventListener('keydown', onKey); document.body.style.overflow = ''; }; }, [open]); const m = open != null ? t.items[open] : null; return (
    {t.items.map((mem, i) => )}
    {/* Member modal */} {m &&
    setOpen(null)}>
    e.stopPropagation()}>
    {m.role}

    {m.en}{m.jp}

    {m.bio}

    {m.tags &&
    {m.tags.map((tag, i) => {tag})}
    }
    }
    ); } /* ---------------- Contact ---------------- */ function Contact({ copy }) { const c = copy.contact; const [openForm, setOpenForm] = React.useState(false); React.useEffect(() => { const h = () => setOpenForm(true); window.addEventListener('open-contact', h); return () => window.removeEventListener('open-contact', h); }, []); const isJa = copy === COPY.ja; React.useEffect(() => { if (!openForm) return; const onKey = (e) => {if (e.key === 'Escape') setOpenForm(false);}; window.addEventListener('keydown', onKey); document.body.style.overflow = 'hidden'; return () => { window.removeEventListener('keydown', onKey); document.body.style.overflow = ''; }; }, [openForm]); return (
    {c.eyebrow}

    {c.line_en}

    {c.line_jp}

    {c.cta2}
    {c.meta.map(([k, v], i) => {k}{v} )}
    {openForm && setOpenForm(false)} />}
    ); } function ContactModal({ lang, onClose }) { const t = lang === 'ja' ? { title: "Contact", sub: "お問い合わせ", intro: "ご相談・お見積もり・取材・出展のご依頼など、\n下記フォームよりお気軽にご連絡ください。3営業日以内に担当よりご返信します。", type: "ご用件", types: ["プロジェクト相談", "出展・コラボレーション", "メディア・取材", "投資家・パートナー", "採用について", "その他"], name: "お名前", company: "会社・組織名", email: "メールアドレス", message: "ご相談内容", messagePh: "プロジェクトの概要・規模・時期など、わかる範囲でご記入ください。", privacy: "送信いただいた内容は弊社プライバシーポリシーに基づいて取り扱います。", submit: "送信する", sent: "送信ありがとうございました。", sentMsg: "3営業日以内に担当よりご連絡いたします。", closeLabel: "閉じる" } : { title: "Contact", sub: "Contact us", intro: "Reach out for project inquiries, quotes, press, or exhibition requests using the form below. We'll respond within 3 business days.", type: "Inquiry type", types: ["Project inquiry", "Exhibition / Collaboration", "Press / Media", "Investors / Partners", "Careers", "Other"], name: "Name", company: "Company / Organization", email: "Email", message: "Message", messagePh: "Project outline, scope, and timing where possible.", privacy: "We handle the information you submit in accordance with our Privacy Policy.", submit: "Send", sent: "Message sent. Thank you.", sentMsg: "We'll be in touch within 3 business days.", closeLabel: "Close" }; const [done, setDone] = React.useState(false); const [form, setForm] = React.useState({ type: t.types[0], name: '', company: '', email: '', message: '' }); const update = (k) => (e) => setForm((f) => ({ ...f, [k]: e.target.value })); const submit = (e) => {e.preventDefault();setDone(true);}; return (
    e.stopPropagation()}> {!done ? <>
    {t.sub}

    {t.title}

    {t.intro}

    {t.types.map((tp) => )}