import axios from 'axios'; import { API_URL as API_BASE_URL } from './api'; import { IconType } from 'react-icons'; import { FaRegClipboard, FaBullseye, FaMapSigns, FaColumns, FaFlag, FaNewspaper, FaFutbol, FaUsers, FaTable, FaChartLine, FaCalendarAlt, FaHandshake, FaTshirt, FaCommentDots, FaTrophy, FaBookOpen, FaImages, FaVideo, FaBroadcastTower, FaPodcast, FaHashtag, FaEnvelopeOpenText, FaPhoneAlt, FaHourglassHalf, FaPoll, FaQuestionCircle, FaSearch, FaMapMarkedAlt, FaCalendarCheck, FaCloudSun, FaTicketAlt, FaCube } from 'react-icons/fa'; // Use shared API base URL export interface PageElementConfig { id?: number; page_type: string; element_name: string; variant: string; visible?: boolean; display_order?: number; settings?: Record; created_at?: string; updated_at?: string; } // Public endpoints export const getPageElementConfigs = async (pageType: string): Promise => { const response = await axios.get(`${API_BASE_URL}/page-elements`, { params: { page_type: pageType } }); return response.data || []; }; // Admin endpoints export const getAllPageElementConfigs = async (): Promise => { const response = await axios.get(`${API_BASE_URL}/admin/page-elements`, { withCredentials: true, }); return response.data || []; }; export const createOrUpdatePageElementConfig = async (config: Partial): Promise => { const response = await axios.post(`${API_BASE_URL}/admin/page-elements`, config, { withCredentials: true, }); return response.data; }; export const updatePageElementConfig = async (id: number, config: Partial): Promise => { const response = await axios.put(`${API_BASE_URL}/admin/page-elements/${id}`, config, { withCredentials: true, }); return response.data; }; export const deletePageElementConfig = async (id: number): Promise => { await axios.delete(`${API_BASE_URL}/admin/page-elements/${id}`, { withCredentials: true, }); }; export const batchUpdatePageElementConfigs = async (configs: PageElementConfig[]): Promise<{ message: string; updated: number; created: number }> => { const response = await axios.post(`${API_BASE_URL}/admin/page-elements/batch`, configs, { withCredentials: true, }); return response.data; }; // Element variant definitions export interface ElementVariant { value: string; label: string; description: string; preview?: string; } // Predefined element types that can be added to pages export interface PredefinedElement { name: string; label: string; description: string; icon: IconType; category: 'content' | 'media' | 'interactive' | 'layout'; defaultVariant: string; component?: string; } export const PREDEFINED_ELEMENTS: PredefinedElement[] = [ // Layout - Rozvržení { name: 'style-pack', label: 'Styl balíček', description: 'Globální vizuální balíček pro celou stránku', icon: FaCube, category: 'layout', defaultVariant: 'default' }, { name: 'header', label: 'Hlavička', description: 'Hlavička stránky s logem a navigací', icon: FaRegClipboard, category: 'layout', defaultVariant: 'unified' }, { name: 'hero-topbar', label: 'Klub lišta nad hero', description: 'Pruh nad hero s logem klubu, názvem a akcemi', icon: FaCube, category: 'layout', defaultVariant: 'brand' }, { name: 'hero', label: 'Hlavní Sekce', description: 'Hlavní obsahová oblast s úvodním obsahem', icon: FaBullseye, category: 'layout', defaultVariant: 'grid' }, { name: 'footer', label: 'Patička', description: 'Spodní část stránky s odkazy a kontakty', icon: FaMapSigns, category: 'layout', defaultVariant: 'standard' }, { name: 'sidebar', label: 'Boční Panel', description: 'Boční sloupec s doplňkovým obsahem', icon: FaColumns, category: 'layout', defaultVariant: 'right' }, { name: 'banner', label: 'Banner', description: 'Reklamní nebo informační banner', icon: FaFlag, category: 'layout', defaultVariant: 'top' }, // Content - Obsah { name: 'news', label: 'Novinky', description: 'Nejnovější články a zprávy', icon: FaNewspaper, category: 'content', defaultVariant: 'grid' }, { name: 'matches', label: 'Zápasy', description: 'Nadcházející a poslední zápasy', icon: FaFutbol, category: 'content', defaultVariant: 'compact' }, { name: 'matches-slider', label: 'Zápasy (slider)', description: 'Přehled zápasů podle soutěže ve slideru', icon: FaFutbol, category: 'content', defaultVariant: 'carousel' }, { name: 'team', label: 'Tým', description: 'Hráči a realizační tým', icon: FaUsers, category: 'content', defaultVariant: 'grid' }, { name: 'table', label: 'Tabulka', description: 'Ligová tabulka', icon: FaTable, category: 'content', defaultVariant: 'split_news' }, { name: 'stats', label: 'Statistiky', description: 'Týmové a hráčské statistiky', icon: FaChartLine, category: 'content', defaultVariant: 'cards' }, { name: 'activities', label: 'Akce', description: 'Nadcházející události a aktivity', icon: FaCalendarAlt, category: 'content', defaultVariant: 'list' }, { name: 'sponsors', label: 'Partneři', description: 'Loga a odkazy partnerů', icon: FaHandshake, category: 'content', defaultVariant: 'grid' }, { name: 'merch', label: 'Fanshop', description: 'Prodej klubového zboží', icon: FaTshirt, category: 'content', defaultVariant: 'grid' }, { name: 'testimonials', label: 'Reference', description: 'Hodnocení a ohlasy fanoušků', icon: FaCommentDots, category: 'content', defaultVariant: 'carousel' }, { name: 'achievements', label: 'Úspěchy', description: 'Trofeje a ocenění klubu', icon: FaTrophy, category: 'content', defaultVariant: 'timeline' }, { name: 'history', label: 'Historie', description: 'Historie a milníky klubu', icon: FaBookOpen, category: 'content', defaultVariant: 'timeline' }, // Media - Média { name: 'gallery', label: 'Galerie', description: 'Fotogalerie', icon: FaImages, category: 'media', defaultVariant: 'grid' }, { name: 'videos', label: 'Videa', description: 'YouTube videa a sestřihy', icon: FaVideo, category: 'media', defaultVariant: 'grid' }, { name: 'live', label: 'Live Stream', description: 'Živé přenosy zápasů', icon: FaBroadcastTower, category: 'media', defaultVariant: 'featured' }, { name: 'podcast', label: 'Podcast', description: 'Zvukové podcasty a komentáře', icon: FaPodcast, category: 'media', defaultVariant: 'list' }, { name: 'social', label: 'Sociální Sítě', description: 'Příspěvky ze sociálních sítí', icon: FaHashtag, category: 'media', defaultVariant: 'grid' }, // Interactive - Interaktivní { name: 'newsletter', label: 'Newsletter', description: 'Formulář pro odběr novinek', icon: FaEnvelopeOpenText, category: 'interactive', defaultVariant: 'default' }, { name: 'contact', label: 'Kontakt', description: 'Kontaktní formulář', icon: FaPhoneAlt, category: 'interactive', defaultVariant: 'form' }, { name: 'countdown', label: 'Odpočet', description: 'Odpočet do příštího zápasu', icon: FaHourglassHalf, category: 'interactive', defaultVariant: 'default' }, { name: 'poll', label: 'Anketa', description: 'Hlasování a ankety pro fanoušky', icon: FaPoll, category: 'interactive', defaultVariant: 'vertical' }, { name: 'quiz', label: 'Kvíz', description: 'Interaktivní kvízy', icon: FaQuestionCircle, category: 'interactive', defaultVariant: 'card' }, { name: 'search', label: 'Vyhledávání', description: 'Vyhledávací pole', icon: FaSearch, category: 'interactive', defaultVariant: 'header' }, { name: 'map', label: 'Mapa', description: 'Mapa stadionu a areálu', icon: FaMapMarkedAlt, category: 'interactive', defaultVariant: 'default' }, { name: 'calendar', label: 'Kalendář', description: 'Kalendář zápasů a akcí', icon: FaCalendarCheck, category: 'interactive', defaultVariant: 'month' }, { name: 'weather', label: 'Počasí', description: 'Informace o počasí na stadionu', icon: FaCloudSun, category: 'interactive', defaultVariant: 'widget' }, { name: 'ticketing', label: 'Vstupenky', description: 'Prodej a rezervace vstupenek', icon: FaTicketAlt, category: 'interactive', defaultVariant: 'widget' }, ]; export const ELEMENT_VARIANTS: Record = { 'style-pack': [ { value: 'default', label: 'Výchozí', description: 'Základní sjednocený styl' }, { value: 'modern', label: 'Moderní', description: 'Zaoblené rohy, lehké stíny, více prostoru' }, { value: 'minimal', label: 'Minimal', description: 'Čisté, bez stínů, tenké rámečky' }, { value: 'sparta', label: 'Sparta', description: 'Přiblížení k Sparta packu' }, ], header: [ { value: 'unified', label: 'Jednotný', description: 'Klasická hlavička s logem a navigací' }, { value: 'edge', label: 'Okrajový', description: 'Moderní hlavička s gradientem' }, { value: 'minimal', label: 'Minimální', description: 'Čistý minimalistický design' }, { value: 'modern', label: 'Moderní', description: 'Odvážný moderní styl s akcenty' }, { value: 'sticky', label: 'Přilepený', description: 'Pevně přilepená hlavička při scrollování' }, { value: 'transparent', label: 'Průhledný', description: 'Průhledná hlavička s efektem' }, { value: 'sparta_navbar', label: 'Sparta Navbar', description: 'AC Sparta Praha styl - burger menu, logo, navigace, vyhledávání' }, { value: 'current', label: 'Současný', description: 'Stávající navigace' }, { value: 'fullwidth', label: 'Šířka 100%', description: 'Navigace přes celou šířku obrazovky' }, ], 'hero-topbar': [ { value: 'brand', label: 'Brand', description: 'Barevná lišta s klubovými barvami a akcemi' }, { value: 'minimal', label: 'Minimal', description: 'Průhledná/nenápadná lišta' }, { value: 'badge', label: 'Badge', description: 'Pill styl s klubovou barvou' }, ], hero: [ { value: 'grid', label: 'Mřížka', description: 'Rozložení ve formě mřížky' }, { value: 'swiper', label: 'Karusel', description: 'Posuvný karusel' }, { value: 'swiper_full', label: 'Celý Karusel', description: 'Celoobrazovkový karusel' }, { value: 'edge', label: 'Okrajový', description: 'Moderní okrajový styl' }, { value: 'video', label: 'Video', description: 'Hero s pozadím videa' }, { value: 'split', label: 'Rozdělený', description: 'Rozdělené rozložení text/obraz' }, { value: 'featured_sidebar', label: 'Zvýrazněný + Sidebar', description: 'Velký článek vlevo + 4 články vpravo. Kategorie: BLOG/TÝM. Tlačítko: PŘEHRÁT. Sidebar link: VÍCE NOVINEK. Překrývá se s nadcházejícím zápasem' }, { value: 'sparta_featured_carousel', label: 'Sparta Featured Carousel', description: 'Hero header s pozadím, článek s kategoriemi, thumbnail navigace, auto-swap' }, ], news: [ { value: 'grid', label: 'Mřížka', description: 'Rozložení karet v mřížce' }, { value: 'scroller', label: 'Posuvník', description: 'Horizontální posuvník' }, { value: 'hero_carousel', label: 'Hero Karusel', description: 'Jeden článek najednou. Tlačítko: ZJISTIT VÍCE (vlevo dole). Numerace: 01 02 03 (vpravo dole). Auto-swap' }, { value: 'featured_sidebar', label: 'Zvýrazněný + Sidebar', description: 'Velký článek vlevo + 4 články vpravo. Kategorie: BLOG/NOVINKY. Tlačítko: PŘEHRÁT/ČÍST VÍCE. Link: VÍCE NOVINEK' }, { value: 'list', label: 'Seznam', description: 'Vertikální seznam' }, { value: 'magazine', label: 'Magazín', description: 'Stylizace jako časopis' }, { value: 'masonry', label: 'Zdivo', description: 'Pinterest styl zdiva' }, { value: 'timeline', label: 'Časová Osa', description: 'Chronologická časová osa' }, ], matches: [ { value: 'compact', label: 'Kompaktní', description: 'Kompaktní karty zápasů - jeden sloupec (slider + taby dole)' }, { value: 'compact_split', label: 'Kompaktní Rozdělený', description: 'Kompaktní karty zápasů - dva sloupce (slider vlevo + taby vpravo)' }, { value: 'expanded', label: 'Rozšířený', description: 'Detailní informace o zápasech' }, { value: 'timeline', label: 'Časová Osa', description: 'Zobrazení časové osy' }, { value: 'calendar', label: 'Kalendář', description: 'Kalendářní zobrazení' }, { value: 'live', label: 'Živě', description: 'Živé výsledky' }, { value: 'scoreboard', label: 'Tabule', description: 'TV broadcast style - velká tabule skóre s live aktualizacemi' }, { value: 'ticker', label: 'Ticker', description: 'Scrollující ticker s výsledky a nadcházejícími zápasy' }, ], 'matches-slider': [ { value: 'carousel', label: 'Karusel', description: 'Horizontální karusel zápasů' }, { value: 'scroller', label: 'Posuvník', description: 'Plynulý horizontální posuvník' }, { value: 'ticker', label: 'Ticker', description: 'Úzký ticker výsledků a zápasů' }, ], sponsors: [ { value: 'grid', label: 'Mřížka', description: 'Mřížkové rozložení' }, { value: 'slider', label: 'Posuvník', description: 'Animovaný posuvník' }, { value: 'scroller', label: 'Horizontální', description: 'Horizontální posuvník' }, { value: 'pyramid', label: 'Pyramida', description: 'Pyramidové rozložení' }, { value: 'wall', label: 'Zeď', description: 'Zeď partnerů' }, { value: 'tiered', label: 'Vrstvený', description: 'Úrovně partnerů - Hlavní / Zlatí / Stříbrní / Bronzoví' }, { value: 'spotlight', label: 'Spotlight', description: 'Velký hlavní partner + menší partneři okolo' }, { value: 'sparta_partners_pyramid', label: 'Sparta Partners Pyramid', description: 'Tří-úrovňová pyramida partnerů (1 hlavní / 4 střední / více malých)' }, ], gallery: [ { value: 'grid', label: 'Mřížka', description: 'Fotomřížka' }, { value: 'masonry', label: 'Zdivo', description: 'Pinterest styl' }, { value: 'slider', label: 'Posuvník', description: 'Slideshow prezentace' }, { value: 'lightbox', label: 'Lightbox', description: 'Otevření v lightboxu' }, { value: 'collage', label: 'Koláž', description: 'Kreativní koláž' }, { value: 'featured_grid', label: 'Zvýrazněná + Mřížka', description: 'Velká hlavní fotka vlevo + malé fotky vpravo v mřížce' }, { value: 'stories', label: 'Stories', description: 'Instagram-style stories kruhové thumbnaily s full-screen view' }, ], videos: [ { value: 'grid', label: 'Mřížka', description: 'Video mřížka' }, { value: 'featured', label: 'Zvýrazněné', description: 'Hlavní video + seznam' }, { value: 'carousel', label: 'Karusel', description: 'Video karusel' }, { value: 'playlist', label: 'Playlist', description: 'Playlist styl' }, { value: 'highlight_reel', label: 'Sestřih', description: 'TV broadcast style - hlavní sestřih + kategorie (Góly, Zákroky, Highlights)' }, { value: 'channel', label: 'Kanál', description: 'YouTube channel style s playlists a navigací' }, { value: 'sparta_horizontal_slider', label: 'Sparta Horizontal Slider', description: 'Horizontální posuvník s kartami, UNLIMITED odznaky, prev/next tlačítka, drag support' }, ], team: [ { value: 'grid', label: 'Mřížka', description: 'Karty hráčů v mřížce' }, { value: 'list', label: 'Seznam', description: 'Seznam hráčů' }, { value: 'carousel', label: 'Karusel', description: 'Posuvný karusel' }, { value: 'auto_scroller', label: 'Auto Scroller', description: 'Horizontální auto-scroll. Jméno hráče + číslo dresu + odkaz. Taby: MUŽI / ŽENY. Fotky hráčů na pozadí' }, { value: 'table', label: 'Tabulka', description: 'Tabulkové zobrazení' }, { value: 'hierarchy', label: 'Hierarchie', description: 'Organizační hierarchie' }, { value: 'formation', label: 'Rozestavení', description: 'Fotbalové rozestavení na hřišti (4-4-2, 4-3-3, atd.)' }, { value: 'depth_chart', label: 'Hloubka Kádru', description: 'Pozice s hlavními hráči a náhradníky' }, { value: 'sparta_tabs_stats', label: 'Sparta Tabs & Stats', description: 'Tabovaný výběr týmu s fotkou, statistikami a CTA tlačítky (Koupit dres, Detail týmu)' }, ], activities: [ { value: 'list', label: 'Seznam', description: 'Seznam událostí' }, { value: 'calendar', label: 'Kalendář', description: 'Kalendářní zobrazení' }, { value: 'timeline', label: 'Časová Osa', description: 'Zobrazení časové osy' }, { value: 'cards', label: 'Karty', description: 'Kartové rozložení' }, { value: 'featured_event', label: 'Zvýrazněná Akce', description: 'Velká hlavní akce + menší nadcházející akce' }, { value: 'countdown_grid', label: 'Odpočet + Mřížka', description: 'Odpočet k nejbližší akci + mřížka dalších akcí' }, ], newsletter: [ { value: 'default', label: 'Výchozí', description: 'Standardní formulář' }, { value: 'popup', label: 'Vyskakovací', description: 'Vyskakovací okno' }, { value: 'inline', label: 'Vložený', description: 'Vložený minimální' }, { value: 'sidebar', label: 'Boční', description: 'Boční panel' }, { value: 'banner', label: 'Banner', description: 'Sticky top banner s minimalistickým formulářem' }, { value: 'hero_cta', label: 'Hero CTA', description: 'Velký call-to-action s benefity (Získejte exkluzivní obsah, slevy...)' }, ], social: [ { value: 'grid', label: 'Mřížka', description: 'Mřížka příspěvků' }, { value: 'sidebar', label: 'Boční Panel', description: 'Boční widgety' }, { value: 'floating', label: 'Plovoucí', description: 'Plovoucí ikony' }, { value: 'feed', label: 'Tok', description: 'Tok příspěvků' }, { value: 'wall', label: 'Sociální Zeď', description: 'Twitter/Instagram zeď s živými příspěvky z všech platforem' }, { value: 'highlights', label: 'Highlights', description: 'Nejlepší příspěvky týdne s most liked/shared' }, ], stats: [ { value: 'cards', label: 'Karty', description: 'Karty statistik' }, { value: 'table', label: 'Tabulka', description: 'Datová tabulka' }, { value: 'charts', label: 'Grafy', description: 'Vizuální grafy' }, { value: 'dashboard', label: 'Dashboard', description: 'Přehledová deska' }, { value: 'leaderboard', label: 'Žebříček', description: 'Top hráči - nejlepší střelci, asistence, čisté konto, atd.' }, { value: 'comparison', label: 'Porovnání', description: 'Side-by-side porovnání hráčů nebo týmů' }, ], countdown: [ { value: 'default', label: 'Výchozí', description: 'Standardní odpočet' }, { value: 'minimal', label: 'Minimální', description: 'Minimální časovač' }, { value: 'large', label: 'Velký', description: 'Velké zobrazení' }, { value: 'circular', label: 'Kruhový', description: 'Kruhový odpočet' }, ], map: [ { value: 'default', label: 'Výchozí', description: 'Standardní mapa' }, { value: 'satellite', label: 'Satelit', description: 'Satelitní zobrazení' }, { value: 'minimal', label: 'Minimální', description: 'Minimální design' }, { value: 'interactive', label: 'Interaktivní', description: 'Plně interaktivní mapa' }, ], merch: [ { value: 'grid', label: 'Mřížka', description: 'Produktová mřížka' }, { value: 'carousel', label: 'Karusel', description: 'Produktový karusel' }, { value: 'featured', label: 'Zvýrazněné', description: 'Zvýrazněné produkty' }, { value: 'list', label: 'Seznam', description: 'Seznam produktů' }, { value: 'sparta_product_slider', label: 'Sparta Product Slider', description: 'Produktový karusel s fotkami, cenami a tlačítky Koupit' }, ], footer: [ { value: 'standard', label: 'Standardní', description: 'Klasická patička' }, { value: 'minimal', label: 'Minimální', description: 'Minimalistická patička' }, { value: 'extended', label: 'Rozšířená', description: 'Rozšířená s více sloupci' }, { value: 'centered', label: 'Centrovaná', description: 'Centrované rozložení' }, { value: 'sparta_extended', label: 'Sparta Extended', description: 'Rozšířená patička s partnery, navigací, newsletterem a sociálními sítěmi' }, ], sidebar: [ { value: 'right', label: 'Pravý', description: 'Pravý boční panel' }, { value: 'left', label: 'Levý', description: 'Levý boční panel' }, { value: 'sticky', label: 'Přilepený', description: 'Přilepený při scrollování' }, ], banner: [ { value: 'top', label: 'Nahoře', description: 'Banner v horní části' }, { value: 'bottom', label: 'Dole', description: 'Banner ve spodní části' }, { value: 'sidebar', label: 'Boční', description: 'Boční banner' }, { value: 'overlay', label: 'Překryvný', description: 'Překryvný banner' }, ], table: [ { value: 'split_news', label: 'Rozdělený s Aktualitami', description: 'Dva sloupce - Aktuality vlevo + Tabulka vpravo (výchozí)' }, { value: 'standard', label: 'Standardní', description: 'Klasická tabulka - jeden sloupec' }, { value: 'compact', label: 'Kompaktní', description: 'Kompaktní zobrazení' }, { value: 'detailed', label: 'Detailní', description: 'Detailní informace' }, ], testimonials: [ { value: 'carousel', label: 'Karusel', description: 'Posuvný karusel' }, { value: 'grid', label: 'Mřížka', description: 'Mřížka referencí' }, { value: 'wall', label: 'Zeď', description: 'Zeď ohlasů' }, ], achievements: [ { value: 'timeline', label: 'Časová Osa', description: 'Chronologická osa' }, { value: 'grid', label: 'Mřížka', description: 'Mřížka úspěchů' }, { value: 'showcase', label: 'Výloha', description: 'Výloha trofejí' }, ], history: [ { value: 'timeline', label: 'Časová Osa', description: 'Historická časová osa' }, { value: 'story', label: 'Příběh', description: 'Vyprávěcí formát' }, { value: 'milestones', label: 'Milníky', description: 'Klíčové milníky' }, ], live: [ { value: 'featured', label: 'Zvýrazněný', description: 'Hlavní live stream' }, { value: 'embedded', label: 'Vložený', description: 'Vložený přehrávač' }, { value: 'multi', label: 'Více Kamer', description: 'Více kamer najednou' }, ], podcast: [ { value: 'list', label: 'Seznam', description: 'Seznam epizod' }, { value: 'player', label: 'Přehrávač', description: 'Integrovaný přehrávač' }, { value: 'featured', label: 'Zvýrazněný', description: 'Zvýrazněné epizody' }, ], contact: [ { value: 'form', label: 'Formulář', description: 'Kontaktní formulář' }, { value: 'info', label: 'Informace', description: 'Kontaktní údaje' }, { value: 'combined', label: 'Kombinovaný', description: 'Formulář + údaje' }, ], poll: [ { value: 'vertical', label: 'Vertikální', description: 'Vertikální rozložení' }, { value: 'horizontal', label: 'Horizontální', description: 'Horizontální rozložení' }, { value: 'cards', label: 'Karty', description: 'Kartové rozložení' }, ], quiz: [ { value: 'card', label: 'Karta', description: 'Karta po kartě' }, { value: 'form', label: 'Formulář', description: 'Formulářový styl' }, { value: 'interactive', label: 'Interaktivní', description: 'Plně interaktivní' }, ], search: [ { value: 'header', label: 'Hlavička', description: 'V hlavičce' }, { value: 'overlay', label: 'Překryvný', description: 'Překryvné vyhledávání' }, { value: 'inline', label: 'Vložený', description: 'Vložený do stránky' }, ], calendar: [ { value: 'month', label: 'Měsíc', description: 'Měsíční zobrazení' }, { value: 'week', label: 'Týden', description: 'Týdenní zobrazení' }, { value: 'list', label: 'Seznam', description: 'Seznam událostí' }, ], weather: [ { value: 'widget', label: 'Widget', description: 'Widget počasí' }, { value: 'detailed', label: 'Detailní', description: 'Detailní předpověď' }, { value: 'minimal', label: 'Minimální', description: 'Základní info' }, ], ticketing: [ { value: 'widget', label: 'Widget', description: 'Widget vstupenek' }, { value: 'full', label: 'Plný', description: 'Plný systém' }, { value: 'link', label: 'Odkaz', description: 'Pouze odkaz' }, ], };