diff --git a/apps/admin/src/components/page-builder/HeroForm.tsx b/apps/admin/src/components/page-builder/HeroForm.tsx index e712e8b..a0e58b7 100644 --- a/apps/admin/src/components/page-builder/HeroForm.tsx +++ b/apps/admin/src/components/page-builder/HeroForm.tsx @@ -9,7 +9,7 @@ interface HeroFormProps { getLocalizedValue: (payload: any, field: string) => string; updateLocalizedValue: (field: string, value: string) => void; updatePayloadValue: (field: string, value: any) => void; - setUploadTarget: (target: { type: 'main' | 'slide'; index?: number } | null) => void; + setUploadTarget: (target: { type: 'main' | 'slide' | 'gallery' | 'tile' | 'seoOgImage' | 'mobileImage'; index?: number } | null) => void; setIsMediaModalOpen: (open: boolean) => void; } @@ -31,12 +31,104 @@ export default function HeroForm({ }: HeroFormProps) { const currentOverlayStyle = editingSection.payload?.overlayStyle || 'gradient'; const currentOverlayOpacity = editingSection.payload?.overlayOpacity !== undefined ? editingSection.payload.overlayOpacity : 45; + const payload = editingSection.payload || {}; return (
BEAUTRIUM style uses 21:7 or 21:6 for wide banners without eating vertical screen space.
++ {editingSection.payload?.imageUrl ? 'ใช้รูปเดียวกับ Desktop' : 'Select Mobile Image'} +
+แนะนำสำหรับสัดส่วน 1:1 หรือ 4:3 บนมือถือ
+
diff --git a/apps/website/src/components/ProductHeroCarousel.tsx b/apps/website/src/components/ProductHeroCarousel.tsx
index e8274b1..0a85b42 100644
--- a/apps/website/src/components/ProductHeroCarousel.tsx
+++ b/apps/website/src/components/ProductHeroCarousel.tsx
@@ -21,6 +21,7 @@ function aspectClasses(
'4/3': 'aspect-[4/3]',
'1/1': 'aspect-square',
'21/9': 'aspect-[21/9]',
+ full_screen: 'min-h-[85vh]',
auto: 'min-h-[22rem]',
}[mobile ?? '16/9']
@@ -32,6 +33,7 @@ function aspectClasses(
'16/6': 'md:aspect-[16/6]',
'4/1': 'md:aspect-[4/1]',
'5/1': 'md:aspect-[5/1]',
+ full_screen: 'md:aspect-auto md:min-h-[90vh]',
auto: 'md:aspect-auto md:min-h-[30rem]',
}[desktop ?? '21/7']
diff --git a/apps/website/src/components/dynamic/DynamicPageRenderer.tsx b/apps/website/src/components/dynamic/DynamicPageRenderer.tsx
index c30e0b9..ef1470e 100644
--- a/apps/website/src/components/dynamic/DynamicPageRenderer.tsx
+++ b/apps/website/src/components/dynamic/DynamicPageRenderer.tsx
@@ -374,21 +374,74 @@ function HeroSection({ payload, lang }: { payload: Record
diff --git a/packages/types/index.ts b/packages/types/index.ts
index 4a346f1..26b7582 100644
--- a/packages/types/index.ts
+++ b/packages/types/index.ts
@@ -694,6 +694,7 @@ export const HeroSectionPayloadSchema = z.object({
title: LocalizedStringSchema.optional(),
description: LocalizedStringSchema.optional(),
imageUrl: z.string().min(1),
+ mobileImageUrl: z.string().optional(),
buttonText: LocalizedStringSchema.optional(),
buttonLink: z.string().optional(),
focalPoint: z.object({ x: z.string(), y: z.string() }).optional(),
@@ -704,6 +705,9 @@ export const HeroSectionPayloadSchema = z.object({
titleSize: DefaultTitleSizeSchema('xl'),
overlayStyle: z.enum(['gradient', 'solid', 'none']).optional().default('gradient'),
overlayOpacity: z.number().min(0).max(100).optional(),
+ aspectRatio: z.enum(['21/6', '21/7', '21/9', '16/5', '16/6', '4/1', '5/1', 'auto', 'full_screen']).optional().default('21/7'),
+ mobileAspectRatio: z.enum(['16/9', '4/3', '1/1', '21/9', 'auto', 'full_screen']).optional().default('16/9'),
+ headerSpacing: z.enum(['below_header', 'under_header']).optional(),
});
export type HeroSectionPayload = z.infer