/** * Master JSON — kontrakt danych między Systemem A (Vilmax Cockpit) a Systemiem B (D2C Store). * Schema per docs/demo/01-vilmax-architecture.md §4. * Frontend opiera swój kod na parsowaniu tej struktury. */ export interface ProductDimensions { width: number; // cm depth: number; // cm height: number; // cm } export interface Package { id: string; dimensions: string; // "150x90x70 cm" weight: string; // "45 kg" } export interface Logistics { dimensions: ProductDimensions; packages: Package[]; } export interface VideoSource { src: string; type: string; // "video/webm" | "video/mp4" } export interface VariantMedia { hero_staging: string; // url -> composite webp (aranżacja we wnętrzu) packshot: string; // url -> masked webp (czyste zdjęcie na białym) video_reels: VideoSource[]; // multi-source: webm (desktop) + mp4 (iOS) fabric_closeup?: string; // url -> zbliżenie tkaniny // Rozszerzona galeria dla mebli premium (8-10 ujęć) lifestyle_alt?: string; // druga aranżacja, inny kąt salonu packshot_3q?: string; // packshot 3/4 na białym tle side_profile?: string; // profil boczny mebla top_view?: string; // rzut z góry / układ L seam_detail?: string; // zbliżenie szwu / wykończenia sleeping_function?: string; // funkcja spania rozłożona storage_detail?: string; // pojemnik / wnęka dimension_blueprint?: string; // infografika wymiarów // Dodatkowe zdjęcia, które nie pasują do powyższych ról gallery?: string[]; } export interface ProductVariant { sku: string; color_name: string; swatch_color: string; // hex fabric_type: string; // "Tissu bouclette", "Velours côtelé", etc. media: VariantMedia; } export interface Product { sku: string; name: string; collection: string; // "LAVENA", "SIDONIE", "MARA" category_slug: string; // "narozniki", "sofy", "lozka" category_name: string; base_price: number; compare_at_price?: number; // cena przed promocją description: string; tech_specs: string[]; logistics: Logistics; variants: ProductVariant[]; badge?: string; // "Bestseller", "Nowość" rating?: number; reviews_count?: number; } export interface Category { slug: string; name: string; description: string; product_skus: string[]; } /** Helper: pełna lista produktów (mock Systemu A) */ export type ProductCatalog = Product[];