/* global React */
const { useState, useEffect, useRef } = React;
// ── 404 TABLE 標誌(簡化版)─────────────
const Mark = ({ size = 32, color = 'currentColor' }) => (
);
// ── Top bar ─────────────────────────────
const TopBar = () => (
);
// ── Hero ────────────────────────────────
const Hero = () => (
JOBSLAB / 職能實驗室 / EST. 2026
500元課程陣列 — 秘書/行政 — 第 01 季
2026 春季班 / 招生中
2 小時會議記錄,
現在 10 分鐘搞定。
老闆又錄了 5 分鐘語音。
客戶又發了 80 字沒標點的 LINE。
合約又是 100 頁、10 分鐘後要結論。
—— 你是秘書,不是讀心術師。
);
// ── Marquee ─────────────────────────────
const Marquee = () => {
const items = [
'老闆錄音祕笈', '會議 10 分鐘交件', '名片秒掃歸檔術', '100 張 15 分鐘',
'老闆 LINE 翻譯機', '雙語接待一小時套裝', '合約地雷掃描術', '5 分鐘看完 100 頁',
'月底對帳信量產術', '80 封 10 分鐘', '老闆記憶還原術', '差勤對帳魔法',
'報價單百變工廠', '300 人請柬不出錯', '跨時區會議終結 10 輪信',
];
const row = items.map((x, i) => (
{x}●
));
return (
);
};
// ── Pain stories ────────────────────────
const PainStories = () => {
const stories = [
{ tag: 'SCENE 01 / 14:32', t: '「會議紀錄今天下班前要。」', q: '老闆一邊講一邊走出會議室。你還在打第二點,他已經到第七點了。', ts: 'TUE 14:32:08' },
{ tag: 'SCENE 02 / 09:15', t: '「那個女客戶的電話呢?」', q: '科技業、姓陳、去年 Q3 — 然後就沒了。你抽屜翻遍,名片找不到。', ts: 'WED 09:15:44' },
{ tag: 'SCENE 03 / 23:48', t: '「明天要看合約有沒有雷。」', q: '110 頁 PDF 在你信箱躺著,老闆 10 點開會。你已經到家。', ts: 'SUN 23:48:21' },
];
return (
{stories.map((s, i) => (
))}
);
};
// ── Courses ─────────────────────────────
const Courses = () => {
const [open, setOpen] = useState(0); // first open by default
return (
0320 堂課陣列
每一堂解一個那一幕。
離開教室 — 成果沒帶回家。
{window.COURSES.map((c, i) => (
setOpen(open === i ? -1 : i)}
>
/{c.n}
{c.title}
{c.pain}
{c.timer}搞定
+
))}
);
};
// ── Pricing ─────────────────────────────
const Pricing = () => {
const tiers = [
{ tier: 'TIER 01 / 試水溫', name: '單堂體驗', price: '500', unit: 'NTD / 堂', dark: false,
pitch: '挑一個你最痛的「那一幕」,2–3 小時當場做完,離開教室就能用。',
bullets: ['任選 1 堂,2–3 小時實作', '不帶作業回家', '附 3 套提示詞模板', '同系列累積購買享折抵'],
cta: '挑一堂報名' },
{ tier: 'TIER 02 / 進階', name: '工作流升級', price: '3,000', unit: 'NTD / 套', dark: true, badge: 'MOST POPULAR',
pitch: '從單點解法升級成系統化工作流。合約全流程 × 老闆決策摘要 × 客戶關係自動化。',
bullets: ['深度進階 4 堂 / 套', '可組合式 SOP 模板', '1 對 1 微調諮詢 30 分鐘', '套票折抵 500 元任選課'],
cta: '進階套組 →' },
{ tier: 'TIER 03 / 企業', name: '企業內訓 / 顧問', price: '30,000+', unit: 'NTD / 起', dark: false,
pitch: '為單一公司客製化 — 從祕書流程到老闆決策層,全公司「AI 化」一次到位。',
bullets: ['企業內訓 1 日 8 小時', '客製化教材 + 公司專屬提示詞庫', '90 天落地陪跑', '高階主管 1 對 1 諮詢'],
cta: '聯繫顧問 →' },
];
return (
{tiers.map((t, i) => (
{t.badge &&
{t.badge}
}
{t.tier}
{t.name}
{t.pitch}
{t.price}{t.unit}
{t.bullets.map((b, j) => - {b}
)}
{t.cta}→
))}
);
};
// ── Industries ──────────────────────────
const IndustriesSection = () => (
0530 個產業 / 30 種老闆
你的產業,
有你產業的地獄。
30 產業 × 3 價位 = 90 個專屬入口。看完整 90 格 →
);
// ── Metrics ─────────────────────────────
const Metrics = () => (
120×
效率提升
2 小時的會議紀錄,10 分鐘交件 — 學員實測中位數。
96%
回購率
第一堂上完的學員中,96% 一個月內報第二堂。
3套
提示詞模板
每堂課帶走 3 套個人化提示詞,下班就能用。
0頁
作業
離開教室時成果已經做出來,絕不帶作業回家。
);
// ── Proof ───────────────────────────────
const Proof = () => (
"
上完《老闆錄音祕笈》那天回辦公室,老闆 5 點半丟給我 90 分鐘的會議錄音。
—— 我 6 點 12 分把三版交件甩在他桌上,準時下班。
▍ 林小姐 / 製造業總經理特助 / 年資 8 年
「下班前交件」
從口號變日常。
JobsLab 的設計原則只有一條:離開教室時,今天的工作已經交了。不是 demo,是你今天回去就能用、能交、能準時下班的工作流。
);
// ── Instructor ──────────────────────────
const Instructor = () => (
陳知行
JOBSLAB 創辦人 / 前 上市公司董事長特助
12 年董事長特助資歷。看過 5 個老闆、3 種產業、無數次「現在馬上要」的崩潰瞬間。設計這 20 堂課,是把自己 12 年踩過的坑,變成 2 小時就能走完的捷徑。
);
// ── FAQ ─────────────────────────────────
const FAQ = () => {
const faqs = [
{ q: '我完全不會寫程式、不會用 AI,跟得上嗎?', a: 'JobsLab 課程全部以「滑手機等級」為設計基準。沒有程式、沒有指令列、沒有 API。你會的,就是手機錄音、複製貼上、按一個按鈕。我們對自己的要求是:教室裡最不熟科技的那一位,也要在課程結束時當場交出成果。' },
{ q: '課程是線上還是實體?', a: '主推實體面授(台北 / 台中 / 高雄),人數上限 12 人,講師現場逐一檢查每位學員的成果。線上同步直播班另開,但作業檢核機制不同 — 報名前我們會跟你確認。' },
{ q: '為什麼 500 元這麼便宜?是不是有後續推銷?', a: '500 元是「試水溫」階。我們的邏輯是:你上得爽就會自己回來,所以第一堂便宜得跟一杯精品咖啡一樣。不會在課堂上推銷,但你會收到下一堂的訊息 —— 因為那時候你已經想再上了。' },
{ q: '我用的不是 ChatGPT,是 Claude / Gemini / 其他,可以嗎?', a: '可以。所有提示詞模板我們提供「跨平台版本」,並現場示範同一份提示詞在三大平台上的差異。你帶哪個來,我們調哪個。' },
{ q: '20 堂課我是不是要全部上?', a: '完全不必。20 堂是 20 種痛點的對應方案,挑你最痛的 1–3 堂就有感了。重度學員的中位數是 5–6 堂。' },
{ q: '我們公司可以包班嗎?', a: '可以,這就是 Tier 03 企業內訓的定位。最低 8 人成班,會依照貴公司流程客製教材,並提供 90 天落地陪跑。請從 #signup 表單勾選「企業內訓」。' },
];
const [open, setOpen] = useState(0);
return (
{faqs.map((f, i) => (
setOpen(open === i ? -1 : i)}>
Q.{String(i + 1).padStart(2, '0')} — {f.q}
+
{f.a}
))}
);
};
// ── Signup ──────────────────────────────
const Signup = () => {
const [submitted, setSubmitted] = useState(false);
return (
停止原地加班。
從一堂 500 開始。
填一份 30 秒表單,我們會在 24 小時內把對應你產業的課表寄給你。沒有電話騷擾,只有對應你「那一幕」的解法。
{submitted ? (
✓ 已收到
24 小時內,你的信箱會出現一封不囉唆的信。
) : (
)}
);
};
// ── Footer ──────────────────────────────
const Foot = () => (
);
// ── App ─────────────────────────────────
const App = () => (
<>
>
);
Object.assign(window, {
App, Mark, TopBar, Hero, Marquee, PainStories, Courses,
Pricing, IndustriesSection, Metrics, Proof, Instructor, FAQ, Signup, Foot,
});