AI GOAL GRID COURSE — 第 02 章
3×3 填寫頁 + 「null = 留給 AI」的約定 + localStorage 即時保存。
第一課不是怎麼畫九宮格
畫面是畫面,資料是資料。
.grid3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.cell {
border: 1px solid #2c3a52;
border-radius: 12px;
background: rgba(8, 12, 20, 0.62);
}
.cell-core { border-color: #c9a44e; } /* 中央格用金色強調 */
repeat(3, 1fr) = 三欄、每欄等寬。3×3 天生窄螢幕友善,手機上不用寫任何 media query;HTML 端只需要一個空容器 <div id="grid3">。
const STATE_KEY = 'goal-grid-state-v1';
function defaultState() {
return {
version: 1,
// 長度 9 的陣列,index 4 = 中央核心目標
// 每格:null(留給 AI)或 {text, source:'user'|'ai'}
cells: Array(9).fill(null),
updatedAt: new Date().toISOString(),
};
}
兩個設計眼:version:1 讓未來改格式時認得出舊資料;九格由左到右、由上到下編號 0–8,正中央剛好是 4。
function loadState() {
try {
const raw = JSON.parse(localStorage.getItem(STATE_KEY));
if (raw && raw.version === 1 && Array.isArray(raw.cells)) return raw;
} catch { /* 資料壞了就當沒存過 */ }
return defaultState();
}
function setCell(state, idx, text, source = 'user') {
const t = String(text ?? '').trim();
state.cells[idx] = t ? { text: t, source } : null; // 清空 = 還給 AI
state.updatedAt = new Date().toISOString();
saveState(state);
}
trim 後是空字串就寫回 null —「把字刪光」等於「這格還給 AI」。所有寫入走同一個函式,存檔就不會漏。
for (let i = 0; i < 9; i++) {
const cell = document.createElement('div');
cell.className = i === 4 ? 'cell cell-core' : 'cell';
const ta = document.createElement('textarea');
ta.dataset.idx = String(i); // 畫面第 i 格 ←→ state.cells[i]
ta.placeholder = i === 4 ? '我的核心目標' : '留給 AI';
ta.value = state.cells[i] ? state.cells[i].text : '';
ta.addEventListener('input', () => {
setCell(state, Number(ta.dataset.idx), ta.value); // 即打即存
});
cell.appendChild(ta); grid.appendChild(cell);
}
別用 DOM 順序猜對應 — 版面一改就全錯位;dataset.idx 不動如山。placeholder「留給 AI」:空格是合法狀態,UI 文案跟資料模型講同一種語言。
做一個單檔 HTML 的「目標九宮格」填寫頁(CSS/JS 內嵌):
【版面】3×3 CSS Grid(repeat(3,1fr)、gap 10px);每格一個 textarea;
中央格「核心目標」金色強調,其餘八格是子目標
【資料模型】長度 9 的陣列 cells,index 4 = 核心目標;null = 留給 AI,
有字存 {text, source:'user'}(結構先留好給之後的 AI)
【儲存】輸入即存 localStorage(key 'goal-grid-state-v1',含 version:1);
載入時讀回;解析失敗或版本不對就用全新狀態,不准報錯
【對位】textarea 用 dataset.idx 寫回陣列;清空(trim 後為空)寫回 null
【風格】深夜藍底 #0e1420、金色 #c9a44e,繁體中文,手機優先
【驗收】填三格重整不丟 / 刪光回 placeholder / source 是 "user" / 375px 不破版
完整版在 course/02-grid-ui.md — 整段可直接貼給 ChatGPT / Claude 重現本章成品。
← → 翻頁