// dashboard.jsx — 画面1: ダッシュボード「今日のアクション」 function Dashboard({ heroLayout='row' /* row | grid | stream */ }) { // ── Hero numbers (4 cards) ──────────────────────────────────── const heroTiles = ( <> ); let heroBlock; if (heroLayout === 'grid') { heroBlock =
{heroTiles}
; } else if (heroLayout === 'stream') { heroBlock =
{[ { l:'今日のアクション', v:'12', s:'うち 要対応 3 件', t:'default' }, { l:'説明会予約(今週)', v:'8', s:'+2 先週比', t:'default' }, { l:'3日以上 未連絡', v:'3', s:'取りこぼしリスク', t:'alert' }, { l:'今月の入学', v:'16', s:'+3 前月比', t:'ok' }, ].map((r,i) => (
{r.l} {r.v} {r.s}
))}
; } else { heroBlock =
{heroTiles}
; } // ── Today's action list ─────────────────────────────────────── const ActionRow = ({ a }) => { const isAlert = a.priority === 'alert'; const isWarn = a.priority === 'warn'; const band = isAlert ? '#D64545' : isWarn ? '#C99A57' : '#C9A98C'; return (
{a.time}
{a.name} {isAlert && 要対応}
{a.step}·担当 {a.staff}
{a.note}
); }; // ── Heatmap ─────────────────────────────────────────────────── const hmScale = (n) => { if (n === 0) return '#F6E9E4'; if (n <= 2) return '#F5DDE3'; if (n <= 4) return '#EBC0CB'; if (n <= 6) return '#D89AAA'; return '#B5728C'; }; const dayLabel = (i) => { const d = new Date(2026, 4, 14); d.setDate(d.getDate() - (29 - i)); return `${d.getMonth()+1}/${d.getDate()}`; }; // ── Today's schedule strip (added per Salonboard convention) ── const ScheduleStrip = () => { const hours = [9,10,11,12,13,14,15,16,17,18,19,20]; const blocks = [ { staff:'デモ副社長', start:9.5, span:1, label:'TEL 田中', tone:'alert' }, { staff:'デモ副社長', start:13, span:1.5, label:'説明会 伊藤', tone:'gold' }, { staff:'デモ副社長', start:14.5, span:1, label:'説明会 加藤', tone:'gold' }, { staff:'デモ副社長', start:16, span:1, label:'見学会 渡辺', tone:'info' }, { staff:'デモ申込担当', start:10.5, span:0.5, label:'TEL 佐藤', tone:'alert' }, { staff:'デモ申込担当', start:11, span:0.5, label:'TEL 池田', tone:'alert' }, { staff:'デモ申込担当', start:15, span:1, label:'申込書 吉田', tone:'gold' }, { staff:'デモ申込担当', start:17, span:1.5, label:'入金消込', tone:'info' }, { staff:'デモ経理',start:10, span:2, label:'入金照合', tone:'info' }, { staff:'デモ経理',start:14, span:2, label:'経理週次', tone:'info' }, { staff:'デモ校長', start:9, span:1, label:'朝会', tone:'info' }, { staff:'デモ校長', start:17.5, span:1, label:'松本 確認', tone:'warn' }, ]; const staffs = ['デモ副社長','デモ申込担当','デモ経理','デモ校長']; const toneBg = { gold:'#EEDFCB', alert:'#FBEEEE', warn:'#FAF1E2', info:'#ECEFF5' }; const toneTx = { gold:'#7A5326', alert:'#A12626', warn:'#7A5326', info:'#4F5A77' }; const toneBd = { gold:'#C9A98C', alert:'#D64545', warn:'#C99A57', info:'#7A88A8' }; const pxPerHour = 60; // tight grid const offset = 9; return (

今日のスケジュール

5月14日(木)
リアルタイム同期
{staffs.map(s => (
{s}
))}
{hours.map(h => (
{h}:00
))}
{staffs.map((s, si) => (
{hours.map((h, hi) => (
))} {blocks.filter(b => b.staff === s).map((b, i) => (
{b.label}
))}
))}
); }; return (
{/* Header */}
2026年5月14日(木)9:00 現在

こんにちは、デモ校長 さん。

今日対応すべきアクションは 12 件、うち 3 件が要対応 です。

{/* Hero */}
{heroBlock}
{/* Main grid */}
{/* Today's actions */}

今日やること

フロー順 · 時刻順
{TODAYS_ACTIONS.map((a,i) => )}
{/* Right column: payments + LINE feed */}

直近の入金消込

過去2日
{RECENT_PAYMENTS.map((p,i) => (
{p.date}
{p.name}
{p.course} · {p.method}
¥{p.amount.toLocaleString()}
))}
今月累計 ¥4,560,000 +12%

未読 LINE

7 件
{[ { name:'佐藤 ハナ', msg:'お振込ですが、本日中に…', time:'5分前', school:'umeda' }, { name:'加藤 ノア', msg:'明日の説明会、神戸校で…', time:'18分前', school:'kobe' }, { name:'伊藤 リン', msg:'説明会の日程ですが、土曜…', time:'42分前', school:'shinsai' }, ].map((m,i) => (
{m.name}
{m.msg}
{m.time}
))}
{/* Heatmap */}

校舎別アクションヒートマップ

過去30日
{['#F6E9E4','#F5DDE3','#EBC0CB','#D89AAA','#B5728C'].map((c,i)=>( ))}
{Array.from({length:30}).map((_,i) => (
{i % 3 === 0 ? dayLabel(i) : ''}
))} {SCHOOLS.filter(s => s.id !== 'all' && s.id !== 'kenshu').map(sc => (
{sc.short}
{HEATMAP[sc.id].map((n, i) => (
))} ))}
梅田福島 が最もアクティブ · 水・金 がピーク · 研修校は空白(記録待ち)
); } window.Dashboard = Dashboard;