feat: extract shop from mp/shop — initial libreshop/shop
Some checks failed
Build and publish / build (push) Failing after 19s

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.
This commit is contained in:
Michael Czechowski
2026-04-29 17:48:56 +02:00
commit 44107c0734
134 changed files with 19521 additions and 0 deletions

39
layouts/default.vue Normal file
View File

@@ -0,0 +1,39 @@
<template>
<div>
<Header :covers="covers" :is-dark-mode="isDarkMode" />
<slot />
<Footer :covers="covers" />
<CookieBanner />
</div>
</template>
<script setup lang="ts">
import type { CoverNavItem } from "~/types";
import { slugify } from "~/utils/slugify";
const isDarkMode = ref(false);
// Fetch covers (SSR-safe)
const { data: coversData } = await useFetch("/api/product-covers", {
transform: (response: { data?: Array<{ id: string | number; attributes?: { name: string; binding?: string; sort?: number }; name?: string; binding?: string; sort?: number }> }) =>
response.data?.map((cover) => {
const name = cover.attributes?.name ?? cover.name ?? "";
return {
label: name,
id: cover.id,
slug: slugify(name),
description: cover.attributes?.binding ?? cover.binding ?? "",
sort: cover.attributes?.sort ?? cover.sort ?? 0
};
}) ?? []
});
const covers = computed<CoverNavItem[]>(() => coversData.value ?? []);
function toggleDarkMode(value: boolean) {
isDarkMode.value = value;
}
// Provide to children
provide("toggleDarkMode", toggleDarkMode);
</script>