create-brainerce-store 1.62.0 → 1.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +71 -71
- package/dist/index.js +26 -3
- package/messages/en.json +502 -502
- package/messages/he.json +502 -502
- package/package.json +1 -1
- package/templates/nextjs/base/.claude/commands/design.md +60 -60
- package/templates/nextjs/base/.env.local.ejs +24 -24
- package/templates/nextjs/base/.eslintrc.json +57 -57
- package/templates/nextjs/base/.mcp.json +8 -8
- package/templates/nextjs/base/AI-GUIDE.md +174 -174
- package/templates/nextjs/base/TRANSLATIONS.md +200 -200
- package/templates/nextjs/base/package.json.ejs +52 -52
- package/templates/nextjs/base/src/app/agents.md/route.ts +87 -0
- package/templates/nextjs/base/src/app/blog/[slug]/page.tsx.ejs +308 -262
- package/templates/nextjs/base/src/app/blog/page.tsx.ejs +276 -276
- package/templates/nextjs/base/src/app/blog/rss.xml/route.ts +70 -0
- package/templates/nextjs/base/src/app/cart/page.tsx +7 -7
- package/templates/nextjs/base/src/app/category/[slug]/page.tsx +29 -3
- package/templates/nextjs/base/src/app/checkout/page.tsx +12 -0
- package/templates/nextjs/base/src/app/contact/layout.tsx.ejs +14 -0
- package/templates/nextjs/base/src/app/globals.css +36 -36
- package/templates/nextjs/base/src/app/indexnow-key.txt/route.ts +26 -26
- package/templates/nextjs/base/src/app/layout.tsx.ejs +30 -0
- package/templates/nextjs/base/src/app/llms.txt/route.ts +28 -5
- package/templates/nextjs/base/src/app/not-found.tsx.ejs +35 -0
- package/templates/nextjs/base/src/app/opengraph-image.tsx +109 -0
- package/templates/nextjs/base/src/app/order-confirmation/page.tsx +295 -278
- package/templates/nextjs/base/src/app/order-status/page.tsx +121 -121
- package/templates/nextjs/base/src/app/page.tsx +64 -64
- package/templates/nextjs/base/src/app/products/[slug]/page.tsx +14 -2
- package/templates/nextjs/base/src/app/products/page.tsx +19 -19
- package/templates/nextjs/base/src/app/robots.ts +73 -14
- package/templates/nextjs/base/src/app/sitemap.ts +89 -66
- package/templates/nextjs/base/src/components/account/order-history.tsx +385 -385
- package/templates/nextjs/base/src/components/brainerce-bot.tsx +70 -70
- package/templates/nextjs/base/src/components/checkout/checkout-form.tsx +612 -612
- package/templates/nextjs/base/src/components/checkout/custom-fields-step.tsx +292 -292
- package/templates/nextjs/base/src/components/checkout/date-picker.tsx +309 -309
- package/templates/nextjs/base/src/components/checkout/datetime-picker.tsx +144 -144
- package/templates/nextjs/base/src/components/checkout/order-bump-card.tsx +242 -242
- package/templates/nextjs/base/src/components/checkout/pickup-step.tsx +198 -198
- package/templates/nextjs/base/src/components/checkout/shipping-step.tsx +125 -125
- package/templates/nextjs/base/src/components/checkout/tax-display.tsx +74 -74
- package/templates/nextjs/base/src/components/seo/article-json-ld.tsx +59 -59
- package/templates/nextjs/base/src/components/seo/breadcrumbs.tsx +37 -37
- package/templates/nextjs/base/src/components/seo/category-json-ld.tsx +61 -61
- package/templates/nextjs/base/src/components/seo/organization-json-ld.tsx +97 -97
- package/templates/nextjs/base/src/components/seo/product-json-ld.tsx +23 -131
- package/templates/nextjs/base/src/components/tracking-bootstrap.tsx +62 -0
- package/templates/nextjs/base/src/components/ui/accordion.tsx +53 -53
- package/templates/nextjs/base/src/components/ui/badge.tsx +32 -32
- package/templates/nextjs/base/src/components/ui/button.tsx +49 -49
- package/templates/nextjs/base/src/components/ui/card.tsx +55 -55
- package/templates/nextjs/base/src/components/ui/checkbox.tsx +28 -28
- package/templates/nextjs/base/src/components/ui/dialog.tsx +107 -107
- package/templates/nextjs/base/src/components/ui/input.tsx +22 -22
- package/templates/nextjs/base/src/components/ui/label.tsx +21 -21
- package/templates/nextjs/base/src/components/ui/radio-group.tsx +38 -38
- package/templates/nextjs/base/src/components/ui/select.tsx +153 -153
- package/templates/nextjs/base/src/components/ui/separator.tsx +26 -26
- package/templates/nextjs/base/src/components/ui/sheet.tsx +125 -125
- package/templates/nextjs/base/src/components/ui/skeleton.tsx +7 -7
- package/templates/nextjs/base/src/components/ui/tabs.tsx +55 -55
- package/templates/nextjs/base/src/components/ui/textarea.tsx +21 -21
- package/templates/nextjs/base/src/components/ui/tooltip.tsx +32 -32
- package/templates/nextjs/base/src/core/hooks/use-cart-page.ts +58 -58
- package/templates/nextjs/base/src/core/hooks/use-home-data.ts +51 -51
- package/templates/nextjs/base/src/core/hooks/use-product-listing.ts +295 -295
- package/templates/nextjs/base/src/core/hooks/use-product-page.ts +20 -2
- package/templates/nextjs/base/src/core/lib/image-hosts.ts +7 -7
- package/templates/nextjs/base/src/core/lib/product-options.ts +121 -121
- package/templates/nextjs/base/src/core/lib/resolve-currency.ts +20 -20
- package/templates/nextjs/base/src/core/lib/safe-redirect.ts +38 -38
- package/templates/nextjs/base/src/core/lib/seo.ts +46 -46
- package/templates/nextjs/base/src/core/lib/store-info.ts +17 -0
- package/templates/nextjs/base/src/core/lib/tracking.ts +171 -0
- package/templates/nextjs/base/src/core/lib/use-currency.ts +19 -19
- package/templates/nextjs/base/src/core/lib/utils.ts +21 -21
- package/templates/nextjs/base/src/middleware.ts.ejs +54 -2
- package/templates/nextjs/base/src/ui/cart/cart-bundle-offer.tsx +117 -117
- package/templates/nextjs/base/src/ui/cart/cart-item.tsx +146 -146
- package/templates/nextjs/base/src/ui/cart/cart-nudges.tsx +28 -28
- package/templates/nextjs/base/src/ui/cart/cart-summary.tsx +110 -110
- package/templates/nextjs/base/src/ui/cart/cart-upgrade-banner.tsx +126 -126
- package/templates/nextjs/base/src/ui/cart/cart-view.tsx +140 -140
- package/templates/nextjs/base/src/ui/cart/coupon-input.tsx +134 -134
- package/templates/nextjs/base/src/ui/cart/free-shipping-bar.tsx +61 -61
- package/templates/nextjs/base/src/ui/cart/reservation-countdown.tsx +95 -95
- package/templates/nextjs/base/src/ui/home/discount-banner-strip.tsx +22 -20
- package/templates/nextjs/base/src/ui/home/featured-products-section.tsx +24 -24
- package/templates/nextjs/base/src/ui/home/hero-section.tsx +27 -27
- package/templates/nextjs/base/src/ui/home/home-client.tsx +29 -29
- package/templates/nextjs/base/src/ui/layout/announcement-bar.tsx.ejs +116 -116
- package/templates/nextjs/base/src/ui/layout/faq-section.tsx.ejs +90 -90
- package/templates/nextjs/base/src/ui/layout/header-account.tsx +40 -40
- package/templates/nextjs/base/src/ui/layout/language-switcher.tsx.ejs +80 -80
- package/templates/nextjs/base/src/ui/layout/site-footer.tsx.ejs +144 -144
- package/templates/nextjs/base/src/ui/layout/site-header.tsx.ejs +152 -152
- package/templates/nextjs/base/src/ui/product/customization-fields.tsx +457 -457
- package/templates/nextjs/base/src/ui/product/discount-badge.tsx +18 -18
- package/templates/nextjs/base/src/ui/product/frequently-bought-together.tsx +191 -191
- package/templates/nextjs/base/src/ui/product/modifier-group-selector.tsx +206 -206
- package/templates/nextjs/base/src/ui/product/price-display.tsx +62 -62
- package/templates/nextjs/base/src/ui/product/product-card.tsx +7 -2
- package/templates/nextjs/base/src/ui/product/product-client-section.tsx +455 -455
- package/templates/nextjs/base/src/ui/product/product-listing.tsx +446 -446
- package/templates/nextjs/base/src/ui/product/recommendation-section.tsx +102 -102
- package/templates/nextjs/base/src/ui/product/review-form.tsx +294 -294
- package/templates/nextjs/base/src/ui/product/reviews-section.tsx.ejs +108 -108
- package/templates/nextjs/base/src/ui/product/stock-badge.tsx +61 -61
- package/templates/nextjs/base/src/ui/product/variant-selector.tsx +291 -291
- package/templates/nextjs/base/src/ui/shared/cdn-image.tsx +26 -26
- package/templates/nextjs/base/tailwind.config.ts +69 -69
- package/templates/nextjs/designs/atelier/app-overlay/layout.tsx.ejs +30 -0
- package/templates/nextjs/designs/atelier/globals.css +402 -402
- package/templates/nextjs/designs/atelier/messages-patch/en.json +100 -100
- package/templates/nextjs/designs/atelier/messages-patch/he.json +100 -100
- package/templates/nextjs/designs/atelier/ui/cart/cart-bundle-offer.tsx +110 -110
- package/templates/nextjs/designs/atelier/ui/cart/cart-drawer.tsx +163 -163
- package/templates/nextjs/designs/atelier/ui/cart/cart-item.tsx +140 -140
- package/templates/nextjs/designs/atelier/ui/cart/cart-nudges.tsx +34 -34
- package/templates/nextjs/designs/atelier/ui/cart/cart-summary.tsx +107 -107
- package/templates/nextjs/designs/atelier/ui/cart/cart-upgrade-banner.tsx +123 -123
- package/templates/nextjs/designs/atelier/ui/cart/cart-view.tsx +147 -147
- package/templates/nextjs/designs/atelier/ui/cart/coupon-input.tsx +142 -142
- package/templates/nextjs/designs/atelier/ui/cart/free-shipping-bar.tsx +77 -77
- package/templates/nextjs/designs/atelier/ui/cart/reservation-countdown.tsx +89 -89
- package/templates/nextjs/designs/atelier/ui/home/benefits-band.tsx +34 -34
- package/templates/nextjs/designs/atelier/ui/home/category-tiles.tsx +151 -151
- package/templates/nextjs/designs/atelier/ui/home/discount-banner-strip.tsx +27 -27
- package/templates/nextjs/designs/atelier/ui/home/editorial-band.tsx +75 -75
- package/templates/nextjs/designs/atelier/ui/home/featured-products-section.tsx +36 -36
- package/templates/nextjs/designs/atelier/ui/home/hero-section.tsx +174 -174
- package/templates/nextjs/designs/atelier/ui/home/home-client.tsx +54 -54
- package/templates/nextjs/designs/atelier/ui/home/newsletter-section.tsx +78 -78
- package/templates/nextjs/designs/atelier/ui/home/testimonials-band.tsx +46 -46
- package/templates/nextjs/designs/atelier/ui/layout/announcement-bar.tsx +118 -118
- package/templates/nextjs/designs/atelier/ui/layout/faq-section.tsx +96 -96
- package/templates/nextjs/designs/atelier/ui/layout/header-account.tsx +36 -36
- package/templates/nextjs/designs/atelier/ui/layout/header-cart.tsx +36 -36
- package/templates/nextjs/designs/atelier/ui/layout/language-switcher.tsx.ejs +137 -137
- package/templates/nextjs/designs/atelier/ui/layout/nav-url.ts +14 -14
- package/templates/nextjs/designs/atelier/ui/layout/rich-text-block.tsx +34 -34
- package/templates/nextjs/designs/atelier/ui/layout/site-footer.tsx.ejs +141 -141
- package/templates/nextjs/designs/atelier/ui/layout/site-header.tsx.ejs +138 -138
- package/templates/nextjs/designs/atelier/ui/product/customization-fields.tsx +466 -466
- package/templates/nextjs/designs/atelier/ui/product/discount-badge.tsx +17 -17
- package/templates/nextjs/designs/atelier/ui/product/frequently-bought-together.tsx +196 -196
- package/templates/nextjs/designs/atelier/ui/product/modifier-group-selector.tsx +193 -193
- package/templates/nextjs/designs/atelier/ui/product/price-display.tsx +69 -69
- package/templates/nextjs/designs/atelier/ui/product/product-card.tsx +13 -11
- package/templates/nextjs/designs/atelier/ui/product/product-client-section.tsx +477 -477
- package/templates/nextjs/designs/atelier/ui/product/product-grid.tsx +42 -42
- package/templates/nextjs/designs/atelier/ui/product/product-listing.tsx +260 -260
- package/templates/nextjs/designs/atelier/ui/product/recommendation-section.tsx +95 -95
- package/templates/nextjs/designs/atelier/ui/product/review-form.tsx +267 -267
- package/templates/nextjs/designs/atelier/ui/product/reviews-section.tsx.ejs +148 -148
- package/templates/nextjs/designs/atelier/ui/product/stock-badge.tsx +66 -66
- package/templates/nextjs/designs/atelier/ui/product/variant-selector.tsx +206 -206
- package/templates/nextjs/designs/atelier/ui/shared/cdn-image.tsx +29 -29
- package/templates/nextjs/designs/atelier/ui/shared/fly-to-cart.ts +86 -86
- package/templates/nextjs/designs/atelier/ui/shared/icons.tsx +276 -276
- package/templates/nextjs/designs/atelier/ui/shared/loading-spinner.tsx +63 -63
- package/templates/nextjs/designs/atelier/ui/shared/reveal.tsx +71 -71
- package/templates/nextjs/designs/atelier/ui/shared/select-menu.tsx +125 -125
- package/templates/nextjs/ui-canvas/cart/cart-bundle-offer.tsx +89 -89
- package/templates/nextjs/ui-canvas/cart/cart-item.tsx +123 -123
- package/templates/nextjs/ui-canvas/cart/cart-nudges.tsx +29 -27
- package/templates/nextjs/ui-canvas/cart/cart-summary.tsx +99 -99
- package/templates/nextjs/ui-canvas/cart/cart-upgrade-banner.tsx +105 -105
- package/templates/nextjs/ui-canvas/cart/cart-view.tsx +106 -106
- package/templates/nextjs/ui-canvas/cart/coupon-input.tsx +119 -119
- package/templates/nextjs/ui-canvas/cart/free-shipping-bar.tsx +54 -54
- package/templates/nextjs/ui-canvas/cart/reservation-countdown.tsx +81 -81
- package/templates/nextjs/ui-canvas/home/discount-banner-strip.tsx +21 -19
- package/templates/nextjs/ui-canvas/home/featured-products-section.tsx +23 -23
- package/templates/nextjs/ui-canvas/home/hero-section.tsx +21 -21
- package/templates/nextjs/ui-canvas/home/home-client.tsx +26 -26
- package/templates/nextjs/ui-canvas/layout/announcement-bar.tsx.ejs +101 -101
- package/templates/nextjs/ui-canvas/layout/faq-section.tsx.ejs +71 -71
- package/templates/nextjs/ui-canvas/layout/header-account.tsx +31 -31
- package/templates/nextjs/ui-canvas/layout/language-switcher.tsx.ejs +76 -76
- package/templates/nextjs/ui-canvas/layout/rich-text-block.tsx.ejs +36 -36
- package/templates/nextjs/ui-canvas/layout/site-footer.tsx.ejs +82 -82
- package/templates/nextjs/ui-canvas/layout/site-header.tsx.ejs +119 -119
- package/templates/nextjs/ui-canvas/product/customization-fields.tsx +445 -445
- package/templates/nextjs/ui-canvas/product/discount-badge.tsx +19 -19
- package/templates/nextjs/ui-canvas/product/frequently-bought-together.tsx +168 -168
- package/templates/nextjs/ui-canvas/product/modifier-group-selector.tsx +165 -165
- package/templates/nextjs/ui-canvas/product/price-display.tsx +52 -52
- package/templates/nextjs/ui-canvas/product/product-card.tsx +7 -2
- package/templates/nextjs/ui-canvas/product/product-client-section.tsx +352 -352
- package/templates/nextjs/ui-canvas/product/product-grid.tsx +27 -27
- package/templates/nextjs/ui-canvas/product/product-listing.tsx +224 -224
- package/templates/nextjs/ui-canvas/product/recommendation-section.tsx +99 -99
- package/templates/nextjs/ui-canvas/product/review-form.tsx +266 -266
- package/templates/nextjs/ui-canvas/product/reviews-section.tsx.ejs +96 -96
- package/templates/nextjs/ui-canvas/product/stock-badge.tsx +45 -45
- package/templates/nextjs/ui-canvas/product/variant-selector.tsx +212 -212
- package/templates/nextjs/ui-canvas/shared/cdn-image.tsx +31 -31
- package/templates/nextjs/ui-canvas/shared/loading-spinner.tsx +27 -27
- package/templates/nextjs/base/tsconfig.tsbuildinfo +0 -1
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
import type { Config } from 'tailwindcss';
|
|
2
|
-
import tailwindcssAnimate from 'tailwindcss-animate';
|
|
3
|
-
|
|
4
|
-
const config: Config = {
|
|
5
|
-
darkMode: ['class'],
|
|
6
|
-
content: ['./src/**/*.{js,ts,jsx,tsx,mdx}'],
|
|
7
|
-
theme: {
|
|
8
|
-
extend: {
|
|
9
|
-
colors: {
|
|
10
|
-
primary: 'hsl(var(--primary))',
|
|
11
|
-
'primary-foreground': 'hsl(var(--primary-foreground))',
|
|
12
|
-
secondary: 'hsl(var(--secondary))',
|
|
13
|
-
'secondary-foreground': 'hsl(var(--secondary-foreground))',
|
|
14
|
-
background: 'hsl(var(--background))',
|
|
15
|
-
foreground: 'hsl(var(--foreground))',
|
|
16
|
-
muted: 'hsl(var(--muted))',
|
|
17
|
-
'muted-foreground': 'hsl(var(--muted-foreground))',
|
|
18
|
-
border: 'hsl(var(--border))',
|
|
19
|
-
input: 'hsl(var(--input))',
|
|
20
|
-
ring: 'hsl(var(--ring))',
|
|
21
|
-
destructive: 'hsl(var(--destructive))',
|
|
22
|
-
'destructive-foreground': 'hsl(var(--destructive-foreground))',
|
|
23
|
-
accent: 'hsl(var(--accent))',
|
|
24
|
-
'accent-foreground': 'hsl(var(--accent-foreground))',
|
|
25
|
-
card: 'hsl(var(--card))',
|
|
26
|
-
'card-foreground': 'hsl(var(--card-foreground))',
|
|
27
|
-
popover: 'hsl(var(--popover))',
|
|
28
|
-
'popover-foreground': 'hsl(var(--popover-foreground))',
|
|
29
|
-
// Extended tokens used by design packs (defined in their globals.css).
|
|
30
|
-
// Harmless when a design doesn't set the CSS variables — the classes
|
|
31
|
-
// simply aren't used by the base ui.
|
|
32
|
-
surface: 'hsl(var(--surface))',
|
|
33
|
-
plinth: 'hsl(var(--plinth))',
|
|
34
|
-
},
|
|
35
|
-
fontFamily: {
|
|
36
|
-
// Design packs set --font-sans / --font-serif via next/font variables
|
|
37
|
-
// in app/layout.tsx; the fallbacks keep font-sans/font-serif usable
|
|
38
|
-
// even when a layout doesn't define them.
|
|
39
|
-
sans: ['var(--font-sans)', 'ui-sans-serif', 'system-ui', 'sans-serif'],
|
|
40
|
-
serif: ['var(--font-serif)', 'ui-serif', 'Georgia', 'serif'],
|
|
41
|
-
},
|
|
42
|
-
borderRadius: {
|
|
43
|
-
// shadcn/ui convention: every radius derives from the --radius token,
|
|
44
|
-
// so `rounded`, `rounded-md`, `rounded-lg` all follow the theme.
|
|
45
|
-
DEFAULT: 'var(--radius)',
|
|
46
|
-
lg: 'var(--radius)',
|
|
47
|
-
md: 'calc(var(--radius) - 2px)',
|
|
48
|
-
sm: 'calc(var(--radius) - 4px)',
|
|
49
|
-
},
|
|
50
|
-
keyframes: {
|
|
51
|
-
'accordion-down': {
|
|
52
|
-
from: { height: '0' },
|
|
53
|
-
to: { height: 'var(--radix-accordion-content-height)' },
|
|
54
|
-
},
|
|
55
|
-
'accordion-up': {
|
|
56
|
-
from: { height: 'var(--radix-accordion-content-height)' },
|
|
57
|
-
to: { height: '0' },
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
animation: {
|
|
61
|
-
'accordion-down': 'accordion-down 0.2s ease-out',
|
|
62
|
-
'accordion-up': 'accordion-up 0.2s ease-out',
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
plugins: [tailwindcssAnimate],
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
export default config;
|
|
1
|
+
import type { Config } from 'tailwindcss';
|
|
2
|
+
import tailwindcssAnimate from 'tailwindcss-animate';
|
|
3
|
+
|
|
4
|
+
const config: Config = {
|
|
5
|
+
darkMode: ['class'],
|
|
6
|
+
content: ['./src/**/*.{js,ts,jsx,tsx,mdx}'],
|
|
7
|
+
theme: {
|
|
8
|
+
extend: {
|
|
9
|
+
colors: {
|
|
10
|
+
primary: 'hsl(var(--primary))',
|
|
11
|
+
'primary-foreground': 'hsl(var(--primary-foreground))',
|
|
12
|
+
secondary: 'hsl(var(--secondary))',
|
|
13
|
+
'secondary-foreground': 'hsl(var(--secondary-foreground))',
|
|
14
|
+
background: 'hsl(var(--background))',
|
|
15
|
+
foreground: 'hsl(var(--foreground))',
|
|
16
|
+
muted: 'hsl(var(--muted))',
|
|
17
|
+
'muted-foreground': 'hsl(var(--muted-foreground))',
|
|
18
|
+
border: 'hsl(var(--border))',
|
|
19
|
+
input: 'hsl(var(--input))',
|
|
20
|
+
ring: 'hsl(var(--ring))',
|
|
21
|
+
destructive: 'hsl(var(--destructive))',
|
|
22
|
+
'destructive-foreground': 'hsl(var(--destructive-foreground))',
|
|
23
|
+
accent: 'hsl(var(--accent))',
|
|
24
|
+
'accent-foreground': 'hsl(var(--accent-foreground))',
|
|
25
|
+
card: 'hsl(var(--card))',
|
|
26
|
+
'card-foreground': 'hsl(var(--card-foreground))',
|
|
27
|
+
popover: 'hsl(var(--popover))',
|
|
28
|
+
'popover-foreground': 'hsl(var(--popover-foreground))',
|
|
29
|
+
// Extended tokens used by design packs (defined in their globals.css).
|
|
30
|
+
// Harmless when a design doesn't set the CSS variables — the classes
|
|
31
|
+
// simply aren't used by the base ui.
|
|
32
|
+
surface: 'hsl(var(--surface))',
|
|
33
|
+
plinth: 'hsl(var(--plinth))',
|
|
34
|
+
},
|
|
35
|
+
fontFamily: {
|
|
36
|
+
// Design packs set --font-sans / --font-serif via next/font variables
|
|
37
|
+
// in app/layout.tsx; the fallbacks keep font-sans/font-serif usable
|
|
38
|
+
// even when a layout doesn't define them.
|
|
39
|
+
sans: ['var(--font-sans)', 'ui-sans-serif', 'system-ui', 'sans-serif'],
|
|
40
|
+
serif: ['var(--font-serif)', 'ui-serif', 'Georgia', 'serif'],
|
|
41
|
+
},
|
|
42
|
+
borderRadius: {
|
|
43
|
+
// shadcn/ui convention: every radius derives from the --radius token,
|
|
44
|
+
// so `rounded`, `rounded-md`, `rounded-lg` all follow the theme.
|
|
45
|
+
DEFAULT: 'var(--radius)',
|
|
46
|
+
lg: 'var(--radius)',
|
|
47
|
+
md: 'calc(var(--radius) - 2px)',
|
|
48
|
+
sm: 'calc(var(--radius) - 4px)',
|
|
49
|
+
},
|
|
50
|
+
keyframes: {
|
|
51
|
+
'accordion-down': {
|
|
52
|
+
from: { height: '0' },
|
|
53
|
+
to: { height: 'var(--radix-accordion-content-height)' },
|
|
54
|
+
},
|
|
55
|
+
'accordion-up': {
|
|
56
|
+
from: { height: 'var(--radix-accordion-content-height)' },
|
|
57
|
+
to: { height: '0' },
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
animation: {
|
|
61
|
+
'accordion-down': 'accordion-down 0.2s ease-out',
|
|
62
|
+
'accordion-up': 'accordion-up 0.2s ease-out',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
plugins: [tailwindcssAnimate],
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export default config;
|
|
@@ -7,6 +7,7 @@ import { SiteHeader } from '@/ui/layout/site-header';
|
|
|
7
7
|
import { SiteFooter } from '@/ui/layout/site-footer';
|
|
8
8
|
import { CartDrawer } from '@/ui/cart/cart-drawer';
|
|
9
9
|
import { BrainerceBotWidget } from '@/components/brainerce-bot';
|
|
10
|
+
import { TrackingBootstrap } from '@/components/tracking-bootstrap';
|
|
10
11
|
import { getServerClient, fetchStoreInfo } from '@/core/lib/brainerce';
|
|
11
12
|
import { getDirection, getMessages, supportedLocales } from '@/i18n';
|
|
12
13
|
import { getNonce } from '@/core/lib/nonce';
|
|
@@ -103,6 +104,16 @@ export default async function RootLayout({
|
|
|
103
104
|
.replace(/&/g, '\\u0026'),
|
|
104
105
|
}}
|
|
105
106
|
/>
|
|
107
|
+
{/* Google Search Console verification — token set by the merchant in
|
|
108
|
+
the dashboard (channel settings → Google site verification). Also
|
|
109
|
+
what the Merchant Center website claim checks for. Renders nothing
|
|
110
|
+
until a token is configured. */}
|
|
111
|
+
{storeInfo?.seo?.googleSiteVerification ? (
|
|
112
|
+
<meta name="google-site-verification" content={storeInfo.seo.googleSiteVerification} />
|
|
113
|
+
) : null}
|
|
114
|
+
{/* RSS autodiscovery — feed readers and aggregators find the blog feed
|
|
115
|
+
from any page. The route itself lives at /blog/rss.xml. */}
|
|
116
|
+
<link rel="alternate" type="application/rss+xml" title="Blog" href="/blog/rss.xml" />
|
|
106
117
|
{/* Brainerce cookieless traffic analytics — auto-tracks pageviews +
|
|
107
118
|
SPA route changes. Cookieless (no consent banner needed); the
|
|
108
119
|
merchant can toggle it per sales channel in the dashboard. */}
|
|
@@ -118,6 +129,10 @@ export default async function RootLayout({
|
|
|
118
129
|
</head>
|
|
119
130
|
<body className={`${sans.variable} ${serif.variable} font-sans`}>
|
|
120
131
|
<StoreProvider locale={locale} initialStoreInfo={storeInfo} initialMessages={messages}>
|
|
132
|
+
{/* Mounted ahead of the page tree on purpose: React runs effects in
|
|
133
|
+
tree order, so booting the tags here guarantees fbq/ttq exist by
|
|
134
|
+
the time a page component fires its first e-commerce event. */}
|
|
135
|
+
<TrackingBootstrap />
|
|
121
136
|
<div className="min-h-screen flex flex-col">
|
|
122
137
|
<AnnouncementBar announcements={announcements} />
|
|
123
138
|
<SiteHeader header={siteHeader} storeName={<%- storeNameJs %>} />
|
|
@@ -140,6 +155,7 @@ import { SiteHeader } from '@/ui/layout/site-header';
|
|
|
140
155
|
import { SiteFooter } from '@/ui/layout/site-footer';
|
|
141
156
|
import { CartDrawer } from '@/ui/cart/cart-drawer';
|
|
142
157
|
import { BrainerceBotWidget } from '@/components/brainerce-bot';
|
|
158
|
+
import { TrackingBootstrap } from '@/components/tracking-bootstrap';
|
|
143
159
|
import { getServerClient, fetchStoreInfo } from '@/core/lib/brainerce';
|
|
144
160
|
import { getNonce } from '@/core/lib/nonce';
|
|
145
161
|
import './globals.css';
|
|
@@ -224,6 +240,16 @@ export default async function RootLayout({
|
|
|
224
240
|
.replace(/&/g, '\\u0026'),
|
|
225
241
|
}}
|
|
226
242
|
/>
|
|
243
|
+
{/* Google Search Console verification — token set by the merchant in
|
|
244
|
+
the dashboard (channel settings → Google site verification). Also
|
|
245
|
+
what the Merchant Center website claim checks for. Renders nothing
|
|
246
|
+
until a token is configured. */}
|
|
247
|
+
{storeInfo?.seo?.googleSiteVerification ? (
|
|
248
|
+
<meta name="google-site-verification" content={storeInfo.seo.googleSiteVerification} />
|
|
249
|
+
) : null}
|
|
250
|
+
{/* RSS autodiscovery — feed readers and aggregators find the blog feed
|
|
251
|
+
from any page. The route itself lives at /blog/rss.xml. */}
|
|
252
|
+
<link rel="alternate" type="application/rss+xml" title="Blog" href="/blog/rss.xml" />
|
|
227
253
|
{/* Brainerce cookieless traffic analytics — auto-tracks pageviews +
|
|
228
254
|
SPA route changes. Cookieless (no consent banner needed); the
|
|
229
255
|
merchant can toggle it per sales channel in the dashboard. */}
|
|
@@ -239,6 +265,10 @@ export default async function RootLayout({
|
|
|
239
265
|
</head>
|
|
240
266
|
<body className={`${sans.variable} ${serif.variable} font-sans`}>
|
|
241
267
|
<StoreProvider initialStoreInfo={storeInfo}>
|
|
268
|
+
{/* Mounted ahead of the page tree on purpose: React runs effects in
|
|
269
|
+
tree order, so booting the tags here guarantees fbq/ttq exist by
|
|
270
|
+
the time a page component fires its first e-commerce event. */}
|
|
271
|
+
<TrackingBootstrap />
|
|
242
272
|
<div className="min-h-screen flex flex-col">
|
|
243
273
|
<AnnouncementBar announcements={announcements} />
|
|
244
274
|
<SiteHeader header={siteHeader} storeName={<%- storeNameJs %>} />
|