{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "announcement-corner-toast",
  "title": "Announcement — Corner Card",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/announcement-corner-toast/AnnouncementCornerToast.tsx",
      "content": "'use client'\n\nimport { useEffect, useState } from 'react'\nimport { ArrowRight, Bell, X } from 'lucide-react'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent } from '@/components/ui/card'\nimport { Separator } from '@/components/ui/separator'\n\ninterface AnnouncementCornerToastProps {\n  /** Milliseconds before the card slides in. */\n  delay?: number\n  /** sessionStorage key holding the dismissal. */\n  storageKey?: string\n}\n\nexport function AnnouncementCornerToast({\n  delay = 1200,\n  storageKey = 'uipkge:corner-announcement-dismissed',\n}: AnnouncementCornerToastProps) {\n  // Hidden on the server and on first paint; the delay timer is what reveals it.\n  const [visible, setVisible] = useState(false)\n\n  useEffect(() => {\n    const wasDismissed = () => {\n      try {\n        return window.sessionStorage.getItem(storageKey) === '1'\n      } catch {\n        return false\n      }\n    }\n    if (wasDismissed()) return\n    const timer = setTimeout(() => setVisible(true), delay)\n    return () => clearTimeout(timer)\n  }, [delay, storageKey])\n\n  function dismiss() {\n    setVisible(false)\n    try {\n      window.sessionStorage.setItem(storageKey, '1')\n    } catch {\n      // Blocked storage: the dismissal still holds for this page view.\n    }\n  }\n\n  return (\n    <div\n      data-slot=\"announcement-corner-toast\"\n      className={`fixed right-4 bottom-4 z-50 w-[22rem] max-w-[calc(100vw-2rem)] transition duration-300 ${\n        visible ? 'translate-y-0 opacity-100' : 'pointer-events-none invisible translate-y-4 opacity-0'\n      }`}\n      role=\"complementary\"\n      aria-label=\"Product announcement\"\n      aria-hidden={!visible}\n    >\n      <Card className=\"shadow-lg\">\n        <CardContent className=\"p-4\">\n          <div className=\"flex items-start gap-3\">\n            <span\n              className=\"border-border bg-muted flex size-10 shrink-0 items-center justify-center rounded-lg border\"\n              aria-hidden=\"true\"\n            >\n              <Bell className=\"text-primary size-4\" />\n            </span>\n            <div className=\"min-w-0 flex-1\">\n              <Badge variant=\"secondary\" className=\"mb-1.5\">\n                New\n              </Badge>\n              <p className=\"text-sm font-semibold\">Scoping now follows SCIM groups</p>\n              <p className=\"text-muted-foreground mt-1 text-xs leading-relaxed\">\n                Move someone between teams in your IdP and their dashboards follow within the sync window.\n              </p>\n            </div>\n            <Button\n              variant=\"ghost\"\n              size=\"icon\"\n              className=\"-mt-1 -mr-1 size-7 shrink-0\"\n              aria-label=\"Dismiss announcement\"\n              onClick={dismiss}\n            >\n              <X className=\"size-3.5\" aria-hidden=\"true\" />\n            </Button>\n          </div>\n\n          <Separator className=\"my-3\" />\n\n          <div className=\"flex items-center gap-2\">\n            <Button size=\"sm\" className=\"h-7\">\n              Read the changelog\n              <ArrowRight className=\"ml-1 size-3.5\" aria-hidden=\"true\" />\n            </Button>\n            <Button variant=\"ghost\" size=\"sm\" className=\"h-7\" onClick={dismiss}>\n              Not now\n            </Button>\n          </div>\n        </CardContent>\n      </Card>\n    </div>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/AnnouncementCornerToast.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/separator.json"
  ],
  "description": "Corner announcement card that slides in after a delay carrying a thumbnail, headline, supporting line, and two actions, staying out of the page flow entirely.",
  "categories": [
    "marketing"
  ],
  "deprecated": true,
  "replacedBy": "announcement"
}