feat(cms): add Cinematic Story Scroll and Apple Showcase blocks to Page Builder

This commit is contained in:
Your Name committed 2026-10-17 09:06:44 +07:00
1 parent 25cbe3549e
commit 8d9f2fc587
10 files changed
+971 -8

No files matched your search

+32 -1
View File
@@ -1324,6 +1324,32 @@ export const UspMinimalSectionPayloadSchema = z.object({
});
export type UspMinimalSectionPayload = z.infer<typeof UspMinimalSectionPayloadSchema>;
export const CinematicStoryScrollSectionPayloadSchema = z.object({
productId: z.union([z.number(), z.string(), z.null()]).optional(),
storyHeroImage: z.string().optional(),
storyTheme: z.enum(['dark', 'light']).optional().default('light'),
storyScenes: z.array(StorySceneSchema).optional(),
endCtaTitle: z.string().optional(),
endCtaButtonText: z.string().optional(),
endCtaLink: z.string().optional(),
paddingTop: z.string().optional(),
paddingBottom: z.string().optional(),
}).passthrough();
export type CinematicStoryScrollSectionPayload = z.infer<typeof CinematicStoryScrollSectionPayloadSchema>;
export const AppleShowcaseSectionPayloadSchema = z.object({
productId: z.union([z.number(), z.string(), z.null()]).optional(),
heroImage: z.string().optional(),
storyHeroImage: z.string().optional(),
storyTheme: z.enum(['dark', 'light']).optional().default('dark'),
endCtaTitle: z.string().optional(),
endCtaButtonText: z.string().optional(),
endCtaLink: z.string().optional(),
paddingTop: z.string().optional(),
paddingBottom: z.string().optional(),
}).passthrough();
export type AppleShowcaseSectionPayload = z.infer<typeof AppleShowcaseSectionPayloadSchema>;
export const PAGE_SECTION_TYPES = [
'HERO', 'HERO_V2', 'HERO_VIDEO', 'HERO_CAROUSEL', 'DIVIDER', 'ANNOUNCEMENT_BAR', 'NEWSLETTER', 'EDITORIAL_TILE', 'FEATURED_TILES',
'EDITORIAL_CAROUSEL', 'PRODUCTS', 'CATEGORIES', 'TEXT', 'BANNER',
@@ -1333,7 +1359,8 @@ export const PAGE_SECTION_TYPES = [
'PRODUCT_CAROUSEL', 'ACCORDION', 'CONTACT_INFO', 'CONTACT_FORM',
'USP_BAR', 'PRODUCT_MAIN', 'PRODUCT_DETAILS', 'PRODUCT_SPECS',
'PRODUCT_REVIEWS', 'RELATED_PRODUCTS', 'CUSTOM',
'HERO_MINIMAL', 'HERO_SPLIT_MINIMAL', 'HERO_VIDEO_MINIMAL', 'BANNER_MINIMAL', 'ANNOUNCEMENT_BAR_MINIMAL', 'USP_MINIMAL'
'HERO_MINIMAL', 'HERO_SPLIT_MINIMAL', 'HERO_VIDEO_MINIMAL', 'BANNER_MINIMAL', 'ANNOUNCEMENT_BAR_MINIMAL', 'USP_MINIMAL',
'CINEMATIC_STORY_SCROLL', 'APPLE_SHOWCASE'
] as const;
export type SectionType = typeof PAGE_SECTION_TYPES[number];
@@ -1382,6 +1409,8 @@ export const PAGE_SECTION_LOCALIZED_PATHS: Record<SectionType, readonly string[]
BANNER_MINIMAL: ['title', 'subtitle'],
ANNOUNCEMENT_BAR_MINIMAL: ['slides[]'],
USP_MINIMAL: ['items[]'],
CINEMATIC_STORY_SCROLL: ['endCtaTitle', 'endCtaButtonText'],
APPLE_SHOWCASE: ['endCtaTitle', 'endCtaButtonText'],
};
export const PAGE_SECTION_PAYLOAD_SCHEMAS: Record<SectionType, z.ZodType> = {
@@ -1429,6 +1458,8 @@ export const PAGE_SECTION_PAYLOAD_SCHEMAS: Record<SectionType, z.ZodType> = {
BANNER_MINIMAL: BannerMinimalSectionPayloadSchema,
ANNOUNCEMENT_BAR_MINIMAL: AnnouncementBarMinimalSectionPayloadSchema,
USP_MINIMAL: UspMinimalSectionPayloadSchema,
CINEMATIC_STORY_SCROLL: CinematicStoryScrollSectionPayloadSchema,
APPLE_SHOWCASE: AppleShowcaseSectionPayloadSchema,
};
export const PRODUCT_DETAIL_SECTION_TYPES = [