Files
shop/components/CookieBanner.vue
Michael Czechowski 44107c0734
Some checks failed
Build and publish / build (push) Failing after 19s
feat: extract shop from mp/shop — initial libreshop/shop
Source moved verbatim from mp/shop/ on 2026-04-29; mp was the first
concrete adapter consuming the libreshop toolkit. Builds and publishes
git.librete.ch/libreshop/shop on every main / v* push via the standard
.gitea/workflows/build.yml shared across libreshop components.
2026-04-29 17:48:56 +02:00

56 lines
1.5 KiB
Vue

<template>
<div
v-if="consentGiven === false"
class="fixed bottom-0 left-0 right-0 bg-white border-t border-gray-200 shadow-lg px-4 py-3 text-gray-800 z-50 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 sm:gap-4"
>
<p class="text-xs text-gray-600 sm:flex-1">
{{ consentText }}
</p>
<div class="flex items-center gap-2 shrink-0">
<Button
href="/datenschutz"
data-cy="cookie-banner-privacy"
classes="bg-transparent border-transparent py-1.5 px-3 !text-xs !text-black hover:!bg-gray-100 shadow-none"
>
Datenschutzerklärung
</Button>
<Button @click="acceptCookies" data-cy="cookie-banner-accept" classes="bg-gray-800 py-1.5 px-4 !text-xs whitespace-nowrap">
Akzeptieren
</Button>
</div>
</div>
</template>
<script setup lang="ts">
const COOKIE_CONSENT_KEY = "shop:cookie-consent";
const props = withDefaults(
defineProps<{
consentText?: string;
}>(),
{
consentText:
"Wir verwenden notwendige Cookies für die sichere Zahlungsabwicklung. Weitere Informationen finden Sie in unserer Datenschutzerklärung:"
}
);
const emit = defineEmits<{
"consent-given": [];
}>();
// Start with null to prevent SSR flash - banner only renders after client check
const consentGiven = ref<boolean | null>(null);
// Check localStorage only on client
onMounted(() => {
consentGiven.value = !!localStorage.getItem(COOKIE_CONSENT_KEY);
});
function acceptCookies() {
localStorage.setItem(COOKIE_CONSENT_KEY, new Date().toISOString());
consentGiven.value = true;
emit("consent-given");
}
</script>