畫面上「不是內容」的東西(logo、收音狀態、日期時間、對話框)叫 chrome。每個狀態只會落在三個層級之一, 由狀態決定、不由畫面決定。層級切換用 200ms 淡入淡出,一個任務裡只切一次進、一次出。
| 層級 | 留什麼 | 拿掉什麼 | 用在 | 版型 |
|---|---|---|---|---|
| FULL · 完整 | logo、收音狀態、日期時間、AI 區、safe area、對話框 | — | 所有可以自由對話的狀態:對話畫面、Stop Idle、Review、Touch Panel、全部例外狀態 | --dialog · --cover |
| AMBIENT · 氛圍 | logo、收音狀態、AI 字幕(若有) | 日期時間、對話框 | 內容主導、介面退到最少:Moving、Welcome / Exit Standby、Trailer 播放 | --standby · --cover-strong · --media |
| FOCUS · 專注 | AI 的一句指示、任務內容、campaign 外框、指令膠囊(辨識到指令時)、重要指令的提示一行 | logo、收音狀態、日期時間、電影 logo、對話框 | 拍照 Position / Countdown / Capture / Success | --media --camera |
1. 使用者正在做一件有明確結束事件的單一任務(不綁時間長短)。
2. 使用者的注意力必須在畫面以外的實體上:鏡頭、自己的站位。
3. 收音是 COMMAND 或 OFF,不是開放對話,「可以跟我說話」此時沒有意義。
4. 任務結束後一定回到 FULL。拍照 Success 結束進 Review 就把頂列拿回來。
Trailer(A06)不符合第 1、3 條,所以是 AMBIENT 不是 FOCUS。
AI 在上、使用者在下(README)。推到觸控:可以按的東西一律住在底部對話框那一格(x 212 · 856×96 · bottom 44)。
語音時它是 .kv-pill,觸控時它是 .kv-actions。safe area 只放資訊,卡片永遠不可按,所以使用者不用猜哪張能按,
工程端也只有一個觸控槽位要管。主要選項在最右、Grow 外框、一屏一個。按下回饋:填色升一階 + 縮 97%、120ms。
收音狀態由 Kebbi 臉下的光條承接。光條不可用時的 fallback:右上角只放 18px 收音光點、不帶文字(.kv-mic--dot,見 T2c)。
可說的指令只標「重要且常用」的那一句,用 .kv-hint 放在底部;不重要的不標。辨識到指令時由指令膠囊取代提示。
例外狀態(網路、太吵、逾時)一律打斷任務、回到 FULL,因為 FOCUS 沒有 AI 區可以放狀態說明。
品牌:FOCUS 畫面不放任何品牌,Vyin 與電影 logo 都不放,避免只剩其中一方。
錨定 Tailwind neutral,只有深色模式。同一時間只有一方是「亮」的:誰在說話,誰的文字就是 Neutral 50;另一方退為灰階。錯誤狀態不用紅色,公開螢幕上用 Warning。
Campaign 色只碰 eyebrow 與素材底,永遠不碰 CTA 與 AI 狀態。換片時只換這兩個變數。目前值量自《歡迎光臨魔法秘境》正式海報:底色 = 漂浮系列海報平均色(深紫),eyebrow = 片名發光的色相、亮度拉到可讀。
參考稿用到但不在 neutral 色階裡。原樣保留,待決定是否收斂到 #262626 / #171717。
| --kiosk-overlay-media | rgba(23,23,23,.8) · 媒體上的狀態 chip 底 |
| --kiosk-overlay-pill | rgba(23,23,23,.92) · 指令提示、Toast 底 |
| --kiosk-dim | rgba(10,10,10,.62) · 聆聽時壓在底圖上 |
| --kiosk-scrim-top / -bottom | 180deg / 0deg,.9 → 0,高 300(tall 360) |
| --kiosk-scrim-cover | 90deg,#0A0A0A 34% → .7 52% → 0 78% · P01、A02、A03 海報滿版時用 |
Grow 只做外框、光點、細線、波形、Kebbi 眼睛。不整面填色、不放在正文後面、不做按鈕填色, 一屏最多 2 處,不放在海報區內。
--kiosk-grow: linear-gradient(55deg, #1F6FE0 0%, #19E27C 28%, #F4FBD0 52%, #FFB05A 74%, #FF6A2B 100%); /* 外框技法:雙背景 padding-box / border-box */ border: 4px solid transparent; background: linear-gradient(#171717, #171717) padding-box, var(--kiosk-grow) border-box;
藍色外光的層級跟資訊層級一致:CTA 最亮(一屏只有一個)、聆聽框次之(暫時態)、卡片最弱(內容層)。 README 只列了前兩級,第三級 DERIVED 自參考稿 8 處相同數值。
Display / 數字:Unbounded 600 / 800(暫代,正式 wordmark 字體 TBD)。UI / 中文:Noto Sans TC 400 / 500 / 700 / 900。標註:IBM Plex Mono,只用在佔位圖與格線標籤,不是產品 UI。螢幕上最小字級 24px(1.5–3 m 閱讀距離)。下方以 1920 尺度實際渲染、縮小 50% 展示。
| --kiosk-radius-pill | 999px | 對話框、CTA、chip、指令膠囊、Toast、倒數膠囊 |
| --kiosk-radius-card | 48px | 卡片、QR 卡、照片、取景框 |
| --kiosk-radius-plate / -lg | 24 / 28px | QR 白底板(400 卡 / 照片頁) |
| --kiosk-radius-tag | 8px | 小標籤 |
| --kiosk-radius-camera | 56px | 相機 campaign 外環 |
| --kiosk-radius-screen | 32px | 裝置外框,只用在參考圖 |
| --kiosk-margin | 96px | 螢幕左右安全邊 |
| --kiosk-card-gap | 24px | safe area 內卡片間距 |
| --kiosk-card-pad-y / -x | 48 / 52px | 卡片內距 |
| --kiosk-pill-pad-x | 64px | 對話框左右內距 |
| --kiosk-space-1 … -9 | 4 → 96 | 其餘間距一律取尺標上的值 |
所有對話畫面都照這套格線排版,規則只有一條(2026-10-14):內容區 = 800 − 頂列 − AI 區(行數 × 72 + 32)− 底部格(依內容:對話框 84 / chips 排 68 / 無 0,底距 44,間距 32)。 AI 1 / 2 / 3 行 × 有底部格 → 388 / 316 / 244,無 → 504 / 432 / 360;觸控模式(chips 排)2 行 360、3 行 288。三行 + 對話框放不下 268 的卡片,所以三行只用在觸控模式或純文字回答。頂列的「Show grid」可以在下方所有畫面疊上這些線。
| 區塊 | x | y | w × h |
|---|---|---|---|
| 頂列 | 64 | 44 | 1152 × 32 |
| 頂列(有倒數膠囊)D | 64 | 36 | 1152 × 48 |
| AI 逐字稿 | 64 | 120 | 1152 × 144 |
| AI 逐字稿(封面) | 64 | 120 | 732 × 144 |
| 思考 / 重新連線列 D | 64 | 288 | — × 48 |
| Safe Area | 64 | 296 | 1152 × 316 |
| Safe Area · AI 1 行 | 64 | 224 | 1152 × 388 |
| Safe Area · 對話框隱藏 | 64 | 296 | 1152 × 432 |
| Safe Area · 1 行 + 隱藏 | 64 | 224 | 1152 × 504 |
| AI 逐字稿 · 3 行 D | 64 | 120 | 1152 × 216 |
| Safe Area · 觸控模式(2 行 + chips 排)D | 64 | 296 | 1152 × 360 |
| Safe Area · 觸控模式 3 行 D | 64 | 368 | 1152 × 288 |
| Chips 排(觸控模式的底部格)D | 212 | bottom 44 | 856 × 68 |
| User 對話框 | 212 | bottom 44 | 856 × 84 / 96 |
| User 對話框 · Photo idle(海報滿版) | 64 | bottom 44 | — × 84 |
| 底部動作列(觸控) | 212 | bottom 44 | 856 × 96 |
| 指令膠囊 | 400 | bottom 44 | 480 × 76 |
| Toast D | center | bottom 48 | auto |
| 媒體字幕 | 64 | 104 | 1152 × 56 |
全螢幕媒體(預告、相機):媒體填滿 1280×800,上下各一層 300px 遮罩;AI 以 56px 字幕出現在上方遮罩,3 秒後淡出。
34 張 Center 畫面只有四種骨架。.kv-screen--dialog / --media / --cover / --standby
會把直接子元件依 class 自動落到格線,不必再寫 kv-at-*;遮罩與光暈由版型的
::before / ::after 產生。--dialog 的底(2026-10-14):放一個 .kv-art,圖是首頁輪播進對話那一刻的那張(JS:進對話就凍住,回首頁才繼續),自動壓暗 + 模糊 + 遮罩。狀態修飾:--one-line(AI 1 行)、--countdown(頂列倒數、對話框隱藏)、
--no-pill(對話框隱藏)、--camera(FOCUS 層級:無頂列、字幕上移)、--cover-strong(Moving 的深遮罩)、--scrim-tall(預告上遮罩 360)、--bg-light(亮色底圖:日期時間切深色)。
2026-10-14 新增:--three-line(AI 3 行)、--touch(純觸控模式:對話框拿掉、chips 橫排住底部格、卡片與 QR 撐滿)、--notice(A09 倒數疊在任何畫面:只換頂列右側)。

.kv-topbar .kv-transcript .kv-status .kv-safe / .kv-chips .kv-pill / .kv-actions .kv-cmd .kv-toast .kv-progress
.kv-actions 時動作列住進同一格,safe area 不延伸。決策型主要按鈕用 CTA 樣式。.kv-art + 上下 300px 遮罩(::before / ::after)+ 56px 字幕(--fade:停 3s 後淡出,捲到會重播)+ 媒體版頂列(logo 陰影、mic 膠囊自動套用)。

.kv-hint 底部置中一句重要指令 DERIVED;Kebbi 光條不可用時右上角放 .kv-mic--dot(只有光點)。
.kv-art:焦點、縮放、壓暗、暗角四個值在 --kiosk-keyart-*)+ 置中 .kv-hero。觸發時 eyebrow 換 --active 整句亮起、.kv-line--wide 960 加綠光。
每個元件用 kv- class 定義長相,用 kv-at- class 定義在格線上的位置。這裡只展示長相,
所以元件並排放在 1920 寬的深色舞台上;放進 .kv-screen 時加上對應的 kv-at-* 就會落到正確位置。
Kebbi 表情組本階段不做。
.kv-dot。.kv-topbar .kv-logo .kv-date .kv-clock · 位置 .kv-at-topbar(有倒數時 --countdown).kv-mic · Layer 1 常駐;三態互斥;Kebbi 光條同步。.kv-status .kv-orb .kv-progress · 位置 .kv-at-status / .kv-at-progress.kv-transcript · 沒有標籤、沒有頭像,位置就是身份 · 最多 2 行,超過由 AI 拆句 · 位置 .kv-at-ai(封面 --cover 1100 寬).kv-pill .kv-wave .kv-caret · 沒有「你」標籤 · 300ms 內從底部升起 · 位置 .kv-at-pill(Photo idle 改為獨立 .kv-btn--lg + .kv-cta-hint).kv-chip · 40/500 · padding 28 48 · 內框 2px。v4.1 出現規則:語音模式只在內容區沒有卡片時出(跟卡片同一格、二擇一);觸控模式一直在底部格;最後一顆固定 .kv-chip--photo「幫我拍一張」(點了 = 說「可以幫我拍嗎」→ PICK;畫面已有拍照 CTA 或這組已拍過就不放);觀眾一開口就收;E11 收尾模式不出。完整規則在 README 互動規則。.kv-card · flex:1 · 48 / 48 52 · 標籤上、值下 · 只在資訊比 AI 說的多時才出現,且永遠不可按 · 位置:放進 .kv-safe 再加 .kv-at-safe<img> 取代 .kv-qr__code.kv-actions 1280×144 · 按鈕等寬 · 填 #262626 + 2px #525252 內框 · 44/700 · 位置:所有版型的直接子元件都自動落到對話框那格(不受 --countdown 隱藏)· 只有一顆時加 --single:置中、寬一半、Grow 外框(P01b).kv-cmd · 720×112 · COMMAND 模式 · 位置 .kv-at-cmd.kv-toast 位置 .kv-at-toast · .kv-countdown 放在頂列右側取代日期時間.kv-screen--camera:.kv-camera__frame 灰框 · .kv-camera__mask 框外壓暗(box-shadow)· .kv-camera__guide Grow 環,比例跟成品照片格一樣 4:3(--kiosk-hole-ratio、--kiosk-guide-w 750)· .kv-camera__digit 倒數 · .kv-camera__overlay(加 .is-overlay 才出現)疊照片框,裁到照片格:只疊明確的大佔位(連拍第一張的比莉;單張與連拍第二張不疊),動態框是透明影片 .kv-camera__overlay-video,影片真的在播(.kv-vid-on)才藏靜態圖;某款要裁掉擠進格子的小素材用 --kv-ov-clip(js/frames.js 的 viewfinderKeepX)。.is-strip-2 裁到下格、--single 裁到單張那格。.kv-photo 600×340(AI 1 行)/ --lg 812×456(對話框隱藏)· 4px Grow 外框 · 圓角 32 · 照片以 <img> 放進框內









.kv-story --single / --strip(寬度用 --story-w,9:16)· 三層由下往上:__bg 背景 → __slot 照片格(% 座標 --sx --sy --sw --sh,圓角 80/1080)→ __frame 照片框圖層。動態版再疊一層 video.kv-story__frame--video(透明影片 loop),.is-live 時換成它、照片格播「短影片」,影片真的在播(.kv-vid-on)才藏靜態框;.is-hold 停在快門那格(P06 時間軸)。單張一款「月亮」、連拍三款每組隨機一款,靜態 / 動態與停格姿勢 photoT 都登記在 js/frames.js(API:draw / apply / live / hold / playIn)。透明影片用 UA 判斷:Safari 給 .mov、其他給 .webm。用在 PICK、P05b、P06、E10、Side F 照片牆。照片是示意插畫。



.kv-pick 兩張 .kv-pick-card(標題 + 說明兩行「拍 N 次/照片 + 短影片」+ .kv-tap-arrow)· 卡片裡就是縮小的 .kv-story,照片格黑底、不放照片(看清楚版型本身),框播這組抽到的動態版 · 置底 .kv-hint--legal 同意拍照小字(只放這頁)· 按下 .is-pressed。

.kv-screen--review2 + .kv-review2(--strip 連拍擺法):左欄 AI 兩行、右側 .kv-story 微傾 + .kv-review2__qr 疊在前面(.is-arrive 進場)· 置底 .kv-hint--legal 保留時間 · 限動框跑 P06 時間軸:短影片播到快門點停住(= 照片)、停 1.5s、接著播、loop · E10 用 .kv-review2--fail(縮小擺正、照片格 loading、沒 QR)。.kv-showtimes 問場次一律用這張(P01b、A05)。規則:最多 4 場;只列今天還沒開演的、近到遠;不足 4 場只放有的、不補空位;都開演完換成 __empty 一句「今日場次已結束 · 明天 10:30 起」。超過 4 場的用語音問「還有其他場次嗎」或掃 QR,不往下塞。每場:時間(display 64)、影廳、剩餘座位。不放海報(設計師 2026-10-06:留位置給場次),片名放標題列、太長用 … 截。__empty,片名不變。









拍好掃 QR 領取,照片 24 小時後自動刪除
.kv-side-photos(v4.1 取代素材牆):四張限動框 .kv-story 疊著(頂張 720×1280,三張露邊各微傾),每 7 秒一張從下緣吐上來、顯影;標題 + 底部法務一行;待命全程使用,交付是 35s loop 影片.kv-side-light:拍照 P02 站位到 P04c 快門整段亮著當補光。暖白底 --kiosk-side-light(不是純白)+ __text「看鏡頭」/「換個姿勢」+ __digit 倒數(.is-count)· 快門 .is-flash 拉到純白 700ms。實機交付影片 side-f-count-5(b).mp4。.kv-side-done:P05b 起黑底 + 火光(.kv-embers,從底邊與中段升起、飛出上緣)→ 稀疏火光 + __msg「照片和影片在上面的 QR 裡」+ 往上箭頭,停到 P09;不放任何相紙形狀。.is-send 溶回照片牆。實機交付影片 side-f-done.mp4 → side-f-done-loop.mp4 → side-f-done-out.mp4。.kv-side > .kv-art,不疊任何我們的字;L / R 各放一張不同海報
.kv-side-exit--top 去字 key art + 遮罩 + QR 卡靠上。Exit mode 用,其他 mode 回靜態 JPG。工程師備註:成本太高可退回 side-poster-a
.kv-side-exit--bottom QR 卡靠下,搭配漂浮版 key art.kv-side-trailer A06 時 Side F/B 同步播預告,16:9 影片置中 + 片名 + 進度條。不可觸控
Kebbi 是女媧機器人,表情由它的 SDK 控制、能改多少待實機確認。.kv-face 只是示意「哪個畫面對應哪個表情」,
不是要廠商重畫 Kebbi 的臉。data-emotion 八種表情、data-mic 驅動臉下方的光條(FOCUS 時收音狀態只靠這條)。
畫面對照表在 Screens 頁尾,prototype.html 四螢幕模式逐步同步。
idle待機微笑,慢速眨眼listen專注,眼睛放大加光think眼睛上看、輕浮動speak嘴形同步 TTScountdown同步 3、2、1happy迎賓 / 道別 / 拍好sorry聽不清、查不到、逾時sleep斷線 / 休眠<link rel="preconnect" href="https://fonts.googleapis.com"> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;500;700;900&family=Unbounded:wght@600;800&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet"> <link rel="stylesheet" href="css/tokens.css?v=4.1"> <link rel="stylesheet" href="css/components.css?v=4.1"> <!-- guide.css / guide.js 只給這份文件用,不要帶進產品 -->
相對路徑。整個資料夾放到任何子目錄底下都能開。IBM Plex Mono 只用在佔位圖與格線標籤,正式素材進來後可以不載。
<div class="kv-screen"> <!-- 1280×800 畫布 -->
<div class="kv-at-topbar kv-topbar">…</div> <!-- 位置 + 長相 -->
<div class="kv-at-ai kv-transcript">…</div>
<div class="kv-at-safe kv-safe">
<div class="kv-card">…</div>
<div class="kv-qr kv-qr--active">…</div> <!-- QR 永遠最右 -->
</div>
<div class="kv-at-pill kv-pill">…</div>
</div>
用版型可以省掉 kv-at-*:
<div class="kv-screen kv-screen--dialog kv-screen--one-line"> <div class="kv-topbar">…</div> <!-- 自動落到 y 44 --> <div class="kv-transcript">…</div> <!-- 自動落到 y 120、1 行 --> <div class="kv-safe kv-safe--one-line">…</div> <!-- 自動落到 y 224 --> <div class="kv-pill">…</div> <!-- 自動落到 bottom 44 --> </div>
實機以 1280×800 全螢幕呈現,.kv-screen 直接放在 body 裡即可。其他解析度用 transform: scale() 等比縮放整個畫布,不要改 token。
| --kiosk-* | 所有 token。與 Vyin 官網的 token 完全獨立。 |
| .kv-block | 元件本體,只管長相 |
| .kv-block__element | 元件內部 |
| .kv-block--modifier | 狀態或尺寸變體 |
| .kv-at-slot | 格線位置,只在 .kv-screen 內用 |
| .kv-actions | 唯一可按的元件,住在底部對話框那格;卡片不可按 |
| .kv-screen--template | 四種畫面骨架:dialog / media / cover / standby,直接子元件自動定位 |
| .kv-grow-ring .kv-dot .kv-eyebrow .kv-art .kv-hero | 原語,被多個元件共用 |
| .kv-slideshow / __slide / __slide--active | 背景劇照輪播,3s 淡入淡出交替;放在 .kv-art 裡 |
| .kv-side-photos / __title / __card / __foot | Side F 照片牆(v4.1):四張 .kv-story 720 寬疊著,版位由 JS 設 transform;.is-dev 照片暗褐未顯影、.is-jump 關掉過渡 |
| .kv-story / __bg / __slot / __frame / __frame--video | 限動框成品(C18):背景 → 照片格 → 照片框;動態框是透明影片圖層。.is-live 動態、.kv-vid-on 影片在播、.is-hold 停在快門那格。款式與 API 在 js/frames.js |
| .kv-pick / .kv-pick-card / .kv-tap-arrow | 選版型(C19):卡片裡是縮小的限動框,照片格黑底 |
| .kv-review2 / --strip / --fail / __qr | 拍好了(C20)與照片還在傳(E10)的排版 |
| .kv-camera__overlay / --single / -video | 取景框疊照片框(C12),只疊明確的大佔位;--kv-ov-clip 裁掉小素材 |
| .kv-pill--sent / __status | 對話框「已送出」態(C05):剛說的話或點的那顆 + 右側狀態字 |
| .kv-chip--photo | 固定的「幫我拍一張」chip(C07),點了 = 進 PICK |
| .kv-side-light / .kv-side-done | Side F 拍照打光態(S-L)與拍完態(S-D);實機用 assets/side/ 的影片 |
| .kv-side-exit / --top / --bottom | Side screen Exit 延伸邀請:去字 key art + 遮罩 + QR 卡。--top QR 靠上、--bottom 靠下 |
| .kv-side-trailer | Side screen 預告同步:A06 時 16:9 影片置中,下方片名與進度條 |
| .kv-media-pause / .kv-media-btn | 預告觸控暫停(Grow 圓形播放鈕覆蓋)與「結束預告」按鈕 |
| .kv-karaoke__done / __rest | Voice Layer:AI 說話時逐字亮(guide.js 自動套用於 __unspoken) |
| .kv-ph | 素材佔位,正式素材進來後移除 |
| .kv-guide / .kv-guides | 開發用格線疊層,正式版不輸出 |
· 四個 Mode 的 38 張完整畫面(P01–P09、A01–A09 + A02t、W01–W03、X01–X03、E01–E10 + E05b、M1–M4)
· 互動原型與狀態機
· Kebbi 表情組
· 正式素材、QR 產生、TTS 逐字同步的實作邏輯
這些會在後續階段以同一套 token 與元件疊上去。