Skip to main content
PolyUI/docs

反馈

提示

带图标的静态提示条,支持 default 和 destructive 两种变体。

安装

bash
npx polyui add alert

基础

基础

tsx
import { getDocsDict, t } from "@/lib/docs-i18n"
import { Alert, AlertTitle, AlertDescription } from "@polyui/react/alert"
import { Button } from "@polyui/react/button"
import { CircleAlertIcon, ArrowRightIcon } from "lucide-react"
export function AlertBasic({ lang = "zh" }: { lang?: Lang }) {
  const dict = getDocsDict(lang)
  return (
    <div className="flex flex-col gap-3 w-full max-w-lg">
      <p className="text-xs font-mono text-muted-foreground uppercase tracking-widest mb-2">
        {t(dict, "demos.alerts.sectionBasic")}
      </p>

      {/* --- 变体1: 基础 --- */}
      <Alert>
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.newMessage")}</AlertTitle>
      </Alert>

      {/* --- 变体2: 带描述 --- */}
      <Alert>
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.newMessage")}</AlertTitle>
        <AlertDescription>{t(dict, "demos.alerts.unreadMessages")}</AlertDescription>
      </Alert>

      {/* --- 变体3: 带 Avatar 和描述 --- */}
      <Alert className="flex items-center justify-between">
        <div className="flex size-8 shrink-0 items-center justify-center rounded-sm bg-muted text-sm font-medium text-muted-foreground">
          {t(dict, "demos.alerts.avatarHr")}
        </div>
        <div className="flex-1 flex-col justify-center gap-1 px-3">
          <AlertTitle className="flex-1">{t(dict, "demos.alerts.saraReplied")}</AlertTitle>
          <AlertDescription>{t(dict, "demos.alerts.unreadMessages")}</AlertDescription>
        </div>
        <CircleAlertIcon className="shrink-0" />
      </Alert>

      {/* --- 变体13: 带操作按钮 --- */}
      <Alert className="flex items-center justify-between [&>svg]:translate-y-0">
        <CircleAlertIcon />
        <AlertTitle className="flex-1">{t(dict, "demos.alerts.newMessage")}</AlertTitle>
        <Button variant="outline" className="h-7 cursor-pointer rounded-md px-2">
          {t(dict, "demos.alerts.btnOpen")}
        </Button>
      </Alert>

      {/* --- 变体4: 蓝色 sky — 带链接按钮 --- */}
      <Alert className="flex items-center justify-between border-sky-600/30 bg-sky-600/5 text-sky-600 dark:border-sky-400/35 dark:bg-sky-400/5 dark:text-sky-400 [&>svg]:translate-y-0">
        <CircleAlertIcon />
        <AlertTitle className="flex-1">{t(dict, "demos.alerts.newMessage")}</AlertTitle>
        <Button
          variant="outline"
          className="h-7 cursor-pointer rounded-md border-sky-600/40 px-2 text-sky-600! hover:bg-sky-600/10 dark:border-sky-400/45 dark:text-sky-400! dark:hover:bg-sky-400/10"
        >
          {t(dict, "demos.alerts.btnLink")}
          <ArrowRightIcon />
        </Button>
      </Alert>

      {/* --- 变体16: 无图标 --- */}
      <Alert>
        <AlertTitle>{t(dict, "demos.alerts.newMessage")}</AlertTitle>
      </Alert>

      {/* --- 变体17: 带描述(创建账户) --- */}
      <Alert>
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.creatingAccount")}</AlertTitle>
        <AlertDescription>{t(dict, "demos.alerts.fillDetails")}</AlertDescription>
      </Alert>
    </div>
  )
}

描边彩色

Alert 提供两种变体:default 用于信息提示,destructive 用于错误警告。

描边彩色

tsx
import { getDocsDict, t } from "@/lib/docs-i18n"
import { Alert, AlertTitle, AlertDescription } from "@polyui/react/alert"
import { CircleAlertIcon, TriangleAlertIcon, CheckCheckIcon } from "lucide-react"
export function AlertOutlineColored({ lang = "zh" }: { lang?: Lang }) {
  const dict = getDocsDict(lang)
  return (
    <div className="flex flex-col gap-3 w-full max-w-lg">
      <p className="text-xs font-mono text-muted-foreground uppercase tracking-widest mt-2 mb-2">
        {t(dict, "demos.alerts.sectionOutlineColored")}
      </p>

      {/* --- 变体18: 蓝色信息带描述 --- */}
      <Alert className="border-sky-600/30 bg-sky-600/5 text-sky-600 dark:border-sky-400/35 dark:bg-sky-400/5 dark:text-sky-400">
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.verifyEmail")}</AlertTitle>
        <AlertDescription className="text-sky-600/80 dark:text-sky-400/80">
          {t(dict, "demos.alerts.confirmationSent")}
        </AlertDescription>
      </Alert>

      {/* --- 变体19: 绿色成功带描述 --- */}
      <Alert className="border-green-600/30 bg-green-600/5 text-green-600 dark:border-green-400/35 dark:bg-green-400/5 dark:text-green-400">
        <CheckCheckIcon />
        <AlertTitle>{t(dict, "demos.alerts.accountCreated")}</AlertTitle>
        <AlertDescription className="text-green-600/80 dark:text-green-400/80">
          {t(dict, "demos.alerts.allSet")}
        </AlertDescription>
      </Alert>

      {/* --- 变体20: Amber 警告带描述 --- */}
      <Alert className="border-amber-600/30 bg-amber-600/5 text-amber-600 dark:border-amber-400/35 dark:bg-amber-400/5 dark:text-amber-400">
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.passwordWeak")}</AlertTitle>
        <AlertDescription className="text-amber-600/80 dark:text-amber-400/80">
          {t(dict, "demos.alerts.passwordTip")}
        </AlertDescription>
      </Alert>

      {/* --- 变体14: Destructive 变体 --- */}
      <Alert variant="destructive">
        <TriangleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.somethingWrong")}</AlertTitle>
      </Alert>

      {/* --- 变体15: Destructive 带边框 --- */}
      <Alert variant="destructive" className="border-destructive/50">
        <TriangleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.paymentFailed")}</AlertTitle>
      </Alert>
    </div>
  )
}

柔和

柔和

tsx
import { getDocsDict, t } from "@/lib/docs-i18n"
import { Alert, AlertTitle, AlertDescription } from "@polyui/react/alert"
import { CircleAlertIcon, TriangleAlertIcon, CheckCheckIcon } from "lucide-react"
export function AlertSoft({ lang = "zh" }: { lang?: Lang }) {
  const dict = getDocsDict(lang)
  return (
    <div className="flex flex-col gap-3 w-full max-w-lg">
      <p className="text-xs font-mono text-muted-foreground uppercase tracking-widest mt-2 mb-2">
        {t(dict, "demos.alerts.sectionSoft")}
      </p>

      {/* --- 变体21: Soft primary --- */}
      <Alert className="bg-primary/10 border-none">
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.fileTypeTitle")}</AlertTitle>
        <AlertDescription>{t(dict, "demos.alerts.fileTypeDesc")}</AlertDescription>
      </Alert>

      {/* --- 变体22: Soft 蓝色信息 --- */}
      <Alert className="border-none bg-sky-600/10 text-sky-600 dark:bg-sky-400/10 dark:text-sky-400">
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.fileTypesAllowed")}</AlertTitle>
        <AlertDescription className="text-sky-600/80 dark:text-sky-400/80">
          {t(dict, "demos.alerts.fileTypesDesc")}
        </AlertDescription>
      </Alert>

      {/* --- 变体23: Soft 绿色成功 --- */}
      <Alert className="border-none bg-green-600/10 text-green-600 dark:bg-green-400/10 dark:text-green-400">
        <CheckCheckIcon />
        <AlertTitle>{t(dict, "demos.alerts.fileUploaded")}</AlertTitle>
        <AlertDescription className="text-green-600/80 dark:text-green-400/80">
          {t(dict, "demos.alerts.fileUploadedDesc")}
        </AlertDescription>
      </Alert>

      {/* --- 变体24: Soft Amber 警告 --- */}
      <Alert className="border-none bg-amber-600/10 text-amber-600 dark:bg-amber-400/10 dark:text-amber-400">
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.fileTooLarge")}</AlertTitle>
        <AlertDescription className="text-amber-600/80 dark:text-amber-400/80">
          {t(dict, "demos.alerts.fileTooLargeDesc")}
        </AlertDescription>
      </Alert>

      {/* --- 变体25: Soft 危险 --- */}
      <Alert className="bg-destructive/10 text-destructive border-none">
        <TriangleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.uploadFailed")}</AlertTitle>
        <AlertDescription className="text-destructive/80">{t(dict, "demos.alerts.uploadFailedDesc")}</AlertDescription>
      </Alert>
    </div>
  )
}

实色

实心

tsx
import { getDocsDict, t } from "@/lib/docs-i18n"
import { Alert, AlertTitle, AlertDescription } from "@polyui/react/alert"
import { CircleAlertIcon, TriangleAlertIcon, CheckCheckIcon } from "lucide-react"
export function AlertSolid({ lang = "zh" }: { lang?: Lang }) {
  const dict = getDocsDict(lang)
  return (
    <div className="flex flex-col gap-3 w-full max-w-lg">
      <p className="text-xs font-mono text-muted-foreground uppercase tracking-widest mt-2 mb-2">
        {t(dict, "demos.alerts.sectionSolid")}
      </p>

      {/* --- 变体26: Solid primary --- */}
      <Alert className="bg-primary text-primary-foreground border-none">
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.editingProfile")}</AlertTitle>
        <AlertDescription className="text-primary-foreground/80">
          {t(dict, "demos.alerts.editingProfileDesc")}
        </AlertDescription>
      </Alert>

      {/* --- 变体27: Solid 绿色成功 --- */}
      <Alert className="border-none bg-green-600 text-white dark:bg-green-400">
        <CheckCheckIcon />
        <AlertTitle>{t(dict, "demos.alerts.profileUpdated")}</AlertTitle>
        <AlertDescription className="text-white/80">{t(dict, "demos.alerts.profileUpdatedDesc")}</AlertDescription>
      </Alert>

      {/* --- 变体28: Solid Amber 警告 --- */}
      <Alert className="border-none bg-amber-600 text-white dark:bg-amber-400">
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.detailsMissing")}</AlertTitle>
        <AlertDescription className="text-white/80">{t(dict, "demos.alerts.detailsMissingDesc")}</AlertDescription>
      </Alert>

      {/* --- 变体29: Solid 蓝色信息 --- */}
      <Alert className="border-none bg-sky-600 text-white dark:bg-sky-400">
        <CircleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.profileVisible")}</AlertTitle>
        <AlertDescription className="text-white/80">{t(dict, "demos.alerts.profileVisibleDesc")}</AlertDescription>
      </Alert>

      {/* --- 变体30: Solid 危险 --- */}
      <Alert className="bg-destructive dark:bg-destructive/60 border-none text-white">
        <TriangleAlertIcon />
        <AlertTitle>{t(dict, "demos.alerts.couldntSave")}</AlertTitle>
        <AlertDescription className="text-white/80">{t(dict, "demos.alerts.couldntSaveDesc")}</AlertDescription>
      </Alert>
    </div>
  )
}

特殊效果

特殊

tsx
import { getDocsDict, t } from "@/lib/docs-i18n"
import { Alert, AlertTitle, AlertDescription } from "@polyui/react/alert"
import { Button } from "@polyui/react/button"
import { CircleAlertIcon, FileWarningIcon, UserCheckIcon, UserRoundXIcon, BellIcon, UploadIcon } from "lucide-react"
export function AlertSpecial({ lang = "zh" }: { lang?: Lang }) {
  const dict = getDocsDict(lang)
  return (
    <div className="flex flex-col gap-3 w-full max-w-lg">
      <p className="text-xs font-mono text-muted-foreground uppercase tracking-widest mt-2 mb-2">
        {t(dict, "demos.alerts.sectionSpecial")}
      </p>

      {/* --- 变体5: 附加图标栏 (attached icon) --- */}
      <Alert className="flex items-stretch p-0">
        <div className="bg-destructive/10 text-destructive flex items-center rounded-l-lg border-r p-2">
          <FileWarningIcon className="size-4" />
        </div>
        <AlertTitle className="p-3">{t(dict, "demos.alerts.fileVirus")}</AlertTitle>
      </Alert>

      {/* --- 变体6: 图标 Avatar 聚焦样式 --- */}
      <Alert className="flex items-center gap-3">
        <div className="flex size-8 shrink-0 items-center justify-center rounded-md bg-destructive/10 text-destructive dark:bg-destructive/20">
          <FileWarningIcon className="size-4" />
        </div>
        <AlertTitle>{t(dict, "demos.alerts.fileVirus")}</AlertTitle>
      </Alert>

      {/* --- 变体7: 实心 primary — 多操作 --- */}
      <Alert className="bg-primary text-primary-foreground flex justify-between border-none">
        <CircleAlertIcon />
        <div className="flex flex-1 flex-col gap-4">
          <div className="flex-1 flex-col justify-center gap-1">
            <AlertTitle>{t(dict, "demos.alerts.newUpdate")}</AlertTitle>
            <AlertDescription className="text-primary-foreground/80">
              {t(dict, "demos.alerts.newUpdateDesc")}
            </AlertDescription>
          </div>
          <div className="flex items-center gap-4">
            <Button className="bg-secondary/10 hover:bg-secondary/20 h-7 cursor-pointer rounded-md px-2">
              {t(dict, "demos.alerts.btnSkipUpdate")}
            </Button>
            <Button variant="secondary" className="h-7 cursor-pointer rounded-md px-2">
              {t(dict, "demos.alerts.btnInstallNow")}
            </Button>
          </div>
        </div>
      </Alert>

      {/* --- 变体8: 上传进度 --- */}
      <Alert className="flex justify-between">
        <UploadIcon />
        <div className="flex flex-1 flex-col gap-4">
          <div className="flex-1 flex-col justify-center gap-1">
            <AlertTitle>{t(dict, "demos.alerts.uploadingFile")}</AlertTitle>
            <AlertDescription>{t(dict, "demos.alerts.uploadingFileDesc")}</AlertDescription>
          </div>
          <div className="h-1.5 w-full overflow-hidden rounded-full bg-sky-600/20">
            <div className="h-full w-1/2 rounded-full bg-sky-600 dark:bg-sky-400" />
          </div>
        </div>
      </Alert>

      {/* --- 变体9: 渐变背景 --- */}
      <Alert className="border-accent-foreground/20 bg-accent text-accent-foreground flex justify-between">
        <CircleAlertIcon />
        <div className="flex flex-1 flex-col gap-1">
          <AlertTitle>{t(dict, "demos.alerts.verifyEmail")}</AlertTitle>
          <AlertDescription className="text-accent-foreground/60">
            {t(dict, "demos.alerts.confirmationSent")}
          </AlertDescription>
        </div>
      </Alert>

      {/* --- 变体10: 左侧指示条 — 成功绿色 --- */}
      <Alert className="rounded-md border-l-4 border-green-600 bg-green-600/10 text-green-600 dark:border-green-400 dark:bg-green-400/10 dark:text-green-400">
        <UserCheckIcon />
        <AlertTitle>{t(dict, "demos.alerts.requestApproved")}</AlertTitle>
      </Alert>

      {/* --- 变体11: 左侧指示条 — 危险红色 --- */}
      <Alert className="border-destructive bg-destructive/10 text-destructive rounded-none border-0 border-l-4">
        <UserRoundXIcon />
        <AlertTitle>{t(dict, "demos.alerts.requestDenied")}</AlertTitle>
      </Alert>

      {/* --- 变体12: 铃铛通知 — 带描述 --- */}
      <Alert>
        <BellIcon />
        <AlertTitle>{t(dict, "demos.alerts.systemNotification")}</AlertTitle>
        <AlertDescription>{t(dict, "demos.alerts.systemNotificationDesc")}</AlertDescription>
      </Alert>
    </div>
  )
}

属性

Alert

属性类型默认值说明
variant"default" | "destructive""default"提示条的视觉变体

AlertTitle

属性类型默认值说明
classNamestring自定义样式类名

AlertDescription

属性类型默认值说明
classNamestring自定义样式类名