{
  "$schema": "https://shadcn-vue.com/schema/registry-item.json",
  "name": "cookie-consent-bar",
  "title": "Cookie Consent — Bar",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-vue/blocks/cookie-consent-bar/CookieConsentBar.vue",
      "content": "<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { Cookie } from 'lucide-vue-next'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Separator } from '@/components/ui/separator'\n\nconst props = withDefaults(defineProps<{ storageKey?: string }>(), {\n  storageKey: 'uipkge:consent',\n})\n\nconst visible = ref(false)\n\nfunction decide(choice: 'accepted' | 'rejected') {\n  visible.value = false\n  try {\n    window.localStorage.setItem(props.storageKey, choice)\n  } catch {\n    // Blocked storage: the choice holds for this page view only.\n  }\n}\n\nonMounted(() => {\n  try {\n    visible.value = !window.localStorage.getItem(props.storageKey)\n  } catch {\n    visible.value = true\n  }\n})\n</script>\n\n<template>\n  <Transition\n    enter-active-class=\"transition duration-200 ease-out\"\n    enter-from-class=\"translate-y-full opacity-0\"\n    leave-active-class=\"transition duration-150 ease-in\"\n    leave-to-class=\"translate-y-full opacity-0\"\n  >\n    <div\n      v-if=\"visible\"\n      data-slot=\"cookie-consent-bar\"\n      class=\"border-border bg-card/95 fixed inset-x-0 bottom-0 z-50 border-t backdrop-blur\"\n      role=\"region\"\n      aria-label=\"Cookie consent\"\n    >\n      <div class=\"mx-auto flex max-w-6xl flex-col gap-4 px-6 py-4 lg:flex-row lg:items-center lg:gap-8\">\n        <div class=\"flex min-w-0 items-start gap-3\">\n          <Cookie class=\"text-muted-foreground mt-0.5 size-4 shrink-0\" aria-hidden=\"true\" />\n          <div class=\"min-w-0\">\n            <div class=\"flex flex-wrap items-center gap-2\">\n              <p class=\"text-sm font-medium\">We store two things</p>\n              <Badge variant=\"outline\">No ad tracking</Badge>\n            </div>\n            <p class=\"text-muted-foreground mt-1 text-sm leading-relaxed\">\n              A session cookie so you stay signed in, and an analytics cookie recording which pages get read. Rejecting\n              keeps the first and drops the second.\n            </p>\n          </div>\n        </div>\n\n        <Separator orientation=\"vertical\" class=\"hidden h-10 lg:block\" />\n\n        <!-- Reject carries the same visual weight as accept. A ghost \"reject\"\n             beside a solid \"accept\" is a dark pattern with extra steps. -->\n        <div class=\"flex shrink-0 flex-wrap items-center gap-2\">\n          <Button variant=\"outline\" @click=\"decide('rejected')\">Reject analytics</Button>\n          <Button @click=\"decide('accepted')\">Accept</Button>\n          <Button variant=\"ghost\" size=\"sm\">Manage</Button>\n        </div>\n      </div>\n    </div>\n  </Transition>\n</template>\n",
      "type": "registry:block",
      "target": "~/app/components/blocks/CookieConsentBar.vue"
    }
  ],
  "dependencies": [
    "lucide-vue-next"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/vue/badge.json",
    "https://uipkge.dev/r/vue/button.json",
    "https://uipkge.dev/r/vue/separator.json"
  ],
  "description": "Bottom consent bar offering accept, reject, and manage as equally weighted actions, with a one-line statement of what is actually stored.",
  "categories": [
    "marketing"
  ],
  "deprecated": true,
  "replacedBy": "cookie-consent"
}