我問：

我要做婚禮 RSVP 想要賓客在登記完成時，會領到一隻專屬海洋寵物，體驗如下

1. 送出表單時呼叫 gemini 的圖片生成 API

2. 因為要等待生成圖片，送出時先到 loading 頁，上面寫謝謝您的登記，正在召喚您的幸福海洋神寵，中間有個手繪圈圈在轉動

3. 待圖片生成並下載成功，把使用者導到 Success 頁，這時中間要顯示：

3-1 已召喚你的幸福海洋神寵，名字叫：XX海馬（其中前面兩個字是愛情、婚禮相關的，給我 20 個形容詞。後面的生物要是海洋生物，給我 20 個海洋生物名字。）

3-2 中間放取得的海底生物圖片，其中要裁圓型，邊邊用一個海草的圖案圍繞（圖案先用 svg 做一個假的佔位，並留下佔位檔名為 /public/images/creature-border.png，找不到檔案前先用 svg 放著，等我找到適合的會取代上去。

3-3 下面放原本的表單送出後成功的內容，然後要說明「加入婚禮特助 LINE，把海洋神寵綁定到 LINE 裡面，還可以隨時查看編輯您的參加資料、收到我們的婚禮通知」（文案幫我寫符合婚禮風格）

3-4 大部份的內容如目前的結果頁，不過設計要依照 /rsvp 頁做設計


----

Gemini 回答：


這個婚禮 RSVP 結合「抽取專屬海洋神寵」的點子非常棒！不僅增加了互動性，也能讓賓客對婚禮留下深刻的印象。

為了解決你的需求，我幫你整理了所需的**文案庫**、**前端實作邏輯**與**版面程式碼建議**。

### 1. 神寵命名庫與專屬文案

**3-1. 神寵命名詞庫 (20個愛情形容詞 + 20個海洋生物)**

你可以寫一個簡單的隨機函式 (Random) 從這兩個陣列中各抽一個詞組合成名字（例如：`浪漫海星`、`同心海龜`）。

* **20 個愛情/婚禮相關形容詞：**
甜蜜、幸福、永恆、浪漫、相隨、摯愛、心動、牽手、眷戀、傾心、比翼、連理、同心、相守、真愛、情深、誓言、珍愛、結髮、依偎。
* **20 個海洋生物名稱：**
海馬、海龜、海豚、藍鯨、水母、海星、珊瑚、海葵、小丑魚、章魚、海豹、海獅、海牛、魟魚、海獺、寄居蟹、海螺、曼波魚、飛魚、燈籠魚。

**3-3. LINE 綁定引導文案 (婚禮風格)**

> **✨ 讓神寵游進你的手機，加入專屬婚禮 LINE 特助 ✨**
> 點擊下方按鈕加入我們的 LINE 官方帳號，並綁定您的手機號碼，就能將這隻專屬的「幸福海洋神寵」收藏到 LINE 裡面喔！
> 此外，您還可以隨時透過 LINE 查看或修改出席資訊，並第一時間接收我們的婚禮甜蜜通知！

---

### 2. UI/UX 流程與程式碼實作參考 (以 React + Tailwind CSS 為例)

為了符合你提供的設計風格（主色調為柔和的粉紫色 `#fdf4f6`、按鈕 `#ec4899`、LINE 綠色 `#22c55e`），以下是 Loading 與 Success 頁面的實作架構：

#### 狀態一：Loading 頁面 (等待 API 生成圖片)

這裡使用一個 SVG 加上 CSS 動畫來模擬「手繪圈圈轉動」的效果。

```jsx
// Loading 狀態元件
const LoadingScreen = () => {
  return (
    <div className="flex flex-col items-center justify-center min-h-[60vh] text-gray-700">
      <div className="relative w-24 h-24 mb-6">
        {/* 手繪風格轉動圈圈 (SVG) */}
        <svg 
          className="animate-spin w-full h-full text-pink-400" 
          viewBox="0 0 100 100" 
          fill="none" 
          stroke="currentColor" 
          strokeWidth="4" 
          strokeLinecap="round"
        >
          {/* 使用 path 畫出稍微不規則的圓，製造手繪感 */}
          <path d="M 50,5 A 45,45 0 1,1 45,95 A 45,45 0 0,1 5,50" strokeDasharray="60 20" />
        </svg>
      </div>
      <h3 className="text-xl font-bold tracking-wider mb-2">謝謝您的登記</h3>
      <p className="text-gray-500">正在召喚您的幸福海洋神寵...</p>
    </div>
  );
};

```

#### 狀態二：Success 頁面 (API 完成並回傳)

這裡包含了你的表單資訊、生成的神寵圖片（含海草邊框佔位與錯誤處理），以及 LINE 的引導區塊。

```jsx
import { useState } from 'react';

const SuccessScreen = ({ guestName, petAdjective, petCreature, imageUrl }) => {
  // 控制海草邊框圖片是否載入失敗，失敗則顯示 SVG 佔位
  const [borderError, setBorderError] = useState(false);

  return (
    <div className="max-w-md mx-auto bg-white p-6 shadow-sm rounded-lg font-sans text-center text-gray-800">
      
      {/* 標題區 */}
      <h1 className="text-2xl font-bold mb-2">送出成功！</h1>
      <p className="text-gray-500 mb-8">感謝 <span className="text-pink-500 font-semibold">{guestName}</span> 填寫回函表單</p>

      {/* 海洋神寵展示區 */}
      <div className="flex flex-col items-center mb-8">
        <p className="font-bold text-lg mb-4 text-teal-700">
          已召喚你的幸福海洋神寵，名字叫：<br/>
          <span className="text-2xl text-teal-600">{petAdjective}{petCreature}</span>
        </p>

        {/* 圖片容器：將 AI 圖片裁切成圓形，並疊加海草邊框 */}
        <div className="relative w-48 h-48 flex items-center justify-center">
          {/* 底部 AI 生成的神寵圖片 (圓形裁切) */}
          <img 
            src={imageUrl} 
            alt={`${petAdjective}${petCreature}`}
            className="w-36 h-36 object-cover rounded-full shadow-inner absolute z-0"
          />
          
          {/* 上層 海草邊框 /public/images/creature-border.png */}
          {!borderError ? (
            <img 
              src="/public/images/creature-border.png" 
              alt="seaweed border"
              className="w-48 h-48 absolute z-10 pointer-events-none"
              onError={() => setBorderError(true)} // 找不到檔案時觸發
            />
          ) : (
            // 佔位用 SVG 海草邊框 (當圖片找不到時顯示)
            <svg className="w-48 h-48 absolute z-10 text-teal-400 pointer-events-none" viewBox="0 0 100 100" fill="none" stroke="currentColor" strokeWidth="2">
               <circle cx="50" cy="50" r="46" strokeDasharray="10 5" className="opacity-50" />
               <path d="M10,50 Q20,30 30,50 T50,50" fill="transparent" />
               {/* 這裡簡單用虛線圓形代表佔位，實際可替換成更精緻的 SVG */}
            </svg>
          )}
        </div>
      </div>

      {/* 原本的回函資訊確認區 */}
      <div className="bg-[#fdf4f6] rounded-xl p-6 text-left mb-6 border border-pink-100">
        <h3 className="text-center font-bold text-lg mb-4 text-gray-700">回函資訊確認</h3>
        <div className="space-y-3 text-sm text-gray-600">
          <div className="flex justify-between"><span className="text-gray-400">出席狀態：</span><span>確定出席</span></div>
          <div className="flex justify-between"><span className="text-gray-400">出席人數：</span><span>成人 2 位、兒童 0 位、嬰幼兒 0 位</span></div>
          <div className="flex justify-between"><span className="text-gray-400">飲食需求：</span><span>葷食</span></div>
        </div>
      </div>

      {/* 修改資料區 */}
      <p className="text-sm text-gray-400 mb-2">若需要修改資料，請使用以下連結：</p>
      <div className="bg-gray-50 p-3 rounded text-xs text-gray-500 break-all mb-4 border">
        https://csh-wedding-test.test7362.aiacademy.tw/rsvp/edit/612a6
      </div>
      <button className="bg-pink-500 hover:bg-pink-600 text-white font-medium py-3 px-8 rounded-md mb-8 transition-colors">
        修改回函資料
      </button>

      {/* LINE 綁定區 (參考原圖的綠色卡片) */}
      <div className="bg-[#f2fbf4] rounded-xl p-6 text-left border border-green-100">
        <h3 className="font-bold text-lg mb-3 flex items-center text-gray-800">
          <span className="mr-2">📱</span> 加入 LINE 好友，接收婚禮通知
        </h3>
        <p className="text-sm text-gray-600 mb-4 leading-relaxed">
          ✨ <strong className="text-teal-700">讓神寵游進你的手機</strong> ✨<br/>
          點擊下方按鈕加入我們的 LINE 官方帳號，並綁定您的手機號碼，不僅能隨時查看與修改資訊，還能第一時間接收我們的甜蜜通知喔！
        </p>
        <div className="text-center">
          <button className="bg-[#06c755] hover:bg-green-600 text-white font-bold py-3 px-6 rounded-md inline-flex items-center justify-center w-full sm:w-auto transition-colors">
            <svg className="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 24 24"><path d="M24 10.304c0-5.369-5.383-9.738-12-9.738-6.616 0-12 4.369-12 9.738 0 4.814 3.269 8.846 8.124 9.48.539.123 1.274.383 1.458.877.167.462.108 1.184.05 1.523l-.151.877c-.05.293-.245 1.169 1.029.631 1.274-.539 6.86-4.045 9.496-7.014 2.585-2.83 3.994-5.368 3.994-6.374z"/></svg>
            加入 LINE 好友
          </button>
          <p className="text-xs text-gray-400 mt-3">▶ 使用綁定短碼（備用）</p>
        </div>
      </div>

    </div>
  );
};

```

### 3. 給你的實作小建議

* **Gemini 圖片生成提示詞 (Prompt)：** 為了讓生成的圖片風格一致，建議你在呼叫 Gemini API 時，把 Prompt 寫死一部分，例如：`"A cute, simple 2D illustration of a [Adjective] [Sea Creature], pastel colors, white background, suitable for a wedding theme icon."` 這樣生成的風格會比較適合婚禮，也比較容易裁切成圓形。
* **預先載入 (Preloading)：** 可以在使用者填寫表單到一半時（例如輸入完手機號碼），就開始背景偷跑生成圖片，這樣使用者按下送出後等待的時間會大幅縮短！


----


ChatGPT 回答：


下面我把整個 RSVP「召喚幸福海洋神寵」體驗，拆成：流程設計、命名素材庫（20＋20）、畫面文案、前後端落地方式、UI 版型細節（含你要的圓形裁切＋海草邊框佔位），你可以直接照著做。

---

## 1) 整體流程（你描述的 1→2→3 落地成可實作的狀態）

### A. 送出表單（Submit）

1. 前端送出 RSVP 表單 → POST `/api/rsvp`
2. 後端建立 RSVP 記錄（先存起來）並回傳 `rsvpId`、`jobId`（圖片生成任務）
3. 前端立刻導到 Loading 頁：`/rsvp/loading?jobId=...`

> 建議：圖片生成放到背景任務（job queue / async worker），避免 API 等太久造成前端逾時。

### B. Loading 頁（等待生成）

* 文案：謝謝您的登記，正在召喚您的幸福海洋神寵…
* 中間：手繪圈圈 loading（可用 SVG 或 Lottie）
* 前端每 1.5～2 秒輪詢 `/api/creature/status?jobId=...`

  * 狀態：`PENDING | RUNNING | DONE | FAILED`

### C. Success 頁（生成完成）

* 狀態變 `DONE` 後導到：`/rsvp/success?rsvpId=...`
* Success 頁同時帶出：

  * 3-1 神寵名字（前兩字形容詞＋海洋生物）
  * 3-2 圓形圖片＋海草邊框（找不到圖就用 SVG 佔位）
  * 3-3 LINE 綁定引導＋可做的事（文案我下面給）
  * 3-4 原本你附圖那段「送出成功＋回函資訊＋修改連結」區塊，版型沿用你現有網站風格

---

## 2) 3-1 命名素材庫

### 20 個「愛情／婚禮」形容詞（挑兩個字用）

1. 甜蜜
2. 心動
3. 鍾情
4. 熱戀
5. 永恆
6. 幸福
7. 浪漫
8. 依偎
9. 牽手
10. 相守
11. 珍愛
12. 深情
13. 溫柔
14. 親密
15. 眷戀
16. 真心
17. 甜萌
18. 絢爛
19. 盟誓
20. 圓滿

> 用法：前綴固定兩字，建議從上面直接抽「甜蜜／心動／永恆／幸福／浪漫／相守」這幾個最直覺。

### 20 個海洋生物名字（後綴）

1. 海馬
2. 小丑魚
3. 章魚
4. 海龜
5. 海豚
6. 鯨魚
7. 魟魚
8. 海星
9. 海膽
10. 珊瑚
11. 水母
12. 海獅
13. 海豹
14. 旗魚
15. 海葵
16. 蝦蛄
17. 螃蟹
18. 海螺
19. 鯊魚
20. 曼波魚

> 名字範例：**甜蜜海馬、心動海豚、永恆水母、浪漫海星、相守海龜**

---

## 3) 3-2 圓形裁切＋海草邊框（含你要的 PNG 佔位與找不到時的 SVG）

### 顯示規格建議

* 圓形圖片：`240x240`（手機可縮到 `180x180`）
* 外圈邊框：比圖片大 20～28px
* 邊框圖片路徑（你指定）：`/public/images/creature-border.png`

### 行為規則

1. 先嘗試載入 `/images/creature-border.png`
2. 載不到或 404 → 顯示 SVG 佔位（海草圈圈的簡化版）
3. 圖片本體用 `object-fit: cover` 做圓形裁切
4. 外圈邊框用 absolute 疊在上面

### SVG 佔位（概念）

* 一圈波浪＋幾撮海草的簡筆
* 顏色沿用你站上的綠色／淺綠系（或用 currentColor 讓主題接管）

---

## 4) 3-3 LINE 綁定段落：婚禮風格文案（可直接貼）

標題（擇一）：

* **加入婚禮特助 LINE，把神寵帶回家**
* **把你的海洋神寵綁定到 LINE，後續通知不漏接**
* **開啟婚禮特助模式：神寵同行、資訊隨查**

內文（較溫暖、婚禮感）：

> 想把剛召喚的幸福海洋神寵帶進 LINE 嗎？加入「婚禮特助 LINE」完成綁定後，你可以隨時查看與編輯出席資料、接收我們的婚禮重要提醒（座位、流程、交通、當日小驚喜），也能在婚禮當天和神寵一起解鎖互動任務！

按鈕文字（擇一）：

* **加入 LINE 好友・綁定神寵**
* **立即綁定到 LINE**
* **加入婚禮特助 LINE**

小字補充（放在按鈕下方）：

* 你也可以稍後再綁定，修改連結仍可使用
* 綁定後會更方便收到婚禮通知與小驚喜任務

---

## 5) Loading 頁文案＆動效小細節（更有儀式感）

主標：

* **謝謝你的登記！**

副標（擇一）：

* 正在召喚你的幸福海洋神寵，請稍等一下下…
* 海底正在回應你的祝福，神寵即將現身…
* 正在把你的出席回函做成一份專屬小禮物…

小提醒：

* 這通常需要 10～25 秒（視生成速度）
* 期間請不要關閉頁面

---

## 6) Gemini 圖片生成：提示詞（Prompt）與一致性策略

### Prompt 建議（你要「海洋神寵」＋婚禮幸福感）

關鍵：固定風格、固定構圖、固定背景，確保每次產出的視覺一致，像同一套 IP。

Prompt 範本（你可把 `{creature}` `{adjective}` 帶入）：

* 風格：清新手繪插畫／粉彩感／柔和光暈
* 主體：Q 版海洋生物，表情快樂、友善
* 元素：小小的愛心泡泡、貝殼、星光點點
* 背景：淺色海水漸層＋極簡，不要文字
* 構圖：主體置中，留足圓形裁切安全邊界

也可以加一條「一致性規則」：

* 每張都用同一種線條粗細、同一種上色方式
* 不要出現人類或品牌文字
* 不要寫字（避免亂入文字）

---

## 7) 後端儲存與綁定（你要做到「神寵綁到 LINE」）

### 資料表最小集合

* `rsvps`: RSVP 主資料
* `creature_jobs`: jobId、狀態、prompt、結果圖檔 URL、神寵名字
* `line_links`: rsvpId、lineUserId、綁定時間、驗證狀態

### 綁定流程（好用、直覺）

1. Success 頁按「加入 LINE」→ 導到 LINE OA 加好友
2. 加好友後，LINE 內引導賓客輸入「手機號碼」或「綁定碼」
3. 你後端用手機號碼或綁定碼把 `lineUserId` 對到 `rsvpId`
4. 綁定成功：回推一則訊息

   * 「綁定完成！你的幸福海洋神寵是：甜蜜海馬 🫧」
   * 附上「查看/修改 RSVP」的按鈕連結

> 你附圖已有「使用綁定短碼（備用）」這個入口，超適合當綁定碼方案：Success 頁顯示一組短碼（例如 6 碼），LINE 端輸入後立即綁定。

---

## 8) Success 頁版型配置（沿用你站上風格＋加神寵區）

依你附圖與現有站點習慣，我建議順序：

1. 頁首：送出成功！＋感謝稱呼
2. 神寵區（新加，視覺主角）

   * 文字：**已召喚你的幸福海洋神寵，名字叫：甜蜜海馬**
   * 圓形圖片＋海草邊框
3. 回函資訊確認（沿用原本區塊）
4. 修改資料連結（沿用原本）
5. LINE 綁定卡片（沿用原本卡片樣式，文案換成婚禮特助＋神寵綁定）
   6.（可選）加一句小彩蛋：每次打開頁面神寵會吐泡泡（簡單 CSS 動畫就很有感）

