From c8853bac1c4d9de751e3b1e360e14bb985768c38 Mon Sep 17 00:00:00 2001 From: Nam Doan Date: Wed, 26 Nov 2025 11:22:58 +0700 Subject: [PATCH] feat: add header banner 3bear design template --- config/nam.3bear.design.json | 90 ++++++++++++++++++ public/3bear-logo.png | Bin 0 -> 4922 bytes .../vt-banner/banner-ticker.module.css | 13 ++- src/vibentec/component-map.tsx | 4 +- src/vibentec/configloader.ts | 2 +- src/vibentec/devJsonFileNames.ts | 3 +- 6 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 config/nam.3bear.design.json create mode 100644 public/3bear-logo.png diff --git a/config/nam.3bear.design.json b/config/nam.3bear.design.json new file mode 100644 index 0000000..3f59388 --- /dev/null +++ b/config/nam.3bear.design.json @@ -0,0 +1,90 @@ +[ + { + "Header": { + "config": { + "sticky": true, + "variant": "ticker" + }, + "children": [ + { + "Banner": { + "config": { + "variant": "ticker", + "className": "h-12 bg-[#009b93] text-[#fff] gap-12", + "speed": 24, + "items": [ + { + "Link": { + "config": { + "label": "NEU: Overnight Oats – Sallys Nussecke 😍", + "href": "/" + } + } + }, + { + "Link": { + "config": { + "label": "Versandkostenfrei ab 45 € 💛", + "href": "/" + } + } + }, + { + "Link": { + "config": { + "label": "Gratis Geschenk ab 60 € Warenkorbwert 🎁", + "href": "/" + } + } + } + ] + } + } + }, + { + "Nav": { + "config": { + "className": "h-12 bg-white text-[#003F31] gap-12", + "left": [ + { + "Image": { + "config": { + "src": "/3bear-logo.png", + "alt": "MyShop", + "className": "h-[150px] w-[180px]", + "objectFit": "contain" + } + } + } + ] + } + } + } + ] + } + }, + { + "CartMismatchBanner": { + "config": { + "show": true + } + } + }, + { + "FreeShippingPriceNudge": { + "config": { + "variant": "popup" + } + } + }, + { + "PropsChildren": {} + }, + { + "Footer": { + "config": { + "copyrightText": "© 2025 MyShop" + } + } + } +] diff --git a/public/3bear-logo.png b/public/3bear-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f74c9f7f035517b1a9a240ed159313a43bb0ee86 GIT binary patch literal 4922 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 @@ -32,7 +33,7 @@ export type ComponentRenderer = { } // Utility methods -const configOnly = (Component: React.ComponentType): ComponentRenderer => ({ +const configOnly = (Component: React.ComponentType): ComponentRenderer => ({ render: (entry) => }) @@ -55,6 +56,7 @@ export const componentMap: Record = { AccountButton: nodesContextRenderer(AccountButton), VtCartButton: nodesContextRenderer(VtCartButton), Link: nodesContextRenderer(VtLink), + Image: nodesContextRenderer(VtImage), CartMismatchBanner: configOnly(CartMismatchBanner), FreeShippingPriceNudge: configOnly(FreeShippingPriceNudge), PropsChildren: { diff --git a/src/vibentec/configloader.ts b/src/vibentec/configloader.ts index 8dae4ca..1c18fc4 100644 --- a/src/vibentec/configloader.ts +++ b/src/vibentec/configloader.ts @@ -2,7 +2,7 @@ import fs from "fs" import path from "path" import { jsonFileNames } from "./devJsonFileNames"; -const fileName = jsonFileNames.stePlayGround; +const fileName = jsonFileNames.nam3Bear; export async function loadDesignConfig() { const filePath = path.join(process.cwd(), "config", fileName) diff --git a/src/vibentec/devJsonFileNames.ts b/src/vibentec/devJsonFileNames.ts index d2daa69..901242c 100644 --- a/src/vibentec/devJsonFileNames.ts +++ b/src/vibentec/devJsonFileNames.ts @@ -1,4 +1,5 @@ export const jsonFileNames = { steMedusaStarter: "ste.medusa-starter.design.json", - stePlayGround: "ste.playground.design.json" + stePlayGround: "ste.playground.design.json", + nam3Bear: "nam.3bear.design.json", }; \ No newline at end of file