-
Theme Marketplace
-
- Browse and install professional themes for your store
-
+
{/* Search and Filters */}
@@ -316,6 +327,14 @@ function getCategoryForTheme(id: ThemeTemplateId): ThemeCategory {
elegant: 'popular',
minimal: 'minimal',
boutique: 'modern',
+ 'tech-nova': 'popular',
+ 'fashion-forward': 'popular',
+ 'cafe-bistro': 'modern',
+ 'glow-up': 'modern',
+ 'home-vibes': 'classic',
+ 'sport-zone': 'popular',
+ 'jewel-box': 'popular',
+ bookshelf: 'classic',
};
return categories[id] || 'all';
}
@@ -328,6 +347,14 @@ function getTagsForTheme(id: ThemeTemplateId): string[] {
elegant: ['Luxury', 'Sophisticated', 'Premium'],
minimal: ['Ultra-clean', 'Simple', 'Apple-inspired'],
boutique: ['Playful', 'Friendly', 'Small Business'],
+ 'tech-nova': ['Electronics', 'Dark', 'Futuristic'],
+ 'fashion-forward': ['Fashion', 'Editorial', 'Apparel'],
+ 'cafe-bistro': ['Food', 'Coffee', 'Warm'],
+ 'glow-up': ['Beauty', 'Cosmetics', 'Skincare'],
+ 'home-vibes': ['Home', 'Decor', 'Lifestyle'],
+ 'sport-zone': ['Sports', 'Fitness', 'Dynamic'],
+ 'jewel-box': ['Jewelry', 'Luxury', 'Gold'],
+ bookshelf: ['Books', 'Education', 'Academic'],
};
return tags[id] || [];
}
diff --git a/src/lib/storefront/theme-templates.ts b/src/lib/storefront/theme-templates.ts
index f797de8a..6f4bd458 100644
--- a/src/lib/storefront/theme-templates.ts
+++ b/src/lib/storefront/theme-templates.ts
@@ -1,10 +1,3 @@
-/**
- * Storefront Theme Templates
- *
- * Predefined theme configurations for storefronts.
- * Each template defines colors, typography, layout, and default component styles.
- */
-
import type { ThemeTemplate, ThemeTemplateId } from './types';
/**
@@ -14,12 +7,14 @@ const modernTheme: ThemeTemplate = {
id: 'modern',
name: 'Modern',
description: 'Clean, minimal design with subtle colors and spacious layout',
+ category: 'GENERAL',
+ tags: ['clean', 'minimal', 'spacious', 'professional'],
theme: {
templateId: 'modern',
colors: {
- primary: '#4F46E5', // Indigo
- secondary: '#10B981', // Emerald
- accent: '#F59E0B', // Amber
+ primary: '#4F46E5',
+ secondary: '#10B981',
+ accent: '#F59E0B',
background: '#FFFFFF',
foreground: '#111827',
muted: '#F3F4F6',
@@ -48,13 +43,15 @@ const classicTheme: ThemeTemplate = {
id: 'classic',
name: 'Classic',
description: 'Traditional e-commerce style with warm, inviting colors',
+ category: 'GENERAL',
+ tags: ['traditional', 'warm', 'e-commerce', 'trusted'],
theme: {
templateId: 'classic',
colors: {
- primary: '#B91C1C', // Red
- secondary: '#0369A1', // Blue
- accent: '#D97706', // Orange
- background: '#FFFBEB', // Warm white
+ primary: '#B91C1C',
+ secondary: '#0369A1',
+ accent: '#D97706',
+ background: '#FFFBEB',
foreground: '#1F2937',
muted: '#FEF3C7',
},
@@ -83,13 +80,15 @@ const boldTheme: ThemeTemplate = {
id: 'bold',
name: 'Bold',
description: 'Vibrant colors with large typography for maximum impact',
+ category: 'GENERAL',
+ tags: ['vibrant', 'bold', 'dark', 'impactful'],
theme: {
templateId: 'bold',
colors: {
- primary: '#DC2626', // Bright Red
- secondary: '#7C3AED', // Purple
- accent: '#FACC15', // Yellow
- background: '#18181B', // Dark
+ primary: '#DC2626',
+ secondary: '#7C3AED',
+ accent: '#FACC15',
+ background: '#18181B',
foreground: '#FAFAFA',
muted: '#27272A',
},
@@ -118,13 +117,15 @@ const elegantTheme: ThemeTemplate = {
id: 'elegant',
name: 'Elegant',
description: 'Luxury, sophisticated design with refined typography',
+ category: 'GENERAL',
+ tags: ['luxury', 'sophisticated', 'refined', 'premium'],
theme: {
templateId: 'elegant',
colors: {
- primary: '#1F2937', // Dark gray
- secondary: '#B45309', // Gold
- accent: '#059669', // Teal
- background: '#FAFAF9', // Off-white
+ primary: '#1F2937',
+ secondary: '#B45309',
+ accent: '#059669',
+ background: '#FAFAF9',
foreground: '#1C1917',
muted: '#E7E5E4',
},
@@ -153,13 +154,15 @@ const minimalTheme: ThemeTemplate = {
id: 'minimal',
name: 'Minimal',
description: 'Ultra-clean, whitespace-focused design with subtle elegance',
+ category: 'GENERAL',
+ tags: ['minimalist', 'clean', 'whitespace', 'apple-style'],
theme: {
templateId: 'minimal',
colors: {
- primary: '#000000', // Pure black
- secondary: '#6B7280', // Gray
- accent: '#3B82F6', // Blue
- background: '#FFFFFF', // Pure white
+ primary: '#000000',
+ secondary: '#6B7280',
+ accent: '#3B82F6',
+ background: '#FFFFFF',
foreground: '#000000',
muted: '#F9FAFB',
},
@@ -187,13 +190,15 @@ const boutiqueTheme: ThemeTemplate = {
id: 'boutique',
name: 'Boutique',
description: 'Warm and inviting design perfect for small businesses',
+ category: 'FASHION',
+ tags: ['small-business', 'playful', 'warm', 'boutique'],
theme: {
templateId: 'boutique',
colors: {
- primary: '#EC4899', // Pink
- secondary: '#8B5CF6', // Purple
- accent: '#F59E0B', // Amber
- background: '#FFFBF5', // Warm cream
+ primary: '#EC4899',
+ secondary: '#8B5CF6',
+ accent: '#F59E0B',
+ background: '#FFFBF5',
foreground: '#1F2937',
muted: '#FEF3E2',
},
@@ -215,6 +220,304 @@ const boutiqueTheme: ThemeTemplate = {
defaultProductCard: 'standard',
};
+// ─────────────────────────────────────────────
+// Extended Marketplace Themes (categorised)
+// ─────────────────────────────────────────────
+
+/**
+ * TechNova - Electronics & Gadgets store
+ */
+const techNovaTheme: ThemeTemplate = {
+ id: 'tech-nova',
+ name: 'TechNova',
+ description: 'Futuristic dark theme built for electronics & gadget stores',
+ category: 'ELECTRONICS',
+ tags: ['electronics', 'gadgets', 'dark', 'futuristic', 'tech'],
+ theme: {
+ templateId: 'tech-nova',
+ colors: {
+ primary: '#06B6D4', // Cyan
+ secondary: '#3B82F6', // Blue
+ accent: '#A855F7', // Purple
+ background: '#0F172A', // Slate dark
+ foreground: '#F1F5F9',
+ muted: '#1E293B',
+ },
+ typography: {
+ fontFamily: 'geist',
+ baseFontSize: 16,
+ headingScale: 1.333,
+ },
+ layout: 'full-width',
+ borderRadius: 'md',
+ },
+ defaultHero: {
+ style: 'gradient',
+ backgroundGradient: 'from-slate-900 via-cyan-950 to-slate-900',
+ alignment: 'center',
+ minHeight: 'xl',
+ },
+ defaultProductCard: 'overlay',
+};
+
+/**
+ * FashionForward - Fashion & Apparel
+ */
+const fashionForwardTheme: ThemeTemplate = {
+ id: 'fashion-forward',
+ name: 'FashionForward',
+ description: 'Editorial fashion aesthetic — clean lines with striking typography',
+ category: 'FASHION',
+ tags: ['fashion', 'apparel', 'editorial', 'clothing', 'style'],
+ theme: {
+ templateId: 'fashion-forward',
+ colors: {
+ primary: '#111111',
+ secondary: '#C9A96E', // Gold
+ accent: '#E63946', // Red
+ background: '#FAFAFA',
+ foreground: '#111111',
+ muted: '#F0EDE6',
+ },
+ typography: {
+ fontFamily: 'inter',
+ headingFontFamily: 'playfair',
+ baseFontSize: 15,
+ headingScale: 1.414,
+ },
+ layout: 'full-width',
+ borderRadius: 'none',
+ },
+ defaultHero: {
+ style: 'split',
+ alignment: 'left',
+ minHeight: 'xl',
+ overlayOpacity: 20,
+ },
+ defaultProductCard: 'overlay',
+};
+
+/**
+ * CafeBistro - Food, Coffee & Beverages
+ */
+const cafeBistroTheme: ThemeTemplate = {
+ id: 'cafe-bistro',
+ name: 'CafeBistro',
+ description: 'Warm, earthy palette designed for food, café & beverage brands',
+ category: 'FOOD_BEVERAGE',
+ tags: ['food', 'coffee', 'cafe', 'restaurant', 'warm', 'earthy'],
+ theme: {
+ templateId: 'cafe-bistro',
+ colors: {
+ primary: '#92400E', // Brown
+ secondary: '#16A34A', // Green
+ accent: '#F97316', // Orange
+ background: '#FFFDF7', // Cream
+ foreground: '#292524',
+ muted: '#FEF9EF',
+ },
+ typography: {
+ fontFamily: 'poppins',
+ headingFontFamily: 'playfair',
+ baseFontSize: 16,
+ headingScale: 1.333,
+ },
+ layout: 'boxed',
+ borderRadius: 'lg',
+ },
+ defaultHero: {
+ style: 'image',
+ alignment: 'center',
+ minHeight: 'lg',
+ overlayOpacity: 30,
+ },
+ defaultProductCard: 'detailed',
+};
+
+/**
+ * GlowUp - Health, Beauty & Cosmetics
+ */
+const glowUpTheme: ThemeTemplate = {
+ id: 'glow-up',
+ name: 'GlowUp',
+ description: 'Soft, radiant design for health, beauty and cosmetics brands',
+ category: 'HEALTH_BEAUTY',
+ tags: ['beauty', 'cosmetics', 'skincare', 'health', 'feminine', 'soft'],
+ theme: {
+ templateId: 'glow-up',
+ colors: {
+ primary: '#BE185D', // Deep rose
+ secondary: '#7C3AED', // Violet
+ accent: '#F59E0B', // Gold
+ background: '#FFF5F7', // Blush
+ foreground: '#1F2937',
+ muted: '#FCE7F3',
+ },
+ typography: {
+ fontFamily: 'poppins',
+ headingFontFamily: 'playfair',
+ baseFontSize: 15,
+ headingScale: 1.25,
+ },
+ layout: 'centered',
+ borderRadius: 'xl',
+ },
+ defaultHero: {
+ style: 'gradient',
+ backgroundGradient: 'from-rose-50 via-pink-50 to-purple-50',
+ alignment: 'center',
+ minHeight: 'lg',
+ },
+ defaultProductCard: 'minimal',
+};
+
+/**
+ * HomeVibes - Home Decor & Lifestyle
+ */
+const homeVibesTheme: ThemeTemplate = {
+ id: 'home-vibes',
+ name: 'HomeVibes',
+ description: 'Natural, cozy palette for home decor and lifestyle products',
+ category: 'HOME_LIFESTYLE',
+ tags: ['home', 'decor', 'furniture', 'natural', 'cozy', 'lifestyle'],
+ theme: {
+ templateId: 'home-vibes',
+ colors: {
+ primary: '#78350F', // Warm brown
+ secondary: '#4D7C0F', // Olive
+ accent: '#0F766E', // Teal
+ background: '#FDFAF4', // Linen
+ foreground: '#1C1917',
+ muted: '#F5F0E8',
+ },
+ typography: {
+ fontFamily: 'inter',
+ headingFontFamily: 'playfair',
+ baseFontSize: 16,
+ headingScale: 1.25,
+ },
+ layout: 'full-width',
+ borderRadius: 'md',
+ },
+ defaultHero: {
+ style: 'gradient',
+ backgroundGradient: 'from-amber-50 via-stone-50 to-green-50',
+ alignment: 'left',
+ minHeight: 'lg',
+ },
+ defaultProductCard: 'standard',
+};
+
+/**
+ * SportZone - Sports, Fitness & Outdoors
+ */
+const sportZoneTheme: ThemeTemplate = {
+ id: 'sport-zone',
+ name: 'SportZone',
+ description: 'High-energy, dynamic design for sports and fitness brands',
+ category: 'SPORTS_OUTDOORS',
+ tags: ['sports', 'fitness', 'outdoors', 'dynamic', 'energetic'],
+ theme: {
+ templateId: 'sport-zone',
+ colors: {
+ primary: '#DC2626', // Red
+ secondary: '#1D4ED8', // Blue
+ accent: '#16A34A', // Green
+ background: '#0F0F0F', // Near black
+ foreground: '#F9FAFB',
+ muted: '#1F1F1F',
+ },
+ typography: {
+ fontFamily: 'montserrat',
+ baseFontSize: 16,
+ headingScale: 1.5,
+ },
+ layout: 'full-width',
+ borderRadius: 'sm',
+ },
+ defaultHero: {
+ style: 'gradient',
+ backgroundGradient: 'from-red-950 via-gray-950 to-blue-950',
+ alignment: 'center',
+ minHeight: 'xl',
+ },
+ defaultProductCard: 'overlay',
+};
+
+/**
+ * JewelBox - Jewelry & Accessories
+ */
+const jewelBoxTheme: ThemeTemplate = {
+ id: 'jewel-box',
+ name: 'JewelBox',
+ description: 'Opulent dark design with gold accents for jewelry stores',
+ category: 'JEWELRY',
+ tags: ['jewelry', 'accessories', 'luxury', 'gold', 'dark', 'opulent'],
+ theme: {
+ templateId: 'jewel-box',
+ colors: {
+ primary: '#D4AF37', // Gold
+ secondary: '#8B6914', // Dark gold
+ accent: '#E8CEFF', // Lavender
+ background: '#0A0A0A', // Jet black
+ foreground: '#F5F5F0',
+ muted: '#1A1A1A',
+ },
+ typography: {
+ fontFamily: 'inter',
+ headingFontFamily: 'playfair',
+ baseFontSize: 15,
+ headingScale: 1.25,
+ },
+ layout: 'centered',
+ borderRadius: 'none',
+ },
+ defaultHero: {
+ style: 'minimal',
+ alignment: 'center',
+ minHeight: 'lg',
+ backgroundGradient: 'from-black via-yellow-950 to-black',
+ },
+ defaultProductCard: 'minimal',
+};
+
+/**
+ * Bookshelf - Books & Education
+ */
+const bookshelfTheme: ThemeTemplate = {
+ id: 'bookshelf',
+ name: 'Bookshelf',
+ description: 'Intellectual, clean design for book stores and education platforms',
+ category: 'BOOKS_EDUCATION',
+ tags: ['books', 'education', 'knowledge', 'academic', 'reading'],
+ theme: {
+ templateId: 'bookshelf',
+ colors: {
+ primary: '#1E3A5F', // Navy
+ secondary: '#C2410C', // Terra cotta
+ accent: '#0D9488', // Teal
+ background: '#FFFEF7', // Ivory
+ foreground: '#1A1A2E',
+ muted: '#F3F0E6',
+ },
+ typography: {
+ fontFamily: 'inter',
+ headingFontFamily: 'playfair',
+ baseFontSize: 16,
+ headingScale: 1.333,
+ },
+ layout: 'boxed',
+ borderRadius: 'sm',
+ },
+ defaultHero: {
+ style: 'split',
+ alignment: 'left',
+ minHeight: 'md',
+ backgroundGradient: 'from-blue-950 to-indigo-950',
+ },
+ defaultProductCard: 'detailed',
+};
+
/**
* All available theme templates
*/
@@ -225,6 +528,14 @@ export const themeTemplates: Record
= {
elegant: elegantTheme,
minimal: minimalTheme,
boutique: boutiqueTheme,
+ 'tech-nova': techNovaTheme,
+ 'fashion-forward': fashionForwardTheme,
+ 'cafe-bistro': cafeBistroTheme,
+ 'glow-up': glowUpTheme,
+ 'home-vibes': homeVibesTheme,
+ 'sport-zone': sportZoneTheme,
+ 'jewel-box': jewelBoxTheme,
+ bookshelf: bookshelfTheme,
};
/**
@@ -241,6 +552,13 @@ export function getAllThemeTemplates(): ThemeTemplate[] {
return Object.values(themeTemplates);
}
+/**
+ * Get themes filtered by category
+ */
+export function getThemesByCategory(category: ThemeTemplate['category']): ThemeTemplate[] {
+ return Object.values(themeTemplates).filter((t) => t.category === category);
+}
+
/**
* Generate CSS variables from theme settings
*/
@@ -272,4 +590,3 @@ function getBorderRadiusValue(radius: ThemeTemplate['theme']['borderRadius']): s
};
return values[radius] || '8px';
}
-
diff --git a/src/lib/storefront/types.ts b/src/lib/storefront/types.ts
index 8d62abc4..f626fe19 100644
--- a/src/lib/storefront/types.ts
+++ b/src/lib/storefront/types.ts
@@ -6,7 +6,35 @@
*/
// Theme template identifiers
-export type ThemeTemplateId = 'modern' | 'classic' | 'bold' | 'elegant' | 'minimal' | 'boutique';
+export type ThemeTemplateId =
+ | 'modern'
+ | 'classic'
+ | 'bold'
+ | 'elegant'
+ | 'minimal'
+ | 'boutique'
+ // Extended marketplace themes
+ | 'tech-nova'
+ | 'fashion-forward'
+ | 'cafe-bistro'
+ | 'glow-up'
+ | 'home-vibes'
+ | 'sport-zone'
+ | 'jewel-box'
+ | 'bookshelf';
+
+// Theme marketplace categories (mirrors Prisma ThemeCategory enum)
+export type ThemeCategory =
+ | 'GENERAL'
+ | 'ELECTRONICS'
+ | 'FASHION'
+ | 'FOOD_BEVERAGE'
+ | 'HEALTH_BEAUTY'
+ | 'HOME_LIFESTYLE'
+ | 'SPORTS_OUTDOORS'
+ | 'BOOKS_EDUCATION'
+ | 'JEWELRY'
+ | 'AUTOMOTIVE';
// Layout variants
export type LayoutVariant = 'full-width' | 'boxed' | 'centered';
@@ -488,9 +516,40 @@ export interface ThemeTemplate {
id: ThemeTemplateId;
name: string;
description: string;
+ category: ThemeCategory;
+ tags: string[];
preview?: string; // Preview image URL
theme: ThemeSettings;
defaultHero: Partial;
defaultProductCard: ProductCardStyle;
}
+/**
+ * Marketplace theme metadata returned from the API
+ */
+export interface MarketplaceThemeMeta {
+ id: string;
+ slug: string;
+ name: string;
+ description: string;
+ longDescription?: string;
+ category: ThemeCategory;
+ tags: string[];
+ previewImageUrl?: string;
+ thumbnailUrl?: string;
+ previewImages: string[];
+ config: ThemeSettings;
+ status: 'ACTIVE' | 'DRAFT' | 'ARCHIVED';
+ isFeatured: boolean;
+ isPremium: boolean;
+ price: number;
+ author: string;
+ version: string;
+ downloadCount: number;
+ averageRating: number;
+ ratingCount: number;
+ createdAt: string;
+ updatedAt: string;
+ isInstalled?: boolean;
+}
+
diff --git a/tsconfig.json b/tsconfig.json
index e3b11f49..2d7f2a9d 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -40,6 +40,7 @@
"node_modules",
"scripts",
".next",
+ "apps",
"src/test/**",
"e2e/**",
"coverage/**",
diff --git a/vercel.json b/vercel.json
index 9c6f2572..602fd977 100644
--- a/vercel.json
+++ b/vercel.json
@@ -32,3 +32,4 @@
},
"crons": []
}
+