"Mobile"
- Mobile 導航模式分類
Push/pop stack / declarative router / tab bar / drawer — 四種 mobile 導航模式各自的適用場景和使用者心理模型
- U.C1 Terminal 畫面五個狀態零個退出路徑
Flutter app 的 Terminal 畫面有 idle/connecting/connected/error/disconnected 五個 enum 狀態,每個狀態都沒有 back 或 disconnect 按鈕 — 使用者一旦進入就出不去
- 輸入機制決策表
Keyboard type / submit model / IME policy / special keys 四個維度的決策框架 — 每個維度都是設計決策,影響 UI layout 和 protocol
- Terminal app 輸入設計
CLI 場景在手機上的特殊需求 — 非自然語言輸入、特殊按鍵需求、整行 vs 逐字元送出對 protocol 的影響
- U.C3 終端機文字輸入機制未設計、事後 hotfix 補 TextField
Flutter 終端機 app 的鍵盤輸入完全未設計 — 沒有 TextField、沒有 keyboard type 選擇、沒有 IME 控制。W2 修復時才補上 TextField + 6 個參數(enableSuggestions/autocorrect/enableIMEPersonalizedLearning/keyboardType/textInputAction/onSubmitted),全是散落 hotfix
- 表單 UX 模式
表單輸入的驗證時機、auto-fill 支援、錯誤回饋設計 — 和 terminal 輸入的決策維度相同但選項不同
- 手機終端 client 選型:連遠端 agent 工作機該用哪個
要從手機連一台遠端 agent 工作機、在 Blink / Termius / 自製通道之間挑一個能撐住 mosh 漫遊與擴充鍵列的終端 client 時回來讀
- Permission 請求時機與措辭
系統權限請求的時機選擇(首次開啟 vs 功能使用時)和說明文字的設計 — 使用者只有一次機會理解為什麼需要這個權限
- 搜尋 UX 模式
Debounce / instant / suggestion 三種搜尋模式的取捨 — 和輸入機制的 submit model 維度直接相關
- U.C5 匯出按鈕按下零回饋 — 狀態機完備但 UI 沒接線
Flutter app 匯出設定頁的確認匯出按鈕 onPressed 是空 callback,按下畫面毫無變化 — 使用者無法分辨匯出成功、進行中、還是功能根本沒做。ViewModel 的 idle/inProgress/completed/failed 狀態機早已完備,缺的只是頁面接線與三層回饋
- 安全敏感輸入框的 IME 控制 checklist
處理密碼、API key、伺服器路徑等 secret 的輸入框需要關閉 IME 的個人化學習和自動校正 — 安全要求而非 UX 偏好
- Touch Target(觸控目標)
實機測試點列表行文字卻無反應、或可用性測試觀察到使用者重複點擊同一行時使用。觸控目標有兩層要求:尺寸不小於平台底線、範圍涵蓋視覺暗示的可點區域——後者在列表行展開/收合場景最常被忽略。
- U.C6 加書後返回不刷新統計 — 只設計了進入時載入
Flutter app 資料管理頁的書籍統計只在 initState 載入一次,從頁面進入新增流程加書後 pop 返回,統計停留在舊值(仍顯示無書目),要回首頁再進入才更新。根因是 happy-path-only 反模式的資料版本:設計了「進入時載入」,沒設計「資料變更時的轉移」
- U.C7 商品條碼的誤導性查無結果 — 可本地判定的錯誤讓使用者白等 API
Flutter app 的 ISBN 掃描器接受所有 EAN-13 條碼,掃到一般商品條碼(非 978/979 開頭)時送 API 查詢,2 秒後回「查無結果」— 訊息誠實但誤導,使用者以為書找不到,實際上是掃錯了條碼。正確回饋是本地立即判定「這不是書籍條碼」
- U.C8 標籤行只有箭頭可點 — 觸控目標小於視覺單元
列表行的展開/收合看起來整行可點、實機測試點文字卻無反應時使用。gesture 只掛在尾端箭頭 icon 上、整行的視覺暗示範圍遠大於實際可點區域,使用者體感等同功能壞掉。
- U.C15 切換按鈕顯示目標模式被讀成當前狀態 — 標籤語意歧義
模式切換按鈕的文字被使用者讀成「現在的狀態」而非「按了會去哪」— 單顆文字按鈕無法自證標籤是現態還是目標,歧義是結構性的,解法是把狀態顯示與切換動作的責任拆開
- U.C16 篩選列截斷被讀成遮蔽 — 水平溢出沒有捲動提示
水平清單超出畫面寬度、使用者回報「被別的元件蓋住」或找不到後面的選項時使用。截斷若無 affordance(漸層、部分露出、箭頭),使用者讀到的是「壞了」不是「可以捲」
- U.C17 選中態換底色不換文字色 — 對比沒有成對設計
選中的 chip / tab / 按鈕文字看不清楚:選中態是「底色 × 文字色」的成對設計,只指定其中一半、另一半走元件庫預設,組合對比從未被驗證
- U.C18 狀態圖示被當成按鈕點 — 非互動指示與動作按鈕同形
使用者回報「某個按鈕點了沒反應」、查程式發現那不是按鈕時使用。非互動的狀態圖示與動作按鈕同列混排且形態近似(描邊 vs 實心),使用者無法區分可點性
- U.C19 「已選擇」計數被版面擠壓成省略號 — 回饋死在 layout
狀態文字顯示成「...」、資料層查起來卻一切正常 — 回饋鏈的最後一哩是版面,flex 寬度競爭把關鍵計數整串壓成省略號,state 正確、使用者拿到零資訊
- U.C20 管理模式操作全是佔位 — dev toast 讓未接線看起來有反應
UI 有按鈕、domain 層功能也寫完、按下去只有開發提示或 log:佔位 handler 比沒有按鈕更糟 — 按鈕的存在承諾功能存在,dev toast 讓開發自測「有反應」、掩蓋未接線
- Terminal CJK Input(終端 CJK 雙寬字與即時輸入)
手機 / 遠端終端能貼中文卻打不出來、或打中文時畫面錯位時回來讀
- Motor 可達性:hit target、間距、誤點防護
Hit target 太小會讓行動裝置使用者誤點、motor 障礙使用者更甚。WCAG AAA 建議 ≥ 44×44px、間距足夠避免誤觸。本文展開 hit target 設計與相關 motor a11y 風險點。
- 每個畫面都需要出口:畫面狀態機設計與 UX 導航的系統性方法
實機測到某畫面沒有返回或退出按鈕、使用者被困住。根因是企劃沒系統列出每個畫面的狀態與可用操作;用畫面狀態矩陣確保每個狀態都有明確出口。
- SQLite Mobile / Desktop Embedded Store
SQLite 在 mobile、desktop、CLI、browser profile 與 embedded device 中承擔 local formal state 的資料責任、backup、privacy 與 sync boundary