@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,1696 @@
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/components/index.ts
21
+ var components_exports = {};
22
+ __export(components_exports, {
23
+ BriefcaseIcon: () => BriefcaseIcon,
24
+ Button: () => Button,
25
+ ButtonLink: () => ButtonLink,
26
+ CakeIcon: () => CakeIcon,
27
+ Card: () => Card,
28
+ CardBody: () => CardBody,
29
+ CardFooter: () => CardFooter,
30
+ CardHeader: () => CardHeader,
31
+ CardImage: () => CardImage,
32
+ CheckIcon: () => CheckIcon,
33
+ ChevronDownIcon: () => ChevronDownIcon,
34
+ ChevronRightIcon: () => ChevronRightIcon,
35
+ ClockIcon: () => ClockIcon,
36
+ FAQ: () => FAQ,
37
+ FacebookIcon: () => FacebookIcon,
38
+ Footer: () => Footer,
39
+ Gallery: () => Gallery,
40
+ Header: () => Header,
41
+ HeartIcon: () => HeartIcon,
42
+ Hero: () => Hero,
43
+ Hours: () => Hours,
44
+ Icon: () => Icon,
45
+ InstagramIcon: () => InstagramIcon,
46
+ MailIcon: () => MailIcon,
47
+ MapPinIcon: () => MapPinIcon,
48
+ MenuIcon: () => MenuIcon,
49
+ PhoneIcon: () => PhoneIcon,
50
+ ScissorsIcon: () => ScissorsIcon,
51
+ Services: () => Services,
52
+ SparklesIcon: () => SparklesIcon,
53
+ StarIcon: () => StarIcon,
54
+ Testimonials: () => Testimonials,
55
+ UtensilsIcon: () => UtensilsIcon,
56
+ WrenchIcon: () => WrenchIcon,
57
+ XIcon: () => XIcon,
58
+ YelpIcon: () => YelpIcon,
59
+ getIcon: () => getIcon,
60
+ getTodayHours: () => getTodayHours,
61
+ iconMap: () => iconMap,
62
+ isCurrentlyOpen: () => isCurrentlyOpen
63
+ });
64
+ module.exports = __toCommonJS(components_exports);
65
+
66
+ // src/components/layout/Header.tsx
67
+ var import_react = require("react");
68
+
69
+ // src/components/ui/Icons.tsx
70
+ var import_jsx_runtime = require("react/jsx-runtime");
71
+ function PhoneIcon({ className = "", size = 24, ...props }) {
72
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
73
+ "svg",
74
+ {
75
+ xmlns: "http://www.w3.org/2000/svg",
76
+ width: size,
77
+ height: size,
78
+ viewBox: "0 0 24 24",
79
+ fill: "none",
80
+ stroke: "currentColor",
81
+ strokeWidth: "2",
82
+ strokeLinecap: "round",
83
+ strokeLinejoin: "round",
84
+ className,
85
+ ...props,
86
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("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" })
87
+ }
88
+ );
89
+ }
90
+ function MailIcon({ className = "", size = 24, ...props }) {
91
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
92
+ "svg",
93
+ {
94
+ xmlns: "http://www.w3.org/2000/svg",
95
+ width: size,
96
+ height: size,
97
+ viewBox: "0 0 24 24",
98
+ fill: "none",
99
+ stroke: "currentColor",
100
+ strokeWidth: "2",
101
+ strokeLinecap: "round",
102
+ strokeLinejoin: "round",
103
+ className,
104
+ ...props,
105
+ children: [
106
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { width: "20", height: "16", x: "2", y: "4", rx: "2" }),
107
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" })
108
+ ]
109
+ }
110
+ );
111
+ }
112
+ function MapPinIcon({ className = "", size = 24, ...props }) {
113
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
114
+ "svg",
115
+ {
116
+ xmlns: "http://www.w3.org/2000/svg",
117
+ width: size,
118
+ height: size,
119
+ viewBox: "0 0 24 24",
120
+ fill: "none",
121
+ stroke: "currentColor",
122
+ strokeWidth: "2",
123
+ strokeLinecap: "round",
124
+ strokeLinejoin: "round",
125
+ className,
126
+ ...props,
127
+ children: [
128
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z" }),
129
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "10", r: "3" })
130
+ ]
131
+ }
132
+ );
133
+ }
134
+ function ClockIcon({ className = "", size = 24, ...props }) {
135
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
136
+ "svg",
137
+ {
138
+ xmlns: "http://www.w3.org/2000/svg",
139
+ width: size,
140
+ height: size,
141
+ viewBox: "0 0 24 24",
142
+ fill: "none",
143
+ stroke: "currentColor",
144
+ strokeWidth: "2",
145
+ strokeLinecap: "round",
146
+ strokeLinejoin: "round",
147
+ className,
148
+ ...props,
149
+ children: [
150
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
151
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("polyline", { points: "12 6 12 12 16 14" })
152
+ ]
153
+ }
154
+ );
155
+ }
156
+ function StarIcon({ className = "", size = 24, filled = false, ...props }) {
157
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
158
+ "svg",
159
+ {
160
+ xmlns: "http://www.w3.org/2000/svg",
161
+ width: size,
162
+ height: size,
163
+ viewBox: "0 0 24 24",
164
+ fill: filled ? "currentColor" : "none",
165
+ stroke: "currentColor",
166
+ strokeWidth: "2",
167
+ strokeLinecap: "round",
168
+ strokeLinejoin: "round",
169
+ className,
170
+ ...props,
171
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("polygon", { points: "12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" })
172
+ }
173
+ );
174
+ }
175
+ function ChevronDownIcon({ className = "", size = 24, ...props }) {
176
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
177
+ "svg",
178
+ {
179
+ xmlns: "http://www.w3.org/2000/svg",
180
+ width: size,
181
+ height: size,
182
+ viewBox: "0 0 24 24",
183
+ fill: "none",
184
+ stroke: "currentColor",
185
+ strokeWidth: "2",
186
+ strokeLinecap: "round",
187
+ strokeLinejoin: "round",
188
+ className,
189
+ ...props,
190
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m6 9 6 6 6-6" })
191
+ }
192
+ );
193
+ }
194
+ function ChevronRightIcon({ className = "", size = 24, ...props }) {
195
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
196
+ "svg",
197
+ {
198
+ xmlns: "http://www.w3.org/2000/svg",
199
+ width: size,
200
+ height: size,
201
+ viewBox: "0 0 24 24",
202
+ fill: "none",
203
+ stroke: "currentColor",
204
+ strokeWidth: "2",
205
+ strokeLinecap: "round",
206
+ strokeLinejoin: "round",
207
+ className,
208
+ ...props,
209
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m9 18 6-6-6-6" })
210
+ }
211
+ );
212
+ }
213
+ function MenuIcon({ className = "", size = 24, ...props }) {
214
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
215
+ "svg",
216
+ {
217
+ xmlns: "http://www.w3.org/2000/svg",
218
+ width: size,
219
+ height: size,
220
+ viewBox: "0 0 24 24",
221
+ fill: "none",
222
+ stroke: "currentColor",
223
+ strokeWidth: "2",
224
+ strokeLinecap: "round",
225
+ strokeLinejoin: "round",
226
+ className,
227
+ ...props,
228
+ children: [
229
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "4", x2: "20", y1: "12", y2: "12" }),
230
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "4", x2: "20", y1: "6", y2: "6" }),
231
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "4", x2: "20", y1: "18", y2: "18" })
232
+ ]
233
+ }
234
+ );
235
+ }
236
+ function XIcon({ className = "", size = 24, ...props }) {
237
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
238
+ "svg",
239
+ {
240
+ xmlns: "http://www.w3.org/2000/svg",
241
+ width: size,
242
+ height: size,
243
+ viewBox: "0 0 24 24",
244
+ fill: "none",
245
+ stroke: "currentColor",
246
+ strokeWidth: "2",
247
+ strokeLinecap: "round",
248
+ strokeLinejoin: "round",
249
+ className,
250
+ ...props,
251
+ children: [
252
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18 6 6 18" }),
253
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m6 6 12 12" })
254
+ ]
255
+ }
256
+ );
257
+ }
258
+ function CheckIcon({ className = "", size = 24, ...props }) {
259
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
260
+ "svg",
261
+ {
262
+ xmlns: "http://www.w3.org/2000/svg",
263
+ width: size,
264
+ height: size,
265
+ viewBox: "0 0 24 24",
266
+ fill: "none",
267
+ stroke: "currentColor",
268
+ strokeWidth: "2",
269
+ strokeLinecap: "round",
270
+ strokeLinejoin: "round",
271
+ className,
272
+ ...props,
273
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M20 6 9 17l-5-5" })
274
+ }
275
+ );
276
+ }
277
+ function ScissorsIcon({ className = "", size = 24, ...props }) {
278
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
279
+ "svg",
280
+ {
281
+ xmlns: "http://www.w3.org/2000/svg",
282
+ width: size,
283
+ height: size,
284
+ viewBox: "0 0 24 24",
285
+ fill: "none",
286
+ stroke: "currentColor",
287
+ strokeWidth: "2",
288
+ strokeLinecap: "round",
289
+ strokeLinejoin: "round",
290
+ className,
291
+ ...props,
292
+ children: [
293
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "6", cy: "6", r: "3" }),
294
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M8.12 8.12 12 12" }),
295
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M20 4 8.12 15.88" }),
296
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "6", cy: "18", r: "3" }),
297
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M14.8 14.8 20 20" })
298
+ ]
299
+ }
300
+ );
301
+ }
302
+ function WrenchIcon({ className = "", size = 24, ...props }) {
303
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
304
+ "svg",
305
+ {
306
+ xmlns: "http://www.w3.org/2000/svg",
307
+ width: size,
308
+ height: size,
309
+ viewBox: "0 0 24 24",
310
+ fill: "none",
311
+ stroke: "currentColor",
312
+ strokeWidth: "2",
313
+ strokeLinecap: "round",
314
+ strokeLinejoin: "round",
315
+ className,
316
+ ...props,
317
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z" })
318
+ }
319
+ );
320
+ }
321
+ function SparklesIcon({ className = "", size = 24, ...props }) {
322
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
323
+ "svg",
324
+ {
325
+ xmlns: "http://www.w3.org/2000/svg",
326
+ width: size,
327
+ height: size,
328
+ viewBox: "0 0 24 24",
329
+ fill: "none",
330
+ stroke: "currentColor",
331
+ strokeWidth: "2",
332
+ strokeLinecap: "round",
333
+ strokeLinejoin: "round",
334
+ className,
335
+ ...props,
336
+ children: [
337
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z" }),
338
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M5 3v4" }),
339
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M19 17v4" }),
340
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3 5h4" }),
341
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M17 19h4" })
342
+ ]
343
+ }
344
+ );
345
+ }
346
+ function HeartIcon({ className = "", size = 24, filled = false, ...props }) {
347
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
348
+ "svg",
349
+ {
350
+ xmlns: "http://www.w3.org/2000/svg",
351
+ width: size,
352
+ height: size,
353
+ viewBox: "0 0 24 24",
354
+ fill: filled ? "currentColor" : "none",
355
+ stroke: "currentColor",
356
+ strokeWidth: "2",
357
+ strokeLinecap: "round",
358
+ strokeLinejoin: "round",
359
+ className,
360
+ ...props,
361
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z" })
362
+ }
363
+ );
364
+ }
365
+ function UtensilsIcon({ className = "", size = 24, ...props }) {
366
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
367
+ "svg",
368
+ {
369
+ xmlns: "http://www.w3.org/2000/svg",
370
+ width: size,
371
+ height: size,
372
+ viewBox: "0 0 24 24",
373
+ fill: "none",
374
+ stroke: "currentColor",
375
+ strokeWidth: "2",
376
+ strokeLinecap: "round",
377
+ strokeLinejoin: "round",
378
+ className,
379
+ ...props,
380
+ children: [
381
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3 2v7c0 1.1.9 2 2 2h4a2 2 0 0 0 2-2V2" }),
382
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M7 2v20" }),
383
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M21 15V2v0a5 5 0 0 0-5 5v6c0 1.1.9 2 2 2h3Zm0 0v7" })
384
+ ]
385
+ }
386
+ );
387
+ }
388
+ function CakeIcon({ className = "", size = 24, ...props }) {
389
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
390
+ "svg",
391
+ {
392
+ xmlns: "http://www.w3.org/2000/svg",
393
+ width: size,
394
+ height: size,
395
+ viewBox: "0 0 24 24",
396
+ fill: "none",
397
+ stroke: "currentColor",
398
+ strokeWidth: "2",
399
+ strokeLinecap: "round",
400
+ strokeLinejoin: "round",
401
+ className,
402
+ ...props,
403
+ children: [
404
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M20 21v-8a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8" }),
405
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M4 16s.5-1 2-1 2.5 2 4 2 2.5-2 4-2 2.5 2 4 2 2-1 2-1" }),
406
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M2 21h20" }),
407
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M7 8v3" }),
408
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 8v3" }),
409
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M17 8v3" }),
410
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M7 4h.01" }),
411
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 4h.01" }),
412
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M17 4h.01" })
413
+ ]
414
+ }
415
+ );
416
+ }
417
+ function BriefcaseIcon({ className = "", size = 24, ...props }) {
418
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
419
+ "svg",
420
+ {
421
+ xmlns: "http://www.w3.org/2000/svg",
422
+ width: size,
423
+ height: size,
424
+ viewBox: "0 0 24 24",
425
+ fill: "none",
426
+ stroke: "currentColor",
427
+ strokeWidth: "2",
428
+ strokeLinecap: "round",
429
+ strokeLinejoin: "round",
430
+ className,
431
+ ...props,
432
+ children: [
433
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { width: "20", height: "14", x: "2", y: "7", rx: "2", ry: "2" }),
434
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16" })
435
+ ]
436
+ }
437
+ );
438
+ }
439
+ function YelpIcon({ className = "", size = 24, ...props }) {
440
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
441
+ "svg",
442
+ {
443
+ xmlns: "http://www.w3.org/2000/svg",
444
+ width: size,
445
+ height: size,
446
+ viewBox: "0 0 24 24",
447
+ fill: "currentColor",
448
+ className,
449
+ ...props,
450
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M20.16 12.73l-3.29 1.47c-.64.28-1.31-.26-1.2-.97l.52-3.4c.08-.56.49-.98 1.03-1.04l3.39-.38c.7-.08 1.22.58 1 1.23l-1.07 2.62c-.14.35-.36.41-.38.47zM14.13 15.58l-.52 3.4c-.11.7.55 1.25 1.2.97l3.29-1.47c.02-.06.24-.12.38-.47l1.07-2.62c.22-.65-.3-1.31-1-1.23l-3.39.38c-.54.06-.95.48-1.03 1.04zM10.98 3.05c-.47-.6-1.37-.5-1.7.2l-3.6 7.51c-.24.5-.01 1.1.51 1.33l2.63 1.21c.62.28 1.3-.2 1.27-.89l-.33-7.97c-.02-.56-.3-1.01-.78-1.39zM8.37 14.35l-2.63-1.21c-.52-.23-.75-.83-.51-1.33l3.6-7.51c.33-.7 1.23-.8 1.7-.2.48.38.76.83.78 1.39l.33 7.97c.03.69-.65 1.17-1.27.89zM10.04 16.42l-3.22 1.8c-.62.35-1.36-.14-1.28-.86l.44-3.52c.06-.53.42-.95.92-1.08l3.02-.78c.69-.18 1.32.43 1.09 1.1l-1.24 3.06c-.14.33-.38.34-.42.34-.04 0-.18-.01-.31.04v-.1z" })
451
+ }
452
+ );
453
+ }
454
+ function InstagramIcon({ className = "", size = 24, ...props }) {
455
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
456
+ "svg",
457
+ {
458
+ xmlns: "http://www.w3.org/2000/svg",
459
+ width: size,
460
+ height: size,
461
+ viewBox: "0 0 24 24",
462
+ fill: "none",
463
+ stroke: "currentColor",
464
+ strokeWidth: "2",
465
+ strokeLinecap: "round",
466
+ strokeLinejoin: "round",
467
+ className,
468
+ ...props,
469
+ children: [
470
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { width: "20", height: "20", x: "2", y: "2", rx: "5", ry: "5" }),
471
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" }),
472
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "17.5", x2: "17.51", y1: "6.5", y2: "6.5" })
473
+ ]
474
+ }
475
+ );
476
+ }
477
+ function FacebookIcon({ className = "", size = 24, ...props }) {
478
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
479
+ "svg",
480
+ {
481
+ xmlns: "http://www.w3.org/2000/svg",
482
+ width: size,
483
+ height: size,
484
+ viewBox: "0 0 24 24",
485
+ fill: "none",
486
+ stroke: "currentColor",
487
+ strokeWidth: "2",
488
+ strokeLinecap: "round",
489
+ strokeLinejoin: "round",
490
+ className,
491
+ ...props,
492
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z" })
493
+ }
494
+ );
495
+ }
496
+ var iconMap = {
497
+ phone: PhoneIcon,
498
+ mail: MailIcon,
499
+ email: MailIcon,
500
+ "map-pin": MapPinIcon,
501
+ location: MapPinIcon,
502
+ clock: ClockIcon,
503
+ time: ClockIcon,
504
+ star: StarIcon,
505
+ "chevron-down": ChevronDownIcon,
506
+ "chevron-right": ChevronRightIcon,
507
+ menu: MenuIcon,
508
+ x: XIcon,
509
+ close: XIcon,
510
+ check: CheckIcon,
511
+ scissors: ScissorsIcon,
512
+ wrench: WrenchIcon,
513
+ tool: WrenchIcon,
514
+ sparkles: SparklesIcon,
515
+ heart: HeartIcon,
516
+ utensils: UtensilsIcon,
517
+ food: UtensilsIcon,
518
+ cake: CakeIcon,
519
+ briefcase: BriefcaseIcon,
520
+ yelp: YelpIcon,
521
+ instagram: InstagramIcon,
522
+ facebook: FacebookIcon
523
+ };
524
+ function getIcon(name) {
525
+ return iconMap[name.toLowerCase()] || null;
526
+ }
527
+ function Icon({ name, ...props }) {
528
+ const IconComponent = getIcon(name);
529
+ if (!IconComponent) return null;
530
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(IconComponent, { ...props });
531
+ }
532
+
533
+ // src/components/layout/Header.tsx
534
+ var import_jsx_runtime2 = require("react/jsx-runtime");
535
+ var defaultNavigation = [
536
+ { label: "Home", href: "/" },
537
+ { label: "Services", href: "/services" },
538
+ { label: "Gallery", href: "/gallery" },
539
+ { label: "About", href: "/about" },
540
+ { label: "Contact", href: "/contact" }
541
+ ];
542
+ function Header({
543
+ business,
544
+ navigation = defaultNavigation,
545
+ sticky = true,
546
+ transparent = false,
547
+ showPhone = true,
548
+ className = ""
549
+ }) {
550
+ const [mobileMenuOpen, setMobileMenuOpen] = (0, import_react.useState)(false);
551
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
552
+ "header",
553
+ {
554
+ className: `
555
+ ${sticky ? "sticky top-0 z-50" : ""}
556
+ ${transparent ? "bg-transparent" : "bg-white shadow-sm"}
557
+ ${className}
558
+ `,
559
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("nav", { className: "container mx-auto px-4", children: [
560
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between h-16", children: [
561
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("a", { href: "/", className: "flex items-center", children: business.logoUrl ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
562
+ "img",
563
+ {
564
+ src: business.logoUrl,
565
+ alt: business.name,
566
+ className: "h-10 w-auto"
567
+ }
568
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xl font-bold text-gray-900", children: business.name }) }),
569
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "hidden md:flex items-center space-x-8", children: [
570
+ navigation.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
571
+ "a",
572
+ {
573
+ href: item.href,
574
+ className: "text-gray-600 hover:text-primary-600 font-medium transition-colors",
575
+ children: item.label
576
+ },
577
+ item.href
578
+ )),
579
+ showPhone && business.phone && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
580
+ "a",
581
+ {
582
+ href: `tel:${business.phone.replace(/\D/g, "")}`,
583
+ className: "inline-flex items-center px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors",
584
+ children: [
585
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PhoneIcon, { size: 18, className: "mr-2" }),
586
+ business.phone
587
+ ]
588
+ }
589
+ )
590
+ ] }),
591
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
592
+ "button",
593
+ {
594
+ className: "md:hidden p-2 rounded-lg hover:bg-gray-100",
595
+ onClick: () => setMobileMenuOpen(!mobileMenuOpen),
596
+ "aria-label": mobileMenuOpen ? "Close menu" : "Open menu",
597
+ children: mobileMenuOpen ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(XIcon, { size: 24 }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MenuIcon, { size: 24 })
598
+ }
599
+ )
600
+ ] }),
601
+ mobileMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "md:hidden py-4 border-t", children: [
602
+ navigation.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
603
+ "a",
604
+ {
605
+ href: item.href,
606
+ className: "block py-2 text-gray-600 hover:text-primary-600 font-medium",
607
+ onClick: () => setMobileMenuOpen(false),
608
+ children: item.label
609
+ },
610
+ item.href
611
+ )),
612
+ showPhone && business.phone && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
613
+ "a",
614
+ {
615
+ href: `tel:${business.phone.replace(/\D/g, "")}`,
616
+ className: "flex items-center py-2 text-primary-600 font-medium",
617
+ children: [
618
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PhoneIcon, { size: 18, className: "mr-2" }),
619
+ business.phone
620
+ ]
621
+ }
622
+ )
623
+ ] })
624
+ ] })
625
+ }
626
+ );
627
+ }
628
+
629
+ // src/components/layout/Footer.tsx
630
+ var import_jsx_runtime3 = require("react/jsx-runtime");
631
+ var defaultQuickLinks = [
632
+ { label: "Home", href: "/" },
633
+ { label: "Services", href: "/services" },
634
+ { label: "About", href: "/about" },
635
+ { label: "Contact", href: "/contact" },
636
+ { label: "Privacy Policy", href: "/privacy" }
637
+ ];
638
+ var dayNames = {
639
+ monday: "Mon",
640
+ tuesday: "Tue",
641
+ wednesday: "Wed",
642
+ thursday: "Thu",
643
+ friday: "Fri",
644
+ saturday: "Sat",
645
+ sunday: "Sun"
646
+ };
647
+ function Footer({
648
+ business,
649
+ hours = [],
650
+ quickLinks = defaultQuickLinks,
651
+ showHours = true,
652
+ showSocial = true,
653
+ variant = "columns",
654
+ className = ""
655
+ }) {
656
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
657
+ const socialLinks = [
658
+ { url: business.socialYelp, icon: YelpIcon, label: "Yelp" },
659
+ { url: business.socialInstagram, icon: InstagramIcon, label: "Instagram" },
660
+ { url: business.socialFacebook, icon: FacebookIcon, label: "Facebook" }
661
+ ].filter((link) => link.url);
662
+ if (variant === "simple") {
663
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("footer", { className: `bg-gray-900 text-white py-8 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "container mx-auto px-4 text-center", children: [
664
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "text-lg font-semibold mb-2", children: business.name }),
665
+ business.phone && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "text-gray-400", children: business.phone }),
666
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: "text-gray-500 text-sm mt-4", children: [
667
+ "\xA9 ",
668
+ currentYear,
669
+ " ",
670
+ business.name,
671
+ ". All rights reserved."
672
+ ] })
673
+ ] }) });
674
+ }
675
+ if (variant === "centered") {
676
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("footer", { className: `bg-gray-900 text-white py-12 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "container mx-auto px-4 text-center", children: [
677
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "text-2xl font-bold mb-4", children: business.name }),
678
+ business.tagline && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "text-gray-400 mb-6", children: business.tagline }),
679
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex flex-wrap justify-center gap-6 mb-8", children: quickLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
680
+ "a",
681
+ {
682
+ href: link.href,
683
+ className: "text-gray-400 hover:text-white transition-colors",
684
+ children: link.label
685
+ },
686
+ link.href
687
+ )) }),
688
+ showSocial && socialLinks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex justify-center gap-4 mb-8", children: socialLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
689
+ "a",
690
+ {
691
+ href: link.url,
692
+ target: "_blank",
693
+ rel: "noopener noreferrer",
694
+ className: "p-2 bg-gray-800 rounded-full hover:bg-gray-700 transition-colors",
695
+ "aria-label": link.label,
696
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(link.icon, { size: 20 })
697
+ },
698
+ link.label
699
+ )) }),
700
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: "text-gray-500 text-sm", children: [
701
+ "\xA9 ",
702
+ currentYear,
703
+ " ",
704
+ business.name,
705
+ ". All rights reserved."
706
+ ] })
707
+ ] }) });
708
+ }
709
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("footer", { className: `bg-gray-900 text-white py-12 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "container mx-auto px-4", children: [
710
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "grid md:grid-cols-3 gap-8", children: [
711
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
712
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h3", { className: "text-xl font-bold mb-4", children: business.name }),
713
+ business.addressLine1 && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-start text-gray-400 mb-3", children: [
714
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(MapPinIcon, { size: 18, className: "mr-2 mt-1 flex-shrink-0" }),
715
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
716
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { children: business.addressLine1 }),
717
+ business.addressLine2 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { children: business.addressLine2 }),
718
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { children: [
719
+ business.city,
720
+ ", ",
721
+ business.state,
722
+ " ",
723
+ business.zip
724
+ ] })
725
+ ] })
726
+ ] }),
727
+ business.phone && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
728
+ "a",
729
+ {
730
+ href: `tel:${business.phone.replace(/\D/g, "")}`,
731
+ className: "flex items-center text-gray-400 hover:text-white mb-3",
732
+ children: [
733
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(PhoneIcon, { size: 18, className: "mr-2" }),
734
+ business.phone
735
+ ]
736
+ }
737
+ ),
738
+ business.email && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
739
+ "a",
740
+ {
741
+ href: `mailto:${business.email}`,
742
+ className: "flex items-center text-gray-400 hover:text-white",
743
+ children: [
744
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(MailIcon, { size: 18, className: "mr-2" }),
745
+ business.email
746
+ ]
747
+ }
748
+ )
749
+ ] }),
750
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
751
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h3", { className: "text-lg font-semibold mb-4", children: "Quick Links" }),
752
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("ul", { className: "space-y-2", children: quickLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
753
+ "a",
754
+ {
755
+ href: link.href,
756
+ className: "text-gray-400 hover:text-white transition-colors",
757
+ children: link.label
758
+ }
759
+ ) }, link.href)) }),
760
+ showSocial && socialLinks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex gap-3 mt-6", children: socialLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
761
+ "a",
762
+ {
763
+ href: link.url,
764
+ target: "_blank",
765
+ rel: "noopener noreferrer",
766
+ className: "p-2 bg-gray-800 rounded-full hover:bg-gray-700 transition-colors",
767
+ "aria-label": link.label,
768
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(link.icon, { size: 20 })
769
+ },
770
+ link.label
771
+ )) })
772
+ ] }),
773
+ showHours && hours.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
774
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("h3", { className: "text-lg font-semibold mb-4 flex items-center", children: [
775
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ClockIcon, { size: 18, className: "mr-2" }),
776
+ "Hours"
777
+ ] }),
778
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("ul", { className: "space-y-1 text-gray-400", children: hours.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("li", { className: "flex justify-between", children: [
779
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: dayNames[entry.day] }),
780
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: entry.closed ? "Closed" : `${entry.open} - ${entry.close}` })
781
+ ] }, entry.day)) })
782
+ ] })
783
+ ] }),
784
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "mt-12 pt-8 border-t border-gray-800 text-center text-gray-500 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { children: [
785
+ "\xA9 ",
786
+ currentYear,
787
+ " ",
788
+ business.name,
789
+ ". All rights reserved."
790
+ ] }) })
791
+ ] }) });
792
+ }
793
+
794
+ // src/components/sections/Hero.tsx
795
+ var import_jsx_runtime4 = require("react/jsx-runtime");
796
+ function Hero({
797
+ business,
798
+ variant = "centered",
799
+ showOpenStatus = true,
800
+ isOpen,
801
+ todayHours,
802
+ backgroundImage,
803
+ overlay = true,
804
+ className = ""
805
+ }) {
806
+ const bgStyle = backgroundImage ? { backgroundImage: `url(${backgroundImage})` } : void 0;
807
+ const handleCallClick = () => {
808
+ if (business.phone) {
809
+ window.location.href = `tel:${business.phone.replace(/\D/g, "")}`;
810
+ }
811
+ };
812
+ const handleDirectionsClick = () => {
813
+ if (business.googleMapsUrl) {
814
+ window.open(business.googleMapsUrl, "_blank");
815
+ } else {
816
+ const address = [
817
+ business.addressLine1,
818
+ business.city,
819
+ business.state,
820
+ business.zip
821
+ ].filter(Boolean).join(", ");
822
+ window.open(`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(address)}`, "_blank");
823
+ }
824
+ };
825
+ const handlePrimaryClick = () => {
826
+ if (business.primaryCtaUrl) {
827
+ if (business.primaryCtaUrl.startsWith("http")) {
828
+ window.open(business.primaryCtaUrl, "_blank");
829
+ } else if (business.primaryCtaUrl.startsWith("mailto:")) {
830
+ window.location.href = business.primaryCtaUrl;
831
+ } else {
832
+ window.location.href = business.primaryCtaUrl;
833
+ }
834
+ } else if (business.bookingUrl) {
835
+ window.open(business.bookingUrl, "_blank");
836
+ } else if (business.email) {
837
+ window.location.href = `mailto:${business.email}`;
838
+ }
839
+ };
840
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
841
+ "section",
842
+ {
843
+ className: `
844
+ relative min-h-[500px] flex items-center
845
+ ${backgroundImage ? "bg-cover bg-center" : "bg-gradient-to-br from-primary-600 to-primary-800"}
846
+ ${className}
847
+ `,
848
+ style: bgStyle,
849
+ children: [
850
+ overlay && backgroundImage && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "absolute inset-0 bg-black/50" }),
851
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "relative z-10 container mx-auto px-4 py-16", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
852
+ "div",
853
+ {
854
+ className: `
855
+ ${variant === "centered" ? "text-center max-w-3xl mx-auto" : ""}
856
+ ${variant === "left" ? "max-w-2xl" : ""}
857
+ ${variant === "split" ? "grid md:grid-cols-2 gap-8 items-center" : ""}
858
+ `,
859
+ children: [
860
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
861
+ showOpenStatus && isOpen !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mb-4", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
862
+ "span",
863
+ {
864
+ className: `
865
+ inline-flex items-center px-3 py-1 rounded-full text-sm font-medium
866
+ ${isOpen ? "bg-green-100 text-green-800" : "bg-red-100 text-red-800"}
867
+ `,
868
+ children: [
869
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
870
+ "span",
871
+ {
872
+ className: `w-2 h-2 rounded-full mr-2 ${isOpen ? "bg-green-500" : "bg-red-500"}`
873
+ }
874
+ ),
875
+ isOpen ? "Open Now" : "Closed",
876
+ todayHours && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "ml-2 opacity-75", children: [
877
+ "\xB7 ",
878
+ todayHours
879
+ ] })
880
+ ]
881
+ }
882
+ ) }),
883
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h1", { className: "text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-4", children: business.name }),
884
+ business.tagline && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-xl md:text-2xl text-white/90 mb-6", children: business.tagline }),
885
+ business.aboutShort && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-lg text-white/80 mb-8 max-w-xl", children: business.aboutShort }),
886
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex flex-wrap justify-center gap-4 mb-8", children: ["Quality Work", "Fair Prices", "Fast Service"].map((signal) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex items-center text-white/90", children: [
887
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { className: "w-5 h-5 text-accent-400 mr-2", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
888
+ "path",
889
+ {
890
+ fillRule: "evenodd",
891
+ d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",
892
+ clipRule: "evenodd"
893
+ }
894
+ ) }),
895
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-sm font-medium", children: signal })
896
+ ] }, signal)) }),
897
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex flex-col sm:flex-row gap-4 justify-center", children: [
898
+ business.phone && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
899
+ "button",
900
+ {
901
+ onClick: handleCallClick,
902
+ className: "inline-flex items-center justify-center px-6 py-3 bg-white text-primary-700 font-semibold rounded-lg hover:bg-gray-100 transition-colors",
903
+ children: [
904
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PhoneIcon, { size: 20, className: "mr-2" }),
905
+ "Call Now"
906
+ ]
907
+ }
908
+ ),
909
+ (business.addressLine1 || business.googleMapsUrl) && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
910
+ "button",
911
+ {
912
+ onClick: handleDirectionsClick,
913
+ className: "inline-flex items-center justify-center px-6 py-3 border-2 border-white text-white font-semibold rounded-lg hover:bg-white/10 transition-colors",
914
+ children: [
915
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MapPinIcon, { size: 20, className: "mr-2" }),
916
+ "Get Directions"
917
+ ]
918
+ }
919
+ ),
920
+ (business.primaryCtaUrl || business.bookingUrl || business.email) && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
921
+ "button",
922
+ {
923
+ onClick: handlePrimaryClick,
924
+ className: "inline-flex items-center justify-center px-6 py-3 bg-accent-500 text-white font-semibold rounded-lg hover:bg-accent-600 transition-colors",
925
+ children: business.primaryCtaText || "Contact Us"
926
+ }
927
+ )
928
+ ] })
929
+ ] }),
930
+ variant === "split" && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "hidden md:block" })
931
+ ]
932
+ }
933
+ ) })
934
+ ]
935
+ }
936
+ );
937
+ }
938
+
939
+ // src/components/sections/Services.tsx
940
+ var import_jsx_runtime5 = require("react/jsx-runtime");
941
+ function Services({
942
+ services,
943
+ title = "Our Services",
944
+ subtitle,
945
+ columns = 3,
946
+ showPrices = true,
947
+ showIcons = true,
948
+ variant = "cards",
949
+ limit,
950
+ className = ""
951
+ }) {
952
+ const displayedServices = limit ? services.slice(0, limit) : services;
953
+ const gridCols = {
954
+ 2: "md:grid-cols-2",
955
+ 3: "md:grid-cols-2 lg:grid-cols-3",
956
+ 4: "md:grid-cols-2 lg:grid-cols-4"
957
+ };
958
+ if (variant === "list") {
959
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
960
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
961
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "max-w-3xl mx-auto divide-y divide-gray-200", children: displayedServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
962
+ ServiceListItem,
963
+ {
964
+ service,
965
+ showPrice: showPrices,
966
+ showIcon: showIcons
967
+ },
968
+ service.id || service.title
969
+ )) })
970
+ ] }) });
971
+ }
972
+ if (variant === "minimal") {
973
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
974
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
975
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
976
+ ServiceMinimalCard,
977
+ {
978
+ service,
979
+ showPrice: showPrices
980
+ },
981
+ service.id || service.title
982
+ )) })
983
+ ] }) });
984
+ }
985
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { className: `py-16 bg-gray-50 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "container mx-auto px-4", children: [
986
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeader, { title, subtitle }),
987
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedServices.map((service) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
988
+ ServiceCard,
989
+ {
990
+ service,
991
+ showPrice: showPrices,
992
+ showIcon: showIcons
993
+ },
994
+ service.id || service.title
995
+ )) })
996
+ ] }) });
997
+ }
998
+ function SectionHeader({ title, subtitle }) {
999
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "text-center mb-12", children: [
1000
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
1001
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
1002
+ ] });
1003
+ }
1004
+ function ServiceCard({
1005
+ service,
1006
+ showPrice,
1007
+ showIcon
1008
+ }) {
1009
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "bg-white rounded-lg shadow-md p-6 hover:shadow-lg transition-shadow", children: [
1010
+ showIcon && service.icon && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "w-12 h-12 bg-primary-100 rounded-lg flex items-center justify-center mb-4", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Icon, { name: service.icon, size: 24, className: "text-primary-600" }) }),
1011
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "text-xl font-semibold text-gray-900 mb-2", children: service.title }),
1012
+ service.description && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-gray-600 mb-4", children: service.description }),
1013
+ showPrice && service.priceNote && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-primary-600 font-medium", children: service.priceNote }),
1014
+ showPrice && service.price && !service.priceNote && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "text-primary-600 font-medium", children: [
1015
+ "$",
1016
+ service.price.toFixed(2)
1017
+ ] })
1018
+ ] });
1019
+ }
1020
+ function ServiceListItem({
1021
+ service,
1022
+ showPrice,
1023
+ showIcon
1024
+ }) {
1025
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "py-4 flex items-start justify-between", children: [
1026
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex items-start", children: [
1027
+ showIcon && service.icon && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "w-10 h-10 bg-primary-100 rounded-lg flex items-center justify-center mr-4 flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Icon, { name: service.icon, size: 20, className: "text-primary-600" }) }),
1028
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
1029
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "text-lg font-semibold text-gray-900", children: service.title }),
1030
+ service.description && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-gray-600 text-sm mt-1", children: service.description })
1031
+ ] })
1032
+ ] }),
1033
+ showPrice && (service.priceNote || service.price) && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "text-right ml-4 flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-primary-600 font-medium", children: service.priceNote || `$${service.price?.toFixed(2)}` }) })
1034
+ ] });
1035
+ }
1036
+ function ServiceMinimalCard({
1037
+ service,
1038
+ showPrice
1039
+ }) {
1040
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "p-4 border border-gray-200 rounded-lg hover:border-primary-300 transition-colors", children: [
1041
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex items-center justify-between", children: [
1042
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "font-semibold text-gray-900", children: service.title }),
1043
+ showPrice && (service.priceNote || service.price) && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-primary-600 text-sm font-medium", children: service.priceNote || `$${service.price?.toFixed(2)}` })
1044
+ ] }),
1045
+ service.description && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-gray-600 text-sm mt-2", children: service.description })
1046
+ ] });
1047
+ }
1048
+
1049
+ // src/components/sections/Testimonials.tsx
1050
+ var import_jsx_runtime6 = require("react/jsx-runtime");
1051
+ function Testimonials({
1052
+ testimonials,
1053
+ title = "What Our Customers Say",
1054
+ subtitle,
1055
+ columns = 3,
1056
+ showRatings = true,
1057
+ variant = "cards",
1058
+ limit,
1059
+ className = ""
1060
+ }) {
1061
+ const displayedTestimonials = limit ? testimonials.slice(0, limit) : testimonials;
1062
+ const gridCols = {
1063
+ 1: "max-w-2xl mx-auto",
1064
+ 2: "md:grid-cols-2 max-w-4xl mx-auto",
1065
+ 3: "md:grid-cols-2 lg:grid-cols-3"
1066
+ };
1067
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "container mx-auto px-4", children: [
1068
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "text-center mb-12", children: [
1069
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
1070
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
1071
+ ] }),
1072
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: `grid gap-6 ${gridCols[columns]}`, children: displayedTestimonials.map((testimonial) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1073
+ TestimonialCard,
1074
+ {
1075
+ testimonial,
1076
+ showRating: showRatings,
1077
+ variant
1078
+ },
1079
+ testimonial.id || testimonial.name
1080
+ )) })
1081
+ ] }) });
1082
+ }
1083
+ function TestimonialCard({
1084
+ testimonial,
1085
+ showRating,
1086
+ variant
1087
+ }) {
1088
+ if (variant === "quotes") {
1089
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "text-center", children: [
1090
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(QuoteIcon, { className: "w-10 h-10 text-primary-200 mx-auto mb-4" }),
1091
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("blockquote", { className: "text-lg text-gray-700 italic mb-4", children: [
1092
+ '"',
1093
+ testimonial.quote,
1094
+ '"'
1095
+ ] }),
1096
+ showRating && testimonial.rating && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(StarRating, { rating: testimonial.rating, className: "justify-center mb-2" }),
1097
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "font-semibold text-gray-900", children: testimonial.name }),
1098
+ testimonial.context && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "text-sm text-gray-500", children: testimonial.context })
1099
+ ] });
1100
+ }
1101
+ if (variant === "minimal") {
1102
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "border-l-4 border-primary-500 pl-4", children: [
1103
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("blockquote", { className: "text-gray-700 mb-2", children: [
1104
+ '"',
1105
+ testimonial.quote,
1106
+ '"'
1107
+ ] }),
1108
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-center gap-2", children: [
1109
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "font-semibold text-gray-900", children: testimonial.name }),
1110
+ showRating && testimonial.rating && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(StarRating, { rating: testimonial.rating, size: 14 })
1111
+ ] })
1112
+ ] });
1113
+ }
1114
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "bg-white rounded-lg shadow p-6", children: [
1115
+ showRating && testimonial.rating && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(StarRating, { rating: testimonial.rating, className: "mb-3" }),
1116
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("blockquote", { className: "text-gray-700 mb-4", children: [
1117
+ '"',
1118
+ testimonial.quote,
1119
+ '"'
1120
+ ] }),
1121
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-center", children: [
1122
+ testimonial.imageUrl && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1123
+ "img",
1124
+ {
1125
+ src: testimonial.imageUrl,
1126
+ alt: testimonial.name,
1127
+ className: "w-10 h-10 rounded-full mr-3 object-cover"
1128
+ }
1129
+ ),
1130
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { children: [
1131
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "font-semibold text-gray-900", children: testimonial.name }),
1132
+ testimonial.context && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "text-sm text-gray-500", children: testimonial.context }),
1133
+ testimonial.source && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "text-xs text-gray-400", children: [
1134
+ "via ",
1135
+ testimonial.source
1136
+ ] })
1137
+ ] })
1138
+ ] })
1139
+ ] });
1140
+ }
1141
+ function StarRating({
1142
+ rating,
1143
+ size = 18,
1144
+ className = ""
1145
+ }) {
1146
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: `flex ${className}`, "aria-label": `${rating} out of 5 stars`, children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1147
+ StarIcon,
1148
+ {
1149
+ size,
1150
+ filled: star <= rating,
1151
+ className: star <= rating ? "text-yellow-400" : "text-gray-300"
1152
+ },
1153
+ star
1154
+ )) });
1155
+ }
1156
+ function QuoteIcon({ className }) {
1157
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("svg", { className, fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { d: "M14.017 21v-7.391c0-5.704 3.731-9.57 8.983-10.609l.995 2.151c-2.432.917-3.995 3.638-3.995 5.849h4v10h-9.983zm-14.017 0v-7.391c0-5.704 3.748-9.57 9-10.609l.996 2.151c-2.433.917-3.996 3.638-3.996 5.849h3.983v10h-9.983z" }) });
1158
+ }
1159
+
1160
+ // src/components/sections/FAQ.tsx
1161
+ var import_react2 = require("react");
1162
+ var import_jsx_runtime7 = require("react/jsx-runtime");
1163
+ function FAQ({
1164
+ items,
1165
+ title = "Frequently Asked Questions",
1166
+ subtitle,
1167
+ variant = "accordion",
1168
+ defaultOpen = 0,
1169
+ allowMultiple = false,
1170
+ className = ""
1171
+ }) {
1172
+ const initialOpen = Array.isArray(defaultOpen) ? defaultOpen : [defaultOpen];
1173
+ const [openItems, setOpenItems] = (0, import_react2.useState)(initialOpen);
1174
+ const toggleItem = (index) => {
1175
+ if (allowMultiple) {
1176
+ setOpenItems(
1177
+ (prev) => prev.includes(index) ? prev.filter((i) => i !== index) : [...prev, index]
1178
+ );
1179
+ } else {
1180
+ setOpenItems(
1181
+ (prev) => prev.includes(index) ? [] : [index]
1182
+ );
1183
+ }
1184
+ };
1185
+ if (variant === "cards") {
1186
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
1187
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
1188
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "grid md:grid-cols-2 gap-6 max-w-4xl mx-auto", children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FAQCard, { item }, item.id || item.question)) })
1189
+ ] }) });
1190
+ }
1191
+ if (variant === "simple") {
1192
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
1193
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
1194
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "max-w-3xl mx-auto space-y-8", children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FAQSimple, { item }, item.id || item.question)) })
1195
+ ] }) });
1196
+ }
1197
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("section", { className: `py-16 bg-gray-50 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container mx-auto px-4", children: [
1198
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(SectionHeader2, { title, subtitle }),
1199
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "max-w-3xl mx-auto", children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1200
+ FAQAccordionItem,
1201
+ {
1202
+ item,
1203
+ isOpen: openItems.includes(index),
1204
+ onToggle: () => toggleItem(index)
1205
+ },
1206
+ item.id || item.question
1207
+ )) })
1208
+ ] }) });
1209
+ }
1210
+ function SectionHeader2({ title, subtitle }) {
1211
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "text-center mb-12", children: [
1212
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
1213
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
1214
+ ] });
1215
+ }
1216
+ function FAQAccordionItem({
1217
+ item,
1218
+ isOpen,
1219
+ onToggle
1220
+ }) {
1221
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "border-b border-gray-200 last:border-b-0", children: [
1222
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1223
+ "button",
1224
+ {
1225
+ className: "w-full py-4 flex items-center justify-between text-left focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 rounded",
1226
+ onClick: onToggle,
1227
+ "aria-expanded": isOpen,
1228
+ children: [
1229
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-lg font-medium text-gray-900 pr-4", children: item.question }),
1230
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1231
+ ChevronDownIcon,
1232
+ {
1233
+ size: 20,
1234
+ className: `flex-shrink-0 text-gray-500 transition-transform duration-200 ${isOpen ? "rotate-180" : ""}`
1235
+ }
1236
+ )
1237
+ ]
1238
+ }
1239
+ ),
1240
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1241
+ "div",
1242
+ {
1243
+ className: `overflow-hidden transition-all duration-200 ${isOpen ? "max-h-96 pb-4" : "max-h-0"}`,
1244
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-gray-600", children: item.answer })
1245
+ }
1246
+ )
1247
+ ] });
1248
+ }
1249
+ function FAQCard({ item }) {
1250
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "bg-white rounded-lg shadow p-6", children: [
1251
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h3", { className: "text-lg font-semibold text-gray-900 mb-2", children: item.question }),
1252
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-gray-600", children: item.answer })
1253
+ ] });
1254
+ }
1255
+ function FAQSimple({ item }) {
1256
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
1257
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h3", { className: "text-lg font-semibold text-gray-900 mb-2", children: item.question }),
1258
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-gray-600", children: item.answer })
1259
+ ] });
1260
+ }
1261
+
1262
+ // src/components/sections/Hours.tsx
1263
+ var import_jsx_runtime8 = require("react/jsx-runtime");
1264
+ var dayOrder = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"];
1265
+ var dayNames2 = {
1266
+ monday: "Monday",
1267
+ tuesday: "Tuesday",
1268
+ wednesday: "Wednesday",
1269
+ thursday: "Thursday",
1270
+ friday: "Friday",
1271
+ saturday: "Saturday",
1272
+ sunday: "Sunday"
1273
+ };
1274
+ var dayAbbrev = {
1275
+ monday: "Mon",
1276
+ tuesday: "Tue",
1277
+ wednesday: "Wed",
1278
+ thursday: "Thu",
1279
+ friday: "Fri",
1280
+ saturday: "Sat",
1281
+ sunday: "Sun"
1282
+ };
1283
+ function getTodayDay(timezone) {
1284
+ const now = timezone ? new Date((/* @__PURE__ */ new Date()).toLocaleString("en-US", { timeZone: timezone })) : /* @__PURE__ */ new Date();
1285
+ const jsDay = now.getDay();
1286
+ return dayOrder[(jsDay + 6) % 7];
1287
+ }
1288
+ function Hours({
1289
+ hours,
1290
+ title = "Hours",
1291
+ highlightToday = true,
1292
+ variant = "card",
1293
+ timezone,
1294
+ className = ""
1295
+ }) {
1296
+ const todayDay = getTodayDay(timezone);
1297
+ const sortedHours = [...hours].sort(
1298
+ (a, b) => dayOrder.indexOf(a.day) - dayOrder.indexOf(b.day)
1299
+ );
1300
+ if (variant === "inline") {
1301
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: `flex flex-wrap gap-4 ${className}`, children: sortedHours.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1302
+ HoursInlineItem,
1303
+ {
1304
+ entry,
1305
+ isToday: highlightToday && entry.day === todayDay
1306
+ },
1307
+ entry.day
1308
+ )) });
1309
+ }
1310
+ if (variant === "minimal") {
1311
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: `space-y-1 ${className}`, children: sortedHours.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1312
+ HoursMinimalItem,
1313
+ {
1314
+ entry,
1315
+ isToday: highlightToday && entry.day === todayDay
1316
+ },
1317
+ entry.day
1318
+ )) });
1319
+ }
1320
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: `bg-white rounded-lg shadow p-6 ${className}`, children: [
1321
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "flex items-center mb-4", children: [
1322
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ClockIcon, { size: 24, className: "text-primary-600 mr-2" }),
1323
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", { className: "text-xl font-semibold text-gray-900", children: title })
1324
+ ] }),
1325
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "space-y-2", children: sortedHours.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1326
+ HoursCardItem,
1327
+ {
1328
+ entry,
1329
+ isToday: highlightToday && entry.day === todayDay
1330
+ },
1331
+ entry.day
1332
+ )) })
1333
+ ] });
1334
+ }
1335
+ function HoursCardItem({ entry, isToday }) {
1336
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1337
+ "div",
1338
+ {
1339
+ className: `flex justify-between py-1 ${isToday ? "bg-primary-50 -mx-2 px-2 rounded font-medium" : ""}`,
1340
+ children: [
1341
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { className: isToday ? "text-primary-700" : "text-gray-600", children: [
1342
+ dayNames2[entry.day],
1343
+ isToday && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "ml-2 text-xs", children: "(Today)" })
1344
+ ] }),
1345
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: isToday ? "text-primary-700" : "text-gray-900", children: entry.closed ? "Closed" : `${entry.open} - ${entry.close}` })
1346
+ ]
1347
+ }
1348
+ );
1349
+ }
1350
+ function HoursInlineItem({ entry, isToday }) {
1351
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1352
+ "div",
1353
+ {
1354
+ className: `text-center px-3 py-2 rounded ${isToday ? "bg-primary-100 ring-2 ring-primary-500" : "bg-gray-100"}`,
1355
+ children: [
1356
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: `text-sm font-medium ${isToday ? "text-primary-700" : "text-gray-500"}`, children: dayAbbrev[entry.day] }),
1357
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: `text-sm ${isToday ? "text-primary-900" : "text-gray-900"}`, children: entry.closed ? "Closed" : `${entry.open?.split(" ")[0]}-${entry.close?.split(" ")[0]}` })
1358
+ ]
1359
+ }
1360
+ );
1361
+ }
1362
+ function HoursMinimalItem({ entry, isToday }) {
1363
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: `text-sm ${isToday ? "font-semibold text-primary-600" : "text-gray-600"}`, children: [
1364
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "inline-block w-20", children: dayAbbrev[entry.day] }),
1365
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: entry.closed ? "Closed" : `${entry.open} - ${entry.close}` })
1366
+ ] });
1367
+ }
1368
+ function getTodayHours(hours, timezone) {
1369
+ const todayDay = getTodayDay(timezone);
1370
+ const todayHours = hours.find((h) => h.day === todayDay);
1371
+ if (!todayHours) return null;
1372
+ if (todayHours.closed) return "Closed today";
1373
+ return `${todayHours.open} - ${todayHours.close}`;
1374
+ }
1375
+ function isCurrentlyOpen(hours, timezone) {
1376
+ const todayDay = getTodayDay(timezone);
1377
+ const todayHours = hours.find((h) => h.day === todayDay);
1378
+ if (!todayHours || todayHours.closed) return false;
1379
+ if (!todayHours.open || !todayHours.close) return false;
1380
+ const now = timezone ? new Date((/* @__PURE__ */ new Date()).toLocaleString("en-US", { timeZone: timezone })) : /* @__PURE__ */ new Date();
1381
+ const currentMinutes = now.getHours() * 60 + now.getMinutes();
1382
+ const openMinutes = parseTimeToMinutes(todayHours.open);
1383
+ const closeMinutes = parseTimeToMinutes(todayHours.close);
1384
+ if (openMinutes === null || closeMinutes === null) return false;
1385
+ return currentMinutes >= openMinutes && currentMinutes < closeMinutes;
1386
+ }
1387
+ function parseTimeToMinutes(time) {
1388
+ const match = time.match(/(\d{1,2}):?(\d{2})?\s*(AM|PM)?/i);
1389
+ if (!match) return null;
1390
+ let hours = parseInt(match[1], 10);
1391
+ const minutes = parseInt(match[2] || "0", 10);
1392
+ const period = match[3]?.toUpperCase();
1393
+ if (period === "PM" && hours !== 12) hours += 12;
1394
+ if (period === "AM" && hours === 12) hours = 0;
1395
+ return hours * 60 + minutes;
1396
+ }
1397
+
1398
+ // src/components/sections/Gallery.tsx
1399
+ var import_react3 = require("react");
1400
+ var import_jsx_runtime9 = require("react/jsx-runtime");
1401
+ function Gallery({
1402
+ items,
1403
+ title = "Gallery",
1404
+ subtitle,
1405
+ columns = 3,
1406
+ variant = "grid",
1407
+ showCaptions = true,
1408
+ limit,
1409
+ className = ""
1410
+ }) {
1411
+ const displayedItems = limit ? items.slice(0, limit) : items;
1412
+ const [failedImages, setFailedImages] = (0, import_react3.useState)(/* @__PURE__ */ new Set());
1413
+ const handleImageError = (id) => {
1414
+ setFailedImages((prev) => new Set(prev).add(id));
1415
+ };
1416
+ const gridCols = {
1417
+ 2: "grid-cols-1 sm:grid-cols-2",
1418
+ 3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
1419
+ 4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4"
1420
+ };
1421
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("section", { className: `py-16 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "container mx-auto px-4", children: [
1422
+ (title || subtitle) && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "text-center mb-12", children: [
1423
+ title && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h2", { className: "text-3xl md:text-4xl font-bold text-gray-900 mb-4", children: title }),
1424
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-lg text-gray-600 max-w-2xl mx-auto", children: subtitle })
1425
+ ] }),
1426
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: `grid gap-4 ${gridCols[columns]}`, children: displayedItems.map((item) => {
1427
+ const itemId = item.id || item.imageUrl;
1428
+ const hasFailed = failedImages.has(itemId);
1429
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1430
+ "div",
1431
+ {
1432
+ className: "group relative aspect-square overflow-hidden rounded-lg bg-gray-100",
1433
+ children: hasFailed ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "absolute inset-0 flex items-center justify-center text-gray-400", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "Image unavailable" }) }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
1434
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1435
+ "img",
1436
+ {
1437
+ src: item.imageUrl,
1438
+ alt: item.alt || "",
1439
+ loading: "lazy",
1440
+ className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-105",
1441
+ onError: () => handleImageError(itemId)
1442
+ }
1443
+ ),
1444
+ showCaptions && item.caption && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "absolute inset-0 bg-gradient-to-t from-black/60 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "absolute bottom-0 left-0 right-0 p-4", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-white text-sm", children: item.caption }) }) })
1445
+ ] })
1446
+ },
1447
+ itemId
1448
+ );
1449
+ }) })
1450
+ ] }) });
1451
+ }
1452
+
1453
+ // src/components/ui/Button.tsx
1454
+ var import_jsx_runtime10 = require("react/jsx-runtime");
1455
+ function getButtonClasses(props) {
1456
+ const { variant = "primary", size = "md", fullWidth, disabled } = props;
1457
+ const baseClasses = [
1458
+ "inline-flex items-center justify-center",
1459
+ "font-medium",
1460
+ "transition-colors duration-200",
1461
+ "focus:outline-none focus:ring-2 focus:ring-offset-2",
1462
+ disabled ? "opacity-50 cursor-not-allowed" : "",
1463
+ fullWidth ? "w-full" : ""
1464
+ ];
1465
+ const variantClasses = {
1466
+ primary: "bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500",
1467
+ secondary: "bg-primary-100 text-primary-700 hover:bg-primary-200 focus:ring-primary-500",
1468
+ outline: "border-2 border-primary-600 text-primary-600 hover:bg-primary-50 focus:ring-primary-500",
1469
+ ghost: "text-primary-600 hover:bg-primary-100 focus:ring-primary-500",
1470
+ link: "text-primary-600 hover:underline focus:ring-primary-500 p-0"
1471
+ };
1472
+ const sizeClasses = {
1473
+ sm: "text-sm px-3 py-1.5 rounded",
1474
+ md: "text-base px-4 py-2 rounded-md",
1475
+ lg: "text-lg px-6 py-3 rounded-lg"
1476
+ };
1477
+ return [
1478
+ ...baseClasses,
1479
+ variantClasses[variant],
1480
+ variant !== "link" ? sizeClasses[size] : ""
1481
+ ].filter(Boolean).join(" ");
1482
+ }
1483
+ function Button({
1484
+ variant = "primary",
1485
+ size = "md",
1486
+ fullWidth = false,
1487
+ loading = false,
1488
+ leftIcon,
1489
+ rightIcon,
1490
+ children,
1491
+ disabled,
1492
+ className = "",
1493
+ ...props
1494
+ }) {
1495
+ const classes = getButtonClasses({ variant, size, fullWidth, disabled: disabled || loading });
1496
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1497
+ "button",
1498
+ {
1499
+ className: `${classes} ${className}`,
1500
+ disabled: disabled || loading,
1501
+ ...props,
1502
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(LoadingSpinner, { size }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1503
+ leftIcon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "mr-2", children: leftIcon }),
1504
+ children,
1505
+ rightIcon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "ml-2", children: rightIcon })
1506
+ ] })
1507
+ }
1508
+ );
1509
+ }
1510
+ function LoadingSpinner({ size }) {
1511
+ const sizeClasses = {
1512
+ sm: "w-4 h-4",
1513
+ md: "w-5 h-5",
1514
+ lg: "w-6 h-6"
1515
+ };
1516
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1517
+ "svg",
1518
+ {
1519
+ className: `animate-spin ${sizeClasses[size || "md"]}`,
1520
+ xmlns: "http://www.w3.org/2000/svg",
1521
+ fill: "none",
1522
+ viewBox: "0 0 24 24",
1523
+ children: [
1524
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1525
+ "circle",
1526
+ {
1527
+ className: "opacity-25",
1528
+ cx: "12",
1529
+ cy: "12",
1530
+ r: "10",
1531
+ stroke: "currentColor",
1532
+ strokeWidth: "4"
1533
+ }
1534
+ ),
1535
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1536
+ "path",
1537
+ {
1538
+ className: "opacity-75",
1539
+ fill: "currentColor",
1540
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
1541
+ }
1542
+ )
1543
+ ]
1544
+ }
1545
+ );
1546
+ }
1547
+ function ButtonLink({
1548
+ variant = "primary",
1549
+ size = "md",
1550
+ fullWidth = false,
1551
+ leftIcon,
1552
+ rightIcon,
1553
+ children,
1554
+ className = "",
1555
+ ...props
1556
+ }) {
1557
+ const classes = getButtonClasses({ variant, size, fullWidth, disabled: false });
1558
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("a", { className: `${classes} ${className}`, ...props, children: [
1559
+ leftIcon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "mr-2", children: leftIcon }),
1560
+ children,
1561
+ rightIcon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "ml-2", children: rightIcon })
1562
+ ] });
1563
+ }
1564
+
1565
+ // src/components/ui/Card.tsx
1566
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1567
+ function getCardClasses(props) {
1568
+ const { variant = "default", padding = "md", hover = false } = props;
1569
+ const baseClasses = ["rounded-lg", "overflow-hidden"];
1570
+ const variantClasses = {
1571
+ default: "bg-white shadow",
1572
+ elevated: "bg-white shadow-lg",
1573
+ outlined: "bg-white border border-gray-200",
1574
+ filled: "bg-gray-50"
1575
+ };
1576
+ const paddingClasses = {
1577
+ none: "",
1578
+ sm: "p-3",
1579
+ md: "p-5",
1580
+ lg: "p-8"
1581
+ };
1582
+ const hoverClasses = hover ? "transition-all duration-200 hover:shadow-lg hover:-translate-y-1" : "";
1583
+ return [
1584
+ ...baseClasses,
1585
+ variantClasses[variant],
1586
+ paddingClasses[padding],
1587
+ hoverClasses
1588
+ ].filter(Boolean).join(" ");
1589
+ }
1590
+ function Card({
1591
+ variant = "default",
1592
+ padding = "md",
1593
+ hover = false,
1594
+ children,
1595
+ className = "",
1596
+ ...props
1597
+ }) {
1598
+ const classes = getCardClasses({ variant, padding, hover });
1599
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: `${classes} ${className}`, ...props, children });
1600
+ }
1601
+ function CardHeader({
1602
+ title,
1603
+ subtitle,
1604
+ action,
1605
+ children,
1606
+ className = "",
1607
+ ...props
1608
+ }) {
1609
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: `flex items-start justify-between ${className}`, ...props, children: [
1610
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { children: [
1611
+ title && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("h3", { className: "text-lg font-semibold text-gray-900", children: title }),
1612
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "mt-1 text-sm text-gray-500", children: subtitle }),
1613
+ children
1614
+ ] }),
1615
+ action && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "flex-shrink-0 ml-4", children: action })
1616
+ ] });
1617
+ }
1618
+ function CardBody({
1619
+ children,
1620
+ className = "",
1621
+ ...props
1622
+ }) {
1623
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: `mt-4 ${className}`, ...props, children });
1624
+ }
1625
+ function CardFooter({
1626
+ children,
1627
+ className = "",
1628
+ ...props
1629
+ }) {
1630
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: `mt-4 pt-4 border-t border-gray-100 ${className}`, ...props, children });
1631
+ }
1632
+ function CardImage({
1633
+ aspectRatio = "video",
1634
+ className = "",
1635
+ alt = "",
1636
+ ...props
1637
+ }) {
1638
+ const aspectClasses = {
1639
+ square: "aspect-square",
1640
+ video: "aspect-video",
1641
+ wide: "aspect-[2/1]",
1642
+ auto: ""
1643
+ };
1644
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: `-m-5 mb-4 ${aspectClasses[aspectRatio]} overflow-hidden`, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1645
+ "img",
1646
+ {
1647
+ className: `w-full h-full object-cover ${className}`,
1648
+ alt,
1649
+ ...props
1650
+ }
1651
+ ) });
1652
+ }
1653
+ // Annotate the CommonJS export names for ESM import in node:
1654
+ 0 && (module.exports = {
1655
+ BriefcaseIcon,
1656
+ Button,
1657
+ ButtonLink,
1658
+ CakeIcon,
1659
+ Card,
1660
+ CardBody,
1661
+ CardFooter,
1662
+ CardHeader,
1663
+ CardImage,
1664
+ CheckIcon,
1665
+ ChevronDownIcon,
1666
+ ChevronRightIcon,
1667
+ ClockIcon,
1668
+ FAQ,
1669
+ FacebookIcon,
1670
+ Footer,
1671
+ Gallery,
1672
+ Header,
1673
+ HeartIcon,
1674
+ Hero,
1675
+ Hours,
1676
+ Icon,
1677
+ InstagramIcon,
1678
+ MailIcon,
1679
+ MapPinIcon,
1680
+ MenuIcon,
1681
+ PhoneIcon,
1682
+ ScissorsIcon,
1683
+ Services,
1684
+ SparklesIcon,
1685
+ StarIcon,
1686
+ Testimonials,
1687
+ UtensilsIcon,
1688
+ WrenchIcon,
1689
+ XIcon,
1690
+ YelpIcon,
1691
+ getIcon,
1692
+ getTodayHours,
1693
+ iconMap,
1694
+ isCurrentlyOpen
1695
+ });
1696
+ //# sourceMappingURL=index.js.map