@o2vend/theme-cli 1.0.32

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.
Files changed (116) hide show
  1. package/README.md +425 -0
  2. package/assets/Logo_o2vend.png +0 -0
  3. package/assets/favicon.png +0 -0
  4. package/assets/logo-white.png +0 -0
  5. package/bin/o2vend +42 -0
  6. package/config/widget-map.json +50 -0
  7. package/lib/commands/check.js +201 -0
  8. package/lib/commands/generate.js +33 -0
  9. package/lib/commands/init.js +214 -0
  10. package/lib/commands/optimize.js +216 -0
  11. package/lib/commands/package.js +208 -0
  12. package/lib/commands/serve.js +105 -0
  13. package/lib/commands/validate.js +191 -0
  14. package/lib/lib/api-client.js +357 -0
  15. package/lib/lib/dev-server.js +2618 -0
  16. package/lib/lib/file-watcher.js +80 -0
  17. package/lib/lib/hot-reload.js +106 -0
  18. package/lib/lib/liquid-engine.js +822 -0
  19. package/lib/lib/liquid-filters.js +671 -0
  20. package/lib/lib/mock-api-server.js +989 -0
  21. package/lib/lib/mock-data.js +1468 -0
  22. package/lib/lib/widget-service.js +321 -0
  23. package/package.json +70 -0
  24. package/test-theme/README.md +27 -0
  25. package/test-theme/assets/async-sections.js +446 -0
  26. package/test-theme/assets/cart-drawer.js +463 -0
  27. package/test-theme/assets/cart-manager.js +223 -0
  28. package/test-theme/assets/checkout-price-handler.js +368 -0
  29. package/test-theme/assets/components.css +4629 -0
  30. package/test-theme/assets/delivery-zone.css +299 -0
  31. package/test-theme/assets/delivery-zone.js +396 -0
  32. package/test-theme/assets/logo.png +0 -0
  33. package/test-theme/assets/sections.css +48 -0
  34. package/test-theme/assets/theme.css +3500 -0
  35. package/test-theme/assets/theme.js +3745 -0
  36. package/test-theme/config/settings_data.json +292 -0
  37. package/test-theme/config/settings_schema.json +1050 -0
  38. package/test-theme/layout/theme.liquid +195 -0
  39. package/test-theme/locales/en.default.json +260 -0
  40. package/test-theme/sections/content-fallback.liquid +53 -0
  41. package/test-theme/sections/content.liquid +57 -0
  42. package/test-theme/sections/footer-fallback.liquid +328 -0
  43. package/test-theme/sections/footer.liquid +278 -0
  44. package/test-theme/sections/header-fallback.liquid +1805 -0
  45. package/test-theme/sections/header.liquid +1145 -0
  46. package/test-theme/sections/hero-fallback.liquid +212 -0
  47. package/test-theme/sections/hero.liquid +136 -0
  48. package/test-theme/snippets/account-sidebar.liquid +200 -0
  49. package/test-theme/snippets/add-to-cart-modal.liquid +484 -0
  50. package/test-theme/snippets/breadcrumbs.liquid +134 -0
  51. package/test-theme/snippets/cart-drawer.liquid +467 -0
  52. package/test-theme/snippets/delivery-zone-city-selector.liquid +79 -0
  53. package/test-theme/snippets/delivery-zone-modal.liquid +337 -0
  54. package/test-theme/snippets/delivery-zone-search.liquid +78 -0
  55. package/test-theme/snippets/icon.liquid +105 -0
  56. package/test-theme/snippets/login-modal.liquid +346 -0
  57. package/test-theme/snippets/mega-menu.liquid +812 -0
  58. package/test-theme/snippets/news-thumbnail.liquid +187 -0
  59. package/test-theme/snippets/pagination.liquid +120 -0
  60. package/test-theme/snippets/price.liquid +92 -0
  61. package/test-theme/snippets/product-card-related.liquid +78 -0
  62. package/test-theme/snippets/product-card-simple.liquid +41 -0
  63. package/test-theme/snippets/product-card.liquid +697 -0
  64. package/test-theme/snippets/rating.liquid +85 -0
  65. package/test-theme/snippets/skeleton-collection-grid.liquid +114 -0
  66. package/test-theme/snippets/skeleton-product-card.liquid +124 -0
  67. package/test-theme/snippets/skeleton-product-grid.liquid +34 -0
  68. package/test-theme/snippets/social-sharing.liquid +185 -0
  69. package/test-theme/templates/account/dashboard.liquid +401 -0
  70. package/test-theme/templates/account/loyalty-redemption.liquid +405 -0
  71. package/test-theme/templates/account/loyalty.liquid +588 -0
  72. package/test-theme/templates/account/order-detail.liquid +230 -0
  73. package/test-theme/templates/account/orders.liquid +349 -0
  74. package/test-theme/templates/account/profile.liquid +758 -0
  75. package/test-theme/templates/account/register.liquid +232 -0
  76. package/test-theme/templates/account/return-orders.liquid +348 -0
  77. package/test-theme/templates/account/store-credit.liquid +464 -0
  78. package/test-theme/templates/account/subscriptions.liquid +601 -0
  79. package/test-theme/templates/account/wishlist.liquid +419 -0
  80. package/test-theme/templates/address-book.liquid +1092 -0
  81. package/test-theme/templates/categories.liquid +452 -0
  82. package/test-theme/templates/checkout.liquid +4511 -0
  83. package/test-theme/templates/error.liquid +384 -0
  84. package/test-theme/templates/index.liquid +11 -0
  85. package/test-theme/templates/login.liquid +185 -0
  86. package/test-theme/templates/order-confirmation.liquid +720 -0
  87. package/test-theme/templates/page.liquid +297 -0
  88. package/test-theme/templates/product-detail.liquid +4363 -0
  89. package/test-theme/templates/products.liquid +518 -0
  90. package/test-theme/templates/search.liquid +922 -0
  91. package/test-theme/theme.json.example +19 -0
  92. package/test-theme/widgets/brand-carousel.liquid +676 -0
  93. package/test-theme/widgets/brand.liquid +245 -0
  94. package/test-theme/widgets/carousel.liquid +843 -0
  95. package/test-theme/widgets/category-list-carousel.liquid +656 -0
  96. package/test-theme/widgets/category-list.liquid +340 -0
  97. package/test-theme/widgets/category.liquid +475 -0
  98. package/test-theme/widgets/discount-time.liquid +176 -0
  99. package/test-theme/widgets/footer-menu.liquid +695 -0
  100. package/test-theme/widgets/footer.liquid +179 -0
  101. package/test-theme/widgets/gallery.liquid +271 -0
  102. package/test-theme/widgets/header-menu.liquid +932 -0
  103. package/test-theme/widgets/header.liquid +159 -0
  104. package/test-theme/widgets/html.liquid +214 -0
  105. package/test-theme/widgets/news.liquid +217 -0
  106. package/test-theme/widgets/product-canvas.liquid +235 -0
  107. package/test-theme/widgets/product-carousel.liquid +502 -0
  108. package/test-theme/widgets/product.liquid +45 -0
  109. package/test-theme/widgets/recently-viewed.liquid +26 -0
  110. package/test-theme/widgets/shared/product-grid.liquid +339 -0
  111. package/test-theme/widgets/simple-product.liquid +42 -0
  112. package/test-theme/widgets/single-product.liquid +610 -0
  113. package/test-theme/widgets/spacebar-carousel.liquid +663 -0
  114. package/test-theme/widgets/spacebar.liquid +279 -0
  115. package/test-theme/widgets/splash.liquid +378 -0
  116. package/test-theme/widgets/testimonial-carousel.liquid +709 -0
@@ -0,0 +1,1468 @@
1
+ /**
2
+ * Mock Data Generator
3
+ * Generates realistic mock data for development
4
+ */
5
+
6
+ /**
7
+ * Generate mock data
8
+ * @returns {Object} Mock data object
9
+ */
10
+ function generateMockData() {
11
+ return {
12
+ store: {
13
+ id: 'mock-store-1',
14
+ name: 'My O2VEND Store',
15
+ description: 'A beautiful e-commerce store powered by O2VEND',
16
+ domain: 'localhost:3000',
17
+ email: 'store@example.com',
18
+ phone: '+1234567890',
19
+ address: {
20
+ address1: '123 Main Street',
21
+ city: 'New York',
22
+ state: 'NY',
23
+ zip: '10001',
24
+ country: 'US'
25
+ },
26
+ currency: 'USD',
27
+ currencySymbol: '$',
28
+ locale: 'en-US',
29
+ timezone: 'America/New_York',
30
+ settings: {
31
+ currencySymbol: '$',
32
+ currencyFormat: '#,##0.00',
33
+ currencyDecimalDigits: 2,
34
+ currencyGroupSeparator: ',',
35
+ currencyDecimalSeparator: '.'
36
+ }
37
+ },
38
+
39
+ settings: {
40
+ shopName: 'My O2VEND Store',
41
+ shopEmail: 'store@example.com',
42
+ shopPhone: '+1234567890'
43
+ },
44
+
45
+ products: generateMockProducts(30), // At least 30 products for better testing
46
+ categories: generateMockCategories(10), // 10 categories (more than 5)
47
+ brands: generateMockBrands(10), // 10 brands (more than 5)
48
+ widgets: generateMockWidgets(),
49
+ cart: {
50
+ id: 'mock-cart-1',
51
+ items: [],
52
+ total: 0,
53
+ itemCount: 0,
54
+ currency: 'USD'
55
+ }
56
+ };
57
+ }
58
+
59
+ /**
60
+ * Generate mock products
61
+ * @param {number} count - Number of products to generate
62
+ * @returns {Array} Mock products
63
+ */
64
+ function generateMockProducts(count = 20) {
65
+ console.log(`[MOCK DATA] Generating ${count} mock products with variations and stock...`);
66
+ const products = [];
67
+
68
+ // Product data with images from picsum.photos (reliable placeholder service)
69
+ const productData = [
70
+ { name: 'Wireless Headphones', category: 'Electronics', imageId: 1 },
71
+ { name: 'Smart Watch', category: 'Electronics', imageId: 2 },
72
+ { name: 'Laptop Stand', category: 'Electronics', imageId: 3 },
73
+ { name: 'USB-C Cable', category: 'Electronics', imageId: 4 },
74
+ { name: 'Wireless Mouse', category: 'Electronics', imageId: 5 },
75
+ { name: 'Mechanical Keyboard', category: 'Electronics', imageId: 6 },
76
+ { name: '4K Monitor', category: 'Electronics', imageId: 7 },
77
+ { name: 'HD Webcam', category: 'Electronics', imageId: 8 },
78
+ { name: 'Bluetooth Speaker', category: 'Electronics', imageId: 9 },
79
+ { name: 'iPad Pro', category: 'Electronics', imageId: 10 },
80
+ { name: 'iPhone 15 Pro', category: 'Electronics', imageId: 11 },
81
+ { name: 'DSLR Camera', category: 'Electronics', imageId: 12 },
82
+ { name: 'DJI Drone', category: 'Electronics', imageId: 13 },
83
+ { name: 'Ergonomic Gaming Chair', category: 'Furniture', imageId: 14 },
84
+ { name: 'LED Desk Lamp', category: 'Home', imageId: 15 },
85
+ { name: 'Premium Notebook', category: 'Office', imageId: 16 },
86
+ { name: 'Executive Pen Set', category: 'Office', imageId: 17 },
87
+ { name: 'Travel Backpack', category: 'Accessories', imageId: 18 },
88
+ { name: 'Insulated Water Bottle', category: 'Sports', imageId: 19 },
89
+ { name: 'Ceramic Coffee Mug', category: 'Home', imageId: 20 },
90
+ { name: 'Cotton T-Shirt', category: 'Clothing', imageId: 21 },
91
+ { name: 'Slim Fit Jeans', category: 'Clothing', imageId: 22 },
92
+ { name: 'Running Sneakers', category: 'Footwear', imageId: 23 },
93
+ { name: 'Polarized Sunglasses', category: 'Accessories', imageId: 24 },
94
+ { name: 'Yoga Mat', category: 'Sports', imageId: 25 },
95
+ { name: 'Fitness Tracker', category: 'Electronics', imageId: 26 },
96
+ { name: 'Portable Charger', category: 'Electronics', imageId: 27 },
97
+ { name: 'Leather Wallet', category: 'Accessories', imageId: 28 },
98
+ { name: 'Stainless Steel Watch', category: 'Accessories', imageId: 29 },
99
+ { name: 'Noise Cancelling Earbuds', category: 'Electronics', imageId: 30 }
100
+ ];
101
+
102
+ const productNames = productData.map(p => p.name);
103
+
104
+ // Products that typically have size variations
105
+ const sizeBasedProducts = ['T-Shirt', 'Jeans', 'Sneakers', 'Backpack'];
106
+ // Products that typically have color variations
107
+ const colorBasedProducts = ['Wireless Headphones', 'Smart Watch', 'Water Bottle', 'Coffee Mug', 'Backpack', 'Sunglasses'];
108
+ // Products that have both size and color
109
+ const multiVariationProducts = ['T-Shirt', 'Jeans', 'Sneakers'];
110
+
111
+ const sizes = ['XS', 'S', 'M', 'L', 'XL', 'XXL'];
112
+ const colors = ['Black', 'White', 'Red', 'Blue', 'Green', 'Gray', 'Navy', 'Brown'];
113
+
114
+ for (let i = 0; i < count; i++) {
115
+ const productId = `product-${i + 1}`;
116
+ const basePrice = Math.floor(Math.random() * 50000) + 1000; // $10 to $500 (in cents)
117
+ const comparePrice = basePrice * 1.5;
118
+ const productName = productNames[i % productNames.length];
119
+
120
+ // Determine stock quantity - mix of low stock, high stock, and out of stock
121
+ const stockType = i % 5;
122
+ let stock, inStock;
123
+ if (stockType === 0) {
124
+ // Out of stock
125
+ stock = 0;
126
+ inStock = false;
127
+ } else if (stockType === 1) {
128
+ // Low stock (1-5 items)
129
+ stock = Math.floor(Math.random() * 5) + 1;
130
+ inStock = true;
131
+ } else if (stockType === 2) {
132
+ // Medium stock (6-20 items)
133
+ stock = Math.floor(Math.random() * 15) + 6;
134
+ inStock = true;
135
+ } else {
136
+ // High stock (21-100+ items)
137
+ stock = Math.floor(Math.random() * 80) + 21;
138
+ inStock = true;
139
+ }
140
+
141
+ // Determine if product should have variations
142
+ const hasVariations = i % 3 !== 0; // 2/3 of products have variations
143
+ const hasSizeVariations = hasVariations && (sizeBasedProducts.includes(productName) || multiVariationProducts.includes(productName));
144
+ const hasColorVariations = hasVariations && (colorBasedProducts.includes(productName) || multiVariationProducts.includes(productName));
145
+ const hasMultiVariations = hasVariations && multiVariationProducts.includes(productName);
146
+
147
+ // Generate variants
148
+ const variants = [];
149
+ if (hasMultiVariations) {
150
+ // Product with both size and color variations
151
+ let variantIndex = 1;
152
+ for (const size of sizes.slice(0, 4)) { // Use first 4 sizes
153
+ for (const color of colors.slice(0, 3)) { // Use first 3 colors
154
+ const variantPrice = basePrice + (variantIndex % 3 === 0 ? 500 : 0); // Some variants slightly more expensive
155
+ const variantMrp = Math.round(variantPrice * 1.5);
156
+ const variantStock = Math.floor(Math.random() * stock) + (stock > 0 ? 1 : 0);
157
+ const variantProductId = (i + 1) * 1000 + variantIndex; // Unique productId for variant
158
+ variants.push({
159
+ id: `variant-${i + 1}-${variantIndex}`,
160
+ productId: variantProductId, // Required by product-card template
161
+ title: `${size} / ${color}`,
162
+ option1: size,
163
+ option2: color,
164
+ option1Name: 'Size',
165
+ option2Name: 'Color',
166
+ price: variantPrice,
167
+ compareAtPrice: variantMrp,
168
+ // prices object required by product-card template
169
+ prices: {
170
+ price: variantPrice,
171
+ mrp: variantMrp
172
+ },
173
+ sku: `SKU-${i + 1}-${size}-${color}`,
174
+ inStock: variantStock > 0,
175
+ stock: variantStock,
176
+ available: variantStock > 0
177
+ });
178
+ variantIndex++;
179
+ }
180
+ }
181
+ } else if (hasSizeVariations) {
182
+ // Product with size variations only
183
+ sizes.slice(0, 5).forEach((size, idx) => {
184
+ const variantPrice = basePrice + (idx * 200); // Larger sizes cost more
185
+ const variantMrp = Math.round(variantPrice * 1.5);
186
+ const variantStock = Math.floor(Math.random() * stock) + (stock > 0 ? 1 : 0);
187
+ const variantProductId = (i + 1) * 1000 + idx + 1;
188
+ variants.push({
189
+ id: `variant-${i + 1}-${idx + 1}`,
190
+ productId: variantProductId,
191
+ title: size,
192
+ option1: size,
193
+ option1Name: 'Size',
194
+ price: variantPrice,
195
+ compareAtPrice: variantMrp,
196
+ prices: {
197
+ price: variantPrice,
198
+ mrp: variantMrp
199
+ },
200
+ sku: `SKU-${i + 1}-${size}`,
201
+ inStock: variantStock > 0,
202
+ stock: variantStock,
203
+ available: variantStock > 0
204
+ });
205
+ });
206
+ } else if (hasColorVariations) {
207
+ // Product with color variations only
208
+ colors.slice(0, 4).forEach((color, idx) => {
209
+ const variantPrice = basePrice + (idx % 2 === 0 ? 300 : 0); // Some colors cost more
210
+ const variantMrp = Math.round(variantPrice * 1.5);
211
+ const variantStock = Math.floor(Math.random() * stock) + (stock > 0 ? 1 : 0);
212
+ const variantProductId = (i + 1) * 1000 + idx + 1;
213
+ variants.push({
214
+ id: `variant-${i + 1}-${idx + 1}`,
215
+ productId: variantProductId,
216
+ title: color,
217
+ option1: color,
218
+ option1Name: 'Color',
219
+ price: variantPrice,
220
+ compareAtPrice: variantMrp,
221
+ prices: {
222
+ price: variantPrice,
223
+ mrp: variantMrp
224
+ },
225
+ sku: `SKU-${i + 1}-${color}`,
226
+ inStock: variantStock > 0,
227
+ stock: variantStock,
228
+ available: variantStock > 0
229
+ });
230
+ });
231
+ } else {
232
+ // Single variant product (no variations)
233
+ const variantProductId = (i + 1) * 1000 + 1;
234
+ variants.push({
235
+ id: `variant-${i + 1}-1`,
236
+ productId: variantProductId,
237
+ title: 'Default',
238
+ price: basePrice,
239
+ compareAtPrice: comparePrice,
240
+ prices: {
241
+ price: basePrice,
242
+ mrp: comparePrice
243
+ },
244
+ sku: `SKU-${i + 1}`,
245
+ inStock: inStock,
246
+ stock: stock,
247
+ available: inStock
248
+ });
249
+ }
250
+
251
+ // Calculate total stock from variants
252
+ const totalStock = variants.reduce((sum, v) => sum + (v.stock || 0), 0);
253
+ const hasAnyStock = variants.some(v => v.inStock || v.available);
254
+
255
+ const productHandle = `product-${i + 1}`.toLowerCase();
256
+ products.push({
257
+ id: productId,
258
+ productId: i + 1, // Numeric product ID for API compatibility
259
+ title: productName + (i > 0 ? ` ${i + 1}` : ''),
260
+ name: productName + (i > 0 ? ` ${i + 1}` : ''), // Also provide name for templates
261
+ handle: productHandle,
262
+ slug: productHandle,
263
+ url: `/products/${productHandle}`, // URL for product detail page
264
+ link: `/products/${productHandle}`, // Alternative URL property
265
+ description: `Description for ${productName}. High quality product with excellent features.${hasVariations ? ' Available in multiple options.' : ''}`,
266
+ price: basePrice,
267
+ compareAtPrice: comparePrice,
268
+ // Prices object used by product-card snippet
269
+ prices: {
270
+ price: basePrice,
271
+ mrp: comparePrice,
272
+ currency: 'USD'
273
+ },
274
+ discountPercentage: Math.floor(((comparePrice - basePrice) / comparePrice) * 100),
275
+ currency: 'USD',
276
+ inStock: hasAnyStock,
277
+ available: hasAnyStock, // Alternative property for availability
278
+ stock: totalStock,
279
+ stockQuantity: totalStock, // Alternative property for stock
280
+ sku: `SKU-${i + 1}`,
281
+ categoryId: `category-${(i % 10) + 1}`,
282
+ brandId: `brand-${(i % 8) + 1}`,
283
+ // Primary thumbnail for product cards
284
+ thumbnailImage1: {
285
+ url: `https://picsum.photos/seed/${productData[i % productData.length].imageId}/800/800`,
286
+ altText: productName
287
+ },
288
+ imageUrl: `https://picsum.photos/seed/${productData[i % productData.length].imageId}/800/800`,
289
+ images: [
290
+ {
291
+ id: `img-${i + 1}-1`,
292
+ url: `https://picsum.photos/seed/${productData[i % productData.length].imageId}/800/800`,
293
+ alt: productName,
294
+ altText: productName,
295
+ width: 800,
296
+ height: 800
297
+ },
298
+ {
299
+ id: `img-${i + 1}-2`,
300
+ url: `https://picsum.photos/seed/${productData[i % productData.length].imageId + 100}/800/800`,
301
+ alt: `${productName} - View 2`,
302
+ altText: `${productName} - View 2`,
303
+ width: 800,
304
+ height: 800
305
+ },
306
+ {
307
+ id: `img-${i + 1}-3`,
308
+ url: `https://picsum.photos/seed/${productData[i % productData.length].imageId + 200}/800/800`,
309
+ alt: `${productName} - View 3`,
310
+ altText: `${productName} - View 3`,
311
+ width: 800,
312
+ height: 800
313
+ }
314
+ ],
315
+ variants: variants,
316
+ options: hasMultiVariations
317
+ ? [
318
+ { name: 'Size', values: sizes.slice(0, 4) },
319
+ { name: 'Color', values: colors.slice(0, 3) }
320
+ ]
321
+ : hasSizeVariations
322
+ ? [{ name: 'Size', values: sizes.slice(0, 5) }]
323
+ : hasColorVariations
324
+ ? [{ name: 'Color', values: colors.slice(0, 4) }]
325
+ : [],
326
+ tags: ['featured', 'new', 'sale'],
327
+ createdAt: new Date(Date.now() - Math.random() * 365 * 24 * 60 * 60 * 1000).toISOString(),
328
+ // Required fields for product-detail JSON template
329
+ productType: 0, // 0 = simple product, 1 = variable, 2 = subscription
330
+ // additionalData uses | default:null without | json, so we use string 'null'
331
+ // This outputs as literal null in JSON (without quotes)
332
+ additionalData: 'null',
333
+ // These fields use | json filter, so they should be actual arrays
334
+ combinations: [],
335
+ subscriptions: [],
336
+ shippingMethods: [],
337
+ variations: variants // Also expose as variations for template compatibility
338
+ });
339
+ }
340
+
341
+ // Log summary
342
+ const productsWithVariations = products.filter(p => (p.variants?.length || 0) > 1).length;
343
+ const productsWithOptions = products.filter(p => (p.options?.length || 0) > 0).length;
344
+ const outOfStock = products.filter(p => !p.inStock || (p.stock || 0) === 0).length;
345
+ console.log(`[MOCK DATA] ✅ Generated ${products.length} products:`);
346
+ console.log(` - With variations: ${productsWithVariations}`);
347
+ console.log(` - With options: ${productsWithOptions}`);
348
+ console.log(` - Out of stock: ${outOfStock}`);
349
+
350
+ return products;
351
+ }
352
+
353
+ /**
354
+ * Generate mock categories
355
+ * @param {number} count - Number of categories to generate
356
+ * @returns {Array} Mock categories
357
+ */
358
+ function generateMockCategories(count = 10) {
359
+ const categories = [];
360
+ const categoryData = [
361
+ { name: 'Electronics', imageId: 50, description: 'Latest gadgets, smartphones, laptops, and tech accessories' },
362
+ { name: 'Clothing', imageId: 51, description: 'Fashion apparel for men, women, and kids' },
363
+ { name: 'Accessories', imageId: 52, description: 'Watches, bags, jewelry, and more' },
364
+ { name: 'Home & Garden', imageId: 53, description: 'Furniture, decor, and gardening supplies' },
365
+ { name: 'Sports & Fitness', imageId: 54, description: 'Sports equipment, gym gear, and outdoor activities' },
366
+ { name: 'Books & Media', imageId: 55, description: 'Books, e-books, music, and movies' },
367
+ { name: 'Toys & Games', imageId: 56, description: 'Toys, board games, and video games' },
368
+ { name: 'Beauty & Health', imageId: 57, description: 'Skincare, makeup, and wellness products' },
369
+ { name: 'Automotive', imageId: 58, description: 'Car parts, accessories, and maintenance tools' },
370
+ { name: 'Food & Beverages', imageId: 59, description: 'Gourmet food, snacks, and drinks' }
371
+ ];
372
+
373
+ for (let i = 0; i < count; i++) {
374
+ const catData = categoryData[i] || { name: `Category ${i + 1}`, imageId: 60 + i, description: `Products in Category ${i + 1}` };
375
+ categories.push({
376
+ id: `category-${i + 1}`,
377
+ name: catData.name,
378
+ handle: catData.name.toLowerCase().replace(/\s+/g, '-').replace(/&/g, 'and'),
379
+ description: catData.description,
380
+ image: `https://picsum.photos/seed/cat${catData.imageId}/400/300`,
381
+ productCount: Math.floor(Math.random() * 50) + 5,
382
+ parentId: i > 5 ? `category-${Math.floor(Math.random() * 5) + 1}` : null
383
+ });
384
+ }
385
+
386
+ return categories;
387
+ }
388
+
389
+ /**
390
+ * Generate mock brands
391
+ * @param {number} count - Number of brands to generate
392
+ * @returns {Array} Mock brands
393
+ */
394
+ function generateMockBrands(count = 10) {
395
+ const brands = [];
396
+ const brandData = [
397
+ { name: 'TechNova', tagline: 'Innovation in Every Device', imageId: 70 },
398
+ { name: 'StyleVerse', tagline: 'Fashion Forward', imageId: 71 },
399
+ { name: 'HomeNest', tagline: 'Comfort Meets Design', imageId: 72 },
400
+ { name: 'SportEdge', tagline: 'Performance Unleashed', imageId: 73 },
401
+ { name: 'PageTurner', tagline: 'Stories That Inspire', imageId: 74 },
402
+ { name: 'PlayZone', tagline: 'Fun for All Ages', imageId: 75 },
403
+ { name: 'GlowUp', tagline: 'Beauty Redefined', imageId: 76 },
404
+ { name: 'AutoElite', tagline: 'Drive Excellence', imageId: 77 },
405
+ { name: 'UrbanStyle', tagline: 'Street to Suite', imageId: 78 },
406
+ { name: 'PowerTech', tagline: 'Energy for Life', imageId: 79 }
407
+ ];
408
+
409
+ for (let i = 0; i < count; i++) {
410
+ const brand = brandData[i] || { name: `Brand ${i + 1}`, tagline: 'Quality Products', imageId: 80 + i };
411
+ brands.push({
412
+ id: `brand-${i + 1}`,
413
+ name: brand.name,
414
+ handle: brand.name.toLowerCase().replace(/\s+/g, '-'),
415
+ description: `${brand.tagline}. Premium products from ${brand.name}`,
416
+ logo: `https://picsum.photos/seed/brand${brand.imageId}/200/100`,
417
+ image: `https://picsum.photos/seed/brand${brand.imageId}/400/200`,
418
+ productCount: Math.floor(Math.random() * 30) + 5
419
+ });
420
+ }
421
+
422
+ return brands;
423
+ }
424
+
425
+ /**
426
+ * Generate mock widgets for different sections
427
+ * Comprehensive widget data matching O2VEND webstore expected structures
428
+ * @returns {Array} Mock widgets
429
+ */
430
+ function generateMockWidgets() {
431
+ const widgets = [
432
+ // ==================== HEADER SECTION ====================
433
+ {
434
+ id: 'widget-header-1',
435
+ type: 'Header',
436
+ section: 'header',
437
+ sectionName: 'header',
438
+ status: 'active',
439
+ Position: 1,
440
+ settings: {
441
+ showSearch: true,
442
+ showCart: true,
443
+ showAccount: true,
444
+ stickyHeader: true,
445
+ showWidgetTitle: 'No'
446
+ },
447
+ data: {
448
+ content: {
449
+ Logo: '/assets/logo.png',
450
+ logo: '/assets/logo.png'
451
+ }
452
+ }
453
+ },
454
+ {
455
+ id: 'widget-header-menu-1',
456
+ type: 'HeaderMenu',
457
+ section: 'header',
458
+ sectionName: 'header',
459
+ status: 'active',
460
+ Position: 2,
461
+ settings: {
462
+ menuId: 'main-menu',
463
+ showWidgetTitle: 'No'
464
+ },
465
+ data: {
466
+ content: {
467
+ menuId: 'main-menu'
468
+ }
469
+ }
470
+ },
471
+
472
+ // ==================== HERO SECTION ====================
473
+ // Carousel Widget - Hero Slider
474
+ {
475
+ id: 'widget-carousel-1',
476
+ type: 'Carousel',
477
+ section: 'hero',
478
+ sectionName: 'hero',
479
+ status: 'active',
480
+ Position: 1,
481
+ settings: {
482
+ showWidgetTitle: 'No',
483
+ showContainer: 'Yes',
484
+ showWidgetBottomMargin: 'Yes',
485
+ autoplay: true,
486
+ interval: 5000,
487
+ hideArrow: false,
488
+ hideDot: false,
489
+ captionHorizontalAlignment: 'left',
490
+ captionVerticalAlignment: 'center'
491
+ },
492
+ data: {
493
+ content: {
494
+ Items: [
495
+ {
496
+ ImageUrl: 'https://picsum.photos/seed/hero1/1400/600',
497
+ imageUrl: 'https://picsum.photos/seed/hero1/1400/600',
498
+ Caption: 'New Season Collection',
499
+ caption: 'New Season Collection',
500
+ SubCaption: 'Discover the latest trends and styles for this season',
501
+ subCaption: 'Discover the latest trends and styles for this season',
502
+ LinkText: 'Shop Now',
503
+ linkText: 'Shop Now',
504
+ TargetUrl: '/products',
505
+ targetUrl: '/products'
506
+ },
507
+ {
508
+ ImageUrl: 'https://picsum.photos/seed/hero2/1400/600',
509
+ imageUrl: 'https://picsum.photos/seed/hero2/1400/600',
510
+ Caption: 'Summer Sale - Up to 50% Off',
511
+ caption: 'Summer Sale - Up to 50% Off',
512
+ SubCaption: 'Limited time offer on selected items. Don\'t miss out!',
513
+ subCaption: 'Limited time offer on selected items. Don\'t miss out!',
514
+ LinkText: 'View Deals',
515
+ linkText: 'View Deals',
516
+ TargetUrl: '/collections',
517
+ targetUrl: '/collections'
518
+ },
519
+ {
520
+ ImageUrl: 'https://picsum.photos/seed/hero3/1400/600',
521
+ imageUrl: 'https://picsum.photos/seed/hero3/1400/600',
522
+ Caption: 'Premium Quality Products',
523
+ caption: 'Premium Quality Products',
524
+ SubCaption: 'Shop from top brands worldwide with guaranteed quality',
525
+ subCaption: 'Shop from top brands worldwide with guaranteed quality',
526
+ LinkText: 'Explore',
527
+ linkText: 'Explore',
528
+ TargetUrl: '/products',
529
+ targetUrl: '/products'
530
+ }
531
+ ]
532
+ }
533
+ },
534
+ content: JSON.stringify({
535
+ Items: [
536
+ { ImageUrl: 'https://picsum.photos/seed/hero1/1400/600', Caption: 'New Season Collection', SubCaption: 'Discover the latest trends', LinkText: 'Shop Now', TargetUrl: '/products' },
537
+ { ImageUrl: 'https://picsum.photos/seed/hero2/1400/600', Caption: 'Summer Sale', SubCaption: 'Up to 50% Off', LinkText: 'View Deals', TargetUrl: '/collections' },
538
+ { ImageUrl: 'https://picsum.photos/seed/hero3/1400/600', Caption: 'Premium Products', SubCaption: 'Top brands worldwide', LinkText: 'Explore', TargetUrl: '/products' }
539
+ ]
540
+ })
541
+ },
542
+
543
+ // SpaceBar Widget - Feature Icons/Cards
544
+ {
545
+ id: 'widget-spacebar-1',
546
+ type: 'SpaceBar',
547
+ section: 'hero',
548
+ sectionName: 'hero',
549
+ status: 'active',
550
+ Position: 2,
551
+ settings: {
552
+ showWidgetTitle: 'No',
553
+ backgroundColor: '#f8f9fa',
554
+ textColor: '#1a1a2e'
555
+ },
556
+ data: {
557
+ content: {
558
+ Items: [
559
+ {
560
+ Title: 'Free Shipping',
561
+ title: 'Free Shipping',
562
+ Description: 'On orders over $50',
563
+ description: 'On orders over $50',
564
+ IconHtml: '<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M5 18H3c-.6 0-1-.4-1-1V7c0-.6.4-1 1-1h10c.6 0 1 .4 1 1v11"/><path d="M14 9h4l4 4v4c0 .6-.4 1-1 1h-2"/><circle cx="7" cy="18" r="2"/><circle cx="17" cy="18" r="2"/></svg>',
565
+ iconHtml: '<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M5 18H3c-.6 0-1-.4-1-1V7c0-.6.4-1 1-1h10c.6 0 1 .4 1 1v11"/><path d="M14 9h4l4 4v4c0 .6-.4 1-1 1h-2"/><circle cx="7" cy="18" r="2"/><circle cx="17" cy="18" r="2"/></svg>',
566
+ ImageUrl: 'https://picsum.photos/seed/feature1/100/100',
567
+ imageUrl: 'https://picsum.photos/seed/feature1/100/100'
568
+ },
569
+ {
570
+ Title: '24/7 Support',
571
+ title: '24/7 Support',
572
+ Description: 'Dedicated support team',
573
+ description: 'Dedicated support team',
574
+ IconHtml: '<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>',
575
+ iconHtml: '<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>',
576
+ ImageUrl: 'https://picsum.photos/seed/feature2/100/100',
577
+ imageUrl: 'https://picsum.photos/seed/feature2/100/100'
578
+ },
579
+ {
580
+ Title: 'Secure Payment',
581
+ title: 'Secure Payment',
582
+ Description: '100% secure checkout',
583
+ description: '100% secure checkout',
584
+ IconHtml: '<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>',
585
+ iconHtml: '<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>',
586
+ ImageUrl: 'https://picsum.photos/seed/feature3/100/100',
587
+ imageUrl: 'https://picsum.photos/seed/feature3/100/100'
588
+ },
589
+ {
590
+ Title: 'Easy Returns',
591
+ title: 'Easy Returns',
592
+ Description: '30-day return policy',
593
+ description: '30-day return policy',
594
+ IconHtml: '<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><polyline points="1 4 1 10 7 10"/><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/></svg>',
595
+ iconHtml: '<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><polyline points="1 4 1 10 7 10"/><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/></svg>',
596
+ ImageUrl: 'https://picsum.photos/seed/feature4/100/100',
597
+ imageUrl: 'https://picsum.photos/seed/feature4/100/100'
598
+ }
599
+ ]
600
+ }
601
+ },
602
+ content: JSON.stringify({
603
+ Items: [
604
+ { Title: 'Free Shipping', Description: 'On orders over $50', ImageUrl: 'https://picsum.photos/seed/feature1/100/100' },
605
+ { Title: '24/7 Support', Description: 'Dedicated support team', ImageUrl: 'https://picsum.photos/seed/feature2/100/100' },
606
+ { Title: 'Secure Payment', Description: '100% secure checkout', ImageUrl: 'https://picsum.photos/seed/feature3/100/100' },
607
+ { Title: 'Easy Returns', Description: '30-day return policy', ImageUrl: 'https://picsum.photos/seed/feature4/100/100' }
608
+ ]
609
+ })
610
+ },
611
+
612
+ // ==================== CONTENT SECTION ====================
613
+ // CategoryList Widget
614
+ {
615
+ id: 'widget-category-list-1',
616
+ type: 'CategoryList',
617
+ section: 'content',
618
+ sectionName: 'content',
619
+ status: 'active',
620
+ Position: 1,
621
+ Title: 'Shop by Category',
622
+ settings: {
623
+ title: 'Shop by Category',
624
+ subtitle: 'Browse our popular categories',
625
+ showWidgetTitle: 'Yes',
626
+ widgetTitleAlignment: 'center',
627
+ columns: 5,
628
+ showProductCount: true
629
+ },
630
+ data: {
631
+ // Categories will be enriched by widget service, but provide fallback
632
+ categories: [
633
+ { Id: 1, id: 1, Name: 'Electronics', name: 'Electronics', Slug: '/categories/electronics', slug: '/categories/electronics', thumbnailImage: { url: 'https://picsum.photos/seed/cat1/400/300' }, productCount: 45 },
634
+ { Id: 2, id: 2, Name: 'Clothing', name: 'Clothing', Slug: '/categories/clothing', slug: '/categories/clothing', thumbnailImage: { url: 'https://picsum.photos/seed/cat2/400/300' }, productCount: 120 },
635
+ { Id: 3, id: 3, Name: 'Home & Garden', name: 'Home & Garden', Slug: '/categories/home-garden', slug: '/categories/home-garden', thumbnailImage: { url: 'https://picsum.photos/seed/cat3/400/300' }, productCount: 78 },
636
+ { Id: 4, id: 4, Name: 'Sports', name: 'Sports', Slug: '/categories/sports', slug: '/categories/sports', thumbnailImage: { url: 'https://picsum.photos/seed/cat4/400/300' }, productCount: 56 },
637
+ { Id: 5, id: 5, Name: 'Beauty', name: 'Beauty', Slug: '/categories/beauty', slug: '/categories/beauty', thumbnailImage: { url: 'https://picsum.photos/seed/cat5/400/300' }, productCount: 89 }
638
+ ],
639
+ Categories: [
640
+ { Id: 1, Name: 'Electronics', Slug: '/categories/electronics', ThumbnailImage: { Url: 'https://picsum.photos/seed/cat1/400/300' }, ProductCount: 45 },
641
+ { Id: 2, Name: 'Clothing', Slug: '/categories/clothing', ThumbnailImage: { Url: 'https://picsum.photos/seed/cat2/400/300' }, ProductCount: 120 },
642
+ { Id: 3, Name: 'Home & Garden', Slug: '/categories/home-garden', ThumbnailImage: { Url: 'https://picsum.photos/seed/cat3/400/300' }, ProductCount: 78 },
643
+ { Id: 4, Name: 'Sports', Slug: '/categories/sports', ThumbnailImage: { Url: 'https://picsum.photos/seed/cat4/400/300' }, ProductCount: 56 },
644
+ { Id: 5, Name: 'Beauty', Slug: '/categories/beauty', ThumbnailImage: { Url: 'https://picsum.photos/seed/cat5/400/300' }, ProductCount: 89 }
645
+ ]
646
+ },
647
+ content: JSON.stringify({
648
+ Categories: [
649
+ { Id: 1, Name: 'Electronics' },
650
+ { Id: 2, Name: 'Clothing' },
651
+ { Id: 3, Name: 'Home & Garden' },
652
+ { Id: 4, Name: 'Sports' },
653
+ { Id: 5, Name: 'Beauty' }
654
+ ]
655
+ })
656
+ },
657
+
658
+ // ==================== PRODUCT CAROUSELS (Client Favorites) ====================
659
+
660
+ // 1. Featured Products Carousel - Most Common
661
+ {
662
+ id: 'widget-product-carousel-featured',
663
+ type: 'ProductCarousel',
664
+ section: 'content',
665
+ sectionName: 'content',
666
+ status: 'active',
667
+ Position: 2,
668
+ Title: 'Featured Products',
669
+ settings: {
670
+ title: 'Featured Products',
671
+ subtitle: 'Handpicked just for you',
672
+ showWidgetTitle: 'Yes',
673
+ widgetTitleAlignment: 'center',
674
+ NumberOfProducts: 8,
675
+ numberOfProducts: 8,
676
+ limit: 8,
677
+ IsFeatured: true,
678
+ isFeatured: true,
679
+ autoplay: false,
680
+ showArrows: true,
681
+ showDots: false
682
+ },
683
+ data: {
684
+ content: {
685
+ Title: 'Featured Products',
686
+ Limit: 8,
687
+ IsFeatured: true,
688
+ Products: []
689
+ }
690
+ },
691
+ content: JSON.stringify({
692
+ NumberOfProducts: 8,
693
+ Limit: 8,
694
+ IsFeatured: true
695
+ })
696
+ },
697
+
698
+ // 2. Best Sellers Carousel - Very Popular
699
+ {
700
+ id: 'widget-product-carousel-bestsellers',
701
+ type: 'ProductCarousel',
702
+ section: 'content',
703
+ sectionName: 'content',
704
+ status: 'active',
705
+ Position: 3,
706
+ Title: 'Best Sellers',
707
+ settings: {
708
+ title: 'Best Sellers',
709
+ subtitle: 'Our most popular products',
710
+ showWidgetTitle: 'Yes',
711
+ widgetTitleAlignment: 'center',
712
+ NumberOfProducts: 10,
713
+ numberOfProducts: 10,
714
+ limit: 10,
715
+ OrderBy: 'BestSelling',
716
+ orderBy: 'bestselling',
717
+ autoplay: false,
718
+ showArrows: true
719
+ },
720
+ data: {
721
+ content: {
722
+ Title: 'Best Sellers',
723
+ Limit: 10,
724
+ OrderBy: 'BestSelling',
725
+ Products: []
726
+ }
727
+ },
728
+ content: JSON.stringify({
729
+ NumberOfProducts: 10,
730
+ OrderBy: 'BestSelling'
731
+ })
732
+ },
733
+
734
+ // 3. New Arrivals Carousel
735
+ {
736
+ id: 'widget-product-carousel-newarrivals',
737
+ type: 'ProductCarousel',
738
+ section: 'content',
739
+ sectionName: 'content',
740
+ status: 'active',
741
+ Position: 4,
742
+ Title: 'New Arrivals',
743
+ settings: {
744
+ title: 'New Arrivals',
745
+ subtitle: 'Fresh from our collection',
746
+ showWidgetTitle: 'Yes',
747
+ widgetTitleAlignment: 'center',
748
+ NumberOfProducts: 8,
749
+ numberOfProducts: 8,
750
+ limit: 8,
751
+ OrderBy: 'Newest',
752
+ orderBy: 'newest',
753
+ autoplay: false
754
+ },
755
+ data: {
756
+ content: {
757
+ Title: 'New Arrivals',
758
+ Limit: 8,
759
+ OrderBy: 'Newest',
760
+ Products: []
761
+ }
762
+ },
763
+ content: JSON.stringify({
764
+ NumberOfProducts: 8,
765
+ OrderBy: 'Newest'
766
+ })
767
+ },
768
+
769
+ // 4. Sale/Discount Products Carousel
770
+ {
771
+ id: 'widget-product-carousel-sale',
772
+ type: 'ProductCarousel',
773
+ section: 'content',
774
+ sectionName: 'content',
775
+ status: 'active',
776
+ Position: 5,
777
+ Title: 'On Sale',
778
+ settings: {
779
+ title: '🔥 Hot Deals',
780
+ subtitle: 'Limited time offers - Save up to 50%',
781
+ showWidgetTitle: 'Yes',
782
+ widgetTitleAlignment: 'center',
783
+ NumberOfProducts: 8,
784
+ numberOfProducts: 8,
785
+ limit: 8,
786
+ OnSale: true,
787
+ onSale: true,
788
+ backgroundColor: '#fff3cd',
789
+ autoplay: true,
790
+ autoplayInterval: 4000
791
+ },
792
+ data: {
793
+ content: {
794
+ Title: 'On Sale',
795
+ Limit: 8,
796
+ OnSale: true,
797
+ Products: []
798
+ }
799
+ },
800
+ content: JSON.stringify({
801
+ NumberOfProducts: 8,
802
+ OnSale: true
803
+ })
804
+ },
805
+
806
+ // 5. Trending Products Carousel
807
+ {
808
+ id: 'widget-product-carousel-trending',
809
+ type: 'ProductCarousel',
810
+ section: 'content',
811
+ sectionName: 'content',
812
+ status: 'active',
813
+ Position: 6,
814
+ Title: 'Trending Now',
815
+ settings: {
816
+ title: 'Trending Now',
817
+ subtitle: 'What everyone is buying',
818
+ showWidgetTitle: 'Yes',
819
+ widgetTitleAlignment: 'center',
820
+ NumberOfProducts: 6,
821
+ numberOfProducts: 6,
822
+ limit: 6,
823
+ OrderBy: 'Trending',
824
+ orderBy: 'trending',
825
+ autoplay: false
826
+ },
827
+ data: {
828
+ content: {
829
+ Title: 'Trending Now',
830
+ Limit: 6,
831
+ OrderBy: 'Trending',
832
+ Products: []
833
+ }
834
+ },
835
+ content: JSON.stringify({
836
+ NumberOfProducts: 6,
837
+ OrderBy: 'Trending'
838
+ })
839
+ },
840
+
841
+ // 6. Electronics Category Carousel
842
+ {
843
+ id: 'widget-product-carousel-electronics',
844
+ type: 'ProductCarousel',
845
+ section: 'content',
846
+ sectionName: 'content',
847
+ status: 'active',
848
+ Position: 7,
849
+ Title: 'Electronics',
850
+ settings: {
851
+ title: 'Top Electronics',
852
+ subtitle: 'Latest gadgets and tech',
853
+ showWidgetTitle: 'Yes',
854
+ widgetTitleAlignment: 'left',
855
+ NumberOfProducts: 8,
856
+ numberOfProducts: 8,
857
+ limit: 8,
858
+ CategoryId: 1,
859
+ categoryId: 1,
860
+ CategoryName: 'Electronics',
861
+ autoplay: false
862
+ },
863
+ data: {
864
+ content: {
865
+ Title: 'Top Electronics',
866
+ Limit: 8,
867
+ CategoryId: 1,
868
+ Products: []
869
+ }
870
+ },
871
+ content: JSON.stringify({
872
+ NumberOfProducts: 8,
873
+ CategoryId: 1
874
+ })
875
+ },
876
+
877
+ // 7. Clothing Category Carousel
878
+ {
879
+ id: 'widget-product-carousel-clothing',
880
+ type: 'ProductCarousel',
881
+ section: 'content',
882
+ sectionName: 'content',
883
+ status: 'active',
884
+ Position: 8,
885
+ Title: 'Fashion',
886
+ settings: {
887
+ title: 'Fashion Collection',
888
+ subtitle: 'Style for every occasion',
889
+ showWidgetTitle: 'Yes',
890
+ widgetTitleAlignment: 'left',
891
+ NumberOfProducts: 8,
892
+ numberOfProducts: 8,
893
+ limit: 8,
894
+ CategoryId: 2,
895
+ categoryId: 2,
896
+ CategoryName: 'Clothing',
897
+ autoplay: false
898
+ },
899
+ data: {
900
+ content: {
901
+ Title: 'Fashion Collection',
902
+ Limit: 8,
903
+ CategoryId: 2,
904
+ Products: []
905
+ }
906
+ },
907
+ content: JSON.stringify({
908
+ NumberOfProducts: 8,
909
+ CategoryId: 2
910
+ })
911
+ },
912
+
913
+ // 8. You May Also Like Carousel (for product pages)
914
+ {
915
+ id: 'widget-product-carousel-related',
916
+ type: 'ProductCarousel',
917
+ section: 'content',
918
+ sectionName: 'content',
919
+ status: 'active',
920
+ Position: 9,
921
+ Title: 'You May Also Like',
922
+ settings: {
923
+ title: 'You May Also Like',
924
+ subtitle: 'Based on your browsing',
925
+ showWidgetTitle: 'Yes',
926
+ widgetTitleAlignment: 'center',
927
+ NumberOfProducts: 6,
928
+ numberOfProducts: 6,
929
+ limit: 6,
930
+ RelatedProducts: true,
931
+ autoplay: false
932
+ },
933
+ data: {
934
+ content: {
935
+ Title: 'You May Also Like',
936
+ Limit: 6,
937
+ RelatedProducts: true,
938
+ Products: []
939
+ }
940
+ },
941
+ content: JSON.stringify({
942
+ NumberOfProducts: 6,
943
+ RelatedProducts: true
944
+ })
945
+ },
946
+
947
+ // 9. Frequently Bought Together
948
+ {
949
+ id: 'widget-product-carousel-fbt',
950
+ type: 'ProductCarousel',
951
+ section: 'content',
952
+ sectionName: 'content',
953
+ status: 'active',
954
+ Position: 10,
955
+ Title: 'Frequently Bought Together',
956
+ settings: {
957
+ title: 'Frequently Bought Together',
958
+ subtitle: 'Complete your purchase',
959
+ showWidgetTitle: 'Yes',
960
+ widgetTitleAlignment: 'center',
961
+ NumberOfProducts: 4,
962
+ numberOfProducts: 4,
963
+ limit: 4,
964
+ FrequentlyBoughtTogether: true,
965
+ autoplay: false,
966
+ showArrows: true
967
+ },
968
+ data: {
969
+ content: {
970
+ Title: 'Frequently Bought Together',
971
+ Limit: 4,
972
+ FrequentlyBoughtTogether: true,
973
+ Products: []
974
+ }
975
+ },
976
+ content: JSON.stringify({
977
+ NumberOfProducts: 4,
978
+ FrequentlyBoughtTogether: true
979
+ })
980
+ },
981
+
982
+ // 10. Staff Picks / Editor's Choice
983
+ {
984
+ id: 'widget-product-carousel-staffpicks',
985
+ type: 'ProductCarousel',
986
+ section: 'content',
987
+ sectionName: 'content',
988
+ status: 'active',
989
+ Position: 11,
990
+ Title: "Editor's Choice",
991
+ settings: {
992
+ title: "Editor's Choice",
993
+ subtitle: 'Curated by our experts',
994
+ showWidgetTitle: 'Yes',
995
+ widgetTitleAlignment: 'center',
996
+ NumberOfProducts: 6,
997
+ numberOfProducts: 6,
998
+ limit: 6,
999
+ StaffPicks: true,
1000
+ autoplay: false,
1001
+ backgroundColor: '#f0f7ff'
1002
+ },
1003
+ data: {
1004
+ content: {
1005
+ Title: "Editor's Choice",
1006
+ Limit: 6,
1007
+ StaffPicks: true,
1008
+ Products: []
1009
+ }
1010
+ },
1011
+ content: JSON.stringify({
1012
+ NumberOfProducts: 6,
1013
+ StaffPicks: true
1014
+ })
1015
+ },
1016
+
1017
+ // ==================== PRODUCT GRIDS (Client Favorites) ====================
1018
+
1019
+ // ProductGrid Widget - All Products
1020
+ {
1021
+ id: 'widget-product-grid-all',
1022
+ type: 'ProductGrid',
1023
+ section: 'content',
1024
+ sectionName: 'content',
1025
+ status: 'active',
1026
+ Position: 12,
1027
+ Title: 'Shop All Products',
1028
+ settings: {
1029
+ title: 'Shop All Products',
1030
+ subtitle: 'Browse our complete collection',
1031
+ showWidgetTitle: 'Yes',
1032
+ widgetTitleAlignment: 'center',
1033
+ columns: 4,
1034
+ rows: 3,
1035
+ NumberOfProducts: 12,
1036
+ numberOfProducts: 12,
1037
+ limit: 12,
1038
+ showPagination: true,
1039
+ showFilters: false
1040
+ },
1041
+ data: {
1042
+ content: {
1043
+ Title: 'Shop All Products',
1044
+ Limit: 12,
1045
+ Columns: 4,
1046
+ Products: []
1047
+ }
1048
+ },
1049
+ content: JSON.stringify({
1050
+ NumberOfProducts: 12,
1051
+ Columns: 4
1052
+ })
1053
+ },
1054
+
1055
+ // ProductGrid Widget - Featured Grid
1056
+ {
1057
+ id: 'widget-product-grid-featured',
1058
+ type: 'ProductGrid',
1059
+ section: 'content',
1060
+ sectionName: 'content',
1061
+ status: 'active',
1062
+ Position: 13,
1063
+ Title: 'Featured Collection',
1064
+ settings: {
1065
+ title: 'Featured Collection',
1066
+ subtitle: 'Our handpicked selection',
1067
+ showWidgetTitle: 'Yes',
1068
+ widgetTitleAlignment: 'center',
1069
+ columns: 3,
1070
+ rows: 2,
1071
+ NumberOfProducts: 6,
1072
+ numberOfProducts: 6,
1073
+ limit: 6,
1074
+ IsFeatured: true
1075
+ },
1076
+ data: {
1077
+ content: {
1078
+ Title: 'Featured Collection',
1079
+ Limit: 6,
1080
+ Columns: 3,
1081
+ IsFeatured: true,
1082
+ Products: []
1083
+ }
1084
+ },
1085
+ content: JSON.stringify({
1086
+ NumberOfProducts: 6,
1087
+ Columns: 3,
1088
+ IsFeatured: true
1089
+ })
1090
+ },
1091
+
1092
+ // Banner Widget - Promotional Banner (maps to carousel.liquid)
1093
+ {
1094
+ id: 'widget-banner-1',
1095
+ type: 'Banner',
1096
+ section: 'content',
1097
+ sectionName: 'content',
1098
+ status: 'active',
1099
+ Position: 4,
1100
+ Title: 'Special Offers',
1101
+ settings: {
1102
+ showWidgetTitle: 'No',
1103
+ showContainer: 'Yes'
1104
+ },
1105
+ data: {
1106
+ content: {
1107
+ Items: [
1108
+ {
1109
+ ImageUrl: 'https://picsum.photos/seed/promo1/1200/400',
1110
+ imageUrl: 'https://picsum.photos/seed/promo1/1200/400',
1111
+ Caption: 'Special Offer - Up to 30% Off Electronics',
1112
+ caption: 'Special Offer - Up to 30% Off Electronics',
1113
+ SubCaption: 'Limited time only! Shop now and save big on top brands.',
1114
+ subCaption: 'Limited time only! Shop now and save big on top brands.',
1115
+ LinkText: 'Shop Electronics',
1116
+ linkText: 'Shop Electronics',
1117
+ TargetUrl: '/categories/electronics',
1118
+ targetUrl: '/categories/electronics'
1119
+ }
1120
+ ]
1121
+ }
1122
+ },
1123
+ content: JSON.stringify({
1124
+ Items: [
1125
+ { ImageUrl: 'https://picsum.photos/seed/promo1/1200/400', Caption: 'Special Offer', LinkText: 'Shop Now', TargetUrl: '/categories/electronics' }
1126
+ ]
1127
+ })
1128
+ },
1129
+
1130
+ // SimpleProduct Widget - Similar products section
1131
+ {
1132
+ id: 'widget-simple-product-1',
1133
+ type: 'SimpleProduct',
1134
+ section: 'content',
1135
+ sectionName: 'content',
1136
+ status: 'active',
1137
+ Position: 5,
1138
+ Title: 'Best Sellers',
1139
+ settings: {
1140
+ title: 'Best Sellers',
1141
+ subtitle: 'Our most popular products',
1142
+ showWidgetTitle: 'Yes',
1143
+ widgetTitleAlignment: 'center',
1144
+ columns: 4,
1145
+ show_add_to_cart: true,
1146
+ NumberOfProducts: 4,
1147
+ limit: 4
1148
+ },
1149
+ data: {
1150
+ products: [] // Will be enriched by dev server
1151
+ }
1152
+ },
1153
+
1154
+ // SingleProduct Widget - Featured single product
1155
+ {
1156
+ id: 'widget-single-product-1',
1157
+ type: 'SingleProduct',
1158
+ section: 'content',
1159
+ sectionName: 'content',
1160
+ status: 'active',
1161
+ Position: 6,
1162
+ Title: 'Deal of the Day',
1163
+ settings: {
1164
+ title: 'Deal of the Day',
1165
+ subtitle: 'Limited time offer!',
1166
+ showWidgetTitle: 'Yes',
1167
+ widgetTitleAlignment: 'center',
1168
+ showAddToCartButton: true,
1169
+ backgroundColor: '#f8f9fa'
1170
+ },
1171
+ data: {
1172
+ products: [] // Will be enriched by dev server (uses first product)
1173
+ }
1174
+ },
1175
+
1176
+ // RecentlyViewed Widget
1177
+ {
1178
+ id: 'widget-recently-viewed-1',
1179
+ type: 'RecentlyViewed',
1180
+ section: 'content',
1181
+ sectionName: 'content',
1182
+ status: 'active',
1183
+ Position: 7,
1184
+ Title: 'Recently Viewed',
1185
+ settings: {
1186
+ title: 'Recently Viewed',
1187
+ subtitle: 'Products you\'ve looked at',
1188
+ showWidgetTitle: 'Yes',
1189
+ columns: 4,
1190
+ show_add_to_cart: false
1191
+ },
1192
+ data: {
1193
+ products: [] // Will be enriched by dev server
1194
+ }
1195
+ },
1196
+
1197
+ // BrandCarousel Widget
1198
+ {
1199
+ id: 'widget-brand-carousel-1',
1200
+ type: 'BrandCarousel',
1201
+ section: 'content',
1202
+ sectionName: 'content',
1203
+ status: 'active',
1204
+ Position: 8,
1205
+ Title: 'Our Brands',
1206
+ settings: {
1207
+ title: 'Our Brands',
1208
+ subtitle: 'Shop from top brands',
1209
+ showWidgetTitle: 'Yes',
1210
+ widgetTitleAlignment: 'center'
1211
+ },
1212
+ data: {
1213
+ brands: [
1214
+ { Id: 1, id: 1, Name: 'TechCorp', name: 'TechCorp', Slug: '/brands/techcorp', slug: '/brands/techcorp', thumbnailImage: { url: 'https://picsum.photos/seed/brand1/200/80' }, Logo: 'https://picsum.photos/seed/brand1/200/80' },
1215
+ { Id: 2, id: 2, Name: 'StyleMax', name: 'StyleMax', Slug: '/brands/stylemax', slug: '/brands/stylemax', thumbnailImage: { url: 'https://picsum.photos/seed/brand2/200/80' }, Logo: 'https://picsum.photos/seed/brand2/200/80' },
1216
+ { Id: 3, id: 3, Name: 'HomeLife', name: 'HomeLife', Slug: '/brands/homelife', slug: '/brands/homelife', thumbnailImage: { url: 'https://picsum.photos/seed/brand3/200/80' }, Logo: 'https://picsum.photos/seed/brand3/200/80' },
1217
+ { Id: 4, id: 4, Name: 'SportPro', name: 'SportPro', Slug: '/brands/sportpro', slug: '/brands/sportpro', thumbnailImage: { url: 'https://picsum.photos/seed/brand4/200/80' }, Logo: 'https://picsum.photos/seed/brand4/200/80' },
1218
+ { Id: 5, id: 5, Name: 'BeautyGlow', name: 'BeautyGlow', Slug: '/brands/beautyglow', slug: '/brands/beautyglow', thumbnailImage: { url: 'https://picsum.photos/seed/brand5/200/80' }, Logo: 'https://picsum.photos/seed/brand5/200/80' },
1219
+ { Id: 6, id: 6, Name: 'GadgetZone', name: 'GadgetZone', Slug: '/brands/gadgetzone', slug: '/brands/gadgetzone', thumbnailImage: { url: 'https://picsum.photos/seed/brand6/200/80' }, Logo: 'https://picsum.photos/seed/brand6/200/80' }
1220
+ ],
1221
+ Brands: [
1222
+ { Id: 1, Name: 'TechCorp', Slug: '/brands/techcorp', Logo: 'https://picsum.photos/seed/brand1/200/80' },
1223
+ { Id: 2, Name: 'StyleMax', Slug: '/brands/stylemax', Logo: 'https://picsum.photos/seed/brand2/200/80' },
1224
+ { Id: 3, Name: 'HomeLife', Slug: '/brands/homelife', Logo: 'https://picsum.photos/seed/brand3/200/80' },
1225
+ { Id: 4, Name: 'SportPro', Slug: '/brands/sportpro', Logo: 'https://picsum.photos/seed/brand4/200/80' },
1226
+ { Id: 5, Name: 'BeautyGlow', Slug: '/brands/beautyglow', Logo: 'https://picsum.photos/seed/brand5/200/80' },
1227
+ { Id: 6, Name: 'GadgetZone', Slug: '/brands/gadgetzone', Logo: 'https://picsum.photos/seed/brand6/200/80' }
1228
+ ]
1229
+ },
1230
+ content: JSON.stringify({
1231
+ Brands: [
1232
+ { Id: 1, Name: 'TechCorp', Logo: 'https://picsum.photos/seed/brand1/200/80' },
1233
+ { Id: 2, Name: 'StyleMax', Logo: 'https://picsum.photos/seed/brand2/200/80' },
1234
+ { Id: 3, Name: 'HomeLife', Logo: 'https://picsum.photos/seed/brand3/200/80' },
1235
+ { Id: 4, Name: 'SportPro', Logo: 'https://picsum.photos/seed/brand4/200/80' },
1236
+ { Id: 5, Name: 'BeautyGlow', Logo: 'https://picsum.photos/seed/brand5/200/80' },
1237
+ { Id: 6, Name: 'GadgetZone', Logo: 'https://picsum.photos/seed/brand6/200/80' }
1238
+ ]
1239
+ })
1240
+ },
1241
+
1242
+ // Gallery Widget
1243
+ {
1244
+ id: 'widget-gallery-1',
1245
+ type: 'Gallery',
1246
+ section: 'content',
1247
+ sectionName: 'content',
1248
+ status: 'active',
1249
+ Position: 4,
1250
+ Title: 'Instagram Gallery',
1251
+ settings: {
1252
+ title: 'Follow Us @storename',
1253
+ subtitle: 'Share your style with #OurStore',
1254
+ showWidgetTitle: 'Yes',
1255
+ widgetTitleAlignment: 'center',
1256
+ columns: 6
1257
+ },
1258
+ data: {
1259
+ content: {
1260
+ Items: [
1261
+ { ImageUrl: 'https://picsum.photos/seed/gallery1/400/400', imageUrl: 'https://picsum.photos/seed/gallery1/400/400', TargetUrl: '#', targetUrl: '#' },
1262
+ { ImageUrl: 'https://picsum.photos/seed/gallery2/400/400', imageUrl: 'https://picsum.photos/seed/gallery2/400/400', TargetUrl: '#', targetUrl: '#' },
1263
+ { ImageUrl: 'https://picsum.photos/seed/gallery3/400/400', imageUrl: 'https://picsum.photos/seed/gallery3/400/400', TargetUrl: '#', targetUrl: '#' },
1264
+ { ImageUrl: 'https://picsum.photos/seed/gallery4/400/400', imageUrl: 'https://picsum.photos/seed/gallery4/400/400', TargetUrl: '#', targetUrl: '#' },
1265
+ { ImageUrl: 'https://picsum.photos/seed/gallery5/400/400', imageUrl: 'https://picsum.photos/seed/gallery5/400/400', TargetUrl: '#', targetUrl: '#' },
1266
+ { ImageUrl: 'https://picsum.photos/seed/gallery6/400/400', imageUrl: 'https://picsum.photos/seed/gallery6/400/400', TargetUrl: '#', targetUrl: '#' }
1267
+ ]
1268
+ }
1269
+ },
1270
+ content: JSON.stringify({
1271
+ Items: [
1272
+ { ImageUrl: 'https://picsum.photos/seed/gallery1/400/400', TargetUrl: '#' },
1273
+ { ImageUrl: 'https://picsum.photos/seed/gallery2/400/400', TargetUrl: '#' },
1274
+ { ImageUrl: 'https://picsum.photos/seed/gallery3/400/400', TargetUrl: '#' },
1275
+ { ImageUrl: 'https://picsum.photos/seed/gallery4/400/400', TargetUrl: '#' },
1276
+ { ImageUrl: 'https://picsum.photos/seed/gallery5/400/400', TargetUrl: '#' },
1277
+ { ImageUrl: 'https://picsum.photos/seed/gallery6/400/400', TargetUrl: '#' }
1278
+ ]
1279
+ })
1280
+ },
1281
+
1282
+ // TestimonialCarousel Widget
1283
+ {
1284
+ id: 'widget-testimonial-1',
1285
+ type: 'TestimonialCarousel',
1286
+ section: 'content',
1287
+ sectionName: 'content',
1288
+ status: 'active',
1289
+ Position: 5,
1290
+ Title: 'What Our Customers Say',
1291
+ settings: {
1292
+ title: 'What Our Customers Say',
1293
+ subtitle: 'Real reviews from real customers',
1294
+ showWidgetTitle: 'Yes',
1295
+ widgetTitleAlignment: 'center',
1296
+ hideArrow: false,
1297
+ hideDot: false
1298
+ },
1299
+ data: {
1300
+ content: [
1301
+ {
1302
+ Title: 'Amazing Quality!',
1303
+ title: 'Amazing Quality!',
1304
+ Description: 'I\'ve been shopping here for years and the quality never disappoints. Fast shipping and excellent customer service too!',
1305
+ description: 'I\'ve been shopping here for years and the quality never disappoints. Fast shipping and excellent customer service too!',
1306
+ PersonName: 'Sarah Johnson',
1307
+ personName: 'Sarah Johnson',
1308
+ CompanyName: 'Verified Buyer',
1309
+ companyName: 'Verified Buyer',
1310
+ Rating: 5,
1311
+ rating: 5,
1312
+ ImageUrl: 'https://picsum.photos/seed/user1/100/100',
1313
+ imageUrl: 'https://picsum.photos/seed/user1/100/100'
1314
+ },
1315
+ {
1316
+ Title: 'Great Experience',
1317
+ title: 'Great Experience',
1318
+ Description: 'The customer service team went above and beyond to help me find exactly what I needed. Highly recommend!',
1319
+ description: 'The customer service team went above and beyond to help me find exactly what I needed. Highly recommend!',
1320
+ PersonName: 'Michael Chen',
1321
+ personName: 'Michael Chen',
1322
+ CompanyName: 'Regular Customer',
1323
+ companyName: 'Regular Customer',
1324
+ Rating: 5,
1325
+ rating: 5,
1326
+ ImageUrl: 'https://picsum.photos/seed/user2/100/100',
1327
+ imageUrl: 'https://picsum.photos/seed/user2/100/100'
1328
+ },
1329
+ {
1330
+ Title: 'Will Shop Again',
1331
+ title: 'Will Shop Again',
1332
+ Description: 'Love the variety of products and the prices are very competitive. The website is easy to navigate too.',
1333
+ description: 'Love the variety of products and the prices are very competitive. The website is easy to navigate too.',
1334
+ PersonName: 'Emily Davis',
1335
+ personName: 'Emily Davis',
1336
+ CompanyName: 'Fashion Enthusiast',
1337
+ companyName: 'Fashion Enthusiast',
1338
+ Rating: 5,
1339
+ rating: 5,
1340
+ ImageUrl: 'https://picsum.photos/seed/user3/100/100',
1341
+ imageUrl: 'https://picsum.photos/seed/user3/100/100'
1342
+ },
1343
+ {
1344
+ Title: 'Fast Delivery',
1345
+ title: 'Fast Delivery',
1346
+ Description: 'Ordered on Monday, received on Wednesday! The packaging was perfect and the product exceeded expectations.',
1347
+ description: 'Ordered on Monday, received on Wednesday! The packaging was perfect and the product exceeded expectations.',
1348
+ PersonName: 'David Wilson',
1349
+ personName: 'David Wilson',
1350
+ CompanyName: 'Tech Reviewer',
1351
+ companyName: 'Tech Reviewer',
1352
+ Rating: 4,
1353
+ rating: 4,
1354
+ ImageUrl: 'https://picsum.photos/seed/user4/100/100',
1355
+ imageUrl: 'https://picsum.photos/seed/user4/100/100'
1356
+ }
1357
+ ]
1358
+ },
1359
+ content: JSON.stringify([
1360
+ { Title: 'Amazing Quality!', Description: 'The quality never disappoints.', PersonName: 'Sarah Johnson', CompanyName: 'Verified Buyer', Rating: 5, ImageUrl: 'https://picsum.photos/seed/user1/100/100' },
1361
+ { Title: 'Great Experience', Description: 'Excellent customer service.', PersonName: 'Michael Chen', CompanyName: 'Regular Customer', Rating: 5, ImageUrl: 'https://picsum.photos/seed/user2/100/100' },
1362
+ { Title: 'Will Shop Again', Description: 'Love the variety.', PersonName: 'Emily Davis', CompanyName: 'Fashion Enthusiast', Rating: 5, ImageUrl: 'https://picsum.photos/seed/user3/100/100' },
1363
+ { Title: 'Fast Delivery', Description: 'Quick and perfect packaging.', PersonName: 'David Wilson', CompanyName: 'Tech Reviewer', Rating: 4, ImageUrl: 'https://picsum.photos/seed/user4/100/100' }
1364
+ ])
1365
+ },
1366
+
1367
+ // ==================== FOOTER SECTION ====================
1368
+ {
1369
+ id: 'widget-footer-1',
1370
+ type: 'Footer',
1371
+ section: 'footer',
1372
+ sectionName: 'footer',
1373
+ status: 'active',
1374
+ Position: 1,
1375
+ settings: {
1376
+ showWidgetTitle: 'No',
1377
+ showNewsletter: true,
1378
+ showSocial: true
1379
+ },
1380
+ data: {
1381
+ content: {
1382
+ columns: [
1383
+ {
1384
+ Title: 'About Us',
1385
+ title: 'About Us',
1386
+ Links: [
1387
+ { Text: 'Our Story', text: 'Our Story', Url: '/pages/about', url: '/pages/about' },
1388
+ { Text: 'Careers', text: 'Careers', Url: '/pages/careers', url: '/pages/careers' },
1389
+ { Text: 'Press', text: 'Press', Url: '/pages/press', url: '/pages/press' }
1390
+ ],
1391
+ links: [
1392
+ { text: 'Our Story', url: '/pages/about' },
1393
+ { text: 'Careers', url: '/pages/careers' },
1394
+ { text: 'Press', url: '/pages/press' }
1395
+ ]
1396
+ },
1397
+ {
1398
+ Title: 'Customer Service',
1399
+ title: 'Customer Service',
1400
+ Links: [
1401
+ { Text: 'Contact Us', text: 'Contact Us', Url: '/pages/contact', url: '/pages/contact' },
1402
+ { Text: 'FAQs', text: 'FAQs', Url: '/pages/faq', url: '/pages/faq' },
1403
+ { Text: 'Returns', text: 'Returns', Url: '/pages/returns', url: '/pages/returns' }
1404
+ ],
1405
+ links: [
1406
+ { text: 'Contact Us', url: '/pages/contact' },
1407
+ { text: 'FAQs', url: '/pages/faq' },
1408
+ { text: 'Returns', url: '/pages/returns' }
1409
+ ]
1410
+ },
1411
+ {
1412
+ Title: 'Legal',
1413
+ title: 'Legal',
1414
+ Links: [
1415
+ { Text: 'Privacy Policy', text: 'Privacy Policy', Url: '/pages/privacy', url: '/pages/privacy' },
1416
+ { Text: 'Terms of Service', text: 'Terms of Service', Url: '/pages/terms', url: '/pages/terms' },
1417
+ { Text: 'Shipping Policy', text: 'Shipping Policy', Url: '/pages/shipping', url: '/pages/shipping' }
1418
+ ],
1419
+ links: [
1420
+ { text: 'Privacy Policy', url: '/pages/privacy' },
1421
+ { text: 'Terms of Service', url: '/pages/terms' },
1422
+ { text: 'Shipping Policy', url: '/pages/shipping' }
1423
+ ]
1424
+ }
1425
+ ],
1426
+ socialLinks: [
1427
+ { Platform: 'facebook', platform: 'facebook', Url: 'https://facebook.com', url: 'https://facebook.com' },
1428
+ { Platform: 'twitter', platform: 'twitter', Url: 'https://twitter.com', url: 'https://twitter.com' },
1429
+ { Platform: 'instagram', platform: 'instagram', Url: 'https://instagram.com', url: 'https://instagram.com' },
1430
+ { Platform: 'youtube', platform: 'youtube', Url: 'https://youtube.com', url: 'https://youtube.com' }
1431
+ ]
1432
+ }
1433
+ }
1434
+ },
1435
+ {
1436
+ id: 'widget-footer-menu-1',
1437
+ type: 'FooterMenu',
1438
+ section: 'footer',
1439
+ sectionName: 'footer',
1440
+ status: 'active',
1441
+ Position: 2,
1442
+ settings: {
1443
+ menuId: 'footer-menu',
1444
+ showWidgetTitle: 'No'
1445
+ },
1446
+ data: {
1447
+ content: {
1448
+ menuId: 'footer-menu'
1449
+ }
1450
+ }
1451
+ }
1452
+ ];
1453
+
1454
+ return widgets;
1455
+ }
1456
+
1457
+ module.exports = {
1458
+ generateMockData,
1459
+ generateMockProducts,
1460
+ generateMockCategories,
1461
+ generateMockBrands,
1462
+ generateMockWidgets
1463
+ };
1464
+
1465
+
1466
+
1467
+
1468
+