行銷展示區塊

提示框自動演出

行銷頁用的提示框自動演出 React 元件:發光邊框輸入框逐字打出提示、假游標滑入點擊送出、結果卡彈出,循環播放,滑鼠移入暫停。

給產品首頁、功能介紹區塊用的「看它自己跑」展示。你提供一份腳本(每組一段提示文字與一張結果卡內容),元件依序演出:發光邊框的輸入框逐字打出提示、尾端閃爍游標條;打完後假游標從右下角外滑到送出鈕點下去,按鈕縮放回饋並轉成小 spinner;接著結果卡以彈簧動畫從下方彈出,停留一段時間後淡出換下一組。整個元件純展示、不可輸入,只在進入可視範圍時播放,滑鼠移入即暫停。

把這個效果裝進你的專案

在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。

npx webberui@latest add prompt-showcase

還沒有專案,或安裝遇到問題?看快速開始 →

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

40
0.6
2600
編輯中的呼叫預設屬性
<PromptShowcase/>

完整範例包含預覽的排版與資料。先安裝元件,再把範例檔貼入你的專案。

安裝

npx webberui@latest add https://webberui.com/r/prompt-showcase.json

或在 components.json 設定 registries 後,改用 @webberui/prompt-showcase 安裝。

使用

import { PromptShowcase } from "@/components/ui/prompt-showcase";

<PromptShowcase
  script={[
    {
      prompt: "幫我把這週的會議紀錄整理成三點重點",
      result: (
        <ol className="list-decimal pl-5">
          <li>官網改版延到 11 月中上線</li>
          <li>客服回覆時間目標縮短為 4 小時</li>
          <li>下週三前確認秋季活動預算</li>
        </ol>
      ),
    },
    {
      prompt: "為手作甜點店寫一句秋季新品標語",
      result: <p>「栗子落下的季節,甜一口剛剛好。」</p>,
      delayMs: 3200,
    },
  ]}
  placeholder="問小幫手任何事…"
/>

Props

Prop型別預設值說明
scriptPromptShowcaseItem[]—演出腳本:依序播放每組提示與結果
valuenumber—受控模式下目前播放的腳本索引;未提供時由元件內部管理(非受控)
defaultValuenumber0非受控模式的起始腳本索引
onChange(index: number) => void—換到下一組腳本時回呼,參數為新索引
charMsnumber40每個字元的打字間隔(毫秒)
delayMsnumber2600結果卡預設停留時間(毫秒),可被腳本項目的 delayMs 覆寫
glownumber0.6外發光層的不透明度(0–1)
loopbooleantrue播完最後一組後是否回到第一組重播;false 時停在最後一組結果
autoPlaybooleantrue是否自動播放;只在進入可視範圍時播放。false 時直接顯示目前這組的完整結果
pauseOnHoverbooleantrue滑鼠移入時是否暫停演出
placeholderstring"輸入任何問題…"打字前顯示的灰色佔位文字
sendLabelstring"送出"送出鈕的無障礙名稱
labelstring"提示示範"整個示範區塊(figure)的無障礙名稱
classNamestring—透傳到最外層 figure

PromptShowcaseItem

欄位型別預設值說明
promptstring—要逐字打出的提示文字
resultReactNode—送出後彈出的結果卡內容
delayMsnumber—結果卡停留時間(毫秒);未提供時使用元件的 delayMs

細節

  • 一輪時序:輸入框靜止 300ms → 逐字打出(每字 charMs)→ 停 250ms → 假游標以 600ms、cubic-bezier(0.23,1,0.32,1) 滑到送出鈕 → 點擊縮放 160ms、送出鈕轉 spinner 400ms → 結果卡 spring 彈出(stiffness 320、damping 26)→ 停留 delayMs → 淡出 200ms 換下一組。
  • 逐字打字以 Array.from 切字元,中文一字一格、emoji 不會被切成半個。
  • 發光邊框用 CSS @property --wb-ps-angle 註冊角度變數,讓 conic-gradient 的起始角能被 keyframes 旋轉;不支援 @property 的瀏覽器退化為靜態漸層邊框。
  • 可用 CSS 變數覆寫外觀:--wb-ps-glow-1(預設 #60a5fa)、--wb-ps-glow-2(預設 #a78bfa)、--wb-ps-glow-period(旋轉一圈,預設 3s)、--wb-ps-fade(文字淡出,預設 200ms);元件也會把 charMs 寫到 --wb-ps-char-ms 供你的樣式參考。
  • 結果區用隱形卡片把所有結果疊在同一格撐出最大高度,循環切換時版面不會跳動。
  • 暫停(滑鼠移入或捲出畫面)只停住排程,恢復後從目前這一段繼續,不會從頭打字。

可及性

  • 外層是帶 aria-label 的 figure(不使用 role="img"),結果卡內容可被螢幕閱讀器正常讀取
  • 打字中的文字對輔助科技隱藏,完整提示以 sr-only 文字提供,不會一個字一個字被朗讀
  • 結果區為 aria-live="polite",新的結果卡出現時會被朗讀
  • 附件 icon、送出鈕與假游標都是裝飾:aria-hidden、tabIndex={-1},不攔截焦點也不可點;滑鼠只用來觸發暫停
  • 使用者系統開啟「減少動態效果」時,不打字、不移動游標、不旋轉邊框,直接顯示目前這組完整提示與結果卡,且不循環