diff --git a/docs/gem-forge-plan.html b/docs/gem-forge-plan.html
new file mode 100644
index 0000000..508a1e3
--- /dev/null
+++ b/docs/gem-forge-plan.html
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+
在 Aurayale 主站之外新增一個獨立活動頁:使用者與 AI 對話,描述心中想像的寶石,AI 將對話轉化為一顆結構化的專屬寶石並產出「寶石卡」。同一套體驗同時服務黑客松評審 demo 與 Game Night 現場玩家 — 一魚雙吃。
+
+
01目標與定位
+
核心體驗是「用對話把想像鍛造成一顆寶石」。頁面完全獨立於主站帳號體系:不需登入、不上鏈、結果不存後端,將進場摩擦降到最低,換取 demo 流暢度與現場轉化率。
+
+
+
黑客松
+
評審視角:創新敘事
+
賣點是「AI 生成式遊戲資產」的完整故事:
+
+ - 對話式生成流程本身就是 demo 素材
+ - 結構化屬性輸出,展示可控的生成管線
+ - 敘事上保留「未來接上 ERC-1155 鑄造」的路徑,說明為何此階段刻意不上鏈
+
+
+
+
Game Night
+
玩家視角:快、好玩、能帶走
+
+ - 掃 QR code 即玩,零登入、零排隊摩擦
+ - 幾輪對話內就能拿到成品,適合現場節奏
+ - 寶石卡可截圖分享,成為社群傳播素材
+ - 收藏存在裝置上(localStorage),離場後仍可回味
+
+
+
+
+
02核心體驗流程
+
+ -
+ 入場
+
簡短的世界觀引言(Aurayale 宇宙 × 鍛造寶石的儀式感),一顆 CTA 進入鍛造流程。
+
+ -
+ AI 對話引導
+
AI 以鍛造師的角色提問,引導使用者描述寶石的元素、個性與故事(約 3–5 輪對話)。
+
+ -
+ 屬性結晶
+
對話結果轉化為結構化寶石屬性:名稱、元素、稀有度、數值、風格描述(JSON schema 固定)。
+
+ -
+ 寶石卡產出
+
前端依屬性渲染一張寶石卡。視覺產出方式暫定留空(先以屬性驅動的占位視覺呈現,後續再決定 AI 生圖或規則式美術)。
+
+ -
+ 結果與分享
+
成品頁提供:加入「我的收藏」(localStorage)、重新鍛造、分享(截圖導向的卡面設計)。
+
+
+
+
03頁面架構
+
+
+
+ | 路由 / 區塊 | 內容 |
+
+
+
+ /events/gem-forge |
+ 活動主頁。單頁式體驗,依狀態切換:入場 → 對話 → 鍛造動畫 → 成品。行動裝置優先(Game Night 現場以手機為主),桌機同樣可用(黑客松 demo)。 |
+
+
+ | 入場區 |
+ 活動標題、世界觀引言、開始鍛造 CTA、我的收藏入口。 |
+
+
+ | 對話區 |
+ 聊天介面:AI 鍛造師訊息、使用者輸入、進度提示(第幾輪/還差什麼素材)。 |
+
+
+ | 成品區 |
+ 寶石卡(名稱、元素、稀有度、數值、故事文案)、收藏/重鍛/分享操作。 |
+
+
+ | 我的收藏 |
+ 本機收藏的寶石列表(localStorage),可重看每顆寶石的卡面。 |
+
+
+
+
+
+
04技術規格
+
+
+
+ | 面向 | 決策 |
+
+
+
+ | 框架 |
+ 沿用現有 Next.js 15(Pages Router)+ React 19 + Tailwind CSS v4,新增獨立頁面,不掛入主站 Provider 需求(不使用 Privy / UserContext / AuraServer JWT)。 |
+
+
+ | 對話引擎 |
+ 定義可抽換的 ForgeEngine 介面(輸入對話歷史 → 輸出下一句提問或最終寶石 JSON)。第一版以規則式引導對話實作(依序詢問元素/個性/故事並映射屬性),介面預留之後接 LLM API 的空間。 |
+
+
+ | 寶石資料 |
+ 固定 schema:{ name, element, rarity, stats, story, styleHints }。styleHints 為視覺產出保留欄位。 |
+
+
+ | 視覺產出 |
+ 暫定留空。先以屬性驅動的占位卡面(色彩/形狀由 element 與 rarity 決定)呈現,元件介面獨立成 GemVisual,之後可整顆替換。 |
+
+
+ | 儲存 |
+ 純前端:收藏與進行中對話存 localStorage,不新增任何後端 API。 |
+
+
+ | 帳號 |
+ 匿名體驗,無登入。 |
+
+
+
+
+
+
05範圍界定
+
+
+
✓ 本期範圍
+
+ - 活動頁完整體驗(入場 → 對話 → 成品 → 收藏)
+ - 規則式對話引擎(介面預留 LLM 接點)
+ - 屬性驅動的占位寶石卡
+ - localStorage 收藏
+ - 行動裝置優先的響應式版面
+
+
+
+
✗ 明確不做(本期)
+
+ - ERC-1155 上鏈鑄造
+ - 後端儲存生成結果
+ - Privy 登入 / 主站帳號整合
+ - 視覺產出的最終方案(AI 生圖 vs. 規則式美術)
+ - 與 Unity 遊戲本體的橋接
+
+
+
+
+ 未定項:寶石卡的視覺產出方式(AI 圖像生成或規則式美術拼接)與是否接真實 LLM 對話,皆已在架構上預留抽換點(GemVisual 元件、ForgeEngine 介面),待後續討論定案後替換,不影響本期交付。
+
+
+
06里程碑
+
+
+
+ | 階段 | 內容 |
+
+
+ | M1 骨架 | 頁面路由、狀態機(入場/對話/成品)、寶石 schema 與規則式對話引擎。 |
+ | M2 體驗 | 對話 UI、鍛造轉場、占位寶石卡、收藏功能。 |
+ | M3 打磨 | 行動裝置調校、分享導向的卡面設計、黑客松 demo 腳本演練。 |
+ | 賽後 | 視需求接 LLM、決定視覺方案、評估上鏈與帳號整合(Game Night 加值)。 |
+
+
+
+
+
+
+
+
diff --git a/src/components/gemforge/GemCard.tsx b/src/components/gemforge/GemCard.tsx
new file mode 100644
index 0000000..4a26f4f
--- /dev/null
+++ b/src/components/gemforge/GemCard.tsx
@@ -0,0 +1,101 @@
+import { ELEMENT_META, RARITY_META, type ForgedGem, type GemStats } from "@/lib/gemForge";
+import { GemVisual } from "./GemVisual";
+
+const STAT_LABELS: { key: keyof GemStats; label: string }[] = [
+ { key: "power", label: "力量" },
+ { key: "guard", label: "守護" },
+ { key: "spirit", label: "靈性" },
+];
+
+const STAT_MAX = 12; // 能量條滿格基準(legendary 單項理論上限附近)
+
+/**
+ * 寶石卡卡面 — 3:4 直式、截圖導向設計(Game Night 分享用)。
+ * 只吃 ForgedGem,不碰任何 context / 儲存,方便在成品頁與收藏頁重用。
+ */
+export function GemCard({ gem }: { gem: ForgedGem }) {
+ const element = ELEMENT_META[gem.element];
+ const rarity = RARITY_META[gem.rarity];
+
+ return (
+
+ {/* 頂部:稀有度 + 元素 */}
+
+
+ {rarity.label}
+
+
+ {element.label}
+
+
+
+ {/* 寶石本體 */}
+
+
+
+
+ {/* 名稱 */}
+
+
+ {gem.name}
+
+
{element.blurb}
+
+
+ {/* 數值 */}
+
+ {STAT_LABELS.map(({ key, label }) => (
+
+
+ {label}
+
+
+
+ {gem.stats[key]}
+
+
+ ))}
+
+
+ {/* 故事 */}
+
+ {gem.story}
+
+
+ {/* 卡腳 */}
+
+
+ Aurayale · 寶石鍛造所
+
+
+ No.{gem.id.slice(-4).toUpperCase()}
+
+
+
+ );
+}
diff --git a/src/components/gemforge/GemVisual.tsx b/src/components/gemforge/GemVisual.tsx
new file mode 100644
index 0000000..99e1012
--- /dev/null
+++ b/src/components/gemforge/GemVisual.tsx
@@ -0,0 +1,62 @@
+import { ELEMENT_META, RARITY_META, type ForgedGem } from "@/lib/gemForge";
+
+/**
+ * 寶石占位視覺(企劃 04:視覺產出方式暫定留空)。
+ *
+ * 這個元件是「視覺產出」的抽換點:目前以屬性驅動的 SVG 切面寶石呈現
+ * (元素決定色相、稀有度決定光暈與碎鑽數量),之後不論改接 AI 生圖
+ * 或規則式美術,只要替換這個元件的內部實作即可,props 介面不變。
+ */
+export function GemVisual({ gem, size = 180 }: { gem: ForgedGem; size?: number }) {
+ const { color } = ELEMENT_META[gem.element];
+ const rarityColor = RARITY_META[gem.rarity].color;
+ const sparkles = { common: 0, rare: 2, epic: 4, legendary: 6 }[gem.rarity];
+
+ // 依稀有度加強光暈
+ const glow = {
+ common: `drop-shadow(0 0 10px ${color}66)`,
+ rare: `drop-shadow(0 0 16px ${color}88)`,
+ epic: `drop-shadow(0 0 22px ${color}aa)`,
+ legendary: `drop-shadow(0 0 30px ${color}cc)`,
+ }[gem.rarity];
+
+ const sparklePositions = [
+ { x: 38, y: 42, r: 2.4 },
+ { x: 164, y: 58, r: 1.8 },
+ { x: 150, y: 148, r: 2.2 },
+ { x: 46, y: 140, r: 1.6 },
+ { x: 100, y: 24, r: 2.6 },
+ { x: 172, y: 108, r: 1.5 },
+ ];
+
+ return (
+