@commercetools-demo/puck-components 0.8.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.
package/dist/index.mjs ADDED
@@ -0,0 +1,2476 @@
1
+ // src/intl/en.json
2
+ var en_default = {
3
+ "Editor.loadingEditor": "Loading editor\u2026",
4
+ "Editor.errorLoadingPage": "Error loading page:",
5
+ "Editor.toggleComponentsPanel": "Toggle components panel",
6
+ "Editor.togglePropertiesPanel": "Toggle properties panel",
7
+ "Editor.undo": "Undo",
8
+ "Editor.redo": "Redo",
9
+ "Editor.badgeSaving": "Saving\u2026",
10
+ "Editor.badgeUnsaved": "Unsaved",
11
+ "Editor.badgeDraft": "Draft",
12
+ "Editor.badgePublished": "Published",
13
+ "Editor.preview": "Preview",
14
+ "Editor.save": "Save",
15
+ "Editor.publish": "Publish",
16
+ "Editor.moreOptions": "More options",
17
+ "Editor.hideVersionHistory": "Hide version history",
18
+ "Editor.versionHistory": "Version history",
19
+ "Editor.revertToPublished": "Revert to published",
20
+ "Editor.createTemplateFromPage": "Create a template from this page",
21
+ "Editor.createTemplateTitle": "Create a new template",
22
+ "Editor.nameLabel": "Name",
23
+ "Editor.nameRequired": "Name is required",
24
+ "Editor.templateNamePlaceholder": "e.g. Landing page",
25
+ "Editor.createTemplateWithoutData": "Create template without data",
26
+ "Editor.cancel": "Cancel",
27
+ "Editor.creating": "Creating\u2026",
28
+ "Editor.create": "Create",
29
+ "Editor.discardChangesTitle": "Discard unsaved changes?",
30
+ "Editor.discardChangesBody": "You have unsaved changes on this page. If you leave now, those changes will be lost.",
31
+ "Editor.stayOnPage": "Stay on page",
32
+ "Editor.leaveAndDiscard": "Leave & discard",
33
+ "Editor.showPanel": "Show {panel} panel",
34
+ "Editor.tabComponents": "Components",
35
+ "Editor.tabHistory": "History",
36
+ "Editor.searchComponents": "Search components",
37
+ "Editor.searchComponentsPlaceholder": "Search components\u2026",
38
+ "Editor.clearSearch": "Clear search",
39
+ "Editor.resizePropertiesPanel": "Resize properties panel",
40
+ "Editor.resizeComponentsPanel": "Resize components panel",
41
+ "Editor.searchProducts": "Search products",
42
+ "Editor.searchProductsPlaceholder": "Search by product name\u2026",
43
+ "Editor.productSearchResults": "Product search results",
44
+ "Editor.searching": "Searching\u2026",
45
+ "Editor.noProductsFound": "No products found",
46
+ "Editor.unnamedProduct": "(unnamed product)",
47
+ "Editor.skuLabel": "SKU: {sku}",
48
+ "Editor.noSkuOnMasterVariant": "No SKU on master variant",
49
+ "Editor.added": "Added",
50
+ "Editor.datasourceType": "Datasource type",
51
+ "Editor.datasourceProductBySku": "Product by SKU",
52
+ "Editor.datasourceProductsBySku": "Products by SKU",
53
+ "Editor.selectedProduct": "Selected product",
54
+ "Editor.selectedProducts": "Selected products",
55
+ "Editor.noProductSelectedSearch": "No product selected \u2014 search above to add one.",
56
+ "Editor.remove": "Remove",
57
+ "Editor.richTextPlaceholder": "Start typing\u2026",
58
+ "Editor.uploadAFile": "Upload a file",
59
+ "Editor.close": "Close",
60
+ "Editor.title": "Title",
61
+ "Editor.fileTitlePlaceholder": "File title",
62
+ "Editor.description": "Description",
63
+ "Editor.optionalDescriptionPlaceholder": "Optional description",
64
+ "Editor.dropToSelectFile": "Click or drag & drop to select a file",
65
+ "Editor.noFileSelected": "No file selected",
66
+ "Editor.uploading": "Uploading\u2026",
67
+ "Editor.upload": "Upload",
68
+ "Editor.selectFromMediaLibrary": "Select from Media Library",
69
+ "Editor.noFilesFound": "No files found.",
70
+ "Editor.prev": "\u2190 Prev",
71
+ "Editor.next": "Next \u2192",
72
+ "Editor.nothingSelected": "Nothing selected",
73
+ "Editor.select": "Select",
74
+ "Editor.selectedImagePreview": "Selected image preview",
75
+ "Editor.noImageSelected": "No image selected",
76
+ "Editor.mediaLibrary": "Media Library",
77
+ "Editor.loading": "Loading\u2026",
78
+ "Editor.loadingProduct": "Loading product\u2026",
79
+ "Editor.loadingProducts": "Loading products\u2026",
80
+ "Editor.errorLoadingProduct": "Error loading product",
81
+ "Editor.noProductSelected": "No product selected",
82
+ "Editor.noDescription": "No description",
83
+ "Editor.noCategoriesConfigured": "No categories configured",
84
+ "Editor.noFaqItemsConfigured": "No FAQ items configured",
85
+ "Editor.noProductsConfigured": "No products configured",
86
+ "Editor.noImage": "No image",
87
+ "Editor.noVideoUrlConfigured": "No video URL configured",
88
+ "Editor.cfg.root.field.title": "Page Title",
89
+ "Editor.cfg.root.field.backgroundColor": "Background Color",
90
+ "Editor.cfg.root.field.contentWidth": "Content Width",
91
+ "Editor.cfg.root.contentWidth.full": "Full width",
92
+ "Editor.cfg.category.layout": "Layout",
93
+ "Editor.cfg.category.text": "Text & Content",
94
+ "Editor.cfg.category.media": "Media",
95
+ "Editor.cfg.category.heroBanners": "Hero & Banners",
96
+ "Editor.cfg.category.products": "Products",
97
+ "Editor.cfg.category.actions": "Buttons & Forms",
98
+ "Editor.cfg.category.socialProof": "Social Proof & Info",
99
+ "Editor.cfg.category.sections": "Page Sections",
100
+ "Editor.cfg.category.other": "Other",
101
+ "Editor.cfg.shared.field.linkWith": "Link products by",
102
+ "Editor.cfg.shared.linkWith.slug": "Slug",
103
+ "Editor.cfg.shared.linkWith.sku": "SKU",
104
+ "Editor.cfg.shared.field.baseUrl": "Link base URL",
105
+ "Editor.cfg.fontSize.default": "Default",
106
+ "Editor.cfg.fontSize.small": "Small (0.875rem)",
107
+ "Editor.cfg.fontSize.medium": "Medium (1rem)",
108
+ "Editor.cfg.fontSize.large": "Large (1.25rem)",
109
+ "Editor.cfg.fontSize.xLarge": "X-Large (1.5rem)",
110
+ "Editor.cfg.fontSize.2xLarge": "2X-Large (2rem)",
111
+ "Editor.cfg.fontSize.3xLarge": "3X-Large (2.5rem)",
112
+ "Editor.cfg.fontSize.4xLarge": "4X-Large (3rem)",
113
+ "Editor.cfg.hero.label": "Hero",
114
+ "Editor.cfg.hero.field.heading": "Heading",
115
+ "Editor.cfg.hero.field.headingFontSize": "Heading Font Size",
116
+ "Editor.cfg.hero.field.subheading": "Subheading",
117
+ "Editor.cfg.hero.field.subheadingFontSize": "Subheading Font Size",
118
+ "Editor.cfg.hero.field.backgroundImage": "Background Image URL",
119
+ "Editor.cfg.hero.field.ctaText": "CTA Button Text",
120
+ "Editor.cfg.hero.field.ctaUrl": "CTA Button URL",
121
+ "Editor.cfg.hero.field.layout": "Layout",
122
+ "Editor.cfg.hero.layout.centered": "Centered",
123
+ "Editor.cfg.hero.layout.leftAligned": "Left Aligned",
124
+ "Editor.cfg.hero.field.minHeight": "Min Height (CSS, e.g. 400px)",
125
+ "Editor.cfg.richText.label": "Rich Text",
126
+ "Editor.cfg.richText.field.content": "Content",
127
+ "Editor.cfg.richText.field.align": "Text Alignment",
128
+ "Editor.cfg.align.left": "Left",
129
+ "Editor.cfg.align.center": "Center",
130
+ "Editor.cfg.align.right": "Right",
131
+ "Editor.cfg.richText.field.maxWidth": "Max Width (CSS)",
132
+ "Editor.cfg.richText.field.padding": "Padding (CSS)",
133
+ "Editor.cfg.grid.label": "Grid",
134
+ "Editor.cfg.grid.field.columnCount": "Number of Columns",
135
+ "Editor.cfg.grid.field.rowCount": "Number of Rows",
136
+ "Editor.cfg.grid.field.gap": "Gap (CSS)",
137
+ "Editor.cfg.grid.field.padding": "Padding (CSS)",
138
+ "Editor.cfg.columns.label": "Columns",
139
+ "Editor.cfg.columns.field.columnCount": "Number of Columns",
140
+ "Editor.cfg.columns.count.2": "2 Columns",
141
+ "Editor.cfg.columns.count.3": "3 Columns",
142
+ "Editor.cfg.columns.count.4": "4 Columns",
143
+ "Editor.cfg.columns.field.gap": "Column Gap (CSS)",
144
+ "Editor.cfg.columns.field.padding": "Padding (CSS)",
145
+ "Editor.cfg.image.label": "Image",
146
+ "Editor.cfg.image.field.src": "Image",
147
+ "Editor.cfg.image.field.alt": "Alt Text",
148
+ "Editor.cfg.image.field.caption": "Caption",
149
+ "Editor.cfg.image.field.width": "Width (CSS, e.g. 100%)",
150
+ "Editor.cfg.image.field.height": "Height (CSS, e.g. 300px)",
151
+ "Editor.cfg.image.field.objectFit": "Object Fit",
152
+ "Editor.cfg.image.objectFit.cover": "Cover",
153
+ "Editor.cfg.image.objectFit.contain": "Contain",
154
+ "Editor.cfg.image.objectFit.fill": "Fill",
155
+ "Editor.cfg.image.field.borderRadius": "Border Radius (CSS)",
156
+ "Editor.cfg.image.field.align": "Alignment",
157
+ "Editor.cfg.button.label": "Button",
158
+ "Editor.cfg.button.field.label": "Button Label",
159
+ "Editor.cfg.button.field.href": "Link URL",
160
+ "Editor.cfg.button.field.variant": "Variant",
161
+ "Editor.cfg.button.variant.primary": "Primary",
162
+ "Editor.cfg.button.variant.secondary": "Secondary",
163
+ "Editor.cfg.button.variant.outline": "Outline",
164
+ "Editor.cfg.button.field.size": "Size",
165
+ "Editor.cfg.button.size.small": "Small",
166
+ "Editor.cfg.button.size.medium": "Medium",
167
+ "Editor.cfg.button.size.large": "Large",
168
+ "Editor.cfg.button.field.fontSize": "Font Size Override",
169
+ "Editor.cfg.button.field.align": "Alignment",
170
+ "Editor.cfg.button.field.openInNewTab": "Open in New Tab",
171
+ "Editor.cfg.yesNo.yes": "Yes",
172
+ "Editor.cfg.yesNo.no": "No",
173
+ "Editor.cfg.card.label": "Card",
174
+ "Editor.cfg.card.field.title": "Title",
175
+ "Editor.cfg.card.field.titleFontSize": "Title Font Size",
176
+ "Editor.cfg.card.field.body": "Body Text",
177
+ "Editor.cfg.card.field.imageUrl": "Image URL",
178
+ "Editor.cfg.card.field.ctaText": "CTA Text",
179
+ "Editor.cfg.card.field.ctaUrl": "CTA URL",
180
+ "Editor.cfg.card.field.shadow": "Drop Shadow",
181
+ "Editor.cfg.card.field.borderRadius": "Border Radius (CSS)",
182
+ "Editor.cfg.spacer.label": "Spacer",
183
+ "Editor.cfg.spacer.field.height": "Height (CSS, e.g. 48px)",
184
+ "Editor.cfg.spacer.field.showLine": "Show Divider Line",
185
+ "Editor.cfg.spacer.field.lineColor": "Line Color",
186
+ "Editor.cfg.productTeaser.label": "Product Teaser",
187
+ "Editor.cfg.productTeaser.field.datasource": "Product Datasource",
188
+ "Editor.cfg.productTeaser.field.richText": "Rich Text",
189
+ "Editor.cfg.heroBanner.label": "Hero Banner",
190
+ "Editor.cfg.heroBanner.field.title": "Title",
191
+ "Editor.cfg.heroBanner.field.subtitle": "Subtitle",
192
+ "Editor.cfg.heroBanner.field.image": "Image",
193
+ "Editor.cfg.textBlock.label": "Text Block",
194
+ "Editor.cfg.textBlock.field.content": "Content",
195
+ "Editor.cfg.categoryGrid.label": "Category Grid",
196
+ "Editor.cfg.categoryGrid.field.image": "Category {n} Image",
197
+ "Editor.cfg.categoryGrid.field.label": "Category {n} Label",
198
+ "Editor.cfg.categoryGrid.field.link": "Category {n} Link",
199
+ "Editor.cfg.categoryHero.label": "Category Hero",
200
+ "Editor.cfg.categoryHero.field.title": "Title",
201
+ "Editor.cfg.categoryHero.field.subtitle": "Subtitle",
202
+ "Editor.cfg.categoryHero.field.image": "Background Image",
203
+ "Editor.cfg.categoryHero.field.ctaText": "CTA Text",
204
+ "Editor.cfg.categoryHero.field.ctaLink": "CTA Link",
205
+ "Editor.cfg.checkoutPromoBanner.label": "Checkout Promo Banner",
206
+ "Editor.cfg.checkoutPromoBanner.field.title": "Title",
207
+ "Editor.cfg.checkoutPromoBanner.field.message": "Message",
208
+ "Editor.cfg.checkoutPromoBanner.field.ctaText": "CTA Text",
209
+ "Editor.cfg.checkoutPromoBanner.field.ctaLink": "CTA Link",
210
+ "Editor.cfg.countdownBanner.label": "Countdown Banner",
211
+ "Editor.cfg.countdownBanner.field.headline": "Headline",
212
+ "Editor.cfg.countdownBanner.field.subline": "Subline",
213
+ "Editor.cfg.countdownBanner.field.endDate": "End Date (ISO, e.g. 2025-12-31T23:59:59)",
214
+ "Editor.cfg.countdownBanner.field.ctaText": "CTA Text",
215
+ "Editor.cfg.countdownBanner.field.ctaLink": "CTA Link",
216
+ "Editor.cfg.countdownBanner.field.background": "Background Color",
217
+ "Editor.cfg.crossSellBlock.label": "Cross-Sell Block",
218
+ "Editor.cfg.crossSellBlock.field.title": "Title",
219
+ "Editor.cfg.crossSellBlock.field.products": "Products",
220
+ "Editor.cfg.crossSellBlock.field.ctaText": "CTA Text",
221
+ "Editor.cfg.deliveryMessage.label": "Delivery Message",
222
+ "Editor.cfg.deliveryMessage.field.message": "Message (use $XX for threshold)",
223
+ "Editor.cfg.deliveryMessage.field.threshold": "Threshold Amount (e.g. 50)",
224
+ "Editor.cfg.divider.label": "Divider",
225
+ "Editor.cfg.divider.field.lineStyle": "Line Style",
226
+ "Editor.cfg.divider.lineStyle.solid": "Solid",
227
+ "Editor.cfg.divider.lineStyle.dashed": "Dashed",
228
+ "Editor.cfg.divider.lineStyle.dotted": "Dotted",
229
+ "Editor.cfg.divider.field.spacing": "Spacing (px)",
230
+ "Editor.cfg.emptyState.label": "Empty State",
231
+ "Editor.cfg.emptyState.field.image": "Image",
232
+ "Editor.cfg.emptyState.field.title": "Title",
233
+ "Editor.cfg.emptyState.field.description": "Description",
234
+ "Editor.cfg.emptyState.field.ctaText": "CTA Text",
235
+ "Editor.cfg.emptyState.field.ctaLink": "CTA Link",
236
+ "Editor.cfg.faqAccordion.label": "FAQ Accordion",
237
+ "Editor.cfg.faqAccordion.field.question": "Question {n}",
238
+ "Editor.cfg.faqAccordion.field.answer": "Answer {n}",
239
+ "Editor.cfg.footerBlock.label": "Footer Block",
240
+ "Editor.cfg.footerBlock.field.column": "Column {n}",
241
+ "Editor.cfg.footerBlock.field.copyright": "Copyright Text",
242
+ "Editor.cfg.imageBlock.label": "Image Block",
243
+ "Editor.cfg.imageBlock.field.image": "Image",
244
+ "Editor.cfg.imageBlock.field.caption": "Caption",
245
+ "Editor.cfg.imageBlock.field.link": "Link URL",
246
+ "Editor.cfg.newsletterSignup.label": "Newsletter Signup",
247
+ "Editor.cfg.newsletterSignup.field.title": "Title",
248
+ "Editor.cfg.newsletterSignup.field.subtitle": "Subtitle",
249
+ "Editor.cfg.newsletterSignup.field.ctaText": "Button Text",
250
+ "Editor.cfg.newsletterSignup.field.placeholder": "Input Placeholder",
251
+ "Editor.newsletterEmailAria": "Email",
252
+ "Editor.cfg.productBanner.label": "Product Banner",
253
+ "Editor.cfg.productBanner.field.title": "Title",
254
+ "Editor.cfg.productBanner.field.description": "Description",
255
+ "Editor.cfg.productBanner.field.ctaText": "CTA Text",
256
+ "Editor.cfg.productBanner.field.ctaLink": "CTA Link",
257
+ "Editor.cfg.productBanner.field.product": "Product",
258
+ "Editor.cfg.productBanner.field.productOnLeft": "Product Position",
259
+ "Editor.cfg.productBanner.productPosition.right": "Product on Right",
260
+ "Editor.cfg.productBanner.productPosition.left": "Product on Left",
261
+ "Editor.cfg.productBanner.field.background": "Background Color",
262
+ "Editor.cfg.productGridHeader.label": "Product Grid Header",
263
+ "Editor.cfg.productGridHeader.field.title": "Title",
264
+ "Editor.cfg.productGridHeader.field.description": "Description",
265
+ "Editor.cfg.productSlider.label": "Product Slider",
266
+ "Editor.cfg.productSlider.field.title": "Title",
267
+ "Editor.cfg.productSlider.field.subtitle": "Subtitle",
268
+ "Editor.cfg.productSlider.field.products": "Products",
269
+ "Editor.cfg.promotionalBanner.label": "Promotional Banner",
270
+ "Editor.cfg.promotionalBanner.field.image": "Image",
271
+ "Editor.cfg.promotionalBanner.field.title": "Title",
272
+ "Editor.cfg.promotionalBanner.field.subtitle": "Subtitle",
273
+ "Editor.cfg.promotionalBanner.field.ctaText": "CTA Text",
274
+ "Editor.cfg.promotionalBanner.field.ctaLink": "CTA Link",
275
+ "Editor.cfg.promotionalBanner.field.background": "Background Color",
276
+ "Editor.cfg.relatedProducts.label": "Related Products",
277
+ "Editor.cfg.relatedProducts.field.title": "Title",
278
+ "Editor.cfg.relatedProducts.field.subtitle": "Subtitle",
279
+ "Editor.cfg.relatedProducts.field.products": "Products",
280
+ "Editor.cfg.socialLinks.label": "Social Links",
281
+ "Editor.cfg.socialLinks.field.label": "Link {n} Label",
282
+ "Editor.cfg.socialLinks.field.url": "Link {n} URL",
283
+ "Editor.cfg.tabContent.label": "Tab Content",
284
+ "Editor.cfg.tabContent.field.tabLabel": "Tab Label",
285
+ "Editor.cfg.tabContent.field.content": "Content",
286
+ "Editor.cfg.testimonials.label": "Testimonials",
287
+ "Editor.cfg.testimonials.field.quote": "Quote {n}",
288
+ "Editor.cfg.testimonials.field.author": "Author {n}",
289
+ "Editor.cfg.testimonials.field.role": "Role {n}",
290
+ "Editor.cfg.thankYouContent.label": "Thank You Content",
291
+ "Editor.cfg.thankYouContent.field.headline": "Headline",
292
+ "Editor.cfg.thankYouContent.field.message": "Message",
293
+ "Editor.cfg.thankYouContent.field.ctaText": "CTA Text",
294
+ "Editor.cfg.thankYouContent.field.ctaLink": "CTA Link",
295
+ "Editor.cfg.trustBadges.label": "Trust Badges",
296
+ "Editor.cfg.trustBadges.field.icon": "Badge {n} Icon",
297
+ "Editor.cfg.trustBadges.field.label": "Badge {n} Label",
298
+ "Editor.cfg.videoBlock.label": "Video Block",
299
+ "Editor.cfg.videoBlock.field.videoUrl": "Video URL",
300
+ "Editor.cfg.videoBlock.field.posterImage": "Poster Image",
301
+ "Editor.cfg.videoBlock.field.title": "Title",
302
+ "Editor.cfg.videoBlock.field.caption": "Caption",
303
+ "Editor.cfg.websiteLogo.label": "Website Logo",
304
+ "Editor.cfg.websiteLogo.field.logo": "Logo",
305
+ "Editor.cfg.websiteLogo.field.maxWidth": "Max Width (px)",
306
+ "Editor.cfg.websiteLogo.field.maxHeight": "Max Height (px)",
307
+ "Editor.websiteLogoAlt": "Logo",
308
+ "Editor.color.none": "None",
309
+ "Editor.color.custom": "Custom color",
310
+ "Editor.color.white": "White",
311
+ "Editor.color.lightGray": "Light gray",
312
+ "Editor.color.gray": "Gray",
313
+ "Editor.color.slate": "Slate",
314
+ "Editor.color.charcoal": "Charcoal",
315
+ "Editor.color.black": "Black",
316
+ "Editor.color.red": "Red",
317
+ "Editor.color.orange": "Orange",
318
+ "Editor.color.amber": "Amber",
319
+ "Editor.color.yellow": "Yellow",
320
+ "Editor.color.lime": "Lime",
321
+ "Editor.color.green": "Green",
322
+ "Editor.color.teal": "Teal",
323
+ "Editor.color.cyan": "Cyan",
324
+ "Editor.color.skyBlue": "Sky blue",
325
+ "Editor.color.blue": "Blue",
326
+ "Editor.color.navy": "Navy",
327
+ "Editor.color.purple": "Purple",
328
+ "Editor.color.pink": "Pink",
329
+ "Editor.color.sand": "Sand"
330
+ };
331
+
332
+ // src/intl/es.json
333
+ var es_default = {
334
+ "Editor.loadingEditor": "Cargando editor\u2026",
335
+ "Editor.errorLoadingPage": "Error al cargar la p\xE1gina:",
336
+ "Editor.toggleComponentsPanel": "Panel de componentes alternados",
337
+ "Editor.togglePropertiesPanel": "Mostrar/ocultar panel de propiedades",
338
+ "Editor.undo": "Deshacer",
339
+ "Editor.redo": "Rehacer",
340
+ "Editor.badgeSaving": "Ahorro\u2026",
341
+ "Editor.badgeUnsaved": "No guardado",
342
+ "Editor.badgeDraft": "Borrador",
343
+ "Editor.badgePublished": "Publicado",
344
+ "Editor.preview": "Vista previa",
345
+ "Editor.save": "Guardar",
346
+ "Editor.publish": "Publicar",
347
+ "Editor.moreOptions": "M\xE1s opciones",
348
+ "Editor.hideVersionHistory": "Ocultar historial de versiones",
349
+ "Editor.versionHistory": "Historial de versiones",
350
+ "Editor.revertToPublished": "Volver a la versi\xF3n publicada",
351
+ "Editor.createTemplateFromPage": "Crea una plantilla a partir de esta p\xE1gina.",
352
+ "Editor.createTemplateTitle": "Crear una nueva plantilla",
353
+ "Editor.nameLabel": "Nombre",
354
+ "Editor.nameRequired": "Se requiere el nombre",
355
+ "Editor.templateNamePlaceholder": "p. ej. P\xE1gina de inicio",
356
+ "Editor.createTemplateWithoutData": "Crear plantilla sin datos",
357
+ "Editor.cancel": "Cancelar",
358
+ "Editor.creating": "Creando\u2026",
359
+ "Editor.create": "Crear",
360
+ "Editor.discardChangesTitle": "\xBFDescartar los cambios no guardados?",
361
+ "Editor.discardChangesBody": "Tienes cambios sin guardar en esta p\xE1gina. Si sales ahora, esos cambios se perder\xE1n.",
362
+ "Editor.stayOnPage": "Permanecer en la p\xE1gina",
363
+ "Editor.leaveAndDiscard": "Dejar y desechar",
364
+ "Editor.showPanel": "Mostrar panel {panel}",
365
+ "Editor.tabComponents": "Componentes",
366
+ "Editor.tabHistory": "Historia",
367
+ "Editor.searchComponents": "Componentes de b\xFAsqueda",
368
+ "Editor.searchComponentsPlaceholder": "Componentes de b\xFAsqueda\u2026",
369
+ "Editor.clearSearch": "Borrar b\xFAsqueda",
370
+ "Editor.resizePropertiesPanel": "Redimensionar el panel de propiedades",
371
+ "Editor.resizeComponentsPanel": "Redimensionar el panel de componentes",
372
+ "Editor.searchProducts": "Buscar productos",
373
+ "Editor.searchProductsPlaceholder": "Buscar por nombre del producto\u2026",
374
+ "Editor.productSearchResults": "Resultados de la b\xFAsqueda de productos",
375
+ "Editor.searching": "B\xFAsqueda\u2026",
376
+ "Editor.noProductsFound": "No se encontraron productos",
377
+ "Editor.unnamedProduct": "(producto sin nombre)",
378
+ "Editor.skuLabel": "SKU: {sku}",
379
+ "Editor.noSkuOnMasterVariant": "No hay SKU en la variante principal",
380
+ "Editor.added": "Agregado",
381
+ "Editor.datasourceType": "Tipo de fuente de datos",
382
+ "Editor.datasourceProductBySku": "Producto por SKU",
383
+ "Editor.datasourceProductsBySku": "Productos por SKU",
384
+ "Editor.selectedProduct": "Producto seleccionado",
385
+ "Editor.selectedProducts": "Productos seleccionados",
386
+ "Editor.noProductSelectedSearch": "No se ha seleccionado ning\xFAn producto; busque arriba para a\xF1adir uno.",
387
+ "Editor.remove": "Eliminar",
388
+ "Editor.richTextPlaceholder": "Empieza a escribir\u2026",
389
+ "Editor.uploadAFile": "Subir un archivo",
390
+ "Editor.close": "Cerrar",
391
+ "Editor.title": "T\xEDtulo",
392
+ "Editor.fileTitlePlaceholder": "T\xEDtulo del archivo",
393
+ "Editor.description": "Descripci\xF3n",
394
+ "Editor.optionalDescriptionPlaceholder": "Descripci\xF3n opcional",
395
+ "Editor.dropToSelectFile": "Haz clic o arrastra y suelta para seleccionar un archivo.",
396
+ "Editor.noFileSelected": "No se ha seleccionado ning\xFAn archivo.",
397
+ "Editor.uploading": "Subiendo\u2026",
398
+ "Editor.upload": "Subir",
399
+ "Editor.selectFromMediaLibrary": "Seleccionar de la biblioteca multimedia",
400
+ "Editor.noFilesFound": "No se encontraron archivos.",
401
+ "Editor.prev": "\u2190 Anterior",
402
+ "Editor.next": "Siguiente \u2192",
403
+ "Editor.nothingSelected": "No se ha seleccionado nada",
404
+ "Editor.select": "Seleccionar",
405
+ "Editor.selectedImagePreview": "Vista previa de la imagen seleccionada",
406
+ "Editor.noImageSelected": "No se ha seleccionado ninguna imagen",
407
+ "Editor.mediaLibrary": "Biblioteca multimedia",
408
+ "Editor.loading": "Cargando\u2026",
409
+ "Editor.loadingProduct": "Cargando producto\u2026",
410
+ "Editor.loadingProducts": "Cargando productos\u2026",
411
+ "Editor.errorLoadingProduct": "Error al cargar el producto",
412
+ "Editor.noProductSelected": "No se ha seleccionado ning\xFAn producto.",
413
+ "Editor.noDescription": "Sin descripci\xF3n",
414
+ "Editor.noCategoriesConfigured": "No se han configurado categor\xEDas",
415
+ "Editor.noFaqItemsConfigured": "No hay elementos de preguntas frecuentes configurados.",
416
+ "Editor.noProductsConfigured": "No hay productos configurados",
417
+ "Editor.noImage": "Sin imagen",
418
+ "Editor.noVideoUrlConfigured": "No se ha configurado ninguna URL de v\xEDdeo.",
419
+ "Editor.cfg.root.field.title": "T\xEDtulo de la p\xE1gina",
420
+ "Editor.cfg.root.field.backgroundColor": "Color de fondo",
421
+ "Editor.cfg.root.field.contentWidth": "Ancho del contenido",
422
+ "Editor.cfg.root.contentWidth.full": "Ancho completo",
423
+ "Editor.cfg.category.layout": "Disposici\xF3n",
424
+ "Editor.cfg.category.text": "Texto y contenido",
425
+ "Editor.cfg.category.media": "Medios de comunicaci\xF3n",
426
+ "Editor.cfg.category.heroBanners": "H\xE9roes y Estandartes",
427
+ "Editor.cfg.category.products": "Productos",
428
+ "Editor.cfg.category.actions": "Botones y formularios",
429
+ "Editor.cfg.category.socialProof": "Prueba social e informaci\xF3n",
430
+ "Editor.cfg.category.sections": "Secciones de p\xE1gina",
431
+ "Editor.cfg.category.other": "Otro",
432
+ "Editor.cfg.shared.field.linkWith": "Enlace productos por",
433
+ "Editor.cfg.shared.linkWith.slug": "Slug",
434
+ "Editor.cfg.shared.linkWith.sku": "SKU",
435
+ "Editor.cfg.shared.field.baseUrl": "URL base del enlace",
436
+ "Editor.cfg.fontSize.default": "Por defecto",
437
+ "Editor.cfg.fontSize.small": "Peque\xF1o (0,875 rem)",
438
+ "Editor.cfg.fontSize.medium": "Medio (1 rem)",
439
+ "Editor.cfg.fontSize.large": "Grande (1,25 rem)",
440
+ "Editor.cfg.fontSize.xLarge": "Extra grande (1,5 rem)",
441
+ "Editor.cfg.fontSize.2xLarge": "2X-Grande (2rem)",
442
+ "Editor.cfg.fontSize.3xLarge": "3X-Grande (2,5 rem)",
443
+ "Editor.cfg.fontSize.4xLarge": "4X-Grande (3rem)",
444
+ "Editor.cfg.hero.label": "Hero",
445
+ "Editor.cfg.hero.field.heading": "T\xEDtulo",
446
+ "Editor.cfg.hero.field.headingFontSize": "Tama\xF1o de fuente del encabezado",
447
+ "Editor.cfg.hero.field.subheading": "Subt\xEDtulo",
448
+ "Editor.cfg.hero.field.subheadingFontSize": "Tama\xF1o de fuente del subt\xEDtulo",
449
+ "Editor.cfg.hero.field.backgroundImage": "URL de la imagen de fondo",
450
+ "Editor.cfg.hero.field.ctaText": "Texto del bot\xF3n CTA",
451
+ "Editor.cfg.hero.field.ctaUrl": "URL del bot\xF3n CTA",
452
+ "Editor.cfg.hero.field.layout": "Disposici\xF3n",
453
+ "Editor.cfg.hero.layout.centered": "Centrado",
454
+ "Editor.cfg.hero.layout.leftAligned": "Alineado a la izquierda",
455
+ "Editor.cfg.hero.field.minHeight": "Altura m\xEDnima (CSS, por ejemplo, 400px)",
456
+ "Editor.cfg.richText.label": "Texto enriquecido",
457
+ "Editor.cfg.richText.field.content": "Contenido",
458
+ "Editor.cfg.richText.field.align": "Alineaci\xF3n del texto",
459
+ "Editor.cfg.align.left": "Izquierda",
460
+ "Editor.cfg.align.center": "Centro",
461
+ "Editor.cfg.align.right": "Bien",
462
+ "Editor.cfg.richText.field.maxWidth": "Ancho m\xE1ximo (CSS)",
463
+ "Editor.cfg.richText.field.padding": "Relleno (CSS)",
464
+ "Editor.cfg.grid.label": "Red",
465
+ "Editor.cfg.grid.field.columnCount": "N\xFAmero de columnas",
466
+ "Editor.cfg.grid.field.rowCount": "N\xFAmero de filas",
467
+ "Editor.cfg.grid.field.gap": "Brecha (CSS)",
468
+ "Editor.cfg.grid.field.padding": "Relleno (CSS)",
469
+ "Editor.cfg.columns.label": "Columnas",
470
+ "Editor.cfg.columns.field.columnCount": "N\xFAmero de columnas",
471
+ "Editor.cfg.columns.count.2": "2 columnas",
472
+ "Editor.cfg.columns.count.3": "3 columnas",
473
+ "Editor.cfg.columns.count.4": "4 columnas",
474
+ "Editor.cfg.columns.field.gap": "Espacio entre columnas (CSS)",
475
+ "Editor.cfg.columns.field.padding": "Relleno (CSS)",
476
+ "Editor.cfg.image.label": "Imagen",
477
+ "Editor.cfg.image.field.src": "Imagen",
478
+ "Editor.cfg.image.field.alt": "Texto alternativo",
479
+ "Editor.cfg.image.field.caption": "Subt\xEDtulo",
480
+ "Editor.cfg.image.field.width": "Ancho (CSS, por ejemplo, 100%)",
481
+ "Editor.cfg.image.field.height": "Altura (CSS, por ejemplo, 300px)",
482
+ "Editor.cfg.image.field.objectFit": "Ajuste del objeto",
483
+ "Editor.cfg.image.objectFit.cover": "Cubrir",
484
+ "Editor.cfg.image.objectFit.contain": "Contener",
485
+ "Editor.cfg.image.objectFit.fill": "Llenar",
486
+ "Editor.cfg.image.field.borderRadius": "Radio de borde (CSS)",
487
+ "Editor.cfg.image.field.align": "Alineaci\xF3n",
488
+ "Editor.cfg.button.label": "Bot\xF3n",
489
+ "Editor.cfg.button.field.label": "Etiqueta del bot\xF3n",
490
+ "Editor.cfg.button.field.href": "URL del enlace",
491
+ "Editor.cfg.button.field.variant": "Variante",
492
+ "Editor.cfg.button.variant.primary": "Primario",
493
+ "Editor.cfg.button.variant.secondary": "Secundario",
494
+ "Editor.cfg.button.variant.outline": "Describir",
495
+ "Editor.cfg.button.field.size": "Tama\xF1o",
496
+ "Editor.cfg.button.size.small": "Peque\xF1o",
497
+ "Editor.cfg.button.size.medium": "Medio",
498
+ "Editor.cfg.button.size.large": "Grande",
499
+ "Editor.cfg.button.field.fontSize": "Anulaci\xF3n del tama\xF1o de fuente",
500
+ "Editor.cfg.button.field.align": "Alineaci\xF3n",
501
+ "Editor.cfg.button.field.openInNewTab": "Abrir en una pesta\xF1a nueva",
502
+ "Editor.cfg.yesNo.yes": "S\xED",
503
+ "Editor.cfg.yesNo.no": "No",
504
+ "Editor.cfg.card.label": "Tarjeta",
505
+ "Editor.cfg.card.field.title": "T\xEDtulo",
506
+ "Editor.cfg.card.field.titleFontSize": "Tama\xF1o de fuente del t\xEDtulo",
507
+ "Editor.cfg.card.field.body": "Texto del cuerpo",
508
+ "Editor.cfg.card.field.imageUrl": "URL de la imagen",
509
+ "Editor.cfg.card.field.ctaText": "Texto de llamada a la acci\xF3n",
510
+ "Editor.cfg.card.field.ctaUrl": "URL de llamada a la acci\xF3n",
511
+ "Editor.cfg.card.field.shadow": "Sombra paralela",
512
+ "Editor.cfg.card.field.borderRadius": "Radio de borde (CSS)",
513
+ "Editor.cfg.spacer.label": "espaciador",
514
+ "Editor.cfg.spacer.field.height": "Altura (CSS, por ejemplo, 48px)",
515
+ "Editor.cfg.spacer.field.showLine": "Mostrar l\xEDnea divisoria",
516
+ "Editor.cfg.spacer.field.lineColor": "Color de l\xEDnea",
517
+ "Editor.cfg.productTeaser.label": "Avance del producto",
518
+ "Editor.cfg.productTeaser.field.datasource": "Fuente de datos del producto",
519
+ "Editor.cfg.productTeaser.field.richText": "Texto enriquecido",
520
+ "Editor.cfg.heroBanner.label": "Hero Banner",
521
+ "Editor.cfg.heroBanner.field.title": "T\xEDtulo",
522
+ "Editor.cfg.heroBanner.field.subtitle": "Subtitular",
523
+ "Editor.cfg.heroBanner.field.image": "Imagen",
524
+ "Editor.cfg.textBlock.label": "Bloque de texto",
525
+ "Editor.cfg.textBlock.field.content": "Contenido",
526
+ "Editor.cfg.categoryGrid.label": "Cuadr\xEDcula de categor\xEDas",
527
+ "Editor.cfg.categoryGrid.field.image": "Categor\xEDa {n} Imagen",
528
+ "Editor.cfg.categoryGrid.field.label": "Categor\xEDa {n} Etiqueta",
529
+ "Editor.cfg.categoryGrid.field.link": "Enlace de categor\xEDa {n}",
530
+ "Editor.cfg.categoryHero.label": "H\xE9roe de categor\xEDa",
531
+ "Editor.cfg.categoryHero.field.title": "T\xEDtulo",
532
+ "Editor.cfg.categoryHero.field.subtitle": "Subtitular",
533
+ "Editor.cfg.categoryHero.field.image": "Imagen de fondo",
534
+ "Editor.cfg.categoryHero.field.ctaText": "Texto de llamada a la acci\xF3n",
535
+ "Editor.cfg.categoryHero.field.ctaLink": "Enlace CTA",
536
+ "Editor.cfg.checkoutPromoBanner.label": "Banner promocional de pago",
537
+ "Editor.cfg.checkoutPromoBanner.field.title": "T\xEDtulo",
538
+ "Editor.cfg.checkoutPromoBanner.field.message": "Mensaje",
539
+ "Editor.cfg.checkoutPromoBanner.field.ctaText": "Texto de llamada a la acci\xF3n",
540
+ "Editor.cfg.checkoutPromoBanner.field.ctaLink": "Enlace CTA",
541
+ "Editor.cfg.countdownBanner.label": "Banner de cuenta regresiva",
542
+ "Editor.cfg.countdownBanner.field.headline": "Titular",
543
+ "Editor.cfg.countdownBanner.field.subline": "Subl\xEDnea",
544
+ "Editor.cfg.countdownBanner.field.endDate": "Fecha de finalizaci\xF3n (ISO, por ejemplo, 2025-12-31T23:59:59)",
545
+ "Editor.cfg.countdownBanner.field.ctaText": "Texto de llamada a la acci\xF3n",
546
+ "Editor.cfg.countdownBanner.field.ctaLink": "Enlace CTA",
547
+ "Editor.cfg.countdownBanner.field.background": "Color de fondo",
548
+ "Editor.cfg.crossSellBlock.label": "Bloque de venta cruzada",
549
+ "Editor.cfg.crossSellBlock.field.title": "T\xEDtulo",
550
+ "Editor.cfg.crossSellBlock.field.products": "Productos",
551
+ "Editor.cfg.crossSellBlock.field.ctaText": "Texto de llamada a la acci\xF3n",
552
+ "Editor.cfg.deliveryMessage.label": "Mensaje de entrega",
553
+ "Editor.cfg.deliveryMessage.field.message": "Mensaje (use $XX para el umbral)",
554
+ "Editor.cfg.deliveryMessage.field.threshold": "Cantidad umbral (p. ej., 50)",
555
+ "Editor.cfg.divider.label": "Divisor",
556
+ "Editor.cfg.divider.field.lineStyle": "Estilo de l\xEDnea",
557
+ "Editor.cfg.divider.lineStyle.solid": "S\xF3lido",
558
+ "Editor.cfg.divider.lineStyle.dashed": "Corrido",
559
+ "Editor.cfg.divider.lineStyle.dotted": "Punteado",
560
+ "Editor.cfg.divider.field.spacing": "Espaciado (px)",
561
+ "Editor.cfg.emptyState.label": "Estado vac\xEDo",
562
+ "Editor.cfg.emptyState.field.image": "Imagen",
563
+ "Editor.cfg.emptyState.field.title": "T\xEDtulo",
564
+ "Editor.cfg.emptyState.field.description": "Descripci\xF3n",
565
+ "Editor.cfg.emptyState.field.ctaText": "Texto de llamada a la acci\xF3n",
566
+ "Editor.cfg.emptyState.field.ctaLink": "Enlace CTA",
567
+ "Editor.cfg.faqAccordion.label": "Acorde\xF3n de preguntas frecuentes",
568
+ "Editor.cfg.faqAccordion.field.question": "Pregunta {n}",
569
+ "Editor.cfg.faqAccordion.field.answer": "Respuesta {n}",
570
+ "Editor.cfg.footerBlock.label": "Bloque de pie de p\xE1gina",
571
+ "Editor.cfg.footerBlock.field.column": "Columna {n}",
572
+ "Editor.cfg.footerBlock.field.copyright": "Texto de derechos de autor",
573
+ "Editor.cfg.imageBlock.label": "Bloque de imagen",
574
+ "Editor.cfg.imageBlock.field.image": "Imagen",
575
+ "Editor.cfg.imageBlock.field.caption": "Subt\xEDtulo",
576
+ "Editor.cfg.imageBlock.field.link": "URL del enlace",
577
+ "Editor.cfg.newsletterSignup.label": "Suscripci\xF3n al bolet\xEDn informativo",
578
+ "Editor.cfg.newsletterSignup.field.title": "T\xEDtulo",
579
+ "Editor.cfg.newsletterSignup.field.subtitle": "Subtitular",
580
+ "Editor.cfg.newsletterSignup.field.ctaText": "Texto del bot\xF3n",
581
+ "Editor.cfg.newsletterSignup.field.placeholder": "Marcador de posici\xF3n de entrada",
582
+ "Editor.newsletterEmailAria": "Correo electr\xF3nico",
583
+ "Editor.cfg.productBanner.label": "Banner del producto",
584
+ "Editor.cfg.productBanner.field.title": "T\xEDtulo",
585
+ "Editor.cfg.productBanner.field.description": "Descripci\xF3n",
586
+ "Editor.cfg.productBanner.field.ctaText": "Texto de llamada a la acci\xF3n",
587
+ "Editor.cfg.productBanner.field.ctaLink": "Enlace CTA",
588
+ "Editor.cfg.productBanner.field.product": "Producto",
589
+ "Editor.cfg.productBanner.field.productOnLeft": "Posicionamiento del producto",
590
+ "Editor.cfg.productBanner.productPosition.right": "Producto a la derecha",
591
+ "Editor.cfg.productBanner.productPosition.left": "Producto a la izquierda",
592
+ "Editor.cfg.productBanner.field.background": "Color de fondo",
593
+ "Editor.cfg.productGridHeader.label": "Encabezado de la cuadr\xEDcula de productos",
594
+ "Editor.cfg.productGridHeader.field.title": "T\xEDtulo",
595
+ "Editor.cfg.productGridHeader.field.description": "Descripci\xF3n",
596
+ "Editor.cfg.productSlider.label": "Deslizador de productos",
597
+ "Editor.cfg.productSlider.field.title": "T\xEDtulo",
598
+ "Editor.cfg.productSlider.field.subtitle": "Subtitular",
599
+ "Editor.cfg.productSlider.field.products": "Productos",
600
+ "Editor.cfg.promotionalBanner.label": "Banner promocional",
601
+ "Editor.cfg.promotionalBanner.field.image": "Imagen",
602
+ "Editor.cfg.promotionalBanner.field.title": "T\xEDtulo",
603
+ "Editor.cfg.promotionalBanner.field.subtitle": "Subtitular",
604
+ "Editor.cfg.promotionalBanner.field.ctaText": "Texto de llamada a la acci\xF3n",
605
+ "Editor.cfg.promotionalBanner.field.ctaLink": "Enlace CTA",
606
+ "Editor.cfg.promotionalBanner.field.background": "Color de fondo",
607
+ "Editor.cfg.relatedProducts.label": "Productos relacionados",
608
+ "Editor.cfg.relatedProducts.field.title": "T\xEDtulo",
609
+ "Editor.cfg.relatedProducts.field.subtitle": "Subtitular",
610
+ "Editor.cfg.relatedProducts.field.products": "Productos",
611
+ "Editor.cfg.socialLinks.label": "Enlaces sociales",
612
+ "Editor.cfg.socialLinks.field.label": "Enlace {n} Etiqueta",
613
+ "Editor.cfg.socialLinks.field.url": "Enlace {n} URL",
614
+ "Editor.cfg.tabContent.label": "Contenido de la pesta\xF1a",
615
+ "Editor.cfg.tabContent.field.tabLabel": "Etiqueta de pesta\xF1a",
616
+ "Editor.cfg.tabContent.field.content": "Contenido",
617
+ "Editor.cfg.testimonials.label": "Testimonios",
618
+ "Editor.cfg.testimonials.field.quote": "Cita {n}",
619
+ "Editor.cfg.testimonials.field.author": "Autor {n}",
620
+ "Editor.cfg.testimonials.field.role": "Rol {n}",
621
+ "Editor.cfg.thankYouContent.label": "Contenido de agradecimiento",
622
+ "Editor.cfg.thankYouContent.field.headline": "Titular",
623
+ "Editor.cfg.thankYouContent.field.message": "Mensaje",
624
+ "Editor.cfg.thankYouContent.field.ctaText": "Texto de llamada a la acci\xF3n",
625
+ "Editor.cfg.thankYouContent.field.ctaLink": "Enlace CTA",
626
+ "Editor.cfg.trustBadges.label": "Insignias de confianza",
627
+ "Editor.cfg.trustBadges.field.icon": "Insignia {n} Icono",
628
+ "Editor.cfg.trustBadges.field.label": "Etiqueta de insignia {n}",
629
+ "Editor.cfg.videoBlock.label": "Bloque de v\xEDdeo",
630
+ "Editor.cfg.videoBlock.field.videoUrl": "URL del v\xEDdeo",
631
+ "Editor.cfg.videoBlock.field.posterImage": "Imagen del p\xF3ster",
632
+ "Editor.cfg.videoBlock.field.title": "T\xEDtulo",
633
+ "Editor.cfg.videoBlock.field.caption": "Subt\xEDtulo",
634
+ "Editor.cfg.websiteLogo.label": "Logotipo del sitio web",
635
+ "Editor.cfg.websiteLogo.field.logo": "Logo",
636
+ "Editor.cfg.websiteLogo.field.maxWidth": "Ancho m\xE1ximo (px)",
637
+ "Editor.cfg.websiteLogo.field.maxHeight": "Altura m\xE1xima (px)",
638
+ "Editor.websiteLogoAlt": "Logo",
639
+ "Editor.color.none": "Ninguno",
640
+ "Editor.color.custom": "Color personalizado",
641
+ "Editor.color.white": "Blanco",
642
+ "Editor.color.lightGray": "Gris claro",
643
+ "Editor.color.gray": "Gris",
644
+ "Editor.color.slate": "Pizarra",
645
+ "Editor.color.charcoal": "Carb\xF3n",
646
+ "Editor.color.black": "Negro",
647
+ "Editor.color.red": "Rojo",
648
+ "Editor.color.orange": "Naranja",
649
+ "Editor.color.amber": "\xC1mbar",
650
+ "Editor.color.yellow": "Amarillo",
651
+ "Editor.color.lime": "Lima",
652
+ "Editor.color.green": "Verde",
653
+ "Editor.color.teal": "Verde azulado",
654
+ "Editor.color.cyan": "Cian",
655
+ "Editor.color.skyBlue": "Azul cielo",
656
+ "Editor.color.blue": "Azul",
657
+ "Editor.color.navy": "Azul marino",
658
+ "Editor.color.purple": "Morado",
659
+ "Editor.color.pink": "Rosa",
660
+ "Editor.color.sand": "Arena"
661
+ };
662
+
663
+ // src/intl/index.ts
664
+ var catalogs = { en: en_default, es: es_default };
665
+
666
+ // src/utils/sanitizeHtml.ts
667
+ import DOMPurify from "isomorphic-dompurify";
668
+ var sanitizeHtml = (html) => {
669
+ if (!html) return "";
670
+ return DOMPurify.sanitize(html, {
671
+ USE_PROFILES: { html: true },
672
+ ADD_ATTR: ["target", "rel"]
673
+ });
674
+ };
675
+
676
+ // src/components/RichTextContent.tsx
677
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
678
+ var STYLE_ID = "puck-rich-text-content-styles";
679
+ var RICH_TEXT_CSS = `
680
+ .puck-rich-text-content { line-height: 1.6; }
681
+ .puck-rich-text-content > :first-child { margin-top: 0; }
682
+ .puck-rich-text-content > :last-child { margin-bottom: 0; }
683
+ .puck-rich-text-content h1 { font-size: 2em; font-weight: 700; line-height: 1.2; margin: 0.67em 0; }
684
+ .puck-rich-text-content h2 { font-size: 1.5em; font-weight: 700; line-height: 1.25; margin: 0.75em 0; }
685
+ .puck-rich-text-content h3 { font-size: 1.17em; font-weight: 700; line-height: 1.3; margin: 0.83em 0; }
686
+ .puck-rich-text-content h4 { font-size: 1em; font-weight: 700; margin: 1em 0; }
687
+ .puck-rich-text-content h5 { font-size: 0.83em; font-weight: 700; margin: 1.17em 0; }
688
+ .puck-rich-text-content h6 { font-size: 0.75em; font-weight: 700; margin: 1.33em 0; }
689
+ .puck-rich-text-content p { margin: 1em 0; }
690
+ .puck-rich-text-content strong, .puck-rich-text-content b { font-weight: 700; }
691
+ .puck-rich-text-content em, .puck-rich-text-content i { font-style: italic; }
692
+ .puck-rich-text-content u { text-decoration: underline; }
693
+ .puck-rich-text-content s, .puck-rich-text-content del { text-decoration: line-through; }
694
+ .puck-rich-text-content ul { list-style: disc; margin: 1em 0; padding-left: 1.5em; }
695
+ .puck-rich-text-content ol { list-style: decimal; margin: 1em 0; padding-left: 1.5em; }
696
+ .puck-rich-text-content li { margin: 0.25em 0; }
697
+ .puck-rich-text-content a { color: #2563eb; text-decoration: underline; }
698
+ .puck-rich-text-content blockquote { margin: 1em 0; padding-left: 1em; border-left: 3px solid #d1d5db; color: #4b5563; }
699
+ .puck-rich-text-content code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; background: rgba(0,0,0,0.06); padding: 0.1em 0.3em; border-radius: 3px; font-size: 0.9em; }
700
+ .puck-rich-text-content pre { background: rgba(0,0,0,0.06); padding: 0.75em 1em; border-radius: 6px; overflow-x: auto; }
701
+ .puck-rich-text-content pre code { background: none; padding: 0; }
702
+ .puck-rich-text-content img { max-width: 100%; height: auto; }
703
+ .puck-rich-text-content hr { border: none; border-top: 1px solid #e5e7eb; margin: 1.5em 0; }
704
+ `.trim();
705
+ var RichTextContent = ({
706
+ html,
707
+ className,
708
+ style
709
+ }) => /* @__PURE__ */ jsxs(Fragment, { children: [
710
+ /* @__PURE__ */ jsx("style", { href: STYLE_ID, precedence: "default", children: RICH_TEXT_CSS }),
711
+ /* @__PURE__ */ jsx(
712
+ "div",
713
+ {
714
+ className: className ? `puck-rich-text-content ${className}` : "puck-rich-text-content",
715
+ style,
716
+ dangerouslySetInnerHTML: { __html: sanitizeHtml(html) }
717
+ }
718
+ )
719
+ ] });
720
+
721
+ // src/components/cms/shared.ts
722
+ var getLocalizedText = (obj) => {
723
+ if (!obj) return "";
724
+ return obj["en-US"] ?? obj["en"] ?? Object.values(obj)[0] ?? "";
725
+ };
726
+ var formatPrice = (centAmount, currencyCode = "USD", fractionDigits = 2) => {
727
+ const amount = centAmount / Math.pow(10, fractionDigits);
728
+ return new Intl.NumberFormat("en-US", {
729
+ style: "currency",
730
+ currency: currencyCode
731
+ }).format(amount);
732
+ };
733
+ var getFirstPrice = (product) => {
734
+ const p = product;
735
+ return p?.masterVariant?.prices?.[0]?.value ?? null;
736
+ };
737
+ var getProductImage = (product) => {
738
+ const p = product;
739
+ return p?.masterVariant?.images?.[0]?.url ?? null;
740
+ };
741
+ var getProductName = (product) => {
742
+ const p = product;
743
+ return getLocalizedText(p?.name) || "Product";
744
+ };
745
+ var getProductSlug = (product) => {
746
+ const p = product;
747
+ return getLocalizedText(p?.slug) || p?.id || "#";
748
+ };
749
+ var getProductSku = (product) => {
750
+ const p = product;
751
+ return p?.masterVariant?.sku ?? "";
752
+ };
753
+ var resolveProductLink = (product, linkWith = "sku", baseUrl = "/p/") => {
754
+ const p = product;
755
+ const slug = getLocalizedText(p?.slug);
756
+ const sku = getProductSku(product);
757
+ const id = p?.id ?? "";
758
+ const identifier = (linkWith === "sku" ? sku : slug) || id || slug || sku;
759
+ const base = "/" + String(baseUrl ?? "").trim().replace(/^\/+|\/+$/g, "").replace(/\/{2,}/g, "/");
760
+ const cleanId = String(identifier ?? "").trim().replace(/^\/+|\/+$/g, "");
761
+ return (cleanId ? `${base}/${cleanId}` : base).replace(/\/{2,}/g, "/");
762
+ };
763
+ var productLinkDefaults = {
764
+ linkWith: "sku",
765
+ baseUrl: "/p/"
766
+ };
767
+ var colors = {
768
+ primary: "#2c5530",
769
+ primaryHover: "#1e3a21",
770
+ lightBg: "#f0f7f0",
771
+ lightBorder: "#c8e6c8",
772
+ text: "#333",
773
+ textMuted: "#666",
774
+ border: "#eee",
775
+ bg: "#f5f5f5"
776
+ };
777
+
778
+ // src/components/Root.tsx
779
+ import React from "react";
780
+ var CONTENT_WIDTHS = {
781
+ x: "256px",
782
+ "2x": "512px",
783
+ "3x": "768px",
784
+ "4x": "1024px",
785
+ "5x": "1280px",
786
+ "6x": "1536px",
787
+ full: "100%"
788
+ };
789
+ var renderRoot = ({
790
+ children,
791
+ backgroundColor,
792
+ contentWidth
793
+ }) => {
794
+ const maxWidth = CONTENT_WIDTHS[contentWidth] ?? "100%";
795
+ const isConstrained = maxWidth !== "100%";
796
+ return React.createElement(
797
+ "div",
798
+ {
799
+ style: {
800
+ background: backgroundColor ?? "#ffffff",
801
+ minHeight: "100vh",
802
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif'
803
+ }
804
+ },
805
+ React.createElement(
806
+ "div",
807
+ {
808
+ style: {
809
+ maxWidth,
810
+ // Centre the content column and give it breathing room on the sides
811
+ // when its width is constrained.
812
+ margin: "0 auto",
813
+ paddingLeft: isConstrained ? "24px" : void 0,
814
+ paddingRight: isConstrained ? "24px" : void 0,
815
+ boxSizing: "border-box"
816
+ }
817
+ },
818
+ children
819
+ )
820
+ );
821
+ };
822
+
823
+ // src/components/Hero.tsx
824
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
825
+ var renderHero = ({
826
+ heading,
827
+ headingFontSize,
828
+ subheading,
829
+ subheadingFontSize,
830
+ backgroundImage,
831
+ ctaText,
832
+ ctaUrl,
833
+ layout,
834
+ minHeight
835
+ }) => {
836
+ const isCenter = layout !== "left-aligned";
837
+ return /* @__PURE__ */ jsxs2(
838
+ "section",
839
+ {
840
+ style: {
841
+ position: "relative",
842
+ minHeight: minHeight ?? "400px",
843
+ display: "flex",
844
+ alignItems: "center",
845
+ justifyContent: isCenter ? "center" : "flex-start",
846
+ padding: "48px 32px",
847
+ backgroundImage: backgroundImage ? `url(${backgroundImage})` : void 0,
848
+ backgroundSize: "cover",
849
+ backgroundPosition: "center",
850
+ backgroundColor: backgroundImage ? void 0 : "#1a1a2e",
851
+ color: "#fff",
852
+ boxSizing: "border-box"
853
+ },
854
+ children: [
855
+ backgroundImage && /* @__PURE__ */ jsx2(
856
+ "div",
857
+ {
858
+ style: {
859
+ position: "absolute",
860
+ inset: 0,
861
+ background: "rgba(0,0,0,0.45)"
862
+ }
863
+ }
864
+ ),
865
+ /* @__PURE__ */ jsxs2(
866
+ "div",
867
+ {
868
+ style: {
869
+ position: "relative",
870
+ maxWidth: "720px",
871
+ textAlign: isCenter ? "center" : "left"
872
+ },
873
+ children: [
874
+ /* @__PURE__ */ jsx2("h1", { style: { margin: "0 0 16px", fontSize: headingFontSize || "2.5rem", fontWeight: 700 }, children: heading }),
875
+ subheading && /* @__PURE__ */ jsx2("p", { style: { margin: "0 0 24px", fontSize: subheadingFontSize || "1.2rem", opacity: 0.85 }, children: subheading }),
876
+ ctaText && ctaUrl && /* @__PURE__ */ jsx2(
877
+ "a",
878
+ {
879
+ href: ctaUrl,
880
+ style: {
881
+ display: "inline-block",
882
+ padding: "12px 28px",
883
+ background: "#e94560",
884
+ color: "#fff",
885
+ borderRadius: "4px",
886
+ textDecoration: "none",
887
+ fontWeight: 600
888
+ },
889
+ children: ctaText
890
+ }
891
+ )
892
+ ]
893
+ }
894
+ )
895
+ ]
896
+ }
897
+ );
898
+ };
899
+
900
+ // src/components/RichText.tsx
901
+ import { jsx as jsx3 } from "react/jsx-runtime";
902
+ var renderRichText = ({
903
+ content,
904
+ align,
905
+ maxWidth,
906
+ padding
907
+ }) => /* @__PURE__ */ jsx3(
908
+ RichTextContent,
909
+ {
910
+ html: content,
911
+ style: {
912
+ padding: padding ?? "32px",
913
+ textAlign: align ?? "left",
914
+ maxWidth,
915
+ margin: maxWidth ? "0 auto" : void 0,
916
+ boxSizing: "border-box"
917
+ }
918
+ }
919
+ );
920
+
921
+ // src/components/Grid.tsx
922
+ import { DropZone } from "@measured/puck";
923
+ import { jsx as jsx4 } from "react/jsx-runtime";
924
+ var renderGrid = ({
925
+ columnCount = 2,
926
+ rowCount = 1,
927
+ gap = "16px",
928
+ padding = "16px"
929
+ }) => {
930
+ const cols = Math.max(1, columnCount);
931
+ const rows = Math.max(1, rowCount);
932
+ const cells = Array.from({ length: cols * rows }, (_, i) => i);
933
+ return /* @__PURE__ */ jsx4(
934
+ "div",
935
+ {
936
+ style: {
937
+ display: "grid",
938
+ gridTemplateColumns: `repeat(${cols}, 1fr)`,
939
+ gridTemplateRows: `repeat(${rows}, minmax(40px, auto))`,
940
+ gap,
941
+ padding,
942
+ boxSizing: "border-box"
943
+ },
944
+ children: cells.map((i) => /* @__PURE__ */ jsx4("div", { children: /* @__PURE__ */ jsx4(DropZone, { zone: `cell-${i}` }) }, i))
945
+ }
946
+ );
947
+ };
948
+
949
+ // src/components/Columns.tsx
950
+ import { DropZone as DropZone2 } from "@measured/puck";
951
+ import { jsx as jsx5 } from "react/jsx-runtime";
952
+ var renderColumns = ({
953
+ columnCount = 2,
954
+ gap = "16px",
955
+ padding = "16px"
956
+ }) => {
957
+ const cols = Array.from({ length: columnCount }, (_, i) => i);
958
+ return /* @__PURE__ */ jsx5(
959
+ "div",
960
+ {
961
+ style: {
962
+ display: "grid",
963
+ gridTemplateColumns: `repeat(${columnCount}, 1fr)`,
964
+ gap,
965
+ padding,
966
+ boxSizing: "border-box"
967
+ },
968
+ children: cols.map((i) => /* @__PURE__ */ jsx5("div", { children: /* @__PURE__ */ jsx5(DropZone2, { zone: `column-${i}` }) }, i))
969
+ }
970
+ );
971
+ };
972
+
973
+ // src/components/Image.tsx
974
+ import { FormattedMessage } from "react-intl";
975
+ import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
976
+ var renderImage = ({
977
+ src,
978
+ alt,
979
+ caption,
980
+ width,
981
+ height,
982
+ objectFit,
983
+ borderRadius,
984
+ align
985
+ }) => /* @__PURE__ */ jsxs3(
986
+ "figure",
987
+ {
988
+ style: {
989
+ margin: 0,
990
+ padding: "16px",
991
+ textAlign: align ?? "center",
992
+ boxSizing: "border-box"
993
+ },
994
+ children: [
995
+ src ? /* @__PURE__ */ jsx6(
996
+ "img",
997
+ {
998
+ src,
999
+ alt: alt ?? "",
1000
+ style: {
1001
+ width: width ?? "100%",
1002
+ height,
1003
+ objectFit: objectFit ?? "cover",
1004
+ borderRadius,
1005
+ display: "inline-block",
1006
+ maxWidth: "100%"
1007
+ }
1008
+ }
1009
+ ) : /* @__PURE__ */ jsx6(
1010
+ "div",
1011
+ {
1012
+ style: {
1013
+ width: width ?? "100%",
1014
+ height: height ?? "200px",
1015
+ background: "#e0e0e0",
1016
+ display: "flex",
1017
+ alignItems: "center",
1018
+ justifyContent: "center",
1019
+ color: "#888",
1020
+ fontSize: "14px",
1021
+ borderRadius
1022
+ },
1023
+ children: /* @__PURE__ */ jsx6(FormattedMessage, { id: "Editor.noImageSelected" })
1024
+ }
1025
+ ),
1026
+ caption && /* @__PURE__ */ jsx6(
1027
+ "figcaption",
1028
+ {
1029
+ style: { marginTop: "8px", fontSize: "14px", color: "#666" },
1030
+ children: caption
1031
+ }
1032
+ )
1033
+ ]
1034
+ }
1035
+ );
1036
+
1037
+ // src/components/Button.tsx
1038
+ import { jsx as jsx7 } from "react/jsx-runtime";
1039
+ var VARIANT_STYLES = {
1040
+ primary: { background: "#1a1a2e", color: "#fff", border: "2px solid #1a1a2e" },
1041
+ secondary: { background: "#e94560", color: "#fff", border: "2px solid #e94560" },
1042
+ outline: { background: "transparent", color: "#1a1a2e", border: "2px solid #1a1a2e" }
1043
+ };
1044
+ var SIZE_STYLES = {
1045
+ sm: { padding: "6px 16px", fontSize: "14px" },
1046
+ md: { padding: "10px 24px", fontSize: "16px" },
1047
+ lg: { padding: "14px 32px", fontSize: "18px" }
1048
+ };
1049
+ var renderButton = ({
1050
+ label,
1051
+ href,
1052
+ variant = "primary",
1053
+ size = "md",
1054
+ fontSize,
1055
+ align = "left",
1056
+ openInNewTab
1057
+ }) => /* @__PURE__ */ jsx7("div", { style: { padding: "12px 16px", textAlign: align, boxSizing: "border-box" }, children: /* @__PURE__ */ jsx7(
1058
+ "a",
1059
+ {
1060
+ href: href ?? "#",
1061
+ target: openInNewTab ? "_blank" : void 0,
1062
+ rel: openInNewTab ? "noopener noreferrer" : void 0,
1063
+ style: {
1064
+ display: "inline-block",
1065
+ borderRadius: "4px",
1066
+ textDecoration: "none",
1067
+ fontWeight: 600,
1068
+ cursor: "pointer",
1069
+ ...VARIANT_STYLES[variant],
1070
+ ...SIZE_STYLES[size],
1071
+ ...fontSize ? { fontSize } : {}
1072
+ },
1073
+ children: label
1074
+ }
1075
+ ) });
1076
+
1077
+ // src/components/Card.tsx
1078
+ import { jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
1079
+ var renderCard = ({
1080
+ title,
1081
+ titleFontSize,
1082
+ body,
1083
+ imageUrl,
1084
+ ctaText,
1085
+ ctaUrl,
1086
+ shadow,
1087
+ borderRadius
1088
+ }) => /* @__PURE__ */ jsxs4(
1089
+ "div",
1090
+ {
1091
+ style: {
1092
+ border: "1px solid #e0e0e0",
1093
+ borderRadius: borderRadius ?? "8px",
1094
+ overflow: "hidden",
1095
+ boxShadow: shadow ? "0 2px 8px rgba(0,0,0,0.12)" : void 0,
1096
+ background: "#fff",
1097
+ margin: "8px",
1098
+ boxSizing: "border-box"
1099
+ },
1100
+ children: [
1101
+ imageUrl && /* @__PURE__ */ jsx8(
1102
+ "img",
1103
+ {
1104
+ src: imageUrl,
1105
+ alt: title,
1106
+ style: { width: "100%", height: "200px", objectFit: "cover", display: "block" }
1107
+ }
1108
+ ),
1109
+ /* @__PURE__ */ jsxs4("div", { style: { padding: "16px" }, children: [
1110
+ /* @__PURE__ */ jsx8("h3", { style: { margin: "0 0 8px", fontSize: titleFontSize || "1.1rem" }, children: title }),
1111
+ body && /* @__PURE__ */ jsx8(
1112
+ RichTextContent,
1113
+ {
1114
+ html: body,
1115
+ style: { margin: "0 0 16px", color: "#555", fontSize: "14px" }
1116
+ }
1117
+ ),
1118
+ ctaText && ctaUrl && /* @__PURE__ */ jsxs4(
1119
+ "a",
1120
+ {
1121
+ href: ctaUrl,
1122
+ style: {
1123
+ color: "#e94560",
1124
+ fontWeight: 600,
1125
+ textDecoration: "none",
1126
+ fontSize: "14px"
1127
+ },
1128
+ children: [
1129
+ ctaText,
1130
+ " \u2192"
1131
+ ]
1132
+ }
1133
+ )
1134
+ ] })
1135
+ ]
1136
+ }
1137
+ );
1138
+
1139
+ // src/components/Spacer.tsx
1140
+ import { jsx as jsx9 } from "react/jsx-runtime";
1141
+ var renderSpacer = ({
1142
+ height = "48px",
1143
+ showLine = false,
1144
+ lineColor = "#e0e0e0"
1145
+ }) => /* @__PURE__ */ jsx9(
1146
+ "div",
1147
+ {
1148
+ style: {
1149
+ height,
1150
+ display: "flex",
1151
+ alignItems: "center",
1152
+ padding: "0 16px",
1153
+ boxSizing: "border-box"
1154
+ },
1155
+ children: showLine && /* @__PURE__ */ jsx9("hr", { style: { width: "100%", border: "none", borderTop: `1px solid ${lineColor}` } })
1156
+ }
1157
+ );
1158
+
1159
+ // src/components/ProductTeaser.tsx
1160
+ import { FormattedMessage as FormattedMessage2 } from "react-intl";
1161
+ import { useDatasource } from "@commercetools-demo/puck-api";
1162
+ import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
1163
+ var getLocalizedName = (name) => {
1164
+ if (!name) return "";
1165
+ return name["en"] ?? name["en-US"] ?? Object.values(name)[0] ?? "";
1166
+ };
1167
+ var formatPrice2 = (centAmount, currencyCode, fractionDigits) => {
1168
+ const amount = centAmount / Math.pow(10, fractionDigits);
1169
+ return `${currencyCode} ${amount.toFixed(fractionDigits)}`;
1170
+ };
1171
+ var renderProductTeaser = ({ datasource, richText, linkWith, baseUrl }) => {
1172
+ const hasPreResolved = datasource?.resolvedData != null;
1173
+ const { data: fetchedData, loading, error } = useDatasource(
1174
+ hasPreResolved ? void 0 : datasource?.type,
1175
+ hasPreResolved ? [] : datasource?.skus ?? []
1176
+ );
1177
+ const data = hasPreResolved ? datasource.resolvedData : fetchedData;
1178
+ const product = data ? Array.isArray(data) ? data[0] ?? null : data : null;
1179
+ const imageUrl = product?.masterVariant?.images?.[0]?.url;
1180
+ const priceValue = product?.masterVariant?.prices?.[0]?.value;
1181
+ const productName = getLocalizedName(product?.name);
1182
+ const href = product ? resolveProductLink(product, linkWith, baseUrl) : void 0;
1183
+ return /* @__PURE__ */ jsxs5(
1184
+ "div",
1185
+ {
1186
+ style: {
1187
+ display: "flex",
1188
+ gap: "24px",
1189
+ padding: "16px",
1190
+ alignItems: "flex-start",
1191
+ fontFamily: "inherit"
1192
+ },
1193
+ children: [
1194
+ /* @__PURE__ */ jsx10("div", { style: { flexShrink: 0, width: "200px" }, children: loading ? /* @__PURE__ */ jsx10(
1195
+ "div",
1196
+ {
1197
+ style: {
1198
+ width: "200px",
1199
+ height: "200px",
1200
+ background: "#f3f4f6",
1201
+ borderRadius: "8px",
1202
+ display: "flex",
1203
+ alignItems: "center",
1204
+ justifyContent: "center",
1205
+ color: "#9ca3af",
1206
+ fontSize: "13px"
1207
+ },
1208
+ children: /* @__PURE__ */ jsx10(FormattedMessage2, { id: "Editor.loading" })
1209
+ }
1210
+ ) : imageUrl ? /* @__PURE__ */ jsx10("a", { href, style: { display: "block" }, children: /* @__PURE__ */ jsx10(
1211
+ "img",
1212
+ {
1213
+ src: imageUrl,
1214
+ alt: productName,
1215
+ style: {
1216
+ width: "200px",
1217
+ height: "200px",
1218
+ objectFit: "cover",
1219
+ borderRadius: "8px",
1220
+ display: "block"
1221
+ }
1222
+ }
1223
+ ) }) : /* @__PURE__ */ jsx10(
1224
+ "div",
1225
+ {
1226
+ style: {
1227
+ width: "200px",
1228
+ height: "200px",
1229
+ background: "#f3f4f6",
1230
+ borderRadius: "8px",
1231
+ display: "flex",
1232
+ alignItems: "center",
1233
+ justifyContent: "center",
1234
+ color: "#9ca3af",
1235
+ fontSize: "13px"
1236
+ },
1237
+ children: error ? /* @__PURE__ */ jsx10(FormattedMessage2, { id: "Editor.errorLoadingProduct" }) : /* @__PURE__ */ jsx10(FormattedMessage2, { id: "Editor.noProductSelected" })
1238
+ }
1239
+ ) }),
1240
+ /* @__PURE__ */ jsxs5(
1241
+ "div",
1242
+ {
1243
+ style: {
1244
+ display: "flex",
1245
+ flexDirection: "column",
1246
+ gap: "12px",
1247
+ flex: 1,
1248
+ minWidth: 0
1249
+ },
1250
+ children: [
1251
+ richText ? /* @__PURE__ */ jsx10(RichTextContent, { html: richText }) : /* @__PURE__ */ jsx10("div", { style: { color: "#9ca3af", fontSize: "13px" }, children: /* @__PURE__ */ jsx10(FormattedMessage2, { id: "Editor.noDescription" }) }),
1252
+ priceValue && /* @__PURE__ */ jsx10(
1253
+ "div",
1254
+ {
1255
+ style: {
1256
+ fontSize: "20px",
1257
+ fontWeight: 700,
1258
+ color: "#111827"
1259
+ },
1260
+ children: formatPrice2(
1261
+ priceValue.centAmount,
1262
+ priceValue.currencyCode,
1263
+ priceValue.fractionDigits
1264
+ )
1265
+ }
1266
+ )
1267
+ ]
1268
+ }
1269
+ )
1270
+ ]
1271
+ }
1272
+ );
1273
+ };
1274
+
1275
+ // src/components/cms/HeroBanner.tsx
1276
+ import { jsx as jsx11, jsxs as jsxs6 } from "react/jsx-runtime";
1277
+ var renderHeroBanner = ({ title, subtitle, image }) => /* @__PURE__ */ jsxs6(
1278
+ "div",
1279
+ {
1280
+ style: {
1281
+ position: "relative",
1282
+ width: "100%",
1283
+ paddingBottom: "56.25%",
1284
+ overflow: "hidden",
1285
+ backgroundColor: "#f0f0f0"
1286
+ },
1287
+ children: [
1288
+ image && /* @__PURE__ */ jsx11(
1289
+ "img",
1290
+ {
1291
+ src: image,
1292
+ alt: title || "Hero banner",
1293
+ style: {
1294
+ position: "absolute",
1295
+ top: 0,
1296
+ left: 0,
1297
+ width: "100%",
1298
+ height: "100%",
1299
+ objectFit: "cover",
1300
+ objectPosition: "center"
1301
+ }
1302
+ }
1303
+ ),
1304
+ /* @__PURE__ */ jsx11(
1305
+ "div",
1306
+ {
1307
+ style: {
1308
+ position: "absolute",
1309
+ top: 0,
1310
+ left: 0,
1311
+ width: "100%",
1312
+ height: "100%",
1313
+ background: "rgba(0,0,0,0.3)",
1314
+ zIndex: 1
1315
+ }
1316
+ }
1317
+ ),
1318
+ /* @__PURE__ */ jsxs6(
1319
+ "div",
1320
+ {
1321
+ style: {
1322
+ position: "absolute",
1323
+ top: "50%",
1324
+ left: "50%",
1325
+ transform: "translate(-50%,-50%)",
1326
+ textAlign: "center",
1327
+ color: "white",
1328
+ zIndex: 2,
1329
+ padding: "2rem",
1330
+ maxWidth: "90%"
1331
+ },
1332
+ children: [
1333
+ title && /* @__PURE__ */ jsx11(
1334
+ "h1",
1335
+ {
1336
+ style: {
1337
+ fontSize: "3rem",
1338
+ fontWeight: "bold",
1339
+ margin: "0 0 1rem 0",
1340
+ textShadow: "2px 2px 4px rgba(0,0,0,0.7)"
1341
+ },
1342
+ children: title
1343
+ }
1344
+ ),
1345
+ subtitle && /* @__PURE__ */ jsx11(
1346
+ "p",
1347
+ {
1348
+ style: {
1349
+ fontSize: "1.25rem",
1350
+ margin: 0,
1351
+ textShadow: "1px 1px 2px rgba(0,0,0,0.7)",
1352
+ opacity: 0.95
1353
+ },
1354
+ children: subtitle
1355
+ }
1356
+ )
1357
+ ]
1358
+ }
1359
+ )
1360
+ ]
1361
+ }
1362
+ );
1363
+
1364
+ // src/components/cms/TextBlock.tsx
1365
+ import { Fragment as Fragment2, jsx as jsx12 } from "react/jsx-runtime";
1366
+ var renderTextBlock = ({ content }) => {
1367
+ if (!content) return /* @__PURE__ */ jsx12(Fragment2, {});
1368
+ return /* @__PURE__ */ jsx12(
1369
+ RichTextContent,
1370
+ {
1371
+ html: content,
1372
+ style: {
1373
+ maxWidth: "720px",
1374
+ margin: "0 auto",
1375
+ padding: "1.5rem 1rem",
1376
+ lineHeight: 1.6,
1377
+ color: "#333"
1378
+ }
1379
+ }
1380
+ );
1381
+ };
1382
+
1383
+ // src/components/cms/CategoryGrid.tsx
1384
+ import { FormattedMessage as FormattedMessage3 } from "react-intl";
1385
+ import { jsx as jsx13, jsxs as jsxs7 } from "react/jsx-runtime";
1386
+ var renderCategoryGrid = (props) => {
1387
+ const categories = [
1388
+ [props.category1Image, props.category1Label, props.category1Link],
1389
+ [props.category2Image, props.category2Label, props.category2Link],
1390
+ [props.category3Image, props.category3Label, props.category3Link],
1391
+ [props.category4Image, props.category4Label, props.category4Link]
1392
+ ].filter(([, label, link]) => label && link);
1393
+ if (categories.length === 0) return /* @__PURE__ */ jsx13("div", { style: { padding: "2rem", textAlign: "center", color: "#999", fontSize: "13px" }, children: /* @__PURE__ */ jsx13(FormattedMessage3, { id: "Editor.noCategoriesConfigured" }) });
1394
+ return /* @__PURE__ */ jsx13(
1395
+ "div",
1396
+ {
1397
+ style: {
1398
+ display: "grid",
1399
+ gridTemplateColumns: "repeat(auto-fill, minmax(200px, 1fr))",
1400
+ gap: "1.5rem",
1401
+ padding: "2rem 1rem"
1402
+ },
1403
+ children: categories.map(([image, label, link], i) => /* @__PURE__ */ jsxs7(
1404
+ "a",
1405
+ {
1406
+ href: link,
1407
+ style: {
1408
+ display: "block",
1409
+ textAlign: "center",
1410
+ textDecoration: "none",
1411
+ color: "inherit",
1412
+ borderRadius: "8px",
1413
+ overflow: "hidden",
1414
+ boxShadow: "0 2px 8px rgba(0,0,0,0.1)"
1415
+ },
1416
+ children: [
1417
+ /* @__PURE__ */ jsx13("div", { style: { aspectRatio: "1", background: "#f0f0f0", overflow: "hidden" }, children: image && /* @__PURE__ */ jsx13(
1418
+ "img",
1419
+ {
1420
+ src: image,
1421
+ alt: label,
1422
+ style: { width: "100%", height: "100%", objectFit: "cover" }
1423
+ }
1424
+ ) }),
1425
+ /* @__PURE__ */ jsx13(
1426
+ "span",
1427
+ {
1428
+ style: {
1429
+ display: "block",
1430
+ padding: "1rem",
1431
+ fontWeight: 600,
1432
+ color: "#333"
1433
+ },
1434
+ children: label
1435
+ }
1436
+ )
1437
+ ]
1438
+ },
1439
+ i
1440
+ ))
1441
+ }
1442
+ );
1443
+ };
1444
+
1445
+ // src/components/cms/CategoryHero.tsx
1446
+ import { jsx as jsx14, jsxs as jsxs8 } from "react/jsx-runtime";
1447
+ var renderCategoryHero = ({ title, subtitle, image, ctaText, ctaLink }) => /* @__PURE__ */ jsxs8(
1448
+ "div",
1449
+ {
1450
+ style: {
1451
+ position: "relative",
1452
+ minHeight: "220px",
1453
+ display: "flex",
1454
+ alignItems: "center",
1455
+ justifyContent: "center",
1456
+ background: "#f0f0f0",
1457
+ borderRadius: "8px",
1458
+ overflow: "hidden",
1459
+ margin: "1rem 0"
1460
+ },
1461
+ children: [
1462
+ image && /* @__PURE__ */ jsx14(
1463
+ "img",
1464
+ {
1465
+ src: image,
1466
+ alt: title || "Category",
1467
+ style: {
1468
+ position: "absolute",
1469
+ top: 0,
1470
+ left: 0,
1471
+ width: "100%",
1472
+ height: "100%",
1473
+ objectFit: "cover",
1474
+ opacity: 0.85
1475
+ }
1476
+ }
1477
+ ),
1478
+ /* @__PURE__ */ jsx14("div", { style: { position: "absolute", inset: 0, background: "rgba(0,0,0,0.25)" } }),
1479
+ /* @__PURE__ */ jsxs8(
1480
+ "div",
1481
+ {
1482
+ style: {
1483
+ position: "relative",
1484
+ zIndex: 1,
1485
+ textAlign: "center",
1486
+ padding: "2rem",
1487
+ color: "white",
1488
+ textShadow: "0 1px 3px rgba(0,0,0,0.5)"
1489
+ },
1490
+ children: [
1491
+ title && /* @__PURE__ */ jsx14("h1", { style: { fontSize: "2.5rem", marginBottom: "0.5rem" }, children: title }),
1492
+ subtitle && /* @__PURE__ */ jsx14("p", { style: { fontSize: "1.1rem", marginBottom: "1rem" }, children: subtitle }),
1493
+ ctaText && ctaLink && /* @__PURE__ */ jsx14(
1494
+ "a",
1495
+ {
1496
+ href: ctaLink,
1497
+ style: {
1498
+ display: "inline-block",
1499
+ background: "white",
1500
+ color: "#2c5530",
1501
+ padding: "0.75rem 2rem",
1502
+ borderRadius: "4px",
1503
+ textDecoration: "none",
1504
+ fontWeight: 600
1505
+ },
1506
+ children: ctaText
1507
+ }
1508
+ )
1509
+ ]
1510
+ }
1511
+ )
1512
+ ]
1513
+ }
1514
+ );
1515
+
1516
+ // src/components/cms/CheckoutPromoBanner.tsx
1517
+ import { Fragment as Fragment3, jsx as jsx15, jsxs as jsxs9 } from "react/jsx-runtime";
1518
+ var renderCheckoutPromoBanner = ({ title, message, ctaText, ctaLink }) => {
1519
+ if (!title && !message && !ctaText) return /* @__PURE__ */ jsx15(Fragment3, {});
1520
+ return /* @__PURE__ */ jsxs9(
1521
+ "div",
1522
+ {
1523
+ style: {
1524
+ padding: "1rem 1.25rem",
1525
+ background: "#f0f7f0",
1526
+ border: "1px solid #c8e6c8",
1527
+ borderRadius: "4px",
1528
+ marginBottom: "1rem",
1529
+ fontSize: "0.95rem"
1530
+ },
1531
+ children: [
1532
+ title && /* @__PURE__ */ jsx15("div", { style: { fontWeight: 600, color: "#2c5530", marginBottom: "0.25rem" }, children: title }),
1533
+ message && /* @__PURE__ */ jsx15("p", { style: { margin: "0 0 0.5rem 0", color: "#333" }, children: message }),
1534
+ ctaText && ctaLink && /* @__PURE__ */ jsx15("a", { href: ctaLink, style: { color: "#2c5530", fontWeight: 600, textDecoration: "none" }, children: ctaText })
1535
+ ]
1536
+ }
1537
+ );
1538
+ };
1539
+
1540
+ // src/components/cms/CountdownBanner.tsx
1541
+ import { useEffect, useState } from "react";
1542
+ import { jsx as jsx16, jsxs as jsxs10 } from "react/jsx-runtime";
1543
+ var calcTimeLeft = (endDate) => {
1544
+ if (!endDate) return "";
1545
+ const end = new Date(endDate);
1546
+ const now = /* @__PURE__ */ new Date();
1547
+ if (end <= now) return "Offer ended";
1548
+ const diff = end.getTime() - now.getTime();
1549
+ const d = Math.floor(diff / 864e5);
1550
+ const h = Math.floor(diff % 864e5 / 36e5);
1551
+ const m = Math.floor(diff % 36e5 / 6e4);
1552
+ const s = Math.floor(diff % 6e4 / 1e3);
1553
+ if (d > 0) return `${d}d ${h}h ${m}m left`;
1554
+ if (h > 0) return `${h}h ${m}m ${s}s left`;
1555
+ return `${m}m ${s}s left`;
1556
+ };
1557
+ var renderCountdownBanner = ({ headline, subline, endDate, ctaText, ctaLink, background }) => {
1558
+ const [timeLeft, setTimeLeft] = useState(() => calcTimeLeft(endDate));
1559
+ useEffect(() => {
1560
+ if (!endDate) return;
1561
+ const id = setInterval(() => setTimeLeft(calcTimeLeft(endDate)), 1e3);
1562
+ return () => clearInterval(id);
1563
+ }, [endDate]);
1564
+ return /* @__PURE__ */ jsxs10(
1565
+ "div",
1566
+ {
1567
+ style: {
1568
+ background: background || "#2c5530",
1569
+ color: "white",
1570
+ padding: "2rem 1rem",
1571
+ textAlign: "center",
1572
+ borderRadius: "4px",
1573
+ margin: "1rem 0"
1574
+ },
1575
+ children: [
1576
+ headline && /* @__PURE__ */ jsx16("h2", { style: { fontSize: "1.75rem", marginBottom: "0.5rem" }, children: headline }),
1577
+ subline && /* @__PURE__ */ jsx16("p", { style: { fontSize: "1rem", opacity: 0.9, marginBottom: "1rem" }, children: subline }),
1578
+ timeLeft && /* @__PURE__ */ jsx16("p", { style: { fontSize: "1.25rem", fontWeight: 600, margin: "0 0 1rem 0", letterSpacing: "0.05em" }, children: timeLeft }),
1579
+ ctaText && ctaLink && /* @__PURE__ */ jsx16(
1580
+ "a",
1581
+ {
1582
+ href: ctaLink,
1583
+ style: {
1584
+ display: "inline-block",
1585
+ background: "white",
1586
+ color: "#2c5530",
1587
+ padding: "0.75rem 2rem",
1588
+ borderRadius: "4px",
1589
+ textDecoration: "none",
1590
+ fontWeight: 600
1591
+ },
1592
+ children: ctaText
1593
+ }
1594
+ )
1595
+ ]
1596
+ }
1597
+ );
1598
+ };
1599
+
1600
+ // src/components/cms/CrossSellBlock.tsx
1601
+ import { FormattedMessage as FormattedMessage4 } from "react-intl";
1602
+ import { useDatasource as useDatasource2 } from "@commercetools-demo/puck-api";
1603
+ import { Fragment as Fragment4, jsx as jsx17, jsxs as jsxs11 } from "react/jsx-runtime";
1604
+ var renderCrossSellBlock = ({ title, products, ctaText, linkWith, baseUrl }) => {
1605
+ const hasPreResolved = products?.resolvedData != null;
1606
+ const { data: fetchedData, loading } = useDatasource2(
1607
+ hasPreResolved ? void 0 : products?.type,
1608
+ hasPreResolved ? [] : products?.skus ?? []
1609
+ );
1610
+ const items = hasPreResolved ? Array.isArray(products.resolvedData) ? products.resolvedData : [] : Array.isArray(fetchedData) ? fetchedData : [];
1611
+ if (!loading && items.length === 0) return /* @__PURE__ */ jsx17(Fragment4, {});
1612
+ return /* @__PURE__ */ jsxs11("div", { style: { padding: "2rem 0", borderTop: "1px solid #eee" }, children: [
1613
+ title && /* @__PURE__ */ jsx17("h3", { style: { fontSize: "1.5rem", marginBottom: "1.5rem", color: "#333" }, children: title || "Frequently bought together" }),
1614
+ loading && /* @__PURE__ */ jsx17("div", { style: { color: "#999", padding: "1rem" }, children: /* @__PURE__ */ jsx17(FormattedMessage4, { id: "Editor.loading" }) }),
1615
+ items.length > 0 && /* @__PURE__ */ jsx17(
1616
+ "div",
1617
+ {
1618
+ style: {
1619
+ display: "grid",
1620
+ gridTemplateColumns: "repeat(auto-fill, minmax(180px, 1fr))",
1621
+ gap: "1rem"
1622
+ },
1623
+ children: items.map((product, i) => {
1624
+ const name = getLocalizedText(product?.name);
1625
+ const imageUrl = getProductImage(product);
1626
+ const priceVal = getFirstPrice(product);
1627
+ return /* @__PURE__ */ jsxs11(
1628
+ "a",
1629
+ {
1630
+ href: resolveProductLink(product, linkWith, baseUrl),
1631
+ style: {
1632
+ textAlign: "center",
1633
+ textDecoration: "none",
1634
+ color: "inherit",
1635
+ padding: "1rem",
1636
+ borderRadius: "8px",
1637
+ border: "1px solid #eee"
1638
+ },
1639
+ children: [
1640
+ /* @__PURE__ */ jsx17("div", { style: { height: "120px", marginBottom: "0.75rem", display: "flex", alignItems: "center", justifyContent: "center", background: "#f9f9f9", borderRadius: "4px" }, children: imageUrl ? /* @__PURE__ */ jsx17("img", { src: imageUrl, alt: name, style: { maxWidth: "100%", maxHeight: "100%", objectFit: "contain" } }) : null }),
1641
+ /* @__PURE__ */ jsx17("div", { style: { fontWeight: 600, fontSize: "0.95rem", marginBottom: "0.25rem" }, children: name }),
1642
+ priceVal && /* @__PURE__ */ jsx17("div", { style: { fontSize: "1.1rem", color: "#2c5530", fontWeight: "bold" }, children: formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits) })
1643
+ ]
1644
+ },
1645
+ product?.id ?? i
1646
+ );
1647
+ })
1648
+ }
1649
+ ),
1650
+ ctaText && /* @__PURE__ */ jsx17("a", { href: "#", style: { display: "inline-block", marginTop: "1rem", color: "#2c5530", fontWeight: 600, textDecoration: "none" }, children: ctaText })
1651
+ ] });
1652
+ };
1653
+
1654
+ // src/components/cms/DeliveryMessage.tsx
1655
+ import { Fragment as Fragment5, jsx as jsx18 } from "react/jsx-runtime";
1656
+ var renderDeliveryMessage = ({ message, threshold }) => {
1657
+ if (!message) return /* @__PURE__ */ jsx18(Fragment5, {});
1658
+ const text = threshold ? message.replace(/\$\d+/g, `$${threshold}`) : message;
1659
+ return /* @__PURE__ */ jsx18(
1660
+ "div",
1661
+ {
1662
+ style: {
1663
+ padding: "0.75rem 1rem",
1664
+ background: "#f0f7f0",
1665
+ borderRadius: "4px",
1666
+ fontSize: "0.95rem",
1667
+ color: "#2c5530"
1668
+ },
1669
+ children: text
1670
+ }
1671
+ );
1672
+ };
1673
+
1674
+ // src/components/cms/Divider.tsx
1675
+ import { jsx as jsx19 } from "react/jsx-runtime";
1676
+ var renderDivider = ({
1677
+ lineStyle,
1678
+ spacing
1679
+ }) => {
1680
+ const s = parseInt(spacing, 10) || 24;
1681
+ return /* @__PURE__ */ jsx19(
1682
+ "hr",
1683
+ {
1684
+ style: {
1685
+ border: "none",
1686
+ borderTop: `1px ${lineStyle} #ddd`,
1687
+ margin: `${s / 2}px 0`
1688
+ }
1689
+ }
1690
+ );
1691
+ };
1692
+
1693
+ // src/components/cms/EmptyState.tsx
1694
+ import { jsx as jsx20, jsxs as jsxs12 } from "react/jsx-runtime";
1695
+ var renderEmptyState = ({ image, title, description, ctaText, ctaLink }) => /* @__PURE__ */ jsxs12("div", { style: { textAlign: "center", padding: "3rem 1rem" }, children: [
1696
+ image && /* @__PURE__ */ jsx20(
1697
+ "img",
1698
+ {
1699
+ src: image,
1700
+ alt: title || "Empty state",
1701
+ style: { maxWidth: "200px", height: "auto", marginBottom: "1.5rem", opacity: 0.8 }
1702
+ }
1703
+ ),
1704
+ title && /* @__PURE__ */ jsx20("h2", { style: { fontSize: "1.5rem", color: "#333", marginBottom: "0.5rem" }, children: title }),
1705
+ description && /* @__PURE__ */ jsx20("p", { style: { color: "#666", marginBottom: "1.5rem", maxWidth: "400px", margin: "0 auto 1.5rem" }, children: description }),
1706
+ ctaText && ctaLink && /* @__PURE__ */ jsx20(
1707
+ "a",
1708
+ {
1709
+ href: ctaLink,
1710
+ style: {
1711
+ display: "inline-block",
1712
+ background: "#2c5530",
1713
+ color: "white",
1714
+ padding: "0.75rem 2rem",
1715
+ borderRadius: "4px",
1716
+ textDecoration: "none",
1717
+ fontWeight: 600
1718
+ },
1719
+ children: ctaText
1720
+ }
1721
+ )
1722
+ ] });
1723
+
1724
+ // src/components/cms/FAQAccordion.tsx
1725
+ import { useState as useState2 } from "react";
1726
+ import { FormattedMessage as FormattedMessage5 } from "react-intl";
1727
+ import { jsx as jsx21, jsxs as jsxs13 } from "react/jsx-runtime";
1728
+ var renderFAQAccordion = (props) => {
1729
+ const items = [
1730
+ [props.question1, props.answer1],
1731
+ [props.question2, props.answer2],
1732
+ [props.question3, props.answer3],
1733
+ [props.question4, props.answer4]
1734
+ ].filter(([q]) => q);
1735
+ const [open, setOpen] = useState2(null);
1736
+ if (items.length === 0) return /* @__PURE__ */ jsx21("div", { style: { padding: "1rem", color: "#999", fontSize: "13px" }, children: /* @__PURE__ */ jsx21(FormattedMessage5, { id: "Editor.noFaqItemsConfigured" }) });
1737
+ return /* @__PURE__ */ jsx21("div", { style: { border: "1px solid #eee", borderRadius: "8px", overflow: "hidden" }, children: items.map(([question, answer], i) => /* @__PURE__ */ jsxs13("div", { style: { borderBottom: i < items.length - 1 ? "1px solid #eee" : "none" }, children: [
1738
+ /* @__PURE__ */ jsxs13(
1739
+ "button",
1740
+ {
1741
+ onClick: () => setOpen(open === i ? null : i),
1742
+ style: {
1743
+ width: "100%",
1744
+ padding: "1rem 1.25rem",
1745
+ textAlign: "left",
1746
+ fontWeight: 600,
1747
+ fontSize: "1rem",
1748
+ background: "#fafafa",
1749
+ border: "none",
1750
+ cursor: "pointer",
1751
+ display: "flex",
1752
+ justifyContent: "space-between",
1753
+ alignItems: "center"
1754
+ },
1755
+ children: [
1756
+ question,
1757
+ /* @__PURE__ */ jsx21("span", { style: { fontSize: "1.2rem", lineHeight: 1 }, children: open === i ? "\u2212" : "+" })
1758
+ ]
1759
+ }
1760
+ ),
1761
+ open === i && answer && /* @__PURE__ */ jsx21(
1762
+ RichTextContent,
1763
+ {
1764
+ html: answer,
1765
+ style: {
1766
+ padding: "1rem 1.25rem",
1767
+ background: "white",
1768
+ fontSize: "0.95rem",
1769
+ lineHeight: 1.5,
1770
+ color: "#555"
1771
+ }
1772
+ }
1773
+ )
1774
+ ] }, i)) });
1775
+ };
1776
+
1777
+ // src/components/cms/FooterBlock.tsx
1778
+ import { jsx as jsx22, jsxs as jsxs14 } from "react/jsx-runtime";
1779
+ var renderFooterBlock = ({ column1, column2, column3, copyright }) => {
1780
+ const columns = [column1, column2, column3].filter(Boolean);
1781
+ return /* @__PURE__ */ jsxs14("footer", { style: { background: "#333", color: "#eee", padding: "2rem 1rem", marginTop: "3rem" }, children: [
1782
+ columns.length > 0 && /* @__PURE__ */ jsx22(
1783
+ "div",
1784
+ {
1785
+ style: {
1786
+ display: "grid",
1787
+ gridTemplateColumns: `repeat(${columns.length}, 1fr)`,
1788
+ gap: "2rem",
1789
+ maxWidth: "1200px",
1790
+ margin: "0 auto 2rem"
1791
+ },
1792
+ children: columns.map((html, i) => /* @__PURE__ */ jsx22(
1793
+ RichTextContent,
1794
+ {
1795
+ html,
1796
+ style: { fontSize: "0.9rem", lineHeight: 1.6 }
1797
+ },
1798
+ i
1799
+ ))
1800
+ }
1801
+ ),
1802
+ copyright && /* @__PURE__ */ jsx22("p", { style: { textAlign: "center", fontSize: "0.85rem", color: "#999", margin: 0 }, children: copyright })
1803
+ ] });
1804
+ };
1805
+
1806
+ // src/components/cms/ImageBlock.tsx
1807
+ import { FormattedMessage as FormattedMessage6 } from "react-intl";
1808
+ import { jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
1809
+ var renderImageBlock = ({ image, caption, link }) => {
1810
+ if (!image) return /* @__PURE__ */ jsx23("div", { style: { padding: "2rem", textAlign: "center", color: "#999", background: "#f5f5f5", borderRadius: "4px" }, children: /* @__PURE__ */ jsx23(FormattedMessage6, { id: "Editor.noImageSelected" }) });
1811
+ const img = /* @__PURE__ */ jsx23(
1812
+ "img",
1813
+ {
1814
+ src: image,
1815
+ alt: caption || "Image",
1816
+ style: { maxWidth: "100%", height: "auto", borderRadius: "4px" }
1817
+ }
1818
+ );
1819
+ return /* @__PURE__ */ jsxs15("figure", { style: { margin: "1rem 0", textAlign: "center" }, children: [
1820
+ link ? /* @__PURE__ */ jsx23("a", { href: link, style: { display: "inline-block" }, children: img }) : img,
1821
+ caption && /* @__PURE__ */ jsx23("figcaption", { style: { marginTop: "0.5rem", fontSize: "0.9rem", color: "#666" }, children: caption })
1822
+ ] });
1823
+ };
1824
+
1825
+ // src/components/cms/NewsletterSignup.tsx
1826
+ import { useIntl } from "react-intl";
1827
+ import { jsx as jsx24, jsxs as jsxs16 } from "react/jsx-runtime";
1828
+ var renderNewsletterSignup = ({ title, subtitle, ctaText, placeholder }) => {
1829
+ const intl = useIntl();
1830
+ return /* @__PURE__ */ jsxs16(
1831
+ "div",
1832
+ {
1833
+ style: {
1834
+ textAlign: "center",
1835
+ padding: "2rem 1rem",
1836
+ background: "#f5f5f5",
1837
+ borderRadius: "8px",
1838
+ maxWidth: "480px",
1839
+ margin: "0 auto"
1840
+ },
1841
+ children: [
1842
+ title && /* @__PURE__ */ jsx24("h3", { style: { fontSize: "1.5rem", marginBottom: "0.5rem", color: "#333" }, children: title }),
1843
+ subtitle && /* @__PURE__ */ jsx24("p", { style: { fontSize: "0.95rem", color: "#666", marginBottom: "1.5rem" }, children: subtitle }),
1844
+ /* @__PURE__ */ jsxs16(
1845
+ "form",
1846
+ {
1847
+ onSubmit: (e) => e.preventDefault(),
1848
+ style: { display: "flex", gap: "0.5rem", flexWrap: "wrap", justifyContent: "center" },
1849
+ children: [
1850
+ /* @__PURE__ */ jsx24(
1851
+ "input",
1852
+ {
1853
+ type: "email",
1854
+ placeholder,
1855
+ "aria-label": intl.formatMessage({ id: "Editor.newsletterEmailAria" }),
1856
+ style: {
1857
+ padding: "0.75rem 1rem",
1858
+ border: "1px solid #ddd",
1859
+ borderRadius: "4px",
1860
+ fontSize: "1rem",
1861
+ minWidth: "200px"
1862
+ }
1863
+ }
1864
+ ),
1865
+ /* @__PURE__ */ jsx24(
1866
+ "button",
1867
+ {
1868
+ type: "submit",
1869
+ style: {
1870
+ padding: "0.75rem 1.5rem",
1871
+ background: "#2c5530",
1872
+ color: "white",
1873
+ border: "none",
1874
+ borderRadius: "4px",
1875
+ fontWeight: 600,
1876
+ cursor: "pointer"
1877
+ },
1878
+ children: ctaText || "Subscribe"
1879
+ }
1880
+ )
1881
+ ]
1882
+ }
1883
+ )
1884
+ ]
1885
+ }
1886
+ );
1887
+ };
1888
+
1889
+ // src/components/cms/ProductBanner.tsx
1890
+ import { FormattedMessage as FormattedMessage7 } from "react-intl";
1891
+ import { useDatasource as useDatasource3 } from "@commercetools-demo/puck-api";
1892
+ import { jsx as jsx25, jsxs as jsxs17 } from "react/jsx-runtime";
1893
+ var renderProductBanner = ({
1894
+ title,
1895
+ description,
1896
+ ctaText,
1897
+ ctaLink,
1898
+ product,
1899
+ productOnLeft,
1900
+ background,
1901
+ linkWith,
1902
+ baseUrl
1903
+ }) => {
1904
+ const hasPreResolved = product?.resolvedData != null;
1905
+ const { data: fetchedData, loading } = useDatasource3(
1906
+ hasPreResolved ? void 0 : product?.type,
1907
+ hasPreResolved ? [] : product?.skus ?? []
1908
+ );
1909
+ const raw = hasPreResolved ? product.resolvedData : fetchedData;
1910
+ const p = raw;
1911
+ const name = getLocalizedText(p?.name);
1912
+ const description2 = getLocalizedText(p?.description);
1913
+ const imageUrl = p?.masterVariant?.images?.[0]?.url;
1914
+ const sku = p?.masterVariant?.sku;
1915
+ const priceVal = getFirstPrice(p);
1916
+ const productHref = p ? resolveProductLink(p, linkWith, baseUrl) : void 0;
1917
+ return /* @__PURE__ */ jsxs17(
1918
+ "div",
1919
+ {
1920
+ style: {
1921
+ display: "flex",
1922
+ alignItems: "center",
1923
+ minHeight: "400px",
1924
+ backgroundColor: background || "#f5f5f5",
1925
+ padding: "2rem",
1926
+ borderRadius: "2px",
1927
+ margin: "1rem 0",
1928
+ gap: "2rem",
1929
+ flexDirection: productOnLeft ? "row-reverse" : "row",
1930
+ flexWrap: "wrap"
1931
+ },
1932
+ children: [
1933
+ /* @__PURE__ */ jsxs17("div", { style: { flex: 1, minWidth: "200px" }, children: [
1934
+ title && /* @__PURE__ */ jsx25("h2", { style: { fontSize: "2rem", fontWeight: "bold", marginBottom: "1rem", color: "#333" }, children: title }),
1935
+ description && /* @__PURE__ */ jsx25(
1936
+ RichTextContent,
1937
+ {
1938
+ html: description,
1939
+ style: { marginBottom: "2rem", color: "#555", lineHeight: 1.6 }
1940
+ }
1941
+ ),
1942
+ ctaText && ctaLink && /* @__PURE__ */ jsx25(
1943
+ "a",
1944
+ {
1945
+ href: ctaLink,
1946
+ style: {
1947
+ display: "inline-block",
1948
+ backgroundColor: "#2c5530",
1949
+ color: "white",
1950
+ padding: "0.75rem 2rem",
1951
+ borderRadius: "2px",
1952
+ textDecoration: "none",
1953
+ fontWeight: 600
1954
+ },
1955
+ children: ctaText
1956
+ }
1957
+ )
1958
+ ] }),
1959
+ /* @__PURE__ */ jsxs17("div", { style: { flex: 1, minWidth: "200px", display: "flex", flexDirection: "column", alignItems: "center" }, children: [
1960
+ loading && /* @__PURE__ */ jsx25("div", { style: { color: "#999", padding: "2rem" }, children: /* @__PURE__ */ jsx25(FormattedMessage7, { id: "Editor.loadingProduct" }) }),
1961
+ name && /* @__PURE__ */ jsx25("a", { href: productHref, style: { textDecoration: "none", color: "inherit" }, children: /* @__PURE__ */ jsx25("h3", { style: { fontSize: "1.5rem", fontWeight: 600, marginBottom: "0.5rem", textAlign: "center" }, children: name }) }),
1962
+ description2 && /* @__PURE__ */ jsx25("p", { style: { fontSize: "0.9rem", color: "#666", textAlign: "center", marginBottom: "1rem", fontStyle: "italic" }, children: description2 }),
1963
+ imageUrl && /* @__PURE__ */ jsx25("a", { href: productHref, style: { display: "block", marginBottom: "1rem" }, children: /* @__PURE__ */ jsx25(
1964
+ "img",
1965
+ {
1966
+ src: imageUrl,
1967
+ alt: name || "Product",
1968
+ style: { maxWidth: "100%", maxHeight: "300px", objectFit: "cover", borderRadius: "2px", boxShadow: "0 4px 12px rgba(0,0,0,0.1)", display: "block" }
1969
+ }
1970
+ ) }),
1971
+ priceVal && /* @__PURE__ */ jsx25(
1972
+ "span",
1973
+ {
1974
+ style: {
1975
+ fontSize: "1.25rem",
1976
+ fontWeight: "bold",
1977
+ color: "#2c5530",
1978
+ background: "rgba(255,255,255,0.8)",
1979
+ padding: "0.5rem 1rem",
1980
+ borderRadius: "2px",
1981
+ marginBottom: "0.5rem"
1982
+ },
1983
+ children: formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits)
1984
+ }
1985
+ ),
1986
+ sku && /* @__PURE__ */ jsx25("span", { style: { fontSize: "0.85rem", color: "#666", background: "rgba(255,255,255,0.6)", padding: "0.25rem 0.75rem", borderRadius: "2px" }, children: /* @__PURE__ */ jsx25(FormattedMessage7, { id: "Editor.skuLabel", values: { sku } }) }),
1987
+ !loading && !p && /* @__PURE__ */ jsx25("div", { style: { color: "#999", fontSize: "13px", padding: "2rem", textAlign: "center" }, children: /* @__PURE__ */ jsx25(FormattedMessage7, { id: "Editor.noProductSelected" }) })
1988
+ ] })
1989
+ ]
1990
+ }
1991
+ );
1992
+ };
1993
+
1994
+ // src/components/cms/ProductGridHeader.tsx
1995
+ import { jsx as jsx26, jsxs as jsxs18 } from "react/jsx-runtime";
1996
+ var renderProductGridHeader = ({ title, description }) => /* @__PURE__ */ jsxs18("div", { style: { marginBottom: "2rem", padding: "0 1rem" }, children: [
1997
+ title && /* @__PURE__ */ jsx26("h1", { style: { fontSize: "2rem", fontWeight: "bold", color: "#333", marginBottom: "0.75rem" }, children: title }),
1998
+ description && /* @__PURE__ */ jsx26(
1999
+ RichTextContent,
2000
+ {
2001
+ html: description,
2002
+ style: { fontSize: "1rem", color: "#666", lineHeight: 1.5, maxWidth: "720px" }
2003
+ }
2004
+ )
2005
+ ] });
2006
+
2007
+ // src/components/cms/ProductSlider.tsx
2008
+ import { FormattedMessage as FormattedMessage8 } from "react-intl";
2009
+ import { useDatasource as useDatasource4 } from "@commercetools-demo/puck-api";
2010
+ import { jsx as jsx27, jsxs as jsxs19 } from "react/jsx-runtime";
2011
+ var renderProductSlider = ({ title, subtitle, products, linkWith, baseUrl }) => {
2012
+ const hasPreResolved = products?.resolvedData != null;
2013
+ const { data: fetchedData, loading } = useDatasource4(
2014
+ hasPreResolved ? void 0 : products?.type,
2015
+ hasPreResolved ? [] : products?.skus ?? []
2016
+ );
2017
+ const items = hasPreResolved ? Array.isArray(products.resolvedData) ? products.resolvedData : [] : Array.isArray(fetchedData) ? fetchedData : [];
2018
+ return /* @__PURE__ */ jsxs19("div", { style: { padding: "2rem 0" }, children: [
2019
+ (title || subtitle) && /* @__PURE__ */ jsxs19("div", { style: { textAlign: "center", marginBottom: "1.5rem" }, children: [
2020
+ title && /* @__PURE__ */ jsx27("h2", { style: { fontSize: "2rem", fontWeight: "bold", color: "#333", marginBottom: "0.5rem" }, children: title }),
2021
+ subtitle && /* @__PURE__ */ jsx27("p", { style: { fontSize: "1.1rem", color: "#666", margin: 0 }, children: subtitle })
2022
+ ] }),
2023
+ loading && /* @__PURE__ */ jsx27("div", { style: { textAlign: "center", color: "#999", padding: "2rem" }, children: /* @__PURE__ */ jsx27(FormattedMessage8, { id: "Editor.loadingProducts" }) }),
2024
+ !loading && items.length === 0 && /* @__PURE__ */ jsx27("div", { style: { textAlign: "center", color: "#999", padding: "2rem", fontSize: "13px" }, children: /* @__PURE__ */ jsx27(FormattedMessage8, { id: "Editor.noProductsConfigured" }) }),
2025
+ items.length > 0 && /* @__PURE__ */ jsx27(
2026
+ "div",
2027
+ {
2028
+ style: {
2029
+ display: "flex",
2030
+ gap: "1rem",
2031
+ overflowX: "auto",
2032
+ scrollSnapType: "x mandatory",
2033
+ paddingBottom: "1rem"
2034
+ },
2035
+ children: items.map((product, i) => {
2036
+ const name = getLocalizedText(product?.name);
2037
+ const desc = getLocalizedText(product?.description);
2038
+ const imageUrl = getProductImage(product);
2039
+ const priceVal = getFirstPrice(product);
2040
+ return /* @__PURE__ */ jsxs19(
2041
+ "a",
2042
+ {
2043
+ href: resolveProductLink(product, linkWith, baseUrl),
2044
+ style: {
2045
+ flex: "0 0 280px",
2046
+ background: "white",
2047
+ borderRadius: "12px",
2048
+ boxShadow: "0 4px 12px rgba(0,0,0,0.1)",
2049
+ overflow: "hidden",
2050
+ textDecoration: "none",
2051
+ color: "inherit",
2052
+ scrollSnapAlign: "start"
2053
+ },
2054
+ children: [
2055
+ /* @__PURE__ */ jsx27("div", { style: { width: "100%", height: "200px", background: "#f5f5f5", display: "flex", alignItems: "center", justifyContent: "center", overflow: "hidden" }, children: imageUrl ? /* @__PURE__ */ jsx27("img", { src: imageUrl, alt: name, style: { width: "100%", height: "100%", objectFit: "contain" } }) : /* @__PURE__ */ jsx27("span", { style: { color: "#999", fontSize: "0.85rem" }, children: /* @__PURE__ */ jsx27(FormattedMessage8, { id: "Editor.noImage" }) }) }),
2056
+ /* @__PURE__ */ jsxs19("div", { style: { padding: "1.5rem" }, children: [
2057
+ /* @__PURE__ */ jsx27("h3", { style: { fontSize: "1.1rem", fontWeight: 600, color: "#333", marginBottom: "0.5rem", lineHeight: 1.3 }, children: name }),
2058
+ desc && /* @__PURE__ */ jsx27("p", { style: { fontSize: "0.9rem", color: "#666", marginBottom: "1rem", display: "-webkit-box", WebkitLineClamp: 2, WebkitBoxOrient: "vertical", overflow: "hidden" }, children: desc }),
2059
+ priceVal && /* @__PURE__ */ jsx27("div", { style: { fontSize: "1.2rem", fontWeight: "bold", color: "#2c5530" }, children: formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits) })
2060
+ ] })
2061
+ ]
2062
+ },
2063
+ product?.id ?? i
2064
+ );
2065
+ })
2066
+ }
2067
+ )
2068
+ ] });
2069
+ };
2070
+
2071
+ // src/components/cms/PromotionalBanner.tsx
2072
+ import { jsx as jsx28, jsxs as jsxs20 } from "react/jsx-runtime";
2073
+ var renderPromotionalBanner = ({ image, title, subtitle, ctaText, ctaLink, background }) => /* @__PURE__ */ jsxs20(
2074
+ "div",
2075
+ {
2076
+ style: {
2077
+ display: "flex",
2078
+ alignItems: "center",
2079
+ justifyContent: "center",
2080
+ minHeight: "280px",
2081
+ backgroundColor: background || "#f5f5f5",
2082
+ padding: "2rem",
2083
+ borderRadius: "2px",
2084
+ margin: "1rem 0",
2085
+ gap: "2rem",
2086
+ flexWrap: "wrap"
2087
+ },
2088
+ children: [
2089
+ image && /* @__PURE__ */ jsx28("div", { style: { flex: "0 0 auto", maxWidth: "40%" }, children: /* @__PURE__ */ jsx28("img", { src: image, alt: title || "Promo", style: { maxWidth: "100%", height: "auto", borderRadius: "2px" } }) }),
2090
+ /* @__PURE__ */ jsxs20("div", { style: { flex: 1, minWidth: "200px" }, children: [
2091
+ title && /* @__PURE__ */ jsx28("h2", { style: { fontSize: "1.75rem", fontWeight: "bold", marginBottom: "0.5rem", color: "#333" }, children: title }),
2092
+ subtitle && /* @__PURE__ */ jsx28("p", { style: { fontSize: "1rem", color: "#666", marginBottom: "1rem" }, children: subtitle }),
2093
+ ctaText && ctaLink && /* @__PURE__ */ jsx28(
2094
+ "a",
2095
+ {
2096
+ href: ctaLink,
2097
+ style: {
2098
+ display: "inline-block",
2099
+ backgroundColor: "#2c5530",
2100
+ color: "white",
2101
+ padding: "0.75rem 2rem",
2102
+ borderRadius: "2px",
2103
+ textDecoration: "none",
2104
+ fontWeight: 600
2105
+ },
2106
+ children: ctaText
2107
+ }
2108
+ )
2109
+ ] })
2110
+ ]
2111
+ }
2112
+ );
2113
+
2114
+ // src/components/cms/RelatedProductsSlider.tsx
2115
+ import { FormattedMessage as FormattedMessage9 } from "react-intl";
2116
+ import { useDatasource as useDatasource5 } from "@commercetools-demo/puck-api";
2117
+ import { Fragment as Fragment6, jsx as jsx29, jsxs as jsxs21 } from "react/jsx-runtime";
2118
+ var renderRelatedProductsSlider = ({ title, subtitle, products, linkWith, baseUrl }) => {
2119
+ const hasPreResolved = products?.resolvedData != null;
2120
+ const { data: fetchedData, loading } = useDatasource5(
2121
+ hasPreResolved ? void 0 : products?.type,
2122
+ hasPreResolved ? [] : products?.skus ?? []
2123
+ );
2124
+ const items = hasPreResolved ? Array.isArray(products.resolvedData) ? products.resolvedData : [] : Array.isArray(fetchedData) ? fetchedData : [];
2125
+ if (!loading && items.length === 0) return /* @__PURE__ */ jsx29(Fragment6, {});
2126
+ return /* @__PURE__ */ jsxs21("div", { style: { padding: "2rem 0" }, children: [
2127
+ (title || subtitle) && /* @__PURE__ */ jsxs21("div", { style: { textAlign: "center", marginBottom: "1.5rem" }, children: [
2128
+ title && /* @__PURE__ */ jsx29("h2", { style: { fontSize: "2rem", fontWeight: "bold", color: "#333", marginBottom: "0.5rem" }, children: title }),
2129
+ subtitle && /* @__PURE__ */ jsx29("p", { style: { fontSize: "1.1rem", color: "#666", margin: 0 }, children: subtitle })
2130
+ ] }),
2131
+ loading && /* @__PURE__ */ jsx29("div", { style: { textAlign: "center", color: "#999", padding: "2rem" }, children: /* @__PURE__ */ jsx29(FormattedMessage9, { id: "Editor.loading" }) }),
2132
+ items.length > 0 && /* @__PURE__ */ jsx29(
2133
+ "div",
2134
+ {
2135
+ style: {
2136
+ display: "flex",
2137
+ gap: "1rem",
2138
+ overflowX: "auto",
2139
+ scrollSnapType: "x mandatory",
2140
+ paddingBottom: "1rem"
2141
+ },
2142
+ children: items.map((product, i) => {
2143
+ const name = getLocalizedText(product?.name);
2144
+ const imageUrl = getProductImage(product);
2145
+ const priceVal = getFirstPrice(product);
2146
+ return /* @__PURE__ */ jsxs21(
2147
+ "a",
2148
+ {
2149
+ href: resolveProductLink(product, linkWith, baseUrl),
2150
+ style: {
2151
+ flex: "0 0 280px",
2152
+ background: "white",
2153
+ borderRadius: "12px",
2154
+ boxShadow: "0 4px 12px rgba(0,0,0,0.1)",
2155
+ overflow: "hidden",
2156
+ textDecoration: "none",
2157
+ color: "inherit",
2158
+ scrollSnapAlign: "start"
2159
+ },
2160
+ children: [
2161
+ /* @__PURE__ */ jsx29("div", { style: { width: "100%", height: "200px", background: "#f5f5f5", display: "flex", alignItems: "center", justifyContent: "center", overflow: "hidden" }, children: imageUrl ? /* @__PURE__ */ jsx29("img", { src: imageUrl, alt: name, style: { width: "100%", height: "100%", objectFit: "contain" } }) : /* @__PURE__ */ jsx29("span", { style: { color: "#999", fontSize: "0.85rem" }, children: /* @__PURE__ */ jsx29(FormattedMessage9, { id: "Editor.noImage" }) }) }),
2162
+ /* @__PURE__ */ jsxs21("div", { style: { padding: "1.5rem" }, children: [
2163
+ /* @__PURE__ */ jsx29("h3", { style: { fontSize: "1.1rem", fontWeight: 600, color: "#333", marginBottom: "0.5rem" }, children: name }),
2164
+ priceVal && /* @__PURE__ */ jsx29("div", { style: { fontSize: "1.2rem", fontWeight: "bold", color: "#2c5530" }, children: formatPrice(priceVal.centAmount, priceVal.currencyCode, priceVal.fractionDigits) })
2165
+ ] })
2166
+ ]
2167
+ },
2168
+ product?.id ?? i
2169
+ );
2170
+ })
2171
+ }
2172
+ )
2173
+ ] });
2174
+ };
2175
+
2176
+ // src/components/cms/SocialLinks.tsx
2177
+ import { Fragment as Fragment7, jsx as jsx30 } from "react/jsx-runtime";
2178
+ var renderSocialLinks = (props) => {
2179
+ const links = [
2180
+ [props.link1Label, props.link1Url],
2181
+ [props.link2Label, props.link2Url],
2182
+ [props.link3Label, props.link3Url],
2183
+ [props.link4Label, props.link4Url]
2184
+ ].filter(([label, url]) => label && url);
2185
+ if (links.length === 0) return /* @__PURE__ */ jsx30(Fragment7, {});
2186
+ return /* @__PURE__ */ jsx30("div", { style: { display: "flex", flexWrap: "wrap", gap: "1rem", padding: "0.5rem 0" }, children: links.map(([label, url], i) => /* @__PURE__ */ jsx30(
2187
+ "a",
2188
+ {
2189
+ href: url,
2190
+ target: "_blank",
2191
+ rel: "noopener noreferrer",
2192
+ style: { color: "#2c5530", textDecoration: "none", fontWeight: 500, fontSize: "0.95rem" },
2193
+ children: label
2194
+ },
2195
+ i
2196
+ )) });
2197
+ };
2198
+
2199
+ // src/components/cms/TabContent.tsx
2200
+ import { Fragment as Fragment8, jsx as jsx31, jsxs as jsxs22 } from "react/jsx-runtime";
2201
+ var renderTabContent = ({ tabLabel, content }) => {
2202
+ if (!content) return /* @__PURE__ */ jsx31(Fragment8, {});
2203
+ return /* @__PURE__ */ jsxs22("div", { style: { padding: "1.5rem 0", lineHeight: 1.6, color: "#333" }, children: [
2204
+ tabLabel && /* @__PURE__ */ jsx31("h3", { style: { marginBottom: "1rem" }, children: tabLabel }),
2205
+ /* @__PURE__ */ jsx31(RichTextContent, { html: content })
2206
+ ] });
2207
+ };
2208
+
2209
+ // src/components/cms/TestimonialsSlider.tsx
2210
+ import { Fragment as Fragment9, jsx as jsx32, jsxs as jsxs23 } from "react/jsx-runtime";
2211
+ var renderTestimonialsSlider = (props) => {
2212
+ const items = [
2213
+ [props.quote1, props.author1, props.role1],
2214
+ [props.quote2, props.author2, props.role2],
2215
+ [props.quote3, props.author3, props.role3]
2216
+ ].filter(([q]) => q);
2217
+ if (items.length === 0) return /* @__PURE__ */ jsx32(Fragment9, {});
2218
+ return /* @__PURE__ */ jsx32("div", { style: { padding: "2rem 1rem", background: "#f9f9f9", borderRadius: "8px", margin: "1rem 0" }, children: items.map(([quote, author, role], i) => /* @__PURE__ */ jsxs23("div", { style: { marginBottom: i < items.length - 1 ? "2rem" : 0 }, children: [
2219
+ /* @__PURE__ */ jsx32(
2220
+ "blockquote",
2221
+ {
2222
+ style: {
2223
+ fontSize: "1.15rem",
2224
+ fontStyle: "italic",
2225
+ color: "#444",
2226
+ margin: "0 0 0.75rem 0",
2227
+ paddingLeft: "1rem",
2228
+ borderLeft: "4px solid #2c5530"
2229
+ },
2230
+ children: quote
2231
+ }
2232
+ ),
2233
+ author && /* @__PURE__ */ jsxs23("cite", { style: { fontStyle: "normal", fontSize: "0.95rem", fontWeight: 600, color: "#333" }, children: [
2234
+ "\u2014 ",
2235
+ author,
2236
+ role && /* @__PURE__ */ jsxs23("span", { style: { fontWeight: "normal", color: "#666" }, children: [
2237
+ " (",
2238
+ role,
2239
+ ")"
2240
+ ] })
2241
+ ] })
2242
+ ] }, i)) });
2243
+ };
2244
+
2245
+ // src/components/cms/ThankYouContent.tsx
2246
+ import { jsx as jsx33, jsxs as jsxs24 } from "react/jsx-runtime";
2247
+ var renderThankYouContent = ({ headline, message, ctaText, ctaLink }) => /* @__PURE__ */ jsxs24("div", { style: { textAlign: "center", padding: "3rem 1rem", maxWidth: "560px", margin: "0 auto" }, children: [
2248
+ headline && /* @__PURE__ */ jsx33("h1", { style: { fontSize: "2rem", color: "#2c5530", marginBottom: "1rem" }, children: headline }),
2249
+ message && /* @__PURE__ */ jsx33(
2250
+ RichTextContent,
2251
+ {
2252
+ html: message,
2253
+ style: { fontSize: "1rem", lineHeight: 1.6, color: "#555", marginBottom: "2rem" }
2254
+ }
2255
+ ),
2256
+ ctaText && ctaLink && /* @__PURE__ */ jsx33(
2257
+ "a",
2258
+ {
2259
+ href: ctaLink,
2260
+ style: {
2261
+ display: "inline-block",
2262
+ background: "#2c5530",
2263
+ color: "white",
2264
+ padding: "0.75rem 2rem",
2265
+ borderRadius: "4px",
2266
+ textDecoration: "none",
2267
+ fontWeight: 600
2268
+ },
2269
+ children: ctaText
2270
+ }
2271
+ )
2272
+ ] });
2273
+
2274
+ // src/components/cms/TrustBadges.tsx
2275
+ import { Fragment as Fragment10, jsx as jsx34, jsxs as jsxs25 } from "react/jsx-runtime";
2276
+ var renderTrustBadges = (props) => {
2277
+ const badges = [
2278
+ [props.badge1Icon, props.badge1Label],
2279
+ [props.badge2Icon, props.badge2Label],
2280
+ [props.badge3Icon, props.badge3Label],
2281
+ [props.badge4Icon, props.badge4Label]
2282
+ ].filter(([, label]) => label);
2283
+ if (badges.length === 0) return /* @__PURE__ */ jsx34(Fragment10, {});
2284
+ return /* @__PURE__ */ jsx34(
2285
+ "div",
2286
+ {
2287
+ style: {
2288
+ display: "flex",
2289
+ flexWrap: "wrap",
2290
+ justifyContent: "center",
2291
+ gap: "2rem",
2292
+ padding: "2rem 1rem",
2293
+ background: "#f9f9f9",
2294
+ borderRadius: "4px"
2295
+ },
2296
+ children: badges.map(([icon, label], i) => /* @__PURE__ */ jsxs25("div", { style: { display: "flex", alignItems: "center", gap: "0.75rem" }, children: [
2297
+ icon && /* @__PURE__ */ jsx34(
2298
+ "img",
2299
+ {
2300
+ src: icon,
2301
+ alt: label,
2302
+ style: { width: "40px", height: "40px", objectFit: "contain" }
2303
+ }
2304
+ ),
2305
+ /* @__PURE__ */ jsx34("span", { style: { fontSize: "0.95rem", fontWeight: 500, color: "#333" }, children: label })
2306
+ ] }, i))
2307
+ }
2308
+ );
2309
+ };
2310
+
2311
+ // src/components/cms/VideoBlock.tsx
2312
+ import { FormattedMessage as FormattedMessage10 } from "react-intl";
2313
+ import { jsx as jsx35, jsxs as jsxs26 } from "react/jsx-runtime";
2314
+ var renderVideoBlock = ({ videoUrl, posterImage, title, caption }) => {
2315
+ if (!videoUrl) return /* @__PURE__ */ jsx35("div", { style: { padding: "2rem", textAlign: "center", color: "#999", background: "#f5f5f5", borderRadius: "8px" }, children: /* @__PURE__ */ jsx35(FormattedMessage10, { id: "Editor.noVideoUrlConfigured" }) });
2316
+ return /* @__PURE__ */ jsxs26("div", { style: { margin: "1.5rem 0" }, children: [
2317
+ /* @__PURE__ */ jsx35(
2318
+ "div",
2319
+ {
2320
+ style: {
2321
+ position: "relative",
2322
+ paddingBottom: "56.25%",
2323
+ height: 0,
2324
+ overflow: "hidden",
2325
+ background: "#000",
2326
+ borderRadius: "8px"
2327
+ },
2328
+ children: /* @__PURE__ */ jsx35(
2329
+ "video",
2330
+ {
2331
+ src: videoUrl,
2332
+ poster: posterImage || void 0,
2333
+ controls: true,
2334
+ preload: "metadata",
2335
+ style: {
2336
+ position: "absolute",
2337
+ top: 0,
2338
+ left: 0,
2339
+ width: "100%",
2340
+ height: "100%",
2341
+ objectFit: "contain"
2342
+ }
2343
+ }
2344
+ )
2345
+ }
2346
+ ),
2347
+ title && /* @__PURE__ */ jsx35("h4", { style: { marginTop: "0.75rem", fontSize: "1.1rem", color: "#333" }, children: title }),
2348
+ caption && /* @__PURE__ */ jsx35("p", { style: { fontSize: "0.9rem", color: "#666", marginTop: "0.25rem" }, children: caption })
2349
+ ] });
2350
+ };
2351
+
2352
+ // src/components/cms/WebsiteLogo.tsx
2353
+ import { useIntl as useIntl2 } from "react-intl";
2354
+ import { jsx as jsx36 } from "react/jsx-runtime";
2355
+ var renderWebsiteLogo = ({ logo, maxWidth, maxHeight }) => {
2356
+ const intl = useIntl2();
2357
+ if (!logo) return /* @__PURE__ */ jsx36("div", { style: { width: `${parseInt(maxWidth, 10) || 180}px`, height: `${parseInt(maxHeight, 10) || 50}px`, background: "#f0f0f0", borderRadius: "4px" } });
2358
+ return /* @__PURE__ */ jsx36(
2359
+ "div",
2360
+ {
2361
+ style: {
2362
+ maxWidth: `${parseInt(maxWidth, 10) || 180}px`,
2363
+ maxHeight: `${parseInt(maxHeight, 10) || 50}px`
2364
+ },
2365
+ children: /* @__PURE__ */ jsx36(
2366
+ "img",
2367
+ {
2368
+ src: logo,
2369
+ alt: intl.formatMessage({ id: "Editor.websiteLogoAlt" }),
2370
+ style: { width: "100%", height: "100%", objectFit: "contain" }
2371
+ }
2372
+ )
2373
+ }
2374
+ );
2375
+ };
2376
+
2377
+ // src/renderConfig.tsx
2378
+ var components = {
2379
+ Hero: { render: renderHero },
2380
+ RichText: { render: renderRichText },
2381
+ Grid: { render: renderGrid },
2382
+ Columns: { render: renderColumns },
2383
+ Image: { render: renderImage },
2384
+ Button: { render: renderButton },
2385
+ Card: { render: renderCard },
2386
+ Spacer: { render: renderSpacer },
2387
+ ProductTeaser: { render: renderProductTeaser },
2388
+ HeroBanner: { render: renderHeroBanner },
2389
+ TextBlock: { render: renderTextBlock },
2390
+ CategoryGrid: { render: renderCategoryGrid },
2391
+ CategoryHero: { render: renderCategoryHero },
2392
+ CheckoutPromoBanner: { render: renderCheckoutPromoBanner },
2393
+ CountdownBanner: { render: renderCountdownBanner },
2394
+ CrossSellBlock: { render: renderCrossSellBlock },
2395
+ DeliveryMessage: { render: renderDeliveryMessage },
2396
+ Divider: { render: renderDivider },
2397
+ EmptyState: { render: renderEmptyState },
2398
+ FAQAccordion: { render: renderFAQAccordion },
2399
+ FooterBlock: { render: renderFooterBlock },
2400
+ ImageBlock: { render: renderImageBlock },
2401
+ NewsletterSignup: { render: renderNewsletterSignup },
2402
+ ProductBanner: { render: renderProductBanner },
2403
+ ProductGridHeader: { render: renderProductGridHeader },
2404
+ ProductSlider: { render: renderProductSlider },
2405
+ PromotionalBanner: { render: renderPromotionalBanner },
2406
+ RelatedProductsSlider: { render: renderRelatedProductsSlider },
2407
+ SocialLinks: { render: renderSocialLinks },
2408
+ TabContent: { render: renderTabContent },
2409
+ TestimonialsSlider: { render: renderTestimonialsSlider },
2410
+ ThankYouContent: { render: renderThankYouContent },
2411
+ TrustBadges: { render: renderTrustBadges },
2412
+ VideoBlock: { render: renderVideoBlock },
2413
+ WebsiteLogo: { render: renderWebsiteLogo }
2414
+ };
2415
+ function createRenderConfig() {
2416
+ return {
2417
+ components,
2418
+ root: { render: renderRoot }
2419
+ };
2420
+ }
2421
+ var defaultRenderConfig = createRenderConfig();
2422
+ export {
2423
+ CONTENT_WIDTHS,
2424
+ RichTextContent,
2425
+ colors,
2426
+ createRenderConfig,
2427
+ defaultRenderConfig,
2428
+ formatPrice,
2429
+ getFirstPrice,
2430
+ getLocalizedText,
2431
+ getProductImage,
2432
+ getProductName,
2433
+ getProductSku,
2434
+ getProductSlug,
2435
+ catalogs as intlCatalogs,
2436
+ productLinkDefaults,
2437
+ renderButton,
2438
+ renderCard,
2439
+ renderCategoryGrid,
2440
+ renderCategoryHero,
2441
+ renderCheckoutPromoBanner,
2442
+ renderColumns,
2443
+ renderCountdownBanner,
2444
+ renderCrossSellBlock,
2445
+ renderDeliveryMessage,
2446
+ renderDivider,
2447
+ renderEmptyState,
2448
+ renderFAQAccordion,
2449
+ renderFooterBlock,
2450
+ renderGrid,
2451
+ renderHero,
2452
+ renderHeroBanner,
2453
+ renderImage,
2454
+ renderImageBlock,
2455
+ renderNewsletterSignup,
2456
+ renderProductBanner,
2457
+ renderProductGridHeader,
2458
+ renderProductSlider,
2459
+ renderProductTeaser,
2460
+ renderPromotionalBanner,
2461
+ renderRelatedProductsSlider,
2462
+ renderRichText,
2463
+ renderRoot,
2464
+ renderSocialLinks,
2465
+ renderSpacer,
2466
+ renderTabContent,
2467
+ renderTestimonialsSlider,
2468
+ renderTextBlock,
2469
+ renderThankYouContent,
2470
+ renderTrustBadges,
2471
+ renderVideoBlock,
2472
+ renderWebsiteLogo,
2473
+ resolveProductLink,
2474
+ sanitizeHtml
2475
+ };
2476
+ //# sourceMappingURL=index.mjs.map