Cut-in
在关键时刻横贯屏幕的一道横幅,仿照游戏中宣告此类时刻的过场效果:沿斜切方向划入,停留片刻,再划出。
安装
# once per project: where @zzzui items come frompnpm dlx shadcn@latest registry add @zzzui=https://zzzui.catforest.dev/r/{name}.jsonpnpm dlx shadcn@latest add @zzzui/cut-in示例
三种场合
import { useState } from "react";import { Button } from "@/components/zero/button";import { CutIn, CutInContent, CutInDescription, CutInEyebrow, CutInTitle,} from "@/components/zero/cut-in";const moments = { accent: ["Job taken", "Sealed crate", "Rail yards → North gate · 3,100 cr"], danger: ["Run failed", "Crate damaged", "The reward drops by half."], legendary: ["Found", "North gate seal", "Signs any job, anywhere."],} as const;type Tone = keyof typeof moments;export default function CutInTones() { const [tone, setTone] = useState<Tone | null>(null); const [eyebrow, title, line] = moments[tone ?? "accent"]; return ( <div className="flex flex-wrap gap-3"> <Button onClick={() => setTone("accent")}>Take the job</Button> <Button variant="danger" onClick={() => setTone("danger")}> Fail the run </Button> <Button variant="secondary" onClick={() => setTone("legendary")}> Open the crate </Button> <CutIn open={tone !== null} onOpenChange={(open) => { if (!open) setTone(null); }} > <CutInContent tone={tone ?? "accent"}> <CutInEyebrow>{eyebrow}</CutInEyebrow> <CutInTitle>{title}</CutInTitle> <CutInDescription>{line}</CutInDescription> </CutInContent> </CutIn> </div> );}单独使用的故障效果
Signal lost
import { useState } from "react";import { Button } from "@/components/zero/button";export default function GlitchHeading() { const [run, setRun] = useState(0); return ( <div className="grid justify-items-start gap-6"> <h3 key={run} className="glitch origin-left rotate-(--zero-tilt) font-black font-zero text-zero-3xl italic" > Signal lost </h3> <Button variant="secondary" size="sm" onClick={() => setRun(run + 1)}> Again </Button> </div> );}行为
由四部分组成:上下两条色调线(强调色、危险色或「传说」稀有度的颜色)之间的黑色横幅,一行斜体眉题,一行倾斜大标题(落定时带故障效果),以及标题下方的一行说明。经过 duration 后自动关闭,按 Esc 或点击其他位置也会关闭;不抢占焦点,不阻挡页面操作,并以 polite 方式通知读屏软件。
两段动效都来自地基:cut-in 是边缘沿斜切角度倾斜的擦除过渡(时长取自 --zero-dur-cut);glitch 是几次阶跃式跳动,把标题错开成一红一蓝两道残影(时长取自 --zero-dur-glitch)。glitch 可用于任意标题。系统开启「减少动态效果」时两者都不播放,横幅直接出现、直接消失。
属性
CutIn
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| open / defaultOpen / onOpenChange | boolean / boolean / (open) => void | — | 是否打开,受控与非受控均可。 |
| duration | number | 2400 | 停留的毫秒数;设为 0 时一直显示,直到被关闭。 |
CutInContent
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| tone | "accent" | "danger" | "legendary" | "accent" | 色调线与眉题的颜色。 |