@aws505/sheetsite 1.0.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.
Files changed (57) hide show
  1. package/README.md +105 -0
  2. package/dist/components/index.js +1696 -0
  3. package/dist/components/index.js.map +1 -0
  4. package/dist/components/index.mjs +1630 -0
  5. package/dist/components/index.mjs.map +1 -0
  6. package/dist/config/index.js +1840 -0
  7. package/dist/config/index.js.map +1 -0
  8. package/dist/config/index.mjs +1793 -0
  9. package/dist/config/index.mjs.map +1 -0
  10. package/dist/data/index.js +1296 -0
  11. package/dist/data/index.js.map +1 -0
  12. package/dist/data/index.mjs +1220 -0
  13. package/dist/data/index.mjs.map +1 -0
  14. package/dist/index.js +5433 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/index.mjs +5285 -0
  17. package/dist/index.mjs.map +1 -0
  18. package/dist/seo/index.js +187 -0
  19. package/dist/seo/index.js.map +1 -0
  20. package/dist/seo/index.mjs +155 -0
  21. package/dist/seo/index.mjs.map +1 -0
  22. package/dist/theme/index.js +552 -0
  23. package/dist/theme/index.js.map +1 -0
  24. package/dist/theme/index.mjs +526 -0
  25. package/dist/theme/index.mjs.map +1 -0
  26. package/package.json +96 -0
  27. package/src/components/index.ts +41 -0
  28. package/src/components/layout/Footer.tsx +234 -0
  29. package/src/components/layout/Header.tsx +134 -0
  30. package/src/components/sections/FAQ.tsx +178 -0
  31. package/src/components/sections/Gallery.tsx +107 -0
  32. package/src/components/sections/Hero.tsx +202 -0
  33. package/src/components/sections/Hours.tsx +225 -0
  34. package/src/components/sections/Services.tsx +216 -0
  35. package/src/components/sections/Testimonials.tsx +184 -0
  36. package/src/components/ui/Button.tsx +158 -0
  37. package/src/components/ui/Card.tsx +162 -0
  38. package/src/components/ui/Icons.tsx +508 -0
  39. package/src/config/index.ts +207 -0
  40. package/src/config/presets/generic.ts +153 -0
  41. package/src/config/presets/home-kitchen.ts +154 -0
  42. package/src/config/presets/index.ts +708 -0
  43. package/src/config/presets/professional.ts +165 -0
  44. package/src/config/presets/repair.ts +160 -0
  45. package/src/config/presets/restaurant.ts +162 -0
  46. package/src/config/presets/salon.ts +178 -0
  47. package/src/config/presets/tailor.ts +159 -0
  48. package/src/config/types.ts +314 -0
  49. package/src/data/csv-parser.ts +154 -0
  50. package/src/data/defaults.ts +202 -0
  51. package/src/data/google-drive.ts +148 -0
  52. package/src/data/index.ts +535 -0
  53. package/src/data/sheets.ts +709 -0
  54. package/src/data/types.ts +379 -0
  55. package/src/seo/index.ts +272 -0
  56. package/src/theme/colors.ts +351 -0
  57. package/src/theme/index.ts +249 -0
@@ -0,0 +1,1840 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/config/index.ts
21
+ var config_exports = {};
22
+ __export(config_exports, {
23
+ businessCategories: () => businessCategories,
24
+ createSiteConfig: () => createSiteConfig,
25
+ genericPreset: () => genericPreset,
26
+ getDefaultData: () => getDefaultData,
27
+ getIconSuggestions: () => getIconSuggestions,
28
+ getImageSuggestions: () => getImageSuggestions,
29
+ getPreset: () => getPreset,
30
+ getSheetTemplate: () => getSheetTemplate,
31
+ getSupportedBusinessTypes: () => getSupportedBusinessTypes,
32
+ getThemeDescription: () => getThemeDescription,
33
+ homeKitchenPreset: () => homeKitchenPreset,
34
+ presets: () => presets,
35
+ professionalPreset: () => professionalPreset,
36
+ recommendBusinessType: () => recommendBusinessType,
37
+ recommendTheme: () => recommendTheme,
38
+ repairPreset: () => repairPreset,
39
+ restaurantPreset: () => restaurantPreset,
40
+ salonPreset: () => salonPreset,
41
+ tailorPreset: () => tailorPreset,
42
+ themePresets: () => themePresets,
43
+ validateSiteConfig: () => validateSiteConfig
44
+ });
45
+ module.exports = __toCommonJS(config_exports);
46
+
47
+ // src/config/presets/tailor.ts
48
+ var tailorPreset = {
49
+ type: "tailor",
50
+ name: "Tailor & Alterations",
51
+ description: "Configuration for tailoring, alterations, and custom clothing businesses",
52
+ config: {
53
+ businessType: "tailor",
54
+ theme: {
55
+ preset: "warm-brown",
56
+ borderRadius: "md",
57
+ shadows: "md"
58
+ },
59
+ pages: {
60
+ home: {
61
+ enabled: true,
62
+ sections: [
63
+ "hero",
64
+ "services",
65
+ "gallery",
66
+ "testimonials",
67
+ "hours",
68
+ "location",
69
+ "faq"
70
+ ]
71
+ },
72
+ about: { enabled: true },
73
+ services: { enabled: true, title: "Our Services" },
74
+ gallery: { enabled: true, title: "Our Work" },
75
+ faq: { enabled: true },
76
+ contact: { enabled: true },
77
+ privacy: { enabled: true }
78
+ },
79
+ seo: {
80
+ titleTemplate: "%s | Expert Tailoring & Alterations",
81
+ keywords: ["tailor", "alterations", "seamstress", "hemming", "custom clothing", "wedding dress alterations"],
82
+ jsonLdType: "LocalBusiness"
83
+ },
84
+ contactForm: {
85
+ enabled: true,
86
+ fields: {
87
+ name: true,
88
+ email: true,
89
+ phone: true,
90
+ service: true,
91
+ message: true
92
+ }
93
+ },
94
+ features: {
95
+ mobileCallBar: true,
96
+ openStatus: true,
97
+ mapEmbed: true,
98
+ socialLinks: true
99
+ }
100
+ },
101
+ defaults: {
102
+ business: {
103
+ tagline: "Expert Alterations & Custom Tailoring",
104
+ description: "Professional tailoring services with attention to detail and quality craftsmanship.",
105
+ priceRange: "$$"
106
+ },
107
+ services: [
108
+ { id: "s1", title: "Alterations", description: "Expert alterations for all garments including pants, shirts, dresses, and jackets", priceNote: "Starting at $15", icon: "scissors", sortOrder: 1 },
109
+ { id: "s2", title: "Hemming", description: "Professional hemming for pants, skirts, dresses, and curtains", priceNote: "From $12", icon: "ruler", sortOrder: 2 },
110
+ { id: "s3", title: "Wedding & Formal", description: "Specialized alterations for wedding dresses, bridesmaids gowns, and formal wear", priceNote: "Custom quote", icon: "heart", sortOrder: 3 },
111
+ { id: "s4", title: "Repairs & Restoration", description: "Zipper replacement, button repair, seam repair, and garment restoration", priceNote: "From $10", icon: "wrench", sortOrder: 4 },
112
+ { id: "s5", title: "Custom Tailoring", description: "Made-to-measure suits, shirts, and garments tailored to your exact specifications", priceNote: "By consultation", icon: "sparkles", sortOrder: 5 },
113
+ { id: "s6", title: "Leather & Specialty", description: "Expert work on leather, suede, and delicate fabrics", priceNote: "Call for pricing", icon: "star", sortOrder: 6 }
114
+ ],
115
+ faq: [
116
+ { id: "f1", question: "How long do alterations typically take?", answer: "Most alterations are completed within 3-5 business days. Rush service is available for an additional fee. Wedding and formal wear may require more time for multiple fittings.", sortOrder: 1 },
117
+ { id: "f2", question: "Do you work on leather and suede?", answer: "Yes, we have extensive experience with leather and suede garments. These materials require specialized care and techniques, so pricing and timing may vary.", sortOrder: 2 },
118
+ { id: "f3", question: "What should I bring to my fitting?", answer: "Please bring the shoes you plan to wear with the garment, and any undergarments that might affect the fit. For formal wear, bring accessories like belts or jewelry.", sortOrder: 3 },
119
+ { id: "f4", question: "Do you offer wedding dress alterations?", answer: "Absolutely! We specialize in wedding dress alterations including hemming, bustling, taking in or letting out, and adding embellishments. We recommend scheduling your first fitting 2-3 months before the wedding.", sortOrder: 4 },
120
+ { id: "f5", question: "Can you match fabric for repairs?", answer: "We maintain an extensive fabric library and can often find close matches for repairs and patches. Bring your garment in for a free assessment.", sortOrder: 5 }
121
+ ]
122
+ },
123
+ sheetTemplate: {
124
+ tabs: [
125
+ {
126
+ name: "business",
127
+ required: true,
128
+ columns: [
129
+ { name: "key", description: "Setting name", example: "name", required: true },
130
+ { name: "value", description: "Setting value", example: "Expert Tailoring", required: true }
131
+ ]
132
+ },
133
+ {
134
+ name: "hours",
135
+ required: true,
136
+ columns: [
137
+ { name: "day", description: "Day of week", example: "Monday", required: true },
138
+ { name: "open", description: "Opening time", example: "9:00 AM", required: false },
139
+ { name: "close", description: "Closing time", example: "6:00 PM", required: false },
140
+ { name: "closed", description: "Is closed?", example: "FALSE", required: false }
141
+ ]
142
+ },
143
+ {
144
+ name: "services",
145
+ required: true,
146
+ columns: [
147
+ { name: "title", description: "Service name", example: "Alterations", required: true },
148
+ { name: "description", description: "Service description", example: "Expert alterations for all garments", required: false },
149
+ { name: "price_note", description: "Pricing info", example: "Starting at $15", required: false },
150
+ { name: "icon", description: "Icon name", example: "scissors", required: false },
151
+ { name: "sort", description: "Display order", example: "1", required: false }
152
+ ]
153
+ },
154
+ {
155
+ name: "gallery",
156
+ required: false,
157
+ columns: [
158
+ { name: "image_url", description: "Image URL (Google Drive or direct)", example: "https://drive.google.com/...", required: true },
159
+ { name: "alt", description: "Image description", example: "Wedding dress alteration", required: false },
160
+ { name: "caption", description: "Caption text", example: "Custom bridal alterations", required: false },
161
+ { name: "sort", description: "Display order", example: "1", required: false }
162
+ ]
163
+ },
164
+ {
165
+ name: "testimonials",
166
+ required: false,
167
+ columns: [
168
+ { name: "quote", description: "Customer review", example: "Amazing work on my wedding dress!", required: true },
169
+ { name: "name", description: "Customer name", example: "Sarah M.", required: true },
170
+ { name: "context", description: "Service context", example: "Wedding alterations", required: false },
171
+ { name: "rating", description: "Star rating (1-5)", example: "5", required: false },
172
+ { name: "sort", description: "Display order", example: "1", required: false }
173
+ ]
174
+ },
175
+ {
176
+ name: "faq",
177
+ required: false,
178
+ columns: [
179
+ { name: "question", description: "Question text", example: "How long do alterations take?", required: true },
180
+ { name: "answer", description: "Answer text", example: "3-5 business days typically", required: true },
181
+ { name: "sort", description: "Display order", example: "1", required: false }
182
+ ]
183
+ }
184
+ ]
185
+ },
186
+ iconSuggestions: ["scissors", "ruler", "heart", "sparkles", "star", "wrench", "shirt", "dress"],
187
+ imageSuggestions: [
188
+ "Professional tailor measuring fabric",
189
+ "Close-up of precise stitching",
190
+ "Wedding dress on mannequin",
191
+ "Organized tailor workshop",
192
+ "Before and after alterations",
193
+ "Happy customer with altered garment"
194
+ ]
195
+ };
196
+
197
+ // src/config/presets/restaurant.ts
198
+ var restaurantPreset = {
199
+ type: "restaurant",
200
+ name: "Restaurant & Cafe",
201
+ description: "Configuration for restaurants, cafes, and dining establishments",
202
+ config: {
203
+ businessType: "restaurant",
204
+ theme: {
205
+ preset: "warm-amber",
206
+ borderRadius: "lg",
207
+ shadows: "md"
208
+ },
209
+ pages: {
210
+ home: {
211
+ enabled: true,
212
+ sections: [
213
+ "hero",
214
+ "menu",
215
+ "gallery",
216
+ "testimonials",
217
+ "hours",
218
+ "location"
219
+ ]
220
+ },
221
+ about: { enabled: true, title: "Our Story" },
222
+ menu: { enabled: true, title: "Menu" },
223
+ gallery: { enabled: true, title: "Gallery" },
224
+ contact: { enabled: true },
225
+ privacy: { enabled: true }
226
+ },
227
+ seo: {
228
+ titleTemplate: "%s | Delicious Dining Experience",
229
+ keywords: ["restaurant", "dining", "food", "cuisine", "local restaurant", "family dining"],
230
+ jsonLdType: "Restaurant"
231
+ },
232
+ contactForm: {
233
+ enabled: true,
234
+ fields: {
235
+ name: true,
236
+ email: true,
237
+ phone: true,
238
+ service: false,
239
+ message: true
240
+ },
241
+ successMessage: "Thank you for your message! We'll get back to you soon."
242
+ },
243
+ features: {
244
+ mobileCallBar: true,
245
+ openStatus: true,
246
+ mapEmbed: true,
247
+ socialLinks: true,
248
+ bookingButton: true
249
+ }
250
+ },
251
+ defaults: {
252
+ business: {
253
+ tagline: "Fresh, Delicious, Made with Love",
254
+ description: "Experience exceptional cuisine in a warm and welcoming atmosphere.",
255
+ priceRange: "$$"
256
+ },
257
+ menu: [
258
+ { id: "m1", name: "House Salad", description: "Fresh mixed greens with house vinaigrette", price: 9.99, category: "Starters", sortOrder: 1 },
259
+ { id: "m2", name: "Soup of the Day", description: "Ask your server for today's selection", priceNote: "Cup $5 / Bowl $8", category: "Starters", sortOrder: 2 },
260
+ { id: "m3", name: "Signature Pasta", description: "House-made pasta with seasonal vegetables", price: 18.99, category: "Entrees", sortOrder: 3 },
261
+ { id: "m4", name: "Grilled Salmon", description: "Fresh Atlantic salmon with lemon herb butter", price: 24.99, category: "Entrees", sortOrder: 4 },
262
+ { id: "m5", name: "Classic Burger", description: "Half-pound beef patty with all the fixings", price: 15.99, category: "Entrees", sortOrder: 5 },
263
+ { id: "m6", name: "Chocolate Cake", description: "Rich chocolate layer cake", price: 8.99, category: "Desserts", sortOrder: 6 }
264
+ ],
265
+ faq: [
266
+ { id: "f1", question: "Do you take reservations?", answer: "Yes! We recommend reservations for parties of 4 or more, especially on weekends. You can call us or book online.", sortOrder: 1 },
267
+ { id: "f2", question: "Do you offer takeout or delivery?", answer: "Yes, we offer both takeout and delivery. Order through our website or your favorite delivery app.", sortOrder: 2 },
268
+ { id: "f3", question: "Can you accommodate dietary restrictions?", answer: "Absolutely! We have vegetarian, vegan, and gluten-free options. Please inform your server of any allergies or dietary needs.", sortOrder: 3 },
269
+ { id: "f4", question: "Do you have a private dining room?", answer: "Yes, we have a private dining room that seats up to 20 guests. Contact us for reservations and special event menus.", sortOrder: 4 },
270
+ { id: "f5", question: "Is there parking available?", answer: "Yes, we have a parking lot behind the restaurant with free parking for guests.", sortOrder: 5 }
271
+ ]
272
+ },
273
+ sheetTemplate: {
274
+ tabs: [
275
+ {
276
+ name: "business",
277
+ required: true,
278
+ columns: [
279
+ { name: "key", description: "Setting name", example: "name", required: true },
280
+ { name: "value", description: "Setting value", example: "The Local Kitchen", required: true }
281
+ ]
282
+ },
283
+ {
284
+ name: "hours",
285
+ required: true,
286
+ columns: [
287
+ { name: "day", description: "Day of week", example: "Monday", required: true },
288
+ { name: "open", description: "Opening time", example: "11:00 AM", required: false },
289
+ { name: "close", description: "Closing time", example: "10:00 PM", required: false },
290
+ { name: "closed", description: "Is closed?", example: "FALSE", required: false }
291
+ ]
292
+ },
293
+ {
294
+ name: "menu",
295
+ required: true,
296
+ columns: [
297
+ { name: "name", description: "Item name", example: "Grilled Salmon", required: true },
298
+ { name: "description", description: "Item description", example: "Fresh Atlantic salmon with herbs", required: false },
299
+ { name: "price", description: "Price (number)", example: "24.99", required: false },
300
+ { name: "price_note", description: "Price note", example: "Market price", required: false },
301
+ { name: "category", description: "Menu section", example: "Entrees", required: false },
302
+ { name: "dietary", description: "Dietary tags (comma-separated)", example: "gluten-free, dairy-free", required: false },
303
+ { name: "featured", description: "Is featured?", example: "TRUE", required: false },
304
+ { name: "sort", description: "Display order", example: "1", required: false }
305
+ ]
306
+ },
307
+ {
308
+ name: "gallery",
309
+ required: false,
310
+ columns: [
311
+ { name: "image_url", description: "Image URL", example: "https://drive.google.com/...", required: true },
312
+ { name: "alt", description: "Image description", example: "Signature pasta dish", required: false },
313
+ { name: "caption", description: "Caption text", example: "Our famous house-made pasta", required: false },
314
+ { name: "sort", description: "Display order", example: "1", required: false }
315
+ ]
316
+ },
317
+ {
318
+ name: "testimonials",
319
+ required: false,
320
+ columns: [
321
+ { name: "quote", description: "Customer review", example: "Best pasta in town!", required: true },
322
+ { name: "name", description: "Customer name", example: "John D.", required: true },
323
+ { name: "rating", description: "Star rating (1-5)", example: "5", required: false },
324
+ { name: "source", description: "Review source", example: "Yelp", required: false },
325
+ { name: "sort", description: "Display order", example: "1", required: false }
326
+ ]
327
+ },
328
+ {
329
+ name: "faq",
330
+ required: false,
331
+ columns: [
332
+ { name: "question", description: "Question text", example: "Do you take reservations?", required: true },
333
+ { name: "answer", description: "Answer text", example: "Yes, we recommend them for parties of 4+", required: true },
334
+ { name: "sort", description: "Display order", example: "1", required: false }
335
+ ]
336
+ }
337
+ ]
338
+ },
339
+ iconSuggestions: ["utensils", "chef-hat", "wine", "coffee", "pizza", "salad", "cake", "soup"],
340
+ imageSuggestions: [
341
+ "Beautiful plated dish",
342
+ "Cozy restaurant interior",
343
+ "Chef preparing food",
344
+ "Happy diners at table",
345
+ "Bar or drink selection",
346
+ "Outdoor patio seating"
347
+ ]
348
+ };
349
+
350
+ // src/config/presets/home-kitchen.ts
351
+ var homeKitchenPreset = {
352
+ type: "home-kitchen",
353
+ name: "Home Kitchen & Cottage Food",
354
+ description: "Configuration for home-based food businesses, cottage food producers, and bakers",
355
+ config: {
356
+ businessType: "home-kitchen",
357
+ theme: {
358
+ preset: "warm-amber",
359
+ borderRadius: "lg",
360
+ shadows: "sm"
361
+ },
362
+ pages: {
363
+ home: {
364
+ enabled: true,
365
+ sections: [
366
+ "hero",
367
+ "products",
368
+ "how-it-works",
369
+ "gallery",
370
+ "testimonials",
371
+ "faq",
372
+ "contact-form"
373
+ ]
374
+ },
375
+ about: { enabled: true, title: "My Story" },
376
+ products: { enabled: true, title: "Products" },
377
+ gallery: { enabled: true, title: "Gallery" },
378
+ faq: { enabled: true },
379
+ contact: { enabled: true },
380
+ privacy: { enabled: true }
381
+ },
382
+ seo: {
383
+ titleTemplate: "%s | Homemade with Love",
384
+ keywords: ["homemade", "cottage food", "baked goods", "local", "handmade", "artisan"],
385
+ jsonLdType: "LocalBusiness"
386
+ },
387
+ contactForm: {
388
+ enabled: true,
389
+ fields: {
390
+ name: true,
391
+ email: true,
392
+ phone: true,
393
+ service: false,
394
+ message: true
395
+ },
396
+ successMessage: "Thank you for your order inquiry! I'll get back to you within 24 hours."
397
+ },
398
+ features: {
399
+ mobileCallBar: true,
400
+ openStatus: false,
401
+ // Often by appointment
402
+ socialLinks: true,
403
+ bookingButton: true
404
+ }
405
+ },
406
+ defaults: {
407
+ business: {
408
+ tagline: "Homemade Goodness, Made with Love",
409
+ description: "Delicious homemade treats crafted with quality ingredients and care.",
410
+ priceRange: "$$"
411
+ },
412
+ products: [
413
+ { id: "p1", name: "Signature Cookies", description: "Our famous chocolate chip cookies", price: 3.5, priceNote: "per cookie or $18/dozen", category: "Cookies", featured: true, sortOrder: 1 },
414
+ { id: "p2", name: "Fresh Bread", description: "Artisan sourdough baked fresh", price: 8, priceNote: "per loaf", category: "Bread", sortOrder: 2 },
415
+ { id: "p3", name: "Seasonal Pie", description: "Made with fresh, seasonal fruit", price: 25, priceNote: "9-inch pie", category: "Pies", sortOrder: 3 },
416
+ { id: "p4", name: "Custom Cake", description: "Birthday, celebration, or special occasion cakes", priceNote: "Starting at $45", category: "Cakes", sortOrder: 4 },
417
+ { id: "p5", name: "Homemade Jam", description: "Small-batch preserves with local fruit", price: 8, priceNote: "8 oz jar", category: "Preserves", sortOrder: 5 }
418
+ ],
419
+ faq: [
420
+ { id: "f1", question: "How do I place an order?", answer: "You can place an order through the contact form on this website, by texting or calling, or through our social media pages. I'll confirm availability and arrange pickup or delivery.", sortOrder: 1 },
421
+ { id: "f2", question: "How far in advance should I order?", answer: "For standard items, 2-3 days notice is usually sufficient. For custom cakes or large orders, please give at least 1-2 weeks notice.", sortOrder: 2 },
422
+ { id: "f3", question: "Do you accommodate dietary restrictions?", answer: "Yes! I offer gluten-free, dairy-free, and vegan options for many items. Please mention any allergies or dietary needs when ordering.", sortOrder: 3 },
423
+ { id: "f4", question: "Do you deliver?", answer: "I offer local pickup from my home and delivery within a 10-mile radius for orders over $25. Delivery fees may apply.", sortOrder: 4 },
424
+ { id: "f5", question: "What forms of payment do you accept?", answer: "I accept cash, Venmo, PayPal, and Zelle. Payment is due at pickup or delivery.", sortOrder: 5 },
425
+ { id: "f6", question: "Are you licensed?", answer: "Yes! I operate under my state's cottage food law, which allows me to produce and sell specific homemade food items directly to consumers.", sortOrder: 6 }
426
+ ]
427
+ },
428
+ sheetTemplate: {
429
+ tabs: [
430
+ {
431
+ name: "business",
432
+ required: true,
433
+ columns: [
434
+ { name: "key", description: "Setting name", example: "name", required: true },
435
+ { name: "value", description: "Setting value", example: "Sweet Home Bakery", required: true }
436
+ ]
437
+ },
438
+ {
439
+ name: "products",
440
+ required: true,
441
+ columns: [
442
+ { name: "name", description: "Product name", example: "Chocolate Chip Cookies", required: true },
443
+ { name: "description", description: "Product description", example: "Classic cookies with premium chocolate", required: false },
444
+ { name: "price", description: "Price (number)", example: "18", required: false },
445
+ { name: "price_note", description: "Price details", example: "per dozen", required: false },
446
+ { name: "category", description: "Product category", example: "Cookies", required: false },
447
+ { name: "image_url", description: "Product image", example: "https://drive.google.com/...", required: false },
448
+ { name: "featured", description: "Is featured?", example: "TRUE", required: false },
449
+ { name: "in_stock", description: "Currently available?", example: "TRUE", required: false },
450
+ { name: "sort", description: "Display order", example: "1", required: false }
451
+ ]
452
+ },
453
+ {
454
+ name: "gallery",
455
+ required: false,
456
+ columns: [
457
+ { name: "image_url", description: "Image URL", example: "https://drive.google.com/...", required: true },
458
+ { name: "alt", description: "Image description", example: "Fresh baked cookies", required: false },
459
+ { name: "caption", description: "Caption text", example: "Straight from the oven", required: false },
460
+ { name: "sort", description: "Display order", example: "1", required: false }
461
+ ]
462
+ },
463
+ {
464
+ name: "testimonials",
465
+ required: false,
466
+ columns: [
467
+ { name: "quote", description: "Customer review", example: "The best cookies I've ever had!", required: true },
468
+ { name: "name", description: "Customer name", example: "Lisa M.", required: true },
469
+ { name: "context", description: "Order context", example: "Birthday party order", required: false },
470
+ { name: "rating", description: "Star rating (1-5)", example: "5", required: false },
471
+ { name: "sort", description: "Display order", example: "1", required: false }
472
+ ]
473
+ },
474
+ {
475
+ name: "faq",
476
+ required: false,
477
+ columns: [
478
+ { name: "question", description: "Question text", example: "How do I order?", required: true },
479
+ { name: "answer", description: "Answer text", example: "Contact me through the form...", required: true },
480
+ { name: "sort", description: "Display order", example: "1", required: false }
481
+ ]
482
+ }
483
+ ]
484
+ },
485
+ iconSuggestions: ["cake", "cookie", "bread", "heart", "sparkles", "star", "gift", "home"],
486
+ imageSuggestions: [
487
+ "Beautifully decorated custom cake",
488
+ "Fresh-baked cookies cooling on rack",
489
+ "Artisan bread with golden crust",
490
+ "Colorful cupcake display",
491
+ "Homemade jam jars with labels",
492
+ "Kitchen workspace with ingredients"
493
+ ]
494
+ };
495
+
496
+ // src/config/presets/salon.ts
497
+ var salonPreset = {
498
+ type: "salon",
499
+ name: "Hair Salon & Beauty",
500
+ description: "Configuration for hair salons, beauty parlors, and styling businesses",
501
+ config: {
502
+ businessType: "salon",
503
+ theme: {
504
+ preset: "soft-pink",
505
+ borderRadius: "lg",
506
+ shadows: "md"
507
+ },
508
+ pages: {
509
+ home: {
510
+ enabled: true,
511
+ sections: [
512
+ "hero",
513
+ "services",
514
+ "team",
515
+ "gallery",
516
+ "testimonials",
517
+ "hours",
518
+ "location"
519
+ ]
520
+ },
521
+ about: { enabled: true },
522
+ services: { enabled: true, title: "Services & Pricing" },
523
+ team: { enabled: true, title: "Our Stylists" },
524
+ gallery: { enabled: true, title: "Our Work" },
525
+ contact: { enabled: true },
526
+ privacy: { enabled: true }
527
+ },
528
+ seo: {
529
+ titleTemplate: "%s | Hair Salon & Beauty",
530
+ keywords: ["hair salon", "haircut", "color", "highlights", "styling", "beauty", "blowout"],
531
+ jsonLdType: "HealthAndBeautyBusiness"
532
+ },
533
+ contactForm: {
534
+ enabled: true,
535
+ fields: {
536
+ name: true,
537
+ email: true,
538
+ phone: true,
539
+ service: true,
540
+ message: true
541
+ }
542
+ },
543
+ features: {
544
+ mobileCallBar: true,
545
+ openStatus: true,
546
+ mapEmbed: true,
547
+ socialLinks: true,
548
+ bookingButton: true
549
+ }
550
+ },
551
+ defaults: {
552
+ business: {
553
+ tagline: "Where Style Meets Expertise",
554
+ description: "Experience the art of hair styling with our talented team of professionals.",
555
+ priceRange: "$$"
556
+ },
557
+ services: [
558
+ { id: "s1", title: "Women's Haircut", description: "Cut, shampoo, and style", priceNote: "From $45", icon: "scissors", sortOrder: 1 },
559
+ { id: "s2", title: "Men's Haircut", description: "Precision cut and style", priceNote: "From $30", icon: "scissors", sortOrder: 2 },
560
+ { id: "s3", title: "Single Process Color", description: "Full head single color application", priceNote: "From $75", icon: "palette", sortOrder: 3 },
561
+ { id: "s4", title: "Highlights", description: "Partial or full highlights", priceNote: "From $95", icon: "sun", sortOrder: 4 },
562
+ { id: "s5", title: "Balayage", description: "Hand-painted highlights for a natural look", priceNote: "From $150", icon: "paintbrush", sortOrder: 5 },
563
+ { id: "s6", title: "Blowout", description: "Shampoo and professional blowout", priceNote: "From $40", icon: "wind", sortOrder: 6 },
564
+ { id: "s7", title: "Deep Conditioning", description: "Intensive hair treatment", priceNote: "From $25", icon: "sparkles", sortOrder: 7 },
565
+ { id: "s8", title: "Special Occasion", description: "Updos and formal styling", priceNote: "From $65", icon: "star", sortOrder: 8 }
566
+ ],
567
+ team: [
568
+ { id: "t1", name: "Stylist Name", role: "Senior Stylist", bio: "With over 10 years of experience, specializing in color and cutting.", sortOrder: 1 },
569
+ { id: "t2", name: "Stylist Name", role: "Color Specialist", bio: "Expert in balayage, highlights, and creative color techniques.", sortOrder: 2 }
570
+ ],
571
+ faq: [
572
+ { id: "f1", question: "Do I need an appointment?", answer: "Appointments are strongly recommended to ensure we can give you our full attention. Walk-ins are welcome based on availability.", sortOrder: 1 },
573
+ { id: "f2", question: "What is your cancellation policy?", answer: "We require 24-hour notice for cancellations or rescheduling. Late cancellations may incur a fee.", sortOrder: 2 },
574
+ { id: "f3", question: "Do you offer consultations?", answer: "Yes! We offer free consultations for color services and major transformations. This helps us understand your goals and create a plan.", sortOrder: 3 },
575
+ { id: "f4", question: "What products do you use?", answer: "We use professional-grade products from top brands. Ask your stylist about our current product lines.", sortOrder: 4 },
576
+ { id: "f5", question: "How should I prepare for my appointment?", answer: "Come with clean, dry hair unless otherwise instructed. Feel free to bring photos of styles you love!", sortOrder: 5 }
577
+ ]
578
+ },
579
+ sheetTemplate: {
580
+ tabs: [
581
+ {
582
+ name: "business",
583
+ required: true,
584
+ columns: [
585
+ { name: "key", description: "Setting name", example: "name", required: true },
586
+ { name: "value", description: "Setting value", example: "Luxe Hair Studio", required: true }
587
+ ]
588
+ },
589
+ {
590
+ name: "hours",
591
+ required: true,
592
+ columns: [
593
+ { name: "day", description: "Day of week", example: "Monday", required: true },
594
+ { name: "open", description: "Opening time", example: "10:00 AM", required: false },
595
+ { name: "close", description: "Closing time", example: "7:00 PM", required: false },
596
+ { name: "closed", description: "Is closed?", example: "FALSE", required: false }
597
+ ]
598
+ },
599
+ {
600
+ name: "services",
601
+ required: true,
602
+ columns: [
603
+ { name: "title", description: "Service name", example: "Women's Haircut", required: true },
604
+ { name: "description", description: "Service description", example: "Cut, shampoo, and style", required: false },
605
+ { name: "price_note", description: "Pricing info", example: "From $45", required: false },
606
+ { name: "duration", description: "Service duration", example: "60 min", required: false },
607
+ { name: "icon", description: "Icon name", example: "scissors", required: false },
608
+ { name: "category", description: "Service category", example: "Cuts", required: false },
609
+ { name: "sort", description: "Display order", example: "1", required: false }
610
+ ]
611
+ },
612
+ {
613
+ name: "team",
614
+ required: false,
615
+ columns: [
616
+ { name: "name", description: "Stylist name", example: "Sarah Johnson", required: true },
617
+ { name: "role", description: "Role/title", example: "Senior Stylist", required: false },
618
+ { name: "bio", description: "Short bio", example: "Specializing in color for 10+ years", required: false },
619
+ { name: "image_url", description: "Photo URL", example: "https://drive.google.com/...", required: false },
620
+ { name: "sort", description: "Display order", example: "1", required: false }
621
+ ]
622
+ },
623
+ {
624
+ name: "gallery",
625
+ required: false,
626
+ columns: [
627
+ { name: "image_url", description: "Image URL", example: "https://drive.google.com/...", required: true },
628
+ { name: "alt", description: "Image description", example: "Balayage transformation", required: false },
629
+ { name: "caption", description: "Caption text", example: "Sun-kissed balayage", required: false },
630
+ { name: "sort", description: "Display order", example: "1", required: false }
631
+ ]
632
+ },
633
+ {
634
+ name: "testimonials",
635
+ required: false,
636
+ columns: [
637
+ { name: "quote", description: "Customer review", example: "Best haircut I've ever had!", required: true },
638
+ { name: "name", description: "Customer name", example: "Amanda R.", required: true },
639
+ { name: "rating", description: "Star rating (1-5)", example: "5", required: false },
640
+ { name: "sort", description: "Display order", example: "1", required: false }
641
+ ]
642
+ },
643
+ {
644
+ name: "faq",
645
+ required: false,
646
+ columns: [
647
+ { name: "question", description: "Question text", example: "Do I need an appointment?", required: true },
648
+ { name: "answer", description: "Answer text", example: "Appointments are recommended...", required: true },
649
+ { name: "sort", description: "Display order", example: "1", required: false }
650
+ ]
651
+ }
652
+ ]
653
+ },
654
+ iconSuggestions: ["scissors", "palette", "sparkles", "sun", "wind", "star", "heart", "user"],
655
+ imageSuggestions: [
656
+ "Before and after hair transformation",
657
+ "Stylist working on client",
658
+ "Beautiful balayage result",
659
+ "Salon interior",
660
+ "Product display",
661
+ "Special occasion updo"
662
+ ]
663
+ };
664
+
665
+ // src/config/presets/repair.ts
666
+ var repairPreset = {
667
+ type: "shoe-repair",
668
+ name: "Repair Shop",
669
+ description: "Configuration for repair shops (shoe, electronics, watch, etc.)",
670
+ config: {
671
+ businessType: "shoe-repair",
672
+ theme: {
673
+ preset: "warm-brown",
674
+ borderRadius: "md",
675
+ shadows: "md"
676
+ },
677
+ pages: {
678
+ home: {
679
+ enabled: true,
680
+ sections: [
681
+ "hero",
682
+ "services",
683
+ "how-it-works",
684
+ "gallery",
685
+ "testimonials",
686
+ "hours",
687
+ "location",
688
+ "faq"
689
+ ]
690
+ },
691
+ about: { enabled: true },
692
+ services: { enabled: true, title: "Our Services" },
693
+ gallery: { enabled: true, title: "Our Work" },
694
+ faq: { enabled: true },
695
+ contact: { enabled: true },
696
+ privacy: { enabled: true }
697
+ },
698
+ seo: {
699
+ titleTemplate: "%s | Expert Repair Services",
700
+ keywords: ["repair", "restoration", "fix", "local repair shop", "quality repairs"],
701
+ jsonLdType: "LocalBusiness"
702
+ },
703
+ contactForm: {
704
+ enabled: true,
705
+ fields: {
706
+ name: true,
707
+ email: true,
708
+ phone: true,
709
+ service: true,
710
+ message: true
711
+ }
712
+ },
713
+ features: {
714
+ mobileCallBar: true,
715
+ openStatus: true,
716
+ mapEmbed: true,
717
+ socialLinks: true
718
+ }
719
+ },
720
+ defaults: {
721
+ business: {
722
+ tagline: "Quality Repairs, Trusted Service",
723
+ description: "Expert repair services with attention to detail and fair pricing.",
724
+ priceRange: "$$"
725
+ },
726
+ services: [
727
+ { id: "s1", title: "Basic Repair", description: "Standard repairs and fixes", priceNote: "From $20", icon: "wrench", sortOrder: 1 },
728
+ { id: "s2", title: "Restoration", description: "Full restoration to like-new condition", priceNote: "By quote", icon: "sparkles", sortOrder: 2 },
729
+ { id: "s3", title: "Cleaning & Care", description: "Professional cleaning and maintenance", priceNote: "From $15", icon: "droplet", sortOrder: 3 },
730
+ { id: "s4", title: "Custom Work", description: "Specialized modifications and custom requests", priceNote: "By consultation", icon: "star", sortOrder: 4 },
731
+ { id: "s5", title: "Rush Service", description: "Same-day or next-day service", priceNote: "+50%", icon: "clock", sortOrder: 5 }
732
+ ],
733
+ faq: [
734
+ { id: "f1", question: "How long do repairs typically take?", answer: "Standard repairs are usually completed within 3-5 business days. Rush service is available for urgent needs at an additional cost.", sortOrder: 1 },
735
+ { id: "f2", question: "Do you provide free estimates?", answer: "Yes! We provide free estimates for all repairs. Just bring in your item for an assessment.", sortOrder: 2 },
736
+ { id: "f3", question: "Do you offer a warranty on repairs?", answer: "Yes, all our repairs come with a 90-day warranty against workmanship defects.", sortOrder: 3 },
737
+ { id: "f4", question: "What brands do you work with?", answer: "We work with all major brands and have experience with both common and specialty items.", sortOrder: 4 },
738
+ { id: "f5", question: "Can you match colors/materials?", answer: "We maintain an extensive inventory and can often match colors and materials closely. Bring in your item for assessment.", sortOrder: 5 }
739
+ ]
740
+ },
741
+ sheetTemplate: {
742
+ tabs: [
743
+ {
744
+ name: "business",
745
+ required: true,
746
+ columns: [
747
+ { name: "key", description: "Setting name", example: "name", required: true },
748
+ { name: "value", description: "Setting value", example: "Quality Repair Shop", required: true }
749
+ ]
750
+ },
751
+ {
752
+ name: "hours",
753
+ required: true,
754
+ columns: [
755
+ { name: "day", description: "Day of week", example: "Monday", required: true },
756
+ { name: "open", description: "Opening time", example: "9:00 AM", required: false },
757
+ { name: "close", description: "Closing time", example: "6:00 PM", required: false },
758
+ { name: "closed", description: "Is closed?", example: "FALSE", required: false }
759
+ ]
760
+ },
761
+ {
762
+ name: "services",
763
+ required: true,
764
+ columns: [
765
+ { name: "title", description: "Service name", example: "Basic Repair", required: true },
766
+ { name: "description", description: "Service description", example: "Standard repairs and fixes", required: false },
767
+ { name: "price_note", description: "Pricing info", example: "From $20", required: false },
768
+ { name: "icon", description: "Icon name", example: "wrench", required: false },
769
+ { name: "sort", description: "Display order", example: "1", required: false }
770
+ ]
771
+ },
772
+ {
773
+ name: "gallery",
774
+ required: false,
775
+ columns: [
776
+ { name: "image_url", description: "Image URL", example: "https://drive.google.com/...", required: true },
777
+ { name: "alt", description: "Image description", example: "Before and after repair", required: false },
778
+ { name: "caption", description: "Caption text", example: "Restored to like-new condition", required: false },
779
+ { name: "sort", description: "Display order", example: "1", required: false }
780
+ ]
781
+ },
782
+ {
783
+ name: "testimonials",
784
+ required: false,
785
+ columns: [
786
+ { name: "quote", description: "Customer review", example: "Amazing work! Like new again.", required: true },
787
+ { name: "name", description: "Customer name", example: "Mike T.", required: true },
788
+ { name: "context", description: "Service context", example: "Watch restoration", required: false },
789
+ { name: "rating", description: "Star rating (1-5)", example: "5", required: false },
790
+ { name: "sort", description: "Display order", example: "1", required: false }
791
+ ]
792
+ },
793
+ {
794
+ name: "faq",
795
+ required: false,
796
+ columns: [
797
+ { name: "question", description: "Question text", example: "How long do repairs take?", required: true },
798
+ { name: "answer", description: "Answer text", example: "3-5 business days typically", required: true },
799
+ { name: "sort", description: "Display order", example: "1", required: false }
800
+ ]
801
+ }
802
+ ]
803
+ },
804
+ iconSuggestions: ["wrench", "hammer", "sparkles", "clock", "star", "shield", "check", "tool"],
805
+ imageSuggestions: [
806
+ "Before and after repair shots",
807
+ "Craftsman at work",
808
+ "Organized workshop",
809
+ "Close-up of quality workmanship",
810
+ "Tools of the trade",
811
+ "Happy customer with repaired item"
812
+ ]
813
+ };
814
+
815
+ // src/config/presets/professional.ts
816
+ var professionalPreset = {
817
+ type: "accountant",
818
+ name: "Professional Services",
819
+ description: "Configuration for accountants, lawyers, consultants, and other professional service providers",
820
+ config: {
821
+ businessType: "accountant",
822
+ theme: {
823
+ preset: "cool-blue",
824
+ borderRadius: "md",
825
+ shadows: "sm"
826
+ },
827
+ pages: {
828
+ home: {
829
+ enabled: true,
830
+ sections: [
831
+ "hero",
832
+ "services",
833
+ "about-preview",
834
+ "testimonials",
835
+ "faq",
836
+ "contact-form"
837
+ ]
838
+ },
839
+ about: { enabled: true },
840
+ services: { enabled: true, title: "Our Services" },
841
+ team: { enabled: true, title: "Our Team" },
842
+ faq: { enabled: true },
843
+ contact: { enabled: true },
844
+ privacy: { enabled: true }
845
+ },
846
+ seo: {
847
+ titleTemplate: "%s | Professional Services",
848
+ keywords: ["professional services", "consulting", "expert advice", "local business"],
849
+ jsonLdType: "ProfessionalService"
850
+ },
851
+ contactForm: {
852
+ enabled: true,
853
+ fields: {
854
+ name: true,
855
+ email: true,
856
+ phone: true,
857
+ service: true,
858
+ message: true
859
+ },
860
+ successMessage: "Thank you for your inquiry. We'll be in touch within one business day."
861
+ },
862
+ features: {
863
+ mobileCallBar: true,
864
+ openStatus: true,
865
+ mapEmbed: true,
866
+ socialLinks: true,
867
+ bookingButton: true
868
+ }
869
+ },
870
+ defaults: {
871
+ business: {
872
+ tagline: "Expert Guidance You Can Trust",
873
+ description: "Professional services delivered with expertise, integrity, and a personal touch.",
874
+ priceRange: "$$$"
875
+ },
876
+ services: [
877
+ { id: "s1", title: "Initial Consultation", description: "Comprehensive assessment of your needs and goals", priceNote: "Free", icon: "chat", sortOrder: 1 },
878
+ { id: "s2", title: "Core Services", description: "Our primary service offering tailored to your needs", priceNote: "From $150/hour", icon: "briefcase", sortOrder: 2 },
879
+ { id: "s3", title: "Comprehensive Package", description: "Full-service solution with ongoing support", priceNote: "Custom quote", icon: "package", sortOrder: 3 },
880
+ { id: "s4", title: "Ongoing Support", description: "Monthly retainer for continuous guidance", priceNote: "From $500/month", icon: "calendar", sortOrder: 4 }
881
+ ],
882
+ team: [
883
+ { id: "t1", name: "Principal Name", role: "Principal / Founder", bio: "Over 20 years of experience helping clients achieve their goals.", sortOrder: 1 },
884
+ { id: "t2", name: "Associate Name", role: "Senior Associate", bio: "Specialized expertise in key service areas.", sortOrder: 2 }
885
+ ],
886
+ faq: [
887
+ { id: "f1", question: "What is your availability?", answer: "We maintain flexible hours to accommodate our clients' schedules. Evening and weekend appointments are available upon request.", sortOrder: 1 },
888
+ { id: "f2", question: "Do you offer remote consultations?", answer: "Yes, we offer both in-person and virtual consultations via video conference for your convenience.", sortOrder: 2 },
889
+ { id: "f3", question: "What are your fees?", answer: "Fees vary based on the complexity of services required. We provide detailed fee estimates after our initial consultation.", sortOrder: 3 },
890
+ { id: "f4", question: "What forms of payment do you accept?", answer: "We accept checks, credit cards, and bank transfers. Payment plans may be available for certain services.", sortOrder: 4 },
891
+ { id: "f5", question: "How do I get started?", answer: "Contact us to schedule a free initial consultation. We'll discuss your needs and how we can help.", sortOrder: 5 }
892
+ ]
893
+ },
894
+ sheetTemplate: {
895
+ tabs: [
896
+ {
897
+ name: "business",
898
+ required: true,
899
+ columns: [
900
+ { name: "key", description: "Setting name", example: "name", required: true },
901
+ { name: "value", description: "Setting value", example: "Smith & Associates", required: true }
902
+ ]
903
+ },
904
+ {
905
+ name: "hours",
906
+ required: true,
907
+ columns: [
908
+ { name: "day", description: "Day of week", example: "Monday", required: true },
909
+ { name: "open", description: "Opening time", example: "9:00 AM", required: false },
910
+ { name: "close", description: "Closing time", example: "5:00 PM", required: false },
911
+ { name: "closed", description: "Is closed?", example: "FALSE", required: false }
912
+ ]
913
+ },
914
+ {
915
+ name: "services",
916
+ required: true,
917
+ columns: [
918
+ { name: "title", description: "Service name", example: "Tax Preparation", required: true },
919
+ { name: "description", description: "Service description", example: "Individual and business tax returns", required: false },
920
+ { name: "price_note", description: "Pricing info", example: "From $200", required: false },
921
+ { name: "icon", description: "Icon name", example: "calculator", required: false },
922
+ { name: "sort", description: "Display order", example: "1", required: false }
923
+ ]
924
+ },
925
+ {
926
+ name: "team",
927
+ required: false,
928
+ columns: [
929
+ { name: "name", description: "Team member name", example: "John Smith, CPA", required: true },
930
+ { name: "role", description: "Role/title", example: "Principal", required: false },
931
+ { name: "bio", description: "Short bio", example: "20+ years of experience...", required: false },
932
+ { name: "image_url", description: "Photo URL", example: "https://drive.google.com/...", required: false },
933
+ { name: "email", description: "Direct email", example: "john@example.com", required: false },
934
+ { name: "sort", description: "Display order", example: "1", required: false }
935
+ ]
936
+ },
937
+ {
938
+ name: "testimonials",
939
+ required: false,
940
+ columns: [
941
+ { name: "quote", description: "Client testimonial", example: "Exceptional service and expertise.", required: true },
942
+ { name: "name", description: "Client name", example: "David L.", required: true },
943
+ { name: "context", description: "Service context", example: "Tax planning", required: false },
944
+ { name: "rating", description: "Star rating (1-5)", example: "5", required: false },
945
+ { name: "sort", description: "Display order", example: "1", required: false }
946
+ ]
947
+ },
948
+ {
949
+ name: "faq",
950
+ required: false,
951
+ columns: [
952
+ { name: "question", description: "Question text", example: "What are your fees?", required: true },
953
+ { name: "answer", description: "Answer text", example: "Fees vary based on complexity...", required: true },
954
+ { name: "sort", description: "Display order", example: "1", required: false }
955
+ ]
956
+ }
957
+ ]
958
+ },
959
+ iconSuggestions: ["briefcase", "calculator", "scale", "shield", "document", "chart", "users", "check"],
960
+ imageSuggestions: [
961
+ "Professional headshots",
962
+ "Modern office interior",
963
+ "Team meeting",
964
+ "Client consultation",
965
+ "Professional at work",
966
+ "Office building exterior"
967
+ ]
968
+ };
969
+
970
+ // src/config/presets/generic.ts
971
+ var genericPreset = {
972
+ type: "generic",
973
+ name: "Generic Business",
974
+ description: "A flexible configuration that works for most business types",
975
+ config: {
976
+ businessType: "generic",
977
+ theme: {
978
+ preset: "cool-blue",
979
+ borderRadius: "md",
980
+ shadows: "md"
981
+ },
982
+ pages: {
983
+ home: {
984
+ enabled: true,
985
+ sections: [
986
+ "hero",
987
+ "services",
988
+ "testimonials",
989
+ "hours",
990
+ "location",
991
+ "faq"
992
+ ]
993
+ },
994
+ about: { enabled: true },
995
+ services: { enabled: true },
996
+ gallery: { enabled: true },
997
+ faq: { enabled: true },
998
+ contact: { enabled: true },
999
+ privacy: { enabled: true }
1000
+ },
1001
+ seo: {
1002
+ titleTemplate: "%s | Quality Service",
1003
+ keywords: ["local business", "professional service", "quality"],
1004
+ jsonLdType: "LocalBusiness"
1005
+ },
1006
+ contactForm: {
1007
+ enabled: true,
1008
+ fields: {
1009
+ name: true,
1010
+ email: true,
1011
+ phone: true,
1012
+ service: true,
1013
+ message: true
1014
+ }
1015
+ },
1016
+ features: {
1017
+ mobileCallBar: true,
1018
+ openStatus: true,
1019
+ mapEmbed: true,
1020
+ socialLinks: true
1021
+ }
1022
+ },
1023
+ defaults: {
1024
+ business: {
1025
+ tagline: "Quality Service You Can Trust",
1026
+ description: "We are dedicated to providing exceptional service to our community.",
1027
+ priceRange: "$$"
1028
+ },
1029
+ services: [
1030
+ { id: "s1", title: "Service One", description: "Our primary service offering", priceNote: "Contact for pricing", sortOrder: 1 },
1031
+ { id: "s2", title: "Service Two", description: "Another excellent option", priceNote: "Contact for pricing", sortOrder: 2 },
1032
+ { id: "s3", title: "Service Three", description: "Specialized service for unique needs", priceNote: "Contact for pricing", sortOrder: 3 }
1033
+ ],
1034
+ faq: [
1035
+ { id: "f1", question: "What are your hours?", answer: "Please check our hours section above or contact us for current availability.", sortOrder: 1 },
1036
+ { id: "f2", question: "How can I contact you?", answer: "You can reach us by phone, email, or through the contact form on this website.", sortOrder: 2 },
1037
+ { id: "f3", question: "Do you offer free estimates?", answer: "Yes, we provide free estimates for most services. Contact us to schedule.", sortOrder: 3 }
1038
+ ]
1039
+ },
1040
+ sheetTemplate: {
1041
+ tabs: [
1042
+ {
1043
+ name: "business",
1044
+ required: true,
1045
+ columns: [
1046
+ { name: "key", description: "Setting name", example: "name", required: true },
1047
+ { name: "value", description: "Setting value", example: "Your Business Name", required: true }
1048
+ ]
1049
+ },
1050
+ {
1051
+ name: "hours",
1052
+ required: true,
1053
+ columns: [
1054
+ { name: "day", description: "Day of week", example: "Monday", required: true },
1055
+ { name: "open", description: "Opening time", example: "9:00 AM", required: false },
1056
+ { name: "close", description: "Closing time", example: "5:00 PM", required: false },
1057
+ { name: "closed", description: "Is closed?", example: "FALSE", required: false }
1058
+ ]
1059
+ },
1060
+ {
1061
+ name: "services",
1062
+ required: true,
1063
+ columns: [
1064
+ { name: "title", description: "Service name", example: "Main Service", required: true },
1065
+ { name: "description", description: "Service description", example: "Description of the service", required: false },
1066
+ { name: "price_note", description: "Pricing info", example: "From $50", required: false },
1067
+ { name: "icon", description: "Icon name", example: "star", required: false },
1068
+ { name: "sort", description: "Display order", example: "1", required: false }
1069
+ ]
1070
+ },
1071
+ {
1072
+ name: "gallery",
1073
+ required: false,
1074
+ columns: [
1075
+ { name: "image_url", description: "Image URL", example: "https://drive.google.com/...", required: true },
1076
+ { name: "alt", description: "Image description", example: "Image description", required: false },
1077
+ { name: "caption", description: "Caption text", example: "Photo caption", required: false },
1078
+ { name: "sort", description: "Display order", example: "1", required: false }
1079
+ ]
1080
+ },
1081
+ {
1082
+ name: "testimonials",
1083
+ required: false,
1084
+ columns: [
1085
+ { name: "quote", description: "Customer review", example: "Great service!", required: true },
1086
+ { name: "name", description: "Customer name", example: "John D.", required: true },
1087
+ { name: "rating", description: "Star rating (1-5)", example: "5", required: false },
1088
+ { name: "sort", description: "Display order", example: "1", required: false }
1089
+ ]
1090
+ },
1091
+ {
1092
+ name: "faq",
1093
+ required: false,
1094
+ columns: [
1095
+ { name: "question", description: "Question text", example: "Common question?", required: true },
1096
+ { name: "answer", description: "Answer text", example: "The answer...", required: true },
1097
+ { name: "sort", description: "Display order", example: "1", required: false }
1098
+ ]
1099
+ }
1100
+ ]
1101
+ },
1102
+ iconSuggestions: ["star", "check", "heart", "sparkles", "shield", "clock", "phone", "mail"],
1103
+ imageSuggestions: [
1104
+ "Professional team photo",
1105
+ "Service in action",
1106
+ "Happy customers",
1107
+ "Business storefront",
1108
+ "Quality workmanship",
1109
+ "Before and after results"
1110
+ ]
1111
+ };
1112
+
1113
+ // src/config/presets/index.ts
1114
+ var presets = {
1115
+ // Direct mappings
1116
+ "tailor": tailorPreset,
1117
+ "restaurant": restaurantPreset,
1118
+ "home-kitchen": homeKitchenPreset,
1119
+ "salon": salonPreset,
1120
+ "shoe-repair": repairPreset,
1121
+ "accountant": professionalPreset,
1122
+ "generic": genericPreset,
1123
+ // Aliases - map similar business types to their closest preset
1124
+ "alterations": tailorPreset,
1125
+ "seamstress": tailorPreset,
1126
+ "dry-cleaner": tailorPreset,
1127
+ "cafe": restaurantPreset,
1128
+ "bakery": homeKitchenPreset,
1129
+ "food-truck": restaurantPreset,
1130
+ "catering": restaurantPreset,
1131
+ "barbershop": salonPreset,
1132
+ "spa": salonPreset,
1133
+ "nail-salon": salonPreset,
1134
+ "pet-grooming": salonPreset,
1135
+ "craft-seller": homeKitchenPreset,
1136
+ "boutique": genericPreset,
1137
+ "florist": genericPreset,
1138
+ "gift-shop": genericPreset,
1139
+ "cleaning": repairPreset,
1140
+ "landscaping": repairPreset,
1141
+ "handyman": repairPreset,
1142
+ "plumber": repairPreset,
1143
+ "electrician": repairPreset,
1144
+ "hvac": repairPreset,
1145
+ "moving": repairPreset,
1146
+ "pest-control": repairPreset,
1147
+ "auto-repair": repairPreset,
1148
+ "auto-detail": repairPreset,
1149
+ "tire-shop": repairPreset,
1150
+ "lawyer": professionalPreset,
1151
+ "real-estate": professionalPreset,
1152
+ "insurance": professionalPreset,
1153
+ "consulting": professionalPreset,
1154
+ "personal-trainer": genericPreset,
1155
+ "yoga-studio": genericPreset,
1156
+ "martial-arts": genericPreset,
1157
+ "chiropractor": professionalPreset,
1158
+ "massage": salonPreset,
1159
+ "tutoring": professionalPreset,
1160
+ "music-lessons": genericPreset,
1161
+ "photography": genericPreset,
1162
+ "videography": genericPreset,
1163
+ "event-planning": genericPreset
1164
+ };
1165
+ function getPreset(type) {
1166
+ return presets[type] || genericPreset;
1167
+ }
1168
+ function getSupportedBusinessTypes() {
1169
+ const uniquePresets = /* @__PURE__ */ new Map();
1170
+ for (const preset of Object.values(presets)) {
1171
+ if (!uniquePresets.has(preset.type)) {
1172
+ uniquePresets.set(preset.type, preset);
1173
+ }
1174
+ }
1175
+ return Array.from(uniquePresets.values()).map((preset) => ({
1176
+ type: preset.type,
1177
+ name: preset.name,
1178
+ description: preset.description
1179
+ }));
1180
+ }
1181
+ var businessCategories = {
1182
+ "Service Businesses": [
1183
+ "tailor",
1184
+ "shoe-repair",
1185
+ "dry-cleaner",
1186
+ "salon",
1187
+ "barbershop",
1188
+ "spa",
1189
+ "nail-salon",
1190
+ "pet-grooming"
1191
+ ],
1192
+ "Food & Beverage": [
1193
+ "restaurant",
1194
+ "cafe",
1195
+ "bakery",
1196
+ "food-truck",
1197
+ "home-kitchen",
1198
+ "catering"
1199
+ ],
1200
+ "Retail": [
1201
+ "craft-seller",
1202
+ "boutique",
1203
+ "florist",
1204
+ "gift-shop"
1205
+ ],
1206
+ "Home Services": [
1207
+ "cleaning",
1208
+ "landscaping",
1209
+ "handyman",
1210
+ "plumber",
1211
+ "electrician",
1212
+ "hvac",
1213
+ "moving",
1214
+ "pest-control"
1215
+ ],
1216
+ "Auto Services": [
1217
+ "auto-repair",
1218
+ "auto-detail",
1219
+ "tire-shop"
1220
+ ],
1221
+ "Professional Services": [
1222
+ "accountant",
1223
+ "lawyer",
1224
+ "real-estate",
1225
+ "insurance",
1226
+ "consulting"
1227
+ ],
1228
+ "Health & Wellness": [
1229
+ "personal-trainer",
1230
+ "yoga-studio",
1231
+ "martial-arts",
1232
+ "chiropractor",
1233
+ "massage"
1234
+ ],
1235
+ "Education & Creative": [
1236
+ "tutoring",
1237
+ "music-lessons",
1238
+ "photography",
1239
+ "videography",
1240
+ "event-planning"
1241
+ ]
1242
+ };
1243
+ function recommendBusinessType(keywords) {
1244
+ const lowerKeywords = keywords.map((k) => k.toLowerCase());
1245
+ const keywordMap = {
1246
+ // ==========================================================================
1247
+ // TAILOR / ALTERATIONS
1248
+ // ==========================================================================
1249
+ "tailor": "tailor",
1250
+ "tailor shop": "tailor",
1251
+ "tailoring": "tailor",
1252
+ "alterations": "tailor",
1253
+ "alteration": "tailor",
1254
+ "seamstress": "tailor",
1255
+ "sewing": "tailor",
1256
+ "hemming": "tailor",
1257
+ "clothing repair": "tailor",
1258
+ "suit alterations": "tailor",
1259
+ "dress alterations": "tailor",
1260
+ "wedding dress": "tailor",
1261
+ "bridal alterations": "tailor",
1262
+ "custom suits": "tailor",
1263
+ "bespoke": "tailor",
1264
+ // Dry cleaning (maps to tailor preset)
1265
+ "dry cleaner": "dry-cleaner",
1266
+ "dry cleaning": "dry-cleaner",
1267
+ "laundry": "dry-cleaner",
1268
+ "laundromat": "dry-cleaner",
1269
+ "cleaners": "dry-cleaner",
1270
+ // ==========================================================================
1271
+ // RESTAURANT / FOOD SERVICE
1272
+ // ==========================================================================
1273
+ "restaurant": "restaurant",
1274
+ "dining": "restaurant",
1275
+ "eatery": "restaurant",
1276
+ "bistro": "restaurant",
1277
+ "brasserie": "restaurant",
1278
+ "trattoria": "restaurant",
1279
+ "pizzeria": "restaurant",
1280
+ "pizza": "restaurant",
1281
+ "mexican restaurant": "restaurant",
1282
+ "italian restaurant": "restaurant",
1283
+ "chinese restaurant": "restaurant",
1284
+ "thai restaurant": "restaurant",
1285
+ "indian restaurant": "restaurant",
1286
+ "japanese restaurant": "restaurant",
1287
+ "sushi": "restaurant",
1288
+ "ramen": "restaurant",
1289
+ "pho": "restaurant",
1290
+ "taqueria": "restaurant",
1291
+ "burrito": "restaurant",
1292
+ "burger": "restaurant",
1293
+ "steakhouse": "restaurant",
1294
+ "seafood": "restaurant",
1295
+ "grill": "restaurant",
1296
+ "bbq": "restaurant",
1297
+ "barbecue": "restaurant",
1298
+ "diner": "restaurant",
1299
+ "deli": "restaurant",
1300
+ "sandwich": "restaurant",
1301
+ "sub shop": "restaurant",
1302
+ // Cafe / Coffee
1303
+ "cafe": "cafe",
1304
+ "caf\xE9": "cafe",
1305
+ "coffee shop": "cafe",
1306
+ "coffee house": "cafe",
1307
+ "coffeehouse": "cafe",
1308
+ "espresso": "cafe",
1309
+ "tea house": "cafe",
1310
+ "tea room": "cafe",
1311
+ "juice bar": "cafe",
1312
+ "smoothie": "cafe",
1313
+ // Food truck
1314
+ "food truck": "food-truck",
1315
+ "food cart": "food-truck",
1316
+ "mobile food": "food-truck",
1317
+ // Catering
1318
+ "catering": "catering",
1319
+ "caterer": "catering",
1320
+ "event catering": "catering",
1321
+ // ==========================================================================
1322
+ // BAKERY / HOME KITCHEN
1323
+ // ==========================================================================
1324
+ "bakery": "bakery",
1325
+ "baker": "bakery",
1326
+ "baking": "bakery",
1327
+ "bread": "bakery",
1328
+ "pastry": "bakery",
1329
+ "pastries": "bakery",
1330
+ "patisserie": "bakery",
1331
+ "donut": "bakery",
1332
+ "doughnut": "bakery",
1333
+ "bagel": "bakery",
1334
+ // Home kitchen / Cottage food
1335
+ "home kitchen": "home-kitchen",
1336
+ "cottage food": "home-kitchen",
1337
+ "homemade": "home-kitchen",
1338
+ "home baked": "home-kitchen",
1339
+ "cookies": "home-kitchen",
1340
+ "cakes": "home-kitchen",
1341
+ "cupcakes": "home-kitchen",
1342
+ "custom cakes": "home-kitchen",
1343
+ "wedding cakes": "home-kitchen",
1344
+ "desserts": "home-kitchen",
1345
+ "tamales": "home-kitchen",
1346
+ "empanadas": "home-kitchen",
1347
+ "meal prep": "home-kitchen",
1348
+ // ==========================================================================
1349
+ // SALON / BEAUTY
1350
+ // ==========================================================================
1351
+ "salon": "salon",
1352
+ "hair salon": "salon",
1353
+ "hair stylist": "salon",
1354
+ "hairdresser": "salon",
1355
+ "hairstylist": "salon",
1356
+ "beauty salon": "salon",
1357
+ "beauty parlor": "salon",
1358
+ "beautician": "salon",
1359
+ "cosmetologist": "salon",
1360
+ "hair cutting": "salon",
1361
+ "haircut": "salon",
1362
+ "hair coloring": "salon",
1363
+ "highlights": "salon",
1364
+ "blowout": "salon",
1365
+ "extensions": "salon",
1366
+ "braiding": "salon",
1367
+ "weave": "salon",
1368
+ "locs": "salon",
1369
+ "dreadlocks": "salon",
1370
+ // Barbershop
1371
+ "barber": "barbershop",
1372
+ "barbershop": "barbershop",
1373
+ "barber shop": "barbershop",
1374
+ "men's haircut": "barbershop",
1375
+ "fade": "barbershop",
1376
+ "lineup": "barbershop",
1377
+ // Spa
1378
+ "spa": "spa",
1379
+ "day spa": "spa",
1380
+ "med spa": "spa",
1381
+ "medical spa": "spa",
1382
+ "facial": "spa",
1383
+ "facials": "spa",
1384
+ "skincare": "spa",
1385
+ "esthetician": "spa",
1386
+ "aesthetician": "spa",
1387
+ "waxing": "spa",
1388
+ "laser hair": "spa",
1389
+ // Nail salon
1390
+ "nail salon": "nail-salon",
1391
+ "nail": "nail-salon",
1392
+ "nails": "nail-salon",
1393
+ "manicure": "nail-salon",
1394
+ "pedicure": "nail-salon",
1395
+ "gel nails": "nail-salon",
1396
+ "acrylic nails": "nail-salon",
1397
+ // Massage
1398
+ "massage": "massage",
1399
+ "massage therapy": "massage",
1400
+ "massage therapist": "massage",
1401
+ "deep tissue": "massage",
1402
+ "swedish massage": "massage",
1403
+ "thai massage": "massage",
1404
+ "sports massage": "massage",
1405
+ "reflexology": "massage",
1406
+ // Pet grooming
1407
+ "pet grooming": "pet-grooming",
1408
+ "dog grooming": "pet-grooming",
1409
+ "pet groomer": "pet-grooming",
1410
+ "dog groomer": "pet-grooming",
1411
+ "cat grooming": "pet-grooming",
1412
+ "mobile grooming": "pet-grooming",
1413
+ // ==========================================================================
1414
+ // REPAIR / SHOE REPAIR
1415
+ // ==========================================================================
1416
+ "shoe repair": "shoe-repair",
1417
+ "shoe shop": "shoe-repair",
1418
+ "cobbler": "shoe-repair",
1419
+ "leather repair": "shoe-repair",
1420
+ "boot repair": "shoe-repair",
1421
+ "heel repair": "shoe-repair",
1422
+ "sole repair": "shoe-repair",
1423
+ "shoe shine": "shoe-repair",
1424
+ "luggage repair": "shoe-repair",
1425
+ "purse repair": "shoe-repair",
1426
+ "bag repair": "shoe-repair",
1427
+ // ==========================================================================
1428
+ // HOME SERVICES
1429
+ // ==========================================================================
1430
+ // Cleaning
1431
+ "cleaning": "cleaning",
1432
+ "cleaning service": "cleaning",
1433
+ "house cleaning": "cleaning",
1434
+ "home cleaning": "cleaning",
1435
+ "maid service": "cleaning",
1436
+ "maid": "cleaning",
1437
+ "janitorial": "cleaning",
1438
+ "carpet cleaning": "cleaning",
1439
+ "window cleaning": "cleaning",
1440
+ "pressure washing": "cleaning",
1441
+ "power washing": "cleaning",
1442
+ // Landscaping
1443
+ "landscaping": "landscaping",
1444
+ "landscaper": "landscaping",
1445
+ "lawn care": "landscaping",
1446
+ "lawn service": "landscaping",
1447
+ "lawn mowing": "landscaping",
1448
+ "gardening": "landscaping",
1449
+ "gardener": "landscaping",
1450
+ "tree service": "landscaping",
1451
+ "tree trimming": "landscaping",
1452
+ "irrigation": "landscaping",
1453
+ "sprinkler": "landscaping",
1454
+ // Handyman
1455
+ "handyman": "handyman",
1456
+ "handy man": "handyman",
1457
+ "home repair": "handyman",
1458
+ "home maintenance": "handyman",
1459
+ "general contractor": "handyman",
1460
+ "remodeling": "handyman",
1461
+ "renovation": "handyman",
1462
+ // Plumber
1463
+ "plumber": "plumber",
1464
+ "plumbing": "plumber",
1465
+ "plumber service": "plumber",
1466
+ "drain": "plumber",
1467
+ "sewer": "plumber",
1468
+ "water heater": "plumber",
1469
+ // Electrician
1470
+ "electrician": "electrician",
1471
+ "electrical": "electrician",
1472
+ "electric": "electrician",
1473
+ "electrical contractor": "electrician",
1474
+ "wiring": "electrician",
1475
+ "panel": "electrician",
1476
+ // HVAC
1477
+ "hvac": "hvac",
1478
+ "air conditioning": "hvac",
1479
+ "ac repair": "hvac",
1480
+ "heating": "hvac",
1481
+ "furnace": "hvac",
1482
+ "ventilation": "hvac",
1483
+ // Moving
1484
+ "moving": "moving",
1485
+ "movers": "moving",
1486
+ "moving company": "moving",
1487
+ "relocation": "moving",
1488
+ "hauling": "moving",
1489
+ "junk removal": "moving",
1490
+ // Pest control
1491
+ "pest control": "pest-control",
1492
+ "exterminator": "pest-control",
1493
+ "pest": "pest-control",
1494
+ "termite": "pest-control",
1495
+ "rodent": "pest-control",
1496
+ "bed bug": "pest-control",
1497
+ // ==========================================================================
1498
+ // AUTO SERVICES
1499
+ // ==========================================================================
1500
+ "auto repair": "auto-repair",
1501
+ "auto shop": "auto-repair",
1502
+ "car repair": "auto-repair",
1503
+ "mechanic": "auto-repair",
1504
+ "automotive": "auto-repair",
1505
+ "auto service": "auto-repair",
1506
+ "transmission": "auto-repair",
1507
+ "brake": "auto-repair",
1508
+ "oil change": "auto-repair",
1509
+ "tune up": "auto-repair",
1510
+ "smog": "auto-repair",
1511
+ "emissions": "auto-repair",
1512
+ // Auto detail
1513
+ "auto detail": "auto-detail",
1514
+ "car detail": "auto-detail",
1515
+ "auto detailing": "auto-detail",
1516
+ "car detailing": "auto-detail",
1517
+ "car wash": "auto-detail",
1518
+ "mobile detail": "auto-detail",
1519
+ // Tire shop
1520
+ "tire shop": "tire-shop",
1521
+ "tire": "tire-shop",
1522
+ "tires": "tire-shop",
1523
+ "tire service": "tire-shop",
1524
+ "wheel": "tire-shop",
1525
+ "alignment": "tire-shop",
1526
+ // ==========================================================================
1527
+ // PROFESSIONAL SERVICES
1528
+ // ==========================================================================
1529
+ // Accountant
1530
+ "accountant": "accountant",
1531
+ "accounting": "accountant",
1532
+ "bookkeeper": "accountant",
1533
+ "bookkeeping": "accountant",
1534
+ "tax": "accountant",
1535
+ "tax preparation": "accountant",
1536
+ "tax preparer": "accountant",
1537
+ "cpa": "accountant",
1538
+ "enrolled agent": "accountant",
1539
+ // Lawyer
1540
+ "lawyer": "lawyer",
1541
+ "attorney": "lawyer",
1542
+ "law firm": "lawyer",
1543
+ "law office": "lawyer",
1544
+ "legal": "lawyer",
1545
+ "legal services": "lawyer",
1546
+ "immigration": "lawyer",
1547
+ "divorce": "lawyer",
1548
+ "criminal defense": "lawyer",
1549
+ "personal injury": "lawyer",
1550
+ "bankruptcy": "lawyer",
1551
+ "estate planning": "lawyer",
1552
+ "notary": "lawyer",
1553
+ // Real estate
1554
+ "real estate": "real-estate",
1555
+ "realtor": "real-estate",
1556
+ "realty": "real-estate",
1557
+ "real estate agent": "real-estate",
1558
+ "real estate broker": "real-estate",
1559
+ "property management": "real-estate",
1560
+ // Insurance
1561
+ "insurance": "insurance",
1562
+ "insurance agent": "insurance",
1563
+ "insurance agency": "insurance",
1564
+ "insurance broker": "insurance",
1565
+ "life insurance": "insurance",
1566
+ "auto insurance": "insurance",
1567
+ "health insurance": "insurance",
1568
+ "medicare": "insurance",
1569
+ // Consulting
1570
+ "consultant": "consulting",
1571
+ "consulting": "consulting",
1572
+ "business consultant": "consulting",
1573
+ "management consultant": "consulting",
1574
+ "advisor": "consulting",
1575
+ "financial advisor": "consulting",
1576
+ // ==========================================================================
1577
+ // HEALTH & WELLNESS
1578
+ // ==========================================================================
1579
+ // Personal trainer
1580
+ "personal trainer": "personal-trainer",
1581
+ "personal training": "personal-trainer",
1582
+ "fitness trainer": "personal-trainer",
1583
+ "fitness": "personal-trainer",
1584
+ "gym": "personal-trainer",
1585
+ "crossfit": "personal-trainer",
1586
+ "boot camp": "personal-trainer",
1587
+ // Yoga
1588
+ "yoga": "yoga-studio",
1589
+ "yoga studio": "yoga-studio",
1590
+ "yoga instructor": "yoga-studio",
1591
+ "pilates": "yoga-studio",
1592
+ "meditation": "yoga-studio",
1593
+ // Martial arts
1594
+ "martial arts": "martial-arts",
1595
+ "karate": "martial-arts",
1596
+ "taekwondo": "martial-arts",
1597
+ "jiu jitsu": "martial-arts",
1598
+ "bjj": "martial-arts",
1599
+ "mma": "martial-arts",
1600
+ "boxing": "martial-arts",
1601
+ "kickboxing": "martial-arts",
1602
+ "kung fu": "martial-arts",
1603
+ "judo": "martial-arts",
1604
+ "self defense": "martial-arts",
1605
+ // Chiropractor
1606
+ "chiropractor": "chiropractor",
1607
+ "chiropractic": "chiropractor",
1608
+ "spine": "chiropractor",
1609
+ "back pain": "chiropractor",
1610
+ // ==========================================================================
1611
+ // RETAIL
1612
+ // ==========================================================================
1613
+ // Craft seller
1614
+ "craft": "craft-seller",
1615
+ "crafts": "craft-seller",
1616
+ "handmade": "craft-seller",
1617
+ "artisan": "craft-seller",
1618
+ "etsy": "craft-seller",
1619
+ "handcraft": "craft-seller",
1620
+ "jewelry maker": "craft-seller",
1621
+ "candle": "craft-seller",
1622
+ "soap maker": "craft-seller",
1623
+ "pottery": "craft-seller",
1624
+ // Boutique
1625
+ "boutique": "boutique",
1626
+ "clothing store": "boutique",
1627
+ "fashion": "boutique",
1628
+ "apparel": "boutique",
1629
+ "women clothing": "boutique",
1630
+ "consignment": "boutique",
1631
+ "thrift": "boutique",
1632
+ "vintage": "boutique",
1633
+ // Florist
1634
+ "florist": "florist",
1635
+ "flower shop": "florist",
1636
+ "flowers": "florist",
1637
+ "floral": "florist",
1638
+ "floral design": "florist",
1639
+ // Gift shop
1640
+ "gift shop": "gift-shop",
1641
+ "gift store": "gift-shop",
1642
+ "gifts": "gift-shop",
1643
+ "souvenir": "gift-shop",
1644
+ "novelty": "gift-shop",
1645
+ // ==========================================================================
1646
+ // EDUCATION & CREATIVE
1647
+ // ==========================================================================
1648
+ // Tutoring
1649
+ "tutor": "tutoring",
1650
+ "tutoring": "tutoring",
1651
+ "tutoring service": "tutoring",
1652
+ "learning center": "tutoring",
1653
+ "test prep": "tutoring",
1654
+ "sat prep": "tutoring",
1655
+ "math tutor": "tutoring",
1656
+ "english tutor": "tutoring",
1657
+ "homework help": "tutoring",
1658
+ // Music lessons
1659
+ "music lessons": "music-lessons",
1660
+ "music teacher": "music-lessons",
1661
+ "music school": "music-lessons",
1662
+ "piano lessons": "music-lessons",
1663
+ "guitar lessons": "music-lessons",
1664
+ "voice lessons": "music-lessons",
1665
+ "singing lessons": "music-lessons",
1666
+ "drum lessons": "music-lessons",
1667
+ "violin lessons": "music-lessons",
1668
+ // Photography
1669
+ "photographer": "photography",
1670
+ "photography": "photography",
1671
+ "photo studio": "photography",
1672
+ "portrait": "photography",
1673
+ "wedding photographer": "photography",
1674
+ "headshot": "photography",
1675
+ // Videography
1676
+ "videographer": "videography",
1677
+ "videography": "videography",
1678
+ "video production": "videography",
1679
+ "video editor": "videography",
1680
+ "filmmaker": "videography",
1681
+ // Event planning
1682
+ "event planner": "event-planning",
1683
+ "event planning": "event-planning",
1684
+ "wedding planner": "event-planning",
1685
+ "party planner": "event-planning",
1686
+ "event coordinator": "event-planning",
1687
+ "event venue": "event-planning"
1688
+ };
1689
+ for (const keyword of lowerKeywords) {
1690
+ if (keywordMap[keyword]) {
1691
+ return keywordMap[keyword];
1692
+ }
1693
+ for (const [key, type] of Object.entries(keywordMap)) {
1694
+ if (keyword.includes(key) || key.includes(keyword)) {
1695
+ return type;
1696
+ }
1697
+ }
1698
+ }
1699
+ return "generic";
1700
+ }
1701
+
1702
+ // src/config/index.ts
1703
+ function createSiteConfig(businessType, overrides) {
1704
+ const preset = getPreset(businessType);
1705
+ const config = { ...preset.config };
1706
+ if (overrides) {
1707
+ if (overrides.theme) {
1708
+ config.theme = { ...config.theme, ...overrides.theme };
1709
+ }
1710
+ if (overrides.pages) {
1711
+ config.pages = { ...config.pages, ...overrides.pages };
1712
+ }
1713
+ if (overrides.seo) {
1714
+ config.seo = { ...config.seo, ...overrides.seo };
1715
+ }
1716
+ if (overrides.contactForm) {
1717
+ config.contactForm = { ...config.contactForm, ...overrides.contactForm };
1718
+ }
1719
+ if (overrides.features) {
1720
+ config.features = { ...config.features, ...overrides.features };
1721
+ }
1722
+ if (overrides.siteUrl) config.siteUrl = overrides.siteUrl;
1723
+ if (overrides.customClasses) {
1724
+ config.customClasses = { ...config.customClasses, ...overrides.customClasses };
1725
+ }
1726
+ }
1727
+ return config;
1728
+ }
1729
+ function getSheetTemplate(businessType) {
1730
+ const preset = getPreset(businessType);
1731
+ return preset.sheetTemplate;
1732
+ }
1733
+ function getDefaultData(businessType) {
1734
+ const preset = getPreset(businessType);
1735
+ return preset.defaults;
1736
+ }
1737
+ function getIconSuggestions(businessType) {
1738
+ const preset = getPreset(businessType);
1739
+ return preset.iconSuggestions;
1740
+ }
1741
+ function getImageSuggestions(businessType) {
1742
+ const preset = getPreset(businessType);
1743
+ return preset.imageSuggestions;
1744
+ }
1745
+ function validateSiteConfig(config) {
1746
+ const errors = [];
1747
+ if (!config.businessType) {
1748
+ errors.push("businessType is required");
1749
+ }
1750
+ if (!config.pages?.home) {
1751
+ errors.push("pages.home configuration is required");
1752
+ }
1753
+ if (!config.theme) {
1754
+ errors.push("theme configuration is required");
1755
+ }
1756
+ if (config.pages?.home?.sections) {
1757
+ const validSections = [
1758
+ "hero",
1759
+ "services",
1760
+ "menu",
1761
+ "products",
1762
+ "gallery",
1763
+ "testimonials",
1764
+ "team",
1765
+ "faq",
1766
+ "hours",
1767
+ "location",
1768
+ "contact-form",
1769
+ "cta",
1770
+ "how-it-works",
1771
+ "announcements",
1772
+ "about-preview"
1773
+ ];
1774
+ for (const section of config.pages.home.sections) {
1775
+ if (!validSections.includes(section)) {
1776
+ errors.push(`Invalid home section: ${section}`);
1777
+ }
1778
+ }
1779
+ }
1780
+ return {
1781
+ valid: errors.length === 0,
1782
+ errors
1783
+ };
1784
+ }
1785
+ var themePresets = [
1786
+ "warm-brown",
1787
+ "cool-blue",
1788
+ "earth-green",
1789
+ "warm-amber",
1790
+ "elegant-gold",
1791
+ "fresh-teal",
1792
+ "bold-red",
1793
+ "soft-pink",
1794
+ "slate-gray",
1795
+ "forest-green"
1796
+ ];
1797
+ function getThemeDescription(preset) {
1798
+ const descriptions = {
1799
+ "warm-brown": "Warm, earthy tones perfect for tailoring, leather goods, and traditional crafts",
1800
+ "cool-blue": "Professional and trustworthy, ideal for professional services and tech",
1801
+ "earth-green": "Natural and organic, great for eco-friendly, outdoor, and health businesses",
1802
+ "warm-amber": "Welcoming and appetizing, perfect for food, hospitality, and home businesses",
1803
+ "elegant-gold": "Luxurious and sophisticated, suited for upscale and formal businesses",
1804
+ "fresh-teal": "Modern and creative, ideal for spas, creative studios, and wellness",
1805
+ "bold-red": "Energetic and urgent, great for automotive, sports, and action-oriented businesses",
1806
+ "soft-pink": "Gentle and feminine, perfect for beauty, weddings, and delicate services",
1807
+ "slate-gray": "Minimalist and industrial, suited for modern, urban businesses",
1808
+ "forest-green": "Deep and natural, ideal for outdoor, nature, and sustainability-focused businesses"
1809
+ };
1810
+ return descriptions[preset];
1811
+ }
1812
+ function recommendTheme(businessType) {
1813
+ const preset = getPreset(businessType);
1814
+ return preset.config.theme.preset || "cool-blue";
1815
+ }
1816
+ // Annotate the CommonJS export names for ESM import in node:
1817
+ 0 && (module.exports = {
1818
+ businessCategories,
1819
+ createSiteConfig,
1820
+ genericPreset,
1821
+ getDefaultData,
1822
+ getIconSuggestions,
1823
+ getImageSuggestions,
1824
+ getPreset,
1825
+ getSheetTemplate,
1826
+ getSupportedBusinessTypes,
1827
+ getThemeDescription,
1828
+ homeKitchenPreset,
1829
+ presets,
1830
+ professionalPreset,
1831
+ recommendBusinessType,
1832
+ recommendTheme,
1833
+ repairPreset,
1834
+ restaurantPreset,
1835
+ salonPreset,
1836
+ tailorPreset,
1837
+ themePresets,
1838
+ validateSiteConfig
1839
+ });
1840
+ //# sourceMappingURL=index.js.map