{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "alert-dialog",
  "type": "registry:ui",
  "title": "Alert Dialog",
  "description": "A modal that interrupts the user to confirm a consequential action. Native HTML <dialog> opened with showModal() and role=\"alertdialog\"; not light-dismissible — the user must choose Cancel or the confirming action.",
  "registryDependencies": [
    "utils"
  ],
  "files": [
    {
      "path": "registry/ui/alert-dialog.tsx",
      "type": "registry:ui",
      "target": "components/ui/alert-dialog.tsx",
      "content": "/** @jsxImportSource hono/jsx */\nimport type { Child, PropsWithChildren } from \"hono/jsx\"\nimport { cn, type ClassValue } from \"@/registry/lib/cn\"\n\n// AlertDialog — shadcn-htmx, htmx v4 + Tailwind v4.\n//\n// shadcn source of truth: repos/shadcn-ui/apps/v4/registry/new-york-v4/ui/\n// alert-dialog.tsx (Radix AlertDialog). We mirror its anatomy\n// (Trigger / Content / Header / Title / Description / Footer / Action /\n// Cancel) but ship a native HTML <dialog> instead of a Radix portal.\n//\n// APG pattern: repos/aria-practices/content/patterns/alertdialog/\n// alertdialog-pattern.html. An alert dialog is a *modal* dialog that\n// interrupts the workflow to acquire a response, so APG requires:\n//   - role=\"alertdialog\"        (announced with higher urgency than dialog)\n//   - aria-modal=\"true\"         (set automatically by .showModal())\n//   - aria-labelledby -> title  (visible label)\n//   - aria-describedby -> body  (the alert message — REQUIRED, unlike dialog)\n// See alertdialog-pattern.html:44-61.\n//\n// Why native <dialog> + showModal():\n//   - Focus trap, ESC-to-close, focus restoration, the inert backdrop and\n//     aria-modal all come from the platform — no JS focus management.\n//     (repos/mdn/files/en-us/web/api/htmldialogelement/showmodal/.)\n//\n// HOW IT DIFFERS FROM Dialog (registry/ui/dialog.tsx):\n//   - NOT light-dismissible. A modal opened with showModal() defaults to\n//     closedby=\"closerequest\" (ESC + code only, NO backdrop click) per the\n//     HTML Living Standard — repos/mdn/files/en-us/web/html/reference/\n//     elements/dialog/index.md:33-35. We pin closedby=\"closerequest\" to make\n//     that explicit and we do NOT emit the data-close-on-backdrop hook that\n//     site.js uses for Dialog, so a click on the backdrop never dismisses.\n//   - No X close button: APG requires an explicit Cancel / Confirm response.\n//   - Reuses Dialog's open/close wiring in public/site.js\n//     (data-dialog-trigger / data-dialog-close).\n//\n// Composition mirrors shadcn's React API:\n//   <AlertDialogTrigger dialogFor=\"confirm\">\n//     <Button variant=\"destructive\">Delete</Button>\n//   </AlertDialogTrigger>\n//\n//   <AlertDialog id=\"confirm\">\n//     <AlertDialogHeader>\n//       <AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>\n//       <AlertDialogDescription>This cannot be undone.</AlertDialogDescription>\n//     </AlertDialogHeader>\n//     <AlertDialogFooter>\n//       <AlertDialogCancel><Button variant=\"outline\">Cancel</Button></AlertDialogCancel>\n//       <AlertDialogAction><Button variant=\"destructive\">Delete</Button></AlertDialogAction>\n//     </AlertDialogFooter>\n//   </AlertDialog>\n\nconst alertDialogBase =\n  \"fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-50 m-0 w-[calc(100%-2rem)] max-w-lg \" +\n  \"grid gap-4 rounded-lg border bg-background p-6 text-foreground shadow-lg outline-none \" +\n  // Native <dialog> sits in the top layer; hide it when not open so layout\n  // doesn't shift.\n  \"hidden open:grid \" +\n  // ::backdrop styling — same token palette as Dialog.\n  \"backdrop:bg-black/60 backdrop:backdrop-blur-sm\"\n\nexport function alertDialogClasses(opts?: { class?: ClassValue }): string {\n  return cn(alertDialogBase, opts?.class)\n}\n\ntype AlertDialogProps = PropsWithChildren<{\n  id: string\n  // Pre-open on initial render (useful for htmx swaps that return an\n  // already-open alert dialog; site.js promotes <dialog open> to .showModal()).\n  open?: boolean\n  class?: ClassValue\n  // APG: name the alertdialog with EITHER aria-labelledby -> a visible title OR\n  // aria-label when there is no visible AlertDialogTitle (e.g. a short error\n  // alert). See alertdialog-pattern.html:47-57. When ariaLabel is set we omit\n  // the auto aria-labelledby fallback so the two naming mechanisms don't collide.\n  ariaLabel?: string\n  ariaLabelledby?: string\n  ariaDescribedby?: string\n}>\n\nexport function AlertDialog(props: AlertDialogProps) {\n  const {\n    id,\n    children,\n    open,\n    class: className,\n    ariaLabel,\n    ariaLabelledby,\n    ariaDescribedby,\n  } = props\n  return (\n    <dialog\n      id={id}\n      open={open}\n      class={alertDialogClasses({ class: className })}\n      data-slot=\"alert-dialog\"\n      // No data-close-on-backdrop: an alert dialog must require an explicit\n      // Cancel / Confirm response, so a backdrop click never dismisses it.\n      // Pin the native closedby so light dismiss stays off even if a future\n      // browser changes showModal() defaults.\n      // See repos/mdn/.../html/reference/elements/dialog/index.md:33-35.\n      closedby=\"closerequest\"\n      // APG: the container carries role=\"alertdialog\"; .showModal() adds\n      // aria-modal=\"true\". See alertdialog-pattern.html:44-46.\n      role=\"alertdialog\"\n      // APG (alertdialog-pattern.html:47-57): aria-label OR aria-labelledby.\n      // An explicit ariaLabel wins and suppresses the id-title fallback so the\n      // dialog isn't named twice (and doesn't reference a missing title id).\n      aria-label={ariaLabel}\n      aria-labelledby={ariaLabel ? undefined : (ariaLabelledby ?? `${id}-title`)}\n      // REQUIRED by APG (alertdialog-pattern.html:58-60): the description\n      // refers to the element containing the alert message.\n      aria-describedby={ariaDescribedby ?? `${id}-description`}\n    >\n      {children}\n    </dialog>\n  )\n}\n\nexport function AlertDialogHeader(\n  props: PropsWithChildren<{ class?: ClassValue }>,\n) {\n  return (\n    <div\n      data-slot=\"alert-dialog-header\"\n      class={cn(\"flex flex-col gap-1.5 text-left\", props.class)}\n    >\n      {props.children}\n    </div>\n  )\n}\n\nexport function AlertDialogTitle(\n  props: PropsWithChildren<{ id?: string; class?: ClassValue }>,\n) {\n  return (\n    <h2\n      id={props.id}\n      data-slot=\"alert-dialog-title\"\n      class={cn(\"text-lg leading-none font-semibold\", props.class)}\n    >\n      {props.children}\n    </h2>\n  )\n}\n\nexport function AlertDialogDescription(\n  props: PropsWithChildren<{ id?: string; class?: ClassValue }>,\n) {\n  return (\n    <p\n      id={props.id}\n      data-slot=\"alert-dialog-description\"\n      class={cn(\"text-sm text-muted-foreground\", props.class)}\n    >\n      {props.children}\n    </p>\n  )\n}\n\nexport function AlertDialogFooter(\n  props: PropsWithChildren<{ class?: ClassValue }>,\n) {\n  return (\n    <div\n      data-slot=\"alert-dialog-footer\"\n      class={cn(\n        \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n        props.class,\n      )}\n    >\n      {props.children}\n    </div>\n  )\n}\n\n// Cancel — the non-destructive response. Wraps any single child (a Button\n// works) and attaches data-dialog-close so site.js calls .close() on the\n// nearest <dialog>. APG recommends focusing the least-destructive action;\n// authors should add `autofocus` to this button (see docs).\nexport function AlertDialogCancel(props: PropsWithChildren<{}>) {\n  return (\n    <span data-dialog-close=\"true\" class=\"contents\">\n      {props.children}\n    </span>\n  )\n}\n\n// Action — the confirming response. Also closes the dialog after its action\n// runs (e.g. an hx-* request fires on click; data-dialog-close dismisses).\n// Wrap a destructive Button for delete-style confirmations.\nexport function AlertDialogAction(props: PropsWithChildren<{}>) {\n  return (\n    <span data-dialog-close=\"true\" class=\"contents\">\n      {props.children}\n    </span>\n  )\n}\n\n// Trigger — clicks open the alert dialog whose id matches dialogFor. Shares\n// Dialog's site.js handler (data-dialog-trigger / data-dialog-target).\ntype AlertDialogTriggerProps = PropsWithChildren<{\n  dialogFor: string\n  class?: ClassValue\n  // \"wrapper\" (default — wraps the child so the parent can pass a styled\n  // Button) or \"button\" (render a native <button> with the provided class).\n  render?: \"wrapper\" | \"button\"\n  type?: \"button\" | \"submit\"\n  id?: string\n}>\nexport function AlertDialogTrigger(props: AlertDialogTriggerProps) {\n  const {\n    dialogFor,\n    render = \"wrapper\",\n    children,\n    class: className,\n    id,\n    type = \"button\",\n  } = props\n  if (render === \"button\") {\n    return (\n      <button\n        id={id}\n        type={type}\n        class={cn(className)}\n        data-dialog-trigger=\"true\"\n        data-dialog-target={dialogFor}\n        aria-haspopup=\"dialog\"\n      >\n        {children}\n      </button>\n    )\n  }\n  return (\n    <span\n      data-dialog-trigger=\"true\"\n      data-dialog-target={dialogFor}\n      class=\"contents\"\n    >\n      {children}\n    </span>\n  )\n}\n"
    },
    {
      "path": "registry/jinja2/alert-dialog.html",
      "type": "registry:file",
      "target": "templates/components/alert-dialog.html",
      "content": "{# AlertDialog macros — shadcn-htmx, htmx v4 + Tailwind v4.\n   Mirrors registry/ui/alert-dialog.tsx. Native <dialog> + .showModal()\n   (wiring in public/site.js: data-dialog-trigger / data-dialog-close).\n\n   Unlike dialog.html this is an *alert* dialog (APG alertdialog pattern):\n     - role=\"alertdialog\", aria-describedby is required (the message).\n     - NOT light-dismissible: no data-close-on-backdrop, closedby=\"closerequest\".\n     - No X button — the user must pick Cancel or the confirming action.\n\n   Usage:\n     {% from \"components/alert-dialog.html\" import alert_dialog, alert_dialog_trigger %}\n\n     {{ alert_dialog_trigger(\"Delete\", dialog_for=\"confirm\", class_=\"…btn classes\") }}\n\n     {% call alert_dialog(id=\"confirm\", title=\"Are you absolutely sure?\",\n                          description=\"This action cannot be undone.\") %}\n       <div class=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n         <button type=\"button\" data-dialog-close=\"true\"\n                 class=\"… button outline classes …\" autofocus>Cancel</button>\n         <button type=\"button\" data-dialog-close=\"true\"\n                 class=\"… button destructive classes …\"\n                 hx-post=\"/items/42/delete\">Delete</button>\n       </div>\n     {% endcall %} #}\n\n{% macro alert_dialog(\n    id,\n    title=none,\n    description=none,\n    open=false,\n    aria_label=none\n) %}\n{%- set base -%}\nfixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-50 m-0 w-[calc(100%-2rem)] max-w-lg grid gap-4 rounded-lg border bg-background p-6 text-foreground shadow-lg outline-none hidden open:grid backdrop:bg-black/60 backdrop:backdrop-blur-sm\n{%- endset -%}\n<dialog id=\"{{ id }}\"\n        {%- if open %} open{% endif %}\n        closedby=\"closerequest\"\n        role=\"alertdialog\"\n        class=\"{{ base }}\"\n        data-slot=\"alert-dialog\"\n        {#- APG (alertdialog-pattern.html:47-57): name via aria-label OR\n            aria-labelledby. An explicit aria_label suppresses the id-title\n            fallback so the dialog isn't named twice. #}\n        {%- if aria_label %} aria-label=\"{{ aria_label }}\"\n        {%- else %} aria-labelledby=\"{{ id }}-title\"{% endif %}\n        aria-describedby=\"{{ id }}-description\">\n  {%- if title or description %}\n  <div data-slot=\"alert-dialog-header\" class=\"flex flex-col gap-1.5 text-left\">\n    {% if title %}<h2 id=\"{{ id }}-title\" data-slot=\"alert-dialog-title\" class=\"text-lg leading-none font-semibold\">{{ title }}</h2>{% endif %}\n    {% if description %}<p id=\"{{ id }}-description\" data-slot=\"alert-dialog-description\" class=\"text-sm text-muted-foreground\">{{ description }}</p>{% endif %}\n  </div>\n  {%- endif %}\n  {{ caller() }}\n</dialog>\n{% endmacro %}\n\n{% macro alert_dialog_trigger(label, dialog_for, type=\"button\", id=none, class_=\"\") %}\n<button {% if id %} id=\"{{ id }}\"{% endif %}\n        type=\"{{ type }}\"\n        class=\"{{ class_ }}\"\n        data-dialog-trigger=\"true\"\n        data-dialog-target=\"{{ dialog_for }}\"\n        aria-haspopup=\"dialog\">{{ label }}</button>\n{% endmacro %}\n"
    },
    {
      "path": "registry/go-templates/alert-dialog.tmpl",
      "type": "registry:file",
      "target": "components/alert-dialog.tmpl",
      "content": "{{/*\n  AlertDialog template — shadcn-htmx, htmx v4 + Tailwind v4.\n  Mirrors registry/ui/alert-dialog.tsx.\n\n  Native <dialog> + .showModal() (wiring in public/site.js:\n  data-dialog-trigger / data-dialog-close). Unlike \"dialog\" this is an\n  *alert* dialog (APG alertdialog pattern):\n    - role=\"alertdialog\", aria-describedby is required (the message).\n    - NOT light-dismissible: no data-close-on-backdrop, closedby=\"closerequest\".\n    - No X button — the user must pick Cancel or the confirming action.\n\n  Usage:\n\n      type AlertDialogArgs struct {\n          ID, Title, Description string\n          Body                   template.HTML // already-rendered footer HTML\n          Open                   bool\n          // APG: name the dialog via aria-label when there is no visible Title\n          // (alertdialog-pattern.html:47-57). Suppresses the id-title fallback.\n          AriaLabel string\n      }\n\n      tpl.ExecuteTemplate(w, \"alert_dialog\", map[string]any{\n          \"ID\": \"confirm\", \"Title\": \"Are you absolutely sure?\",\n          \"Description\": \"This action cannot be undone.\",\n          \"Body\": template.HTML(`\n              <div class=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n                <button type=\"button\" data-dialog-close=\"true\" autofocus>Cancel</button>\n                <button type=\"button\" data-dialog-close=\"true\" hx-post=\"/items/42/delete\">Delete</button>\n              </div>`),\n      })\n\n  Companion: \"alert_dialog_trigger\" template (below) renders the open button.\n*/}}\n\n{{define \"alert_dialog\"}}\n{{- $base := \"fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-50 m-0 w-[calc(100%-2rem)] max-w-lg grid gap-4 rounded-lg border bg-background p-6 text-foreground shadow-lg outline-none hidden open:grid backdrop:bg-black/60 backdrop:backdrop-blur-sm\" -}}\n<dialog id=\"{{.ID}}\"\n        {{- if .Open}} open{{end}}\n        closedby=\"closerequest\"\n        role=\"alertdialog\"\n        class=\"{{$base}}\"\n        data-slot=\"alert-dialog\"\n        {{- /* APG (alertdialog-pattern.html:47-57): name via aria-label OR\n               aria-labelledby. An explicit .AriaLabel suppresses the id-title\n               fallback so the dialog isn't named twice. */}}\n        {{- if .AriaLabel}} aria-label=\"{{.AriaLabel}}\"\n        {{- else}} aria-labelledby=\"{{.ID}}-title\"{{end}}\n        aria-describedby=\"{{.ID}}-description\">\n  {{- if or .Title .Description}}\n  <div data-slot=\"alert-dialog-header\" class=\"flex flex-col gap-1.5 text-left\">\n    {{- if .Title}}\n    <h2 id=\"{{.ID}}-title\" data-slot=\"alert-dialog-title\" class=\"text-lg leading-none font-semibold\">{{.Title}}</h2>\n    {{- end}}\n    {{- if .Description}}\n    <p id=\"{{.ID}}-description\" data-slot=\"alert-dialog-description\" class=\"text-sm text-muted-foreground\">{{.Description}}</p>\n    {{- end}}\n  </div>\n  {{- end}}\n  {{.Body}}\n</dialog>\n{{end}}\n\n{{define \"alert_dialog_trigger\"}}\n<button {{if .ID}}id=\"{{.ID}}\"{{end}}\n        type=\"{{or .Type \"button\"}}\"\n        class=\"{{.Class}}\"\n        data-dialog-trigger=\"true\"\n        data-dialog-target=\"{{.DialogFor}}\"\n        aria-haspopup=\"dialog\">{{.Label}}</button>\n{{end}}\n"
    },
    {
      "path": "registry/phoenix/alert_dialog.ex",
      "type": "registry:file",
      "target": "lib/my_app_web/components/alert_dialog.ex",
      "content": "defmodule ShadcnHtmx.Components.AlertDialog do\n  @moduledoc \"\"\"\n  AlertDialog — shadcn-htmx, htmx v4 + Tailwind v4 for Phoenix.\n\n  Mirrors registry/ui/alert-dialog.tsx. Renders the native <dialog> element +\n  the data attributes public/site.js looks for to open / close\n  (data-dialog-trigger / data-dialog-close, shared with the Dialog component).\n\n  Unlike `Dialog`, this is an *alert* dialog\n  (repos/aria-practices/content/patterns/alertdialog/alertdialog-pattern.html):\n\n    - role=\"alertdialog\", aria-describedby is required (the alert message).\n    - NOT light-dismissible: no data-close-on-backdrop, closedby=\"closerequest\"\n      (the native default for showModal() — see\n      repos/mdn/files/en-us/web/html/reference/elements/dialog/index.md:33-35).\n    - No X button — the user must choose Cancel or the confirming action.\n\n  ## Examples\n\n      <.alert_dialog_trigger dialog_for=\"confirm\" class=\"…btn-classes…\">\n        Delete item\n      </.alert_dialog_trigger>\n\n      <.alert_dialog id=\"confirm\" title=\"Are you absolutely sure?\"\n                     description=\"This action cannot be undone.\">\n        <div class=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n          <button type=\"button\" data-dialog-close=\"true\" autofocus>Cancel</button>\n          <button type=\"button\" data-dialog-close=\"true\"\n                  hx-post={~p\"/items/\\#{@item.id}\"} hx-method=\"delete\">Delete</button>\n        </div>\n      </.alert_dialog>\n  \"\"\"\n\n  use Phoenix.Component\n\n  @alert_dialog_base \"fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-50 m-0 w-[calc(100%-2rem)] max-w-lg \" <>\n                       \"grid gap-4 rounded-lg border bg-background p-6 text-foreground shadow-lg outline-none \" <>\n                       \"hidden open:grid \" <>\n                       \"backdrop:bg-black/60 backdrop:backdrop-blur-sm\"\n\n  attr :id, :string, required: true\n  attr :title, :string, default: nil\n  attr :description, :string, default: nil\n  attr :open, :boolean, default: false\n  attr :class, :string, default: nil\n  # APG: name the alertdialog with aria-label when there is no visible title\n  # (alertdialog-pattern.html:47-57). When set, it suppresses the id-title\n  # aria-labelledby fallback so the dialog isn't named twice.\n  attr :aria_label, :string, default: nil\n\n  slot :inner_block, required: true\n\n  def alert_dialog(assigns) do\n    assigns = assign(assigns, :base, @alert_dialog_base)\n\n    ~H\"\"\"\n    <dialog\n      id={@id}\n      open={@open}\n      closedby=\"closerequest\"\n      role=\"alertdialog\"\n      class={[@base, @class]}\n      data-slot=\"alert-dialog\"\n      aria-label={@aria_label}\n      aria-labelledby={if @aria_label, do: nil, else: \"#{@id}-title\"}\n      aria-describedby={\"#{@id}-description\"}\n    >\n      <div :if={@title || @description} data-slot=\"alert-dialog-header\" class=\"flex flex-col gap-1.5 text-left\">\n        <h2 :if={@title} id={\"#{@id}-title\"} data-slot=\"alert-dialog-title\" class=\"text-lg leading-none font-semibold\">{@title}</h2>\n        <p :if={@description} id={\"#{@id}-description\"} data-slot=\"alert-dialog-description\" class=\"text-sm text-muted-foreground\">{@description}</p>\n      </div>\n      {render_slot(@inner_block)}\n    </dialog>\n    \"\"\"\n  end\n\n  attr :dialog_for, :string, required: true\n  attr :type, :string, default: \"button\"\n  attr :class, :string, default: nil\n  attr :rest, :global\n  slot :inner_block, required: true\n\n  def alert_dialog_trigger(assigns) do\n    ~H\"\"\"\n    <button\n      type={@type}\n      class={@class}\n      data-dialog-trigger=\"true\"\n      data-dialog-target={@dialog_for}\n      aria-haspopup=\"dialog\"\n      {@rest}\n    >\n      {render_slot(@inner_block)}\n    </button>\n    \"\"\"\n  end\nend\n"
    },
    {
      "path": "registry/html/alert-dialog.html",
      "type": "registry:file",
      "target": "snippets/alert-dialog.html",
      "content": "<!--\n  shadcn-htmx — raw HTML alert-dialog snippet.\n\n  Native <dialog> + .showModal(). The open/close wiring is JS-driven because\n  <dialog> has no built-in trigger attributes; a tiny script (see public/site.js\n  in the docs, or the inline snippet below) listens for data-dialog-trigger /\n  data-dialog-close clicks.\n\n  This is an *alert* dialog (APG alertdialog pattern):\n    - role=\"alertdialog\", aria-describedby is required (the alert message).\n    - NOT light-dismissible: no data-close-on-backdrop, closedby=\"closerequest\".\n      A modal opened with showModal() does not close on a backdrop click; the\n      user must choose Cancel or the confirming action.\n    - No X close button.\n\n  Minimal inline JS to copy alongside this snippet (open + button-close only —\n  note there is NO backdrop-click closer for alert dialogs):\n\n    <script>\n      document.addEventListener('click', (e) => {\n        const t = e.target.closest('[data-dialog-trigger]')\n        if (t) document.getElementById(t.dataset.dialogTarget)?.showModal()\n        const c = e.target.closest('[data-dialog-close]')\n        if (c) c.closest('dialog')?.close()\n      })\n    </script>\n-->\n\n<!-- Trigger button -->\n<button type=\"button\"\n        data-dialog-trigger=\"true\"\n        data-dialog-target=\"confirm-delete\"\n        aria-haspopup=\"dialog\"\n        class=\"inline-flex h-9 items-center justify-center rounded-md bg-destructive px-4 text-sm font-medium text-white hover:bg-destructive/90\">\n  Delete item\n</button>\n\n<!-- The alert dialog itself -->\n<!-- This dialog has a visible title, so it is named via aria-labelledby.\n     APG (alertdialog-pattern.html:47-57): if you DROP the AlertDialogTitle\n     (e.g. a short error alert), name the dialog with aria-label=\"…\" instead\n     and remove aria-labelledby so it isn't named twice / left dangling. -->\n<dialog id=\"confirm-delete\"\n        closedby=\"closerequest\"\n        role=\"alertdialog\"\n        data-slot=\"alert-dialog\"\n        aria-labelledby=\"confirm-delete-title\"\n        aria-describedby=\"confirm-delete-description\"\n        class=\"fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-50 m-0 w-[calc(100%-2rem)] max-w-lg grid gap-4 rounded-lg border bg-background p-6 text-foreground shadow-lg outline-none hidden open:grid backdrop:bg-black/60 backdrop:backdrop-blur-sm\">\n\n  <div data-slot=\"alert-dialog-header\" class=\"flex flex-col gap-1.5 text-left\">\n    <h2 id=\"confirm-delete-title\" data-slot=\"alert-dialog-title\"\n        class=\"text-lg leading-none font-semibold\">\n      Are you absolutely sure?\n    </h2>\n    <p id=\"confirm-delete-description\" data-slot=\"alert-dialog-description\"\n       class=\"text-sm text-muted-foreground\">\n      This action cannot be undone. This will permanently delete the item and\n      remove its data from our servers.\n    </p>\n  </div>\n\n  <div data-slot=\"alert-dialog-footer\"\n       class=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n    <button type=\"button\" data-dialog-close=\"true\" autofocus\n            class=\"inline-flex h-9 items-center justify-center rounded-md border bg-background px-4 text-sm font-medium shadow-xs hover:bg-accent\">\n      Cancel\n    </button>\n    <button type=\"button\"\n            hx-post=\"/items/42\" hx-target=\"closest dialog\" hx-swap=\"none\"\n            data-dialog-close=\"true\"\n            class=\"inline-flex h-9 items-center justify-center rounded-md bg-destructive px-4 text-sm font-medium text-white hover:bg-destructive/90\">\n      Delete\n    </button>\n  </div>\n</dialog>\n"
    }
  ]
}
