{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "banner",
  "registryDependencies": [
    "@fulldev/button",
    "@fulldev/dropdown-menu",
    "@fulldev/icon"
  ],
  "files": [
    {
      "path": "src/components/ui/banner/banner.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"aside\"> &\n  VariantProps<typeof variants> & {\n    storageKey?: string\n  }\n\nconst variants = cva(\"relative flex items-center py-2\", {\n  variants: {\n    variant: {\n      default: \"bg-foreground text-background w-full\",\n      floating:\n        \"bg-background mx-auto my-2 w-[calc(100%-2rem)] max-w-[calc(var(--container,1280px)-2rem)] overflow-hidden rounded-lg border shadow-sm\",\n    },\n  },\n  defaultVariants: {\n    variant: \"default\",\n  },\n})\n\nconst { class: className, variant, storageKey, ...props } = Astro.props\n---\n\n<aside\n  class={cn(variants({ variant }), className)}\n  data-slot=\"banner\"\n  data-banner-storage-key={storageKey}\n  data-variant={variant}\n  {...props}\n>\n  <slot />\n</aside>\n\n<script is:inline>\n  const initializedKey = \"fulldevBannerInitialized\"\n\n  if (!document.documentElement.dataset[initializedKey]) {\n    document.documentElement.dataset[initializedKey] = \"true\"\n\n    const getStorageToken = (key) => `banner:${key}`\n\n    const syncBanners = () => {\n      document.querySelectorAll(\"[data-slot='banner']\").forEach((banner) => {\n        if (!(banner instanceof HTMLElement)) return\n\n        const storageKey = banner.dataset.bannerStorageKey\n\n        if (\n          storageKey &&\n          sessionStorage.getItem(getStorageToken(storageKey)) === \"hidden\"\n        ) {\n          banner.hidden = true\n        }\n      })\n    }\n\n    syncBanners()\n\n    document.addEventListener(\"click\", (event) => {\n      const target = event.target\n\n      if (!(target instanceof Element)) return\n\n      const closeButton = target.closest(\"[data-slot='banner-close']\")\n\n      if (!(closeButton instanceof HTMLElement)) return\n\n      const banner = closeButton.closest(\"[data-slot='banner']\")\n\n      if (!(banner instanceof HTMLElement)) return\n\n      banner.hidden = true\n\n      const storageKey = banner.dataset.bannerStorageKey\n\n      if (storageKey) {\n        sessionStorage.setItem(getStorageToken(storageKey), \"hidden\")\n      }\n    })\n  }\n</script>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/banner/banner-container.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n  showClose?: boolean\n}\n\nconst { class: className, showClose = true, ...props } = Astro.props\n---\n\n<div\n  class={cn(\n    \"relative mx-auto flex w-full max-w-7xl gap-4 px-4\",\n    showClose && \"pr-10\",\n    className\n  )}\n  {...props}\n>\n  <slot />\n  {\n    showClose && (\n      <button\n        type=\"button\"\n        class=\"focus-visible:ring-ring/50 absolute top-1/2 right-4 z-20 inline-flex shrink-0 -translate-y-1/2 items-center justify-center rounded-sm text-current/65 transition-colors outline-none hover:text-current focus-visible:text-current focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 in-data-[variant=floating]:right-5\"\n        aria-label=\"Close\"\n        data-slot=\"banner-close\"\n      >\n        <Icon name=\"x\" class=\"size-4\" />\n        <span class=\"sr-only\">Close</span>\n      </button>\n    )\n  }\n</div>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/banner/index.ts",
      "content": "export { default as Banner } from \"./banner.astro\"\nexport { default as BannerContainer } from \"./banner-container.astro\"\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}