畫面上「不是內容」的東西(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、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 寬).is-settling 落定成下面這個平常態
.kv-pill .kv-wave .kv-caret · 沒有「你」標籤 · 300ms 內從底部升起 · 位置 .kv-at-pill · Photo 待命 P01 沒有對話框(整片螢幕是按鈕,C21)· 落定過渡 .is-settling(v4.2,只在 .kv-screen--start 內):--sent → 平常態 450ms,高度 96 → 84、光暈與 Grow 環淡掉(兩組 box-shadow 結構一樣才能互相過渡)、「正在啟動」淡出、placeholder「直接說,我在聽」淡入;最後一格加 .is-nt 換回平常 class 不過渡。時序在 js/start.js 的 pillListen.kv-pill--shake:觸發 = E06 太吵(README「E06 太吵」台詞列:「這裡有點吵,可以靠近一點,再說一次嗎?」),收到斷斷續續的字時對話框水平抖 600ms(kv-shake-s),Kebbi 同時 .kv-face--squint 瞇眼抖,1.2s 後兩個 class 一起移除(js/moments.js squint、js/film-a3-misc.js)。規則在 css/components.css「09 太吵 E06」段;重播要先移除 class、強制 reflow 再加回。.kv-chip · 40/500 · padding 28 48 · 內框 2px。v4.1 出現規則:語音模式只在內容區沒有卡片時出(跟卡片同一格、二擇一);觸控模式一直在底部格;最後一顆固定 .kv-chip--photo「幫我拍一張」(點了 = 說「可以幫我拍嗎」→ PICK;畫面已有拍照 CTA 或這組已拍過就不放);觀眾一開口就收;E11 收尾模式不出;P01b 開場與觸控首頁 TP01b 不出(v4.2,五件事就是大卡 C22 + 能力列 C23)。完整規則在 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 外框(E10「我再試一次」;P01b 自 v4.2 起沒有 CTA,拍照入口是大卡 C22).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-schedule(v4.2,設計師 2026-10-27 選時刻表):沒指定片名問場次時的回答(A05t),放在 AI 一行版的 safe area(.kv-safe--schedule 1152×388)。__panel 一頁 5 列 __row(__time / __film,本片 .is-camp 活動色 / __tags;第 1 頁置頂 .kv-schedule__row--pin 放本片下一場(暖色底 + 片名活動色,不另外標籤),今天沒有就放明天第一場,時間前面寫「明天 10:30」(__when); 版本標籤 IMAX・中文版・英文版),不放剩位與廳別;整列可點(右端箭頭、按下 .is-pressed)= (v4.3.4 退場:場次是最後一頁、不放 QR;原 A05p 活動好康卡 + QR);想看單一部片的場次用說的 → A05 單片卡;表格頁不放 QR。高 420、一頁 5 場、每列 66;置頂列下面不畫線。__day 明天分隔(白色淡字);__foot 範圍 + __prev「← 上一頁」(第 2 頁起才出現,純文字淡色)+ 頁點 + __next(最後一頁字換「回第一頁」)。圖上把幾種狀態放在一起示意。prototype-touch.html)。由上到下:.kv-films 選電影(一頁 4 張左右一排、不放海報、翻頁同場次表 __foot;.kv-film--pin 本片固定第一張)· 新片資訊四種版型(兩種模式共用,腦依回答選一個、不是分頁):.kv-info--character 單一角色、--cast 角色群像、--plot 劇情、--facts 幕後(.kv-facts__hero 大數字 + __list 兩則;不放背景、不用活動色,只用字級排) · .kv-tnav 底部導覽(__back 往上一層的文字鍵,跟回首頁並排;[data-act=retake] 在 .is-wrapup 藏)· .kv-cam-cancel(站位 / 倒數右上角「取消」,v4.2 起語音模式也有)。那部片的場次直接用 C26 場次表。版面:.kv-screen--touch 不放對話框、藏收音膠囊,內容區 AI 1 行 432 / 2 行 360。畫面片段與示意資料在 js/touch-data.js。.kv-story --single / --strip(寬度用 --story-w,9:16)· 三層由下往上:__bg 背景 → __slot 照片格(% 座標 --sx --sy --sw --sh)→ __frame 照片框圖層。動態版再疊一層 video.kv-story__frame--video(透明影片 loop),.is-live 時換成它、照片格播「短影片」,影片真的在播(.kv-vid-on)才藏靜態框。v5 照片框(設計師 2026-10-28):款式先固定 B 紫色(設計師 2026-11-03:照片框已定案、但不是 A / B / C 任一款、偏 B;最終素材之後給,到時整組換掉。A / C 素材與切換都已拿掉,要看回 git 歷史 v4.3 的 frames.js)× 四個版型(一張 1 蓄力、3 爆米花鍋;兩張 2 蓄力+漂浮、4 鍋中歡呼+爆米花),每格裡都有角色在動;單張、連拍每組各自隨機抽一款、跟上一組不同。資料在 js/frames.js(API:draw / apply / live / hold / playIn),素材 assets/campaign/frames/v5-{A,B,C}{1–4}/。.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 保留時間 · 限動框只放動態版:短影片 + 動態框整支 loop(v4.2 拿掉快門點定格;P05b 拍立得從快門那一格開始播) · E10 用 .kv-review2--fail(縮小擺正、照片格 loading、沒 QR)。.kv-review2--fail(加在 .kv-review2 上):觸發 = photo.upload.fail(README 事件表「photo.upload.fail(E10)」列、台詞列「E10 照片和影片還在傳」;重試 2 次仍失敗回 P02)。限動框傾 +2°、縮 86%、靠右貼頂列日期;.kv-review2__qr 不出;照片格的 <img> 藏起、換 .kv-status(光點 + 「上傳中 · 第 n 次」,不顯示失敗原因);畫面加 .is-actions 讓底部動作列「我再試一次」壓過法務小字。傳成功只要拿掉 --fail:框滑回、放大、傾斜 ±4°(700ms),QR 進場(js/film-a2-photo-system.js)。規則在 css/components.css「E10 照片還在傳 / 上傳失敗」段。.kv-screen--start.is-idle:輪播 key art + 上下壓暗 --kiosk-scrim-start · .kv-start-frame 全螢幕 Grow 外框(inset 20、圓角 40、呼吸 3.2s)——例外(設計師 2026-10-23 同意):整片螢幕就是按鈕,所以環包整個畫面,只在 P01 用 · .kv-welcome 活動 eyebrow(DS .kv-eyebrow)+ __title 歡迎大標 --kiosk-type-welcome 900/112 一行置中、固定字(不跟 Kebbi 的話換) · .kv-start-hint 底部 --kiosk-type-start-hint 700/36「點擊任一處,開啟魔法對話」 · .kv-idle-spark 一顆 10px 小火光(同 .kv-fire--big 的樣子,沒有十字、沒有圓框)在中間跑來跑去、拖小火星尾巴(js/start.js 的 idleLoop) · 不收音:頂列整個不放(opacity: 0,點了才淡入)、沒有對話框。點任何地方 → C25 火光 → .is-cast。.kv-cap-hero 736×392,left 64 / top 232,這次活動的主角 · 不透明底的 Grow 外框走 DS 雙背景做法(padding --kiosk-grow-border 4px、底 --kiosk-grow、光暈 --kiosk-glow-cta,同 .kv-photo)· __inner 圓角 --kiosk-radius-card − 4 · 劇照 object-position: 60% 45% + __scrim 往右壓暗(左 .9 → 75% 透明)· __body 內距 40:eyebrow「01 · 活動限定限動框」上、標題 __title --kiosk-type-cap-hero 900/80 + __go(DS .kv-tap-arrow 白色實心圓箭頭 72px 改排在字前、500/22「拍好掃 QR 帶走」)下 · .is-open 時 kv-rise-in 300ms 升起(delay 100;有火星畫過時 0)· 點了 = 說「可以幫我拍嗎」→ PICK。.kv-caps 384×392,left 832 / top 232,四顆 space-between · .kv-cap 高 86、全圓角 --kiosk-radius-pill、padding 0 12 0 32,底色與框線同 chips(--kiosk-glass-tap .16 + 玻璃模糊 + inset 1.5px --kiosk-line-tap,設計師 2026-10-23)、字 --kiosk-type-action 700/30 · 右邊 .kv-tap-arrow--outline 描邊圓箭頭 58px(新原語:透明底、1.5px --kiosk-line-tap 環、26px 箭頭)· 四件事只寫事情、不寫例句:查場次 / 活動好康 / 看預告 / 新片資訊(新能力,內容待 PM)· 點了 = 說了那件事 → A03 → A05 / A05e / A06 · .is-open 時 kv-rise-in(delay 200;火星畫過時 160)· 按下沿用 DS 按下態。觸控首頁 TP01b 同這排、沒有對話框(A02t 自 v4.3 退場)。.kv-skel 疊整個畫面(pointer-events: none),.is-on / .is-off 整組淡入淡出 300ms · 五個 __box 用 --x --y --w --h --r 放在大卡(64, 232, 736×392, r32)與右欄四顆(832, 232 + n×102, 384×86, r43)的位置;AI 那句不出骨架 · 樣式「只留色塊」(設計師 2026-10-23 選定):玻璃底白 .06 + 模糊、沒有線、沒有字,不會誘人去點 · 火星第一次經過才 .is-seen 淡入(500ms)並留著(整組一起出現太突兀),經過時 .is-lit 底色亮到 .12(150ms)再暗回去 · tap 後 1.8s 還沒 ready 才出現:聚點那顆火星(.kv-idle-spark.is-roaming)依序跑過五格、跑到哪格哪格才亮(約 3.0s 畫完);畫完還沒好 → .is-shimmer 每格掃一道微光、火星飄慢速 8 字(v4.2 設計師 2026-10-28);對話框是 --sent「開啟魔法對話 · 正在啟動」· 腦就緒 → 骨架 .is-off、火星一筆畫過、真內容升起。.kv-fire-layer 疊在畫面最上(z 8、不吃點擊、overflow hidden),裡面的節點都是 JS 用 WAAPI 丟進來、播完自己移除 · .kv-fire 一顆火星:核心亮 → 外圈橙紅 → 一層光暈(mix-blend-mode: screen),大小用 --size 3–24px 混用,≥ 16px 加 --big(更亮、暈更大)· .kv-fire-bloom 點擊處的核心光 520px,脹開再散掉 1.6s · 爆開(設計師 2026-10-23 第二版:有大有小、有疏有密、從點擊處原地散出去、自然消失):四波 0 / 120 / 320 / 650ms、26 / 22 / 18 / 12 顆、距離倍率 1 → .6,三條比較密的方向讓疏密不均;小的飛遠、大的飛近;到定點後往下墜同時淡掉 2.4–4s · 其他用法:待命火星的尾巴、等待時點擊處每 400ms 一顆餘燼、留下的那顆火星、P01b 進場飛進收音膠囊變綠點 · 只動 transform / opacity;一次爆開最多約 80 顆,實機吃力把 js/start.js 的 WAVES 顆數減半 · prefers-reduced-motion:不出火星,點了直接進 P01b。.kv-showtimes 問場次一律用這張(P01b、A05)。規則:最多 4 場;只列今天還沒開演的、近到遠;不足 4 場只放有的、不補空位;都開演完換成 __empty 一句「今日場次已結束 · 明天 10:30 起」。超過 4 場的用語音問「還有其他場次嗎」或掃 QR,不往下塞。每場:時間(display 64)、影廳、剩餘座位。不放海報(設計師 2026-10-06:留位置給場次),片名放標題列、太長用 … 截。__empty,片名不變。.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 溶回海報 A(v4.3:照片牆退場)。實機交付影片 side-f-done.mp4 → side-f-done-run.mp4 播一次 → side-f-done-still.png 靜態圖(v4.3.4 ⑤) → side-f-done-out.mp4。.kv-side-wall(v4.2,設計師 2026-10-28 加回:迪士尼很喜歡):v3.3 的 Side F 素材牆拿回來,標題改「歡迎光臨魔法秘境」(--kiosk-type-side-title);2 × 3 劇照 + 一張橫幅大圖(--kiosk-radius-tile)。兩面 Side 待命輪播的 ③(海報之後 8s),交付 side-stills-1080x1920.png。.kv-side-promo(v5.1,設計師 2026-10-30 晚;v5 Claude Design 2026-10-28):待命輪播中的一段,只在待命播。.kv-marquee 一行提示字「↑ 點一下中間螢幕,開啟魔法對話 ↑」+「我可以幫你做這些事」便利貼(上緣紙膠帶)+ 三張卡輪流擺進來(.kv-promo-item --at 帶起始秒數):01 拍照留念 0–17s、02 場次 · 活動好康 17–26s(電影票 + 餐券)、03 看預告 · 聊新片 26–35s(底片 + 海報月曆)+ 曬衣繩索引三個(.kv-promo-hang)。v5.1 為了 3–5 公尺看得清,字全部放大(--promo-fs-*:標題牌 96、便利貼 60、卡內副文字 48、索引 44;索引小道具 ×1.3);卡進出場 keyframes 分 9s 版和 17s 版(.kv-promo-item--long / .kv-promo-hang--long)。三張共用骨架 .kv-promo-sheet(952×1000 透明幾何框):.kv-promo-head 紅色號碼牌、.kv-promo-prop 道具(卡落下 0.4s 後再貼上)、.kv-promo-sheet__foot 一句補充。各卡小動態:01 限動框每 4.25s 換手(.kv-promo-real 放照片框的真實錄影成品 5 秒影片;B 紫色款不加相紙白邊,原本給暗底框用的 --mat 已拿掉)、02 蓋章 + 蓋章微彈、03 底片每 3s 輪劇照。一圈 --kiosk-dur-promo 35s,色走 --kiosk-promo-*。markup 由 js/side-promo.js 產生;實機交付 side-{f,b}-promo-<階段>.mp4(依活動階段分版)。資料:11/26(週四)上映、預告 2:20;片長與台灣分級未公布不放;場次是示意。 10/30 晚再調:右上 Vyin AI logo 拿掉、提示字上移 96、便利貼 250、卡內道具縮 0.84 並離紅牌 60、補充句落到紙面下、索引線 1600;03 的海報拿掉,日期貼紙疊在膠片右下。.kv-side > .kv-art,不疊任何我們的字。Side B(後)永遠海報 B;Side F(前)有人在用時(含 A06 播預告)放海報 A,待命時四段輪播 ① 機器人能幹嘛(S-P)→ ② 海報 A → ③ 劇照牆(S-W)→ ④ 直式預告(v4.3 定案:Side 不同步播預告,只放預製素材;見 README §5.6).kv-side-inuse(v4.3,設計師 2026-10-30):有人點了 Center(P01a 起)Side F 不再是亮海報——海報 A 壓暗四成(頂部壓到近全黑,字不跟海報片頭字疊),頂部一行跟機器人能幹嘛提示同款(.kv-pgrid__hint 56/700、奶金 ↑)「↑ 在中間螢幕跟我聊」(Center 在 Side F 上方),0.6s 淡入、停到 8s、0.8s 淡出,之後維持壓暗海報。使用者測試:開 session 後會不確定要看 Side F 還是 Center,所以把 Side 退成背景、視線由上往下導一次。拍照時照舊換 S-L / S-D;收尾溶回不壓暗的海報 A。輸出 side-f-in-use.mp4(9s,停最後一格),rig 從 P01a 算起播。.kv-side-exit--top 去字 key art + 遮罩 + QR 卡靠上。Exit mode 用,其他 mode 回靜態 JPG。工程師備註:成本太高可退回 side-poster-a.kv-side-exit--bottom QR 卡靠下,搭配漂浮版 key art
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.3.7"> <link rel="stylesheet" href="css/components.css?v=4.3.7"> <!-- 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 | v4.3 退場(照片牆拿掉,規格頁樣本已刪);CSS 只剩 transitions-explore.html 探索頁在用,之後一起清 |
| .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--fail | 照片和影片還在傳(C20b,E10):框縮小靠右、QR 藏起、照片格換 .kv-status;拿掉就是傳成功轉場 |
| .kv-review2 / --strip / --fail / __qr | 拍好了(C20)與照片還在傳(E10)的排版 |
| .kv-camera__overlay / --single / -video | 取景框疊照片框(C12),只疊明確的大佔位;--kv-ov-clip 裁掉小素材 |
| .kv-pill--shake | 對話框太吵抖一下(C05b,E06):水平抖 600ms 一次,1.2s 後由 JS 移除 |
| .kv-pill--sent / __status | 對話框「已送出」態(C05):剛說的話或點的那顆 + 右側狀態字 |
| .kv-pill.is-settling / .is-nt | 對話框從 --sent 落定成平常態的過渡(C05,v4.2,只在 .kv-screen--start 內);.is-nt 最後一格不過渡 |
| .kv-screen--start / .is-idle .is-cast .is-wait .is-open .is-sweep | 點擊開始(v4.2):P01 / P01a / P01b 共用的畫面與狀態,由 js/start.js 切;.is-sweep = P01b 進場有火星畫過、升起順序跟著牠 |
| .kv-start-frame | P01 全螢幕 Grow 外框(C21)——例外,只在待命用 |
| .kv-welcome / __title / .kv-start-hint / .kv-idle-spark | 待命歡迎(C21):eyebrow + 大標、底部提示、跑來跑去的小火光(.is-roaming = 留下的那顆在飄) |
| .kv-cap-hero / __inner __scrim __body __title __go | 拍照大卡(C22) |
| .kv-caps / .kv-cap / .kv-tap-arrow--outline | 能力列四顆(C23)與描邊圓箭頭原語 |
| .kv-skel / __box / .is-on .is-off .is-seen .is-lit | 喚醒中骨架(C24):位置用 --x --y --w --h --r |
| .kv-fire-layer / .kv-fire / --big / .kv-fire-bloom | 火光(C25):JS 用 WAAPI 丟進來的火星與核心光,--size 定大小 |
| .kv-chip--photo | 固定的「幫我拍一張」chip(C07),點了 = 進 PICK |
| .kv-screen--touch / .kv-tnav / .kv-tnav__back / .kv-schedule__end / .kv-films / .kv-film--pin / .kv-info--plot / --cast / --character / --facts / .kv-cam-cancel | 觸控模式(C27):導覽、選電影(2 × 2、翻頁、本片置頂、不放海報)、新片資訊四種版型(腦選)、拍照取消 |
| .kv-schedule / __row / __tags / __next / .kv-safe--schedule | 場次表(C26):沒指定片名問場次(A05t),照開演時間排、一頁 5 場;只放時間、片名、版本;點一列 → 活動好康卡 + QR(A05p) |
| .kv-side-promo / .kv-marquee / .kv-promo-* | Side F 待命「機器人能幹嘛」段(S-P):招牌、四件事的紙道具、曬衣繩索引;markup 在 js/side-promo.js |
| .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-media-pause / .kv-media-btn | 預告觸控暫停(Grow 圓形播放鈕覆蓋)與「結束預告」按鈕 |
| .kv-screen--media.is-bare / .is-paused | v4.2 預告(A06b / A06p):沒字時片名列、進度條、頂列淡掉,結束預告往下到下黑邊正中(bottom 17);暫停時三個都回來、在遮罩之上 |
| .kv-transcript--fade-long | v4.2 預告開場兩行字幕:停 6.5s(--kiosk-dur-caption-long)再淡出;實機 = 念完 1.5s 後淡出 |
| .kv-karaoke__done / __rest | Voice Layer:AI 說話時逐字亮(guide.js 自動套用於 __unspoken) |
| .kv-ph | 素材佔位,正式素材進來後移除 |
| .kv-guide / .kv-guides | 開發用格線疊層,正式版不輸出 |
· 四個 Mode 的完整畫面(P00 打烊、P01–P09 含 P01a / P01b / P03b / P04c / P05b / P06b、A03–A07 含 A05e / A05t / A05t2 / A06b / A06p / A06v、E01–E13 含 E05b(E09 v4.3.3 退場)、M01–M03、觸控 TP01 / TP01a / TP01b;v4.3 起 A02 / A02t / A08 退場)
· 互動原型與狀態機
· Kebbi 表情組
· 正式素材、QR 產生、TTS 逐字同步的實作邏輯
這些會在後續階段以同一套 token 與元件疊上去。