This commit is contained in:
Your Name committed 2026-07-24 19:39:38 -04:00
1 parent e509e3f0a2
commit 0d4df55d93
7 files changed
+526 -3

No files matched your search

+61 -1
View File
@@ -464,6 +464,60 @@ export const ArticleMediaSectionPayloadSchema = z.object({
});
export type ArticleMediaSectionPayload = z.infer<typeof ArticleMediaSectionPayloadSchema>;
export const ArticleHeaderSectionPayloadSchema = z.object({
title: LocalizedStringSchema,
subtitle: LocalizedStringSchema.optional(),
category: LocalizedStringSchema.optional(),
author: LocalizedStringSchema.optional(),
publishDate: z.string().optional(),
imageUrl: z.string().min(1).optional(),
imageAlt: LocalizedStringSchema.optional(),
}).strict().superRefine((payload, ctx) => {
if (payload.imageUrl && !payload.imageAlt) {
ctx.addIssue({ code: 'custom', path: ['imageAlt'], message: 'imageAlt is required when imageUrl is provided' });
}
});
export type ArticleHeaderSectionPayload = z.infer<typeof ArticleHeaderSectionPayloadSchema>;
export const ArticleGallerySectionPayloadSchema = z.object({
title: LocalizedStringSchema.optional(),
layout: z.enum(['grid', 'featured']).optional().default('grid'),
images: z.array(z.object({
imageUrl: z.string().min(1),
alt: LocalizedStringSchema,
caption: LocalizedStringSchema.optional(),
}).strict()).min(2).max(8),
}).strict();
export type ArticleGallerySectionPayload = z.infer<typeof ArticleGallerySectionPayloadSchema>;
export const ArticleFactsSectionPayloadSchema = z.object({
title: LocalizedStringSchema.optional(),
items: z.array(z.object({
title: LocalizedStringSchema,
description: LocalizedStringSchema.optional(),
}).strict()).min(1).max(8),
}).strict();
export type ArticleFactsSectionPayload = z.infer<typeof ArticleFactsSectionPayloadSchema>;
export const ArticleVideoSectionPayloadSchema = z.object({
title: LocalizedStringSchema.optional(),
videoUrl: z.string().url().startsWith('https://'),
caption: LocalizedStringSchema.optional(),
posterUrl: z.string().min(1).optional(),
aspectRatio: z.enum(['16:9', '4:3', '1:1']).optional().default('16:9'),
}).strict();
export type ArticleVideoSectionPayload = z.infer<typeof ArticleVideoSectionPayloadSchema>;
export const ArticleReferencesSectionPayloadSchema = z.object({
title: LocalizedStringSchema.optional(),
items: z.array(z.object({
title: LocalizedStringSchema,
url: z.string().url().startsWith('https://').optional(),
note: LocalizedStringSchema.optional(),
}).strict()).min(1).max(20),
}).strict();
export type ArticleReferencesSectionPayload = z.infer<typeof ArticleReferencesSectionPayloadSchema>;
export const ScentNotesBreakdownSectionPayloadSchema = z.object({
title: LocalizedStringSchema.optional(),
description: LocalizedStringSchema.optional(),
@@ -642,7 +696,8 @@ export type CustomSectionPayload = z.infer<typeof CustomSectionPayloadSchema>;
export const PAGE_SECTION_TYPES = [
'HERO', 'ANNOUNCEMENT_BAR', 'NEWSLETTER', 'EDITORIAL_TILE',
'EDITORIAL_CAROUSEL', 'PRODUCTS', 'CATEGORIES', 'TEXT', 'BANNER',
'HERO_ARTICLE', 'RICH_TEXT', 'ARTICLE_MEDIA', 'SCENT_NOTES_BREAKDOWN', 'QUOTE_CALLOUT',
'HERO_ARTICLE', 'RICH_TEXT', 'ARTICLE_HEADER', 'ARTICLE_MEDIA', 'ARTICLE_GALLERY',
'ARTICLE_FACTS', 'ARTICLE_VIDEO', 'ARTICLE_REFERENCES', 'SCENT_NOTES_BREAKDOWN', 'QUOTE_CALLOUT',
'PRODUCT_CAROUSEL', 'ACCORDION', 'CONTACT_INFO', 'CONTACT_FORM',
'HERO_V2', 'USP_BAR', 'PRODUCT_MAIN', 'PRODUCT_DETAILS', 'PRODUCT_SPECS',
'PRODUCT_REVIEWS', 'RELATED_PRODUCTS', 'CUSTOM'
@@ -661,7 +716,12 @@ export const PAGE_SECTION_PAYLOAD_SCHEMAS: Record<SectionType, z.ZodType> = {
BANNER: BannerSectionPayloadSchema,
HERO_ARTICLE: HeroArticleSectionPayloadSchema,
RICH_TEXT: RichTextSectionPayloadSchema,
ARTICLE_HEADER: ArticleHeaderSectionPayloadSchema,
ARTICLE_MEDIA: ArticleMediaSectionPayloadSchema,
ARTICLE_GALLERY: ArticleGallerySectionPayloadSchema,
ARTICLE_FACTS: ArticleFactsSectionPayloadSchema,
ARTICLE_VIDEO: ArticleVideoSectionPayloadSchema,
ARTICLE_REFERENCES: ArticleReferencesSectionPayloadSchema,
SCENT_NOTES_BREAKDOWN: ScentNotesBreakdownSectionPayloadSchema,
QUOTE_CALLOUT: QuoteCalloutSectionPayloadSchema,
PRODUCT_CAROUSEL: ProductCarouselSectionPayloadSchema,