// All landing page sections const { useState, useEffect, useRef } = React; // === Countdown hook === function useCountdown(target) { const [d, setD] = useState({ days: 0, hours: 0, mins: 0, secs: 0 }); useEffect(() => { const tick = () => { const ms = Math.max(0, target - Date.now()); const days = Math.floor(ms / 86400000); const hours = Math.floor((ms % 86400000) / 3600000); const mins = Math.floor((ms % 3600000) / 60000); const secs = Math.floor((ms % 60000) / 1000); setD({ days, hours, mins, secs }); }; tick(); const id = setInterval(tick, 1000); return () => clearInterval(id); }, [target]); return d; } const RELEASE_DATE = new Date('2026-06-01T00:00:00+09:00').getTime(); // === Reveal wrapper === function Reveal({ children, delay = 0, as: Tag = 'div', ...rest }) { const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; const obs = new IntersectionObserver(([e]) => { if (e.isIntersecting) { setTimeout(() => el.classList.add('in'), delay); obs.disconnect(); } }, { threshold: 0.12 }); obs.observe(el); return () => obs.disconnect(); }, [delay]); return {children}; } // === NAV === function Nav() { const [scrolled, setScrolled] = useState(false); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 20); onScroll(); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); return ( ); } // === COUNTDOWN PILL === function CountdownPill({ small = false }) { const { days, hours, mins, secs } = useCountdown(RELEASE_DATE); const items = [ { v: days, l: 'DAYS' }, { v: hours, l: 'HRS' }, { v: mins, l: 'MIN' }, { v: secs, l: 'SEC' }, ]; return (
6/1 RELEASE IN
{items.map((it, i) => (
{String(it.v).padStart(2, '0')}
{it.l}
{i < items.length - 1 &&
:
}
))}
); } // === HERO === function Hero() { return (
FOR 整骨院・接骨院 · 2026.06.01 LAUNCH

整骨院専用AIで、
リピート率を
仕組みに変える。

AI問診 × AI傾向分析 × AIフォローLINE
現場で後手にまわっていた作業を、AIで前に出す。すべてLINEで完結します。

{[ { v: '78', s: '%', l: 'リピート率の目安' }, { v: '3.2', s: 'h', l: '院長の事務削減 / 週' }, { v: '0', s: '円', l: 'LINE運用コスト追加' }, ].map((s,i) => (
{s.v}{s.s}
{s.l}
))}
); } // === Marquee logos === function Marquee() { const items = ['AI問診', '傾向分析', 'フォローLINE', '予約システム', 'スタッフ管理', 'ダッシュボード', 'リピート分析', 'LTV最大化']; const doubled = [...items, ...items, ...items]; return (
{doubled.map((t,i) => (
{t}
))}
); } // === Problems === function Problems() { const items = [ { t: '問診票の紙、毎日山積み', d: '手書きを後でPDF化、入力ミスもある。スタッフが疲弊する。' }, { t: 'LINEのフォロー、院長が夜中に手打ち', d: '一人ひとり違う症状に文面を変えていたら、いつも0時を回る。' }, { t: 'リピート率、なんとなくしか分からない', d: 'カルテにはあるけど、集計するヒマがない。経営判断は勘。' }, { t: 'いつの間にか来なくなった患者', d: '離脱予兆は出ていたはず。でも見るすべがない。' }, { t: 'データはあるけど見れない', d: '予約・問診・施術メモがバラバラ。横串で見たい。' }, { t: '値上げも採用も、根拠が出せない', d: '数字がないから怖くて踏み込めない。広告費もどんぶり勘定。' }, ]; return (
PROBLEM

こんな "あるある"
ありませんか?

{items.map((it, i) => (
{ const r = e.currentTarget.getBoundingClientRect(); e.currentTarget.style.background = `radial-gradient(400px circle at ${e.clientX - r.left}px ${e.clientY - r.top}px, rgba(239,68,68,.08), rgba(255,255,255,.02))`; }} onMouseLeave={(e) => { e.currentTarget.style.background = ''; }} >
NO.{String(i+1).padStart(2,'0')}
{it.t}
{it.d}
))}
); } // === 3 main AI features === function MainFeatures() { const [active, setActive] = useState(0); const features = [ { tag: 'AI 問診票解析', title: '問診票が、答えに変わる。', desc: 'LINEで送られてきた問診票を、AIが症状・部位・原因仮説まで分解。スタッフが画面を開いた時点で、もう答えが並んでいます。', points: ['平均1.2秒で症状分類', '再発リスクを自動評価', '電子カルテに即反映'], mock: , accent: '#7c3aed', before: '紙の問診票を院長が読み返して、頭の中で整理', after: 'AIが分類した結果から、スタッフは確認するだけ', }, { tag: 'AI 傾向分析', title: '勘の経営から、データの経営へ。', desc: '蓄積された問診・施術データを横串で分析。院全体の症状傾向・リピート傾向・離脱予兆を、ダッシュボードで可視化します。', points: ['症状別リピート率', '離脱予兆スコアリング', '時間帯・曜日の傾向'], mock: , accent: '#06b6d4', before: 'カルテをめくって電卓を叩く週末', after: '開いた瞬間、判断材料がそろっている', }, { tag: 'AI フォローLINE', title: '院長は、承認するだけ。', desc: '問診票とスタッフメモから、患者一人ひとりに合わせたフォロー文面をAIが自動生成。院長はチェックして、ワンクリックで送信。', points: ['症状・時期に合わせた文面', '院のトーンを学習', 'ワンクリック送信'], mock: , accent: '#fb7847', before: '深夜、一通ずつ文面を書き直す', after: '下書きを読んで、送るボタンを押すだけ', }, ]; const f = features[active]; return (
CORE AI

リピケアが、AIで
全部やります。

3つのAIが、整骨院の現場で後手にまわっていた作業を、ぜんぶ前に出します。

{/* Tabs */}
{features.map((feat, i) => ( ))}
{/* Active feature */}

{f.title}

{f.desc}

{f.points.map((p, i) => (
{p}
))}
BEFORE
{f.before}
AFTER
{f.after}
{f.mock}
); } // === Other features === function OtherFeatures() { const items = [ { t: 'LINE 予約システム', d: '日程・メニュー・問診票の事前入力まで、すべてLINEで完結。', icon: 'L' }, { t: '管理画面', d: 'スタッフ・管理者ロール対応。アクセス権を細かく制御。', icon: '⌘' }, { t: '予約ステータス管理', d: '確定・変更・キャンセル・完了を一元管理。漏れない仕組み。', icon: '◉' }, { t: 'ダッシュボード', d: '今日の予約、リピート率、AI解析タスクが一画面で見える。', icon: '◧' }, { t: 'スタッフメモ', d: '施術ごとに残せるメモ。AIが次回のフォロー文面に反映。', icon: '✎' }, { t: '自動フォローメール', d: '来院後のサンクスメール・リマインドも自動で配信。LINE未登録の患者にも届きます。', icon: '✉'}, ]; return (
EVERYTHING ELSE

運用に必要なものは、
ぜんぶ入っています。

{items.map((it, i) => (
{it.icon}
{it.t}
{it.d}
))}
); } // === How it works === function HowItWorks() { const steps = [ { n: '01', t: '患者がLINEで予約', d: '公式アカウントから日程・メニュー・問診票まで完結。患者は操作する画面が1つだけ。', accent: '#22c55e' }, { n: '02', t: 'AIが問診票を解析', d: '送信された瞬間にAIが症状・部位・原因仮説を分類。スタッフ画面に整理済みで届きます。', accent: '#7c3aed' }, { n: '03', t: '施術後にスタッフがメモ', d: 'タップ中心の入力で1分。AIが次回フォローの素材として保存します。', accent: '#06b6d4' }, { n: '04', t: 'AIがフォロー文面を下書き', d: '患者の症状・通院ペースに合わせた文面が生成。院長はチェックしてワンクリック送信。', accent: '#fb7847' }, ]; return (
HOW IT WORKS

予約からフォローまで、
4ステップで完結。

{/* timeline line */}
{steps.map((s, i) => (
{s.n}
{s.t}
{s.d}
))}
); } // === Pricing === function Pricing() { return (
LAUNCH OFFER

リリース前だけの、
特別な価格

6月1日までに導入予約をいただいた院は、リリース後もずっとキャンペーン価格で利用できます。

{/* Regular */}
STANDARD
通常価格
2026年6月1日以降
MONTHLY
10,000 円 / 月
INITIAL FEE
30,000 円 (初回のみ)
    {['AI問診・傾向分析・フォローLINE', 'LINE予約 / 管理画面', '基本サポート'].map((t, i) => (
  • {t}
  • ))}
{/* Campaign */}
{/* ribbon */}
LIMITED
PRE-LAUNCH ONLY
キャンペーン価格
6月1日までの導入予約限定 · 適用は永続
MONTHLY
5,000 円 / 月 10,000円
INITIAL FEE
0 30,000円
{/* savings badge */}
¥90,000
年間で約9万円お得
SAVINGS / YEAR · 永続適用
    {['AI問診・傾向分析・フォローLINE', 'LINE予約 / 管理画面 / スタッフロール', '専任オンボーディング (無料)', 'リリース後の新機能を優先解放'].map((t, i) => (
  • {t}
  • ))}
導入予約する
); } // === Testimonials === function Testimonials() { return null; /* removed — no real testimonials yet */ const items = []; return (
VOICES

すでに、現場の
院長たちが触れています。

{items.map((t, i) => (
"
{t.q}
{t.initials}
{t.name}
{t.role}
{t.tag}
))}
); } // === FAQ === function FAQ() { const [open, setOpen] = useState(0); const items = [ { q: '導入は難しくないですか?', a: '最速3日で運用開始できます。オンラインまたは対面で、操作方法をまとめた資料をお渡ししながらご案内しますので、はじめての方でも安心です。' }, { q: '現場スタッフは使いこなせますか?', a: '視覚的に操作しやすいUIで設計しているので、画面を見ながら直感的に操作できます。よく使う動作はタップ中心、入力もAIの下書きを承認するだけです。' }, { q: 'いつから使えますか?', a: '2026年6月1日の正式リリース以降、順次オンボーディング開始です。導入予約をいただいた院から優先的にご案内します。' }, { q: '契約期間の縛りはありますか?', a: 'ありません。月単位でいつでも解約可能です。キャンペーン適用院も、解約時の違約金はありません。' }, { q: '他のサービスと何が違いますか?', a: 'リピケアは「予約・問診・フォロー」を1つのAIで貫いている点が違います。データが繋がっているからこそ、フォロー文面の精度が上がり続けます。' }, { q: 'サポート体制は?', a: '平日9:00〜16:00にチャット・メールでサポートいたします。導入後の操作で迷ったときも、お気軽にお問い合わせください。' }, ]; return (
FAQ

よくあるご質問

{items.map((it, i) => ( ))}
); } // === FINAL CTA === function FinalCTA() { const { days } = useCountdown(RELEASE_DATE); return (
NOW BOARDING

6/1まで残り {days} 日。
未来の整骨院を、今 予約する。

キャンペーン適用枠は、ご相談しながら順次ご案内します。
まずは導入予約から、お気軽にどうぞ。

); } // === Footer === function Footer() { return ( ); } Object.assign(window, { Nav, Hero, Marquee, Problems, MainFeatures, OtherFeatures, HowItWorks, Pricing, Testimonials, FAQ, FinalCTA, Footer, Reveal, CountdownPill });