{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "alert",
  "type": "registry:ui",
  "title": "Alert",
  "description": "Boxed informational / success / warning / error message. Five variants + live-region politeness (off / polite / assertive).",
  "files": [
    {
      "path": "registry/ui/alert.tsx",
      "type": "registry:ui",
      "target": "components/ui/alert.tsx",
      "content": "/** @jsxImportSource hono/jsx */\nimport type { PropsWithChildren } from \"hono/jsx\"\nimport { cn, type ClassValue } from \"@/registry/lib/cn\"\n\n// Alert — shadcn-htmx, htmx v4 + Tailwind v4.\n//\n// Source of truth (visual layout):\n//   repos/shadcn-ui/apps/v4/registry/new-york-v4/ui/alert.tsx\n//\n// Spec divergence from upstream — important: shadcn hardcodes role=\"alert\"\n// on every instance. That role is implicit aria-live=\"assertive\" and\n// interrupts the user's current screen-reader output. APG and WCAG advice\n// is to reserve \"assertive\" announcements for genuinely time-sensitive\n// content (errors after submit, lost connection). For typical\n// informational messages (\"Saved\", \"Filter updated\") \"polite\" is correct;\n// for static page content that's there on load, no role at all is\n// correct. So we expose `live` and default to \"polite\" (role=\"status\").\n//\n// Refs:\n//   repos/aria-practices/content/patterns/alert/  (\"alert\" role guidance)\n//   repos/mdn/files/en-us/web/accessibility/aria/reference/roles/alert_role/\n//   repos/mdn/files/en-us/web/accessibility/aria/reference/roles/status_role/\n//   repos/mdn/files/en-us/web/accessibility/aria/reference/attributes/aria-live/\n//\n// Composition (matches shadcn):\n//   <Alert>\n//     <SomeIcon />\n//     <AlertTitle>Heads up!</AlertTitle>\n//     <AlertDescription>Body of the alert…</AlertDescription>\n//   </Alert>\n\nexport type AlertVariant = \"default\" | \"destructive\" | \"success\" | \"warning\" | \"info\"\n\n// \"off\"      — static informational content; no aria-live region.\n// \"polite\"   — implicit role=\"status\". AT waits until idle to announce.\n// \"assertive\"— implicit role=\"alert\". AT interrupts current speech. Use sparingly.\nexport type AlertLive = \"off\" | \"polite\" | \"assertive\"\n\nconst base =\n  \"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm \" +\n  \"has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 \" +\n  \"[&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\"\n\nconst variants: Record<AlertVariant, string> = {\n  default: \"bg-card text-card-foreground\",\n  destructive:\n    \"border-destructive/30 bg-destructive/5 text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current\",\n  success:\n    \"border-emerald-500/30 bg-emerald-500/5 text-emerald-700 *:data-[slot=alert-description]:text-emerald-700/90 dark:text-emerald-300 dark:*:data-[slot=alert-description]:text-emerald-300/90 [&>svg]:text-current\",\n  warning:\n    \"border-amber-500/30 bg-amber-500/10 text-amber-800 *:data-[slot=alert-description]:text-amber-800/90 dark:text-amber-200 dark:*:data-[slot=alert-description]:text-amber-200/90 [&>svg]:text-current\",\n  info:\n    \"border-sky-500/30 bg-sky-500/5 text-sky-800 *:data-[slot=alert-description]:text-sky-800/90 dark:text-sky-200 dark:*:data-[slot=alert-description]:text-sky-200/90 [&>svg]:text-current\",\n}\n\nexport function alertClasses(opts?: {\n  variant?: AlertVariant\n  class?: ClassValue\n}): string {\n  const variant = opts?.variant ?? \"default\"\n  return cn(base, variants[variant], opts?.class)\n}\n\ntype AlertProps = PropsWithChildren<{\n  variant?: AlertVariant\n  // ARIA live-region politeness. \"polite\" (default) sets role=\"status\".\n  // \"assertive\" sets role=\"alert\". \"off\" omits both — use for static info.\n  live?: AlertLive\n  // Override the role directly if you need something unusual; takes\n  // precedence over `live`.\n  role?: \"alert\" | \"status\" | \"log\" | \"none\"\n  // Most alerts contain the full message at render time, so aria-atomic\n  // defaults to true (read the whole alert, not just changed bits).\n  ariaAtomic?: boolean\n  // Name the live region for AT. Point ariaLabelledby at the id of the\n  // AlertTitle inside, or pass ariaLabel for a literal name.\n  // status_role lists aria-label / aria-labelledby as associated properties:\n  // repos/mdn/files/en-us/web/accessibility/aria/reference/roles/status_role/index.md:28-29\n  ariaLabelledby?: string\n  ariaLabel?: string\n  id?: string\n  class?: ClassValue\n}>\n\nexport function Alert(props: AlertProps) {\n  const {\n    children,\n    variant,\n    live = \"polite\",\n    role: roleOverride,\n    ariaAtomic = true,\n    ariaLabelledby,\n    ariaLabel,\n    id,\n    class: className,\n  } = props\n  // Map live → role + aria-live. Both attributes communicate the same\n  // thing; some older AT pays attention to one and not the other, so we\n  // set both for resilience.\n  const role =\n    roleOverride ??\n    (live === \"assertive\" ? \"alert\" : live === \"polite\" ? \"status\" : undefined)\n  const ariaLive = live === \"off\" ? undefined : live\n  return (\n    <div\n      id={id}\n      data-slot=\"alert\"\n      data-variant={variant ?? \"default\"}\n      role={role}\n      aria-live={ariaLive}\n      aria-atomic={ariaAtomic ? \"true\" : undefined}\n      aria-labelledby={ariaLabelledby}\n      aria-label={ariaLabel}\n      class={alertClasses({ variant, class: className })}\n    >\n      {children}\n    </div>\n  )\n}\n\nexport function AlertTitle(\n  props: PropsWithChildren<{ class?: ClassValue }>,\n) {\n  return (\n    <div\n      data-slot=\"alert-title\"\n      class={cn(\n        \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n        props.class,\n      )}\n    >\n      {props.children}\n    </div>\n  )\n}\n\nexport function AlertDescription(\n  props: PropsWithChildren<{ class?: ClassValue }>,\n) {\n  return (\n    <div\n      data-slot=\"alert-description\"\n      class={cn(\n        \"col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed\",\n        props.class,\n      )}\n    >\n      {props.children}\n    </div>\n  )\n}\n"
    },
    {
      "path": "registry/jinja2/alert.html",
      "type": "registry:file",
      "target": "templates/components/alert.html",
      "content": "{# Alert macros — shadcn-htmx, htmx v4 + Tailwind v4.\n   Mirrors registry/ui/alert.tsx.\n\n   - live=\"polite\"    (default) → role=\"status\",  aria-live=\"polite\"\n   - live=\"assertive\"           → role=\"alert\",   aria-live=\"assertive\"\n   - live=\"off\"                 → no role; static informational content\n\n   Usage:\n     {% from \"components/alert.html\" import alert_open, alert_close, alert_title, alert_description %}\n\n     {{ alert_open(variant=\"success\") }}\n       {{ alert_title(\"Saved\") }}\n       {{ alert_description(\"Your changes have been recorded.\") }}\n     {{ alert_close() }} #}\n\n{# aria_labelledby / aria_label name the live region for AT — point\n   aria_labelledby at the id of an alert_title, or pass aria_label.\n   status_role associated properties:\n   repos/mdn/files/en-us/web/accessibility/aria/reference/roles/status_role/index.md:28-29 #}\n{% macro alert_open(\n    variant=\"default\",\n    live=\"polite\",\n    role=none,\n    aria_atomic=true,\n    aria_labelledby=none,\n    aria_label=none,\n    id=none,\n    extra_class=\"\"\n) -%}\n{%- set base -%}\nrelative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\n{%- endset -%}\n{%- set variants = {\n    \"default\": \"bg-card text-card-foreground\",\n    \"destructive\": \"border-destructive/30 bg-destructive/5 text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current\",\n    \"success\": \"border-emerald-500/30 bg-emerald-500/5 text-emerald-700 *:data-[slot=alert-description]:text-emerald-700/90 dark:text-emerald-300 dark:*:data-[slot=alert-description]:text-emerald-300/90 [&>svg]:text-current\",\n    \"warning\": \"border-amber-500/30 bg-amber-500/10 text-amber-800 *:data-[slot=alert-description]:text-amber-800/90 dark:text-amber-200 dark:*:data-[slot=alert-description]:text-amber-200/90 [&>svg]:text-current\",\n    \"info\": \"border-sky-500/30 bg-sky-500/5 text-sky-800 *:data-[slot=alert-description]:text-sky-800/90 dark:text-sky-200 dark:*:data-[slot=alert-description]:text-sky-200/90 [&>svg]:text-current\"\n} -%}\n{%- set computed_role = role or ({\"assertive\":\"alert\",\"polite\":\"status\",\"off\":none}[live]) -%}\n<div\n  {%- if id %} id=\"{{ id }}\"{% endif %}\n  data-slot=\"alert\"\n  data-variant=\"{{ variant }}\"\n  {%- if computed_role %} role=\"{{ computed_role }}\"{% endif %}\n  {%- if live != \"off\" %} aria-live=\"{{ live }}\"{% endif %}\n  {%- if aria_atomic %} aria-atomic=\"true\"{% endif %}\n  {%- if aria_labelledby %} aria-labelledby=\"{{ aria_labelledby }}\"{% endif %}\n  {%- if aria_label %} aria-label=\"{{ aria_label }}\"{% endif %}\n  class=\"{{ base }} {{ variants[variant] }} {{ extra_class }}\">\n{%- endmacro %}\n\n{% macro alert_close() %}</div>{% endmacro %}\n\n{% macro alert_title(text, extra_class=\"\") -%}\n<div data-slot=\"alert-title\" class=\"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight {{ extra_class }}\">{{ text }}</div>\n{%- endmacro %}\n\n{% macro alert_description(text, extra_class=\"\") -%}\n<div data-slot=\"alert-description\" class=\"col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed {{ extra_class }}\">{{ text }}</div>\n{%- endmacro %}\n"
    },
    {
      "path": "registry/go-templates/alert.tmpl",
      "type": "registry:file",
      "target": "components/alert.tmpl",
      "content": "{{/*\n  Alert template — shadcn-htmx, htmx v4 + Tailwind v4.\n  Mirrors registry/ui/alert.tsx.\n\n      type AlertArgs struct {\n          Variant   string // default | destructive | success | warning | info\n          Live      string // off | polite (default) | assertive\n          Role      string // override; one of alert | status | log | none\n          Title     string\n          Body      template.HTML\n          AriaAtomic *bool  // nil = default true (read full alert); set to &false to omit\n          // Name the live region for AT: AriaLabelledby points at an\n          // alert-title id; AriaLabel is a literal name. status_role\n          // associated properties:\n          //   repos/mdn/.../roles/status_role/index.md:28-29\n          AriaLabelledby string\n          AriaLabel      string\n          ID        string\n      }\n*/}}\n\n{{define \"alert\"}}\n{{- $variant := or .Variant \"default\" -}}\n{{- $live := or .Live \"polite\" -}}\n{{- $ariaAtomic := true -}}{{- if ne .AriaAtomic nil -}}{{- $ariaAtomic = deref .AriaAtomic -}}{{- end -}}\n{{- $base := \"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\" -}}\n{{- $variants := dict\n    \"default\" \"bg-card text-card-foreground\"\n    \"destructive\" \"border-destructive/30 bg-destructive/5 text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current\"\n    \"success\" \"border-emerald-500/30 bg-emerald-500/5 text-emerald-700 *:data-[slot=alert-description]:text-emerald-700/90 dark:text-emerald-300 dark:*:data-[slot=alert-description]:text-emerald-300/90 [&>svg]:text-current\"\n    \"warning\" \"border-amber-500/30 bg-amber-500/10 text-amber-800 *:data-[slot=alert-description]:text-amber-800/90 dark:text-amber-200 dark:*:data-[slot=alert-description]:text-amber-200/90 [&>svg]:text-current\"\n    \"info\" \"border-sky-500/30 bg-sky-500/5 text-sky-800 *:data-[slot=alert-description]:text-sky-800/90 dark:text-sky-200 dark:*:data-[slot=alert-description]:text-sky-200/90 [&>svg]:text-current\" -}}\n{{- $role := .Role -}}\n{{- if not $role -}}\n  {{- if eq $live \"assertive\" -}}{{- $role = \"alert\" -}}\n  {{- else if eq $live \"polite\" -}}{{- $role = \"status\" -}}\n  {{- end -}}\n{{- end -}}\n<div {{if .ID}}id=\"{{.ID}}\"{{end}}\n     data-slot=\"alert\" data-variant=\"{{$variant}}\"\n     {{if $role}}role=\"{{$role}}\"{{end}}\n     {{if ne $live \"off\"}}aria-live=\"{{$live}}\"{{end}}\n     {{if $ariaAtomic}}aria-atomic=\"true\"{{end}}\n     {{if .AriaLabelledby}}aria-labelledby=\"{{.AriaLabelledby}}\"{{end}}\n     {{if .AriaLabel}}aria-label=\"{{.AriaLabel}}\"{{end}}\n     class=\"{{$base}} {{index $variants $variant}}\">\n  {{- if .Title}}<div data-slot=\"alert-title\" class=\"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\">{{.Title}}</div>{{end}}\n  {{- if .Body}}<div data-slot=\"alert-description\" class=\"col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed\">{{.Body}}</div>{{end}}\n</div>\n{{end}}\n"
    },
    {
      "path": "registry/phoenix/alert.ex",
      "type": "registry:file",
      "target": "lib/my_app_web/components/alert.ex",
      "content": "defmodule ShadcnHtmx.Components.Alert do\n  @moduledoc \"\"\"\n  Alert — shadcn-htmx, htmx v4 + Tailwind v4 for Phoenix.\n\n  Mirrors registry/ui/alert.tsx. Spec-divergence note: shadcn upstream\n  hardcodes role=\"alert\" (assertive). We expose `live` so polite/static\n  cases use role=\"status\" or no role, per APG.\n\n  ## Examples\n\n      <.alert variant=\"success\">\n        <.alert_title>Saved</.alert_title>\n        <.alert_description>Your changes have been recorded.</.alert_description>\n      </.alert>\n\n      # Truly time-critical — interrupts AT\n      <.alert variant=\"destructive\" live=\"assertive\">\n        <.alert_title>Connection lost</.alert_title>\n        <.alert_description>Trying to reconnect…</.alert_description>\n      </.alert>\n  \"\"\"\n\n  use Phoenix.Component\n\n  @base \"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm \" <>\n          \"has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 \" <>\n          \"[&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\"\n\n  @variants %{\n    \"default\" => \"bg-card text-card-foreground\",\n    \"destructive\" =>\n      \"border-destructive/30 bg-destructive/5 text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current\",\n    \"success\" =>\n      \"border-emerald-500/30 bg-emerald-500/5 text-emerald-700 *:data-[slot=alert-description]:text-emerald-700/90 dark:text-emerald-300 dark:*:data-[slot=alert-description]:text-emerald-300/90 [&>svg]:text-current\",\n    \"warning\" =>\n      \"border-amber-500/30 bg-amber-500/10 text-amber-800 *:data-[slot=alert-description]:text-amber-800/90 dark:text-amber-200 dark:*:data-[slot=alert-description]:text-amber-200/90 [&>svg]:text-current\",\n    \"info\" =>\n      \"border-sky-500/30 bg-sky-500/5 text-sky-800 *:data-[slot=alert-description]:text-sky-800/90 dark:text-sky-200 dark:*:data-[slot=alert-description]:text-sky-200/90 [&>svg]:text-current\"\n  }\n\n  attr :variant, :string, default: \"default\", values: ~w(default destructive success warning info)\n  attr :live, :string, default: \"polite\", values: ~w(off polite assertive)\n  attr :role, :string, default: nil\n  attr :aria_atomic, :boolean, default: true\n  # Name the live region for AT: aria_labelledby points at an alert_title id,\n  # aria_label is a literal name. status_role associated properties —\n  # repos/mdn/files/en-us/web/accessibility/aria/reference/roles/status_role/index.md:28-29\n  attr :aria_labelledby, :string, default: nil\n  attr :aria_label, :string, default: nil\n  attr :class, :string, default: nil\n  attr :rest, :global\n  slot :inner_block, required: true\n\n  def alert(assigns) do\n    role =\n      assigns.role ||\n        case assigns.live do\n          \"assertive\" -> \"alert\"\n          \"polite\" -> \"status\"\n          _ -> nil\n        end\n\n    assigns =\n      assigns\n      |> assign(:variant_class, Map.fetch!(@variants, assigns.variant))\n      |> assign(:base, @base)\n      |> assign(:computed_role, role)\n\n    ~H\"\"\"\n    <div\n      data-slot=\"alert\"\n      data-variant={@variant}\n      role={@computed_role}\n      aria-live={if @live != \"off\", do: @live}\n      aria-atomic={if @aria_atomic, do: \"true\"}\n      aria-labelledby={@aria_labelledby}\n      aria-label={@aria_label}\n      class={[@base, @variant_class, @class]}\n      {@rest}\n    >\n      {render_slot(@inner_block)}\n    </div>\n    \"\"\"\n  end\n\n  attr :class, :string, default: nil\n  slot :inner_block, required: true\n\n  def alert_title(assigns) do\n    ~H\"\"\"\n    <div\n      data-slot=\"alert-title\"\n      class={[\"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\", @class]}\n    >\n      {render_slot(@inner_block)}\n    </div>\n    \"\"\"\n  end\n\n  attr :class, :string, default: nil\n  slot :inner_block, required: true\n\n  def alert_description(assigns) do\n    ~H\"\"\"\n    <div\n      data-slot=\"alert-description\"\n      class={[\n        \"col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed\",\n        @class\n      ]}\n    >\n      {render_slot(@inner_block)}\n    </div>\n    \"\"\"\n  end\nend\n"
    },
    {
      "path": "registry/html/alert.html",
      "type": "registry:file",
      "target": "snippets/alert.html",
      "content": "<!--\n  shadcn-htmx — raw HTML alert snippets.\n\n  Spec note (important): shadcn upstream hardcodes role=\"alert\" (assertive,\n  interrupts screen reader). APG prefers role=\"status\" (polite) for most\n  informational messages, and no role at all for static content. Pick:\n\n    - role=\"status\"  + aria-live=\"polite\"     — \"Saved\", \"Filter applied\"\n    - role=\"alert\"   + aria-live=\"assertive\"  — \"Connection lost\", critical errors\n    - (no role)                               — static page-load content\n\n  BASE:\n    relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5\n    rounded-lg border px-4 py-3 text-sm\n    has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3\n    [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\n-->\n\n<!-- Default (polite) -->\n<div data-slot=\"alert\" data-variant=\"default\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"\n  class=\"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border bg-card px-4 py-3 text-sm text-card-foreground has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\">\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n    <circle cx=\"12\" cy=\"12\" r=\"10\" />\n    <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n    <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n  </svg>\n  <div data-slot=\"alert-title\" class=\"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\">Heads up</div>\n  <div data-slot=\"alert-description\" class=\"col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed\">\n    You can add components to your app using the CLI.\n  </div>\n</div>\n\n<!-- Destructive (assertive — critical error) -->\n<div data-slot=\"alert\" data-variant=\"destructive\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\"\n  class=\"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border border-destructive/30 bg-destructive/5 px-4 py-3 text-sm text-destructive has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\">\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n    <circle cx=\"12\" cy=\"12\" r=\"10\" />\n    <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n    <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n  </svg>\n  <div data-slot=\"alert-title\" class=\"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\">Connection lost</div>\n  <div data-slot=\"alert-description\" class=\"col-start-2 grid justify-items-start gap-1 text-sm text-destructive/90\">\n    Trying to reconnect…\n  </div>\n</div>\n\n<!-- Named live region: aria-labelledby points at the title so AT prefaces\n     the announcement with it. status_role associated properties —\n     repos/mdn/files/en-us/web/accessibility/aria/reference/roles/status_role/index.md:28-29 -->\n<div data-slot=\"alert\" data-variant=\"info\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" aria-labelledby=\"alert-deploy-title\"\n  class=\"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border border-sky-500/30 bg-sky-500/5 px-4 py-3 text-sm text-sky-800 dark:text-sky-200 has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\">\n  <div id=\"alert-deploy-title\" data-slot=\"alert-title\" class=\"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\">Deploy finished</div>\n  <div data-slot=\"alert-description\" class=\"col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed\">\n    Your site is live.\n  </div>\n</div>\n"
    }
  ]
}
