@deneb-ui/ui 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 (84) hide show
  1. package/README.md +182 -0
  2. package/dist/EditableBox.d.ts +56 -0
  3. package/dist/EditableBox.js +113 -0
  4. package/dist/EditableCard.d.ts +48 -0
  5. package/dist/EditableCard.js +85 -0
  6. package/dist/EditableContactForm.d.ts +11 -0
  7. package/dist/EditableContactForm.js +146 -0
  8. package/dist/EditableDialog.d.ts +25 -0
  9. package/dist/EditableDialog.js +145 -0
  10. package/dist/EditableFAQAccordion.d.ts +19 -0
  11. package/dist/EditableFAQAccordion.js +62 -0
  12. package/dist/EditableFooter.d.ts +31 -0
  13. package/dist/EditableFooter.js +330 -0
  14. package/dist/EditableGrid.d.ts +40 -0
  15. package/dist/EditableGrid.js +39 -0
  16. package/dist/EditableHero.d.ts +27 -0
  17. package/dist/EditableHero.js +154 -0
  18. package/dist/EditableImage.d.ts +13 -0
  19. package/dist/EditableImage.js +38 -0
  20. package/dist/EditableList.d.ts +33 -0
  21. package/dist/EditableList.js +19 -0
  22. package/dist/EditableNavbar.d.ts +28 -0
  23. package/dist/EditableNavbar.js +178 -0
  24. package/dist/EditablePricingCard.d.ts +31 -0
  25. package/dist/EditablePricingCard.js +93 -0
  26. package/dist/EditableProductCard.d.ts +60 -0
  27. package/dist/EditableProductCard.js +116 -0
  28. package/dist/EditableSection.d.ts +35 -0
  29. package/dist/EditableSection.js +34 -0
  30. package/dist/EditableServiceCard.d.ts +38 -0
  31. package/dist/EditableServiceCard.js +28 -0
  32. package/dist/EditableTestimonialCard.d.ts +17 -0
  33. package/dist/EditableTestimonialCard.js +46 -0
  34. package/dist/EditableText.d.ts +117 -0
  35. package/dist/EditableText.js +319 -0
  36. package/dist/SiteDataProvider.d.ts +61 -0
  37. package/dist/SiteDataProvider.js +316 -0
  38. package/dist/ThemeStyles.d.ts +46 -0
  39. package/dist/ThemeStyles.js +181 -0
  40. package/dist/business/BusinessHours.d.ts +20 -0
  41. package/dist/business/BusinessHours.js +109 -0
  42. package/dist/business/index.d.ts +1 -0
  43. package/dist/business/index.js +17 -0
  44. package/dist/contact/ContactActions.d.ts +24 -0
  45. package/dist/contact/ContactActions.js +30 -0
  46. package/dist/contact/ContactButton.d.ts +15 -0
  47. package/dist/contact/ContactButton.js +94 -0
  48. package/dist/contact/EmailButton.d.ts +6 -0
  49. package/dist/contact/EmailButton.js +12 -0
  50. package/dist/contact/PhoneButton.d.ts +6 -0
  51. package/dist/contact/PhoneButton.js +12 -0
  52. package/dist/contact/WhatsAppButton.d.ts +6 -0
  53. package/dist/contact/WhatsAppButton.js +13 -0
  54. package/dist/contact/index.d.ts +5 -0
  55. package/dist/contact/index.js +21 -0
  56. package/dist/core/DenebAction.d.ts +19 -0
  57. package/dist/core/DenebAction.js +107 -0
  58. package/dist/core/index.d.ts +1 -0
  59. package/dist/core/index.js +17 -0
  60. package/dist/index.d.ts +61 -0
  61. package/dist/index.js +106 -0
  62. package/dist/location/Address.d.ts +14 -0
  63. package/dist/location/Address.js +26 -0
  64. package/dist/location/LocationCard.d.ts +20 -0
  65. package/dist/location/LocationCard.js +41 -0
  66. package/dist/location/LocationLink.d.ts +18 -0
  67. package/dist/location/LocationLink.js +23 -0
  68. package/dist/location/MapEmbed.d.ts +18 -0
  69. package/dist/location/MapEmbed.js +30 -0
  70. package/dist/location/MapLink.d.ts +13 -0
  71. package/dist/location/MapLink.js +63 -0
  72. package/dist/location/index.d.ts +5 -0
  73. package/dist/location/index.js +21 -0
  74. package/dist/social/SocialButton.d.ts +11 -0
  75. package/dist/social/SocialButton.js +112 -0
  76. package/dist/social/SocialLinks.d.ts +14 -0
  77. package/dist/social/SocialLinks.js +42 -0
  78. package/dist/social/index.d.ts +2 -0
  79. package/dist/social/index.js +18 -0
  80. package/dist/utils/index.d.ts +1 -0
  81. package/dist/utils/index.js +17 -0
  82. package/dist/utils/urls.d.ts +32 -0
  83. package/dist/utils/urls.js +91 -0
  84. package/package.json +41 -0
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Footer = void 0;
5
+ exports.EditableFooter = EditableFooter;
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
8
+ const SiteDataProvider_1 = require("./SiteDataProvider");
9
+ const DEFAULT_FOOTER_PAGES = [
10
+ { id: 'home', label: 'Home', route: '/' },
11
+ { id: 'about_us', label: 'About', route: '/about_us' },
12
+ { id: 'services', label: 'Services', route: '/services' },
13
+ { id: 'contact', label: 'Contact', route: '/contact' },
14
+ ];
15
+ /**
16
+ * Next-Level DENEB UI Footer
17
+ *
18
+ * Features:
19
+ * - High-end Shadcn-inspired dark aesthetic with subtle borders and ambient highlights
20
+ * - 100% Real-Time Auto-Synchronization with Header (Logo, Website Title, Nav labels)
21
+ * - 4-Column Responsive Layout:
22
+ * Col 1: Synced Brand (Logo + Site Name + Short Description + Social Icons)
23
+ * Col 2: Synced Explore Navigation (Routes dynamically synced with Header nav items)
24
+ * Col 3: Contact & Support (Direct contact shortcuts, address, email, phone)
25
+ * Col 4: Dynamic Footer Heading & Sleek Interactive Newsletter Card
26
+ * - Strict Visual Editing Marker Support (`common.shortDescription`, `common.footerHeading`, `common.copyright`)
27
+ * - Route Filtering Compliance (`data-target-page` wrappers)
28
+ * - Tailored Tailwind CSS utility classes + resilient inline CSS fallbacks
29
+ *
30
+ * Created by Chamika Gayashan (CEE G)
31
+ */
32
+ function EditableFooter({ defaultLinks = DEFAULT_FOOTER_PAGES, links, basePath = '', showNewsletter = true, className = '', style, ...props }) {
33
+ const siteData = (0, SiteDataProvider_1.useSiteData)();
34
+ const [email, setEmail] = (0, react_1.useState)('');
35
+ const [subscribed, setSubscribed] = (0, react_1.useState)(false);
36
+ const content = (siteData?.content || {});
37
+ const common = (content?.common || {});
38
+ const business = (common?.business || {});
39
+ // Auto-synchronized with Header
40
+ const siteName = String(common?.websiteTitle || common?.siteName || 'Storefront');
41
+ const logoUrl = String(common?.logoUrl || '');
42
+ const navLabels = (common?.navLabels || {});
43
+ // Footer-specific editable fields
44
+ const shortDescription = String(common?.shortDescription || 'A modern digital storefront engineered for high conversion and seamless visual editing.');
45
+ const footerHeading = String(common?.footerHeading || 'Stay Connected');
46
+ const copyright = String(common?.copyright || `© ${new Date().getFullYear()} ${siteName}. All rights reserved.`);
47
+ // Contact / business values
48
+ const phone = String(business?.phone || common?.phone || '');
49
+ const emailContact = String(business?.email || common?.email || '');
50
+ const address = String(business?.location?.address || common?.address || '');
51
+ // Route filtering
52
+ const navigationItems = links || defaultLinks;
53
+ const requiredPages = Array.isArray(siteData?.requirements?.requiredPages)
54
+ ? siteData.requirements.requiredPages
55
+ : siteData?.template?.structure?.pages || ['home', 'contact'];
56
+ const activeLinks = navigationItems.filter((item) => item.id === 'home' || requiredPages.includes(item.id));
57
+ const hasContact = requiredPages.includes('contact');
58
+ const basePathEnv = typeof process !== 'undefined' && process.env?.NEXT_PUBLIC_SITE_BASE_PATH
59
+ ? process.env.NEXT_PUBLIC_SITE_BASE_PATH
60
+ : '';
61
+ const effectiveBasePath = basePath || basePathEnv;
62
+ const navigate = (path) => {
63
+ if (typeof window !== 'undefined') {
64
+ const cleanBase = effectiveBasePath.replace(/\/$/, '');
65
+ const cleanPath = path.startsWith('/') ? path : `/${path}`;
66
+ window.location.href = `${cleanBase}${cleanPath}` || '/';
67
+ }
68
+ };
69
+ const withBase = (path) => {
70
+ if (!path || /^(?:[a-z][a-z0-9+.-]*:|\/\/|#)/i.test(path))
71
+ return path;
72
+ const cleanBase = effectiveBasePath.replace(/\/$/, '');
73
+ const cleanPath = path.startsWith('/') ? path : `/${path}`;
74
+ return `${cleanBase}${cleanPath}` || '/';
75
+ };
76
+ const handleSubscribe = (e) => {
77
+ e.preventDefault();
78
+ if (email.trim()) {
79
+ setSubscribed(true);
80
+ setTimeout(() => setSubscribed(false), 4000);
81
+ setEmail('');
82
+ }
83
+ };
84
+ const scrollToTop = () => {
85
+ if (typeof window !== 'undefined') {
86
+ window.scrollTo({ top: 0, behavior: 'smooth' });
87
+ }
88
+ };
89
+ return ((0, jsx_runtime_1.jsxs)("footer", { style: {
90
+ position: 'relative',
91
+ width: '100%',
92
+ backgroundColor: '#020617', // slate-950
93
+ color: '#f8fafc',
94
+ borderTop: '1px solid rgba(255, 255, 255, 0.08)',
95
+ padding: '4.5rem 1.5rem 2rem',
96
+ ...style,
97
+ }, className: `deneb-footer relative w-full border-t border-slate-800/80 bg-slate-950 text-slate-100 ${className}`.trim(), ...props, children: [(0, jsx_runtime_1.jsx)("div", { style: {
98
+ position: 'absolute',
99
+ top: 0,
100
+ left: '10%',
101
+ right: '10%',
102
+ height: '1px',
103
+ background: 'linear-gradient(90deg, transparent, rgba(99, 102, 241, 0.4), transparent)',
104
+ }, className: "pointer-events-none absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-indigo-500/40 to-transparent" }), (0, jsx_runtime_1.jsxs)("div", { style: {
105
+ maxWidth: '1280px',
106
+ margin: '0 auto',
107
+ }, className: "max-w-7xl mx-auto", children: [(0, jsx_runtime_1.jsxs)("div", { style: {
108
+ display: 'grid',
109
+ gridTemplateColumns: 'repeat(auto-fit, minmax(240px, 1fr))',
110
+ gap: '3rem',
111
+ marginBottom: '4rem',
112
+ }, className: "grid grid-cols-1 gap-10 md:grid-cols-2 lg:grid-cols-4 lg:gap-8 mb-16", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-4", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", "data-preview-static": "footer-brand-link", onClick: () => navigate('/'), style: {
113
+ display: 'inline-flex',
114
+ alignItems: 'center',
115
+ gap: '0.75rem',
116
+ background: 'transparent',
117
+ border: 0,
118
+ padding: 0,
119
+ cursor: 'pointer',
120
+ textAlign: 'left',
121
+ }, className: "inline-flex items-center gap-3 group border-0 bg-transparent p-0 cursor-pointer", children: [(0, jsx_runtime_1.jsx)("img", { src: withBase(logoUrl || '/placeholder.svg'), alt: siteName, "data-preview-static": "footer-brand-logo", style: {
122
+ height: '32px',
123
+ width: 'auto',
124
+ maxWidth: '120px',
125
+ objectFit: 'contain',
126
+ borderRadius: '6px',
127
+ filter: 'brightness(1.1)',
128
+ }, className: "h-8 w-auto max-w-[120px] object-contain rounded-md group-hover:scale-105 transition-transform" }), (0, jsx_runtime_1.jsx)("span", { "data-preview-static": "footer-brand-title", style: {
129
+ fontSize: '1.25rem',
130
+ fontWeight: 700,
131
+ letterSpacing: '-0.025em',
132
+ color: '#ffffff',
133
+ }, className: "text-xl font-bold tracking-tight text-white", children: siteName })] }), (0, jsx_runtime_1.jsx)("p", { "data-preview-field-path": "common.shortDescription", style: {
134
+ fontSize: '0.875rem',
135
+ lineHeight: 1.6,
136
+ color: '#94a3b8', // slate-400
137
+ margin: 0,
138
+ maxWidth: '320px',
139
+ }, className: "text-sm text-slate-400 leading-relaxed max-w-sm mt-1", children: shortDescription }), (0, jsx_runtime_1.jsxs)("div", { style: {
140
+ display: 'flex',
141
+ alignItems: 'center',
142
+ gap: '0.625rem',
143
+ marginTop: '0.75rem',
144
+ }, className: "flex items-center gap-2.5 mt-3", children: [(0, jsx_runtime_1.jsx)("a", { href: "https://twitter.com", target: "_blank", rel: "noreferrer", "data-preview-static": "social-twitter", "aria-label": "Twitter", style: {
145
+ width: '34px',
146
+ height: '34px',
147
+ borderRadius: '8px',
148
+ backgroundColor: 'rgba(255, 255, 255, 0.05)',
149
+ border: '1px solid rgba(255, 255, 255, 0.1)',
150
+ display: 'flex',
151
+ alignItems: 'center',
152
+ justifyContent: 'center',
153
+ color: '#94a3b8',
154
+ textDecoration: 'none',
155
+ transition: 'all 0.15s ease',
156
+ }, className: "w-8 h-8 rounded-lg bg-slate-900 border border-slate-800 flex items-center justify-center text-slate-400 hover:text-white hover:border-slate-700 hover:bg-slate-800 transition-all", children: (0, jsx_runtime_1.jsx)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { d: "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" }) }) }), (0, jsx_runtime_1.jsx)("a", { href: "https://github.com", target: "_blank", rel: "noreferrer", "data-preview-static": "social-github", "aria-label": "GitHub", style: {
157
+ width: '34px',
158
+ height: '34px',
159
+ borderRadius: '8px',
160
+ backgroundColor: 'rgba(255, 255, 255, 0.05)',
161
+ border: '1px solid rgba(255, 255, 255, 0.1)',
162
+ display: 'flex',
163
+ alignItems: 'center',
164
+ justifyContent: 'center',
165
+ color: '#94a3b8',
166
+ textDecoration: 'none',
167
+ transition: 'all 0.15s ease',
168
+ }, className: "w-8 h-8 rounded-lg bg-slate-900 border border-slate-800 flex items-center justify-center text-slate-400 hover:text-white hover:border-slate-700 hover:bg-slate-800 transition-all", children: (0, jsx_runtime_1.jsx)("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { d: "M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" }) }) }), (0, jsx_runtime_1.jsx)("a", { href: "https://linkedin.com", target: "_blank", rel: "noreferrer", "data-preview-static": "social-linkedin", "aria-label": "LinkedIn", style: {
169
+ width: '34px',
170
+ height: '34px',
171
+ borderRadius: '8px',
172
+ backgroundColor: 'rgba(255, 255, 255, 0.05)',
173
+ border: '1px solid rgba(255, 255, 255, 0.1)',
174
+ display: 'flex',
175
+ alignItems: 'center',
176
+ justifyContent: 'center',
177
+ color: '#94a3b8',
178
+ textDecoration: 'none',
179
+ transition: 'all 0.15s ease',
180
+ }, className: "w-8 h-8 rounded-lg bg-slate-900 border border-slate-800 flex items-center justify-center text-slate-400 hover:text-white hover:border-slate-700 hover:bg-slate-800 transition-all", children: (0, jsx_runtime_1.jsx)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { d: "M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z" }) }) })] })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h4", { "data-preview-static": "footer-explore-heading", style: {
181
+ fontSize: '0.8125rem',
182
+ fontWeight: 700,
183
+ textTransform: 'uppercase',
184
+ letterSpacing: '0.08em',
185
+ color: '#f1f5f9',
186
+ marginBottom: '1.25rem',
187
+ }, className: "text-xs font-bold uppercase tracking-wider text-slate-200 mb-5", children: "Explore" }), (0, jsx_runtime_1.jsx)("ul", { style: {
188
+ listStyle: 'none',
189
+ padding: 0,
190
+ margin: 0,
191
+ display: 'flex',
192
+ flexDirection: 'column',
193
+ gap: '0.75rem',
194
+ }, className: "flex flex-col gap-3", children: navigationItems.map((link) => {
195
+ const isSelected = activeLinks.some((al) => al.id === link.id);
196
+ // Synchronized in real-time with Header navLabels!
197
+ const label = navLabels[link.id] || link.label;
198
+ if (isSelected) {
199
+ return ((0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsx)("span", { "data-target-page": link.id, children: (0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: () => navigate(link.route), style: {
200
+ color: '#94a3b8',
201
+ fontSize: '0.875rem',
202
+ display: 'inline-flex',
203
+ alignItems: 'center',
204
+ gap: '0.5rem',
205
+ background: 'transparent',
206
+ border: 0,
207
+ padding: 0,
208
+ cursor: 'pointer',
209
+ transition: 'color 0.15s ease',
210
+ }, className: "text-sm text-slate-400 hover:text-white transition-colors duration-150 inline-flex items-center gap-2 group cursor-pointer border-0 bg-transparent p-0", children: [(0, jsx_runtime_1.jsx)("span", { "data-preview-static": "nav-bullet", style: {
211
+ width: '5px',
212
+ height: '5px',
213
+ borderRadius: '9999px',
214
+ backgroundColor: '#475569',
215
+ }, className: "w-1.5 h-1.5 rounded-full bg-slate-600 group-hover:bg-indigo-400 group-hover:scale-125 transition-all duration-200" }), (0, jsx_runtime_1.jsx)("span", { "data-preview-field-path": `common.navLabels.${link.id}`, children: label })] }) }) }, link.id));
216
+ }
217
+ // Unselected route marker fallback (visible for strict schema coverage without route link)
218
+ return ((0, jsx_runtime_1.jsx)("li", { className: "unavailable", children: (0, jsx_runtime_1.jsx)("span", { "data-target-page": link.id, children: (0, jsx_runtime_1.jsx)("span", { "data-preview-field-path": `common.navLabels.${link.id}`, children: label }) }) }, link.id));
219
+ }) })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h4", { "data-preview-static": "footer-contact-heading", style: {
220
+ fontSize: '0.8125rem',
221
+ fontWeight: 700,
222
+ textTransform: 'uppercase',
223
+ letterSpacing: '0.08em',
224
+ color: '#f1f5f9',
225
+ marginBottom: '1.25rem',
226
+ }, className: "text-xs font-bold uppercase tracking-wider text-slate-200 mb-5", children: "Contact & Support" }), (0, jsx_runtime_1.jsxs)("div", { style: {
227
+ display: 'flex',
228
+ flexDirection: 'column',
229
+ gap: '0.875rem',
230
+ fontSize: '0.875rem',
231
+ color: '#94a3b8',
232
+ }, className: "flex flex-col gap-3.5 text-sm text-slate-400", children: [emailContact && ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: [(0, jsx_runtime_1.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-slate-500", children: [(0, jsx_runtime_1.jsx)("rect", { width: "20", height: "16", x: "2", y: "4", rx: "2" }), (0, jsx_runtime_1.jsx)("path", { d: "m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" })] }), (0, jsx_runtime_1.jsx)("a", { href: `mailto:${emailContact}`, "data-preview-static": "contact-email", className: "hover:text-white transition-colors", style: { color: 'inherit', textDecoration: 'none' }, children: emailContact })] })), phone && ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: [(0, jsx_runtime_1.jsx)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-slate-500", children: (0, jsx_runtime_1.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" }) }), (0, jsx_runtime_1.jsx)("a", { href: `tel:${phone}`, "data-preview-static": "contact-phone", className: "hover:text-white transition-colors", style: { color: 'inherit', textDecoration: 'none' }, children: phone })] })), address && ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', alignItems: 'flex-start', gap: '0.5rem' }, children: [(0, jsx_runtime_1.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-slate-500 mt-0.5", children: [(0, jsx_runtime_1.jsx)("path", { d: "M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z" }), (0, jsx_runtime_1.jsx)("circle", { cx: "12", cy: "10", r: "3" })] }), (0, jsx_runtime_1.jsx)("span", { "data-preview-static": "contact-address", children: address })] })), hasContact && ((0, jsx_runtime_1.jsx)("div", { style: { marginTop: '0.5rem' }, children: (0, jsx_runtime_1.jsx)("span", { "data-target-page": "contact", children: (0, jsx_runtime_1.jsxs)("button", { type: "button", "data-preview-static": "contact-cta-btn", onClick: () => navigate('/contact'), style: {
233
+ display: 'inline-flex',
234
+ alignItems: 'center',
235
+ gap: '0.375rem',
236
+ fontSize: '0.8125rem',
237
+ fontWeight: 600,
238
+ color: '#818cf8', // indigo-400
239
+ background: 'transparent',
240
+ border: 0,
241
+ padding: 0,
242
+ cursor: 'pointer',
243
+ transition: 'color 0.15s ease',
244
+ }, className: "inline-flex items-center gap-1.5 text-xs font-semibold text-indigo-400 hover:text-indigo-300 transition-colors border-0 bg-transparent p-0 cursor-pointer", children: ["Send us a direct message", (0, jsx_runtime_1.jsx)("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: (0, jsx_runtime_1.jsx)("path", { d: "M5 12h14M12 5l7 7-7 7" }) })] }) }) }))] })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h4", { "data-preview-field-path": "common.footerHeading", style: {
245
+ fontSize: '0.8125rem',
246
+ fontWeight: 700,
247
+ textTransform: 'uppercase',
248
+ letterSpacing: '0.08em',
249
+ color: '#f1f5f9',
250
+ marginBottom: '1rem',
251
+ }, className: "text-xs font-bold uppercase tracking-wider text-slate-200 mb-4", children: footerHeading }), showNewsletter && ((0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-3", children: [(0, jsx_runtime_1.jsx)("p", { "data-preview-static": "newsletter-description", style: {
252
+ fontSize: '0.8125rem',
253
+ color: '#94a3b8',
254
+ lineHeight: 1.5,
255
+ margin: 0,
256
+ }, className: "text-xs text-slate-400 leading-relaxed", children: "Join our exclusive community for releases, updates, and special perks." }), subscribed ? ((0, jsx_runtime_1.jsx)("p", { "data-preview-static": "newsletter-success", style: {
257
+ padding: '0.625rem 0.875rem',
258
+ borderRadius: '8px',
259
+ backgroundColor: 'rgba(34, 197, 94, 0.12)',
260
+ border: '1px solid rgba(34, 197, 94, 0.3)',
261
+ color: '#4ade80',
262
+ fontSize: '0.8125rem',
263
+ fontWeight: 500,
264
+ }, className: "p-2.5 rounded-lg bg-emerald-950/40 border border-emerald-500/30 text-emerald-400 text-xs font-medium", children: "\u2713 Thank you for subscribing!" })) : ((0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubscribe, style: {
265
+ display: 'flex',
266
+ flexDirection: 'column',
267
+ gap: '0.5rem',
268
+ }, className: "flex flex-col gap-2", children: [(0, jsx_runtime_1.jsx)("div", { style: {
269
+ display: 'flex',
270
+ alignItems: 'center',
271
+ position: 'relative',
272
+ }, children: (0, jsx_runtime_1.jsx)("input", { type: "email", required: true, "data-preview-static": "newsletter-input", placeholder: "Enter your email", value: email, onChange: (e) => setEmail(e.target.value), style: {
273
+ width: '100%',
274
+ backgroundColor: '#0f172a', // slate-900
275
+ border: '1px solid #1e293b', // slate-800
276
+ borderRadius: '8px',
277
+ padding: '0.5rem 0.75rem',
278
+ fontSize: '0.8125rem',
279
+ color: '#ffffff',
280
+ outline: 'none',
281
+ }, className: "w-full bg-slate-900 border border-slate-800 rounded-lg px-3 py-2 text-xs text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-all" }) }), (0, jsx_runtime_1.jsxs)("button", { type: "submit", "data-preview-static": "newsletter-btn", style: {
282
+ backgroundColor: '#ffffff',
283
+ color: '#0f172a',
284
+ border: 'none',
285
+ borderRadius: '8px',
286
+ padding: '0.5rem 0.875rem',
287
+ fontSize: '0.8125rem',
288
+ fontWeight: 600,
289
+ cursor: 'pointer',
290
+ transition: 'background-color 0.15s ease',
291
+ }, className: "bg-white text-slate-900 hover:bg-slate-200 rounded-lg px-3.5 py-2 text-xs font-semibold transition-colors flex items-center justify-center gap-1.5 shadow-sm", children: ["Subscribe", (0, jsx_runtime_1.jsx)("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: (0, jsx_runtime_1.jsx)("path", { d: "M5 12h14M12 5l7 7-7 7" }) })] })] }))] }))] })] }), (0, jsx_runtime_1.jsxs)("div", { style: {
292
+ paddingTop: '2rem',
293
+ borderTop: '1px solid rgba(255, 255, 255, 0.08)',
294
+ display: 'flex',
295
+ justifyContent: 'space-between',
296
+ alignItems: 'center',
297
+ flexWrap: 'wrap',
298
+ gap: '1.25rem',
299
+ }, className: "pt-8 border-t border-slate-800/80 flex flex-col sm:flex-row justify-between items-center gap-4 text-xs text-slate-400", children: [(0, jsx_runtime_1.jsx)("p", { "data-preview-field-path": "common.copyright", style: { fontSize: '0.8125rem', color: '#64748b', margin: 0 }, className: "text-xs text-slate-500", children: copyright }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', alignItems: 'center', gap: '1.25rem' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
300
+ display: 'inline-flex',
301
+ alignItems: 'center',
302
+ gap: '0.375rem',
303
+ fontSize: '0.75rem',
304
+ color: '#64748b',
305
+ }, className: "flex items-center gap-1.5 text-xs text-slate-500", children: [(0, jsx_runtime_1.jsx)("span", { "data-preview-static": "powered-by-label", children: "Powered by" }), (0, jsx_runtime_1.jsxs)("span", { "data-preview-static": "powered-by-brand", style: {
306
+ display: 'inline-flex',
307
+ alignItems: 'center',
308
+ gap: '0.25rem',
309
+ fontWeight: 600,
310
+ color: '#e2e8f0',
311
+ backgroundColor: '#0f172a',
312
+ border: '1px solid #1e293b',
313
+ padding: '0.15rem 0.5rem',
314
+ borderRadius: '6px',
315
+ letterSpacing: '0.025em',
316
+ }, className: "inline-flex items-center gap-1 font-semibold text-slate-200 bg-slate-900 border border-slate-800 px-2 py-0.5 rounded-md text-xs shadow-inner", children: [(0, jsx_runtime_1.jsx)("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "currentColor", className: "text-indigo-400", children: (0, jsx_runtime_1.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" }) }), "DENEB UI"] })] }), (0, jsx_runtime_1.jsx)("button", { type: "button", "data-preview-static": "back-to-top", onClick: scrollToTop, "aria-label": "Back to top", style: {
317
+ display: 'inline-flex',
318
+ alignItems: 'center',
319
+ justifyContent: 'center',
320
+ width: '32px',
321
+ height: '32px',
322
+ borderRadius: '8px',
323
+ backgroundColor: '#0f172a',
324
+ border: '1px solid #1e293b',
325
+ color: '#94a3b8',
326
+ cursor: 'pointer',
327
+ transition: 'all 0.15s ease',
328
+ }, className: "w-8 h-8 rounded-lg bg-slate-900 border border-slate-800 flex items-center justify-center text-slate-400 hover:text-white hover:border-slate-700 hover:bg-slate-800 transition-colors", children: (0, jsx_runtime_1.jsx)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: (0, jsx_runtime_1.jsx)("path", { d: "m18 15-6-6-6 6" }) }) })] })] })] })] }));
329
+ }
330
+ exports.Footer = EditableFooter;
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ export type GridSpacing = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | (string & {}) | number;
3
+ export interface ResponsiveColumns {
4
+ mobile?: number;
5
+ tablet?: number;
6
+ desktop?: number;
7
+ }
8
+ export interface EditableGridProps extends React.HTMLAttributes<HTMLElement> {
9
+ as?: React.ElementType;
10
+ id?: string;
11
+ 'data-preview-list-path'?: string;
12
+ 'data-preview-static'?: string;
13
+ /**
14
+ * Minimum width of each card in the grid (e.g. '280px', '320px').
15
+ * When set, automatically creates a dynamic auto-balancing layout (`repeat(auto-fit, minmax(minCardWidth, 1fr))`)
16
+ * where cards seamlessly reflow and expand to fill all remaining row space.
17
+ */
18
+ minCardWidth?: string;
19
+ /**
20
+ * Fixed column count or responsive columns config.
21
+ */
22
+ columns?: number | ResponsiveColumns;
23
+ /**
24
+ * Gap between cards in the grid ('xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' or custom CSS).
25
+ */
26
+ gap?: GridSpacing;
27
+ /**
28
+ * Force all cards in a row to have matching heights (default: true).
29
+ */
30
+ equalHeight?: boolean;
31
+ /**
32
+ * Align items inside the grid cells.
33
+ */
34
+ align?: 'start' | 'center' | 'end' | 'stretch';
35
+ }
36
+ /**
37
+ * EditableGrid provides an auto-balancing card layout that automatically adjusts
38
+ * card widths and fills available horizontal space evenly across mobile and desktop.
39
+ */
40
+ export declare function EditableGrid({ as: Component, id, 'data-preview-list-path': previewListPath, 'data-preview-static': previewStatic, minCardWidth, columns, gap, equalHeight, align, style, className, children, ...props }: EditableGridProps): React.JSX.Element;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditableGrid = EditableGrid;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const SPACING_MAP = {
6
+ none: '0',
7
+ xs: '0.5rem',
8
+ sm: '0.75rem',
9
+ md: '1.25rem',
10
+ lg: '2rem',
11
+ xl: '2.5rem',
12
+ '2xl': '3.5rem',
13
+ };
14
+ /**
15
+ * EditableGrid provides an auto-balancing card layout that automatically adjusts
16
+ * card widths and fills available horizontal space evenly across mobile and desktop.
17
+ */
18
+ function EditableGrid({ as: Component = 'div', id, 'data-preview-list-path': previewListPath, 'data-preview-static': previewStatic, minCardWidth = '280px', columns, gap = 'md', equalHeight = true, align = 'stretch', style, className = '', children, ...props }) {
19
+ const resolvedGap = gap !== undefined ? (SPACING_MAP[String(gap)] || String(gap)) : '1.25rem';
20
+ let templateCols;
21
+ if (typeof columns === 'number') {
22
+ templateCols = `repeat(${columns}, minmax(0, 1fr))`;
23
+ }
24
+ else if (columns && typeof columns === 'object') {
25
+ templateCols = `repeat(auto-fit, minmax(${minCardWidth}, 1fr))`;
26
+ }
27
+ else {
28
+ // Default auto-balancing formula
29
+ templateCols = `repeat(auto-fit, minmax(${minCardWidth}, 1fr))`;
30
+ }
31
+ const gridStyle = {
32
+ display: 'grid',
33
+ gridTemplateColumns: templateCols,
34
+ gap: resolvedGap,
35
+ alignItems: equalHeight ? 'stretch' : align,
36
+ ...style,
37
+ };
38
+ return ((0, jsx_runtime_1.jsx)(Component, { "data-preview-list-path": previewListPath || id, className: `editable-grid ${className}`.trim(), style: gridStyle, ...props, children: children }));
39
+ }
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ export interface EditableHeroCenteredProps extends React.HTMLAttributes<HTMLElement> {
3
+ pageKey?: string;
4
+ badgePath?: string;
5
+ titlePath?: string;
6
+ summaryPath?: string;
7
+ imagePath?: string;
8
+ primaryCtaPath?: string;
9
+ secondaryCtaPath?: string;
10
+ primaryCtaTarget?: string;
11
+ secondaryCtaTarget?: string;
12
+ basePath?: string;
13
+ }
14
+ export declare function EditableHeroCentered({ pageKey, badgePath, titlePath, summaryPath, imagePath, primaryCtaPath, secondaryCtaPath, primaryCtaTarget, secondaryCtaTarget, basePath, className, style, ...props }: EditableHeroCenteredProps): React.JSX.Element;
15
+ export interface EditableHeroSplitProps extends React.HTMLAttributes<HTMLElement> {
16
+ pageKey?: string;
17
+ badgePath?: string;
18
+ titlePath?: string;
19
+ summaryPath?: string;
20
+ imagePath?: string;
21
+ primaryCtaPath?: string;
22
+ primaryCtaTarget?: string;
23
+ basePath?: string;
24
+ }
25
+ export declare function EditableHeroSplit({ pageKey, badgePath, titlePath, summaryPath, imagePath, primaryCtaPath, primaryCtaTarget, basePath, className, style, ...props }: EditableHeroSplitProps): React.JSX.Element;
26
+ export declare const Hero: typeof EditableHeroCentered;
27
+ export declare const HeroSplit: typeof EditableHeroSplit;
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.HeroSplit = exports.Hero = void 0;
5
+ exports.EditableHeroCentered = EditableHeroCentered;
6
+ exports.EditableHeroSplit = EditableHeroSplit;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const SiteDataProvider_1 = require("./SiteDataProvider");
9
+ const EditableText_1 = require("./EditableText");
10
+ const EditableImage_1 = require("./EditableImage");
11
+ function EditableHeroCentered({ pageKey = 'home', badgePath = 'home.heroEyebrow', titlePath = 'home.heroTitle', summaryPath = 'home.heroSummary', imagePath = 'home.bannerImageUrl', primaryCtaPath = 'home.primaryCtaLabel', secondaryCtaPath = 'home.secondaryCtaLabel', primaryCtaTarget = 'contact', secondaryCtaTarget = 'services', basePath = '', className = '', style, ...props }) {
12
+ const siteData = (0, SiteDataProvider_1.useSiteData)();
13
+ const content = siteData?.content?.[pageKey] || {};
14
+ const badge = String(content?.heroEyebrow || content?.heroBadge || '');
15
+ const title = String(content?.heroTitle || 'Engineered for Modern Living');
16
+ const summary = String(content?.heroSummary || content?.heroSubtitle || 'Discover our curated collection crafted with meticulous detail.');
17
+ const imageUrl = String(content?.bannerImageUrl || content?.heroImage || '');
18
+ const primaryCta = String(content?.primaryCtaLabel || content?.heroCtaText || 'Get Started');
19
+ const secondaryCta = String(content?.secondaryCtaLabel || 'Explore Services');
20
+ const requiredPages = Array.isArray(siteData?.requirements?.requiredPages)
21
+ ? siteData.requirements.requiredPages
22
+ : siteData?.template?.structure?.pages || ['home', 'contact'];
23
+ const hasPrimaryTarget = requiredPages.includes(primaryCtaTarget);
24
+ const hasSecondaryTarget = requiredPages.includes(secondaryCtaTarget);
25
+ const basePathEnv = typeof process !== 'undefined' && process.env?.NEXT_PUBLIC_SITE_BASE_PATH
26
+ ? process.env.NEXT_PUBLIC_SITE_BASE_PATH
27
+ : '';
28
+ const effectiveBasePath = basePath || basePathEnv;
29
+ const navigate = (path) => {
30
+ if (typeof window !== 'undefined') {
31
+ const cleanBase = effectiveBasePath.replace(/\/$/, '');
32
+ const cleanPath = path.startsWith('/') ? path : `/${path}`;
33
+ window.location.href = `${cleanBase}${cleanPath}` || '/';
34
+ }
35
+ };
36
+ return ((0, jsx_runtime_1.jsx)("section", { "data-design-section": "hero", style: {
37
+ padding: '5rem 1.5rem',
38
+ textAlign: 'center',
39
+ position: 'relative',
40
+ overflow: 'hidden',
41
+ ...style,
42
+ }, className: `editable-hero-centered ${className}`.trim(), ...props, children: (0, jsx_runtime_1.jsxs)("div", { style: { maxWidth: '896px', margin: '0 auto' }, children: [(0, jsx_runtime_1.jsx)("div", { style: { marginBottom: '1.25rem', display: 'inline-block' }, children: (0, jsx_runtime_1.jsx)(EditableText_1.EditableBadge, { id: badgePath, defaultValue: badge, badgeVariant: "primary" }) }), (0, jsx_runtime_1.jsx)(EditableText_1.EditableHeading, { level: 1, id: titlePath, defaultValue: title, style: {
43
+ fontSize: 'clamp(2.5rem, 6vw, 4.5rem)',
44
+ fontWeight: 800,
45
+ letterSpacing: '-0.035em',
46
+ lineHeight: 1.1,
47
+ color: 'var(--heading-color, #0f172a)',
48
+ marginBottom: '1.5rem',
49
+ } }), (0, jsx_runtime_1.jsx)(EditableText_1.EditableParagraph, { lead: true, id: summaryPath, defaultValue: summary, style: {
50
+ fontSize: '1.2rem',
51
+ lineHeight: 1.6,
52
+ color: 'var(--muted-text, #64748b)',
53
+ maxWidth: '680px',
54
+ margin: '0 auto 2.5rem',
55
+ } }), (0, jsx_runtime_1.jsxs)("div", { style: {
56
+ display: 'flex',
57
+ alignItems: 'center',
58
+ justifyContent: 'center',
59
+ gap: '1rem',
60
+ flexWrap: 'wrap',
61
+ marginBottom: '3.5rem',
62
+ }, children: [hasPrimaryTarget ? ((0, jsx_runtime_1.jsx)("span", { "data-target-page": primaryCtaTarget, children: (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => navigate(primaryCtaTarget), style: {
63
+ display: 'inline-block',
64
+ padding: '0.875rem 2rem',
65
+ borderRadius: '12px',
66
+ backgroundColor: 'var(--brand-color, #2563eb)',
67
+ color: '#ffffff',
68
+ fontSize: '1rem',
69
+ fontWeight: 600,
70
+ border: 0,
71
+ cursor: 'pointer',
72
+ boxShadow: '0 4px 14px rgba(37, 99, 235, 0.35)',
73
+ transition: 'opacity 0.2s ease',
74
+ }, children: (0, jsx_runtime_1.jsx)("span", { "data-preview-field-path": primaryCtaPath, children: primaryCta }) }) })) : ((0, jsx_runtime_1.jsx)("span", { "data-target-page": primaryCtaTarget, className: "button-primary unavailable", "data-preview-field-path": primaryCtaPath, children: primaryCta })), hasSecondaryTarget ? ((0, jsx_runtime_1.jsx)("span", { "data-target-page": secondaryCtaTarget, children: (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => navigate(secondaryCtaTarget), style: {
75
+ display: 'inline-block',
76
+ padding: '0.875rem 2rem',
77
+ borderRadius: '12px',
78
+ backgroundColor: '#ffffff',
79
+ color: 'var(--page-text, #0f172a)',
80
+ border: '1.5px solid #cbd5e1',
81
+ fontSize: '1rem',
82
+ fontWeight: 600,
83
+ cursor: 'pointer',
84
+ transition: 'background-color 0.2s ease',
85
+ }, children: (0, jsx_runtime_1.jsx)("span", { "data-preview-field-path": secondaryCtaPath, children: secondaryCta }) }) })) : ((0, jsx_runtime_1.jsx)("span", { "data-target-page": secondaryCtaTarget, className: "button-secondary unavailable", "data-preview-field-path": secondaryCtaPath, children: secondaryCta }))] }), (0, jsx_runtime_1.jsx)("div", { style: {
86
+ borderRadius: '20px',
87
+ overflow: 'hidden',
88
+ boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.15)',
89
+ border: '1px solid rgba(226, 232, 240, 0.8)',
90
+ }, children: (0, jsx_runtime_1.jsx)(EditableImage_1.EditableImage, { id: imagePath, src: imageUrl, alt: title, aspectRatio: "16/9", style: { width: '100%', height: 'auto', display: 'block' } }) })] }) }));
91
+ }
92
+ function EditableHeroSplit({ pageKey = 'home', badgePath = 'home.heroEyebrow', titlePath = 'home.heroTitle', summaryPath = 'home.heroSummary', imagePath = 'home.bannerImageUrl', primaryCtaPath = 'home.primaryCtaLabel', primaryCtaTarget = 'contact', basePath = '', className = '', style, ...props }) {
93
+ const siteData = (0, SiteDataProvider_1.useSiteData)();
94
+ const content = siteData?.content?.[pageKey] || {};
95
+ const badge = String(content?.heroEyebrow || content?.heroBadge || '');
96
+ const title = String(content?.heroTitle || 'Engineered for Modern Living');
97
+ const summary = String(content?.heroSummary || content?.heroSubtitle || 'Discover our curated collection crafted with meticulous detail.');
98
+ const imageUrl = String(content?.bannerImageUrl || content?.heroImage || '');
99
+ const primaryCta = String(content?.primaryCtaLabel || content?.heroCtaText || 'Get Started');
100
+ const requiredPages = Array.isArray(siteData?.requirements?.requiredPages)
101
+ ? siteData.requirements.requiredPages
102
+ : siteData?.template?.structure?.pages || ['home', 'contact'];
103
+ const hasPrimaryTarget = requiredPages.includes(primaryCtaTarget);
104
+ const basePathEnv = typeof process !== 'undefined' && process.env?.NEXT_PUBLIC_SITE_BASE_PATH
105
+ ? process.env.NEXT_PUBLIC_SITE_BASE_PATH
106
+ : '';
107
+ const effectiveBasePath = basePath || basePathEnv;
108
+ const navigate = (path) => {
109
+ if (typeof window !== 'undefined') {
110
+ const cleanBase = effectiveBasePath.replace(/\/$/, '');
111
+ const cleanPath = path.startsWith('/') ? path : `/${path}`;
112
+ window.location.href = `${cleanBase}${cleanPath}` || '/';
113
+ }
114
+ };
115
+ return ((0, jsx_runtime_1.jsxs)("section", { "data-design-section": "hero", style: {
116
+ padding: '5rem 1.5rem',
117
+ display: 'grid',
118
+ gridTemplateColumns: 'repeat(auto-fit, minmax(320px, 1fr))',
119
+ alignItems: 'center',
120
+ gap: '4rem',
121
+ ...style,
122
+ }, className: `editable-hero-split ${className}`.trim(), ...props, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { style: { marginBottom: '1rem' }, children: (0, jsx_runtime_1.jsx)(EditableText_1.EditableBadge, { id: badgePath, defaultValue: badge, badgeVariant: "primary" }) }), (0, jsx_runtime_1.jsx)(EditableText_1.EditableHeading, { level: 1, id: titlePath, defaultValue: title, style: {
123
+ fontSize: 'clamp(2.25rem, 5vw, 3.75rem)',
124
+ fontWeight: 800,
125
+ letterSpacing: '-0.03em',
126
+ lineHeight: 1.15,
127
+ color: 'var(--heading-color, #0f172a)',
128
+ marginBottom: '1.25rem',
129
+ } }), (0, jsx_runtime_1.jsx)(EditableText_1.EditableParagraph, { lead: true, id: summaryPath, defaultValue: summary, style: {
130
+ fontSize: '1.125rem',
131
+ lineHeight: 1.6,
132
+ color: 'var(--muted-text, #64748b)',
133
+ marginBottom: '2rem',
134
+ } }), hasPrimaryTarget ? ((0, jsx_runtime_1.jsx)("span", { "data-target-page": primaryCtaTarget, children: (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => navigate(primaryCtaTarget), style: {
135
+ display: 'inline-block',
136
+ padding: '0.875rem 2rem',
137
+ borderRadius: '12px',
138
+ backgroundColor: 'var(--brand-color, #2563eb)',
139
+ color: '#ffffff',
140
+ fontSize: '1rem',
141
+ fontWeight: 600,
142
+ border: 0,
143
+ cursor: 'pointer',
144
+ boxShadow: '0 4px 14px rgba(37, 99, 235, 0.35)',
145
+ transition: 'opacity 0.2s ease',
146
+ }, children: (0, jsx_runtime_1.jsx)("span", { "data-preview-field-path": primaryCtaPath, children: primaryCta }) }) })) : ((0, jsx_runtime_1.jsx)("span", { "data-target-page": primaryCtaTarget, className: "button-primary unavailable", "data-preview-field-path": primaryCtaPath, children: primaryCta }))] }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { style: {
147
+ borderRadius: '24px',
148
+ overflow: 'hidden',
149
+ boxShadow: '0 20px 40px -15px rgba(0, 0, 0, 0.12)',
150
+ border: '1px solid rgba(226, 232, 240, 0.8)',
151
+ }, children: (0, jsx_runtime_1.jsx)(EditableImage_1.EditableImage, { id: imagePath, src: imageUrl, alt: title, aspectRatio: "4/3", style: { width: '100%', height: 'auto', display: 'block' } }) }) })] }));
152
+ }
153
+ exports.Hero = EditableHeroCentered;
154
+ exports.HeroSplit = EditableHeroSplit;