// Main app — Hash router for the live site + Design Canvas at #/canvas const { useState, useEffect } = React; // ===== ハッシュルータ ===== // 利用方法: または location.hash = '#/search' // パスを取得:getRoute() → 'search' / 'sitter-register' / ... function getRoute() { const h = (window.location.hash || '').replace(/^#\/?/, ''); return h.split('?')[0].replace(/\/$/, ''); } function navigate(path) { // 先頭 / は省略可 const p = path.replace(/^\/?/, ''); window.location.hash = '#/' + p; window.scrollTo({top:0, behavior:'instant'}); } // グローバルにエクスポート(他コンポーネントから navigate('search') と呼べる) window.palpetNavigate = navigate; window.palpetGetRoute = getRoute; // 各画面の最小ラッパー(既存コンポーネントはそのまま使う) function Page({ children }) { return
{children}
; } // ===== 画面定義 ===== const ROUTES = { '': () => , 'landing-b': () => , 'search': () => , 'search/detail': () => , 'sitter-register': () => , 'owner-register': () => , 'booking': () => , 'booking/complete':() => , 'mypage': () => , 'mypage/history': () => , 'mypage/counseling':()=> , 'mypage/reviews': () => , 'mypage-sitter': () => , 'mypage-sitter/requests': () => , 'mypage-sitter/schedule': () => , 'mypage-sitter/clients': () => , 'mypage-sitter/earnings': () => , 'login': () => , 'messages': () => , 'company': () => , 'privacy': () => , 'terms': () => , 'law': () => , }; // ===== ルートアプリ ===== function App() { const TWEAKS = /*EDITMODE-BEGIN*/{ "direction": "A", "palette": "palpet", "fontJP": "maru", "heroLayout": "split", "cardDensity": "cozy", "illustrations": true }/*EDITMODE-END*/; const [t, setTweak] = useTweaks(TWEAKS); const [route, setRoute] = useState(getRoute()); // テーマ適用 useEffect(() => { applyPalpetTheme(document.documentElement, t); }, [t.palette, t.fontJP, t.cardDensity]); // hashchange を監視してルート更新 useEffect(() => { const onHash = () => setRoute(getRoute()); window.addEventListener('hashchange', onHash); return () => window.removeEventListener('hashchange', onHash); }, []); // デザインキャンバスは別物として扱う if (route === 'canvas') { return ; } // 通常ルート const renderer = ROUTES[route] || ROUTES['']; return ( <> {renderer()} {/* ?honbu モード(または ?dev)のときだけ運営/プレビュー用ナビ */} {(() => { try { const params = new URLSearchParams(window.location.search); if (params.get('dev') === '1' || params.get('honbu') !== null || (typeof localStorage !== 'undefined' && localStorage.getItem('palpet_ops_mode') === '1')) { return ; } } catch (e) {} return null; })()} ); } // ===== 開発用ミニナビ(右下フローティング) ===== function DevNav({ route }) { const [open, setOpen] = useState(false); const items = [ ['', 'トップ(ランディングA)'], ['landing-b', 'ランディングB'], ['search', 'シッターを探す'], ['search/detail', '└ シッター詳細'], ['owner-register', '飼い主登録'], ['sitter-register', 'シッター登録'], ['booking', '予約確定'], ['booking/complete', '└ 予約送信完了'], ['mypage', '飼い主マイページ'], ['mypage/history', '└ 予約履歴'], ['mypage/counseling', '└ 初回カウンセリング'], ['mypage/reviews', '└ レビュー'], ['mypage-sitter', 'シッターマイページ'], ['mypage-sitter/requests', '└ 依頼受付'], ['mypage-sitter/schedule', '└ スケジュール'], ['mypage-sitter/clients', '└ 顧客一覧'], ['mypage-sitter/earnings', '└ 報酬・支払い'], ['messages', 'メッセージ'], ['company', '運営会社情報'], ['law', '特定商取引法'], ['privacy', 'プライバシーポリシー'], ['terms', '利用規約'], ['canvas', '🎨 デザインキャンバス(全画面プレビュー)'], ]; return (
{open && (
運営用 画面ナビ
{items.map(([path,label]) => { const active = path === route; return (
{ setTimeout(()=>setOpen(false),100); }} style={{ display:'block',padding:'8px 14px', fontSize:13,color:active?'var(--c-primary-deep)':'#3c2f1e', background:active?'var(--c-primary-soft)':'transparent', borderRadius:8, textDecoration:'none', fontWeight:active?700:500, }}>{label} ); })}
※ 運営スタッフ用の全画面ナビ。
一般ユーザーには表示されません。
)}
); } // ===== デザインキャンバス(既存のレビュー用画面) ===== function DesignCanvasView({ t, setTweak }) { return ( <> パルペット リニューアル案
3つのコア体験(LP / シッター登録 / マッチング検索)を再設計しました。
A案 = 編集的で落ち着いた印象、B案 = 親しみと活発さ。右下のTweaksで配色やレイアウトを切り替えられます。
setTweak('palette',v)} options={[ {value:'palpet', label:'palpet(ブランド・桜色)'}, {value:'sunbutter', label:'sunbutter(やわらか黄色)'}, {value:'sage', label:'sage(若葉グリーン)'}, {value:'cocoa', label:'cocoa(落ち着いた焦茶)'}, ]}/> setTweak('fontJP',v)} options={[ {value:'maru', label:'Zen Maru Gothic(丸み)'}, {value:'mincho', label:'Shippori Mincho(明朝)'}, {value:'sans', label:'Noto Sans JP(標準)'}, ]}/> setTweak('illustrations',v)}/> setTweak('heroLayout',v)} options={[{value:'split', label:'分割'},{value:'centered', label:'中央'}]}/> setTweak('cardDensity',v)} options={[{value:'cozy', label:'ゆったり'},{value:'compact', label:'コンパクト'}]}/> ); } // -------------- Brand overview board -------------- function BrandOverview({t}) { return (
BRAND
palpet

暮らしに寄り添う、
ペットシッター。

一筆書きの肉球と中央のハートが、ロゴの核。「やさしさ」「つながり」「家族としての温度」が同居しています。 リニューアル全体でその核 — 柔らかさ・親しみ・安心 — をデジタル体験に翻訳しました。

柔らかいピンク 丸みのある書体 余白を活かす 等身大の写真
VOICE
「うちの子のおうち、留守の日も、いつも通り。」
敬語は使わず、丁寧でやさしいトーン。利用者の不安に寄り添う一人称で。
TYPE
あおぞら
Zen Maru Gothic / 見出し
TYPE
本文はNoto Sans JP。
無理なく読み続けられる字面に。
PRINCIPLES
  1. 不安を取り除く:審査と保険を、最初に伝える。
  2. その子のため:ペット側の視点で言葉を選ぶ。
  3. 余白を惜しまない:情報密度より、呼吸を優先。
); } const Tag = ({children}) => ( {children} ); // -------------- Palette board -------------- function PaletteBoard() { const palettes = [ ['palpet (Brand)', ['#F4A0A8','#FBDDE0','#D87883','#FDF7F6','#F8E8E8']], ['sunbutter', ['#F1C76C','#FBE9B8','#C8973A','#FDF8EE','#F6EEDD']], ['sage', ['#9BCFA4','#D9ECDC','#5E9C6C','#F4F8F2','#E5EFE3']], ['cocoa', ['#C49B7A','#EBD9C5','#8B6240','#FAF5EE','#EFE3D2']], ]; return (
COLOR

パレット

{palettes.map(([name, colors])=>(
{name}
{colors.map((c,i)=>(
=3 ? '1px solid rgba(0,0,0,.06)' : 'none', }}>{c}
))}
))}
); } ReactDOM.createRoot(document.getElementById('root')).render();