@bailierich/booking-components 2.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 (83) hide show
  1. package/README.md +319 -0
  2. package/TENANT_DATA_INTEGRATION.md +402 -0
  3. package/TENANT_SETUP.md +316 -0
  4. package/components/BookingFlow/BookingFlow.tsx +790 -0
  5. package/components/BookingFlow/index.ts +5 -0
  6. package/components/BookingFlow/steps/AddonsSelection.tsx +118 -0
  7. package/components/BookingFlow/steps/Confirmation.tsx +185 -0
  8. package/components/BookingFlow/steps/ContactForm.tsx +292 -0
  9. package/components/BookingFlow/steps/CycleAwareDateSelection.tsx +277 -0
  10. package/components/BookingFlow/steps/DateSelection.tsx +473 -0
  11. package/components/BookingFlow/steps/ServiceSelection.tsx +315 -0
  12. package/components/BookingFlow/steps/TimeSelection.tsx +230 -0
  13. package/components/BookingFlow/steps/index.ts +10 -0
  14. package/components/BottomSheet/index.tsx +120 -0
  15. package/components/Forms/FormBlock.tsx +283 -0
  16. package/components/Forms/FormField.tsx +385 -0
  17. package/components/Forms/FormRenderer.tsx +216 -0
  18. package/components/Forms/FormValidation.ts +122 -0
  19. package/components/Forms/index.ts +4 -0
  20. package/components/HoldTimer/HoldTimer.tsx +266 -0
  21. package/components/HoldTimer/index.ts +2 -0
  22. package/components/SectionRenderer.tsx +558 -0
  23. package/components/Sections/About.tsx +145 -0
  24. package/components/Sections/BeforeAfter.tsx +81 -0
  25. package/components/Sections/BookingSection.tsx +76 -0
  26. package/components/Sections/Contact.tsx +103 -0
  27. package/components/Sections/FAQSection.tsx +239 -0
  28. package/components/Sections/FeatureContent.tsx +113 -0
  29. package/components/Sections/FeaturedLink.tsx +103 -0
  30. package/components/Sections/FixedInfoCard.tsx +189 -0
  31. package/components/Sections/Gallery.tsx +83 -0
  32. package/components/Sections/Header.tsx +78 -0
  33. package/components/Sections/Hero.tsx +178 -0
  34. package/components/Sections/ImageSection.tsx +147 -0
  35. package/components/Sections/InstagramFeed.tsx +38 -0
  36. package/components/Sections/LinkList.tsx +76 -0
  37. package/components/Sections/LocationMap.tsx +202 -0
  38. package/components/Sections/Logo.tsx +61 -0
  39. package/components/Sections/MinimalFooter.tsx +78 -0
  40. package/components/Sections/MinimalHeader.tsx +81 -0
  41. package/components/Sections/MinimalNavigation.tsx +63 -0
  42. package/components/Sections/Navbar.tsx +258 -0
  43. package/components/Sections/PricingTable.tsx +106 -0
  44. package/components/Sections/ScrollingTextDivider.tsx +138 -0
  45. package/components/Sections/ScrollingTextDivider.tsx.bak +138 -0
  46. package/components/Sections/ServicesPreview.tsx +129 -0
  47. package/components/Sections/SocialBar.tsx +177 -0
  48. package/components/Sections/Team.tsx +80 -0
  49. package/components/Sections/Testimonials.tsx +92 -0
  50. package/components/Sections/TextSection.tsx +116 -0
  51. package/components/Sections/VideoSection.tsx +178 -0
  52. package/components/Sections/index.ts +57 -0
  53. package/components/index.ts +21 -0
  54. package/dist/index-DAai7Glf.d.mts +474 -0
  55. package/dist/index-DAai7Glf.d.ts +474 -0
  56. package/dist/index.d.mts +1075 -0
  57. package/dist/index.d.ts +1075 -0
  58. package/dist/index.js +22 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/index.mjs +22 -0
  61. package/dist/index.mjs.map +1 -0
  62. package/dist/styles/index.d.mts +1 -0
  63. package/dist/styles/index.d.ts +1 -0
  64. package/dist/styles/index.js +2 -0
  65. package/dist/styles/index.js.map +1 -0
  66. package/dist/styles/index.mjs +2 -0
  67. package/dist/styles/index.mjs.map +1 -0
  68. package/docs/API.md +849 -0
  69. package/docs/CALLBACKS.md +760 -0
  70. package/docs/COMPLETE_SESSION_SUMMARY.md +404 -0
  71. package/docs/DATA_SHAPES.md +684 -0
  72. package/docs/MIGRATION.md +662 -0
  73. package/docs/PAYMENT_INTEGRATION.md +766 -0
  74. package/docs/SESSION_SUMMARY.md +185 -0
  75. package/docs/STYLING.md +735 -0
  76. package/index.ts +4 -0
  77. package/lib/storage.ts +239 -0
  78. package/package.json +59 -0
  79. package/styles/animations.ts +210 -0
  80. package/styles/index.ts +1 -0
  81. package/tsconfig.json +32 -0
  82. package/tsup.config.ts +13 -0
  83. package/types/index.ts +369 -0
@@ -0,0 +1,558 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import {
5
+ Logo,
6
+ Header,
7
+ FeaturedLink,
8
+ LinkList,
9
+ SocialBar,
10
+ Hero,
11
+ About,
12
+ ServicesPreview,
13
+ Gallery,
14
+ Testimonials,
15
+ Team,
16
+ Contact,
17
+ MinimalHeader,
18
+ MinimalNavigation,
19
+ MinimalFooter,
20
+ FeatureContent,
21
+ BeforeAfter,
22
+ PricingTable,
23
+ InstagramFeed,
24
+ FixedInfoCard,
25
+ BookingSection,
26
+ VideoSection,
27
+ ScrollingTextDivider,
28
+ LocationMap,
29
+ ImageSection,
30
+ FAQSection,
31
+ Navbar,
32
+ TextSection
33
+ } from './Sections';
34
+
35
+ export interface SectionRendererProps {
36
+ section: {
37
+ id: string;
38
+ type: string;
39
+ settings: any;
40
+ enabled?: boolean;
41
+ position?: number;
42
+ };
43
+ theme: {
44
+ colors: {
45
+ primary: string;
46
+ secondary: string;
47
+ text: string;
48
+ bookingText?: string;
49
+ linkBackground?: string;
50
+ linkText?: string;
51
+ buttonText?: string;
52
+ };
53
+ typography: {
54
+ headingFont?: string;
55
+ bodyFont?: string;
56
+ bodySize?: string;
57
+ };
58
+ };
59
+ // Optional: Pass custom BookingFlow component for booking sections
60
+ BookingFlowComponent?: React.ComponentType<any>;
61
+ // Optional: Pass full config for booking sections
62
+ config?: any;
63
+ // Optional: Enable inline editing (for Studio preview mode)
64
+ enableInlineEditing?: boolean;
65
+ }
66
+
67
+ /**
68
+ * SectionRenderer - Universal renderer for all section types
69
+ *
70
+ * Maps section configuration objects to the appropriate component
71
+ * and passes through theme/styling props.
72
+ *
73
+ * @example
74
+ * ```tsx
75
+ * <SectionRenderer
76
+ * section={{
77
+ * id: 'hero-1',
78
+ * type: 'hero',
79
+ * settings: {
80
+ * headline: 'Welcome',
81
+ * subheadline: 'Transform your look',
82
+ * heroImage: '/hero.jpg',
83
+ * layout: 'split'
84
+ * }
85
+ * }}
86
+ * theme={{
87
+ * colors: { primary: '#BCB4FF', secondary: '#CAC426', text: '#000000' },
88
+ * typography: { headingFont: 'Geist Sans' }
89
+ * }}
90
+ * />
91
+ * ```
92
+ */
93
+ export function SectionRenderer({
94
+ section,
95
+ theme,
96
+ BookingFlowComponent,
97
+ config,
98
+ enableInlineEditing = false
99
+ }: SectionRendererProps) {
100
+ const { type, settings } = section;
101
+ const sectionId = section.id;
102
+
103
+ // Debug log
104
+ if (type === 'video_section') {
105
+ console.log('🎬 Rendering video_section:', { type, settings, sectionId });
106
+ }
107
+ const colors = theme?.colors || {
108
+ primary: '#BCB4FF',
109
+ secondary: '#CAC426',
110
+ text: '#000000'
111
+ };
112
+ const typography = theme?.typography || {
113
+ headingFont: 'Geist Sans',
114
+ bodyFont: 'Inter',
115
+ bodySize: '16px'
116
+ };
117
+
118
+ // Map section type to component
119
+ switch (type) {
120
+ case 'logo':
121
+ return (
122
+ <Logo
123
+ logoUrl={settings.logoUrl}
124
+ fallbackText={settings.fallbackText}
125
+ size={settings.size}
126
+ alignment={settings.alignment}
127
+ colors={colors}
128
+ enableInlineEditing={enableInlineEditing}
129
+ sectionId={sectionId}
130
+ />
131
+ );
132
+
133
+ case 'header':
134
+ return (
135
+ <Header
136
+ name={settings.name}
137
+ title={settings.title}
138
+ bio={settings.bio}
139
+ showName={settings.showName}
140
+ showTitle={settings.showTitle}
141
+ showBio={settings.showBio}
142
+ colors={colors}
143
+ typography={typography}
144
+ enableInlineEditing={enableInlineEditing}
145
+ sectionId={sectionId}
146
+ />
147
+ );
148
+
149
+ case 'featured_link':
150
+ return (
151
+ <FeaturedLink
152
+ text={settings.text}
153
+ url={settings.url}
154
+ style={settings.style}
155
+ size={settings.size}
156
+ colors={colors}
157
+ enableInlineEditing={enableInlineEditing}
158
+ sectionId={sectionId}
159
+ />
160
+ );
161
+
162
+ case 'link_list':
163
+ return (
164
+ <LinkList
165
+ links={settings.links || []}
166
+ style={settings.style}
167
+ colors={colors}
168
+ enableInlineEditing={enableInlineEditing}
169
+ sectionId={sectionId}
170
+ />
171
+ );
172
+
173
+ case 'social_bar':
174
+ return (
175
+ <SocialBar
176
+ platforms={settings.platforms || []}
177
+ socialLinks={settings.socialLinks}
178
+ style={settings.style}
179
+ size={settings.size}
180
+ position={settings.position}
181
+ invertIcons={settings.invertIcons}
182
+ colors={colors}
183
+ enableInlineEditing={enableInlineEditing}
184
+ sectionId={sectionId}
185
+ />
186
+ );
187
+
188
+ case 'instagram_feed':
189
+ return (
190
+ <InstagramFeed
191
+ username={settings.username}
192
+ colors={colors}
193
+ enableInlineEditing={enableInlineEditing}
194
+ sectionId={sectionId}
195
+ />
196
+ );
197
+
198
+ case 'minimal_header':
199
+ return (
200
+ <MinimalHeader
201
+ brandName={settings.brandName}
202
+ logoUrl={settings.logoUrl}
203
+ style={settings.style}
204
+ alignment={settings.alignment}
205
+ sticky={settings.sticky}
206
+ colors={colors}
207
+ typography={typography}
208
+ enableInlineEditing={enableInlineEditing}
209
+ sectionId={sectionId}
210
+ />
211
+ );
212
+
213
+ case 'minimal_navigation':
214
+ return (
215
+ <MinimalNavigation
216
+ links={settings.links || []}
217
+ style={settings.style}
218
+ colors={colors}
219
+ enableInlineEditing={enableInlineEditing}
220
+ sectionId={sectionId}
221
+ />
222
+ );
223
+
224
+ case 'feature_content':
225
+ return (
226
+ <FeatureContent
227
+ headline={settings.headline}
228
+ description={settings.description}
229
+ image={settings.image}
230
+ buttonText={settings.buttonText}
231
+ buttonUrl={settings.buttonUrl}
232
+ showButton={settings.showButton}
233
+ layout={settings.layout}
234
+ colors={colors}
235
+ typography={typography}
236
+ enableInlineEditing={enableInlineEditing}
237
+ sectionId={sectionId}
238
+ />
239
+ );
240
+
241
+ case 'minimal_footer':
242
+ return (
243
+ <MinimalFooter
244
+ alignment={settings.alignment}
245
+ showSocial={settings.showSocial}
246
+ showContact={settings.showContact}
247
+ showLinks={settings.showLinks}
248
+ footerText={settings.footerText}
249
+ colors={colors}
250
+ enableInlineEditing={enableInlineEditing}
251
+ sectionId={sectionId}
252
+ />
253
+ );
254
+
255
+ case 'hero':
256
+ return (
257
+ <Hero
258
+ headline={settings.headline}
259
+ subheadline={settings.subheadline}
260
+ heroImage={settings.heroImage}
261
+ ctaButton={settings.ctaButton}
262
+ layout={settings.layout}
263
+ imagePosition={settings.imagePosition}
264
+ contentDisplay={settings.contentDisplay}
265
+ colors={colors}
266
+ typography={typography}
267
+ enableInlineEditing={enableInlineEditing}
268
+ sectionId={sectionId}
269
+ />
270
+ );
271
+
272
+ case 'about':
273
+ return (
274
+ <About
275
+ title={settings.title}
276
+ content={settings.content}
277
+ image={settings.image}
278
+ layout={settings.layout}
279
+ colors={colors}
280
+ typography={typography}
281
+ enableInlineEditing={enableInlineEditing}
282
+ sectionId={sectionId}
283
+ />
284
+ );
285
+
286
+ case 'services_preview':
287
+ return (
288
+ <ServicesPreview
289
+ title={settings.title}
290
+ services={settings.services}
291
+ layout={settings.layout}
292
+ columns={settings.columns}
293
+ showPrices={settings.showPrices}
294
+ showDuration={settings.showDuration}
295
+ colors={colors}
296
+ typography={typography}
297
+ enableInlineEditing={enableInlineEditing}
298
+ sectionId={sectionId}
299
+ />
300
+ );
301
+
302
+ case 'gallery':
303
+ return (
304
+ <Gallery
305
+ title={settings.title}
306
+ images={settings.images || []}
307
+ columns={settings.columns}
308
+ colors={colors}
309
+ typography={typography}
310
+ enableInlineEditing={enableInlineEditing}
311
+ sectionId={sectionId}
312
+ />
313
+ );
314
+
315
+ case 'testimonials':
316
+ return (
317
+ <Testimonials
318
+ title={settings.title}
319
+ testimonials={settings.testimonials}
320
+ layout={settings.layout}
321
+ colors={colors}
322
+ typography={typography}
323
+ enableInlineEditing={enableInlineEditing}
324
+ sectionId={sectionId}
325
+ />
326
+ );
327
+
328
+ case 'team':
329
+ return (
330
+ <Team
331
+ title={settings.title}
332
+ members={settings.members}
333
+ colors={colors}
334
+ typography={typography}
335
+ enableInlineEditing={enableInlineEditing}
336
+ sectionId={sectionId}
337
+ />
338
+ );
339
+
340
+ case 'contact':
341
+ return (
342
+ <Contact
343
+ title={settings.title}
344
+ showForm={settings.showForm}
345
+ email={settings.email}
346
+ phone={settings.phone}
347
+ address={settings.address}
348
+ colors={colors}
349
+ typography={typography}
350
+ enableInlineEditing={enableInlineEditing}
351
+ sectionId={sectionId}
352
+ />
353
+ );
354
+
355
+ case 'before_after':
356
+ return (
357
+ <BeforeAfter
358
+ title={settings.title}
359
+ comparisons={settings.comparisons}
360
+ colors={colors}
361
+ typography={typography}
362
+ enableInlineEditing={enableInlineEditing}
363
+ sectionId={sectionId}
364
+ />
365
+ );
366
+
367
+ case 'pricing_table':
368
+ return (
369
+ <PricingTable
370
+ title={settings.title}
371
+ plans={settings.plans}
372
+ colors={colors}
373
+ typography={typography}
374
+ enableInlineEditing={enableInlineEditing}
375
+ sectionId={sectionId}
376
+ />
377
+ );
378
+
379
+ case 'booking':
380
+ return (
381
+ <BookingSection
382
+ config={config || {}}
383
+ colors={colors}
384
+ BookingFlowComponent={BookingFlowComponent}
385
+ enableInlineEditing={enableInlineEditing}
386
+ sectionId={sectionId}
387
+ />
388
+ );
389
+
390
+ case 'fixed_info_card':
391
+ return (
392
+ <FixedInfoCard
393
+ name={settings.name}
394
+ subheading={settings.subheading}
395
+ bio={settings.bio}
396
+ links={settings.links || []}
397
+ bookingButtonText={settings.bookingButtonText}
398
+ bookingButtonUrl={settings.bookingButtonUrl}
399
+ showBookingButton={settings.showBookingButton}
400
+ position={settings.position}
401
+ cardWidth={settings.cardWidth}
402
+ cardColor={settings.cardColor}
403
+ colors={colors}
404
+ typography={typography}
405
+ enableInlineEditing={enableInlineEditing}
406
+ sectionId={sectionId}
407
+ />
408
+ );
409
+
410
+ case 'video_section':
411
+ return (
412
+ <VideoSection
413
+ videoUrl={settings.videoUrl}
414
+ aspectRatio={settings.aspectRatio}
415
+ autoplay={settings.autoplay}
416
+ loop={settings.loop}
417
+ muted={settings.muted}
418
+ controls={settings.controls}
419
+ allowFullScreen={settings.allowFullScreen}
420
+ coverImage={settings.coverImage}
421
+ maxWidth={settings.maxWidth}
422
+ alignment={settings.alignment}
423
+ borderRadius={settings.borderRadius}
424
+ colors={colors}
425
+ typography={typography}
426
+ enableInlineEditing={enableInlineEditing}
427
+ sectionId={sectionId}
428
+ />
429
+ );
430
+
431
+ case 'scrolling_text_divider':
432
+ return (
433
+ <ScrollingTextDivider
434
+ text={settings.text}
435
+ scrollDirection={settings.scrollDirection}
436
+ scrollSpeed={settings.scrollSpeed}
437
+ orientation={settings.orientation}
438
+ dividerIcon={settings.dividerIcon}
439
+ customIcon={settings.customIcon}
440
+ textSize={settings.textSize}
441
+ textColor={settings.textColor}
442
+ fontWeight={settings.fontWeight}
443
+ backgroundColor={settings.backgroundColor}
444
+ backgroundGradient={settings.backgroundGradient}
445
+ pauseOnHover={settings.pauseOnHover}
446
+ colors={colors}
447
+ typography={typography}
448
+ enableInlineEditing={enableInlineEditing}
449
+ sectionId={sectionId}
450
+ />
451
+ );
452
+
453
+ case 'location_map':
454
+ return (
455
+ <LocationMap
456
+ address={settings.address}
457
+ displayType={settings.displayType}
458
+ mapHeight={settings.mapHeight}
459
+ mapStyle={settings.mapStyle}
460
+ zoom={settings.zoom}
461
+ showMarker={settings.showMarker}
462
+ borderRadius={settings.borderRadius}
463
+ directionsButtonText={settings.directionsButtonText}
464
+ colors={colors}
465
+ typography={typography}
466
+ enableInlineEditing={enableInlineEditing}
467
+ sectionId={sectionId}
468
+ />
469
+ );
470
+
471
+ case 'image_section':
472
+ return (
473
+ <ImageSection
474
+ imageUrl={settings.imageUrl}
475
+ altText={settings.altText}
476
+ caption={settings.caption}
477
+ maxWidth={settings.maxWidth}
478
+ alignment={settings.alignment}
479
+ aspectRatio={settings.aspectRatio}
480
+ borderRadius={settings.borderRadius}
481
+ linkUrl={settings.linkUrl}
482
+ openInNewTab={settings.openInNewTab}
483
+ colors={colors}
484
+ typography={typography}
485
+ enableInlineEditing={enableInlineEditing}
486
+ sectionId={sectionId}
487
+ />
488
+ );
489
+
490
+ case 'faq_section':
491
+ return (
492
+ <FAQSection
493
+ title={settings.title}
494
+ faqs={settings.faqs}
495
+ layout={settings.layout}
496
+ maxWidth={settings.maxWidth}
497
+ colors={colors}
498
+ typography={typography}
499
+ enableInlineEditing={enableInlineEditing}
500
+ sectionId={sectionId}
501
+ />
502
+ );
503
+
504
+ case 'navbar':
505
+ return (
506
+ <Navbar
507
+ brandName={settings.brandName}
508
+ logoUrl={settings.logoUrl}
509
+ showLogo={settings.showLogo}
510
+ showBrandName={settings.showBrandName}
511
+ links={settings.links}
512
+ ctaText={settings.ctaText}
513
+ ctaUrl={settings.ctaUrl}
514
+ sticky={settings.sticky}
515
+ transparentOnTop={settings.transparentOnTop}
516
+ colors={colors}
517
+ typography={typography}
518
+ enableInlineEditing={enableInlineEditing}
519
+ sectionId={sectionId}
520
+ />
521
+ );
522
+
523
+ case 'text_section':
524
+ return (
525
+ <TextSection
526
+ title={settings.title}
527
+ content={settings.content}
528
+ alignment={settings.alignment}
529
+ maxWidth={settings.maxWidth}
530
+ textSize={settings.textSize}
531
+ backgroundColor={settings.backgroundColor}
532
+ textColor={settings.textColor}
533
+ paddingY={settings.paddingY}
534
+ colors={colors}
535
+ typography={typography}
536
+ enableInlineEditing={enableInlineEditing}
537
+ sectionId={sectionId}
538
+ />
539
+ );
540
+
541
+ default:
542
+ // Unknown section type - render placeholder
543
+ return (
544
+ <div className="container mx-auto px-4 py-16">
545
+ <div
546
+ className="max-w-4xl mx-auto p-8 rounded-lg border-2 border-dashed text-center"
547
+ style={{ borderColor: colors.primary, opacity: 0.5 }}
548
+ >
549
+ <p className="text-lg" style={{ color: colors.text }}>
550
+ Unknown section type: {type}
551
+ </p>
552
+ </div>
553
+ </div>
554
+ );
555
+ }
556
+ }
557
+
558
+ export default SectionRenderer;
@@ -0,0 +1,145 @@
1
+ 'use client';
2
+
3
+ export interface AboutProps {
4
+ title?: string;
5
+ content?: string;
6
+ image?: string;
7
+ layout?: 'centered' | 'split' | 'wide';
8
+ colors: {
9
+ primary: string;
10
+ text: string;
11
+ };
12
+ typography: {
13
+ headingFont?: string;
14
+ };
15
+ enableInlineEditing?: boolean;
16
+ sectionId?: string;
17
+ }
18
+
19
+ export function About({
20
+ title,
21
+ content,
22
+ image,
23
+ layout = 'centered',
24
+ colors,
25
+ typography,
26
+ enableInlineEditing = false,
27
+ sectionId = ''
28
+ }: AboutProps) {
29
+ if (layout === 'centered') {
30
+ return (
31
+ <div className="container mx-auto px-4 py-16">
32
+ <div className="max-w-3xl mx-auto text-center">
33
+ <h2
34
+ className="text-3xl font-bold mb-6"
35
+ style={{
36
+ fontFamily: typography.headingFont,
37
+ color: colors.text
38
+ }}
39
+ {...(enableInlineEditing && {
40
+ 'data-editable': true,
41
+ 'data-section-id': sectionId,
42
+ 'data-field-path': 'settings.title'
43
+ })}
44
+ >
45
+ {title || 'About Us'}
46
+ </h2>
47
+ <p
48
+ className="text-lg opacity-80"
49
+ {...(enableInlineEditing && {
50
+ 'data-editable': true,
51
+ 'data-section-id': sectionId,
52
+ 'data-field-path': 'settings.content'
53
+ })}
54
+ >
55
+ {content || 'Tell your story here...'}
56
+ </p>
57
+ </div>
58
+ </div>
59
+ );
60
+ }
61
+
62
+ if (layout === 'split') {
63
+ return (
64
+ <div className="container mx-auto px-4 py-16">
65
+ <div className="max-w-6xl mx-auto grid md:grid-cols-2 gap-12 items-center">
66
+ <div className="aspect-square rounded-2xl overflow-hidden">
67
+ {image ? (
68
+ <img
69
+ src={image}
70
+ alt={title || 'About'}
71
+ className="w-full h-full object-cover"
72
+ />
73
+ ) : (
74
+ <div
75
+ className="w-full h-full flex items-center justify-center"
76
+ style={{ backgroundColor: colors.primary, opacity: 0.2 }}
77
+ >
78
+ <span className="text-sm opacity-50">Add image</span>
79
+ </div>
80
+ )}
81
+ </div>
82
+ <div>
83
+ <h2
84
+ className="text-3xl font-bold mb-6"
85
+ style={{
86
+ fontFamily: typography.headingFont,
87
+ color: colors.text
88
+ }}
89
+ {...(enableInlineEditing && {
90
+ 'data-editable': true,
91
+ 'data-section-id': sectionId,
92
+ 'data-field-path': 'settings.title'
93
+ })}
94
+ >
95
+ {title || 'About Us'}
96
+ </h2>
97
+ <p
98
+ className="text-lg opacity-80 leading-relaxed"
99
+ {...(enableInlineEditing && {
100
+ 'data-editable': true,
101
+ 'data-section-id': sectionId,
102
+ 'data-field-path': 'settings.content'
103
+ })}
104
+ >
105
+ {content || 'Tell your story here...'}
106
+ </p>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ );
111
+ }
112
+
113
+ return (
114
+ <div className="container mx-auto px-4 py-16">
115
+ <div className="max-w-7xl mx-auto">
116
+ <h2
117
+ className="text-4xl font-bold mb-8 text-left"
118
+ style={{
119
+ fontFamily: typography.headingFont,
120
+ color: colors.text
121
+ }}
122
+ {...(enableInlineEditing && {
123
+ 'data-editable': true,
124
+ 'data-section-id': sectionId,
125
+ 'data-field-path': 'settings.title'
126
+ })}
127
+ >
128
+ {title || 'About Us'}
129
+ </h2>
130
+ <p
131
+ className="text-xl opacity-80 leading-relaxed columns-2 gap-12"
132
+ {...(enableInlineEditing && {
133
+ 'data-editable': true,
134
+ 'data-section-id': sectionId,
135
+ 'data-field-path': 'settings.content'
136
+ })}
137
+ >
138
+ {content || 'Tell your story here...'}
139
+ </p>
140
+ </div>
141
+ </div>
142
+ );
143
+ }
144
+
145
+ export default About;