// 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) => (
))}
);
}
// === Marquee logos ===
function Marquee() {
const items = ['AI問診', '傾向分析', 'フォローLINE', '予約システム', 'スタッフ管理', 'ダッシュボード', 'リピート分析', 'LTV最大化'];
const doubled = [...items, ...items, ...items];
return (
{doubled.map((t,i) => (
))}
);
}
// === 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) => (
))}
);
}
// === 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) => (
))}
);
}
// === 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) => (
))}
);
}
// === Pricing ===
function Pricing() {
return (
LAUNCH OFFER
リリース前だけの、
特別な価格。
6月1日までに導入予約をいただいた院は、リリース後もずっとキャンペーン価格で利用できます。
{/* Regular */}
STANDARD
通常価格
2026年6月1日以降
INITIAL FEE
30,000
円 (初回のみ)
{['AI問診・傾向分析・フォローLINE', 'LINE予約 / 管理画面', '基本サポート'].map((t, i) => (
-
✓ {t}
))}
{/* Campaign */}
{/* ribbon */}
LIMITED
PRE-LAUNCH ONLY
キャンペーン価格
6月1日までの導入予約限定 · 適用は永続
MONTHLY
5,000
円 / 月
10,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) => (
))}
);
}
// === 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 });