// ─── App shell + router ────────────────────────────────────────── const TWEAKS = { heroLayout: "text", ctaStrength: "strong" }; const PAGE_META = { home: { path: "/", title: "UIARB合同会社 | WordPress保守・開発・SEO対策", desc: "WordPress保守・監視・開発からWebシステム構築・SEO対策まで。15分以内一次応答、月次レポート付き。沖縄・那覇発のWeb制作・保守専門会社UIARB合同会社。" }, services: { path: "/services/", title: "サービス一覧 | UIARB合同会社", desc: "WordPress保守・開発、Webシステム構築、SEO対策など6つの専門分野。作って終わらせない、長期伴走型のWebパートナー。" }, "wp-maint": { path: "/wp-maint/", title: "WordPress保守・監視 | UIARB合同会社", desc: "コア・プラグイン・テーマを継続的に検証。脆弱性・パフォーマンス・バックアップを一元管理。インシデント発生時は15分以内に一次応答。" }, seo: { path: "/seo/", title: "SEO対策 | UIARB合同会社", desc: "GA4・Search Console・CrUXを活用した数字ベースのSEO改善。技術的SEOからコンテンツ戦略まで一貫対応。" }, works: { path: "/works/", title: "実績紹介 | UIARB合同会社", desc: "CV+240%、運用コスト-78%など数字で語れる実績。WordPress・SaaS・ECサイト等のWeb制作・保守事例。" }, company: { path: "/company/", title: "会社概要 | UIARB合同会社", desc: "UIARB合同会社の会社概要。沖縄・那覇を拠点に、WordPress保守・開発・SEO対策を提供するWeb制作会社。" }, contact: { path: "/contact/", title: "お問い合わせ・無料相談 | UIARB合同会社", desc: "30分の無料相談で、現状の課題・予算・ゴールを整理します。その場での見積り・営業は一切行いません。" }, blog: { path: "/blog/", title: "ブログ・お役立ち記事 | UIARB合同会社", desc: "WordPress保守・セキュリティ・SEO対策・Web制作に関する知識・事例を発信しています。" }, }; function pageFromPath(path) { for (const [key, m] of Object.entries(PAGE_META)) { if (m.path === path) return key; } return window.__INITIAL_PAGE || "home"; } function App() { const [page, setPage] = React.useState(() => pageFromPath(location.pathname)); const [contactTab, setContactTab] = React.useState("simulator"); const isFirst = React.useRef(true); // URL・title・meta を同期 React.useEffect(() => { const m = PAGE_META[page] || PAGE_META.home; document.title = m.title; document.querySelector('meta[name="description"]')?.setAttribute("content", m.desc); document.querySelector('link[rel="canonical"]')?.setAttribute("href", location.origin + m.path); if (isFirst.current) { history.replaceState({ page }, "", m.path); isFirst.current = false; } else { history.pushState({ page }, "", m.path); } }, [page]); // ブラウザ戻る / 進む React.useEffect(() => { const onPop = (e) => setPage(e.state?.page || pageFromPath(location.pathname)); window.addEventListener("popstate", onPop); return () => window.removeEventListener("popstate", onPop); }, []); const go = React.useCallback((p, opts) => { if (p === "contact" && opts?.tab) setContactTab(opts.tab); else if (p !== "contact") setContactTab("simulator"); setPage(p); window.scrollTo({ top: 0, behavior: "instant" }); }, []); React.useEffect(() => { window.__goto = go; }, [go]); const Page = (() => { switch (page) { case "home": return ; case "services": return ; case "wp-maint": return ; case "seo": return ; case "works": return ; case "company": return ; case "contact": return ; case "blog": return ; default: return ; } })(); return ( <>
{Page}