ARENAMATE · 設計交付規格 · 2026-07-23

教練系統 畫面規格書

給 Claude Design 的完整開工文件。目標:把 全畫面互動 Prototype 的體驗做進 ArenaMate 正式 App(Flutter,Apps/arena_mate)。每個畫面都寫明:放哪個檔、class 叫什麼、從哪進、用哪些互動元件、醒目度怎麼配、表單每一格的控件與預設值。

Claude Design 開工前必讀: ① 互動參照=prototype(行為對照用,視覺不要照抄它的簡化風) ② 架構背景=三方架構報告 ③ 設計語言正本=lib/design/tokens.dart(AC 色票)/typography.dart(AText)/widgets.dart(ArButton/ArChip)— 只用現有 token,不自創色票 ④ 鐵則:套設計只換視覺不動佈局邏輯;動到 lib/data/ 先讀 docs/Arena_流程邏輯圖.md §9;新畫面一律掛 flag;UI 不用 emoji(用 Material icon)。

目錄

全域規範
1.1 設計 token 與元件庫
1.2 老闆偏好互動元件目錄
1.3 醒目度四級制(反單調系統)
1.4 表單鐵則(預設值+選擇器優先)
1.5 命名/檔案/flag 規範
1.6 工程陷阱(踩過的坑)

畫面規格
2. 畫面總表(28 畫面)
3. 學員端 S1–S7
4. 教練端 C1–C8
5. 場館端 G1–G8
6. 平台端 P1–P5

1.1 設計 token 與元件庫(現有,直接用)

資源位置內容
色票 AClib/design/tokens.dartbg/surface/fill/line/line2/text/sub/dim + green/gold/blue/coral。角色色慣例:教練=gold、場館=green、學員=blue、平台=紫(如缺就近用 blue,勿自創)
字體 ATextlib/design/typography.dartAText.body(size,weight,color,height) 內文;AText.display 數字/金額(自帶 tabular)。金額一律 display
元件lib/design/widgets.dartArButton(label,solid,onTap,disabled)ArChip(label,color)
頭像lib/redesign/ui/a_avatar.dartAAvatar — 人一律用它(含 fallback)
課程封面coach_course_pages.dartcourseCover()共用封面元件(cover_url 斷點回填),課程圖只准用它
貼紙元件lib/redesign/toy/sticker_widgets.dartProto B 已建:StickerWallCard/showStickerPicker/stickerIcon — 直接沿用升級
場館頁專用toy_venue.dartTF/TT場館頁(toy_venue)自成一套 token,在該檔內改動照用 TF/TT,不要混 AC

1.2 老闆偏好互動元件目錄(用這些,別發明新的)

元件現有實作(參照)什麼時候用
翻面卡 FlipCard(rotateY,正面精華/背面詳情)toy_venue.dart _FlipCoachCardgym_calendar_page.dart _CalendarEventCard老闆 2026-07-13 拍板的招牌互動。任何「一張卡=一個實體」的展示:課程卡、教練卡、月曆活動卡。正面=名稱+價錢+一個狀態章;背面=明細列+單一 CTA
倒數膠囊 Capsuletoday_class_capsule.dart TodayClassCapsule時間敏感的置頂提醒:當日課程、撥款日到了、邀約待回覆。點開=bottom sheet 詳情
chips 選擇器(單選/多選上限)貼紙 picker(sticker_widgets.dart)、月曆篩選 chips一切 2–8 個選項的選擇。多選要有上限(貼紙=3)。選中態=主色底 16% + 主色框 1.6px
stepper(半小時制/整數)批B 時數 stepper(template_studio.dart)數字輸入優先用 stepper:時數(30 分階)、堂數、抽成 %(0–30 階 5)。鍵盤輸入是 fallback 不是預設
月曆格+色點ops_calendar.dartgym_calendar_page.dart(課綠/賽金/揪藍/休灰)一切日期選擇與日程展示。開課精靈選時段=點月曆空閒格,不是 date picker 列表
bottom sheet(圓角 20 頂部把手)全 App 慣例 showModalBottomSheet所有次級流程(確認/表單/picker)。避免 full-page push 除非是可回訪的目的地
拖拉排序模板群組拖拉(template_studio.dart group_order)、排陣頭像拖拉(lineup_board.dart)順序有意義的清單:模板堂次排序、推薦位排序
磁貼格 tiles櫃檯 gym_counter.darthub 型頁面的功能入口(2 欄磁貼),badge 數字掛右上
樂觀更新+轉圈鐵則 memory button-async每顆 async 按鈕:按下立即 spinner/樂觀變化,禁止按了沒反應。批次讀取用 Future.wait 併行
決策卡三選一流課決策卡(coach_course_pages.dart 照開/延期/取消)需要人做選擇的系統事件:公休連鎖、流課。三個大按鈕直排,每顆帶一行後果說明,危險選項紅色放最後

1.3 醒目度四級制(反單調系統)

老闆點名「畫面不要單調,按重要性分級醒目度」。每個畫面的每個元素必須標定 A/B/C/D 一級,規則:

A全場焦點(每畫面 0–1 個) — 色底 banner 或大數字卡:主色 10% 底+45% 框、標題 w800、可帶輕微入場動效。用於:本月摘要 banner、應付總額、當日課倒數、待決策事件。沒有 A 級元素的畫面=單調,不合格(純列表頁用「摘要列+大數字」湊 A)。

B主要行動(每畫面 ≤2 個) — 實心主色按鈕(ArButton solid)或主色框行動卡。一頁最多兩顆實心鈕;第三個以上的行動一律降 C。

C內容卡(不限量) — 標準卡:surface 底+line 框+radius 12–14。資訊列 kv 兩欄:左灰標籤右粗體值。

D輔助說明(每卡 ≤1 行) — hint 小字(10.5–11px dim 色):規則解釋、冪等說明。超過一行就該做成「?」icon 點開 sheet。

反單調三招(每頁至少用一招):①狀態用形狀不只用字 — pill 章/色點/進度環;②數字放大 — 金額/計數用 AText.display 18–24px 配色;③分區帶 icon 的 section 標題,不要連續 4 張以上同構卡。

1.4 表單鐵則(預設值+選擇器優先)

鐵則一:每個欄位都有預設值。預設值優先序:上次填的值 > 模板/合約帶入值 > 參數系統解析值 > 全平台常見值。表單打開的瞬間就是「可直接送出」狀態。

鐵則二:控件選擇順位(能上面就不用下面):

鐵則三:選填欄位要「明顯可跳過」 — 選填一律給「不指定(說明後果)」chip,例:代課教練「不指定 → 缺席時跨館代課池遞補」。

鐵則四:表單超過 5 欄=分步精靈(開課精靈 pattern),每步一個主題,頂部進度點,最後一步=可回改的摘要確認卡。

1.5 命名/檔案/flag 規範

1.6 工程陷阱(這個 codebase 踩過的坑,設計時就要避)

2. 畫面總表(28 畫面)

狀態欄:已有=畫面存在只需視覺/互動升級;改造=existing 檔案加區塊或大改;新建=新檔案新畫面。
#畫面Class檔案入口狀態Flag
S1開課月曆(行銷)GymCalendarPage(marketMode)toy/gym_calendar_page.dart場館頁課程區「開課月曆」/櫃檯改造kGymCalendarMarket
S2課程詳情/報名CourseDetailPagetoy/coach_course_pages.dart月曆卡/列表卡/翻卡/推薦卡改造kCourseTermsCard(新)
S3我的課程+請假MyCoursesPagetoy/coach_course_pages.dart通知/課程列表頁改造kCourseLeaveDm(沿用)
S4成長頁+貼紙MyGrowthPagetoy/coach_course_pages.dartMyCoursesPage已有kStickerReviewsV2
S5課程推薦區塊CourseRecsSectiontoy/course_recs.dart(新)CourseListPage 頂+MyCoursesPage 底新建kCourseRecsV1
S6送貼紙 pickershowStickerPickertoy/sticker_widgets.dartS2/C5 內已有kStickerReviewsV2
S7補課 credit sheetMakeupCreditSheettoy/coach_course_pages.dartS3 請假成功後新建kMakeupCredit
C1教練工作室CoachStudioSectionstoy/coach_studio.dartCoachSettingsPage改造
C2模板編輯(每堂價)TemplateStudiotoy/template_studio.dart工作室②區改造kPerSlotPrice
C3開課精靈CourseOpenFlowPagetoy/coach_studio.dart工作室③/邀約接受改造kCourseSubGuarantee
C4邀約協商收件匣CoachInvitePagetoy/coach_invite_page.dart(新)工作室 badge/通知新建kInviteNegotiation
C5點名+遲到閘門CourseRollCallPagetoy/coach_course_pages.dart課程管理/當日膠囊改造kLateGate
C6記帳本+月結算單CoachLedgerPagetoy/coach_ledger_page.dart(新,自 sheet 升級)CoachSettingsPage新建
C7我的合約與參數CoachContractPagetoy/coach_contract_page.dart(新)CoachSettingsPage新建kPolicyParams
C8貼紙牆(品牌區)StickerWallCardtoy/sticker_widgets.dartCoachSettingsPage/品牌頁 coach.html已有kStickerReviewsV2
G1後台總覽AdminHub/AdminTabadmin/admin_hub.dart後台入口改造
G2課程審核CourseReviewAdmintoy/coach_course_pages.dartAdminTab sub已有
G3管理教練+行為指標CoachAdmintoy/coach_pages.dartAdminTab sub 'coach'改造kStickerReviewsV2
G4邀約教練(協商)GymInviteComposeradmin/gym_invite.dart(新)G3 header「邀約開課」新建kInviteNegotiation
G5招募教練貼文GymRecruitPageadmin/gym_recruit.dart(新)AdminTab 選單「招募教練」新建kRecruitBoard
G6公休連鎖決策ClosureCascadeSheetadmin/ops_calendar.dart營運日曆標暫停後自動彈新建kClosureCascade
G7館帳本+撥款確認GymLedgerAdminadmin/gym_ledger_page.dartAdminTab sub已有
G8開站合約+參數覆蓋GymAgreementPageadmin/gym_agreement.dart(新)AdminTab 選單「平台合約」新建kGymAgreement
P1平台總帳 v2PlatformMoneyConsoleadmin/platform_money.dart個人頁選單(operator)改造kPlatformLedgerV2
P2參數中央管理PolicyParamsConsoleadmin/policy_params.dart(新)P1 header 齒輪新建kPolicyParams
P3風控台RiskConsoleadmin/risk_console.dart(新)P1 header 盾牌新建kRiskConsole
P4推銷決策PromoteConsoleadmin/promote_console.dart(新)P1 header 喇叭新建kPromoteConsole
P5撥款批管理(P1 內區塊)admin/platform_money.dartP1 捲動區已有kPlatformLedgerV2

3. 學員端(角色色=blue)

S1 開課月曆(行銷模式)

檔案 lib/redesign/toy/gym_calendar_page.dart · Class GymCalendarPage(marketMode:true) · 入口=場館頁課程區 header「開課月曆」膠囊+櫃檯 · Flag kGymCalendarMarket · 測試 S40(已綠,此處為視覺升級)

資料:gymCalendarProvider+CalendarMarketGates(已建)。空態:「本月還沒排課」banner 轉灰+CTA「看其他月份」。

S2 課程詳情/報名頁

檔案 lib/redesign/toy/coach_course_pages.dart · Class CourseDetailPage · 入口=所有課程卡 · Flag 新 kCourseTermsCard · 測試 新 scenario S41

表單(報名 sheet):無需填寫任何字 — 付款方式 chips(預設=課包可用則課包,否則綠界)+條款「同意並報名」單鈕。資料:既有 providers+resolveParams(P2 建好後接)。狀態:已報名=主鈕換狀態列(已報名章+付款狀態+取消報名次鈕);截止=主鈕 disabled「報名已截止」。

S3 我的課程+請假

檔案同上 · Class MyCoursesPage · Flag 沿用 kCourseLeaveDm+新 kMakeupCredit · 測試 S42

S7 補課 credit sheet(新):請假成功即彈:「獲得 1 張同課程補課 credit」+可用堂次 chips(同課程未滿的未來堂,預設=最近一堂)+「先留著」次鈕。不做學程券(法遵),credit 僅限同課程。

S4 成長頁+貼紙 / S6 送貼紙 picker

Class MyGrowthPage/showStickerPicker(已有) · Flag kStickerReviewsV2

S5 課程推薦區塊(新)

檔案 lib/redesign/toy/course_recs.dart(新) · Class CourseRecsSection · 掛載=CourseListPage 頂部+MyCoursesPage 底部 · Flag kCourseRecsV1 · 測試 S43(Gate=RecsGates 純函數:同教練>同館>同類型>程度階梯,各附「因為…」理由字串)

空態:整個 section 隱藏(不出現「沒有推薦」)。

4. 教練端(角色色=gold)

C1 教練工作室(hub 改造)

檔案 lib/redesign/toy/coach_studio.dart · Class CoachStudioSections · 入口=CoachSettingsPage

C2 模板編輯器(每堂不同價)

檔案 lib/redesign/toy/template_studio.dart · Class TemplateStudio · Flag kPerSlotPrice · 測試 S44 ⚠️ 依賴 DB:coach_course_slots.price+模板 sessions jsonb 加 price(migration 先行,分帳/退款/pass 三處連動=批δ 工程)
欄位控件預設值
每堂價格逐堂列右側 stepper(50 元階)+點數字可鍵盤上一堂的價(第一堂=模板 price_per_session)
快速工具列表頂 chips:「全部同價」「後段加價 +100」「首堂體驗價」
堂次順序拖拉把手(既有 group 拖拉 pattern)

C3 開課精靈(加代課步+截止覆蓋)

檔案 lib/redesign/toy/coach_studio.dart · Class CourseOpenFlowPage · Flag kCourseSubGuarantee · 測試 S45

維持既有三步骨架,第 2/3 步之間插「保障與規則」步。全精靈零必填打字:

欄位控件預設值
1 模板選模板模板卡橫捲(封面+堂數+總價)最近使用的模板
2 場地包場/場邊segmented 兩格,各帶費用試算行上次選擇
2 場地時段月曆點空閒格(既有)—(必點)
3 保障代課教練(選填)picker sheet:同運動教練列(AAvatar+駐館+接單狀態),第一 chip=「不指定 → 跨館池遞補」上次指定的代課;首次=不指定
3 保障報名截止chips:24h(平台預設)/48h/72h/自訂 stepper參數解析值(標來源層小章)
4 送審摘要確認摘要卡(可點回改)+單顆送審鈕

C4 邀約協商收件匣(新)

檔案 lib/redesign/toy/coach_invite_page.dart(新) · Class CoachInvitePage · 入口=C1 邀約膠囊+通知 kind coach_schedule_invite 落點 · Flag kInviteNegotiation · 測試 S46 ⚠️ 依賴 DB:新表 arena_coach_invites(gym/coach/slot_text/template_hint/note/status)

C5 點名頁+遲到閘門

檔案 lib/redesign/toy/coach_course_pages.dart · Class CourseRollCallPage · Flag kLateGate · 測試 S47 ⚠️ 依賴:遲到自動判缺席 server RPC(現只有 UI 顯示遲到分鐘)

C6 記帳本+月結算單(sheet 升級成頁)

檔案 lib/redesign/toy/coach_ledger_page.dart(新) · Class CoachLedgerPage · 入口=CoachSettingsPage 列+C1 小卡 · 測試 S48

C7 我的合約與參數(新)

檔案 lib/redesign/toy/coach_contract_page.dart(新) · Class CoachContractPage · 入口=CoachSettingsPage 列 · Flag kPolicyParams · 測試 S49(與 P2 同批)

5. 場館端(角色色=green)

G1 後台總覽(hub 改造)

檔案 lib/redesign/admin/admin_hub.dart+admin_tab.dart · 入口=後台

G2 課程審核(視覺升級)

檔案 toy/coach_course_pages.dart · Class CourseReviewAdmin(既有,批A 已重排)

G3 管理教練+行為指標

檔案 toy/coach_pages.dart · Class CoachAdmin(Proto B 指標卡已在,此處升級) · Flag kStickerReviewsV2

G4 邀約教練(協商 composer,新)

檔案 lib/redesign/admin/gym_invite.dart(新) · Class GymInviteComposer(bottom sheet 即可,不必整頁) · 入口=G3 header · Flag kInviteNegotiation · 測試 S46(與 C4 同批)
欄位控件預設值
邀請對象picker sheet:本館教練優先+跨館代課池教練(AAvatar+專長+星章)本館開課數最多的教練
建議時段營運月曆點空閒格(重用 ops calendar 資料)+重複 chips(單次/每週同時段×N)下週同天最早空檔
建議模板chips:該教練現有模板列+「由教練決定」由教練決定
條件備註文字框(唯一自由文字,選填)「場地費照合約」

G5 招募教練貼文(新)

檔案 lib/redesign/admin/gym_recruit.dart(新) · Class GymRecruitPage · 入口=AdminTab 選單 · Flag kRecruitBoard · 測試 S50 ⚠️ 依賴 DB:arena_gym_recruit_posts+applies;應徵接受後復用既有 coach_apply 核准流,不另起爐灶
欄位控件預設值
職缺標題文字框「徵{館主運動}教練」自動組字
我提供的場地chips 多選(從 gym_venues 自動生成:場地名+規格)+補充文字選填全選
時段需求chips:平日晚/週末/早鳥/皆可平日晚
教練條件chips 多選:證照等級(C/B/A)+可帶程度(初/中/高)C 級+初中階
分成條件stepper 抽成 %(0–30)+場地費顯示(唯讀,從場地設定帶)本館現行預設

G6 公休連鎖決策 sheet(新)

檔案 lib/redesign/admin/ops_calendar.dart 內 · Class ClosureCascadeSheet · 觸發=營運日曆標暫停日送出後自動彈出(有受影響課堂時) · Flag kClosureCascade · 測試 S51 ⚠️ 依賴:cascade orchestrator(改期/代課/退款批次副作用)

零受影響時:不彈 sheet,只 toast「公休已標記,無課堂受影響」。

G7 館帳本+撥款確認(視覺升級)

檔案 lib/redesign/admin/gym_ledger_page.dart · Class GymLedgerAdmin(既有)

G8 開站合約+參數覆蓋(新)

檔案 lib/redesign/admin/gym_agreement.dart(新) · Class GymAgreementPage · 入口=AdminTab 選單「平台合約」 · Flag kGymAgreement · 測試 S52 ⚠️ 依賴 DB:arena_gym_agreements(版本化,複製教練合約 pattern)

6. 平台端(角色色=violet;operator 專屬,寬版 console 佈局)

P1 平台總帳 v2(Proto A 升級)+P5 撥款批

檔案 lib/redesign/admin/platform_money.dart · Class PlatformMoneyConsole(既有+Proto A 三卡) · Flag kPlatformLedgerV2 · header 加三 icon:齒輪→P2/盾牌→P3/喇叭→P4

P2 參數中央管理(新,批α 核心畫面)

檔案 lib/redesign/admin/policy_params.dart(新) · Class PolicyParamsConsole · 入口=P1 齒輪 · Flag kPolicyParams · 測試 S49 ⚠️ 依賴 DB:arena_policy_params 三層表+PolicyGates.resolve+報名快照欄位(批α 工程,本畫面是它的操作台)
欄位(平台預設層)控件預設值(=現行拍板)
學員請假時限stepper(小時,1 階)4
報名截止stepper(小時)24
流課決策窗stepper(小時)24
遲到判缺席stepper(分,5 階)15
月結日chips:1/5/10/15/20/2515
缺席停權門檻stepper(次)2
佔位釋出stepper(工作天)3
退款三段三格 stepper(天/小時/%)7d/72h/50%

P3 風控台(新)

檔案 lib/redesign/admin/risk_console.dart(新) · Class RiskConsole · 入口=P1 盾牌 · Flag kRiskConsole · 測試 S53 ⚠️ 課包轉讓 Gate(轉讓後不可退/限轉 1)要進 pass 引擎 server 端,本畫面=開關+事件流

P4 推銷決策(新)

檔案 lib/redesign/admin/promote_console.dart(新) · Class PromoteConsole · 入口=P1 喇叭 · Flag kPromoteConsole · 測試 S54

7. 交付順序與驗收

建議施工順序(依賴關係):

每畫面驗收三關(全過才算完):①flag 開/關各跑 flutter test 全綠+對應 scenario 進測試地圖;②醒目度檢查:有 A 級元素、solid 鈕 ≤2、每表單欄位有預設值且無多餘打字;③dogfood:實機點得到→真讀寫→跟 prototype 行為一致。

參照鏈:行為有疑義 → prototype 為準;規則有疑義 → 架構報告+docs/Arena_流程邏輯圖.md §9;拍板數字 → 報告第 4 章參數表。