田中系統 TS Cloud / 電話AI 體驗頁

動態規範:讓每一個動作都在講「電話交給 AI 之後會發生什麼」

本文件說明電話AI 體驗頁各區塊的動態設計與實作參數,並收錄前端需要的字型、色彩、陰影與撥號規格。每一節先列出可直接套用的數值(時長、曲線、觸發、層級),再附一段可操作的動態示意;示意以 HTML/CSS 依結案設計稿重繪,數值與正式頁面一致,可作為開發與驗收的比對依據。

設計稿:TSC_PhoneAI_v2(桌機 1440 / 手機 375)2026-11-09版本 1.4(合併結案清單「開發交接」)

0 全站原則、token 與開發基礎所有區塊共用;後續各節只列出與此處不同的部分

整頁的動態很克制:會自己持續動的只有 Hero(波浪、撥號鈕光暈、周圍小元素)和功能區(手機畫面自動輪播、背景呼吸圓);其他地方都只在使用者捲動、hover 或點擊時才動一次。

token值用在哪裡
--dur-micro150ms顏色、透明度、小 icon 位移(hover 離開、fade out)
--dur-short240mshover 進入、按鈕、箭頭旋轉、accordion、置底撥打列滑入
--dur-panel350ms桌機情境面板展開/切換
--dur-base400ms捲動進場、面板內容切換
--dur-sheet450ms手機情境滑入面板
--dur-long600msHero 大件(圓形、手機)進場
--ease-outcubic-bezier(.2,.8,.2,1)所有「進場/展開」。快出慢停,物件像被放下來
--ease-incubic-bezier(.4,0,1,1)所有「離場/收合」,時長用 micro
--ease-sheetcubic-bezier(.32,.72,0,1)僅用於手機情境滑入面板
--ease-popcubic-bezier(.34,1.56,.64,1)僅用於 Hero 浮動 icon 的彈出
--ease-ambientease-in-out,循環Hero 環境動態、功能區呼吸圓(白色波塊的橫向捲動為 linear)
--reveal-y24px捲動進場的上移距離(手機 16px)
--stagger80ms同一列並排物件的錯開;一列最多錯開 4 個,第 5 個起同時出現

字型

項目規格說明
字型堆疊font-family: Prompt, "Noto Sans TC", sans-serif;英數與電話號碼用 Prompt;中文用 Noto Sans TC。現行 demo 頁只寫 Prompt,中文會落到系統字,與設計稿不一致

色彩與陰影

項目規格說明
主按鈕底 #F75748/hover #E04E41/框 #CF483C/字 #FFFFFF沿用貴司網站按鈕規範
主按鈕陰影box-shadow: 0 4px 14px rgba(247,87,72,.35);僅 Hero 主按鈕與手機置底撥打列;情境面板內的撥打 pill 不加
卡片陰影 E10 2px 4px rgba(74,52,40,.05), 0 12px 32px -6px rgba(74,52,40,.12)暖色兩層式陰影,卡片靜止狀態
卡片陰影 E20 4px 8px rgba(74,52,40,.06), 0 20px 48px -10px rgba(74,52,40,.18)浮起狀態(hover、active)
示意表格色#7986CB(Google 日曆紫)情境 1–4 右側資料表格

電話與撥號

項目規格說明
手機撥打鈕tel:+886277515103,201(各情境改分機 202/203/204)逗號=暫停後自動撥分機,上線前請以 iOS/Android 實機測試
電腦版電話純文字顯示,不做按鈕、無 hover

其他

  • Google 日曆:以 Google Calendar iframe 嵌入;設計稿中的日曆為示意截圖。
  • Header/Footer:沿用現行網站,不需重新開發;設計稿中為現行網站截圖。
  • 數值如與 Zeplin 標註不一致,以 Zeplin 為準。

捲動進場(scroll reveal)規則

  • 觸發:區塊頂端進入視窗 15% 時(IntersectionObserver, rootMargin: 0 0 -15% 0),只觸發一次,往回捲不重播。
  • 動作:opacity 0→1 + translateY(24px→0),--dur-base、--ease-out。
  • 順序:區塊標題先,內容在 +120ms 後開始,同列物件再依 --stagger 錯開。
  • 靜止狀態必須完整:JS 沒載入時,所有內容直接顯示,不能留在 opacity:0。做法是 html.js .reveal{opacity:0},而不是在元素上直接寫 0。

hover 規則(桌機)

  • 可點的卡片:上浮 4px + 陰影由 E1 變 E2,--dur-short 進、--dur-micro 出。
  • 按鈕:上浮 2px + 底色換 Hover 色票(#E04E41);按下 scale(.98)。
  • 電話號碼卡(PhoneCard、CTA 電話卡):沒有 hover,游標維持預設。號碼不是按鈕,目的是引導使用者拿起手機撥號。

1 Hero:波浪、撥號鈕光暈、周圍元素整頁環境動態最集中的區塊,分三個層級:波浪 → 撥號鈕 → 周圍元素

Hero 要讓使用者在 1 秒內讀到「電話正在被 AI 接起來」。視覺焦點依序是:底部緩慢流動的白色波浪(第一焦點,表達聲音在傳送)、手機上紅色撥號鈕的呼吸光暈(第二焦點,引導撥號)、周圍的小 icon 與光斑(第三層,最輕)。手機本體不動,號碼永遠清楚可讀。

示意 / 依結案畫面重繪
Google Workspace ⌄企業AI服務 ⌄企業人才培訓 ⌄成功案例關於我們(02)7728-9535下載資料聯絡我們
AI 智慧接聽・通話全程錄音摘要
立即撥通電話
體驗 AI 幫你處理來電
定價透明公開7 天急速驗證PoC 失敗退費保證
撥打體驗專線
先聽一段通話
9:41
現在就打給 AI
(02)7751-5103
分機 201
按一下就撥出
摘要已傳送給您
環境動態(波浪、光暈、灰圓、光斑、icon、紅點)持續循環,不受重播影響;Hero 捲出視窗時自動暫停。

1a 進場序列(頁面載入後自動播放一次)

頂部標籤「AI 智慧接聽」
大標「立即撥通電話」
副標
三個 ✓
兩顆按鈕
灰色大圓
手機
浮動 icon ×3(錯開 80ms)
泡泡「摘要已傳送給您」
0500ms1000ms1500ms
物件延遲時長動作曲線
標籤 → 大標 → 副標 → ✓ → 按鈕0 / 100 / 180 / 260 / 440ms500msopacity 0→1, translateY(16px→0)ease-out
灰色大圓200ms600msopacity 0→1, scale(.9→1),之後接呼吸縮放(1b)ease-out
手機300ms600mstranslateY(40px→0), rotate(-7°→-3°),落定角度依設計稿,之後靜止ease-out
浮動 icon(對話、聲波、電話)500 / 580 / 660ms450msscale(.6→1),有一點過衝ease-pop
「摘要已傳送給您」900ms400ms由右往左 translateX(16px→0) + fadeease-out

整段 1.3 秒結束。文字先到、畫面後到:文字是訴求,畫面是證據。波浪從頁面載入即開始流動,其他環境動態在各自進場後接續。

1b 環境動態(持續循環,Hero 離開視窗時暫停)

物件屬性數值週期/曲線
一、波浪(第一視覺焦點)
白色實色波塊填色純白 #FFFFFF,從波峰填滿到底部—
曲線正弦波 y = 175 − 29 × sin(2π·x / 1116 + 2.1);振幅 29px、波長 1116px、起始相位 2.1(rad)—
橫向捲動往右,等速;每圈捲動距離剛好等於一個波長,因此無縫41.6s/linear
位置圖層距頂部 530px、高 260px,y 以圖層頂端為 0—
白線v1.4 起移除,Hero 波浪只保留白色實色波塊—
灰底漸層漸層高 300px,上方透明 → 下方淺灰(#E2DEDD → #D9D4D3)靜態,不動
二、手機 CTA 按鈕(第二焦點)
紅色撥號鈕外圈光暈縮放+透明度scale(.92 → 1.06),opacity .75 → 13.6s/ease-in-out
三、周圍元素(第三層,最輕)
黃色對話 icon浮動上浮 6px;相位偏移 1.8s7.4s/ease-in-out
藍色聲波 icon浮動+傾斜上浮 5px,微傾 1.5°;相位偏移 5.1s9.2s/ease-in-out
綠色電話 icon浮動+傾斜上浮 7px,微傾 1.5°;相位偏移 3.3s8.3s/ease-in-out
「摘要已傳送給您」泡泡浮動上浮 6px;相位偏移 6.7s10.2s/ease-in-out
灰色大圓縮放scale(.985 → 1.015)12s/ease-in-out
右上淡紅光斑縮放scale(.92 → 1.06)9s/ease-in-out
頂部標籤小紅點透明度opacity .35 → 12.4s/ease-in-out
「週期」指一個完整來回;icon、泡泡、光暈、灰圓、光斑、紅點皆以 animation-direction: alternate(或 0%→50%→100% 關鍵影格)往返。四個周圍元素以負的 animation-delay(−1.8/−5.1/−3.3/−6.7s)錯開相位,載入後立刻在動、而且永遠不會同步。波浪請以 SVG path + JS 每幀重算 y(或 canvas)實作,不使用 Lottie 或 GIF:曲線需要隨版寬延展。

1c 互動

  • 「撥打體驗專線」:hover 上浮 2px、底色換 Hover 色,陰影維持主按鈕陰影;桌機點擊不另外做動態(按鈕的作用是把號碼突顯給使用者),手機點擊觸發 tel:。
  • 「先聽一段通話」:點擊後 ▶ 變 ‖(--dur-micro),按鈕內右側出現一組 3 條的小聲波(scaleY(.35↔1),0.9s 週期,三條錯開 150ms),文字改為「播放中」;再點一次或播完即回復。
  • Hero 捲出視窗後,環境動態用 IntersectionObserver 暫停(加 .paused → animation-play-state: paused,波浪停止 requestAnimationFrame),避免背景持續運算。
示意 / 點按鈕播放 示意以 6 秒代表一段通話長度。

2 四大體驗與情境面板「電話響的時候,AI 幫你接起來」

四張卡是選單,下方的面板是內容。預設第一個情境(預約)展開;點其他卡就切換到該情境,一次只展開一張,面板永遠有一個情境打開。三角指標滑到被點的卡下方,面板內容先淡出再淡入,不做左右滑(四個情境沒有順序)。

示意 / 點卡片切換
AI 幫你接預約的電話
下班後打來的預約,
隔天上班就在行事曆裡。
醫院診所餐廳餐飲飯店觀光
立即體驗 ↓
AI 幫你回答常見問題
一再重複的問題,
這些交給 AI 回答就好。
房屋房仲客戶服務保險業務
立即體驗 ↓
AI 幫你查庫存和報價
客人問有沒有貨、多少錢,
AI 當下就能回覆。
會計服務零售電商物流運輸
立即體驗 ↓
AI 幫你認出重要客戶
客戶一打來,
AI 替你營造專屬體驗。
業務銷售人力資源總機櫃檯
立即體驗 ↓
狀態/動作時長規格
預設—情境 1「AI 幫你接預約的電話」為 active,面板已展開(頁面載入即是此狀態,不做展開動畫)
進場(捲動)400ms標題先;四張卡依 80ms 錯開上移進場;面板在最後一張卡後 +120ms 進場
卡片靜止/hover240ms靜止陰影 E1;hover(非 active)上浮 4px + 陰影 E2;箭頭圓不動
點另一張卡 → 切換350ms新卡變 active(維持上浮+E2,箭頭圓反白、rotate(180°),↓ 變 ↑),原 active 卡同時還原。三角指標 left 滑到新卡中心(350ms ease-out);舊內容 opacity→0(150ms ease-in)→ 換 DOM → 新內容 opacity→1(200ms ease-out)。面板高度不同時以 height 350ms 過渡,避免下方內容跳動
再點同一張 active—不收合、不做事。面板永遠有一個情境打開
鍵盤—卡片可 Tab 聚焦、Enter/Space 切換;focus ring 用品牌紅 2px

3 面板內:對話泡泡、日曆、FAQ、表單每個情境的右欄不一樣,左欄一樣

3a 左欄「撥通後,大家都這樣問」泡泡(四個情境共用)

示意 / 面板進入視窗時播放
我想預約這週六晚上六點。
可以改成週日中午嗎?
你們最晚可以預約到幾點?
  • 觸發:面板展開或內容切換完成後 +200ms。
  • 每顆泡泡:opacity 0→1 + translateX(-8px→0),350ms ease-out;三顆間隔 400ms。像有人一句一句在講。
  • 不做打字機效果、不做「正在輸入」三點:這裡是客人問的句子,不是 AI 的回覆。
  • 電話卡(PhoneCard)在泡泡之前就靜態存在,沒有動態、沒有 hover;電腦版號碼為純文字。

3b 右欄依情境

情境 1 Google 日曆

日曆以 Google Calendar iframe 嵌入,進場只做 reveal。設計稿中「電話AI體驗用」事件的彈入(scale(.9→1) + fade,300ms)僅適用於示意截圖版本;正式 iframe 內部無法加動態。事件與資料表格色為 #7986CB。

手機版(agenda view)同理,進場只做 reveal。

情境 2 FAQ 知識庫(accordion)
電話號碼與申請 ▾
我們已經有電話總機,可以使用嗎?
可以使用原本的電話號碼嗎?

點分類列展開:grid-template-rows: 0fr→1fr,240ms ease-out;▾ 旋轉 180°。同時只開一個,開新的時舊的先收(150ms)。進場時第一個分類預設展開。

情境 3 商品庫存與報價

清單列進場各錯開 60ms。展開的那個分類裡,三個商品的價格數字從 0 跑到實際金額(600ms,ease-out,只做一次),「本月特價中」「庫存 20 件」標籤在數字跑完後 fade in。數字用 font-variant-numeric: tabular-nums 才不會抖。

情境 4 登錄資料 → 確認頁

欄位 focus:外框 Neutral-100 → 品牌紅,150ms。按「登錄資料」:按鈕文字變「登錄中…」(對應「送出中」畫面),步驟條 ① → ② 的連線由左到右填滿(300ms),表單卡 fade out、確認卡 fade in(同第 2 節面板切換),最上方出現電話卡。右側白底說明框進場只做 reveal,不另外動。

4 從接聽到整理:手機固定,畫面自動輪播「從接聽到整理,AI 接手電話的完整流程」

左側四張功能卡跟著頁面往上捲,右側手機在這一區固定不動(sticky)。手機畫面平常自己慢慢輪播:通話錄音 → 通話摘要 → 訊息通知 → 回寫系統,再無縫接回第一張;頁面捲動時,哪一張灰色功能卡進到視窗中央,手機就切到對應的畫面,並從該張重新計時。灰色功能卡區塊捲到底,手機才解除固定,和後面的內容一起往下。手機背後的淡綠圓做呼吸縮放。

示意 / 在框內捲動,功能卡到中央時切換;平常自動輪播
從接聽到整理,AI 接手電話的完整流程
從接聽到整理,AI 接手電話的完整流程
完整通話錄音客人說了什麼、AI 怎麼回答,隨時點開來聽。
重點摘要誰打來、要什麼、怎麼處理,一目了然。
即時通知重要的來電當下就推播到手機,忙碌中也能立即掌握狀況。
自動寫入你的系統CRM 系統,或任何你存資料的地方,AI 直接更新,不用再手動輸入。
9:41●●▬
通話錄音示意
00:4101:30
來電0912-345-678
時間9/18(五)21:42
長度1 分 21 秒
9:41●●▬
通話摘要示意
時間9/18(五)21:42
通話 1 分 12 秒
來電0912-345-678
需求訂位
內容9/19(六)19:00
4 位・希望靠窗
處理已排入行事曆
不需要回電
9:41●●▬
訊息通知示意
電話 AI 21:43
新來電・訂位需求
姓名:田中先生
電話:0912-345-678
時間:9/19 19:00
人數:4 位・希望靠窗
查看通話摘要 ›
重要來電即時
推播到 Google Chat
9:41●●▬
自動寫入系統
田中餐酒館・訂位
階段:新進名單
21:43・電話 AI(自動)
【通話摘要】
來電:0912-345-678
需求:訂位 9/19 19:00
人數:4 位・希望靠窗
處理:已排入行事曆
通話結果自動寫入 CRM
不用手動輸入
導入後的通知畫面示意,體驗專線不會實際發送
即刻讓 AI 接手你的電話(下一區)
狀態/動作時長規格
進場400ms區塊標題先;第一張功能卡與手機一起 reveal,其餘功能卡各自進入視窗時 reveal
手機固定(sticky,電腦)—手機欄 position: sticky,釘在視窗垂直中央。捲動到此區時手機固定不動,灰色功能卡區塊捲到底才一起往下
畫面自動輪播4s + 0.6s每張停 4 秒、滑動 0.6 秒(translateX 整排移動,ease-out),一張共 4.6 秒。依序 通話錄音 → 通話摘要 → 訊息通知 → 回寫系統
無縫循環—第 4 張後面複製一張第 1 張;滑到複製張後,在 transition 結束時無動畫跳回真正的第 1 張,畫面永遠往左走,看不出接縫
捲動到功能卡 → 對應畫面(電腦)0.6s判定線為視窗垂直正中央(高度為視窗的 2%,比卡片間距窄,同一時間只會有一張卡經過)。哪一張功能卡經過判定線,手機畫面就滑到對應那張(同一條 0.6s ease-out),並從該張重新計時 4 秒。往下捲畫面向左移、往回捲向右移。以 IntersectionObserver 加 rootMargin: -49% 0 -49% 0 實作,不在 scroll 事件裡計算。功能卡 1–4 依序對應 通話錄音/通話摘要/訊息通知/回寫系統
快速捲動—連續跨過多張卡時,手機只切到最後停下的那張(transition 自然合併)
功能卡—只做進場 reveal,本身不變色、沒有 hover 效果(設計稿四張卡同一底色)
分頁點 dot240ms跟著畫面同步;點 dot 可直接切換,切換後從該張重新計時。手機畫面也可左右滑動
背景呼吸圓3.5s手機背後淡綠圓 scale(1 ↔ 1.06),ease-in-out 循環
離開視窗—功能區不在視窗內時暫停輪播計時與呼吸圓
畫面內容—4 張畫面為示意假資料(見 Zeplin「Device/Phone 畫面輪播」)

5 CTA、連結卡與回到頂部「即刻讓 AI 接手你的電話」「還想多了解一點?」

CTA 電話卡

只有 reveal 進場。沒有 hover、沒有游標變化、號碼不可點(桌機,純文字)。號碼可反白複製即可。

CTA 表單卡

卡片本身不 hover;只有右側膠囊按鈕有:

線上填寫需求 →

hover 時白色圓圈往右 3px(250ms ease-out),底色不變;按下 scale(.98)。

連結卡 ×6

hover:底色 白 → Surface/Warm-Light(200ms),黑色箭頭圓往右 4px。六張卡進場錯開 60ms、兩欄交錯(左1、右1、左2…)。

區塊標題(SectionHeading)

上方 40px 短線先由 0 寬長到 40(300ms),標題與副標接著 reveal。四個區塊標題都一樣,這條線是全頁的節奏記號。

Header

  • Header/Footer 沿用現行網站,不需重新開發;以下行為若現行網站已有則維持。
  • 捲動超過 80px:加 0 2px 12px / 6% 陰影,200ms;往下捲不隱藏,使用者需要隨時找得到「聯絡我們」。

回到頂部按鈕(電腦版,畫面右下角)

狀態/動作時長規格
位置—position: fixed,距右 40px、距下 40px。捲到頁尾時停在 Footer 上緣上方 40px,不蓋住 Footer 內容
外觀(依 Zeplin)—60×60 圓角方塊,圓角 16px;底 #FFFFFF(Neutral/0)、框 1px #E8E8E8(Neutral/100)、陰影 E2;icon Icon/Filled/arrow_upward 24px、色 #525252。切圖:雲端「30_切版素材 › Icon」
出現時機—Hero 整個捲出視窗後才出現;捲回 Hero 範圍內就隱藏。以 IntersectionObserver 觀察 Hero(或 Hero 底部的 sentinel),不用 scroll 事件
出現240msopacity 0→1 + translateY(12px→0),ease-out
隱藏150msopacity 1→0 + translateY(0→12px),ease-in;隱藏後 pointer-events: none、visibility: hidden,不可被 Tab 聚焦
hover240ms上浮 2px + 底色 白 → Surface/Warm-Light;離開 150ms
按下100msscale(.96)
點擊—window.scrollTo({ top: 0, behavior: 'smooth' });使用者開啟「減少動態」時直接跳回頂端。回到頂端後按鈕依出現規則自然隱藏,焦點移到頁首第一個可聚焦元素
手機版—不顯示;手機以置底撥打列為主(見第 6 節)
示意 / 在框內往下捲
Hero
四大體驗
功能區
CTA
Footer

6 手機版差異只列出與桌機不同的部分

區塊手機版做法
Hero依手機設計稿只有半支手機、沒有浮動 icon 與泡泡。動態為:撥號鈕外圈光暈(同桌機 3.6s)、頂部標籤小紅點(同桌機 2.4s)、灰色大圓呼吸(同桌機 12s)。手機設計稿 Hero 底部為平直收邊,沒有白色波浪。進場序列同桌機但省略 icon 那一段,整段 1.0s 結束。「撥打體驗專線」按下觸發 tel:+886277515103,201。
四大體驗直向堆疊,進場不錯開(一次一張進視窗,錯開沒意義)。點「立即體驗」整寬空心按鈕 → 開情境滑入面板(下表)。按鈕按下:底色 Neutral-900、字反白 100ms,放開回復。
情境滑入面板由下往上滑入 450ms,cubic-bezier(0.32, 0.72, 0, 1);背景遮罩 40%(同一時長淡入)。點遮罩、按 ✕、往下拖曳(超過 120px)皆可關閉,關閉 240ms ease-in。只有中段內容可捲動,標題列與底部撥打列固定。
置底撥打列Hero 的「撥打體驗專線」主按鈕捲出視窗上緣後,由下滑入(240ms ease-out);捲回頂端、主按鈕回到視窗內時隱藏(150ms ease-in);情境面板開啟時隱藏,關閉後恢復。用 IntersectionObserver 觀察 Hero 按鈕,不用 scroll 事件。內容:紅底「撥打體驗專線」(主按鈕陰影)+右側對話 icon;position: fixed; bottom: 0,頁面底部多留與撥打列等高的內距,避免遮住 Footer。
功能卡+手機畫面手機在上、四張功能卡在下,不做捲動固定。手機畫面同桌機自動輪播(停 4s、滑 0.6s、無縫循環),可左右滑(scroll-snap);點功能卡或 dot 切換到對應畫面(手機沒有 hover,以點擊取代)。
CTA「撥打諮詢專線」紅底按鈕:按下 scale(.98) + 底色 Hover 色;「線上填寫需求」白底空心:按下底色 Surface/Warm。兩顆都不做 hover(手機沒有 hover)。
連結卡按下底色 Surface/Warm-Light,箭頭不動。
示意 / 在框內往下捲,再點「立即體驗」
田中系統(02)7728-9535 ☰
AI 智慧接聽・通話全程錄音摘要
立即撥通電話
體驗 AI 幫你處理來電
定價透明公開7 天急速驗證PoC 失敗退費保證
現在就打給 AI
(02)7751-5103
分機 201
電話響的時候,AI 幫你接起來
實際體驗電話 AI 解決問題,請點選以下情境
AI 幫你接預約的電話下班後打來的預約
隔天上班就在行事曆裡
醫院診所餐廳餐飲飯店觀光
AI 幫你回答常見問題一再重複的問題
這些交給 AI 回答就好
房屋房仲客戶服務保險業務
AI 幫你查庫存和報價客人問有沒有貨、多少錢
AI 當下就能回覆
會計服務零售電商物流運輸
撥打體驗專線
主按鈕一離開視窗上緣,置底列立刻出現;往回捲到主按鈕再出現時收起。點「立即體驗」開啟面板時置底列隱藏;可點遮罩、按 ✕ 或把標題列往下拖曳關閉。

7 實作與驗收開發與驗收清單

CSS 變數(可直接套用)

:root{
  --dur-micro:150ms; --dur-short:240ms; --dur-panel:350ms; --dur-base:400ms; --dur-sheet:450ms; --dur-long:600ms;
  --ease-out:cubic-bezier(.2,.8,.2,1); --ease-in:cubic-bezier(.4,0,1,1);
  --ease-sheet:cubic-bezier(.32,.72,0,1); --ease-pop:cubic-bezier(.34,1.56,.64,1);
  --reveal-y:24px; --stagger:80ms;
  --shadow-e1:0 2px 4px rgba(74,52,40,.05), 0 12px 32px -6px rgba(74,52,40,.12);
  --shadow-e2:0 4px 8px rgba(74,52,40,.06), 0 20px 48px -10px rgba(74,52,40,.18);
  --shadow-cta:0 4px 14px rgba(247,87,72,.35);
  font-family:Prompt, "Noto Sans TC", sans-serif;
}
@media (max-width:767px){ :root{ --reveal-y:16px } }

/* 捲動進場:只有在 JS 可用時才先隱藏 */
html.js .reveal{ opacity:0; transform:translateY(var(--reveal-y)) }
html.js .reveal.in{ opacity:1; transform:none;
  transition:opacity var(--dur-base) var(--ease-out), transform var(--dur-base) var(--ease-out);
  transition-delay:calc(var(--i,0) * var(--stagger)) }

/* Hero 環境動態(週期=一個完整來回) */
@keyframes float{ 0%,100%{ transform:translateY(0) rotate(0) } 50%{ transform:translateY(calc(var(--y)*-1)) rotate(var(--r,0deg)) } }
.icon-chat  { --y:6px;                animation:float 7.4s  ease-in-out -1.8s infinite }
.icon-wave  { --y:5px; --r:1.5deg;    animation:float 9.2s  ease-in-out -5.1s infinite }
.icon-phone { --y:7px; --r:1.5deg;    animation:float 8.3s  ease-in-out -3.3s infinite }
.bubble-sent{ --y:6px;                animation:float 10.2s ease-in-out -6.7s infinite }
.dial-halo  { animation:halo 3.6s ease-in-out infinite alternate }   /* scale .92→1.06, opacity .75→1 */
.hero-circle{ animation:breathe 12s ease-in-out infinite alternate } /* scale .985→1.015 */
.hero-glow  { animation:pulse 9s ease-in-out infinite alternate }    /* scale .92→1.06 */
.badge-dot  { animation:blink 2.4s ease-in-out infinite alternate }  /* opacity .35→1 */

/* Hero 波浪(每幀重算;t 以秒計,圖層 top:530px、height:260px) */
// 波塊:y = 175 − 29·sin(2π(x − 1116·t/41.6) / 1116 + 2.1)             fill #FFF 至圖層底

/* 功能區:手機固定+自動輪播 */
.flow .phone-col{ position:sticky; top:calc(50vh - 198px) }
.flow .screens{ display:flex; transition:transform 600ms var(--ease-out) }   /* 每張停 4000ms;功能卡進入視窗中央時切到對應畫面 */
.flow .bg-circle{ animation:breathe2 3.5s ease-in-out infinite alternate }   /* scale 1→1.06 */

/* 手機情境面板 */
.sheet{ transition:transform var(--dur-sheet) var(--ease-sheet) }
.sheet-mask{ background:rgba(0,0,0,.4) }

驗收項目

  • 只用 transform 與 opacity 做動態(波浪除外,以 canvas/SVG 重繪);不要 animate top/left/width/height/box-shadow(陰影用兩層疊 opacity 切換)。
  • 任何時間截圖,頁面都要完整:不能有停在 opacity:0 的區塊。關閉 JS 再捲動一次確認。
  • Hero 與功能區離開視窗時環境動態要暫停(Performance 面板看不到持續的 style recalc)。
  • 桌機 hover 規則不得套到觸控裝置:用 @media (hover:hover) 包起來,避免手機點一下卡在 hover 態。
  • 電話卡、CTA 電話卡:游標為預設箭頭、沒有任何 hover 變化、沒有 tel:(桌機)。手機撥打鈕的 tel: 分機以 iOS/Android 實機測試。
  • 波浪:白色波塊每 41.6 秒回到同一位置,接縫處看不出跳動;任何一幀都不能碰到按鈕或手機。
  • 功能區輪播從第 4 張接回第 1 張時方向不變、沒有倒退。
  • 手機置底撥打列在情境面板開啟時隱藏、關閉後恢復。
  • 功能區:捲動讓功能卡 1–4 進到視窗中央時,手機切到對應畫面;往回捲同樣成立。
  • 回到頂部按鈕:Hero 捲出後才出現,隱藏時無法被點擊或 Tab 聚焦。
  • 中文字型為 Noto Sans TC(檢查 Computed font 不是系統字)。